Home | History | Annotate | Download | only in textclassifier
      1 /*
      2  * Copyright (C) 2017 The Android Open Source Project
      3  *
      4  * Licensed under the Apache License, Version 2.0 (the "License");
      5  * you may not use this file except in compliance with the License.
      6  * You may obtain a copy of the License at
      7  *
      8  *      http://www.apache.org/licenses/LICENSE-2.0
      9  *
     10  * Unless required by applicable law or agreed to in writing, software
     11  * distributed under the License is distributed on an "AS IS" BASIS,
     12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     13  * See the License for the specific language governing permissions and
     14  * limitations under the License.
     15  */
     16 
     17 package android.view.textclassifier;
     18 
     19 import android.annotation.Nullable;
     20 import android.util.KeyValueListParser;
     21 import android.util.Slog;
     22 
     23 import java.util.Arrays;
     24 import java.util.Collections;
     25 import java.util.List;
     26 import java.util.StringJoiner;
     27 
     28 /**
     29  * TextClassifier specific settings.
     30  * This is encoded as a key=value list, separated by commas. Ex:
     31  *
     32  * <pre>
     33  * smart_linkify_enabled                    (boolean)
     34  * system_textclassifier_enabled            (boolean)
     35  * model_dark_launch_enabled                (boolean)
     36  * smart_selection_enabled                  (boolean)
     37  * smart_text_share_enabled                 (boolean)
     38  * smart_linkify_enabled                    (boolean)
     39  * smart_select_animation_enabled           (boolean)
     40  * suggest_selection_max_range_length       (int)
     41  * classify_text_max_range_length           (int)
     42  * generate_links_max_text_length           (int)
     43  * generate_links_log_sample_rate           (int)
     44  * entity_list_default                      (String[])
     45  * entity_list_not_editable                 (String[])
     46  * entity_list_editable                     (String[])
     47  * </pre>
     48  *
     49  * <p>
     50  * Type: string
     51  * see also android.provider.Settings.Global.TEXT_CLASSIFIER_CONSTANTS
     52  *
     53  * Example of setting the values for testing.
     54  * adb shell settings put global text_classifier_constants \
     55  *      model_dark_launch_enabled=true,smart_selection_enabled=true,\
     56  *      entity_list_default=phone:address
     57  * @hide
     58  */
     59 public final class TextClassificationConstants {
     60 
     61     private static final String LOG_TAG = "TextClassificationConstants";
     62 
     63     private static final String LOCAL_TEXT_CLASSIFIER_ENABLED =
     64             "local_textclassifier_enabled";
     65     private static final String SYSTEM_TEXT_CLASSIFIER_ENABLED =
     66             "system_textclassifier_enabled";
     67     private static final String MODEL_DARK_LAUNCH_ENABLED =
     68             "model_dark_launch_enabled";
     69     private static final String SMART_SELECTION_ENABLED =
     70             "smart_selection_enabled";
     71     private static final String SMART_TEXT_SHARE_ENABLED =
     72             "smart_text_share_enabled";
     73     private static final String SMART_LINKIFY_ENABLED =
     74             "smart_linkify_enabled";
     75     private static final String SMART_SELECT_ANIMATION_ENABLED =
     76             "smart_select_animation_enabled";
     77     private static final String SUGGEST_SELECTION_MAX_RANGE_LENGTH =
     78             "suggest_selection_max_range_length";
     79     private static final String CLASSIFY_TEXT_MAX_RANGE_LENGTH =
     80             "classify_text_max_range_length";
     81     private static final String GENERATE_LINKS_MAX_TEXT_LENGTH =
     82             "generate_links_max_text_length";
     83     private static final String GENERATE_LINKS_LOG_SAMPLE_RATE =
     84             "generate_links_log_sample_rate";
     85     private static final String ENTITY_LIST_DEFAULT =
     86             "entity_list_default";
     87     private static final String ENTITY_LIST_NOT_EDITABLE =
     88             "entity_list_not_editable";
     89     private static final String ENTITY_LIST_EDITABLE =
     90             "entity_list_editable";
     91 
     92     private static final boolean LOCAL_TEXT_CLASSIFIER_ENABLED_DEFAULT = true;
     93     private static final boolean SYSTEM_TEXT_CLASSIFIER_ENABLED_DEFAULT = true;
     94     private static final boolean MODEL_DARK_LAUNCH_ENABLED_DEFAULT = false;
     95     private static final boolean SMART_SELECTION_ENABLED_DEFAULT = true;
     96     private static final boolean SMART_TEXT_SHARE_ENABLED_DEFAULT = true;
     97     private static final boolean SMART_LINKIFY_ENABLED_DEFAULT = true;
     98     private static final boolean SMART_SELECT_ANIMATION_ENABLED_DEFAULT = true;
     99     private static final int SUGGEST_SELECTION_MAX_RANGE_LENGTH_DEFAULT = 10 * 1000;
    100     private static final int CLASSIFY_TEXT_MAX_RANGE_LENGTH_DEFAULT = 10 * 1000;
    101     private static final int GENERATE_LINKS_MAX_TEXT_LENGTH_DEFAULT = 100 * 1000;
    102     private static final int GENERATE_LINKS_LOG_SAMPLE_RATE_DEFAULT = 100;
    103     private static final String ENTITY_LIST_DELIMITER = ":";
    104     private static final String ENTITY_LIST_DEFAULT_VALUE = new StringJoiner(ENTITY_LIST_DELIMITER)
    105             .add(TextClassifier.TYPE_ADDRESS)
    106             .add(TextClassifier.TYPE_EMAIL)
    107             .add(TextClassifier.TYPE_PHONE)
    108             .add(TextClassifier.TYPE_URL)
    109             .add(TextClassifier.TYPE_DATE)
    110             .add(TextClassifier.TYPE_DATE_TIME)
    111             .add(TextClassifier.TYPE_FLIGHT_NUMBER).toString();
    112 
    113     private final boolean mSystemTextClassifierEnabled;
    114     private final boolean mLocalTextClassifierEnabled;
    115     private final boolean mModelDarkLaunchEnabled;
    116     private final boolean mSmartSelectionEnabled;
    117     private final boolean mSmartTextShareEnabled;
    118     private final boolean mSmartLinkifyEnabled;
    119     private final boolean mSmartSelectionAnimationEnabled;
    120     private final int mSuggestSelectionMaxRangeLength;
    121     private final int mClassifyTextMaxRangeLength;
    122     private final int mGenerateLinksMaxTextLength;
    123     private final int mGenerateLinksLogSampleRate;
    124     private final List<String> mEntityListDefault;
    125     private final List<String> mEntityListNotEditable;
    126     private final List<String> mEntityListEditable;
    127 
    128     private TextClassificationConstants(@Nullable String settings) {
    129         final KeyValueListParser parser = new KeyValueListParser(',');
    130         try {
    131             parser.setString(settings);
    132         } catch (IllegalArgumentException e) {
    133             // Failed to parse the settings string, log this and move on with defaults.
    134             Slog.e(LOG_TAG, "Bad TextClassifier settings: " + settings);
    135         }
    136         mSystemTextClassifierEnabled = parser.getBoolean(
    137                 SYSTEM_TEXT_CLASSIFIER_ENABLED,
    138                 SYSTEM_TEXT_CLASSIFIER_ENABLED_DEFAULT);
    139         mLocalTextClassifierEnabled = parser.getBoolean(
    140                 LOCAL_TEXT_CLASSIFIER_ENABLED,
    141                 LOCAL_TEXT_CLASSIFIER_ENABLED_DEFAULT);
    142         mModelDarkLaunchEnabled = parser.getBoolean(
    143                 MODEL_DARK_LAUNCH_ENABLED,
    144                 MODEL_DARK_LAUNCH_ENABLED_DEFAULT);
    145         mSmartSelectionEnabled = parser.getBoolean(
    146                 SMART_SELECTION_ENABLED,
    147                 SMART_SELECTION_ENABLED_DEFAULT);
    148         mSmartTextShareEnabled = parser.getBoolean(
    149                 SMART_TEXT_SHARE_ENABLED,
    150                 SMART_TEXT_SHARE_ENABLED_DEFAULT);
    151         mSmartLinkifyEnabled = parser.getBoolean(
    152                 SMART_LINKIFY_ENABLED,
    153                 SMART_LINKIFY_ENABLED_DEFAULT);
    154         mSmartSelectionAnimationEnabled = parser.getBoolean(
    155                 SMART_SELECT_ANIMATION_ENABLED,
    156                 SMART_SELECT_ANIMATION_ENABLED_DEFAULT);
    157         mSuggestSelectionMaxRangeLength = parser.getInt(
    158                 SUGGEST_SELECTION_MAX_RANGE_LENGTH,
    159                 SUGGEST_SELECTION_MAX_RANGE_LENGTH_DEFAULT);
    160         mClassifyTextMaxRangeLength = parser.getInt(
    161                 CLASSIFY_TEXT_MAX_RANGE_LENGTH,
    162                 CLASSIFY_TEXT_MAX_RANGE_LENGTH_DEFAULT);
    163         mGenerateLinksMaxTextLength = parser.getInt(
    164                 GENERATE_LINKS_MAX_TEXT_LENGTH,
    165                 GENERATE_LINKS_MAX_TEXT_LENGTH_DEFAULT);
    166         mGenerateLinksLogSampleRate = parser.getInt(
    167                 GENERATE_LINKS_LOG_SAMPLE_RATE,
    168                 GENERATE_LINKS_LOG_SAMPLE_RATE_DEFAULT);
    169         mEntityListDefault = parseEntityList(parser.getString(
    170                 ENTITY_LIST_DEFAULT,
    171                 ENTITY_LIST_DEFAULT_VALUE));
    172         mEntityListNotEditable = parseEntityList(parser.getString(
    173                 ENTITY_LIST_NOT_EDITABLE,
    174                 ENTITY_LIST_DEFAULT_VALUE));
    175         mEntityListEditable = parseEntityList(parser.getString(
    176                 ENTITY_LIST_EDITABLE,
    177                 ENTITY_LIST_DEFAULT_VALUE));
    178     }
    179 
    180     /** Load from a settings string. */
    181     public static TextClassificationConstants loadFromString(String settings) {
    182         return new TextClassificationConstants(settings);
    183     }
    184 
    185     public boolean isLocalTextClassifierEnabled() {
    186         return mLocalTextClassifierEnabled;
    187     }
    188 
    189     public boolean isSystemTextClassifierEnabled() {
    190         return mSystemTextClassifierEnabled;
    191     }
    192 
    193     public boolean isModelDarkLaunchEnabled() {
    194         return mModelDarkLaunchEnabled;
    195     }
    196 
    197     public boolean isSmartSelectionEnabled() {
    198         return mSmartSelectionEnabled;
    199     }
    200 
    201     public boolean isSmartTextShareEnabled() {
    202         return mSmartTextShareEnabled;
    203     }
    204 
    205     public boolean isSmartLinkifyEnabled() {
    206         return mSmartLinkifyEnabled;
    207     }
    208 
    209     public boolean isSmartSelectionAnimationEnabled() {
    210         return mSmartSelectionAnimationEnabled;
    211     }
    212 
    213     public int getSuggestSelectionMaxRangeLength() {
    214         return mSuggestSelectionMaxRangeLength;
    215     }
    216 
    217     public int getClassifyTextMaxRangeLength() {
    218         return mClassifyTextMaxRangeLength;
    219     }
    220 
    221     public int getGenerateLinksMaxTextLength() {
    222         return mGenerateLinksMaxTextLength;
    223     }
    224 
    225     public int getGenerateLinksLogSampleRate() {
    226         return mGenerateLinksLogSampleRate;
    227     }
    228 
    229     public List<String> getEntityListDefault() {
    230         return mEntityListDefault;
    231     }
    232 
    233     public List<String> getEntityListNotEditable() {
    234         return mEntityListNotEditable;
    235     }
    236 
    237     public List<String> getEntityListEditable() {
    238         return mEntityListEditable;
    239     }
    240 
    241     private static List<String> parseEntityList(String listStr) {
    242         return Collections.unmodifiableList(Arrays.asList(listStr.split(ENTITY_LIST_DELIMITER)));
    243     }
    244 }
    245