package com.evancharlton.mileage; import com.evancharlton.mileage.io.CsvColumnMappingActivity; import com.evancharlton.mileage.io.DbImportActivity; import com.evancharlton.mileage.provider.Settings; import com.evancharlton.mileage.util.Debugger; import android.app.Activity; import android.app.AlertDialog; import android.app.Dialog; import android.content.Context; import android.content.DialogInterface; import android.content.Intent; import android.os.AsyncTask; import android.os.Bundle; import android.util.Log; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.AdapterView; import android.widget.BaseAdapter; import android.widget.Button; import android.widget.CheckBox; import android.widget.CheckedTextView; import android.widget.Spinner; import android.widget.SpinnerAdapter; import android.widget.TextView; import java.io.File; import java.io.FilenameFilter; public class ImportActivity extends Activity { private static final String TAG = "ImportActivity"; public static final String FILENAME = "filename"; public static final String WIPE_DATA = "wipe data"; private static final int DIALOG_NO_FILES = 1; private static final String[] FILE_TYPES = new String[] { ".db", ".csv" }; private static final Class<?>[] IMPORTERS = new Class[] { DbImportActivity.class, CsvColumnMappingActivity.class }; private FileLoader mFileLoader; private Spinner mFileTypes; private Spinner mInputFile; private Button mSubmitButton; private FileAdapter mFileAdapter; private CheckBox mWipeData; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.import_form); mFileAdapter = new FileAdapter(this); mFileTypes = (Spinner) findViewById(R.id.importer); mInputFile = (Spinner) findViewById(R.id.files); mWipeData = (CheckBox) findViewById(R.id.erase_database); mSubmitButton = (Button) findViewById(R.id.submit); mSubmitButton.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { Intent intent = new Intent(ImportActivity.this, IMPORTERS[mFileTypes .getSelectedItemPosition()]); intent.putExtra(ImportActivity.FILENAME, getFilename()); intent.putExtra(ImportActivity.WIPE_DATA, mWipeData.isChecked()); startActivity(intent); finish(); } }); mInputFile.setAdapter(mFileAdapter); mFileLoader = (FileLoader) getLastNonConfigurationInstance(); mFileTypes.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() { @Override public void onItemSelected(AdapterView<?> arg0, View arg1, int position, long arg3) { if (mFileLoader == null) { mFileLoader = new FileLoader(); } mFileLoader.attach(ImportActivity.this); if (mFileLoader.getStatus() == AsyncTask.Status.PENDING) { mFileLoader.execute(); } mWipeData.setChecked(position == 0); mWipeData.setEnabled(position != 0); } @Override public void onNothingSelected(AdapterView<?> arg0) { } }); } @Override protected Dialog onCreateDialog(final int id) { switch (id) { case DIALOG_NO_FILES: return new AlertDialog.Builder(this) .setTitle(R.string.dialog_title_missing_files) .setMessage(R.string.dialog_message_missing_files) .setPositiveButton(android.R.string.ok, new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { removeDialog(id); } }).create(); default: return super.onCreateDialog(id); } } private FilenameFilter getFilter() { return new FilenameFilter() { @Override public boolean accept(File dir, String filename) { final String extension = FILE_TYPES[mFileTypes.getSelectedItemPosition()]; return filename.toLowerCase().endsWith(extension); } }; } private void setFiles(String[] filenames) { mFileAdapter.setData(filenames); mFileLoader = null; mSubmitButton.setEnabled(!mFileAdapter.isEmpty()); if (filenames.length == 0) { showDialog(DIALOG_NO_FILES); } } private String getFilename() { return mFileAdapter.getItem(mInputFile.getSelectedItemPosition()).toString(); } private static class FileLoader extends AsyncTask<Void, Void, String[]> { private ImportActivity mActivity; public void attach(ImportActivity activity) { mActivity = activity; } @Override protected String[] doInBackground(Void... voids) { return new File(Settings.EXTERNAL_DIR).list(mActivity.getFilter()); } @Override protected void onPostExecute(String[] files) { if (files == null) { Log.d(TAG, "No files found!"); files = new String[0]; } mActivity.setFiles(files); } } private static class FileAdapter extends BaseAdapter implements SpinnerAdapter { private final LayoutInflater mInflater; private String[] values = new String[0]; public FileAdapter(Context context) { mInflater = LayoutInflater.from(context); } @Override public int getCount() { return values.length; } @Override public Object getItem(int position) { return values[position]; } @Override public long getItemId(int position) { return values[position].hashCode(); } @Override public View getView(int position, View convertView, ViewGroup parent) { if (convertView == null) { convertView = mInflater.inflate(android.R.layout.simple_spinner_item, parent, false); } TextView tv = (TextView) convertView.getTag(); if (tv == null) { tv = (TextView) convertView.findViewById(android.R.id.text1); convertView.setTag(tv); } tv.setText(values[position]); return convertView; } @Override public View getDropDownView(int position, View convertView, ViewGroup parent) { if (convertView == null) { convertView = mInflater.inflate(android.R.layout.simple_spinner_dropdown_item, parent, false); } CheckedTextView ctv = (CheckedTextView) convertView.getTag(); if (ctv == null) { ctv = (CheckedTextView) convertView.findViewById(android.R.id.text1); convertView.setTag(ctv); } ctv.setText(values[position]); return convertView; } public void setData(String[] data) { Debugger.ensureOnUiThread(mInflater.getContext(), "Altering data off UI thread!"); values = data; notifyDataSetChanged(); } } }