diff options
| -rw-r--r-- | services/core/java/com/android/server/TextServicesManagerService.java | 44 |
1 files changed, 36 insertions, 8 deletions
diff --git a/services/core/java/com/android/server/TextServicesManagerService.java b/services/core/java/com/android/server/TextServicesManagerService.java index 0941bc863902..c043e18fe5d4 100644 --- a/services/core/java/com/android/server/TextServicesManagerService.java +++ b/services/core/java/com/android/server/TextServicesManagerService.java @@ -63,6 +63,7 @@ import android.view.textservice.SpellCheckerSubtype; import java.io.FileDescriptor; import java.io.IOException; import java.io.PrintWriter; +import java.lang.ref.WeakReference; import java.util.Arrays; import java.util.ArrayList; import java.util.HashMap; @@ -1024,19 +1025,46 @@ public class TextServicesManagerService extends ITextServicesManager.Stub { private static final class ISpellCheckerServiceCallbackBinder extends ISpellCheckerServiceCallback.Stub { @NonNull - private final SpellCheckerBindGroup mBindGroup; - @NonNull - private final SessionRequest mRequest; + private final Object mCallbackLock = new Object(); - ISpellCheckerServiceCallbackBinder(@NonNull final SpellCheckerBindGroup bindGroup, - @NonNull final SessionRequest request) { - mBindGroup = bindGroup; - mRequest = request; + @GuardedBy("mCallbackLock") + @Nullable + private WeakReference<SpellCheckerBindGroup> mBindGroup; + + /** + * Original {@link SessionRequest} that is associated with this callback. + * + * <p>Note that {@link SpellCheckerBindGroup#mOnGoingSessionRequests} guarantees that this + * {@link SessionRequest} object is kept alive until the request is canceled.</p> + */ + @GuardedBy("mCallbackLock") + @Nullable + private WeakReference<SessionRequest> mRequest; + + ISpellCheckerServiceCallbackBinder(@NonNull SpellCheckerBindGroup bindGroup, + @NonNull SessionRequest request) { + synchronized (mCallbackLock) { + mBindGroup = new WeakReference<>(bindGroup); + mRequest = new WeakReference<>(request); + } } @Override public void onSessionCreated(@Nullable ISpellCheckerSession newSession) { - mBindGroup.onSessionCreated(newSession, mRequest); + final SpellCheckerBindGroup group; + final SessionRequest request; + synchronized (mCallbackLock) { + if (mBindGroup == null || mRequest == null) { + return; + } + group = mBindGroup.get(); + request = mRequest.get(); + mBindGroup = null; + mRequest = null; + } + if (group != null && request != null) { + group.onSessionCreated(newSession, request); + } } } } |