/** Loads settings, either from manifest or {@link Settings}. */
  private void loadSettings() {
    Bundle metaData = null;
    try {
      metaData =
          getPackageManager()
              .getActivityInfo(getComponentName(), PackageManager.GET_META_DATA)
              .metaData;
    } catch (NameNotFoundException e) {
      /*
       * Never catch this.
       */
      e.printStackTrace();
    }

    if (metaData != null && metaData.containsKey(METADATA_MIN_WIRED_DOTS))
      mMinWiredDots =
          Settings.Display.validateMinWiredDots(this, metaData.getInt(METADATA_MIN_WIRED_DOTS));
    else mMinWiredDots = Settings.Display.getMinWiredDots(this);

    if (metaData != null && metaData.containsKey(METADATA_MAX_RETRIES))
      mMaxRetries =
          Settings.Display.validateMaxRetries(this, metaData.getInt(METADATA_MAX_RETRIES));
    else mMaxRetries = Settings.Display.getMaxRetries(this);

    if (metaData != null && metaData.containsKey(METADATA_AUTO_SAVE_PATTERN))
      mAutoSave = metaData.getBoolean(METADATA_AUTO_SAVE_PATTERN);
    else mAutoSave = Settings.Security.isAutoSavePattern(this);

    if (metaData != null && metaData.containsKey(METADATA_CAPTCHA_WIRED_DOTS))
      mCaptchaWiredDots =
          Settings.Display.validateCaptchaWiredDots(
              this, metaData.getInt(METADATA_CAPTCHA_WIRED_DOTS));
    else mCaptchaWiredDots = Settings.Display.getCaptchaWiredDots(this);

    if (metaData != null && metaData.containsKey(METADATA_STEALTH_MODE))
      mStealthMode = metaData.getBoolean(METADATA_STEALTH_MODE);
    else mStealthMode = Settings.Display.isStealthMode(this);

    /*
     * Encrypter.
     */
    char[] encrypterClass;
    if (metaData != null && metaData.containsKey(METADATA_ENCRYPTER_CLASS))
      encrypterClass = metaData.getString(METADATA_ENCRYPTER_CLASS).toCharArray();
    else encrypterClass = Settings.Security.getEncrypterClass(this);

    if (encrypterClass != null) {
      try {
        mEncrypter =
            (IEncrypter)
                Class.forName(new String(encrypterClass), false, getClassLoader()).newInstance();
      } catch (Throwable t) {
        throw new InvalidEncrypterException();
      }
    }
  } // loadSettings()
 @Override
 public void onClick(View v) {
   if (ACTION_CREATE_PATTERN.equals(getIntent().getAction())) {
     if (mBtnOkCmd == ButtonOkCommand.CONTINUE) {
       mBtnOkCmd = ButtonOkCommand.DONE;
       mLockPatternView.clearPattern();
       mTextInfo.setText(
           com.haibison
               .android
               .lockpattern
               .R
               .string
               .alp_42447968_msg_redraw_pattern_to_confirm);
       mBtnConfirm.setText(
           com.haibison.android.lockpattern.R.string.alp_42447968_cmd_confirm);
       mBtnConfirm.setEnabled(false);
     } else {
       final char[] pattern = getIntent().getCharArrayExtra(EXTRA_PATTERN);
       if (mAutoSave) Settings.Security.setPattern(LockPatternActivity.this, pattern);
       finishWithResultOk(pattern);
     }
   } // ACTION_CREATE_PATTERN
   else if (ACTION_COMPARE_PATTERN.equals(getIntent().getAction())) {
     /*
      * We don't need to verify the extra. First, this button is only
      * visible if there is this extra in the intent. Second, it is
      * the responsibility of the caller to make sure the extra is
      * good.
      */
     PendingIntent pi = null;
     try {
       pi = getIntent().getParcelableExtra(EXTRA_PENDING_INTENT_FORGOT_PATTERN);
       pi.send();
     } catch (Throwable t) {
       Log.e(CLASSNAME, "Error sending pending intent: " + pi, t);
     }
     finishWithNegativeResult(RESULT_FORGOT_PATTERN);
   } // ACTION_COMPARE_PATTERN
 } // onClick()