package com.evancharlton.mileage.io; import com.evancharlton.mileage.ExportActivity; import com.evancharlton.mileage.R; import com.evancharlton.mileage.provider.FillUpsProvider; import com.evancharlton.mileage.provider.Settings; import android.app.Activity; import android.os.AsyncTask; import android.os.Bundle; import android.widget.ProgressBar; import android.widget.TextView; public abstract class BaseExportActivity extends Activity { private ProgressBar mProgressBar; private TextView mLog; private ExportTask mExportTask; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.export_progress); final String filename = getIntent().getStringExtra(ExportActivity.FILENAME); setTitle(getString(R.string.exporting, filename)); mProgressBar = (ProgressBar) findViewById(R.id.progress); mLog = (TextView) findViewById(R.id.log); mProgressBar.setIndeterminate(true); mExportTask = (ExportTask) getLastNonConfigurationInstance(); if (mExportTask == null) { mExportTask = createExportTask(); } mExportTask.attach(this); if (mExportTask.getStatus() == AsyncTask.Status.PENDING) { String dbPath = getDatabasePath(FillUpsProvider.DATABASE_NAME).getAbsolutePath(); mExportTask.execute(dbPath, filename); } } @Override public Object onRetainNonConfigurationInstance() { return mExportTask; } public void update(Update update) { if (update.message != null && update.message.length() > 0) { mLog.append(update.message + "\n"); } if (update.progress > 0) { mProgressBar.setIndeterminate(false); mProgressBar.setProgress(update.progress); } if (update.max > 0) { mProgressBar.setMax(update.max); } } public void completed(String message) { update(new Update(message, mProgressBar.getMax())); } abstract protected ExportTask createExportTask(); protected static abstract class ExportTask extends AsyncTask<String, Update, String> { protected BaseExportActivity mActivity = null; public final void attach(BaseExportActivity activity) { mActivity = activity; } @Override protected final void onPreExecute() { mActivity.update(new Update(mActivity.getTitle().toString(), 0)); } @Override protected final String doInBackground(String... params) { final String inputFile = params[0]; final String outputFile = params[1]; return performExport(inputFile, Settings.EXTERNAL_DIR + outputFile.trim()); } @Override protected final void onProgressUpdate(Update... updates) { mActivity.update(updates[0]); } @Override protected final void onPostExecute(String result) { final String msg; if (result != null) { msg = mActivity.getString(R.string.exported, result.substring(result.lastIndexOf('/') + 1)); } else { msg = mActivity.getString(R.string.export_error); } mActivity.completed(msg); } abstract public String performExport(final String inputFile, final String outputFile); } protected static final class Update { public final String message; public final int progress; public final int max; public Update(String message, int progress) { this(message, progress, 100); } public Update(int progress, int max) { this(null, progress, max); } public Update(int progress) { this(null, progress, 0); } private Update(String message, int progress, int max) { this.message = message; this.progress = progress; this.max = max; } } }