From e69b5f417728a97b6e27a84dd55a76cf8de79dca Mon Sep 17 00:00:00 2001 From: Lais Andrade Date: Tue, 19 Jan 2021 17:13:45 +0000 Subject: [PATCH] Cache result from VibratorService.hasVibrator in SystemVibrator The existing implementation of performHapticFeedback in PhoneWindowManager uses both hasVibrator and vibrate methods from Vibrator class. The implementation of VibratorService.hasVibrator is already constant, returning true if the device has a built in vibrator. This adds a cache for this value to SystemVibrator, to avoid binder calls to system_server after the first one. Bug: 170127981 Test: manual Change-Id: I68934a41068f4388449321d08a42d8bf890ea91e --- core/java/android/os/SystemVibrator.java | 31 ++++++++++++++++++------ 1 file changed, 24 insertions(+), 7 deletions(-) diff --git a/core/java/android/os/SystemVibrator.java b/core/java/android/os/SystemVibrator.java index 0330500f09977..30afe38be397d 100644 --- a/core/java/android/os/SystemVibrator.java +++ b/core/java/android/os/SystemVibrator.java @@ -17,6 +17,7 @@ package android.os; import android.annotation.CallbackExecutor; +import android.annotation.IntDef; import android.annotation.NonNull; import android.annotation.Nullable; import android.compat.annotation.UnsupportedAppUsage; @@ -27,6 +28,8 @@ import android.util.Log; import com.android.internal.annotations.GuardedBy; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; import java.util.Objects; import java.util.concurrent.Executor; @@ -38,6 +41,14 @@ import java.util.concurrent.Executor; public class SystemVibrator extends Vibrator { private static final String TAG = "Vibrator"; + private static final int VIBRATOR_PRESENT_UNKNOWN = 0; + private static final int VIBRATOR_PRESENT_YES = 1; + private static final int VIBRATOR_PRESENT_NO = 2; + + @Retention(RetentionPolicy.SOURCE) + @IntDef({VIBRATOR_PRESENT_UNKNOWN, VIBRATOR_PRESENT_YES, VIBRATOR_PRESENT_NO}) + private @interface VibratorPresent {} + private final IVibratorService mService; private final IVibratorManagerService mManagerService; private final Object mLock = new Object(); @@ -45,6 +56,9 @@ public class SystemVibrator extends Vibrator { private final Context mContext; @GuardedBy("mLock") private VibratorInfo mVibratorInfo; + @GuardedBy("mLock") + @VibratorPresent + private int mVibratorPresent; @GuardedBy("mDelegates") private final ArrayMap