From 0b7c0d4e32b0eb80cd222467e9db690f629e8ad5 Mon Sep 17 00:00:00 2001 From: Joanne Chung Date: Fri, 18 Oct 2019 21:02:26 +0800 Subject: [PATCH] Add callbacks when TextClassifierService connection status change Add onConnected() and onDisconnected() when TextClassifierService connect status change. TextClassifierService can do initialization in onConnected() and do cleanup work in onDisconnected(). These callbacks also benefit tests to test some behavior after service connected/disconnected. Bug: 141111813 Test: Manual. Bind service and make sure onConnected() is called, unbind service and make sure onDisconnected() is called. Change-Id: Ic87f00e8fd6679ef8606feba728ad9db6ae6285e --- api/system-current.txt | 2 + .../ITextClassifierService.aidl | 2 + .../textclassifier/TextClassifierService.java | 41 +++++++++++++++++++ .../TextClassificationManagerService.java | 10 +++++ 4 files changed, 55 insertions(+) diff --git a/api/system-current.txt b/api/system-current.txt index ad9a04d16a7ef..1c54ed51dc06d 100644 --- a/api/system-current.txt +++ b/api/system-current.txt @@ -6907,9 +6907,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