diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/NotificationContentView.java b/packages/SystemUI/src/com/android/systemui/statusbar/NotificationContentView.java index a1299e81d42b4..a801c0701d0f0 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/NotificationContentView.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/NotificationContentView.java @@ -89,6 +89,7 @@ public class NotificationContentView extends FrameLayout { private StatusBarNotification mStatusBarNotification; private NotificationGroupManager mGroupManager; private RemoteInputController mRemoteInputController; + private Runnable mExpandedVisibleListener; private final ViewTreeObserver.OnPreDrawListener mEnableAnimationPredrawListener = new ViewTreeObserver.OnPreDrawListener() { @@ -712,11 +713,21 @@ public class NotificationContentView extends FrameLayout { forceUpdateVisibility(VISIBLE_TYPE_HEADSUP, mHeadsUpChild, mHeadsUpWrapper); forceUpdateVisibility(VISIBLE_TYPE_SINGLELINE, mSingleLineView, mSingleLineView); forceUpdateVisibility(VISIBLE_TYPE_AMBIENT, mAmbientChild, mAmbientWrapper); + fireExpandedVisibleListenerIfVisible(); // forceUpdateVisibilities cancels outstanding animations without updating the // mAnimationStartVisibleType. Do so here instead. mAnimationStartVisibleType = UNDEFINED; } + private void fireExpandedVisibleListenerIfVisible() { + if (mExpandedVisibleListener != null && mExpandedChild != null && isShown() + && mExpandedChild.getVisibility() == VISIBLE) { + Runnable listener = mExpandedVisibleListener; + mExpandedVisibleListener = null; + listener.run(); + } + } + private void forceUpdateVisibility(int type, View view, TransformableView wrapper) { if (view == null) { return; @@ -770,6 +781,7 @@ public class NotificationContentView extends FrameLayout { mSingleLineView, mSingleLineView); updateViewVisibility(visibleType, VISIBLE_TYPE_AMBIENT, mAmbientChild, mAmbientWrapper); + fireExpandedVisibleListenerIfVisible(); // updateViewVisibilities cancels outstanding animations without updating the // mAnimationStartVisibleType. Do so here instead. mAnimationStartVisibleType = UNDEFINED; @@ -801,6 +813,7 @@ public class NotificationContentView extends FrameLayout { mAnimationStartVisibleType = UNDEFINED; } }); + fireExpandedVisibleListenerIfVisible(); } private void transferRemoteInputFocus(int visibleType) { @@ -1304,6 +1317,24 @@ public class NotificationContentView extends FrameLayout { } } + @Override + public void onVisibilityAggregated(boolean isVisible) { + super.onVisibilityAggregated(isVisible); + if (isVisible) { + fireExpandedVisibleListenerIfVisible(); + } + } + + /** + * Sets a one-shot listener for when the expanded view becomes visible. + * + * This will fire the listener immediately if the expanded view is already visible. + */ + public void setOnExpandedVisibleListener(Runnable r) { + mExpandedVisibleListener = r; + fireExpandedVisibleListenerIfVisible(); + } + public void setIsLowPriority(boolean isLowPriority) { mIsLowPriority = isLowPriority; } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBar.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBar.java index 45fd7ec460467..934d869a5eff6 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBar.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBar.java @@ -4704,6 +4704,16 @@ public class StatusBar extends SystemUI implements DemoMode, mPendingRemoteInputView = clicked; } + protected void onMakeExpandedVisibleForRemoteInput(ExpandableNotificationRow row, + View clickedView) { + if (isKeyguardShowing()) { + onLockedRemoteInput(row, clickedView); + } else { + row.setUserExpanded(true); + row.getPrivateLayout().setOnExpandedVisibleListener(clickedView::performClick); + } + } + protected boolean startWorkChallengeIfNecessary(int userId, IntentSender intendSender, String notificationKey) { // Clear pending remote view, as we do not want to trigger pending remote input view when @@ -5463,7 +5473,7 @@ public class StatusBar extends SystemUI implements DemoMode, if (p instanceof View) { View pv = (View) p; if (pv.isRootNamespace()) { - riv = (RemoteInputView) pv.findViewWithTag(RemoteInputView.VIEW_TAG); + riv = findRemoteInputView(pv); break; } } @@ -5478,7 +5488,7 @@ public class StatusBar extends SystemUI implements DemoMode, p = p.getParent(); } - if (riv == null || row == null) { + if (row == null) { return false; } @@ -5497,6 +5507,17 @@ public class StatusBar extends SystemUI implements DemoMode, } } + if (riv == null) { + riv = findRemoteInputView(row.getPrivateLayout().getExpandedChild()); + if (riv == null) { + return false; + } + if (!row.getPrivateLayout().getExpandedChild().isShown()) { + onMakeExpandedVisibleForRemoteInput(row, view); + return true; + } + } + int width = view.getWidth(); if (view instanceof TextView) { // Center the reveal on the text which might be off-center from the TextView @@ -5523,6 +5544,12 @@ public class StatusBar extends SystemUI implements DemoMode, return true; } + private RemoteInputView findRemoteInputView(View v) { + if (v == null) { + return null; + } + return (RemoteInputView) v.findViewWithTag(RemoteInputView.VIEW_TAG); + } }; private final BroadcastReceiver mBaseBroadcastReceiver = new BroadcastReceiver() {