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

Commit 02b6addb authored by Alexandra Gherghina's avatar Alexandra Gherghina Committed by Android (Google) Code Review
Browse files

Merge "Remove package level intent forwarding." into lmp-dev

parents 91f49ed1 e107c3eb
Loading
Loading
Loading
Loading
+0 −24
Original line number Diff line number Diff line
@@ -1642,30 +1642,6 @@ final class ApplicationPackageManager extends PackageManager {
        }
    }

    /**
     * @hide
     */
    public void addCrossProfileIntentsForPackage(String packageName,
            int sourceUserId, int targetUserId) {
        try {
            mPM.addCrossProfileIntentsForPackage(packageName, sourceUserId, targetUserId);
        } catch (RemoteException e) {
            // Should never happen!
        }
    }

    /**
     * @hide
     */
    public void removeCrossProfileIntentsForPackage(String packageName,
            int sourceUserId, int targetUserId) {
        try {
            mPM.removeCrossProfileIntentsForPackage(packageName, sourceUserId, targetUserId);
        } catch (RemoteException e) {
            // Should never happen!
        }
    }

    /**
     * @hide
     */
+0 −6
Original line number Diff line number Diff line
@@ -259,12 +259,6 @@ interface IPackageManager {
    void addCrossProfileIntentFilter(in IntentFilter intentFilter, String ownerPackage,
            int ownerUserId, int sourceUserId, int targetUserId, int flags);

    void addCrossProfileIntentsForPackage(in String packageName, int sourceUserId,
            int targetUserId);

    void removeCrossProfileIntentsForPackage(String packageName, int sourceUserId,
            int targetUserId);

    void clearCrossProfileIntentFilters(int sourceUserId, String ownerPackage, int ownerUserId);

    /**
+0 −16
Original line number Diff line number Diff line
@@ -3892,22 +3892,6 @@ public abstract class PackageManager {
     */
    public abstract void clearCrossProfileIntentFilters(int sourceUserId);

    /**
     * Forwards all intents for {@link packageName} for user {@link sourceUserId} to user
     * {@link targetUserId}.
     * @hide
     */
    public abstract void addCrossProfileIntentsForPackage(String packageName,
            int sourceUserId, int targetUserId);

    /**
     * Removes all intents for {@link packageName} for user {@link sourceUserId} to user
     * {@link targetUserId}.
     * @hide
     */
    public abstract void removeCrossProfileIntentsForPackage(String packageName,
            int sourceUserId, int targetUserId);

    /**
     * @hide
     */
+1 −104
Original line number Diff line number Diff line
@@ -3183,24 +3183,6 @@ public class PackageManagerService extends IPackageManager.Stub {
                if (matches.get(i).getTargetUserId() == targetUserId) return true;
            }
        }
        ArrayList<String> packageNames = null;
        SparseArray<ArrayList<String>> fromSource =
                mSettings.mCrossProfilePackageInfo.get(sourceUserId);
        if (fromSource != null) {
            packageNames = fromSource.get(targetUserId);
            if (packageNames != null) {
                // We need the package name, so we try to resolve with the loosest flags possible
                List<ResolveInfo> resolveInfos = mActivities.queryIntent(intent, resolvedType,
                        PackageManager.GET_UNINSTALLED_PACKAGES, targetUserId);
                int count = resolveInfos.size();
                for (int i = 0; i < count; i++) {
                    ResolveInfo resolveInfo = resolveInfos.get(i);
                    if (packageNames.contains(resolveInfo.activityInfo.packageName)) {
                        return true;
                    }
                }
            }
        }
        return false;
    }
@@ -3241,20 +3223,10 @@ public class PackageManagerService extends IPackageManager.Stub {
        synchronized (mPackages) {
            final String pkgName = intent.getPackage();
            if (pkgName == null) {
                ResolveInfo resolveInfo = null;
                // Check if the intent needs to be forwarded to another user for this package
                ArrayList<ResolveInfo> crossProfileResult =
                        queryIntentActivitiesCrossProfilePackage(
                                intent, resolvedType, flags, userId);
                if (!crossProfileResult.isEmpty()) {
                    // Skip the current profile
                    return crossProfileResult;
                }
                List<CrossProfileIntentFilter> matchingFilters =
                        getMatchingCrossProfileIntentFilters(intent, resolvedType, userId);
                // Check for results that need to skip the current profile.
                resolveInfo = querySkipCurrentProfileIntents(matchingFilters, intent,
                ResolveInfo resolveInfo  = querySkipCurrentProfileIntents(matchingFilters, intent,
                        resolvedType, flags, userId);
                if (resolveInfo != null) {
                    List<ResolveInfo> result = new ArrayList<ResolveInfo>(1);
@@ -3276,13 +3248,6 @@ public class PackageManagerService extends IPackageManager.Stub {
            }
            final PackageParser.Package pkg = mPackages.get(pkgName);
            if (pkg != null) {
                ArrayList<ResolveInfo> crossProfileResult =
                        queryIntentActivitiesCrossProfilePackage(
                                intent, resolvedType, flags, userId, pkg, pkgName);
                if (!crossProfileResult.isEmpty()) {
                    // Skip the current profile
                    return crossProfileResult;
                }
                return mActivities.queryIntentForPackage(intent, resolvedType, flags,
                        pkg.activities, userId);
            }
@@ -3311,56 +3276,6 @@ public class PackageManagerService extends IPackageManager.Stub {
        return null;
    }
    private ArrayList<ResolveInfo> queryIntentActivitiesCrossProfilePackage(
            Intent intent, String resolvedType, int flags, int userId) {
        ArrayList<ResolveInfo> matchingResolveInfos = new ArrayList<ResolveInfo>();
        SparseArray<ArrayList<String>> sourceForwardingInfo =
                mSettings.mCrossProfilePackageInfo.get(userId);
        if (sourceForwardingInfo != null) {
            int NI = sourceForwardingInfo.size();
            for (int i = 0; i < NI; i++) {
                int targetUserId = sourceForwardingInfo.keyAt(i);
                ArrayList<String> packageNames = sourceForwardingInfo.valueAt(i);
                List<ResolveInfo> resolveInfos = mActivities.queryIntent(
                        intent, resolvedType, flags, targetUserId);
                int NJ = resolveInfos.size();
                for (int j = 0; j < NJ; j++) {
                    ResolveInfo resolveInfo = resolveInfos.get(j);
                    if (packageNames.contains(resolveInfo.activityInfo.packageName)) {
                        matchingResolveInfos.add(createForwardingResolveInfo(
                                resolveInfo.filter, userId, targetUserId));
                    }
                }
            }
        }
        return matchingResolveInfos;
    }
    private ArrayList<ResolveInfo> queryIntentActivitiesCrossProfilePackage(
            Intent intent, String resolvedType, int flags, int userId, PackageParser.Package pkg,
            String packageName) {
        ArrayList<ResolveInfo> matchingResolveInfos = new ArrayList<ResolveInfo>();
        SparseArray<ArrayList<String>> sourceForwardingInfo =
                mSettings.mCrossProfilePackageInfo.get(userId);
        if (sourceForwardingInfo != null) {
            int NI = sourceForwardingInfo.size();
            for (int i = 0; i < NI; i++) {
                int targetUserId = sourceForwardingInfo.keyAt(i);
                if (sourceForwardingInfo.valueAt(i).contains(packageName)) {
                    List<ResolveInfo> resolveInfos = mActivities.queryIntentForPackage(
                            intent, resolvedType, flags, pkg.activities, targetUserId);
                    int NJ = resolveInfos.size();
                    for (int j = 0; j < NJ; j++) {
                        ResolveInfo resolveInfo = resolveInfos.get(j);
                        matchingResolveInfos.add(createForwardingResolveInfo(
                                resolveInfo.filter, userId, targetUserId));
                    }
                }
            }
        }
        return matchingResolveInfos;
    }
    // Return matching ResolveInfo if any for skip current profile intent filters.
    private ResolveInfo queryCrossProfileIntents(
            List<CrossProfileIntentFilter> matchingFilters, Intent intent, String resolvedType,
@@ -11658,24 +11573,6 @@ public class PackageManagerService extends IPackageManager.Stub {
        }
    }
    @Override
    public void addCrossProfileIntentsForPackage(String packageName,
            int sourceUserId, int targetUserId) {
        mContext.enforceCallingOrSelfPermission(
                        android.Manifest.permission.INTERACT_ACROSS_USERS_FULL, null);
        mSettings.addCrossProfilePackage(packageName, sourceUserId, targetUserId);
        mSettings.writePackageRestrictionsLPr(sourceUserId);
    }
    @Override
    public void removeCrossProfileIntentsForPackage(String packageName,
            int sourceUserId, int targetUserId) {
        mContext.enforceCallingOrSelfPermission(
                        android.Manifest.permission.INTERACT_ACROSS_USERS_FULL, null);
        mSettings.removeCrossProfilePackage(packageName, sourceUserId, targetUserId);
        mSettings.writePackageRestrictionsLPr(sourceUserId);
    }
    @Override
    public void clearCrossProfileIntentFilters(int sourceUserId, String ownerPackage,
            int ownerUserId) {
+0 −168
Original line number Diff line number Diff line
@@ -36,7 +36,6 @@ import android.os.FileUtils;
import android.os.PatternMatcher;
import android.os.Process;
import android.os.UserHandle;
import android.os.UserManager;
import android.util.LogPrinter;

import com.android.internal.util.FastXmlSerializer;
@@ -138,10 +137,6 @@ final class Settings {
            "persistent-preferred-activities";
    static final String TAG_CROSS_PROFILE_INTENT_FILTERS =
            "crossProfile-intent-filters";
    private static final String TAG_CROSS_PROFILE_PACKAGE_INFO = "cross-profile-package-info";
    private static final String CROSS_PROFILE_PACKAGE_INFO_ATTR_TARGET_USER_ID = "target-user-id";
    private static final String CROSS_PROFILE_PACKAGE_INFO_TAG_PACKAGE_NAME = "package-name";
    private static final String CROSS_PROFILE_PACKAGE_INFO_ATTR_PACKAGE_NAME = "value";

    private static final String ATTR_NAME = "name";
    private static final String ATTR_USER = "user";
@@ -249,23 +244,15 @@ final class Settings {
     */
    private final ArrayList<PendingPackage> mPendingPackages = new ArrayList<PendingPackage>();

    private final Context mContext;

    private final File mSystemDir;

    public final KeySetManagerService mKeySetManagerService = new KeySetManagerService(mPackages);

    // A mapping of (sourceUserId, targetUserId, packageNames) for forwarding the intents of a
    // package.
    final SparseArray<SparseArray<ArrayList<String>>>
            mCrossProfilePackageInfo = new SparseArray<SparseArray<ArrayList<String>>>();

    Settings(Context context) {
        this(context, Environment.getDataDirectory());
    }

    Settings(Context context, File dataDir) {
        mContext = context;
        mSystemDir = new File(dataDir, "system");
        mSystemDir.mkdirs();
        FileUtils.setPermissions(mSystemDir.toString(),
@@ -282,47 +269,6 @@ final class Settings {
        mBackupStoppedPackagesFilename = new File(mSystemDir, "packages-stopped-backup.xml");
    }

    public void addCrossProfilePackage(
            String packageName, int sourceUserId, int targetUserId) {
        synchronized(mCrossProfilePackageInfo) {
            SparseArray<ArrayList<String>> sourceForwardingInfo =
                    mCrossProfilePackageInfo.get(sourceUserId);
            if (sourceForwardingInfo == null) {
                sourceForwardingInfo = new SparseArray<ArrayList<String>>();
                mCrossProfilePackageInfo.put(sourceUserId, sourceForwardingInfo);
            }
            ArrayList<String> packageNames = sourceForwardingInfo.get(targetUserId);
            if (packageNames == null) {
                packageNames = new ArrayList<String>();
                sourceForwardingInfo.put(targetUserId, packageNames);
            }
            if (!packageNames.contains(packageName)) {
                packageNames.add(packageName);
            }
        }
    }

    public void removeCrossProfilePackage(
            String packageName, int sourceUserId, int targetUserId) {
        synchronized(mCrossProfilePackageInfo) {
            SparseArray<ArrayList<String>> sourceForwardingInfo =
                    mCrossProfilePackageInfo.get(sourceUserId);
            if (sourceForwardingInfo == null) {
                return;
            }
            ArrayList<String> packageNames = sourceForwardingInfo.get(targetUserId);
            if (packageNames != null && packageNames.contains(packageName)) {
                packageNames.remove(packageName);
                if (packageNames.isEmpty()) {
                    sourceForwardingInfo.remove(targetUserId);
                    if (sourceForwardingInfo.size() == 0) {
                        mCrossProfilePackageInfo.remove(sourceUserId);
                    }
                }
            }
        }
    }

    PackageSetting getPackageLPw(PackageParser.Package pkg, PackageSetting origPackage,
            String realName, SharedUserSetting sharedUser, File codePath, File resourcePath,
            String legacyNativeLibraryPathString, String primaryCpuAbi, String secondaryCpuAbi,
@@ -1068,68 +1014,6 @@ final class Settings {
        }
    }

    private void readCrossProfilePackageInfoLPw(XmlPullParser parser, int userId)
            throws XmlPullParserException, IOException {
        int outerDepth = parser.getDepth();
        int type;
        while ((type = parser.next()) != XmlPullParser.END_DOCUMENT
                && (type != XmlPullParser.END_TAG || parser.getDepth() > outerDepth)) {
            if (type == XmlPullParser.END_TAG || type == XmlPullParser.TEXT) {
                continue;
            }
            String tagName = parser.getName();
            if (tagName.equals(TAG_ITEM)) {
                String targetUserIdString = parser.getAttributeValue(null,
                        CROSS_PROFILE_PACKAGE_INFO_ATTR_TARGET_USER_ID);
                if (targetUserIdString == null) {
                    String msg = "Missing element under " + TAG +": "
                            + CROSS_PROFILE_PACKAGE_INFO_ATTR_TARGET_USER_ID + " at " +
                            parser.getPositionDescription();
                    PackageManagerService.reportSettingsProblem(Log.WARN, msg);
                    continue;
                }
                int targetUserId = Integer.parseInt(targetUserIdString);
                readCrossProfilePackageInfoForTargetLPw(parser, userId, targetUserId);
            } else {
                String msg = "Unknown element under " +  TAG_CROSS_PROFILE_PACKAGE_INFO + ": " +
                        parser.getName();
                PackageManagerService.reportSettingsProblem(Log.WARN, msg);
                XmlUtils.skipCurrentTag(parser);
            }
        }
    }

    private void readCrossProfilePackageInfoForTargetLPw(
            XmlPullParser parser, int sourceUserId, int targetUserId)
            throws XmlPullParserException, IOException {
        int outerDepth = parser.getDepth();
        int type;
        while ((type = parser.next()) != XmlPullParser.END_DOCUMENT
                && (type != XmlPullParser.END_TAG || parser.getDepth() > outerDepth)) {
            if (type == XmlPullParser.END_TAG || type == XmlPullParser.TEXT) {
                continue;
            }
            String tagName = parser.getName();
            if (tagName.equals(CROSS_PROFILE_PACKAGE_INFO_TAG_PACKAGE_NAME)) {
                String packageName = parser.getAttributeValue(
                        null, CROSS_PROFILE_PACKAGE_INFO_ATTR_PACKAGE_NAME);
                if (packageName == null) {
                    String msg = "Missing element under " + TAG +": "
                            + CROSS_PROFILE_PACKAGE_INFO_TAG_PACKAGE_NAME + " at " +
                            parser.getPositionDescription();
                    PackageManagerService.reportSettingsProblem(Log.WARN, msg);
                    continue;
                }
                addCrossProfilePackage(packageName, sourceUserId, targetUserId);
            } else {
                String msg = "Unknown element under " +  TAG_ITEM + ": " +
                        parser.getName();
                PackageManagerService.reportSettingsProblem(Log.WARN, msg);
                XmlUtils.skipCurrentTag(parser);
            }
        }
    }

    void readPackageRestrictionsLPr(int userId) {
        if (DEBUG_MU) {
            Log.i(TAG, "Reading package restrictions for user=" + userId);
@@ -1271,8 +1155,6 @@ final class Settings {
                    readPersistentPreferredActivitiesLPw(parser, userId);
                } else if (tagName.equals(TAG_CROSS_PROFILE_INTENT_FILTERS)) {
                    readCrossProfileIntentFiltersLPw(parser, userId);
                } else if (tagName.equals(TAG_CROSS_PROFILE_PACKAGE_INFO)){
                    readCrossProfilePackageInfoLPw(parser, userId);
                } else {
                    Slog.w(PackageManagerService.TAG, "Unknown element under <stopped-packages>: "
                          + parser.getName());
@@ -1364,32 +1246,6 @@ final class Settings {
        serializer.endTag(null, TAG_CROSS_PROFILE_INTENT_FILTERS);
    }

    void writeCrossProfilePackageInfoLPr(XmlSerializer serializer, int userId)
            throws IllegalArgumentException, IllegalStateException, IOException {
        SparseArray<ArrayList<String>> sourceForwardingInfo = mCrossProfilePackageInfo.get(userId);
        if (sourceForwardingInfo == null) {
            return;
        }
        serializer.startTag(null, TAG_CROSS_PROFILE_PACKAGE_INFO);
        int NI = sourceForwardingInfo.size();
        for (int i = 0; i < NI; i++) {
            int targetUserId = sourceForwardingInfo.keyAt(i);
            ArrayList<String> packageNames = sourceForwardingInfo.valueAt(i);
            serializer.startTag(null, TAG_ITEM);
            serializer.attribute(null, CROSS_PROFILE_PACKAGE_INFO_ATTR_TARGET_USER_ID,
                    Integer.toString(targetUserId));
            int NJ = packageNames.size();
            for (int j = 0; j < NJ; j++) {
                serializer.startTag(null, CROSS_PROFILE_PACKAGE_INFO_TAG_PACKAGE_NAME);
                serializer.attribute(null, CROSS_PROFILE_PACKAGE_INFO_ATTR_PACKAGE_NAME,
                        packageNames.get(j));
                serializer.endTag(null, CROSS_PROFILE_PACKAGE_INFO_TAG_PACKAGE_NAME);
            }
            serializer.endTag(null, TAG_ITEM);
        }
        serializer.endTag(null, TAG_CROSS_PROFILE_PACKAGE_INFO);
    }

    void writePackageRestrictionsLPr(int userId) {
        if (DEBUG_MU) {
            Log.i(TAG, "Writing package restrictions for user=" + userId);
@@ -1494,8 +1350,6 @@ final class Settings {

            writeCrossProfileIntentFiltersLPr(serializer, userId);

            writeCrossProfilePackageInfoLPr(serializer, userId);

            serializer.endTag(null, TAG_PACKAGE_RESTRICTIONS);

            serializer.endDocument();
@@ -3180,7 +3034,6 @@ final class Settings {
        file = getUserPackagesStateBackupFile(userId);
        file.delete();
        removeCrossProfileIntentFiltersLPw(userId);
        removeCrossProfilePackagesLPw(userId);
    }

    void removeCrossProfileIntentFiltersLPw(int userId) {
@@ -3211,27 +3064,6 @@ final class Settings {
        }
    }

    public void removeCrossProfilePackagesLPw(int userId) {
        synchronized(mCrossProfilePackageInfo) {
            // userId is the source user
            if (mCrossProfilePackageInfo.get(userId) != null) {
                mCrossProfilePackageInfo.remove(userId);
                writePackageRestrictionsLPr(userId);
            }
            // userId is the target user
            int count = mCrossProfilePackageInfo.size();
            for (int i = 0; i < count; i++) {
                int sourceUserId = mCrossProfilePackageInfo.keyAt(i);
                SparseArray<ArrayList<String>> sourceForwardingInfo =
                        mCrossProfilePackageInfo.valueAt(i);
                if (sourceForwardingInfo.get(userId) != null) {
                    sourceForwardingInfo.remove(userId);
                    writePackageRestrictionsLPr(sourceUserId);
                }
            }
        }
    }

    // This should be called (at least) whenever an application is removed
    private void setFirstAvailableUid(int uid) {
        if (uid > mFirstAvailableUid) {
Loading