private void showFragment(Class<? extends JRUiFragment> fragClass, int requestCode) {
    JRUiFragment f;
    try {
      f = fragClass.newInstance();
    } catch (java.lang.InstantiationException e) {
      throw new RuntimeException(e);
    } catch (IllegalAccessException e) {
      throw new RuntimeException(e);
    }
    Bundle args = new Bundle();
    args.putInt(JR_FRAGMENT_FLOW_MODE, getFragmentFlowMode());
    f.setArguments(args);
    f.setTargetFragment(this, requestCode);

    getActivity()
        .getSupportFragmentManager()
        .beginTransaction()
        .replace(((ViewGroup) getView().getParent()).getId(), f)
        .addToBackStack(fragClass.getSimpleName())
        .setTransition(FragmentTransaction.TRANSIT_NONE)
        .commit();
  }
 @Override
 protected void onActivityResult(int requestCode, int resultCode, Intent data) {
   LogUtils.logd(TAG, "requestCode: " + requestCode + " resultCode: " + resultCode);
   super.onActivityResult(requestCode, resultCode, data);
   /* Sometimes this activity starts an activity by proxy for its fragment, in that case we
    * delegate the result to the fragment here.
    */
   if (requestCode <= 1 << 16) mUiFragment.onActivityResult(requestCode, resultCode, data);
   /* However, the Fragment API munges activityForResult invocations from fragments by bitshifting
    * the request code up two bytes. This method doesn't handle such request codes; they dispatch
    * by the Fragment API path.
    */
   JRSession session = JRSession.getInstance();
   if (session != null && session.getCurrentOpenIDAppAuthProvider() != null) {
     session.getCurrentOpenIDAppAuthProvider().onActivityResult(requestCode, resultCode, data);
   }
 }
  @Override
  public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    LogUtils.logd(TAG, "[onCreate]: " + getFragmentId());

    JRSession session = JRSession.getInstance();

    if (session == null || savedInstanceState != null) {
      /* This flow control path is reached when there's process death and restart */
      Log.e(TAG, "bailing out after a process kill/restart. mSession: " + session);

      // prevent fragment recreation error -- the system needs the fragment's container to exist
      // even if the Activity is finishing right away
      setContentView(R.layout.jr_fragment_host_activity);
      super.finish();
      return;
    }

    switch (getFragmentId()) {
      case JR_PROVIDER_LIST:
        mUiFragment = new JRProviderListFragment();
        break;
      case JR_LANDING:
        mUiFragment = new JRLandingFragment();
        break;
      case JR_WEBVIEW:
        mUiFragment = new JRWebViewFragment();
        break;
      case JR_PUBLISH:
        mUiFragment = new JRPublishFragment();
        break;
      case JR_OPENID_APPAUTH:
        mUiFragment = new JROpenIDAppAuthFragment();
        break;
      default:
        throw new IllegalFragmentIdException(getFragmentId());
    }

    Bundle fragArgs = new Bundle();
    fragArgs.putInt(JRUiFragment.JR_FRAGMENT_FLOW_MODE, getFlowMode());
    fragArgs.putAll(getIntent().getExtras());
    mUiFragment.setArguments(fragArgs);

    mUiFragment.onFragmentHostActivityCreate(this, session);

    if (shouldBeDialog()) {
      AndroidUtils.activitySetFinishOnTouchOutside(this, true);

      if (shouldBePhoneSizedDialog()) {
        getTheme().applyStyle(R.style.jr_dialog_phone_sized, true);
      } else {
        getTheme().applyStyle(R.style.jr_dialog_71_percent, true);
      }

      if (!mUiFragment.shouldShowTitleWhenDialog()) {
        getTheme().applyStyle(R.style.jr_disable_title_and_action_bar_style, true);
      }
    } else if (getOperationMode() == JR_FULLSCREEN_NO_TITLE) {
      getWindow().requestFeature(Window.FEATURE_NO_TITLE);
      getTheme().applyStyle(R.style.jr_disable_title_and_action_bar_style, true);
    } else if (getOperationMode() == JR_FULLSCREEN) {
      // noop
    }

    setContentView(R.layout.jr_fragment_host_activity);

    View fragmentContainer = findViewById(R.id.jr_fragment_container);
    if (fragmentContainer instanceof CustomMeasuringFrameLayout) {
      // CMFL -> dialog mode on a tablet
      if (shouldBePhoneSizedDialog()) {
        // Do the actual setting of the target size to achieve phone sized dialog.
        ((CustomMeasuringFrameLayout) fragmentContainer).setTargetSizeDip(320, 480);
        getWindow().makeActive();
        WindowManager.LayoutParams lp = new WindowManager.LayoutParams();
        lp.copyFrom(getWindow().getAttributes());
        lp.width = AndroidUtils.scaleDipToPixels(320);
        // After discussing it with Lilli we think it makes sense to let the height of the window
        // grow if the title is enabled
        // int targetHeight = mUiFragment.getCustomTitle() == null ? 480 : 560;
        // lp.height = AndroidUtils.scaleDipToPixels(targetHeight);
        getWindow().setAttributes(lp);
      }
    }

    getSupportFragmentManager()
        .beginTransaction()
        .add(R.id.jr_fragment_container, mUiFragment)
        .setTransition(FragmentTransaction.TRANSIT_NONE)
        .commit();
  }
  @Override
  public void onBackPressed() {
    LogUtils.logd(TAG, "onBackPressed");

    mUiFragment.onBackPressed();
  }