From aeb92182c17dcc0b9584d9edd4a655784dc067ba Mon Sep 17 00:00:00 2001 From: Joanne Chung Date: Tue, 2 Feb 2021 22:40:42 +0800 Subject: [PATCH] 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 --- .../translation/UiTranslationController.java | 25 ++++++++----------- 1 file changed, 10 insertions(+), 15 deletions(-) diff --git a/core/java/android/view/translation/UiTranslationController.java b/core/java/android/view/translation/UiTranslationController.java index fa4614628102e..b49d3c004f448 100644 --- a/core/java/android/view/translation/UiTranslationController.java +++ b/core/java/android/view/translation/UiTranslationController.java @@ -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 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 action, @UiTranslationState int state) { + private void runForEachView(Consumer action) { synchronized (mLock) { + final ArrayMap> 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(); - } }); } }