From: Makoto Onuki Date: Wed, 22 Feb 2017 22:36:59 +0000 (-0800) Subject: Allow querying providers with a specific metadata. X-Git-Tag: android-x86-8.1-r1~3324^2 X-Git-Url: http://git.osdn.net/view?a=commitdiff_plain;h=32757292030117e3abda2bb2a3eb349f646c9fa8;p=android-x86%2Fframeworks-base.git Allow querying providers with a specific metadata. CP2 will need it to scan GAL providers faster. Test: Manual test with CP2 under development Bug: 35388445 Change-Id: I1202420078b1bbe48f6eb4bb9e3f705c71df9c0c --- diff --git a/core/java/android/app/ApplicationPackageManager.java b/core/java/android/app/ApplicationPackageManager.java index 165229912547..0608acbd6ca0 100644 --- a/core/java/android/app/ApplicationPackageManager.java +++ b/core/java/android/app/ApplicationPackageManager.java @@ -1024,12 +1024,18 @@ public class ApplicationPackageManager extends PackageManager { } @Override - @SuppressWarnings("unchecked") public List queryContentProviders(String processName, int uid, int flags) { + return queryContentProviders(processName, uid, flags, null); + } + + @Override + @SuppressWarnings("unchecked") + public List queryContentProviders(String processName, + int uid, int flags, String metaDataKey) { try { ParceledListSlice slice = - mPM.queryContentProviders(processName, uid, flags); + mPM.queryContentProviders(processName, uid, flags, metaDataKey); return slice != null ? slice.getList() : Collections.emptyList(); } catch (RemoteException e) { throw e.rethrowFromSystemServer(); diff --git a/core/java/android/content/pm/IPackageManager.aidl b/core/java/android/content/pm/IPackageManager.aidl index ffb777db579c..114d8f223b09 100644 --- a/core/java/android/content/pm/IPackageManager.aidl +++ b/core/java/android/content/pm/IPackageManager.aidl @@ -213,7 +213,7 @@ interface IPackageManager { inout List outInfo); ParceledListSlice queryContentProviders( - String processName, int uid, int flags); + String processName, int uid, int flags, String metaDataKey); InstrumentationInfo getInstrumentationInfo( in ComponentName className, int flags); diff --git a/core/java/android/content/pm/PackageManager.java b/core/java/android/content/pm/PackageManager.java index 5733982315d7..1f9b7c77bda0 100644 --- a/core/java/android/content/pm/PackageManager.java +++ b/core/java/android/content/pm/PackageManager.java @@ -4468,6 +4468,27 @@ public abstract class PackageManager { String processName, int uid, @ComponentInfoFlags int flags); /** + * Same as {@link #queryContentProviders}, except when {@code metaDataKey} is not null, + * it only returns providers which have metadata with the {@code metaDataKey} key. + * + *

DO NOT USE the {@code metaDataKey} parameter, unless you're the contacts provider. + * You really shouldn't need it. Other apps should use {@link #queryIntentContentProviders} + * instead. + * + *

The {@code metaDataKey} parameter was added to allow the contacts provider to quickly + * scan the GAL providers on the device. Unfortunately the discovery protocol used metadata + * to mark GAL providers, rather than intent filters, so we can't use + * {@link #queryIntentContentProviders} for that. + * + * @hide + */ + public List queryContentProviders( + String processName, int uid, @ComponentInfoFlags int flags, String metaDataKey) { + // Provide the default implementation for mocks. + return queryContentProviders(processName, uid, flags); + } + + /** * Retrieve all of the information we know about a particular * instrumentation class. * diff --git a/services/core/java/com/android/server/am/ActivityManagerService.java b/services/core/java/com/android/server/am/ActivityManagerService.java index 7a3326bac434..e2f9c89ae5d2 100644 --- a/services/core/java/com/android/server/am/ActivityManagerService.java +++ b/services/core/java/com/android/server/am/ActivityManagerService.java @@ -10636,7 +10636,7 @@ public class ActivityManagerService extends IActivityManager.Stub providers = AppGlobals.getPackageManager() .queryContentProviders(app.processName, app.uid, STOCK_PM_FLAGS | PackageManager.GET_URI_PERMISSION_PATTERNS - | MATCH_DEBUG_TRIAGED_MISSING) + | MATCH_DEBUG_TRIAGED_MISSING, /*metadastaKey=*/ null) .getList(); } catch (RemoteException ex) { } diff --git a/services/core/java/com/android/server/pm/PackageManagerService.java b/services/core/java/com/android/server/pm/PackageManagerService.java index 975ae0654626..65cef6fc8011 100644 --- a/services/core/java/com/android/server/pm/PackageManagerService.java +++ b/services/core/java/com/android/server/pm/PackageManagerService.java @@ -7372,7 +7372,7 @@ public class PackageManagerService extends IPackageManager.Stub { @Override public @NonNull ParceledListSlice queryContentProviders(String processName, - int uid, int flags) { + int uid, int flags, String metaDataKey) { final int userId = processName != null ? UserHandle.getUserId(uid) : UserHandle.getCallingUserId(); if (!sUserManager.exists(userId)) return ParceledListSlice.emptyList(); @@ -7390,6 +7390,14 @@ public class PackageManagerService extends IPackageManager.Stub { || (p.info.processName.equals(processName) && UserHandle.isSameApp(p.info.applicationInfo.uid, uid))) && mSettings.isEnabledAndMatchLPr(p.info, flags, userId)) { + + // See PM.queryContentProviders()'s javadoc for why we have the metaData + // parameter. + if (metaDataKey != null + && (p.metaData == null || !p.metaData.containsKey(metaDataKey))) { + continue; + } + if (finalList == null) { finalList = new ArrayList(3); }