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

Commit a9677845 authored by TreeHugger Robot's avatar TreeHugger Robot Committed by Android (Google) Code Review
Browse files

Merge "Allow an app to see its installing package."

parents 9238bda5 a547c5c6
Loading
Loading
Loading
Loading
+23 −5
Original line number Diff line number Diff line
@@ -213,6 +213,25 @@ public class AppsFilter {
        return false;
    }

    private static boolean canQueryViaPackage(AndroidPackage querying,
            AndroidPackage potentialTarget) {
        return querying.getQueriesPackages() != null
                && querying.getQueriesPackages().contains(potentialTarget.getPackageName());
    }

    private static boolean canQueryAsInstaller(PackageSetting querying,
            AndroidPackage potentialTarget) {
        final InstallSource installSource = querying.installSource;
        if (potentialTarget.getPackageName().equals(installSource.installerPackageName)) {
            return true;
        }
        if (!installSource.isInitiatingPackageUninstalled
                && potentialTarget.getPackageName().equals(installSource.initiatingPackageName)) {
            return true;
        }
        return false;
    }

    private static boolean matches(Intent intent, AndroidPackage potentialTarget) {
        for (int p = ArrayUtils.size(potentialTarget.getProviders()) - 1; p >= 0; p--) {
            ParsedProvider provider = potentialTarget.getProviders().get(p);
@@ -331,8 +350,8 @@ public class AppsFilter {
                    if (canQueryViaIntent(existingPkg, newPkg)) {
                        mQueriesViaIntent.add(existingSetting.appId, newPkgSetting.appId);
                    }
                    if (existingPkg.getQueriesPackages() != null
                            && existingPkg.getQueriesPackages().contains(newPkg.getPackageName())) {
                    if (canQueryViaPackage(existingPkg, newPkg)
                            || canQueryAsInstaller(existingSetting, newPkg)) {
                        mQueriesViaPackage.add(existingSetting.appId, newPkgSetting.appId);
                    }
                }
@@ -341,8 +360,8 @@ public class AppsFilter {
                    if (canQueryViaIntent(newPkg, existingPkg)) {
                        mQueriesViaIntent.add(newPkgSetting.appId, existingSetting.appId);
                    }
                    if (newPkg.getQueriesPackages() != null
                            && newPkg.getQueriesPackages().contains(existingPkg.getPackageName())) {
                    if (canQueryViaPackage(newPkg, existingPkg)
                            || canQueryAsInstaller(newPkgSetting, existingPkg)) {
                        mQueriesViaPackage.add(newPkgSetting.appId, existingSetting.appId);
                    }
                }
@@ -535,7 +554,6 @@ public class AppsFilter {
            try {
                Trace.beginSection("mQueriesViaPackage");
                if (mQueriesViaPackage.contains(callingAppId, targetAppId)) {
                    // the calling package has explicitly declared the target package; allow
                    if (DEBUG_LOGGING) {
                        log(callingSetting, targetPkgSetting, "queries package");
                    }
+1 −0
Original line number Diff line number Diff line
@@ -13494,6 +13494,7 @@ public class PackageManagerService extends IPackageManager.Stub
            // Okay!
            targetPackageSetting.setInstallerPackageName(installerPackageName);
            mSettings.addInstallerPackageNames(targetPackageSetting.installSource);
            mAppsFilter.addPackage(targetPackageSetting, mSettings.mPackages);
            scheduleWriteSettingsLocked();
        }
    }
+64 −1
Original line number Diff line number Diff line
@@ -51,7 +51,6 @@ import org.mockito.Mock;
import org.mockito.MockitoAnnotations;

import java.util.Collections;
import java.util.List;
import java.util.Map;
import java.util.Set;

@@ -511,6 +510,62 @@ public class AppsFilterTest {
                overlaySetting, 0));
    }

    @Test
    public void testInitiatingApp_DoesntFilter() {
        final AppsFilter appsFilter =
                new AppsFilter(mFeatureConfigMock, new String[]{}, false, null);
        appsFilter.onSystemReady();

        PackageSetting target = simulateAddPackage(appsFilter, pkg("com.some.package"),
                DUMMY_TARGET_UID);
        PackageSetting calling = simulateAddPackage(appsFilter, pkg("com.some.other.package"),
                DUMMY_CALLING_UID, withInstallSource(target.name, null, null, false));

        assertFalse(appsFilter.shouldFilterApplication(DUMMY_CALLING_UID, calling, target, 0));
    }

    @Test
    public void testUninstalledInitiatingApp_Filters() {
        final AppsFilter appsFilter =
                new AppsFilter(mFeatureConfigMock, new String[]{}, false, null);
        appsFilter.onSystemReady();

        PackageSetting target = simulateAddPackage(appsFilter, pkg("com.some.package"),
                DUMMY_TARGET_UID);
        PackageSetting calling = simulateAddPackage(appsFilter, pkg("com.some.other.package"),
                DUMMY_CALLING_UID, withInstallSource(target.name, null, null, true));

        assertTrue(appsFilter.shouldFilterApplication(DUMMY_CALLING_UID, calling, target, 0));
    }

    @Test
    public void testOriginatingApp_Filters() {
        final AppsFilter appsFilter =
                new AppsFilter(mFeatureConfigMock, new String[]{}, false, null);
        appsFilter.onSystemReady();

        PackageSetting target = simulateAddPackage(appsFilter, pkg("com.some.package"),
                DUMMY_TARGET_UID);
        PackageSetting calling = simulateAddPackage(appsFilter, pkg("com.some.other.package"),
                DUMMY_CALLING_UID, withInstallSource(null, target.name, null, false));

        assertTrue(appsFilter.shouldFilterApplication(DUMMY_CALLING_UID, calling, target, 0));
    }

    @Test
    public void testInstallingApp_DoesntFilter() {
        final AppsFilter appsFilter =
                new AppsFilter(mFeatureConfigMock, new String[]{}, false, null);
        appsFilter.onSystemReady();

        PackageSetting target = simulateAddPackage(appsFilter, pkg("com.some.package"),
                DUMMY_TARGET_UID);
        PackageSetting calling = simulateAddPackage(appsFilter, pkg("com.some.other.package"),
                DUMMY_CALLING_UID, withInstallSource(null, null, target.name, false));

        assertFalse(appsFilter.shouldFilterApplication(DUMMY_CALLING_UID, calling, target, 0));
    }

    private interface WithSettingBuilder {
        PackageSettingBuilder withBuilder(PackageSettingBuilder builder);
    }
@@ -538,5 +593,13 @@ public class AppsFilterTest {
        return setting;
    }

    private WithSettingBuilder withInstallSource(String initiatingPackageName,
            String originatingPackageName, String installerPackageName,
            boolean isInitiatingPackageUninstalled) {
        final InstallSource installSource = InstallSource.create(initiatingPackageName,
                originatingPackageName, installerPackageName,
                /* isOrphaned= */ false, isInitiatingPackageUninstalled);
        return setting -> setting.setInstallSource(installSource);
    }
}
+9 −0
Original line number Diff line number Diff line
@@ -41,6 +41,7 @@ public class PackageSettingBuilder {
    private SparseArray<PackageUserState> mUserStates = new SparseArray<>();
    private AndroidPackage mPkg;
    private int mAppId;
    private InstallSource mInstallSource;

    public PackageSettingBuilder setPackage(AndroidPackage pkg) {
        this.mPkg = pkg;
@@ -137,6 +138,11 @@ public class PackageSettingBuilder {
        return this;
    }

    public PackageSettingBuilder setInstallSource(InstallSource installSource) {
        mInstallSource = installSource;
        return this;
    }

    public PackageSetting build() {
        final PackageSetting packageSetting = new PackageSetting(mName, mRealName,
                new File(mCodePath), new File(mResourcePath),
@@ -146,6 +152,9 @@ public class PackageSettingBuilder {
        packageSetting.pkg = mPkg;
        packageSetting.appId = mAppId;
        packageSetting.volumeUuid = this.mVolumeUuid;
        if (mInstallSource != null) {
            packageSetting.installSource = mInstallSource;
        }
        for (int i = 0; i < mUserStates.size(); i++) {
            packageSetting.setUserState(mUserStates.keyAt(i), mUserStates.valueAt(i));
        }