diff --git a/core/api/current.txt b/core/api/current.txt index 39d0b8c6bf1a6..3561077afc37f 100644 --- a/core/api/current.txt +++ b/core/api/current.txt @@ -52896,7 +52896,7 @@ package android.view.translation { public class Translator { method public void destroy(); method public boolean isDestroyed(); - method @Nullable public void translate(@NonNull android.view.translation.TranslationRequest, @NonNull java.util.concurrent.Executor, @NonNull java.util.function.Consumer); + method @Nullable public void translate(@NonNull android.view.translation.TranslationRequest, @Nullable android.os.CancellationSignal, @NonNull java.util.concurrent.Executor, @NonNull java.util.function.Consumer); } public final class UiTranslationManager { diff --git a/core/api/system-current.txt b/core/api/system-current.txt index 696494b0248c2..40b4fef28fbfc 100644 --- a/core/api/system-current.txt +++ b/core/api/system-current.txt @@ -10322,7 +10322,7 @@ package android.service.translation { method public void onDisconnected(); method public abstract void onFinishTranslationSession(int); method public abstract void onTranslationCapabilitiesRequest(int, int, @NonNull java.util.function.Consumer>); - method public abstract void onTranslationRequest(@NonNull android.view.translation.TranslationRequest, int, @NonNull android.os.CancellationSignal, @NonNull android.service.translation.TranslationService.OnTranslationResultCallback); + method public abstract void onTranslationRequest(@NonNull android.view.translation.TranslationRequest, int, @Nullable android.os.CancellationSignal, @NonNull android.service.translation.TranslationService.OnTranslationResultCallback); field public static final String SERVICE_INTERFACE = "android.service.translation.TranslationService"; field public static final String SERVICE_META_DATA = "android.translation_service"; } diff --git a/core/java/android/service/translation/TranslationService.java b/core/java/android/service/translation/TranslationService.java index 7edf2e23a528b..a3bbdb9af475b 100644 --- a/core/java/android/service/translation/TranslationService.java +++ b/core/java/android/service/translation/TranslationService.java @@ -32,6 +32,7 @@ import android.os.Bundle; import android.os.CancellationSignal; import android.os.Handler; import android.os.IBinder; +import android.os.ICancellationSignal; import android.os.Looper; import android.os.RemoteException; import android.os.ResultReceiver; @@ -149,18 +150,15 @@ public abstract class TranslationService extends Service { */ private final ITranslationDirectManager mClientInterface = new ITranslationDirectManager.Stub() { - // TODO: Implement cancellation signal - @NonNull - private final CancellationSignal mCancellationSignal = new CancellationSignal(); - @Override public void onTranslationRequest(TranslationRequest request, int sessionId, - ITranslationCallback callback) + ICancellationSignal transport, ITranslationCallback callback) throws RemoteException { final OnTranslationResultCallback translationResultCallback = new OnTranslationResultCallbackWrapper(callback); mHandler.sendMessage(obtainMessage(TranslationService::onTranslationRequest, - TranslationService.this, request, sessionId, mCancellationSignal, + TranslationService.this, request, sessionId, + CancellationSignal.fromTransport(transport), translationResultCallback)); } @@ -235,7 +233,7 @@ public abstract class TranslationService extends Service { * @param cancellationSignal */ public abstract void onTranslationRequest(@NonNull TranslationRequest request, int sessionId, - @NonNull CancellationSignal cancellationSignal, + @Nullable CancellationSignal cancellationSignal, @NonNull OnTranslationResultCallback callback); /** diff --git a/core/java/android/view/translation/ITranslationDirectManager.aidl b/core/java/android/view/translation/ITranslationDirectManager.aidl index 525a7790b8372..6b00c07d314a3 100644 --- a/core/java/android/view/translation/ITranslationDirectManager.aidl +++ b/core/java/android/view/translation/ITranslationDirectManager.aidl @@ -16,6 +16,7 @@ package android.view.translation; +import android.os.ICancellationSignal; import android.view.translation.TranslationRequest; import android.service.translation.ITranslationCallback; @@ -27,6 +28,6 @@ import android.service.translation.ITranslationCallback; */ oneway interface ITranslationDirectManager { void onTranslationRequest(in TranslationRequest request, int sessionId, - in ITranslationCallback callback); + in ICancellationSignal transport, in ITranslationCallback callback); void onFinishTranslationSession(int sessionId); } diff --git a/core/java/android/view/translation/Translator.java b/core/java/android/view/translation/Translator.java index 6b26e0698d125..188d5629e9091 100644 --- a/core/java/android/view/translation/Translator.java +++ b/core/java/android/view/translation/Translator.java @@ -26,8 +26,10 @@ import android.annotation.SuppressLint; import android.content.Context; import android.os.Binder; import android.os.Bundle; +import android.os.CancellationSignal; import android.os.Handler; import android.os.IBinder; +import android.os.ICancellationSignal; import android.os.RemoteException; import android.service.translation.ITranslationCallback; import android.util.Log; @@ -227,11 +229,13 @@ public class Translator { * * @param request {@link TranslationRequest} request to be translate. * - * @return {@link TranslationRequest} containing translated request, - * or null if translation could not be done. - * @throws IllegalStateException if this TextClassification session was destroyed when calls + * @throws IllegalStateException if this Translator session was destroyed when called. + * + * @deprecated use {@link #translate(TranslationRequest, CancellationSignal, + * Executor, Consumer)} instead. + * @hide */ - //TODO: Add cancellation signal + @Deprecated @Nullable public void translate(@NonNull TranslationRequest request, @NonNull @CallbackExecutor Executor executor, @@ -250,7 +254,52 @@ public class Translator { final ITranslationCallback responseCallback = new TranslationResponseCallbackImpl(callback, executor); try { - mDirectServiceBinder.onTranslationRequest(request, mId, responseCallback); + mDirectServiceBinder.onTranslationRequest(request, mId, + CancellationSignal.createTransport(), responseCallback); + } catch (RemoteException e) { + Log.w(TAG, "RemoteException calling requestTranslate(): " + e); + } + } + + /** + * Requests a translation for the provided {@link TranslationRequest} using the Translator's + * source spec and destination spec. + * + * @param request {@link TranslationRequest} request to be translate. + * @param cancellationSignal signal to cancel the operation in progress. + * @param executor Executor to run callback operations + * @param callback {@link Consumer} to receive the translation response. Multiple responses may + * be received if {@link TranslationRequest#FLAG_PARTIAL_RESPONSES} is set. + * + * @throws IllegalStateException if this Translator session was destroyed when called. + */ + @Nullable + public void translate(@NonNull TranslationRequest request, + @Nullable CancellationSignal cancellationSignal, + @NonNull @CallbackExecutor Executor executor, + @NonNull Consumer callback) { + Objects.requireNonNull(request, "Translation request cannot be null"); + Objects.requireNonNull(executor, "Executor cannot be null"); + Objects.requireNonNull(callback, "Callback cannot be null"); + + if (isDestroyed()) { + // TODO(b/176464808): Disallow multiple Translator now, it will throw + // IllegalStateException. Need to discuss if we can allow multiple Translators. + throw new IllegalStateException( + "This translator has been destroyed"); + } + + ICancellationSignal transport = null; + if (cancellationSignal != null) { + transport = CancellationSignal.createTransport(); + cancellationSignal.setRemote(transport); + } + final ITranslationCallback responseCallback = + new TranslationResponseCallbackImpl(callback, executor); + + try { + mDirectServiceBinder.onTranslationRequest(request, mId, transport, + responseCallback); } catch (RemoteException e) { Log.w(TAG, "RemoteException calling requestTranslate(): " + e); } @@ -298,7 +347,8 @@ public class Translator { final ITranslationCallback translationCallback = new TranslationResponseCallbackImpl(callback, executor); try { - mDirectServiceBinder.onTranslationRequest(request, mId, translationCallback); + mDirectServiceBinder.onTranslationRequest(request, mId, + CancellationSignal.createTransport(), translationCallback); } catch (RemoteException e) { Log.w(TAG, "RemoteException calling flushRequest"); }