Fix and refine works in UiTranslationController

1. Fix wrong state while calling runForEachView(). Make a copy of
mView and operate these views on ui thread.
2. Don't throw Exception in Activity side if the views paramether is
empty. The parameters is aleady checked in API call level.
3. Simpify call methods with lamda

Bug: 172969740
Test: call UiTranslation APIs and make sure methods are called as expected

Change-Id: Ic319939ec72a11608c64db876c57780339b75fd3
This commit is contained in:
Joanne Chung
2021-02-02 22:40:42 +08:00
parent c8f8ad2f54
commit aeb92182c1

View File

@@ -101,15 +101,17 @@ public class UiTranslationController {
}
break;
case STATE_UI_TRANSLATION_PAUSED:
runForEachView((view) -> view.onPauseUiTranslation(), STATE_UI_TRANSLATION_PAUSED);
runForEachView(View::onPauseUiTranslation);
break;
case STATE_UI_TRANSLATION_RESUMED:
runForEachView((view) -> view.onRestoreUiTranslation(),
STATE_UI_TRANSLATION_PAUSED);
runForEachView(View::onRestoreUiTranslation);
break;
case STATE_UI_TRANSLATION_FINISHED:
destroyTranslators();
runForEachView((view) -> view.onFinishUiTranslation(), STATE_UI_TRANSLATION_PAUSED);
runForEachView(View::onFinishUiTranslation);
synchronized (mLock) {
mViews.clear();
}
break;
default:
Log.w(TAG, "onAutoTranslationStateChange(): unknown state: " + state);
@@ -191,9 +193,6 @@ public class UiTranslationController {
*/
private void onUiTranslationStarted(Translator translator, List<AutofillId> views) {
synchronized (mLock) {
if (views == null || views.size() == 0) {
throw new IllegalArgumentException("Invalid empty views: " + views);
}
// Find Views collect the translation data
// TODO(b/178084101): try to optimize, e.g. to this in a single traversal
final int viewCounts = views.size();
@@ -223,22 +222,18 @@ public class UiTranslationController {
}
}
private void runForEachView(Consumer<View> action, @UiTranslationState int state) {
private void runForEachView(Consumer<View> action) {
synchronized (mLock) {
final ArrayMap<AutofillId, WeakReference<View>> views = new ArrayMap<>(mViews);
mActivity.runOnUiThread(() -> {
final int viewCounts = mViews.size();
final int viewCounts = views.size();
for (int i = 0; i < viewCounts; i++) {
final View view = mViews.valueAt(i).get();
final View view = views.valueAt(i).get();
if (view == null) {
Log.w(TAG, "The View for autofill id " + mViews.keyAt(i)
+ " may be gone for state " + stateToString(state));
continue;
}
action.accept(view);
}
if (state == STATE_UI_TRANSLATION_FINISHED) {
mViews.clear();
}
});
}
}