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:
danielwbhuang
2022-08-17 22:17:08 +08:00
parent 4d7259124c
commit c9cb6806f6
20 changed files with 660 additions and 40 deletions

View File

@@ -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">

View 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>

View 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>

View File

@@ -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&#160;&amp; 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 &amp; 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] -->

View 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>

View File

@@ -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"

View 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>

View File

@@ -39,4 +39,4 @@
android:selectable="false"
settings:controller="com.android.settings.localepicker.LocaleHelperPreferenceController"/>
</PreferenceScreen>
</PreferenceScreen>

View File

@@ -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"

View File

@@ -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 */ }

View File

@@ -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(),

View File

@@ -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(),

View File

@@ -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);
}
}
}

View 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);
}
};
}

View File

@@ -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

View File

@@ -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);
}
};
}

View File

@@ -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;
}
}

View 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);
}
};
}

View File

@@ -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;
}
}

View File

@@ -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() {