1/*
2 * Copyright (C) 2014 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.inputmethod.latin.settings;
18
19import android.app.backup.BackupManager;
20import android.content.Context;
21import android.content.SharedPreferences;
22import android.content.SharedPreferences.OnSharedPreferenceChangeListener;
23import android.os.Bundle;
24import android.preference.ListPreference;
25import android.preference.Preference;
26import android.preference.PreferenceFragment;
27import android.preference.PreferenceScreen;
28import android.util.Log;
29
30/**
31 * A base abstract class for a {@link PreferenceFragment} that implements a nested
32 * {@link PreferenceScreen} of the main preference screen.
33 */
34abstract class SubScreenFragment extends PreferenceFragment
35        implements OnSharedPreferenceChangeListener {
36    private OnSharedPreferenceChangeListener mSharedPreferenceChangeListener;
37
38    static void setPreferenceEnabled(final String prefKey, final boolean enabled,
39            final PreferenceScreen screen) {
40        final Preference preference = screen.findPreference(prefKey);
41        if (preference != null) {
42            preference.setEnabled(enabled);
43        }
44    }
45
46    static void removePreference(final String prefKey, final PreferenceScreen screen) {
47        final Preference preference = screen.findPreference(prefKey);
48        if (preference != null) {
49            screen.removePreference(preference);
50        }
51    }
52
53    static void updateListPreferenceSummaryToCurrentValue(final String prefKey,
54            final PreferenceScreen screen) {
55        // Because the "%s" summary trick of {@link ListPreference} doesn't work properly before
56        // KitKat, we need to update the summary programmatically.
57        final ListPreference listPreference = (ListPreference)screen.findPreference(prefKey);
58        if (listPreference == null) {
59            return;
60        }
61        final CharSequence entries[] = listPreference.getEntries();
62        final int entryIndex = listPreference.findIndexOfValue(listPreference.getValue());
63        listPreference.setSummary(entryIndex < 0 ? null : entries[entryIndex]);
64    }
65
66    final void setPreferenceEnabled(final String prefKey, final boolean enabled) {
67        setPreferenceEnabled(prefKey, enabled, getPreferenceScreen());
68    }
69
70    final void removePreference(final String prefKey) {
71        removePreference(prefKey, getPreferenceScreen());
72    }
73
74    final void updateListPreferenceSummaryToCurrentValue(final String prefKey) {
75        updateListPreferenceSummaryToCurrentValue(prefKey, getPreferenceScreen());
76    }
77
78    final SharedPreferences getSharedPreferences() {
79        return getPreferenceManager().getSharedPreferences();
80    }
81
82    @Override
83    public void addPreferencesFromResource(final int preferencesResId) {
84        super.addPreferencesFromResource(preferencesResId);
85        TwoStatePreferenceHelper.replaceCheckBoxPreferencesBySwitchPreferences(
86                getPreferenceScreen());
87    }
88
89    @Override
90    public void onCreate(final Bundle savedInstanceState) {
91        super.onCreate(savedInstanceState);
92        mSharedPreferenceChangeListener = new OnSharedPreferenceChangeListener() {
93            @Override
94            public void onSharedPreferenceChanged(final SharedPreferences prefs, final String key) {
95                final SubScreenFragment fragment = SubScreenFragment.this;
96                final Context context = fragment.getActivity();
97                if (context == null || fragment.getPreferenceScreen() == null) {
98                    final String tag = fragment.getClass().getSimpleName();
99                    // TODO: Introduce a static function to register this class and ensure that
100                    // onCreate must be called before "onSharedPreferenceChanged" is called.
101                    Log.w(tag, "onSharedPreferenceChanged called before activity starts.");
102                    return;
103                }
104                new BackupManager(context).dataChanged();
105                fragment.onSharedPreferenceChanged(prefs, key);
106            }
107        };
108        getSharedPreferences().registerOnSharedPreferenceChangeListener(
109                mSharedPreferenceChangeListener);
110    }
111
112    @Override
113    public void onDestroy() {
114        getSharedPreferences().unregisterOnSharedPreferenceChangeListener(
115                mSharedPreferenceChangeListener);
116        super.onDestroy();
117    }
118
119    @Override
120    public void onSharedPreferenceChanged(final SharedPreferences prefs, final String key) {
121        // This method may be overridden by an extended class.
122    }
123}
124