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

Commit 844cc85d authored by Joanne Chung's avatar Joanne Chung
Browse files

Fix translation reference gone problem.

1. We save Translator WeakReference in ServiceBinderReceiver.
It has a chance the reference is gone even the session is still
alive. Save Translator instead of WeakReference.
2. Fix not access TranslationManager mTranslators, mTranslatorIds in
the lock.
3. Fix protential NPE of resultData access in ServiceBinderReceiver.

Bug: 192205945
Test: manual. The function works.
Test: atest CtsTranslationTestCases

Change-Id: I158901db4bbcd76203c705ab2a34f1e0b37c7565
parent 5ded797e
Loading
Loading
Loading
Loading
+4 −2
Original line number Diff line number Diff line
@@ -168,8 +168,10 @@ public final class TranslationManager {
                                return;
                            }

                            synchronized (mLock) {
                                mTranslators.put(tId, translator);
                                mTranslatorIds.put(translationContext, tId);
                            }
                            final long token = Binder.clearCallingIdentity();
                            try {
                                executor.execute(() -> callback.accept(translator));
+6 −11
Original line number Diff line number Diff line
@@ -102,19 +102,19 @@ public class Translator {

    static class ServiceBinderReceiver extends IResultReceiver.Stub {
        // TODO: refactor how translator is instantiated after removing deprecated createTranslator.
        private final WeakReference<Translator> mTranslator;
        private final Translator mTranslator;
        private final CountDownLatch mLatch = new CountDownLatch(1);
        private int mSessionId;

        private Consumer<Translator> mCallback;

        ServiceBinderReceiver(Translator translator, Consumer<Translator> callback) {
            mTranslator = new WeakReference<>(translator);
            mTranslator = translator;
            mCallback = callback;
        }

        ServiceBinderReceiver(Translator translator) {
            mTranslator = new WeakReference<>(translator);
            mTranslator = translator;
        }

        int getSessionStateResult() throws TimeoutException {
@@ -139,14 +139,9 @@ public class Translator {
                }
                return;
            }
            mSessionId = resultData.getInt(EXTRA_SESSION_ID);
            final Translator translator = mTranslator.get();
            if (translator == null) {
                Log.w(TAG, "received result after session is finished");
                return;
            }
            final IBinder binder;
            if (resultData != null) {
                mSessionId = resultData.getInt(EXTRA_SESSION_ID);
                binder = resultData.getBinder(EXTRA_SERVICE_BINDER);
                if (binder == null) {
                    Log.wtf(TAG, "No " + EXTRA_SERVICE_BINDER + " extra result");
@@ -155,10 +150,10 @@ public class Translator {
            } else {
                binder = null;
            }
            translator.setServiceBinder(binder);
            mTranslator.setServiceBinder(binder);
            mLatch.countDown();
            if (mCallback != null) {
                mCallback.accept(translator);
                mCallback.accept(mTranslator);
            }
        }