package com.muzima.view.setupconfiguration; import android.content.Context; import android.content.Intent; import android.os.AsyncTask; import android.os.Bundle; import android.os.PowerManager; import android.text.Editable; import android.text.TextWatcher; import android.util.Log; import android.view.Menu; import android.view.View; import android.widget.AdapterView; import android.widget.Button; import android.widget.EditText; import android.widget.LinearLayout; import android.widget.ListView; import android.widget.Toast; import com.azimolabs.keyboardwatcher.KeyboardWatcher; import com.muzima.MuzimaApplication; import com.muzima.R; import com.muzima.adapters.ListAdapter; import com.muzima.adapters.setupconfiguration.SetupConfigurationAdapter; 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.cohort.CohortWizardActivity; import com.muzima.view.progressdialog.MuzimaProgressDialog; import java.io.IOException; import static com.muzima.api.model.APIName.DOWNLOAD_SETUP_CONFIGURATIONS; import static com.muzima.utils.Constants.DataSyncServiceConstants.SyncStatusConstants.SUCCESS; public class SetupMethodPreferenceWizardActivity extends BroadcastListenerActivity implements ListAdapter.BackgroundListQueryTaskListener, KeyboardWatcher.OnKeyboardToggleListener { private Button activeNextButton; private Button inactiveNextButton; private CheckedLinearLayout advancedSetupLayout; private LinearLayout nextButtonLayout; private ListView configsListView; private MuzimaProgressDialog progressDialog; private boolean isProcessDialogOn = false; private final String TAG = "CohortWizardActivity" ; private PowerManager powerManager = null; private PowerManager.WakeLock wakeLock = null ; private KeyboardWatcher keyboardWatcher; public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); progressDialog = new MuzimaProgressDialog(this); setContentView(R.layout.activity_setup_method_wizard); inactiveNextButton = (Button) findViewById(R.id.inactive_next); advancedSetupLayout = (CheckedLinearLayout)findViewById(R.id.advanced_setup_layout); advancedSetupLayout.setOnClickListener(advancedSetupClickListener()); final SetupConfigurationAdapter setupConfigurationAdapter = new SetupConfigurationAdapter( getApplicationContext(),R.layout.item_setup_configs_list, ((MuzimaApplication) getApplicationContext()).getSetupConfigurationController()); setupConfigurationAdapter.setBackgroundListQueryTaskListener(this); final EditText configSetupFilter = (EditText) findViewById(R.id.filter_configs_txt); configSetupFilter.addTextChangedListener(textWatcherForFilterText(setupConfigurationAdapter)); setupConfigurationAdapter.reloadData(); activeNextButton = (Button) findViewById(R.id.next); activeNextButton.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { if(advancedSetupLayout.isChecked()) { navigateToCohortsWizardActivity(); } else { navigateToGuidedWizardActivity(setupConfigurationAdapter); } } }); nextButtonLayout = (LinearLayout)findViewById(R.id.next_button_layout); keyboardWatcher = new KeyboardWatcher(this); keyboardWatcher.setListener(this); configsListView = (ListView)findViewById(R.id.configs_wizard_list); configsListView.setOnItemClickListener(configsListViewSelectedListener(setupConfigurationAdapter)); configsListView.setAdapter(setupConfigurationAdapter); } @Override public boolean onCreateOptionsMenu(Menu menu) { super.onCreateOptionsMenu(menu); removeSettingsMenu(menu); return true; } @Override protected void onDestroy() { keyboardWatcher.destroy(); super.onDestroy(); } @Override public void onKeyboardShown(int keyboardSize) { advancedSetupLayout.setVisibility(View.GONE); nextButtonLayout.setVisibility(View.GONE); } @Override public void onKeyboardClosed() { advancedSetupLayout.setVisibility(View.VISIBLE); nextButtonLayout.setVisibility(View.VISIBLE); } private View.OnClickListener advancedSetupClickListener(){ return new View.OnClickListener() { @Override public void onClick(View v) { activateNextButton(); deselectGuidedSetupConfigsView(); selectAdvancedSetupView(); } }; } private AdapterView.OnItemClickListener configsListViewSelectedListener(final SetupConfigurationAdapter setupConfigurationAdapter){ return new AdapterView.OnItemClickListener() { @Override public void onItemClick(AdapterView<?> parent, View view, int position, long id) { activateNextButton(); deselectAdvancedSetupView(); setupConfigurationAdapter.onListItemClick(position); } }; } private void selectAdvancedSetupView(){ advancedSetupLayout.setChecked(true); } private void deselectAdvancedSetupView(){ advancedSetupLayout.setChecked(false); } private void deselectGuidedSetupConfigsView(){ configsListView.clearChoices(); configsListView.requestLayout(); } private void activateNextButton(){ inactiveNextButton.setVisibility(View.GONE); activeNextButton.setVisibility(View.VISIBLE); } private void navigateToCohortsWizardActivity() { Intent intent = new Intent(getApplicationContext(), CohortWizardActivity.class); startActivity(intent); finish(); } private void navigateToGuidedWizardActivity(final SetupConfigurationAdapter setupConfigurationAdapter){ turnOnProgressDialog(getString(R.string.info_setup_configuration_wizard_prepare)); new AsyncTask<Void, Void, int[]>() { @Override protected void onPreExecute() { ((MuzimaApplication) getApplication()).cancelTimer(); keepPhoneAwake(true); } @Override protected int[] doInBackground(Void... voids) { return downloadSetupConfiguration(setupConfigurationAdapter); } @Override protected void onPostExecute(int[] result) { dismissProgressDialog(); Log.i(TAG, "Restarting timeout timer!"); ((MuzimaApplication) getApplication()).restartTimer(); if (result[0] != SUCCESS) { Toast.makeText(SetupMethodPreferenceWizardActivity.this, getString(R.string.error_setup_configuration_template_download), Toast.LENGTH_SHORT).show(); } else { try { LastSyncTimeService lastSyncTimeService = ((MuzimaApplication) getApplicationContext()).getMuzimaContext().getLastSyncTimeService(); SntpService sntpService = ((MuzimaApplication) getApplicationContext()).getSntpService(); LastSyncTime lastSyncTime = new LastSyncTime(DOWNLOAD_SETUP_CONFIGURATIONS, sntpService.getLocalTime()); lastSyncTimeService.saveLastSyncTime(lastSyncTime); } catch (IOException e) { Log.i(TAG, "Error setting Setup Configuration sync time."); } keepPhoneAwake(false); Intent intent = new Intent(getApplicationContext(), GuidedConfigurationWizardActivity.class); intent.putExtra(GuidedConfigurationWizardActivity.SETUP_CONFIG_UUID_INTENT_KEY, setupConfigurationAdapter.getSelectedConfigurationUuid()); startActivity(intent); finish(); } } }.execute(); } private int[] downloadSetupConfiguration(SetupConfigurationAdapter setupConfigurationAdapter){ MuzimaSyncService muzimaSyncService = ((MuzimaApplication) getApplicationContext()).getMuzimaSyncService(); String selectedConfigUuid = setupConfigurationAdapter.getSelectedConfigurationUuid(); return muzimaSyncService.downloadSetupConfigurationTemplate(selectedConfigUuid); } 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 SetupConfigurationAdapter setupConfigurationAdapter) { 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) { setupConfigurationAdapter.filterItems(charSequence.toString()); } @Override public void afterTextChanged(Editable editable) { } }; } @Override public void onQueryTaskStarted() { turnOnProgressDialog(getString(R.string.info_setup_config_load)); } @Override public void onQueryTaskFinish() { dismissProgressDialog(); } @Override public void onQueryTaskCancelled(){} @Override public void onQueryTaskCancelled(Object erroeDefinition){} private void turnOnProgressDialog(String message){ progressDialog.show(message); isProcessDialogOn = true; } private void dismissProgressDialog(){ if (progressDialog != null){ progressDialog.dismiss(); isProcessDialogOn = false; } } }