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
This commit is contained in:
Selim Cinek
2019-05-01 17:31:25 -07:00
parent 07806b3d78
commit f7d88932e2
5 changed files with 35 additions and 17 deletions

View File

@@ -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"/>

View File

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

View File

@@ -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;
}
}

View File

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

View File

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