Changing Vibration class name to HalVibration.
Bug: 265265232 Test: com.android.server.vibrator.HalVibrationTest Change-Id: Iedff45bda94b89929928860389a1b270ad85f713
This commit is contained in:
219
services/core/java/com/android/server/vibrator/HalVibration.java
Normal file
219
services/core/java/com/android/server/vibrator/HalVibration.java
Normal file
@@ -0,0 +1,219 @@
|
||||
/*
|
||||
* Copyright (C) 2023 The Android Open Source Project
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
package com.android.server.vibrator;
|
||||
|
||||
import android.annotation.Nullable;
|
||||
import android.os.CombinedVibration;
|
||||
import android.os.IBinder;
|
||||
import android.os.VibrationAttributes;
|
||||
import android.os.VibrationEffect;
|
||||
import android.util.SparseArray;
|
||||
|
||||
import com.android.internal.util.FrameworkStatsLog;
|
||||
|
||||
import java.util.List;
|
||||
import java.util.concurrent.CountDownLatch;
|
||||
import java.util.function.Function;
|
||||
|
||||
/**
|
||||
* Represents a vibration defined by a {@link CombinedVibration} that will be performed by
|
||||
* the IVibrator HAL.
|
||||
*/
|
||||
final class HalVibration extends Vibration {
|
||||
|
||||
public final VibrationAttributes attrs;
|
||||
public final long id;
|
||||
public final int uid;
|
||||
public final int displayId;
|
||||
public final String opPkg;
|
||||
public final String reason;
|
||||
public final IBinder token;
|
||||
public final SparseArray<VibrationEffect> mFallbacks = new SparseArray<>();
|
||||
|
||||
/** The actual effect to be played. */
|
||||
@Nullable
|
||||
private CombinedVibration mEffect;
|
||||
|
||||
/**
|
||||
* The original effect that was requested. Typically these two things differ because the effect
|
||||
* was scaled based on the users vibration intensity settings.
|
||||
*/
|
||||
@Nullable
|
||||
private CombinedVibration mOriginalEffect;
|
||||
|
||||
/** Vibration status. */
|
||||
private Vibration.Status mStatus;
|
||||
|
||||
/** Vibration runtime stats. */
|
||||
private final VibrationStats mStats = new VibrationStats();
|
||||
|
||||
/** A {@link CountDownLatch} to enable waiting for completion. */
|
||||
private final CountDownLatch mCompletionLatch = new CountDownLatch(1);
|
||||
|
||||
HalVibration(IBinder token, int id, CombinedVibration effect,
|
||||
VibrationAttributes attrs, int uid, int displayId, String opPkg, String reason) {
|
||||
this.token = token;
|
||||
this.mEffect = effect;
|
||||
this.id = id;
|
||||
this.attrs = attrs;
|
||||
this.uid = uid;
|
||||
this.displayId = displayId;
|
||||
this.opPkg = opPkg;
|
||||
this.reason = reason;
|
||||
mStatus = Vibration.Status.RUNNING;
|
||||
}
|
||||
|
||||
VibrationStats stats() {
|
||||
return mStats;
|
||||
}
|
||||
|
||||
/**
|
||||
* Set the {@link Status} of this vibration and reports the current system time as this
|
||||
* vibration end time, for debugging purposes.
|
||||
*
|
||||
* <p>This method will only accept given value if the current status is {@link
|
||||
* Status#RUNNING}.
|
||||
*/
|
||||
public void end(EndInfo info) {
|
||||
if (hasEnded()) {
|
||||
// Vibration already ended, keep first ending status set and ignore this one.
|
||||
return;
|
||||
}
|
||||
mStatus = info.status;
|
||||
mStats.reportEnded(info.endedByUid, info.endedByUsage);
|
||||
mCompletionLatch.countDown();
|
||||
}
|
||||
|
||||
/** Waits indefinitely until another thread calls {@link #end} on this vibration. */
|
||||
public void waitForEnd() throws InterruptedException {
|
||||
mCompletionLatch.await();
|
||||
}
|
||||
|
||||
/**
|
||||
* Return the effect to be played when given prebaked effect id is not supported by the
|
||||
* vibrator.
|
||||
*/
|
||||
@Nullable
|
||||
public VibrationEffect getFallback(int effectId) {
|
||||
return mFallbacks.get(effectId);
|
||||
}
|
||||
|
||||
/**
|
||||
* Add a fallback {@link VibrationEffect} to be played when given effect id is not supported,
|
||||
* which might be necessary for replacement in realtime.
|
||||
*/
|
||||
public void addFallback(int effectId, VibrationEffect effect) {
|
||||
mFallbacks.put(effectId, effect);
|
||||
}
|
||||
|
||||
/**
|
||||
* Applied update function to the current effect held by this vibration, and to each fallback
|
||||
* effect added.
|
||||
*/
|
||||
public void updateEffects(Function<VibrationEffect, VibrationEffect> updateFn) {
|
||||
CombinedVibration newEffect = transformCombinedEffect(mEffect, updateFn);
|
||||
if (!newEffect.equals(mEffect)) {
|
||||
if (mOriginalEffect == null) {
|
||||
mOriginalEffect = mEffect;
|
||||
}
|
||||
mEffect = newEffect;
|
||||
}
|
||||
for (int i = 0; i < mFallbacks.size(); i++) {
|
||||
mFallbacks.setValueAt(i, updateFn.apply(mFallbacks.valueAt(i)));
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Creates a new {@link CombinedVibration} by applying the given transformation function
|
||||
* to each {@link VibrationEffect}.
|
||||
*/
|
||||
private static CombinedVibration transformCombinedEffect(
|
||||
CombinedVibration combinedEffect, Function<VibrationEffect, VibrationEffect> fn) {
|
||||
if (combinedEffect instanceof CombinedVibration.Mono) {
|
||||
VibrationEffect effect = ((CombinedVibration.Mono) combinedEffect).getEffect();
|
||||
return CombinedVibration.createParallel(fn.apply(effect));
|
||||
} else if (combinedEffect instanceof CombinedVibration.Stereo) {
|
||||
SparseArray<VibrationEffect> effects =
|
||||
((CombinedVibration.Stereo) combinedEffect).getEffects();
|
||||
CombinedVibration.ParallelCombination combination =
|
||||
CombinedVibration.startParallel();
|
||||
for (int i = 0; i < effects.size(); i++) {
|
||||
combination.addVibrator(effects.keyAt(i), fn.apply(effects.valueAt(i)));
|
||||
}
|
||||
return combination.combine();
|
||||
} else if (combinedEffect instanceof CombinedVibration.Sequential) {
|
||||
List<CombinedVibration> effects =
|
||||
((CombinedVibration.Sequential) combinedEffect).getEffects();
|
||||
CombinedVibration.SequentialCombination combination =
|
||||
CombinedVibration.startSequential();
|
||||
for (CombinedVibration effect : effects) {
|
||||
combination.addNext(transformCombinedEffect(effect, fn));
|
||||
}
|
||||
return combination.combine();
|
||||
} else {
|
||||
// Unknown combination, return same effect.
|
||||
return combinedEffect;
|
||||
}
|
||||
}
|
||||
|
||||
/** Return true is current status is different from {@link Status#RUNNING}. */
|
||||
public boolean hasEnded() {
|
||||
return mStatus != Status.RUNNING;
|
||||
}
|
||||
|
||||
/** Return true is effect is a repeating vibration. */
|
||||
public boolean isRepeating() {
|
||||
return mEffect.getDuration() == Long.MAX_VALUE;
|
||||
}
|
||||
|
||||
/** Return the effect that should be played by this vibration. */
|
||||
@Nullable
|
||||
public CombinedVibration getEffect() {
|
||||
return mEffect;
|
||||
}
|
||||
|
||||
/**
|
||||
* Return {@link Vibration.DebugInfo} with read-only debug information about this vibration.
|
||||
*/
|
||||
public Vibration.DebugInfo getDebugInfo() {
|
||||
return new Vibration.DebugInfo(mStatus, mStats, mEffect, mOriginalEffect, /* scale= */ 0,
|
||||
attrs, uid, displayId, opPkg, reason);
|
||||
}
|
||||
|
||||
/** Return {@link VibrationStats.StatsInfo} with read-only metrics about this vibration. */
|
||||
public VibrationStats.StatsInfo getStatsInfo(long completionUptimeMillis) {
|
||||
int vibrationType = isRepeating()
|
||||
? FrameworkStatsLog.VIBRATION_REPORTED__VIBRATION_TYPE__REPEATED
|
||||
: FrameworkStatsLog.VIBRATION_REPORTED__VIBRATION_TYPE__SINGLE;
|
||||
return new VibrationStats.StatsInfo(
|
||||
uid, vibrationType, attrs.getUsage(), mStatus, mStats, completionUptimeMillis);
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns true if this vibration can pipeline with the specified one.
|
||||
*
|
||||
* <p>Note that currently, repeating vibrations can't pipeline with following vibrations,
|
||||
* because the cancel() call to stop the repetition will cancel a pending vibration too. This
|
||||
* can be changed if we have a use-case to reason around behavior for. It may also be nice to
|
||||
* pipeline very short vibrations together, regardless of the flag.
|
||||
*/
|
||||
public boolean canPipelineWith(HalVibration vib) {
|
||||
return uid == vib.uid && attrs.isFlagSet(VibrationAttributes.FLAG_PIPELINED_EFFECT)
|
||||
&& vib.attrs.isFlagSet(VibrationAttributes.FLAG_PIPELINED_EFFECT)
|
||||
&& !isRepeating();
|
||||
}
|
||||
}
|
||||
@@ -38,7 +38,7 @@ abstract class Step implements Comparable<Step> {
|
||||
this.startTime = startTime;
|
||||
}
|
||||
|
||||
protected Vibration getVibration() {
|
||||
protected HalVibration getVibration() {
|
||||
return conductor.getVibration();
|
||||
}
|
||||
|
||||
|
||||
@@ -19,7 +19,6 @@ package com.android.server.vibrator;
|
||||
import android.annotation.NonNull;
|
||||
import android.annotation.Nullable;
|
||||
import android.os.CombinedVibration;
|
||||
import android.os.IBinder;
|
||||
import android.os.VibrationAttributes;
|
||||
import android.os.VibrationEffect;
|
||||
import android.os.vibrator.PrebakedSegment;
|
||||
@@ -27,20 +26,16 @@ import android.os.vibrator.PrimitiveSegment;
|
||||
import android.os.vibrator.RampSegment;
|
||||
import android.os.vibrator.StepSegment;
|
||||
import android.os.vibrator.VibrationEffectSegment;
|
||||
import android.util.SparseArray;
|
||||
import android.util.proto.ProtoOutputStream;
|
||||
|
||||
import com.android.internal.util.FrameworkStatsLog;
|
||||
|
||||
import java.text.SimpleDateFormat;
|
||||
import java.util.Date;
|
||||
import java.util.List;
|
||||
import java.util.Objects;
|
||||
import java.util.concurrent.CountDownLatch;
|
||||
import java.util.function.Function;
|
||||
|
||||
/** Represents a vibration request to the vibrator service. */
|
||||
final class Vibration {
|
||||
/**
|
||||
* The base class for all vibrations.
|
||||
*/
|
||||
class Vibration {
|
||||
private static final SimpleDateFormat DEBUG_DATE_FORMAT =
|
||||
new SimpleDateFormat("MM-dd HH:mm:ss.SSS");
|
||||
|
||||
@@ -85,186 +80,6 @@ final class Vibration {
|
||||
}
|
||||
}
|
||||
|
||||
public final VibrationAttributes attrs;
|
||||
public final long id;
|
||||
public final int uid;
|
||||
public final int displayId;
|
||||
public final String opPkg;
|
||||
public final String reason;
|
||||
public final IBinder token;
|
||||
public final SparseArray<VibrationEffect> mFallbacks = new SparseArray<>();
|
||||
|
||||
/** The actual effect to be played. */
|
||||
@Nullable
|
||||
private CombinedVibration mEffect;
|
||||
|
||||
/**
|
||||
* The original effect that was requested. Typically these two things differ because the effect
|
||||
* was scaled based on the users vibration intensity settings.
|
||||
*/
|
||||
@Nullable
|
||||
private CombinedVibration mOriginalEffect;
|
||||
|
||||
/** Vibration status. */
|
||||
private Vibration.Status mStatus;
|
||||
|
||||
/** Vibration runtime stats. */
|
||||
private final VibrationStats mStats = new VibrationStats();
|
||||
|
||||
/** A {@link CountDownLatch} to enable waiting for completion. */
|
||||
private final CountDownLatch mCompletionLatch = new CountDownLatch(1);
|
||||
|
||||
Vibration(IBinder token, int id, CombinedVibration effect,
|
||||
VibrationAttributes attrs, int uid, int displayId, String opPkg, String reason) {
|
||||
this.token = token;
|
||||
this.mEffect = effect;
|
||||
this.id = id;
|
||||
this.attrs = attrs;
|
||||
this.uid = uid;
|
||||
this.displayId = displayId;
|
||||
this.opPkg = opPkg;
|
||||
this.reason = reason;
|
||||
mStatus = Vibration.Status.RUNNING;
|
||||
}
|
||||
|
||||
VibrationStats stats() {
|
||||
return mStats;
|
||||
}
|
||||
|
||||
/**
|
||||
* Set the {@link Status} of this vibration and reports the current system time as this
|
||||
* vibration end time, for debugging purposes.
|
||||
*
|
||||
* <p>This method will only accept given value if the current status is {@link
|
||||
* Status#RUNNING}.
|
||||
*/
|
||||
public void end(EndInfo info) {
|
||||
if (hasEnded()) {
|
||||
// Vibration already ended, keep first ending status set and ignore this one.
|
||||
return;
|
||||
}
|
||||
mStatus = info.status;
|
||||
mStats.reportEnded(info.endedByUid, info.endedByUsage);
|
||||
mCompletionLatch.countDown();
|
||||
}
|
||||
|
||||
/** Waits indefinitely until another thread calls {@link #end} on this vibration. */
|
||||
public void waitForEnd() throws InterruptedException {
|
||||
mCompletionLatch.await();
|
||||
}
|
||||
|
||||
/**
|
||||
* Return the effect to be played when given prebaked effect id is not supported by the
|
||||
* vibrator.
|
||||
*/
|
||||
@Nullable
|
||||
public VibrationEffect getFallback(int effectId) {
|
||||
return mFallbacks.get(effectId);
|
||||
}
|
||||
|
||||
/**
|
||||
* Add a fallback {@link VibrationEffect} to be played when given effect id is not supported,
|
||||
* which might be necessary for replacement in realtime.
|
||||
*/
|
||||
public void addFallback(int effectId, VibrationEffect effect) {
|
||||
mFallbacks.put(effectId, effect);
|
||||
}
|
||||
|
||||
/**
|
||||
* Applied update function to the current effect held by this vibration, and to each fallback
|
||||
* effect added.
|
||||
*/
|
||||
public void updateEffects(Function<VibrationEffect, VibrationEffect> updateFn) {
|
||||
CombinedVibration newEffect = transformCombinedEffect(mEffect, updateFn);
|
||||
if (!newEffect.equals(mEffect)) {
|
||||
if (mOriginalEffect == null) {
|
||||
mOriginalEffect = mEffect;
|
||||
}
|
||||
mEffect = newEffect;
|
||||
}
|
||||
for (int i = 0; i < mFallbacks.size(); i++) {
|
||||
mFallbacks.setValueAt(i, updateFn.apply(mFallbacks.valueAt(i)));
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Creates a new {@link CombinedVibration} by applying the given transformation function
|
||||
* to each {@link VibrationEffect}.
|
||||
*/
|
||||
private static CombinedVibration transformCombinedEffect(
|
||||
CombinedVibration combinedEffect, Function<VibrationEffect, VibrationEffect> fn) {
|
||||
if (combinedEffect instanceof CombinedVibration.Mono) {
|
||||
VibrationEffect effect = ((CombinedVibration.Mono) combinedEffect).getEffect();
|
||||
return CombinedVibration.createParallel(fn.apply(effect));
|
||||
} else if (combinedEffect instanceof CombinedVibration.Stereo) {
|
||||
SparseArray<VibrationEffect> effects =
|
||||
((CombinedVibration.Stereo) combinedEffect).getEffects();
|
||||
CombinedVibration.ParallelCombination combination =
|
||||
CombinedVibration.startParallel();
|
||||
for (int i = 0; i < effects.size(); i++) {
|
||||
combination.addVibrator(effects.keyAt(i), fn.apply(effects.valueAt(i)));
|
||||
}
|
||||
return combination.combine();
|
||||
} else if (combinedEffect instanceof CombinedVibration.Sequential) {
|
||||
List<CombinedVibration> effects =
|
||||
((CombinedVibration.Sequential) combinedEffect).getEffects();
|
||||
CombinedVibration.SequentialCombination combination =
|
||||
CombinedVibration.startSequential();
|
||||
for (CombinedVibration effect : effects) {
|
||||
combination.addNext(transformCombinedEffect(effect, fn));
|
||||
}
|
||||
return combination.combine();
|
||||
} else {
|
||||
// Unknown combination, return same effect.
|
||||
return combinedEffect;
|
||||
}
|
||||
}
|
||||
|
||||
/** Return true is current status is different from {@link Status#RUNNING}. */
|
||||
public boolean hasEnded() {
|
||||
return mStatus != Status.RUNNING;
|
||||
}
|
||||
|
||||
/** Return true is effect is a repeating vibration. */
|
||||
public boolean isRepeating() {
|
||||
return mEffect.getDuration() == Long.MAX_VALUE;
|
||||
}
|
||||
|
||||
/** Return the effect that should be played by this vibration. */
|
||||
@Nullable
|
||||
public CombinedVibration getEffect() {
|
||||
return mEffect;
|
||||
}
|
||||
|
||||
/** Return {@link Vibration.DebugInfo} with read-only debug information about this vibration. */
|
||||
public Vibration.DebugInfo getDebugInfo() {
|
||||
return new Vibration.DebugInfo(mStatus, mStats, mEffect, mOriginalEffect, /* scale= */ 0,
|
||||
attrs, uid, displayId, opPkg, reason);
|
||||
}
|
||||
|
||||
/** Return {@link VibrationStats.StatsInfo} with read-only metrics about this vibration. */
|
||||
public VibrationStats.StatsInfo getStatsInfo(long completionUptimeMillis) {
|
||||
int vibrationType = isRepeating()
|
||||
? FrameworkStatsLog.VIBRATION_REPORTED__VIBRATION_TYPE__REPEATED
|
||||
: FrameworkStatsLog.VIBRATION_REPORTED__VIBRATION_TYPE__SINGLE;
|
||||
return new VibrationStats.StatsInfo(
|
||||
uid, vibrationType, attrs.getUsage(), mStatus, mStats, completionUptimeMillis);
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns true if this vibration can pipeline with the specified one.
|
||||
*
|
||||
* <p>Note that currently, repeating vibrations can't pipeline with following vibrations,
|
||||
* because the cancel() call to stop the repetition will cancel a pending vibration too. This
|
||||
* can be changed if we have a use-case to reason around behavior for. It may also be nice to
|
||||
* pipeline very short vibrations together, regardless of the flag.
|
||||
*/
|
||||
public boolean canPipelineWith(Vibration vib) {
|
||||
return uid == vib.uid && attrs.isFlagSet(VibrationAttributes.FLAG_PIPELINED_EFFECT)
|
||||
&& vib.attrs.isFlagSet(VibrationAttributes.FLAG_PIPELINED_EFFECT)
|
||||
&& !isRepeating();
|
||||
}
|
||||
|
||||
/** Immutable info passed as a signal to end a vibration. */
|
||||
static final class EndInfo {
|
||||
/** The {@link Status} to be set to the vibration when it ends with this info. */
|
||||
@@ -505,5 +320,4 @@ final class Vibration {
|
||||
proto.end(token);
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -68,7 +68,7 @@ final class VibrationStepConductor implements IBinder.DeathRecipient {
|
||||
// Not guarded by lock because they're not modified by this conductor, it's used here only to
|
||||
// check immutable attributes. The status and other mutable states are changed by the service or
|
||||
// by the vibrator steps.
|
||||
private final Vibration mVibration;
|
||||
private final HalVibration mVibration;
|
||||
private final SparseArray<VibratorController> mVibrators = new SparseArray<>();
|
||||
|
||||
private final PriorityQueue<Step> mNextSteps = new PriorityQueue<>();
|
||||
@@ -95,7 +95,7 @@ final class VibrationStepConductor implements IBinder.DeathRecipient {
|
||||
private int mRemainingStartSequentialEffectSteps;
|
||||
private int mSuccessfulVibratorOnSteps;
|
||||
|
||||
VibrationStepConductor(Vibration vib, VibrationSettings vibrationSettings,
|
||||
VibrationStepConductor(HalVibration vib, VibrationSettings vibrationSettings,
|
||||
DeviceVibrationEffectAdapter effectAdapter,
|
||||
SparseArray<VibratorController> availableVibrators,
|
||||
VibrationThread.VibratorManagerHooks vibratorManagerHooks) {
|
||||
@@ -160,7 +160,7 @@ final class VibrationStepConductor implements IBinder.DeathRecipient {
|
||||
mVibration.stats().reportStarted();
|
||||
}
|
||||
|
||||
public Vibration getVibration() {
|
||||
public HalVibration getVibration() {
|
||||
// No thread assertion: immutable
|
||||
return mVibration;
|
||||
}
|
||||
|
||||
@@ -33,12 +33,12 @@ import com.android.internal.annotations.VisibleForTesting;
|
||||
import java.util.NoSuchElementException;
|
||||
import java.util.Objects;
|
||||
|
||||
/** Plays a {@link Vibration} in dedicated thread. */
|
||||
/** Plays a {@link HalVibration} in dedicated thread. */
|
||||
final class VibrationThread extends Thread {
|
||||
static final String TAG = "VibrationThread";
|
||||
static final boolean DEBUG = false;
|
||||
|
||||
/** Calls into VibratorManager functionality needed for playing a {@link Vibration}. */
|
||||
/** Calls into VibratorManager functionality needed for playing a {@link HalVibration}. */
|
||||
interface VibratorManagerHooks {
|
||||
|
||||
/**
|
||||
|
||||
@@ -385,12 +385,13 @@ public class VibratorManagerService extends IVibratorManagerService.Stub {
|
||||
}
|
||||
|
||||
/**
|
||||
* An internal-only version of vibrate that allows the caller access to the {@link Vibration}.
|
||||
* An internal-only version of vibrate that allows the caller access to the
|
||||
* {@link HalVibration}.
|
||||
* The Vibration is only returned if it is ongoing after this method returns.
|
||||
*/
|
||||
@VisibleForTesting
|
||||
@Nullable
|
||||
Vibration vibrateInternal(int uid, int displayId, String opPkg,
|
||||
HalVibration vibrateInternal(int uid, int displayId, String opPkg,
|
||||
@NonNull CombinedVibration effect, @Nullable VibrationAttributes attrs,
|
||||
String reason, IBinder token) {
|
||||
Trace.traceBegin(Trace.TRACE_TAG_VIBRATOR, "vibrate, reason = " + reason);
|
||||
@@ -407,8 +408,8 @@ public class VibratorManagerService extends IVibratorManagerService.Stub {
|
||||
}
|
||||
attrs = fixupVibrationAttributes(attrs, effect);
|
||||
// Create Vibration.Stats as close to the received request as possible, for tracking.
|
||||
Vibration vib = new Vibration(token, mNextVibrationId.getAndIncrement(), effect, attrs,
|
||||
uid, displayId, opPkg, reason);
|
||||
HalVibration vib = new HalVibration(token, mNextVibrationId.getAndIncrement(), effect,
|
||||
attrs, uid, displayId, opPkg, reason);
|
||||
fillVibrationFallbacks(vib, effect);
|
||||
|
||||
if (attrs.isFlagSet(VibrationAttributes.FLAG_INVALIDATE_SETTINGS_CACHE)) {
|
||||
@@ -639,7 +640,7 @@ public class VibratorManagerService extends IVibratorManagerService.Stub {
|
||||
return;
|
||||
}
|
||||
|
||||
Vibration vib = mCurrentVibration.getVibration();
|
||||
HalVibration vib = mCurrentVibration.getVibration();
|
||||
Vibration.Status ignoreStatus = shouldIgnoreVibrationLocked(
|
||||
vib.uid, vib.displayId, vib.opPkg, vib.attrs);
|
||||
|
||||
@@ -683,7 +684,7 @@ public class VibratorManagerService extends IVibratorManagerService.Stub {
|
||||
}
|
||||
|
||||
@GuardedBy("mLock")
|
||||
private Vibration.Status startVibrationLocked(Vibration vib) {
|
||||
private Vibration.Status startVibrationLocked(HalVibration vib) {
|
||||
Trace.traceBegin(Trace.TRACE_TAG_VIBRATOR, "startVibrationLocked");
|
||||
try {
|
||||
vib.updateEffects(effect -> mVibrationScaler.scale(effect, vib.attrs.getUsage()));
|
||||
@@ -716,7 +717,7 @@ public class VibratorManagerService extends IVibratorManagerService.Stub {
|
||||
private Vibration.Status startVibrationOnThreadLocked(VibrationStepConductor conductor) {
|
||||
Trace.traceBegin(Trace.TRACE_TAG_VIBRATOR, "startVibrationThreadLocked");
|
||||
try {
|
||||
Vibration vib = conductor.getVibration();
|
||||
HalVibration vib = conductor.getVibration();
|
||||
int mode = startAppOpModeLocked(vib.uid, vib.opPkg, vib.attrs);
|
||||
switch (mode) {
|
||||
case AppOpsManager.MODE_ALLOWED:
|
||||
@@ -741,7 +742,7 @@ public class VibratorManagerService extends IVibratorManagerService.Stub {
|
||||
}
|
||||
|
||||
@GuardedBy("mLock")
|
||||
private void endVibrationLocked(Vibration vib, Vibration.EndInfo vibrationEndInfo,
|
||||
private void endVibrationLocked(HalVibration vib, Vibration.EndInfo vibrationEndInfo,
|
||||
boolean shouldWriteStats) {
|
||||
vib.end(vibrationEndInfo);
|
||||
logVibrationStatus(vib.uid, vib.attrs, vibrationEndInfo.status);
|
||||
@@ -763,7 +764,8 @@ public class VibratorManagerService extends IVibratorManagerService.Stub {
|
||||
vib.getStatsInfo(/* completionUptimeMillis= */ SystemClock.uptimeMillis()));
|
||||
}
|
||||
|
||||
private void logVibrationStatus(int uid, VibrationAttributes attrs, Vibration.Status status) {
|
||||
private void logVibrationStatus(int uid, VibrationAttributes attrs,
|
||||
Vibration.Status status) {
|
||||
switch (status) {
|
||||
case IGNORED_BACKGROUND:
|
||||
Slog.e(TAG, "Ignoring incoming vibration as process with"
|
||||
@@ -813,7 +815,7 @@ public class VibratorManagerService extends IVibratorManagerService.Stub {
|
||||
Trace.traceBegin(Trace.TRACE_TAG_VIBRATOR, "reportFinishVibrationLocked");
|
||||
Trace.asyncTraceEnd(Trace.TRACE_TAG_VIBRATOR, "vibration", 0);
|
||||
try {
|
||||
Vibration vib = mCurrentVibration.getVibration();
|
||||
HalVibration vib = mCurrentVibration.getVibration();
|
||||
if (DEBUG) {
|
||||
Slog.d(TAG, "Reporting vibration " + vib.id + " finished with " + vibrationEndInfo);
|
||||
}
|
||||
@@ -857,13 +859,13 @@ public class VibratorManagerService extends IVibratorManagerService.Stub {
|
||||
*/
|
||||
@GuardedBy("mLock")
|
||||
@Nullable
|
||||
private Vibration.Status shouldIgnoreVibrationForOngoingLocked(Vibration vib) {
|
||||
private Vibration.Status shouldIgnoreVibrationForOngoingLocked(HalVibration vib) {
|
||||
if (mCurrentVibration == null || vib.isRepeating()) {
|
||||
// Incoming repeating vibrations always take precedence over ongoing vibrations.
|
||||
return null;
|
||||
}
|
||||
|
||||
Vibration currentVibration = mCurrentVibration.getVibration();
|
||||
HalVibration currentVibration = mCurrentVibration.getVibration();
|
||||
if (currentVibration.hasEnded() || mCurrentVibration.wasNotifiedToCancel()) {
|
||||
// Current vibration has ended or is cancelling, should not block incoming vibrations.
|
||||
return null;
|
||||
@@ -945,7 +947,7 @@ public class VibratorManagerService extends IVibratorManagerService.Stub {
|
||||
* @param token The binder token to identify the vibration origin. Only vibrations
|
||||
* started with the same token can be cancelled with it.
|
||||
*/
|
||||
private boolean shouldCancelVibration(Vibration vib, int usageFilter, IBinder token) {
|
||||
private boolean shouldCancelVibration(HalVibration vib, int usageFilter, IBinder token) {
|
||||
return (vib.token == token) && shouldCancelVibration(vib.attrs, usageFilter);
|
||||
}
|
||||
|
||||
@@ -1041,7 +1043,7 @@ public class VibratorManagerService extends IVibratorManagerService.Stub {
|
||||
* Sets fallback effects to all prebaked ones in given combination of effects, based on {@link
|
||||
* VibrationSettings#getFallbackEffect}.
|
||||
*/
|
||||
private void fillVibrationFallbacks(Vibration vib, CombinedVibration effect) {
|
||||
private void fillVibrationFallbacks(HalVibration vib, CombinedVibration effect) {
|
||||
if (effect instanceof CombinedVibration.Mono) {
|
||||
fillVibrationFallbacks(vib, ((CombinedVibration.Mono) effect).getEffect());
|
||||
} else if (effect instanceof CombinedVibration.Stereo) {
|
||||
@@ -1059,7 +1061,7 @@ public class VibratorManagerService extends IVibratorManagerService.Stub {
|
||||
}
|
||||
}
|
||||
|
||||
private void fillVibrationFallbacks(Vibration vib, VibrationEffect effect) {
|
||||
private void fillVibrationFallbacks(HalVibration vib, VibrationEffect effect) {
|
||||
VibrationEffect.Composed composed = (VibrationEffect.Composed) effect;
|
||||
int segmentCount = composed.getSegments().size();
|
||||
for (int i = 0; i < segmentCount; i++) {
|
||||
@@ -1183,7 +1185,7 @@ public class VibratorManagerService extends IVibratorManagerService.Stub {
|
||||
if (conductor == null) {
|
||||
return false;
|
||||
}
|
||||
Vibration vib = conductor.getVibration();
|
||||
HalVibration vib = conductor.getVibration();
|
||||
return mVibrationSettings.shouldCancelVibrationOnScreenOff(
|
||||
vib.uid, vib.opPkg, vib.attrs.getUsage(), vib.stats().getCreateUptimeMillis());
|
||||
}
|
||||
@@ -1535,7 +1537,7 @@ public class VibratorManagerService extends IVibratorManagerService.Stub {
|
||||
mPreviousVibrationsLimit = limit;
|
||||
}
|
||||
|
||||
synchronized void record(Vibration vib) {
|
||||
synchronized void record(HalVibration vib) {
|
||||
int usage = vib.attrs.getUsage();
|
||||
if (!mPreviousVibrations.contains(usage)) {
|
||||
mPreviousVibrations.put(usage, new LinkedList<>());
|
||||
@@ -1870,7 +1872,7 @@ public class VibratorManagerService extends IVibratorManagerService.Stub {
|
||||
// only cancel background vibrations.
|
||||
IBinder deathBinder = commonOptions.background ? VibratorManagerService.this
|
||||
: mShellCallbacksToken;
|
||||
Vibration vib = vibrateInternal(Binder.getCallingUid(), Display.DEFAULT_DISPLAY,
|
||||
HalVibration vib = vibrateInternal(Binder.getCallingUid(), Display.DEFAULT_DISPLAY,
|
||||
SHELL_PACKAGE_NAME, combined, attrs, commonOptions.description, deathBinder);
|
||||
if (vib != null && !commonOptions.background) {
|
||||
try {
|
||||
|
||||
@@ -516,7 +516,7 @@ public class VibrationThreadTest {
|
||||
|
||||
long vibrationId = 1;
|
||||
VibrationEffect fallback = VibrationEffect.createOneShot(10, 100);
|
||||
Vibration vibration = createVibration(vibrationId, CombinedVibration.createParallel(
|
||||
HalVibration vibration = createVibration(vibrationId, CombinedVibration.createParallel(
|
||||
VibrationEffect.get(VibrationEffect.EFFECT_CLICK)));
|
||||
vibration.addFallback(VibrationEffect.EFFECT_CLICK, fallback);
|
||||
startThreadAndDispatcher(vibration);
|
||||
@@ -683,7 +683,7 @@ public class VibrationThreadTest {
|
||||
.addEffect(VibrationEffect.get(VibrationEffect.EFFECT_TICK))
|
||||
.addPrimitive(VibrationEffect.Composition.PRIMITIVE_TICK, 0.5f)
|
||||
.compose();
|
||||
Vibration vib = createVibration(vibrationId, CombinedVibration.createParallel(effect));
|
||||
HalVibration vib = createVibration(vibrationId, CombinedVibration.createParallel(effect));
|
||||
vib.addFallback(VibrationEffect.EFFECT_TICK, fallback);
|
||||
startThreadAndDispatcher(vib);
|
||||
waitForCompletion();
|
||||
@@ -1592,7 +1592,7 @@ public class VibrationThreadTest {
|
||||
return startThreadAndDispatcher(createVibration(vibrationId, effect));
|
||||
}
|
||||
|
||||
private VibrationStepConductor startThreadAndDispatcher(Vibration vib) {
|
||||
private VibrationStepConductor startThreadAndDispatcher(HalVibration vib) {
|
||||
mControllers = createVibratorControllers();
|
||||
VibrationStepConductor conductor = new VibrationStepConductor(vib, mVibrationSettings,
|
||||
mEffectAdapter, mControllers, mManagerHooks);
|
||||
@@ -1624,8 +1624,8 @@ public class VibrationThreadTest {
|
||||
mTestLooper.dispatchAll(); // Flush callbacks
|
||||
}
|
||||
|
||||
private Vibration createVibration(long id, CombinedVibration effect) {
|
||||
return new Vibration(mVibrationToken, (int) id, effect, ATTRS, UID, DISPLAY_ID,
|
||||
private HalVibration createVibration(long id, CombinedVibration effect) {
|
||||
return new HalVibration(mVibrationToken, (int) id, effect, ATTRS, UID, DISPLAY_ID,
|
||||
PACKAGE_NAME, "reason");
|
||||
}
|
||||
|
||||
|
||||
@@ -2034,7 +2034,7 @@ public class VibratorManagerServiceTest {
|
||||
|
||||
private void vibrateAndWaitUntilFinished(VibratorManagerService service,
|
||||
CombinedVibration effect, VibrationAttributes attrs) throws InterruptedException {
|
||||
Vibration vib =
|
||||
HalVibration vib =
|
||||
service.vibrateInternal(UID, Display.DEFAULT_DISPLAY, PACKAGE_NAME, effect, attrs,
|
||||
"some reason", service);
|
||||
if (vib != null) {
|
||||
|
||||
Reference in New Issue
Block a user