diff options
| author | 2020-11-17 18:29:01 +0000 | |
|---|---|---|
| committer | 2020-11-17 18:29:01 +0000 | |
| commit | d45305b25c434c5a2bcf6faef440862bd9cd760f (patch) | |
| tree | 50d7936b2fb5b1140f169a9a77a9b1433be2e868 | |
| parent | 188733a56e8a1a6e48f29218ebfb1da9e6115707 (diff) | |
| parent | d8c6106f9120aa6872715426b0ac28138a7898ee (diff) | |
Merge "Restore preferred activity filter if it not inside" am: d8c6106f91
Original change: https://android-review.googlesource.com/c/platform/frameworks/base/+/1483964
Change-Id: Ibd8117e576d3c456fd5f8688e93b12e30d7a1f7b
3 files changed, 59 insertions, 2 deletions
diff --git a/services/core/java/com/android/server/pm/PreferredComponent.java b/services/core/java/com/android/server/pm/PreferredComponent.java index c312fc0eca2f..3732bb6a834c 100644 --- a/services/core/java/com/android/server/pm/PreferredComponent.java +++ b/services/core/java/com/android/server/pm/PreferredComponent.java @@ -254,6 +254,43 @@ public class PreferredComponent { return numMatch == NS; } + public boolean sameSet(PreferredComponent pc) { + if (mSetPackages == null || pc == null || pc.mSetPackages == null + || !sameComponent(pc.mComponent)) { + return false; + } + final int otherPackageCount = pc.mSetPackages.length; + final int packageCount = mSetPackages.length; + int numMatch = 0; + for (int i = 0; i < otherPackageCount; i++) { + boolean good = false; + for (int j = 0; j < packageCount; j++) { + if (mSetPackages[j].equals(pc.mSetPackages[j]) + && mSetClasses[j].equals(pc.mSetClasses[j])) { + numMatch++; + good = true; + break; + } + } + if (!good) { + return false; + } + } + return numMatch == packageCount; + } + + /** Returns true if the preferred component represents the provided ComponentName. */ + private boolean sameComponent(ComponentName comp) { + if (mComponent == null || comp == null) { + return false; + } + if (mComponent.getPackageName().equals(comp.getPackageName()) + && mComponent.getClassName().equals(comp.getClassName())) { + return true; + } + return false; + } + public boolean isSuperset(List<ResolveInfo> query, boolean excludeSetupWizardPackage) { if (mSetPackages == null) { return query == null; diff --git a/services/core/java/com/android/server/pm/PreferredIntentResolver.java b/services/core/java/com/android/server/pm/PreferredIntentResolver.java index a261e29b05a7..ff3df130a3cc 100644 --- a/services/core/java/com/android/server/pm/PreferredIntentResolver.java +++ b/services/core/java/com/android/server/pm/PreferredIntentResolver.java @@ -22,6 +22,7 @@ import android.content.IntentFilter; import java.io.PrintWriter; import com.android.server.IntentResolver; +import java.util.ArrayList; public class PreferredIntentResolver extends IntentResolver<PreferredActivity, PreferredActivity> { @@ -45,4 +46,24 @@ public class PreferredIntentResolver protected IntentFilter getIntentFilter(@NonNull PreferredActivity input) { return input; } + + public boolean shouldAddPreferredActivity(PreferredActivity pa) { + ArrayList<PreferredActivity> pal = findFilters(pa); + if (pal == null || pal.isEmpty()) { + return true; + } + if (!pa.mPref.mAlways) { + return false; + } + final int activityCount = pal.size(); + for (int i = 0; i < activityCount; i++) { + PreferredActivity cur = pal.get(i); + if (cur.mPref.mAlways + && cur.mPref.mMatch == (pa.mPref.mMatch & IntentFilter.MATCH_CATEGORY_MASK) + && cur.mPref.sameSet(pa.mPref)) { + return false; + } + } + return true; + } } diff --git a/services/core/java/com/android/server/pm/Settings.java b/services/core/java/com/android/server/pm/Settings.java index 0f5d9781c612..79e5b276ac64 100644 --- a/services/core/java/com/android/server/pm/Settings.java +++ b/services/core/java/com/android/server/pm/Settings.java @@ -1410,8 +1410,7 @@ public final class Settings { PreferredActivity pa = new PreferredActivity(parser); if (pa.mPref.getParseError() == null) { final PreferredIntentResolver resolver = editPreferredActivitiesLPw(userId); - ArrayList<PreferredActivity> pal = resolver.findFilters(pa); - if (pal == null || pal.size() == 0 || pa.mPref.mAlways) { + if (resolver.shouldAddPreferredActivity(pa)) { resolver.addFilter(pa); } } else { |