From d6d3559b4d5019e308d151319a377446865b323b Mon Sep 17 00:00:00 2001 From: Chris Ye Date: Fri, 1 May 2020 11:36:33 -0700 Subject: [PATCH 1/2] Generate ACTION_CANCEL event when screen turned off by proximity sensor. When using PROXIMITY_SCREEN_OFF_WAKE_LOCK and screen was turned off by proximity sensor, input service should generate ACTION_CANCEL, same as display turned off by pressing power button. Add power state in display view port and notify input service for display power state change. Bug: 154074380 Test: atest libgui_test Change-Id: Icb65aead4b5544182c46101f4ba535f5955ebd6c Merged-In: Icb65aead4b5544182c46101f4ba535f5955ebd6c --- .../hardware/display/DisplayViewport.java | 7 +++ ...droid_hardware_display_DisplayViewport.cpp | 5 ++ .../server/display/DisplayManagerService.java | 54 +++++++++++++------ ...droid_server_input_InputManagerService.cpp | 3 +- 4 files changed, 51 insertions(+), 18 deletions(-) diff --git a/core/java/android/hardware/display/DisplayViewport.java b/core/java/android/hardware/display/DisplayViewport.java index 5adf948de348f..f2d4c3d759192 100644 --- a/core/java/android/hardware/display/DisplayViewport.java +++ b/core/java/android/hardware/display/DisplayViewport.java @@ -49,6 +49,9 @@ public final class DisplayViewport { // True if this viewport is valid. public boolean valid; + // True if this viewport is active. + public boolean isActive; + // The logical display id. public int displayId; @@ -79,6 +82,7 @@ public final class DisplayViewport { public void copyFrom(DisplayViewport viewport) { valid = viewport.valid; + isActive = viewport.isActive; displayId = viewport.displayId; orientation = viewport.orientation; logicalFrame.set(viewport.logicalFrame); @@ -111,6 +115,7 @@ public final class DisplayViewport { DisplayViewport other = (DisplayViewport) o; return valid == other.valid + && isActive == other.isActive && displayId == other.displayId && orientation == other.orientation && logicalFrame.equals(other.logicalFrame) @@ -127,6 +132,7 @@ public final class DisplayViewport { final int prime = 31; int result = 1; result += prime * result + (valid ? 1 : 0); + result += prime * result + (isActive ? 1 : 0); result += prime * result + displayId; result += prime * result + orientation; result += prime * result + logicalFrame.hashCode(); @@ -147,6 +153,7 @@ public final class DisplayViewport { final Integer port = physicalPort == null ? null : Byte.toUnsignedInt(physicalPort); return "DisplayViewport{type=" + typeToString(type) + ", valid=" + valid + + ", isActive=" + isActive + ", displayId=" + displayId + ", uniqueId='" + uniqueId + "'" + ", physicalPort=" + port diff --git a/core/jni/android_hardware_display_DisplayViewport.cpp b/core/jni/android_hardware_display_DisplayViewport.cpp index e74aafe61e004..c25da0fcad622 100644 --- a/core/jni/android_hardware_display_DisplayViewport.cpp +++ b/core/jni/android_hardware_display_DisplayViewport.cpp @@ -34,6 +34,7 @@ static struct { jclass clazz; jfieldID displayId; + jfieldID isActive; jfieldID orientation; jfieldID logicalFrame; jfieldID physicalFrame; @@ -59,6 +60,7 @@ status_t android_hardware_display_DisplayViewport_toNative(JNIEnv* env, jobject static const jmethodID byteValue = env->GetMethodID(byteClass, "byteValue", "()B"); viewport->displayId = env->GetIntField(viewportObj, gDisplayViewportClassInfo.displayId); + viewport->isActive = env->GetBooleanField(viewportObj, gDisplayViewportClassInfo.isActive); viewport->orientation = env->GetIntField(viewportObj, gDisplayViewportClassInfo.orientation); viewport->deviceWidth = env->GetIntField(viewportObj, gDisplayViewportClassInfo.deviceWidth); viewport->deviceHeight = env->GetIntField(viewportObj, gDisplayViewportClassInfo.deviceHeight); @@ -104,6 +106,9 @@ int register_android_hardware_display_DisplayViewport(JNIEnv* env) { gDisplayViewportClassInfo.displayId = GetFieldIDOrDie(env, gDisplayViewportClassInfo.clazz, "displayId", "I"); + gDisplayViewportClassInfo.isActive = + GetFieldIDOrDie(env, gDisplayViewportClassInfo.clazz, "isActive", "Z"); + gDisplayViewportClassInfo.orientation = GetFieldIDOrDie(env, gDisplayViewportClassInfo.clazz, "orientation", "I"); diff --git a/services/core/java/com/android/server/display/DisplayManagerService.java b/services/core/java/com/android/server/display/DisplayManagerService.java index 02d499fbd81f3..dee6cd02917f9 100644 --- a/services/core/java/com/android/server/display/DisplayManagerService.java +++ b/services/core/java/com/android/server/display/DisplayManagerService.java @@ -111,6 +111,7 @@ import java.io.PrintWriter; import java.util.ArrayList; import java.util.Arrays; import java.util.List; +import java.util.Optional; import java.util.concurrent.CopyOnWriteArrayList; /** @@ -971,6 +972,18 @@ public final class DisplayManagerService extends SystemService { if (diff == DisplayDeviceInfo.DIFF_STATE) { Slog.i(TAG, "Display device changed state: \"" + info.name + "\", " + Display.stateToString(info.state)); + final Optional viewportType = getViewportType(info); + if (viewportType.isPresent()) { + for (DisplayViewport d : mViewports) { + if (d.type == viewportType.get() && info.uniqueId.equals(d.uniqueId)) { + // Update display view port power state + d.isActive = Display.isActiveState(info.state); + } + } + if (mInputManagerInternal != null) { + mHandler.sendEmptyMessage(MSG_UPDATE_VIEWPORT); + } + } } else if (diff != 0) { Slog.i(TAG, "Display device changed: " + info); } @@ -1507,6 +1520,23 @@ public final class DisplayManagerService extends SystemService { mViewports.clear(); } + private Optional getViewportType(DisplayDeviceInfo info) { + // Get the corresponding viewport type. + if ((info.flags & DisplayDeviceInfo.FLAG_DEFAULT_DISPLAY) != 0) { + return Optional.of(VIEWPORT_INTERNAL); + } else if (info.touch == DisplayDeviceInfo.TOUCH_EXTERNAL) { + return Optional.of(VIEWPORT_EXTERNAL); + } else if (info.touch == DisplayDeviceInfo.TOUCH_VIRTUAL + && !TextUtils.isEmpty(info.uniqueId)) { + return Optional.of(VIEWPORT_VIRTUAL); + } else { + if (DEBUG) { + Slog.i(TAG, "Display " + info + " does not support input device matching."); + } + } + return Optional.empty(); + } + private void configureDisplayLocked(SurfaceControl.Transaction t, DisplayDevice device) { final DisplayDeviceInfo info = device.getDisplayDeviceInfoLocked(); final boolean ownContent = (info.flags & DisplayDeviceInfo.FLAG_OWN_CONTENT_ONLY) != 0; @@ -1533,21 +1563,10 @@ public final class DisplayManagerService extends SystemService { return; } display.configureDisplayLocked(t, device, info.state == Display.STATE_OFF); - final int viewportType; - // Update the corresponding viewport. - if ((info.flags & DisplayDeviceInfo.FLAG_DEFAULT_DISPLAY) != 0) { - viewportType = VIEWPORT_INTERNAL; - } else if (info.touch == DisplayDeviceInfo.TOUCH_EXTERNAL) { - viewportType = VIEWPORT_EXTERNAL; - } else if (info.touch == DisplayDeviceInfo.TOUCH_VIRTUAL - && !TextUtils.isEmpty(info.uniqueId)) { - viewportType = VIEWPORT_VIRTUAL; - } else { - Slog.i(TAG, "Display " + info + " does not support input device matching."); - return; + final Optional viewportType = getViewportType(info); + if (viewportType.isPresent()) { + populateViewportLocked(viewportType.get(), display.getDisplayIdLocked(), device, info); } - - populateViewportLocked(viewportType, display.getDisplayIdLocked(), device, info.uniqueId); } /** @@ -1587,12 +1606,13 @@ public final class DisplayManagerService extends SystemService { return viewport; } - private void populateViewportLocked(int viewportType, - int displayId, DisplayDevice device, String uniqueId) { - final DisplayViewport viewport = getViewportLocked(viewportType, uniqueId); + private void populateViewportLocked(int viewportType, int displayId, DisplayDevice device, + DisplayDeviceInfo info) { + final DisplayViewport viewport = getViewportLocked(viewportType, info.uniqueId); device.populateViewportLocked(viewport); viewport.valid = true; viewport.displayId = displayId; + viewport.isActive = Display.isActiveState(info.state); } private LogicalDisplay findLogicalDisplayForDeviceLocked(DisplayDevice device) { diff --git a/services/core/jni/com_android_server_input_InputManagerService.cpp b/services/core/jni/com_android_server_input_InputManagerService.cpp index 20139451e4b9a..75ec22486021a 100644 --- a/services/core/jni/com_android_server_input_InputManagerService.cpp +++ b/services/core/jni/com_android_server_input_InputManagerService.cpp @@ -403,7 +403,8 @@ void NativeInputManager::setDisplayViewports(JNIEnv* env, jobjectArray viewportO DisplayViewport viewport; android_hardware_display_DisplayViewport_toNative(env, viewportObj, &viewport); - ALOGI("Viewport [%d] to add: %s", (int) i, viewport.uniqueId.c_str()); + ALOGI("Viewport [%d] to add: %s, isActive: %s", (int)i, viewport.uniqueId.c_str(), + toString(viewport.isActive)); viewports.push_back(viewport); env->DeleteLocalRef(viewportObj); From be3710746f77280c46bca0ab125dc8f5bede716e Mon Sep 17 00:00:00 2001 From: Julia Reynolds Date: Thu, 28 May 2020 11:32:01 -0400 Subject: [PATCH 2/2] Add falsing protection for all notification settings guts Test: manual Fixes: 153080616 Change-Id: I677eb06396d4eea2238e51dfd743f2b73657e766 --- .../notification/row/AppOpsInfo.java | 5 +++ .../row/NotificationConversationInfo.java | 5 +++ .../notification/row/NotificationGuts.java | 6 ++++ .../row/NotificationGutsManager.java | 36 ++++++++++--------- .../notification/row/NotificationInfo.java | 5 +++ .../notification/row/NotificationSnooze.java | 5 +++ .../row/PartialConversationInfo.java | 5 +++ 7 files changed, 51 insertions(+), 16 deletions(-) diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/AppOpsInfo.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/AppOpsInfo.java index 10fc990e2c5b2..9dcc187cb0ef6 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/AppOpsInfo.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/AppOpsInfo.java @@ -188,6 +188,11 @@ public class AppOpsInfo extends LinearLayout implements NotificationGuts.GutsCon return false; } + @Override + public boolean needsFalsingProtection() { + return false; + } + @Override public View getContentView() { return this; diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/NotificationConversationInfo.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/NotificationConversationInfo.java index 9217756dca134..9befa313edd89 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/NotificationConversationInfo.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/NotificationConversationInfo.java @@ -403,6 +403,11 @@ public class NotificationConversationInfo extends LinearLayout implements // TODO: do we need to do anything here? } + @Override + public boolean needsFalsingProtection() { + return true; + } + @Override public void onInitializeAccessibilityEvent(AccessibilityEvent event) { super.onInitializeAccessibilityEvent(event); diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/NotificationGuts.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/NotificationGuts.java index 18d436ff7659e..c762b73a16485 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/NotificationGuts.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/NotificationGuts.java @@ -104,6 +104,12 @@ public class NotificationGuts extends FrameLayout { * Called when the guts view has finished its close animation. */ default void onFinishedClosing() {} + + /** + * Returns whether falsing protection is needed before showing the contents of this + * view on the lockscreen + */ + boolean needsFalsingProtection(); } public interface OnGutsClosedListener { diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/NotificationGutsManager.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/NotificationGutsManager.java index 1caf8f89c8226..a64dcdffff1ea 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/NotificationGutsManager.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/NotificationGutsManager.java @@ -523,23 +523,27 @@ public class NotificationGutsManager implements Dumpable, NotificationLifetimeEx int x, int y, NotificationMenuRowPlugin.MenuItem menuItem) { - if (menuItem.getGutsView() instanceof NotificationInfo) { - if (mStatusBarStateController instanceof StatusBarStateControllerImpl) { - ((StatusBarStateControllerImpl) mStatusBarStateController) - .setLeaveOpenOnKeyguardHide(true); + if (menuItem.getGutsView() instanceof NotificationGuts.GutsContent) { + NotificationGuts.GutsContent gutsView = + (NotificationGuts.GutsContent) menuItem.getGutsView(); + if (gutsView.needsFalsingProtection()) { + if (mStatusBarStateController instanceof StatusBarStateControllerImpl) { + ((StatusBarStateControllerImpl) mStatusBarStateController) + .setLeaveOpenOnKeyguardHide(true); + } + + Runnable r = () -> mMainHandler.post( + () -> openGutsInternal(view, x, y, menuItem)); + + mStatusBarLazy.get().executeRunnableDismissingKeyguard( + r, + null /* cancelAction */, + false /* dismissShade */, + true /* afterKeyguardGone */, + true /* deferred */); + + return true; } - - Runnable r = () -> mMainHandler.post( - () -> openGutsInternal(view, x, y, menuItem)); - - mStatusBarLazy.get().executeRunnableDismissingKeyguard( - r, - null /* cancelAction */, - false /* dismissShade */, - true /* afterKeyguardGone */, - true /* deferred */); - - return true; } return openGutsInternal(view, x, y, menuItem); } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/NotificationInfo.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/NotificationInfo.java index 91c31cf58ea07..334599930b63c 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/NotificationInfo.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/NotificationInfo.java @@ -489,6 +489,11 @@ public class NotificationInfo extends LinearLayout implements NotificationGuts.G mMetricsLogger.write(notificationControlsLogMaker().setType(MetricsEvent.TYPE_CLOSE)); } + @Override + public boolean needsFalsingProtection() { + return true; + } + @Override public void onInitializeAccessibilityEvent(AccessibilityEvent event) { super.onInitializeAccessibilityEvent(event); diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/NotificationSnooze.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/NotificationSnooze.java index e56771c62bb5d..cde3dfd66aaf1 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/NotificationSnooze.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/NotificationSnooze.java @@ -442,6 +442,11 @@ public class NotificationSnooze extends LinearLayout return true; } + @Override + public boolean needsFalsingProtection() { + return false; + } + public class NotificationSnoozeOption implements SnoozeOption { private SnoozeCriterion mCriterion; private int mMinutesToSnoozeFor; diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/PartialConversationInfo.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/PartialConversationInfo.java index 1dc828bfb0b57..ea059cbcf3e14 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/PartialConversationInfo.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/PartialConversationInfo.java @@ -300,6 +300,11 @@ public class PartialConversationInfo extends LinearLayout implements // TODO: do we need to do anything here? } + @Override + public boolean needsFalsingProtection() { + return true; + } + @Override public void onInitializeAccessibilityEvent(AccessibilityEvent event) { super.onInitializeAccessibilityEvent(event);