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

Commit 2103ff44 authored by Android Build Coastguard Worker's avatar Android Build Coastguard Worker
Browse files

Merge cherrypicks of ['googleplex-android-review.googlesource.com/30134293',...

Merge cherrypicks of ['googleplex-android-review.googlesource.com/30134293', 'googleplex-android-review.googlesource.com/30153908', 'googleplex-android-review.googlesource.com/30200589'] into 24Q4-release.

Change-Id: I32459190d4938abf8c3eacd52754a41d1ed3f88f
parents 6a58e010 73d475bc
Loading
Loading
Loading
Loading
+10 −0
Original line number Diff line number Diff line
@@ -1432,3 +1432,13 @@ flag {
       purpose: PURPOSE_BUGFIX
   }
}

flag {
  name: "ignore_touches_next_to_notification_shelf"
  namespace: "systemui"
  description: "The shelf can vertically overlap the unlock icon. Ignore touches if so."
  bug: "358424256"
   metadata {
       purpose: PURPOSE_BUGFIX
   }
}
 No newline at end of file
+7 −11
Original line number Diff line number Diff line
@@ -42,7 +42,7 @@ fun isSameMediaData(
    context: Context,
    newController: MediaController,
    new: MediaData,
    old: MediaData?
    old: MediaData?,
): Boolean {
    if (old == null || !mediaControlsPostsOptimization()) return false

@@ -71,7 +71,7 @@ fun isSameMediaData(
/** Returns whether actions lists are equal. */
fun areCustomActionListsEqual(
    first: List<PlaybackState.CustomAction>?,
    second: List<PlaybackState.CustomAction>?
    second: List<PlaybackState.CustomAction>?,
): Boolean {
    // Same object, or both null
    if (first === second) {
@@ -94,7 +94,7 @@ fun areCustomActionListsEqual(

private fun areCustomActionsEqual(
    firstAction: PlaybackState.CustomAction,
    secondAction: PlaybackState.CustomAction
    secondAction: PlaybackState.CustomAction,
): Boolean {
    if (
        firstAction.action != secondAction.action ||
@@ -139,7 +139,7 @@ private fun areActionsEqual(
    context: Context,
    newController: MediaController,
    new: MediaData,
    old: MediaData
    old: MediaData,
): Boolean {
    val oldState = MediaController(context, old.token!!).playbackState
    return if (
@@ -150,8 +150,7 @@ private fun areActionsEqual(
        var same = true
        new.actions.asSequence().zip(old.actions.asSequence()).forEach {
            if (
                it.first.actionIntent?.intent?.filterEquals(it.second.actionIntent?.intent) !=
                    true ||
                it.first.actionIntent?.intent != it.second.actionIntent?.intent ||
                    it.first.icon != it.second.icon ||
                    it.first.contentDescription != it.second.contentDescription
            ) {
@@ -164,7 +163,7 @@ private fun areActionsEqual(
        oldState?.actions == newController.playbackState?.actions &&
            areCustomActionListsEqual(
                oldState?.customActions,
                newController.playbackState?.customActions
                newController.playbackState?.customActions,
            )
    } else {
        false
@@ -172,8 +171,5 @@ private fun areActionsEqual(
}

private fun areClickIntentsEqual(newIntent: PendingIntent?, oldIntent: PendingIntent?): Boolean {
    if ((newIntent == null && oldIntent == null) || newIntent === oldIntent) return true
    if (newIntent == null || oldIntent == null) return false

    return newIntent.intent?.filterEquals(oldIntent.intent) == true
    return newIntent == oldIntent
}
+11 −0
Original line number Diff line number Diff line
@@ -24,6 +24,7 @@ import static com.android.internal.jank.InteractionJankMonitor.CUJ_NOTIFICATION_
import static com.android.server.notification.Flags.screenshareNotificationHiding;
import static com.android.systemui.Dependency.ALLOW_NOTIFICATION_LONG_PRESS_NAME;
import static com.android.systemui.Flags.confineNotificationTouchToViewWidth;
import static com.android.systemui.Flags.ignoreTouchesNextToNotificationShelf;
import static com.android.systemui.statusbar.StatusBarState.KEYGUARD;
import static com.android.systemui.statusbar.notification.stack.NotificationStackScrollLayout.OnEmptySpaceClickListener;
import static com.android.systemui.statusbar.notification.stack.NotificationStackScrollLayout.OnOverscrollTopChangedListener;
@@ -604,6 +605,16 @@ public class NotificationStackScrollLayoutController implements Dumpable {
                            true /* requireMinHeight */,
                            false /* ignoreDecors */,
                            !confineNotificationTouchToViewWidth() /* ignoreWidth */);

                    // Verify the MotionEvent x,y are actually inside the touch area of the shelf,
                    // since the shelf may be animated down to a collapsed size on keyguard.
                    if (ignoreTouchesNextToNotificationShelf()) {
                        if (child instanceof NotificationShelf shelf) {
                            if (!NotificationSwipeHelper.isTouchInView(ev, shelf)) {
                                return null;
                            }
                        }
                    }
                    if (child instanceof ExpandableNotificationRow row) {
                        ExpandableNotificationRow parent = row.getNotificationParent();
                        if (parent != null && parent.areChildrenExpanded()
+11 −1
Original line number Diff line number Diff line
@@ -18,6 +18,7 @@
package com.android.systemui.statusbar.notification.stack;

import static com.android.internal.jank.InteractionJankMonitor.CUJ_NOTIFICATION_SHADE_ROW_SWIPE;
import static com.android.systemui.Flags.ignoreTouchesNextToNotificationShelf;

import android.animation.Animator;
import android.animation.AnimatorListenerAdapter;
@@ -39,6 +40,7 @@ import com.android.systemui.flags.FeatureFlags;
import com.android.systemui.plugins.FalsingManager;
import com.android.systemui.plugins.statusbar.NotificationMenuRowPlugin;
import com.android.systemui.plugins.statusbar.NotificationSwipeActionHelper;
import com.android.systemui.statusbar.NotificationShelf;
import com.android.systemui.statusbar.notification.SourceType;
import com.android.systemui.statusbar.notification.row.ExpandableNotificationRow;
import com.android.systemui.statusbar.notification.row.ExpandableView;
@@ -503,13 +505,21 @@ class NotificationSwipeHelper extends SwipeHelper implements NotificationSwipeAc
        final int height = (view instanceof ExpandableView)
                ? ((ExpandableView) view).getActualHeight()
                : view.getHeight();
        final int width;
        if (ignoreTouchesNextToNotificationShelf()) {
            width = (view instanceof NotificationShelf)
                ? ((NotificationShelf) view).getActualWidth()
                : view.getWidth();
        } else {
            width = view.getWidth();
        }
        final int rx = (int) ev.getRawX();
        final int ry = (int) ev.getRawY();
        int[] temp = new int[2];
        view.getLocationOnScreen(temp);
        final int x = temp[0];
        final int y = temp[1];
        Rect rect = new Rect(x, y, x + view.getWidth(), y + height);
        Rect rect = new Rect(x, y, x + width, y + height);
        boolean ret = rect.contains(rx, ry);
        return ret;
    }
+54 −0
Original line number Diff line number Diff line
@@ -13,6 +13,8 @@

package com.android.systemui.statusbar.notification.stack;

import static com.android.systemui.Flags.FLAG_IGNORE_TOUCHES_NEXT_TO_NOTIFICATION_SHELF;

import static junit.framework.Assert.assertEquals;
import static junit.framework.Assert.assertFalse;
import static junit.framework.Assert.assertTrue;
@@ -36,6 +38,7 @@ import static org.mockito.Mockito.when;
import android.animation.Animator;
import android.animation.ValueAnimator.AnimatorUpdateListener;
import android.os.Handler;
import android.platform.test.annotations.DisableFlags;
import android.platform.test.annotations.EnableFlags;
import android.service.notification.StatusBarNotification;
import android.testing.TestableLooper;
@@ -52,6 +55,7 @@ import com.android.systemui.flags.FakeFeatureFlags;
import com.android.systemui.flags.FeatureFlags;
import com.android.systemui.plugins.statusbar.NotificationMenuRowPlugin;
import com.android.systemui.plugins.statusbar.NotificationSwipeActionHelper.SnoozeOption;
import com.android.systemui.statusbar.NotificationShelf;
import com.android.systemui.statusbar.notification.row.ExpandableNotificationRow;
import com.android.systemui.statusbar.notification.shared.NotificationContentAlphaOptimization;

@@ -85,6 +89,7 @@ public class NotificationSwipeHelperTest extends SysuiTestCase {
    private NotificationMenuRowPlugin mMenuRow;
    private Handler mHandler;
    private ExpandableNotificationRow mNotificationRow;
    private NotificationShelf mShelf;
    private Runnable mFalsingCheck;
    private final FeatureFlags mFeatureFlags = new FakeFeatureFlags();

@@ -111,6 +116,7 @@ public class NotificationSwipeHelperTest extends SysuiTestCase {
        mEvent = mock(MotionEvent.class);
        mMenuRow = mock(NotificationMenuRowPlugin.class);
        mNotificationRow = mock(ExpandableNotificationRow.class);
        mShelf = mock(NotificationShelf.class);
        mHandler = mock(Handler.class);
        mFalsingCheck = mock(Runnable.class);
    }
@@ -664,6 +670,54 @@ public class NotificationSwipeHelperTest extends SysuiTestCase {
                mSwipeHelper.isTouchInView(mEvent, mNotificationRow));
    }

    @Test
    @EnableFlags(FLAG_IGNORE_TOUCHES_NEXT_TO_NOTIFICATION_SHELF)
    public void testIsTouchInView_notificationShelf_flagEnabled() {
        doReturn(500).when(mShelf).getWidth();
        doReturn(FAKE_ROW_WIDTH).when(mShelf).getActualWidth();
        doReturn(FAKE_ROW_HEIGHT).when(mShelf).getHeight();
        doReturn(FAKE_ROW_HEIGHT).when(mShelf).getActualHeight();

        Answer answer = (Answer) invocation -> {
            int[] arr = invocation.getArgument(0);
            arr[0] = 0;
            arr[1] = 0;
            return null;
        };

        doReturn(5f).when(mEvent).getRawX();
        doReturn(10f).when(mEvent).getRawY();
        doAnswer(answer).when(mShelf).getLocationOnScreen(any());
        assertTrue("Touch is within the view", mSwipeHelper.isTouchInView(mEvent, mShelf));

        doReturn(50f).when(mEvent).getRawX();
        assertFalse("Touch is not within the view", mSwipeHelper.isTouchInView(mEvent, mShelf));
    }

    @Test
    @DisableFlags(FLAG_IGNORE_TOUCHES_NEXT_TO_NOTIFICATION_SHELF)
    public void testIsTouchInView_notificationShelf_flagDisabled() {
        doReturn(500).when(mShelf).getWidth();
        doReturn(FAKE_ROW_WIDTH).when(mShelf).getActualWidth();
        doReturn(FAKE_ROW_HEIGHT).when(mShelf).getHeight();
        doReturn(FAKE_ROW_HEIGHT).when(mShelf).getActualHeight();

        Answer answer = (Answer) invocation -> {
            int[] arr = invocation.getArgument(0);
            arr[0] = 0;
            arr[1] = 0;
            return null;
        };

        doReturn(5f).when(mEvent).getRawX();
        doReturn(10f).when(mEvent).getRawY();
        doAnswer(answer).when(mShelf).getLocationOnScreen(any());
        assertTrue("Touch is within the view", mSwipeHelper.isTouchInView(mEvent, mShelf));

        doReturn(50f).when(mEvent).getRawX();
        assertTrue("Touch is within the view", mSwipeHelper.isTouchInView(mEvent, mShelf));
    }

    @Test
    public void testContentAlphaRemainsUnchangedWhenNotificationIsNotDismissible() {
        doReturn(FAKE_ROW_WIDTH).when(mNotificationRow).getMeasuredWidth();
Loading