Sound settings screen and volumes dialog reconfiguration.

Removed the "Notifications use ring volume" checkbox.

Show the current ringtones in the summary area.

Bug: 5032308
Change-Id: I17e63f32c1775dd2097904df1aa6aaf699bd8ae2
diff --git a/src/com/android/settings/RingerVolumePreference.java b/src/com/android/settings/RingerVolumePreference.java
index f850b08..129edee 100644
--- a/src/com/android/settings/RingerVolumePreference.java
+++ b/src/com/android/settings/RingerVolumePreference.java
@@ -51,49 +51,46 @@
  * Special preference type that allows configuration of both the ring volume and
  * notification volume.
  */
-public class RingerVolumePreference extends VolumePreference implements
-        CheckBox.OnCheckedChangeListener, OnClickListener {
+public class RingerVolumePreference extends VolumePreference implements OnClickListener {
     private static final String TAG = "RingerVolumePreference";
     private static final int MSG_RINGER_MODE_CHANGED = 101;
 
-    private CheckBox mNotificationsUseRingVolumeCheckbox;
     private SeekBarVolumizer [] mSeekBarVolumizer;
     private boolean mIgnoreVolumeKeys;
 
     // These arrays must all match in length and order
     private static final int[] SEEKBAR_ID = new int[] {
-        R.id.notification_volume_seekbar,
         R.id.media_volume_seekbar,
+        R.id.ringer_volume_seekbar,
+        R.id.notification_volume_seekbar,
         R.id.alarm_volume_seekbar
     };
 
-    private static final int[] NEED_VOICE_CAPABILITY_ID = new int[] {
-        R.id.ringtone_label,
-        com.android.internal.R.id.seekbar,
-        R.id.same_notification_volume
-    };
-
     private static final int[] SEEKBAR_TYPE = new int[] {
-        AudioManager.STREAM_NOTIFICATION,
         AudioManager.STREAM_MUSIC,
+        AudioManager.STREAM_RING,
+        AudioManager.STREAM_NOTIFICATION,
         AudioManager.STREAM_ALARM
     };
 
     private static final int[] CHECKBOX_VIEW_ID = new int[] {
+        R.id.media_mute_button,
+        R.id.ringer_mute_button,
         R.id.notification_mute_button,
-        R.id.volume_mute_button,
         R.id.alarm_mute_button
     };
 
     private static final int[] SEEKBAR_MUTED_RES_ID = new int[] {
-        com.android.internal.R.drawable.ic_audio_notification_mute,
         com.android.internal.R.drawable.ic_audio_vol_mute,
+        com.android.internal.R.drawable.ic_audio_ring_notif_mute,
+        com.android.internal.R.drawable.ic_audio_notification_mute,
         com.android.internal.R.drawable.ic_audio_alarm_mute
     };
 
     private static final int[] SEEKBAR_UNMUTED_RES_ID = new int[] {
-        com.android.internal.R.drawable.ic_audio_notification,
         com.android.internal.R.drawable.ic_audio_vol,
+        com.android.internal.R.drawable.ic_audio_ring_notif,
+        com.android.internal.R.drawable.ic_audio_notification,
         com.android.internal.R.drawable.ic_audio_alarm
     };
 
@@ -167,21 +164,6 @@
             }
         }
 
-        //mNotificationVolumeTitle = (TextView) view.findViewById(R.id.notification_volume_title);
-        mNotificationsUseRingVolumeCheckbox =
-                (CheckBox) view.findViewById(R.id.same_notification_volume);
-        mNotificationsUseRingVolumeCheckbox.setOnCheckedChangeListener(this);
-        mNotificationsUseRingVolumeCheckbox.setChecked(Settings.System.getInt(
-                        getContext().getContentResolver(),
-                        Settings.System.NOTIFICATIONS_USE_RING_VOLUME, 1) == 1);
-        // Notification volume always visible for non voice capable devices
-        if (Utils.isVoiceCapable(getContext())) {
-            setNotificationVolumeVisibility(!mNotificationsUseRingVolumeCheckbox.isChecked());
-        } else {
-            setNotificationVolumeVisibility(true);
-        }
-        disableSettingsThatNeedVoice(view);
-
         // Register callbacks for mute/unmute buttons
         for (int i = 0; i < mCheckBoxes.length; i++) {
             ImageView checkbox = (ImageView) view.findViewById(CHECKBOX_VIEW_ID[i]);
@@ -207,6 +189,16 @@
             };
             getContext().registerReceiver(mRingModeChangedReceiver, filter);
         }
+
+        // Disable either ringer+notifications or notifications
+        int id;
+        if (!Utils.isVoiceCapable(getContext())) {
+            id = R.id.ringer_section;
+        } else {
+            id = R.id.notification_section;
+        }
+        View hideSection = view.findViewById(id);
+        hideSection.setVisibility(View.GONE);
     }
 
     private Uri getMediaVolumeUri(Context context) {
@@ -215,15 +207,6 @@
                 + "/" + R.raw.media_volume);
     }
 
-    private void disableSettingsThatNeedVoice(View parent) {
-        final boolean voiceCapable = Utils.isVoiceCapable(getContext());
-        if (!voiceCapable) {
-            for (int id : NEED_VOICE_CAPABILITY_ID) {
-                parent.findViewById(id).setVisibility(View.GONE);
-            }
-        }
-    }
-
     @Override
     protected void onDialogClosed(boolean positiveResult) {
         super.onDialogClosed(positiveResult);
@@ -242,23 +225,6 @@
         cleanup();
     }
 
-    public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
-        // ignore R.id.same_notification_volume checkbox for non voice capable devices
-        if (Utils.isVoiceCapable(getContext())) {
-            setNotificationVolumeVisibility(!isChecked);
-
-            Settings.System.putInt(getContext().getContentResolver(),
-                    Settings.System.NOTIFICATIONS_USE_RING_VOLUME, isChecked ? 1 : 0);
-
-            if (isChecked) {
-                // The user wants the notification to be same as ring, so do a
-                // one-time sync right now
-                mAudioManager.setStreamVolume(AudioManager.STREAM_NOTIFICATION,
-                        mAudioManager.getStreamVolume(AudioManager.STREAM_RING), 0);
-            }
-        }
-    }
-
     @Override
     public boolean onKey(View v, int keyCode, KeyEvent event) {
         boolean isdown = (event.getAction() == KeyEvent.ACTION_DOWN);
@@ -284,14 +250,6 @@
         }
     }
 
-    private void setNotificationVolumeVisibility(boolean visible) {
-        if (mSeekBarVolumizer[0] != null) {
-            mSeekBarVolumizer[0].getSeekBar().setVisibility(
-                    visible ? View.VISIBLE : View.GONE);
-        }
-        // mNotificationVolumeTitle.setVisibility(visible ? View.VISIBLE : View.GONE);
-    }
-
     private void cleanup() {
         for (int i = 0; i < SEEKBAR_ID.length; i++) {
             if (mSeekBarVolumizer[i] != null) {
diff --git a/src/com/android/settings/SoundSettings.java b/src/com/android/settings/SoundSettings.java
index f6090c2..d1f8247 100644
--- a/src/com/android/settings/SoundSettings.java
+++ b/src/com/android/settings/SoundSettings.java
@@ -23,16 +23,25 @@
 import android.content.IntentFilter;
 import android.content.pm.PackageManager;
 import android.content.pm.ResolveInfo;
+import android.database.Cursor;
+import android.database.sqlite.SQLiteException;
 import android.media.AudioManager;
+import android.media.Ringtone;
+import android.media.RingtoneManager;
 import android.media.audiofx.AudioEffect;
+import android.net.Uri;
 import android.os.Bundle;
+import android.os.Handler;
+import android.os.Message;
 import android.os.Vibrator;
 import android.preference.CheckBoxPreference;
 import android.preference.ListPreference;
 import android.preference.Preference;
 import android.preference.PreferenceGroup;
 import android.preference.PreferenceScreen;
+import android.provider.MediaStore;
 import android.provider.Settings;
+import android.provider.MediaStore.Images.Media;
 import android.provider.Settings.SettingNotFoundException;
 import android.telephony.TelephonyManager;
 import android.util.Log;
@@ -41,7 +50,7 @@
 
 public class SoundSettings extends SettingsPreferenceFragment implements
         Preference.OnPreferenceChangeListener {
-    private static final String TAG = "SoundAndDisplaysSettings";
+    private static final String TAG = "SoundSettings";
 
     /** If there is no setting in the provider, use this. */
     private static final int FALLBACK_EMERGENCY_TONE_VALUE = 0;
@@ -60,7 +69,6 @@
     private static final String KEY_RINGTONE = "ringtone";
     private static final String KEY_NOTIFICATION_SOUND = "notification_sound";
     private static final String KEY_CATEGORY_CALLS = "category_calls";
-    private static final String KEY_CATEGORY_NOTIFICATION = "category_notification";
 
     private static final String VALUE_VIBRATE_NEVER = "never";
     private static final String VALUE_VIBRATE_ALWAYS = "always";
@@ -72,6 +80,9 @@
             KEY_EMERGENCY_TONE
     };
 
+    private static final int MSG_UPDATE_RINGTONE_SUMMARY = 1;
+    private static final int MSG_UPDATE_NOTIFICATION_SUMMARY = 2;
+
     private CheckBoxPreference mSilent;
 
     /*
@@ -88,6 +99,10 @@
     private CheckBoxPreference mNotificationPulse;
     private Preference mMusicFx;
     private CheckBoxPreference mLockSounds;
+    private Preference mRingtonePreference;
+    private Preference mNotificationPreference;
+
+    private Runnable mRingtoneLookupRunnable;
 
     private AudioManager mAudioManager;
 
@@ -100,6 +115,19 @@
         }
     };
 
+    private Handler mHandler = new Handler() {
+        public void handleMessage(Message msg) {
+            switch (msg.what) {
+            case MSG_UPDATE_RINGTONE_SUMMARY:
+                mRingtonePreference.setSummary((CharSequence) msg.obj);
+                break;
+            case MSG_UPDATE_NOTIFICATION_SUMMARY:
+                mNotificationPreference.setSummary((CharSequence) msg.obj);
+                break;
+            }
+        }
+    };
+
     private PreferenceGroup mSoundSettings;
 
     @Override
@@ -133,16 +161,19 @@
         mSoundEffects = (CheckBoxPreference) findPreference(KEY_SOUND_EFFECTS);
         mSoundEffects.setPersistent(false);
         mSoundEffects.setChecked(Settings.System.getInt(resolver,
-                Settings.System.SOUND_EFFECTS_ENABLED, 0) != 0);
+                Settings.System.SOUND_EFFECTS_ENABLED, 1) != 0);
         mHapticFeedback = (CheckBoxPreference) findPreference(KEY_HAPTIC_FEEDBACK);
         mHapticFeedback.setPersistent(false);
         mHapticFeedback.setChecked(Settings.System.getInt(resolver,
-                Settings.System.HAPTIC_FEEDBACK_ENABLED, 0) != 0);
+                Settings.System.HAPTIC_FEEDBACK_ENABLED, 1) != 0);
         mLockSounds = (CheckBoxPreference) findPreference(KEY_LOCK_SOUNDS);
         mLockSounds.setPersistent(false);
         mLockSounds.setChecked(Settings.System.getInt(resolver,
                 Settings.System.LOCKSCREEN_SOUNDS_ENABLED, 1) != 0);
 
+        mRingtonePreference = findPreference(KEY_RINGTONE);
+        mNotificationPreference = findPreference(KEY_NOTIFICATION_SOUND);
+
         if (!((Vibrator) getSystemService(Context.VIBRATOR_SERVICE)).hasVibrator()) {
             getPreferenceScreen().removePreference(mVibrate);
             getPreferenceScreen().removePreference(mHapticFeedback);
@@ -193,6 +224,19 @@
                 }
             }
         }
+
+        mRingtoneLookupRunnable = new Runnable() {
+            public void run() {
+                if (mRingtonePreference != null) {
+                    updateRingtoneName(RingtoneManager.TYPE_RINGTONE, mRingtonePreference,
+                            MSG_UPDATE_RINGTONE_SUMMARY);
+                }
+                if (mNotificationPreference != null) {
+                    updateRingtoneName(RingtoneManager.TYPE_NOTIFICATION, mNotificationPreference,
+                            MSG_UPDATE_NOTIFICATION_SUMMARY);
+                }
+            }
+        };
     }
 
     @Override
@@ -200,6 +244,7 @@
         super.onResume();
 
         updateState(true);
+        lookupRingtoneNames();
 
         IntentFilter filter = new IntentFilter(AudioManager.RINGER_MODE_CHANGED_ACTION);
         getActivity().registerReceiver(mReceiver, filter);
@@ -306,13 +351,34 @@
             mVibrate.setValue(phoneVibrateSetting);
         }
         mVibrate.setSummary(mVibrate.getEntry());
+    }
 
-        int silentModeStreams = Settings.System.getInt(getContentResolver(),
-                Settings.System.MODE_RINGER_STREAMS_AFFECTED, 0);
-        boolean isAlarmInclSilentMode = (silentModeStreams & (1 << AudioManager.STREAM_ALARM)) != 0;
-        mSilent.setSummary(isAlarmInclSilentMode ?
-                R.string.silent_mode_incl_alarm_summary :
-                R.string.silent_mode_summary);
+    private void updateRingtoneName(int type, Preference preference, int msg) {
+        if (preference == null) return;
+        Context context = getActivity();
+        if (context == null) return;
+        Uri ringtoneUri = RingtoneManager.getActualDefaultRingtoneUri(context, type);
+        CharSequence summary = context.getString(com.android.internal.R.string.ringtone_unknown);
+        // Is it a silent ringtone?
+        if (ringtoneUri == null) {
+            summary = context.getString(com.android.internal.R.string.ringtone_silent);
+        } else {
+            // Fetch the ringtone title from the media provider
+            try {
+                Cursor cursor = context.getContentResolver().query(ringtoneUri,
+                        new String[] { MediaStore.Audio.Media.TITLE }, null, null, null);
+                if (cursor.moveToFirst()) {
+                    summary = cursor.getString(0);
+                }
+            } catch (SQLiteException sqle) {
+                // Unknown title for the ringtone
+            }
+        }
+        mHandler.sendMessage(mHandler.obtainMessage(msg, summary));
+    }
+
+    private void lookupRingtoneNames() {
+        new Thread(mRingtoneLookupRunnable).start();
     }
 
     @Override