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

Commit bd40f797 authored by TreeHugger Robot's avatar TreeHugger Robot Committed by Android (Google) Code Review
Browse files

Merge "Increase the timeout in SystemTextClassifier to 1 minute"

parents e62b6a09 a1983356
Loading
Loading
Loading
Loading
+13 −9
Original line number Diff line number Diff line
@@ -89,7 +89,7 @@ public final class SystemTextClassifier implements TextClassifier {
        try {
            request.setSystemTextClassifierMetadata(mSystemTcMetadata);
            final BlockingCallback<TextSelection> callback =
                    new BlockingCallback<>("textselection");
                    new BlockingCallback<>("textselection", mSettings);
            mManagerService.onSuggestSelection(mSessionId, request, callback);
            final TextSelection selection = callback.get();
            if (selection != null) {
@@ -112,7 +112,7 @@ public final class SystemTextClassifier implements TextClassifier {
        try {
            request.setSystemTextClassifierMetadata(mSystemTcMetadata);
            final BlockingCallback<TextClassification> callback =
                    new BlockingCallback<>("textclassification");
                    new BlockingCallback<>("textclassification", mSettings);
            mManagerService.onClassifyText(mSessionId, request, callback);
            final TextClassification classification = callback.get();
            if (classification != null) {
@@ -142,7 +142,7 @@ public final class SystemTextClassifier implements TextClassifier {
        try {
            request.setSystemTextClassifierMetadata(mSystemTcMetadata);
            final BlockingCallback<TextLinks> callback =
                    new BlockingCallback<>("textlinks");
                    new BlockingCallback<>("textlinks", mSettings);
            mManagerService.onGenerateLinks(mSessionId, request, callback);
            final TextLinks links = callback.get();
            if (links != null) {
@@ -193,7 +193,7 @@ public final class SystemTextClassifier implements TextClassifier {
        try {
            request.setSystemTextClassifierMetadata(mSystemTcMetadata);
            final BlockingCallback<TextLanguage> callback =
                    new BlockingCallback<>("textlanguage");
                    new BlockingCallback<>("textlanguage", mSettings);
            mManagerService.onDetectLanguage(mSessionId, request, callback);
            final TextLanguage textLanguage = callback.get();
            if (textLanguage != null) {
@@ -213,7 +213,7 @@ public final class SystemTextClassifier implements TextClassifier {
        try {
            request.setSystemTextClassifierMetadata(mSystemTcMetadata);
            final BlockingCallback<ConversationActions> callback =
                    new BlockingCallback<>("conversation-actions");
                    new BlockingCallback<>("conversation-actions", mSettings);
            mManagerService.onSuggestConversationActions(mSessionId, request, callback);
            final ConversationActions conversationActions = callback.get();
            if (conversationActions != null) {
@@ -279,8 +279,8 @@ public final class SystemTextClassifier implements TextClassifier {
            extends ITextClassifierCallback.Stub {
        private final ResponseReceiver<T> mReceiver;

        BlockingCallback(String name) {
            mReceiver = new ResponseReceiver<>(name);
        BlockingCallback(String name, TextClassificationConstants settings) {
            mReceiver = new ResponseReceiver<>(name, settings);
        }

        @Override
@@ -303,10 +303,12 @@ public final class SystemTextClassifier implements TextClassifier {

        private final CountDownLatch mLatch = new CountDownLatch(1);
        private final String mName;
        private final TextClassificationConstants mSettings;
        private T mResponse;

        private ResponseReceiver(String name) {
        private ResponseReceiver(String name, TextClassificationConstants settings) {
            mName = name;
            mSettings = settings;
        }

        public void onSuccess(T response) {
@@ -327,7 +329,9 @@ public final class SystemTextClassifier implements TextClassifier {
            // NOTE that TextClassifier calls should preferably always be called on a worker thread.
            if (Looper.myLooper() != Looper.getMainLooper()) {
                try {
                    boolean success = mLatch.await(2, TimeUnit.SECONDS);
                    boolean success = mLatch.await(
                            mSettings.getSystemTextClassifierApiTimeoutInSecond(),
                            TimeUnit.SECONDS);
                    if (!success) {
                        Log.w(LOG_TAG, "Timeout in ResponseReceiver.get(): " + mName);
                    }
+26 −17
Original line number Diff line number Diff line
@@ -82,6 +82,14 @@ public final class TextClassificationConstants {
    static final String TEXT_CLASSIFIER_SERVICE_PACKAGE_OVERRIDE =
            "textclassifier_service_package_override";

    /**
     * The timeout value in seconds used by {@link SystemTextClassifier} for each TextClassifier
     * API calls.
     */
    @VisibleForTesting
    static final String SYSTEM_TEXT_CLASSIFIER_API_TIMEOUT_IN_SECOND =
            "system_textclassifier_api_timeout_in_second";

    private static final String DEFAULT_TEXT_CLASSIFIER_SERVICE_PACKAGE_OVERRIDE = null;
    private static final boolean LOCAL_TEXT_CLASSIFIER_ENABLED_DEFAULT = true;
    private static final boolean SYSTEM_TEXT_CLASSIFIER_ENABLED_DEFAULT = true;
@@ -91,6 +99,7 @@ public final class TextClassificationConstants {
    private static final boolean SMART_LINKIFY_ENABLED_DEFAULT = true;
    private static final boolean SMART_SELECT_ANIMATION_ENABLED_DEFAULT = true;
    private static final int GENERATE_LINKS_MAX_TEXT_LENGTH_DEFAULT = 100 * 1000;
    private static final long SYSTEM_TEXT_CLASSIFIER_API_TIMEOUT_IN_SECOND_DEFAULT = 60;

    @Nullable
    public String getTextClassifierServicePackageOverride() {
@@ -140,27 +149,27 @@ public final class TextClassificationConstants {
                GENERATE_LINKS_MAX_TEXT_LENGTH, GENERATE_LINKS_MAX_TEXT_LENGTH_DEFAULT);
    }

    public long getSystemTextClassifierApiTimeoutInSecond() {
        return DeviceConfig.getLong(DeviceConfig.NAMESPACE_TEXTCLASSIFIER,
                SYSTEM_TEXT_CLASSIFIER_API_TIMEOUT_IN_SECOND,
                SYSTEM_TEXT_CLASSIFIER_API_TIMEOUT_IN_SECOND_DEFAULT);
    }

    void dump(IndentingPrintWriter pw) {
        pw.println("TextClassificationConstants:");
        pw.increaseIndent();
        pw.printPair("generate_links_max_text_length", getGenerateLinksMaxTextLength())
                .println();
        pw.printPair("local_textclassifier_enabled", isLocalTextClassifierEnabled())
                .println();
        pw.printPair("model_dark_launch_enabled", isModelDarkLaunchEnabled())
                .println();
        pw.printPair("smart_linkify_enabled", isSmartLinkifyEnabled())
                .println();
        pw.printPair("smart_select_animation_enabled", isSmartSelectionAnimationEnabled())
                .println();
        pw.printPair("smart_selection_enabled", isSmartSelectionEnabled())
                .println();
        pw.printPair("smart_text_share_enabled", isSmartTextShareEnabled())
                .println();
        pw.printPair("system_textclassifier_enabled", isSystemTextClassifierEnabled())
                .println();
        pw.printPair("textclassifier_service_package_override",
        pw.print(GENERATE_LINKS_MAX_TEXT_LENGTH, getGenerateLinksMaxTextLength()).println();
        pw.print(LOCAL_TEXT_CLASSIFIER_ENABLED, isLocalTextClassifierEnabled()).println();
        pw.print(MODEL_DARK_LAUNCH_ENABLED, isModelDarkLaunchEnabled()).println();
        pw.print(SMART_LINKIFY_ENABLED, isSmartLinkifyEnabled()).println();
        pw.print(SMART_SELECT_ANIMATION_ENABLED, isSmartSelectionAnimationEnabled()).println();
        pw.print(SMART_SELECTION_ENABLED, isSmartSelectionEnabled()).println();
        pw.print(SMART_TEXT_SHARE_ENABLED, isSmartTextShareEnabled()).println();
        pw.print(SYSTEM_TEXT_CLASSIFIER_ENABLED, isSystemTextClassifierEnabled()).println();
        pw.print(TEXT_CLASSIFIER_SERVICE_PACKAGE_OVERRIDE,
                getTextClassifierServicePackageOverride()).println();
        pw.print(SYSTEM_TEXT_CLASSIFIER_API_TIMEOUT_IN_SECOND,
                getSystemTextClassifierApiTimeoutInSecond()).println();
        pw.decreaseIndent();
    }
}
 No newline at end of file
+41 −51
Original line number Diff line number Diff line
@@ -16,7 +16,7 @@

package android.view.textclassifier;

import static com.google.common.truth.Truth.assertWithMessage;
import static com.google.common.truth.Truth.assertThat;

import android.provider.DeviceConfig;

@@ -26,73 +26,63 @@ import androidx.test.runner.AndroidJUnit4;
import org.junit.Test;
import org.junit.runner.RunWith;

import java.util.function.Consumer;

@SmallTest
@RunWith(AndroidJUnit4.class)
public class TextClassificationConstantsTest {
    private static final float EPSILON = 0.0001f;

    @Test
    public void testLoadFromDeviceConfig_booleanValue() throws Exception {
        // Saves config original value.
        final String originalValue = DeviceConfig.getProperty(DeviceConfig.NAMESPACE_TEXTCLASSIFIER,
                TextClassificationConstants.LOCAL_TEXT_CLASSIFIER_ENABLED);

        final TextClassificationConstants constants = new TextClassificationConstants();
        try {
            // Sets and checks different value.
            setDeviceConfig(TextClassificationConstants.LOCAL_TEXT_CLASSIFIER_ENABLED, "false");
            assertWithMessage(TextClassificationConstants.LOCAL_TEXT_CLASSIFIER_ENABLED)
                    .that(constants.isLocalTextClassifierEnabled()).isFalse();
        } finally {
            // Restores config original value.
            setDeviceConfig(TextClassificationConstants.LOCAL_TEXT_CLASSIFIER_ENABLED,
                    originalValue);
        }
    public void booleanSettings() {
        assertSettings(
                TextClassificationConstants.LOCAL_TEXT_CLASSIFIER_ENABLED,
                "false",
                settings -> assertThat(settings.isLocalTextClassifierEnabled()).isFalse());
    }

    @Test
    public void testLoadFromDeviceConfig_IntValue() throws Exception {
        // Saves config original value.
        final String originalValue = DeviceConfig.getProperty(DeviceConfig.NAMESPACE_TEXTCLASSIFIER,
                TextClassificationConstants.GENERATE_LINKS_MAX_TEXT_LENGTH);

        final TextClassificationConstants constants = new TextClassificationConstants();
        try {
            // Sets and checks different value.
            setDeviceConfig(TextClassificationConstants.GENERATE_LINKS_MAX_TEXT_LENGTH, "8");
            assertWithMessage(TextClassificationConstants.GENERATE_LINKS_MAX_TEXT_LENGTH)
                    .that(constants.getGenerateLinksMaxTextLength()).isEqualTo(8);
        } finally {
            // Restores config original value.
            setDeviceConfig(TextClassificationConstants.GENERATE_LINKS_MAX_TEXT_LENGTH,
                    originalValue);
    public void intSettings() {
        assertSettings(
                TextClassificationConstants.GENERATE_LINKS_MAX_TEXT_LENGTH,
                "128",
                settings -> assertThat(settings.getGenerateLinksMaxTextLength()).isEqualTo(128));
    }

    @Test
    public void stringSettings() {
        assertSettings(
                TextClassificationConstants.TEXT_CLASSIFIER_SERVICE_PACKAGE_OVERRIDE,
                "com.example.textclassifier",
                settings -> assertThat(
                        settings.getTextClassifierServicePackageOverride())
                        .isEqualTo("com.example.textclassifier"));
    }

    @Test
    public void testLoadFromDeviceConfig_StringValue() throws Exception {
        // Saves config original value.
        final String originalValue = DeviceConfig.getProperty(DeviceConfig.NAMESPACE_TEXTCLASSIFIER,
                TextClassificationConstants.TEXT_CLASSIFIER_SERVICE_PACKAGE_OVERRIDE);
    public void longSettings() {
        assertSettings(
                TextClassificationConstants.SYSTEM_TEXT_CLASSIFIER_API_TIMEOUT_IN_SECOND,
                "1",
                settings -> assertThat(
                        settings.getSystemTextClassifierApiTimeoutInSecond())
                        .isEqualTo(1));
    }

        final TextClassificationConstants constants = new TextClassificationConstants();
    private static void assertSettings(
            String key, String value, Consumer<TextClassificationConstants> settingsConsumer) {
        final String originalValue =
                DeviceConfig.getProperty(DeviceConfig.NAMESPACE_TEXTCLASSIFIER, key);
        TextClassificationConstants settings = new TextClassificationConstants();
        try {
            // Sets and checks different value.
            final String testTextClassifier = "com.example.textclassifier";
            setDeviceConfig(TextClassificationConstants.TEXT_CLASSIFIER_SERVICE_PACKAGE_OVERRIDE,
                    testTextClassifier);
            assertWithMessage(TextClassificationConstants.TEXT_CLASSIFIER_SERVICE_PACKAGE_OVERRIDE)
                    .that(constants.getTextClassifierServicePackageOverride()).isEqualTo(
                    testTextClassifier);
            setDeviceConfig(key, value);
            settingsConsumer.accept(settings);
        } finally {
            // Restores config original value.
            setDeviceConfig(TextClassificationConstants.TEXT_CLASSIFIER_SERVICE_PACKAGE_OVERRIDE,
                    originalValue);
            setDeviceConfig(key, originalValue);
        }
    }

    private void setDeviceConfig(String key, String value) {
        DeviceConfig.setProperty(DeviceConfig.NAMESPACE_TEXTCLASSIFIER, key,
                value, /* makeDefault */ false);
    private static void setDeviceConfig(String key, String value) {
        DeviceConfig.setProperty(
                DeviceConfig.NAMESPACE_TEXTCLASSIFIER, key, value, /* makeDefault */ false);
    }
}
+16 −14
Original line number Diff line number Diff line
@@ -66,7 +66,6 @@ import com.android.internal.util.FunctionalUtils.ThrowingRunnable;
import com.android.internal.util.IndentingPrintWriter;
import com.android.internal.util.Preconditions;
import com.android.server.SystemService;
import com.android.server.SystemService.TargetUser;

import java.io.FileDescriptor;
import java.io.PrintWriter;
@@ -458,6 +457,9 @@ public final class TextClassificationManagerService extends ITextClassifierServi
                callback.onFailure();
            } else if (serviceState.isBoundLocked()) {
                if (!serviceState.checkRequestAcceptedLocked(Binder.getCallingUid(), methodName)) {
                    Slog.w(LOG_TAG, String.format("UID %d is not allowed to see the %s request",
                            Binder.getCallingUid(), methodName));
                    callback.onFailure();
                    return;
                }
                textClassifierServiceConsumer.accept(serviceState.mService);
@@ -497,7 +499,7 @@ public final class TextClassificationManagerService extends ITextClassifierServi
        private final IBinder mBinder;
        @NonNull
        private final Runnable mRequest;
        @Nullable
        @NonNull
        private final Runnable mOnServiceFailure;
        @GuardedBy("mLock")
        @NonNull
@@ -516,7 +518,7 @@ public final class TextClassificationManagerService extends ITextClassifierServi
         * @param uid              the calling uid of the request.
         */
        PendingRequest(@Nullable String name,
                @NonNull ThrowingRunnable request, @Nullable ThrowingRunnable onServiceFailure,
                @NonNull ThrowingRunnable request, @NonNull ThrowingRunnable onServiceFailure,
                @Nullable IBinder binder,
                @NonNull TextClassificationManagerService service,
                @NonNull ServiceState serviceState, int uid) {
@@ -524,7 +526,8 @@ public final class TextClassificationManagerService extends ITextClassifierServi
            mRequest =
                    logOnFailure(Objects.requireNonNull(request), "handling pending request");
            mOnServiceFailure =
                    logOnFailure(onServiceFailure, "notifying callback of service failure");
                    logOnFailure(Objects.requireNonNull(onServiceFailure),
                            "notifying callback of service failure");
            mBinder = binder;
            mService = service;
            mServiceState = Objects.requireNonNull(serviceState);
@@ -799,9 +802,7 @@ public final class TextClassificationManagerService extends ITextClassifierServi
                        request -> {
                            Slog.w(LOG_TAG,
                                    String.format("Pending request[%s] is dropped", request.mName));
                            if (request.mOnServiceFailure != null) {
                            request.mOnServiceFailure.run();
                            }
                        });
        @Nullable
        @GuardedBy("mLock")
@@ -843,16 +844,17 @@ public final class TextClassificationManagerService extends ITextClassifierServi
            while ((request = mPendingRequests.poll()) != null) {
                if (isBoundLocked()) {
                    if (!checkRequestAcceptedLocked(request.mUid, request.mName)) {
                        return;
                    }
                        Slog.w(LOG_TAG, String.format("UID %d is not allowed to see the %s request",
                                request.mUid, request.mName));
                        request.mOnServiceFailure.run();
                    } else {
                        request.mRequest.run();
                    }
                } else {
                    if (request.mOnServiceFailure != null) {
                    Slog.d(LOG_TAG, "Unable to bind TextClassifierService for PendingRequest "
                            + request.mName);
                    request.mOnServiceFailure.run();
                }
                }

                if (request.mBinder != null) {
                    request.mBinder.unlinkToDeath(request, 0);