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

Commit c3be7530 authored by Julia Reynolds's avatar Julia Reynolds
Browse files

Avoid reentrant pipeline run

This one can cause crashes before the entry will be gone
partway through the reentrant run

Test: ExpandanableNotificationRowTest
Flag: com.android.systemui.notification_reentrant_dismiss
Bug: 328328054
Change-Id: I3ffdf6cbd852e0db883c3e3e803f90982dd17d99
parent 8d2f9d62
Loading
Loading
Loading
Loading
+10 −0
Original line number Original line Diff line number Diff line
@@ -1779,6 +1779,16 @@ flag {
    bug: "365064144"
    bug: "365064144"
}
}


flag {
    name: "notification_reentrant_dismiss"
    namespace: "systemui"
    description: "Posts to avoid a crashing reentrant pipeline run"
    bug: "328328054"
    metadata {
        purpose: PURPOSE_BUGFIX
      }
}

flag {
flag {
    name: "stoppable_fgs_system_app"
    name: "stoppable_fgs_system_app"
    namespace: "systemui"
    namespace: "systemui"
+11 −4
Original line number Original line Diff line number Diff line
@@ -19,6 +19,7 @@ package com.android.systemui.statusbar.notification.row;
import static android.app.Notification.Action.SEMANTIC_ACTION_MARK_CONVERSATION_AS_PRIORITY;
import static android.app.Notification.Action.SEMANTIC_ACTION_MARK_CONVERSATION_AS_PRIORITY;
import static android.service.notification.NotificationListenerService.REASON_CANCEL;
import static android.service.notification.NotificationListenerService.REASON_CANCEL;


import static com.android.systemui.flags.Flags.ENABLE_NOTIFICATIONS_SIMULATE_SLOW_MEASURE;
import static com.android.systemui.statusbar.notification.collection.NotificationEntry.DismissState.PARENT_DISMISSED;
import static com.android.systemui.statusbar.notification.collection.NotificationEntry.DismissState.PARENT_DISMISSED;
import static com.android.systemui.statusbar.notification.row.NotificationContentView.VISIBLE_TYPE_HEADSUP;
import static com.android.systemui.statusbar.notification.row.NotificationContentView.VISIBLE_TYPE_HEADSUP;
import static com.android.systemui.statusbar.policy.RemoteInputView.FOCUS_ANIMATION_MIN_SCALE;
import static com.android.systemui.statusbar.policy.RemoteInputView.FOCUS_ANIMATION_MIN_SCALE;
@@ -75,8 +76,8 @@ import com.android.internal.statusbar.IStatusBarService;
import com.android.internal.util.ContrastColorUtil;
import com.android.internal.util.ContrastColorUtil;
import com.android.internal.widget.CachingIconView;
import com.android.internal.widget.CachingIconView;
import com.android.internal.widget.CallLayout;
import com.android.internal.widget.CallLayout;
import com.android.systemui.Flags;
import com.android.systemui.flags.FeatureFlags;
import com.android.systemui.flags.FeatureFlags;
import com.android.systemui.flags.Flags;
import com.android.systemui.flags.RefactorFlag;
import com.android.systemui.flags.RefactorFlag;
import com.android.systemui.plugins.FalsingManager;
import com.android.systemui.plugins.FalsingManager;
import com.android.systemui.plugins.PluginListener;
import com.android.systemui.plugins.PluginListener;
@@ -293,7 +294,7 @@ public class ExpandableNotificationRow extends ActivatableNotificationView


    private static boolean shouldSimulateSlowMeasure() {
    private static boolean shouldSimulateSlowMeasure() {
        return Compile.IS_DEBUG && RefactorFlag.forView(
        return Compile.IS_DEBUG && RefactorFlag.forView(
                Flags.ENABLE_NOTIFICATIONS_SIMULATE_SLOW_MEASURE).isEnabled();
                ENABLE_NOTIFICATIONS_SIMULATE_SLOW_MEASURE).isEnabled();
    }
    }


    private static final String SLOW_MEASURE_SIMULATE_DELAY_PROPERTY =
    private static final String SLOW_MEASURE_SIMULATE_DELAY_PROPERTY =
@@ -1679,10 +1680,16 @@ public class ExpandableNotificationRow extends ActivatableNotificationView
        dismiss(fromAccessibility);
        dismiss(fromAccessibility);
        if (canEntryBeDismissed()) {
        if (canEntryBeDismissed()) {
            if (mOnUserInteractionCallback != null) {
            if (mOnUserInteractionCallback != null) {
                if (Flags.notificationReentrantDismiss()) {
                    Runnable futureDismissal = mOnUserInteractionCallback.registerFutureDismissal(
                            mEntry, REASON_CANCEL);
                    post(futureDismissal);
                } else {
                    mOnUserInteractionCallback.registerFutureDismissal(mEntry, REASON_CANCEL).run();
                    mOnUserInteractionCallback.registerFutureDismissal(mEntry, REASON_CANCEL).run();
                }
                }
            }
            }
        }
        }
    }


    @Override
    @Override
    public View getShelfTransformationTarget() {
    public View getShelfTransformationTarget() {
@@ -1986,7 +1993,7 @@ public class ExpandableNotificationRow extends ActivatableNotificationView
        mColorUpdateLogger = colorUpdateLogger;
        mColorUpdateLogger = colorUpdateLogger;
        mDismissibilityProvider = dismissibilityProvider;
        mDismissibilityProvider = dismissibilityProvider;
        mFeatureFlags = featureFlags;
        mFeatureFlags = featureFlags;
        setHapticFeedbackEnabled(!com.android.systemui.Flags.msdlFeedback());
        setHapticFeedbackEnabled(!Flags.msdlFeedback());
    }
    }


    private void initDimens() {
    private void initDimens() {
+15 −0
Original line number Original line Diff line number Diff line
@@ -45,6 +45,7 @@ import android.graphics.drawable.AnimatedVectorDrawable;
import android.graphics.drawable.AnimationDrawable;
import android.graphics.drawable.AnimationDrawable;
import android.graphics.drawable.Drawable;
import android.graphics.drawable.Drawable;
import android.os.UserHandle;
import android.os.UserHandle;
import android.platform.test.annotations.DisableFlags;
import android.platform.test.annotations.EnableFlags;
import android.platform.test.annotations.EnableFlags;
import android.testing.TestableLooper;
import android.testing.TestableLooper;
import android.testing.TestableLooper.RunWithLooper;
import android.testing.TestableLooper.RunWithLooper;
@@ -551,12 +552,26 @@ public class ExpandableNotificationRowTest extends SysuiTestCase {
    }
    }


    @Test
    @Test
    @DisableFlags(com.android.systemui.Flags.FLAG_NOTIFICATION_REENTRANT_DISMISS)
    public void testCanDismiss_immediately() throws Exception {
        ExpandableNotificationRow row =
                mNotificationTestHelper.createRow(mNotificationTestHelper.createNotification());
        when(mNotificationTestHelper.getDismissibilityProvider().isDismissable(row.getEntry()))
                .thenReturn(true);
        row.performDismiss(false);
        verify(mNotificationTestHelper.getOnUserInteractionCallback())
                .registerFutureDismissal(any(), anyInt());
    }

    @Test
    @EnableFlags(com.android.systemui.Flags.FLAG_NOTIFICATION_REENTRANT_DISMISS)
    public void testCanDismiss() throws Exception {
    public void testCanDismiss() throws Exception {
        ExpandableNotificationRow row =
        ExpandableNotificationRow row =
                mNotificationTestHelper.createRow(mNotificationTestHelper.createNotification());
                mNotificationTestHelper.createRow(mNotificationTestHelper.createNotification());
        when(mNotificationTestHelper.getDismissibilityProvider().isDismissable(row.getEntry()))
        when(mNotificationTestHelper.getDismissibilityProvider().isDismissable(row.getEntry()))
                .thenReturn(true);
                .thenReturn(true);
        row.performDismiss(false);
        row.performDismiss(false);
        TestableLooper.get(this).processAllMessages();
        verify(mNotificationTestHelper.getOnUserInteractionCallback())
        verify(mNotificationTestHelper.getOnUserInteractionCallback())
                .registerFutureDismissal(any(), anyInt());
                .registerFutureDismissal(any(), anyInt());
    }
    }