private static final String ATTR_PACKAGE_NAME = "packageName";
private static final String ATTR_STATUS = "status";
- private ArrayList<String> mDomains;
+ private ArraySet<String> 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<String> domains) {
mPackageName = packageName;
- mDomains = domains;
+ mDomains.addAll(domains);
mMainStatus = INTENT_FILTER_DOMAIN_VERIFICATION_STATUS_UNDEFINED;
}
readFromParcel(source);
}
- public ArrayList<String> getDomains() {
- return mDomains;
- }
-
- public ArraySet<String> getDomainsSet() {
- return new ArraySet<>(mDomains);
- }
-
public String getPackageName() {
return mPackageName;
}
}
}
+ public ArraySet<String> getDomains() {
+ return mDomains;
+ }
+
+ public void setDomains(ArrayList<String> list) {
+ mDomains = new ArraySet<>(list);
+ }
+
public String getDomainsString() {
StringBuilder sb = new StringBuilder();
for (String str : mDomains) {
}
mMainStatus = status;
- mDomains = new ArrayList<>();
int outerDepth = parser.getDepth();
int type;
while ((type=parser.next()) != XmlPullParser.END_DOCUMENT
private void readFromParcel(Parcel source) {
mPackageName = source.readString();
mMainStatus = source.readInt();
- mDomains = new ArrayList<>();
- source.readStringList(mDomains);
+ ArrayList<String> 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<IntentFilterVerificationInfo> CREATOR =
return new IntentFilterVerificationInfo[size];
}
};
-
}
mSettings.mFingerprint = Build.FINGERPRINT;
}
+ primeDomainVerificationsLPw(false);
+
// All the changes are done during package scanning.
mSettings.updateInternalDatabaseVersion();
mIntentFilterVerifier = new IntentVerifierProxy(mContext,
mIntentFilterVerifierComponent);
- primeDomainVerificationsLPw(false);
-
} // synchronized (mPackages)
} // synchronized (mInstallLock)
}
private void primeDomainVerificationsLPw(boolean logging) {
- Slog.d(TAG, "Start priming domain verification");
+ Slog.d(TAG, "Start priming domain verifications");
boolean updated = false;
- ArrayList<String> allHosts = new ArrayList<>();
+ ArraySet<String> allHostsSet = new ArraySet<>();
for (PackageParser.Package pkg : mPackages.values()) {
final String packageName = pkg.packageName;
if (!hasDomainURLs(pkg)) {
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<String> 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;
}
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
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;
}
// Then, if we set a ALWAYS status, then put NEVER status for Apps whose IntentFilter
// domains overlap the domains of the current package
- ArraySet<String> currentDomains = current.getIntentFilterVerificationInfo().getDomainsSet();
+ ArraySet<String> 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;
if (ivi == null) {
continue;
}
- ArraySet<String> set = ivi.getDomainsSet();
+ ArraySet<String> set = ivi.getDomains();
set.retainAll(currentDomains);
if (set.size() > 0) {
ps.setDomainVerificationStatusForUser(