diff --git a/core/api/current.txt b/core/api/current.txt index 7abb2f493d987..d36d9bad7f2a9 100644 --- a/core/api/current.txt +++ b/core/api/current.txt @@ -52899,10 +52899,12 @@ package android.view.translation { } public final class TranslationSpec implements android.os.Parcelable { - ctor public TranslationSpec(@NonNull String, int); + ctor @Deprecated public TranslationSpec(@NonNull String, int); + ctor public TranslationSpec(@NonNull android.icu.util.ULocale, int); method public int describeContents(); method public int getDataFormat(); - method @NonNull public String getLanguage(); + method @Deprecated @NonNull public String getLanguage(); + method @NonNull public android.icu.util.ULocale getLocale(); method public void writeToParcel(@NonNull android.os.Parcel, int); field @NonNull public static final android.os.Parcelable.Creator CREATOR; field public static final int DATA_FORMAT_TEXT = 1; // 0x1 @@ -52922,7 +52924,8 @@ package android.view.translation { public interface UiTranslationStateCallback { method public void onFinished(); method public void onPaused(); - method public void onStarted(@NonNull String, @NonNull String); + method @Deprecated public void onStarted(@NonNull String, @NonNull String); + method public default void onStarted(@NonNull android.icu.util.ULocale, @NonNull android.icu.util.ULocale); } @UiThread public interface ViewTranslationCallback { diff --git a/core/java/android/view/translation/TranslationSpec.java b/core/java/android/view/translation/TranslationSpec.java index 16418a78f2c1a..4d2ea494b303c 100644 --- a/core/java/android/view/translation/TranslationSpec.java +++ b/core/java/android/view/translation/TranslationSpec.java @@ -17,18 +17,22 @@ package android.view.translation; import android.annotation.NonNull; +import android.icu.util.ULocale; import android.os.Parcel; import android.os.Parcelable; import com.android.internal.util.DataClass; +import java.util.Objects; + /** * Specs and additional info for the translation data. * *

This spec help specify information such as the language/locale for the translation, as well * as the data format for the translation (text, audio, etc.)

*/ -@DataClass(genEqualsHashCode = true, genHiddenConstDefs = true, genToString = true) +@DataClass(genEqualsHashCode = true, genHiddenConstDefs = true, genToString = true, + genConstructor = false) public final class TranslationSpec implements Parcelable { /** Data format for translation is text. */ @@ -43,15 +47,52 @@ public final class TranslationSpec implements Parcelable { public @interface DataFormat {} /** - * String representation of language codes e.g. "en", "es", etc. + * @deprecated use {@code mLocale} instead. */ + @Deprecated private final @NonNull String mLanguage; + /** + * {@link ULocale} representing locale information of this spec. + */ + private final @NonNull ULocale mLocale; + private final @DataFormat int mDataFormat; + void parcelLocale(Parcel dest, int flags) { + dest.writeSerializable(mLocale); + } + + static ULocale unparcelLocale(Parcel in) { + return (ULocale) in.readSerializable(); + } + + /** + * @deprecated use {@link #TranslationSpec(ULocale, int)} instead. + */ + @Deprecated + public TranslationSpec(@NonNull String language, @DataFormat int dataFormat) { + mLanguage = language; + mDataFormat = dataFormat; + mLocale = new ULocale.Builder().setLanguage(language).build(); + } + + /** + * Constructs a translation spec with the given locale and data format. + * + * @param locale locale of the associated translation data. + * @param dataFormat data format of the associated translation data. + */ + public TranslationSpec(@NonNull ULocale locale, @DataFormat int dataFormat) { + Objects.requireNonNull(locale); + mLanguage = locale.getLanguage(); + mLocale = locale; + mDataFormat = dataFormat; + } - // Code below generated by codegen v1.0.22. + + // Code below generated by codegen v1.0.23. // // DO NOT MODIFY! // CHECKSTYLE:OFF Generated code @@ -65,31 +106,19 @@ public final class TranslationSpec implements Parcelable { /** - * Creates a new TranslationSpec. - * - * @param language - * String representation of language codes e.g. "en", "es", etc. + * @deprecated use {@code mLocale} instead. */ @DataClass.Generated.Member - public TranslationSpec( - @NonNull String language, - @DataFormat int dataFormat) { - this.mLanguage = language; - com.android.internal.util.AnnotationValidations.validate( - NonNull.class, null, mLanguage); - this.mDataFormat = dataFormat; - com.android.internal.util.AnnotationValidations.validate( - DataFormat.class, null, mDataFormat); - - // onConstructed(); // You can define this method to get a callback + public @Deprecated @NonNull String getLanguage() { + return mLanguage; } /** - * String representation of language codes e.g. "en", "es", etc. + * {@link ULocale} representing locale information of this spec. */ @DataClass.Generated.Member - public @NonNull String getLanguage() { - return mLanguage; + public @NonNull ULocale getLocale() { + return mLocale; } @DataClass.Generated.Member @@ -105,6 +134,7 @@ public final class TranslationSpec implements Parcelable { return "TranslationSpec { " + "language = " + mLanguage + ", " + + "locale = " + mLocale + ", " + "dataFormat = " + mDataFormat + " }"; } @@ -122,7 +152,8 @@ public final class TranslationSpec implements Parcelable { TranslationSpec that = (TranslationSpec) o; //noinspection PointlessBooleanExpression return true - && java.util.Objects.equals(mLanguage, that.mLanguage) + && Objects.equals(mLanguage, that.mLanguage) + && Objects.equals(mLocale, that.mLocale) && mDataFormat == that.mDataFormat; } @@ -133,7 +164,8 @@ public final class TranslationSpec implements Parcelable { // int fieldNameHashCode() { ... } int _hash = 1; - _hash = 31 * _hash + java.util.Objects.hashCode(mLanguage); + _hash = 31 * _hash + Objects.hashCode(mLanguage); + _hash = 31 * _hash + Objects.hashCode(mLocale); _hash = 31 * _hash + mDataFormat; return _hash; } @@ -145,6 +177,7 @@ public final class TranslationSpec implements Parcelable { // void parcelFieldName(Parcel dest, int flags) { ... } dest.writeString(mLanguage); + parcelLocale(dest, flags); dest.writeInt(mDataFormat); } @@ -160,11 +193,17 @@ public final class TranslationSpec implements Parcelable { // static FieldType unparcelFieldName(Parcel in) { ... } String language = in.readString(); + ULocale locale = unparcelLocale(in); int dataFormat = in.readInt(); this.mLanguage = language; + com.android.internal.util.AnnotationValidations.validate( + Deprecated.class, null, mLanguage); com.android.internal.util.AnnotationValidations.validate( NonNull.class, null, mLanguage); + this.mLocale = locale; + com.android.internal.util.AnnotationValidations.validate( + NonNull.class, null, mLocale); this.mDataFormat = dataFormat; com.android.internal.util.AnnotationValidations.validate( DataFormat.class, null, mDataFormat); @@ -187,10 +226,10 @@ public final class TranslationSpec implements Parcelable { }; @DataClass.Generated( - time = 1614326090637L, - codegenVersion = "1.0.22", + time = 1618968175733L, + codegenVersion = "1.0.23", sourceFile = "frameworks/base/core/java/android/view/translation/TranslationSpec.java", - inputSignatures = "public static final int DATA_FORMAT_TEXT\nprivate final @android.annotation.NonNull java.lang.String mLanguage\nprivate final @android.view.translation.TranslationSpec.DataFormat int mDataFormat\nclass TranslationSpec extends java.lang.Object implements [android.os.Parcelable]\n@com.android.internal.util.DataClass(genEqualsHashCode=true, genHiddenConstDefs=true, genToString=true)") + inputSignatures = "public static final int DATA_FORMAT_TEXT\nprivate final @java.lang.Deprecated @android.annotation.NonNull java.lang.String mLanguage\nprivate final @android.annotation.NonNull android.icu.util.ULocale mLocale\nprivate final @android.view.translation.TranslationSpec.DataFormat int mDataFormat\n void parcelLocale(android.os.Parcel,int)\nstatic android.icu.util.ULocale unparcelLocale(android.os.Parcel)\nclass TranslationSpec extends java.lang.Object implements [android.os.Parcelable]\n@com.android.internal.util.DataClass(genEqualsHashCode=true, genHiddenConstDefs=true, genToString=true, genConstructor=false)") @Deprecated private void __metadata() {} diff --git a/core/java/android/view/translation/UiTranslationManager.java b/core/java/android/view/translation/UiTranslationManager.java index f66fac5628955..eefc7fdc7d775 100644 --- a/core/java/android/view/translation/UiTranslationManager.java +++ b/core/java/android/view/translation/UiTranslationManager.java @@ -23,6 +23,7 @@ import android.annotation.RequiresPermission; import android.annotation.SystemApi; import android.app.assist.ActivityId; import android.content.Context; +import android.icu.util.ULocale; import android.os.Binder; import android.os.Bundle; import android.os.IRemoteCallback; @@ -311,8 +312,8 @@ public final class UiTranslationManager { case STATE_UI_TRANSLATION_STARTED: case STATE_UI_TRANSLATION_RESUMED: mCallback.onStarted( - bundle.getString(EXTRA_SOURCE_LOCALE), - bundle.getString(EXTRA_TARGET_LOCALE)); + (ULocale) bundle.getSerializable(EXTRA_SOURCE_LOCALE), + (ULocale) bundle.getSerializable(EXTRA_TARGET_LOCALE)); break; case STATE_UI_TRANSLATION_PAUSED: mCallback.onPaused(); diff --git a/core/java/android/view/translation/UiTranslationStateCallback.java b/core/java/android/view/translation/UiTranslationStateCallback.java index 1946b703935d8..e60eecd970543 100644 --- a/core/java/android/view/translation/UiTranslationStateCallback.java +++ b/core/java/android/view/translation/UiTranslationStateCallback.java @@ -17,6 +17,7 @@ package android.view.translation; import android.annotation.NonNull; +import android.icu.util.ULocale; import java.util.concurrent.Executor; @@ -26,6 +27,12 @@ import java.util.concurrent.Executor; */ public interface UiTranslationStateCallback { + /** + * @deprecated use {@link #onStarted(ULocale, ULocale)} instead. + */ + @Deprecated + void onStarted(@NonNull String sourceLocale, @NonNull String targetLocale); + /** * The system is requesting translation of the UI from {@code sourceLocale} to {@code * targetLocale}. @@ -33,7 +40,9 @@ public interface UiTranslationStateCallback { * This is also called if either the requested {@code sourceLocale} or {@code targetLocale} has * changed; or called again after {@link #onPaused()}. */ - void onStarted(@NonNull String sourceLocale, @NonNull String targetLocale); + default void onStarted(@NonNull ULocale sourceLocale, @NonNull ULocale targetLocale) { + onStarted(sourceLocale.getLanguage(), targetLocale.getLanguage()); + } /** * The system is requesting that the application temporarily show the UI contents in their diff --git a/services/translation/java/com/android/server/translation/TranslationManagerServiceImpl.java b/services/translation/java/com/android/server/translation/TranslationManagerServiceImpl.java index 987100f817d35..d2a69511f6eab 100644 --- a/services/translation/java/com/android/server/translation/TranslationManagerServiceImpl.java +++ b/services/translation/java/com/android/server/translation/TranslationManagerServiceImpl.java @@ -172,8 +172,8 @@ final class TranslationManagerServiceImpl extends res.putInt(EXTRA_STATE, state); // TODO(177500482): Store the locale pair so it can be sent for RESUME events. if (sourceSpec != null) { - res.putString(EXTRA_SOURCE_LOCALE, sourceSpec.getLanguage()); - res.putString(EXTRA_TARGET_LOCALE, targetSpec.getLanguage()); + res.putSerializable(EXTRA_SOURCE_LOCALE, sourceSpec.getLocale()); + res.putSerializable(EXTRA_TARGET_LOCALE, targetSpec.getLocale()); } // TODO(177500482): Only support the *current* Input Method. List enabledInputMethods =