| package com.android.phone.settings; |
| |
| import android.content.Context; |
| import android.media.RingtoneManager; |
| import android.net.Uri; |
| import android.os.Handler; |
| import android.os.Message; |
| import android.preference.Preference; |
| import android.preference.RingtonePreference; |
| import android.util.AttributeSet; |
| |
| import com.android.internal.telephony.Phone; |
| import com.android.phone.common.util.SettingsUtil; |
| |
| /** |
| * Looks up the voicemail ringtone's name asynchronously and updates the preference's summary when |
| * it is created or updated. |
| */ |
| public class VoicemailRingtonePreference extends RingtonePreference { |
| public interface VoicemailRingtoneNameChangeListener { |
| void onVoicemailRingtoneNameChanged(CharSequence name); |
| } |
| |
| private static final int MSG_UPDATE_VOICEMAIL_RINGTONE_SUMMARY = 1; |
| |
| private VoicemailRingtoneNameChangeListener mVoicemailRingtoneNameChangeListener; |
| private Runnable mVoicemailRingtoneLookupRunnable; |
| private Handler mVoicemailRingtoneLookupComplete; |
| |
| private Phone mPhone; |
| |
| public VoicemailRingtonePreference(Context context, AttributeSet attrs) { |
| super(context, attrs); |
| |
| mVoicemailRingtoneLookupComplete = new Handler() { |
| @Override |
| public void handleMessage(Message msg) { |
| switch (msg.what) { |
| case MSG_UPDATE_VOICEMAIL_RINGTONE_SUMMARY: |
| if (mVoicemailRingtoneNameChangeListener != null) { |
| mVoicemailRingtoneNameChangeListener.onVoicemailRingtoneNameChanged( |
| (CharSequence) msg.obj); |
| } |
| setSummary((CharSequence) msg.obj); |
| break; |
| } |
| } |
| }; |
| } |
| |
| public void init(Phone phone, CharSequence oldRingtoneName) { |
| mPhone = phone; |
| |
| // Requesting the ringtone will trigger migration if necessary. |
| VoicemailNotificationSettingsUtil.getRingtoneUri(phone); |
| |
| final Preference preference = this; |
| final String preferenceKey = |
| VoicemailNotificationSettingsUtil.getVoicemailRingtoneSharedPrefsKey(mPhone); |
| setSummary(oldRingtoneName); |
| mVoicemailRingtoneLookupRunnable = new Runnable() { |
| @Override |
| public void run() { |
| SettingsUtil.updateRingtoneName( |
| preference.getContext(), |
| mVoicemailRingtoneLookupComplete, |
| RingtoneManager.TYPE_NOTIFICATION, |
| preferenceKey, |
| MSG_UPDATE_VOICEMAIL_RINGTONE_SUMMARY); |
| } |
| }; |
| |
| updateRingtoneName(); |
| } |
| |
| public void setVoicemailRingtoneNameChangeListener(VoicemailRingtoneNameChangeListener l) { |
| mVoicemailRingtoneNameChangeListener = l; |
| } |
| |
| @Override |
| protected Uri onRestoreRingtone() { |
| return VoicemailNotificationSettingsUtil.getRingtoneUri(mPhone); |
| } |
| |
| @Override |
| protected void onSaveRingtone(Uri ringtoneUri) { |
| // Don't call superclass method because it uses the pref key as the SharedPreferences key. |
| // Delegate to the voicemail notification utility to save the ringtone instead. |
| VoicemailNotificationSettingsUtil.setRingtoneUri(mPhone, ringtoneUri); |
| |
| updateRingtoneName(); |
| } |
| |
| private void updateRingtoneName() { |
| new Thread(mVoicemailRingtoneLookupRunnable).start(); |
| } |
| } |