/* * Copyright (c) 2014. The Trustees of Indiana University. * * This version of the code is licensed under the MPL 2.0 Open Source license with additional * healthcare disclaimer. If the user is an entity intending to commercialize any application * that uses this code in a for-profit venture, please contact the copyright holder. */ package com.muzima.view.cohort; import android.content.Context; import android.content.Intent; import android.os.AsyncTask; import android.os.Build; import android.os.Bundle; import android.os.PowerManager; import android.text.Editable; import android.text.TextWatcher; import android.util.Log; import android.view.View; import android.widget.AdapterView; import android.widget.Button; import android.widget.EditText; import android.widget.ImageButton; import android.widget.ListView; import android.widget.Toast; import android.view.Menu; import android.view.MenuItem; import com.muzima.MuzimaApplication; import com.muzima.R; import com.muzima.adapters.ListAdapter; import com.muzima.adapters.cohort.AllCohortsAdapter; import com.muzima.api.model.LastSyncTime; import com.muzima.api.service.LastSyncTimeService; import com.muzima.service.MuzimaSyncService; import com.muzima.service.SntpService; import com.muzima.view.BroadcastListenerActivity; import com.muzima.view.CheckedLinearLayout; import com.muzima.view.HelpActivity; import com.muzima.view.forms.FormTemplateWizardActivity; import com.muzima.view.progressdialog.MuzimaProgressDialog; import com.muzima.view.setupconfiguration.SetupMethodPreferenceWizardActivity; import java.io.IOException; import java.util.List; import static com.muzima.api.model.APIName.DOWNLOAD_COHORTS; import static com.muzima.utils.Constants.DataSyncServiceConstants.SyncStatusConstants.SUCCESS; public class CohortWizardActivity extends BroadcastListenerActivity implements ListAdapter.BackgroundListQueryTaskListener { private MuzimaProgressDialog progressDialog; private boolean isProcessDialogOn = false; private final String TAG = "CohortWizardActivity" ; private PowerManager powerManager = null; private PowerManager.WakeLock wakeLock = null ; public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_cohort_wizard); ListView listView = getListView(); final AllCohortsAdapter cohortsAdapter = createAllCohortsAdapter(); final EditText filterCohortText = (EditText) findViewById(R.id.filter_cohorts_txt); filterCohortText.addTextChangedListener(textWatcherForFilterText(cohortsAdapter)); ImageButton cancelFilterButton = (ImageButton) findViewById(R.id.cancel_filter_txt); cancelFilterButton.setOnClickListener(cancelFilterTextEventHandler(filterCohortText)); Button nextButton = (Button) findViewById(R.id.next); nextButton.setOnClickListener(nextButtonClickListener(cohortsAdapter)); Button previousButton = (Button) findViewById(R.id.previous); previousButton.setOnClickListener(previousButtonListener()); progressDialog = new MuzimaProgressDialog(this); cohortsAdapter.setBackgroundListQueryTaskListener(this); listView.setOnItemClickListener(listViewClickListener(cohortsAdapter)); cohortsAdapter.downloadCohortAndReload(); listView.setAdapter(cohortsAdapter); } @Override public boolean onCreateOptionsMenu(Menu menu) { super.onCreateOptionsMenu(menu); removeSettingsMenu(menu); return true; } @Override protected void onResume() { super.onResume(); if(isProcessDialogOn){ turnOnProgressDialog(getString(R.string.info_cohort_load)); } } @Override public boolean onOptionsItemSelected(MenuItem item) { switch (item.getItemId()) { case R.id.action_help: Intent intent = new Intent(this, HelpActivity.class); intent.putExtra(HelpActivity.HELP_TYPE, HelpActivity.COHORT_WIZARD_HELP); startActivity(intent); return true; default: return super.onOptionsItemSelected(item); } } private View.OnClickListener cancelFilterTextEventHandler(final EditText filterCohortText) { return new View.OnClickListener() { @Override public void onClick(View view) { filterCohortText.setText(""); } }; } private AdapterView.OnItemClickListener listViewClickListener(final AllCohortsAdapter cohortsAdapter) { return new AdapterView.OnItemClickListener() { @Override public void onItemClick(AdapterView<?> parent, View view, int position, long id) { CheckedLinearLayout checkedLinearLayout = (CheckedLinearLayout) view; cohortsAdapter.onListItemClick(position); } }; } private View.OnClickListener previousButtonListener() { return new View.OnClickListener() { @Override public void onClick(View v) { navigateToPreviousActivity(); } }; } private View.OnClickListener nextButtonClickListener(final AllCohortsAdapter cohortsAdapter) { return new View.OnClickListener() { @Override public void onClick(View v) { turnOnProgressDialog(getString(R.string.info_client_demographics_download)); new AsyncTask<Void, Void, int[]>() { @Override protected void onPreExecute() { Log.i(TAG, "Canceling timer") ; ((MuzimaApplication) getApplication()).cancelTimer(); keepPhoneAwake(true) ; } @Override protected int[] doInBackground(Void... voids) { return downloadAndSavePatients(cohortsAdapter); } @Override protected void onPostExecute(int[] result) { dismissProgressDialog(); if (result[0] != SUCCESS) { Toast.makeText(CohortWizardActivity.this, getString(R.string.error_client_download), Toast.LENGTH_SHORT).show(); } Log.i(TAG, "Restarting timeout timer!") ; ((MuzimaApplication) getApplication()).restartTimer(); try { LastSyncTimeService lastSyncTimeService = ((MuzimaApplication)getApplicationContext()).getMuzimaContext().getLastSyncTimeService(); SntpService sntpService = ((MuzimaApplication)getApplicationContext()).getSntpService(); LastSyncTime lastSyncTime = new LastSyncTime(DOWNLOAD_COHORTS, sntpService.getLocalTime()); lastSyncTimeService.saveLastSyncTime(lastSyncTime); } catch (IOException e) { Log.i(TAG,"Error setting cohort sync time."); } keepPhoneAwake(false) ; navigateToNextActivity(); } }.execute(); } }; } private void keepPhoneAwake(boolean awakeState) { Log.d(TAG, "Launching wake state: " + awakeState) ; if (awakeState) { powerManager = (PowerManager) getSystemService(Context.POWER_SERVICE); wakeLock = powerManager.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, ""); wakeLock.acquire(); } else { if(wakeLock != null) { wakeLock.release(); } } } private TextWatcher textWatcherForFilterText(final AllCohortsAdapter cohortsAdapter) { return new TextWatcher() { @Override public void beforeTextChanged(CharSequence charSequence, int i, int i2, int i3) { } @Override public void onTextChanged(CharSequence charSequence, int i, int i2, int i3) { cohortsAdapter.filterItems(charSequence.toString()); } @Override public void afterTextChanged(Editable editable) { } }; } private int[] downloadAndSavePatients(AllCohortsAdapter cohortsAdapter) { MuzimaSyncService muzimaSyncService = ((MuzimaApplication) getApplicationContext()).getMuzimaSyncService(); List<String> selectedCohortsArray = cohortsAdapter.getSelectedCohorts(); return muzimaSyncService.downloadPatientsForCohorts(selectedCohortsArray.toArray(new String[selectedCohortsArray.size()])); } private void navigateToNextActivity() { Intent intent = new Intent(getApplicationContext(), FormTemplateWizardActivity.class); startActivity(intent); finish(); } private void navigateToPreviousActivity() { Intent intent = new Intent(getApplicationContext(), SetupMethodPreferenceWizardActivity.class); startActivity(intent); finish(); } private AllCohortsAdapter createAllCohortsAdapter() { return new AllCohortsAdapter(getApplicationContext(), R.layout.item_cohorts_list, ((MuzimaApplication) getApplicationContext()).getCohortController()); } private ListView getListView() { return (ListView) findViewById(R.id.cohort_wizard_list); } @Override public void onQueryTaskStarted() { turnOnProgressDialog(getString(R.string.info_cohort_load)); } @Override public void onQueryTaskFinish() { dismissProgressDialog(); } @Override public void onQueryTaskCancelled(){} @Override public void onQueryTaskCancelled(Object errorDefinition){} private void turnOnProgressDialog(String message){ progressDialog.show(message); isProcessDialogOn = true; } private void dismissProgressDialog(){ if (progressDialog != null){ progressDialog.dismiss(); isProcessDialogOn = false; } } }