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

Commit 7121697a authored by Michael Wright's avatar Michael Wright
Browse files

BZZZZZZT! BZZZZZT! New Vibrator APIs

Replace the existing Vibrator APIs with a new class to encapsulate the
haptic effect information, and add the ability to control the vibration
strength.

Test: cts-tradefed run commandAndExit cts-dev -m CtsOsTestCases -t android.os.cts.VibratorTest
      cts-tradefed run commandAndExit cts-dev -m CtsOsTestCases -t android.os.cts.VibrationEffectTest
      runtest systemui-notification
      Manual testing with $T/google_experimental/users/michaelwr/Vibrator

Bug: 30961353

Change-Id: Idbb9864a7b084c85e7b7de3257a0e6b40d9d91d6
parent 66dc7be9
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -568,6 +568,7 @@ LOCAL_STATIC_JAVA_LIBRARIES := \
    android.hardware.thermal@1.0-java-constants         \
    android.hardware.health@1.0-java-constants          \
    android.hardware.usb@1.0-java-constants             \
    android.hardware.vibrator@1.0-java-constants        \

LOCAL_PROTOC_OPTIMIZE_TYPE := stream
LOCAL_PROTOC_FLAGS := \
+16 −4
Original line number Diff line number Diff line
@@ -31654,13 +31654,25 @@ package android.os {
    field public static final int USER_CREATION_FAILED_NO_MORE_USERS = 2; // 0x2
  }
  public abstract class VibrationEffect implements android.os.Parcelable {
    method public static android.os.VibrationEffect createOneShot(long, int);
    method public static android.os.VibrationEffect createWaveform(long[], int);
    method public static android.os.VibrationEffect createWaveform(long[], int[], int);
    method public int describeContents();
    field public static final android.os.Parcelable.Creator<android.os.VibrationEffect> CREATOR;
    field public static final int DEFAULT_AMPLITUDE = -1; // 0xffffffff
  }
  public abstract class Vibrator {
    method public abstract void cancel();
    method public abstract boolean hasAmplitudeControl();
    method public abstract boolean hasVibrator();
    method public void vibrate(long);
    method public void vibrate(long, android.media.AudioAttributes);
    method public void vibrate(long[], int);
    method public void vibrate(long[], int, android.media.AudioAttributes);
    method public deprecated void vibrate(long);
    method public deprecated void vibrate(long, android.media.AudioAttributes);
    method public deprecated void vibrate(long[], int);
    method public deprecated void vibrate(long[], int, android.media.AudioAttributes);
    method public void vibrate(android.os.VibrationEffect);
    method public void vibrate(android.os.VibrationEffect, android.media.AudioAttributes);
  }
  public class WorkSource implements android.os.Parcelable {
+16 −4
Original line number Diff line number Diff line
@@ -34494,13 +34494,25 @@ package android.os {
  public static abstract class UserManager.UserRestrictionSource implements java.lang.annotation.Annotation {
  }
  public abstract class VibrationEffect implements android.os.Parcelable {
    method public static android.os.VibrationEffect createOneShot(long, int);
    method public static android.os.VibrationEffect createWaveform(long[], int);
    method public static android.os.VibrationEffect createWaveform(long[], int[], int);
    method public int describeContents();
    field public static final android.os.Parcelable.Creator<android.os.VibrationEffect> CREATOR;
    field public static final int DEFAULT_AMPLITUDE = -1; // 0xffffffff
  }
  public abstract class Vibrator {
    method public abstract void cancel();
    method public abstract boolean hasAmplitudeControl();
    method public abstract boolean hasVibrator();
    method public void vibrate(long);
    method public void vibrate(long, android.media.AudioAttributes);
    method public void vibrate(long[], int);
    method public void vibrate(long[], int, android.media.AudioAttributes);
    method public deprecated void vibrate(long);
    method public deprecated void vibrate(long, android.media.AudioAttributes);
    method public deprecated void vibrate(long[], int);
    method public deprecated void vibrate(long[], int, android.media.AudioAttributes);
    method public void vibrate(android.os.VibrationEffect);
    method public void vibrate(android.os.VibrationEffect, android.media.AudioAttributes);
  }
  public class WorkSource implements android.os.Parcelable {
+16 −4
Original line number Diff line number Diff line
@@ -31779,13 +31779,25 @@ package android.os {
    field public static final int USER_CREATION_FAILED_NO_MORE_USERS = 2; // 0x2
  }
  public abstract class VibrationEffect implements android.os.Parcelable {
    method public static android.os.VibrationEffect createOneShot(long, int);
    method public static android.os.VibrationEffect createWaveform(long[], int);
    method public static android.os.VibrationEffect createWaveform(long[], int[], int);
    method public int describeContents();
    field public static final android.os.Parcelable.Creator<android.os.VibrationEffect> CREATOR;
    field public static final int DEFAULT_AMPLITUDE = -1; // 0xffffffff
  }
  public abstract class Vibrator {
    method public abstract void cancel();
    method public abstract boolean hasAmplitudeControl();
    method public abstract boolean hasVibrator();
    method public void vibrate(long);
    method public void vibrate(long, android.media.AudioAttributes);
    method public void vibrate(long[], int);
    method public void vibrate(long[], int, android.media.AudioAttributes);
    method public deprecated void vibrate(long);
    method public deprecated void vibrate(long, android.media.AudioAttributes);
    method public deprecated void vibrate(long[], int);
    method public deprecated void vibrate(long[], int, android.media.AudioAttributes);
    method public void vibrate(android.os.VibrationEffect);
    method public void vibrate(android.os.VibrationEffect, android.media.AudioAttributes);
  }
  public class WorkSource implements android.os.Parcelable {
+20 −9
Original line number Diff line number Diff line
@@ -33,6 +33,7 @@ import android.os.RemoteException;
import android.os.ServiceManager;
import android.os.SystemClock;
import android.os.Vibrator;
import android.os.VibrationEffect;
import android.os.ServiceManager.ServiceNotFoundException;
import android.provider.Settings;
import android.provider.Settings.SettingNotFoundException;
@@ -1154,23 +1155,33 @@ public final class InputManager {
            return true;
        }

        /**
         * @hide
         */
        @Override
        public void vibrate(int uid, String opPkg, long milliseconds, AudioAttributes attributes) {
            vibrate(new long[] { 0, milliseconds}, -1);
        public boolean hasAmplitudeControl() {
            return false;
        }

        /**
         * @hide
         */
        @Override
        public void vibrate(int uid, String opPkg, long[] pattern, int repeat,
                AudioAttributes attributes) {
            if (repeat >= pattern.length) {
                throw new ArrayIndexOutOfBoundsException();
        public void vibrate(int uid, String opPkg,
                VibrationEffect effect, AudioAttributes attributes) {
            long[] pattern;
            int repeat;
            if (effect instanceof VibrationEffect.OneShot) {
                VibrationEffect.OneShot oneShot = (VibrationEffect.OneShot) effect;
                pattern = new long[] { 0, oneShot.getTiming() };
                repeat = -1;
            } else if (effect instanceof VibrationEffect.Waveform) {
                VibrationEffect.Waveform waveform = (VibrationEffect.Waveform) effect;
                pattern = waveform.getTimings();
                repeat = waveform.getRepeatIndex();
            } else {
                // TODO: Add support for prebaked effects
                Log.w(TAG, "Pre-baked effects aren't supported on input devices");
                return;
            }

            try {
                mIm.vibrate(mDeviceId, pattern, repeat, mToken);
            } catch (RemoteException ex) {
Loading