package com.door43.translationstudio; import android.app.AlertDialog; import android.app.ProgressDialog; import android.content.DialogInterface; import android.content.Intent; import android.net.Uri; import android.os.Bundle; import android.os.Handler; import android.os.Looper; import android.view.View; import android.widget.Button; import android.widget.EditText; import com.door43.translationstudio.dialogs.CustomAlertDialog; import com.door43.translationstudio.newui.BaseActivity; import com.door43.translationstudio.tasks.ArchiveCrashReportTask; import com.door43.translationstudio.tasks.CheckForLatestReleaseTask; import com.door43.translationstudio.tasks.UploadCrashReportTask; import com.door43.util.tasks.ManagedTask; import com.door43.util.tasks.TaskManager; public class CrashReporterActivity extends BaseActivity implements ManagedTask.OnFinishedListener { private Button mOkButton; private Button mCancelButton; private ProgressDialog mLoadingDialog; private EditText mCrashReportText; private static final String STATE_LATEST_RELEASE = "state_latest_release"; private static final String STATE_NOTES = "state_notes"; private static final String STATE_DOWNLOAD_UPDATES = "state_download_updates"; private String mNotes = ""; private CheckForLatestReleaseTask.Release mLatestRelease = null; private boolean mDownloadAfterArchive = false; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_crash_reporter); mOkButton = (Button)findViewById(R.id.okButton); mCancelButton = (Button)findViewById(R.id.cancelButton); mCrashReportText = (EditText)findViewById(R.id.crashDescriptioneditText); mLoadingDialog = new ProgressDialog(CrashReporterActivity.this); mLoadingDialog.setCancelable(false); mLoadingDialog.setCanceledOnTouchOutside(false); mOkButton.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { mNotes = mCrashReportText.getText().toString().trim(); mLoadingDialog.setMessage(getResources().getString(R.string.loading)); mLoadingDialog.show(); CheckForLatestReleaseTask task = new CheckForLatestReleaseTask(); task.addOnFinishedListener(CrashReporterActivity.this); TaskManager.addTask(task, CheckForLatestReleaseTask.TASK_ID); } }); mCancelButton.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { mLoadingDialog.setMessage(getResources().getString(R.string.loading)); mLoadingDialog.show(); ArchiveCrashReportTask task = new ArchiveCrashReportTask(); task.addOnFinishedListener(CrashReporterActivity.this); TaskManager.addTask(task, ArchiveCrashReportTask.TASK_ID); } }); } public void onRestoreInstanceState(Bundle savedInstanceState) { super.onRestoreInstanceState(savedInstanceState); if(savedInstanceState != null) { mNotes = savedInstanceState.getString(STATE_NOTES, ""); mLatestRelease = (CheckForLatestReleaseTask.Release)savedInstanceState.getSerializable(STATE_LATEST_RELEASE); mDownloadAfterArchive = savedInstanceState.getBoolean(STATE_DOWNLOAD_UPDATES, false); } mCrashReportText.setText(mNotes); super.onRestoreInstanceState(savedInstanceState); } @Override public void onResume() { super.onResume(); CheckForLatestReleaseTask checkTask = (CheckForLatestReleaseTask) TaskManager.getTask(CheckForLatestReleaseTask.TASK_ID); UploadCrashReportTask uploadTask = (UploadCrashReportTask)TaskManager.getTask(UploadCrashReportTask.TASK_ID); ArchiveCrashReportTask archiveTask = (ArchiveCrashReportTask)TaskManager.getTask(ArchiveCrashReportTask.TASK_ID); if(checkTask != null) { mLoadingDialog.setMessage(getResources().getString(R.string.loading)); mLoadingDialog.show(); checkTask.addOnFinishedListener(this); } else if(uploadTask != null) { mLoadingDialog.setMessage(getResources().getString(R.string.uploading)); mLoadingDialog.show(); uploadTask.addOnFinishedListener(this); } else if(archiveTask != null) { mLoadingDialog.setMessage(getResources().getString(R.string.loading)); mLoadingDialog.show(); archiveTask.addOnFinishedListener(this); } else if(mLatestRelease != null) { notifyLatestRelease(mLatestRelease); } } /** * Displays a dialog to the user telling them there is an apk update. * @param release */ private void notifyLatestRelease(final CheckForLatestReleaseTask.Release release) { CustomAlertDialog.Create(this) .setTitle(R.string.apk_update_available) .setMessage(R.string.upload_report_or_download_latest_apk) .setNegativeButton(R.string.title_cancel, new View.OnClickListener() { @Override public void onClick(View v) { mLatestRelease = null; // archive crash report mLoadingDialog.setMessage(getResources().getString(R.string.loading)); mLoadingDialog.show(); ArchiveCrashReportTask task = new ArchiveCrashReportTask(); task.addOnFinishedListener(CrashReporterActivity.this); TaskManager.addTask(task, ArchiveCrashReportTask.TASK_ID); } }) .setNeutralButton(R.string.download_update, new View.OnClickListener() { @Override public void onClick(View v) { mDownloadAfterArchive = true; // archive crash report mLoadingDialog.setMessage(getResources().getString(R.string.loading)); mLoadingDialog.show(); ArchiveCrashReportTask task = new ArchiveCrashReportTask(); task.addOnFinishedListener(CrashReporterActivity.this); TaskManager.addTask(task, ArchiveCrashReportTask.TASK_ID); } }) .setPositiveButton(R.string.label_continue, new View.OnClickListener() { @Override public void onClick(View v) { mLoadingDialog.setMessage(getResources().getString(R.string.uploading)); mLoadingDialog.show(); UploadCrashReportTask newTask = new UploadCrashReportTask(mNotes); newTask.addOnFinishedListener(CrashReporterActivity.this); TaskManager.addTask(newTask, UploadCrashReportTask.TASK_ID); } }) .show("NotifyLatest"); } private void openSplash() { Intent intent = new Intent(CrashReporterActivity.this, SplashScreenActivity.class); startActivity(intent); finish(); } @Override public void onFinished(ManagedTask task) { TaskManager.clearTask(task); Handler hand = new Handler(Looper.getMainLooper()); hand.post(new Runnable() { @Override public void run() { if (mLoadingDialog.isShowing()) { mLoadingDialog.dismiss(); } } }); if(task.getClass().getName().equals(CheckForLatestReleaseTask.class.getName())) { CheckForLatestReleaseTask.Release release = ((CheckForLatestReleaseTask)task).getLatestRelease(); if(release != null) { // ask user if they would like to download updates mLatestRelease = release; hand.post(new Runnable() { @Override public void run() { notifyLatestRelease(mLatestRelease); } }); } else { // upload crash report hand.post(new Runnable() { @Override public void run() { mLoadingDialog.setMessage(getResources().getString(R.string.uploading)); mLoadingDialog.show(); } }); UploadCrashReportTask newTask = new UploadCrashReportTask(mCrashReportText.getText().toString().trim()); newTask.addOnFinishedListener(CrashReporterActivity.this); TaskManager.addTask(newTask, UploadCrashReportTask.TASK_ID); } } else if(task.getClass().getName().equals(UploadCrashReportTask.class.getName())) { openSplash(); } else if(task.getClass().getName().equals(ArchiveCrashReportTask.class.getName())) { if(mDownloadAfterArchive) { Boolean isStoreVersion = ((MainApplication)getApplication()).isStoreVersion(); if (isStoreVersion) { // open play store final String appPackageName = getPackageName(); try { startActivity(new Intent(Intent.ACTION_VIEW, Uri.parse("market://details?id=" + appPackageName))); } catch (android.content.ActivityNotFoundException anfe) { startActivity(new Intent(Intent.ACTION_VIEW, Uri.parse("https://play.google.com/store/apps/details?id=" + appPackageName))); } } else { // download from github Intent browserIntent = new Intent(Intent.ACTION_VIEW, Uri.parse(mLatestRelease.downloadUrl)); startActivity(browserIntent); } finish(); } else { openSplash(); } } } @Override public void onSaveInstanceState(Bundle outState) { if(mLatestRelease != null) { outState.putSerializable(STATE_LATEST_RELEASE, mLatestRelease); } else { outState.remove(STATE_LATEST_RELEASE); } outState.putBoolean(STATE_DOWNLOAD_UPDATES, mDownloadAfterArchive); outState.putString(STATE_NOTES, mCrashReportText.getText().toString().trim()); super.onSaveInstanceState(outState); } @Override public void onDestroy() { // disconnect listeners CheckForLatestReleaseTask checkTask = (CheckForLatestReleaseTask) TaskManager.getTask(CheckForLatestReleaseTask.TASK_ID); if(checkTask != null) { checkTask.removeOnFinishedListener(this); } UploadCrashReportTask uploadTask = (UploadCrashReportTask)TaskManager.getTask(UploadCrashReportTask.TASK_ID); if(uploadTask != null) { uploadTask.removeOnFinishedListener(this); } ArchiveCrashReportTask archiveTask = (ArchiveCrashReportTask)TaskManager.getTask(ArchiveCrashReportTask.TASK_ID); if(archiveTask != null) { archiveTask.removeOnFinishedListener(this); } super.onDestroy(); } }