Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit f7d88932 authored by Selim Cinek's avatar Selim Cinek
Browse files

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
parent 07806b3d
Loading
Loading
Loading
Loading
+2 −0
Original line number Diff line number Diff line
@@ -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"/>

+10 −12
Original line number Diff line number Diff line
@@ -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,11 +386,14 @@ public class NotificationRemoteInputManager implements Dumpable {
            if (riv == null) {
                return false;
            }
            if (!row.getPrivateLayout().getExpandedChild().isShown()) {
        }
        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();
        if (view instanceof TextView) {
+10 −0
Original line number Diff line number Diff line
@@ -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;
    }
}
+11 −4
Original line number Diff line number Diff line
@@ -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);
        }
+2 −1
Original line number Diff line number Diff line
@@ -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();
    }