Index: chrome/android/java/src/org/chromium/chrome/browser/appmenu/AppMenu.java |
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/appmenu/AppMenu.java b/chrome/android/java/src/org/chromium/chrome/browser/appmenu/AppMenu.java |
index 090beba78a66e0085d730e605b5c0183cbaa62e9..4cfefcf0d77a9275482fcbe68c7299777ee2ef09 100644 |
--- a/chrome/android/java/src/org/chromium/chrome/browser/appmenu/AppMenu.java |
+++ b/chrome/android/java/src/org/chromium/chrome/browser/appmenu/AppMenu.java |
@@ -7,11 +7,13 @@ package org.chromium.chrome.browser.appmenu; |
import android.content.Context; |
import android.content.res.Resources; |
import android.graphics.Rect; |
+import android.view.KeyEvent; |
import android.view.LayoutInflater; |
import android.view.Menu; |
import android.view.MenuItem; |
import android.view.Surface; |
import android.view.View; |
+import android.view.View.OnKeyListener; |
import android.view.ViewGroup; |
import android.widget.AdapterView; |
import android.widget.AdapterView.OnItemClickListener; |
@@ -31,7 +33,7 @@ import java.util.List; |
* - Only visible MenuItems are shown. |
* - Disabled items are grayed out. |
*/ |
-public class AppMenu implements OnItemClickListener { |
+public class AppMenu implements OnItemClickListener, OnKeyListener { |
private static final float LAST_ITEM_SHOW_FRACTION = 0.5f; |
private final Menu mMenu; |
@@ -120,6 +122,7 @@ public class AppMenu implements OnItemClickListener { |
mPopup.setOnItemClickListener(this); |
mPopup.show(); |
mPopup.getListView().setItemsCanFocus(true); |
+ mPopup.getListView().setOnKeyListener(this); |
mHandler.onMenuVisibilityChanged(true); |
@@ -180,6 +183,26 @@ public class AppMenu implements OnItemClickListener { |
onItemClick(mAdapter.getItem(position)); |
} |
+ @Override |
+ public boolean onKey(View v, int keyCode, KeyEvent event) { |
+ if (mPopup == null || mPopup.getListView() == null) return false; |
+ |
+ if (event.getKeyCode() == KeyEvent.KEYCODE_MENU) { |
+ if (event.getAction() == KeyEvent.ACTION_DOWN && event.getRepeatCount() == 0) { |
+ event.startTracking(); |
+ v.getKeyDispatcherState().startTracking(event, this); |
+ return true; |
+ } else if (event.getAction() == KeyEvent.ACTION_UP) { |
+ v.getKeyDispatcherState().handleUpEvent(event); |
+ if (event.isTracking() && !event.isCanceled()) { |
+ dismiss(); |
+ return true; |
+ } |
+ } |
+ } |
+ return false; |
+ } |
+ |
/** |
* Dismisses the app menu and cancels the drag-to-scroll if it is taking place. |
*/ |