diff --git a/api/system-current.txt b/api/system-current.txt index b9dfad5d5df5c..adf9e39ba7cb5 100644 --- a/api/system-current.txt +++ b/api/system-current.txt @@ -6962,9 +6962,11 @@ package android.service.textclassifier { method @Deprecated public final android.view.textclassifier.TextClassifier getLocalTextClassifier(); method @Nullable public final android.os.IBinder onBind(android.content.Intent); method @MainThread public abstract void onClassifyText(@Nullable android.view.textclassifier.TextClassificationSessionId, @NonNull android.view.textclassifier.TextClassification.Request, @NonNull android.os.CancellationSignal, @NonNull android.service.textclassifier.TextClassifierService.Callback); + method public void onConnected(); method @MainThread public void onCreateTextClassificationSession(@NonNull android.view.textclassifier.TextClassificationContext, @NonNull android.view.textclassifier.TextClassificationSessionId); method @MainThread public void onDestroyTextClassificationSession(@NonNull android.view.textclassifier.TextClassificationSessionId); method @MainThread public void onDetectLanguage(@Nullable android.view.textclassifier.TextClassificationSessionId, @NonNull android.view.textclassifier.TextLanguage.Request, @NonNull android.os.CancellationSignal, @NonNull android.service.textclassifier.TextClassifierService.Callback); + method public void onDisconnected(); method @MainThread public abstract void onGenerateLinks(@Nullable android.view.textclassifier.TextClassificationSessionId, @NonNull android.view.textclassifier.TextLinks.Request, @NonNull android.os.CancellationSignal, @NonNull android.service.textclassifier.TextClassifierService.Callback); method @Deprecated @MainThread public void onSelectionEvent(@Nullable android.view.textclassifier.TextClassificationSessionId, @NonNull android.view.textclassifier.SelectionEvent); method @MainThread public void onSuggestConversationActions(@Nullable android.view.textclassifier.TextClassificationSessionId, @NonNull android.view.textclassifier.ConversationActions.Request, @NonNull android.os.CancellationSignal, @NonNull android.service.textclassifier.TextClassifierService.Callback); diff --git a/core/java/android/service/textclassifier/ITextClassifierService.aidl b/core/java/android/service/textclassifier/ITextClassifierService.aidl index 2f8d67b6cceec..da57506a55307 100644 --- a/core/java/android/service/textclassifier/ITextClassifierService.aidl +++ b/core/java/android/service/textclassifier/ITextClassifierService.aidl @@ -74,4 +74,6 @@ oneway interface ITextClassifierService { in TextClassificationSessionId sessionId, in ConversationActions.Request request, in ITextClassifierCallback callback); + + void onConnectedStateChanged(int connected); } diff --git a/core/java/android/service/textclassifier/TextClassifierService.java b/core/java/android/service/textclassifier/TextClassifierService.java index 2470d197c3fc8..4d58ae4ea7738 100644 --- a/core/java/android/service/textclassifier/TextClassifierService.java +++ b/core/java/android/service/textclassifier/TextClassifierService.java @@ -17,6 +17,7 @@ package android.service.textclassifier; import android.Manifest; +import android.annotation.IntDef; import android.annotation.MainThread; import android.annotation.NonNull; import android.annotation.Nullable; @@ -51,6 +52,8 @@ import android.view.textclassifier.TextSelection; import com.android.internal.util.Preconditions; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; @@ -98,6 +101,18 @@ public abstract class TextClassifierService extends Service { public static final String SERVICE_INTERFACE = "android.service.textclassifier.TextClassifierService"; + /** @hide **/ + public static final int CONNECTED = 0; + /** @hide **/ + public static final int DISCONNECTED = 1; + /** @hide */ + @IntDef(value = { + CONNECTED, + DISCONNECTED + }) + @Retention(RetentionPolicy.SOURCE) + public @interface ConnectionState{} + /** @hide **/ private static final String KEY_RESULT = "key_result"; @@ -195,6 +210,12 @@ public abstract class TextClassifierService extends Service { mMainThreadHandler.post( () -> TextClassifierService.this.onDestroyTextClassificationSession(sessionId)); } + + @Override + public void onConnectedStateChanged(@ConnectionState int connected) { + mMainThreadHandler.post(connected == CONNECTED ? TextClassifierService.this::onConnected + : TextClassifierService.this::onDisconnected); + } }; @Nullable @@ -206,6 +227,26 @@ public abstract class TextClassifierService extends Service { return null; } + @Override + public boolean onUnbind(@NonNull Intent intent) { + onDisconnected(); + return super.onUnbind(intent); + } + + /** + * Called when the Android system connects to service. + */ + public void onConnected() { + } + + /** + * Called when the Android system disconnects from the service. + * + *

At this point this service may no longer be an active {@link TextClassifierService}. + */ + public void onDisconnected() { + } + /** * Returns suggested text selection start and end indices, recognized entity types, and their * associated confidence scores. The entity types are ordered from highest to lowest scoring. diff --git a/services/core/java/com/android/server/textclassifier/TextClassificationManagerService.java b/services/core/java/com/android/server/textclassifier/TextClassificationManagerService.java index 5493afd1b1231..403d3429a1865 100644 --- a/services/core/java/com/android/server/textclassifier/TextClassificationManagerService.java +++ b/services/core/java/com/android/server/textclassifier/TextClassificationManagerService.java @@ -30,6 +30,7 @@ import android.os.UserHandle; import android.service.textclassifier.ITextClassifierCallback; import android.service.textclassifier.ITextClassifierService; import android.service.textclassifier.TextClassifierService; +import android.service.textclassifier.TextClassifierService.ConnectionState; import android.util.ArrayMap; import android.util.Slog; import android.util.SparseArray; @@ -129,6 +130,10 @@ public final class TextClassificationManagerService extends ITextClassifierServi mLock = new Object(); } + @Override + public void onConnectedStateChanged(@ConnectionState int connected) { + } + @Override public void onSuggestSelection( @Nullable TextClassificationSessionId sessionId, @@ -579,6 +584,11 @@ public final class TextClassificationManagerService extends ITextClassifierServi @Override public void onServiceConnected(ComponentName name, IBinder service) { init(ITextClassifierService.Stub.asInterface(service)); + try { + mService.onConnectedStateChanged(TextClassifierService.CONNECTED); + } catch (RemoteException e) { + Slog.e(LOG_TAG, "error in onConnectedStateChanged"); + } } @Override