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();
}