@Override
 public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
   super.onCreateOptionsMenu(menu, inflater);
   if (Constants.DEBUG) {
     inflater.inflate(R.menu.backup_fragment_debug_menu, menu);
   }
 }
 @Override
 public void onCreate(@Nullable Bundle savedInstanceState) {
   super.onCreate(savedInstanceState);
   if (Constants.DEBUG) {
     setHasOptionsMenu(true);
   }
 }
  @Override
  public void onViewCreated(View view, @Nullable Bundle savedInstanceState) {
    super.onViewCreated(view, savedInstanceState);

    if (savedInstanceState != null) {
      int savedBackStack = savedInstanceState.getInt(ARG_BACK_STACK);
      if (savedBackStack >= 0) {
        mBackStackLevel = savedBackStack;
        // unchecked use, we know that this one is available in onViewCreated
        getFragmentManager().addOnBackStackChangedListener(this);
      }
      BackupCodeState savedState =
          BackupCodeState.values()[savedInstanceState.getInt(ARG_CURRENT_STATE)];
      switchState(savedState, false);
    } else if (mCurrentState == BackupCodeState.STATE_UNINITIALIZED) {
      switchState(BackupCodeState.STATE_DISPLAY, true);
    }
  }
  @Override
  public void onActivityResult(int requestCode, int resultCode, Intent data) {
    if (requestCode != REQUEST_SAVE) {
      super.onActivityResult(requestCode, resultCode, data);
      return;
    }

    if (resultCode != FragmentActivity.RESULT_OK) {
      return;
    }

    FragmentActivity activity = getActivity();
    if (activity == null) {
      return;
    }
    try {
      Uri outputUri = data.getData();
      FileHelper.copyUriData(activity, mCachedBackupUri, outputUri);
      Notify.create(activity, R.string.snack_backup_saved, Style.OK).show();
    } catch (IOException e) {
      Notify.create(activity, R.string.snack_backup_error_saving, Style.ERROR).show();
    }
  }
 @Override
 public void onSaveInstanceState(Bundle outState) {
   super.onSaveInstanceState(outState);
   outState.putInt(ARG_CURRENT_STATE, mCurrentState.ordinal());
   outState.putInt(ARG_BACK_STACK, mBackStackLevel == null ? -1 : mBackStackLevel);
 }
  @Override
  public void onResume() {
    super.onResume();

    LinkedIdWizard wizard = (LinkedIdWizard) getActivity();
    mFingerprint = wizard.mFingerprint;
    mMasterKeyId = wizard.mMasterKeyId;

    final String oAuthCode = wizard.oAuthGetCode();
    final String oAuthState = wizard.oAuthGetState();
    if (oAuthCode == null) {
      Log.d(Constants.TAG, "no code");
      return;
    }

    final String gistText = GithubResource.generate(wizard, mFingerprint);

    Log.d(Constants.TAG, "got code: " + oAuthCode);

    new AsyncTask<Void, Void, JSONObject>() {
      @Override
      protected JSONObject doInBackground(Void... dummy) {
        try {

          long timer = System.currentTimeMillis();

          JSONObject params = new JSONObject();
          params.put("client_id", "7a011b66275f244d3f21");
          params.put("client_secret", "eaced8a6655719d8c6848396de97b3f5d7a89fec");
          params.put("code", oAuthCode);
          params.put("state", oAuthState);

          JSONObject result =
              jsonHttpRequest("https://github.com/login/oauth/access_token", params, null);

          // ux flow: this operation should take at last a second
          timer = System.currentTimeMillis() - timer;
          if (timer < 1000)
            try {
              Thread.sleep(1000 - timer);
            } catch (InterruptedException e) {
              // never mind
            }

          return result;

        } catch (IOException e) {
          Log.e(Constants.TAG, "error in request", e);
        } catch (JSONException e) {
          throw new AssertionError("json error, this is a bug!");
        }
        return null;
      }

      @Override
      protected void onPostExecute(JSONObject result) {
        super.onPostExecute(result);

        Log.d(Constants.TAG, "response: " + result);

        if (result == null || !result.has("access_token")) {
          mStatus1.setDisplayedChild(3);
          return;
        }

        mStatus1.setDisplayedChild(2);
        step2PostGist(result.optString("access_token"), gistText);
      }
    }.execute();
  }
 @Override
 public void onCryptoOperationCancelled() {
   super.onCryptoOperationCancelled();
   mStatus3.setDisplayedChild(3);
 }