OSDN Git Service

Unregister callback from binder when vibration is removed
authorMathias Jeppsson <mathias.jeppsson@sonyericsson.com>
Tue, 28 Sep 2010 12:45:23 +0000 (14:45 +0200)
committerJohan Redestig <johan.redestig@sonyericsson.com>
Thu, 24 Mar 2011 07:49:12 +0000 (08:49 +0100)
When creating new vibration pattern, a callback is registered
in case binding to caller goes away, by linkToDeath().
Need to unregister this callback when we throw away the vibration.

Change-Id: Ibdf0bd415a539054ac7a66f49b33a864f729c546

services/java/com/android/server/VibratorService.java

index f0b5955..86c30f8 100755 (executable)
@@ -243,6 +243,7 @@ public class VibratorService extends IVibratorService.Stub {
     // Lock held on mVibrations
     private void startNextVibrationLocked() {
         if (mVibrations.size() <= 0) {
+            mCurrentVibration = null;
             return;
         }
         mCurrentVibration = mVibrations.getFirst();
@@ -269,17 +270,27 @@ public class VibratorService extends IVibratorService.Stub {
             Vibration vib = iter.next();
             if (vib.mToken == token) {
                 iter.remove();
+                unlinkVibration(vib);
                 return vib;
             }
         }
         // We might be looking for a simple vibration which is only stored in
         // mCurrentVibration.
         if (mCurrentVibration != null && mCurrentVibration.mToken == token) {
+            unlinkVibration(mCurrentVibration);
             return mCurrentVibration;
         }
         return null;
     }
 
+    private void unlinkVibration(Vibration vib) {
+        if (vib.mPattern != null) {
+            // If Vibration object has a pattern,
+            // the Vibration object has also been linkedToDeath.
+            vib.mToken.unlinkToDeath(vib, 0);
+        }
+    }
+
     private class VibrateThread extends Thread {
         final Vibration mVibration;
         boolean mDone;
@@ -356,6 +367,7 @@ public class VibratorService extends IVibratorService.Stub {
                     // If this vibration finished naturally, start the next
                     // vibration.
                     mVibrations.remove(mVibration);
+                    unlinkVibration(mVibration);
                     startNextVibrationLocked();
                 }
             }