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

Commit e0b757e6 authored by Yuri Lin's avatar Yuri Lin Committed by Android (Google) Code Review
Browse files

Merge "Use rule package name in addAutomaticZenRule; specify "android" for all...

Merge "Use rule package name in addAutomaticZenRule; specify "android" for all system apps" into rvc-qpr-dev
parents 874161de b5ec639b
Loading
Loading
Loading
Loading
+16 −1
Original line number Original line Diff line number Diff line
@@ -4486,7 +4486,16 @@ public class NotificationManagerService extends SystemService {
            }
            }
            enforcePolicyAccess(Binder.getCallingUid(), "addAutomaticZenRule");
            enforcePolicyAccess(Binder.getCallingUid(), "addAutomaticZenRule");


            return mZenModeHelper.addAutomaticZenRule(pkg, automaticZenRule,
            // If the calling app is the system (from any user), take the package name from the
            // rule's owner rather than from the caller's package.
            String rulePkg = pkg;
            if (isCallingAppIdSystem()) {
                if (automaticZenRule.getOwner() != null) {
                    rulePkg = automaticZenRule.getOwner().getPackageName();
                }
            }

            return mZenModeHelper.addAutomaticZenRule(rulePkg, automaticZenRule,
                    "addAutomaticZenRule");
                    "addAutomaticZenRule");
        }
        }


@@ -8651,6 +8660,12 @@ public class NotificationManagerService extends SystemService {
        return uid == Process.SYSTEM_UID;
        return uid == Process.SYSTEM_UID;
    }
    }


    protected boolean isCallingAppIdSystem() {
        final int uid = Binder.getCallingUid();
        final int appid = UserHandle.getAppId(uid);
        return appid == Process.SYSTEM_UID;
    }

    protected boolean isUidSystemOrPhone(int uid) {
    protected boolean isUidSystemOrPhone(int uid) {
        final int appid = UserHandle.getAppId(uid);
        final int appid = UserHandle.getAppId(uid);
        return (appid == Process.SYSTEM_UID || appid == Process.PHONE_UID
        return (appid == Process.SYSTEM_UID || appid == Process.PHONE_UID
+1 −6
Original line number Original line Diff line number Diff line
@@ -305,7 +305,7 @@ public class ZenModeHelper {


    public String addAutomaticZenRule(String pkg, AutomaticZenRule automaticZenRule,
    public String addAutomaticZenRule(String pkg, AutomaticZenRule automaticZenRule,
            String reason) {
            String reason) {
        if (!isSystemRule(automaticZenRule)) {
        if (!ZenModeConfig.SYSTEM_AUTHORITY.equals(pkg)) {
            PackageItemInfo component = getServiceInfo(automaticZenRule.getOwner());
            PackageItemInfo component = getServiceInfo(automaticZenRule.getOwner());
            if (component == null) {
            if (component == null) {
                component = getActivityInfo(automaticZenRule.getConfigurationActivity());
                component = getActivityInfo(automaticZenRule.getConfigurationActivity());
@@ -554,11 +554,6 @@ public class ZenModeHelper {
        }
        }
    }
    }


    private boolean isSystemRule(AutomaticZenRule rule) {
        return rule.getOwner() != null
                && ZenModeConfig.SYSTEM_AUTHORITY.equals(rule.getOwner().getPackageName());
    }

    private ServiceInfo getServiceInfo(ComponentName owner) {
    private ServiceInfo getServiceInfo(ComponentName owner) {
        Intent queryIntent = new Intent();
        Intent queryIntent = new Intent();
        queryIntent.setComponent(owner);
        queryIntent.setComponent(owner);
+66 −0
Original line number Original line Diff line number Diff line
@@ -312,6 +312,7 @@ public class NotificationManagerServiceTest extends UiServiceTestCase {
    private static class TestableNotificationManagerService extends NotificationManagerService {
    private static class TestableNotificationManagerService extends NotificationManagerService {
        int countSystemChecks = 0;
        int countSystemChecks = 0;
        boolean isSystemUid = true;
        boolean isSystemUid = true;
        boolean isSystemAppId = true;
        int countLogSmartSuggestionsVisible = 0;
        int countLogSmartSuggestionsVisible = 0;
        // If true, don't enqueue the PostNotificationRunnables, just trap them
        // If true, don't enqueue the PostNotificationRunnables, just trap them
        boolean trapEnqueuedNotifications = false;
        boolean trapEnqueuedNotifications = false;
@@ -341,6 +342,12 @@ public class NotificationManagerServiceTest extends UiServiceTestCase {
            return isSystemUid;
            return isSystemUid;
        }
        }


        @Override
        protected boolean isCallingAppIdSystem() {
            countSystemChecks++;
            return isSystemUid || isSystemAppId;
        }

        @Override
        @Override
        protected boolean isCallerSystemOrPhone() {
        protected boolean isCallerSystemOrPhone() {
            countSystemChecks++;
            countSystemChecks++;
@@ -5957,6 +5964,65 @@ public class NotificationManagerServiceTest extends UiServiceTestCase {
        mBinderService.addAutomaticZenRule(rule, mContext.getPackageName());
        mBinderService.addAutomaticZenRule(rule, mContext.getPackageName());
    }
    }


    @Test
    public void testAddAutomaticZenRule_systemCallTakesPackageFromOwner() throws Exception {
        mService.isSystemUid = true;
        ZenModeHelper mockZenModeHelper = mock(ZenModeHelper.class);
        when(mConditionProviders.isPackageOrComponentAllowed(anyString(), anyInt()))
                .thenReturn(true);
        mService.setZenHelper(mockZenModeHelper);
        ComponentName owner = new ComponentName("android", "ProviderName");
        ZenPolicy zenPolicy = new ZenPolicy.Builder().allowAlarms(true).build();
        boolean isEnabled = true;
        AutomaticZenRule rule = new AutomaticZenRule("test", owner, owner, mock(Uri.class),
                zenPolicy, NotificationManager.INTERRUPTION_FILTER_PRIORITY, isEnabled);
        mBinderService.addAutomaticZenRule(rule, "com.android.settings");

        // verify that zen mode helper gets passed in a package name of "android"
        verify(mockZenModeHelper).addAutomaticZenRule(eq("android"), eq(rule), anyString());
    }

    @Test
    public void testAddAutomaticZenRule_systemAppIdCallTakesPackageFromOwner() throws Exception {
        // The multi-user case: where the calling uid doesn't match the system uid, but the calling
        // *appid* is the system.
        mService.isSystemUid = false;
        mService.isSystemAppId = true;
        ZenModeHelper mockZenModeHelper = mock(ZenModeHelper.class);
        when(mConditionProviders.isPackageOrComponentAllowed(anyString(), anyInt()))
                .thenReturn(true);
        mService.setZenHelper(mockZenModeHelper);
        ComponentName owner = new ComponentName("android", "ProviderName");
        ZenPolicy zenPolicy = new ZenPolicy.Builder().allowAlarms(true).build();
        boolean isEnabled = true;
        AutomaticZenRule rule = new AutomaticZenRule("test", owner, owner, mock(Uri.class),
                zenPolicy, NotificationManager.INTERRUPTION_FILTER_PRIORITY, isEnabled);
        mBinderService.addAutomaticZenRule(rule, "com.android.settings");

        // verify that zen mode helper gets passed in a package name of "android"
        verify(mockZenModeHelper).addAutomaticZenRule(eq("android"), eq(rule), anyString());
    }

    @Test
    public void testAddAutomaticZenRule_nonSystemCallTakesPackageFromArg() throws Exception {
        mService.isSystemUid = false;
        mService.isSystemAppId = false;
        ZenModeHelper mockZenModeHelper = mock(ZenModeHelper.class);
        when(mConditionProviders.isPackageOrComponentAllowed(anyString(), anyInt()))
                .thenReturn(true);
        mService.setZenHelper(mockZenModeHelper);
        ComponentName owner = new ComponentName("android", "ProviderName");
        ZenPolicy zenPolicy = new ZenPolicy.Builder().allowAlarms(true).build();
        boolean isEnabled = true;
        AutomaticZenRule rule = new AutomaticZenRule("test", owner, owner, mock(Uri.class),
                zenPolicy, NotificationManager.INTERRUPTION_FILTER_PRIORITY, isEnabled);
        mBinderService.addAutomaticZenRule(rule, "another.package");

        // verify that zen mode helper gets passed in the package name from the arg, not the owner
        verify(mockZenModeHelper).addAutomaticZenRule(
                eq("another.package"), eq(rule), anyString());
    }

    @Test
    @Test
    public void testAreNotificationsEnabledForPackage_crossUser() throws Exception {
    public void testAreNotificationsEnabledForPackage_crossUser() throws Exception {
        try {
        try {
+30 −0
Original line number Original line Diff line number Diff line
@@ -1635,6 +1635,36 @@ public class ZenModeHelperTest extends UiServiceTestCase {
        }
        }
    }
    }


    @Test
    public void testAddAutomaticZenRule_claimedSystemOwner() {
        // Make sure anything that claims to have a "system" owner but not actually part of the
        // system package still gets limited on number of rules
        for (int i = 0; i < RULE_LIMIT_PER_PACKAGE; i++) {
            ScheduleInfo si = new ScheduleInfo();
            si.startHour = i;
            AutomaticZenRule zenRule = new AutomaticZenRule("name" + i,
                    new ComponentName("android", "ScheduleConditionProvider" + i),
                    null, // configuration activity
                    ZenModeConfig.toScheduleConditionId(si),
                    new ZenPolicy.Builder().build(),
                    NotificationManager.INTERRUPTION_FILTER_PRIORITY, true);
            String id = mZenModeHelperSpy.addAutomaticZenRule("pkgname", zenRule, "test");
            assertNotNull(id);
        }
        try {
            AutomaticZenRule zenRule = new AutomaticZenRule("name",
                    new ComponentName("android", "ScheduleConditionProviderFinal"),
                    null, // configuration activity
                    ZenModeConfig.toScheduleConditionId(new ScheduleInfo()),
                    new ZenPolicy.Builder().build(),
                    NotificationManager.INTERRUPTION_FILTER_PRIORITY, true);
            String id = mZenModeHelperSpy.addAutomaticZenRule("pkgname", zenRule, "test");
            fail("allowed too many rules to be created");
        } catch (IllegalArgumentException e) {
            // yay
        }
    }

    private void setupZenConfig() {
    private void setupZenConfig() {
        mZenModeHelperSpy.mZenMode = ZEN_MODE_IMPORTANT_INTERRUPTIONS;
        mZenModeHelperSpy.mZenMode = ZEN_MODE_IMPORTANT_INTERRUPTIONS;
        mZenModeHelperSpy.mConfig.allowAlarms = false;
        mZenModeHelperSpy.mConfig.allowAlarms = false;