package org.voxe.android.activity; import org.voxe.android.R; import org.voxe.android.VoxeApplication; import org.voxe.android.data.DownloadListener; import org.voxe.android.data.DownloadProgress; import org.voxe.android.data.ElectionDownloadTask; import org.voxe.android.data.ElectionLoadTask; import org.voxe.android.data.LoadListener; import android.content.Intent; import android.os.Bundle; import android.view.View; import android.widget.ProgressBar; import android.widget.TextView; import com.actionbarsherlock.app.SherlockActivity; import com.googlecode.androidannotations.annotations.App; import com.googlecode.androidannotations.annotations.EActivity; import com.googlecode.androidannotations.annotations.ViewById; import com.googlecode.androidannotations.annotations.res.HtmlRes; @EActivity(R.layout.loading) public class LoadingActivity extends SherlockActivity implements LoadListener, DownloadListener { private enum Step { LOADING_DATA, DOWNLOADING_DATA, RETRY, DONE; } private static class NonConfigurationInstance { public final ElectionLoadTask<LoadingActivity> electionLoadTask; public final ElectionDownloadTask<LoadingActivity> electionDownloadTask; public final Step step; public NonConfigurationInstance(ElectionLoadTask<LoadingActivity> electionLoadTask, ElectionDownloadTask<LoadingActivity> electionDownloadTask, Step step) { this.electionLoadTask = electionLoadTask; this.electionDownloadTask = electionDownloadTask; this.step = step; } } @HtmlRes CharSequence voxeOrgTitle; @App VoxeApplication application; @ViewById ProgressBar downloadingProgressBar; @ViewById TextView downloadingText; private ElectionLoadTask<LoadingActivity> electionLoadTask; private ElectionDownloadTask<LoadingActivity> electionDownloadTask; private Step step; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setTitle(voxeOrgTitle); NonConfigurationInstance instance = (NonConfigurationInstance) getLastNonConfigurationInstance(); if (instance != null) { step = instance.step; electionLoadTask = instance.electionLoadTask; electionDownloadTask = instance.electionDownloadTask; } else { step = Step.LOADING_DATA; electionLoadTask = new ElectionLoadTask<LoadingActivity>(this, application); electionLoadTask.execute(); } } @Override public Object onRetainNonConfigurationInstance() { NonConfigurationInstance instance = new NonConfigurationInstance(electionLoadTask, electionDownloadTask, step); // This activity is done, must not cancel the tasks step = Step.DONE; return instance; } @Override protected void onResume() { super.onResume(); if (step == Step.LOADING_DATA) { hideDownloadingInfo(); electionLoadTask.bindActivity(this); } else if (step == Step.DOWNLOADING_DATA) { showDownloadingInfo(); electionDownloadTask.bindActivity(this); } } private void hideDownloadingInfo() { downloadingProgressBar.setVisibility(View.GONE); downloadingText.setVisibility(View.GONE); } private void showDownloadingInfo() { downloadingProgressBar.setVisibility(View.VISIBLE); downloadingText.setVisibility(View.VISIBLE); DownloadProgress currentProgress = electionDownloadTask.getCurrentProgress(); onDownloadProgress(currentProgress); } @Override protected void onPause() { super.onPause(); if (step == Step.LOADING_DATA) { electionLoadTask.unbindActivity(); } else if (step == Step.DOWNLOADING_DATA) { electionDownloadTask.unbindActivity(); } } @Override protected void onDestroy() { super.onDestroy(); if (step == Step.LOADING_DATA) { electionLoadTask.destroy(); } else if (step == Step.DOWNLOADING_DATA) { electionDownloadTask.destroy(); } } @Override public void onElectionLoaded() { step = Step.DONE; electionLoadTask = null; startNextActivityAndFinish(); } private void startNextActivityAndFinish() { SelectElectionActivity_ // .intent(this) // .start(); finish(); } @Override public void onNoData() { step = Step.DOWNLOADING_DATA; electionLoadTask = null; electionDownloadTask = new ElectionDownloadTask<LoadingActivity>(this, application); electionDownloadTask.execute(); showDownloadingInfo(); } @Override public void onElectionDownloaded() { step = Step.DONE; electionDownloadTask = null; startNextActivityAndFinish(); } @Override public void onDownloadError() { step = Step.RETRY; electionDownloadTask = null; Intent intent = LoadingErrorActivity_ // .intent(this) // .description(getString(R.string.election_download_error)) // .get(); startActivityForResult(intent, R.id.loading_error_request); } @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { if (requestCode == R.id.loading_error_request) { if (resultCode == RESULT_OK) { onNoData(); } else { finish(); } } } @Override public void onDownloadProgress(DownloadProgress progress) { downloadingProgressBar.setProgress(progress.currentProgress); downloadingProgressBar.setSecondaryProgress(progress.nextProgress); downloadingText.setText(progress.progressMessage); } }