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.dialer.settings;
18
19import android.content.Context;
20import android.media.RingtoneManager;
21import android.os.Bundle;
22import android.os.Handler;
23import android.os.Message;
24import android.os.Vibrator;
25import android.preference.CheckBoxPreference;
26import android.preference.Preference;
27import android.preference.PreferenceCategory;
28import android.preference.PreferenceFragment;
29import android.preference.PreferenceScreen;
30import android.provider.Settings;
31
32import com.android.dialer.R;
33import com.android.phone.common.util.SettingsUtil;
34
35import java.lang.Boolean;
36import java.lang.CharSequence;
37import java.lang.Object;
38import java.lang.Override;
39import java.lang.Runnable;
40import java.lang.String;
41import java.lang.Thread;
42
43public class GeneralSettingsFragment extends PreferenceFragment
44        implements Preference.OnPreferenceChangeListener {
45    private static final String CATEGORY_SOUNDS_KEY    = "dialer_general_sounds_category_key";
46    private static final String BUTTON_RINGTONE_KEY    = "button_ringtone_key";
47    private static final String BUTTON_VIBRATE_ON_RING = "button_vibrate_on_ring";
48    private static final String BUTTON_PLAY_DTMF_TONE  = "button_play_dtmf_tone";
49    private static final String BUTTON_RESPOND_VIA_SMS_KEY = "button_respond_via_sms_key";
50
51    private static final int MSG_UPDATE_RINGTONE_SUMMARY = 1;
52
53    private Context mContext;
54
55    private Preference mRingtonePreference;
56    private CheckBoxPreference mVibrateWhenRinging;
57    private CheckBoxPreference mPlayDtmfTone;
58    private Preference mRespondViaSms;
59
60    private Runnable mRingtoneLookupRunnable;
61    private final Handler mRingtoneLookupComplete = new Handler() {
62        @Override
63        public void handleMessage(Message msg) {
64            switch (msg.what) {
65                case MSG_UPDATE_RINGTONE_SUMMARY:
66                    mRingtonePreference.setSummary((CharSequence) msg.obj);
67                    break;
68            }
69        }
70    };
71
72    @Override
73    public void onCreate(Bundle savedInstanceState) {
74        super.onCreate(savedInstanceState);
75
76        mContext = getActivity().getApplicationContext();
77
78        addPreferencesFromResource(R.xml.general_settings);
79
80        mRingtonePreference = findPreference(BUTTON_RINGTONE_KEY);
81        mVibrateWhenRinging = (CheckBoxPreference) findPreference(BUTTON_VIBRATE_ON_RING);
82        mPlayDtmfTone = (CheckBoxPreference) findPreference(BUTTON_PLAY_DTMF_TONE);
83        mRespondViaSms = findPreference(BUTTON_RESPOND_VIA_SMS_KEY);
84
85        PreferenceCategory soundCategory = (PreferenceCategory) findPreference(CATEGORY_SOUNDS_KEY);
86        if (mVibrateWhenRinging != null) {
87            Vibrator vibrator = (Vibrator) mContext.getSystemService(Context.VIBRATOR_SERVICE);
88            if (vibrator != null && vibrator.hasVibrator()) {
89                mVibrateWhenRinging.setOnPreferenceChangeListener(this);
90            } else {
91                soundCategory.removePreference(mVibrateWhenRinging);
92                mVibrateWhenRinging = null;
93            }
94        }
95
96        if (mPlayDtmfTone != null) {
97            mPlayDtmfTone.setOnPreferenceChangeListener(this);
98            mPlayDtmfTone.setChecked(Settings.System.getInt(mContext.getContentResolver(),
99                    Settings.System.DTMF_TONE_WHEN_DIALING, 1) != 0);
100        }
101
102        mRingtoneLookupRunnable = new Runnable() {
103            @Override
104            public void run() {
105                if (mRingtonePreference != null) {
106                    SettingsUtil.updateRingtoneName(
107                            mContext,
108                            mRingtoneLookupComplete,
109                            RingtoneManager.TYPE_RINGTONE,
110                            mRingtonePreference,
111                            MSG_UPDATE_RINGTONE_SUMMARY);
112                }
113            }
114        };
115    }
116
117    /**
118     * Supports onPreferenceChangeListener to look for preference changes.
119     *
120     * @param preference The preference to be changed
121     * @param objValue The value of the selection, NOT its localized display value.
122     */
123    @Override
124    public boolean onPreferenceChange(Preference preference, Object objValue) {
125        if (preference == mVibrateWhenRinging) {
126            boolean doVibrate = (Boolean) objValue;
127            Settings.System.putInt(mContext.getContentResolver(),
128                    Settings.System.VIBRATE_WHEN_RINGING, doVibrate ? 1 : 0);
129        }
130        return true;
131    }
132
133    /**
134     * Click listener for toggle events.
135     */
136    @Override
137    public boolean onPreferenceTreeClick(PreferenceScreen preferenceScreen, Preference preference) {
138        if (preference == mPlayDtmfTone) {
139            Settings.System.putInt(mContext.getContentResolver(),
140                    Settings.System.DTMF_TONE_WHEN_DIALING, mPlayDtmfTone.isChecked() ? 1 : 0);
141        } else if (preference == mRespondViaSms) {
142            // Needs to return false for the intent to launch.
143            return false;
144        }
145        return true;
146    }
147
148    @Override
149    public void onResume() {
150        super.onResume();
151
152        if (mVibrateWhenRinging != null) {
153            mVibrateWhenRinging.setChecked(SettingsUtil.getVibrateWhenRingingSetting(mContext));
154        }
155
156        // Lookup the ringtone name asynchronously.
157        new Thread(mRingtoneLookupRunnable).start();
158    }
159}
160