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

Commit fc374578 authored by Tony Mak's avatar Tony Mak
Browse files

Migrate to DeviceConfig in TextClassifier

ConfigParser is introduced to read the flags from DeviceConfig.
If the flag is missing, fallback to Settings.

Also, adds a new setting key: TEXT_CLASSIFIER_ACTION_MODEL_PARAMS

Test: atest frameworks/base/core/tests/coretests/src/android/view/textclassifier/
Test: adb shell cmd device_config put textclassifier system_textclassifier_enabled  false
      adb shell dumpsys textclassification, observed that the flag is updated.

BUG: 123389900
Change-Id: Icbd26ec7ed223e40b60696d12327cb123b96c4fd
parent 0175a40c
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -5862,6 +5862,7 @@ package android.provider {
    field public static final String NAMESPACE_NETD_NATIVE = "netd_native";
    field public static final String NAMESPACE_RUNTIME_NATIVE_BOOT = "runtime_native_boot";
    field public static final String NAMESPACE_SYSTEMUI = "systemui";
    field public static final String NAMESPACE_TEXTCLASSIFIER = "textclassifier";
  }
  public static interface DeviceConfig.AttentionManagerService {
+8 −0
Original line number Diff line number Diff line
@@ -143,6 +143,14 @@ public final class DeviceConfig {
    @SystemApi
    public static final String NAMESPACE_SYSTEMUI = "systemui";

    /**
     * Namespace for TextClassifier related features.
     *
     * @hide
     */
    @SystemApi
    public static final String NAMESPACE_TEXTCLASSIFIER = "textclassifier";

    /**
     * Namespace for all runtime related features.
     *
+26 −16
Original line number Diff line number Diff line
@@ -11909,6 +11909,8 @@ public final class Settings {
         * entity_list_default                              (String[])
         * entity_list_not_editable                         (String[])
         * entity_list_editable                             (String[])
         * in_app_conversation_action_types_default         (String[])
         * notification_conversation_action_types_default   (String[])
         * lang_id_threshold_override                       (float)
         * template_intent_factory_enabled                  (boolean)
         * </pre>
@@ -14565,6 +14567,14 @@ public final class Settings {
         */
        public static final String BATTERY_CHARGING_STATE_UPDATE_DELAY =
                "battery_charging_state_update_delay";
        /**
         * A serialized string of params that will be loaded into a text classifier action model.
         *
         * @hide
         */
        public static final String TEXT_CLASSIFIER_ACTION_MODEL_PARAMS =
                "text_classifier_action_model_params";
    }
    /**
+86 −0
Original line number Diff line number Diff line
/*
 * Copyright (C) 2019 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.view.textclassifier;

import android.annotation.Nullable;
import android.provider.DeviceConfig;
import android.util.KeyValueListParser;

import com.android.internal.annotations.VisibleForTesting;

/**
 * Retrieves settings from {@link DeviceConfig} and {@link android.provider.Settings}.
 * It will try DeviceConfig first and then Settings.
 *
 * @hide
 */
@VisibleForTesting
public final class ConfigParser {
    private static final String TAG = "ConfigParser";

    private final KeyValueListParser mParser;

    public ConfigParser(@Nullable String textClassifierConstants) {
        final KeyValueListParser parser = new KeyValueListParser(',');
        try {
            parser.setString(textClassifierConstants);
        } catch (IllegalArgumentException e) {
            // Failed to parse the settings string, log this and move on with defaults.
            Log.w(TAG, "Bad text_classifier_constants: " + textClassifierConstants);
        }
        mParser = parser;
    }

    /**
     * Reads a boolean flag.
     */
    public boolean getBoolean(String key, boolean defaultValue) {
        return DeviceConfig.getBoolean(
                DeviceConfig.NAMESPACE_TEXTCLASSIFIER,
                key,
                mParser.getBoolean(key, defaultValue));
    }

    /**
     * Reads an integer flag.
     */
    public int getInt(String key, int defaultValue) {
        return DeviceConfig.getInt(
                DeviceConfig.NAMESPACE_TEXTCLASSIFIER,
                key,
                mParser.getInt(key, defaultValue));
    }

    /**
     * Reads a float flag.
     */
    public float getFloat(String key, float defaultValue) {
        return DeviceConfig.getFloat(
                DeviceConfig.NAMESPACE_TEXTCLASSIFIER,
                key,
                mParser.getFloat(key, defaultValue));
    }

    /**
     * Reads a string flag.
     */
    public String getString(String key, String defaultValue) {
        return DeviceConfig.getString(
                DeviceConfig.NAMESPACE_TEXTCLASSIFIER,
                key,
                mParser.getString(key, defaultValue));
    }
}
+159 −101
Original line number Diff line number Diff line
@@ -17,8 +17,6 @@
package android.view.textclassifier;

import android.annotation.Nullable;
import android.util.KeyValueListParser;
import android.util.Slog;

import com.android.internal.util.IndentingPrintWriter;

@@ -46,6 +44,8 @@ import java.util.StringJoiner;
 * entity_list_default                              (String[])
 * entity_list_not_editable                         (String[])
 * entity_list_editable                             (String[])
 * in_app_conversation_action_types_default         (String[])
 * notification_conversation_action_types_default   (String[])
 * lang_id_threshold_override                       (float)
 * template_intent_factory_enabled                  (boolean)
 * </pre>
@@ -61,43 +61,90 @@ import java.util.StringJoiner;
 * @hide
 */
public final class TextClassificationConstants {

    private static final String LOG_TAG = "TextClassificationConstants";

    private static final String LOCAL_TEXT_CLASSIFIER_ENABLED =
            "local_textclassifier_enabled";
    private static final String SYSTEM_TEXT_CLASSIFIER_ENABLED =
            "system_textclassifier_enabled";
    private static final String MODEL_DARK_LAUNCH_ENABLED =
            "model_dark_launch_enabled";
    private static final String SMART_SELECTION_ENABLED =
            "smart_selection_enabled";
    private static final String SMART_TEXT_SHARE_ENABLED =
            "smart_text_share_enabled";
    private static final String SMART_LINKIFY_ENABLED =
            "smart_linkify_enabled";
    /**
     * Whether the smart linkify feature is enabled.
     */
    private static final String SMART_LINKIFY_ENABLED = "smart_linkify_enabled";
    /**
     * Whether SystemTextClassifier is enabled.
     */
    private static final String SYSTEM_TEXT_CLASSIFIER_ENABLED = "system_textclassifier_enabled";
    /**
     * Whether TextClassifierImpl is enabled.
     */
    private static final String LOCAL_TEXT_CLASSIFIER_ENABLED = "local_textclassifier_enabled";
    /**
     * Enable smart selection without a visible UI changes.
     */
    private static final String MODEL_DARK_LAUNCH_ENABLED = "model_dark_launch_enabled";

    /**
     * Whether the smart selection feature is enabled.
     */
    private static final String SMART_SELECTION_ENABLED = "smart_selection_enabled";
    /**
     * Whether the smart text share feature is enabled.
     */
    private static final String SMART_TEXT_SHARE_ENABLED = "smart_text_share_enabled";
    /**
     * Whether animation for smart selection is enabled.
     */
    private static final String SMART_SELECT_ANIMATION_ENABLED =
            "smart_select_animation_enabled";
    /**
     * Max length of text that suggestSelection can accept.
     */
    private static final String SUGGEST_SELECTION_MAX_RANGE_LENGTH =
            "suggest_selection_max_range_length";
    private static final String CLASSIFY_TEXT_MAX_RANGE_LENGTH =
            "classify_text_max_range_length";
    private static final String GENERATE_LINKS_MAX_TEXT_LENGTH =
            "generate_links_max_text_length";
    /**
     * Max length of text that classifyText can accept.
     */
    private static final String CLASSIFY_TEXT_MAX_RANGE_LENGTH = "classify_text_max_range_length";
    /**
     * Max length of text that generateLinks can accept.
     */
    private static final String GENERATE_LINKS_MAX_TEXT_LENGTH = "generate_links_max_text_length";
    /**
     * Sampling rate for generateLinks logging.
     */
    private static final String GENERATE_LINKS_LOG_SAMPLE_RATE =
            "generate_links_log_sample_rate";
    private static final String ENTITY_LIST_DEFAULT =
            "entity_list_default";
    private static final String ENTITY_LIST_NOT_EDITABLE =
            "entity_list_not_editable";
    private static final String ENTITY_LIST_EDITABLE =
            "entity_list_editable";
    /**
     * A colon(:) separated string that specifies the default entities types for
     * generateLinks when hint is not given.
     */
    private static final String ENTITY_LIST_DEFAULT = "entity_list_default";
    /**
     * A colon(:) separated string that specifies the default entities types for
     * generateLinks when the text is in a not editable UI widget.
     */
    private static final String ENTITY_LIST_NOT_EDITABLE = "entity_list_not_editable";
    /**
     * A colon(:) separated string that specifies the default entities types for
     * generateLinks when the text is in an editable UI widget.
     */
    private static final String ENTITY_LIST_EDITABLE = "entity_list_editable";
    /**
     * A colon(:) separated string that specifies the default action types for
     * suggestConversationActions when the suggestions are used in an app.
     */
    private static final String IN_APP_CONVERSATION_ACTION_TYPES_DEFAULT =
            "in_app_conversation_action_types_default";
    /**
     * A colon(:) separated string that specifies the default action types for
     * suggestConversationActions when the suggestions are used in a notification.
     */
    private static final String NOTIFICATION_CONVERSATION_ACTION_TYPES_DEFAULT =
            "notification_conversation_action_types_default";
    private static final String LANG_ID_THRESHOLD_OVERRIDE =
            "lang_id_threshold_override";
    /**
     * Threshold in classifyText to consider a text is in a foreign language.
     */
    private static final String LANG_ID_THRESHOLD_OVERRIDE = "lang_id_threshold_override";
    /**
     * Whether to enable {@link android.view.textclassifier.TemplateIntentFactory}.
     */
    private static final String TEMPLATE_INTENT_FACTORY_ENABLED = "template_intent_factory_enabled";

    private static final boolean LOCAL_TEXT_CLASSIFIER_ENABLED_DEFAULT = true;
@@ -162,66 +209,77 @@ public final class TextClassificationConstants {
    private final boolean mTemplateIntentFactoryEnabled;

    private TextClassificationConstants(@Nullable String settings) {
        final KeyValueListParser parser = new KeyValueListParser(',');
        try {
            parser.setString(settings);
        } catch (IllegalArgumentException e) {
            // Failed to parse the settings string, log this and move on with defaults.
            Slog.e(LOG_TAG, "Bad TextClassifier settings: " + settings);
        }
        mSystemTextClassifierEnabled = parser.getBoolean(
        ConfigParser configParser = new ConfigParser(settings);
        mSystemTextClassifierEnabled =
                configParser.getBoolean(
                        SYSTEM_TEXT_CLASSIFIER_ENABLED,
                        SYSTEM_TEXT_CLASSIFIER_ENABLED_DEFAULT);
        mLocalTextClassifierEnabled = parser.getBoolean(
        mLocalTextClassifierEnabled =
                configParser.getBoolean(
                        LOCAL_TEXT_CLASSIFIER_ENABLED,
                        LOCAL_TEXT_CLASSIFIER_ENABLED_DEFAULT);
        mModelDarkLaunchEnabled = parser.getBoolean(
        mModelDarkLaunchEnabled =
                configParser.getBoolean(
                        MODEL_DARK_LAUNCH_ENABLED,
                        MODEL_DARK_LAUNCH_ENABLED_DEFAULT);
        mSmartSelectionEnabled = parser.getBoolean(
        mSmartSelectionEnabled =
                configParser.getBoolean(
                        SMART_SELECTION_ENABLED,
                        SMART_SELECTION_ENABLED_DEFAULT);
        mSmartTextShareEnabled = parser.getBoolean(
        mSmartTextShareEnabled =
                configParser.getBoolean(
                        SMART_TEXT_SHARE_ENABLED,
                        SMART_TEXT_SHARE_ENABLED_DEFAULT);
        mSmartLinkifyEnabled = parser.getBoolean(
        mSmartLinkifyEnabled =
                configParser.getBoolean(
                        SMART_LINKIFY_ENABLED,
                        SMART_LINKIFY_ENABLED_DEFAULT);
        mSmartSelectionAnimationEnabled = parser.getBoolean(
        mSmartSelectionAnimationEnabled =
                configParser.getBoolean(
                        SMART_SELECT_ANIMATION_ENABLED,
                        SMART_SELECT_ANIMATION_ENABLED_DEFAULT);
        mSuggestSelectionMaxRangeLength = parser.getInt(
        mSuggestSelectionMaxRangeLength =
                configParser.getInt(
                        SUGGEST_SELECTION_MAX_RANGE_LENGTH,
                        SUGGEST_SELECTION_MAX_RANGE_LENGTH_DEFAULT);
        mClassifyTextMaxRangeLength = parser.getInt(
        mClassifyTextMaxRangeLength =
                configParser.getInt(
                        CLASSIFY_TEXT_MAX_RANGE_LENGTH,
                        CLASSIFY_TEXT_MAX_RANGE_LENGTH_DEFAULT);
        mGenerateLinksMaxTextLength = parser.getInt(
        mGenerateLinksMaxTextLength =
                configParser.getInt(
                        GENERATE_LINKS_MAX_TEXT_LENGTH,
                        GENERATE_LINKS_MAX_TEXT_LENGTH_DEFAULT);
        mGenerateLinksLogSampleRate = parser.getInt(
        mGenerateLinksLogSampleRate =
                configParser.getInt(
                        GENERATE_LINKS_LOG_SAMPLE_RATE,
                        GENERATE_LINKS_LOG_SAMPLE_RATE_DEFAULT);
        mEntityListDefault = parseStringList(parser.getString(
        mEntityListDefault = parseStringList(configParser.getString(
                ENTITY_LIST_DEFAULT,
                ENTITY_LIST_DEFAULT_VALUE));
        mEntityListNotEditable = parseStringList(parser.getString(
        mEntityListNotEditable = parseStringList(
                configParser.getString(
                        ENTITY_LIST_NOT_EDITABLE,
                        ENTITY_LIST_DEFAULT_VALUE));
        mEntityListEditable = parseStringList(parser.getString(
        mEntityListEditable = parseStringList(
                configParser.getString(
                        ENTITY_LIST_EDITABLE,
                        ENTITY_LIST_DEFAULT_VALUE));
        mInAppConversationActionTypesDefault = parseStringList(parser.getString(
        mInAppConversationActionTypesDefault = parseStringList(
                configParser.getString(
                        IN_APP_CONVERSATION_ACTION_TYPES_DEFAULT,
                        CONVERSATION_ACTIONS_TYPES_DEFAULT_VALUES));
        mNotificationConversationActionTypesDefault = parseStringList(parser.getString(
        mNotificationConversationActionTypesDefault = parseStringList(
                configParser.getString(
                        NOTIFICATION_CONVERSATION_ACTION_TYPES_DEFAULT,
                        CONVERSATION_ACTIONS_TYPES_DEFAULT_VALUES));
        mLangIdThresholdOverride = parser.getFloat(
        mLangIdThresholdOverride =
                configParser.getFloat(
                        LANG_ID_THRESHOLD_OVERRIDE,
                        LANG_ID_THRESHOLD_OVERRIDE_DEFAULT);
        mTemplateIntentFactoryEnabled = parser.getBoolean(
                TEMPLATE_INTENT_FACTORY_ENABLED, TEMPLATE_INTENT_FACTORY_ENABLED_DEFAULT);
        mTemplateIntentFactoryEnabled = configParser.getBoolean(
                TEMPLATE_INTENT_FACTORY_ENABLED,
                TEMPLATE_INTENT_FACTORY_ENABLED_DEFAULT);
    }

    /** Load from a settings string. */
Loading