Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit e0534ac9 authored by Jakub Pawlowski's avatar Jakub Pawlowski
Browse files

Cache results of isLocationEnabledForUser calls

This reduces number of Binder calls that Bluetooth stack is making while
scanning in a noisy environments.

Currently we make one call for each scan result. After this patch, the
result is cached for two seconds.

Test: observe result of "adb shell dumpsys binder_calls_stats" during
      scan.
Bug: 125739276
Change-Id: I777417de356c323b8ea5bebfd1b0a29c27730b13
parent 73450ac8
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -22,6 +22,7 @@ LOCAL_JAVA_LIBRARIES := javax.obex telephony-common services.net
LOCAL_STATIC_JAVA_LIBRARIES := \
        com.android.vcard \
        bluetooth.mapsapi \
        guava \
        sap-api-java-static \
        services.net \
        libprotobuf-java-lite \
+26 −1
Original line number Diff line number Diff line
@@ -34,6 +34,10 @@ import android.os.UserHandle;
import android.os.UserManager;
import android.util.Log;

import com.google.common.cache.CacheBuilder;
import com.google.common.cache.CacheLoader;
import com.google.common.cache.LoadingCache;

import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
@@ -301,9 +305,30 @@ public final class Utils {
     * Checks whether location is off and must be on for us to perform some operation
     */
    public static boolean blockedByLocationOff(Context context, UserHandle userHandle) {
        return !context.getSystemService(LocationManager.class)
        if (mBlockedByLocationOffContext == null)
            mBlockedByLocationOffContext = context;

        try {
            return mBlockedByLocationOffCache.get(userHandle);
        } catch (java.util.concurrent.ExecutionException e) {
            Log.e(TAG, "blockedByLocationOff: " + e);
            return context.getSystemService(LocationManager.class)
                .isLocationEnabledForUser(userHandle);
        }
    }

   static Context mBlockedByLocationOffContext = null;
   // Cache location off for 10 users, cache is valid for 2 seconds.
   static LoadingCache<UserHandle, Boolean> mBlockedByLocationOffCache = CacheBuilder.newBuilder()
       .maximumSize(10)
       .expireAfterWrite(2, TimeUnit.SECONDS)
       .build(
           new CacheLoader<UserHandle, Boolean>() {
             public Boolean load(UserHandle userHandle) {
               return !mBlockedByLocationOffContext.getSystemService(LocationManager.class)
                .isLocationEnabledForUser(userHandle);
             }
           });

    /**
     * Checks that calling process has android.Manifest.permission.ACCESS_COARSE_LOCATION and