diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/us/minak/SettingsActivity.java | 515 | ||||
-rw-r--r-- | src/us/minak/SettingsCreateGestureActivity.java | 192 |
2 files changed, 364 insertions, 343 deletions
diff --git a/src/us/minak/SettingsActivity.java b/src/us/minak/SettingsActivity.java index c052e6c..a3dea5c 100644 --- a/src/us/minak/SettingsActivity.java +++ b/src/us/minak/SettingsActivity.java @@ -44,253 +44,270 @@ import java.util.HashMap; import java.util.Comparator; public class SettingsActivity extends ListActivity { - private static final int STATUS_SUCCESS = 0; - private static final int STATUS_CANCELLED = 1; - private static final int STATUS_NO_STORAGE = 2; - private static final int STATUS_NOT_LOADED = 3; - - private static final int MENU_ID_REMOVE = 1; - - private static final int REQUEST_NEW_GESTURE = 1; - - private final Comparator<NamedGesture> mSorter = new Comparator<NamedGesture>() { - public int compare(NamedGesture object1, NamedGesture object2) { - return object1.name.compareTo(object2.name); - } - }; - - private GesturesAdapter mAdapter; - private GesturesLoadTask mTask; - private TextView mEmptyMessageView; - - // Hacky constructor to get 'this' out of scope /////////////////////////// - - private SettingsActivity mThis; - public SettingsActivity() { - super(); - mThis = this; - } - - /////////////////////////////////////////////////////////////////////////// - - private void loadGestures() { - if (mTask != null && mTask.getStatus() != GesturesLoadTask.Status.FINISHED) { - mTask.cancel(true); - } - mTask = (GesturesLoadTask) new GesturesLoadTask().execute(); - } - - private void checkForEmpty() { - if (mAdapter.getCount() == 0) { - mEmptyMessageView.setText(R.string.gestures_empty); - } - } - - // Basic life-cycle /////////////////////////////////////////////////////// - - @Override - protected void onCreate(Bundle savedInstanceState) { - super.onCreate(savedInstanceState); - setContentView(R.layout.gestures_list); - setListAdapter(mAdapter = new GesturesAdapter(this)); - - mEmptyMessageView = (TextView) findViewById(android.R.id.empty); - loadGestures(); - - registerForContextMenu(getListView()); - } - - @Override - protected void onDestroy() { - super.onDestroy(); - - if (mTask != null && mTask.getStatus() != GesturesLoadTask.Status.FINISHED) { - mTask.cancel(true); - mTask = null; - } - } - - // The buttons at the bottom ////////////////////////////////////////////// - - /** Called by onClick */ - public void reloadGestures(View v) { - loadGestures(); - } - - /** Called by onClick */ - public void addGesture(View v) { - Intent intent = new Intent(this, SettingsCreateGestureActivity.class); - startActivityForResult(intent, REQUEST_NEW_GESTURE); - } - - @Override - protected void onActivityResult(int requestCode, int resultCode, Intent data) { - super.onActivityResult(requestCode, resultCode, data); - - if (resultCode == RESULT_OK) { - switch (requestCode) { - case REQUEST_NEW_GESTURE: - loadGestures(); - break; - } - } - } - - // Context menu /////////////////////////////////////////////////////////// - - @Override - public void onCreateContextMenu(ContextMenu menu, View v, ContextMenu.ContextMenuInfo menuInfo) { - super.onCreateContextMenu(menu, v, menuInfo); - - AdapterView.AdapterContextMenuInfo info = (AdapterView.AdapterContextMenuInfo) menuInfo; - - menu.setHeaderTitle(((TextView) info.targetView).getText()); - menu.add(0, MENU_ID_REMOVE, 0, R.string.gestures_delete); - } - - @Override - public boolean onContextItemSelected(MenuItem item) { - final AdapterView.AdapterContextMenuInfo menuInfo = (AdapterView.AdapterContextMenuInfo) - item.getMenuInfo(); - final NamedGesture gesture = (NamedGesture) menuInfo.targetView.getTag(); - - switch (item.getItemId()) { - case MENU_ID_REMOVE: - SettingsUtil.getGestureLibrary(this).removeGesture(gesture.name, gesture.gesture); - SettingsUtil.getGestureLibrary(this).save(); - - mAdapter.setNotifyOnChange(false); - mAdapter.remove(gesture); - mAdapter.sort(mSorter); - checkForEmpty(); - mAdapter.notifyDataSetChanged(); - - Toast.makeText(this, R.string.gestures_delete_success, Toast.LENGTH_SHORT).show(); - return true; - } - - return super.onContextItemSelected(item); - } - - /////////////////////////////////////////////////////////////////////////// - - private class GesturesLoadTask extends AsyncTask<Void, NamedGesture, Integer> { - private int mThumbnailSize; - private int mThumbnailInset; - private int mPathColor; - - @Override - protected void onPreExecute() { - super.onPreExecute(); - - final Resources resources = getResources(); - mPathColor = resources.getColor(R.color.gesture_color); - mThumbnailInset = (int) resources.getDimension(R.dimen.gesture_thumbnail_inset); - mThumbnailSize = (int) resources.getDimension(R.dimen.gesture_thumbnail_size); - - findViewById(R.id.addButton).setEnabled(false); - findViewById(R.id.reloadButton).setEnabled(false); - - mAdapter.setNotifyOnChange(false); - mAdapter.clear(); - } - - @Override - protected Integer doInBackground(Void... params) { - if (isCancelled()) return STATUS_CANCELLED; - if (!Environment.MEDIA_MOUNTED.equals(Environment.getExternalStorageState())) { - return STATUS_NO_STORAGE; - } - - final GestureLibrary store = SettingsUtil.getGestureLibrary(mThis); - - if (store.load()) { - for (String name : store.getGestureEntries()) { - if (isCancelled()) break; - - for (Gesture gesture : store.getGestures(name)) { - final Bitmap bitmap = gesture.toBitmap(mThumbnailSize, mThumbnailSize, - mThumbnailInset, mPathColor); - final NamedGesture namedGesture = new NamedGesture(); - namedGesture.gesture = gesture; - namedGesture.name = name; - - mAdapter.addBitmap(namedGesture.gesture.getID(), bitmap); - publishProgress(namedGesture); - } - } - - return STATUS_SUCCESS; - } - - return STATUS_NOT_LOADED; - } - - @Override - protected void onProgressUpdate(NamedGesture... values) { - super.onProgressUpdate(values); - - final GesturesAdapter adapter = mAdapter; - adapter.setNotifyOnChange(false); - - for (NamedGesture gesture : values) { - adapter.add(gesture); - } - - adapter.sort(mSorter); - adapter.notifyDataSetChanged(); - } - - @Override - protected void onPostExecute(Integer result) { - super.onPostExecute(result); - - if (result == STATUS_NO_STORAGE) { - getListView().setVisibility(View.GONE); - mEmptyMessageView.setVisibility(View.VISIBLE); - mEmptyMessageView.setText(getString(R.string.gestures_error_loading, SettingsUtil.getGestureFile(mThis).getAbsolutePath())); - } else { - findViewById(R.id.addButton).setEnabled(true); - findViewById(R.id.reloadButton).setEnabled(true); - checkForEmpty(); - } - } - } - - static class NamedGesture { - String name; - Gesture gesture; - } - - private class GesturesAdapter extends ArrayAdapter<NamedGesture> { - private final LayoutInflater mInflater; - private final Map<Long, Drawable> mThumbnails = Collections.synchronizedMap( - new HashMap<Long, Drawable>()); - - public GesturesAdapter(Context context) { - super(context, 0); - mInflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); - } - - void addBitmap(Long id, Bitmap bitmap) { - mThumbnails.put(id, new BitmapDrawable(getResources(), bitmap)); - } - - @Override - public View getView(int position, View convertView, ViewGroup parent) { - if (convertView == null) { - convertView = mInflater.inflate(R.layout.gestures_item, parent, false); - } - - final NamedGesture gesture = getItem(position); - final TextView label = (TextView) convertView; - - label.setTag(gesture); - label.setText(gesture.name); - label.setCompoundDrawablesWithIntrinsicBounds(mThumbnails.get(gesture.gesture.getID()), - null, null, null); - - return convertView; - } - } + private static final int STATUS_SUCCESS = 0; + private static final int STATUS_CANCELLED = 1; + private static final int STATUS_NO_STORAGE = 2; + private static final int STATUS_NOT_LOADED = 3; + + private static final int MENU_ID_REMOVE = 1; + + private static final int REQUEST_NEW_GESTURE = 1; + + private final Comparator<NamedGesture> mSorter = new Comparator<NamedGesture>() { + public int compare(NamedGesture object1, NamedGesture object2) { + return object1.name.compareTo(object2.name); + } + }; + + private GesturesAdapter mAdapter; + private GesturesLoadTask mTask; + private TextView mEmptyMessageView; + + // Hacky constructor to get 'this' out of scope /////////////////////////// + + private SettingsActivity mThis; + + public SettingsActivity() { + super(); + mThis = this; + } + + // ///////////////////////////////////////////////////////////////////////// + + private void loadGestures() { + if (mTask != null + && mTask.getStatus() != GesturesLoadTask.Status.FINISHED) { + mTask.cancel(true); + } + mTask = (GesturesLoadTask) new GesturesLoadTask().execute(); + } + + private void checkForEmpty() { + if (mAdapter.getCount() == 0) { + mEmptyMessageView.setText(R.string.gestures_empty); + } + } + + // Basic life-cycle /////////////////////////////////////////////////////// + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.gestures_list); + setListAdapter(mAdapter = new GesturesAdapter(this)); + + mEmptyMessageView = (TextView) findViewById(android.R.id.empty); + loadGestures(); + + registerForContextMenu(getListView()); + } + + @Override + protected void onDestroy() { + super.onDestroy(); + + if (mTask != null + && mTask.getStatus() != GesturesLoadTask.Status.FINISHED) { + mTask.cancel(true); + mTask = null; + } + } + + // The buttons at the bottom ////////////////////////////////////////////// + + /** Called by onClick */ + public void reloadGestures(View v) { + loadGestures(); + } + + /** Called by onClick */ + public void addGesture(View v) { + Intent intent = new Intent(this, SettingsCreateGestureActivity.class); + startActivityForResult(intent, REQUEST_NEW_GESTURE); + } + + @Override + protected void onActivityResult(int requestCode, int resultCode, Intent data) { + super.onActivityResult(requestCode, resultCode, data); + + if (resultCode == RESULT_OK) { + switch (requestCode) { + case REQUEST_NEW_GESTURE: + loadGestures(); + break; + } + } + } + + // Context menu /////////////////////////////////////////////////////////// + + @Override + public void onCreateContextMenu(ContextMenu menu, View v, + ContextMenu.ContextMenuInfo menuInfo) { + super.onCreateContextMenu(menu, v, menuInfo); + + AdapterView.AdapterContextMenuInfo info = (AdapterView.AdapterContextMenuInfo) menuInfo; + + menu.setHeaderTitle(((TextView) info.targetView).getText()); + menu.add(0, MENU_ID_REMOVE, 0, R.string.gestures_delete); + } + + @Override + public boolean onContextItemSelected(MenuItem item) { + final AdapterView.AdapterContextMenuInfo menuInfo = (AdapterView.AdapterContextMenuInfo) item + .getMenuInfo(); + final NamedGesture gesture = (NamedGesture) menuInfo.targetView + .getTag(); + + switch (item.getItemId()) { + case MENU_ID_REMOVE: + SettingsUtil.getGestureLibrary(this).removeGesture(gesture.name, + gesture.gesture); + SettingsUtil.getGestureLibrary(this).save(); + + mAdapter.setNotifyOnChange(false); + mAdapter.remove(gesture); + mAdapter.sort(mSorter); + checkForEmpty(); + mAdapter.notifyDataSetChanged(); + + Toast.makeText(this, R.string.gestures_delete_success, + Toast.LENGTH_SHORT).show(); + return true; + } + + return super.onContextItemSelected(item); + } + + // ///////////////////////////////////////////////////////////////////////// + + private class GesturesLoadTask extends + AsyncTask<Void, NamedGesture, Integer> { + private int mThumbnailSize; + private int mThumbnailInset; + private int mPathColor; + + @Override + protected void onPreExecute() { + super.onPreExecute(); + + final Resources resources = getResources(); + mPathColor = resources.getColor(R.color.gesture_color); + mThumbnailInset = (int) resources + .getDimension(R.dimen.gesture_thumbnail_inset); + mThumbnailSize = (int) resources + .getDimension(R.dimen.gesture_thumbnail_size); + + findViewById(R.id.addButton).setEnabled(false); + findViewById(R.id.reloadButton).setEnabled(false); + + mAdapter.setNotifyOnChange(false); + mAdapter.clear(); + } + + @Override + protected Integer doInBackground(Void... params) { + if (isCancelled()) + return STATUS_CANCELLED; + if (!Environment.MEDIA_MOUNTED.equals(Environment + .getExternalStorageState())) { + return STATUS_NO_STORAGE; + } + + final GestureLibrary store = SettingsUtil.getGestureLibrary(mThis); + + if (store.load()) { + for (String name : store.getGestureEntries()) { + if (isCancelled()) + break; + + for (Gesture gesture : store.getGestures(name)) { + final Bitmap bitmap = gesture.toBitmap(mThumbnailSize, + mThumbnailSize, mThumbnailInset, mPathColor); + final NamedGesture namedGesture = new NamedGesture(); + namedGesture.gesture = gesture; + namedGesture.name = name; + + mAdapter.addBitmap(namedGesture.gesture.getID(), bitmap); + publishProgress(namedGesture); + } + } + + return STATUS_SUCCESS; + } + + return STATUS_NOT_LOADED; + } + + @Override + protected void onProgressUpdate(NamedGesture... values) { + super.onProgressUpdate(values); + + final GesturesAdapter adapter = mAdapter; + adapter.setNotifyOnChange(false); + + for (NamedGesture gesture : values) { + adapter.add(gesture); + } + + adapter.sort(mSorter); + adapter.notifyDataSetChanged(); + } + + @Override + protected void onPostExecute(Integer result) { + super.onPostExecute(result); + + if (result == STATUS_NO_STORAGE) { + getListView().setVisibility(View.GONE); + mEmptyMessageView.setVisibility(View.VISIBLE); + mEmptyMessageView.setText(getString( + R.string.gestures_error_loading, SettingsUtil + .getGestureFile(mThis).getAbsolutePath())); + } else { + findViewById(R.id.addButton).setEnabled(true); + findViewById(R.id.reloadButton).setEnabled(true); + checkForEmpty(); + } + } + } + + static class NamedGesture { + String name; + Gesture gesture; + } + + private class GesturesAdapter extends ArrayAdapter<NamedGesture> { + private final LayoutInflater mInflater; + private final Map<Long, Drawable> mThumbnails = Collections + .synchronizedMap(new HashMap<Long, Drawable>()); + + public GesturesAdapter(Context context) { + super(context, 0); + mInflater = (LayoutInflater) context + .getSystemService(Context.LAYOUT_INFLATER_SERVICE); + } + + void addBitmap(Long id, Bitmap bitmap) { + mThumbnails.put(id, new BitmapDrawable(getResources(), bitmap)); + } + + @Override + public View getView(int position, View convertView, ViewGroup parent) { + if (convertView == null) { + convertView = mInflater.inflate(R.layout.gestures_item, parent, + false); + } + + final NamedGesture gesture = getItem(position); + final TextView label = (TextView) convertView; + + label.setTag(gesture); + label.setText(gesture.name); + label.setCompoundDrawablesWithIntrinsicBounds( + mThumbnails.get(gesture.gesture.getID()), null, null, null); + + return convertView; + } + } } diff --git a/src/us/minak/SettingsCreateGestureActivity.java b/src/us/minak/SettingsCreateGestureActivity.java index 64975e0..2e450d0 100644 --- a/src/us/minak/SettingsCreateGestureActivity.java +++ b/src/us/minak/SettingsCreateGestureActivity.java @@ -27,98 +27,102 @@ import android.widget.TextView; import android.widget.Toast; public class SettingsCreateGestureActivity extends Activity { - private static final float LENGTH_THRESHOLD = 120.0f; - - private Gesture mGesture; - private View mDoneButton; - - @Override - protected void onCreate(Bundle savedInstanceState) { - super.onCreate(savedInstanceState); - - setContentView(R.layout.gesture_create); - - mDoneButton = findViewById(R.id.done); - - GestureOverlayView overlay = (GestureOverlayView) findViewById(R.id.gestures_overlay); - overlay.addOnGestureListener(new GesturesProcessor()); - } - - @Override - protected void onSaveInstanceState(Bundle outState) { - super.onSaveInstanceState(outState); - - if (mGesture != null) { - outState.putParcelable("gesture", mGesture); - } - } - - @Override - protected void onRestoreInstanceState(Bundle savedInstanceState) { - super.onRestoreInstanceState(savedInstanceState); - - mGesture = savedInstanceState.getParcelable("gesture"); - if (mGesture != null) { - final GestureOverlayView overlay = - (GestureOverlayView) findViewById(R.id.gestures_overlay); - overlay.post(new Runnable() { - public void run() { - overlay.setGesture(mGesture); - } - }); - - mDoneButton.setEnabled(true); - } - } - - public void addGesture(View v) { - if (mGesture != null) { - final TextView input = (TextView) findViewById(R.id.gesture_name); - final CharSequence name = input.getText(); - if (name.length() == 0) { - input.setError(getString(R.string.error_missing_name)); - return; - } - - final GestureLibrary store = SettingsUtil.getGestureLibrary(this); - store.addGesture(name.toString(), mGesture); - store.save(); - - setResult(RESULT_OK); - - final String path = SettingsUtil.getGestureFile(this).getAbsolutePath(); - Toast.makeText(this, getString(R.string.save_success, path), Toast.LENGTH_LONG).show(); - } else { - setResult(RESULT_CANCELED); - } - - finish(); - - } - - public void cancelGesture(View v) { - setResult(RESULT_CANCELED); - finish(); - } - - private class GesturesProcessor implements GestureOverlayView.OnGestureListener { - public void onGestureStarted(GestureOverlayView overlay, MotionEvent event) { - mDoneButton.setEnabled(false); - mGesture = null; - } - - public void onGesture(GestureOverlayView overlay, MotionEvent event) { - } - - public void onGestureEnded(GestureOverlayView overlay, MotionEvent event) { - mGesture = overlay.getGesture(); - if (mGesture.getLength() < LENGTH_THRESHOLD) { - overlay.clear(false); - } - mDoneButton.setEnabled(true); - } - - public void onGestureCancelled(GestureOverlayView overlay, MotionEvent event) { - } - } + private static final float LENGTH_THRESHOLD = 120.0f; + + private Gesture mGesture; + private View mDoneButton; + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + + setContentView(R.layout.gesture_create); + + mDoneButton = findViewById(R.id.done); + + GestureOverlayView overlay = (GestureOverlayView) findViewById(R.id.gestures_overlay); + overlay.addOnGestureListener(new GesturesProcessor()); + } + + @Override + protected void onSaveInstanceState(Bundle outState) { + super.onSaveInstanceState(outState); + + if (mGesture != null) { + outState.putParcelable("gesture", mGesture); + } + } + + @Override + protected void onRestoreInstanceState(Bundle savedInstanceState) { + super.onRestoreInstanceState(savedInstanceState); + + mGesture = savedInstanceState.getParcelable("gesture"); + if (mGesture != null) { + final GestureOverlayView overlay = (GestureOverlayView) findViewById(R.id.gestures_overlay); + overlay.post(new Runnable() { + public void run() { + overlay.setGesture(mGesture); + } + }); + + mDoneButton.setEnabled(true); + } + } + + public void addGesture(View v) { + if (mGesture != null) { + final TextView input = (TextView) findViewById(R.id.gesture_name); + final CharSequence name = input.getText(); + if (name.length() == 0) { + input.setError(getString(R.string.error_missing_name)); + return; + } + + final GestureLibrary store = SettingsUtil.getGestureLibrary(this); + store.addGesture(name.toString(), mGesture); + store.save(); + + setResult(RESULT_OK); + + final String path = SettingsUtil.getGestureFile(this) + .getAbsolutePath(); + Toast.makeText(this, getString(R.string.save_success, path), + Toast.LENGTH_LONG).show(); + } else { + setResult(RESULT_CANCELED); + } + + finish(); + + } + + public void cancelGesture(View v) { + setResult(RESULT_CANCELED); + finish(); + } + + private class GesturesProcessor implements + GestureOverlayView.OnGestureListener { + public void onGestureStarted(GestureOverlayView overlay, + MotionEvent event) { + mDoneButton.setEnabled(false); + mGesture = null; + } + + public void onGesture(GestureOverlayView overlay, MotionEvent event) { + } + + public void onGestureEnded(GestureOverlayView overlay, MotionEvent event) { + mGesture = overlay.getGesture(); + if (mGesture.getLength() < LENGTH_THRESHOLD) { + overlay.clear(false); + } + mDoneButton.setEnabled(true); + } + + public void onGestureCancelled(GestureOverlayView overlay, + MotionEvent event) { + } + } } |