Check if anyone could possibly provide service.
If no service is present that could satisfy a given ServiceWatcher,
then return false. For example, on devices were there is no Geocoder
service implementation, we need to avoid claiming that the API is
supported.
Test: booted
Bug: 30837973
Change-Id: Ib0834cf1a12623733f8b472dc3da7b3e2adc4515
diff --git a/services/core/java/com/android/server/ServiceWatcher.java b/services/core/java/com/android/server/ServiceWatcher.java
index 383e25a..2ff036b 100644
--- a/services/core/java/com/android/server/ServiceWatcher.java
+++ b/services/core/java/com/android/server/ServiceWatcher.java
@@ -141,8 +141,12 @@
* <p>
* Note that if there are no matching encryption-aware services, we may not
* bind to a real service until after the current user is unlocked.
+ *
+ * @returns {@code true} if a potential service implementation was found.
*/
public boolean start() {
+ if (isServiceMissing()) return false;
+
synchronized (mLock) {
bindBestPackageLocked(mServicePackageName, false);
}
@@ -174,6 +178,17 @@
}
/**
+ * Check if any instance of this service is present on the device,
+ * regardless of it being encryption-aware or not.
+ */
+ private boolean isServiceMissing() {
+ final Intent intent = new Intent(mAction);
+ final int flags = PackageManager.MATCH_DIRECT_BOOT_AWARE
+ | PackageManager.MATCH_DIRECT_BOOT_UNAWARE;
+ return mPm.queryIntentServicesAsUser(intent, flags, mCurrentUserId).isEmpty();
+ }
+
+ /**
* Searches and binds to the best package, or do nothing if the best package
* is already bound, unless force rebinding is requested.
*
@@ -181,7 +196,7 @@
* packages if it is {@code null}.
* @param forceRebind Force a rebinding to the best package if it's already
* bound.
- * @return {@code true} if a valid package was found to bind to.
+ * @returns {@code true} if a valid package was found to bind to.
*/
private boolean bindBestPackageLocked(String justCheckThisPackage, boolean forceRebind) {
Intent intent = new Intent(mAction);