diff options
author | Romain Guy <romainguy@android.com> | 2009-07-16 13:21:01 -0700 |
---|---|---|
committer | Romain Guy <romainguy@android.com> | 2009-07-16 16:06:48 -0700 |
commit | 1dd3a077a293bf3ac4e61e91dcc3dfc99487acd4 (patch) | |
tree | c9d861aa9f735392b25d402987acb312bc50b6c4 /src/com | |
parent | 68634c1c320bba0d9a49c2ad6ed78e244e89a57b (diff) | |
download | packages_apps_trebuchet-1dd3a077a293bf3ac4e61e91dcc3dfc99487acd4.tar.gz packages_apps_trebuchet-1dd3a077a293bf3ac4e61e91dcc3dfc99487acd4.tar.bz2 packages_apps_trebuchet-1dd3a077a293bf3ac4e61e91dcc3dfc99487acd4.zip |
New gestures UI.
Diffstat (limited to 'src/com')
-rw-r--r-- | src/com/android/launcher/GesturesActivity.java | 148 | ||||
-rw-r--r-- | src/com/android/launcher/GesturesPanel.java | 25 | ||||
-rw-r--r-- | src/com/android/launcher/Launcher.java | 143 |
3 files changed, 237 insertions, 79 deletions
diff --git a/src/com/android/launcher/GesturesActivity.java b/src/com/android/launcher/GesturesActivity.java index 844392dc..24775ffe 100644 --- a/src/com/android/launcher/GesturesActivity.java +++ b/src/com/android/launcher/GesturesActivity.java @@ -26,8 +26,11 @@ import android.widget.TextView; import android.widget.AdapterView; import android.widget.Toast; import android.widget.EditText; +import android.widget.BaseAdapter; +import android.widget.CheckBox; import android.content.Context; import android.content.DialogInterface; +import android.content.SharedPreferences; import android.content.res.Resources; import android.view.View; import android.view.ViewGroup; @@ -40,18 +43,22 @@ import android.graphics.Bitmap; import android.graphics.drawable.Drawable; import android.graphics.drawable.BitmapDrawable; import android.text.TextUtils; +import android.database.DataSetObserver; import java.util.Comparator; import java.util.HashMap; import java.util.Collections; import java.util.Map; -public class GesturesActivity extends ListActivity { +public class GesturesActivity extends ListActivity implements AdapterView.OnItemClickListener { private static final int MENU_ID_RENAME = 1; private static final int MENU_ID_REMOVE = 2; private static final int DIALOG_RENAME_GESTURE = 1; + static final String PREFERENCES_NAME = "gestures"; + static final String PREFERENCES_HOME_KEY = "gestures.home"; + // Type: long (id) private static final String GESTURES_INFO_ID = "gestures.info_id"; @@ -66,6 +73,7 @@ public class GesturesActivity extends ListActivity { private Dialog mRenameDialog; private EditText mInput; private ApplicationInfo mCurrentRenameInfo; + private SharedPreferences mPreferences; @Override protected void onCreate(Bundle savedInstanceState) { @@ -74,13 +82,16 @@ public class GesturesActivity extends ListActivity { setContentView(R.layout.gestures_settings); mAdapter = new GesturesAdapter(this); - setListAdapter(mAdapter); + setListAdapter(new GesturesSettingsAdapter(mAdapter)); + getListView().setOnItemClickListener(this); mStore = Launcher.getGestureLibrary(); mEmpty = (TextView) findViewById(android.R.id.empty); mTask = (GesturesLoadTask) new GesturesLoadTask().execute(); registerForContextMenu(getListView()); + + mPreferences = getSharedPreferences(PREFERENCES_NAME, MODE_PRIVATE); } @Override @@ -127,10 +138,12 @@ public class GesturesActivity extends ListActivity { super.onCreateContextMenu(menu, v, menuInfo); AdapterView.AdapterContextMenuInfo info = (AdapterView.AdapterContextMenuInfo) menuInfo; - menu.setHeaderTitle(((TextView) info.targetView).getText()); + if (info.position > 2) { + menu.setHeaderTitle(((TextView) info.targetView).getText()); - menu.add(0, MENU_ID_RENAME, 0, R.string.gestures_rename); - menu.add(0, MENU_ID_REMOVE, 0, R.string.gestures_delete); + menu.add(0, MENU_ID_RENAME, 0, R.string.gestures_rename); + menu.add(0, MENU_ID_REMOVE, 0, R.string.gestures_delete); + } } @Override @@ -252,6 +265,14 @@ public class GesturesActivity extends ListActivity { Toast.makeText(this, R.string.gestures_delete_success, Toast.LENGTH_SHORT).show(); } + public void onItemClick(AdapterView<?> parent, View view, int position, long id) { + if (position == 1) { + final CheckBox checkBox = (CheckBox) view.findViewById(R.id.checkbox); + checkBox.toggle(); + mPreferences.edit().putBoolean(PREFERENCES_HOME_KEY, checkBox.isChecked()).commit(); + } + } + private class GesturesLoadTask extends AsyncTask<Void, ApplicationInfo, Boolean> { private int mThumbnailSize; private int mThumbnailInset; @@ -346,4 +367,121 @@ public class GesturesActivity extends ListActivity { return convertView; } } + + private class GesturesSettingsAdapter extends BaseAdapter { + private static final int FIXED_CHILDREN_COUNT = 3; + + private static final int VIEW_TYPE_SEPARATOR = 0; + private static final int VIEW_TYPE_CHECKBOX = 1; + + private final GesturesAdapter mAdapter; + private final LayoutInflater mInflater; + + public GesturesSettingsAdapter(GesturesAdapter adapter) { + mAdapter = adapter; + mInflater = adapter.mInflater; + adapter.registerDataSetObserver(new DataSetObserver() { + @Override + public void onChanged() { + notifyDataSetChanged(); + } + + @Override + public void onInvalidated() { + notifyDataSetInvalidated(); + } + }); + } + + public int getCount() { + return FIXED_CHILDREN_COUNT + mAdapter.getCount(); + } + + public Object getItem(int position) { + if (position < FIXED_CHILDREN_COUNT) { + return String.valueOf(position); + } + return mAdapter.getItem(position - FIXED_CHILDREN_COUNT); + } + + public long getItemId(int position) { + return position; + } + + @Override + public int getItemViewType(int position) { + if (position < FIXED_CHILDREN_COUNT) { + switch (position) { + case 0: + case 2: + return VIEW_TYPE_SEPARATOR; + case 1: + return VIEW_TYPE_CHECKBOX; + } + } + return 2 + super.getItemViewType(position); + } + + @Override + public int getViewTypeCount() { + return 2 + mAdapter.getViewTypeCount(); + } + + @Override + public boolean areAllItemsEnabled() { + return false; + } + + @Override + public boolean isEnabled(int position) { + return position != 0 && position != 2; + } + + public View getView(int position, View convertView, ViewGroup parent) { + if (position < FIXED_CHILDREN_COUNT) { + // NOTE: Don't bother with ViewHolders here, we only have 3 items and + // the list is likely to not be very long + switch (position) { + case 0: + convertView = createHeader(convertView, parent, + R.string.gestures_group_settings); + break; + case 1: + convertView = createSetting(convertView, parent, + R.string.gestures_preference_hotkey_title, + R.string.gestures_preference_hotkey_summary); + break; + case 2: + convertView = createHeader(convertView, parent, + R.string.gestures_group_gestures); + break; + } + return convertView; + } + return mAdapter.getView(position - FIXED_CHILDREN_COUNT, convertView, parent); + } + + private View createSetting(View convertView, ViewGroup parent, + int title, int summary) { + + if (convertView == null) { + convertView = mInflater.inflate(R.layout.list_checkbox_2lines, parent, false); + } + + ((TextView) convertView.findViewById(R.id.title)).setText(title); + ((TextView) convertView.findViewById(R.id.summary)).setText(summary); + ((CheckBox) convertView.findViewById(R.id.checkbox)).setChecked( + mPreferences.getBoolean(PREFERENCES_HOME_KEY, false)); + + return convertView; + } + + private View createHeader(View convertView, ViewGroup parent, int text) { + if (convertView == null) { + convertView = mInflater.inflate(R.layout.list_category, parent, false); + } + ((TextView) convertView).setText(text); + return convertView; + } + } } diff --git a/src/com/android/launcher/GesturesPanel.java b/src/com/android/launcher/GesturesPanel.java index 33dc1028..2d8647d9 100644 --- a/src/com/android/launcher/GesturesPanel.java +++ b/src/com/android/launcher/GesturesPanel.java @@ -16,12 +16,12 @@ package com.android.launcher; -import android.widget.RelativeLayout; +import android.widget.LinearLayout; import android.content.Context; import android.util.AttributeSet; import android.view.KeyEvent; -public class GesturesPanel extends RelativeLayout { +public class GesturesPanel extends LinearLayout { public GesturesPanel(Context context) { super(context); } @@ -37,7 +37,26 @@ public class GesturesPanel extends RelativeLayout { @Override public boolean dispatchKeyEvent(KeyEvent event) { - if (event.getKeyCode() == KeyEvent.KEYCODE_BACK && + final int keyCode = event.getKeyCode(); + + switch (keyCode) { + case KeyEvent.KEYCODE_VOLUME_UP: + case KeyEvent.KEYCODE_VOLUME_DOWN: + case KeyEvent.KEYCODE_MEDIA_PLAY_PAUSE: + case KeyEvent.KEYCODE_MUTE: + case KeyEvent.KEYCODE_HEADSETHOOK: + case KeyEvent.KEYCODE_MEDIA_STOP: + case KeyEvent.KEYCODE_MEDIA_NEXT: + case KeyEvent.KEYCODE_MEDIA_PREVIOUS: + case KeyEvent.KEYCODE_MEDIA_REWIND: + case KeyEvent.KEYCODE_MEDIA_FAST_FORWARD: + case KeyEvent.KEYCODE_CAMERA: + case KeyEvent.KEYCODE_CALL: + case KeyEvent.KEYCODE_SEARCH: + return ((Launcher) mContext).getWorkspace().getRootView().dispatchKeyEvent(event); + } + + if (keyCode == KeyEvent.KEYCODE_BACK && event.getAction() == KeyEvent.ACTION_DOWN) { ((Launcher) mContext).hideGesturesPanel(); diff --git a/src/com/android/launcher/Launcher.java b/src/com/android/launcher/Launcher.java index 000ce148..21b69491 100644 --- a/src/com/android/launcher/Launcher.java +++ b/src/com/android/launcher/Launcher.java @@ -32,6 +32,7 @@ import android.content.Context; import android.content.DialogInterface; import android.content.Intent; import android.content.IntentFilter; +import android.content.SharedPreferences; import android.content.Intent.ShortcutIconResource; import android.content.pm.ActivityInfo; import android.content.pm.PackageManager; @@ -79,7 +80,7 @@ import android.widget.TextView; import android.widget.Toast; import android.widget.ImageView; import android.widget.PopupWindow; -import android.widget.ViewSwitcher; +import android.widget.Button; import android.appwidget.AppWidgetManager; import android.appwidget.AppWidgetProviderInfo; import android.gesture.GestureOverlayView; @@ -233,13 +234,14 @@ public final class Launcher extends Activity implements View.OnClickListener, On private View mGesturesPanel; private GestureOverlayView mGesturesOverlay; - private ViewSwitcher mGesturesPrompt; private ImageView mGesturesAdd; private PopupWindow mGesturesWindow; private Launcher.GesturesProcessor mGesturesProcessor; private Gesture mCurrentGesture; private GesturesAction mGesturesAction; private boolean mHideGesturesPanel; + private TextView mGesturesPrompt; + private Button mGesturesSend; @Override protected void onCreate(Bundle savedInstanceState) { @@ -605,7 +607,7 @@ public final class Launcher extends Activity implements View.OnClickListener, On mWorkspace.post(new Runnable() { public void run() { showGesturesPanel(false); - mGesturesProcessor.matchGesture(gesture, false); + mGesturesProcessor.matchGesture(gesture); mWorkspace.post(new Runnable() { public void run() { if (gesture != null) { @@ -667,22 +669,26 @@ public final class Launcher extends Activity implements View.OnClickListener, On mGesturesPanel = mInflater.inflate(R.layout.gestures, mDragLayer, false); final View gesturesPanel = mGesturesPanel; - mGesturesPrompt = (ViewSwitcher) gesturesPanel.findViewById(R.id.gestures_actions); mGesturesAction = new GesturesAction(); - mGesturesPrompt.getChildAt(0).setOnClickListener(mGesturesAction); - mGesturesPrompt.getChildAt(1).setOnClickListener(mGesturesAction); - + mGesturesPrompt = (TextView) gesturesPanel.findViewById(R.id.gestures_prompt); + mGesturesSend = (Button) gesturesPanel.findViewById(R.id.gestures_action); + mGesturesSend.setOnClickListener(mGesturesAction); + mGesturesAdd = (ImageView) gesturesPanel.findViewById(R.id.gestures_add); final ImageView gesturesAdd = mGesturesAdd; - gesturesAdd.setAlpha(128); - gesturesAdd.setEnabled(false); gesturesAdd.setOnClickListener(new View.OnClickListener() { public void onClick(View v) { createGesture(); } }); + gesturesPanel.findViewById(R.id.gestures_list).setOnClickListener(new View.OnClickListener() { + public void onClick(View v) { + startActivity(new Intent(Launcher.this, GesturesActivity.class)); + } + }); + mGesturesOverlay = (GestureOverlayView) gesturesPanel.findViewById(R.id.gestures_overlay); mGesturesProcessor = new GesturesProcessor(); @@ -976,17 +982,34 @@ public final class Launcher extends Activity implements View.OnClickListener, On if ((intent.getFlags() & Intent.FLAG_ACTIVITY_BROUGHT_TO_FRONT) != Intent.FLAG_ACTIVITY_BROUGHT_TO_FRONT) { - if (mGesturesPanel != null && mDragLayer.getWindowVisibility() == View.VISIBLE && - (mDragLayer.hasWindowFocus() || - (mGesturesWindow != null && mGesturesWindow.isShowing()))) { + // TODO: This really should not be done here every time + final SharedPreferences preferences = + getSharedPreferences(GesturesActivity.PREFERENCES_NAME, MODE_PRIVATE); + final boolean homeKey = preferences.getBoolean( + GesturesActivity.PREFERENCES_HOME_KEY, false); - SearchManager searchManager = - (SearchManager) getSystemService(Context.SEARCH_SERVICE); + if (!homeKey) { + if (!mWorkspace.isDefaultScreenShowing()) { + mWorkspace.moveToDefaultScreen(); + } - if (!searchManager.isVisible()) { - onHomeKeyPressed(); + if (mGesturesWindow == null || mGesturesWindow.isShowing()) { + hideGesturesPanel(); + } + } else { + if (mGesturesPanel != null && mDragLayer.getWindowVisibility() == View.VISIBLE + && (mDragLayer.hasWindowFocus() || (mGesturesWindow != null + && mGesturesWindow.isShowing()))) { + + SearchManager searchManager = + (SearchManager) getSystemService(Context.SEARCH_SERVICE); + + if (!searchManager.isVisible()) { + onHomeKeyPressed(); + } } } + closeDrawer(); final View v = getWindow().peekDecorView(); @@ -1016,8 +1039,7 @@ public final class Launcher extends Activity implements View.OnClickListener, On private void showGesturesPanel(boolean animate) { resetGesturesPrompt(); - mGesturesAdd.setEnabled(false); - mGesturesAdd.setAlpha(128); + mGesturesAdd.setVisibility(View.GONE); mGesturesOverlay.clear(false); @@ -1027,12 +1049,13 @@ public final class Launcher extends Activity implements View.OnClickListener, On window = mGesturesWindow; window.setFocusable(true); window.setTouchable(true); - window.setBackgroundDrawable(null); + window.setBackgroundDrawable(getResources().getDrawable( + android.R.drawable.screen_background_dark)); window.setContentView(mGesturesPanel); } else { window = mGesturesWindow; } - window.setAnimationStyle(animate ? com.android.internal.R.style.Animation_SlidingCard : 0); + window.setAnimationStyle(animate ? com.android.internal.R.style.Animation_Toast : 0); final int[] xy = new int[2]; final DragLayer dragLayer = mDragLayer; @@ -1045,31 +1068,23 @@ public final class Launcher extends Activity implements View.OnClickListener, On private void resetGesturesPrompt() { mGesturesAction.intent = null; - final TextView prompt = (TextView) mGesturesPrompt.getCurrentView(); - prompt.setText(R.string.gestures_instructions); - prompt.setCompoundDrawablesWithIntrinsicBounds(null, null, null, null); - prompt.setClickable(false); + mGesturesPrompt.setText(R.string.gestures_instructions); + mGesturesPrompt.setVisibility(View.VISIBLE); + mGesturesSend.setVisibility(View.GONE); } - private void resetGesturesNextPrompt() { + private void setGestureUnknown() { mGesturesAction.intent = null; - setGesturesNextPrompt(null, getString(R.string.gestures_instructions)); - mGesturesPrompt.getNextView().setClickable(false); + mGesturesPrompt.setText(R.string.gestures_unknown); + mGesturesPrompt.setVisibility(View.VISIBLE); + mGesturesSend.setVisibility(View.GONE); } - private void setGesturesNextPrompt(Drawable icon, CharSequence title) { - final TextView prompt = (TextView) mGesturesPrompt.getNextView(); - prompt.setText(title); - prompt.setCompoundDrawablesWithIntrinsicBounds(icon, null, null, null); - prompt.setClickable(true); - mGesturesPrompt.showNext(); - } - - private void setGesturesPrompt(Drawable icon, CharSequence title) { - final TextView prompt = (TextView) mGesturesPrompt.getCurrentView(); - prompt.setText(title); - prompt.setCompoundDrawablesWithIntrinsicBounds(icon, null, null, null); - prompt.setClickable(true); + private void setGestureAction(Drawable icon, CharSequence title) { + mGesturesPrompt.setVisibility(View.GONE); + mGesturesSend.setVisibility(View.VISIBLE); + mGesturesSend.setText(title); + mGesturesSend.setCompoundDrawablesWithIntrinsicBounds(icon, null, null, null); } void hideGesturesPanel() { @@ -1080,7 +1095,7 @@ public final class Launcher extends Activity implements View.OnClickListener, On if (mGesturesWindow != null) { final PopupWindow popupWindow = mGesturesWindow; popupWindow.setAnimationStyle(animate ? - com.android.internal.R.style.Animation_SlidingCard : 0); + com.android.internal.R.style.Animation_Toast : 0); popupWindow.update(); popupWindow.dismiss(); } @@ -1270,10 +1285,10 @@ public final class Launcher extends Activity implements View.OnClickListener, On .setIcon(com.android.internal.R.drawable.ic_menu_notifications) .setAlphabeticShortcut('N'); - final Intent gestures = new Intent(this, GesturesActivity.class); + // TODO: Remove menu.add(0, MENU_GESTURES, 0, R.string.menu_gestures) - .setIcon(com.android.internal.R.drawable.ic_menu_compose).setAlphabeticShortcut('G') - .setIntent(gestures); + .setIcon(com.android.internal.R.drawable.ic_menu_compose) + .setAlphabeticShortcut('G'); final Intent settings = new Intent(android.provider.Settings.ACTION_SETTINGS); settings.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | @@ -1311,6 +1326,9 @@ public final class Launcher extends Activity implements View.OnClickListener, On case MENU_NOTIFICATIONS: showNotifications(); return true; + case MENU_GESTURES: + showGesturesPanel(); + return true; } return super.onOptionsItemSelected(item); @@ -2509,11 +2527,10 @@ public final class Launcher extends Activity implements View.OnClickListener, On //noinspection PointlessBooleanExpression,ConstantConditions if (!CONFIG_GESTURES_IMMEDIATE_MODE) { overlay.removeCallbacks(mMatcher); - resetGesturesNextPrompt(); + resetGesturesPrompt(); } - mGesturesAdd.setAlpha(128); - mGesturesAdd.setEnabled(false); + mGesturesAdd.setVisibility(View.GONE); } public void onGesture(GestureOverlayView overlay, MotionEvent event) { @@ -2529,7 +2546,7 @@ public final class Launcher extends Activity implements View.OnClickListener, On overlay.clear(false); if (mGesturesAction.intent != null) { mGesturesAction.intent = null; - setGesturesNextPrompt(null, getString(R.string.gestures_unknown)); + setGestureAction(null, getString(R.string.gestures_unknown)); } } else { mMatcher.run(); @@ -2542,7 +2559,7 @@ public final class Launcher extends Activity implements View.OnClickListener, On overlay.clear(false); if (mGesturesAction.intent != null) { mGesturesAction.intent = null; - setGesturesNextPrompt(null, getString(R.string.gestures_unknown)); + setGestureAction(null, getString(R.string.gestures_unknown)); } } else { overlay.postDelayed(mMatcher, GesturesConstants.MATCH_DELAY); @@ -2551,12 +2568,7 @@ public final class Launcher extends Activity implements View.OnClickListener, On } void matchGesture(Gesture gesture) { - matchGesture(gesture, true); - } - - void matchGesture(Gesture gesture, boolean animate) { - mGesturesAdd.setAlpha(255); - mGesturesAdd.setEnabled(true); + mGesturesAdd.setVisibility(View.VISIBLE); if (gesture != null) { final ArrayList<Prediction> predictions = sLibrary.recognize(gesture); @@ -2575,38 +2587,27 @@ public final class Launcher extends Activity implements View.OnClickListener, On ApplicationInfo info = sModel.queryGesture(Launcher.this, prediction.name); if (info != null) { - updatePrompt(info, animate); + updatePrompt(info); } } } if (!match){ mGesturesAction.intent = null; - if (animate) { - setGesturesNextPrompt(null, getString(R.string.gestures_unknown)); - } else { - setGesturesPrompt(null, getString(R.string.gestures_unknown)); - } + setGestureUnknown(); } } } private void updatePrompt(ApplicationInfo info) { - updatePrompt(info, true); - } - - private void updatePrompt(ApplicationInfo info, boolean animate) { + // TODO: BRING BACK if (mGesturesAction.intent != null && info.intent.toUri(0).equals(mGesturesAction.intent.toUri(0)) && - info.title.equals(((TextView) mGesturesPrompt.getCurrentView()).getText())) { + info.title.equals(mGesturesSend.getText())) { return; } - if (animate) { - setGesturesNextPrompt(info.icon, info.title); - } else { - setGesturesPrompt(info.icon, info.title); - } + setGestureAction(info.icon, info.title); mGesturesAction.intent = info.intent; } |