FileDocCategorySizeDatePackage
RingtonePickerActivity.javaAPI DocAndroid 1.5 API11791Wed May 06 22:41:56 BST 2009com.android.internal.app

RingtonePickerActivity

public final class RingtonePickerActivity extends com.android.internal.app.AlertActivity implements DialogInterface.OnClickListener, AlertController.AlertParams.OnPrepareListViewListener, Runnable, AdapterView.OnItemSelectedListener
The {@link RingtonePickerActivity} allows the user to choose one from all of the available ringtones. The chosen ringtone's URI will be persisted as a string.
see
RingtoneManager#ACTION_RINGTONE_PICKER

Fields Summary
private static final String
TAG
private static final int
DELAY_MS_SELECTION_PLAYED
private android.media.RingtoneManager
mRingtoneManager
private android.database.Cursor
mCursor
private android.os.Handler
mHandler
private int
mSilentPos
The position in the list of the 'Silent' item.
private int
mDefaultRingtonePos
The position in the list of the 'Default' item.
private int
mClickedPos
The position in the list of the last clicked item.
private int
mSampleRingtonePos
The position in the list of the ringtone to sample.
private boolean
mHasSilentItem
Whether this list has the 'Silent' item.
private android.net.Uri
mExistingUri
The Uri to place a checkmark next to.
private int
mStaticItemCount
The number of static items in the list.
private boolean
mHasDefaultItem
Whether this list has the 'Default' item.
private android.net.Uri
mUriForDefaultItem
The Uri to play when the 'Default' item is clicked.
private android.media.Ringtone
mDefaultRingtone
A Ringtone for the default ringtone. In most cases, the RingtoneManager will stop the previous ringtone. However, the RingtoneManager doesn't manage the default ringtone for us, so we should stop this one manually.
private DialogInterface.OnClickListener
mRingtoneClickListener
Constructors Summary
Methods Summary
private intaddDefaultRingtoneItem(android.widget.ListView listView)

        return addStaticItem(listView, com.android.internal.R.string.ringtone_default);
    
private intaddSilentItem(android.widget.ListView listView)

        return addStaticItem(listView, com.android.internal.R.string.ringtone_silent);
    
private intaddStaticItem(android.widget.ListView listView, int textResId)
Adds a static item to the top of the list. A static item is one that is not from the RingtoneManager.

param
listView The ListView to add to.
param
textResId The resource ID of the text for the item.
return
The position of the inserted item.

        TextView textView = (TextView) getLayoutInflater().inflate(
                com.android.internal.R.layout.select_dialog_singlechoice, listView, false);
        textView.setText(textResId);
        listView.addHeaderView(textView);
        mStaticItemCount++;
        return listView.getHeaderViewsCount() - 1;
    
private intgetListPosition(int ringtoneManagerPos)

        
        // If the manager position is -1 (for not found), return that
        if (ringtoneManagerPos < 0) return ringtoneManagerPos;
        
        return ringtoneManagerPos + mStaticItemCount;
    
private intgetRingtoneManagerPosition(int listPos)

        return listPos - mStaticItemCount;
    
public voidonClick(android.content.DialogInterface dialog, int which)

        boolean positiveResult = which == BUTTON1;
        
        // Stop playing the previous ringtone
        mRingtoneManager.stopPreviousRingtone();
        
        if (positiveResult) {
            Intent resultIntent = new Intent();
            Uri uri = null;
            
            if (mClickedPos == mDefaultRingtonePos) {
                // Set it to the default Uri that they originally gave us
                uri = mUriForDefaultItem;
            } else if (mClickedPos == mSilentPos) {
                // A null Uri is for the 'Silent' item
                uri = null;
            } else {
                uri = mRingtoneManager.getRingtoneUri(getRingtoneManagerPosition(mClickedPos));
            }

            resultIntent.putExtra(RingtoneManager.EXTRA_RINGTONE_PICKED_URI, uri);
            setResult(RESULT_OK, resultIntent);
        } else {
            setResult(RESULT_CANCELED);
        }

        getWindow().getDecorView().post(new Runnable() {
            public void run() {
                mCursor.deactivate();
            }
        });

        finish();
    
protected voidonCreate(android.os.Bundle savedInstanceState)


    
        
        super.onCreate(savedInstanceState);

        mHandler = new Handler();

        Intent intent = getIntent();

        /*
         * Get whether to show the 'Default' item, and the URI to play when the
         * default is clicked
         */
        mHasDefaultItem = intent.getBooleanExtra(RingtoneManager.EXTRA_RINGTONE_SHOW_DEFAULT, true);
        mUriForDefaultItem = intent.getParcelableExtra(RingtoneManager.EXTRA_RINGTONE_DEFAULT_URI);
        if (mUriForDefaultItem == null) {
            mUriForDefaultItem = Settings.System.DEFAULT_RINGTONE_URI;
        }
        
        // Get whether to show the 'Silent' item
        mHasSilentItem = intent.getBooleanExtra(RingtoneManager.EXTRA_RINGTONE_SHOW_SILENT, true);
        
        // Give the Activity so it can do managed queries
        mRingtoneManager = new RingtoneManager(this);

        // Get whether to include DRM ringtones
        boolean includeDrm = intent.getBooleanExtra(RingtoneManager.EXTRA_RINGTONE_INCLUDE_DRM,
                true);
        mRingtoneManager.setIncludeDrm(includeDrm);
        
        // Get the types of ringtones to show
        int types = intent.getIntExtra(RingtoneManager.EXTRA_RINGTONE_TYPE, -1);
        if (types != -1) {
            mRingtoneManager.setType(types);
        }
        
        mCursor = mRingtoneManager.getCursor();
        
        // The volume keys will control the stream that we are choosing a ringtone for
        setVolumeControlStream(mRingtoneManager.inferStreamType());

        // Get the URI whose list item should have a checkmark
        mExistingUri = intent
                .getParcelableExtra(RingtoneManager.EXTRA_RINGTONE_EXISTING_URI);

        final AlertController.AlertParams p = mAlertParams;
        p.mCursor = mCursor;
        p.mOnClickListener = mRingtoneClickListener;
        p.mLabelColumn = MediaStore.Audio.Media.TITLE;
        p.mIsSingleChoice = true;
        p.mOnItemSelectedListener = this;
        p.mPositiveButtonText = getString(com.android.internal.R.string.ok);
        p.mPositiveButtonListener = this;
        p.mNegativeButtonText = getString(com.android.internal.R.string.cancel);
        p.mPositiveButtonListener = this;
        p.mOnPrepareListViewListener = this;

        p.mTitle = intent.getCharSequenceExtra(RingtoneManager.EXTRA_RINGTONE_TITLE);
        if (p.mTitle == null) {
            p.mTitle = getString(com.android.internal.R.string.ringtone_picker_title);
        }
        
        setupAlert();
    
public voidonItemSelected(android.widget.AdapterView parent, android.view.View view, int position, long id)

        playRingtone(position, DELAY_MS_SELECTION_PLAYED);
    
public voidonNothingSelected(android.widget.AdapterView parent)

    
protected voidonPause()

        super.onPause();
        stopAnyPlayingRingtone();
    
public voidonPrepareListView(android.widget.ListView listView)

        
        if (mHasDefaultItem) {
            mDefaultRingtonePos = addDefaultRingtoneItem(listView);
            
            if (RingtoneManager.isDefault(mExistingUri)) {
                mClickedPos = mDefaultRingtonePos;
            }
        }
        
        if (mHasSilentItem) {
            mSilentPos = addSilentItem(listView);
            
            // The 'Silent' item should use a null Uri
            if (mExistingUri == null) {
                mClickedPos = mSilentPos;
            }
        }

        if (mClickedPos == -1) {
            mClickedPos = getListPosition(mRingtoneManager.getRingtonePosition(mExistingUri));
        }
        
        // Put a checkmark next to an item.
        mAlertParams.mCheckedItem = mClickedPos;
    
protected voidonStop()

        super.onStop();
        stopAnyPlayingRingtone();
    
private voidplayRingtone(int position, int delayMs)

        mHandler.removeCallbacks(this);
        mSampleRingtonePos = position;
        mHandler.postDelayed(this, delayMs);
    
public voidrun()

        
        if (mSampleRingtonePos == mSilentPos) {
            return;
        }
        
        /*
         * Stop the default ringtone, if it's playing (other ringtones will be
         * stopped by the RingtoneManager when we get another Ringtone from it.
         */
        if (mDefaultRingtone != null && mDefaultRingtone.isPlaying()) {
            mDefaultRingtone.stop();
            mDefaultRingtone = null;
        }
        
        Ringtone ringtone;
        if (mSampleRingtonePos == mDefaultRingtonePos) {
            if (mDefaultRingtone == null) {
                mDefaultRingtone = RingtoneManager.getRingtone(this, mUriForDefaultItem);
            }
            ringtone = mDefaultRingtone;
            
            /*
             * Normally the non-static RingtoneManager.getRingtone stops the
             * previous ringtone, but we're getting the default ringtone outside
             * of the RingtoneManager instance, so let's stop the previous
             * ringtone manually.
             */
            mRingtoneManager.stopPreviousRingtone();
            
        } else {
            ringtone = mRingtoneManager.getRingtone(getRingtoneManagerPosition(mSampleRingtonePos));
        }
        
        if (ringtone != null) {
            ringtone.play();
        }
    
private voidstopAnyPlayingRingtone()


        if (mDefaultRingtone != null && mDefaultRingtone.isPlaying()) {
            mDefaultRingtone.stop();
        }
        
        if (mRingtoneManager != null) {
            mRingtoneManager.stopPreviousRingtone();
        }