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

Commit e34d650e authored by Julia Reynolds's avatar Julia Reynolds Committed by Android (Google) Code Review
Browse files

Merge "User activation > app deactivation" into main

parents 2b83c174 8901a524
Loading
Loading
Loading
Loading
+17 −1
Original line number Diff line number Diff line
@@ -16,6 +16,9 @@

package com.android.server.notification;

import static android.service.notification.Condition.STATE_TRUE;
import static android.service.notification.ZenModeConfig.UPDATE_ORIGIN_USER;

import android.app.INotificationManager;
import android.app.NotificationManager;
import android.content.ComponentName;
@@ -319,8 +322,21 @@ public class ConditionProviders extends ManagedServices {
                final Condition c = conditions[i];
                final ConditionRecord r = getRecordLocked(c.id, info.component, true /*create*/);
                r.info = info;
                if (android.app.Flags.modesUi()) {
                    // if user turned on the mode, ignore the update unless the app also wants the
                    // mode on. this will update the origin of the mode and let the owner turn it
                    // off when the context ends
                    if (r.condition != null && r.condition.source == UPDATE_ORIGIN_USER) {
                        if (r.condition.state == STATE_TRUE && c.state == STATE_TRUE) {
                            r.condition = c;
                        }
                    } else {
                        r.condition = c;
                    }
                } else {
                    r.condition = c;
                }
            }
        }
        final int N = conditions.length;
        for (int i = 0; i < N; i++) {
+74 −11
Original line number Diff line number Diff line
@@ -16,6 +16,10 @@

package com.android.server.notification;

import static android.service.notification.Condition.SOURCE_USER_ACTION;
import static android.service.notification.Condition.STATE_FALSE;
import static android.service.notification.Condition.STATE_TRUE;

import static com.google.common.truth.Truth.assertThat;

import static junit.framework.Assert.assertEquals;
@@ -27,16 +31,20 @@ import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.verifyNoMoreInteractions;
import static org.mockito.Mockito.when;

import android.app.Flags;
import android.content.ComponentName;
import android.content.ServiceConnection;
import android.content.pm.IPackageManager;
import android.net.Uri;
import android.os.IInterface;
import android.platform.test.annotations.EnableFlags;
import android.platform.test.flag.junit.SetFlagsRule;
import android.service.notification.Condition;

import com.android.server.UiServiceTestCase;

import org.junit.Before;
import org.junit.Rule;
import org.junit.Test;
import org.mockito.Mock;
import org.mockito.MockitoAnnotations;
@@ -52,6 +60,10 @@ public class ConditionProvidersTest extends UiServiceTestCase {
    @Mock
    private ConditionProviders.Callback mCallback;

    @Rule
    public final SetFlagsRule mSetFlagsRule = new SetFlagsRule(
            SetFlagsRule.DefaultInitValueType.DEVICE_DEFAULT);

    @Before
    public void setUp() {
        MockitoAnnotations.initMocks(this);
@@ -67,8 +79,8 @@ public class ConditionProvidersTest extends UiServiceTestCase {
        ManagedServices.ManagedServiceInfo msi = mProviders.new ManagedServiceInfo(
                mock(IInterface.class), cn, 0, false, mock(ServiceConnection.class), 33, 100);
        Condition[] conditions = new Condition[] {
                new Condition(Uri.parse("a"), "summary", Condition.STATE_TRUE),
                new Condition(Uri.parse("b"), "summary2", Condition.STATE_TRUE)
                new Condition(Uri.parse("a"), "summary", STATE_TRUE),
                new Condition(Uri.parse("b"), "summary2", STATE_TRUE)
        };

        mProviders.notifyConditions("package", msi, conditions);
@@ -85,9 +97,9 @@ public class ConditionProvidersTest extends UiServiceTestCase {
                mock(IInterface.class), new ComponentName("package", "cls"), 0, false,
                mock(ServiceConnection.class), 33, 100);
        Condition[] conditionsToNotify = new Condition[] {
                new Condition(Uri.parse("a"), "summary", Condition.STATE_TRUE),
                new Condition(Uri.parse("b"), "summary2", Condition.STATE_TRUE),
                new Condition(Uri.parse("c"), "summary3", Condition.STATE_TRUE)
                new Condition(Uri.parse("a"), "summary", STATE_TRUE),
                new Condition(Uri.parse("b"), "summary2", STATE_TRUE),
                new Condition(Uri.parse("c"), "summary3", STATE_TRUE)
        };

        mProviders.notifyConditions("package", msi, conditionsToNotify);
@@ -104,10 +116,10 @@ public class ConditionProvidersTest extends UiServiceTestCase {
                mock(IInterface.class), new ComponentName("package", "cls"), 0, false,
                mock(ServiceConnection.class), 33, 100);
        Condition[] conditionsToNotify = new Condition[] {
                new Condition(Uri.parse("a"), "summary", Condition.STATE_TRUE),
                new Condition(Uri.parse("b"), "summary2", Condition.STATE_TRUE),
                new Condition(Uri.parse("a"), "summary3", Condition.STATE_FALSE),
                new Condition(Uri.parse("a"), "summary4", Condition.STATE_FALSE)
                new Condition(Uri.parse("a"), "summary", STATE_TRUE),
                new Condition(Uri.parse("b"), "summary2", STATE_TRUE),
                new Condition(Uri.parse("a"), "summary3", STATE_FALSE),
                new Condition(Uri.parse("a"), "summary4", STATE_FALSE)
        };

        mProviders.notifyConditions("package", msi, conditionsToNotify);
@@ -124,10 +136,10 @@ public class ConditionProvidersTest extends UiServiceTestCase {
                mock(IInterface.class), new ComponentName("package", "cls"), 0, false,
                mock(ServiceConnection.class), 33, 100);
        Condition[] conditionsToNotify = new Condition[] {
                new Condition(Uri.parse("a"), "summary", Condition.STATE_TRUE),
                new Condition(Uri.parse("a"), "summary", STATE_TRUE),
                null,
                null,
                new Condition(Uri.parse("b"), "summary", Condition.STATE_TRUE)
                new Condition(Uri.parse("b"), "summary", STATE_TRUE)
        };

        mProviders.notifyConditions("package", msi, conditionsToNotify);
@@ -137,6 +149,57 @@ public class ConditionProvidersTest extends UiServiceTestCase {
        verifyNoMoreInteractions(mCallback);
    }

    @Test
    @EnableFlags(Flags.FLAG_MODES_UI)
    public void notifyConditions_appCannotUndoUserEnablement() {
        ManagedServices.ManagedServiceInfo msi = mProviders.new ManagedServiceInfo(
                mock(IInterface.class), new ComponentName("package", "cls"), 0, false,
                mock(ServiceConnection.class), 33, 100);
        // First, user enabled mode
        Condition[] userConditions = new Condition[] {
                new Condition(Uri.parse("a"), "summary", STATE_TRUE, SOURCE_USER_ACTION)
        };
        mProviders.notifyConditions("package", msi, userConditions);
        verify(mCallback).onConditionChanged(eq(Uri.parse("a")), eq(userConditions[0]));

        // Second, app tries to disable it, but cannot
        Condition[] appConditions = new Condition[] {
                new Condition(Uri.parse("a"), "summary", STATE_FALSE)
        };
        mProviders.notifyConditions("package", msi, appConditions);
        verify(mCallback).onConditionChanged(eq(Uri.parse("a")), eq(userConditions[0]));
    }

    @Test
    @EnableFlags(Flags.FLAG_MODES_UI)
    public void notifyConditions_appCanTakeoverUserEnablement() {
        ManagedServices.ManagedServiceInfo msi = mProviders.new ManagedServiceInfo(
                mock(IInterface.class), new ComponentName("package", "cls"), 0, false,
                mock(ServiceConnection.class), 33, 100);
        // First, user enabled mode
        Condition[] userConditions = new Condition[] {
                new Condition(Uri.parse("a"), "summary", STATE_TRUE, SOURCE_USER_ACTION)
        };
        mProviders.notifyConditions("package", msi, userConditions);
        verify(mCallback).onConditionChanged(eq(Uri.parse("a")), eq(userConditions[0]));

        // Second, app now thinks the rule should be on due it its intelligence
        Condition[] appConditions = new Condition[] {
                new Condition(Uri.parse("a"), "summary", STATE_TRUE)
        };
        mProviders.notifyConditions("package", msi, appConditions);
        verify(mCallback).onConditionChanged(eq(Uri.parse("a")), eq(appConditions[0]));

        // Lastly, app can turn rule off when its intelligence think it should be off
        appConditions = new Condition[] {
                new Condition(Uri.parse("a"), "summary", STATE_FALSE)
        };
        mProviders.notifyConditions("package", msi, appConditions);
        verify(mCallback).onConditionChanged(eq(Uri.parse("a")), eq(appConditions[0]));

        verifyNoMoreInteractions(mCallback);
    }

    @Test
    public void testRemoveDefaultFromConfig() {
        final int userId = 0;