summaryrefslogtreecommitdiffstats
path: root/packages/SystemUI/src/com/android/systemui/statusbar
diff options
context:
space:
mode:
authorJens Doll <jens.doll@gmail.com>2013-03-27 14:53:04 +0100
committerJens Doll <jens.doll@gmail.com>2013-03-30 22:55:25 +0100
commit1c601ac8dde76d68e3824191e675256b47e0493f (patch)
tree3832aef9459649fa651abffe54c0580802ee99c9 /packages/SystemUI/src/com/android/systemui/statusbar
parent6a33b50cc989e75c70c4f9eea4fd92f1d10dacd7 (diff)
downloadframeworks_base-1c601ac8dde76d68e3824191e675256b47e0493f.zip
frameworks_base-1c601ac8dde76d68e3824191e675256b47e0493f.tar.gz
frameworks_base-1c601ac8dde76d68e3824191e675256b47e0493f.tar.bz2
Merge Navigation Bar and Pie Controls button config (1/2)
Based on the commit series for pie controls, this commit makes the Navigation Bar and Pie Controls share the same button layout. However, there is no button layout editor for pie controls, which makes the navigation bar the leading entity when it comes to button layouts. This commit introduces: * A common notion of navigation buttons used in CyanogenMod. (class NavigationButtons) * Some setting constants changes to avoid clashes with PA. * Removal of the pie search key, since it is no longer needed. * Sophisticated key event injection. * Virtual key sound effect Change-Id: Id68f8d0b597d7d89c55c3f66f994e632d014f006
Diffstat (limited to 'packages/SystemUI/src/com/android/systemui/statusbar')
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/BaseStatusBar.java4
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/NavigationButtons.java204
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/phone/NavbarEditor.java143
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/phone/NavigationBarView.java32
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/pie/PieLayout.java6
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/policy/KeyButtonView.java23
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/policy/PieController.java198
7 files changed, 370 insertions, 240 deletions
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/BaseStatusBar.java b/packages/SystemUI/src/com/android/systemui/statusbar/BaseStatusBar.java
index 8eef365..8865842 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/BaseStatusBar.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/BaseStatusBar.java
@@ -1354,7 +1354,7 @@ public abstract class BaseStatusBar extends SystemUI implements
resolver.registerContentObserver(Settings.System.getUriFor(
Settings.System.PIE_CONTROLS), false, this);
resolver.registerContentObserver(Settings.System.getUriFor(
- Settings.System.PIE_GRAVITY), false, this);
+ Settings.System.PIE_POSITIONS), false, this);
resolver.registerContentObserver(Settings.System.getUriFor(
Settings.System.EXPANDED_DESKTOP_STATE), false, this);
resolver.registerContentObserver(Settings.System.getUriFor(
@@ -1366,7 +1366,7 @@ public abstract class BaseStatusBar extends SystemUI implements
ContentResolver resolver = mContext.getContentResolver();
mPieTriggerSlots = Settings.System.getInt(resolver,
- Settings.System.PIE_GRAVITY, Position.BOTTOM.FLAG);
+ Settings.System.PIE_POSITIONS, Position.BOTTOM.FLAG);
boolean expanded = Settings.System.getInt(resolver,
Settings.System.EXPANDED_DESKTOP_STATE, 0) == 1;
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/NavigationButtons.java b/packages/SystemUI/src/com/android/systemui/statusbar/NavigationButtons.java
new file mode 100644
index 0000000..58c8181
--- /dev/null
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/NavigationButtons.java
@@ -0,0 +1,204 @@
+/*
+ * Copyright (C) 2013 The CyanogenMod Project
+ * This code is loosely based on portions of the ParanoidAndroid Project source, Copyright (C) 2012.
+ *
+ * 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.
+ */
+package com.android.systemui.statusbar;
+
+import android.content.Context;
+import android.provider.Settings;
+import android.view.KeyEvent;
+
+import com.android.systemui.R;
+
+import java.util.Collections;
+import java.util.LinkedHashMap;
+import java.util.Map;
+
+/**
+ * Class that holds the global information about supported navigation buttons
+ * in CyanogenMod.
+ */
+public class NavigationButtons {
+
+ /**
+ * Defines how many keys / key slots there may be for navigation.
+ * <b>WARNING</b> If you ever change this, don't forget check the source in
+ * {@code /phone/NavBarEdit.java} and {/pie/PieController.java}
+ */
+ public static final int SLOT_COUNT = 6;
+ /**
+ * Defines the weight of each of the 6 keys. For most implementations this is
+ * hard-coded within a resource file.
+ */
+ public static final boolean IS_SLOT_SMALL[] = { true, false, false, false, false, true };
+
+ /**
+ * Class to store the information about supported buttons
+ */
+ public static final class ButtonInfo {
+ public final int displayId;
+ public final int contentDescription;
+ public final int keyCode;
+ public final int portResource;
+ public final int landResource;
+ public final int sideResource;
+ private final String key;
+
+ /**
+ * Public constructor for new button types. Use this to create own {@link ButtonInfo}s
+ * for additional special keys you may want to support. <b>Note:</b> You can not
+ * persist your own {@link ButtonInfo}s with
+ * {@link NavigationButtons#storeButtonMap(Context, ButtonInfo[])}!
+ * @param rId - resource id of text shown to user in choose dialog
+ * @param cD - accessibility information regarding button
+ * @param mC - keyCode to execute on button press
+ * @param pR - portrait resource used to display button
+ * @param lR - landscape resource used to display button
+ * @param sR - smaller scaled resource for side buttons
+ */
+ public ButtonInfo(int rId, int cD, int mC, int pR, int lR, int sR) {
+ displayId = rId;
+ contentDescription = cD;
+ keyCode = mC;
+ portResource = pR;
+ landResource = lR;
+ sideResource = sR;
+ key = "";
+ }
+ /**
+ * Constructor for new button types
+ * @param rId - resource id of text shown to user in choose dialog
+ * @param cD - accessibility information regarding button
+ * @param mC - keyCode to execute on button press
+ * @param pR - portrait resource used to display button
+ * @param lR - landscape resource used to display button
+ * @param sR - smaller scaled resource for side buttons
+ * @param key - the internal key of the button
+ */
+ public ButtonInfo(int rId, int cD, int mC, int pR, int lR, int sR, String key) {
+ displayId = rId;
+ contentDescription = cD;
+ keyCode = mC;
+ portResource = pR;
+ landResource = lR;
+ sideResource = sR;
+ this.key = key;
+ }
+ }
+
+ // Available buttons string constants
+ private static final String EMPTY_STRING = "empty";
+ private static final String HOME_STRING = "home";
+ private static final String BACK_STRING = "back";
+ private static final String SEARCH_STRING = "search";
+ private static final String RECENT_STRING = "recent";
+ private static final String CONDITIONAL_MENU_STRING = "menu0";
+ private static final String ALWAYS_MENU_STRING = "menu1";
+ private static final String MENU_BIG_STRING = "menu2";
+
+ private static final String DEFAULT_SETTING_STRING = "empty|back|home|recent|empty|menu0";
+
+ // All navigation button information CyanogenMod needs
+ public static final ButtonInfo HOME = new ButtonInfo(
+ R.string.navbar_home_button,
+ R.string.accessibility_home, KeyEvent.KEYCODE_HOME, R.drawable.ic_sysbar_home,
+ R.drawable.ic_sysbar_home_land, R.drawable.ic_sysbar_home, HOME_STRING);
+ public static final ButtonInfo CONDITIONAL_MENU = new ButtonInfo(
+ R.string.navbar_menu_conditional_button,
+ R.string.accessibility_menu, KeyEvent.KEYCODE_MENU, R.drawable.ic_sysbar_menu,
+ R.drawable.ic_sysbar_menu_land, R.drawable.ic_sysbar_menu, CONDITIONAL_MENU_STRING);
+ public static final ButtonInfo ALWAYS_MENU = new ButtonInfo(
+ R.string.navbar_menu_always_button,
+ R.string.accessibility_menu, KeyEvent.KEYCODE_MENU, R.drawable.ic_sysbar_menu,
+ R.drawable.ic_sysbar_menu_land, R.drawable.ic_sysbar_menu, ALWAYS_MENU_STRING);
+ public static final ButtonInfo MENU_BIG = new ButtonInfo(
+ R.string.navbar_menu_big_button,
+ R.string.accessibility_menu, KeyEvent.KEYCODE_MENU, R.drawable.ic_sysbar_menu_big,
+ R.drawable.ic_sysbar_menu_big_land, 0, MENU_BIG_STRING);
+ public static final ButtonInfo BACK = new ButtonInfo(
+ R.string.navbar_back_button, R.string.accessibility_back,
+ KeyEvent.KEYCODE_BACK, R.drawable.ic_sysbar_back,
+ R.drawable.ic_sysbar_back_land, R.drawable.ic_sysbar_back_side, BACK_STRING);
+ public static final ButtonInfo SEARCH = new ButtonInfo(
+ R.string.navbar_search_button,
+ R.string.accessibility_back, KeyEvent.KEYCODE_SEARCH, R.drawable.ic_sysbar_search,
+ R.drawable.ic_sysbar_search_land, R.drawable.ic_sysbar_search_side, SEARCH_STRING);
+ public static final ButtonInfo RECENT = new ButtonInfo(
+ R.string.navbar_recent_button,
+ R.string.accessibility_recent, 0, R.drawable.ic_sysbar_recent,
+ R.drawable.ic_sysbar_recent_land, R.drawable.ic_sysbar_recent_side, RECENT_STRING);
+ public static final ButtonInfo EMPTY = new ButtonInfo(
+ R.string.navbar_empty_button,
+ R.string.accessibility_clear_all, 0, R.drawable.ic_sysbar_add,
+ R.drawable.ic_sysbar_add_land, R.drawable.ic_sysbar_add_side, EMPTY_STRING);
+
+
+ /**
+ * Map which holds references to supported/available buttons. This is a unmodifiable map.
+ */
+ public static final Map<String, ButtonInfo> BUTTON_MAP;
+
+ static {
+ Map<String, ButtonInfo> temp = new LinkedHashMap<String,ButtonInfo>();
+ temp.put(HOME_STRING, HOME);
+ temp.put(CONDITIONAL_MENU_STRING, CONDITIONAL_MENU);
+ temp.put(ALWAYS_MENU_STRING, ALWAYS_MENU);
+ temp.put(MENU_BIG_STRING, MENU_BIG);
+ temp.put(BACK_STRING, BACK);
+ temp.put(SEARCH_STRING, SEARCH);
+ temp.put(RECENT_STRING, RECENT);
+ temp.put(EMPTY_STRING, EMPTY);
+ BUTTON_MAP = Collections.unmodifiableMap(temp);
+ }
+
+ /**
+ * Retrieves the button configuration from the settings.
+ * @return the current button map, or the default button map.
+ */
+ public static ButtonInfo[] loadButtonMap(Context context) {
+ String saved = Settings.System.getString(context.getContentResolver(),
+ Settings.System.NAV_BUTTONS);
+ if (saved == null) {
+ saved = NavigationButtons.DEFAULT_SETTING_STRING;
+ }
+ String[] buttons = saved.split("\\|");
+ if (buttons.length < SLOT_COUNT) {
+ buttons = NavigationButtons.DEFAULT_SETTING_STRING.split("\\|");
+ }
+
+ ButtonInfo[] result = new ButtonInfo[6];
+ for (int i = 0; i < result.length; i++) {
+ result[i] = BUTTON_MAP.get(buttons[i]);
+ if (result[i] == null) {
+ result[i] = EMPTY;
+ }
+ }
+ return result;
+ }
+
+ public static void storeButtonMap(Context context, ButtonInfo[] map) {
+ if (map.length != SLOT_COUNT) {
+ throw new IllegalArgumentException("Navigation button count does not match! Is: "
+ + map.length + " expected: " + SLOT_COUNT);
+ }
+ StringBuilder sb = new StringBuilder();
+ for (int i = 0; i < SLOT_COUNT; i++) {
+ if (i != 0) sb.append("|");
+ sb.append(map[i].key);
+ }
+ Settings.System.putString(context.getContentResolver(),
+ Settings.System.NAV_BUTTONS, sb.toString());
+ }
+}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NavbarEditor.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NavbarEditor.java
index c4a7fde..4f4d407 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NavbarEditor.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NavbarEditor.java
@@ -3,7 +3,7 @@ package com.android.systemui.statusbar.phone;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
-import java.util.LinkedHashMap;
+import java.util.List;
import android.app.AlertDialog;
import android.content.Context;
@@ -30,6 +30,8 @@ import android.widget.TextView;
import com.android.internal.util.ArrayUtils;
import com.android.systemui.R;
+import com.android.systemui.statusbar.NavigationButtons;
+import com.android.systemui.statusbar.NavigationButtons.ButtonInfo;
import com.android.systemui.statusbar.policy.KeyButtonView;
/**
@@ -40,23 +42,19 @@ import com.android.systemui.statusbar.policy.KeyButtonView;
public class NavbarEditor implements OnTouchListener {
/**
- * Holds reference to all assignable button ids
+ * Holds reference to all assignable button ids.
+ * Hold this in sync with {@link NavigationButtons#BUTTON_COUNT}
*/
ArrayList<Integer> mIds = new ArrayList<Integer>(Arrays.asList(R.id.one, R.id.two, R.id.three,
R.id.four, R.id.five,R.id.six));
/**
* Subset of mIds, to differentiate small/side buttons
- * since they can be assigned additional functionality
+ * since they can be assigned additional functionality.
+ * Hold this in sync with {@link NavigationButtons#BUTTON_IS_SMALL}
*/
public static final int[] smallButtonIds = {R.id.one, R.id.six};
- /**
- * Map which holds references to supported/available buttons.
- */
- public static final LinkedHashMap<String, ButtonInfo> buttonMap =
- new LinkedHashMap<String,ButtonInfo>();
-
protected static int visibleCount = 4;
private static Boolean mIsDevicePhone = null;
@@ -78,43 +76,6 @@ public class NavbarEditor implements OnTouchListener {
private Context mContext;
- //Available buttons
- public static final String NAVBAR_EMPTY = "empty";
- public static final String NAVBAR_HOME = "home";
- public static final String NAVBAR_BACK = "back";
- public static final String NAVBAR_SEARCH = "search";
- public static final String NAVBAR_RECENT = "recent";
- public static final String NAVBAR_CONDITIONAL_MENU = "menu0";
- public static final String NAVBAR_ALWAYS_MENU = "menu1";
- public static final String NAVBAR_MENU_BIG = "menu2";
-
- static {
- buttonMap.put(NAVBAR_HOME,
- new ButtonInfo(R.string.navbar_home_button, R.string.accessibility_home, KeyEvent.KEYCODE_HOME, R.drawable.ic_sysbar_home,
- R.drawable.ic_sysbar_home_land, R.drawable.ic_sysbar_home));
- buttonMap.put(NAVBAR_CONDITIONAL_MENU,
- new ButtonInfo(R.string.navbar_menu_conditional_button, R.string.accessibility_menu, KeyEvent.KEYCODE_MENU, R.drawable.ic_sysbar_menu,
- R.drawable.ic_sysbar_menu_land, R.drawable.ic_sysbar_menu));
- buttonMap.put(NAVBAR_ALWAYS_MENU,
- new ButtonInfo(R.string.navbar_menu_always_button, R.string.accessibility_menu, KeyEvent.KEYCODE_MENU, R.drawable.ic_sysbar_menu,
- R.drawable.ic_sysbar_menu_land, R.drawable.ic_sysbar_menu));
- buttonMap.put(NAVBAR_MENU_BIG,
- new ButtonInfo(R.string.navbar_menu_big_button, R.string.accessibility_menu, KeyEvent.KEYCODE_MENU, R.drawable.ic_sysbar_menu_big,
- R.drawable.ic_sysbar_menu_big_land, 0));
- buttonMap.put(NAVBAR_BACK,
- new ButtonInfo(R.string.navbar_back_button, R.string.accessibility_back,KeyEvent.KEYCODE_BACK, R.drawable.ic_sysbar_back,
- R.drawable.ic_sysbar_back_land, R.drawable.ic_sysbar_back_side));
- buttonMap.put(NAVBAR_SEARCH,
- new ButtonInfo(R.string.navbar_search_button, R.string.accessibility_back, KeyEvent.KEYCODE_SEARCH, R.drawable.ic_sysbar_search,
- R.drawable.ic_sysbar_search_land, R.drawable.ic_sysbar_search_side));
- buttonMap.put(NAVBAR_RECENT,
- new ButtonInfo(R.string.navbar_recent_button, R.string.accessibility_recent,0, R.drawable.ic_sysbar_recent,
- R.drawable.ic_sysbar_recent_land, R.drawable.ic_sysbar_recent_side));
- buttonMap.put(NAVBAR_EMPTY,
- new ButtonInfo(R.string.navbar_empty_button, R.string.accessibility_clear_all,0, R.drawable.ic_sysbar_add,
- R.drawable.ic_sysbar_add_land, R.drawable.ic_sysbar_add_side));
- }
-
public NavbarEditor (ViewGroup parent, Boolean orientation) {
mParent = parent;
mVertical = orientation;
@@ -245,7 +206,7 @@ public class NavbarEditor implements OnTouchListener {
builder.setAdapter(list, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
- ((KeyButtonView) view).setInfo(list.getItem(which).toString(), mVertical);
+ ((KeyButtonView) view).setInfo((ButtonInfo) list.getItem(which), mVertical);
}
})
.setNegativeButton(android.R.string.cancel, new DialogInterface.OnClickListener() {
@@ -301,16 +262,13 @@ public class NavbarEditor implements OnTouchListener {
@SuppressWarnings("unchecked")
protected void saveKeys() {
((ViewGroup) mParent.findViewById(R.id.mid_nav_buttons)).setLayoutTransition(null);
- StringBuilder saveValue = new StringBuilder();
- String delim = "";
- ArrayList<Integer> idMap = (ArrayList<Integer>) mIds.clone();
+ ButtonInfo[] buttons = new ButtonInfo[NavigationButtons.SLOT_COUNT];
+ List<Integer> idMap = (List<Integer>) mIds.clone();
if (mVertical) Collections.reverse(idMap);
- for (int id : idMap) {
- saveValue.append(delim);
- delim="|";
- saveValue.append(mParent.findViewById(id).getTag());
+ for (int i = 0; i < NavigationButtons.SLOT_COUNT; i++) {
+ buttons[i] = (ButtonInfo) mParent.findViewById(idMap.get(i)).getTag();
}
- Settings.System.putString(mContext.getContentResolver(), Settings.System.NAV_BUTTONS, saveValue.toString());
+ NavigationButtons.storeButtonMap(mContext, buttons);
}
/**
@@ -332,19 +290,16 @@ public class NavbarEditor implements OnTouchListener {
*/
@SuppressWarnings("unchecked")
protected void updateKeys() {
- String saved = Settings.System.getString(mContext.getContentResolver(), Settings.System.NAV_BUTTONS);
- if (saved == null) {
- saved = "empty|back|home|recent|empty|menu0";
- }
+ ButtonInfo[] buttons = NavigationButtons.loadButtonMap(mContext);
int cc = 0;
ArrayList<Integer> idMap = (ArrayList<Integer>) mIds.clone();
if (mVertical) Collections.reverse(idMap);
visibleCount = 0;
- for (String buttons : saved.split("\\|")) {
+ for (ButtonInfo bi : buttons) {
KeyButtonView curView = (KeyButtonView) mParent.findViewById(idMap.get(cc));
- boolean isSmallButton = ArrayUtils.contains(NavbarEditor.smallButtonIds, curView.getId());
- curView.setInfo(buttons, mVertical);
- if (!curView.getTag().equals(NAVBAR_EMPTY) && !isSmallButton) {
+ boolean isSmallButton = NavigationButtons.IS_SLOT_SMALL[cc];
+ curView.setInfo(bi, mVertical);
+ if (!curView.getTag().equals(NavigationButtons.EMPTY) && !isSmallButton) {
visibleCount++;
}
cc++;
@@ -367,13 +322,14 @@ public class NavbarEditor implements OnTouchListener {
View nextPadding = viewParent.getChildAt(v+1);
if (nextPadding != null) {
View nextKey = viewParent.getChildAt(v+2);
- String nextTag = NAVBAR_EMPTY;
+ ButtonInfo nextBi = NavigationButtons.EMPTY;
if (nextKey != null) {
- nextTag = (String) nextKey.getTag();
+ nextBi = (ButtonInfo) nextKey.getTag();
}
- String curTag = (String) cView.getTag();
- if (nextKey != null && nextTag != null && curTag != null && !curTag.equals(NAVBAR_EMPTY)) {
- if (!nextTag.equals(NAVBAR_EMPTY)){
+ ButtonInfo curBi = (ButtonInfo) cView.getTag();
+ if (nextKey != null && nextBi != null
+ && curBi != null && curBi != NavigationButtons.EMPTY) {
+ if (nextBi != NavigationButtons.EMPTY){
nextPadding.setVisibility(View.VISIBLE);
} else {
if (sCount > 1) {
@@ -416,63 +372,34 @@ public class NavbarEditor implements OnTouchListener {
}
}
- /**
- * Class to store info about supported buttons
- */
- public static final class ButtonInfo {
- public int displayId;
- public int contentDescription;
- public int keyCode;
- public int portResource;
- public int landResource;
- public int sideResource;
- /**
- * Constructor for new button type
- * @param rId - resource id of text shown to user in choose dialog
- * @param cD - accessibility information regarding button
- * @param mC - keyCode to execute on button press
- * @param pR - portrait resource used to display button
- * @param lR - landscape resource used to display button
- * @param sR - smaller scaled resource for side buttons
- */
- ButtonInfo (int rId, int cD, int mC, int pR, int lR, int sR) {
- displayId = rId;
- contentDescription = cD;
- keyCode = mC;
- portResource = pR;
- landResource = lR;
- sideResource = sR;
- }
- }
-
private class ButtonAdapter implements ListAdapter {
/**
* Already assigned items
*/
- ArrayList<String> takenItems;
- ArrayList<String> items;
+ ArrayList<ButtonInfo> takenItems;
+ ArrayList<ButtonInfo> items;
LayoutInflater inflater;
ButtonAdapter (boolean smallButtons) {
inflater = (LayoutInflater) mContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
- takenItems = new ArrayList<String>();
+ takenItems = new ArrayList<ButtonInfo>();
for (int id : mIds) {
- String vTag = (String) mParent.findViewById(id).getTag();
- if (vTag == null || vTag.equals(NAVBAR_EMPTY)) {
+ ButtonInfo vTag = (ButtonInfo) mParent.findViewById(id).getTag();
+ if (vTag == null || vTag == NavigationButtons.EMPTY) {
continue;
}
takenItems.add(vTag);
}
- items = new ArrayList<String>(buttonMap.keySet());
+ items = new ArrayList<ButtonInfo>(NavigationButtons.BUTTON_MAP.values());
// home button is not assignable
- items.remove(NAVBAR_HOME);
+ items.remove(NavigationButtons.HOME);
// menu buttons can only be assigned to side buttons
if (!smallButtons) {
- items.remove(NAVBAR_CONDITIONAL_MENU);
- items.remove(NAVBAR_ALWAYS_MENU);
+ items.remove(NavigationButtons.CONDITIONAL_MENU);
+ items.remove(NavigationButtons.ALWAYS_MENU);
} else {
- items.remove(NAVBAR_MENU_BIG);
+ items.remove(NavigationButtons.MENU_BIG);
}
}
@@ -507,7 +434,7 @@ public class NavbarEditor implements OnTouchListener {
} else {
text.setBackground(null);
}
- text.setText(mParent.getResources().getString(buttonMap.get(items.get(arg0)).displayId));
+ text.setText(mParent.getResources().getString(items.get(arg0).displayId));
return convertView;
}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NavigationBarView.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NavigationBarView.java
index 9d5ca96..047ee58 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NavigationBarView.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NavigationBarView.java
@@ -51,6 +51,8 @@ import com.android.internal.statusbar.IStatusBarService;
import com.android.systemui.R;
import com.android.systemui.statusbar.BaseStatusBar;
import com.android.systemui.statusbar.DelegateViewHelper;
+import com.android.systemui.statusbar.NavigationButtons;
+import com.android.systemui.statusbar.NavigationButtons.ButtonInfo;
import com.android.systemui.statusbar.policy.DeadZone;
public class NavigationBarView extends LinearLayout implements BaseStatusBar.NavigationBarCallback {
@@ -155,19 +157,19 @@ public class NavigationBarView extends LinearLayout implements BaseStatusBar.Nav
}
protected void toggleButtonListener(boolean enable) {
- View recentView = mCurrentView.findViewWithTag(NavbarEditor.NAVBAR_RECENT);
+ View recentView = mCurrentView.findViewWithTag(NavigationButtons.RECENT);
if (recentView != null) {
recentView.setOnClickListener(enable ? mRecentsClickListener : null);
recentView.setOnTouchListener(enable ? mRecentsPreloadListener : null);
}
- View homeView = mCurrentView.findViewWithTag(NavbarEditor.NAVBAR_HOME);
+ View homeView = mCurrentView.findViewWithTag(NavigationButtons.HOME);
if (homeView != null) {
homeView.setOnTouchListener(enable ? mHomeSearchActionListener : null);
}
}
- private void setButtonWithTagVisibility(String string, int visibility) {
- View findView = mCurrentView.findViewWithTag(string);
+ private void setButtonWithTagVisibility(ButtonInfo type, int visibility) {
+ View findView = mCurrentView.findViewWithTag(type);
if (findView != null) {
findView.setVisibility(visibility);
}
@@ -276,17 +278,17 @@ public class NavigationBarView extends LinearLayout implements BaseStatusBar.Nav
mNavigationIconHints = hints;
- View button = mCurrentView.findViewWithTag(NavbarEditor.NAVBAR_HOME);
+ View button = mCurrentView.findViewWithTag(NavigationButtons.HOME);
if (button != null) {
button.setAlpha(
(0 != (hints & StatusBarManager.NAVIGATION_HINT_HOME_NOP)) ? 0.5f : 1.0f);
}
- button = mCurrentView.findViewWithTag(NavbarEditor.NAVBAR_RECENT);
+ button = mCurrentView.findViewWithTag(NavigationButtons.RECENT);
if (button != null) {
button.setAlpha(
(0 != (hints & StatusBarManager.NAVIGATION_HINT_RECENT_NOP)) ? 0.5f : 1.0f);
}
- button = mCurrentView.findViewWithTag(NavbarEditor.NAVBAR_BACK);
+ button = mCurrentView.findViewWithTag(NavigationButtons.BACK);
if (button != null) {
button.setAlpha(
(0 != (hints & StatusBarManager.NAVIGATION_HINT_BACK_NOP)) ? 0.5f : 1.0f);
@@ -328,13 +330,13 @@ public class NavigationBarView extends LinearLayout implements BaseStatusBar.Nav
}
}
- setButtonWithTagVisibility(NavbarEditor.NAVBAR_BACK, disableBack ? View.INVISIBLE : View.VISIBLE);
- setButtonWithTagVisibility(NavbarEditor.NAVBAR_HOME, disableHome ? View.INVISIBLE : View.VISIBLE);
- setButtonWithTagVisibility(NavbarEditor.NAVBAR_RECENT, disableRecent ? View.INVISIBLE : View.VISIBLE);
- setButtonWithTagVisibility(NavbarEditor.NAVBAR_RECENT, disableRecent ? View.INVISIBLE : View.VISIBLE);
- setButtonWithTagVisibility(NavbarEditor.NAVBAR_ALWAYS_MENU, disableRecent ? View.INVISIBLE : View.VISIBLE);
- setButtonWithTagVisibility(NavbarEditor.NAVBAR_MENU_BIG, disableRecent ? View.INVISIBLE : View.VISIBLE);
- setButtonWithTagVisibility(NavbarEditor.NAVBAR_SEARCH, disableRecent ? View.INVISIBLE : View.VISIBLE);
+ setButtonWithTagVisibility(NavigationButtons.BACK, disableBack ? View.INVISIBLE : View.VISIBLE);
+ setButtonWithTagVisibility(NavigationButtons.HOME, disableHome ? View.INVISIBLE : View.VISIBLE);
+ setButtonWithTagVisibility(NavigationButtons.RECENT, disableRecent ? View.INVISIBLE : View.VISIBLE);
+ setButtonWithTagVisibility(NavigationButtons.RECENT, disableRecent ? View.INVISIBLE : View.VISIBLE);
+ setButtonWithTagVisibility(NavigationButtons.ALWAYS_MENU, disableRecent ? View.INVISIBLE : View.VISIBLE);
+ setButtonWithTagVisibility(NavigationButtons.MENU_BIG, disableRecent ? View.INVISIBLE : View.VISIBLE);
+ setButtonWithTagVisibility(NavigationButtons.SEARCH, disableRecent ? View.INVISIBLE : View.VISIBLE);
getSearchLight().setVisibility((disableHome && !disableSearch) ? View.VISIBLE : View.GONE);
}
@@ -364,7 +366,7 @@ public class NavigationBarView extends LinearLayout implements BaseStatusBar.Nav
mShowMenu = show;
- setButtonWithTagVisibility(NavbarEditor.NAVBAR_CONDITIONAL_MENU, mShowMenu ? View.VISIBLE : View.INVISIBLE);
+ setButtonWithTagVisibility(NavigationButtons.CONDITIONAL_MENU, mShowMenu ? View.VISIBLE : View.INVISIBLE);
}
public void setLowProfile(final boolean lightsOut) {
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/pie/PieLayout.java b/packages/SystemUI/src/com/android/systemui/statusbar/pie/PieLayout.java
index 9161b9f..a9f02df 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/pie/PieLayout.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/pie/PieLayout.java
@@ -256,7 +256,7 @@ public class PieLayout extends FrameLayout implements View.OnTouchListener {
resolver.registerContentObserver(Settings.System.getUriFor(
Settings.System.PIE_SIZE), false, this);
resolver.registerContentObserver(Settings.System.getUriFor(
- Settings.System.PIE_GRAVITY), false, this);
+ Settings.System.PIE_POSITIONS), false, this);
}
@Override
@@ -279,7 +279,7 @@ public class PieLayout extends FrameLayout implements View.OnTouchListener {
getColors();
mTriggerSlots = Settings.System.getInt(mContext.getContentResolver(),
- Settings.System.PIE_GRAVITY, Position.BOTTOM.FLAG);
+ Settings.System.PIE_POSITIONS, Position.BOTTOM.FLAG);
}
public void setOnSnapListener(OnSnapListener onSnapListener) {
@@ -317,7 +317,7 @@ public class PieLayout extends FrameLayout implements View.OnTouchListener {
private void setupSnapPoints(int width, int height, boolean force) {
if (force) {
mTriggerSlots = Settings.System.getInt(mContext.getContentResolver(),
- Settings.System.PIE_GRAVITY, Position.BOTTOM.FLAG);
+ Settings.System.PIE_POSITIONS, Position.BOTTOM.FLAG);
}
mActiveSnap = null;
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/policy/KeyButtonView.java b/packages/SystemUI/src/com/android/systemui/statusbar/policy/KeyButtonView.java
index a9a1560..0bad729 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/policy/KeyButtonView.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/policy/KeyButtonView.java
@@ -40,8 +40,8 @@ import android.widget.ImageView;
import com.android.internal.util.ArrayUtils;
import com.android.systemui.R;
+import com.android.systemui.statusbar.NavigationButtons;
import com.android.systemui.statusbar.phone.NavbarEditor;
-import com.android.systemui.statusbar.phone.NavbarEditor.ButtonInfo;
import com.android.systemui.statusbar.phone.NavigationBarView;
public class KeyButtonView extends ImageView {
@@ -209,34 +209,33 @@ public class KeyButtonView extends ImageView {
super.setPressed(pressed);
}
- public void setInfo (String itemKey, boolean isVertical) {
- ButtonInfo item = NavbarEditor.buttonMap.get(itemKey);
- setTag(itemKey);
+ public void setInfo(NavigationButtons.ButtonInfo buttonInfo, boolean isVertical) {
+ setTag(buttonInfo);
final Resources res = getResources();
- setContentDescription(res.getString(item.contentDescription));
- mCode = item.keyCode;
+ setContentDescription(res.getString(buttonInfo.contentDescription));
+ mCode = buttonInfo.keyCode;
boolean isSmallButton = ArrayUtils.contains(NavbarEditor.smallButtonIds, getId());
Drawable keyD;
if (isSmallButton) {
- keyD = res.getDrawable(item.sideResource);
+ keyD = res.getDrawable(buttonInfo.sideResource);
} else if (!isVertical) {
- keyD = res.getDrawable(item.portResource);
+ keyD = res.getDrawable(buttonInfo.portResource);
} else {
- keyD = res.getDrawable(item.landResource);
+ keyD = res.getDrawable(buttonInfo.landResource);
}
//Reason for setImageDrawable vs setImageResource is because setImageResource calls relayout() w/o
//any checks. setImageDrawable performs size checks and only calls relayout if necessary. We rely on this
//because otherwise the setX/setY attributes which are post layout cause it to mess up the layout.
setImageDrawable(keyD);
- if (itemKey.equals(NavbarEditor.NAVBAR_EMPTY)) {
+ if (buttonInfo == NavigationButtons.EMPTY) {
if (isSmallButton) {
setVisibility(NavigationBarView.getEditMode() ? View.VISIBLE : View.INVISIBLE);
} else {
setVisibility(NavigationBarView.getEditMode() ? View.VISIBLE : View.GONE);
}
- } else if (itemKey.equals(NavbarEditor.NAVBAR_CONDITIONAL_MENU)) {
+ } else if (buttonInfo == NavigationButtons.CONDITIONAL_MENU) {
setVisibility(NavigationBarView.getEditMode() ? View.VISIBLE : View.INVISIBLE);
- } else if (itemKey.equals(NavbarEditor.NAVBAR_HOME)) {
+ } else if (buttonInfo == NavigationButtons.HOME) {
mSupportsLongpress = false;
}
}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/policy/PieController.java b/packages/SystemUI/src/com/android/systemui/statusbar/policy/PieController.java
index 047206f..45c8a13 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/policy/PieController.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/policy/PieController.java
@@ -46,14 +46,20 @@ import android.telephony.TelephonyManager;
import android.util.Slog;
import android.view.HapticFeedbackConstants;
import android.view.IWindowManager;
+import android.view.InputDevice;
+import android.view.KeyCharacterMap;
import android.view.KeyEvent;
import android.view.MotionEvent;
+import android.view.SoundEffectConstants;
import android.view.View;
import android.view.ViewGroup.LayoutParams;
+import android.view.accessibility.AccessibilityEvent;
import android.widget.ImageView;
import com.android.systemui.R;
import com.android.systemui.statusbar.BaseStatusBar;
+import com.android.systemui.statusbar.NavigationButtons;
+import com.android.systemui.statusbar.NavigationButtons.ButtonInfo;
import com.android.systemui.statusbar.pie.PieItem;
import com.android.systemui.statusbar.pie.PieLayout;
import com.android.systemui.statusbar.pie.PieLayout.PieDrawable;
@@ -72,19 +78,14 @@ public class PieController implements BaseStatusBar.NavigationBarCallback,
public static final String TAG = "PieController";
public static final boolean DEBUG = false;
- private enum ButtonType {
- BACK,
- HOME,
- RECENT,
- MENU,
- SEARCH,
- SEARCHLIGHT
- };
+ private static final ButtonInfo SEARCHLIGHT = new ButtonInfo(0, 0, 0,
+ R.drawable.search_light, R.drawable.search_light, 0);
public static final float EMPTY_ANGLE = 10;
public static final float START_ANGLE = 180 + EMPTY_ANGLE;
- private static final int MSG_INJECT_KEY = 1066;
+ private static final int MSG_INJECT_KEY_DOWN = 1066;
+ private static final int MSG_INJECT_KEY_UP = 1067;
private Context mContext;
private PieLayout mPieContainer;
@@ -213,27 +214,37 @@ public class PieController implements BaseStatusBar.NavigationBarCallback,
private class H extends Handler {
public void handleMessage(Message m) {
+ final InputManager inputManager = InputManager.getInstance();
switch (m.what) {
- case MSG_INJECT_KEY:
- final long eventTime = SystemClock.uptimeMillis();
- final InputManager inputManager = InputManager.getInstance();
-
- inputManager.injectInputEvent(new KeyEvent(eventTime - 50, eventTime - 50,
- KeyEvent.ACTION_DOWN, m.arg1, 0),
+ case MSG_INJECT_KEY_DOWN:
+ inputManager.injectInputEvent((KeyEvent) m.obj,
InputManager.INJECT_INPUT_EVENT_MODE_ASYNC);
- inputManager.injectInputEvent(new KeyEvent(eventTime - 50, eventTime - 25,
- KeyEvent.ACTION_UP, m.arg1, 0),
+ mPieContainer.playSoundEffect(SoundEffectConstants.CLICK);
+ break;
+ case MSG_INJECT_KEY_UP:
+ inputManager.injectInputEvent((KeyEvent) m.obj,
InputManager.INJECT_INPUT_EVENT_MODE_ASYNC);
-
break;
}
}
}
private H mHandler = new H();
- private void injectKeyDelayed(int keycode) {
- mHandler.removeMessages(MSG_INJECT_KEY);
- mHandler.sendMessageDelayed(Message.obtain(mHandler, MSG_INJECT_KEY, keycode, 0), 50);
+ private void injectKeyDelayed(int keyCode, long when) {
+ mHandler.removeMessages(MSG_INJECT_KEY_DOWN);
+ mHandler.removeMessages(MSG_INJECT_KEY_UP);
+
+ KeyEvent down = new KeyEvent(when, when + 10, KeyEvent.ACTION_DOWN, keyCode, 0, 0,
+ KeyCharacterMap.VIRTUAL_KEYBOARD, 0,
+ KeyEvent.FLAG_FROM_SYSTEM | KeyEvent.FLAG_VIRTUAL_HARD_KEY,
+ InputDevice.SOURCE_KEYBOARD);
+ KeyEvent up = new KeyEvent(when, when + 30, KeyEvent.ACTION_UP, keyCode, 0, 0,
+ KeyCharacterMap.VIRTUAL_KEYBOARD, 0,
+ KeyEvent.FLAG_FROM_SYSTEM | KeyEvent.FLAG_VIRTUAL_HARD_KEY,
+ InputDevice.SOURCE_KEYBOARD);
+
+ mHandler.sendMessageDelayed(Message.obtain(mHandler, MSG_INJECT_KEY_DOWN, down), 10);
+ mHandler.sendMessageDelayed(Message.obtain(mHandler, MSG_INJECT_KEY_UP, up), 30);
}
private final class SettingsObserver extends ContentObserver {
@@ -244,7 +255,7 @@ public class PieController implements BaseStatusBar.NavigationBarCallback,
void observe() {
ContentResolver resolver = mContext.getContentResolver();
resolver.registerContentObserver(Settings.System.getUriFor(
- Settings.System.PIE_SEARCH), false, this);
+ Settings.System.NAV_BUTTONS), false, this);
}
@Override
@@ -346,35 +357,35 @@ public class PieController implements BaseStatusBar.NavigationBarCallback,
private void setupNavigationItems() {
int minimumImageSize = (int)mContext.getResources().getDimension(R.dimen.pie_item_size);
+ ButtonInfo[] buttons = NavigationButtons.loadButtonMap(mContext);
mNavigationSlice.clear();
- mNavigationSlice.addItem(constructItem(2, ButtonType.BACK,
- R.drawable.ic_sysbar_back, minimumImageSize));
- mNavigationSlice.addItem(constructItem(2, ButtonType.HOME,
- R.drawable.ic_sysbar_home, minimumImageSize));
- mNavigationSlice.addItem(constructItem(2, ButtonType.RECENT,
- R.drawable.ic_sysbar_recent, minimumImageSize));
- if (Settings.System.getInt(mContext.getContentResolver(),
- Settings.System.PIE_SEARCH, 0) == 1) {
- mNavigationSlice.addItem(constructItem(1, ButtonType.SEARCH,
- R.drawable.ic_sysbar_search_side, minimumImageSize));
- }
-
- // search light has a width of 6 to take the complete space that normally
- // BACK HOME RECENT would occupy
- mSearchLight = constructItem(6, ButtonType.SEARCHLIGHT,
- R.drawable.search_light, minimumImageSize);
- mNavigationSlice.addItem(mSearchLight);
-
- mMenuButton = constructItem(1, ButtonType.MENU,
- R.drawable.ic_sysbar_menu, minimumImageSize);
- mNavigationSlice.addItem(mMenuButton);
+
+ for (int i = 0; i < buttons.length; i++) {
+ if (buttons[i] != NavigationButtons.EMPTY) {
+ ButtonInfo bi = buttons[i];
+
+ // search light is at the same position as the home button
+ if (bi == NavigationButtons.HOME) {
+ // search light has a width of 6 to take the complete space that normally
+ // BACK HOME RECENT would occupy
+ mSearchLight = constructItem(6, SEARCHLIGHT,
+ SEARCHLIGHT.portResource, minimumImageSize);
+ mNavigationSlice.addItem(mSearchLight);
+ }
+
+ boolean isSmall = NavigationButtons.IS_SLOT_SMALL[i];
+ mNavigationSlice.addItem(constructItem(isSmall ? 1 : 2, bi,
+ isSmall ? bi.sideResource : bi.portResource, minimumImageSize));
+ }
+ }
+ mMenuButton = findItem(NavigationButtons.CONDITIONAL_MENU);
setNavigationIconHints(mNavigationIconHints, true);
setMenuVisibility(mShowMenu);
}
- private PieItem constructItem(int width, ButtonType type, int image, int minimumImageSize) {
+ private PieItem constructItem(int width, ButtonInfo type, int image, int minimumImageSize) {
ImageView view = new ImageView(mContext);
view.setImageResource(image);
view.setMinimumWidth(minimumImageSize);
@@ -386,6 +397,23 @@ public class PieController implements BaseStatusBar.NavigationBarCallback,
return item;
}
+ private PieItem findItem(ButtonInfo type) {
+ for (PieItem item : mNavigationSlice.getItems()) {
+ if (type == item.tag) {
+ return item;
+ }
+ }
+
+ return null;
+ }
+
+ private void setItemWithTagVisibility(ButtonInfo type, boolean show) {
+ PieItem item = findItem(type);
+ if (item != null) {
+ item.show(show);
+ }
+ }
+
public void activateFromTrigger(View view, MotionEvent event, Position position) {
if (mPieContainer != null && !isShowing()) {
doHapticTriggerFeedback();
@@ -415,17 +443,17 @@ public class PieController implements BaseStatusBar.NavigationBarCallback,
mNavigationIconHints = hints;
- PieItem item = findItem(ButtonType.HOME);
+ PieItem item = findItem(NavigationButtons.HOME);
if (item != null) {
boolean isNop = (hints & StatusBarManager.NAVIGATION_HINT_HOME_NOP) != 0;
item.setAlpha(isNop ? 0.5f : 1.0f);
}
- item = findItem(ButtonType.RECENT);
+ item = findItem(NavigationButtons.RECENT);
if (item != null) {
boolean isNop = (hints & StatusBarManager.NAVIGATION_HINT_RECENT_NOP) != 0;
item.setAlpha(isNop ? 0.5f : 1.0f);
}
- item = findItem(ButtonType.BACK);
+ item = findItem(NavigationButtons.BACK);
if (item != null) {
boolean isNop = (hints & StatusBarManager.NAVIGATION_HINT_BACK_NOP) != 0;
boolean isAlt = (hints & StatusBarManager.NAVIGATION_HINT_BACK_ALT) != 0;
@@ -435,17 +463,6 @@ public class PieController implements BaseStatusBar.NavigationBarCallback,
setDisabledFlags(mDisabledFlags, true);
}
- private PieItem findItem(ButtonType type) {
- for (PieItem item : mNavigationSlice.getItems()) {
- ButtonType itemType = (ButtonType) item.tag;
- if (type == itemType) {
- return item;
- }
- }
-
- return null;
- }
-
@Override
public void setDisabledFlags(int disabledFlags) {
// this call may come from outside
@@ -468,23 +485,13 @@ public class PieController implements BaseStatusBar.NavigationBarCallback,
&& ((mNavigationIconHints & StatusBarManager.NAVIGATION_HINT_BACK_ALT) == 0);
final boolean disableSearch = ((disabledFlags & View.STATUS_BAR_DISABLE_SEARCH) != 0);
- PieItem item = findItem(ButtonType.BACK);
- if (item != null) {
- item.show(!disableBack);
- }
- item = findItem(ButtonType.HOME);
- if (item != null) {
- item.show(!disableHome);
- }
- item = findItem(ButtonType.RECENT);
- if (item != null) {
- item.show(!disableRecent);
- }
- item = findItem(ButtonType.SEARCH);
- if (item != null) {
- item.show(!disableRecent && !disableSearch);
- }
- // enable searchlight when nothing except search is enabled
+ setItemWithTagVisibility(NavigationButtons.BACK, !disableBack);
+ setItemWithTagVisibility(NavigationButtons.HOME, !disableHome);
+ setItemWithTagVisibility(NavigationButtons.RECENT, !disableRecent);
+ setItemWithTagVisibility(NavigationButtons.ALWAYS_MENU, !disableRecent);
+ setItemWithTagVisibility(NavigationButtons.MENU_BIG, !disableRecent);
+ setItemWithTagVisibility(NavigationButtons.SEARCH, !disableRecent);
+ // enable search light when nothing except search is enabled
if (mSearchLight != null) {
mSearchLight.show(disableHome && disableRecent && disableBack && !disableSearch);
}
@@ -495,8 +502,7 @@ public class PieController implements BaseStatusBar.NavigationBarCallback,
public void setMenuVisibility(boolean showMenu) {
// this call may come from outside
if (mMenuButton != null) {
- final boolean disableRecent = ((mDisabledFlags & View.STATUS_BAR_DISABLE_RECENT) != 0);
- mMenuButton.show(showMenu && !disableRecent);
+ mMenuButton.show(showMenu);
}
mShowMenu = showMenu;
@@ -515,40 +521,32 @@ public class PieController implements BaseStatusBar.NavigationBarCallback,
}
int triggerSlots = Settings.System.getInt(mContext.getContentResolver(),
- Settings.System.PIE_GRAVITY, Position.BOTTOM.FLAG);
+ Settings.System.PIE_POSITIONS, Position.BOTTOM.FLAG);
triggerSlots = triggerSlots & ~mPosition.FLAG | position.FLAG;
Settings.System.putInt(mContext.getContentResolver(),
- Settings.System.PIE_GRAVITY, triggerSlots);
+ Settings.System.PIE_POSITIONS, triggerSlots);
}
@Override
public void onClick(PieItem item) {
- ButtonType type = (ButtonType) item.tag;
-
- // provide the same haptic feedback as if a virtual key is pressed
- mPieContainer.performHapticFeedback(HapticFeedbackConstants.VIRTUAL_KEY);
-
- switch (type) {
- case BACK:
- injectKeyDelayed(KeyEvent.KEYCODE_BACK);
- break;
- case HOME:
- injectKeyDelayed(KeyEvent.KEYCODE_HOME);
- break;
- case MENU:
- injectKeyDelayed(KeyEvent.KEYCODE_MENU);
- break;
- case RECENT:
+ long when = SystemClock.uptimeMillis();
+ ButtonInfo bi = (ButtonInfo) item.tag;
+
+ if (bi.keyCode != 0) {
+ injectKeyDelayed(bi.keyCode, when);
+ } else {
+ // provide the same haptic feedback as if a virtual key is pressed
+ mPieContainer.performHapticFeedback(HapticFeedbackConstants.VIRTUAL_KEY);
+ mPieContainer.playSoundEffect(SoundEffectConstants.CLICK);
+ if (bi == NavigationButtons.RECENT) {
if (mStatusBar != null) {
mStatusBar.toggleRecentApps();
}
- break;
- case SEARCH:
- case SEARCHLIGHT:
- launchAssistAction(type == ButtonType.SEARCHLIGHT);
- break;
+ } else if (bi == SEARCHLIGHT) {
+ launchAssistAction(true);
+ }
}
}