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 17 package com.android.dialer.util; 18 19 import android.content.Context; 20 import android.content.SharedPreferences; 21 import android.database.sqlite.SQLiteException; 22 import android.media.Ringtone; 23 import android.media.RingtoneManager; 24 import android.net.Uri; 25 import android.os.Handler; 26 import android.preference.PreferenceManager; 27 import android.provider.Settings; 28 import android.text.TextUtils; 29 30 public class SettingsUtil { 31 32 private static final String DEFAULT_NOTIFICATION_URI_STRING = 33 Settings.System.DEFAULT_NOTIFICATION_URI.toString(); 34 35 /** 36 * Queries for a ringtone name, and sets the name using a handler. This is a method was originally 37 * copied from com.android.settings.SoundSettings. 38 * 39 * @param context The application context. 40 * @param handler The handler, which takes the name of the ringtone as a String as a parameter. 41 * @param type The type of sound. 42 * @param key The key to the shared preferences entry being updated. 43 * @param msg An integer identifying the message sent to the handler. 44 */ updateRingtoneName( Context context, Handler handler, int type, String key, int msg)45 public static void updateRingtoneName( 46 Context context, Handler handler, int type, String key, int msg) { 47 final Uri ringtoneUri; 48 boolean defaultRingtone = false; 49 if (type == RingtoneManager.TYPE_RINGTONE) { 50 // For ringtones, we can just lookup the system default because changing the settings 51 // in Call Settings changes the system default. 52 ringtoneUri = RingtoneManager.getActualDefaultRingtoneUri(context, type); 53 } else { 54 final SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(context); 55 // For voicemail notifications, we use the value saved in Phone's shared preferences. 56 String uriString = prefs.getString(key, DEFAULT_NOTIFICATION_URI_STRING); 57 if (TextUtils.isEmpty(uriString)) { 58 // silent ringtone 59 ringtoneUri = null; 60 } else { 61 if (uriString.equals(DEFAULT_NOTIFICATION_URI_STRING)) { 62 // If it turns out that the voicemail notification is set to the system 63 // default notification, we retrieve the actual URI to prevent it from showing 64 // up as "Unknown Ringtone". 65 defaultRingtone = true; 66 ringtoneUri = RingtoneManager.getActualDefaultRingtoneUri(context, type); 67 } else { 68 ringtoneUri = Uri.parse(uriString); 69 } 70 } 71 } 72 getRingtoneName(context, handler, ringtoneUri, msg, defaultRingtone); 73 } 74 getRingtoneName(Context context, Handler handler, Uri ringtoneUri, int msg)75 public static void getRingtoneName(Context context, Handler handler, Uri ringtoneUri, int msg) { 76 getRingtoneName(context, handler, ringtoneUri, msg, false); 77 } 78 getRingtoneName( Context context, Handler handler, Uri ringtoneUri, int msg, boolean defaultRingtone)79 public static void getRingtoneName( 80 Context context, Handler handler, Uri ringtoneUri, int msg, boolean defaultRingtone) { 81 CharSequence summary = context.getString(R.string.ringtone_unknown); 82 // Is it a silent ringtone? 83 if (ringtoneUri == null) { 84 summary = context.getString(R.string.ringtone_silent); 85 } else { 86 // Fetch the ringtone title from the media provider 87 final Ringtone ringtone = RingtoneManager.getRingtone(context, ringtoneUri); 88 if (ringtone != null) { 89 try { 90 final String title = ringtone.getTitle(context); 91 if (!TextUtils.isEmpty(title)) { 92 summary = title; 93 } 94 } catch (SQLiteException sqle) { 95 // Unknown title for the ringtone 96 } 97 } 98 } 99 if (defaultRingtone) { 100 summary = context.getString(R.string.default_notification_description, summary); 101 } 102 handler.sendMessage(handler.obtainMessage(msg, summary)); 103 } 104 } 105