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

Commit a3f133af authored by Amith Yamasani's avatar Amith Yamasani
Browse files

Save preferred activity info with user id.

So each user can have their own set of intent resolution preferences.

ResolverActivity now launches the activity on the correct user, and
persists the preference for the correct user.

Bug: 6961905
Change-Id: I6d3a8a9af89bc649277d4fc8d0f367ee123f8392
parent 9c38d6e5
Loading
Loading
Loading
Loading
+11 −1
Original line number Diff line number Diff line
@@ -1106,7 +1106,17 @@ final class ApplicationPackageManager extends PackageManager {
    public void addPreferredActivity(IntentFilter filter,
                                     int match, ComponentName[] set, ComponentName activity) {
        try {
            mPM.addPreferredActivity(filter, match, set, activity);
            mPM.addPreferredActivity(filter, match, set, activity, UserHandle.myUserId());
        } catch (RemoteException e) {
            // Should never happen!
        }
    }

    @Override
    public void addPreferredActivity(IntentFilter filter, int match,
            ComponentName[] set, ComponentName activity, int userId) {
        try {
            mPM.addPreferredActivity(filter, match, set, activity, userId);
        } catch (RemoteException e) {
            // Should never happen!
        }
+1 −1
Original line number Diff line number Diff line
@@ -200,7 +200,7 @@ interface IPackageManager {
    List<PackageInfo> getPreferredPackages(int flags);

    void addPreferredActivity(in IntentFilter filter, int match,
            in ComponentName[] set, in ComponentName activity);
            in ComponentName[] set, in ComponentName activity, int userId);

    void replacePreferredActivity(in IntentFilter filter, int match,
            in ComponentName[] set, in ComponentName activity);
+11 −0
Original line number Diff line number Diff line
@@ -2459,6 +2459,17 @@ public abstract class PackageManager {
    public abstract void addPreferredActivity(IntentFilter filter, int match,
            ComponentName[] set, ComponentName activity);

    /**
     * Same as {@link #addPreferredActivity(IntentFilter, int,
            ComponentName[], ComponentName)}, but with a specific userId to apply the preference
            to.
     * @hide
     */
    public void addPreferredActivity(IntentFilter filter, int match,
            ComponentName[] set, ComponentName activity, int userId) {
        throw new RuntimeException("Not implemented. Must override in a subclass.");
    }

    /**
     * @deprecated This is a protected API that should not have been available
     * to third party applications.  It is the platform's responsibility for
+5 −4
Original line number Diff line number Diff line
@@ -150,7 +150,8 @@ public class ResolverActivity extends AlertActivity implements AdapterView.OnIte

            resizeGrid();
        } else if (count == 1) {
            startActivity(mAdapter.intentForPosition(0));
            startActivityAsUser(mAdapter.intentForPosition(0),
                    UserHandle.getUserId(mLaunchedFromUid));
            mPackageMonitor.unregister();
            mRegistered = false;
            finish();
@@ -363,12 +364,12 @@ public class ResolverActivity extends AlertActivity implements AdapterView.OnIte
                    if (r.match > bestMatch) bestMatch = r.match;
                }
                getPackageManager().addPreferredActivity(filter, bestMatch, set,
                        intent.getComponent());
                        intent.getComponent(), UserHandle.getUserId(mLaunchedFromUid));
            }
        }

        if (intent != null) {
            startActivity(intent);
            startActivityAsUser(intent, UserHandle.getUserId(mLaunchedFromUid));
        }
    }

@@ -376,7 +377,7 @@ public class ResolverActivity extends AlertActivity implements AdapterView.OnIte
        Intent in = new Intent().setAction("android.settings.APPLICATION_DETAILS_SETTINGS")
                .setData(Uri.fromParts("package", ri.activityInfo.packageName, null))
                .addFlags(Intent.FLAG_ACTIVITY_CLEAR_WHEN_TASK_RESET);
        startActivity(in);
        startActivityAsUser(in, UserHandle.getUserId(mLaunchedFromUid));
    }

    private final class DisplayResolveInfo {
+26 −11
Original line number Diff line number Diff line
@@ -2422,6 +2422,9 @@ public class PackageManagerService extends IPackageManager.Stub {
                final int M = prefs.size();
                for (int i=0; i<M; i++) {
                    final PreferredActivity pa = prefs.get(i);
                    if (pa.mUserId != userId) {
                        continue;
                    }
                    if (pa.mPref.mMatch != match) {
                        continue;
                    }
@@ -7645,7 +7648,7 @@ public class PackageManagerService extends IPackageManager.Stub {
                            mSettings.updateSharedUserPermsLPw(deletedPs, mGlobalGids);
                        }
                    }
                    clearPackagePreferredActivitiesLPw(deletedPs.name);
                    clearPackagePreferredActivitiesLPw(deletedPs.name, UserHandle.USER_ALL);
                }
            }
            // can downgrade to reader
@@ -8112,26 +8115,28 @@ public class PackageManagerService extends IPackageManager.Stub {
    }
    
    public void addPreferredActivity(IntentFilter filter, int match,
            ComponentName[] set, ComponentName activity) {
            ComponentName[] set, ComponentName activity, int userId) {
        // writer
        int callingUid = Binder.getCallingUid();
        checkValidCaller(callingUid, userId);
        synchronized (mPackages) {
            if (mContext.checkCallingOrSelfPermission(
                    android.Manifest.permission.SET_PREFERRED_APPLICATIONS)
                    != PackageManager.PERMISSION_GRANTED) {
                if (getUidTargetSdkVersionLockedLPr(Binder.getCallingUid())
                if (getUidTargetSdkVersionLockedLPr(callingUid)
                        < Build.VERSION_CODES.FROYO) {
                    Slog.w(TAG, "Ignoring addPreferredActivity() from uid "
                            + Binder.getCallingUid());
                            + callingUid);
                    return;
                }
                mContext.enforceCallingOrSelfPermission(
                        android.Manifest.permission.SET_PREFERRED_APPLICATIONS, null);
            }

            Slog.i(TAG, "Adding preferred activity " + activity + ":");
            Slog.i(TAG, "Adding preferred activity " + activity + " for user " + userId + " :");
            filter.dump(new LogPrinter(Log.INFO, TAG), "  ");
            mSettings.mPreferredActivities.addFilter(
                    new PreferredActivity(filter, match, set, activity));
                    new PreferredActivity(filter, match, set, activity, userId));
            scheduleWriteSettingsLocked();            
        }
    }
@@ -8168,12 +8173,14 @@ public class PackageManagerService extends IPackageManager.Stub {
                        android.Manifest.permission.SET_PREFERRED_APPLICATIONS, null);
            }

            final int callingUserId = UserHandle.getCallingUserId();
            ArrayList<PreferredActivity> removed = null;
            Iterator<PreferredActivity> it = mSettings.mPreferredActivities.filterIterator();
            String action = filter.getAction(0);
            String category = filter.getCategory(0);
            while (it.hasNext()) {
                PreferredActivity pa = it.next();
                if (pa.mUserId != callingUserId) continue;
                if (pa.getAction(0).equals(action) && pa.getCategory(0).equals(category)) {
                    if (removed == null) {
                        removed = new ArrayList<PreferredActivity>();
@@ -8189,7 +8196,7 @@ public class PackageManagerService extends IPackageManager.Stub {
                    mSettings.mPreferredActivities.removeFilter(pa);
                }
            }
            addPreferredActivity(filter, match, set, activity);
            addPreferredActivity(filter, match, set, activity, callingUserId);
        }
    }

@@ -8213,17 +8220,21 @@ public class PackageManagerService extends IPackageManager.Stub {
                }
            }

            if (clearPackagePreferredActivitiesLPw(packageName)) {
            if (clearPackagePreferredActivitiesLPw(packageName, UserHandle.getCallingUserId())) {
                scheduleWriteSettingsLocked();            
            }
        }
    }

    boolean clearPackagePreferredActivitiesLPw(String packageName) {
    /** This method takes a specific user id as well as UserHandle.USER_ALL. */
    boolean clearPackagePreferredActivitiesLPw(String packageName, int userId) {
        ArrayList<PreferredActivity> removed = null;
        Iterator<PreferredActivity> it = mSettings.mPreferredActivities.filterIterator();
        while (it.hasNext()) {
            PreferredActivity pa = it.next();
            if (userId != UserHandle.USER_ALL && pa.mUserId != userId) {
                continue;
            }
            if (pa.mPref.mComponent.getPackageName().equals(packageName)) {
                if (removed == null) {
                    removed = new ArrayList<PreferredActivity>();
@@ -8245,11 +8256,15 @@ public class PackageManagerService extends IPackageManager.Stub {
            List<ComponentName> outActivities, String packageName) {

        int num = 0;
        final int userId = UserHandle.getCallingUserId();
        // reader
        synchronized (mPackages) {
            final Iterator<PreferredActivity> it = mSettings.mPreferredActivities.filterIterator();
            while (it.hasNext()) {
                final PreferredActivity pa = it.next();
                if (pa.mUserId != userId) {
                    continue;
                }
                if (packageName == null
                        || pa.mPref.mComponent.getPackageName().equals(packageName)) {
                    if (outFilters != null) {
Loading