public void onUnitSelected(String orgUnitId, String orgUnitLabel) {
    mOrgUnitButton.setText(orgUnitLabel);
    mProgramButton.setEnabled(true);

    mState.setOrgUnit(orgUnitId, orgUnitLabel);
    mState.resetProgram();

    mPrefs.putOrgUnit(new Pair<>(orgUnitId, orgUnitLabel));
    mPrefs.putProgram(null);

    handleViews(0);
  }
  @Override
  public void onViewCreated(View view, Bundle savedInstanceState) {
    mPrefs = new SelectProgramFragmentPreferences(getActivity().getApplicationContext());

    mListView = (ListView) view.findViewById(R.id.event_listview);
    mAdapter = new TrackedEntityInstanceAdapter(getLayoutInflater(savedInstanceState));
    View header =
        getLayoutInflater(savedInstanceState)
            .inflate(R.layout.fragment_select_program_header, mListView, false);
    mProgressBar = (ProgressBar) header.findViewById(R.id.progress_bar);
    mProgressBar.setVisibility(View.GONE);

    mListView.addHeaderView(header, TAG, false);
    mListView.setAdapter(mAdapter);

    mOrgUnitButton = (CardTextViewButton) header.findViewById(R.id.select_organisation_unit);
    mProgramButton = (CardTextViewButton) header.findViewById(R.id.select_program);
    mRegisterEventButton = (FloatingActionButton) header.findViewById(R.id.register_new_event);
    mUpcomingEventsButton = (FloatingActionButton) header.findViewById(R.id.upcoming_events_button);
    mOrgUnitButton.setOnClickListener(this);
    mProgramButton.setOnClickListener(this);
    mRegisterEventButton.setOnClickListener(this);
    mUpcomingEventsButton.setOnClickListener(this);

    mOrgUnitButton.setEnabled(true);
    mProgramButton.setEnabled(false);
    mRegisterEventButton.hide();
    mUpcomingEventsButton.hide();

    if (savedInstanceState != null && savedInstanceState.getParcelable(STATE) != null) {
      mState = savedInstanceState.getParcelable(STATE);
    }

    if (mState == null) {
      // restoring last selection of program
      Pair<String, String> orgUnit = mPrefs.getOrgUnit();
      Pair<String, String> program = mPrefs.getProgram();
      mState = new SelectProgramFragmentState();
      if (orgUnit != null) {
        mState.setOrgUnit(orgUnit.first, orgUnit.second);
        if (program != null) {
          mState.setProgram(program.first, program.second);
        }
      }
    }

    onRestoreState(true);
  }
  public void onProgramSelected(String programId, String programName) {
    mProgramButton.setText(programName);

    mState.setProgram(programId, programName);
    mPrefs.putProgram(new Pair<>(programId, programName));
    handleViews(1);

    mProgressBar.setVisibility(View.VISIBLE);
    // this call will trigger onCreateLoader method
    getLoaderManager().restartLoader(LOADER_ID, getArguments(), this);
  }
  public void onRestoreState(boolean hasUnits) {
    mOrgUnitButton.setEnabled(hasUnits);
    if (!hasUnits) {
      return;
    }

    SelectProgramFragmentState backedUpState = new SelectProgramFragmentState(mState);
    if (!backedUpState.isOrgUnitEmpty()) {
      onUnitSelected(backedUpState.getOrgUnitId(), backedUpState.getOrgUnitLabel());

      if (!backedUpState.isProgramEmpty()) {
        onProgramSelected(backedUpState.getProgramId(), backedUpState.getProgramName());
      }
    }
  }