diff options
| author | 2019-05-01 17:31:25 -0700 | |
|---|---|---|
| committer | 2019-05-02 13:41:53 -0700 | |
| commit | f7d88932e2f699b99c1997a197c848d8e527f435 (patch) | |
| tree | f8ba751fac181efcabde3e27f09c424be54dfdb4 | |
| parent | 07806b3d78feed97f6631b151fe4ae03f57a497f (diff) | |
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
5 files changed, 35 insertions, 17 deletions
diff --git a/packages/SystemUI/res/values/ids.xml b/packages/SystemUI/res/values/ids.xml index 501b1b56a848..f75f255324a6 100644 --- a/packages/SystemUI/res/values/ids.xml +++ b/packages/SystemUI/res/values/ids.xml @@ -108,6 +108,8 @@ <item type="id" name="display_cutout" /> + <item type="id" name="row_tag_for_content_view" /> + <!-- Optional cancel button on Keyguard --> <item type="id" name="cancel_button"/> diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/NotificationRemoteInputManager.java b/packages/SystemUI/src/com/android/systemui/statusbar/NotificationRemoteInputManager.java index 2793b2a0f009..a3e91c7bcb02 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 b81d81438ea3..ad745f5ab276 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 @@ -542,6 +542,12 @@ public class NotificationContentView extends FrameLayout { } @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); updateVisibility(); @@ -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 471d5113a502..0865eb6ae7d2 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 a88a59540161..a97832f94924 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(); } |