From c68ae0b9fdd5f5a149364d0af7e8a9497a91adfd Mon Sep 17 00:00:00 2001 From: Julia Reynolds Date: Fri, 14 Apr 2017 09:30:30 -0400 Subject: [PATCH] Channel settings updates - Update master switch preference to store enabled state in case it's set before the view holder is bound - Update master switch preference to prevent disabled switches from being toggled - Show an importance summary for max importance - properly handle null notification sounds Change-Id: I395b95b76d2a3c1c94b41d1c2720bb0cf1cae917 Fixes: 36920159 Fixes: 37421928 Fixes: 36939825 Test: RunSettingsRoboTests & manual --- .../notification/AppNotificationSettings.java | 2 +- .../ChannelNotificationSettings.java | 6 ++-- .../NotificationSoundPreference.java | 13 +++++++++ .../widget/MasterSwitchPreference.java | 7 +++++ .../widget/MasterSwitchPreferenceTest.java | 29 +++++++++++++++++++ 5 files changed, 52 insertions(+), 5 deletions(-) diff --git a/src/com/android/settings/notification/AppNotificationSettings.java b/src/com/android/settings/notification/AppNotificationSettings.java index e359da65d6c..92e11b4ec76 100644 --- a/src/com/android/settings/notification/AppNotificationSettings.java +++ b/src/com/android/settings/notification/AppNotificationSettings.java @@ -161,7 +161,7 @@ public class AppNotificationSettings extends NotificationSettingsBase { final NotificationChannel channel = channels.get(i); MasterSwitchPreference channelPref = new MasterSwitchPreference( getPrefContext()); - channelPref.setDisabledByAdmin(mSuspendedAppsAdmin); + channelPref.setSwitchEnabled(mSuspendedAppsAdmin == null && !mAppRow.systemApp); channelPref.setKey(channel.getId()); channelPref.setTitle(channel.getName()); channelPref.setChecked(channel.getImportance() != IMPORTANCE_NONE); diff --git a/src/com/android/settings/notification/ChannelNotificationSettings.java b/src/com/android/settings/notification/ChannelNotificationSettings.java index bec484567ae..2b7a6d0e568 100644 --- a/src/com/android/settings/notification/ChannelNotificationSettings.java +++ b/src/com/android/settings/notification/ChannelNotificationSettings.java @@ -175,9 +175,7 @@ public class ChannelNotificationSettings extends NotificationSettingsBase { mRingtone.setOnPreferenceChangeListener(new Preference.OnPreferenceChangeListener() { @Override public boolean onPreferenceChange(Preference preference, Object newValue) { - Uri ringtone = Uri.parse((String) newValue); - mRingtone.setRingtone(ringtone); - mChannel.setSound(ringtone, mChannel.getAudioAttributes()); + mChannel.setSound((Uri) newValue, mChannel.getAudioAttributes()); mChannel.lockFields(NotificationChannel.USER_LOCKED_SOUND); mBackend.updateChannel(mPkg, mUid, mChannel); return false; @@ -238,7 +236,7 @@ public class ChannelNotificationSettings extends NotificationSettingsBase { mImportance.setEntryValues(values.toArray(new String[0])); mImportance.setEntries(summaries.toArray(new String[0])); mImportance.setValue(String.valueOf(mChannel.getImportance())); - mImportance.setSummary("%s"); + mImportance.setSummary(getImportanceSummary(mChannel.getImportance())); if (mAppRow.lockedImportance) { mImportance.setEnabled(false); } else { diff --git a/src/com/android/settings/notification/NotificationSoundPreference.java b/src/com/android/settings/notification/NotificationSoundPreference.java index 51b235d8e17..c0074857e80 100644 --- a/src/com/android/settings/notification/NotificationSoundPreference.java +++ b/src/com/android/settings/notification/NotificationSoundPreference.java @@ -2,6 +2,7 @@ package com.android.settings.notification; import android.content.ContentResolver; import android.content.Context; +import android.content.Intent; import android.media.Ringtone; import android.media.RingtoneManager; import android.net.Uri; @@ -25,9 +26,21 @@ public class NotificationSoundPreference extends RingtonePreference { public void setRingtone(Uri ringtone) { mRingtone = ringtone; + setSummary("\u00A0"); updateRingtoneName(mRingtone); } + @Override + public boolean onActivityResult(int requestCode, int resultCode, Intent data) { + if (data != null) { + Uri uri = data.getParcelableExtra(RingtoneManager.EXTRA_RINGTONE_PICKED_URI); + setRingtone(uri); + callChangeListener(uri); + } + + return true; + } + private void updateRingtoneName(final Uri uri) { AsyncTask ringtoneNameTask = new AsyncTask() { @Override diff --git a/src/com/android/settings/widget/MasterSwitchPreference.java b/src/com/android/settings/widget/MasterSwitchPreference.java index cf222070b0d..002cb77762e 100644 --- a/src/com/android/settings/widget/MasterSwitchPreference.java +++ b/src/com/android/settings/widget/MasterSwitchPreference.java @@ -36,6 +36,7 @@ public class MasterSwitchPreference extends TwoTargetPreference { private Switch mSwitch; private boolean mChecked; + private boolean mEnableSwitch = true; public MasterSwitchPreference(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) { @@ -67,6 +68,9 @@ public class MasterSwitchPreference extends TwoTargetPreference { widgetView.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { + if (mSwitch != null && !mSwitch.isEnabled()) { + return; + } setChecked(!mChecked); if (!callChangeListener(mChecked)) { setChecked(!mChecked); @@ -76,9 +80,11 @@ public class MasterSwitchPreference extends TwoTargetPreference { } }); } + mSwitch = (Switch) holder.findViewById(R.id.switchWidget); if (mSwitch != null) { mSwitch.setChecked(mChecked); + mSwitch.setEnabled(mEnableSwitch); } } @@ -94,6 +100,7 @@ public class MasterSwitchPreference extends TwoTargetPreference { } public void setSwitchEnabled(boolean enabled) { + mEnableSwitch = enabled; if (mSwitch != null) { mSwitch.setEnabled(enabled); } diff --git a/tests/robotests/src/com/android/settings/widget/MasterSwitchPreferenceTest.java b/tests/robotests/src/com/android/settings/widget/MasterSwitchPreferenceTest.java index e4d303cfd47..3747dda0525 100644 --- a/tests/robotests/src/com/android/settings/widget/MasterSwitchPreferenceTest.java +++ b/tests/robotests/src/com/android/settings/widget/MasterSwitchPreferenceTest.java @@ -90,6 +90,19 @@ public class MasterSwitchPreferenceTest { assertThat(toggle.isEnabled()).isFalse(); } + @Test + public void setSwitchEnabled_shouldUpdateButtonEnabledState_beforeViewBound() { + final MasterSwitchPreference preference = new MasterSwitchPreference(mContext); + final PreferenceViewHolder holder = PreferenceViewHolder.createInstanceForTests( + LayoutInflater.from(mContext).inflate( + R.layout.preference_widget_master_switch, null)); + final Switch toggle = (Switch) holder.findViewById(R.id.switchWidget); + + preference.setSwitchEnabled(false); + preference.onBindViewHolder(holder); + assertThat(toggle.isEnabled()).isFalse(); + } + @Test public void clickWidgetView_shouldToggleButton() { final MasterSwitchPreference preference = new MasterSwitchPreference(mContext); @@ -108,6 +121,22 @@ public class MasterSwitchPreferenceTest { assertThat(toggle.isChecked()).isFalse(); } + @Test + public void clickWidgetView_shouldNotToggleButtonIfDisabled() { + final MasterSwitchPreference preference = new MasterSwitchPreference(mContext); + final LayoutInflater inflater = LayoutInflater.from(mContext); + final PreferenceViewHolder holder = PreferenceViewHolder.createInstanceForTests( + inflater.inflate(R.layout.preference_two_target, null)); + final LinearLayout widgetView = holder.itemView.findViewById(android.R.id.widget_frame); + inflater.inflate(R.layout.preference_widget_master_switch, widgetView, true); + final Switch toggle = (Switch) holder.findViewById(R.id.switchWidget); + preference.onBindViewHolder(holder); + toggle.setEnabled(false); + + widgetView.performClick(); + assertThat(toggle.isChecked()).isFalse(); + } + @Test public void clickWidgetView_shouldNotifyPreferenceChanged() { final MasterSwitchPreference preference = new MasterSwitchPreference(mContext);