package com.evancharlton.mileage; import com.evancharlton.mileage.io.CsvExportActivity; import com.evancharlton.mileage.io.DbExportActivity; import com.evancharlton.mileage.provider.Settings; import android.app.Activity; import android.content.Intent; import android.os.AsyncTask; import android.os.Bundle; import android.util.Log; import android.view.View; import android.widget.AdapterView; import android.widget.Button; import android.widget.EditText; import android.widget.Spinner; import android.widget.TextView; import java.io.File; public class ExportActivity extends Activity { public static final String FILENAME = "filename"; private static final String[] FILE_TYPES = new String[] { ".db", ".csv" }; @SuppressWarnings("rawtypes") private static final Class[] EXPORTERS = new Class[] { DbExportActivity.class, CsvExportActivity.class }; private Spinner mFileTypes; private EditText mFilename; private Button mSubmitButton; private TextView mFileExt; private FilenameTask mFilenameTask; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.export_form); mFileTypes = (Spinner) findViewById(R.id.exporter); mFilename = (EditText) findViewById(R.id.output_file); mFileExt = (TextView) findViewById(R.id.file_extension); mSubmitButton = (Button) findViewById(R.id.submit); mSubmitButton.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { Intent intent = new Intent(ExportActivity.this, EXPORTERS[mFileTypes .getSelectedItemPosition()]); intent.putExtra(ExportActivity.FILENAME, getFilename()); startActivity(intent); finish(); } }); mFileTypes.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() { @Override public void onItemSelected(AdapterView<?> arg0, View arg1, int arg2, long arg3) { mFileExt.setText(getExtension()); startFilenameTask(true); } @Override public void onNothingSelected(AdapterView<?> arg0) { } }); mFilenameTask = (FilenameTask) getLastNonConfigurationInstance(); startFilenameTask(false); } private void startFilenameTask(boolean cancel) { if (cancel && mFilenameTask != null) { mFilenameTask.cancel(true); mFilenameTask = null; } if (mFilenameTask == null) { mFilenameTask = new FilenameTask(); } mFilenameTask.attach(this); if (mFilenameTask.getStatus() == AsyncTask.Status.PENDING) { mFilenameTask.execute(); } } @Override public Object onRetainNonConfigurationInstance() { return mFilenameTask; } private final String getExtension() { return FILE_TYPES[mFileTypes.getSelectedItemPosition()]; } private String getFilename() { return mFilename.getText() + getExtension(); } protected static final class FilenameTask extends AsyncTask<Void, Void, String> { private static final String TAG = "FilenameTask"; private static final String BASE_NAME = "mileage-export"; private ExportActivity mActivity; public void attach(ExportActivity activity) { mActivity = activity; } @Override protected String doInBackground(Void... args) { // Make sure that we have somewhere to put the file File destDir = new File(Settings.EXTERNAL_DIR); if (!destDir.exists()) { Log.d(TAG, "Creating export destination"); destDir.mkdirs(); } int i = 0; while (true) { if (isCancelled()) { return null; } String abs = getAbsoluteFilename(i); if (new File(abs).exists() == false) { return getBasename(i); } i++; } } private String getAbsoluteFilename(int i) { return Settings.EXTERNAL_DIR + getBasename(i) + mActivity.getExtension(); } private String getBasename(int i) { return BASE_NAME + (i > 0 ? "." + i : ""); } @Override protected void onPostExecute(String filename) { if (filename == null) { return; } mActivity.mFilename.setText(filename); } } }