RingtonePickerActivity.java revision 370dd39132bf64f2a0703969a110c0d3b136c6eb
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 com.android.internal.app; 189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport com.android.internal.app.AlertActivity; 209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport com.android.internal.app.AlertController; 219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.DialogInterface; 239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.Intent; 249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.database.Cursor; 259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.media.Ringtone; 269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.media.RingtoneManager; 279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.net.Uri; 289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.Bundle; 299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.Handler; 309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.provider.MediaStore; 319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.provider.Settings; 329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.view.View; 339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.widget.AdapterView; 349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.widget.ListView; 359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.widget.TextView; 369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/** 389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The {@link RingtonePickerActivity} allows the user to choose one from all of the 399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * available ringtones. The chosen ringtone's URI will be persisted as a string. 409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see RingtoneManager#ACTION_RINGTONE_PICKER 429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpublic final class RingtonePickerActivity extends AlertActivity implements 449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project AdapterView.OnItemSelectedListener, Runnable, DialogInterface.OnClickListener, 459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project AlertController.AlertParams.OnPrepareListViewListener { 469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private static final String TAG = "RingtonePickerActivity"; 489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private static final int DELAY_MS_SELECTION_PLAYED = 300; 509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private RingtoneManager mRingtoneManager; 529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private Cursor mCursor; 549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private Handler mHandler; 559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** The position in the list of the 'Silent' item. */ 579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private int mSilentPos = -1; 589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** The position in the list of the 'Default' item. */ 609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private int mDefaultRingtonePos = -1; 619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** The position in the list of the last clicked item. */ 639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private int mClickedPos = -1; 649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** The position in the list of the ringtone to sample. */ 669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private int mSampleRingtonePos = -1; 679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** Whether this list has the 'Silent' item. */ 699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private boolean mHasSilentItem; 709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** The Uri to place a checkmark next to. */ 729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private Uri mExistingUri; 739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** The number of static items in the list. */ 759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private int mStaticItemCount; 769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** Whether this list has the 'Default' item. */ 789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private boolean mHasDefaultItem; 799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** The Uri to play when the 'Default' item is clicked. */ 819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private Uri mUriForDefaultItem; 829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * A Ringtone for the default ringtone. In most cases, the RingtoneManager 859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * will stop the previous ringtone. However, the RingtoneManager doesn't 869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * manage the default ringtone for us, so we should stop this one manually. 879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private Ringtone mDefaultRingtone; 899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private DialogInterface.OnClickListener mRingtoneClickListener = 919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project new DialogInterface.OnClickListener() { 929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /* 949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * On item clicked 959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void onClick(DialogInterface dialog, int which) { 979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Save the position of most recently clicked item 989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mClickedPos = which; 999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Play clip 1019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project playRingtone(which, 0); 1029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project }; 1059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 1079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project protected void onCreate(Bundle savedInstanceState) { 1089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project super.onCreate(savedInstanceState); 1099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mHandler = new Handler(); 1119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Intent intent = getIntent(); 1139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /* 1159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Get whether to show the 'Default' item, and the URI to play when the 1169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * default is clicked 1179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mHasDefaultItem = intent.getBooleanExtra(RingtoneManager.EXTRA_RINGTONE_SHOW_DEFAULT, true); 1199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mUriForDefaultItem = intent.getParcelableExtra(RingtoneManager.EXTRA_RINGTONE_DEFAULT_URI); 1209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mUriForDefaultItem == null) { 1219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mUriForDefaultItem = Settings.System.DEFAULT_RINGTONE_URI; 1229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Get whether to show the 'Silent' item 1259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mHasSilentItem = intent.getBooleanExtra(RingtoneManager.EXTRA_RINGTONE_SHOW_SILENT, true); 1269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Give the Activity so it can do managed queries 1289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mRingtoneManager = new RingtoneManager(this); 1299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Get whether to include DRM ringtones 1319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project boolean includeDrm = intent.getBooleanExtra(RingtoneManager.EXTRA_RINGTONE_INCLUDE_DRM, 1329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project true); 1339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mRingtoneManager.setIncludeDrm(includeDrm); 1349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Get the types of ringtones to show 1369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int types = intent.getIntExtra(RingtoneManager.EXTRA_RINGTONE_TYPE, -1); 1379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (types != -1) { 1389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mRingtoneManager.setType(types); 1399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mCursor = mRingtoneManager.getCursor(); 1429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // The volume keys will control the stream that we are choosing a ringtone for 1449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project setVolumeControlStream(mRingtoneManager.inferStreamType()); 1459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Get the URI whose list item should have a checkmark 1479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mExistingUri = intent 1489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project .getParcelableExtra(RingtoneManager.EXTRA_RINGTONE_EXISTING_URI); 1499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final AlertController.AlertParams p = mAlertParams; 1519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project p.mCursor = mCursor; 1529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project p.mOnClickListener = mRingtoneClickListener; 1539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project p.mLabelColumn = MediaStore.Audio.Media.TITLE; 1549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project p.mIsSingleChoice = true; 1559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project p.mOnItemSelectedListener = this; 1569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project p.mPositiveButtonText = getString(com.android.internal.R.string.ok); 1579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project p.mPositiveButtonListener = this; 1589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project p.mNegativeButtonText = getString(com.android.internal.R.string.cancel); 1599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project p.mPositiveButtonListener = this; 1609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project p.mOnPrepareListViewListener = this; 1619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project p.mTitle = intent.getCharSequenceExtra(RingtoneManager.EXTRA_RINGTONE_TITLE); 1639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (p.mTitle == null) { 1649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project p.mTitle = getString(com.android.internal.R.string.ringtone_picker_title); 1659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project setupAlert(); 1689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void onPrepareListView(ListView listView) { 1719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mHasDefaultItem) { 1739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mDefaultRingtonePos = addDefaultRingtoneItem(listView); 1749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (RingtoneManager.isDefault(mExistingUri)) { 1769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mClickedPos = mDefaultRingtonePos; 1779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mHasSilentItem) { 1819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mSilentPos = addSilentItem(listView); 1829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // The 'Silent' item should use a null Uri 1849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mExistingUri == null) { 1859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mClickedPos = mSilentPos; 1869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mClickedPos == -1) { 1909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mClickedPos = getListPosition(mRingtoneManager.getRingtonePosition(mExistingUri)); 1919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Put a checkmark next to an item. 1949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mAlertParams.mCheckedItem = mClickedPos; 1959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 1989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Adds a static item to the top of the list. A static item is one that is not from the 1999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * RingtoneManager. 2009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 2019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param listView The ListView to add to. 2029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param textResId The resource ID of the text for the item. 2039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return The position of the inserted item. 2049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 2059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private int addStaticItem(ListView listView, int textResId) { 2069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project TextView textView = (TextView) getLayoutInflater().inflate( 2079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project com.android.internal.R.layout.select_dialog_singlechoice, listView, false); 2089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project textView.setText(textResId); 2099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project listView.addHeaderView(textView); 2109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mStaticItemCount++; 2119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return listView.getHeaderViewsCount() - 1; 2129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private int addDefaultRingtoneItem(ListView listView) { 2159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return addStaticItem(listView, com.android.internal.R.string.ringtone_default); 2169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private int addSilentItem(ListView listView) { 2199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return addStaticItem(listView, com.android.internal.R.string.ringtone_silent); 2209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /* 2239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * On click of Ok/Cancel buttons 2249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 2259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void onClick(DialogInterface dialog, int which) { 2269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project boolean positiveResult = which == BUTTON1; 2279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Stop playing the previous ringtone 2299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mRingtoneManager.stopPreviousRingtone(); 2309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (positiveResult) { 2329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Intent resultIntent = new Intent(); 2339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Uri uri = null; 2349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mClickedPos == mDefaultRingtonePos) { 2369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Set it to the default Uri that they originally gave us 2379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project uri = mUriForDefaultItem; 2389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else if (mClickedPos == mSilentPos) { 2399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // A null Uri is for the 'Silent' item 2409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project uri = null; 2419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 2429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project uri = mRingtoneManager.getRingtoneUri(getRingtoneManagerPosition(mClickedPos)); 2439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project resultIntent.putExtra(RingtoneManager.EXTRA_RINGTONE_PICKED_URI, uri); 2469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project setResult(RESULT_OK, resultIntent); 2479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 2489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project setResult(RESULT_CANCELED); 2499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 250105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project 251105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project getWindow().getDecorView().post(new Runnable() { 252105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project public void run() { 253105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project mCursor.deactivate(); 254105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project } 255105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project }); 256105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project 2579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project finish(); 2589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /* 2619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * On item selected via keys 2629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 2639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void onItemSelected(AdapterView parent, View view, int position, long id) { 2649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project playRingtone(position, DELAY_MS_SELECTION_PLAYED); 2659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void onNothingSelected(AdapterView parent) { 2689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private void playRingtone(int position, int delayMs) { 2719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mHandler.removeCallbacks(this); 2729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mSampleRingtonePos = position; 2739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mHandler.postDelayed(this, delayMs); 2749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void run() { 2779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mSampleRingtonePos == mSilentPos) { 279370dd39132bf64f2a0703969a110c0d3b136c6ebDave Sparks mRingtoneManager.stopPreviousRingtone(); 2809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return; 2819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /* 2849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Stop the default ringtone, if it's playing (other ringtones will be 2859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * stopped by the RingtoneManager when we get another Ringtone from it. 2869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 2879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mDefaultRingtone != null && mDefaultRingtone.isPlaying()) { 2889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mDefaultRingtone.stop(); 2899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mDefaultRingtone = null; 2909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Ringtone ringtone; 2939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mSampleRingtonePos == mDefaultRingtonePos) { 2949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mDefaultRingtone == null) { 2959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mDefaultRingtone = RingtoneManager.getRingtone(this, mUriForDefaultItem); 2969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ringtone = mDefaultRingtone; 2989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /* 3009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Normally the non-static RingtoneManager.getRingtone stops the 3019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * previous ringtone, but we're getting the default ringtone outside 3029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * of the RingtoneManager instance, so let's stop the previous 3039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * ringtone manually. 3049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 3059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mRingtoneManager.stopPreviousRingtone(); 3069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 3089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ringtone = mRingtoneManager.getRingtone(getRingtoneManagerPosition(mSampleRingtonePos)); 3099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (ringtone != null) { 3129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ringtone.play(); 3139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 3179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project protected void onStop() { 3189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project super.onStop(); 3199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project stopAnyPlayingRingtone(); 3209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 3239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project protected void onPause() { 3249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project super.onPause(); 3259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project stopAnyPlayingRingtone(); 3269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private void stopAnyPlayingRingtone() { 3299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mDefaultRingtone != null && mDefaultRingtone.isPlaying()) { 3319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mDefaultRingtone.stop(); 3329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mRingtoneManager != null) { 3359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mRingtoneManager.stopPreviousRingtone(); 3369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private int getRingtoneManagerPosition(int listPos) { 3409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return listPos - mStaticItemCount; 3419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private int getListPosition(int ringtoneManagerPos) { 3449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // If the manager position is -1 (for not found), return that 3469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (ringtoneManagerPos < 0) return ringtoneManagerPos; 3479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return ringtoneManagerPos + mStaticItemCount; 3499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 352