From f7d88932e2f699b99c1997a197c848d8e527f435 Mon Sep 17 00:00:00 2001 From: Selim Cinek Date: Wed, 1 May 2019 17:31:25 -0700 Subject: [PATCH] Fixed that clicking on the remoteinput didn't work from AOD Because we are freeing the AOD view, the view was not attached to the window anymore and therefore we would not trigger the remote input. Additionally if the expanded view was already showing on AOD, we also wouldn't wait on it to become visible, also leading to an issue where the user couldn't reply. This also fixes an issue where the notificaiton would be invisible if it was replied to in a group. Fixes: 118365629 Fixes: 110072505 Change-Id: Ied33ed19eacc115006f5457f427acd4fefe0494b --- packages/SystemUI/res/values/ids.xml | 2 ++ .../NotificationRemoteInputManager.java | 22 +++++++++---------- .../row/NotificationContentView.java | 10 +++++++++ .../phone/StatusBarRemoteInputCallback.java | 15 +++++++++---- .../StatusBarRemoteInputCallbackTest.java | 3 ++- 5 files changed, 35 insertions(+), 17 deletions(-) diff --git a/packages/SystemUI/res/values/ids.xml b/packages/SystemUI/res/values/ids.xml index 501b1b56a8484..f75f255324a63 100644 --- a/packages/SystemUI/res/values/ids.xml +++ b/packages/SystemUI/res/values/ids.xml @@ -108,6 +108,8 @@ + + diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/NotificationRemoteInputManager.java b/packages/SystemUI/src/com/android/systemui/statusbar/NotificationRemoteInputManager.java index 2793b2a0f009a..a3e91c7bcb02c 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/NotificationRemoteInputManager.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/NotificationRemoteInputManager.java @@ -51,6 +51,7 @@ import com.android.internal.annotations.VisibleForTesting; import com.android.internal.statusbar.IStatusBarService; import com.android.internal.statusbar.NotificationVisibility; import com.android.systemui.Dumpable; +import com.android.systemui.R; import com.android.systemui.statusbar.notification.NotificationEntryListener; import com.android.systemui.statusbar.notification.NotificationEntryManager; import com.android.systemui.statusbar.notification.collection.NotificationEntry; @@ -348,24 +349,18 @@ public class NotificationRemoteInputManager implements Dumpable { ViewParent p = view.getParent(); RemoteInputView riv = null; + ExpandableNotificationRow row = null; while (p != null) { if (p instanceof View) { View pv = (View) p; if (pv.isRootNamespace()) { riv = findRemoteInputView(pv); + row = (ExpandableNotificationRow) pv.getTag(R.id.row_tag_for_content_view); break; } } p = p.getParent(); } - ExpandableNotificationRow row = null; - while (p != null) { - if (p instanceof ExpandableNotificationRow) { - row = (ExpandableNotificationRow) p; - break; - } - p = p.getParent(); - } if (row == null) { return false; @@ -391,10 +386,13 @@ public class NotificationRemoteInputManager implements Dumpable { if (riv == null) { return false; } - if (!row.getPrivateLayout().getExpandedChild().isShown()) { - mCallback.onMakeExpandedVisibleForRemoteInput(row, view); - return true; - } + } + if (riv == row.getPrivateLayout().getExpandedRemoteInput() + && !row.getPrivateLayout().getExpandedChild().isShown()) { + // The expanded layout is selected, but it's not shown yet, let's wait on it to + // show before we do the animation. + mCallback.onMakeExpandedVisibleForRemoteInput(row, view); + return true; } int width = view.getWidth(); diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/NotificationContentView.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/NotificationContentView.java index b81d81438ea39..ad745f5ab2763 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/NotificationContentView.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/NotificationContentView.java @@ -541,6 +541,12 @@ public class NotificationContentView extends FrameLayout { mContainingNotification); } + @Override + public void onViewAdded(View child) { + super.onViewAdded(child); + child.setTag(R.id.row_tag_for_content_view, mContainingNotification); + } + @Override protected void onVisibilityChanged(View changedView, int visibility) { super.onVisibilityChanged(changedView, visibility); @@ -1893,4 +1899,8 @@ public class NotificationContentView extends FrameLayout { } pw.println(); } + + public RemoteInputView getExpandedRemoteInput() { + return mExpandedRemoteInput; + } } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarRemoteInputCallback.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarRemoteInputCallback.java index 471d5113a502e..0865eb6ae7d29 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarRemoteInputCallback.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarRemoteInputCallback.java @@ -28,6 +28,7 @@ import android.content.Context; import android.content.Intent; import android.content.IntentFilter; import android.content.IntentSender; +import android.os.Handler; import android.os.RemoteException; import android.os.UserHandle; import android.view.View; @@ -65,6 +66,7 @@ public class StatusBarRemoteInputCallback implements Callback, Callbacks, private final ActivityStarter mActivityStarter = Dependency.get(ActivityStarter.class); private final Context mContext; private final ActivityIntentHelper mActivityIntentHelper; + private final NotificationGroupManager mGroupManager; private View mPendingWorkRemoteInputView; private View mPendingRemoteInputView; private final ShadeController mShadeController = Dependency.get(ShadeController.class); @@ -72,11 +74,12 @@ public class StatusBarRemoteInputCallback implements Callback, Callbacks, private final CommandQueue mCommandQueue; private int mDisabled2; protected BroadcastReceiver mChallengeReceiver = new ChallengeReceiver(); + private Handler mMainHandler = new Handler(); /** */ @Inject - public StatusBarRemoteInputCallback(Context context) { + public StatusBarRemoteInputCallback(Context context, NotificationGroupManager groupManager) { mContext = context; mContext.registerReceiverAsUser(mChallengeReceiver, UserHandle.ALL, new IntentFilter(ACTION_DEVICE_LOCKED_CHANGED), null, null); @@ -85,15 +88,15 @@ public class StatusBarRemoteInputCallback implements Callback, Callbacks, mCommandQueue = getComponent(context, CommandQueue.class); mCommandQueue.addCallback(this); mActivityIntentHelper = new ActivityIntentHelper(mContext); + mGroupManager = groupManager; } @Override public void onStateChanged(int state) { if (state == StatusBarState.SHADE && mStatusBarStateController.leaveOpenOnKeyguardHide()) { if (!mStatusBarStateController.isKeyguardRequested()) { - if (mPendingRemoteInputView != null - && mPendingRemoteInputView.isAttachedToWindow()) { - mPendingRemoteInputView.post(mPendingRemoteInputView::callOnClick); + if (mPendingRemoteInputView != null) { + mMainHandler.post(mPendingRemoteInputView::callOnClick); } mPendingRemoteInputView = null; } @@ -159,6 +162,10 @@ public class StatusBarRemoteInputCallback implements Callback, Callbacks, if (mKeyguardMonitor.isShowing()) { onLockedRemoteInput(row, clickedView); } else { + if (row.isChildInGroup() && !row.areChildrenExpanded()) { + // The group isn't expanded, let's make sure it's visible! + mGroupManager.toggleGroupExpansion(row.getStatusBarNotification()); + } row.setUserExpanded(true); row.getPrivateLayout().setOnExpandedVisibleListener(clickedView::performClick); } diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/StatusBarRemoteInputCallbackTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/StatusBarRemoteInputCallbackTest.java index a88a595401619..a97832f94924e 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/StatusBarRemoteInputCallbackTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/StatusBarRemoteInputCallbackTest.java @@ -70,7 +70,8 @@ public class StatusBarRemoteInputCallbackTest extends SysuiTestCase { mNotificationLockscreenUserManager); mDependency.putComponent(CommandQueue.class, mock(CommandQueue.class)); - mRemoteInputCallback = spy(new StatusBarRemoteInputCallback(mContext)); + mRemoteInputCallback = spy(new StatusBarRemoteInputCallback(mContext, + mock(NotificationGroupManager.class))); mRemoteInputCallback.mChallengeReceiver = mRemoteInputCallback.new ChallengeReceiver(); }