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:
@@ -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();
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user