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

Commit eff7ffab authored by Ahmad Khalil's avatar Ahmad Khalil Committed by Android (Google) Code Review
Browse files

Merge "Renaming Frequency Profile APIs" into main

parents de8a8831 c17b99d1
Loading
Loading
Loading
Loading
+2 −2
Original line number Diff line number Diff line
@@ -2603,7 +2603,7 @@ package android.os {

  public abstract class Vibrator {
    method public int getDefaultVibrationIntensity(int);
    method @Nullable public android.os.vibrator.VibratorFrequencyProfile getFrequencyProfile();
    method @Nullable public android.os.vibrator.VibratorFrequencyProfileLegacy getFrequencyProfileLegacy();
    method public boolean hasFrequencyControl();
    field public static final int VIBRATION_INTENSITY_HIGH = 3; // 0x3
    field public static final int VIBRATION_INTENSITY_LOW = 1; // 0x1
@@ -2793,7 +2793,7 @@ package android.os.vibrator {
    field @NonNull public static final android.os.Parcelable.Creator<android.os.vibrator.VibrationEffectSegment> CREATOR;
  }

  public final class VibratorFrequencyProfile {
  public final class VibratorFrequencyProfileLegacy {
    method public float getMaxAmplitudeMeasurementInterval();
    method @FloatRange(from=0, to=1) @NonNull public float[] getMaxAmplitudeMeasurements();
    method public float getMaxFrequency();
+3 −2
Original line number Diff line number Diff line
@@ -40,6 +40,7 @@ import android.os.vibrator.PrimitiveSegment;
import android.os.vibrator.RampSegment;
import android.os.vibrator.StepSegment;
import android.os.vibrator.VibrationEffectSegment;
import android.os.vibrator.VibratorFrequencyProfileLegacy;
import android.util.MathUtils;

import com.android.internal.util.Preconditions;
@@ -1761,7 +1762,7 @@ public abstract class VibrationEffect implements Parcelable {
         * new value as fast as possible.
         *
         * <p>Vibration parameter values will be truncated to conform to the device capabilities
         * according to the {@link android.os.vibrator.VibratorFrequencyProfile}.
         * according to the {@link VibratorFrequencyProfileLegacy}.
         *
         * @param duration        The length of time this transition should take. Value must be
         *                        non-negative and will be truncated to milliseconds.
@@ -1792,7 +1793,7 @@ public abstract class VibrationEffect implements Parcelable {
         * new values as fast as possible.
         *
         * <p>Vibration parameters values will be truncated to conform to the device capabilities
         * according to the {@link android.os.vibrator.VibratorFrequencyProfile}.
         * according to the {@link VibratorFrequencyProfileLegacy}.
         *
         * @param duration         The length of time this transition should take. Value must be
         *                         non-negative and will be truncated to milliseconds.
+7 −4
Original line number Diff line number Diff line
@@ -22,6 +22,7 @@ import android.annotation.IntDef;
import android.annotation.NonNull;
import android.annotation.Nullable;
import android.annotation.RequiresPermission;
import android.annotation.SuppressLint;
import android.annotation.SystemApi;
import android.annotation.SystemService;
import android.annotation.TestApi;
@@ -33,7 +34,7 @@ import android.hardware.vibrator.IVibrator;
import android.media.AudioAttributes;
import android.os.vibrator.Flags;
import android.os.vibrator.VibrationConfig;
import android.os.vibrator.VibratorFrequencyProfile;
import android.os.vibrator.VibratorFrequencyProfileLegacy;
import android.util.Log;
import android.view.HapticFeedbackConstants;

@@ -290,13 +291,15 @@ public abstract class Vibrator {
     * @hide
     */
    @TestApi
    @SuppressLint("UnflaggedApi")
    @Nullable
    public VibratorFrequencyProfile getFrequencyProfile() {
        VibratorInfo.FrequencyProfile frequencyProfile = getInfo().getFrequencyProfile();
    public VibratorFrequencyProfileLegacy getFrequencyProfileLegacy() {
        VibratorInfo.FrequencyProfileLegacy frequencyProfile =
                getInfo().getFrequencyProfileLegacy();
        if (frequencyProfile.isEmpty()) {
            return null;
        }
        return new VibratorFrequencyProfile(frequencyProfile);
        return new VibratorFrequencyProfileLegacy(frequencyProfile);
    }

    /**
+32 −32
Original line number Diff line number Diff line
@@ -59,7 +59,7 @@ public class VibratorInfo implements Parcelable {
    private final int mPwlePrimitiveDurationMax;
    private final int mPwleSizeMax;
    private final float mQFactor;
    private final FrequencyProfile mFrequencyProfile;
    private final FrequencyProfileLegacy mFrequencyProfileLegacy;
    private final int mMaxEnvelopeEffectSize;
    private final int mMinEnvelopeEffectControlPointDurationMillis;
    private final int mMaxEnvelopeEffectControlPointDurationMillis;
@@ -75,7 +75,7 @@ public class VibratorInfo implements Parcelable {
        mPwlePrimitiveDurationMax = in.readInt();
        mPwleSizeMax = in.readInt();
        mQFactor = in.readFloat();
        mFrequencyProfile = FrequencyProfile.CREATOR.createFromParcel(in);
        mFrequencyProfileLegacy = FrequencyProfileLegacy.CREATOR.createFromParcel(in);
        mMaxEnvelopeEffectSize = in.readInt();
        mMinEnvelopeEffectControlPointDurationMillis = in.readInt();
        mMaxEnvelopeEffectControlPointDurationMillis = in.readInt();
@@ -86,7 +86,7 @@ public class VibratorInfo implements Parcelable {
                baseVibratorInfo.mSupportedBraking, baseVibratorInfo.mSupportedPrimitives,
                baseVibratorInfo.mPrimitiveDelayMax, baseVibratorInfo.mCompositionSizeMax,
                baseVibratorInfo.mPwlePrimitiveDurationMax, baseVibratorInfo.mPwleSizeMax,
                baseVibratorInfo.mQFactor, baseVibratorInfo.mFrequencyProfile,
                baseVibratorInfo.mQFactor, baseVibratorInfo.mFrequencyProfileLegacy,
                baseVibratorInfo.mMaxEnvelopeEffectSize,
                baseVibratorInfo.mMinEnvelopeEffectControlPointDurationMillis,
                baseVibratorInfo.mMaxEnvelopeEffectControlPointDurationMillis);
@@ -112,7 +112,7 @@ public class VibratorInfo implements Parcelable {
     * @param pwleSizeMax              The maximum number of primitives supported by a PWLE
     *                                 composition.
     * @param qFactor                  The vibrator quality factor.
     * @param frequencyProfile         The description of the vibrator supported frequencies and max
     * @param frequencyProfileLegacy   The description of the vibrator supported frequencies and max
     *                                 amplitude mappings.
     * @hide
     */
@@ -120,11 +120,11 @@ public class VibratorInfo implements Parcelable {
            @Nullable SparseBooleanArray supportedBraking,
            @NonNull SparseIntArray supportedPrimitives, int primitiveDelayMax,
            int compositionSizeMax, int pwlePrimitiveDurationMax, int pwleSizeMax,
            float qFactor, @NonNull FrequencyProfile frequencyProfile,
            float qFactor, @NonNull FrequencyProfileLegacy frequencyProfileLegacy,
            int maxEnvelopeEffectSize, int minEnvelopeEffectControlPointDurationMillis,
            int maxEnvelopeEffectControlPointDurationMillis) {
        Preconditions.checkNotNull(supportedPrimitives);
        Preconditions.checkNotNull(frequencyProfile);
        Preconditions.checkNotNull(frequencyProfileLegacy);
        mId = id;
        mCapabilities = capabilities;
        mSupportedEffects = supportedEffects == null ? null : supportedEffects.clone();
@@ -135,7 +135,7 @@ public class VibratorInfo implements Parcelable {
        mPwlePrimitiveDurationMax = pwlePrimitiveDurationMax;
        mPwleSizeMax = pwleSizeMax;
        mQFactor = qFactor;
        mFrequencyProfile = frequencyProfile;
        mFrequencyProfileLegacy = frequencyProfileLegacy;
        mMaxEnvelopeEffectSize = maxEnvelopeEffectSize;
        mMinEnvelopeEffectControlPointDurationMillis =
                minEnvelopeEffectControlPointDurationMillis;
@@ -155,7 +155,7 @@ public class VibratorInfo implements Parcelable {
        dest.writeInt(mPwlePrimitiveDurationMax);
        dest.writeInt(mPwleSizeMax);
        dest.writeFloat(mQFactor);
        mFrequencyProfile.writeToParcel(dest, flags);
        mFrequencyProfileLegacy.writeToParcel(dest, flags);
        dest.writeInt(mMaxEnvelopeEffectSize);
        dest.writeInt(mMinEnvelopeEffectControlPointDurationMillis);
        dest.writeInt(mMaxEnvelopeEffectControlPointDurationMillis);
@@ -205,7 +205,7 @@ public class VibratorInfo implements Parcelable {
                && Objects.equals(mSupportedEffects, that.mSupportedEffects)
                && Objects.equals(mSupportedBraking, that.mSupportedBraking)
                && Objects.equals(mQFactor, that.mQFactor)
                && Objects.equals(mFrequencyProfile, that.mFrequencyProfile)
                && Objects.equals(mFrequencyProfileLegacy, that.mFrequencyProfileLegacy)
                && mMaxEnvelopeEffectSize == that.mMaxEnvelopeEffectSize
                && mMinEnvelopeEffectControlPointDurationMillis
                == that.mMinEnvelopeEffectControlPointDurationMillis
@@ -216,7 +216,7 @@ public class VibratorInfo implements Parcelable {
    @Override
    public int hashCode() {
        int hashCode = Objects.hash(mId, mCapabilities, mSupportedEffects, mSupportedBraking,
                mQFactor, mFrequencyProfile);
                mQFactor, mFrequencyProfileLegacy);
        for (int i = 0; i < mSupportedPrimitives.size(); i++) {
            hashCode = 31 * hashCode + mSupportedPrimitives.keyAt(i);
            hashCode = 31 * hashCode + mSupportedPrimitives.valueAt(i);
@@ -238,7 +238,7 @@ public class VibratorInfo implements Parcelable {
                + ", mPwlePrimitiveDurationMax=" + mPwlePrimitiveDurationMax
                + ", mPwleSizeMax=" + mPwleSizeMax
                + ", mQFactor=" + mQFactor
                + ", mFrequencyProfile=" + mFrequencyProfile
                + ", mFrequencyProfileLegacy=" + mFrequencyProfileLegacy
                + ", mMaxEnvelopeEffectSize=" + mMaxEnvelopeEffectSize
                + ", mMinEnvelopeEffectControlPointDurationMillis="
                + mMinEnvelopeEffectControlPointDurationMillis
@@ -262,7 +262,7 @@ public class VibratorInfo implements Parcelable {
        pw.println("pwlePrimitiveDurationMax = " + mPwlePrimitiveDurationMax);
        pw.println("pwleSizeMax = " + mPwleSizeMax);
        pw.println("q-factor = " + mQFactor);
        pw.println("frequencyProfile = " + mFrequencyProfile);
        pw.println("frequencyProfileLegacy = " + mFrequencyProfileLegacy);
        pw.println("mMaxEnvelopeEffectSize = " + mMaxEnvelopeEffectSize);
        pw.println("mMinEnvelopeEffectControlPointDurationMillis = "
                + mMinEnvelopeEffectControlPointDurationMillis);
@@ -517,7 +517,7 @@ public class VibratorInfo implements Parcelable {
     * this vibrator is a composite of multiple physical devices.
     */
    public float getResonantFrequencyHz() {
        return mFrequencyProfile.mResonantFrequencyHz;
        return mFrequencyProfileLegacy.mResonantFrequencyHz;
    }

    /**
@@ -537,8 +537,8 @@ public class VibratorInfo implements Parcelable {
     * <p>If the devices does not have frequency control then the profile should be empty.
     */
    @NonNull
    public FrequencyProfile getFrequencyProfile() {
        return mFrequencyProfile;
    public FrequencyProfileLegacy getFrequencyProfileLegacy() {
        return mFrequencyProfileLegacy;
    }

    /** Returns a single int representing all the capabilities of the vibrator. */
@@ -640,7 +640,7 @@ public class VibratorInfo implements Parcelable {
     *
     * @hide
     */
    public static final class FrequencyProfile implements Parcelable {
    public static final class FrequencyProfileLegacy implements Parcelable {
        @Nullable
        private final Range<Float> mFrequencyRangeHz;
        private final float mMinFrequencyHz;
@@ -648,7 +648,7 @@ public class VibratorInfo implements Parcelable {
        private final float mFrequencyResolutionHz;
        private final float[] mMaxAmplitudes;

        FrequencyProfile(Parcel in) {
        FrequencyProfileLegacy(Parcel in) {
            this(in.readFloat(), in.readFloat(), in.readFloat(), in.createFloatArray());
        }

@@ -664,7 +664,7 @@ public class VibratorInfo implements Parcelable {
         *                              resolution.
         * @hide
         */
        public FrequencyProfile(float resonantFrequencyHz, float minFrequencyHz,
        public FrequencyProfileLegacy(float resonantFrequencyHz, float minFrequencyHz,
                float frequencyResolutionHz, float[] maxAmplitudes) {
            mMinFrequencyHz = minFrequencyHz;
            mResonantFrequencyHz = resonantFrequencyHz;
@@ -776,10 +776,10 @@ public class VibratorInfo implements Parcelable {
            if (this == o) {
                return true;
            }
            if (!(o instanceof FrequencyProfile)) {
            if (!(o instanceof FrequencyProfileLegacy)) {
                return false;
            }
            FrequencyProfile that = (FrequencyProfile) o;
            FrequencyProfileLegacy that = (FrequencyProfileLegacy) o;
            return Float.compare(mMinFrequencyHz, that.mMinFrequencyHz) == 0
                    && Float.compare(mResonantFrequencyHz, that.mResonantFrequencyHz) == 0
                    && Float.compare(mFrequencyResolutionHz, that.mFrequencyResolutionHz) == 0
@@ -796,7 +796,7 @@ public class VibratorInfo implements Parcelable {

        @Override
        public String toString() {
            return "FrequencyProfile{"
            return "FrequencyProfileLegacy{"
                    + "mFrequencyRange=" + mFrequencyRangeHz
                    + ", mMinFrequency=" + mMinFrequencyHz
                    + ", mResonantFrequency=" + mResonantFrequencyHz
@@ -806,16 +806,16 @@ public class VibratorInfo implements Parcelable {
        }

        @NonNull
        public static final Creator<FrequencyProfile> CREATOR =
                new Creator<FrequencyProfile>() {
        public static final Creator<FrequencyProfileLegacy> CREATOR =
                new Creator<FrequencyProfileLegacy>() {
                    @Override
                    public FrequencyProfile createFromParcel(Parcel in) {
                        return new FrequencyProfile(in);
                    public FrequencyProfileLegacy createFromParcel(Parcel in) {
                        return new FrequencyProfileLegacy(in);
                    }

                    @Override
                    public FrequencyProfile[] newArray(int size) {
                        return new FrequencyProfile[size];
                    public FrequencyProfileLegacy[] newArray(int size) {
                        return new FrequencyProfileLegacy[size];
                    }
                };
    }
@@ -832,8 +832,8 @@ public class VibratorInfo implements Parcelable {
        private int mPwlePrimitiveDurationMax;
        private int mPwleSizeMax;
        private float mQFactor = Float.NaN;
        private FrequencyProfile mFrequencyProfile =
                new FrequencyProfile(Float.NaN, Float.NaN, Float.NaN, null);
        private FrequencyProfileLegacy mFrequencyProfileLegacy =
                new FrequencyProfileLegacy(Float.NaN, Float.NaN, Float.NaN, null);
        private int mMaxEnvelopeEffectSize;
        private int mMinEnvelopeEffectControlPointDurationMillis;
        private int mMaxEnvelopeEffectControlPointDurationMillis;
@@ -908,8 +908,8 @@ public class VibratorInfo implements Parcelable {

        /** Configure the vibrator frequency information like resonant frequency and bandwidth. */
        @NonNull
        public Builder setFrequencyProfile(@NonNull FrequencyProfile frequencyProfile) {
            mFrequencyProfile = frequencyProfile;
        public Builder setFrequencyProfileLegacy(@NonNull FrequencyProfileLegacy frequencyProfile) {
            mFrequencyProfileLegacy = frequencyProfile;
            return this;
        }

@@ -950,7 +950,7 @@ public class VibratorInfo implements Parcelable {
        public VibratorInfo build() {
            return new VibratorInfo(mId, mCapabilities, mSupportedEffects, mSupportedBraking,
                    mSupportedPrimitives, mPrimitiveDelayMax, mCompositionSizeMax,
                    mPwlePrimitiveDurationMax, mPwleSizeMax, mQFactor, mFrequencyProfile,
                    mPwlePrimitiveDurationMax, mPwleSizeMax, mQFactor, mFrequencyProfileLegacy,
                    mMaxEnvelopeEffectSize, mMinEnvelopeEffectControlPointDurationMillis,
                    mMaxEnvelopeEffectControlPointDurationMillis);
        }
+10 −10
Original line number Diff line number Diff line
@@ -48,7 +48,7 @@ public final class MultiVibratorInfo extends VibratorInfo {
    }

    private MultiVibratorInfo(
            int id, VibratorInfo[] vibrators, VibratorInfo.FrequencyProfile mergedProfile) {
            int id, VibratorInfo[] vibrators, FrequencyProfileLegacy mergedProfile) {
        super(id,
                capabilitiesIntersection(vibrators, mergedProfile.isEmpty()),
                supportedEffectsIntersection(vibrators),
@@ -209,15 +209,15 @@ public final class MultiVibratorInfo extends VibratorInfo {
    }

    @NonNull
    private static FrequencyProfile frequencyProfileIntersection(VibratorInfo[] infos) {
    private static FrequencyProfileLegacy frequencyProfileIntersection(VibratorInfo[] infos) {
        float freqResolution = floatPropertyIntersection(infos,
                info -> info.getFrequencyProfile().getFrequencyResolutionHz());
                info -> info.getFrequencyProfileLegacy().getFrequencyResolutionHz());
        float resonantFreq = floatPropertyIntersection(infos,
                VibratorInfo::getResonantFrequencyHz);
        Range<Float> freqRange = frequencyRangeIntersection(infos, freqResolution);

        if ((freqRange == null) || Float.isNaN(freqResolution)) {
            return new FrequencyProfile(resonantFreq, Float.NaN, freqResolution, null);
            return new FrequencyProfileLegacy(resonantFreq, Float.NaN, freqResolution, null);
        }

        int amplitudeCount =
@@ -230,8 +230,8 @@ public final class MultiVibratorInfo extends VibratorInfo {
        Arrays.fill(maxAmplitudes, Float.MAX_VALUE);

        for (VibratorInfo info : infos) {
            Range<Float> vibratorFreqRange = info.getFrequencyProfile().getFrequencyRangeHz();
            float[] vibratorMaxAmplitudes = info.getFrequencyProfile().getMaxAmplitudes();
            Range<Float> vibratorFreqRange = info.getFrequencyProfileLegacy().getFrequencyRangeHz();
            float[] vibratorMaxAmplitudes = info.getFrequencyProfileLegacy().getMaxAmplitudes();
            int vibratorStartIdx = Math.round(
                    (freqRange.getLower() - vibratorFreqRange.getLower()) / freqResolution);
            int vibratorEndIdx = vibratorStartIdx + maxAmplitudes.length - 1;
@@ -240,7 +240,7 @@ public final class MultiVibratorInfo extends VibratorInfo {
                Slog.w(TAG, "Error calculating the intersection of vibrator frequency"
                        + " profiles: attempted to fetch from vibrator "
                        + info.getId() + " max amplitude with bad index " + vibratorStartIdx);
                return new FrequencyProfile(resonantFreq, Float.NaN, Float.NaN, null);
                return new FrequencyProfileLegacy(resonantFreq, Float.NaN, Float.NaN, null);
            }

            for (int i = 0; i < maxAmplitudes.length; i++) {
@@ -249,14 +249,14 @@ public final class MultiVibratorInfo extends VibratorInfo {
            }
        }

        return new FrequencyProfile(resonantFreq, freqRange.getLower(),
        return new FrequencyProfileLegacy(resonantFreq, freqRange.getLower(),
                freqResolution, maxAmplitudes);
    }

    @Nullable
    private static Range<Float> frequencyRangeIntersection(VibratorInfo[] infos,
            float frequencyResolution) {
        Range<Float> firstRange = infos[0].getFrequencyProfile().getFrequencyRangeHz();
        Range<Float> firstRange = infos[0].getFrequencyProfileLegacy().getFrequencyRangeHz();
        if (firstRange == null) {
            // If one vibrator is undefined then the intersection is undefined.
            return null;
@@ -268,7 +268,7 @@ public final class MultiVibratorInfo extends VibratorInfo {
        // min supported frequencies are aligned w.r.t. the frequency resolution.

        for (int i = 1; i < infos.length; i++) {
            Range<Float> vibratorRange = infos[i].getFrequencyProfile().getFrequencyRangeHz();
            Range<Float> vibratorRange = infos[i].getFrequencyProfileLegacy().getFrequencyRangeHz();
            if (vibratorRange == null) {
                // If one vibrator is undefined then the intersection is undefined.
                return null;
Loading