summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--core/java/android/view/View.java4
-rw-r--r--services/core/java/com/android/server/policy/PhoneWindowManager.java57
2 files changed, 58 insertions, 3 deletions
diff --git a/core/java/android/view/View.java b/core/java/android/view/View.java
index 8e493b4082c6..039b5e6f658e 100644
--- a/core/java/android/view/View.java
+++ b/core/java/android/view/View.java
@@ -11888,7 +11888,9 @@ public class View implements Drawable.Callback, KeyEvent.Callback,
if (!mHasPerformedLongPress) {
// This is a tap, so remove the longpress check
removeLongPressCallback();
- return performClick();
+ if (!event.isCanceled()) {
+ return performClick();
+ }
}
}
}
diff --git a/services/core/java/com/android/server/policy/PhoneWindowManager.java b/services/core/java/com/android/server/policy/PhoneWindowManager.java
index 4f1754a8045f..8a597267aab3 100644
--- a/services/core/java/com/android/server/policy/PhoneWindowManager.java
+++ b/services/core/java/com/android/server/policy/PhoneWindowManager.java
@@ -26,7 +26,7 @@ import static android.app.AppOpsManager.OP_TOAST_WINDOW;
import static android.content.Context.DISPLAY_SERVICE;
import static android.content.Context.WINDOW_SERVICE;
import static android.content.pm.PackageManager.FEATURE_PICTURE_IN_PICTURE;
-import static android.content.pm.PackageManager.FEATURE_TELEVISION;
+import static android.content.pm.PackageManager.FEATURE_LEANBACK;
import static android.content.pm.PackageManager.FEATURE_WATCH;
import static android.content.pm.PackageManager.PERMISSION_GRANTED;
import static android.content.res.Configuration.EMPTY;
@@ -416,6 +416,7 @@ public class PhoneWindowManager implements WindowManagerPolicy {
BurnInProtectionHelper mBurnInProtectionHelper;
AppOpsManager mAppOpsManager;
private boolean mHasFeatureWatch;
+ private boolean mHasFeatureLeanback;
// Assigned on main thread, accessed on UI thread
volatile VrManagerInternal mVrManagerInternal;
@@ -767,6 +768,12 @@ public class PhoneWindowManager implements WindowManagerPolicy {
private boolean mScreenshotChordPowerKeyTriggered;
private long mScreenshotChordPowerKeyTime;
+ private static final long BUGREPORT_TV_GESTURE_TIMEOUT_MILLIS = 1000;
+
+ private boolean mBugreportTvKey1Pressed;
+ private boolean mBugreportTvKey2Pressed;
+ private boolean mBugreportTvScheduled;
+
/* The number of steps between min and max brightness */
private static final int BRIGHTNESS_STEPS = 10;
@@ -810,6 +817,7 @@ public class PhoneWindowManager implements WindowManagerPolicy {
private static final int MSG_DISPOSE_INPUT_CONSUMER = 19;
private static final int MSG_BACK_DELAYED_PRESS = 20;
private static final int MSG_ACCESSIBILITY_SHORTCUT = 21;
+ private static final int MSG_BUGREPORT_TV = 22;
private static final int MSG_REQUEST_TRANSIENT_BARS_ARG_STATUS = 0;
private static final int MSG_REQUEST_TRANSIENT_BARS_ARG_NAVIGATION = 1;
@@ -888,6 +896,9 @@ public class PhoneWindowManager implements WindowManagerPolicy {
case MSG_ACCESSIBILITY_SHORTCUT:
accessibilityShortcutActivated();
break;
+ case MSG_BUGREPORT_TV:
+ takeBugreport();
+ break;
}
}
}
@@ -1753,6 +1764,7 @@ public class PhoneWindowManager implements WindowManagerPolicy {
mPowerManagerInternal = LocalServices.getService(PowerManagerInternal.class);
mAppOpsManager = (AppOpsManager) mContext.getSystemService(Context.APP_OPS_SERVICE);
mHasFeatureWatch = mContext.getPackageManager().hasSystemFeature(FEATURE_WATCH);
+ mHasFeatureLeanback = mContext.getPackageManager().hasSystemFeature(FEATURE_LEANBACK);
mAccessibilityShortcutController =
new AccessibilityShortcutController(mContext, new Handler());
// Init display burn-in protection
@@ -3482,6 +3494,8 @@ public class PhoneWindowManager implements WindowManagerPolicy {
} else if (keyCode == KeyEvent.KEYCODE_TAB && event.isMetaPressed()) {
// Pass through keyboard navigation keys.
return 0;
+ } else if (mHasFeatureLeanback && interceptBugreportGestureTv(keyCode, down)) {
+ return -1;
}
// Toggle Caps Lock on META-ALT.
@@ -3674,6 +3688,45 @@ public class PhoneWindowManager implements WindowManagerPolicy {
return 0;
}
+ /**
+ * TV only: recognizes a remote control gesture for capturing a bug report.
+ */
+ private boolean interceptBugreportGestureTv(int keyCode, boolean down) {
+ // The bugreport capture chord is a long press on DPAD CENTER and BACK simultaneously.
+ if (keyCode == KeyEvent.KEYCODE_DPAD_CENTER) {
+ mBugreportTvKey1Pressed = down;
+ } else if (keyCode == KeyEvent.KEYCODE_BACK) {
+ mBugreportTvKey2Pressed = down;
+ }
+
+ if (mBugreportTvKey1Pressed && mBugreportTvKey2Pressed) {
+ if (!mBugreportTvScheduled) {
+ mBugreportTvScheduled = true;
+ Message msg = Message.obtain(mHandler, MSG_BUGREPORT_TV);
+ msg.setAsynchronous(true);
+ mHandler.sendMessageDelayed(msg, BUGREPORT_TV_GESTURE_TIMEOUT_MILLIS);
+ }
+ } else if (mBugreportTvScheduled) {
+ mHandler.removeMessages(MSG_BUGREPORT_TV);
+ mBugreportTvScheduled = false;
+ }
+
+ return mBugreportTvScheduled;
+ }
+
+ private void takeBugreport() {
+ if ("1".equals(SystemProperties.get("ro.debuggable"))
+ || Settings.Global.getInt(mContext.getContentResolver(),
+ Settings.Global.DEVELOPMENT_SETTINGS_ENABLED, 0) == 1) {
+ try {
+ ActivityManager.getService()
+ .requestBugReport(ActivityManager.BUGREPORT_OPTION_INTERACTIVE);
+ } catch (RemoteException e) {
+ Slog.e(TAG, "Error taking bugreport", e);
+ }
+ }
+ }
+
/** {@inheritDoc} */
@Override
public KeyEvent dispatchUnhandledKey(WindowState win, KeyEvent event, int policyFlags) {
@@ -7083,7 +7136,7 @@ public class PhoneWindowManager implements WindowManagerPolicy {
@Override public void run() {
if (mBootMsgDialog == null) {
int theme;
- if (mContext.getPackageManager().hasSystemFeature(FEATURE_TELEVISION)) {
+ if (mContext.getPackageManager().hasSystemFeature(FEATURE_LEANBACK)) {
theme = com.android.internal.R.style.Theme_Leanback_Dialog_Alert;
} else {
theme = 0;