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;
2353845dd9c153aeb23999aac7f19dbb652976b565Yorke Leeimport android.media.Ringtone;
24112e85e36bf9bf2af9a67e138934b66877be868bAndrew Leeimport android.media.RingtoneManager;
25112e85e36bf9bf2af9a67e138934b66877be868bAndrew Leeimport android.net.Uri;
26112e85e36bf9bf2af9a67e138934b66877be868bAndrew Leeimport android.os.Handler;
27112e85e36bf9bf2af9a67e138934b66877be868bAndrew Leeimport android.os.Vibrator;
28112e85e36bf9bf2af9a67e138934b66877be868bAndrew Leeimport android.preference.Preference;
29112e85e36bf9bf2af9a67e138934b66877be868bAndrew Leeimport android.preference.PreferenceManager;
30112e85e36bf9bf2af9a67e138934b66877be868bAndrew Leeimport android.provider.MediaStore;
31112e85e36bf9bf2af9a67e138934b66877be868bAndrew Leeimport android.provider.Settings;
32112e85e36bf9bf2af9a67e138934b66877be868bAndrew Leeimport android.text.TextUtils;
33112e85e36bf9bf2af9a67e138934b66877be868bAndrew Lee
34112e85e36bf9bf2af9a67e138934b66877be868bAndrew Leeimport com.android.phone.common.R;
35112e85e36bf9bf2af9a67e138934b66877be868bAndrew Lee
36112e85e36bf9bf2af9a67e138934b66877be868bAndrew Leeimport java.lang.CharSequence;
37112e85e36bf9bf2af9a67e138934b66877be868bAndrew Leeimport java.lang.String;
38112e85e36bf9bf2af9a67e138934b66877be868bAndrew Lee
39112e85e36bf9bf2af9a67e138934b66877be868bAndrew Leepublic class SettingsUtil {
40895849b2484727546133da8b8762e1fdcc3ecd9bAndrew Lee    private static final String DEFAULT_NOTIFICATION_URI_STRING =
41895849b2484727546133da8b8762e1fdcc3ecd9bAndrew Lee            Settings.System.DEFAULT_NOTIFICATION_URI.toString();
42895849b2484727546133da8b8762e1fdcc3ecd9bAndrew Lee
43112e85e36bf9bf2af9a67e138934b66877be868bAndrew Lee    /**
44112e85e36bf9bf2af9a67e138934b66877be868bAndrew Lee     * Queries for a ringtone name, and sets the name using a handler.
45112e85e36bf9bf2af9a67e138934b66877be868bAndrew Lee     * This is a method was originally copied from com.android.settings.SoundSettings.
46112e85e36bf9bf2af9a67e138934b66877be868bAndrew Lee     *
47112e85e36bf9bf2af9a67e138934b66877be868bAndrew Lee     * @param context The application context.
48112e85e36bf9bf2af9a67e138934b66877be868bAndrew Lee     * @param handler The handler, which takes the name of the ringtone as a String as a parameter.
49112e85e36bf9bf2af9a67e138934b66877be868bAndrew Lee     * @param type The type of sound.
50c11bd1b0ac01d0bd3497d1e47e70e53792036e5aAndrew Lee     * @param key The key to the shared preferences entry being updated.
51112e85e36bf9bf2af9a67e138934b66877be868bAndrew Lee     * @param msg An integer identifying the message sent to the handler.
52112e85e36bf9bf2af9a67e138934b66877be868bAndrew Lee     */
53112e85e36bf9bf2af9a67e138934b66877be868bAndrew Lee    public static void updateRingtoneName(
54c11bd1b0ac01d0bd3497d1e47e70e53792036e5aAndrew Lee            Context context, Handler handler, int type, String key, int msg) {
55112e85e36bf9bf2af9a67e138934b66877be868bAndrew Lee        final Uri ringtoneUri;
56112e85e36bf9bf2af9a67e138934b66877be868bAndrew Lee        boolean defaultRingtone = false;
57112e85e36bf9bf2af9a67e138934b66877be868bAndrew Lee        if (type == RingtoneManager.TYPE_RINGTONE) {
58112e85e36bf9bf2af9a67e138934b66877be868bAndrew Lee            // For ringtones, we can just lookup the system default because changing the settings
59112e85e36bf9bf2af9a67e138934b66877be868bAndrew Lee            // in Call Settings changes the system default.
60112e85e36bf9bf2af9a67e138934b66877be868bAndrew Lee            ringtoneUri = RingtoneManager.getActualDefaultRingtoneUri(context, type);
61112e85e36bf9bf2af9a67e138934b66877be868bAndrew Lee        } else {
62112e85e36bf9bf2af9a67e138934b66877be868bAndrew Lee            final SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(context);
63112e85e36bf9bf2af9a67e138934b66877be868bAndrew Lee            // For voicemail notifications, we use the value saved in Phone's shared preferences.
64895849b2484727546133da8b8762e1fdcc3ecd9bAndrew Lee            String uriString = prefs.getString(key, DEFAULT_NOTIFICATION_URI_STRING);
65112e85e36bf9bf2af9a67e138934b66877be868bAndrew Lee            if (TextUtils.isEmpty(uriString)) {
66112e85e36bf9bf2af9a67e138934b66877be868bAndrew Lee                // silent ringtone
67112e85e36bf9bf2af9a67e138934b66877be868bAndrew Lee                ringtoneUri = null;
68112e85e36bf9bf2af9a67e138934b66877be868bAndrew Lee            } else {
69895849b2484727546133da8b8762e1fdcc3ecd9bAndrew Lee                if (uriString.equals(DEFAULT_NOTIFICATION_URI_STRING)) {
70112e85e36bf9bf2af9a67e138934b66877be868bAndrew Lee                    // If it turns out that the voicemail notification is set to the system
71112e85e36bf9bf2af9a67e138934b66877be868bAndrew Lee                    // default notification, we retrieve the actual URI to prevent it from showing
72112e85e36bf9bf2af9a67e138934b66877be868bAndrew Lee                    // up as "Unknown Ringtone".
73112e85e36bf9bf2af9a67e138934b66877be868bAndrew Lee                    defaultRingtone = true;
74112e85e36bf9bf2af9a67e138934b66877be868bAndrew Lee                    ringtoneUri = RingtoneManager.getActualDefaultRingtoneUri(context, type);
75112e85e36bf9bf2af9a67e138934b66877be868bAndrew Lee                } else {
76112e85e36bf9bf2af9a67e138934b66877be868bAndrew Lee                    ringtoneUri = Uri.parse(uriString);
77112e85e36bf9bf2af9a67e138934b66877be868bAndrew Lee                }
78112e85e36bf9bf2af9a67e138934b66877be868bAndrew Lee            }
79112e85e36bf9bf2af9a67e138934b66877be868bAndrew Lee        }
8053fcafb3caf6197451a4ed9e34411da52cf3bf86Brian Attwell        CharSequence summary = context.getString(R.string.ringtone_unknown);
81112e85e36bf9bf2af9a67e138934b66877be868bAndrew Lee        // Is it a silent ringtone?
82112e85e36bf9bf2af9a67e138934b66877be868bAndrew Lee        if (ringtoneUri == null) {
8353fcafb3caf6197451a4ed9e34411da52cf3bf86Brian Attwell            summary = context.getString(R.string.ringtone_silent);
84112e85e36bf9bf2af9a67e138934b66877be868bAndrew Lee        } else {
85112e85e36bf9bf2af9a67e138934b66877be868bAndrew Lee            // Fetch the ringtone title from the media provider
8653845dd9c153aeb23999aac7f19dbb652976b565Yorke Lee            final Ringtone ringtone = RingtoneManager.getRingtone(context, ringtoneUri);
8753845dd9c153aeb23999aac7f19dbb652976b565Yorke Lee            if (ringtone != null) {
8853845dd9c153aeb23999aac7f19dbb652976b565Yorke Lee                try {
8953845dd9c153aeb23999aac7f19dbb652976b565Yorke Lee                    final String title = ringtone.getTitle(context);
9053845dd9c153aeb23999aac7f19dbb652976b565Yorke Lee                    if (!TextUtils.isEmpty(title)) {
9153845dd9c153aeb23999aac7f19dbb652976b565Yorke Lee                        summary = title;
92112e85e36bf9bf2af9a67e138934b66877be868bAndrew Lee                    }
9353845dd9c153aeb23999aac7f19dbb652976b565Yorke Lee                } catch (SQLiteException sqle) {
9453845dd9c153aeb23999aac7f19dbb652976b565Yorke Lee                    // Unknown title for the ringtone
95112e85e36bf9bf2af9a67e138934b66877be868bAndrew Lee                }
96112e85e36bf9bf2af9a67e138934b66877be868bAndrew Lee            }
97112e85e36bf9bf2af9a67e138934b66877be868bAndrew Lee        }
98112e85e36bf9bf2af9a67e138934b66877be868bAndrew Lee        if (defaultRingtone) {
99112e85e36bf9bf2af9a67e138934b66877be868bAndrew Lee            summary = context.getString(R.string.default_notification_description, summary);
100112e85e36bf9bf2af9a67e138934b66877be868bAndrew Lee        }
101112e85e36bf9bf2af9a67e138934b66877be868bAndrew Lee        handler.sendMessage(handler.obtainMessage(msg, summary));
102112e85e36bf9bf2af9a67e138934b66877be868bAndrew Lee    }
103112e85e36bf9bf2af9a67e138934b66877be868bAndrew Lee}
104