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
This commit is contained in:
Julia Reynolds
2017-04-14 09:30:30 -04:00
parent a0e617f96d
commit c68ae0b9fd
5 changed files with 52 additions and 5 deletions

View File

@@ -161,7 +161,7 @@ public class AppNotificationSettings extends NotificationSettingsBase {
final NotificationChannel channel = channels.get(i); final NotificationChannel channel = channels.get(i);
MasterSwitchPreference channelPref = new MasterSwitchPreference( MasterSwitchPreference channelPref = new MasterSwitchPreference(
getPrefContext()); getPrefContext());
channelPref.setDisabledByAdmin(mSuspendedAppsAdmin); channelPref.setSwitchEnabled(mSuspendedAppsAdmin == null && !mAppRow.systemApp);
channelPref.setKey(channel.getId()); channelPref.setKey(channel.getId());
channelPref.setTitle(channel.getName()); channelPref.setTitle(channel.getName());
channelPref.setChecked(channel.getImportance() != IMPORTANCE_NONE); channelPref.setChecked(channel.getImportance() != IMPORTANCE_NONE);

View File

@@ -175,9 +175,7 @@ public class ChannelNotificationSettings extends NotificationSettingsBase {
mRingtone.setOnPreferenceChangeListener(new Preference.OnPreferenceChangeListener() { mRingtone.setOnPreferenceChangeListener(new Preference.OnPreferenceChangeListener() {
@Override @Override
public boolean onPreferenceChange(Preference preference, Object newValue) { public boolean onPreferenceChange(Preference preference, Object newValue) {
Uri ringtone = Uri.parse((String) newValue); mChannel.setSound((Uri) newValue, mChannel.getAudioAttributes());
mRingtone.setRingtone(ringtone);
mChannel.setSound(ringtone, mChannel.getAudioAttributes());
mChannel.lockFields(NotificationChannel.USER_LOCKED_SOUND); mChannel.lockFields(NotificationChannel.USER_LOCKED_SOUND);
mBackend.updateChannel(mPkg, mUid, mChannel); mBackend.updateChannel(mPkg, mUid, mChannel);
return false; return false;
@@ -238,7 +236,7 @@ public class ChannelNotificationSettings extends NotificationSettingsBase {
mImportance.setEntryValues(values.toArray(new String[0])); mImportance.setEntryValues(values.toArray(new String[0]));
mImportance.setEntries(summaries.toArray(new String[0])); mImportance.setEntries(summaries.toArray(new String[0]));
mImportance.setValue(String.valueOf(mChannel.getImportance())); mImportance.setValue(String.valueOf(mChannel.getImportance()));
mImportance.setSummary("%s"); mImportance.setSummary(getImportanceSummary(mChannel.getImportance()));
if (mAppRow.lockedImportance) { if (mAppRow.lockedImportance) {
mImportance.setEnabled(false); mImportance.setEnabled(false);
} else { } else {

View File

@@ -2,6 +2,7 @@ package com.android.settings.notification;
import android.content.ContentResolver; import android.content.ContentResolver;
import android.content.Context; import android.content.Context;
import android.content.Intent;
import android.media.Ringtone; import android.media.Ringtone;
import android.media.RingtoneManager; import android.media.RingtoneManager;
import android.net.Uri; import android.net.Uri;
@@ -25,9 +26,21 @@ public class NotificationSoundPreference extends RingtonePreference {
public void setRingtone(Uri ringtone) { public void setRingtone(Uri ringtone) {
mRingtone = ringtone; mRingtone = ringtone;
setSummary("\u00A0");
updateRingtoneName(mRingtone); 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) { private void updateRingtoneName(final Uri uri) {
AsyncTask ringtoneNameTask = new AsyncTask<Object, Void, CharSequence>() { AsyncTask ringtoneNameTask = new AsyncTask<Object, Void, CharSequence>() {
@Override @Override

View File

@@ -36,6 +36,7 @@ public class MasterSwitchPreference extends TwoTargetPreference {
private Switch mSwitch; private Switch mSwitch;
private boolean mChecked; private boolean mChecked;
private boolean mEnableSwitch = true;
public MasterSwitchPreference(Context context, AttributeSet attrs, public MasterSwitchPreference(Context context, AttributeSet attrs,
int defStyleAttr, int defStyleRes) { int defStyleAttr, int defStyleRes) {
@@ -67,6 +68,9 @@ public class MasterSwitchPreference extends TwoTargetPreference {
widgetView.setOnClickListener(new OnClickListener() { widgetView.setOnClickListener(new OnClickListener() {
@Override @Override
public void onClick(View v) { public void onClick(View v) {
if (mSwitch != null && !mSwitch.isEnabled()) {
return;
}
setChecked(!mChecked); setChecked(!mChecked);
if (!callChangeListener(mChecked)) { if (!callChangeListener(mChecked)) {
setChecked(!mChecked); setChecked(!mChecked);
@@ -76,9 +80,11 @@ public class MasterSwitchPreference extends TwoTargetPreference {
} }
}); });
} }
mSwitch = (Switch) holder.findViewById(R.id.switchWidget); mSwitch = (Switch) holder.findViewById(R.id.switchWidget);
if (mSwitch != null) { if (mSwitch != null) {
mSwitch.setChecked(mChecked); mSwitch.setChecked(mChecked);
mSwitch.setEnabled(mEnableSwitch);
} }
} }
@@ -94,6 +100,7 @@ public class MasterSwitchPreference extends TwoTargetPreference {
} }
public void setSwitchEnabled(boolean enabled) { public void setSwitchEnabled(boolean enabled) {
mEnableSwitch = enabled;
if (mSwitch != null) { if (mSwitch != null) {
mSwitch.setEnabled(enabled); mSwitch.setEnabled(enabled);
} }

View File

@@ -90,6 +90,19 @@ public class MasterSwitchPreferenceTest {
assertThat(toggle.isEnabled()).isFalse(); 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 @Test
public void clickWidgetView_shouldToggleButton() { public void clickWidgetView_shouldToggleButton() {
final MasterSwitchPreference preference = new MasterSwitchPreference(mContext); final MasterSwitchPreference preference = new MasterSwitchPreference(mContext);
@@ -108,6 +121,22 @@ public class MasterSwitchPreferenceTest {
assertThat(toggle.isChecked()).isFalse(); 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 @Test
public void clickWidgetView_shouldNotifyPreferenceChanged() { public void clickWidgetView_shouldNotifyPreferenceChanged() {
final MasterSwitchPreference preference = new MasterSwitchPreference(mContext); final MasterSwitchPreference preference = new MasterSwitchPreference(mContext);