19066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/* 29066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Copyright (C) 2007 The Android Open Source Project 39066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 49066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License"); 59066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * you may not use this file except in compliance with the License. 69066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * You may obtain a copy of the License at 79066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 89066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * http://www.apache.org/licenses/LICENSE-2.0 99066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Unless required by applicable law or agreed to in writing, software 119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS, 129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * See the License for the specific language governing permissions and 149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * limitations under the License. 159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpackage android.media; 189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport com.android.internal.database.SortCursor; 209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.annotation.SdkConstant; 229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.annotation.SdkConstant.SdkConstantType; 239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.app.Activity; 249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.ContentUris; 259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.Context; 269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.res.AssetFileDescriptor; 279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.database.Cursor; 289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.net.Uri; 299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.Environment; 309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.provider.DrmStore; 319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.provider.MediaStore; 329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.provider.Settings; 339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.provider.Settings.System; 349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.util.Log; 359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.util.ArrayList; 379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.util.List; 389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/** 409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * RingtoneManager provides access to ringtones, notification, and other types 419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * of sounds. It manages querying the different media providers and combines the 429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * results into a single cursor. It also provides a {@link Ringtone} for each 439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * ringtone. We generically call these sounds ringtones, however the 449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link #TYPE_RINGTONE} refers to the type of sounds that are suitable for the 459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * phone ringer. 469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p> 479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * To show a ringtone picker to the user, use the 489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link #ACTION_RINGTONE_PICKER} intent to launch the picker as a subactivity. 499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see Ringtone 519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpublic class RingtoneManager { 539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private static final String TAG = "RingtoneManager"; 559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Make sure these are in sync with attrs.xml: 579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // <attr name="ringtoneType"> 589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Type that refers to sounds that are used for the phone ringer. 619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final int TYPE_RINGTONE = 1; 639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Type that refers to sounds that are used for notifications. 669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final int TYPE_NOTIFICATION = 2; 689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Type that refers to sounds that are used for the alarm. 719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final int TYPE_ALARM = 4; 739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * All types of sounds. 769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final int TYPE_ALL = TYPE_RINGTONE | TYPE_NOTIFICATION | TYPE_ALARM; 789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // </attr> 809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Activity Action: Shows a ringtone picker. 839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p> 849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Input: {@link #EXTRA_RINGTONE_EXISTING_URI}, 859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link #EXTRA_RINGTONE_SHOW_DEFAULT}, 869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link #EXTRA_RINGTONE_SHOW_SILENT}, {@link #EXTRA_RINGTONE_TYPE}, 879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link #EXTRA_RINGTONE_DEFAULT_URI}, {@link #EXTRA_RINGTONE_TITLE}, 889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link #EXTRA_RINGTONE_INCLUDE_DRM}. 899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p> 909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Output: {@link #EXTRA_RINGTONE_PICKED_URI}. 919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @SdkConstant(SdkConstantType.ACTIVITY_INTENT_ACTION) 939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final String ACTION_RINGTONE_PICKER = "android.intent.action.RINGTONE_PICKER"; 949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Given to the ringtone picker as a boolean. Whether to show an item for 979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * "Default". 989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #ACTION_RINGTONE_PICKER 1009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final String EXTRA_RINGTONE_SHOW_DEFAULT = 1029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project "android.intent.extra.ringtone.SHOW_DEFAULT"; 1039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 1059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Given to the ringtone picker as a boolean. Whether to show an item for 1069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * "Silent". If the "Silent" item is picked, 1079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link #EXTRA_RINGTONE_PICKED_URI} will be null. 1089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 1099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #ACTION_RINGTONE_PICKER 1109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final String EXTRA_RINGTONE_SHOW_SILENT = 1129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project "android.intent.extra.ringtone.SHOW_SILENT"; 1139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 1159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Given to the ringtone picker as a boolean. Whether to include DRM ringtones. 1169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final String EXTRA_RINGTONE_INCLUDE_DRM = 1189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project "android.intent.extra.ringtone.INCLUDE_DRM"; 1199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 1219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Given to the ringtone picker as a {@link Uri}. The {@link Uri} of the 1229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * current ringtone, which will be used to show a checkmark next to the item 1239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * for this {@link Uri}. If showing an item for "Default" (@see 1249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link #EXTRA_RINGTONE_SHOW_DEFAULT}), this can also be one of 1253156bb00dd3ab3d6ec732bb6a64a2e84d08c34f0Patrick Scott * {@link System#DEFAULT_RINGTONE_URI}, 1263156bb00dd3ab3d6ec732bb6a64a2e84d08c34f0Patrick Scott * {@link System#DEFAULT_NOTIFICATION_URI}, or 1273156bb00dd3ab3d6ec732bb6a64a2e84d08c34f0Patrick Scott * {@link System#DEFAULT_ALARM_ALERT_URI} to have the "Default" item 1289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * checked. 1299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 1309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #ACTION_RINGTONE_PICKER 1319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final String EXTRA_RINGTONE_EXISTING_URI = 1339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project "android.intent.extra.ringtone.EXISTING_URI"; 1349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 1369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Given to the ringtone picker as a {@link Uri}. The {@link Uri} of the 1379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * ringtone to play when the user attempts to preview the "Default" 1383156bb00dd3ab3d6ec732bb6a64a2e84d08c34f0Patrick Scott * ringtone. This can be one of {@link System#DEFAULT_RINGTONE_URI}, 1393156bb00dd3ab3d6ec732bb6a64a2e84d08c34f0Patrick Scott * {@link System#DEFAULT_NOTIFICATION_URI}, or 1403156bb00dd3ab3d6ec732bb6a64a2e84d08c34f0Patrick Scott * {@link System#DEFAULT_ALARM_ALERT_URI} to have the "Default" point to 1419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * the current sound for the given default sound type. If you are showing a 1429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * ringtone picker for some other type of sound, you are free to provide any 1439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link Uri} here. 1449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final String EXTRA_RINGTONE_DEFAULT_URI = 1469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project "android.intent.extra.ringtone.DEFAULT_URI"; 1479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 1499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Given to the ringtone picker as an int. Specifies which ringtone type(s) should be 1509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * shown in the picker. One or more of {@link #TYPE_RINGTONE}, 1519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link #TYPE_NOTIFICATION}, {@link #TYPE_ALARM}, or {@link #TYPE_ALL} 1529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * (bitwise-ored together). 1539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final String EXTRA_RINGTONE_TYPE = "android.intent.extra.ringtone.TYPE"; 1559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 1579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Given to the ringtone picker as a {@link CharSequence}. The title to 1589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * show for the ringtone picker. This has a default value that is suitable 1599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * in most cases. 1609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final String EXTRA_RINGTONE_TITLE = "android.intent.extra.ringtone.TITLE"; 1629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 1649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Returned from the ringtone picker as a {@link Uri}. 1659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p> 1669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * It will be one of: 1679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <li> the picked ringtone, 1683156bb00dd3ab3d6ec732bb6a64a2e84d08c34f0Patrick Scott * <li> a {@link Uri} that equals {@link System#DEFAULT_RINGTONE_URI}, 1693156bb00dd3ab3d6ec732bb6a64a2e84d08c34f0Patrick Scott * {@link System#DEFAULT_NOTIFICATION_URI}, or 1703156bb00dd3ab3d6ec732bb6a64a2e84d08c34f0Patrick Scott * {@link System#DEFAULT_ALARM_ALERT_URI} if the default was chosen, 1719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <li> null if the "Silent" item was picked. 1729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 1739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #ACTION_RINGTONE_PICKER 1749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final String EXTRA_RINGTONE_PICKED_URI = 1769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project "android.intent.extra.ringtone.PICKED_URI"; 1779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Make sure the column ordering and then ..._COLUMN_INDEX are in sync 1799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private static final String[] INTERNAL_COLUMNS = new String[] { 1819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project MediaStore.Audio.Media._ID, MediaStore.Audio.Media.TITLE, 182899725b05dd5c8c51f9f802d4f0a7190532ce0a5Marco Nelissen "\"" + MediaStore.Audio.Media.INTERNAL_CONTENT_URI + "\"", 183899725b05dd5c8c51f9f802d4f0a7190532ce0a5Marco Nelissen MediaStore.Audio.Media.TITLE_KEY 1849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project }; 1859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private static final String[] DRM_COLUMNS = new String[] { 1879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project DrmStore.Audio._ID, DrmStore.Audio.TITLE, 188899725b05dd5c8c51f9f802d4f0a7190532ce0a5Marco Nelissen "\"" + DrmStore.Audio.CONTENT_URI + "\"", 189899725b05dd5c8c51f9f802d4f0a7190532ce0a5Marco Nelissen DrmStore.Audio.TITLE + " AS " + MediaStore.Audio.Media.TITLE_KEY 1909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project }; 1919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private static final String[] MEDIA_COLUMNS = new String[] { 1939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project MediaStore.Audio.Media._ID, MediaStore.Audio.Media.TITLE, 194899725b05dd5c8c51f9f802d4f0a7190532ce0a5Marco Nelissen "\"" + MediaStore.Audio.Media.EXTERNAL_CONTENT_URI + "\"", 195899725b05dd5c8c51f9f802d4f0a7190532ce0a5Marco Nelissen MediaStore.Audio.Media.TITLE_KEY 1969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project }; 1979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 1999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The column index (in the cursor returned by {@link #getCursor()} for the 2009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * row ID. 2019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 2029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final int ID_COLUMN_INDEX = 0; 2039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 2059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The column index (in the cursor returned by {@link #getCursor()} for the 2069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * title. 2079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 2089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final int TITLE_COLUMN_INDEX = 1; 2099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 2119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The column index (in the cursor returned by {@link #getCursor()} for the 2129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * media provider's URI. 2139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 2149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final int URI_COLUMN_INDEX = 2; 2159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private Activity mActivity; 2179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private Context mContext; 2189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private Cursor mCursor; 2209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private int mType = TYPE_RINGTONE; 2229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 2249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * If a column (item from this list) exists in the Cursor, its value must 2259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * be true (value of 1) for the row to be returned. 2269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 22730c918ce7fbe171944b28fc91b3f22b3d631872dGlenn Kasten private final List<String> mFilterColumns = new ArrayList<String>(); 2289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private boolean mStopPreviousRingtone = true; 2309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private Ringtone mPreviousRingtone; 2319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private boolean mIncludeDrm; 2339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 2359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Constructs a RingtoneManager. This constructor is recommended as its 2369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * constructed instance manages cursor(s). 2379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 2389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param activity The activity used to get a managed cursor. 2399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 2409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public RingtoneManager(Activity activity) { 2419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mContext = mActivity = activity; 2429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project setType(mType); 2439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 2469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Constructs a RingtoneManager. The instance constructed by this 2479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * constructor will not manage the cursor(s), so the client should handle 2489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * this itself. 2499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 2509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param context The context to used to get a cursor. 2519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 2529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public RingtoneManager(Context context) { 2539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mContext = context; 2549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project setType(mType); 2559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 2589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Sets which type(s) of ringtones will be listed by this. 2599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 2609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param type The type(s), one or more of {@link #TYPE_RINGTONE}, 2619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link #TYPE_NOTIFICATION}, {@link #TYPE_ALARM}, 2629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link #TYPE_ALL}. 2639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #EXTRA_RINGTONE_TYPE 2649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 2659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void setType(int type) { 2669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mCursor != null) { 2689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throw new IllegalStateException( 2699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project "Setting filter columns should be done before querying for ringtones."); 2709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mType = type; 2739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project setFilterColumnsList(type); 2749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 2779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Infers the playback stream type based on what type of ringtones this 2789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * manager is returning. 2799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 2809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return The stream type. 2819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 2829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public int inferStreamType() { 2839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project switch (mType) { 2849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case TYPE_ALARM: 2869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return AudioManager.STREAM_ALARM; 2879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case TYPE_NOTIFICATION: 2899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return AudioManager.STREAM_NOTIFICATION; 2909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project default: 2929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return AudioManager.STREAM_RING; 2939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 2979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Whether retrieving another {@link Ringtone} will stop playing the 2989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * previously retrieved {@link Ringtone}. 2999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p> 3009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * If this is false, make sure to {@link Ringtone#stop()} any previous 3019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * ringtones to free resources. 3029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 3039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param stopPreviousRingtone If true, the previously retrieved 3049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link Ringtone} will be stopped. 3059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 3069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void setStopPreviousRingtone(boolean stopPreviousRingtone) { 3079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mStopPreviousRingtone = stopPreviousRingtone; 3089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 3119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #setStopPreviousRingtone(boolean) 3129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 3139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public boolean getStopPreviousRingtone() { 3149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mStopPreviousRingtone; 3159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 3189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Stops playing the last {@link Ringtone} retrieved from this. 3199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 3209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void stopPreviousRingtone() { 3219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mPreviousRingtone != null) { 3229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mPreviousRingtone.stop(); 3239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 3279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Returns whether DRM ringtones will be included. 3289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 3299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return Whether DRM ringtones will be included. 3309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #setIncludeDrm(boolean) 3319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 3329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public boolean getIncludeDrm() { 3339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mIncludeDrm; 3349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 3379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Sets whether to include DRM ringtones. 3389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 3399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param includeDrm Whether to include DRM ringtones. 3409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 3419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void setIncludeDrm(boolean includeDrm) { 3429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mIncludeDrm = includeDrm; 3439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 3469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Returns a {@link Cursor} of all the ringtones available. The returned 3479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * cursor will be the same cursor returned each time this method is called, 3489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * so do not {@link Cursor#close()} the cursor. The cursor can be 3499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link Cursor#deactivate()} safely. 3509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p> 3519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * If {@link RingtoneManager#RingtoneManager(Activity)} was not used, the 3529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * caller should manage the returned cursor through its activity's life 3539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * cycle to prevent leaking the cursor. 3549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 3559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return A {@link Cursor} of all the ringtones available. 3569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #ID_COLUMN_INDEX 3579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #TITLE_COLUMN_INDEX 3589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #URI_COLUMN_INDEX 3599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 3609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public Cursor getCursor() { 3619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mCursor != null && mCursor.requery()) { 3629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mCursor; 3639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final Cursor internalCursor = getInternalRingtones(); 3669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final Cursor drmCursor = mIncludeDrm ? getDrmRingtones() : null; 3679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final Cursor mediaCursor = getMediaRingtones(); 3689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mCursor = new SortCursor(new Cursor[] { internalCursor, drmCursor, mediaCursor }, 370899725b05dd5c8c51f9f802d4f0a7190532ce0a5Marco Nelissen MediaStore.Audio.Media.DEFAULT_SORT_ORDER); 3719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 3749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Gets a {@link Ringtone} for the ringtone at the given position in the 3759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link Cursor}. 3769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 3779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param position The position (in the {@link Cursor}) of the ringtone. 3789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return A {@link Ringtone} pointing to the ringtone. 3799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 3809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public Ringtone getRingtone(int position) { 3819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mStopPreviousRingtone && mPreviousRingtone != null) { 3829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mPreviousRingtone.stop(); 3839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mPreviousRingtone = getRingtone(mContext, getRingtoneUri(position), inferStreamType()); 3869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mPreviousRingtone; 3879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 3909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Gets a {@link Uri} for the ringtone at the given position in the {@link Cursor}. 3919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 3929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param position The position (in the {@link Cursor}) of the ringtone. 3939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return A {@link Uri} pointing to the ringtone. 3949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 3959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public Uri getRingtoneUri(int position) { 3966dcf382b1b1dde5e6303a51a27f8d3b928072415Jeff Sharkey // use cursor directly instead of requerying it, which could easily 3976dcf382b1b1dde5e6303a51a27f8d3b928072415Jeff Sharkey // cause position to shuffle. 3986dcf382b1b1dde5e6303a51a27f8d3b928072415Jeff Sharkey if (mCursor == null || !mCursor.moveToPosition(position)) { 3999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return null; 4009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4026dcf382b1b1dde5e6303a51a27f8d3b928072415Jeff Sharkey return getUriFromCursor(mCursor); 4039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private static Uri getUriFromCursor(Cursor cursor) { 4069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return ContentUris.withAppendedId(Uri.parse(cursor.getString(URI_COLUMN_INDEX)), cursor 4079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project .getLong(ID_COLUMN_INDEX)); 4089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 4119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Gets the position of a {@link Uri} within this {@link RingtoneManager}. 4129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 4139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param ringtoneUri The {@link Uri} to retreive the position of. 4149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return The position of the {@link Uri}, or -1 if it cannot be found. 4159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 4169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public int getRingtonePosition(Uri ringtoneUri) { 4179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (ringtoneUri == null) return -1; 4199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final Cursor cursor = getCursor(); 4219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final int cursorCount = cursor.getCount(); 4229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!cursor.moveToFirst()) { 4249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return -1; 4259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Only create Uri objects when the actual URI changes 4289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Uri currentUri = null; 4299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String previousUriString = null; 4309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int i = 0; i < cursorCount; i++) { 4319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String uriString = cursor.getString(URI_COLUMN_INDEX); 4329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (currentUri == null || !uriString.equals(previousUriString)) { 4339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project currentUri = Uri.parse(uriString); 4349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (ringtoneUri.equals(ContentUris.withAppendedId(currentUri, cursor 4379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project .getLong(ID_COLUMN_INDEX)))) { 4389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return i; 4399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project cursor.move(1); 4429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project previousUriString = uriString; 4449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return -1; 4479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 4509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Returns a valid ringtone URI. No guarantees on which it returns. If it 4519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * cannot find one, returns null. 4529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 4539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param context The context to use for querying. 4549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return A ringtone URI, or null if one cannot be found. 4559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 4569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static Uri getValidRingtoneUri(Context context) { 4579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final RingtoneManager rm = new RingtoneManager(context); 4589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Uri uri = getValidRingtoneUriFromCursorAndClose(context, rm.getInternalRingtones()); 4609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (uri == null) { 4629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project uri = getValidRingtoneUriFromCursorAndClose(context, rm.getMediaRingtones()); 4639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (uri == null) { 4669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project uri = getValidRingtoneUriFromCursorAndClose(context, rm.getDrmRingtones()); 4679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return uri; 4709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private static Uri getValidRingtoneUriFromCursorAndClose(Context context, Cursor cursor) { 4739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (cursor != null) { 4749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Uri uri = null; 4759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (cursor.moveToFirst()) { 4779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project uri = getUriFromCursor(cursor); 4789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project cursor.close(); 4809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return uri; 4829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 4839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return null; 4849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private Cursor getInternalRingtones() { 4889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return query( 4899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project MediaStore.Audio.Media.INTERNAL_CONTENT_URI, INTERNAL_COLUMNS, 49082428a862f325238cfb5646bbd65de3f1a11e7ccGloria Wang constructBooleanTrueWhereClause(mFilterColumns, mIncludeDrm), 4919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project null, MediaStore.Audio.Media.DEFAULT_SORT_ORDER); 4929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private Cursor getDrmRingtones() { 4959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // DRM store does not have any columns to use for filtering 4969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return query( 4979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project DrmStore.Audio.CONTENT_URI, DRM_COLUMNS, 4989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project null, null, DrmStore.Audio.TITLE); 4999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private Cursor getMediaRingtones() { 5029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Get the external media cursor. First check to see if it is mounted. 5039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final String status = Environment.getExternalStorageState(); 5049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return (status.equals(Environment.MEDIA_MOUNTED) || 5069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project status.equals(Environment.MEDIA_MOUNTED_READ_ONLY)) 5079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ? query( 5089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project MediaStore.Audio.Media.EXTERNAL_CONTENT_URI, MEDIA_COLUMNS, 50982428a862f325238cfb5646bbd65de3f1a11e7ccGloria Wang constructBooleanTrueWhereClause(mFilterColumns, mIncludeDrm), null, 5109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project MediaStore.Audio.Media.DEFAULT_SORT_ORDER) 5119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project : null; 5129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private void setFilterColumnsList(int type) { 5159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project List<String> columns = mFilterColumns; 5169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project columns.clear(); 5179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if ((type & TYPE_RINGTONE) != 0) { 5199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project columns.add(MediaStore.Audio.AudioColumns.IS_RINGTONE); 5209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if ((type & TYPE_NOTIFICATION) != 0) { 5239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project columns.add(MediaStore.Audio.AudioColumns.IS_NOTIFICATION); 5249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if ((type & TYPE_ALARM) != 0) { 5279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project columns.add(MediaStore.Audio.AudioColumns.IS_ALARM); 5289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 5329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Constructs a where clause that consists of at least one column being 1 5339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * (true). This is used to find all matching sounds for the given sound 5349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * types (ringtone, notifications, etc.) 5359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 5369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param columns The columns that must be true. 5379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return The where clause. 5389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 53982428a862f325238cfb5646bbd65de3f1a11e7ccGloria Wang private static String constructBooleanTrueWhereClause(List<String> columns, boolean includeDrm) { 5409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (columns == null) return null; 5429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project StringBuilder sb = new StringBuilder(); 54482428a862f325238cfb5646bbd65de3f1a11e7ccGloria Wang sb.append("("); 54582428a862f325238cfb5646bbd65de3f1a11e7ccGloria Wang 5469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int i = columns.size() - 1; i >= 0; i--) { 5479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sb.append(columns.get(i)).append("=1 or "); 5489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (columns.size() > 0) { 5519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Remove last ' or ' 5529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sb.setLength(sb.length() - 4); 5539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 55482428a862f325238cfb5646bbd65de3f1a11e7ccGloria Wang 55582428a862f325238cfb5646bbd65de3f1a11e7ccGloria Wang sb.append(")"); 55682428a862f325238cfb5646bbd65de3f1a11e7ccGloria Wang 55782428a862f325238cfb5646bbd65de3f1a11e7ccGloria Wang if (!includeDrm) { 55882428a862f325238cfb5646bbd65de3f1a11e7ccGloria Wang // If not DRM files should be shown, the where clause 55982428a862f325238cfb5646bbd65de3f1a11e7ccGloria Wang // will be something like "(is_notification=1) and is_drm=0" 56082428a862f325238cfb5646bbd65de3f1a11e7ccGloria Wang sb.append(" and "); 56182428a862f325238cfb5646bbd65de3f1a11e7ccGloria Wang sb.append(MediaStore.MediaColumns.IS_DRM); 56282428a862f325238cfb5646bbd65de3f1a11e7ccGloria Wang sb.append("=0"); 56382428a862f325238cfb5646bbd65de3f1a11e7ccGloria Wang } 56482428a862f325238cfb5646bbd65de3f1a11e7ccGloria Wang 56582428a862f325238cfb5646bbd65de3f1a11e7ccGloria Wang 5669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return sb.toString(); 5679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private Cursor query(Uri uri, 5709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String[] projection, 5719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String selection, 5729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String[] selectionArgs, 5739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String sortOrder) { 5749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mActivity != null) { 5759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mActivity.managedQuery(uri, projection, selection, selectionArgs, sortOrder); 5769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 5779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mContext.getContentResolver().query(uri, projection, selection, selectionArgs, 5789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sortOrder); 5799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 5839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Returns a {@link Ringtone} for a given sound URI. 5849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p> 5859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * If the given URI cannot be opened for any reason, this method will 5869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * attempt to fallback on another sound. If it cannot find any, it will 5879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * return null. 5889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 5899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param context A context used to query. 5909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param ringtoneUri The {@link Uri} of a sound or ringtone. 5919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return A {@link Ringtone} for the given URI, or null. 5929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 5939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static Ringtone getRingtone(final Context context, Uri ringtoneUri) { 5949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Don't set the stream type 5959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return getRingtone(context, ringtoneUri, -1); 5969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 5999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Returns a {@link Ringtone} for a given sound URI on the given stream 6009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * type. Normally, if you change the stream type on the returned 6019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link Ringtone}, it will re-create the {@link MediaPlayer}. This is just 6029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * an optimized route to avoid that. 6039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 6049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param streamType The stream type for the ringtone, or -1 if it should 6059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * not be set (and the default used instead). 6069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #getRingtone(Context, Uri) 6079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 6089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private static Ringtone getRingtone(final Context context, Uri ringtoneUri, int streamType) { 6099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 610098d580cc2bb6c0891c756a4e5230c6c6b0d2376Jeff Sharkey final Ringtone r = new Ringtone(context, true); 6119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (streamType >= 0) { 6129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project r.setStreamType(streamType); 6139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 614098d580cc2bb6c0891c756a4e5230c6c6b0d2376Jeff Sharkey r.setUri(ringtoneUri); 6159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return r; 6169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (Exception ex) { 617098d580cc2bb6c0891c756a4e5230c6c6b0d2376Jeff Sharkey Log.e(TAG, "Failed to open ringtone " + ringtoneUri + ": " + ex); 6189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return null; 6219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 6249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Gets the current default sound's {@link Uri}. This will give the actual 6259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * sound {@link Uri}, instead of using this, most clients can use 6269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link System#DEFAULT_RINGTONE_URI}. 6279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 6289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param context A context used for querying. 6299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param type The type whose default sound should be returned. One of 6303156bb00dd3ab3d6ec732bb6a64a2e84d08c34f0Patrick Scott * {@link #TYPE_RINGTONE}, {@link #TYPE_NOTIFICATION}, or 6313156bb00dd3ab3d6ec732bb6a64a2e84d08c34f0Patrick Scott * {@link #TYPE_ALARM}. 6329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return A {@link Uri} pointing to the default sound for the sound type. 6339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #setActualDefaultRingtoneUri(Context, int, Uri) 6349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 6359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static Uri getActualDefaultRingtoneUri(Context context, int type) { 6369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String setting = getSettingForType(type); 6379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (setting == null) return null; 63869f593ccb7414ee98991b1da1a4bfbd9951e3570Marco Nelissen final String uriString = Settings.System.getString(context.getContentResolver(), setting); 63969f593ccb7414ee98991b1da1a4bfbd9951e3570Marco Nelissen return uriString != null ? Uri.parse(uriString) : null; 6409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 6439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Sets the {@link Uri} of the default sound for a given sound type. 6449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 6459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param context A context used for querying. 6469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param type The type whose default sound should be set. One of 6473156bb00dd3ab3d6ec732bb6a64a2e84d08c34f0Patrick Scott * {@link #TYPE_RINGTONE}, {@link #TYPE_NOTIFICATION}, or 6483156bb00dd3ab3d6ec732bb6a64a2e84d08c34f0Patrick Scott * {@link #TYPE_ALARM}. 6499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param ringtoneUri A {@link Uri} pointing to the default sound to set. 6509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #getActualDefaultRingtoneUri(Context, int) 6519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 6529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static void setActualDefaultRingtoneUri(Context context, int type, Uri ringtoneUri) { 6539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String setting = getSettingForType(type); 6549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (setting == null) return; 65569f593ccb7414ee98991b1da1a4bfbd9951e3570Marco Nelissen Settings.System.putString(context.getContentResolver(), setting, 65669f593ccb7414ee98991b1da1a4bfbd9951e3570Marco Nelissen ringtoneUri != null ? ringtoneUri.toString() : null); 6579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private static String getSettingForType(int type) { 6609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if ((type & TYPE_RINGTONE) != 0) { 6619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return Settings.System.RINGTONE; 6629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else if ((type & TYPE_NOTIFICATION) != 0) { 6639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return Settings.System.NOTIFICATION_SOUND; 6643156bb00dd3ab3d6ec732bb6a64a2e84d08c34f0Patrick Scott } else if ((type & TYPE_ALARM) != 0) { 6653156bb00dd3ab3d6ec732bb6a64a2e84d08c34f0Patrick Scott return Settings.System.ALARM_ALERT; 6669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 6679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return null; 6689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 6729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Returns whether the given {@link Uri} is one of the default ringtones. 6739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 6749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param ringtoneUri The ringtone {@link Uri} to be checked. 6759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return Whether the {@link Uri} is a default. 6769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 6779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static boolean isDefault(Uri ringtoneUri) { 6789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return getDefaultType(ringtoneUri) != -1; 6799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 6829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Returns the type of a default {@link Uri}. 6839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 6849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param defaultRingtoneUri The default {@link Uri}. For example, 6853156bb00dd3ab3d6ec732bb6a64a2e84d08c34f0Patrick Scott * {@link System#DEFAULT_RINGTONE_URI}, 6863156bb00dd3ab3d6ec732bb6a64a2e84d08c34f0Patrick Scott * {@link System#DEFAULT_NOTIFICATION_URI}, or 6873156bb00dd3ab3d6ec732bb6a64a2e84d08c34f0Patrick Scott * {@link System#DEFAULT_ALARM_ALERT_URI}. 6889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return The type of the defaultRingtoneUri, or -1. 6899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 6909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static int getDefaultType(Uri defaultRingtoneUri) { 6919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (defaultRingtoneUri == null) { 6929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return -1; 6939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else if (defaultRingtoneUri.equals(Settings.System.DEFAULT_RINGTONE_URI)) { 6949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return TYPE_RINGTONE; 6959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else if (defaultRingtoneUri.equals(Settings.System.DEFAULT_NOTIFICATION_URI)) { 6969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return TYPE_NOTIFICATION; 6973156bb00dd3ab3d6ec732bb6a64a2e84d08c34f0Patrick Scott } else if (defaultRingtoneUri.equals(Settings.System.DEFAULT_ALARM_ALERT_URI)) { 6983156bb00dd3ab3d6ec732bb6a64a2e84d08c34f0Patrick Scott return TYPE_ALARM; 6999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 7009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return -1; 7019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 7049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 7059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Returns the {@link Uri} for the default ringtone of a particular type. 7069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Rather than returning the actual ringtone's sound {@link Uri}, this will 7079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * return the symbolic {@link Uri} which will resolved to the actual sound 7089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * when played. 7099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 7109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param type The ringtone type whose default should be returned. 7119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return The {@link Uri} of the default ringtone for the given type. 7129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 7139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static Uri getDefaultUri(int type) { 7149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if ((type & TYPE_RINGTONE) != 0) { 7159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return Settings.System.DEFAULT_RINGTONE_URI; 7169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else if ((type & TYPE_NOTIFICATION) != 0) { 7179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return Settings.System.DEFAULT_NOTIFICATION_URI; 7183156bb00dd3ab3d6ec732bb6a64a2e84d08c34f0Patrick Scott } else if ((type & TYPE_ALARM) != 0) { 7193156bb00dd3ab3d6ec732bb6a64a2e84d08c34f0Patrick Scott return Settings.System.DEFAULT_ALARM_ALERT_URI; 7209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 7219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return null; 7229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 7259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 726