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

Commit aeb92182 authored by Joanne Chung's avatar Joanne Chung
Browse files

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
parent c8f8ad2f
Loading
Loading
Loading
Loading
+10 −15
Original line number Diff line number Diff line
@@ -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();
                }
            });
        }
    }