1/*
2 * Copyright (C) 2015 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.tv.settings.system;
18
19import android.app.ActivityManagerNative;
20import android.content.Context;
21import android.os.Bundle;
22import android.os.Handler;
23import android.os.RemoteException;
24import android.provider.Settings;
25import android.support.v17.preference.LeanbackPreferenceFragment;
26import android.support.v7.preference.Preference;
27import android.support.v7.preference.PreferenceScreen;
28import android.util.ArrayMap;
29import android.util.Log;
30
31import com.android.internal.app.LocalePicker;
32import com.android.tv.settings.R;
33import com.android.tv.settings.RadioPreference;
34
35import java.util.List;
36import java.util.Locale;
37import java.util.Map;
38
39public class LanguageFragment extends LeanbackPreferenceFragment {
40    private static final String TAG = "LanguageFragment";
41
42    private static final String LANGUAGE_RADIO_GROUP = "language";
43
44    private final Map<String, LocalePicker.LocaleInfo> mLocaleInfoMap = new ArrayMap<>();
45
46    // Adjust this value to keep things relatively responsive without janking animations
47    private static final int LANGUAGE_SET_DELAY_MS = 500;
48    private final Handler mDelayHandler = new Handler();
49    private Locale mNewLocale;
50    private final Runnable mSetLanguageRunnable = new Runnable() {
51        @Override
52        public void run() {
53            LocalePicker.updateLocale(mNewLocale);
54        }
55    };
56
57    public static LanguageFragment newInstance() {
58        return new LanguageFragment();
59    }
60
61    @Override
62    public void onCreatePreferences(Bundle savedInstanceState, String rootKey) {
63        final Context themedContext = getPreferenceManager().getContext();
64        final PreferenceScreen screen =
65                getPreferenceManager().createPreferenceScreen(themedContext);
66        screen.setTitle(R.string.system_language);
67
68        Locale currentLocale = null;
69        try {
70            currentLocale = ActivityManagerNative.getDefault().getConfiguration()
71                    .getLocales().get(0);
72        } catch (RemoteException e) {
73            Log.e(TAG, "Could not retrieve locale", e);
74        }
75
76        final boolean isInDeveloperMode = Settings.Global.getInt(themedContext.getContentResolver(),
77                Settings.Global.DEVELOPMENT_SETTINGS_ENABLED, 0) != 0;
78
79        final List<LocalePicker.LocaleInfo> localeInfoList =
80                LocalePicker.getAllAssetLocales(themedContext, isInDeveloperMode);
81
82        Preference activePref = null;
83        for (final LocalePicker.LocaleInfo localeInfo : localeInfoList) {
84            final String languageTag = localeInfo.getLocale().toLanguageTag();
85            mLocaleInfoMap.put(languageTag, localeInfo);
86
87            final RadioPreference radioPreference = new RadioPreference(themedContext);
88            radioPreference.setKey(languageTag);
89            radioPreference.setPersistent(false);
90            radioPreference.setTitle(localeInfo.getLabel());
91            radioPreference.setRadioGroup(LANGUAGE_RADIO_GROUP);
92            radioPreference.setLayoutResource(R.layout.preference_reversed_widget);
93
94            if (localeInfo.getLocale().equals(currentLocale)) {
95                radioPreference.setChecked(true);
96                activePref = radioPreference;
97            }
98
99            screen.addPreference(radioPreference);
100        }
101
102        if (activePref != null && savedInstanceState == null) {
103            scrollToPreference(activePref);
104        }
105
106        setPreferenceScreen(screen);
107    }
108
109    @Override
110    public boolean onPreferenceTreeClick(Preference preference) {
111        if (preference instanceof RadioPreference) {
112            final RadioPreference radioPreference = (RadioPreference) preference;
113            radioPreference.clearOtherRadioPreferences(getPreferenceScreen());
114            if (radioPreference.isChecked()) {
115                mNewLocale = mLocaleInfoMap.get(radioPreference.getKey()).getLocale();
116                mDelayHandler.removeCallbacks(mSetLanguageRunnable);
117                mDelayHandler.postDelayed(mSetLanguageRunnable, LANGUAGE_SET_DELAY_MS);
118            } else {
119                radioPreference.setChecked(true);
120            }
121        }
122        return super.onPreferenceTreeClick(preference);
123    }
124}
125