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

Commit 8a2ed1d7 authored by Dianne Hackborn's avatar Dianne Hackborn
Browse files

Improve configuration of default preferred apps.

The file that defines default preferred apps is now more
robust.  It is no longer a raw dump of the package
manager settings, but instead a more general list of a
target activity and filter.  When reading it, the remaining
information (match value, set of potential matches) is
determined dynamically.

Change-Id: I0edc6e0d2ed3dd2a6e2238992f18f7fc1f51d8d4
parent 93f770b5
Loading
Loading
Loading
Loading
+2 −0
Original line number Diff line number Diff line
@@ -210,6 +210,8 @@ interface IPackageManager {
    
    List<PackageInfo> getPreferredPackages(int flags);

    void resetPreferredActivities(int userId);

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

+33 −0
Original line number Diff line number Diff line
@@ -50,6 +50,8 @@ public class FastXmlSerializer implements XmlSerializer {

    private static final int BUFFER_LEN = 8192;

    private static String sSpace = "                                                              ";

    private final char[] mText = new char[BUFFER_LEN];
    private int mPos;

@@ -59,8 +61,12 @@ public class FastXmlSerializer implements XmlSerializer {
    private CharsetEncoder mCharset;
    private ByteBuffer mBytes = ByteBuffer.allocate(BUFFER_LEN);

    private boolean mIndent = false;
    private boolean mInTag;

    private int mNesting = 0;
    private boolean mLineStart = true;

    private void append(char c) throws IOException {
        int pos = mPos;
        if (pos >= (BUFFER_LEN-1)) {
@@ -113,6 +119,14 @@ public class FastXmlSerializer implements XmlSerializer {
        append(str, 0, str.length());
    }

    private void appendIndent(int indent) throws IOException {
        indent *= 4;
        if (indent > sSpace.length()) {
            indent = sSpace.length();
        }
        append(sSpace, 0, indent);
    }

    private void escapeAndAppendString(final String string) throws IOException {
        final int N = string.length();
        final char NE = (char)ESCAPE_TABLE.length;
@@ -161,6 +175,7 @@ public class FastXmlSerializer implements XmlSerializer {

        escapeAndAppendString(value);
        append('"');
        mLineStart = false;
        return this;
    }

@@ -185,9 +200,13 @@ public class FastXmlSerializer implements XmlSerializer {

    public XmlSerializer endTag(String namespace, String name) throws IOException,
            IllegalArgumentException, IllegalStateException {
        mNesting--;
        if (mInTag) {
            append(" />\n");
        } else {
            if (mIndent && mLineStart) {
                appendIndent(mNesting);
            }
            append("</");
            if (namespace != null) {
                append(namespace);
@@ -196,6 +215,7 @@ public class FastXmlSerializer implements XmlSerializer {
            append(name);
            append(">\n");
        }
        mLineStart = true;
        mInTag = false;
        return this;
    }
@@ -278,6 +298,7 @@ public class FastXmlSerializer implements XmlSerializer {
    public void setFeature(String name, boolean state) throws IllegalArgumentException,
            IllegalStateException {
        if (name.equals("http://xmlpull.org/v1/doc/features.html#indent-output")) {
            mIndent = true;
            return;
        }
        throw new UnsupportedOperationException();
@@ -325,6 +346,7 @@ public class FastXmlSerializer implements XmlSerializer {
            IllegalArgumentException, IllegalStateException {
        append("<?xml version='1.0' encoding='utf-8' standalone='"
                + (standalone ? "yes" : "no") + "' ?>\n");
        mLineStart = true;
    }

    public XmlSerializer startTag(String namespace, String name) throws IOException,
@@ -332,6 +354,10 @@ public class FastXmlSerializer implements XmlSerializer {
        if (mInTag) {
            append(">\n");
        }
        if (mIndent) {
            appendIndent(mNesting);
        }
        mNesting++;
        append('<');
        if (namespace != null) {
            append(namespace);
@@ -339,6 +365,7 @@ public class FastXmlSerializer implements XmlSerializer {
        }
        append(name);
        mInTag = true;
        mLineStart = false;
        return this;
    }

@@ -349,6 +376,9 @@ public class FastXmlSerializer implements XmlSerializer {
            mInTag = false;
        }
        escapeAndAppendString(buf, start, len);
        if (mIndent) {
            mLineStart = buf[start+len-1] == '\n';
        }
        return this;
    }

@@ -359,6 +389,9 @@ public class FastXmlSerializer implements XmlSerializer {
            mInTag = false;
        }
        escapeAndAppendString(text);
        if (mIndent) {
            mLineStart = text.charAt(text.length()-1) == '\n';
        }
        return this;
    }

+11 −9
Original line number Diff line number Diff line
@@ -164,9 +164,10 @@ public class PreferredComponent {
        return mParseError;
    }

    public void writeToXml(XmlSerializer serializer) throws IOException {
    public void writeToXml(XmlSerializer serializer, boolean full) throws IOException {
        final int NS = mSetClasses != null ? mSetClasses.length : 0;
        serializer.attribute(null, "name", mShortComponent);
        if (full) {
            if (mMatch != 0) {
                serializer.attribute(null, "match", Integer.toHexString(mMatch));
            }
@@ -177,6 +178,7 @@ public class PreferredComponent {
                serializer.endTag(null, "set");
            }
        }
    }

    public boolean sameSet(List<ResolveInfo> query, int priority) {
        if (mSetPackages == null) return false;
+30 −10
Original line number Diff line number Diff line
@@ -173,7 +173,7 @@ adb shell am instrument -w -e class com.android.unit_tests.PackageManagerTests c
public class PackageManagerService extends IPackageManager.Stub {
    static final String TAG = "PackageManager";
    static final boolean DEBUG_SETTINGS = false;
    private static final boolean DEBUG_PREFERRED = false;
    static final boolean DEBUG_PREFERRED = true;
    static final boolean DEBUG_UPGRADE = false;
    private static final boolean DEBUG_INSTALL = false;
    private static final boolean DEBUG_REMOVE = false;
@@ -1021,7 +1021,7 @@ public class PackageManagerService extends IPackageManager.Stub {

            readPermissions();

            mRestoredSettings = mSettings.readLPw(sUserManager.getUsers(false),
            mRestoredSettings = mSettings.readLPw(this, sUserManager.getUsers(false),
                    mSdkVersion, mOnlyCore);
            long startTime = SystemClock.uptimeMillis();

@@ -4967,7 +4967,7 @@ public class PackageManagerService extends IPackageManager.Stub {
        ps.haveGids = true;
    }
    
    private final class ActivityIntentResolver
    final class ActivityIntentResolver
            extends IntentResolver<PackageParser.ActivityIntentInfo, ResolveInfo> {
        public List<ResolveInfo> queryIntent(Intent intent, String resolvedType,
                boolean defaultOnly, int userId) {
@@ -8830,7 +8830,9 @@ public class PackageManagerService extends IPackageManager.Stub {
                }
            }

            if (clearPackagePreferredActivitiesLPw(packageName, UserHandle.getCallingUserId())) {
            int user = UserHandle.getCallingUserId();
            if (clearPackagePreferredActivitiesLPw(packageName, user)) {
                mSettings.writePackageRestrictionsLPr(user);
                scheduleWriteSettingsLocked();
            }
        }
@@ -8849,7 +8851,8 @@ public class PackageManagerService extends IPackageManager.Stub {
            Iterator<PreferredActivity> it = pir.filterIterator();
            while (it.hasNext()) {
                PreferredActivity pa = it.next();
                if (pa.mPref.mComponent.getPackageName().equals(packageName)) {
                if (packageName == null ||
                        pa.mPref.mComponent.getPackageName().equals(packageName)) {
                    if (removed == null) {
                        removed = new ArrayList<PreferredActivity>();
                    }
@@ -8862,12 +8865,24 @@ public class PackageManagerService extends IPackageManager.Stub {
                    pir.removeFilter(pa);
                }
                changed = true;
                mSettings.writePackageRestrictionsLPr(thisUserId);
            }
        }
        return changed;
    }

    public void resetPreferredActivities(int userId) {
        mContext.enforceCallingOrSelfPermission(
                android.Manifest.permission.SET_PREFERRED_APPLICATIONS, null);
        // writer
        synchronized (mPackages) {
            int user = UserHandle.getCallingUserId();
            clearPackagePreferredActivitiesLPw(null, user);
            mSettings.readDefaultPreferredAppsLPw(this, user);
            mSettings.writePackageRestrictionsLPr(user);
            scheduleWriteSettingsLocked();
        }
    }

    public int getPreferredActivities(List<IntentFilter> outFilters,
            List<ComponentName> outActivities, String packageName) {

@@ -9254,6 +9269,7 @@ public class PackageManagerService extends IPackageManager.Stub {
        }

        DumpState dumpState = new DumpState();
        boolean fullPreferred = false;
        
        String packageName = null;
        
@@ -9277,7 +9293,7 @@ public class PackageManagerService extends IPackageManager.Stub {
                pw.println("    r[esolvers]: dump intent resolvers");
                pw.println("    perm[issions]: dump permissions");
                pw.println("    pref[erred]: print preferred package settings");
                pw.println("    preferred-xml: print preferred package settings as xml");
                pw.println("    preferred-xml [--full]: print preferred package settings as xml");
                pw.println("    prov[iders]: dump content providers");
                pw.println("    p[ackages]: dump installed packages");
                pw.println("    s[hared-users]: dump shared user IDs");
@@ -9311,6 +9327,10 @@ public class PackageManagerService extends IPackageManager.Stub {
                dumpState.setDump(DumpState.DUMP_PREFERRED);
            } else if ("preferred-xml".equals(cmd)) {
                dumpState.setDump(DumpState.DUMP_PREFERRED_XML);
                opti++;
                if (opti < args.length && "--full".equals(args[opti])) {
                    fullPreferred = true;
                }
            } else if ("p".equals(cmd) || "packages".equals(cmd)) {
                dumpState.setDump(DumpState.DUMP_PACKAGES);
            } else if ("s".equals(cmd) || "shared-users".equals(cmd)) {
@@ -9405,7 +9425,7 @@ public class PackageManagerService extends IPackageManager.Stub {
                    serializer.startDocument(null, true);
                    serializer.setFeature(
                            "http://xmlpull.org/v1/doc/features.html#indent-output", true);
                    mSettings.writePreferredActivitiesLPr(serializer, 0);
                    mSettings.writePreferredActivitiesLPr(serializer, 0, fullPreferred);
                    serializer.endDocument();
                    serializer.flush();
                } catch (IllegalArgumentException e) {
@@ -10158,7 +10178,7 @@ public class PackageManagerService extends IPackageManager.Stub {
    /** Called by UserManagerService */
    void createNewUserLILPw(int userHandle, File path) {
        if (mInstaller != null) {
            mSettings.createNewUserLILPw(mInstaller, userHandle, path);
            mSettings.createNewUserLILPw(this, mInstaller, userHandle, path);
        }
    }

+2 −2
Original line number Diff line number Diff line
@@ -46,8 +46,8 @@ class PreferredActivity extends IntentFilter implements PreferredComponent.Callb
        mPref = new PreferredComponent(this, parser);
    }

    public void writeToXml(XmlSerializer serializer) throws IOException {
        mPref.writeToXml(serializer);
    public void writeToXml(XmlSerializer serializer, boolean full) throws IOException {
        mPref.writeToXml(serializer, full);
        serializer.startTag(null, "filter");
            super.writeToXml(serializer);
        serializer.endTag(null, "filter");
Loading