• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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
getMetricsCategory()72     public int getMetricsCategory() {
73         return MetricsProto.MetricsEvent.SETTINGS_LANGUAGE_CATEGORY;
74     }
75 
76     @Override
getLogTag()77     protected String getLogTag() {
78         return TAG;
79     }
80 
81     @Override
onAttach(Context context)82     public void onAttach(Context context) {
83         super.onAttach(context);
84         mProgressiveDisclosureMixin.setTileLimit(2);
85     }
86 
87     @Override
getPreferenceScreenResId()88     protected int getPreferenceScreenResId() {
89         return R.xml.language_and_input;
90     }
91 
92     @Override
getPreferenceControllers(Context context)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 
buildPreferenceControllers(@onNull Context context, @Nullable Lifecycle lifecycle, @NonNull AmbientDisplayConfiguration ambientDisplayConfiguration)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
setAmbientDisplayConfig(AmbientDisplayConfiguration ambientConfig)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 
SummaryProvider(Context context, SummaryLoader summaryLoader)145         public SummaryProvider(Context context, SummaryLoader summaryLoader) {
146             mContext = context;
147             mSummaryLoader = summaryLoader;
148         }
149 
150         @Override
setListening(boolean listening)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