public void onRestoreState(boolean hasPrograms) {

    ProgramOverviewFragmentState backedUpState = new ProgramOverviewFragmentState(mState);
    if (!backedUpState.isProgramEmpty()) {
      onProgramSelected(backedUpState.getProgramId(), backedUpState.getProgramName());
    } else {
      // todo
    }
  }
  @Override
  public void onClick(View view) {
    switch (view.getId()) {
      case R.id.select_program:
        {
          ProgramDialogFragment fragment =
              ProgramDialogFragment.newInstance(
                  this,
                  mState.getOrgUnitId(),
                  Program.MULTIPLE_EVENTS_WITH_REGISTRATION,
                  Program.SINGLE_EVENT_WITH_REGISTRATION);
          fragment.show(getChildFragmentManager());
          break;
        }

      case R.id.neweventbutton:
        {
          if (mForm.getEnrollment().getStatus().equals(Enrollment.ACTIVE)) {
            ProgramStage programStage = (ProgramStage) view.getTag();
            showDataEntryFragment(null, programStage.getId());
          }
          break;
        }

      case R.id.eventbackground:
        {
          if (mForm.getEnrollment().getStatus().equals(Enrollment.ACTIVE)) {
            Event event = (Event) view.getTag();
            showDataEntryFragment(event, event.getProgramStageId());
          }
        }

      case R.id.complete:
        {
          Dhis2.showConfirmDialog(
              getActivity(),
              getString(R.string.complete),
              getString(R.string.confirm_complete_enrollment),
              getString(R.string.complete),
              getString(R.string.cancel),
              new DialogInterface.OnClickListener() {
                @Override
                public void onClick(DialogInterface dialog, int which) {
                  completeEnrollment();
                }
              });
          break;
        }

      case R.id.terminate:
        {
          Dhis2.showConfirmDialog(
              getActivity(),
              getString(R.string.terminate),
              getString(R.string.confirm_terminate_enrollment),
              getString(R.string.terminate),
              getString(R.string.cancel),
              new DialogInterface.OnClickListener() {
                @Override
                public void onClick(DialogInterface dialog, int which) {
                  terminateEnrollment();
                }
              });
          break;
        }

      case R.id.followupButton:
        {
          toggleFollowup();
          break;
        }

      case R.id.newenrollmentbutton:
        {
          enroll();
          break;
        }

      case R.id.profile_cardview:
        {
          editTrackedEntityInstanceProfile();
          break;
        }
      case R.id.profile_button:
        {
          editTrackedEntityInstanceProfile();
          break;
        }
    }
  }
 public void enroll() {
   EnrollmentFragment enrollmentFragment =
       EnrollmentFragment.newInstance(
           mState.getOrgUnitId(), mState.getProgramId(), mState.getTrackedEntityInstanceId());
   mNavigationHandler.switchFragment(enrollmentFragment, EnrollmentFragment.class.getName(), true);
 }
  public void onProgramSelected(String programId, String programName) {

    mState.setProgram(programId, programName);
    clearViews();
    getLoaderManager().restartLoader(LOADER_ID, getArguments(), this);
  }
  @Override
  public void onViewCreated(View view, Bundle savedInstanceState) {
    listView = (ListView) view.findViewById(R.id.listview);
    View header =
        getLayoutInflater(savedInstanceState)
            .inflate(R.layout.fragment_programoverview_header, listView, false);
    mProgressBar = (ProgressBar) header.findViewById(R.id.progress_bar);
    mProgressBar.setVisibility(View.GONE);

    adapter = new ProgramStageAdapter(getLayoutInflater(savedInstanceState));
    listView.addHeaderView(header, CLASS_TAG, false);
    listView.setAdapter(adapter);
    listView.setOnItemClickListener(this);

    enrollmentLayout = (LinearLayout) header.findViewById(R.id.enrollmentLayout);
    enrollmentDateLabel = (TextView) header.findViewById(R.id.dateOfEnrollmentLabel);
    enrollmentDateValue = (TextView) header.findViewById(R.id.dateOfEnrollmentValue);
    incidentDateLabel = (TextView) header.findViewById(R.id.dateOfIncidentLabel);
    incidentDateValue = (TextView) header.findViewById(R.id.dateOfIncidentValue);
    profileCardView = (CardView) header.findViewById(R.id.profile_cardview);
    enrollmentCardview = (CardView) header.findViewById(R.id.enrollment_cardview);

    completeButton = (Button) header.findViewById(R.id.complete);
    terminateButton = (Button) header.findViewById(R.id.terminate);
    followupButton = (ImageButton) header.findViewById(R.id.followupButton);
    profileButton = (ImageButton) header.findViewById(R.id.profile_button);
    completeButton.setOnClickListener(null);
    terminateButton.setOnClickListener(null);
    followupButton.setOnClickListener(null);
    profileButton.setOnClickListener(this);
    profileCardView.setOnClickListener(this);

    missingEnrollmentLayout = (LinearLayout) header.findViewById(R.id.missingenrollmentlayout);
    newEnrollmentButton = (FloatingActionButton) header.findViewById(R.id.newenrollmentbutton);
    newEnrollmentButton.setOnClickListener(this);

    attribute1Label = (TextView) header.findViewById(R.id.headerItem1label);
    attribute1Value = (TextView) header.findViewById(R.id.headerItem1value);
    attribute2Label = (TextView) header.findViewById(R.id.headerItem2label);
    attribute2Value = (TextView) header.findViewById(R.id.headerItem2value);

    Bundle fragmentArguments = getArguments();
    Log.d(CLASS_TAG, "program: " + fragmentArguments.getString(PROGRAM_ID));

    attachSpinner();
    mSpinnerAdapter.swapData(
        MetaDataController.getProgramsForOrganisationUnit(
            fragmentArguments.getString(ORG_UNIT_ID),
            Program.SINGLE_EVENT_WITH_REGISTRATION,
            Program.MULTIPLE_EVENTS_WITH_REGISTRATION));

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

    if (mState == null) {
      mState = new ProgramOverviewFragmentState();
      OrganisationUnit ou =
          MetaDataController.getOrganisationUnit(fragmentArguments.getString(ORG_UNIT_ID));
      Program program = MetaDataController.getProgram(fragmentArguments.getString(PROGRAM_ID));
      mState.setOrgUnit(ou.getId(), ou.getLabel());
      mState.setProgram(program.getId(), program.getName());
      mState.setTrackedEntityInstance(fragmentArguments.getLong(TRACKEDENTITYINSTANCE_ID, -1));
    }

    onRestoreState(true);
  }