package mobisocial.nfc.legacy;
import org.apache.commons.codec.binary.Base64;
import mobisocial.ndefexchange.PendingNdefExchange;
import mobisocial.nfc.ConnectionHandoverManager;
import mobisocial.nfc.R;
import mobisocial.nfc.util.NdefHelper;
import mobisocial.nfc.util.QR;
import android.app.Activity;
import android.content.BroadcastReceiver;
import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.content.ServiceConnection;
import android.content.SharedPreferences;
import android.content.SharedPreferences.Editor;
import android.net.Uri;
import android.nfc.NdefMessage;
import android.os.Bundle;
import android.os.IBinder;
import android.view.View;
import android.widget.Button;
import android.widget.CheckBox;
import android.widget.CompoundButton;
import android.widget.CompoundButton.OnCheckedChangeListener;
import android.widget.TextView;
import android.widget.Toast;
public class NfcBridgeActivity extends Activity {
protected static final String TAG = "nfcserver";
protected static final String ACTION_UPDATE = "mobisocial.intent.UPDATE";
private static final String PREFERENCE_AUTOLAUNCH = "autolaunch";
protected static final int QR_NFC_PAIR = 345;
private TextView mStatusView = null;
private Button mToggleButton = null;
private Button mToggleTcpButton = null;
private Button mConfigButton = null;
private Button mPairButton = null;
private Button mFriendsButton = null;
private CheckBox mAutoOpenCheckBox = null;
private static PendingNdefExchange mNdefExchange;
private SharedPreferences mPreferences;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
mPreferences = getSharedPreferences("main", 0);
mIntentFilter = new IntentFilter();
mIntentFilter.addAction(ACTION_UPDATE);
mToggleButton = (Button)findViewById(R.id.toggle);
mToggleTcpButton = (Button)findViewById(R.id.toggleTcp);
mFriendsButton = (Button)findViewById(R.id.friends);
mConfigButton = (Button)findViewById(R.id.config);
mPairButton = (Button)findViewById(R.id.pair);
mStatusView = (TextView)findViewById(R.id.status);
mAutoOpenCheckBox = (CheckBox)findViewById(R.id.autolaunch);
mPairButton.setEnabled(false);
mConfigButton.setEnabled(false);
mFriendsButton.setOnClickListener(mFriendsLauncher);
//mFriendsButton.setVisibility(View.GONE);
}
@Override
protected void onResume() {
super.onResume();
doBindService();
registerReceiver(mUpdateReceiver, mIntentFilter);
}
@Override
protected void onPause() {
super.onPause();
unregisterReceiver(mUpdateReceiver);
doUnbindService();
}
private View.OnClickListener mToggleBridge = new View.OnClickListener() {
public void onClick(View v) {
if (mBoundService.isBridgeRunning()) {
mBoundService.disableBridge();
} else {
mBoundService.enableBridge();
}
}
};
private View.OnClickListener mToggleTcpBridge = new View.OnClickListener() {
public void onClick(View v) {
if (mBoundService.isBridgeRunning()) {
mBoundService.disableBridge();
} else {
mBoundService.enableTcpBridge();
}
}
};
private View.OnClickListener mFriendsLauncher = new View.OnClickListener() {
public void onClick(View v) {
startActivity(new Intent(NfcBridgeActivity.this, FriendsActivity.class));
}
};
private View.OnClickListener mConfigListener= new View.OnClickListener() {
public void onClick(View v) {
if (!mBoundService.isBridgeRunning()) {
Toast.makeText(NfcBridgeActivity.this, "Service must be running.", Toast.LENGTH_SHORT).show();
} else {
String handover = mBoundService.getBridgeReference();
String content = ConnectionHandoverManager.USER_HANDOVER_PREFIX + new String(Base64.encodeBase64(
NdefHelper.getHandoverNdef(handover).toByteArray()));
String qr = QR.getQrl(content);
Intent view = new Intent(Intent.ACTION_VIEW, Uri.parse(qr));
startActivity(view);
}
}
};
private View.OnClickListener mPairListener= new View.OnClickListener() {
public void onClick(View v) {
if (!mBoundService.isBridgeRunning()) {
Toast.makeText(NfcBridgeActivity.this, "Service must be running.", Toast.LENGTH_SHORT).show();
} else {
Intent intent = new Intent("com.google.zxing.client.android.SCAN");
intent.putExtra("SCAN_MODE", "QR_CODE_MODE");
startActivityForResult(intent, QR_NFC_PAIR);
}
}
};
private OnCheckedChangeListener mAutoLaunchListener = new OnCheckedChangeListener() {
@Override
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
Editor editor = mPreferences.edit();
editor.putBoolean(PREFERENCE_AUTOLAUNCH, isChecked);
editor.commit();
mBoundService.setAutoLaunch(isChecked);
}
};
private void buildUi() {
mToggleButton.setOnClickListener(mToggleBridge);
mToggleTcpButton.setOnClickListener(mToggleTcpBridge);
mConfigButton.setOnClickListener(mConfigListener);
mPairButton.setOnClickListener(mPairListener);
mAutoOpenCheckBox.setChecked(mPreferences.getBoolean(PREFERENCE_AUTOLAUNCH, false));
mAutoOpenCheckBox.setOnCheckedChangeListener(mAutoLaunchListener);
if (!mBoundService.isBridgeRunning()) {
mStatusView.setText(R.string.bridge_not_running);
mToggleButton.setText(R.string.enable_bridge);
mPairButton.setEnabled(false);
mConfigButton.setEnabled(false);
} else {
mStatusView.setText("Bridge running on " + mBoundService.getBridgeReference());
mPairButton.setEnabled(true);
mConfigButton.setEnabled(true);
/*if (mBoundService.isPaired()) {
mPairStatusView.setText("Quick-tap enabled.");
} else {
mPairStatusView.setText("No quick-tap device set.");
}*/
mToggleButton.setText(R.string.disable_bridge);
}
}
/* Service binding */
BroadcastReceiver mUpdateReceiver = new BroadcastReceiver() {
@Override
public void onReceive(Context arg0, Intent arg1) {
NfcBridgeActivity.this.buildUi();
}
};
IntentFilter mIntentFilter;
private boolean mIsBound;
private NfcBridgeService mBoundService;
private ServiceConnection mConnection = new ServiceConnection() {
public void onServiceConnected(ComponentName className, IBinder service) {
mBoundService = ((NfcBridgeService.LocalBinder)service).getService();
mBoundService.setAutoLaunch(mPreferences.getBoolean(PREFERENCE_AUTOLAUNCH, false));
buildUi();
}
public void onServiceDisconnected(ComponentName className) {
mBoundService = null;
}
};
void doBindService() {
bindService(new Intent(NfcBridgeActivity.this,
NfcBridgeService.class), mConnection, Context.BIND_AUTO_CREATE);
mIsBound = true;
}
void doUnbindService() {
if (mIsBound) {
unbindService(mConnection);
mIsBound = false;
}
}
@Override
protected void onDestroy() {
super.onDestroy();
doUnbindService();
}
public void onActivityResult(int requestCode, int resultCode, Intent intent) {
if (requestCode == QR_NFC_PAIR) {
try {
if (resultCode != RESULT_OK) {
throw new Exception();
}
String data = intent.getStringExtra("SCAN_RESULT");
if (!data.startsWith(ConnectionHandoverManager.USER_HANDOVER_PREFIX)) {
throw new Exception();
}
NdefMessage ndef = new NdefMessage(android.util.Base64.decode(
data.substring(ConnectionHandoverManager.USER_HANDOVER_PREFIX.length()),
android.util.Base64.URL_SAFE));
mNdefExchange = new PendingNdefExchange(ndef, null);
} catch (Exception e) {
toast("Could not set nfc partner.");
}
}
}
public static PendingNdefExchange getNdefExchange() {
return mNdefExchange;
}
public void toast(String text) {
Toast.makeText(this, text, Toast.LENGTH_LONG).show();
}
}