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

Commit 60efeb64 authored by Artem Iglikov's avatar Artem Iglikov
Browse files

DO NOT MERGE Add list of approved services in addApprovedList

... instead of replacing it. I.e., do what the method name claims to do
in order to fix restoring. Otherwise during restore the list of
components is getting set to the list of the components from backup set,
i.e., list of pre-approved components is lost.

Bug: 77630371
Test: with a backup set for package "android" created with LocalTransport run (also see the bug) adb root && adb shell bmgr enable true && adb shell bmgr transport android/com.android.internal.backup.LocalTransport && adb shell bmgr backupnow android && adb shell rm -rf /cache/backup/1/_delta/android/ && adb push android /cache/backup/1/_delta/ && adb shell cat /data/system/notification_policy.xml | grep enabled_listeners -C 5 && adb shell bmgr restore 1 android && adb shell cat /data/system/notification_policy.xml | grep enabled_listeners -C 5
Test: atest FrameworksUiServicesTests
Change-Id: Ic201d868bdb003fcac12876ab55f4992edb866e3
parent 54e0be0d
Loading
Loading
Loading
Loading
+7 −4
Original line number Original line Diff line number Diff line
@@ -71,9 +71,7 @@ import java.util.ArrayList;
import java.util.Arrays;
import java.util.Arrays;
import java.util.HashSet;
import java.util.HashSet;
import java.util.List;
import java.util.List;
import java.util.Objects;
import java.util.Set;
import java.util.Set;
import java.util.stream.Collectors;


/**
/**
 * Manages the lifecycle of application-provided services bound by system server.
 * Manages the lifecycle of application-provided services bound by system server.
@@ -401,15 +399,20 @@ abstract public class ManagedServices {
            approvedByType = new ArrayMap<>();
            approvedByType = new ArrayMap<>();
            mApproved.put(userId, approvedByType);
            mApproved.put(userId, approvedByType);
        }
        }

        ArraySet<String> approvedList = approvedByType.get(isPrimary);
        if (approvedList == null) {
            approvedList = new ArraySet<>();
            approvedByType.put(isPrimary, approvedList);
        }

        String[] approvedArray = approved.split(ENABLED_SERVICES_SEPARATOR);
        String[] approvedArray = approved.split(ENABLED_SERVICES_SEPARATOR);
        final ArraySet<String> approvedList = new ArraySet<>();
        for (String pkgOrComponent : approvedArray) {
        for (String pkgOrComponent : approvedArray) {
            String approvedItem = getApprovedValue(pkgOrComponent);
            String approvedItem = getApprovedValue(pkgOrComponent);
            if (approvedItem != null) {
            if (approvedItem != null) {
                approvedList.add(approvedItem);
                approvedList.add(approvedItem);
            }
            }
        }
        }
        approvedByType.put(isPrimary, approvedList);
    }
    }


    protected boolean isComponentEnabledForPackage(String pkg) {
    protected boolean isComponentEnabledForPackage(String pkg) {
+26 −0
Original line number Original line Diff line number Diff line
@@ -266,6 +266,32 @@ public class ManagedServicesTest extends UiServiceTestCase {
        }
        }
    }
    }


    @Test
    public void testReadXml_appendsListOfApprovedComponents() throws Exception {
        for (int approvalLevel : new int[] {APPROVAL_BY_COMPONENT, APPROVAL_BY_PACKAGE}) {
            ManagedServices service = new TestManagedServices(getContext(), mLock, mUserProfiles,
                    mIpm, approvalLevel);

            String preApprovedPackage = "some.random.package";
            String preApprovedComponent = "some.random.package/C1";

            List<String> packages = new ArrayList<>();
            packages.add(preApprovedPackage);
            addExpectedServices(service, packages, 0);

            service.setPackageOrComponentEnabled(preApprovedComponent, 0, true, true);

            loadXml(service);

            verifyExpectedApprovedEntries(service);

            String verifyValue  = (approvalLevel == APPROVAL_BY_COMPONENT)
                    ? preApprovedComponent
                    : preApprovedPackage;
            assertTrue(service.isPackageOrComponentAllowed(verifyValue, 0));
        }
    }

    @Test
    @Test
    public void testWriteXml_trimsMissingServices() throws Exception {
    public void testWriteXml_trimsMissingServices() throws Exception {
        for (int approvalLevel : new int[] {APPROVAL_BY_COMPONENT, APPROVAL_BY_PACKAGE}) {
        for (int approvalLevel : new int[] {APPROVAL_BY_COMPONENT, APPROVAL_BY_PACKAGE}) {