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; 505c18ac651415ce71f8cb078a3ce9f5b5802d70ecAmith Yamasani 515c18ac651415ce71f8cb078a3ce9f5b5802d70ecAmith Yamasani private static final String SAVE_CLICKED_POS = "clicked_pos"; 525c18ac651415ce71f8cb078a3ce9f5b5802d70ecAmith Yamasani 539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private RingtoneManager mRingtoneManager; 549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private Cursor mCursor; 569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private Handler mHandler; 579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** The position in the list of the 'Silent' item. */ 599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private int mSilentPos = -1; 609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** The position in the list of the 'Default' item. */ 629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private int mDefaultRingtonePos = -1; 639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** The position in the list of the last clicked item. */ 659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private int mClickedPos = -1; 669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** The position in the list of the ringtone to sample. */ 689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private int mSampleRingtonePos = -1; 699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** Whether this list has the 'Silent' item. */ 719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private boolean mHasSilentItem; 729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** The Uri to place a checkmark next to. */ 749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private Uri mExistingUri; 759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** The number of static items in the list. */ 779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private int mStaticItemCount; 789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** Whether this list has the 'Default' item. */ 809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private boolean mHasDefaultItem; 819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** The Uri to play when the 'Default' item is clicked. */ 839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private Uri mUriForDefaultItem; 849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * A Ringtone for the default ringtone. In most cases, the RingtoneManager 879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * will stop the previous ringtone. However, the RingtoneManager doesn't 889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * manage the default ringtone for us, so we should stop this one manually. 899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private Ringtone mDefaultRingtone; 919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private DialogInterface.OnClickListener mRingtoneClickListener = 939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project new DialogInterface.OnClickListener() { 949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /* 969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * On item clicked 979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void onClick(DialogInterface dialog, int which) { 999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Save the position of most recently clicked item 1009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mClickedPos = which; 1019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Play clip 1039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project playRingtone(which, 0); 1049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project }; 1079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 1099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project protected void onCreate(Bundle savedInstanceState) { 1109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project super.onCreate(savedInstanceState); 1119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mHandler = new Handler(); 1139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Intent intent = getIntent(); 1159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /* 1179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Get whether to show the 'Default' item, and the URI to play when the 1189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * default is clicked 1199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mHasDefaultItem = intent.getBooleanExtra(RingtoneManager.EXTRA_RINGTONE_SHOW_DEFAULT, true); 1219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mUriForDefaultItem = intent.getParcelableExtra(RingtoneManager.EXTRA_RINGTONE_DEFAULT_URI); 1229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mUriForDefaultItem == null) { 1239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mUriForDefaultItem = Settings.System.DEFAULT_RINGTONE_URI; 1249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1255c18ac651415ce71f8cb078a3ce9f5b5802d70ecAmith Yamasani 1265c18ac651415ce71f8cb078a3ce9f5b5802d70ecAmith Yamasani if (savedInstanceState != null) { 1275c18ac651415ce71f8cb078a3ce9f5b5802d70ecAmith Yamasani mClickedPos = savedInstanceState.getInt(SAVE_CLICKED_POS, -1); 1285c18ac651415ce71f8cb078a3ce9f5b5802d70ecAmith Yamasani } 1299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Get whether to show the 'Silent' item 1309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mHasSilentItem = intent.getBooleanExtra(RingtoneManager.EXTRA_RINGTONE_SHOW_SILENT, true); 1319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Give the Activity so it can do managed queries 1339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mRingtoneManager = new RingtoneManager(this); 1349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Get whether to include DRM ringtones 1369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project boolean includeDrm = intent.getBooleanExtra(RingtoneManager.EXTRA_RINGTONE_INCLUDE_DRM, 1379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project true); 1389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mRingtoneManager.setIncludeDrm(includeDrm); 1399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Get the types of ringtones to show 1419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int types = intent.getIntExtra(RingtoneManager.EXTRA_RINGTONE_TYPE, -1); 1429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (types != -1) { 1439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mRingtoneManager.setType(types); 1449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mCursor = mRingtoneManager.getCursor(); 1479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // The volume keys will control the stream that we are choosing a ringtone for 1499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project setVolumeControlStream(mRingtoneManager.inferStreamType()); 1509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Get the URI whose list item should have a checkmark 1529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mExistingUri = intent 1539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project .getParcelableExtra(RingtoneManager.EXTRA_RINGTONE_EXISTING_URI); 1549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final AlertController.AlertParams p = mAlertParams; 1569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project p.mCursor = mCursor; 1579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project p.mOnClickListener = mRingtoneClickListener; 1589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project p.mLabelColumn = MediaStore.Audio.Media.TITLE; 1599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project p.mIsSingleChoice = true; 1609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project p.mOnItemSelectedListener = this; 1619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project p.mPositiveButtonText = getString(com.android.internal.R.string.ok); 1629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project p.mPositiveButtonListener = this; 1639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project p.mNegativeButtonText = getString(com.android.internal.R.string.cancel); 1649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project p.mPositiveButtonListener = this; 1659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project p.mOnPrepareListViewListener = this; 1669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project p.mTitle = intent.getCharSequenceExtra(RingtoneManager.EXTRA_RINGTONE_TITLE); 1689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (p.mTitle == null) { 1699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project p.mTitle = getString(com.android.internal.R.string.ringtone_picker_title); 1709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project setupAlert(); 1739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1755c18ac651415ce71f8cb078a3ce9f5b5802d70ecAmith Yamasani @Override 1765c18ac651415ce71f8cb078a3ce9f5b5802d70ecAmith Yamasani public void onSaveInstanceState(Bundle outState) { 1775c18ac651415ce71f8cb078a3ce9f5b5802d70ecAmith Yamasani super.onSaveInstanceState(outState); 1785c18ac651415ce71f8cb078a3ce9f5b5802d70ecAmith Yamasani outState.putInt(SAVE_CLICKED_POS, mClickedPos); 1795c18ac651415ce71f8cb078a3ce9f5b5802d70ecAmith Yamasani } 1805c18ac651415ce71f8cb078a3ce9f5b5802d70ecAmith Yamasani 1819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void onPrepareListView(ListView listView) { 1829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mHasDefaultItem) { 1849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mDefaultRingtonePos = addDefaultRingtoneItem(listView); 1859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (RingtoneManager.isDefault(mExistingUri)) { 1879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mClickedPos = mDefaultRingtonePos; 1889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mHasSilentItem) { 1929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mSilentPos = addSilentItem(listView); 1939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // The 'Silent' item should use a null Uri 1959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mExistingUri == null) { 1969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mClickedPos = mSilentPos; 1979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mClickedPos == -1) { 2019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mClickedPos = getListPosition(mRingtoneManager.getRingtonePosition(mExistingUri)); 2029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Put a checkmark next to an item. 2059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mAlertParams.mCheckedItem = mClickedPos; 2069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 2099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Adds a static item to the top of the list. A static item is one that is not from the 2109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * RingtoneManager. 2119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 2129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param listView The ListView to add to. 2139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param textResId The resource ID of the text for the item. 2149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return The position of the inserted item. 2159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 2169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private int addStaticItem(ListView listView, int textResId) { 2179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project TextView textView = (TextView) getLayoutInflater().inflate( 218fe7630e64828499a3566ea8030036e2b9555f815Amith Yamasani com.android.internal.R.layout.select_dialog_singlechoice_holo, listView, false); 2199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project textView.setText(textResId); 2209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project listView.addHeaderView(textView); 2219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mStaticItemCount++; 2229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return listView.getHeaderViewsCount() - 1; 2239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private int addDefaultRingtoneItem(ListView listView) { 2269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return addStaticItem(listView, com.android.internal.R.string.ringtone_default); 2279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private int addSilentItem(ListView listView) { 2309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return addStaticItem(listView, com.android.internal.R.string.ringtone_silent); 2319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /* 2349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * On click of Ok/Cancel buttons 2359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 2369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void onClick(DialogInterface dialog, int which) { 23715d24708b1c33188c97e3be5be94131acd8e095dChristian Mehlmauer boolean positiveResult = which == DialogInterface.BUTTON_POSITIVE; 2389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Stop playing the previous ringtone 2409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mRingtoneManager.stopPreviousRingtone(); 2419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (positiveResult) { 2439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Intent resultIntent = new Intent(); 2449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Uri uri = null; 2459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mClickedPos == mDefaultRingtonePos) { 2479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Set it to the default Uri that they originally gave us 2489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project uri = mUriForDefaultItem; 2499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else if (mClickedPos == mSilentPos) { 2509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // A null Uri is for the 'Silent' item 2519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project uri = null; 2529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 2539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project uri = mRingtoneManager.getRingtoneUri(getRingtoneManagerPosition(mClickedPos)); 2549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project resultIntent.putExtra(RingtoneManager.EXTRA_RINGTONE_PICKED_URI, uri); 2579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project setResult(RESULT_OK, resultIntent); 2589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 2599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project setResult(RESULT_CANCELED); 2609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 261105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project 262105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project getWindow().getDecorView().post(new Runnable() { 263105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project public void run() { 264105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project mCursor.deactivate(); 265105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project } 266105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project }); 267105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project 2689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project finish(); 2699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /* 2729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * On item selected via keys 2739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 2749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void onItemSelected(AdapterView parent, View view, int position, long id) { 2759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project playRingtone(position, DELAY_MS_SELECTION_PLAYED); 2769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void onNothingSelected(AdapterView parent) { 2799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private void playRingtone(int position, int delayMs) { 2829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mHandler.removeCallbacks(this); 2839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mSampleRingtonePos = position; 2849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mHandler.postDelayed(this, delayMs); 2859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void run() { 2889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mSampleRingtonePos == mSilentPos) { 290370dd39132bf64f2a0703969a110c0d3b136c6ebDave Sparks mRingtoneManager.stopPreviousRingtone(); 2919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return; 2929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /* 2959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Stop the default ringtone, if it's playing (other ringtones will be 2969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * stopped by the RingtoneManager when we get another Ringtone from it. 2979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 2989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mDefaultRingtone != null && mDefaultRingtone.isPlaying()) { 2999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mDefaultRingtone.stop(); 3009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mDefaultRingtone = null; 3019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Ringtone ringtone; 3049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mSampleRingtonePos == mDefaultRingtonePos) { 3059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mDefaultRingtone == null) { 3069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mDefaultRingtone = RingtoneManager.getRingtone(this, mUriForDefaultItem); 3079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ringtone = mDefaultRingtone; 3099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /* 3119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Normally the non-static RingtoneManager.getRingtone stops the 3129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * previous ringtone, but we're getting the default ringtone outside 3139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * of the RingtoneManager instance, so let's stop the previous 3149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * ringtone manually. 3159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 3169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mRingtoneManager.stopPreviousRingtone(); 3179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 3199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ringtone = mRingtoneManager.getRingtone(getRingtoneManagerPosition(mSampleRingtonePos)); 3209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (ringtone != null) { 3239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ringtone.play(); 3249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 3289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project protected void onStop() { 3299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project super.onStop(); 3309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project stopAnyPlayingRingtone(); 3319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 3349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project protected void onPause() { 3359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project super.onPause(); 3369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project stopAnyPlayingRingtone(); 3379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private void stopAnyPlayingRingtone() { 3409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mDefaultRingtone != null && mDefaultRingtone.isPlaying()) { 3429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mDefaultRingtone.stop(); 3439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mRingtoneManager != null) { 3469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mRingtoneManager.stopPreviousRingtone(); 3479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private int getRingtoneManagerPosition(int listPos) { 3519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return listPos - mStaticItemCount; 3529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private int getListPosition(int ringtoneManagerPos) { 3559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // If the manager position is -1 (for not found), return that 3579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (ringtoneManagerPos < 0) return ringtoneManagerPos; 3589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return ringtoneManagerPos + mStaticItemCount; 3609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 363