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