LanguageAndInputSettings.java revision 777ed2535a7fd6f618a0d12f381af99252283574
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.Context; 22import android.content.pm.PackageManager; 23import android.os.UserHandle; 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.support.annotation.VisibleForTesting; 30import android.text.TextUtils; 31import android.view.inputmethod.InputMethodInfo; 32import android.view.inputmethod.InputMethodManager; 33 34import com.android.internal.hardware.AmbientDisplayConfiguration; 35import com.android.internal.logging.nano.MetricsProto; 36import com.android.settings.R; 37import com.android.settings.applications.defaultapps.DefaultAutofillPreferenceController; 38import com.android.settings.core.PreferenceController; 39import com.android.settings.dashboard.DashboardFragment; 40import com.android.settings.dashboard.SummaryLoader; 41import com.android.settings.gestures.AssistGesturePreferenceController; 42import com.android.settings.gestures.CameraLiftTriggerPreferenceController; 43import com.android.settings.gestures.DoubleTapPowerPreferenceController; 44import com.android.settings.gestures.DoubleTapScreenPreferenceController; 45import com.android.settings.gestures.DoubleTwistPreferenceController; 46import com.android.settings.gestures.PickupGesturePreferenceController; 47import com.android.settings.gestures.SwipeToNotificationPreferenceController; 48import com.android.settings.inputmethod.GameControllerPreferenceController; 49import com.android.settings.inputmethod.PhysicalKeyboardPreferenceController; 50import com.android.settings.inputmethod.SpellCheckerPreferenceController; 51import com.android.settings.inputmethod.VirtualKeyboardPreferenceController; 52import com.android.settings.search.BaseSearchIndexProvider; 53import com.android.settingslib.core.lifecycle.Lifecycle; 54 55import java.util.ArrayList; 56import java.util.Arrays; 57import java.util.List; 58 59public class LanguageAndInputSettings extends DashboardFragment { 60 61 private static final String TAG = "LangAndInputSettings"; 62 63 private static final String KEY_CAMERA_LIFT_TRIGGER = "gesture_camera_lift_trigger_summary"; 64 65 private AmbientDisplayConfiguration mAmbientDisplayConfig; 66 67 @Override 68 public int getMetricsCategory() { 69 return MetricsProto.MetricsEvent.SETTINGS_LANGUAGE_CATEGORY; 70 } 71 72 @Override 73 protected String getLogTag() { 74 return TAG; 75 } 76 77 @Override 78 public void onAttach(Context context) { 79 super.onAttach(context); 80 mProgressiveDisclosureMixin.setTileLimit(2); 81 82 } 83 84 @Override 85 public void onResume() { 86 super.onResume(); 87 // Hack to update action bar title. It's necessary to refresh title because this page user 88 // can change locale from here and fragment won't relaunch. Once language changes, title 89 // must display in the new language. 90 final Activity activity = getActivity(); 91 if (activity == null) { 92 return; 93 } 94 activity.setTitle(R.string.language_keyboard_settings_title); 95 } 96 97 @Override 98 protected int getPreferenceScreenResId() { 99 return R.xml.language_and_input; 100 } 101 102 @Override 103 protected List<PreferenceController> getPreferenceControllers(Context context) { 104 if (mAmbientDisplayConfig == null) { 105 mAmbientDisplayConfig = new AmbientDisplayConfiguration(context); 106 } 107 108 return buildPreferenceControllers(context, getLifecycle(), mAmbientDisplayConfig); 109 } 110 111 private static List<PreferenceController> buildPreferenceControllers(@NonNull Context context, 112 @Nullable Lifecycle lifecycle, 113 @NonNull AmbientDisplayConfiguration ambientDisplayConfiguration) { 114 final List<PreferenceController> controllers = new ArrayList<>(); 115 // Language 116 controllers.add(new PhoneLanguagePreferenceController(context)); 117 controllers.add(new SpellCheckerPreferenceController(context)); 118 controllers.add(new UserDictionaryPreferenceController(context)); 119 controllers.add(new TtsPreferenceController(context, new TtsEngines(context))); 120 // Input 121 controllers.add(new VirtualKeyboardPreferenceController(context)); 122 controllers.add(new PhysicalKeyboardPreferenceController(context, lifecycle)); 123 final GameControllerPreferenceController gameControllerPreferenceController 124 = new GameControllerPreferenceController(context); 125 if (lifecycle != null) { 126 lifecycle.addObserver(gameControllerPreferenceController); 127 } 128 129 controllers.add(gameControllerPreferenceController); 130 // Gestures 131 controllers.add(new AssistGesturePreferenceController(context, lifecycle)); 132 controllers.add(new SwipeToNotificationPreferenceController(context, lifecycle)); 133 controllers.add(new DoubleTwistPreferenceController(context, lifecycle)); 134 controllers.add(new DoubleTapPowerPreferenceController(context, lifecycle)); 135 controllers.add(new PickupGesturePreferenceController( 136 context, lifecycle, ambientDisplayConfiguration, UserHandle.myUserId())); 137 controllers.add(new DoubleTapScreenPreferenceController( 138 context, lifecycle, ambientDisplayConfiguration, UserHandle.myUserId())); 139 controllers.add(new CameraLiftTriggerPreferenceController(context, lifecycle, 140 KEY_CAMERA_LIFT_TRIGGER)); 141 controllers.add(new DefaultAutofillPreferenceController(context)); 142 return controllers; 143 } 144 145 @VisibleForTesting 146 void setAmbientDisplayConfig(AmbientDisplayConfiguration ambientConfig) { 147 mAmbientDisplayConfig = ambientConfig; 148 } 149 150 private static class SummaryProvider implements SummaryLoader.SummaryProvider { 151 152 private final Context mContext; 153 private final SummaryLoader mSummaryLoader; 154 155 public SummaryProvider(Context context, SummaryLoader summaryLoader) { 156 mContext = context; 157 mSummaryLoader = summaryLoader; 158 } 159 160 @Override 161 public void setListening(boolean listening) { 162 if (listening) { 163 final String flattenComponent = Settings.Secure.getString( 164 mContext.getContentResolver(), Settings.Secure.DEFAULT_INPUT_METHOD); 165 if (!TextUtils.isEmpty(flattenComponent)) { 166 final PackageManager packageManage = mContext.getPackageManager(); 167 final String pkg = ComponentName.unflattenFromString(flattenComponent) 168 .getPackageName(); 169 final InputMethodManager imm = (InputMethodManager) mContext.getSystemService( 170 Context.INPUT_METHOD_SERVICE); 171 final List<InputMethodInfo> imis = imm.getInputMethodList(); 172 for (InputMethodInfo imi : imis) { 173 if (TextUtils.equals(imi.getPackageName(), pkg)) { 174 mSummaryLoader.setSummary(this, imi.loadLabel(packageManage)); 175 return; 176 } 177 } 178 } 179 mSummaryLoader.setSummary(this, ""); 180 } 181 } 182 } 183 184 public static final SummaryLoader.SummaryProviderFactory SUMMARY_PROVIDER_FACTORY 185 = (activity, summaryLoader) -> new SummaryProvider(activity, summaryLoader); 186 187 public static final SearchIndexProvider SEARCH_INDEX_DATA_PROVIDER = 188 new BaseSearchIndexProvider() { 189 @Override 190 public List<SearchIndexableResource> getXmlResourcesToIndex( 191 Context context, boolean enabled) { 192 final SearchIndexableResource sir = new SearchIndexableResource(context); 193 sir.xmlResId = R.xml.language_and_input; 194 return Arrays.asList(sir); 195 } 196 197 @Override 198 public List<PreferenceController> getPreferenceControllers(Context context) { 199 return buildPreferenceControllers(context, null, 200 new AmbientDisplayConfiguration(context)); 201 } 202 }; 203} 204