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

Commit deb09229 authored by Henry Liu's avatar Henry Liu
Browse files

Fix default launcher setting is reset after restoring

1. Do not remove launcher's prefer activity set during SetupWizard
2. Bypass SetupWizard's launcher activity during SetupWizard

Bug: 31955881

Test: m -j RunFrameworksServicesRoboTests
Change-Id: I035198186363d7adf65bb7ec5e4cc74260e290ea
parent 6ec9142d
Loading
Loading
Loading
Loading
+49 −20
Original line number Diff line number Diff line
@@ -24,6 +24,9 @@ import static android.Manifest.permission.READ_EXTERNAL_STORAGE;
import static android.Manifest.permission.REQUEST_DELETE_PACKAGES;
import static android.Manifest.permission.SET_HARMFUL_APP_WARNINGS;
import static android.Manifest.permission.WRITE_EXTERNAL_STORAGE;
import static android.content.Intent.ACTION_MAIN;
import static android.content.Intent.CATEGORY_DEFAULT;
import static android.content.Intent.CATEGORY_HOME;
import static android.content.pm.PackageManager.CERT_INPUT_RAW_X509;
import static android.content.pm.PackageManager.CERT_INPUT_SHA256;
import static android.content.pm.PackageManager.COMPONENT_ENABLED_STATE_DEFAULT;
@@ -92,7 +95,6 @@ import static com.android.internal.app.IntentForwarderActivity.FORWARD_INTENT_TO
import static com.android.internal.app.IntentForwarderActivity.FORWARD_INTENT_TO_PARENT;
import static com.android.internal.content.NativeLibraryHelper.LIB64_DIR_NAME;
import static com.android.internal.content.NativeLibraryHelper.LIB_DIR_NAME;
import static com.android.internal.util.ArrayUtils.appendElement;
import static com.android.internal.util.ArrayUtils.appendInt;
import static com.android.server.pm.InstructionSets.getAppDexInstructionSets;
import static com.android.server.pm.InstructionSets.getDexCodeInstructionSet;
@@ -275,7 +277,6 @@ import com.android.internal.R;
import com.android.internal.annotations.GuardedBy;
import com.android.internal.app.IMediaContainerService;
import com.android.internal.app.ResolverActivity;
import com.android.internal.app.SuspendedAppActivity;
import com.android.internal.content.NativeLibraryHelper;
import com.android.internal.content.PackageHelper;
import com.android.internal.logging.MetricsLogger;
@@ -6289,6 +6290,17 @@ public class PackageManagerService extends IPackageManager.Stub
        return null;
    }
    private boolean isHomeIntent(Intent intent) {
        return ACTION_MAIN.equals(intent.getAction())
                && intent.hasCategory(CATEGORY_HOME)
                && intent.hasCategory(CATEGORY_DEFAULT);
    }
    private boolean isDeviceProvisioned() {
        return android.provider.Settings.Global.getInt(mContext.getContentResolver(),
                android.provider.Settings.Global.DEVICE_PROVISIONED, 0) == 1;
    }
    // TODO: handle preferred activities missing while user has amnesia
    ResolveInfo findPreferredActivity(Intent intent, String resolvedType, int flags,
            List<ResolveInfo> query, int priority, boolean always,
@@ -6373,7 +6385,15 @@ public class PackageManagerService extends IPackageManager.Stub
                                Slog.v(TAG, "  null");
                            }
                        }
                        final boolean excludeSetupWizardHomeActivity = isHomeIntent(intent)
                                && !isDeviceProvisioned();
                        if (ai == null) {
                            // Do not remove launcher's preferred activity during SetupWizard
                            // due to it may not install yet
                            if (excludeSetupWizardHomeActivity) {
                                continue;
                            }
                            // This previously registered preferred activity
                            // component is no longer known.  Most likely an update
                            // to the app was installed and in the new version this
@@ -6409,17 +6429,20 @@ public class PackageManagerService extends IPackageManager.Stub
                            // was created, and is not a subset of the preferred set, we need to
                            // clear it and re-ask the user their preference, if we're looking for
                            // an "always" type entry.
                            if (always && !pa.mPref.sameSet(query)) {
                                if (pa.mPref.isSuperset(query)) {
                            if (always && !pa.mPref.sameSet(query, excludeSetupWizardHomeActivity)) {
                                if (pa.mPref.isSuperset(query, excludeSetupWizardHomeActivity)) {
                                    if (!excludeSetupWizardHomeActivity) {
                                        // some components of the set are no longer present in
                                        // the query, but the preferred activity can still be reused
                                        if (DEBUG_PREFERRED) {
                                        Slog.i(TAG, "Result set changed, but PreferredActivity is"
                                                + " still valid as only non-preferred components"
                                                + " were removed for " + intent + " type "
                                                + resolvedType);
                                            Slog.i(TAG, "Result set changed, but PreferredActivity"
                                                    + " is still valid as only non-preferred"
                                                    + " components were removed for " + intent
                                                    + " type " + resolvedType);
                                        }
                                    // remove obsolete components and re-add the up-to-date filter
                                        // remove obsolete components and re-add the up-to-date
                                        // filter
                                        PreferredActivity freshPa = new PreferredActivity(pa,
                                                pa.mPref.mMatch,
                                                pa.mPref.discardObsoleteComponents(query),
@@ -6428,6 +6451,12 @@ public class PackageManagerService extends IPackageManager.Stub
                                        pir.removeFilter(pa);
                                        pir.addFilter(freshPa);
                                        changed = true;
                                    } else {
                                        if (DEBUG_PREFERRED) {
                                            Slog.i(TAG, "Do not remove preferred activity for launcher"
                                                    + " during SetupWizard");
                                        }
                                    }
                                } else {
                                    Slog.i(TAG,
                                            "Result set changed, dropping preferred activity for "
+23 −4
Original line number Diff line number Diff line
@@ -16,8 +16,10 @@

package com.android.server.pm;

import android.content.pm.PackageManagerInternal;
import com.android.internal.util.XmlUtils;

import com.android.server.LocalServices;
import org.xmlpull.v1.XmlPullParser;
import org.xmlpull.v1.XmlPullParserException;
import org.xmlpull.v1.XmlSerializer;
@@ -52,6 +54,7 @@ public class PreferredComponent {
    private String mParseError;

    private final Callbacks mCallbacks;
    private final String mSetupWizardPackageName;

    public interface Callbacks {
        public boolean onReadTag(String tagName, XmlPullParser parser)
@@ -66,6 +69,7 @@ public class PreferredComponent {
        mAlways = always;
        mShortComponent = component.flattenToShortString();
        mParseError = null;
        mSetupWizardPackageName = null;
        if (set != null) {
            final int N = set.length;
            String[] myPackages = new String[N];
@@ -170,6 +174,8 @@ public class PreferredComponent {
        mSetPackages = myPackages;
        mSetClasses = myClasses;
        mSetComponents = myComponents;
        final PackageManagerInternal packageManagerInternal = LocalServices.getService(PackageManagerInternal.class);
        mSetupWizardPackageName = packageManagerInternal.getSetupWizardPackageName();
    }

    public String getParseError() {
@@ -193,7 +199,7 @@ public class PreferredComponent {
        }
    }

    public boolean sameSet(List<ResolveInfo> query) {
    public boolean sameSet(List<ResolveInfo> query, boolean excludeSetupWizardPackage) {
        if (mSetPackages == null) {
            return query == null;
        }
@@ -202,12 +208,18 @@ public class PreferredComponent {
        }
        final int NQ = query.size();
        final int NS = mSetPackages.length;

        int numMatch = 0;
        for (int i=0; i<NQ; i++) {
            ResolveInfo ri = query.get(i);
            ActivityInfo ai = ri.activityInfo;
            boolean good = false;

            // ignore SetupWizard package's launcher capability because it is only existed
            // during SetupWizard is running
            if (excludeSetupWizardPackage && ai.packageName.equals(mSetupWizardPackageName)) {
                continue;
            }

            for (int j=0; j<NS; j++) {
                if (mSetPackages[j].equals(ai.packageName)
                        && mSetClasses[j].equals(ai.name)) {
@@ -242,7 +254,7 @@ public class PreferredComponent {
        return numMatch == NS;
    }

    public boolean isSuperset(List<ResolveInfo> query) {
    public boolean isSuperset(List<ResolveInfo> query, boolean excludeSetupWizardPackage) {
        if (mSetPackages == null) {
            return query == null;
        }
@@ -251,13 +263,20 @@ public class PreferredComponent {
        }
        final int NQ = query.size();
        final int NS = mSetPackages.length;
        if (NS < NQ) {
        if (!excludeSetupWizardPackage && NS < NQ) {
            return false;
        }
        for (int i=0; i<NQ; i++) {
            ResolveInfo ri = query.get(i);
            ActivityInfo ai = ri.activityInfo;
            boolean foundMatch = false;

            // ignore SetupWizard package's launcher capability because it is only existed
            // during SetupWizard is running
            if (excludeSetupWizardPackage && ai.packageName.equals(mSetupWizardPackageName)) {
                continue;
            }

            for (int j=0; j<NS; j++) {
                if (mSetPackages[j].equals(ai.packageName) && mSetClasses[j].equals(ai.name)) {
                    foundMatch = true;