summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorRomain Guy <romainguy@android.com>2009-07-16 13:21:01 -0700
committerRomain Guy <romainguy@android.com>2009-07-16 16:06:48 -0700
commit1dd3a077a293bf3ac4e61e91dcc3dfc99487acd4 (patch)
treec9d861aa9f735392b25d402987acb312bc50b6c4
parent68634c1c320bba0d9a49c2ad6ed78e244e89a57b (diff)
downloadandroid_packages_apps_Trebuchet-1dd3a077a293bf3ac4e61e91dcc3dfc99487acd4.tar.gz
android_packages_apps_Trebuchet-1dd3a077a293bf3ac4e61e91dcc3dfc99487acd4.tar.bz2
android_packages_apps_Trebuchet-1dd3a077a293bf3ac4e61e91dcc3dfc99487acd4.zip
New gestures UI.
-rw-r--r--AndroidManifest.xml3
-rw-r--r--res/drawable/btn_add.xml (renamed from res/drawable/btn_circle.xml)14
-rw-r--r--res/drawable/btn_circle_disable.pngbin938 -> 0 bytes
-rw-r--r--res/drawable/btn_circle_disable_focused.pngbin1436 -> 0 bytes
-rw-r--r--res/drawable/btn_circle_normal.pngbin1249 -> 0 bytes
-rw-r--r--res/drawable/btn_circle_pressed.pngbin1613 -> 0 bytes
-rw-r--r--res/drawable/btn_circle_selected.pngbin1645 -> 0 bytes
-rw-r--r--res/drawable/btn_g.xml26
-rw-r--r--res/drawable/btn_list.xml26
-rw-r--r--res/drawable/g_normal.pngbin0 -> 1408 bytes
-rw-r--r--res/drawable/g_pressed.pngbin0 -> 1784 bytes
-rw-r--r--res/drawable/g_selected.pngbin0 -> 1794 bytes
-rw-r--r--[-rwxr-xr-x]res/drawable/gestures_background.xml27
-rw-r--r--res/drawable/gestures_frame.9.pngbin0 -> 6582 bytes
-rw-r--r--res/drawable/ic_btn_round_plus.pngbin526 -> 0 bytes
-rw-r--r--res/drawable/list_normal.pngbin0 -> 1183 bytes
-rw-r--r--res/drawable/list_pressed.pngbin0 -> 1563 bytes
-rw-r--r--res/drawable/list_selected.pngbin0 -> 1603 bytes
-rw-r--r--res/drawable/plus_normal.pngbin0 -> 1218 bytes
-rw-r--r--res/drawable/plus_pressed.pngbin0 -> 1564 bytes
-rw-r--r--res/drawable/plus_selected.pngbin0 -> 1599 bytes
-rw-r--r--res/drawable/texture_paper.jpgbin989 -> 0 bytes
-rw-r--r--res/layout/gestures.xml122
-rw-r--r--res/layout/gestures_settings.xml6
-rw-r--r--res/layout/list_category.xml18
-rw-r--r--res/layout/list_checkbox_2lines.xml60
-rw-r--r--res/values/colors.xml3
-rw-r--r--res/values/styles.xml5
-rw-r--r--src/com/android/launcher/GesturesActivity.java148
-rw-r--r--src/com/android/launcher/GesturesPanel.java25
-rw-r--r--src/com/android/launcher/Launcher.java143
31 files changed, 454 insertions, 172 deletions
diff --git a/AndroidManifest.xml b/AndroidManifest.xml
index 72e486b7f..7bdc9cfa8 100644
--- a/AndroidManifest.xml
+++ b/AndroidManifest.xml
@@ -94,7 +94,8 @@
<activity
android:name="GesturesActivity"
- android:label="@string/gestures_activity" />
+ android:label="@string/gestures_activity"
+ android:theme="@android:style/Theme.Light.NoTitleBar" />
<!-- Enable system-default search mode for any activity in Home -->
<meta-data
diff --git a/res/drawable/btn_circle.xml b/res/drawable/btn_add.xml
index 920801033..1345fd18a 100644
--- a/res/drawable/btn_circle.xml
+++ b/res/drawable/btn_add.xml
@@ -16,17 +16,11 @@
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:state_window_focused="false" android:state_enabled="true"
- android:drawable="@drawable/btn_circle_normal" />
- <item android:state_window_focused="false" android:state_enabled="false"
- android:drawable="@drawable/btn_circle_disable" />
+ android:drawable="@drawable/plus_normal" />
<item android:state_pressed="true"
- android:drawable="@drawable/btn_circle_pressed" />
+ android:drawable="@drawable/plus_pressed" />
<item android:state_focused="true" android:state_enabled="true"
- android:drawable="@drawable/btn_circle_selected" />
+ android:drawable="@drawable/plus_selected" />
<item android:state_enabled="true"
- android:drawable="@drawable/btn_circle_normal" />
- <item android:state_focused="true"
- android:drawable="@drawable/btn_circle_disable_focused" />
- <item
- android:drawable="@drawable/btn_circle_disable" />
+ android:drawable="@drawable/plus_normal" />
</selector>
diff --git a/res/drawable/btn_circle_disable.png b/res/drawable/btn_circle_disable.png
deleted file mode 100644
index 33b74a66c..000000000
--- a/res/drawable/btn_circle_disable.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable/btn_circle_disable_focused.png b/res/drawable/btn_circle_disable_focused.png
deleted file mode 100644
index 005ad8dca..000000000
--- a/res/drawable/btn_circle_disable_focused.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable/btn_circle_normal.png b/res/drawable/btn_circle_normal.png
deleted file mode 100644
index fc5af1c9f..000000000
--- a/res/drawable/btn_circle_normal.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable/btn_circle_pressed.png b/res/drawable/btn_circle_pressed.png
deleted file mode 100644
index 8f40afdfc..000000000
--- a/res/drawable/btn_circle_pressed.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable/btn_circle_selected.png b/res/drawable/btn_circle_selected.png
deleted file mode 100644
index c74fac227..000000000
--- a/res/drawable/btn_circle_selected.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable/btn_g.xml b/res/drawable/btn_g.xml
new file mode 100644
index 000000000..d033b438f
--- /dev/null
+++ b/res/drawable/btn_g.xml
@@ -0,0 +1,26 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2009 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+
+<selector xmlns:android="http://schemas.android.com/apk/res/android">
+ <item android:state_window_focused="false" android:state_enabled="true"
+ android:drawable="@drawable/g_normal" />
+ <item android:state_pressed="true"
+ android:drawable="@drawable/g_pressed" />
+ <item android:state_focused="true" android:state_enabled="true"
+ android:drawable="@drawable/g_selected" />
+ <item android:state_enabled="true"
+ android:drawable="@drawable/g_normal" />
+</selector>
diff --git a/res/drawable/btn_list.xml b/res/drawable/btn_list.xml
new file mode 100644
index 000000000..84a033ef8
--- /dev/null
+++ b/res/drawable/btn_list.xml
@@ -0,0 +1,26 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2009 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+
+<selector xmlns:android="http://schemas.android.com/apk/res/android">
+ <item android:state_window_focused="false" android:state_enabled="true"
+ android:drawable="@drawable/list_normal" />
+ <item android:state_pressed="true"
+ android:drawable="@drawable/list_pressed" />
+ <item android:state_focused="true" android:state_enabled="true"
+ android:drawable="@drawable/list_selected" />
+ <item android:state_enabled="true"
+ android:drawable="@drawable/list_normal" />
+</selector>
diff --git a/res/drawable/g_normal.png b/res/drawable/g_normal.png
new file mode 100644
index 000000000..2ae97036b
--- /dev/null
+++ b/res/drawable/g_normal.png
Binary files differ
diff --git a/res/drawable/g_pressed.png b/res/drawable/g_pressed.png
new file mode 100644
index 000000000..13667dcbb
--- /dev/null
+++ b/res/drawable/g_pressed.png
Binary files differ
diff --git a/res/drawable/g_selected.png b/res/drawable/g_selected.png
new file mode 100644
index 000000000..faed865ab
--- /dev/null
+++ b/res/drawable/g_selected.png
Binary files differ
diff --git a/res/drawable/gestures_background.xml b/res/drawable/gestures_background.xml
index 34ec05145..59c11dc60 100755..100644
--- a/res/drawable/gestures_background.xml
+++ b/res/drawable/gestures_background.xml
@@ -1,20 +1,19 @@
<?xml version="1.0" encoding="utf-8"?>
-<!--
- Copyright (C) 2009 Romain Guy
+<!-- Copyright (C) 2009 The Android Open Source Project
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
- http://www.apache.org/licenses/LICENSE-2.0
+ http://www.apache.org/licenses/LICENSE-2.0
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
-->
-<bitmap xmlns:android="http://schemas.android.com/apk/res/android"
- android:src="@drawable/texture_paper"
- android:tileMode="repeat" />
+<nine-patch xmlns:android="http://schemas.android.com/apk/res/android"
+ android:src="@drawable/gestures_frame"
+ android:dither="true" />
diff --git a/res/drawable/gestures_frame.9.png b/res/drawable/gestures_frame.9.png
new file mode 100644
index 000000000..c5f564063
--- /dev/null
+++ b/res/drawable/gestures_frame.9.png
Binary files differ
diff --git a/res/drawable/ic_btn_round_plus.png b/res/drawable/ic_btn_round_plus.png
deleted file mode 100644
index 1ec8a956a..000000000
--- a/res/drawable/ic_btn_round_plus.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable/list_normal.png b/res/drawable/list_normal.png
new file mode 100644
index 000000000..ee05949c7
--- /dev/null
+++ b/res/drawable/list_normal.png
Binary files differ
diff --git a/res/drawable/list_pressed.png b/res/drawable/list_pressed.png
new file mode 100644
index 000000000..8e3c68c86
--- /dev/null
+++ b/res/drawable/list_pressed.png
Binary files differ
diff --git a/res/drawable/list_selected.png b/res/drawable/list_selected.png
new file mode 100644
index 000000000..93858f435
--- /dev/null
+++ b/res/drawable/list_selected.png
Binary files differ
diff --git a/res/drawable/plus_normal.png b/res/drawable/plus_normal.png
new file mode 100644
index 000000000..ddc588807
--- /dev/null
+++ b/res/drawable/plus_normal.png
Binary files differ
diff --git a/res/drawable/plus_pressed.png b/res/drawable/plus_pressed.png
new file mode 100644
index 000000000..872f092a8
--- /dev/null
+++ b/res/drawable/plus_pressed.png
Binary files differ
diff --git a/res/drawable/plus_selected.png b/res/drawable/plus_selected.png
new file mode 100644
index 000000000..32c441f07
--- /dev/null
+++ b/res/drawable/plus_selected.png
Binary files differ
diff --git a/res/drawable/texture_paper.jpg b/res/drawable/texture_paper.jpg
deleted file mode 100644
index 27f4fd667..000000000
--- a/res/drawable/texture_paper.jpg
+++ /dev/null
Binary files differ
diff --git a/res/layout/gestures.xml b/res/layout/gestures.xml
index c9ea2a5a7..a22ce0674 100644
--- a/res/layout/gestures.xml
+++ b/res/layout/gestures.xml
@@ -14,83 +14,89 @@
limitations under the License.
-->
-<!-- Note: GesturesPanel is a special implementation that forces the widget
- to be opaque for performance reasons. Make sure it visually is. -->
+<!-- TODO: Replace all this with a RelativeLayout -->
<com.android.launcher.GesturesPanel
xmlns:android="http://schemas.android.com/apk/res/android"
-
- android:id="@+id/gestures_panel"
- android:layout_width="fill_parent"
- android:layout_height="fill_parent">
- <ViewSwitcher
- android:id="@+id/gestures_actions"
+ android:layout_width="fill_parent"
+ android:layout_height="fill_parent"
+
+ android:paddingLeft="13dip"
+ android:paddingRight="13dip"
+
+ android:orientation="vertical"
+ android:background="@drawable/gestures_background">
+
+ <FrameLayout
android:layout_width="fill_parent"
- android:layout_height="83dip"
- android:layout_alignParentBottom="true"
-
- android:inAnimation="@anim/fade_in_fast"
- android:outAnimation="@anim/fade_out_fast"
-
- android:foregroundGravity="top|fill_horizontal"
- android:foreground="@*android:drawable/title_bar_shadow"
- android:background="@android:drawable/title_bar_tall">
-
+ android:layout_height="wrap_content"
+
+ android:paddingTop="13dip"
+ android:paddingBottom="13dip">
+
<TextView
- android:layout_width="wrap_content"
- android:layout_height="fill_parent"
- android:layout_gravity="center_horizontal"
-
- android:gravity="center_vertical"
-
- android:shadowColor="#FF000000"
- android:shadowRadius="2.0"
-
- android:drawablePadding="8dip"
- android:textAppearance="?android:attr/textAppearanceLarge"
+ android:id="@+id/gestures_prompt"
+ android:layout_width="fill_parent"
+ android:layout_height="64dip"
+
+ android:gravity="center"
+ android:textAppearance="?android:attr/textAppearanceLargeInverse"
android:ellipsize="end"
- android:maxLines="2"
+ android:maxLines="1"
+ android:singleLine="true"
android:text="@string/gestures_instructions" />
- <TextView
- android:layout_width="wrap_content"
- android:layout_height="fill_parent"
- android:layout_gravity="center_horizontal"
-
- android:gravity="center_vertical"
-
- android:shadowColor="#FF000000"
- android:shadowRadius="2.0"
+ <Button
+ android:id="@+id/gestures_action"
+ android:layout_width="fill_parent"
+ android:layout_height="64dip"
- android:drawablePadding="8dip"
- android:textAppearance="?android:attr/textAppearanceLarge"
+ android:gravity="left|center_vertical"
+ android:textAppearance="?android:attr/textAppearanceLargeInverse"
android:ellipsize="end"
- android:maxLines="2"
- android:text="@string/gestures_instructions" />
-
- </ViewSwitcher>
+ android:maxLines="1"
+ android:singleLine="true"
+ android:drawablePadding="6dip"
+
+ android:visibility="gone" />
+
+ </FrameLayout>
<android.gesture.GestureOverlayView
android:id="@+id/gestures_overlay"
android:layout_width="fill_parent"
android:layout_height="0dip"
android:layout_weight="1.0"
- android:layout_alignParentTop="true"
- android:layout_above="@id/gestures_actions"
-
- android:background="@drawable/gestures_background"
+ android:layout_marginLeft="6dip"
+ android:layout_marginRight="6dip"
+ android:gestureColor="@color/gesture_color"
+ android:uncertainGestureColor="@color/uncertain_gesture_color"
android:gestureStrokeType="multiple" />
- <ImageButton
- style="@style/PlusButton"
-
- android:id="@+id/gestures_add"
- android:layout_width="wrap_content"
+ <RelativeLayout
+ android:layout_width="fill_parent"
android:layout_height="wrap_content"
- android:layout_alignParentRight="true"
- android:layout_alignTop="@id/gestures_actions"
- android:layout_marginRight="5dip"
- android:layout_marginTop="-47dip" />
+
+ android:paddingTop="15dip"
+ android:paddingBottom="13dip">
+
+ <ImageButton
+ android:id="@+id/gestures_add"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:layout_alignParentLeft="true"
+
+ android:background="@drawable/btn_add" />
+
+ <ImageButton
+ android:id="@+id/gestures_list"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:layout_alignParentRight="true"
+
+ android:background="@drawable/btn_list" />
+
+ </RelativeLayout>
</com.android.launcher.GesturesPanel>
diff --git a/res/layout/gestures_settings.xml b/res/layout/gestures_settings.xml
index 4b1976f5c..d32b3ec84 100644
--- a/res/layout/gestures_settings.xml
+++ b/res/layout/gestures_settings.xml
@@ -14,9 +14,7 @@
limitations under the License.
-->
-<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
- android:layout_width="fill_parent"
- android:layout_height="fill_parent">
+<merge xmlns:android="http://schemas.android.com/apk/res/android">
<ListView
android:id="@android:id/list"
@@ -34,4 +32,4 @@
android:text="@string/gestures_loading"
android:textAppearance="?android:attr/textAppearanceMedium" />
-</FrameLayout>
+</merge>
diff --git a/res/layout/list_category.xml b/res/layout/list_category.xml
new file mode 100644
index 000000000..1e8d04c57
--- /dev/null
+++ b/res/layout/list_category.xml
@@ -0,0 +1,18 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2009 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+
+<TextView xmlns:android="http://schemas.android.com/apk/res/android"
+ style="?android:attr/listSeparatorTextViewStyle" />
diff --git a/res/layout/list_checkbox_2lines.xml b/res/layout/list_checkbox_2lines.xml
new file mode 100644
index 000000000..ed80c5ff9
--- /dev/null
+++ b/res/layout/list_checkbox_2lines.xml
@@ -0,0 +1,60 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2009 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+ android:layout_width="fill_parent"
+ android:layout_height="wrap_content"
+ android:minHeight="?android:attr/listPreferredItemHeight"
+ android:gravity="center_vertical"
+ android:paddingRight="?android:attr/scrollbarSize">
+
+ <RelativeLayout
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:layout_marginLeft="15dip"
+ android:layout_marginRight="6dip"
+ android:layout_marginTop="6dip"
+ android:layout_marginBottom="6dip"
+ android:layout_weight="1">
+
+ <TextView android:id="@+id/title"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:singleLine="true"
+ android:textAppearance="?android:attr/textAppearanceLarge"
+ android:ellipsize="marquee"
+ android:fadingEdge="horizontal" />
+
+ <TextView android:id="@+id/summary"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:layout_below="@id/title"
+ android:layout_alignLeft="@id/title"
+ android:textAppearance="?android:attr/textAppearanceSmall"
+ android:maxLines="2" />
+
+ </RelativeLayout>
+
+ <CheckBox
+ android:id="@+id/checkbox"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:layout_marginRight="4dip"
+ android:layout_gravity="center_vertical"
+ android:focusable="false"
+ android:clickable="false" />
+
+</LinearLayout>
diff --git a/res/values/colors.xml b/res/values/colors.xml
index e1b484319..9b9700f4a 100644
--- a/res/values/colors.xml
+++ b/res/values/colors.xml
@@ -26,5 +26,6 @@
<color name="appwidget_error_color">#FCCC</color>
<color name="snag_callout_color">#F444</color>
- <color name="gesture_color">#FFFFFF00</color>
+ <color name="gesture_color">#ff0563c1</color>
+ <color name="uncertain_gesture_color">#ff848484</color>
</resources>
diff --git a/res/values/styles.xml b/res/values/styles.xml
index 5319bb099..6f4365fe3 100644
--- a/res/values/styles.xml
+++ b/res/values/styles.xml
@@ -61,9 +61,4 @@
<item name="android:paddingRight">10dip</item>
</style>
- <style name="PlusButton">
- <item name="android:background">@drawable/btn_circle</item>
- <item name="android:src">@drawable/ic_btn_round_plus</item>
- </style>
-
</resources>
diff --git a/src/com/android/launcher/GesturesActivity.java b/src/com/android/launcher/GesturesActivity.java
index 844392dc2..24775ffe3 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 33dc1028f..2d8647d98 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 000ce1485..21b69491a 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;
}