summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorEthan Chen <intervigil@gmail.com>2013-05-30 22:12:18 -0700
committerEthan Chen <intervigil@gmail.com>2013-06-06 10:45:32 -0700
commit45b6edf912e4b2379a3971c5b785b66bfe1ae9d9 (patch)
tree59ef73b303b1f542f086f919f1b1cb72c1f6eeb6
parent4ed6fd0c617d7642a2056fb99d18e5356f42b60a (diff)
downloadframeworks_base-45b6edf912e4b2379a3971c5b785b66bfe1ae9d9.zip
frameworks_base-45b6edf912e4b2379a3971c5b785b66bfe1ae9d9.tar.gz
frameworks_base-45b6edf912e4b2379a3971c5b785b66bfe1ae9d9.tar.bz2
Detect whether overflow button should be shown based on menu key state
Some devices may have hardware keys but not contain a hardware menu key. Hardware keys are also able to remapped. The overflow button detection logic currently does not take that into account. This change allows detects whether any key is capable of emitting the MENU_ACTION keystroke in order to determine whether the overflow button should be shown or not. Change-Id: I8699bd0242560314f8eadc54b187c69c992cf875
-rw-r--r--core/java/android/view/IWindowManager.aidl5
-rw-r--r--core/java/android/view/ViewConfiguration.java46
-rw-r--r--core/java/android/view/WindowManagerPolicy.java5
-rw-r--r--policy/src/com/android/internal/policy/impl/PhoneWindowManager.java16
-rw-r--r--services/java/com/android/server/wm/WindowManagerService.java5
-rw-r--r--tools/layoutlib/bridge/src/android/view/IWindowManagerImpl.java5
6 files changed, 59 insertions, 23 deletions
diff --git a/core/java/android/view/IWindowManager.aidl b/core/java/android/view/IWindowManager.aidl
index 152fe61..623f585 100644
--- a/core/java/android/view/IWindowManager.aidl
+++ b/core/java/android/view/IWindowManager.aidl
@@ -211,6 +211,11 @@ interface IWindowManager
boolean hasNavigationBar();
/**
+ * Device can generate KEY_ACTION_MENU keypress
+ */
+ boolean hasMenuKeyEnabled();
+
+ /**
* Lock the device immediately with the specified options (can be null).
*/
void lockNow(in Bundle options);
diff --git a/core/java/android/view/ViewConfiguration.java b/core/java/android/view/ViewConfiguration.java
index 73295a2..c9df2dd 100644
--- a/core/java/android/view/ViewConfiguration.java
+++ b/core/java/android/view/ViewConfiguration.java
@@ -17,6 +17,7 @@
package android.view;
import android.app.AppGlobals;
+import android.content.ContentResolver;
import android.content.Context;
import android.content.res.Configuration;
import android.content.res.Resources;
@@ -220,9 +221,6 @@ public class ViewConfiguration {
private final int mOverflingDistance;
private final boolean mFadingMarqueeEnabled;
- private boolean sHasPermanentMenuKey;
- private boolean sHasPermanentMenuKeySet;
-
private Context mContext;
static final SparseArray<ViewConfiguration> sConfigurations =
@@ -292,16 +290,6 @@ public class ViewConfiguration {
mOverscrollDistance = (int) (sizeAndDensity * OVERSCROLL_DISTANCE + 0.5f);
mOverflingDistance = (int) (sizeAndDensity * OVERFLING_DISTANCE + 0.5f);
- if (!sHasPermanentMenuKeySet) {
- IWindowManager wm = WindowManagerGlobal.getWindowManagerService();
- try {
- sHasPermanentMenuKey = !wm.hasSystemNavBar() && !wm.hasNavigationBar();
- sHasPermanentMenuKeySet = true;
- } catch (RemoteException ex) {
- sHasPermanentMenuKey = false;
- }
- }
-
mFadingMarqueeEnabled = res.getBoolean(
com.android.internal.R.bool.config_ui_enableFadingMarquee);
mTouchSlop = res.getDimensionPixelSize(
@@ -682,17 +670,29 @@ public class ViewConfiguration {
* @return true if a permanent menu key is present, false otherwise.
*/
public boolean hasPermanentMenuKey() {
- // The action overflow button within app UI can
- // be controlled with a system setting
- int showOverflowButton = Settings.System.getInt(
- mContext.getContentResolver(),
- Settings.System.UI_FORCE_OVERFLOW_BUTTON, 0);
- if (showOverflowButton == 1) {
- // Force overflow button on by reporting that
- // the device has no permanent menu key
+ IWindowManager wm = WindowManagerGlobal.getWindowManagerService();
+ // Report no menu key if device has soft buttons
+ try {
+ if (wm.hasSystemNavBar() || wm.hasNavigationBar()) {
+ return false;
+ }
+ } catch (RemoteException ex) {
+ // do nothing, continue trying to guess
+ }
+
+ // Report no menu key if overflow button is forced to enabled
+ ContentResolver res = mContext.getContentResolver();
+ boolean forceOverflowButton = Settings.System.getInt(res,
+ Settings.System.UI_FORCE_OVERFLOW_BUTTON, 0) == 1;
+ if (forceOverflowButton) {
return false;
- } else {
- return sHasPermanentMenuKey;
+ }
+
+ // Report menu key presence based on hardware key rebinding
+ try {
+ return wm.hasMenuKeyEnabled();
+ } catch (RemoteException ex) {
+ return true;
}
}
diff --git a/core/java/android/view/WindowManagerPolicy.java b/core/java/android/view/WindowManagerPolicy.java
index fd5449c..acdbadd 100644
--- a/core/java/android/view/WindowManagerPolicy.java
+++ b/core/java/android/view/WindowManagerPolicy.java
@@ -1101,6 +1101,11 @@ public interface WindowManagerPolicy {
public boolean hasNavigationBar();
/**
+ * Specifies whether device can generate KEY_ACTION_MENU keypress
+ */
+ public boolean hasMenuKeyEnabled();
+
+ /**
* Lock the device now.
*/
public void lockNow(Bundle options);
diff --git a/policy/src/com/android/internal/policy/impl/PhoneWindowManager.java b/policy/src/com/android/internal/policy/impl/PhoneWindowManager.java
index b7fa3ef..49b9059 100644
--- a/policy/src/com/android/internal/policy/impl/PhoneWindowManager.java
+++ b/policy/src/com/android/internal/policy/impl/PhoneWindowManager.java
@@ -374,6 +374,7 @@ public class PhoneWindowManager implements WindowManagerPolicy {
boolean mHasMenuKey;
boolean mHasAssistKey;
boolean mHasAppSwitchKey;
+ boolean mHasMenuKeyEnabled;
// The last window we were told about in focusChanged.
WindowState mFocusedWindow;
@@ -1334,6 +1335,8 @@ public class PhoneWindowManager implements WindowManagerPolicy {
boolean keyRebindingEnabled = Settings.System.getInt(resolver,
Settings.System.HARDWARE_KEY_REBINDING, 0) == 1;
+ mHasMenuKeyEnabled = false;
+
if (!keyRebindingEnabled) {
if (mHasHomeKey) {
if (mHasAppSwitchKey) {
@@ -1349,6 +1352,7 @@ public class PhoneWindowManager implements WindowManagerPolicy {
} else {
mLongPressOnMenuBehavior = KEY_ACTION_SEARCH;
}
+ mHasMenuKeyEnabled = true;
}
if (mHasAssistKey) {
mPressOnAssistBehavior = KEY_ACTION_SEARCH;
@@ -1367,6 +1371,7 @@ public class PhoneWindowManager implements WindowManagerPolicy {
mLongPressOnHomeBehavior = Settings.System.getInt(resolver,
Settings.System.KEY_HOME_LONG_PRESS_ACTION, KEY_ACTION_APP_SWITCH);
}
+ mHasMenuKeyEnabled = (mLongPressOnHomeBehavior == KEY_ACTION_MENU);
}
if (mHasMenuKey) {
mPressOnMenuBehavior = Settings.System.getInt(resolver,
@@ -1378,18 +1383,24 @@ public class PhoneWindowManager implements WindowManagerPolicy {
mLongPressOnMenuBehavior = Settings.System.getInt(resolver,
Settings.System.KEY_MENU_LONG_PRESS_ACTION, KEY_ACTION_SEARCH);
}
+ mHasMenuKeyEnabled |= (mPressOnMenuBehavior == KEY_ACTION_MENU) ||
+ (mLongPressOnMenuBehavior == KEY_ACTION_MENU);
}
if (mHasAssistKey) {
mPressOnAssistBehavior = Settings.System.getInt(resolver,
Settings.System.KEY_ASSIST_ACTION, KEY_ACTION_SEARCH);
mLongPressOnAssistBehavior = Settings.System.getInt(resolver,
Settings.System.KEY_ASSIST_LONG_PRESS_ACTION, KEY_ACTION_VOICE_SEARCH);
+ mHasMenuKeyEnabled |= (mPressOnAssistBehavior == KEY_ACTION_MENU) ||
+ (mLongPressOnAssistBehavior == KEY_ACTION_MENU);
}
if (mHasAppSwitchKey) {
mPressOnAppSwitchBehavior = Settings.System.getInt(resolver,
Settings.System.KEY_APP_SWITCH_ACTION, KEY_ACTION_APP_SWITCH);
mLongPressOnAppSwitchBehavior = Settings.System.getInt(resolver,
Settings.System.KEY_APP_SWITCH_LONG_PRESS_ACTION, KEY_ACTION_NOTHING);
+ mHasMenuKeyEnabled |= (mPressOnAppSwitchBehavior == KEY_ACTION_MENU) ||
+ (mLongPressOnAppSwitchBehavior == KEY_ACTION_MENU);
}
}
@@ -5177,6 +5188,11 @@ public class PhoneWindowManager implements WindowManagerPolicy {
}
@Override
+ public boolean hasMenuKeyEnabled() {
+ return mHasMenuKeyEnabled;
+ }
+
+ @Override
public void setLastInputMethodWindowLw(WindowState ime, WindowState target) {
mLastInputMethodWindow = ime;
mLastInputMethodTargetWindow = target;
diff --git a/services/java/com/android/server/wm/WindowManagerService.java b/services/java/com/android/server/wm/WindowManagerService.java
index 4133bbd..672b938 100644
--- a/services/java/com/android/server/wm/WindowManagerService.java
+++ b/services/java/com/android/server/wm/WindowManagerService.java
@@ -10484,6 +10484,11 @@ public class WindowManagerService extends IWindowManager.Stub
return mPolicy.hasNavigationBar();
}
+ @Override
+ public boolean hasMenuKeyEnabled() {
+ return mPolicy.hasMenuKeyEnabled();
+ }
+
public void lockNow(Bundle options) {
mPolicy.lockNow(options);
}
diff --git a/tools/layoutlib/bridge/src/android/view/IWindowManagerImpl.java b/tools/layoutlib/bridge/src/android/view/IWindowManagerImpl.java
index 25fee8d..f523b03 100644
--- a/tools/layoutlib/bridge/src/android/view/IWindowManagerImpl.java
+++ b/tools/layoutlib/bridge/src/android/view/IWindowManagerImpl.java
@@ -508,4 +508,9 @@ public class IWindowManagerImpl implements IWindowManager {
throws RemoteException {
// TODO Auto-generated method stub
}
+
+ @Override
+ public boolean hasMenuKeyEnabled() {
+ return true;
+ }
}