Home | History | Annotate | Download | only in language
      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