1112e85e36bf9bf2af9a67e138934b66877be868bAndrew Lee/*
2112e85e36bf9bf2af9a67e138934b66877be868bAndrew Lee * Copyright (C) 2014 The Android Open Source Project
3112e85e36bf9bf2af9a67e138934b66877be868bAndrew Lee *
4112e85e36bf9bf2af9a67e138934b66877be868bAndrew Lee * Licensed under the Apache License, Version 2.0 (the "License");
5112e85e36bf9bf2af9a67e138934b66877be868bAndrew Lee * you may not use this file except in compliance with the License.
6112e85e36bf9bf2af9a67e138934b66877be868bAndrew Lee * You may obtain a copy of the License at
7112e85e36bf9bf2af9a67e138934b66877be868bAndrew Lee *
8112e85e36bf9bf2af9a67e138934b66877be868bAndrew Lee *      http://www.apache.org/licenses/LICENSE-2.0
9112e85e36bf9bf2af9a67e138934b66877be868bAndrew Lee *
10112e85e36bf9bf2af9a67e138934b66877be868bAndrew Lee * Unless required by applicable law or agreed to in writing, software
11112e85e36bf9bf2af9a67e138934b66877be868bAndrew Lee * distributed under the License is distributed on an "AS IS" BASIS,
12112e85e36bf9bf2af9a67e138934b66877be868bAndrew Lee * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13112e85e36bf9bf2af9a67e138934b66877be868bAndrew Lee * See the License for the specific language governing permissions and
14112e85e36bf9bf2af9a67e138934b66877be868bAndrew Lee * limitations under the License
15112e85e36bf9bf2af9a67e138934b66877be868bAndrew Lee */
16112e85e36bf9bf2af9a67e138934b66877be868bAndrew Lee
17112e85e36bf9bf2af9a67e138934b66877be868bAndrew Leepackage com.android.phone.common.util;
18112e85e36bf9bf2af9a67e138934b66877be868bAndrew Lee
19112e85e36bf9bf2af9a67e138934b66877be868bAndrew Leeimport android.content.Context;
20112e85e36bf9bf2af9a67e138934b66877be868bAndrew Leeimport android.content.SharedPreferences;
21112e85e36bf9bf2af9a67e138934b66877be868bAndrew Leeimport android.database.Cursor;
22112e85e36bf9bf2af9a67e138934b66877be868bAndrew Leeimport android.database.sqlite.SQLiteException;
23112e85e36bf9bf2af9a67e138934b66877be868bAndrew Leeimport android.media.RingtoneManager;
24112e85e36bf9bf2af9a67e138934b66877be868bAndrew Leeimport android.net.Uri;
25112e85e36bf9bf2af9a67e138934b66877be868bAndrew Leeimport android.os.Handler;
26112e85e36bf9bf2af9a67e138934b66877be868bAndrew Leeimport android.os.Vibrator;
27112e85e36bf9bf2af9a67e138934b66877be868bAndrew Leeimport android.preference.Preference;
28112e85e36bf9bf2af9a67e138934b66877be868bAndrew Leeimport android.preference.PreferenceManager;
29112e85e36bf9bf2af9a67e138934b66877be868bAndrew Leeimport android.provider.MediaStore;
30112e85e36bf9bf2af9a67e138934b66877be868bAndrew Leeimport android.provider.Settings;
31112e85e36bf9bf2af9a67e138934b66877be868bAndrew Leeimport android.text.TextUtils;
32112e85e36bf9bf2af9a67e138934b66877be868bAndrew Lee
33112e85e36bf9bf2af9a67e138934b66877be868bAndrew Leeimport com.android.phone.common.R;
34112e85e36bf9bf2af9a67e138934b66877be868bAndrew Lee
35112e85e36bf9bf2af9a67e138934b66877be868bAndrew Leeimport java.lang.CharSequence;
36112e85e36bf9bf2af9a67e138934b66877be868bAndrew Leeimport java.lang.String;
37112e85e36bf9bf2af9a67e138934b66877be868bAndrew Lee
38112e85e36bf9bf2af9a67e138934b66877be868bAndrew Leepublic class SettingsUtil {
39112e85e36bf9bf2af9a67e138934b66877be868bAndrew Lee    /**
40112e85e36bf9bf2af9a67e138934b66877be868bAndrew Lee     * Obtain the setting for "vibrate when ringing" setting.
41112e85e36bf9bf2af9a67e138934b66877be868bAndrew Lee     *
42112e85e36bf9bf2af9a67e138934b66877be868bAndrew Lee     * Watch out: if the setting is missing in the device, this will try obtaining the old
43112e85e36bf9bf2af9a67e138934b66877be868bAndrew Lee     * "vibrate on ring" setting from AudioManager, and save the previous setting to the new one.
44112e85e36bf9bf2af9a67e138934b66877be868bAndrew Lee     */
45112e85e36bf9bf2af9a67e138934b66877be868bAndrew Lee    public static boolean getVibrateWhenRingingSetting(Context context) {
46112e85e36bf9bf2af9a67e138934b66877be868bAndrew Lee        Vibrator vibrator = (Vibrator) context.getSystemService(Context.VIBRATOR_SERVICE);
47112e85e36bf9bf2af9a67e138934b66877be868bAndrew Lee        if (vibrator == null || !vibrator.hasVibrator()) {
48112e85e36bf9bf2af9a67e138934b66877be868bAndrew Lee            return false;
49112e85e36bf9bf2af9a67e138934b66877be868bAndrew Lee        }
50112e85e36bf9bf2af9a67e138934b66877be868bAndrew Lee        return Settings.System.getInt(context.getContentResolver(),
51112e85e36bf9bf2af9a67e138934b66877be868bAndrew Lee                Settings.System.VIBRATE_WHEN_RINGING, 0) != 0;
52112e85e36bf9bf2af9a67e138934b66877be868bAndrew Lee    }
53112e85e36bf9bf2af9a67e138934b66877be868bAndrew Lee
54112e85e36bf9bf2af9a67e138934b66877be868bAndrew Lee    /**
55112e85e36bf9bf2af9a67e138934b66877be868bAndrew Lee     * Queries for a ringtone name, and sets the name using a handler.
56112e85e36bf9bf2af9a67e138934b66877be868bAndrew Lee     * This is a method was originally copied from com.android.settings.SoundSettings.
57112e85e36bf9bf2af9a67e138934b66877be868bAndrew Lee     *
58112e85e36bf9bf2af9a67e138934b66877be868bAndrew Lee     * @param context The application context.
59112e85e36bf9bf2af9a67e138934b66877be868bAndrew Lee     * @param handler The handler, which takes the name of the ringtone as a String as a parameter.
60112e85e36bf9bf2af9a67e138934b66877be868bAndrew Lee     * @param type The type of sound.
61112e85e36bf9bf2af9a67e138934b66877be868bAndrew Lee     * @param preference The preference being updated.
62112e85e36bf9bf2af9a67e138934b66877be868bAndrew Lee     * @param msg An integer identifying the message sent to the handler.
63112e85e36bf9bf2af9a67e138934b66877be868bAndrew Lee     */
64112e85e36bf9bf2af9a67e138934b66877be868bAndrew Lee    public static void updateRingtoneName(
65112e85e36bf9bf2af9a67e138934b66877be868bAndrew Lee            Context context, Handler handler, int type, Preference preference, int msg) {
66112e85e36bf9bf2af9a67e138934b66877be868bAndrew Lee        if (preference == null) {
67112e85e36bf9bf2af9a67e138934b66877be868bAndrew Lee            return;
68112e85e36bf9bf2af9a67e138934b66877be868bAndrew Lee        }
69112e85e36bf9bf2af9a67e138934b66877be868bAndrew Lee
70112e85e36bf9bf2af9a67e138934b66877be868bAndrew Lee        final Uri ringtoneUri;
71112e85e36bf9bf2af9a67e138934b66877be868bAndrew Lee        boolean defaultRingtone = false;
72112e85e36bf9bf2af9a67e138934b66877be868bAndrew Lee        if (type == RingtoneManager.TYPE_RINGTONE) {
73112e85e36bf9bf2af9a67e138934b66877be868bAndrew Lee            // For ringtones, we can just lookup the system default because changing the settings
74112e85e36bf9bf2af9a67e138934b66877be868bAndrew Lee            // in Call Settings changes the system default.
75112e85e36bf9bf2af9a67e138934b66877be868bAndrew Lee            ringtoneUri = RingtoneManager.getActualDefaultRingtoneUri(context, type);
76112e85e36bf9bf2af9a67e138934b66877be868bAndrew Lee        } else {
77112e85e36bf9bf2af9a67e138934b66877be868bAndrew Lee            final SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(context);
78112e85e36bf9bf2af9a67e138934b66877be868bAndrew Lee            // For voicemail notifications, we use the value saved in Phone's shared preferences.
79112e85e36bf9bf2af9a67e138934b66877be868bAndrew Lee            String uriString = prefs.getString(preference.getKey(), null);
80112e85e36bf9bf2af9a67e138934b66877be868bAndrew Lee            if (TextUtils.isEmpty(uriString)) {
81112e85e36bf9bf2af9a67e138934b66877be868bAndrew Lee                // silent ringtone
82112e85e36bf9bf2af9a67e138934b66877be868bAndrew Lee                ringtoneUri = null;
83112e85e36bf9bf2af9a67e138934b66877be868bAndrew Lee            } else {
84112e85e36bf9bf2af9a67e138934b66877be868bAndrew Lee                if (uriString.equals(Settings.System.DEFAULT_NOTIFICATION_URI.toString())) {
85112e85e36bf9bf2af9a67e138934b66877be868bAndrew Lee                    // If it turns out that the voicemail notification is set to the system
86112e85e36bf9bf2af9a67e138934b66877be868bAndrew Lee                    // default notification, we retrieve the actual URI to prevent it from showing
87112e85e36bf9bf2af9a67e138934b66877be868bAndrew Lee                    // up as "Unknown Ringtone".
88112e85e36bf9bf2af9a67e138934b66877be868bAndrew Lee                    defaultRingtone = true;
89112e85e36bf9bf2af9a67e138934b66877be868bAndrew Lee                    ringtoneUri = RingtoneManager.getActualDefaultRingtoneUri(context, type);
90112e85e36bf9bf2af9a67e138934b66877be868bAndrew Lee                } else {
91112e85e36bf9bf2af9a67e138934b66877be868bAndrew Lee                    ringtoneUri = Uri.parse(uriString);
92112e85e36bf9bf2af9a67e138934b66877be868bAndrew Lee                }
93112e85e36bf9bf2af9a67e138934b66877be868bAndrew Lee            }
94112e85e36bf9bf2af9a67e138934b66877be868bAndrew Lee        }
95112e85e36bf9bf2af9a67e138934b66877be868bAndrew Lee        CharSequence summary = context.getString(com.android.internal.R.string.ringtone_unknown);
96112e85e36bf9bf2af9a67e138934b66877be868bAndrew Lee        // Is it a silent ringtone?
97112e85e36bf9bf2af9a67e138934b66877be868bAndrew Lee        if (ringtoneUri == null) {
98112e85e36bf9bf2af9a67e138934b66877be868bAndrew Lee            summary = context.getString(com.android.internal.R.string.ringtone_silent);
99112e85e36bf9bf2af9a67e138934b66877be868bAndrew Lee        } else {
100112e85e36bf9bf2af9a67e138934b66877be868bAndrew Lee            // Fetch the ringtone title from the media provider
101112e85e36bf9bf2af9a67e138934b66877be868bAndrew Lee            try {
102112e85e36bf9bf2af9a67e138934b66877be868bAndrew Lee                Cursor cursor = context.getContentResolver().query(ringtoneUri,
103112e85e36bf9bf2af9a67e138934b66877be868bAndrew Lee                        new String[] { MediaStore.Audio.Media.TITLE }, null, null, null);
104112e85e36bf9bf2af9a67e138934b66877be868bAndrew Lee                if (cursor != null) {
105112e85e36bf9bf2af9a67e138934b66877be868bAndrew Lee                    if (cursor.moveToFirst()) {
106112e85e36bf9bf2af9a67e138934b66877be868bAndrew Lee                        summary = cursor.getString(0);
107112e85e36bf9bf2af9a67e138934b66877be868bAndrew Lee                    }
108112e85e36bf9bf2af9a67e138934b66877be868bAndrew Lee                    cursor.close();
109112e85e36bf9bf2af9a67e138934b66877be868bAndrew Lee                }
110112e85e36bf9bf2af9a67e138934b66877be868bAndrew Lee            } catch (SQLiteException sqle) {
111112e85e36bf9bf2af9a67e138934b66877be868bAndrew Lee                // Unknown title for the ringtone
112112e85e36bf9bf2af9a67e138934b66877be868bAndrew Lee            }
113112e85e36bf9bf2af9a67e138934b66877be868bAndrew Lee        }
114112e85e36bf9bf2af9a67e138934b66877be868bAndrew Lee        if (defaultRingtone) {
115112e85e36bf9bf2af9a67e138934b66877be868bAndrew Lee            summary = context.getString(R.string.default_notification_description, summary);
116112e85e36bf9bf2af9a67e138934b66877be868bAndrew Lee        }
117112e85e36bf9bf2af9a67e138934b66877be868bAndrew Lee        handler.sendMessage(handler.obtainMessage(msg, summary));
118112e85e36bf9bf2af9a67e138934b66877be868bAndrew Lee    }
119112e85e36bf9bf2af9a67e138934b66877be868bAndrew Lee}
120