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
This commit is contained in:
Jeff Sharkey
2016-09-20 17:20:17 -06:00
committed by Jeff Sharkey
parent bad468ad5b
commit f6e9b95127

View File

@@ -141,8 +141,12 @@ public class ServiceWatcher implements ServiceConnection {
* <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);
}
@@ -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);