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