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

Commit 9920dbba authored by Tony Mak's avatar Tony Mak
Browse files

Refactoring and some fixes around TextClassifierService

This change is mainly to address the comment
"TextClassifierService.onDetectLanguage receives a callback but
immediately calls callback.onSuccess before method returns, that is
unexpected behavior. Method should either have a return value or post
callback. Same for onSuggestConversationActions" from API  council.

1. Like other services that allows developers to extend,
   APIs in TextClassifierService are now delivered in the main thread.

2. The default implementation of onDetectLanguage and
   onSuggestConversationActions now run local textclassifier in a worker
   thread. So it won't block the main thread and make sure the callback
   is called after the function returns.

3. Refactor the code so that fewer boilerplate codes around the callback.
   We are now using ITextClassifierCallback to replace all the existing
   I*Callback. This allows us to write template code easily.

BUG: 120841922

Test: Enable system textclassifier tests and run atest TextClassifierTest.java
Test: Manual. Try out smart selection and related features.

Change-Id: I33b2cc80f968fb8b5d5007a153b6e50041e57ce6
parent 3dcd6224
Loading
Loading
Loading
Loading
+1 −5
Original line number Diff line number Diff line
@@ -352,12 +352,8 @@ java_defaults {
        "core/java/android/service/chooser/IChooserTargetResult.aidl",
        "core/java/android/service/resolver/IResolverRankerService.aidl",
        "core/java/android/service/resolver/IResolverRankerResult.aidl",
        "core/java/android/service/textclassifier/IConversationActionsCallback.aidl",
        "core/java/android/service/textclassifier/ITextClassificationCallback.aidl",
        "core/java/android/service/textclassifier/ITextClassifierCallback.aidl",
        "core/java/android/service/textclassifier/ITextClassifierService.aidl",
        "core/java/android/service/textclassifier/ITextLanguageCallback.aidl",
        "core/java/android/service/textclassifier/ITextLinksCallback.aidl",
        "core/java/android/service/textclassifier/ITextSelectionCallback.aidl",
        "core/java/android/service/attention/IAttentionService.aidl",
        "core/java/android/service/attention/IAttentionCallback.aidl",
        "core/java/android/view/accessibility/IAccessibilityInteractionConnection.aidl",
+9 −9
Original line number Diff line number Diff line
@@ -6724,15 +6724,15 @@ package android.service.textclassifier {
    method public static android.view.textclassifier.TextClassifier getDefaultTextClassifierImplementation(@NonNull android.content.Context);
    method @Deprecated public final android.view.textclassifier.TextClassifier getLocalTextClassifier();
    method @Nullable public final android.os.IBinder onBind(android.content.Intent);
    method 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 onCreateTextClassificationSession(@NonNull android.view.textclassifier.TextClassificationContext, @NonNull android.view.textclassifier.TextClassificationSessionId);
    method public void onDestroyTextClassificationSession(@NonNull android.view.textclassifier.TextClassificationSessionId);
    method 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 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 public void onSelectionEvent(@Nullable android.view.textclassifier.TextClassificationSessionId, @NonNull android.view.textclassifier.SelectionEvent);
    method 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>);
    method public abstract void onSuggestSelection(@Nullable android.view.textclassifier.TextClassificationSessionId, @NonNull android.view.textclassifier.TextSelection.Request, @NonNull android.os.CancellationSignal, @NonNull android.service.textclassifier.TextClassifierService.Callback<android.view.textclassifier.TextSelection>);
    method public void onTextClassifierEvent(@Nullable android.view.textclassifier.TextClassificationSessionId, @NonNull android.view.textclassifier.TextClassifierEvent);
    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 @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 @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>);
    method @MainThread public abstract void onSuggestSelection(@Nullable android.view.textclassifier.TextClassificationSessionId, @NonNull android.view.textclassifier.TextSelection.Request, @NonNull android.os.CancellationSignal, @NonNull android.service.textclassifier.TextClassifierService.Callback<android.view.textclassifier.TextSelection>);
    method @MainThread public void onTextClassifierEvent(@Nullable android.view.textclassifier.TextClassificationSessionId, @NonNull android.view.textclassifier.TextClassifierEvent);
    field public static final String SERVICE_INTERFACE = "android.service.textclassifier.TextClassifierService";
  }
+0 −28
Original line number Diff line number Diff line
/*
 * Copyright (C) 2018 The Android Open Source Project
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package android.service.textclassifier;

import android.view.textclassifier.ConversationActions;

/**
 * Callback for a ConversationActions request.
 * @hide
 */
oneway interface IConversationActionsCallback {
    void onSuccess(in ConversationActions conversationActions);
    void onFailure();
}
 No newline at end of file
+0 −28
Original line number Diff line number Diff line
/*
 * Copyright (C) 2018 The Android Open Source Project
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package android.service.textclassifier;

import android.view.textclassifier.TextClassification;

/**
 * Callback for a TextClassification request.
 * @hide
 */
oneway interface ITextClassificationCallback {
    void onSuccess(in TextClassification classification);
    void onFailure();
}
+4 −3
Original line number Diff line number Diff line
@@ -16,13 +16,14 @@

package android.service.textclassifier;

import android.os.Bundle;
import android.view.textclassifier.TextSelection;

/**
 * Callback for a TextSelection request.
 * Callback for all requests from SystemTextClassifier.
 * @hide
 */
oneway interface ITextSelectionCallback {
    void onSuccess(in TextSelection selection);
oneway interface ITextClassifierCallback {
    void onSuccess(in Bundle result);
    void onFailure();
}
 No newline at end of file
Loading