blob: 2ef8d04939bd24978125eaa32f1ef7223fbce9b2 [file] [log] [blame]
Abodunrinwa Toki0e6b43e2017-09-19 23:18:40 +01001/*
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
17package android.view.textclassifier;
18
19import android.annotation.Nullable;
20import android.util.KeyValueListParser;
21import android.util.Slog;
22
Tony Makf93e9e52018-07-16 14:46:29 +020023import com.android.internal.util.IndentingPrintWriter;
24
Jan Althaus0aacdb62018-02-19 11:44:37 +010025import java.util.Arrays;
26import java.util.Collections;
27import java.util.List;
28import java.util.StringJoiner;
29
Abodunrinwa Toki0e6b43e2017-09-19 23:18:40 +010030/**
31 * TextClassifier specific settings.
32 * This is encoded as a key=value list, separated by commas. Ex:
33 *
34 * <pre>
Abodunrinwa Tokic7073a42018-02-28 23:02:13 +000035 * smart_linkify_enabled (boolean)
36 * system_textclassifier_enabled (boolean)
Abodunrinwa Tokidb8fc312018-02-26 21:37:51 +000037 * model_dark_launch_enabled (boolean)
38 * smart_selection_enabled (boolean)
39 * smart_text_share_enabled (boolean)
40 * smart_linkify_enabled (boolean)
41 * smart_select_animation_enabled (boolean)
Jan Althaus0aacdb62018-02-19 11:44:37 +010042 * suggest_selection_max_range_length (int)
43 * classify_text_max_range_length (int)
44 * generate_links_max_text_length (int)
Abodunrinwa Tokidb8fc312018-02-26 21:37:51 +000045 * generate_links_log_sample_rate (int)
Jan Althaus0aacdb62018-02-19 11:44:37 +010046 * entity_list_default (String[])
47 * entity_list_not_editable (String[])
48 * entity_list_editable (String[])
Abodunrinwa Tokia77dba62019-01-25 19:27:11 +000049 * lang_id_threshold_override (float)
Tony Makfc039c32019-01-17 19:32:08 +000050 * template_intent_factory_enabled (boolean)
Abodunrinwa Toki0e6b43e2017-09-19 23:18:40 +010051 * </pre>
52 *
53 * <p>
54 * Type: string
55 * see also android.provider.Settings.Global.TEXT_CLASSIFIER_CONSTANTS
56 *
57 * Example of setting the values for testing.
Jan Althaus0aacdb62018-02-19 11:44:37 +010058 * adb shell settings put global text_classifier_constants \
Abodunrinwa Tokidb8fc312018-02-26 21:37:51 +000059 * model_dark_launch_enabled=true,smart_selection_enabled=true,\
Jan Althaus0aacdb62018-02-19 11:44:37 +010060 * entity_list_default=phone:address
Abodunrinwa Toki0e6b43e2017-09-19 23:18:40 +010061 * @hide
62 */
Abodunrinwa Tokidb8fc312018-02-26 21:37:51 +000063public final class TextClassificationConstants {
Abodunrinwa Toki0e6b43e2017-09-19 23:18:40 +010064
Abodunrinwa Tokidb8fc312018-02-26 21:37:51 +000065 private static final String LOG_TAG = "TextClassificationConstants";
Abodunrinwa Toki0e6b43e2017-09-19 23:18:40 +010066
Abodunrinwa Tokic7073a42018-02-28 23:02:13 +000067 private static final String LOCAL_TEXT_CLASSIFIER_ENABLED =
68 "local_textclassifier_enabled";
69 private static final String SYSTEM_TEXT_CLASSIFIER_ENABLED =
70 "system_textclassifier_enabled";
Abodunrinwa Tokidb8fc312018-02-26 21:37:51 +000071 private static final String MODEL_DARK_LAUNCH_ENABLED =
72 "model_dark_launch_enabled";
73 private static final String SMART_SELECTION_ENABLED =
74 "smart_selection_enabled";
75 private static final String SMART_TEXT_SHARE_ENABLED =
76 "smart_text_share_enabled";
Richard Ledley9cfa6062018-01-15 13:13:29 +000077 private static final String SMART_LINKIFY_ENABLED =
78 "smart_linkify_enabled";
Abodunrinwa Tokidb8fc312018-02-26 21:37:51 +000079 private static final String SMART_SELECT_ANIMATION_ENABLED =
80 "smart_select_animation_enabled";
Jan Althaus108aad32018-01-30 15:26:55 +010081 private static final String SUGGEST_SELECTION_MAX_RANGE_LENGTH =
82 "suggest_selection_max_range_length";
83 private static final String CLASSIFY_TEXT_MAX_RANGE_LENGTH =
84 "classify_text_max_range_length";
85 private static final String GENERATE_LINKS_MAX_TEXT_LENGTH =
86 "generate_links_max_text_length";
Jan Althaus31efdc32018-02-19 22:23:13 +010087 private static final String GENERATE_LINKS_LOG_SAMPLE_RATE =
88 "generate_links_log_sample_rate";
Jan Althaus0aacdb62018-02-19 11:44:37 +010089 private static final String ENTITY_LIST_DEFAULT =
90 "entity_list_default";
91 private static final String ENTITY_LIST_NOT_EDITABLE =
92 "entity_list_not_editable";
93 private static final String ENTITY_LIST_EDITABLE =
94 "entity_list_editable";
Tony Makadbebcc2018-10-30 18:59:06 +000095 private static final String IN_APP_CONVERSATION_ACTION_TYPES_DEFAULT =
96 "in_app_conversation_action_types_default";
97 private static final String NOTIFICATION_CONVERSATION_ACTION_TYPES_DEFAULT =
98 "notification_conversation_action_types_default";
Abodunrinwa Tokia77dba62019-01-25 19:27:11 +000099 private static final String LANG_ID_THRESHOLD_OVERRIDE =
100 "lang_id_threshold_override";
Tony Makfc039c32019-01-17 19:32:08 +0000101 private static final String TEMPLATE_INTENT_FACTORY_ENABLED = "template_intent_factory_enabled";
Abodunrinwa Toki0e6b43e2017-09-19 23:18:40 +0100102
Abodunrinwa Tokic7073a42018-02-28 23:02:13 +0000103 private static final boolean LOCAL_TEXT_CLASSIFIER_ENABLED_DEFAULT = true;
104 private static final boolean SYSTEM_TEXT_CLASSIFIER_ENABLED_DEFAULT = true;
Abodunrinwa Tokidb8fc312018-02-26 21:37:51 +0000105 private static final boolean MODEL_DARK_LAUNCH_ENABLED_DEFAULT = false;
106 private static final boolean SMART_SELECTION_ENABLED_DEFAULT = true;
107 private static final boolean SMART_TEXT_SHARE_ENABLED_DEFAULT = true;
Richard Ledley9cfa6062018-01-15 13:13:29 +0000108 private static final boolean SMART_LINKIFY_ENABLED_DEFAULT = true;
Abodunrinwa Tokidb8fc312018-02-26 21:37:51 +0000109 private static final boolean SMART_SELECT_ANIMATION_ENABLED_DEFAULT = true;
Jan Althaus108aad32018-01-30 15:26:55 +0100110 private static final int SUGGEST_SELECTION_MAX_RANGE_LENGTH_DEFAULT = 10 * 1000;
111 private static final int CLASSIFY_TEXT_MAX_RANGE_LENGTH_DEFAULT = 10 * 1000;
112 private static final int GENERATE_LINKS_MAX_TEXT_LENGTH_DEFAULT = 100 * 1000;
Jan Althaus31efdc32018-02-19 22:23:13 +0100113 private static final int GENERATE_LINKS_LOG_SAMPLE_RATE_DEFAULT = 100;
Abodunrinwa Tokia77dba62019-01-25 19:27:11 +0000114 private static final String STRING_LIST_DELIMITER = ":";
115 private static final String ENTITY_LIST_DEFAULT_VALUE = new StringJoiner(STRING_LIST_DELIMITER)
Jan Althaus0aacdb62018-02-19 11:44:37 +0100116 .add(TextClassifier.TYPE_ADDRESS)
117 .add(TextClassifier.TYPE_EMAIL)
118 .add(TextClassifier.TYPE_PHONE)
119 .add(TextClassifier.TYPE_URL)
120 .add(TextClassifier.TYPE_DATE)
121 .add(TextClassifier.TYPE_DATE_TIME)
122 .add(TextClassifier.TYPE_FLIGHT_NUMBER).toString();
Tony Makadbebcc2018-10-30 18:59:06 +0000123 private static final String CONVERSATION_ACTIONS_TYPES_DEFAULT_VALUES =
Abodunrinwa Tokia77dba62019-01-25 19:27:11 +0000124 new StringJoiner(STRING_LIST_DELIMITER)
Tony Makae85aae2019-01-09 15:59:56 +0000125 .add(ConversationAction.TYPE_TEXT_REPLY)
126 .add(ConversationAction.TYPE_CREATE_REMINDER)
127 .add(ConversationAction.TYPE_CALL_PHONE)
128 .add(ConversationAction.TYPE_OPEN_URL)
129 .add(ConversationAction.TYPE_SEND_EMAIL)
130 .add(ConversationAction.TYPE_SEND_SMS)
131 .add(ConversationAction.TYPE_TRACK_FLIGHT)
132 .add(ConversationAction.TYPE_VIEW_CALENDAR)
133 .add(ConversationAction.TYPE_VIEW_MAP)
Tony Maka396be42019-02-07 14:37:22 +0000134 .add(ConversationAction.TYPE_ADD_CONTACT)
Tony Makadbebcc2018-10-30 18:59:06 +0000135 .toString();
Abodunrinwa Tokia77dba62019-01-25 19:27:11 +0000136 /**
137 * < 0 : Not set. Use value from LangId model.
138 * 0 - 1: Override value in LangId model.
139 * > 1 : Effectively turns off the foreign language detection. Scores should never be > 1.
140 * @see EntityConfidence
141 */
142 private static final float LANG_ID_THRESHOLD_OVERRIDE_DEFAULT = -1f;
Tony Makfc039c32019-01-17 19:32:08 +0000143 private static final boolean TEMPLATE_INTENT_FACTORY_ENABLED_DEFAULT = true;
Abodunrinwa Toki0e6b43e2017-09-19 23:18:40 +0100144
Abodunrinwa Tokic7073a42018-02-28 23:02:13 +0000145 private final boolean mSystemTextClassifierEnabled;
146 private final boolean mLocalTextClassifierEnabled;
Abodunrinwa Tokidb8fc312018-02-26 21:37:51 +0000147 private final boolean mModelDarkLaunchEnabled;
148 private final boolean mSmartSelectionEnabled;
149 private final boolean mSmartTextShareEnabled;
Richard Ledley9cfa6062018-01-15 13:13:29 +0000150 private final boolean mSmartLinkifyEnabled;
Abodunrinwa Tokidb8fc312018-02-26 21:37:51 +0000151 private final boolean mSmartSelectionAnimationEnabled;
Jan Althaus108aad32018-01-30 15:26:55 +0100152 private final int mSuggestSelectionMaxRangeLength;
153 private final int mClassifyTextMaxRangeLength;
154 private final int mGenerateLinksMaxTextLength;
Jan Althaus31efdc32018-02-19 22:23:13 +0100155 private final int mGenerateLinksLogSampleRate;
Jan Althaus0aacdb62018-02-19 11:44:37 +0100156 private final List<String> mEntityListDefault;
157 private final List<String> mEntityListNotEditable;
158 private final List<String> mEntityListEditable;
Tony Makadbebcc2018-10-30 18:59:06 +0000159 private final List<String> mInAppConversationActionTypesDefault;
160 private final List<String> mNotificationConversationActionTypesDefault;
Abodunrinwa Tokia77dba62019-01-25 19:27:11 +0000161 private final float mLangIdThresholdOverride;
Tony Makfc039c32019-01-17 19:32:08 +0000162 private final boolean mTemplateIntentFactoryEnabled;
Abodunrinwa Toki0e6b43e2017-09-19 23:18:40 +0100163
Abodunrinwa Tokidb8fc312018-02-26 21:37:51 +0000164 private TextClassificationConstants(@Nullable String settings) {
Abodunrinwa Toki0e6b43e2017-09-19 23:18:40 +0100165 final KeyValueListParser parser = new KeyValueListParser(',');
166 try {
167 parser.setString(settings);
168 } catch (IllegalArgumentException e) {
169 // Failed to parse the settings string, log this and move on with defaults.
170 Slog.e(LOG_TAG, "Bad TextClassifier settings: " + settings);
171 }
Abodunrinwa Tokic7073a42018-02-28 23:02:13 +0000172 mSystemTextClassifierEnabled = parser.getBoolean(
173 SYSTEM_TEXT_CLASSIFIER_ENABLED,
174 SYSTEM_TEXT_CLASSIFIER_ENABLED_DEFAULT);
175 mLocalTextClassifierEnabled = parser.getBoolean(
176 LOCAL_TEXT_CLASSIFIER_ENABLED,
177 LOCAL_TEXT_CLASSIFIER_ENABLED_DEFAULT);
Abodunrinwa Tokidb8fc312018-02-26 21:37:51 +0000178 mModelDarkLaunchEnabled = parser.getBoolean(
179 MODEL_DARK_LAUNCH_ENABLED,
180 MODEL_DARK_LAUNCH_ENABLED_DEFAULT);
181 mSmartSelectionEnabled = parser.getBoolean(
182 SMART_SELECTION_ENABLED,
183 SMART_SELECTION_ENABLED_DEFAULT);
184 mSmartTextShareEnabled = parser.getBoolean(
Abodunrinwa Tokic7073a42018-02-28 23:02:13 +0000185 SMART_TEXT_SHARE_ENABLED,
186 SMART_TEXT_SHARE_ENABLED_DEFAULT);
Richard Ledley9cfa6062018-01-15 13:13:29 +0000187 mSmartLinkifyEnabled = parser.getBoolean(
188 SMART_LINKIFY_ENABLED,
189 SMART_LINKIFY_ENABLED_DEFAULT);
Abodunrinwa Tokidb8fc312018-02-26 21:37:51 +0000190 mSmartSelectionAnimationEnabled = parser.getBoolean(
191 SMART_SELECT_ANIMATION_ENABLED,
192 SMART_SELECT_ANIMATION_ENABLED_DEFAULT);
Jan Althaus108aad32018-01-30 15:26:55 +0100193 mSuggestSelectionMaxRangeLength = parser.getInt(
194 SUGGEST_SELECTION_MAX_RANGE_LENGTH,
195 SUGGEST_SELECTION_MAX_RANGE_LENGTH_DEFAULT);
196 mClassifyTextMaxRangeLength = parser.getInt(
197 CLASSIFY_TEXT_MAX_RANGE_LENGTH,
198 CLASSIFY_TEXT_MAX_RANGE_LENGTH_DEFAULT);
199 mGenerateLinksMaxTextLength = parser.getInt(
200 GENERATE_LINKS_MAX_TEXT_LENGTH,
201 GENERATE_LINKS_MAX_TEXT_LENGTH_DEFAULT);
Jan Althaus31efdc32018-02-19 22:23:13 +0100202 mGenerateLinksLogSampleRate = parser.getInt(
203 GENERATE_LINKS_LOG_SAMPLE_RATE,
204 GENERATE_LINKS_LOG_SAMPLE_RATE_DEFAULT);
Abodunrinwa Tokia77dba62019-01-25 19:27:11 +0000205 mEntityListDefault = parseStringList(parser.getString(
Jan Althaus0aacdb62018-02-19 11:44:37 +0100206 ENTITY_LIST_DEFAULT,
207 ENTITY_LIST_DEFAULT_VALUE));
Abodunrinwa Tokia77dba62019-01-25 19:27:11 +0000208 mEntityListNotEditable = parseStringList(parser.getString(
Jan Althaus0aacdb62018-02-19 11:44:37 +0100209 ENTITY_LIST_NOT_EDITABLE,
210 ENTITY_LIST_DEFAULT_VALUE));
Abodunrinwa Tokia77dba62019-01-25 19:27:11 +0000211 mEntityListEditable = parseStringList(parser.getString(
Jan Althaus0aacdb62018-02-19 11:44:37 +0100212 ENTITY_LIST_EDITABLE,
213 ENTITY_LIST_DEFAULT_VALUE));
Abodunrinwa Tokia77dba62019-01-25 19:27:11 +0000214 mInAppConversationActionTypesDefault = parseStringList(parser.getString(
Tony Makadbebcc2018-10-30 18:59:06 +0000215 IN_APP_CONVERSATION_ACTION_TYPES_DEFAULT,
216 CONVERSATION_ACTIONS_TYPES_DEFAULT_VALUES));
Abodunrinwa Tokia77dba62019-01-25 19:27:11 +0000217 mNotificationConversationActionTypesDefault = parseStringList(parser.getString(
Tony Makadbebcc2018-10-30 18:59:06 +0000218 NOTIFICATION_CONVERSATION_ACTION_TYPES_DEFAULT,
219 CONVERSATION_ACTIONS_TYPES_DEFAULT_VALUES));
Abodunrinwa Tokia77dba62019-01-25 19:27:11 +0000220 mLangIdThresholdOverride = parser.getFloat(
221 LANG_ID_THRESHOLD_OVERRIDE,
222 LANG_ID_THRESHOLD_OVERRIDE_DEFAULT);
Tony Makfc039c32019-01-17 19:32:08 +0000223 mTemplateIntentFactoryEnabled = parser.getBoolean(
224 TEMPLATE_INTENT_FACTORY_ENABLED, TEMPLATE_INTENT_FACTORY_ENABLED_DEFAULT);
Abodunrinwa Toki0e6b43e2017-09-19 23:18:40 +0100225 }
226
Jan Althaus0aacdb62018-02-19 11:44:37 +0100227 /** Load from a settings string. */
Abodunrinwa Tokidb8fc312018-02-26 21:37:51 +0000228 public static TextClassificationConstants loadFromString(String settings) {
229 return new TextClassificationConstants(settings);
Abodunrinwa Toki0e6b43e2017-09-19 23:18:40 +0100230 }
231
Abodunrinwa Tokic7073a42018-02-28 23:02:13 +0000232 public boolean isLocalTextClassifierEnabled() {
233 return mLocalTextClassifierEnabled;
234 }
235
236 public boolean isSystemTextClassifierEnabled() {
237 return mSystemTextClassifierEnabled;
238 }
239
Abodunrinwa Tokidb8fc312018-02-26 21:37:51 +0000240 public boolean isModelDarkLaunchEnabled() {
241 return mModelDarkLaunchEnabled;
Abodunrinwa Toki0e6b43e2017-09-19 23:18:40 +0100242 }
243
Abodunrinwa Tokidb8fc312018-02-26 21:37:51 +0000244 public boolean isSmartSelectionEnabled() {
245 return mSmartSelectionEnabled;
246 }
247
248 public boolean isSmartTextShareEnabled() {
249 return mSmartTextShareEnabled;
Abodunrinwa Toki0e6b43e2017-09-19 23:18:40 +0100250 }
Richard Ledley9cfa6062018-01-15 13:13:29 +0000251
252 public boolean isSmartLinkifyEnabled() {
253 return mSmartLinkifyEnabled;
254 }
Jan Althaus108aad32018-01-30 15:26:55 +0100255
Abodunrinwa Tokidb8fc312018-02-26 21:37:51 +0000256 public boolean isSmartSelectionAnimationEnabled() {
257 return mSmartSelectionAnimationEnabled;
258 }
259
Jan Althaus108aad32018-01-30 15:26:55 +0100260 public int getSuggestSelectionMaxRangeLength() {
261 return mSuggestSelectionMaxRangeLength;
262 }
263
264 public int getClassifyTextMaxRangeLength() {
265 return mClassifyTextMaxRangeLength;
266 }
267
268 public int getGenerateLinksMaxTextLength() {
269 return mGenerateLinksMaxTextLength;
270 }
Jan Althaus31efdc32018-02-19 22:23:13 +0100271
272 public int getGenerateLinksLogSampleRate() {
273 return mGenerateLinksLogSampleRate;
274 }
Jan Althaus0aacdb62018-02-19 11:44:37 +0100275
276 public List<String> getEntityListDefault() {
277 return mEntityListDefault;
278 }
279
280 public List<String> getEntityListNotEditable() {
281 return mEntityListNotEditable;
282 }
283
284 public List<String> getEntityListEditable() {
285 return mEntityListEditable;
286 }
287
Tony Makadbebcc2018-10-30 18:59:06 +0000288 public List<String> getInAppConversationActionTypes() {
289 return mInAppConversationActionTypesDefault;
290 }
291
292 public List<String> getNotificationConversationActionTypes() {
293 return mNotificationConversationActionTypesDefault;
294 }
295
Abodunrinwa Tokia77dba62019-01-25 19:27:11 +0000296 public float getLangIdThresholdOverride() {
297 return mLangIdThresholdOverride;
298 }
299
Tony Makfc039c32019-01-17 19:32:08 +0000300 public boolean isTemplateIntentFactoryEnabled() {
301 return mTemplateIntentFactoryEnabled;
302 }
303
Abodunrinwa Tokia77dba62019-01-25 19:27:11 +0000304 private static List<String> parseStringList(String listStr) {
305 return Collections.unmodifiableList(Arrays.asList(listStr.split(STRING_LIST_DELIMITER)));
Jan Althaus0aacdb62018-02-19 11:44:37 +0100306 }
Tony Makf93e9e52018-07-16 14:46:29 +0200307
308 void dump(IndentingPrintWriter pw) {
309 pw.println("TextClassificationConstants:");
310 pw.increaseIndent();
311 pw.printPair("isLocalTextClassifierEnabled", mLocalTextClassifierEnabled);
312 pw.printPair("isSystemTextClassifierEnabled", mSystemTextClassifierEnabled);
313 pw.printPair("isModelDarkLaunchEnabled", mModelDarkLaunchEnabled);
314 pw.printPair("isSmartSelectionEnabled", mSmartSelectionEnabled);
315 pw.printPair("isSmartTextShareEnabled", mSmartTextShareEnabled);
316 pw.printPair("isSmartLinkifyEnabled", mSmartLinkifyEnabled);
317 pw.printPair("isSmartSelectionAnimationEnabled", mSmartSelectionAnimationEnabled);
318 pw.printPair("getSuggestSelectionMaxRangeLength", mSuggestSelectionMaxRangeLength);
319 pw.printPair("getClassifyTextMaxRangeLength", mClassifyTextMaxRangeLength);
320 pw.printPair("getGenerateLinksMaxTextLength", mGenerateLinksMaxTextLength);
321 pw.printPair("getGenerateLinksLogSampleRate", mGenerateLinksLogSampleRate);
322 pw.printPair("getEntityListDefault", mEntityListDefault);
323 pw.printPair("getEntityListNotEditable", mEntityListNotEditable);
324 pw.printPair("getEntityListEditable", mEntityListEditable);
Tony Makadbebcc2018-10-30 18:59:06 +0000325 pw.printPair("getInAppConversationActionTypes", mInAppConversationActionTypesDefault);
326 pw.printPair("getNotificationConversationActionTypes",
327 mNotificationConversationActionTypesDefault);
Abodunrinwa Tokia77dba62019-01-25 19:27:11 +0000328 pw.printPair("getLangIdThresholdOverride", mLangIdThresholdOverride);
Tony Makfc039c32019-01-17 19:32:08 +0000329 pw.printPair("isTemplateIntentFactoryEnabled", mTemplateIntentFactoryEnabled);
Tony Makf93e9e52018-07-16 14:46:29 +0200330 pw.decreaseIndent();
331 pw.println();
332 }
Abodunrinwa Toki0e6b43e2017-09-19 23:18:40 +0100333}