LanguageAndInputSettings.java revision c5655d4a5ebf9005c2d8ce85cdc32a452279ccf9
1/* 2 * Copyright (C) 2016 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 com.android.settings.language; 18 19import android.app.Activity; 20import android.content.ComponentName; 21import android.content.ContentResolver; 22import android.content.Context; 23import android.content.pm.PackageManager; 24import android.provider.SearchIndexableResource; 25import android.provider.Settings; 26import android.speech.tts.TtsEngines; 27import android.support.annotation.NonNull; 28import android.support.annotation.Nullable; 29import android.text.TextUtils; 30import android.view.inputmethod.InputMethodInfo; 31import android.view.inputmethod.InputMethodManager; 32 33import com.android.internal.logging.nano.MetricsProto; 34import com.android.settings.R; 35import com.android.settings.applications.defaultapps.DefaultAutofillPreferenceController; 36import com.android.settings.dashboard.DashboardFragment; 37import com.android.settings.dashboard.SummaryLoader; 38import com.android.settings.inputmethod.PhysicalKeyboardPreferenceController; 39import com.android.settings.inputmethod.SpellCheckerPreferenceController; 40import com.android.settings.inputmethod.VirtualKeyboardPreferenceController; 41import com.android.settings.search.BaseSearchIndexProvider; 42import com.android.settings.widget.PreferenceCategoryController; 43import com.android.settingslib.core.AbstractPreferenceController; 44import com.android.settingslib.core.lifecycle.Lifecycle; 45 46import java.util.ArrayList; 47import java.util.Arrays; 48import java.util.List; 49 50public class LanguageAndInputSettings extends DashboardFragment { 51 52 private static final String TAG = "LangAndInputSettings"; 53 54 private static final String KEY_KEYBOARDS_CATEGORY = "keyboards_category"; 55 private static final String KEY_TEXT_TO_SPEECH = "tts_settings_summary"; 56 private static final String KEY_POINTER_AND_TTS_CATEGORY = "pointer_and_tts_category"; 57 private static final String KEY_GAME_CONTROLLER_CATEGORY = "game_controller_settings_category"; 58 private static final String KEY_PHYSICAL_KEYBOARD = "physical_keyboard_pref"; 59 60 @Override 61 public int getMetricsCategory() { 62 return MetricsProto.MetricsEvent.SETTINGS_LANGUAGE_CATEGORY; 63 } 64 65 @Override 66 protected String getLogTag() { 67 return TAG; 68 } 69 70 @Override 71 public void onResume() { 72 super.onResume(); 73 // Hack to update action bar title. It's necessary to refresh title because this page user 74 // can change locale from here and fragment won't relaunch. Once language changes, title 75 // must display in the new language. 76 final Activity activity = getActivity(); 77 if (activity == null) { 78 return; 79 } 80 activity.setTitle(R.string.language_settings); 81 } 82 83 @Override 84 protected int getPreferenceScreenResId() { 85 return R.xml.language_and_input; 86 } 87 88 @Override 89 protected List<AbstractPreferenceController> createPreferenceControllers(Context context) { 90 return buildPreferenceControllers(context, getLifecycle()); 91 } 92 93 private static List<AbstractPreferenceController> buildPreferenceControllers( 94 @NonNull Context context, @Nullable Lifecycle lifecycle) { 95 final List<AbstractPreferenceController> controllers = new ArrayList<>(); 96 // Language 97 controllers.add(new PhoneLanguagePreferenceController(context)); 98 99 // Input 100 final VirtualKeyboardPreferenceController virtualKeyboardPreferenceController = 101 new VirtualKeyboardPreferenceController(context); 102 final PhysicalKeyboardPreferenceController physicalKeyboardPreferenceController = 103 new PhysicalKeyboardPreferenceController(context, lifecycle); 104 controllers.add(virtualKeyboardPreferenceController); 105 controllers.add(physicalKeyboardPreferenceController); 106 controllers.add(new PreferenceCategoryController(context, 107 KEY_KEYBOARDS_CATEGORY).setChildren( 108 Arrays.asList(virtualKeyboardPreferenceController, 109 physicalKeyboardPreferenceController))); 110 111 // Pointer and Tts 112 final TtsPreferenceController ttsPreferenceController = 113 new TtsPreferenceController(context, new TtsEngines(context)); 114 controllers.add(ttsPreferenceController); 115 final PointerSpeedController pointerController = new PointerSpeedController(context); 116 controllers.add(pointerController); 117 controllers.add(new PreferenceCategoryController(context, 118 KEY_POINTER_AND_TTS_CATEGORY).setChildren( 119 Arrays.asList(pointerController, ttsPreferenceController))); 120 121 // Input Assistance 122 controllers.add(new SpellCheckerPreferenceController(context)); 123 controllers.add(new DefaultAutofillPreferenceController(context)); 124 controllers.add(new UserDictionaryPreferenceController(context)); 125 126 return controllers; 127 } 128 129 private static class SummaryProvider implements SummaryLoader.SummaryProvider { 130 131 private final Context mContext; 132 private final SummaryLoader mSummaryLoader; 133 134 public SummaryProvider(Context context, SummaryLoader summaryLoader) { 135 mContext = context; 136 mSummaryLoader = summaryLoader; 137 } 138 139 @Override 140 public void setListening(boolean listening) { 141 final ContentResolver contentResolver = mContext.getContentResolver(); 142 if (listening) { 143 final String flattenComponent = Settings.Secure.getString( 144 contentResolver, Settings.Secure.DEFAULT_INPUT_METHOD); 145 if (!TextUtils.isEmpty(flattenComponent)) { 146 final PackageManager packageManage = mContext.getPackageManager(); 147 final String pkg = ComponentName.unflattenFromString(flattenComponent) 148 .getPackageName(); 149 final InputMethodManager imm = (InputMethodManager) 150 mContext.getSystemService(Context.INPUT_METHOD_SERVICE); 151 final List<InputMethodInfo> imis = imm.getInputMethodList(); 152 for (InputMethodInfo imi : imis) { 153 if (TextUtils.equals(imi.getPackageName(), pkg)) { 154 mSummaryLoader.setSummary(this, imi.loadLabel(packageManage)); 155 return; 156 } 157 } 158 } 159 mSummaryLoader.setSummary(this, ""); 160 } 161 } 162 } 163 164 public static final SummaryLoader.SummaryProviderFactory SUMMARY_PROVIDER_FACTORY 165 = (activity, summaryLoader) -> new SummaryProvider(activity, summaryLoader); 166 167 public static final SearchIndexProvider SEARCH_INDEX_DATA_PROVIDER = 168 new BaseSearchIndexProvider() { 169 @Override 170 public List<SearchIndexableResource> getXmlResourcesToIndex( 171 Context context, boolean enabled) { 172 final SearchIndexableResource sir = new SearchIndexableResource(context); 173 sir.xmlResId = R.xml.language_and_input; 174 return Arrays.asList(sir); 175 } 176 177 @Override 178 public List<AbstractPreferenceController> createPreferenceControllers( 179 Context context) { 180 return buildPreferenceControllers(context, null); 181 } 182 183 @Override 184 public List<String> getNonIndexableKeys(Context context) { 185 List<String> keys = super.getNonIndexableKeys(context); 186 // Duplicates in summary and details pages. 187 keys.add(KEY_TEXT_TO_SPEECH); 188 keys.add(KEY_PHYSICAL_KEYBOARD); 189 return keys; 190 } 191 }; 192} 193