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

Commit 8f2674b2 authored by Lais Andrade's avatar Lais Andrade
Browse files

Remove deprecated VibrationAttributes.getAudioAttrs method

Removing the deprecated AudioAttributes field from VibrationAttributes
in favor of a usage mapping to be used with AppOpsManager.checkAudioOp.

The mapping ensures the heuristic applied in VibrationAttributes.Builder
is taken into account by the VibratorManager.

This also adds a hidden method to Vibrator to allow forwarding a
VibrationAttributes to input device vibrators instead of relying on the
original AudioAttributes.

Bug: 163119475
Test: atest FrameworksServicesTests:VibratorServiceTest
      atest FrameworksCoreTests:VibratorTest
Change-Id: I83dbe079865b453c4cf42a6fd7e71f822acc39ea
parent 1dab7a7c
Loading
Loading
Loading
Loading
+1 −1
Original line number Diff line number Diff line
@@ -2982,7 +2982,7 @@ package android.os {
  }

  public final class VibrationAttributes implements android.os.Parcelable {
    method @Deprecated @NonNull public android.media.AudioAttributes getAudioAttributes();
    method public int getAudioUsage();
  }

  public static final class VibrationAttributes.Builder {
+3 −3
Original line number Diff line number Diff line
@@ -25,7 +25,6 @@ import android.annotation.SdkConstant.SdkConstantType;
import android.annotation.SystemService;
import android.compat.annotation.UnsupportedAppUsage;
import android.content.Context;
import android.media.AudioAttributes;
import android.os.Binder;
import android.os.Build;
import android.os.Handler;
@@ -36,6 +35,7 @@ import android.os.RemoteException;
import android.os.ServiceManager;
import android.os.ServiceManager.ServiceNotFoundException;
import android.os.SystemClock;
import android.os.VibrationAttributes;
import android.os.VibrationEffect;
import android.os.Vibrator;
import android.provider.Settings;
@@ -1295,8 +1295,8 @@ public final class InputManager {
         * @hide
         */
        @Override
        public void vibrate(int uid, String opPkg, VibrationEffect effect,
                String reason, AudioAttributes attributes) {
        public void vibrate(int uid, String opPkg, @NonNull VibrationEffect effect,
                String reason, @NonNull VibrationAttributes attributes) {
            try {
                mIm.vibrate(mDeviceId, effect, mToken);
            } catch (RemoteException ex) {
+1 −3
Original line number Diff line number Diff line
@@ -16,8 +16,6 @@

package android.os;

import android.media.AudioAttributes;

/**
 * Vibrator implementation that does nothing.
 *
@@ -50,7 +48,7 @@ public class NullVibrator extends Vibrator {

    @Override
    public void vibrate(int uid, String opPkg, VibrationEffect effect,
            String reason, AudioAttributes attributes) {
            String reason, VibrationAttributes attributes) {
    }

    @Override
+3 −7
Original line number Diff line number Diff line
@@ -221,18 +221,14 @@ public class SystemVibrator extends Vibrator {
    }

    @Override
    public void vibrate(int uid, String opPkg, VibrationEffect effect,
            String reason, AudioAttributes attributes) {
    public void vibrate(int uid, String opPkg, @NonNull VibrationEffect effect,
            String reason, @NonNull VibrationAttributes attributes) {
        if (mService == null) {
            Log.w(TAG, "Failed to vibrate; no vibrator service.");
            return;
        }
        try {
            if (attributes == null) {
                attributes = new AudioAttributes.Builder().build();
            }
            VibrationAttributes atr = new VibrationAttributes.Builder(attributes, effect).build();
            mService.vibrate(uid, opPkg, effect, atr, reason, mToken);
            mService.vibrate(uid, opPkg, effect, attributes, reason, mToken);
        } catch (RemoteException e) {
            Log.w(TAG, "Failed to vibrate.", e);
        }
+37 −22
Original line number Diff line number Diff line
@@ -140,13 +140,12 @@ public final class VibrationAttributes implements Parcelable {

    private final int mUsage;
    private final int mFlags;
    private final int mOriginalAudioUsage;

    private final AudioAttributes mAudioAttributes;

    private VibrationAttributes(int usage, int flags, @NonNull AudioAttributes audio) {
    private VibrationAttributes(int usage, int audioUsage, int flags) {
        mUsage = usage;
        mOriginalAudioUsage = audioUsage;
        mFlags = flags & FLAG_ALL_SUPPORTED;
        mAudioAttributes = audio;
    }

    /**
@@ -182,14 +181,31 @@ public final class VibrationAttributes implements Parcelable {
    }

    /**
     * Return AudioAttributes equivalent to this VibrationAttributes.
     * @deprecated Temporary support of AudioAttributes, will be removed when out of WIP
     * Return {@link AudioAttributes} usage equivalent to {@link #getUsage()}.
     * @return one of {@link AudioAttributes#SDK_USAGES} that represents {@link #getUsage()}
     * @hide
     */
    @Deprecated
    @TestApi
    public @NonNull AudioAttributes getAudioAttributes() {
        return mAudioAttributes;
    public int getAudioUsage() {
        if (mOriginalAudioUsage != AudioAttributes.USAGE_UNKNOWN) {
            // Return same audio usage set in the Builder.
            return mOriginalAudioUsage;
        }
        // Return correct audio usage based on the vibration usage set in the Builder.
        switch (mUsage) {
            case USAGE_NOTIFICATION:
                return AudioAttributes.USAGE_NOTIFICATION;
            case USAGE_COMMUNICATION_REQUEST:
                return AudioAttributes.USAGE_NOTIFICATION_COMMUNICATION_REQUEST;
            case USAGE_RINGTONE:
                return AudioAttributes.USAGE_NOTIFICATION_RINGTONE;
            case USAGE_TOUCH:
                return AudioAttributes.USAGE_ASSISTANCE_SONIFICATION;
            case USAGE_ALARM:
                return AudioAttributes.USAGE_ALARM;
            default:
                return AudioAttributes.USAGE_UNKNOWN;
        }
    }

    @Override
@@ -200,15 +216,14 @@ public final class VibrationAttributes implements Parcelable {
    @Override
    public void writeToParcel(@NonNull Parcel dest, int flags) {
        dest.writeInt(mUsage);
        dest.writeInt(mOriginalAudioUsage);
        dest.writeInt(mFlags);
        dest.writeParcelable(mAudioAttributes, flags);
    }

    private VibrationAttributes(Parcel src) {
        mUsage = src.readInt();
        mOriginalAudioUsage = src.readInt();
        mFlags = src.readInt();
        mAudioAttributes = (AudioAttributes) src.readParcelable(
                AudioAttributes.class.getClassLoader());
    }

    public static final @NonNull Parcelable.Creator<VibrationAttributes>
@@ -230,18 +245,20 @@ public final class VibrationAttributes implements Parcelable {
            return false;
        }
        VibrationAttributes rhs = (VibrationAttributes) o;
        return mUsage == rhs.mUsage && mFlags == rhs.mFlags;
        return mUsage == rhs.mUsage && mOriginalAudioUsage == rhs.mOriginalAudioUsage
                && mFlags == rhs.mFlags;
    }

    @Override
    public int hashCode() {
        return Objects.hash(mUsage, mFlags);
        return Objects.hash(mUsage, mOriginalAudioUsage, mFlags);
    }

    @Override
    public String toString() {
        return "VibrationAttributes:"
                + " Usage=" + usageToString()
                + " Audio Usage= " + AudioAttributes.usageToString(mOriginalAudioUsage)
                + " Flags=" + mFlags;
    }

@@ -280,10 +297,9 @@ public final class VibrationAttributes implements Parcelable {
     */
    public static final class Builder {
        private int mUsage = USAGE_UNKNOWN;
        private int mOriginalAudioUsage = AudioAttributes.USAGE_UNKNOWN;
        private int mFlags = 0x0;

        private AudioAttributes mAudioAttributes = new AudioAttributes.Builder().build();

        /**
         * Constructs a new Builder with the defaults.
         */
@@ -296,8 +312,8 @@ public final class VibrationAttributes implements Parcelable {
        public Builder(@Nullable VibrationAttributes vib) {
            if (vib != null) {
                mUsage = vib.mUsage;
                mOriginalAudioUsage = vib.mOriginalAudioUsage;
                mFlags = vib.mFlags;
                mAudioAttributes = vib.mAudioAttributes;
            }
        }

@@ -306,9 +322,7 @@ public final class VibrationAttributes implements Parcelable {
         * @hide
         */
        @TestApi
        public Builder(@NonNull AudioAttributes audio,
                @Nullable VibrationEffect effect) {
            mAudioAttributes = audio;
        public Builder(@NonNull AudioAttributes audio, @Nullable VibrationEffect effect) {
            setUsage(audio);
            setFlags(audio);
            applyHapticFeedbackHeuristics(effect);
@@ -342,6 +356,7 @@ public final class VibrationAttributes implements Parcelable {
        }

        private void setUsage(@NonNull AudioAttributes audio) {
            mOriginalAudioUsage = audio.getUsage();
            switch (audio.getUsage()) {
                case AudioAttributes.USAGE_NOTIFICATION:
                case AudioAttributes.USAGE_NOTIFICATION_EVENT:
@@ -379,8 +394,7 @@ public final class VibrationAttributes implements Parcelable {
         * @return a new {@link VibrationAttributes} object
         */
        public @NonNull VibrationAttributes build() {
            VibrationAttributes ans = new VibrationAttributes(mUsage, mFlags,
                    mAudioAttributes);
            VibrationAttributes ans = new VibrationAttributes(mUsage, mOriginalAudioUsage, mFlags);
            return ans;
        }

@@ -396,6 +410,7 @@ public final class VibrationAttributes implements Parcelable {
         * @return the same Builder instance.
         */
        public @NonNull Builder setUsage(int usage) {
            mOriginalAudioUsage = AudioAttributes.USAGE_UNKNOWN;
            mUsage = usage;
            return this;
        }
Loading