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
This commit is contained in:
Joanne Chung
2019-10-18 21:02:26 +08:00
parent f16720faaf
commit 0b7c0d4e32
4 changed files with 55 additions and 0 deletions

View File

@@ -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<android.view.textclassifier.TextClassification>);
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<android.view.textclassifier.TextLanguage>);
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<android.view.textclassifier.TextLinks>);
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<android.view.textclassifier.ConversationActions>);

View File

@@ -74,4 +74,6 @@ oneway interface ITextClassifierService {
in TextClassificationSessionId sessionId,
in ConversationActions.Request request,
in ITextClassifierCallback callback);
void onConnectedStateChanged(int connected);
}

View File

@@ -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.
*
* <p> 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.

View File

@@ -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