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

Commit 476e44e1 authored by Adam He's avatar Adam He Committed by Android (Google) Code Review
Browse files

Merge "Add API for TranslationContext" into sc-dev

parents 73d507a7 7c3a6e37
Loading
Loading
Loading
Loading
+36 −2
Original line number Original line Diff line number Diff line
@@ -52523,9 +52523,43 @@ package android.view.textservice {
package android.view.translation {
package android.view.translation {
  public final class TranslationCapability implements android.os.Parcelable {
    method public int describeContents();
    method @NonNull public android.view.translation.TranslationSpec getSourceSpec();
    method public int getState();
    method public int getSupportedTranslationFlags();
    method @NonNull public android.view.translation.TranslationSpec getTargetSpec();
    method public boolean isUiTranslationEnabled();
    method public void writeToParcel(@NonNull android.os.Parcel, int);
    field @NonNull public static final android.os.Parcelable.Creator<android.view.translation.TranslationCapability> CREATOR;
    field public static final int STATE_AVAILABLE_TO_DOWNLOAD = 1; // 0x1
    field public static final int STATE_DOWNLOADING = 2; // 0x2
    field public static final int STATE_ON_DEVICE = 3; // 0x3
  }
  public final class TranslationContext implements android.os.Parcelable {
    method public int describeContents();
    method @NonNull public android.view.translation.TranslationSpec getSourceSpec();
    method @NonNull public android.view.translation.TranslationSpec getTargetSpec();
    method public int getTranslationFlags();
    method public void writeToParcel(@NonNull android.os.Parcel, int);
    field @NonNull public static final android.os.Parcelable.Creator<android.view.translation.TranslationContext> CREATOR;
    field public static final int FLAG_DICTIONARY_DESCRIPTION = 4; // 0x4
    field public static final int FLAG_LOW_LATENCY = 1; // 0x1
    field public static final int FLAG_TRANSLITERATION = 2; // 0x2
  }
  public static final class TranslationContext.Builder {
    ctor public TranslationContext.Builder(@NonNull android.view.translation.TranslationSpec, @NonNull android.view.translation.TranslationSpec);
    method @NonNull public android.view.translation.TranslationContext build();
    method @NonNull public android.view.translation.TranslationContext.Builder setTranslationFlags(int);
  }
  public final class TranslationManager {
  public final class TranslationManager {
    method @Nullable @WorkerThread public android.view.translation.Translator createTranslator(@NonNull android.view.translation.TranslationSpec, @NonNull android.view.translation.TranslationSpec);
    method public void addTranslationCapabilityUpdateListener(int, int, @NonNull android.app.PendingIntent);
    method @NonNull @WorkerThread public java.util.List<java.lang.String> getSupportedLocales();
    method @Nullable @WorkerThread public android.view.translation.Translator createTranslator(@NonNull android.view.translation.TranslationContext);
    method @NonNull @WorkerThread public java.util.Set<android.view.translation.TranslationCapability> getTranslationCapabilities(int, int);
    method public void removeTranslationCapabilityUpdateListener(int, int, @NonNull android.app.PendingIntent);
  }
  }
  public final class TranslationRequest implements android.os.Parcelable {
  public final class TranslationRequest implements android.os.Parcelable {
+6 −1
Original line number Original line Diff line number Diff line
@@ -10260,9 +10260,10 @@ package android.service.translation {
    ctor public TranslationService();
    ctor public TranslationService();
    method @Nullable public final android.os.IBinder onBind(@NonNull android.content.Intent);
    method @Nullable public final android.os.IBinder onBind(@NonNull android.content.Intent);
    method public void onConnected();
    method public void onConnected();
    method public abstract void onCreateTranslationSession(@NonNull android.view.translation.TranslationSpec, @NonNull android.view.translation.TranslationSpec, int);
    method public abstract void onCreateTranslationSession(@NonNull android.view.translation.TranslationContext, int);
    method public void onDisconnected();
    method public void onDisconnected();
    method public abstract void onFinishTranslationSession(int);
    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, @NonNull 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_INTERFACE = "android.service.translation.TranslationService";
    field public static final String SERVICE_META_DATA = "android.translation_service";
    field public static final String SERVICE_META_DATA = "android.translation_service";
@@ -14267,6 +14268,10 @@ package android.view.displayhash {
package android.view.translation {
package android.view.translation {
  public final class TranslationCapability implements android.os.Parcelable {
    ctor public TranslationCapability(int, @NonNull android.view.translation.TranslationSpec, @NonNull android.view.translation.TranslationSpec, boolean, int);
  }
  public final class UiTranslationManager {
  public final class UiTranslationManager {
    method @RequiresPermission(android.Manifest.permission.MANAGE_UI_TRANSLATION) public void finishTranslation(int);
    method @RequiresPermission(android.Manifest.permission.MANAGE_UI_TRANSLATION) public void finishTranslation(int);
    method @RequiresPermission(android.Manifest.permission.MANAGE_UI_TRANSLATION) public void finishTranslation(@NonNull android.app.assist.ActivityId);
    method @RequiresPermission(android.Manifest.permission.MANAGE_UI_TRANSLATION) public void finishTranslation(@NonNull android.app.assist.ActivityId);
+7 −3
Original line number Original line Diff line number Diff line
@@ -16,7 +16,8 @@


package android.service.translation;
package android.service.translation;


import android.view.translation.TranslationSpec;
import android.os.ResultReceiver;
import android.view.translation.TranslationContext;
import com.android.internal.os.IResultReceiver;
import com.android.internal.os.IResultReceiver;


/**
/**
@@ -31,6 +32,9 @@ import com.android.internal.os.IResultReceiver;
oneway interface ITranslationService {
oneway interface ITranslationService {
    void onConnected();
    void onConnected();
    void onDisconnected();
    void onDisconnected();
    void onCreateTranslationSession(in TranslationSpec sourceSpec, in TranslationSpec destSpec,
    void onCreateTranslationSession(in TranslationContext translationContext, int sessionId,
         int sessionId, in IResultReceiver receiver);
         in IResultReceiver receiver);

    void onTranslationCapabilitiesRequest(int sourceFormat, int targetFormat,
         in ResultReceiver receiver);
}
}
+59 −10
Original line number Original line Diff line number Diff line
@@ -34,8 +34,12 @@ import android.os.Handler;
import android.os.IBinder;
import android.os.IBinder;
import android.os.Looper;
import android.os.Looper;
import android.os.RemoteException;
import android.os.RemoteException;
import android.os.ResultReceiver;
import android.util.ArraySet;
import android.util.Log;
import android.util.Log;
import android.view.translation.ITranslationDirectManager;
import android.view.translation.ITranslationDirectManager;
import android.view.translation.TranslationCapability;
import android.view.translation.TranslationContext;
import android.view.translation.TranslationManager;
import android.view.translation.TranslationManager;
import android.view.translation.TranslationRequest;
import android.view.translation.TranslationRequest;
import android.view.translation.TranslationResponse;
import android.view.translation.TranslationResponse;
@@ -43,6 +47,9 @@ import android.view.translation.TranslationSpec;


import com.android.internal.os.IResultReceiver;
import com.android.internal.os.IResultReceiver;


import java.util.Set;
import java.util.function.Consumer;

/**
/**
 * Service for translating text.
 * Service for translating text.
 * @hide
 * @hide
@@ -92,10 +99,20 @@ public abstract class TranslationService extends Service {
        }
        }


        @Override
        @Override
        public void onCreateTranslationSession(TranslationSpec sourceSpec, TranslationSpec destSpec,
        public void onCreateTranslationSession(TranslationContext translationContext,
                int sessionId, IResultReceiver receiver) throws RemoteException {
                int sessionId, IResultReceiver receiver) throws RemoteException {
            mHandler.sendMessage(obtainMessage(TranslationService::handleOnCreateTranslationSession,
            mHandler.sendMessage(obtainMessage(TranslationService::handleOnCreateTranslationSession,
                    TranslationService.this, sourceSpec, destSpec, sessionId, receiver));
                    TranslationService.this, translationContext, sessionId, receiver));
        }

        @Override
        public void onTranslationCapabilitiesRequest(@TranslationSpec.DataFormat int sourceFormat,
                @TranslationSpec.DataFormat int targetFormat,
                @NonNull ResultReceiver resultReceiver) throws RemoteException {
            mHandler.sendMessage(
                    obtainMessage(TranslationService::handleOnTranslationCapabilitiesRequest,
                            TranslationService.this, sourceFormat, targetFormat,
                            resultReceiver));
        }
        }
    };
    };


@@ -194,14 +211,13 @@ public abstract class TranslationService extends Service {
    /**
    /**
     * TODO: fill in javadoc.
     * TODO: fill in javadoc.
     *
     *
     * @param sourceSpec
     * @param translationContext
     * @param destSpec
     * @param sessionId
     * @param sessionId
     */
     */
    // TODO(b/176464808): the session id won't be unique cross client/server process. Need to find
    // TODO(b/176464808): the session id won't be unique cross client/server process. Need to find
    // solution to make it's safe.
    // solution to make it's safe.
    public abstract void onCreateTranslationSession(@NonNull TranslationSpec sourceSpec,
    public abstract void onCreateTranslationSession(@NonNull TranslationContext translationContext,
            @NonNull TranslationSpec destSpec, int sessionId);
            int sessionId);


    /**
    /**
     * TODO: fill in javadoc.
     * TODO: fill in javadoc.
@@ -222,12 +238,27 @@ public abstract class TranslationService extends Service {
            @NonNull CancellationSignal cancellationSignal,
            @NonNull CancellationSignal cancellationSignal,
            @NonNull OnTranslationResultCallback callback);
            @NonNull OnTranslationResultCallback callback);


    /**
     * TODO: fill in javadoc
     * TODO: make this abstract again once aiai is ready.
     *
     * <p>Must call {@code callback.accept} to pass back the set of translation capabilities.</p>
     *
     * @param sourceFormat
     * @param targetFormat
     * @param callback
     */
    public abstract void onTranslationCapabilitiesRequest(
            @TranslationSpec.DataFormat int sourceFormat,
            @TranslationSpec.DataFormat int targetFormat,
            @NonNull Consumer<Set<TranslationCapability>> callback);

    // TODO(b/176464808): Need to handle client dying case
    // TODO(b/176464808): Need to handle client dying case


    // TODO(b/176464808): Need to handle the failure case. e.g. if the specs does not support
    // TODO(b/176464808): Need to handle the failure case. e.g. if the context is not supported.


    private void handleOnCreateTranslationSession(@NonNull TranslationSpec sourceSpec,
    private void handleOnCreateTranslationSession(@NonNull TranslationContext translationContext,
            @NonNull TranslationSpec destSpec, int sessionId, IResultReceiver resultReceiver) {
            int sessionId, IResultReceiver resultReceiver) {
        try {
        try {
            final Bundle extras = new Bundle();
            final Bundle extras = new Bundle();
            extras.putBinder(EXTRA_SERVICE_BINDER, mClientInterface.asBinder());
            extras.putBinder(EXTRA_SERVICE_BINDER, mClientInterface.asBinder());
@@ -236,6 +267,24 @@ public abstract class TranslationService extends Service {
        } catch (RemoteException e) {
        } catch (RemoteException e) {
            Log.w(TAG, "RemoteException sending client interface: " + e);
            Log.w(TAG, "RemoteException sending client interface: " + e);
        }
        }
        onCreateTranslationSession(sourceSpec, destSpec, sessionId);
        onCreateTranslationSession(translationContext, sessionId);
    }

    private void handleOnTranslationCapabilitiesRequest(
            @TranslationSpec.DataFormat int sourceFormat,
            @TranslationSpec.DataFormat int targetFormat,
            @NonNull ResultReceiver resultReceiver) {
        onTranslationCapabilitiesRequest(sourceFormat, targetFormat,
                new Consumer<Set<TranslationCapability>>() {
                    @Override
                    public void accept(Set<TranslationCapability> values) {
                        final ArraySet<TranslationCapability> capabilities = new ArraySet<>(values);
                        final Bundle bundle = new Bundle();
                        bundle.putParcelableArray(TranslationManager.EXTRA_CAPABILITIES,
                                capabilities.toArray(new TranslationCapability[0]));
                        resultReceiver.send(TranslationManager.STATUS_SYNC_CALL_SUCCESS, bundle);
                    }
                });

    }
    }
}
}
+7 −5
Original line number Original line Diff line number Diff line
@@ -18,7 +18,9 @@ package android.view.translation;


import android.os.IBinder;
import android.os.IBinder;
import android.os.IRemoteCallback;
import android.os.IRemoteCallback;
import android.os.ResultReceiver;
import android.view.autofill.AutofillId;
import android.view.autofill.AutofillId;
import android.view.translation.TranslationContext;
import android.view.translation.TranslationSpec;
import android.view.translation.TranslationSpec;
import com.android.internal.os.IResultReceiver;
import com.android.internal.os.IResultReceiver;


@@ -30,17 +32,17 @@ import java.util.List;
 * {@hide}
 * {@hide}
 */
 */
oneway interface ITranslationManager {
oneway interface ITranslationManager {
    void getSupportedLocales(in IResultReceiver receiver, int userId);
    void onTranslationCapabilitiesRequest(int sourceFormat, int destFormat,
    void onSessionCreated(in TranslationSpec sourceSpec, in TranslationSpec destSpec,
         in ResultReceiver receiver, int userId);
    void onSessionCreated(in TranslationContext translationContext,
         int sessionId, in IResultReceiver receiver, int userId);
         int sessionId, in IResultReceiver receiver, int userId);


    void updateUiTranslationState(int state, in TranslationSpec sourceSpec,
    void updateUiTranslationState(int state, in TranslationSpec sourceSpec,
         in TranslationSpec destSpec, in List<AutofillId> viewIds, IBinder token, int taskId,
         in TranslationSpec targetSpec, in List<AutofillId> viewIds, IBinder token, int taskId,
         int userId);
         int userId);
    // deprecated
    // deprecated
    void updateUiTranslationStateByTaskId(int state, in TranslationSpec sourceSpec,
    void updateUiTranslationStateByTaskId(int state, in TranslationSpec sourceSpec,
         in TranslationSpec destSpec, in List<AutofillId> viewIds, int taskId,
         in TranslationSpec targetSpec, in List<AutofillId> viewIds, int taskId, int userId);
         int userId);


    void registerUiTranslationStateCallback(in IRemoteCallback callback, int userId);
    void registerUiTranslationStateCallback(in IRemoteCallback callback, int userId);
    void unregisterUiTranslationStateCallback(in IRemoteCallback callback, int userId);
    void unregisterUiTranslationStateCallback(in IRemoteCallback callback, int userId);
Loading