package org.hacked.io.hue; import android.app.AlertDialog; import android.app.Dialog; import android.content.*; import android.content.pm.PackageManager; import android.content.pm.ResolveInfo; import android.nfc.NfcAdapter; import android.nfc.Tag; import android.os.Bundle; import android.provider.Settings; import android.support.v4.app.DialogFragment; import android.support.v4.app.Fragment; import android.support.v4.app.FragmentManager; import android.support.v4.content.LocalBroadcastManager; import android.text.TextUtils; import android.util.Log; import android.view.Menu; import android.view.MenuItem; import android.widget.Toast; import org.ndeftools.Message; import org.ndeftools.util.activity.NfcReaderActivity; import java.util.List; import static org.hacked.io.hue.Constants.*; public class MainActivity extends NfcReaderActivity { public static final String ACTION_DEVICE_CONNECTED = "org.hacked.io.hue.ACTION_DEVICE_CONNECTED"; public static final String ACTION_SCANNER_READY = "org.hacked.io.hue.ACTION_SCANNER_READY"; public static final String ACTION_PLAYER_JOINED = "org.hacked.io.hue.ACTION_PLAYER_JOINED"; private SharedPreferences sharedPreferences; private BroadcastReceiver broadcastReceiver = new BroadcastReceiver() { @Override public void onReceive(Context context, Intent intent) { if (intent != null) { String action = intent.getAction(); Bundle args = intent.getExtras(); if (ACTION_DEVICE_CONNECTED.equals(action)) { getSupportFragmentManager() .beginTransaction() .replace(android.R.id.content, ScannerFragment.getInstance(args)) .commit(); } else if (ACTION_PLAYER_JOINED.equals(action)) { getSupportFragmentManager() .beginTransaction() .replace(android.R.id.content, ColourFragment.getInstance(args)) .commit(); } else if(ACTION_SCANNER_READY.equals(action)) { getSupportFragmentManager() .beginTransaction() .setCustomAnimations(android.R.anim.fade_in, android.R.anim.fade_out) .replace(android.R.id.content, ScannerFragment.getInstance(args)) .commit(); } } } }; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); sharedPreferences = getSharedPreferences(PREFERENCES, MODE_PRIVATE); showContentFragment(null); // Start detecting NDEF messages using foreground mode setDetecting(true); } @Override protected void onResume() { super.onResume(); IntentFilter intentFilter = new IntentFilter(); intentFilter.addAction(ACTION_DEVICE_CONNECTED); intentFilter.addAction(ACTION_PLAYER_JOINED); intentFilter.addAction(ACTION_SCANNER_READY); LocalBroadcastManager.getInstance(this).registerReceiver(broadcastReceiver, intentFilter); } @Override protected void onPause() { super.onPause(); LocalBroadcastManager.getInstance(this).unregisterReceiver(broadcastReceiver); } @Override protected void onNfcStateEnabled() { Log.d(APP_TAG, "NFC State enabled."); } @Override protected void onNfcStateDisabled() { Log.d(APP_TAG, "NFC State disabled."); showDialogFragment(new NfcNotEnabledDialog()); } @Override protected void onNfcStateChange(boolean enabled) { Log.d(APP_TAG, "NFC State changed: enabled = " + enabled); } @Override protected void onNfcFeatureNotFound() { Log.w(APP_TAG, "NFC Not Supported."); showDialogFragment(new NfcNotSupportedDialog()); } @Override protected void readNdefMessage(Message message) { Log.i(APP_TAG, "Read NDEF message."); } @Override protected void readEmptyNdefMessage() { Log.i(APP_TAG, "Read empty NDEF message."); } @Override protected void readNonNdefMessage() { Log.i(APP_TAG, "Read non-NDEF message."); Intent intent = getIntent(); if (intent != null) { Tag tag = intent.getParcelableExtra(NfcAdapter.EXTRA_TAG); if (tag != null) { byte[] bytes = tag.getId(); if (bytes != null) { String tagId = Utils.bytesToHex(bytes); Log.i(APP_TAG, "NFC Tag Id: " + tagId); showContentFragment(tagId); } } } } private boolean isFirstTimeRun() { return TextUtils.isEmpty(sharedPreferences.getString(KEY_DEVICE_ID, null)); } private void showContentFragment(String tagId) { Bundle args = new Bundle(); args.putString(EXTRA_TAG_ID, tagId); Fragment fragment = isFirstTimeRun() ? ConnectFragment.getInstance(args) : ScannerFragment.getInstance(args); getSupportFragmentManager().beginTransaction().replace(android.R.id.content, fragment).commit(); } private void showDialogFragment(DialogFragment dialogFragment) { FragmentManager fm = getSupportFragmentManager(); DialogFragment prevDialogFragment = (DialogFragment) fm.findFragmentByTag(TAG_DIALOG); if (prevDialogFragment != null) { prevDialogFragment.dismiss(); } dialogFragment.show(fm, TAG_DIALOG); } public static class NfcNotSupportedDialog extends DialogFragment { @Override public Dialog onCreateDialog(Bundle savedInstanceState) { AlertDialog.Builder builder = new AlertDialog.Builder(getActivity()); builder.setTitle(R.string.nfc_not_supported_title).setMessage(R.string.nfc_not_supported_message) .setPositiveButton(android.R.string.ok, new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialogInterface, int i) { NfcNotSupportedDialog.this.dismiss(); } }); return builder.create(); } } public static class NfcNotEnabledDialog extends DialogFragment { @Override public Dialog onCreateDialog(Bundle savedInstanceState) { AlertDialog.Builder builder = new AlertDialog.Builder(getActivity()); builder.setTitle(R.string.nfc_not_enabled_title).setMessage(R.string.nfc_not_enabled_message) .setPositiveButton(android.R.string.ok, new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialogInterface, int i) { PackageManager packageManager = getActivity().getPackageManager(); if (packageManager != null) { Intent settingsIntent = new Intent(Settings.Global.RADIO_NFC); List<ResolveInfo> results = packageManager.queryIntentActivities(settingsIntent, PackageManager.MATCH_DEFAULT_ONLY); if (results.isEmpty()) { settingsIntent = new Intent(Settings.ACTION_WIRELESS_SETTINGS); results = packageManager.queryIntentActivities(settingsIntent, PackageManager.MATCH_DEFAULT_ONLY); } if (!results.isEmpty()) { NfcNotEnabledDialog.this.dismiss(); startActivity(settingsIntent); } else { Toast.makeText(getActivity(), R.string.wireless_settings_not_found, Toast.LENGTH_SHORT).show(); NfcNotEnabledDialog.this.dismiss(); } } else { Toast.makeText(getActivity(), R.string.package_manager_not_found, Toast.LENGTH_SHORT).show(); NfcNotEnabledDialog.this.dismiss(); } } }) .setNegativeButton(android.R.string.cancel, new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialogInterface, int i) { NfcNotEnabledDialog.this.dismiss(); } }); return builder.create(); } } @Override public boolean onCreateOptionsMenu(Menu menu) { getMenuInflater().inflate(R.menu.main_menu, menu); return true; } @Override public boolean onOptionsItemSelected(MenuItem item) { switch (item.getItemId()) { case R.id.menu_reset: sharedPreferences.edit().remove(KEY_DEVICE_ID).remove(KEY_SERVER_URL).commit(); Bundle args = new Bundle(); args.putString(EXTRA_TAG_ID, null); getSupportFragmentManager() .beginTransaction() .replace(android.R.id.content, ConnectFragment.getInstance(args)) .commit(); break; } return super.onOptionsItemSelected(item); } }