/**
  * Check if NFC adapter is enabled. If not, show the user a dialog and let him choose between
  * "Goto NFC Setting", "Use Editor Only" and "Exit App". Also enable NFC foreground dispatch
  * system.
  *
  * @see Common#enableNfcForegroundDispatch(Activity)
  */
 private void checkNfc() {
   // Check if the NFC hardware is enabled.
   if (Common.getNfcAdapter() != null && !Common.getNfcAdapter().isEnabled()) {
     // NFC is disabled. Show dialog.
     mEnableNfc.show();
     // Disable read/write tag options.
     mReadTag.setEnabled(false);
     mWriteTag.setEnabled(false);
     return;
   } else {
     // NFC is enabled. Hide dialog and enable NFC
     // foreground dispatch.
     if (mOldIntent != getIntent()) {
       int typeCheck = Common.treatAsNewTag(getIntent(), this);
       if (typeCheck == -1 || typeCheck == -2) {
         // Device or tag does not support Mifare Classic.
         // Run the only thing that is possible: The tag info tool.
         Intent i = new Intent(this, TagInfoToolActivity.class);
         startActivity(i);
       }
       mOldIntent = getIntent();
     }
     Common.enableNfcForegroundDispatch(this);
     mEnableNfc.hide();
     mReadTag.setEnabled(true);
     mWriteTag.setEnabled(true);
   }
 }
 /** Add the menu with the tools. It will be shown if the user clicks on "Tools". */
 @Override
 public void onCreateContextMenu(ContextMenu menu, View v, ContextMenuInfo menuInfo) {
   super.onCreateContextMenu(menu, v, menuInfo);
   MenuInflater inflater = getMenuInflater();
   menu.setHeaderTitle(R.string.dialog_tools_menu_title);
   menu.setHeaderIcon(android.R.drawable.ic_menu_preferences);
   inflater.inflate(R.menu.tools, menu);
   // Enable/Disable tag info tool depending on NFC availability.
   menu.findItem(R.id.menuMainTagInfo)
       .setEnabled(Common.getNfcAdapter() != null && Common.getNfcAdapter().isEnabled());
 }
  /**
   * Check for NFC hardware, Mifare Classic support and for external storage. If the directory
   * structure and the std. keys files is not already there it will be created. Also, at the first
   * run of this App, a warning notice will be displayed.
   *
   * @see #copyStdKeysFilesIfNecessary()
   */
  @Override
  public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    // Show App version and footer.
    TextView tv = (TextView) findViewById(R.id.textViewMainFooter);
    tv.setMovementMethod(LinkMovementMethod.getInstance());
    try {
      String appVersion = getPackageManager().getPackageInfo(getPackageName(), 0).versionName;
      tv.setText(
          TextUtils.concat(
              getString(R.string.app_version),
              ": ",
              appVersion,
              " - ",
              getText(R.string.text_footer)));
    } catch (NameNotFoundException e) {
      Log.d(LOG_TAG, "Version not found.");
    }

    // Add the context menu to the tools button.
    Button tools = (Button) findViewById(R.id.buttonMainTools);
    registerForContextMenu(tools);

    // Check if there is an NFC hardware component.
    Common.setNfcAdapter(NfcAdapter.getDefaultAdapter(this));
    if (Common.getNfcAdapter() == null) {
      new AlertDialog.Builder(this)
          .setTitle(R.string.dialog_no_nfc_title)
          .setMessage(R.string.dialog_no_nfc)
          .setIcon(android.R.drawable.ic_dialog_alert)
          .setPositiveButton(
              R.string.action_exit_app,
              new DialogInterface.OnClickListener() {
                @Override
                public void onClick(DialogInterface dialog, int which) {
                  finish();
                }
              })
          .setOnCancelListener(
              new DialogInterface.OnCancelListener() {
                @Override
                public void onCancel(DialogInterface dialog) {
                  finish();
                }
              })
          .show();
      mResume = false;
      return;
    }

    if (Common.isExternalStorageWritableErrorToast(this)) {
      // Create keys directory.
      File path =
          new File(
              Environment.getExternalStoragePublicDirectory(Common.HOME_DIR)
                  + "/"
                  + Common.KEYS_DIR);
      if (path.exists() == false && !path.mkdirs()) {
        // Could not create directory.
        Log.e(
            LOG_TAG,
            "Error while crating '" + Common.HOME_DIR + "/" + Common.KEYS_DIR + "' directory.");
        return;
      }

      // Create dumps directory.
      path =
          new File(
              Environment.getExternalStoragePublicDirectory(Common.HOME_DIR)
                  + "/"
                  + Common.DUMPS_DIR);
      if (path.exists() == false && !path.mkdirs()) {
        // Could not create directory.
        Log.e(
            LOG_TAG,
            "Error while crating '" + Common.HOME_DIR + "/" + Common.DUMPS_DIR + "' directory.");
        return;
      }

      // Create tmp directory.
      path =
          new File(
              Environment.getExternalStoragePublicDirectory(Common.HOME_DIR)
                  + "/"
                  + Common.TMP_DIR);
      if (path.exists() == false && !path.mkdirs()) {
        // Could not create directory.
        Log.e(LOG_TAG, "Error while crating '" + Common.HOME_DIR + Common.TMP_DIR + "' directory.");
        return;
      }
      // Clean up tmp directory.
      for (File file : path.listFiles()) {
        file.delete();
      }

      // Create std. key file if there is none.
      copyStdKeysFilesIfNecessary();
    }

    // Find Read/Write buttons and bind them to member vars.
    mReadTag = (Button) findViewById(R.id.buttonMainReadTag);
    mWriteTag = (Button) findViewById(R.id.buttonMainWriteTag);

    // Create a dialog that send user to NFC settings if NFC is off.
    // (Or let the user use the App in editor only mode / exit the App.)
    mEnableNfc =
        new AlertDialog.Builder(this)
            .setTitle(R.string.dialog_nfc_not_enabled_title)
            .setMessage(R.string.dialog_nfc_not_enabled)
            .setIcon(android.R.drawable.ic_dialog_info)
            .setPositiveButton(
                R.string.action_nfc,
                new DialogInterface.OnClickListener() {
                  @Override
                  @SuppressLint("InlinedApi")
                  public void onClick(DialogInterface dialog, int which) {
                    // Goto NFC Settings.
                    if (Build.VERSION.SDK_INT >= 16) {
                      startActivity(new Intent(Settings.ACTION_NFC_SETTINGS));
                    } else {
                      startActivity(new Intent(Settings.ACTION_WIRELESS_SETTINGS));
                    }
                  }
                })
            .setNeutralButton(
                R.string.action_editor_only,
                new DialogInterface.OnClickListener() {
                  @Override
                  public void onClick(DialogInterface dialog, int which) {
                    // Only use Editor. Do nothing.
                  }
                })
            .setNegativeButton(
                R.string.action_exit_app,
                new DialogInterface.OnClickListener() {
                  @Override
                  public void onClick(DialogInterface dialog, int id) {
                    // Exit the App.
                    finish();
                  }
                })
            .create();

    // Show first usage notice.
    SharedPreferences sharedPref = getPreferences(Context.MODE_PRIVATE);
    boolean isFirstRun = sharedPref.getBoolean("is_first_run", true);
    if (isFirstRun) {
      Editor e = sharedPref.edit();
      e.putBoolean("is_first_run", false);
      e.commit();
      new AlertDialog.Builder(this)
          .setTitle(R.string.dialog_first_run_title)
          .setIcon(android.R.drawable.ic_dialog_alert)
          .setMessage(R.string.dialog_first_run)
          .setPositiveButton(
              R.string.action_ok,
              new DialogInterface.OnClickListener() {
                @Override
                public void onClick(DialogInterface dialog, int which) {
                  dialog.cancel();
                }
              })
          .setOnCancelListener(
              new DialogInterface.OnCancelListener() {
                @Override
                public void onCancel(DialogInterface dialog) {
                  mResume = true;
                  checkNfc();
                }
              })
          .show();
      mResume = false;
    }
  }