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