summaryrefslogtreecommitdiff
path: root/core/java/android/widget/TextViewTranslationCallback.java
diff options
context:
space:
mode:
authorJoanne Chung <joannechung@google.com>2021-03-15 22:31:53 +0800
committerJoanne Chung <joannechung@google.com>2021-03-25 15:28:13 +0800
commita749f2aadb68334e811ac37c129ee329eb54b0fe (patch)
treeabd90f5e189737fca0ffa972ee6da35bdf993cee /core/java/android/widget/TextViewTranslationCallback.java
parent1363aa953890e51a1fe0439da9191f042ef56f9f (diff)
Update View translation APIs.
This change doesn't contain the virtual view part and the API dispatchTranslationRequests, it will be done in another change. Bug: 178046780 Test: manual Test: atest CtsTranslationTestCases CTS-Coverage-Bug: 177960696 Change-Id: I65fe1db19c9dff21c0caca425fbb7d08559e730b
Diffstat (limited to 'core/java/android/widget/TextViewTranslationCallback.java')
-rw-r--r--core/java/android/widget/TextViewTranslationCallback.java120
1 files changed, 120 insertions, 0 deletions
diff --git a/core/java/android/widget/TextViewTranslationCallback.java b/core/java/android/widget/TextViewTranslationCallback.java
new file mode 100644
index 000000000000..296d93c88554
--- /dev/null
+++ b/core/java/android/widget/TextViewTranslationCallback.java
@@ -0,0 +1,120 @@
+/*
+ * Copyright (C) 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.widget;
+
+import android.annotation.NonNull;
+import android.text.method.TranslationTransformationMethod;
+import android.util.Log;
+import android.view.View;
+import android.view.translation.UiTranslationManager;
+import android.view.translation.ViewTranslationCallback;
+import android.view.translation.ViewTranslationResponse;
+
+/**
+ * Default implementation for {@link ViewTranslationCallback} for {@link TextView} components.
+ * This class handles how to display the translated information for {@link TextView}.
+ *
+ * @hide
+ */
+public class TextViewTranslationCallback implements ViewTranslationCallback {
+
+ private static final String TAG = "TextViewTranslationCallback";
+
+ private static final boolean DEBUG = Log.isLoggable(UiTranslationManager.LOG_TAG, Log.DEBUG);
+
+ private TranslationTransformationMethod mTranslationTransformation;
+
+ /**
+ * Invoked by the platform when receiving the successful {@link ViewTranslationResponse} for the
+ * view that provides the translatable information by {@link View#createTranslationRequest} and
+ * sent by the platform.
+ */
+ void setTranslationTransformation(TranslationTransformationMethod method) {
+ if (method == null) {
+ if (DEBUG) {
+ Log.w(TAG, "setTranslationTransformation: should not set null "
+ + "TranslationTransformationMethod");
+ }
+ return;
+ }
+ mTranslationTransformation = method;
+ }
+
+ TranslationTransformationMethod getTranslationTransformation() {
+ return mTranslationTransformation;
+ }
+
+ private void clearTranslationTransformation() {
+ if (DEBUG) {
+ Log.v(TAG, "clearTranslationTransformation: " + mTranslationTransformation);
+ }
+ mTranslationTransformation = null;
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ @Override
+ public boolean onShowTranslation(@NonNull View view) {
+ if (mTranslationTransformation != null) {
+ ((TextView) view).setTransformationMethod(mTranslationTransformation);
+ } else {
+ if (DEBUG) {
+ // TODO(b/182433547): remove before S release
+ Log.w(TAG, "onShowTranslation(): no translated text.");
+ }
+ }
+ return true;
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ @Override
+ public boolean onHideTranslation(@NonNull View view) {
+ // Restore to original text content.
+ if (mTranslationTransformation != null) {
+ ((TextView) view).setTransformationMethod(
+ mTranslationTransformation.getOriginalTransformationMethod());
+ } else {
+ if (DEBUG) {
+ // TODO(b/182433547): remove before S release
+ Log.w(TAG, "onHideTranslation(): no translated text.");
+ }
+ }
+ return true;
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ @Override
+ public boolean onClearTranslation(@NonNull View view) {
+ // Restore to original text content and clear TranslationTransformation
+ if (mTranslationTransformation != null) {
+ ((TextView) view).setTransformationMethod(
+ mTranslationTransformation.getOriginalTransformationMethod());
+ clearTranslationTransformation();
+ } else {
+ if (DEBUG) {
+ // TODO(b/182433547): remove before S release
+ Log.w(TAG, "onClearTranslation(): no translated text.");
+ }
+ }
+ return true;
+ }
+}