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

Commit 13381545 authored by Alexey Kuzmin's avatar Alexey Kuzmin
Browse files

Link to death of external vibrations

Bug: 133200481
Test: manual
Change-Id: I6a76b926d60a79fd450a2f7eaf9609243ac0aaf7
parent 13ee7876
Loading
Loading
Loading
Loading
+18 −0
Original line number Diff line number Diff line
@@ -114,6 +114,24 @@ public class ExternalVibration implements Parcelable {
        return true;
    }

    /**
     * Links a recipient to death against this external vibration token
     */
    public void linkToDeath(IBinder.DeathRecipient recipient) {
        try {
            mToken.linkToDeath(recipient, 0);
        } catch (RemoteException e) {
            return;
        }
    }

    /**
     * Unlinks a recipient to death against this external vibration token
     */
    public void unlinkToDeath(IBinder.DeathRecipient recipient) {
        mToken.unlinkToDeath(recipient, 0);
    }

    @Override
    public boolean equals(Object o) {
        if (o == null || !(o instanceof ExternalVibration)) {
+14 −1
Original line number Diff line number Diff line
@@ -620,7 +620,6 @@ public class VibratorService extends IVibratorService.Stub
                linkVibration(vib);
                long ident = Binder.clearCallingIdentity();
                try {

                    doCancelVibrateLocked();
                    startVibrationLocked(vib);
                    addToPreviousVibrationsLocked(vib);
@@ -1437,6 +1436,8 @@ public class VibratorService extends IVibratorService.Stub
    }

    final class ExternalVibratorService extends IExternalVibratorService.Stub {
        ExternalVibrationDeathRecipient mCurrentExternalDeathRecipient;

        @Override
        public int onExternalVibrationStart(ExternalVibration vib) {
            if (!mSupportsExternalControl) {
@@ -1470,6 +1471,8 @@ public class VibratorService extends IVibratorService.Stub
                    // Note that this doesn't support multiple concurrent external controls, as we
                    // would need to mute the old one still if it came from a different controller.
                    mCurrentExternalVibration = vib;
                    mCurrentExternalDeathRecipient = new ExternalVibrationDeathRecipient();
                    mCurrentExternalVibration.linkToDeath(mCurrentExternalDeathRecipient);
                    if (mPreviousExternalVibrations.size() > mPreviousVibrationsLimit) {
                        mPreviousExternalVibrations.removeFirst();
                    }
@@ -1514,6 +1517,8 @@ public class VibratorService extends IVibratorService.Stub
        public void onExternalVibrationStop(ExternalVibration vib) {
            synchronized (mLock) {
                if (vib.equals(mCurrentExternalVibration)) {
                    mCurrentExternalVibration.unlinkToDeath(mCurrentExternalDeathRecipient);
                    mCurrentExternalDeathRecipient = null;
                    mCurrentExternalVibration = null;
                    setVibratorUnderExternalControl(false);
                    if (DEBUG) {
@@ -1522,6 +1527,14 @@ public class VibratorService extends IVibratorService.Stub
                }
            }
        }

        private class ExternalVibrationDeathRecipient implements IBinder.DeathRecipient {
            public void binderDied() {
                synchronized (mLock) {
                    onExternalVibrationStop(mCurrentExternalVibration);
                }
            }
        }
    }

    private final class VibratorShellCommand extends ShellCommand {