Add cancellationSignal to the Translator#translate() api.

Bug: 176208267
Bug: 183605243
Test: atest CtsTranslationTestCases
Change-Id: I974ef773dac360d04ee3a67f63e0ffb95ee7bafc
This commit is contained in:
Adam He
2021-04-01 16:13:22 -07:00
parent 212351e022
commit aabd98f354
5 changed files with 65 additions and 16 deletions

View File

@@ -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<android.view.translation.TranslationResponse>);
method @Nullable public void translate(@NonNull android.view.translation.TranslationRequest, @Nullable android.os.CancellationSignal, @NonNull java.util.concurrent.Executor, @NonNull java.util.function.Consumer<android.view.translation.TranslationResponse>);
}
public final class UiTranslationManager {

View File

@@ -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<java.util.Set<android.view.translation.TranslationCapability>>);
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";
}

View File

@@ -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);
/**

View File

@@ -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);
}

View File

@@ -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<TranslationResponse> 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");
}