From f6e9b95127bc2fbe663407f274de5f485ce9973c Mon Sep 17 00:00:00 2001 From: Jeff Sharkey Date: Tue, 20 Sep 2016 17:20:17 -0600 Subject: [PATCH] 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 --- .../java/com/android/server/ServiceWatcher.java | 17 ++++++++++++++++- 1 file changed, 16 insertions(+), 1 deletion(-) diff --git a/services/core/java/com/android/server/ServiceWatcher.java b/services/core/java/com/android/server/ServiceWatcher.java index 383e25a6d293c..2ff036be4b4b8 100644 --- a/services/core/java/com/android/server/ServiceWatcher.java +++ b/services/core/java/com/android/server/ServiceWatcher.java @@ -141,8 +141,12 @@ public class ServiceWatcher implements ServiceConnection { *

* 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); } @@ -173,6 +177,17 @@ public class ServiceWatcher implements ServiceConnection { return true; } + /** + * 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 @@ public class ServiceWatcher implements ServiceConnection { * 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);