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 Original line 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.REQUEST_DELETE_PACKAGES;
import static android.Manifest.permission.SET_HARMFUL_APP_WARNINGS;
import static android.Manifest.permission.SET_HARMFUL_APP_WARNINGS;
import static android.Manifest.permission.WRITE_EXTERNAL_STORAGE;
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_RAW_X509;
import static android.content.pm.PackageManager.CERT_INPUT_SHA256;
import static android.content.pm.PackageManager.CERT_INPUT_SHA256;
import static android.content.pm.PackageManager.COMPONENT_ENABLED_STATE_DEFAULT;
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.app.IntentForwarderActivity.FORWARD_INTENT_TO_PARENT;
import static com.android.internal.content.NativeLibraryHelper.LIB64_DIR_NAME;
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.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.internal.util.ArrayUtils.appendInt;
import static com.android.server.pm.InstructionSets.getAppDexInstructionSets;
import static com.android.server.pm.InstructionSets.getAppDexInstructionSets;
import static com.android.server.pm.InstructionSets.getDexCodeInstructionSet;
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.annotations.GuardedBy;
import com.android.internal.app.IMediaContainerService;
import com.android.internal.app.IMediaContainerService;
import com.android.internal.app.ResolverActivity;
import com.android.internal.app.ResolverActivity;
import com.android.internal.app.SuspendedAppActivity;
import com.android.internal.content.NativeLibraryHelper;
import com.android.internal.content.NativeLibraryHelper;
import com.android.internal.content.PackageHelper;
import com.android.internal.content.PackageHelper;
import com.android.internal.logging.MetricsLogger;
import com.android.internal.logging.MetricsLogger;
@@ -6289,6 +6290,17 @@ public class PackageManagerService extends IPackageManager.Stub
        return null;
        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
    // TODO: handle preferred activities missing while user has amnesia
    ResolveInfo findPreferredActivity(Intent intent, String resolvedType, int flags,
    ResolveInfo findPreferredActivity(Intent intent, String resolvedType, int flags,
            List<ResolveInfo> query, int priority, boolean always,
            List<ResolveInfo> query, int priority, boolean always,
@@ -6373,7 +6385,15 @@ public class PackageManagerService extends IPackageManager.Stub
                                Slog.v(TAG, "  null");
                                Slog.v(TAG, "  null");
                            }
                            }
                        }
                        }
                        final boolean excludeSetupWizardHomeActivity = isHomeIntent(intent)
                                && !isDeviceProvisioned();
                        if (ai == null) {
                        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
                            // This previously registered preferred activity
                            // component is no longer known.  Most likely an update
                            // component is no longer known.  Most likely an update
                            // to the app was installed and in the new version this
                            // 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
                            // 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
                            // clear it and re-ask the user their preference, if we're looking for
                            // an "always" type entry.
                            // 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
                                        // some components of the set are no longer present in
                                        // the query, but the preferred activity can still be reused
                                        // the query, but the preferred activity can still be reused
                                        if (DEBUG_PREFERRED) {
                                        if (DEBUG_PREFERRED) {
                                        Slog.i(TAG, "Result set changed, but PreferredActivity is"
                                            Slog.i(TAG, "Result set changed, but PreferredActivity"
                                                + " still valid as only non-preferred components"
                                                    + " is still valid as only non-preferred"
                                                + " were removed for " + intent + " type "
                                                    + " components were removed for " + intent
                                                + resolvedType);
                                                    + " 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,
                                        PreferredActivity freshPa = new PreferredActivity(pa,
                                                pa.mPref.mMatch,
                                                pa.mPref.mMatch,
                                                pa.mPref.discardObsoleteComponents(query),
                                                pa.mPref.discardObsoleteComponents(query),
@@ -6428,6 +6451,12 @@ public class PackageManagerService extends IPackageManager.Stub
                                        pir.removeFilter(pa);
                                        pir.removeFilter(pa);
                                        pir.addFilter(freshPa);
                                        pir.addFilter(freshPa);
                                        changed = true;
                                        changed = true;
                                    } else {
                                        if (DEBUG_PREFERRED) {
                                            Slog.i(TAG, "Do not remove preferred activity for launcher"
                                                    + " during SetupWizard");
                                        }
                                    }
                                } else {
                                } else {
                                    Slog.i(TAG,
                                    Slog.i(TAG,
                                            "Result set changed, dropping preferred activity for "
                                            "Result set changed, dropping preferred activity for "
+23 −4
Original line number Original line Diff line number Diff line
@@ -16,8 +16,10 @@


package com.android.server.pm;
package com.android.server.pm;


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


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


    private final Callbacks mCallbacks;
    private final Callbacks mCallbacks;
    private final String mSetupWizardPackageName;


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


    public String getParseError() {
    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) {
        if (mSetPackages == null) {
            return query == null;
            return query == null;
        }
        }
@@ -202,12 +208,18 @@ public class PreferredComponent {
        }
        }
        final int NQ = query.size();
        final int NQ = query.size();
        final int NS = mSetPackages.length;
        final int NS = mSetPackages.length;

        int numMatch = 0;
        int numMatch = 0;
        for (int i=0; i<NQ; i++) {
        for (int i=0; i<NQ; i++) {
            ResolveInfo ri = query.get(i);
            ResolveInfo ri = query.get(i);
            ActivityInfo ai = ri.activityInfo;
            ActivityInfo ai = ri.activityInfo;
            boolean good = false;
            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++) {
            for (int j=0; j<NS; j++) {
                if (mSetPackages[j].equals(ai.packageName)
                if (mSetPackages[j].equals(ai.packageName)
                        && mSetClasses[j].equals(ai.name)) {
                        && mSetClasses[j].equals(ai.name)) {
@@ -242,7 +254,7 @@ public class PreferredComponent {
        return numMatch == NS;
        return numMatch == NS;
    }
    }


    public boolean isSuperset(List<ResolveInfo> query) {
    public boolean isSuperset(List<ResolveInfo> query, boolean excludeSetupWizardPackage) {
        if (mSetPackages == null) {
        if (mSetPackages == null) {
            return query == null;
            return query == null;
        }
        }
@@ -251,13 +263,20 @@ public class PreferredComponent {
        }
        }
        final int NQ = query.size();
        final int NQ = query.size();
        final int NS = mSetPackages.length;
        final int NS = mSetPackages.length;
        if (NS < NQ) {
        if (!excludeSetupWizardPackage && NS < NQ) {
            return false;
            return false;
        }
        }
        for (int i=0; i<NQ; i++) {
        for (int i=0; i<NQ; i++) {
            ResolveInfo ri = query.get(i);
            ResolveInfo ri = query.get(i);
            ActivityInfo ai = ri.activityInfo;
            ActivityInfo ai = ri.activityInfo;
            boolean foundMatch = false;
            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++) {
            for (int j=0; j<NS; j++) {
                if (mSetPackages[j].equals(ai.packageName) && mSetClasses[j].equals(ai.name)) {
                if (mSetPackages[j].equals(ai.packageName) && mSetClasses[j].equals(ai.name)) {
                    foundMatch = true;
                    foundMatch = true;