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

Commit 582ded91 authored by Joanne Chung's avatar Joanne Chung Committed by Automerger Merge Worker
Browse files

Merge "Bug fix: allow to create ViewTranslationRequest for virtual...

Merge "Bug fix: allow to create ViewTranslationRequest for virtual AutofillId." into sc-dev am: 72cf07d1

Original change: https://googleplex-android-review.googlesource.com/c/platform/frameworks/base/+/14031650

Change-Id: I340fef698af319d1c86d9308e632d18af8ebba5a
parents 5362d264 72cf07d1
Loading
Loading
Loading
Loading
+2 −1
Original line number Diff line number Diff line
@@ -52922,8 +52922,9 @@ package android.view.translation {
  public static final class ViewTranslationRequest.Builder {
    ctor public ViewTranslationRequest.Builder(@NonNull android.view.autofill.AutofillId);
    ctor public ViewTranslationRequest.Builder(@NonNull android.view.autofill.AutofillId, long);
    method @NonNull public android.view.translation.ViewTranslationRequest build();
    method public android.view.translation.ViewTranslationRequest.Builder setValue(String, android.view.translation.TranslationRequestValue);
    method @NonNull public android.view.translation.ViewTranslationRequest.Builder setValue(@NonNull String, @NonNull android.view.translation.TranslationRequestValue);
  }
  public final class ViewTranslationResponse implements android.os.Parcelable {
+1 −1
Original line number Diff line number Diff line
@@ -14753,7 +14753,7 @@ package android.webkit {
    method public default boolean onCheckIsTextEditor();
    method public void onConfigurationChanged(android.content.res.Configuration);
    method public android.view.inputmethod.InputConnection onCreateInputConnection(android.view.inputmethod.EditorInfo);
    method @Nullable public default void onCreateTranslationRequests(@NonNull long[], @NonNull int[], @NonNull java.util.function.Consumer<android.view.translation.ViewTranslationRequest>);
    method public default void onCreateTranslationRequests(@NonNull long[], @NonNull int[], @NonNull java.util.function.Consumer<android.view.translation.ViewTranslationRequest>);
    method public void onDetachedFromWindow();
    method public boolean onDragEvent(android.view.DragEvent);
    method public void onDraw(android.graphics.Canvas);
+4 −3
Original line number Diff line number Diff line
@@ -30759,10 +30759,11 @@ public class View implements Drawable.Callback, KeyEvent.Callback,
     * view.
     * @param supportedFormats the supported translation formats. For now, the only possible value
     * is the {@link android.view.translation.TranslationSpec#DATA_FORMAT_TEXT}.
     * @param requestsCollector a {@link ViewTranslationRequest} collector that will be called
     * @param requestsCollector a {@link ViewTranslationRequest} collector that can be called
     * multiple times to collect the information to be translated in the virtual view. One
     * {@link ViewTranslationRequest} per virtual child. The {@link ViewTranslationRequest} must
     * contains the {@link AutofillId} corresponding to the virtualChildIds.
     * contains the {@link AutofillId} corresponding to the virtualChildIds. Do not keep this
     * Consumer after the method returns.
     */
    @SuppressLint("NullableCollection")
    public void onCreateTranslationRequests(@NonNull long[] virtualChildIds,
@@ -30835,7 +30836,7 @@ public class View implements Drawable.Callback, KeyEvent.Callback,
     * ui translation, the system will call this method to traverse the view hierarchy to call
     * {@link View#onCreateTranslationRequest} to build {@link ViewTranslationRequest}s and create a
     * {@link android.view.translation.Translator} to translate the requests. All the
     * {@link ViewTranslationRequest}s will be added when the traversal is done.
     * {@link ViewTranslationRequest}s must be added when the traversal is done.
     *
     * <p> The default implementation will call {@link View#onCreateTranslationRequest} to build
     * {@link ViewTranslationRequest} if the view should be translated. </p>
+15 −9
Original line number Diff line number Diff line
@@ -30,6 +30,7 @@ import android.os.Handler;
import android.os.HandlerThread;
import android.os.Process;
import android.util.ArrayMap;
import android.util.IntArray;
import android.util.Log;
import android.util.LongSparseArray;
import android.util.Pair;
@@ -241,13 +242,11 @@ public class UiTranslationController {
        final SparseArray<ViewTranslationResponse> viewsResult = new SparseArray<>();
        final SparseArray<LongSparseArray<ViewTranslationResponse>> virtualViewsResult =
                new SparseArray<>();
        // TODO: use another structure to prevent autoboxing?
        final List<Integer> viewIds = new ArrayList<>();

        final IntArray viewIds = new IntArray(1);
        for (int i = 0; i < translatedResult.size(); i++) {
            final ViewTranslationResponse result = translatedResult.valueAt(i);
            final AutofillId autofillId = result.getAutofillId();
            if (!viewIds.contains(autofillId.getViewId())) {
            if (viewIds.indexOf(autofillId.getViewId()) < 0) {
                viewIds.add(autofillId.getViewId());
            }
            if (autofillId.isNonVirtual()) {
@@ -405,23 +404,29 @@ public class UiTranslationController {
            // Filter the request views's AutofillId
            SparseIntArray virtualViewChildCount = getRequestVirtualViewChildCount(views);
            Map<AutofillId, long[]> viewIds = new ArrayMap<>();
            Map<AutofillId, Integer> unusedIndices = null;
            for (int i = 0; i < views.size(); i++) {
                AutofillId autofillId = views.get(i);
                if (autofillId.isNonVirtual()) {
                    viewIds.put(autofillId, null);
                } else {
                    if (unusedIndices == null) {
                        unusedIndices = new ArrayMap<>();
                    }
                    // The virtual id get from content capture is long, see getVirtualChildLongId()
                    // e.g. 1001, 1001:2, 1002:1 -> 1001, <1,2>; 1002, <1>
                    AutofillId virtualViewAutofillId = new AutofillId(autofillId.getViewId());
                    long[] childs;
                    int end = 0;
                    if (viewIds.containsKey(virtualViewAutofillId)) {
                        childs = viewIds.get(virtualViewAutofillId);
                        end = unusedIndices.get(virtualViewAutofillId);
                    } else {
                        int childCount = virtualViewChildCount.get(autofillId.getViewId());
                        childs = new long[childCount];
                        viewIds.put(virtualViewAutofillId, childs);
                    }
                    int end = childs.length - 1;
                    unusedIndices.put(virtualViewAutofillId, end + 1);
                    childs[end] = autofillId.getVirtualChildLongId();
                }
            }
@@ -465,7 +470,7 @@ public class UiTranslationController {
        return new int[] {TranslationSpec.DATA_FORMAT_TEXT};
    }

    private void findViewsTraversalByAutofillIds(List<Integer> sourceViewIds) {
    private void findViewsTraversalByAutofillIds(IntArray sourceViewIds) {
        final ArrayList<ViewRootImpl> roots =
                WindowManagerGlobal.getInstance().getRootViews(mActivity.getActivityToken());
        for (int rootNum = 0; rootNum < roots.size(); rootNum++) {
@@ -479,7 +484,7 @@ public class UiTranslationController {
    }

    private void findViewsTraversalByAutofillIds(ViewGroup viewGroup,
            List<Integer> sourceViewIds) {
            IntArray sourceViewIds) {
        final int childCount = viewGroup.getChildCount();
        for (int i = 0; i < childCount; ++i) {
            final View child = viewGroup.getChildAt(i);
@@ -491,9 +496,10 @@ public class UiTranslationController {
        }
    }

    private void addViewIfNeeded(List<Integer> sourceViewIds, View view) {
    private void addViewIfNeeded(IntArray sourceViewIds, View view) {
        final AutofillId autofillId = view.getAutofillId();
        if (sourceViewIds.contains(autofillId.getViewId()) && !mViews.containsKey(autofillId)) {
        if ((sourceViewIds.indexOf(autofillId.getViewId()) >= 0)
                && !mViews.containsKey(autofillId)) {
            mViews.put(autofillId, new WeakReference<>(view));
        }
    }
+82 −71
Original line number Diff line number Diff line
@@ -35,7 +35,8 @@ import java.util.Set;
 * Wrapper class representing a translation request associated with a {@link android.view.View} to
 * be used by {@link android.service.translation.TranslationService}.
 */
@DataClass(genBuilder = true, genToString = true, genEqualsHashCode = true, genGetters = false)
@DataClass(genBuilder = false, genToString = true, genEqualsHashCode = true, genGetters = false,
        genHiddenConstructor = true)
public final class ViewTranslationRequest implements Parcelable {

    /**
@@ -91,10 +92,39 @@ public final class ViewTranslationRequest implements Parcelable {
        return Collections.emptyMap();
    }

    @DataClass.Suppress({"addTranslationRequestValue", "setAutofillId"})
    abstract static class BaseBuilder {
    /**
     * A builder for building ViewTranslationRequest.
     */
    public static final class Builder {

        abstract Builder setTranslationRequestValues(Map<String, TranslationRequestValue> value);
        private @NonNull AutofillId mAutofillId;
        private @NonNull Map<String, TranslationRequestValue> mTranslationRequestValues;

        private long mBuilderFieldsSet = 0L;

        /**
         * Creates a new Builder.
         *
         * @param autofillId The {@link AutofillId} of the view associated with this request.
         */
        public Builder(@NonNull AutofillId autofillId) {
            mAutofillId = autofillId;
            com.android.internal.util.AnnotationValidations.validate(
                    NonNull.class, null, mAutofillId);
        }

        /**
         * Creates a new Builder.
         *
         * @param autofillId the {@link AutofillId} of the non-virtual view hosting the virtual view
         * hierarchy associated with this request.
        * @param virtualChildId the id of the virtual child, relative to the parent.
         */
        public Builder(@NonNull AutofillId autofillId, long virtualChildId) {
            mAutofillId = new AutofillId(autofillId, virtualChildId, AutofillId.NO_SESSION);
            com.android.internal.util.AnnotationValidations.validate(
                    NonNull.class, null, mAutofillId);
        }

        /**
         * Sets the corresponding {@link TranslationRequestValue} for the provided key.
@@ -104,20 +134,50 @@ public final class ViewTranslationRequest implements Parcelable {
         * @return this builder.
         */
        @SuppressLint("MissingGetterMatchingBuilder")
        public Builder setValue(String key,
                TranslationRequestValue value) {
            final Builder builder = (Builder) this;
            if (builder.mTranslationRequestValues == null) {
        @NonNull
        public Builder setValue(@NonNull String key, @NonNull TranslationRequestValue value) {
            if (mTranslationRequestValues == null) {
                setTranslationRequestValues(new ArrayMap<>());
            }
            builder.mTranslationRequestValues.put(key, value);
            return builder;
            mTranslationRequestValues.put(key, value);
            return this;
        }

        /**
         * Builds the instance. This builder should not be touched after calling this!
         */
        @NonNull
        public ViewTranslationRequest build() {
            checkNotUsed();
            mBuilderFieldsSet |= 0x4; // Mark builder used

            if ((mBuilderFieldsSet & 0x2) == 0) {
                mTranslationRequestValues = defaultTranslationRequestValues();
            }
            ViewTranslationRequest o = new ViewTranslationRequest(
                    mAutofillId,
                    mTranslationRequestValues);
            return o;
        }

        Builder setTranslationRequestValues(@NonNull Map<String, TranslationRequestValue> value) {
            checkNotUsed();
            mBuilderFieldsSet |= 0x2;
            mTranslationRequestValues = value;
            return this;
        }

        private void checkNotUsed() {
            if ((mBuilderFieldsSet & 0x4) != 0) {
                throw new IllegalStateException(
                        "This Builder should not be reused. Use a new Builder instance instead");
            }
        }
    }



    // Code below generated by codegen v1.0.22.
    // Code below generated by codegen v1.0.23.
    //
    // DO NOT MODIFY!
    // CHECKSTYLE:OFF Generated code
@@ -130,8 +190,15 @@ public final class ViewTranslationRequest implements Parcelable {
    //@formatter:off


    /**
     * Creates a new ViewTranslationRequest.
     *
     * @param autofillId
     *   The {@link AutofillId} of the view associated with this request.
     * @hide
     */
    @DataClass.Generated.Member
    /* package-private */ ViewTranslationRequest(
    public ViewTranslationRequest(
            @NonNull AutofillId autofillId,
            @NonNull Map<String,TranslationRequestValue> translationRequestValues) {
        this.mAutofillId = autofillId;
@@ -234,67 +301,11 @@ public final class ViewTranslationRequest implements Parcelable {
        }
    };

    /**
     * A builder for {@link ViewTranslationRequest}
     */
    @SuppressWarnings("WeakerAccess")
    @DataClass.Generated.Member
    public static final class Builder extends BaseBuilder {

        private @NonNull AutofillId mAutofillId;
        private @NonNull Map<String,TranslationRequestValue> mTranslationRequestValues;

        private long mBuilderFieldsSet = 0L;

        /**
         * Creates a new Builder.
         *
         * @param autofillId
         *   The {@link AutofillId} of the view associated with this request.
         */
        public Builder(
                @NonNull AutofillId autofillId) {
            mAutofillId = autofillId;
            com.android.internal.util.AnnotationValidations.validate(
                    NonNull.class, null, mAutofillId);
        }

        @DataClass.Generated.Member
        @Override
        @NonNull Builder setTranslationRequestValues(@NonNull Map<String,TranslationRequestValue> value) {
            checkNotUsed();
            mBuilderFieldsSet |= 0x2;
            mTranslationRequestValues = value;
            return this;
        }

        /** Builds the instance. This builder should not be touched after calling this! */
        public @NonNull ViewTranslationRequest build() {
            checkNotUsed();
            mBuilderFieldsSet |= 0x4; // Mark builder used

            if ((mBuilderFieldsSet & 0x2) == 0) {
                mTranslationRequestValues = defaultTranslationRequestValues();
            }
            ViewTranslationRequest o = new ViewTranslationRequest(
                    mAutofillId,
                    mTranslationRequestValues);
            return o;
        }

        private void checkNotUsed() {
            if ((mBuilderFieldsSet & 0x4) != 0) {
                throw new IllegalStateException(
                        "This Builder should not be reused. Use a new Builder instance instead");
            }
        }
    }

    @DataClass.Generated(
            time = 1614992269658L,
            codegenVersion = "1.0.22",
            time = 1617119791798L,
            codegenVersion = "1.0.23",
            sourceFile = "frameworks/base/core/java/android/view/translation/ViewTranslationRequest.java",
            inputSignatures = "public static final  java.lang.String ID_TEXT\nprivate final @android.annotation.NonNull android.view.autofill.AutofillId mAutofillId\nprivate final @android.annotation.NonNull @com.android.internal.util.DataClass.PluralOf(\"translationRequestValue\") java.util.Map<java.lang.String,android.view.translation.TranslationRequestValue> mTranslationRequestValues\npublic @android.annotation.NonNull android.view.translation.TranslationRequestValue getValue(java.lang.String)\npublic @android.annotation.NonNull java.util.Set<java.lang.String> getKeys()\npublic @android.annotation.NonNull android.view.autofill.AutofillId getAutofillId()\nprivate static  java.util.Map<java.lang.String,android.view.translation.TranslationRequestValue> defaultTranslationRequestValues()\nclass ViewTranslationRequest extends java.lang.Object implements [android.os.Parcelable]\nabstract  android.view.translation.ViewTranslationRequest.Builder setTranslationRequestValues(java.util.Map<java.lang.String,android.view.translation.TranslationRequestValue>)\npublic @android.annotation.SuppressLint android.view.translation.ViewTranslationRequest.Builder setValue(java.lang.String,android.view.translation.TranslationRequestValue)\nclass BaseBuilder extends java.lang.Object implements []\n@com.android.internal.util.DataClass(genBuilder=true, genToString=true, genEqualsHashCode=true, genGetters=false)\nabstract  android.view.translation.ViewTranslationRequest.Builder setTranslationRequestValues(java.util.Map<java.lang.String,android.view.translation.TranslationRequestValue>)\npublic @android.annotation.SuppressLint android.view.translation.ViewTranslationRequest.Builder setValue(java.lang.String,android.view.translation.TranslationRequestValue)\nclass BaseBuilder extends java.lang.Object implements []")
            inputSignatures = "public static final  java.lang.String ID_TEXT\nprivate final @android.annotation.NonNull android.view.autofill.AutofillId mAutofillId\nprivate final @android.annotation.NonNull @com.android.internal.util.DataClass.PluralOf(\"translationRequestValue\") java.util.Map<java.lang.String,android.view.translation.TranslationRequestValue> mTranslationRequestValues\npublic @android.annotation.NonNull android.view.translation.TranslationRequestValue getValue(java.lang.String)\npublic @android.annotation.NonNull java.util.Set<java.lang.String> getKeys()\npublic @android.annotation.NonNull android.view.autofill.AutofillId getAutofillId()\nprivate static  java.util.Map<java.lang.String,android.view.translation.TranslationRequestValue> defaultTranslationRequestValues()\nclass ViewTranslationRequest extends java.lang.Object implements [android.os.Parcelable]\nprivate @android.annotation.NonNull android.view.autofill.AutofillId mAutofillId\nprivate @android.annotation.NonNull java.util.Map<java.lang.String,android.view.translation.TranslationRequestValue> mTranslationRequestValues\nprivate  long mBuilderFieldsSet\npublic @android.annotation.SuppressLint @android.annotation.NonNull android.view.translation.ViewTranslationRequest.Builder setValue(java.lang.String,android.view.translation.TranslationRequestValue)\npublic @android.annotation.NonNull android.view.translation.ViewTranslationRequest build()\n  android.view.translation.ViewTranslationRequest.Builder setTranslationRequestValues(java.util.Map<java.lang.String,android.view.translation.TranslationRequestValue>)\nprivate  void checkNotUsed()\nclass Builder extends java.lang.Object implements []\n@com.android.internal.util.DataClass(genBuilder=false, genToString=true, genEqualsHashCode=true, genGetters=false, genHiddenConstructor=true)")
    @Deprecated
    private void __metadata() {}

Loading