diff --git a/core/java/android/content/pm/IntentFilterVerificationInfo.java b/core/java/android/content/pm/IntentFilterVerificationInfo.java index e50b0ff17a0ac..96000dd84c6fc 100644 --- a/core/java/android/content/pm/IntentFilterVerificationInfo.java +++ b/core/java/android/content/pm/IntentFilterVerificationInfo.java @@ -48,19 +48,18 @@ public final class IntentFilterVerificationInfo implements Parcelable { private static final String ATTR_PACKAGE_NAME = "packageName"; private static final String ATTR_STATUS = "status"; - private ArrayList mDomains; + private ArraySet mDomains = new ArraySet<>(); private String mPackageName; private int mMainStatus; public IntentFilterVerificationInfo() { mPackageName = null; - mDomains = new ArrayList<>(); mMainStatus = INTENT_FILTER_DOMAIN_VERIFICATION_STATUS_UNDEFINED; } public IntentFilterVerificationInfo(String packageName, ArrayList domains) { mPackageName = packageName; - mDomains = domains; + mDomains.addAll(domains); mMainStatus = INTENT_FILTER_DOMAIN_VERIFICATION_STATUS_UNDEFINED; } @@ -73,14 +72,6 @@ public final class IntentFilterVerificationInfo implements Parcelable { readFromParcel(source); } - public ArrayList getDomains() { - return mDomains; - } - - public ArraySet getDomainsSet() { - return new ArraySet<>(mDomains); - } - public String getPackageName() { return mPackageName; } @@ -98,6 +89,14 @@ public final class IntentFilterVerificationInfo implements Parcelable { } } + public ArraySet getDomains() { + return mDomains; + } + + public void setDomains(ArrayList list) { + mDomains = new ArraySet<>(list); + } + public String getDomainsString() { StringBuilder sb = new StringBuilder(); for (String str : mDomains) { @@ -145,7 +144,6 @@ public final class IntentFilterVerificationInfo implements Parcelable { } mMainStatus = status; - mDomains = new ArrayList<>(); int outerDepth = parser.getDepth(); int type; while ((type=parser.next()) != XmlPullParser.END_DOCUMENT @@ -201,15 +199,16 @@ public final class IntentFilterVerificationInfo implements Parcelable { private void readFromParcel(Parcel source) { mPackageName = source.readString(); mMainStatus = source.readInt(); - mDomains = new ArrayList<>(); - source.readStringList(mDomains); + ArrayList list = new ArrayList<>(); + source.readStringList(list); + mDomains.addAll(list); } @Override public void writeToParcel(Parcel dest, int flags) { dest.writeString(mPackageName); dest.writeInt(mMainStatus); - dest.writeStringList(mDomains); + dest.writeStringList(new ArrayList<>(mDomains)); } public static final Creator CREATOR = @@ -221,5 +220,4 @@ public final class IntentFilterVerificationInfo implements Parcelable { return new IntentFilterVerificationInfo[size]; } }; - } diff --git a/services/core/java/com/android/server/pm/PackageManagerService.java b/services/core/java/com/android/server/pm/PackageManagerService.java index 9ad594ea8382c..66dd8f160b943 100644 --- a/services/core/java/com/android/server/pm/PackageManagerService.java +++ b/services/core/java/com/android/server/pm/PackageManagerService.java @@ -2161,6 +2161,8 @@ public class PackageManagerService extends IPackageManager.Stub { mSettings.mFingerprint = Build.FINGERPRINT; } + primeDomainVerificationsLPw(false); + // All the changes are done during package scanning. mSettings.updateInternalDatabaseVersion(); @@ -2178,8 +2180,6 @@ public class PackageManagerService extends IPackageManager.Stub { mIntentFilterVerifier = new IntentVerifierProxy(mContext, mIntentFilterVerifierComponent); - primeDomainVerificationsLPw(false); - } // synchronized (mPackages) } // synchronized (mInstallLock) @@ -2277,9 +2277,9 @@ public class PackageManagerService extends IPackageManager.Stub { } private void primeDomainVerificationsLPw(boolean logging) { - Slog.d(TAG, "Start priming domain verification"); + Slog.d(TAG, "Start priming domain verifications"); boolean updated = false; - ArrayList allHosts = new ArrayList<>(); + ArraySet allHostsSet = new ArraySet<>(); for (PackageParser.Package pkg : mPackages.values()) { final String packageName = pkg.packageName; if (!hasDomainURLs(pkg)) { @@ -2299,18 +2299,20 @@ public class PackageManagerService extends IPackageManager.Stub { for (PackageParser.Activity a : pkg.activities) { for (ActivityIntentInfo filter : a.intents) { if (hasValidDomains(filter, false)) { - allHosts.addAll(filter.getHostsList()); + allHostsSet.addAll(filter.getHostsList()); } } } - if (allHosts.size() == 0) { - allHosts.add("*"); + if (allHostsSet.size() == 0) { + allHostsSet.add("*"); } + ArrayList allHostsList = new ArrayList<>(allHostsSet); IntentFilterVerificationInfo ivi = - mSettings.createIntentFilterVerificationIfNeededLPw(packageName, allHosts); + mSettings.createIntentFilterVerificationIfNeededLPw(packageName, allHostsList); if (ivi != null) { // We will always log this - Slog.d(TAG, "Priming domain verifications for package: " + packageName); + Slog.d(TAG, "Priming domain verifications for package: " + packageName + + " with hosts:" + ivi.getDomainsString()); ivi.setStatus(INTENT_FILTER_DOMAIN_VERIFICATION_STATUS_ALWAYS); updated = true; } @@ -2319,12 +2321,14 @@ public class PackageManagerService extends IPackageManager.Stub { Slog.d(TAG, "No priming domain verifications for package: " + packageName); } } - allHosts.clear(); + allHostsSet.clear(); } if (updated) { - scheduleWriteSettingsLocked(); + if (logging) { + Slog.d(TAG, "Will need to write primed domain verifications"); + } } - Slog.d(TAG, "End priming domain verification"); + Slog.d(TAG, "End priming domain verifications"); } @Override diff --git a/services/core/java/com/android/server/pm/Settings.java b/services/core/java/com/android/server/pm/Settings.java index 7cf7c7ce3822e..d3bfdebe464fc 100644 --- a/services/core/java/com/android/server/pm/Settings.java +++ b/services/core/java/com/android/server/pm/Settings.java @@ -985,6 +985,13 @@ final class Settings { if (ivi == null) { ivi = new IntentFilterVerificationInfo(packageName, domains); ps.setIntentFilterVerificationInfo(ivi); + Slog.d(PackageManagerService.TAG, + "Creating new IntentFilterVerificationInfo for packageName: " + packageName); + } else { + ivi.setDomains(domains); + Slog.d(PackageManagerService.TAG, + "Setting domains to existing IntentFilterVerificationInfo for packageName: " + + packageName + " and with domains: " + ivi.getDomainsString()); } return ivi; } @@ -1021,7 +1028,7 @@ final class Settings { // Then, if we set a ALWAYS status, then put NEVER status for Apps whose IntentFilter // domains overlap the domains of the current package - ArraySet currentDomains = current.getIntentFilterVerificationInfo().getDomainsSet(); + ArraySet currentDomains = current.getIntentFilterVerificationInfo().getDomains(); if (status == INTENT_FILTER_DOMAIN_VERIFICATION_STATUS_ALWAYS) { for (PackageSetting ps : mPackages.values()) { if (ps == null || ps.pkg.packageName.equals(packageName)) continue; @@ -1029,7 +1036,7 @@ final class Settings { if (ivi == null) { continue; } - ArraySet set = ivi.getDomainsSet(); + ArraySet set = ivi.getDomains(); set.retainAll(currentDomains); if (set.size() > 0) { ps.setDomainVerificationStatusForUser(