Notification summary updates

- Fix app info summary
- Add configure notifications summary

Test: make -j RunSettingsRoboTests
Change-Id: Ic3c3036ee903fe7403032925a8145693807793d5
Fixes: 77598357
Fixes: 73018368
This commit is contained in:
Julia Reynolds
2018-04-12 12:24:25 -04:00
parent e6750d6c2d
commit f5d1f165eb
7 changed files with 142 additions and 8 deletions

View File

@@ -2639,6 +2639,8 @@
</intent-filter>
<meta-data android:name="com.android.settings.category"
android:value="com.android.settings.category.ia.apps"/>
<meta-data android:name="com.android.settings.summary"
android:resource="@string/summary_empty"/>
<meta-data android:name="com.android.settings.FRAGMENT_CLASS"
android:value="com.android.settings.notification.ConfigureNotificationSettings" />
<meta-data android:name="com.android.settings.PRIMARY_PROFILE_CONTROLLED"

View File

@@ -7645,11 +7645,11 @@
<string name="app_settings_link">Additional settings in the app</string>
<!-- [CHAR LIMIT=45] App notification listing summary, blocked apps -->
<string name="app_notification_listing_summary_zero">Turned on for all apps</string>
<string name="app_notification_listing_summary_zero">On for all apps</string>
<!-- [CHAR LIMIT=45] App notification listing summary, blocked apps -->
<plurals name="app_notification_listing_summary_others">
<item quantity="one">Turned off for <xliff:g id="count" example="1">%d</xliff:g> app</item>
<item quantity="other">Turned off for <xliff:g id="count" example="10">%d</xliff:g> apps</item>
<item quantity="one">Off for <xliff:g id="count" example="1">%d</xliff:g> app</item>
<item quantity="other">Off for <xliff:g id="count" example="10">%d</xliff:g> apps</item>
</plurals>
<!-- [CHAR LIMIT=NONE] Footer listing a count of deleted channels. -->

View File

@@ -81,11 +81,15 @@ public class AppNotificationPreferenceController extends AppInfoPreferenceContro
if (appRow == null) {
return "";
}
if (appRow.banned || appRow.channelCount == appRow.blockedChannelCount) {
return context.getString(R.string.notifications_disabled);
if (appRow.banned) {
return context.getText(R.string.notifications_disabled);
} else if (appRow.channelCount == 0) {
return context.getText(R.string.notifications_enabled);
} else if (appRow.channelCount == appRow.blockedChannelCount) {
return context.getText(R.string.notifications_disabled);
} else {
if (appRow.blockedChannelCount == 0) {
return context.getString(R.string.notifications_enabled);
return context.getText(R.string.notifications_enabled);
}
return context.getString(R.string.notifications_enabled_with_info,
context.getResources().getQuantityString(R.plurals.notifications_categories_off,

View File

@@ -26,11 +26,13 @@ import android.os.UserHandle;
import android.provider.SearchIndexableResource;
import android.support.annotation.VisibleForTesting;
import android.support.v7.preference.Preference;
import android.text.TextUtils;
import com.android.internal.logging.nano.MetricsProto.MetricsEvent;
import com.android.settings.R;
import com.android.settings.RingtonePreference;
import com.android.settings.dashboard.DashboardFragment;
import com.android.settings.dashboard.SummaryLoader;
import com.android.settings.gestures.SwipeToNotificationPreferenceController;
import com.android.settings.search.BaseSearchIndexProvider;
import com.android.settings.search.Indexable;
@@ -151,6 +153,54 @@ public class ConfigureNotificationSettings extends DashboardFragment {
}
}
/**
* For summary
*/
static class SummaryProvider implements SummaryLoader.SummaryProvider {
private final Context mContext;
private final SummaryLoader mSummaryLoader;
private NotificationBackend mBackend;
public SummaryProvider(Context context, SummaryLoader summaryLoader) {
mContext = context;
mSummaryLoader = summaryLoader;
mBackend = new NotificationBackend();
}
@VisibleForTesting
protected void setBackend(NotificationBackend backend) {
mBackend = backend;
}
@Override
public void setListening(boolean listening) {
if (!listening) {
return;
}
int blockedAppCount = mBackend.getBlockedAppCount();
if (blockedAppCount == 0) {
mSummaryLoader.setSummary(this,
mContext.getText(R.string.app_notification_listing_summary_zero));
} else {
mSummaryLoader.setSummary(this,
mContext.getResources().getQuantityString(
R.plurals.app_notification_listing_summary_others,
blockedAppCount, blockedAppCount));
}
}
}
public static final SummaryLoader.SummaryProviderFactory SUMMARY_PROVIDER_FACTORY =
new SummaryLoader.SummaryProviderFactory() {
@Override
public SummaryLoader.SummaryProvider createSummaryProvider(Activity activity,
SummaryLoader summaryLoader) {
return new ConfigureNotificationSettings.SummaryProvider(
activity, summaryLoader);
}
};
/**
* For Search.
*/

View File

@@ -250,6 +250,15 @@ public class NotificationBackend {
}
}
public int getBlockedAppCount() {
try {
return sINM.getBlockedAppCount(UserHandle.myUserId());
} catch (Exception e) {
Log.w(TAG, "Error calling NoMan", e);
return 0;
}
}
static class Row {
public String section;
}

View File

@@ -150,4 +150,13 @@ public class AppNotificationPreferenceControllerTest {
appRow.channelCount = 10;
assertThat(mController.getNotificationSummary(appRow, mContext).toString()).isEqualTo("On");
}
@Test
public void getNotificationSummary_noChannels() {
NotificationBackend.AppRow appRow = new NotificationBackend.AppRow();
appRow.banned = false;
appRow.blockedChannelCount = 0;
appRow.channelCount = 0;
assertThat(mController.getNotificationSummary(appRow, mContext).toString()).isEqualTo("On");
}
}

View File

@@ -17,17 +17,35 @@
package com.android.settings.notification;
import static com.android.settings.notification.ConfigureNotificationSettings.KEY_LOCKSCREEN;
import static com.android.settings.notification.ConfigureNotificationSettings.KEY_LOCKSCREEN_WORK_PROFILE;
import static com.android.settings.notification.ConfigureNotificationSettings.KEY_LOCKSCREEN_WORK_PROFILE_HEADER;
import static com.android.settings.notification.ConfigureNotificationSettings
.KEY_LOCKSCREEN_WORK_PROFILE;
import static com.android.settings.notification.ConfigureNotificationSettings
.KEY_LOCKSCREEN_WORK_PROFILE_HEADER;
import static com.android.settings.notification.ConfigureNotificationSettings.KEY_SWIPE_DOWN;
import static com.android.settings.notification.ConfigureNotificationSettings
.SUMMARY_PROVIDER_FACTORY;
import static com.google.common.truth.Truth.assertThat;
import static org.mockito.ArgumentMatchers.any;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.spy;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
import android.app.Activity;
import com.android.settings.dashboard.SummaryLoader;
import com.android.settings.notification.ConfigureNotificationSettings.SummaryProvider;
import com.android.settings.testutils.SettingsRobolectricTestRunner;
import com.android.settings.testutils.shadow.ShadowLockPatternUtils;
import com.android.settings.testutils.shadow.ShadowUtils;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.ArgumentCaptor;
import org.robolectric.Robolectric;
import org.robolectric.RuntimeEnvironment;
import org.robolectric.annotation.Config;
@@ -36,6 +54,13 @@ import java.util.List;
@RunWith(SettingsRobolectricTestRunner.class)
public class ConfigureNotificationSettingsTest {
private Activity mActivity;
@Before
public void setUp() {
mActivity = spy(Robolectric.buildActivity(Activity.class).get());
}
@Test
@Config(shadows = {
ShadowUtils.class,
@@ -49,4 +74,39 @@ public class ConfigureNotificationSettingsTest {
KEY_SWIPE_DOWN, KEY_LOCKSCREEN, KEY_LOCKSCREEN_WORK_PROFILE,
KEY_LOCKSCREEN_WORK_PROFILE_HEADER);
}
@Test
public void getSummary_noneBlocked() {
SummaryLoader loader = mock(SummaryLoader.class);
NotificationBackend backend = mock(NotificationBackend.class);
when(backend.getBlockedAppCount()).thenReturn(0);
SummaryProvider provider =
(SummaryProvider) SUMMARY_PROVIDER_FACTORY.createSummaryProvider(mActivity, loader);
provider.setBackend(backend);
provider.setListening(true);
ArgumentCaptor<CharSequence> captor = ArgumentCaptor.forClass(CharSequence.class);
verify(loader).setSummary(any(), captor.capture());
assertThat(captor.getValue().toString()).contains("On");
}
@Test
public void getSummary_someBlocked() {
SummaryLoader loader = mock(SummaryLoader.class);
NotificationBackend backend = mock(NotificationBackend.class);
when(backend.getBlockedAppCount()).thenReturn(5);
SummaryProvider provider =
(SummaryProvider) SUMMARY_PROVIDER_FACTORY.createSummaryProvider(mActivity, loader);
provider.setBackend(backend);
provider.setListening(true);
ArgumentCaptor<CharSequence> captor = ArgumentCaptor.forClass(CharSequence.class);
verify(loader).setSummary(any(), captor.capture());
assertThat(captor.getValue().toString()).contains("Off");
assertThat(captor.getValue().toString()).contains("5");
}
}