Removes existing one when apply a default preferred app

Preferred apps are currently parsed from preferred-xml in different
partitions. Always removes existing one when apply default preferred
activity to resolve possible conflicts in different preferred-xml
files.

Bug: 141254650
Test: Push a preferred-xml including a confict to another partition
Change-Id: I5f8bffeaa653ed9b5a5f22c99b8ef6ae0df47493
This commit is contained in:
Rhed Jao
2020-08-27 21:37:54 +08:00
parent b0e58545c1
commit c46f9bda26
2 changed files with 24 additions and 20 deletions

View File

@@ -19885,7 +19885,7 @@ public class PackageManagerService extends IPackageManager.Stub
final PreferredIntentResolver pir = mSettings.editPreferredActivitiesLPw(userId);
final ArrayList<PreferredActivity> existing = pir.findFilters(filter);
if (removeExisting && existing != null) {
removeFiltersLocked(pir, filter, existing);
mSettings.removeFiltersLPw(pir, filter, existing);
}
pir.addFilter(new PreferredActivity(filter, match, set, activity, always));
scheduleWritePackageRestrictionsLocked(userId);
@@ -19986,7 +19986,7 @@ public class PackageManagerService extends IPackageManager.Stub
}
}
if (existing != null) {
removeFiltersLocked(pir, filter, existing);
mSettings.removeFiltersLPw(pir, filter, existing);
}
}
}
@@ -19994,22 +19994,6 @@ public class PackageManagerService extends IPackageManager.Stub
"Replacing preferred", false);
}
private void removeFiltersLocked(@NonNull PreferredIntentResolver pir,
@NonNull IntentFilter filter, @NonNull List<PreferredActivity> existing) {
if (DEBUG_PREFERRED) {
Slog.i(TAG, existing.size() + " preferred matches for:");
filter.dump(new LogPrinter(Log.INFO, TAG), " ");
}
for (int i = existing.size() - 1; i >= 0; --i) {
final PreferredActivity pa = existing.get(i);
if (DEBUG_PREFERRED) {
Slog.i(TAG, "Removing preferred activity " + pa.mPref.mComponent + ":");
pa.dump(new LogPrinter(Log.INFO, TAG), " ");
}
pir.removeFilter(pa);
}
}
@Override
public void clearPackagePreferredActivities(String packageName) {
final int callingUid = Binder.getCallingUid();

View File

@@ -102,7 +102,6 @@ import com.android.internal.util.XmlUtils;
import com.android.permission.persistence.RuntimePermissionsPersistence;
import com.android.permission.persistence.RuntimePermissionsState;
import com.android.server.LocalServices;
import com.android.server.pm.Installer.Batch;
import com.android.server.pm.Installer.InstallerException;
import com.android.server.pm.parsing.PackageInfoUtils;
import com.android.server.pm.parsing.pkg.AndroidPackage;
@@ -3192,6 +3191,22 @@ public final class Settings {
}
}
void removeFiltersLPw(@NonNull PreferredIntentResolver pir,
@NonNull IntentFilter filter, @NonNull List<PreferredActivity> existing) {
if (PackageManagerService.DEBUG_PREFERRED) {
Slog.i(TAG, existing.size() + " preferred matches for:");
filter.dump(new LogPrinter(Log.INFO, TAG), " ");
}
for (int i = existing.size() - 1; i >= 0; --i) {
final PreferredActivity pa = existing.get(i);
if (PackageManagerService.DEBUG_PREFERRED) {
Slog.i(TAG, "Removing preferred activity " + pa.mPref.mComponent + ":");
pa.dump(new LogPrinter(Log.INFO, TAG), " ");
}
pir.removeFilter(pa);
}
}
private void applyDefaultPreferredActivityLPw(
PackageManagerInternal pmInternal, IntentFilter tmpPa, ComponentName cn, int userId) {
// The initial preferences only specify the target activity
@@ -3395,8 +3410,13 @@ public final class Settings {
Slog.w(TAG, "Malformed mimetype " + intent.getType() + " for " + cn);
}
}
final PreferredIntentResolver pir = editPreferredActivitiesLPw(userId);
final List<PreferredActivity> existing = pir.findFilters(filter);
if (existing != null) {
removeFiltersLPw(pir, filter, existing);
}
PreferredActivity pa = new PreferredActivity(filter, systemMatch, set, cn, true);
editPreferredActivitiesLPw(userId).addFilter(pa);
pir.addFilter(pa);
} else if (haveNonSys == null) {
StringBuilder sb = new StringBuilder();
sb.append("No component ");