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

Commit 58f0ffac authored by Taras Antoshchuk's avatar Taras Antoshchuk
Browse files

Clear preferred activities affected by MIME groups changes

If MIME group change affects any intent filter,
all preferred activities from the app are cleared

Bug: 134736173
Bug: 136635677
Test: atest CtsDynamicMimeHostTestCases
Change-Id: I84b26768b2da9e98f76f1ab3ec61af58534e3eca
parent a7d9c739
Loading
Loading
Loading
Loading
+9 −0
Original line number Diff line number Diff line
@@ -41,6 +41,7 @@ import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.Set;
import java.util.function.BiConsumer;

@@ -942,6 +943,14 @@ public class IntentFilter implements Parcelable {
        return mDataTypes != null ? mDataTypes.iterator() : null;
    }

    /**
     * Return copy of filter's data types.
     * @hide
     */
    public final List<String> dataTypes() {
        return mDataTypes != null ? new ArrayList<>(mDataTypes) : null;
    }

    /** @hide */
    public final void addMimeGroup(String name) {
        if (mMimeGroups == null) {
+32 −8
Original line number Diff line number Diff line
@@ -1176,26 +1176,47 @@ public class ComponentResolver {
         *
         * @param packageName package to which MIME group belongs
         * @param mimeGroup MIME group to update
         * @return true, if any intent filters were changed due to this update
         */
        public void updateMimeGroup(String packageName, String mimeGroup) {
        public boolean updateMimeGroup(String packageName, String mimeGroup) {
            F[] filters = mMimeGroupToFilter.get(mimeGroup);
            int n = filters != null ? filters.length : 0;

            mIsUpdatingMimeGroup = true;
            boolean hasChanges = false;
            F filter;
            for (int i = 0; i < n && (filter = filters[i]) != null; i++) {
                if (isPackageForFilter(packageName, filter)) {
                    updateFilter(filter);
                    hasChanges |= updateFilter(filter);
                }
            }
            mIsUpdatingMimeGroup = false;
            return hasChanges;
        }

        private void updateFilter(F filter) {
        private boolean updateFilter(F filter) {
            List<String> oldTypes = filter.dataTypes();
            removeFilter(filter);
            addFilter(filter);
            List<String> newTypes = filter.dataTypes();
            return !equalLists(oldTypes, newTypes);
        }

        private boolean equalLists(List<String> first, List<String> second) {
            if (first == null) {
                return second == null;
            } else if (second == null) {
                return false;
            }

            if (first.size() != second.size()) {
                return false;
            }

            Collections.sort(first);
            Collections.sort(second);
            return first.equals(second);
        }

        private void applyMimeGroups(F filter) {
            String packageName = filter.getPackageName();
@@ -2195,11 +2216,14 @@ public class ComponentResolver {

    /**
     * Removes MIME type from the group, by delegating to IntentResolvers
     * @return true if any intent filters were changed due to this update
     */
    void updateMimeGroup(String packageName, String group) {
        mActivities.updateMimeGroup(packageName, group);
        mProviders.updateMimeGroup(packageName, group);
        mReceivers.updateMimeGroup(packageName, group);
        mServices.updateMimeGroup(packageName, group);
    boolean updateMimeGroup(String packageName, String group) {
        boolean hasChanges = mActivities.updateMimeGroup(packageName, group);
        hasChanges |= mProviders.updateMimeGroup(packageName, group);
        hasChanges |= mReceivers.updateMimeGroup(packageName, group);
        hasChanges |= mServices.updateMimeGroup(packageName, group);

        return hasChanges;
    }
}
+14 −13
Original line number Diff line number Diff line
@@ -18427,15 +18427,7 @@ public class PackageManagerService extends IPackageManager.Stub
                    FLAG_STORAGE_DE | FLAG_STORAGE_CE | FLAG_STORAGE_EXTERNAL);
            clearDefaultBrowserIfNeededForUser(ps.name, nextUserId);
            removeKeystoreDataIfNeeded(mInjector.getUserManagerInternal(), nextUserId, ps.appId);
            final SparseBooleanArray changedUsers = new SparseBooleanArray();
            clearPackagePreferredActivitiesLPw(ps.name, changedUsers, nextUserId);
            if (changedUsers.size() > 0) {
                updateDefaultHomeNotLocked(changedUsers);
                postPreferredActivityChangedBroadcast(nextUserId);
                synchronized (mLock) {
                    scheduleWritePackageRestrictionsLocked(nextUserId);
                }
            }
            clearPackagePreferredActivities(ps.name, nextUserId);
            mPermissionManager.resetRuntimePermissions(pkg, nextUserId);
        }
@@ -18924,13 +18916,19 @@ public class PackageManagerService extends IPackageManager.Stub
            }
        }
        int callingUserId = UserHandle.getCallingUserId();
        clearPackagePreferredActivities(packageName, callingUserId);
    }
    /** This method takes a specific user id as well as UserHandle.USER_ALL. */
    private void clearPackagePreferredActivities(String packageName, int userId) {
        final SparseBooleanArray changedUsers = new SparseBooleanArray();
        clearPackagePreferredActivitiesLPw(packageName, changedUsers, callingUserId);
        clearPackagePreferredActivitiesLPw(packageName, changedUsers, userId);
        if (changedUsers.size() > 0) {
            updateDefaultHomeNotLocked(changedUsers);
            postPreferredActivityChangedBroadcast(callingUserId);
            postPreferredActivityChangedBroadcast(userId);
            synchronized (mLock) {
                scheduleWritePackageRestrictionsLocked(callingUserId);
                scheduleWritePackageRestrictionsLocked(userId);
            }
        }
    }
@@ -24371,7 +24369,10 @@ public class PackageManagerService extends IPackageManager.Stub
    }
    private void applyMimeGroupChanges(String packageName, String mimeGroup) {
        mComponentResolver.updateMimeGroup(packageName, mimeGroup);
        if (mComponentResolver.updateMimeGroup(packageName, mimeGroup)) {
            clearPackagePreferredActivities(packageName, UserHandle.USER_ALL);
        }
        mPmInternal.writeSettings(false);
    }