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
This commit is contained in:
Joanne Chung
2021-07-01 18:55:50 +08:00
parent 5ded797ef4
commit 844cc85ddf
2 changed files with 10 additions and 13 deletions

View File

@@ -168,8 +168,10 @@ public final class TranslationManager {
return;
}
mTranslators.put(tId, translator);
mTranslatorIds.put(translationContext, tId);
synchronized (mLock) {
mTranslators.put(tId, translator);
mTranslatorIds.put(translationContext, tId);
}
final long token = Binder.clearCallingIdentity();
try {
executor.execute(() -> callback.accept(translator));

View File

@@ -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);
}
}