/**
   * @param listener OnSharedPreferenceChangeListener
   * @param decryptKeys Callbacks receive the "key" parameter decrypted
   */
  public void registerOnSharedPreferenceChangeListener(
      final OnSharedPreferenceChangeListener listener, boolean decryptKeys) {

    if (!decryptKeys) {
      registerOnSharedPreferenceChangeListener(listener);
      return;
    }

    // wrap user's OnSharedPreferenceChangeListener with another that decrypts key before
    // calling the onSharedPreferenceChanged callback
    OnSharedPreferenceChangeListener secureListener =
        new OnSharedPreferenceChangeListener() {
          private OnSharedPreferenceChangeListener mInsecureListener = listener;

          @Override
          public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String key) {
            try {
              String decryptedKey = decrypt(key);
              if (decryptedKey != null) {
                mInsecureListener.onSharedPreferenceChanged(sharedPreferences, decryptedKey);
              }
            } catch (Exception e) {
              Log.w(TAG, "Unable to decrypt key: " + key);
            }
          }
        };
    sOnSharedPreferenceChangeListeners.put(listener, secureListener);
    SecurePreferencesOld.sFile.registerOnSharedPreferenceChangeListener(secureListener);
  }