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

Commit 7b18842f authored by Ming-Shin Lu's avatar Ming-Shin Lu
Browse files

Avoid unnecessary inline string allocation when calling Trace.traceBegin

Remove string concatenation on Trace.traceBegin in CL[1] to
avoid unnecessary temporary string allocation.

[1]:  Icbbcd4d60207fa08ecd3e5160a07cfdc8b5a6c3d

Flag: EXEMPT refactor
Bug: 366655315
Test: verify ViewPerfTest#testPerformHapticFeedback and observe
allocation_count_median-total if any additional allcation change.

Change-Id: I0afacc98607db55a52c99158a5a467d5911d4a2f
parent d4ea4434
Loading
Loading
Loading
Loading
+8 −7
Original line number Diff line number Diff line
@@ -16,6 +16,8 @@

package android.os;

import static android.os.Trace.TRACE_TAG_VIBRATOR;

import android.annotation.CallbackExecutor;
import android.annotation.NonNull;
import android.annotation.Nullable;
@@ -138,14 +140,14 @@ public class SystemVibratorManager extends VibratorManager {
            Log.w(TAG, "Failed to vibrate; no vibrator manager service.");
            return;
        }
        Trace.traceBegin(Trace.TRACE_TAG_VIBRATOR, "vibrate, reason=" + reason);
        Trace.traceBegin(TRACE_TAG_VIBRATOR, "vibrate");
        try {
            mService.vibrate(uid, mContext.getDeviceId(), opPkg, effect, attributes, reason,
                    mToken);
        } catch (RemoteException e) {
            Log.w(TAG, "Failed to vibrate.", e);
        } finally {
            Trace.traceEnd(Trace.TRACE_TAG_VIBRATOR);
            Trace.traceEnd(TRACE_TAG_VIBRATOR);
        }
    }

@@ -155,14 +157,14 @@ public class SystemVibratorManager extends VibratorManager {
            Log.w(TAG, "Failed to perform haptic feedback; no vibrator manager service.");
            return;
        }
        Trace.traceBegin(Trace.TRACE_TAG_VIBRATOR, "performHapticFeedback, reason=" + reason);
        Trace.traceBegin(TRACE_TAG_VIBRATOR, "performHapticFeedback");
        try {
            mService.performHapticFeedback(mUid, mContext.getDeviceId(), mPackageName, constant,
                    reason, flags, privFlags);
        } catch (RemoteException e) {
            Log.w(TAG, "Failed to perform haptic feedback.", e);
        } finally {
            Trace.traceEnd(Trace.TRACE_TAG_VIBRATOR);
            Trace.traceEnd(TRACE_TAG_VIBRATOR);
        }
    }

@@ -174,15 +176,14 @@ public class SystemVibratorManager extends VibratorManager {
                            + " no vibrator manager service.");
            return;
        }
        Trace.traceBegin(Trace.TRACE_TAG_VIBRATOR,
                "performHapticFeedbackForInputDevice, reason=" + reason);
        Trace.traceBegin(TRACE_TAG_VIBRATOR, "performHapticFeedbackForInputDevice");
        try {
            mService.performHapticFeedbackForInputDevice(mUid, mContext.getDeviceId(), mPackageName,
                    constant, inputDeviceId, inputSource, reason, flags, privFlags);
        } catch (RemoteException e) {
            Log.w(TAG, "Failed to perform haptic feedback for input device.", e);
        } finally {
            Trace.traceEnd(Trace.TRACE_TAG_VIBRATOR);
            Trace.traceEnd(TRACE_TAG_VIBRATOR);
        }
    }

+8 −6
Original line number Diff line number Diff line
@@ -16,6 +16,8 @@

package com.android.server.vibrator;

import static android.os.Trace.TRACE_TAG_VIBRATOR;

import android.annotation.NonNull;
import android.annotation.Nullable;
import android.os.PowerManager;
@@ -117,7 +119,7 @@ final class VibrationThread extends Thread {
     *  before the release callback.
     */
    boolean runVibrationOnVibrationThread(VibrationStepConductor conductor) {
        Trace.traceBegin(Trace.TRACE_TAG_VIBRATOR, "runVibrationOnVibrationThread");
        Trace.traceBegin(TRACE_TAG_VIBRATOR, "runVibrationOnVibrationThread");
        try {
            synchronized (mLock) {
                if (mRequestedActiveConductor != null) {
@@ -129,7 +131,7 @@ final class VibrationThread extends Thread {
            }
            return true;
        } finally {
            Trace.traceEnd(Trace.TRACE_TAG_VIBRATOR);
            Trace.traceEnd(TRACE_TAG_VIBRATOR);
        }
    }

@@ -249,17 +251,17 @@ final class VibrationThread extends Thread {
    private void clientVibrationCompleteIfNotAlready(@NonNull Vibration.EndInfo vibrationEndInfo) {
        if (!mCalledVibrationCompleteCallback) {
            mCalledVibrationCompleteCallback = true;
            Trace.traceBegin(Trace.TRACE_TAG_VIBRATOR, "notifyVibrationComplete");
            Trace.traceBegin(TRACE_TAG_VIBRATOR, "notifyVibrationComplete");
            try {
                mExecutingConductor.notifyVibrationComplete(vibrationEndInfo);
            } finally {
                Trace.traceEnd(Trace.TRACE_TAG_VIBRATOR);
                Trace.traceEnd(TRACE_TAG_VIBRATOR);
            }
        }
    }

    private void playVibration() {
        Trace.traceBegin(Trace.TRACE_TAG_VIBRATOR, "playVibration");
        Trace.traceBegin(TRACE_TAG_VIBRATOR, "playVibration");
        try {
            mExecutingConductor.prepareToStart();
            while (!mExecutingConductor.isFinished()) {
@@ -283,7 +285,7 @@ final class VibrationThread extends Thread {
                }
            }
        } finally {
            Trace.traceEnd(Trace.TRACE_TAG_VIBRATOR);
            Trace.traceEnd(TRACE_TAG_VIBRATOR);
        }
    }
}
+26 −22
Original line number Diff line number Diff line
@@ -16,6 +16,8 @@

package com.android.server.vibrator;

import static android.os.Trace.TRACE_TAG_VIBRATOR;

import android.annotation.Nullable;
import android.hardware.vibrator.IVibrator;
import android.os.Binder;
@@ -124,7 +126,7 @@ final class VibratorController {

    /** Reruns the query to the vibrator to load the {@link VibratorInfo}, if not yet successful. */
    public void reloadVibratorInfoIfNeeded() {
        Trace.traceBegin(Trace.TRACE_TAG_VIBRATOR, "VibratorController#reloadVibratorInfoIfNeeded");
        Trace.traceBegin(TRACE_TAG_VIBRATOR, "VibratorController#reloadVibratorInfoIfNeeded");
        try {
            // Early check outside lock, for quick return.
            if (mVibratorInfoLoadSuccessful) {
@@ -143,7 +145,7 @@ final class VibratorController {
                }
            }
        } finally {
            Trace.traceEnd(Trace.TRACE_TAG_VIBRATOR);
            Trace.traceEnd(TRACE_TAG_VIBRATOR);
        }
    }

@@ -199,13 +201,13 @@ final class VibratorController {

    /** Return {@code true} if the underlying vibrator is currently available, false otherwise. */
    public boolean isAvailable() {
        Trace.traceBegin(Trace.TRACE_TAG_VIBRATOR, "VibratorController#isAvailable");
        Trace.traceBegin(TRACE_TAG_VIBRATOR, "VibratorController#isAvailable");
        try {
            synchronized (mLock) {
                return mNativeWrapper.isAvailable();
            }
        } finally {
            Trace.traceEnd(Trace.TRACE_TAG_VIBRATOR);
            Trace.traceEnd(TRACE_TAG_VIBRATOR);
        }
    }

@@ -215,7 +217,9 @@ final class VibratorController {
     * <p>This will affect the state of {@link #isUnderExternalControl()}.
     */
    public void setExternalControl(boolean externalControl) {
        Trace.traceBegin(Trace.TRACE_TAG_VIBRATOR, "setExternalControl(" + externalControl + ")");
        Trace.traceBegin(TRACE_TAG_VIBRATOR,
                externalControl ? "VibratorController#enableExternalControl"
                : "VibratorController#disableExternalControl");
        try {
            if (!mVibratorInfo.hasCapability(IVibrator.CAP_EXTERNAL_CONTROL)) {
                return;
@@ -225,7 +229,7 @@ final class VibratorController {
                mNativeWrapper.setExternalControl(externalControl);
            }
        } finally {
            Trace.traceEnd(Trace.TRACE_TAG_VIBRATOR);
            Trace.traceEnd(TRACE_TAG_VIBRATOR);
        }
    }

@@ -234,7 +238,7 @@ final class VibratorController {
     * if given {@code effect} is {@code null}.
     */
    public void updateAlwaysOn(int id, @Nullable PrebakedSegment prebaked) {
        Trace.traceBegin(Trace.TRACE_TAG_VIBRATOR, "VibratorController#updateAlwaysOn");
        Trace.traceBegin(TRACE_TAG_VIBRATOR, "VibratorController#updateAlwaysOn");
        try {
            if (!mVibratorInfo.hasCapability(IVibrator.CAP_ALWAYS_ON_CONTROL)) {
                return;
@@ -248,13 +252,13 @@ final class VibratorController {
                }
            }
        } finally {
            Trace.traceEnd(Trace.TRACE_TAG_VIBRATOR);
            Trace.traceEnd(TRACE_TAG_VIBRATOR);
        }
    }

    /** Set the vibration amplitude. This will NOT affect the state of {@link #isVibrating()}. */
    public void setAmplitude(float amplitude) {
        Trace.traceBegin(Trace.TRACE_TAG_VIBRATOR, "VibratorController#setAmplitude");
        Trace.traceBegin(TRACE_TAG_VIBRATOR, "VibratorController#setAmplitude");
        try {
            synchronized (mLock) {
                if (mVibratorInfo.hasCapability(IVibrator.CAP_AMPLITUDE_CONTROL)) {
@@ -265,7 +269,7 @@ final class VibratorController {
                }
            }
        } finally {
            Trace.traceEnd(Trace.TRACE_TAG_VIBRATOR);
            Trace.traceEnd(TRACE_TAG_VIBRATOR);
        }
    }

@@ -279,7 +283,7 @@ final class VibratorController {
     * do not support the input or a negative number if the operation failed.
     */
    public long on(long milliseconds, long vibrationId) {
        Trace.traceBegin(Trace.TRACE_TAG_VIBRATOR, "VibratorController#on");
        Trace.traceBegin(TRACE_TAG_VIBRATOR, "VibratorController#on");
        try {
            synchronized (mLock) {
                long duration = mNativeWrapper.on(milliseconds, vibrationId);
@@ -290,7 +294,7 @@ final class VibratorController {
                return duration;
            }
        } finally {
            Trace.traceEnd(Trace.TRACE_TAG_VIBRATOR);
            Trace.traceEnd(TRACE_TAG_VIBRATOR);
        }
    }

@@ -304,7 +308,7 @@ final class VibratorController {
     * do not support the input or a negative number if the operation failed.
     */
    public long on(VibrationEffect.VendorEffect vendorEffect, long vibrationId) {
        Trace.traceBegin(Trace.TRACE_TAG_VIBRATOR, "VibratorController#on (vendor)");
        Trace.traceBegin(TRACE_TAG_VIBRATOR, "VibratorController#on (vendor)");
        synchronized (mLock) {
            Parcel vendorData = Parcel.obtain();
            try {
@@ -320,7 +324,7 @@ final class VibratorController {
                return duration;
            } finally {
                vendorData.recycle();
                Trace.traceEnd(Trace.TRACE_TAG_VIBRATOR);
                Trace.traceEnd(TRACE_TAG_VIBRATOR);
            }
        }
    }
@@ -335,7 +339,7 @@ final class VibratorController {
     * do not support the input or a negative number if the operation failed.
     */
    public long on(PrebakedSegment prebaked, long vibrationId) {
        Trace.traceBegin(Trace.TRACE_TAG_VIBRATOR, "VibratorController#on (Prebaked)");
        Trace.traceBegin(TRACE_TAG_VIBRATOR, "VibratorController#on (Prebaked)");
        try {
            synchronized (mLock) {
                long duration = mNativeWrapper.perform(prebaked.getEffectId(),
@@ -347,7 +351,7 @@ final class VibratorController {
                return duration;
            }
        } finally {
            Trace.traceEnd(Trace.TRACE_TAG_VIBRATOR);
            Trace.traceEnd(TRACE_TAG_VIBRATOR);
        }
    }

@@ -361,7 +365,7 @@ final class VibratorController {
     * do not support the input or a negative number if the operation failed.
     */
    public long on(PrimitiveSegment[] primitives, long vibrationId) {
        Trace.traceBegin(Trace.TRACE_TAG_VIBRATOR, "VibratorController#on (Primitive)");
        Trace.traceBegin(TRACE_TAG_VIBRATOR, "VibratorController#on (Primitive)");
        try {
            if (!mVibratorInfo.hasCapability(IVibrator.CAP_COMPOSE_EFFECTS)) {
                return 0;
@@ -375,7 +379,7 @@ final class VibratorController {
                return duration;
            }
        } finally {
            Trace.traceEnd(Trace.TRACE_TAG_VIBRATOR);
            Trace.traceEnd(TRACE_TAG_VIBRATOR);
        }
    }

@@ -388,7 +392,7 @@ final class VibratorController {
     * @return The duration of the effect playing, or 0 if unsupported.
     */
    public long on(RampSegment[] primitives, long vibrationId) {
        Trace.traceBegin(Trace.TRACE_TAG_VIBRATOR, "VibratorController#on (PWLE)");
        Trace.traceBegin(TRACE_TAG_VIBRATOR, "VibratorController#on (PWLE)");
        try {
            if (!mVibratorInfo.hasCapability(IVibrator.CAP_COMPOSE_PWLE_EFFECTS)) {
                return 0;
@@ -403,7 +407,7 @@ final class VibratorController {
                return duration;
            }
        } finally {
            Trace.traceEnd(Trace.TRACE_TAG_VIBRATOR);
            Trace.traceEnd(TRACE_TAG_VIBRATOR);
        }
    }

@@ -413,7 +417,7 @@ final class VibratorController {
     * <p>This will affect the state of {@link #isVibrating()}.
     */
    public void off() {
        Trace.traceBegin(Trace.TRACE_TAG_VIBRATOR, "VibratorController#off");
        Trace.traceBegin(TRACE_TAG_VIBRATOR, "VibratorController#off");
        try {
            synchronized (mLock) {
                mNativeWrapper.off();
@@ -421,7 +425,7 @@ final class VibratorController {
                notifyListenerOnVibrating(false);
            }
        } finally {
            Trace.traceEnd(Trace.TRACE_TAG_VIBRATOR);
            Trace.traceEnd(TRACE_TAG_VIBRATOR);
        }
    }

+51 −47
Original line number Diff line number Diff line
@@ -16,6 +16,7 @@

package com.android.server.vibrator;

import static android.os.Trace.TRACE_TAG_VIBRATOR;
import static android.os.VibrationAttributes.USAGE_CLASS_ALARM;
import static android.os.VibrationEffect.VibrationParameter.targetAmplitude;
import static android.os.VibrationEffect.VibrationParameter.targetFrequency;
@@ -333,7 +334,7 @@ public class VibratorManagerService extends IVibratorManagerService.Stub {
    @VisibleForTesting
    void systemReady() {
        Slog.v(TAG, "Initializing VibratorManager service...");
        Trace.traceBegin(Trace.TRACE_TAG_VIBRATOR, "systemReady");
        Trace.traceBegin(TRACE_TAG_VIBRATOR, "systemReady");
        try {
            // Will retry to load each vibrator's info, if any request have failed.
            for (int i = 0; i < mVibrators.size(); i++) {
@@ -352,7 +353,7 @@ public class VibratorManagerService extends IVibratorManagerService.Stub {
                mServiceReady = true;
            }
            Slog.v(TAG, "VibratorManager service initialized");
            Trace.traceEnd(Trace.TRACE_TAG_VIBRATOR);
            Trace.traceEnd(TRACE_TAG_VIBRATOR);
        }
    }

@@ -413,7 +414,7 @@ public class VibratorManagerService extends IVibratorManagerService.Stub {
    @Override // Binder call
    public boolean setAlwaysOnEffect(int uid, String opPkg, int alwaysOnId,
            @Nullable CombinedVibration effect, @Nullable VibrationAttributes attrs) {
        Trace.traceBegin(Trace.TRACE_TAG_VIBRATOR, "setAlwaysOnEffect");
        Trace.traceBegin(TRACE_TAG_VIBRATOR, "setAlwaysOnEffect");
        try {
            mContext.enforceCallingOrSelfPermission(
                    android.Manifest.permission.VIBRATE_ALWAYS_ON,
@@ -449,20 +450,25 @@ public class VibratorManagerService extends IVibratorManagerService.Stub {
            }
            return true;
        } finally {
            Trace.traceEnd(Trace.TRACE_TAG_VIBRATOR);
            Trace.traceEnd(TRACE_TAG_VIBRATOR);
        }
    }

    @Override // Binder call
    public void vibrate(int uid, int deviceId, String opPkg, @NonNull CombinedVibration effect,
            @Nullable VibrationAttributes attrs, String reason, IBinder token) {
        Trace.traceBegin(TRACE_TAG_VIBRATOR, "vibrate");
        try {
            vibrateWithPermissionCheck(uid, deviceId, opPkg, effect, attrs, reason, token);
        } finally {
            Trace.traceEnd(TRACE_TAG_VIBRATOR);
        }
    }

    @Override // Binder call
    public void performHapticFeedback(int uid, int deviceId, String opPkg, int constant,
            String reason, int flags, int privFlags) {
        Trace.traceBegin(Trace.TRACE_TAG_VIBRATOR, "performHapticFeedback");
        Trace.traceBegin(TRACE_TAG_VIBRATOR, "performHapticFeedback");
        // Note that the `performHapticFeedback` method does not take a token argument from the
        // caller, and instead, uses this service as the token. This is to mitigate performance
        // impact that would otherwise be caused due to marshal latency. Haptic feedback effects are
@@ -471,7 +477,7 @@ public class VibratorManagerService extends IVibratorManagerService.Stub {
            performHapticFeedbackInternal(uid, deviceId, opPkg, constant, reason, /* token= */
                    this, flags, privFlags);
        } finally {
            Trace.traceEnd(Trace.TRACE_TAG_VIBRATOR);
            Trace.traceEnd(TRACE_TAG_VIBRATOR);
        }
    }

@@ -479,13 +485,13 @@ public class VibratorManagerService extends IVibratorManagerService.Stub {
    public void performHapticFeedbackForInputDevice(int uid, int deviceId, String opPkg,
            int constant, int inputDeviceId, int inputSource, String reason, int flags,
            int privFlags) {
        Trace.traceBegin(Trace.TRACE_TAG_VIBRATOR, "performHapticFeedbackForInputDevice");
        Trace.traceBegin(TRACE_TAG_VIBRATOR, "performHapticFeedbackForInputDevice");
        try {
            performHapticFeedbackForInputDeviceInternal(uid, deviceId, opPkg, constant,
                    inputDeviceId,
                    inputSource, reason, /* token= */ this, flags, privFlags);
        } finally {
            Trace.traceEnd(Trace.TRACE_TAG_VIBRATOR);
            Trace.traceEnd(TRACE_TAG_VIBRATOR);
        }
    }

@@ -563,26 +569,16 @@ public class VibratorManagerService extends IVibratorManagerService.Stub {
    HalVibration vibrateWithPermissionCheck(int uid, int deviceId, String opPkg,
            @NonNull CombinedVibration effect, @Nullable VibrationAttributes attrs,
            String reason, IBinder token) {
        Trace.traceBegin(Trace.TRACE_TAG_VIBRATOR, "vibrate, reason = " + reason);
        try {
        attrs = fixupVibrationAttributes(attrs, effect);
        mContext.enforceCallingOrSelfPermission(
                android.Manifest.permission.VIBRATE, "vibrate");
        return vibrateInternal(uid, deviceId, opPkg, effect, attrs, reason, token);
        } finally {
            Trace.traceEnd(Trace.TRACE_TAG_VIBRATOR);
        }
    }

    HalVibration vibrateWithoutPermissionCheck(int uid, int deviceId, String opPkg,
            @NonNull CombinedVibration effect, @NonNull VibrationAttributes attrs,
            String reason, IBinder token) {
        Trace.traceBegin(Trace.TRACE_TAG_VIBRATOR, "vibrate no perm check, reason = " + reason);
        try {
        return vibrateInternal(uid, deviceId, opPkg, effect, attrs, reason, token);
        } finally {
            Trace.traceEnd(Trace.TRACE_TAG_VIBRATOR);
        }
    }

    private HalVibration vibrateInternal(int uid, int deviceId, String opPkg,
@@ -671,7 +667,7 @@ public class VibratorManagerService extends IVibratorManagerService.Stub {

    @Override // Binder call
    public void cancelVibrate(int usageFilter, IBinder token) {
        Trace.traceBegin(Trace.TRACE_TAG_VIBRATOR, "cancelVibrate");
        Trace.traceBegin(TRACE_TAG_VIBRATOR, "cancelVibrate");
        try {
            mContext.enforceCallingOrSelfPermission(
                    android.Manifest.permission.VIBRATE,
@@ -708,7 +704,7 @@ public class VibratorManagerService extends IVibratorManagerService.Stub {
                }
            }
        } finally {
            Trace.traceEnd(Trace.TRACE_TAG_VIBRATOR);
            Trace.traceEnd(TRACE_TAG_VIBRATOR);
        }
    }

@@ -899,7 +895,7 @@ public class VibratorManagerService extends IVibratorManagerService.Stub {
    @GuardedBy("mLock")
    @Nullable
    private Vibration.EndInfo startVibrationLocked(HalVibration vib) {
        Trace.traceBegin(Trace.TRACE_TAG_VIBRATOR, "startVibrationLocked");
        Trace.traceBegin(TRACE_TAG_VIBRATOR, "startVibrationLocked");
        try {
            if (mInputDeviceDelegate.isAvailable()) {
                return startVibrationOnInputDevicesLocked(vib);
@@ -919,7 +915,7 @@ public class VibratorManagerService extends IVibratorManagerService.Stub {
            mNextVibration = conductor;
            return null;
        } finally {
            Trace.traceEnd(Trace.TRACE_TAG_VIBRATOR);
            Trace.traceEnd(TRACE_TAG_VIBRATOR);
        }
    }

@@ -930,7 +926,7 @@ public class VibratorManagerService extends IVibratorManagerService.Stub {
        int mode = startAppOpModeLocked(vib.callerInfo);
        switch (mode) {
            case AppOpsManager.MODE_ALLOWED:
                Trace.asyncTraceBegin(Trace.TRACE_TAG_VIBRATOR, "vibration", 0);
                Trace.asyncTraceBegin(TRACE_TAG_VIBRATOR, "vibration", 0);
                // Make sure mCurrentVibration is set while triggering the VibrationThread.
                mCurrentVibration = conductor;
                if (!mCurrentVibration.linkToDeath()) {
@@ -1581,7 +1577,7 @@ public class VibratorManagerService extends IVibratorManagerService.Stub {

        @Override
        public boolean prepareSyncedVibration(long requiredCapabilities, int[] vibratorIds) {
            Trace.traceBegin(Trace.TRACE_TAG_VIBRATOR, "prepareSyncedVibration");
            Trace.traceBegin(TRACE_TAG_VIBRATOR, "prepareSyncedVibration");
            try {
                if ((mCapabilities & requiredCapabilities) != requiredCapabilities) {
                    // This sync step requires capabilities this device doesn't have, skipping
@@ -1590,33 +1586,33 @@ public class VibratorManagerService extends IVibratorManagerService.Stub {
                }
                return mNativeWrapper.prepareSynced(vibratorIds);
            } finally {
                Trace.traceEnd(Trace.TRACE_TAG_VIBRATOR);
                Trace.traceEnd(TRACE_TAG_VIBRATOR);
            }
        }

        @Override
        public boolean triggerSyncedVibration(long vibrationId) {
            Trace.traceBegin(Trace.TRACE_TAG_VIBRATOR, "triggerSyncedVibration");
            Trace.traceBegin(TRACE_TAG_VIBRATOR, "triggerSyncedVibration");
            try {
                return mNativeWrapper.triggerSynced(vibrationId);
            } finally {
                Trace.traceEnd(Trace.TRACE_TAG_VIBRATOR);
                Trace.traceEnd(TRACE_TAG_VIBRATOR);
            }
        }

        @Override
        public void cancelSyncedVibration() {
            Trace.traceBegin(Trace.TRACE_TAG_VIBRATOR, "cancelSyncedVibration");
            Trace.traceBegin(TRACE_TAG_VIBRATOR, "cancelSyncedVibration");
            try {
                mNativeWrapper.cancelSynced();
            } finally {
                Trace.traceEnd(Trace.TRACE_TAG_VIBRATOR);
                Trace.traceEnd(TRACE_TAG_VIBRATOR);
            }
        }

        @Override
        public void noteVibratorOn(int uid, long duration) {
            Trace.traceBegin(Trace.TRACE_TAG_VIBRATOR, "noteVibratorOn");
            Trace.traceBegin(TRACE_TAG_VIBRATOR, "noteVibratorOn");
            try {
                if (duration <= 0) {
                    // Tried to turn vibrator ON and got:
@@ -1635,20 +1631,20 @@ public class VibratorManagerService extends IVibratorManagerService.Stub {
            } catch (RemoteException e) {
                Slog.e(TAG, "Error logging VibratorStateChanged to ON", e);
            } finally {
                Trace.traceEnd(Trace.TRACE_TAG_VIBRATOR);
                Trace.traceEnd(TRACE_TAG_VIBRATOR);
            }
        }

        @Override
        public void noteVibratorOff(int uid) {
            Trace.traceBegin(Trace.TRACE_TAG_VIBRATOR, "noteVibratorOff");
            Trace.traceBegin(TRACE_TAG_VIBRATOR, "noteVibratorOff");
            try {
                mBatteryStatsService.noteVibratorOff(uid);
                mFrameworkStatsLogger.writeVibratorStateOffAsync(uid);
            } catch (RemoteException e) {
                Slog.e(TAG, "Error logging VibratorStateChanged to OFF", e);
            } finally {
                Trace.traceEnd(Trace.TRACE_TAG_VIBRATOR);
                Trace.traceEnd(TRACE_TAG_VIBRATOR);
            }
        }

@@ -1657,7 +1653,8 @@ public class VibratorManagerService extends IVibratorManagerService.Stub {
            if (DEBUG) {
                Slog.d(TAG, "VibrationThread released after finished vibration");
            }
            Trace.traceBegin(Trace.TRACE_TAG_VIBRATOR, "onVibrationThreadReleased: " + vibrationId);
            Trace.traceBegin(TRACE_TAG_VIBRATOR, "onVibrationThreadReleased");

            try {
                synchronized (mLock) {
                    if (DEBUG) {
@@ -1686,7 +1683,7 @@ public class VibratorManagerService extends IVibratorManagerService.Stub {
                    }
                }
            } finally {
                Trace.traceEnd(Trace.TRACE_TAG_VIBRATOR);
                Trace.traceEnd(TRACE_TAG_VIBRATOR);
            }
        }
    }
@@ -1994,7 +1991,7 @@ public class VibratorManagerService extends IVibratorManagerService.Stub {

        @Override
        public ExternalVibrationScale onExternalVibrationStart(ExternalVibration vib) {
            Trace.traceBegin(Trace.TRACE_TAG_VIBRATOR, "onExternalVibrationStart");
            Trace.traceBegin(TRACE_TAG_VIBRATOR, "onExternalVibrationStart");
            try {
                // Create Vibration.Stats as close to the received request as possible, for
                // tracking.
@@ -2116,13 +2113,13 @@ public class VibratorManagerService extends IVibratorManagerService.Stub {
                    return externalVibration.getScale();
                }
            } finally {
                Trace.traceEnd(Trace.TRACE_TAG_VIBRATOR);
                Trace.traceEnd(TRACE_TAG_VIBRATOR);
            }
        }

        @Override
        public void onExternalVibrationStop(ExternalVibration vib) {
            Trace.traceBegin(Trace.TRACE_TAG_VIBRATOR, "onExternalVibrationStop");
            Trace.traceBegin(TRACE_TAG_VIBRATOR, "onExternalVibrationStop");
            try {
                synchronized (mLock) {
                    if (mCurrentExternalVibration != null
@@ -2135,7 +2132,7 @@ public class VibratorManagerService extends IVibratorManagerService.Stub {
                    }
                }
            } finally {
                Trace.traceEnd(Trace.TRACE_TAG_VIBRATOR);
                Trace.traceEnd(TRACE_TAG_VIBRATOR);
            }
        }

@@ -2203,32 +2200,39 @@ public class VibratorManagerService extends IVibratorManagerService.Stub {

        @Override
        public int onCommand(String cmd) {
            Trace.traceBegin(Trace.TRACE_TAG_VIBRATOR, "onCommand " + cmd);
            try {
                if ("list".equals(cmd)) {
                    Trace.traceBegin(TRACE_TAG_VIBRATOR, "onCommand: list");
                    return runListVibrators();
                }
                if ("synced".equals(cmd)) {
                    Trace.traceBegin(TRACE_TAG_VIBRATOR, "onCommand: synced");
                    return runMono();
                }
                if ("combined".equals(cmd)) {
                    Trace.traceBegin(TRACE_TAG_VIBRATOR, "onCommand: combined");
                    return runStereo();
                }
                if ("sequential".equals(cmd)) {
                    Trace.traceBegin(TRACE_TAG_VIBRATOR, "onCommand: sequential");
                    return runSequential();
                }
                if ("xml".equals(cmd)) {
                    Trace.traceBegin(TRACE_TAG_VIBRATOR, "onCommand: xml");
                    return runXml();
                }
                if ("cancel".equals(cmd)) {
                    Trace.traceBegin(TRACE_TAG_VIBRATOR, "onCommand: cancel");
                    return runCancel();
                }
                if ("feedback".equals(cmd)) {
                    Trace.traceBegin(TRACE_TAG_VIBRATOR, "onCommand: feedback");
                    return runHapticFeedback();
                }
                Trace.traceBegin(TRACE_TAG_VIBRATOR, "onCommand: default");
                return handleDefaultCommands(cmd);
            } finally {
                Trace.traceEnd(Trace.TRACE_TAG_VIBRATOR);
                Trace.traceEnd(TRACE_TAG_VIBRATOR);
            }
        }