Separate "Keyboard" from "Language & input"
1. Separate "Keyboard" from "Language & input". 2. Use FeatureFlagUtils.SETTINGS_NEW_KEYBOARD_UI to control the different UI until Settings launches the new UI design. Bug: 242680328 Test: local test Change-Id: Id1ea6d3e3c2e6b83bc4b4d835c6b27e31311c530
This commit is contained in:
@@ -909,6 +909,46 @@
|
||||
android:value="true"/>
|
||||
</activity>
|
||||
|
||||
<activity
|
||||
android:name=".Settings$LanguageSettingsActivity"
|
||||
android:label="@string/languages_settings"
|
||||
android:exported="true"
|
||||
android:icon="@drawable/ic_settings_languages">
|
||||
<intent-filter>
|
||||
<action android:name="android.settings.LANGUAGE_SETTINGS"/>
|
||||
<category android:name="android.intent.category.DEFAULT"/>
|
||||
</intent-filter>
|
||||
<intent-filter>
|
||||
<action android:name="android.intent.action.MAIN"/>
|
||||
<category android:name="android.intent.category.VOICE_LAUNCH"/>
|
||||
<category android:name="android.intent.category.DEFAULT"/>
|
||||
</intent-filter>
|
||||
<meta-data android:name="com.android.settings.FRAGMENT_CLASS"
|
||||
android:value="com.android.settings.language.LanguageSettings"/>
|
||||
<meta-data android:name="com.android.settings.HIGHLIGHT_MENU_KEY"
|
||||
android:value="@string/menu_key_system"/>
|
||||
<meta-data android:name="com.android.settings.PRIMARY_PROFILE_CONTROLLED"
|
||||
android:value="true"/>
|
||||
</activity>
|
||||
|
||||
<activity
|
||||
android:name=".Settings$KeyboardSettingsActivity"
|
||||
android:label="@string/keyboard_settings"
|
||||
android:exported="true"
|
||||
android:icon="@drawable/ic_settings_language">
|
||||
<intent-filter>
|
||||
<action android:name="android.intent.action.MAIN"/>
|
||||
<category android:name="android.intent.category.VOICE_LAUNCH"/>
|
||||
<category android:name="android.intent.category.DEFAULT"/>
|
||||
</intent-filter>
|
||||
<meta-data android:name="com.android.settings.FRAGMENT_CLASS"
|
||||
android:value="com.android.settings.inputmethod.KeyboardSettings"/>
|
||||
<meta-data android:name="com.android.settings.HIGHLIGHT_MENU_KEY"
|
||||
android:value="@string/menu_key_system"/>
|
||||
<meta-data android:name="com.android.settings.PRIMARY_PROFILE_CONTROLLED"
|
||||
android:value="true"/>
|
||||
</activity>
|
||||
|
||||
<activity android:name="Settings$AvailableVirtualKeyboardActivity"
|
||||
android:exported="true"
|
||||
android:label="@string/available_virtual_keyboard_category">
|
||||
|
25
res/drawable/ic_settings_keyboards.xml
Normal file
25
res/drawable/ic_settings_keyboards.xml
Normal file
@@ -0,0 +1,25 @@
|
||||
<!--
|
||||
Copyright (C) 2022 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.
|
||||
-->
|
||||
<vector xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
android:width="24.0dp"
|
||||
android:height="24.0dp"
|
||||
android:viewportWidth="24.0"
|
||||
android:viewportHeight="24.0"
|
||||
android:tint="?android:attr/colorControlNormal">
|
||||
<path
|
||||
android:fillColor="@android:color/white"
|
||||
android:pathData="M4,19Q3.175,19 2.588,18.413Q2,17.825 2,17V7Q2,6.175 2.588,5.588Q3.175,5 4,5H20Q20.825,5 21.413,5.588Q22,6.175 22,7V17Q22,17.825 21.413,18.413Q20.825,19 20,19ZM4,17H20Q20,17 20,17Q20,17 20,17V7Q20,7 20,7Q20,7 20,7H4Q4,7 4,7Q4,7 4,7V17Q4,17 4,17Q4,17 4,17ZM8,16H16V14H8ZM5,13H7V11H5ZM8,13H10V11H8ZM11,13H13V11H11ZM14,13H16V11H14ZM17,13H19V11H17ZM5,10H7V8H5ZM8,10H10V8H8ZM11,10H13V8H11ZM14,10H16V8H14ZM17,10H19V8H17ZM4,17Q4,17 4,17Q4,17 4,17V7Q4,7 4,7Q4,7 4,7Q4,7 4,7Q4,7 4,7V17Q4,17 4,17Q4,17 4,17Z"/>
|
||||
</vector>
|
25
res/drawable/ic_settings_languages.xml
Normal file
25
res/drawable/ic_settings_languages.xml
Normal file
@@ -0,0 +1,25 @@
|
||||
<!--
|
||||
Copyright (C) 2022 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.
|
||||
-->
|
||||
<vector xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
android:width="24.0dp"
|
||||
android:height="24.0dp"
|
||||
android:viewportWidth="24.0"
|
||||
android:viewportHeight="24.0"
|
||||
android:tint="?android:attr/colorControlNormal">
|
||||
<path
|
||||
android:fillColor="@android:color/white"
|
||||
android:pathData="M11.9,22 L16.45,10H18.55L23.1,22H21L19.95,18.95H15.1L14,22ZM15.7,17.2H19.3L17.55,12.25H17.45ZM4,19 L2.6,17.6 7.65,12.55Q6.7,11.5 5.988,10.375Q5.275,9.25 4.75,8H6.85Q7.3,8.9 7.813,9.625Q8.325,10.35 9.05,11.15Q10.15,9.95 10.875,8.688Q11.6,7.425 12.1,6H1V4H8V2H10V4H17V6H14.1Q13.575,7.775 12.675,9.45Q11.775,11.125 10.45,12.6L12.85,15.05L12.1,17.1L9,14Z"/>
|
||||
</vector>
|
@@ -4924,6 +4924,10 @@
|
||||
|
||||
<!-- Title of setting on main settings screen. This item will take the user to the screen to tweak settings realted to locale and text -->
|
||||
<string name="language_settings">Languages & input</string>
|
||||
<!-- Title of setting on main settings screen. This item will take the user to the screen to tweak settings related to languages -->
|
||||
<string name="languages_settings">Languages</string>
|
||||
<!-- Title of setting on main settings screen. This item will take the user to the screen to tweak settings related to keyboards -->
|
||||
<string name="keyboard_settings">Keyboard</string>
|
||||
<!-- Text displayed when user has restriction DISALLOW_CONFIG_LOCALE [CHAR LIMIT=NONE]-->
|
||||
<string name="language_empty_list_user_restricted">You don\u2019t have permission to change the device language.</string>
|
||||
<!-- Title of Languages & input settings screen -->
|
||||
@@ -4932,6 +4936,8 @@
|
||||
<string name="input_assistance">Tools</string>
|
||||
<!-- On Languages & input settings screen, heading. Inside the "Languages & input settings" screen, this is the header for settings that relate to keyboard (enable/disable each keyboard, settings for each keyboard). -->
|
||||
<string name="keyboard_settings_category">Keyboard & input methods</string>
|
||||
<!-- On Languages settings screen, setting option name. title of the setting to take the user to a screen to select the locale. -->
|
||||
<string name="system_language">System Languages</string>
|
||||
<!-- On Text & language settings screen, setting option name. title of the setting to take the user to a screen to select the locale. -->
|
||||
<string name="phone_language">Languages</string>
|
||||
<!-- On Text & language settings screen, setting option name. summary of the setting to take the user to a screen to select the locale. -->
|
||||
@@ -5099,6 +5105,10 @@
|
||||
<string name="input_methods_and_subtype_enabler_title">Choose active input methods</string>
|
||||
<!-- Summary for on-screen keyboard settings -->
|
||||
<string name="onscreen_keyboard_settings_summary">Onscreen keyboard settings</string>
|
||||
<!-- Summary for default keyboard settings -->
|
||||
<string name="keyboard_settings_summary">On-screen keyboard, Speech, Tools</string>
|
||||
<!-- Summary for keyboard settings attaching physical_keyboard -->
|
||||
<string name="keyboard_settings_with_physical_keyboard_summary">On-screen keyboard, Physical keyboard, Speech, Tools</string>
|
||||
<!-- Title for built-in keyboard settings -->
|
||||
<string name="builtin_keyboard_settings_title">Physical keyboard</string>
|
||||
<!-- Summary for built-in keyboard settings -->
|
||||
@@ -8025,8 +8035,10 @@
|
||||
<!-- Title for setting tile leading to setting UI which allows user set default app to
|
||||
handle actions such as open web page, making phone calls, default SMS apps [CHAR LIMIT=40]-->
|
||||
<string name="app_default_dashboard_title">Default apps</string>
|
||||
<!-- Summary text for system preference tile, showing important setting items under system setting [CHAR LIMIT=NONE]-->
|
||||
<!-- Summary text for system preference title, showing important setting items under system setting [CHAR LIMIT=NONE]-->
|
||||
<string name="system_dashboard_summary">Languages, gestures, time, backup</string>
|
||||
<!-- Summary text for language preference title, showing important setting items under language setting [CHAR LIMIT=NONE]-->
|
||||
<string name="languages_setting_summary">System languages, app languages</string>
|
||||
|
||||
<!-- Search strings -->
|
||||
<!-- Text to describe the search results fragment title [CHAR LIMIT=16] -->
|
||||
|
108
res/xml/keyboard_settings.xml
Normal file
108
res/xml/keyboard_settings.xml
Normal file
@@ -0,0 +1,108 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<!--
|
||||
Copyright (C) 2022 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.
|
||||
-->
|
||||
|
||||
<PreferenceScreen
|
||||
xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
xmlns:settings="http://schemas.android.com/apk/res-auto"
|
||||
android:title="@string/keyboard_settings">
|
||||
<PreferenceCategory
|
||||
android:key="keyboards_category"
|
||||
android:title="@string/keyboard_and_input_methods_category">
|
||||
<Preference
|
||||
android:key="virtual_keyboard_pref"
|
||||
android:title="@string/virtual_keyboard_category"
|
||||
android:fragment="com.android.settings.inputmethod.AvailableVirtualKeyboardFragment"
|
||||
settings:keywords="@string/keywords_virtual_keyboard"/>
|
||||
|
||||
<Preference
|
||||
android:key="physical_keyboard_pref"
|
||||
android:title="@string/physical_keyboard_title"
|
||||
android:summary="@string/summary_placeholder"
|
||||
android:fragment="com.android.settings.inputmethod.PhysicalKeyboardFragment"/>
|
||||
</PreferenceCategory>
|
||||
|
||||
<PreferenceCategory
|
||||
android:key="speech_category"
|
||||
android:title="@string/speech_category_title">
|
||||
<com.android.settings.widget.GearPreference
|
||||
android:key="voice_input_settings"
|
||||
android:title="@string/voice_input_settings_title"
|
||||
android:fragment="com.android.settings.language.DefaultVoiceInputPicker" />
|
||||
|
||||
<Preference
|
||||
android:key="tts_settings_summary"
|
||||
android:title="@string/tts_settings_title"
|
||||
android:fragment="com.android.settings.tts.TextToSpeechSettings"
|
||||
settings:searchable="false"/>
|
||||
</PreferenceCategory>
|
||||
|
||||
<PreferenceCategory
|
||||
android:key="input_assistance_category"
|
||||
android:title="@string/input_assistance">
|
||||
<!-- Spell checker preference title, summary and fragment will be set programmatically. -->
|
||||
<!-- Note: Mark this as persistent="false" to remove unnecessarily saved shared preference.
|
||||
See: InputMethodAndSubtypeUtil.removeUnnecessaryNonPersistentPreference. -->
|
||||
<Preference
|
||||
android:key="spellcheckers_settings"
|
||||
android:title="@string/spellcheckers_settings_title"
|
||||
android:persistent="false"
|
||||
android:fragment="com.android.settings.inputmethod.SpellCheckersSettings" />
|
||||
|
||||
<!-- User dictionary preference title and fragment will be set programmatically. -->
|
||||
<Preference
|
||||
android:key="key_user_dictionary_settings"
|
||||
android:title="@string/user_dict_settings_title"
|
||||
android:summary="@string/user_dict_settings_summary"
|
||||
android:fragment="com.android.settings.inputmethod.UserDictionaryList"
|
||||
settings:controller="com.android.settings.language.UserDictionaryPreferenceController" />
|
||||
</PreferenceCategory>
|
||||
|
||||
<PreferenceCategory
|
||||
android:key="pointer_category"
|
||||
android:layout="@layout/preference_category_no_label">
|
||||
<com.android.settings.PointerSpeedPreference
|
||||
android:key="pointer_speed"
|
||||
android:title="@string/pointer_speed"
|
||||
android:dialogTitle="@string/pointer_speed" />
|
||||
</PreferenceCategory>
|
||||
|
||||
<SwitchPreference
|
||||
android:key="vibrate_input_devices"
|
||||
android:title="@string/vibrate_input_devices"
|
||||
android:summary="@string/vibrate_input_devices_summary"
|
||||
settings:controller="com.android.settings.inputmethod.GameControllerPreferenceController" />
|
||||
|
||||
<com.android.settings.widget.WorkOnlyCategory
|
||||
android:key="language_and_input_for_work_category"
|
||||
android:title="@string/language_and_input_for_work_category_title"
|
||||
settings:searchable="false">
|
||||
|
||||
<Preference
|
||||
android:key="spellcheckers_settings_for_work_pref"
|
||||
android:title="@string/spellcheckers_settings_for_work_title"
|
||||
android:fragment="com.android.settings.inputmethod.SpellCheckersSettings"
|
||||
settings:forWork="true"
|
||||
settings:controller="com.android.settings.core.WorkPreferenceController" />
|
||||
|
||||
<Preference
|
||||
android:key="user_dictionary_settings_for_work_pref"
|
||||
android:title="@string/user_dict_settings_for_work_title"
|
||||
android:fragment="com.android.settings.inputmethod.UserDictionaryList"
|
||||
settings:forWork="true"
|
||||
settings:controller="com.android.settings.inputmethod.SpellCheckerForWorkPreferenceController" />
|
||||
</com.android.settings.widget.WorkOnlyCategory>
|
||||
</PreferenceScreen>
|
@@ -25,7 +25,8 @@
|
||||
<Preference
|
||||
android:key="phone_language"
|
||||
android:title="@string/phone_language"
|
||||
android:fragment="com.android.settings.localepicker.LocaleListEditor" />
|
||||
android:fragment="com.android.settings.localepicker.LocaleListEditor"
|
||||
settings:controller="com.android.settings.language.PhoneLanguagePreferenceController" />
|
||||
|
||||
<Preference
|
||||
android:key="apps_language"
|
||||
|
41
res/xml/language_settings.xml
Normal file
41
res/xml/language_settings.xml
Normal file
@@ -0,0 +1,41 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<!--
|
||||
Copyright (C) 2022 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.
|
||||
-->
|
||||
|
||||
<PreferenceScreen
|
||||
xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
xmlns:settings="http://schemas.android.com/apk/res-auto"
|
||||
android:title="@string/languages_settings">
|
||||
<PreferenceCategory
|
||||
android:key="languages_category"
|
||||
android:title="@string/locale_picker_category_title">
|
||||
<Preference
|
||||
android:key="phone_language"
|
||||
android:title="@string/system_language"
|
||||
android:fragment="com.android.settings.localepicker.LocaleListEditor"
|
||||
settings:controller="com.android.settings.language.PhoneLanguagePreferenceController" />
|
||||
<Preference
|
||||
android:key="apps_language"
|
||||
android:title="@string/app_locales_picker_menu_title"
|
||||
android:summary="@string/app_locale_picker_summary"
|
||||
android:fragment="com.android.settings.applications.manageapplications.ManageApplications"
|
||||
settings:controller="com.android.settings.applications.appinfo.ManageAppLocalePreferenceController">
|
||||
<extra
|
||||
android:name="classname"
|
||||
android:value="com.android.settings.applications.appinfo.AppLocaleDetails" />
|
||||
</Preference>
|
||||
</PreferenceCategory>
|
||||
</PreferenceScreen>
|
@@ -39,4 +39,4 @@
|
||||
android:selectable="false"
|
||||
settings:controller="com.android.settings.localepicker.LocaleHelperPreferenceController"/>
|
||||
|
||||
</PreferenceScreen>
|
||||
</PreferenceScreen>
|
@@ -25,7 +25,25 @@
|
||||
android:title="@string/language_settings"
|
||||
android:icon="@drawable/ic_settings_language"
|
||||
android:order="-260"
|
||||
android:fragment="com.android.settings.language.LanguageAndInputSettings"/>
|
||||
android:fragment="com.android.settings.language.LanguageAndInputSettings"
|
||||
settings:controller="com.android.settings.language.LanguageAndInputPreferenceController"/>
|
||||
|
||||
<Preference
|
||||
android:key="language_settings"
|
||||
android:title="@string/languages_settings"
|
||||
android:summary="@string/languages_setting_summary"
|
||||
android:icon="@drawable/ic_settings_languages"
|
||||
android:order="-260"
|
||||
android:fragment="com.android.settings.language.LanguageSettings"
|
||||
settings:controller="com.android.settings.language.LanguagePreferenceController"/>
|
||||
|
||||
<Preference
|
||||
android:key="Keyboard_settings"
|
||||
android:title="@string/keyboard_settings"
|
||||
android:icon="@drawable/ic_settings_keyboards"
|
||||
android:order="-255"
|
||||
android:fragment="com.android.settings.inputmethod.KeyboardSettings"
|
||||
settings:controller="com.android.settings.inputmethod.KeyboardPreferenceController"/>
|
||||
|
||||
<Preference
|
||||
android:key="gesture_settings"
|
||||
|
@@ -111,6 +111,8 @@ public class Settings extends SettingsActivity {
|
||||
public static class SpellCheckersSettingsActivity extends SettingsActivity { /* empty */ }
|
||||
public static class LocalePickerActivity extends SettingsActivity { /* empty */ }
|
||||
public static class LanguageAndInputSettingsActivity extends SettingsActivity { /* empty */ }
|
||||
public static class LanguageSettingsActivity extends SettingsActivity { /* empty */ }
|
||||
public static class KeyboardSettingsActivity extends SettingsActivity { /* empty */ }
|
||||
public static class UserDictionarySettingsActivity extends SettingsActivity { /* empty */ }
|
||||
public static class DarkThemeSettingsActivity extends SettingsActivity { /* empty */ }
|
||||
public static class DisplaySettingsActivity extends SettingsActivity { /* empty */ }
|
||||
|
@@ -115,11 +115,13 @@ import com.android.settings.gestures.SwipeToNotificationSettings;
|
||||
import com.android.settings.gestures.SystemNavigationGestureSettings;
|
||||
import com.android.settings.inputmethod.AvailableVirtualKeyboardFragment;
|
||||
import com.android.settings.inputmethod.KeyboardLayoutPickerFragment;
|
||||
import com.android.settings.inputmethod.KeyboardSettings;
|
||||
import com.android.settings.inputmethod.PhysicalKeyboardFragment;
|
||||
import com.android.settings.inputmethod.SpellCheckersSettings;
|
||||
import com.android.settings.inputmethod.UserDictionaryList;
|
||||
import com.android.settings.inputmethod.UserDictionarySettings;
|
||||
import com.android.settings.language.LanguageAndInputSettings;
|
||||
import com.android.settings.language.LanguageSettings;
|
||||
import com.android.settings.localepicker.LocaleListEditor;
|
||||
import com.android.settings.location.LocationServices;
|
||||
import com.android.settings.location.LocationSettings;
|
||||
@@ -205,6 +207,8 @@ public class SettingsGateway {
|
||||
LocaleListEditor.class.getName(),
|
||||
AvailableVirtualKeyboardFragment.class.getName(),
|
||||
LanguageAndInputSettings.class.getName(),
|
||||
LanguageSettings.class.getName(),
|
||||
KeyboardSettings.class.getName(),
|
||||
SpellCheckersSettings.class.getName(),
|
||||
UserDictionaryList.class.getName(),
|
||||
UserDictionarySettings.class.getName(),
|
||||
@@ -383,6 +387,8 @@ public class SettingsGateway {
|
||||
Settings.LocationSettingsActivity.class.getName(),
|
||||
// Home page > System
|
||||
Settings.LanguageAndInputSettingsActivity.class.getName(),
|
||||
Settings.LanguageSettingsActivity.class.getName(),
|
||||
Settings.KeyboardSettingsActivity.class.getName(),
|
||||
Settings.DateTimeSettingsActivity.class.getName(),
|
||||
Settings.EnterprisePrivacySettingsActivity.class.getName(),
|
||||
Settings.MyDeviceInfoActivity.class.getName(),
|
||||
|
@@ -101,6 +101,7 @@ public class DashboardFragmentRegistry {
|
||||
SystemDashboardFragment.class.getName(), CategoryKey.CATEGORY_SYSTEM);
|
||||
PARENT_TO_CATEGORY_KEY_MAP.put(LanguageAndInputSettings.class.getName(),
|
||||
CategoryKey.CATEGORY_SYSTEM_LANGUAGE);
|
||||
// TODO(b/242680328) Tie new category key to LanguageSettings and KeyboardSettings page
|
||||
PARENT_TO_CATEGORY_KEY_MAP.put(DevelopmentSettingsDashboardFragment.class.getName(),
|
||||
CategoryKey.CATEGORY_SYSTEM_DEVELOPMENT);
|
||||
PARENT_TO_CATEGORY_KEY_MAP.put(ConfigureNotificationSettings.class.getName(),
|
||||
|
@@ -0,0 +1,95 @@
|
||||
/*
|
||||
* Copyright (C) 2022 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 com.android.settings.inputmethod;
|
||||
|
||||
import android.content.Context;
|
||||
import android.hardware.input.InputManager;
|
||||
import android.util.FeatureFlagUtils;
|
||||
|
||||
import androidx.preference.Preference;
|
||||
|
||||
import com.android.settings.R;
|
||||
import com.android.settings.core.BasePreferenceController;
|
||||
import com.android.settings.core.PreferenceControllerMixin;
|
||||
import com.android.settings.inputmethod.PhysicalKeyboardFragment.HardKeyboardDeviceInfo;
|
||||
import com.android.settingslib.core.lifecycle.LifecycleObserver;
|
||||
import com.android.settingslib.core.lifecycle.events.OnPause;
|
||||
import com.android.settingslib.core.lifecycle.events.OnResume;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
public class KeyboardPreferenceController extends BasePreferenceController
|
||||
implements PreferenceControllerMixin, LifecycleObserver, OnResume, OnPause,
|
||||
InputManager.InputDeviceListener {
|
||||
|
||||
private final InputManager mIm;
|
||||
|
||||
private Preference mPreference;
|
||||
|
||||
public KeyboardPreferenceController(Context context, String key) {
|
||||
super(context, key);
|
||||
mIm = context.getSystemService(InputManager.class);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onInputDeviceAdded(int deviceId) {
|
||||
updateSummary();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onInputDeviceRemoved(int deviceId) {
|
||||
updateSummary();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onInputDeviceChanged(int deviceId) {
|
||||
updateSummary();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onPause() {
|
||||
mIm.unregisterInputDeviceListener(this);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onResume() {
|
||||
mIm.registerInputDeviceListener(this, null);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void updateState(Preference preference) {
|
||||
mPreference = preference;
|
||||
updateSummary();
|
||||
}
|
||||
|
||||
@Override
|
||||
public int getAvailabilityStatus() {
|
||||
boolean isFeatureOn = FeatureFlagUtils
|
||||
.isEnabled(mContext, FeatureFlagUtils.SETTINGS_NEW_KEYBOARD_UI);
|
||||
return isFeatureOn ? AVAILABLE : CONDITIONALLY_UNAVAILABLE;
|
||||
}
|
||||
|
||||
private void updateSummary() {
|
||||
final List<HardKeyboardDeviceInfo> keyboards =
|
||||
PhysicalKeyboardFragment.getHardKeyboards(mContext);
|
||||
if (keyboards.isEmpty()) {
|
||||
mPreference.setSummary(R.string.keyboard_settings_summary);
|
||||
} else {
|
||||
mPreference.setSummary(R.string.keyboard_settings_with_physical_keyboard_summary);
|
||||
}
|
||||
}
|
||||
}
|
136
src/com/android/settings/inputmethod/KeyboardSettings.java
Normal file
136
src/com/android/settings/inputmethod/KeyboardSettings.java
Normal file
@@ -0,0 +1,136 @@
|
||||
/*
|
||||
* Copyright (C) 2022 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 com.android.settings.inputmethod;
|
||||
|
||||
import static android.app.admin.DevicePolicyResources.Strings.Settings.PERSONAL_DICTIONARY_FOR_WORK;
|
||||
import static android.app.admin.DevicePolicyResources.Strings.Settings.SPELL_CHECKER_FOR_WORK;
|
||||
import static android.app.admin.DevicePolicyResources.Strings.Settings.WORK_PROFILE_KEYBOARDS_AND_TOOLS;
|
||||
|
||||
import android.app.settings.SettingsEnums;
|
||||
import android.content.Context;
|
||||
import android.os.Bundle;
|
||||
import android.util.FeatureFlagUtils;
|
||||
|
||||
import androidx.annotation.NonNull;
|
||||
import androidx.annotation.Nullable;
|
||||
|
||||
import com.android.settings.R;
|
||||
import com.android.settings.dashboard.DashboardFragment;
|
||||
import com.android.settings.language.DefaultVoiceInputPreferenceController;
|
||||
import com.android.settings.language.PointerSpeedController;
|
||||
import com.android.settings.language.TtsPreferenceController;
|
||||
import com.android.settings.search.BaseSearchIndexProvider;
|
||||
import com.android.settings.widget.PreferenceCategoryController;
|
||||
import com.android.settingslib.core.AbstractPreferenceController;
|
||||
import com.android.settingslib.core.lifecycle.Lifecycle;
|
||||
import com.android.settingslib.search.SearchIndexable;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.Arrays;
|
||||
import java.util.List;
|
||||
|
||||
@SearchIndexable
|
||||
public class KeyboardSettings extends DashboardFragment {
|
||||
|
||||
private static final String TAG = "KeyboardSettings";
|
||||
|
||||
private static final String KEY_KEYBOARDS_CATEGORY = "keyboards_category";
|
||||
private static final String KEY_SPEECH_CATEGORY = "speech_category";
|
||||
private static final String KEY_TEXT_TO_SPEECH = "tts_settings_summary";
|
||||
private static final String KEY_POINTER_CATEGORY = "pointer_category";
|
||||
|
||||
@Override
|
||||
public int getMetricsCategory() {
|
||||
return SettingsEnums.SETTINGS_KEYBOARDS_CATEGORY;
|
||||
}
|
||||
|
||||
@Override
|
||||
protected String getLogTag() {
|
||||
return TAG;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onCreate(Bundle icicle) {
|
||||
super.onCreate(icicle);
|
||||
replaceEnterpriseStringTitle("language_and_input_for_work_category",
|
||||
WORK_PROFILE_KEYBOARDS_AND_TOOLS,
|
||||
R.string.language_and_input_for_work_category_title);
|
||||
replaceEnterpriseStringTitle("spellcheckers_settings_for_work_pref",
|
||||
SPELL_CHECKER_FOR_WORK,
|
||||
R.string.spellcheckers_settings_for_work_title);
|
||||
replaceEnterpriseStringTitle("user_dictionary_settings_for_work_pref",
|
||||
PERSONAL_DICTIONARY_FOR_WORK,
|
||||
R.string.user_dict_settings_for_work_title);
|
||||
}
|
||||
|
||||
@Override
|
||||
protected int getPreferenceScreenResId() {
|
||||
return R.xml.keyboard_settings;
|
||||
}
|
||||
|
||||
@Override
|
||||
protected List<AbstractPreferenceController> createPreferenceControllers(Context context) {
|
||||
return buildPreferenceControllers(context, getSettingsLifecycle());
|
||||
}
|
||||
|
||||
private static List<AbstractPreferenceController> buildPreferenceControllers(
|
||||
@NonNull Context context, @Nullable Lifecycle lifecycle) {
|
||||
final List<AbstractPreferenceController> controllers = new ArrayList<>();
|
||||
// Input
|
||||
final VirtualKeyboardPreferenceController virtualKeyboardPreferenceController =
|
||||
new VirtualKeyboardPreferenceController(context);
|
||||
final PhysicalKeyboardPreferenceController physicalKeyboardPreferenceController =
|
||||
new PhysicalKeyboardPreferenceController(context, lifecycle);
|
||||
controllers.add(virtualKeyboardPreferenceController);
|
||||
controllers.add(physicalKeyboardPreferenceController);
|
||||
controllers.add(new PreferenceCategoryController(context,
|
||||
KEY_KEYBOARDS_CATEGORY).setChildren(
|
||||
Arrays.asList(virtualKeyboardPreferenceController,
|
||||
physicalKeyboardPreferenceController)));
|
||||
|
||||
// Speech
|
||||
final DefaultVoiceInputPreferenceController defaultVoiceInputPreferenceController =
|
||||
new DefaultVoiceInputPreferenceController(context, lifecycle);
|
||||
final TtsPreferenceController ttsPreferenceController =
|
||||
new TtsPreferenceController(context, KEY_TEXT_TO_SPEECH);
|
||||
controllers.add(defaultVoiceInputPreferenceController);
|
||||
controllers.add(ttsPreferenceController);
|
||||
controllers.add(new PreferenceCategoryController(context,
|
||||
KEY_SPEECH_CATEGORY).setChildren(
|
||||
Arrays.asList(defaultVoiceInputPreferenceController, ttsPreferenceController)));
|
||||
|
||||
// Pointer
|
||||
final PointerSpeedController pointerController = new PointerSpeedController(context);
|
||||
controllers.add(pointerController);
|
||||
controllers.add(new PreferenceCategoryController(context,
|
||||
KEY_POINTER_CATEGORY).setChildren(Arrays.asList(pointerController)));
|
||||
|
||||
// Input Assistance
|
||||
controllers.add(new SpellCheckerPreferenceController(context));
|
||||
|
||||
return controllers;
|
||||
}
|
||||
|
||||
public static final BaseSearchIndexProvider SEARCH_INDEX_DATA_PROVIDER =
|
||||
new BaseSearchIndexProvider(R.xml.keyboard_settings) {
|
||||
@Override
|
||||
protected boolean isPageSearchEnabled(Context context) {
|
||||
return FeatureFlagUtils
|
||||
.isEnabled(context, FeatureFlagUtils.SETTINGS_NEW_KEYBOARD_UI);
|
||||
}
|
||||
};
|
||||
}
|
@@ -21,6 +21,7 @@ import android.content.Context;
|
||||
import android.content.pm.PackageManager;
|
||||
import android.provider.Settings;
|
||||
import android.text.TextUtils;
|
||||
import android.util.FeatureFlagUtils;
|
||||
import android.view.inputmethod.InputMethodInfo;
|
||||
import android.view.inputmethod.InputMethodManager;
|
||||
|
||||
@@ -41,7 +42,9 @@ public class LanguageAndInputPreferenceController extends BasePreferenceControll
|
||||
|
||||
@Override
|
||||
public int getAvailabilityStatus() {
|
||||
return AVAILABLE;
|
||||
boolean isFeatureOn = FeatureFlagUtils
|
||||
.isEnabled(mContext, FeatureFlagUtils.SETTINGS_NEW_KEYBOARD_UI);
|
||||
return isFeatureOn ? CONDITIONALLY_UNAVAILABLE : AVAILABLE;
|
||||
}
|
||||
|
||||
@Override
|
||||
|
@@ -24,6 +24,7 @@ import android.app.Activity;
|
||||
import android.app.settings.SettingsEnums;
|
||||
import android.content.Context;
|
||||
import android.os.Bundle;
|
||||
import android.util.FeatureFlagUtils;
|
||||
|
||||
import androidx.annotation.NonNull;
|
||||
import androidx.annotation.Nullable;
|
||||
@@ -104,8 +105,6 @@ public class LanguageAndInputSettings extends DashboardFragment {
|
||||
private static List<AbstractPreferenceController> buildPreferenceControllers(
|
||||
@NonNull Context context, @Nullable Lifecycle lifecycle) {
|
||||
final List<AbstractPreferenceController> controllers = new ArrayList<>();
|
||||
// Language
|
||||
controllers.add(new PhoneLanguagePreferenceController(context));
|
||||
|
||||
// Input
|
||||
final VirtualKeyboardPreferenceController virtualKeyboardPreferenceController =
|
||||
@@ -154,11 +153,16 @@ public class LanguageAndInputSettings extends DashboardFragment {
|
||||
|
||||
public static final BaseSearchIndexProvider SEARCH_INDEX_DATA_PROVIDER =
|
||||
new BaseSearchIndexProvider(R.xml.language_and_input) {
|
||||
|
||||
@Override
|
||||
public List<AbstractPreferenceController> createPreferenceControllers(
|
||||
Context context) {
|
||||
return buildPreferenceControllers(context, null);
|
||||
}
|
||||
|
||||
@Override
|
||||
protected boolean isPageSearchEnabled(Context context) {
|
||||
return !FeatureFlagUtils
|
||||
.isEnabled(context, FeatureFlagUtils.SETTINGS_NEW_KEYBOARD_UI);
|
||||
}
|
||||
};
|
||||
}
|
||||
|
@@ -0,0 +1,36 @@
|
||||
/*
|
||||
* Copyright (C) 2022 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 com.android.settings.language;
|
||||
|
||||
import android.content.Context;
|
||||
import android.util.FeatureFlagUtils;
|
||||
|
||||
import com.android.settings.core.BasePreferenceController;
|
||||
|
||||
public class LanguagePreferenceController extends BasePreferenceController {
|
||||
|
||||
public LanguagePreferenceController(Context context, String key) {
|
||||
super(context, key);
|
||||
}
|
||||
|
||||
@Override
|
||||
public int getAvailabilityStatus() {
|
||||
boolean isFeatureOn = FeatureFlagUtils
|
||||
.isEnabled(mContext, FeatureFlagUtils.SETTINGS_NEW_KEYBOARD_UI);
|
||||
return isFeatureOn ? AVAILABLE : CONDITIONALLY_UNAVAILABLE;
|
||||
}
|
||||
}
|
70
src/com/android/settings/language/LanguageSettings.java
Normal file
70
src/com/android/settings/language/LanguageSettings.java
Normal file
@@ -0,0 +1,70 @@
|
||||
/*
|
||||
* Copyright (C) 2022 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 com.android.settings.language;
|
||||
|
||||
import android.app.Activity;
|
||||
import android.app.settings.SettingsEnums;
|
||||
import android.content.Context;
|
||||
import android.util.FeatureFlagUtils;
|
||||
|
||||
import com.android.settings.R;
|
||||
import com.android.settings.dashboard.DashboardFragment;
|
||||
import com.android.settings.search.BaseSearchIndexProvider;
|
||||
import com.android.settingslib.search.SearchIndexable;
|
||||
|
||||
@SearchIndexable
|
||||
public class LanguageSettings extends DashboardFragment {
|
||||
|
||||
private static final String TAG = "LanguageSettings";
|
||||
|
||||
@Override
|
||||
public int getMetricsCategory() {
|
||||
return SettingsEnums.SETTINGS_LANGUAGES_CATEGORY;
|
||||
}
|
||||
|
||||
@Override
|
||||
protected String getLogTag() {
|
||||
return TAG;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onResume() {
|
||||
super.onResume();
|
||||
// Hack to update action bar title. It's necessary to refresh title because this page user
|
||||
// can change locale from here and fragment won't relaunch. Once language changes, title
|
||||
// must display in the new language.
|
||||
final Activity activity = getActivity();
|
||||
if (activity == null) {
|
||||
return;
|
||||
}
|
||||
activity.setTitle(R.string.languages_settings);
|
||||
}
|
||||
|
||||
@Override
|
||||
protected int getPreferenceScreenResId() {
|
||||
return R.xml.language_settings;
|
||||
}
|
||||
|
||||
public static final BaseSearchIndexProvider SEARCH_INDEX_DATA_PROVIDER =
|
||||
new BaseSearchIndexProvider(R.xml.language_settings) {
|
||||
@Override
|
||||
protected boolean isPageSearchEnabled(Context context) {
|
||||
return FeatureFlagUtils
|
||||
.isEnabled(context, FeatureFlagUtils.SETTINGS_NEW_KEYBOARD_UI);
|
||||
}
|
||||
};
|
||||
}
|
@@ -16,33 +16,32 @@
|
||||
|
||||
package com.android.settings.language;
|
||||
|
||||
import android.app.settings.SettingsEnums;
|
||||
import android.content.Context;
|
||||
|
||||
import androidx.preference.Preference;
|
||||
|
||||
import com.android.settings.R;
|
||||
import com.android.settings.core.BasePreferenceController;
|
||||
import com.android.settings.core.PreferenceControllerMixin;
|
||||
import com.android.settings.core.SubSettingLauncher;
|
||||
import com.android.settings.localepicker.LocaleListEditor;
|
||||
import com.android.settings.overlay.FeatureFactory;
|
||||
import com.android.settingslib.core.AbstractPreferenceController;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
public class PhoneLanguagePreferenceController extends AbstractPreferenceController
|
||||
public class PhoneLanguagePreferenceController extends BasePreferenceController
|
||||
implements PreferenceControllerMixin {
|
||||
|
||||
private static final String KEY_PHONE_LANGUAGE = "phone_language";
|
||||
|
||||
public PhoneLanguagePreferenceController(Context context) {
|
||||
super(context);
|
||||
public PhoneLanguagePreferenceController(Context context, String key) {
|
||||
super(context, key);
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isAvailable() {
|
||||
return mContext.getResources().getBoolean(R.bool.config_show_phone_language)
|
||||
&& mContext.getAssets().getLocales().length > 1;
|
||||
public int getAvailabilityStatus() {
|
||||
if (mContext.getResources().getBoolean(R.bool.config_show_phone_language)
|
||||
&& mContext.getAssets().getLocales().length > 1) {
|
||||
return AVAILABLE;
|
||||
} else {
|
||||
return CONDITIONALLY_UNAVAILABLE;
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -61,23 +60,4 @@ public class PhoneLanguagePreferenceController extends AbstractPreferenceControl
|
||||
// make search page look like there are duplicate result, creating confusion.
|
||||
keys.add(getPreferenceKey());
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getPreferenceKey() {
|
||||
return KEY_PHONE_LANGUAGE;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean handlePreferenceTreeClick(Preference preference) {
|
||||
if (!KEY_PHONE_LANGUAGE.equals(preference.getKey())) {
|
||||
return false;
|
||||
}
|
||||
new SubSettingLauncher(mContext)
|
||||
.setDestination(LocaleListEditor.class.getName())
|
||||
.setSourceMetricsCategory(SettingsEnums.SETTINGS_LANGUAGE_CATEGORY)
|
||||
.setTitleRes(R.string.language_picker_title)
|
||||
.launch();
|
||||
return true;
|
||||
}
|
||||
|
||||
}
|
||||
|
@@ -27,6 +27,7 @@ import android.content.res.AssetManager;
|
||||
|
||||
import androidx.preference.Preference;
|
||||
|
||||
import com.android.settings.core.BasePreferenceController;
|
||||
import com.android.settings.testutils.FakeFeatureFactory;
|
||||
|
||||
import org.junit.Before;
|
||||
@@ -59,7 +60,7 @@ public class PhoneLanguagePreferenceControllerTest {
|
||||
mContext = spy(RuntimeEnvironment.application);
|
||||
when(mContext.getAssets()).thenReturn(mAssets);
|
||||
mFeatureFactory = FakeFeatureFactory.setupForTest();
|
||||
mController = new PhoneLanguagePreferenceController(mContext);
|
||||
mController = new PhoneLanguagePreferenceController(mContext, "key");
|
||||
}
|
||||
|
||||
@Test
|
||||
@@ -76,6 +77,22 @@ public class PhoneLanguagePreferenceControllerTest {
|
||||
assertThat(mController.isAvailable()).isFalse();
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testGetAvailabilityStatus_hasMultipleLocales_returnAvailable() {
|
||||
when(mAssets.getLocales()).thenReturn(new String[] {"en", "de"});
|
||||
|
||||
assertThat(mController.getAvailabilityStatus())
|
||||
.isEqualTo(BasePreferenceController.AVAILABLE);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testGetAvailabilityStatus_hasSingleLocales_returnConditionallyUnavailable() {
|
||||
when(mAssets.getLocales()).thenReturn(new String[] {"en"});
|
||||
|
||||
assertThat(mController.getAvailabilityStatus())
|
||||
.isEqualTo(BasePreferenceController.CONDITIONALLY_UNAVAILABLE);
|
||||
}
|
||||
|
||||
@Test
|
||||
@Config(qualifiers = "mcc999")
|
||||
public void testIsAvailable_ifDisabled_shouldReturnFalse() {
|
||||
|
Reference in New Issue
Block a user