Create config for audio haptic channels max value

Leave the configuration empty by default, which should be ignored by the
audio framework and impose no limit to haptic signals.

Bug: 188025353
Test: N/A
Change-Id: I7553fc00d59d6b0dd52c679320880fc86c4c4aa7
diff --git a/core/java/android/os/Vibrator.java b/core/java/android/os/Vibrator.java
index 12538e6..d7893e4 100644
--- a/core/java/android/os/Vibrator.java
+++ b/core/java/android/os/Vibrator.java
@@ -126,6 +126,7 @@
     // The default vibration intensity level for ringtones.
     @VibrationIntensity
     private int mDefaultRingVibrationIntensity;
+    private float mHapticChannelMaxVibrationAmplitude;
 
     /**
      * @hide to prevent subclassing from outside of the framework
@@ -134,7 +135,7 @@
     public Vibrator() {
         mPackageName = ActivityThread.currentPackageName();
         final Context ctx = ActivityThread.currentActivityThread().getSystemContext();
-        loadVibrationIntensities(ctx);
+        loadVibrationConfig(ctx);
     }
 
     /**
@@ -142,22 +143,28 @@
      */
     protected Vibrator(Context context) {
         mPackageName = context.getOpPackageName();
-        loadVibrationIntensities(context);
+        loadVibrationConfig(context);
     }
 
-    private void loadVibrationIntensities(Context context) {
+    private void loadVibrationConfig(Context context) {
         mDefaultHapticFeedbackIntensity = loadDefaultIntensity(context,
                 com.android.internal.R.integer.config_defaultHapticFeedbackIntensity);
         mDefaultNotificationVibrationIntensity = loadDefaultIntensity(context,
                 com.android.internal.R.integer.config_defaultNotificationVibrationIntensity);
         mDefaultRingVibrationIntensity = loadDefaultIntensity(context,
                 com.android.internal.R.integer.config_defaultRingVibrationIntensity);
+        mHapticChannelMaxVibrationAmplitude = loadFloat(context,
+                com.android.internal.R.dimen.config_hapticChannelMaxVibrationAmplitude, 0);
     }
 
     private int loadDefaultIntensity(Context ctx, int resId) {
         return ctx != null ? ctx.getResources().getInteger(resId) : VIBRATION_INTENSITY_MEDIUM;
     }
 
+    private float loadFloat(Context ctx, int resId, float defaultValue) {
+        return ctx != null ? ctx.getResources().getFloat(resId) : defaultValue;
+    }
+
     /** @hide */
     protected VibratorInfo getInfo() {
         return VibratorInfo.EMPTY_VIBRATOR_INFO;
@@ -297,6 +304,24 @@
     }
 
     /**
+     * Return the maximum amplitude the vibrator can play using the audio haptic channels.
+     *
+     * <p>This is a positive value, or {@link Float#NaN NaN} if it's unknown. If this returns a
+     * positive value <code>maxAmplitude</code>, then the signals from the haptic channels of audio
+     * tracks should be in the range <code>[-maxAmplitude, maxAmplitude]</code>.
+     *
+     * @return a positive value representing the maximum absolute value the device can play signals
+     * from audio haptic channels, or {@link Float#NaN NaN} if it's unknown.
+     * @hide
+     */
+    public float getHapticChannelMaximumAmplitude() {
+        if (mHapticChannelMaxVibrationAmplitude <= 0) {
+            return Float.NaN;
+        }
+        return mHapticChannelMaxVibrationAmplitude;
+    }
+
+    /**
      * Configure an always-on haptics effect.
      *
      * @param alwaysOnId The board-specific always-on ID to configure.
diff --git a/core/res/res/values/config.xml b/core/res/res/values/config.xml
index 3c47366..f4aff94 100644
--- a/core/res/res/values/config.xml
+++ b/core/res/res/values/config.xml
@@ -3350,6 +3350,10 @@
     <!-- The default vibration strength, must be between 1 and 255 inclusive. -->
     <integer name="config_defaultVibrationAmplitude">255</integer>
 
+    <!-- The max vibration strength allowed in audio haptic channels, must be positive or zero if
+         limit is unknown. -->
+    <item name="config_hapticChannelMaxVibrationAmplitude" format="float" type="dimen">0</item>
+
     <!-- If the device should still vibrate even in low power mode, for certain priority vibrations
      (e.g. accessibility, alarms). This is mainly for Wear devices that don't have speakers. -->
     <bool name="config_allowPriorityVibrationsInLowPowerMode">false</bool>
diff --git a/core/res/res/values/symbols.xml b/core/res/res/values/symbols.xml
index 97a2a38..ca22274 100644
--- a/core/res/res/values/symbols.xml
+++ b/core/res/res/values/symbols.xml
@@ -2013,6 +2013,7 @@
   <java-symbol type="integer" name="config_notificationServiceArchiveSize" />
   <java-symbol type="integer" name="config_previousVibrationsDumpLimit" />
   <java-symbol type="integer" name="config_defaultVibrationAmplitude" />
+  <java-symbol type="dimen" name="config_hapticChannelMaxVibrationAmplitude" />
   <java-symbol type="integer" name="config_vibrationWaveformRampStepDuration" />
   <java-symbol type="integer" name="config_vibrationWaveformRampDownDuration" />
   <java-symbol type="integer" name="config_radioScanningTimeout" />
diff --git a/services/core/java/com/android/server/vibrator/VibrationSettings.java b/services/core/java/com/android/server/vibrator/VibrationSettings.java
index f756434..885f0e4 100644
--- a/services/core/java/com/android/server/vibrator/VibrationSettings.java
+++ b/services/core/java/com/android/server/vibrator/VibrationSettings.java
@@ -353,6 +353,7 @@
                 + ", mLowPowerMode=" + mLowPowerMode
                 + ", mZenMode=" + Settings.Global.zenModeToString(mZenMode)
                 + ", mProcStatesCache=" + mUidObserver.mProcStatesCache
+                + ", mHapticChannelMaxVibrationAmplitude=" + getHapticChannelMaxVibrationAmplitude()
                 + ", mHapticFeedbackIntensity="
                 + intensityToString(getCurrentIntensity(VibrationAttributes.USAGE_TOUCH))
                 + ", mHapticFeedbackDefaultIntensity="
@@ -411,6 +412,12 @@
         }
     }
 
+    private float getHapticChannelMaxVibrationAmplitude() {
+        synchronized (mLock) {
+            return mVibrator == null ? Float.NaN : mVibrator.getHapticChannelMaximumAmplitude();
+        }
+    }
+
     private int getSystemSetting(String settingName, int defaultValue) {
         return Settings.System.getIntForUser(mContext.getContentResolver(),
                 settingName, defaultValue, UserHandle.USER_CURRENT);