package com.zzx.factorytest;
import org.xml.sax.XMLReader;
import android.app.PendingIntent;
import android.content.Context;
import android.content.Intent;
import android.content.pm.PackageManager.NameNotFoundException;
import android.content.res.Resources;
import android.graphics.Typeface;
import android.graphics.drawable.Drawable;
import android.nfc.NfcAdapter;
import android.os.Bundle;
import android.os.Parcelable;
import android.text.ClipboardManager;
import android.text.Editable;
import android.text.Html;
import android.text.Html.ImageGetter;
import android.text.method.LinkMovementMethod;
import android.util.Log;
import android.view.Gravity;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.TextView;
import android.widget.Toast;
import com.zzx.factorytest.nfc.card.CardManager;
import com.zzx.factorytest.view.JudgeView;
public final class NfcTestActivity extends TestItemBaseActivity implements
OnClickListener, Html.TagHandler, ImageGetter {
private NfcAdapter nfcAdapter;
private PendingIntent pendingIntent;
private Resources res;
private TextView board;
private enum ContentType {
HINT, DATA, MSG
}
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.nfc_activity);
final Resources res = getResources();
this.res = res;
((JudgeView) findViewById(R.id.judgeview))
.setOnResultSelectedListener(this);
this.board = (TextView) findViewById(R.id.board);
findViewById(R.id.btnNfc).setOnClickListener(this);
board.setMovementMethod(LinkMovementMethod.getInstance());
board.setFocusable(false);
board.setClickable(false);
board.setLongClickable(false);
nfcAdapter = NfcAdapter.getDefaultAdapter(this);
pendingIntent = PendingIntent.getActivity(this, 0, new Intent(this,
getClass()).addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP), 0);
onNewIntent(getIntent());
}
@Override
protected void onPause() {
super.onPause();
if (nfcAdapter != null)
nfcAdapter.disableForegroundDispatch(this);
}
@Override
protected void onResume() {
super.onResume();
if (nfcAdapter != null)
nfcAdapter.enableForegroundDispatch(this, pendingIntent,
CardManager.FILTERS, CardManager.TECHLISTS);
refreshStatus();
}
@Override
protected void onNewIntent(Intent intent) {
super.onNewIntent(intent);
final Parcelable p = intent.getParcelableExtra(NfcAdapter.EXTRA_TAG);
Log.d("NFCTAG", intent.getAction() + "");
showData((p != null) ? CardManager.load(p, res) : null);
}
@Override
public void onClick(final View v) {
switch (v.getId()) {
case R.id.btnNfc: {
startActivityForResult(new Intent(
android.provider.Settings.ACTION_WIRELESS_SETTINGS), 0);
break;
}
default:
break;
}
}
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
refreshStatus();
}
private void refreshStatus() {
final Resources r = this.res;
final String tip;
if (nfcAdapter == null)
tip = r.getString(R.string.tip_nfc_notfound);
else if (nfcAdapter.isEnabled())
tip = r.getString(R.string.tip_nfc_enabled);
else
tip = r.getString(R.string.tip_nfc_disabled);
final StringBuilder s = new StringBuilder(
r.getString(R.string.app_name));
s.append(" -- ").append(tip);
setTitle(s);
final CharSequence text = board.getText();
if (text == null || board.getTag() == ContentType.HINT)
showHint();
}
private void copyData() {
final CharSequence text = board.getText();
if (text == null || board.getTag() != ContentType.DATA)
return;
((ClipboardManager) getSystemService(Context.CLIPBOARD_SERVICE))
.setText(text);
final String msg = res.getString(R.string.msg_copied);
final Toast toast = Toast.makeText(this, msg, Toast.LENGTH_SHORT);
toast.setGravity(Gravity.CENTER, 0, 0);
toast.show();
}
private void showData(String data) {
if (data == null || data.length() == 0) {
showHint();
return;
}
final TextView board = this.board;
final Resources res = this.res;
final int padding = res.getDimensionPixelSize(R.dimen.pnl_margin);
board.setPadding(padding, padding, padding, padding);
board.setTypeface(Typeface.defaultFromStyle(Typeface.NORMAL));
board.setTextSize(res.getDimension(R.dimen.text_small));
board.setTextColor(res.getColor(R.color.text_default));
board.setGravity(Gravity.NO_GRAVITY);
board.setTag(ContentType.DATA);
board.setText(Html.fromHtml(data));
}
private void showHelp(int id) {
final TextView board = this.board;
final Resources res = this.res;
final int padding = res.getDimensionPixelSize(R.dimen.pnl_margin);
board.setPadding(padding, padding, padding, padding);
board.setTypeface(Typeface.defaultFromStyle(Typeface.NORMAL));
board.setTextSize(res.getDimension(R.dimen.text_small));
board.setTextColor(res.getColor(R.color.text_default));
board.setGravity(Gravity.NO_GRAVITY);
board.setTag(ContentType.MSG);
board.setText(Html.fromHtml(res.getString(id), this, this));
}
private void showHint() {
final TextView board = this.board;
final Resources res = this.res;
final String hint;
if (nfcAdapter == null)
hint = res.getString(R.string.msg_nonfc);
else if (nfcAdapter.isEnabled())
hint = res.getString(R.string.msg_nocard);
else
hint = res.getString(R.string.msg_nfcdisabled);
final int padding = res.getDimensionPixelSize(R.dimen.text_middle);
board.setPadding(padding, padding, padding, padding);
board.setTypeface(Typeface.defaultFromStyle(Typeface.BOLD_ITALIC));
board.setTextSize(res.getDimension(R.dimen.text_middle));
board.setTextColor(res.getColor(R.color.text_tip));
board.setGravity(Gravity.CENTER_VERTICAL);
board.setTag(ContentType.HINT);
board.setText(Html.fromHtml(hint));
}
@Override
public void handleTag(boolean opening, String tag, Editable output,
XMLReader xmlReader) {
if (!opening && "version".equals(tag)) {
try {
output.append(getPackageManager().getPackageInfo(
getPackageName(), 0).versionName);
} catch (NameNotFoundException e) {
}
}
}
@Override
public Drawable getDrawable(String source) {
return null;
}
// @Override
// public Drawable getDrawable(String source) {
// final Resources r = getResources();
//
// final Drawable ret;
// final String[] params = source.split(",");
// if ("icon_main".equals(params[0])) {
// ret = r.getDrawable(R.drawable.ic_app_main);
// } else {
// ret = null;
// }
//
// if (ret != null) {
// final float f = r.getDisplayMetrics().densityDpi / 72f;
// final int w = (int) (Util.parseInt(params[1], 10, 16) * f + 0.5f);
// final int h = (int) (Util.parseInt(params[2], 10, 16) * f + 0.5f);
// ret.setBounds(0, 0, w, h);
// }
//
// return ret;
// }
}