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:
@@ -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);
|
||||||
|
@@ -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 {
|
||||||
|
@@ -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
|
||||||
|
@@ -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);
|
||||||
}
|
}
|
||||||
|
@@ -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);
|
||||||
|
Reference in New Issue
Block a user