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:
@@ -2639,6 +2639,8 @@
|
|||||||
</intent-filter>
|
</intent-filter>
|
||||||
<meta-data android:name="com.android.settings.category"
|
<meta-data android:name="com.android.settings.category"
|
||||||
android:value="com.android.settings.category.ia.apps"/>
|
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"
|
<meta-data android:name="com.android.settings.FRAGMENT_CLASS"
|
||||||
android:value="com.android.settings.notification.ConfigureNotificationSettings" />
|
android:value="com.android.settings.notification.ConfigureNotificationSettings" />
|
||||||
<meta-data android:name="com.android.settings.PRIMARY_PROFILE_CONTROLLED"
|
<meta-data android:name="com.android.settings.PRIMARY_PROFILE_CONTROLLED"
|
||||||
|
@@ -7645,11 +7645,11 @@
|
|||||||
<string name="app_settings_link">Additional settings in the app</string>
|
<string name="app_settings_link">Additional settings in the app</string>
|
||||||
|
|
||||||
<!-- [CHAR LIMIT=45] App notification listing summary, blocked apps -->
|
<!-- [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 -->
|
<!-- [CHAR LIMIT=45] App notification listing summary, blocked apps -->
|
||||||
<plurals name="app_notification_listing_summary_others">
|
<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="one">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="other">Off for <xliff:g id="count" example="10">%d</xliff:g> apps</item>
|
||||||
</plurals>
|
</plurals>
|
||||||
|
|
||||||
<!-- [CHAR LIMIT=NONE] Footer listing a count of deleted channels. -->
|
<!-- [CHAR LIMIT=NONE] Footer listing a count of deleted channels. -->
|
||||||
|
@@ -81,11 +81,15 @@ public class AppNotificationPreferenceController extends AppInfoPreferenceContro
|
|||||||
if (appRow == null) {
|
if (appRow == null) {
|
||||||
return "";
|
return "";
|
||||||
}
|
}
|
||||||
if (appRow.banned || appRow.channelCount == appRow.blockedChannelCount) {
|
if (appRow.banned) {
|
||||||
return context.getString(R.string.notifications_disabled);
|
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 {
|
} else {
|
||||||
if (appRow.blockedChannelCount == 0) {
|
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,
|
return context.getString(R.string.notifications_enabled_with_info,
|
||||||
context.getResources().getQuantityString(R.plurals.notifications_categories_off,
|
context.getResources().getQuantityString(R.plurals.notifications_categories_off,
|
||||||
|
@@ -26,11 +26,13 @@ import android.os.UserHandle;
|
|||||||
import android.provider.SearchIndexableResource;
|
import android.provider.SearchIndexableResource;
|
||||||
import android.support.annotation.VisibleForTesting;
|
import android.support.annotation.VisibleForTesting;
|
||||||
import android.support.v7.preference.Preference;
|
import android.support.v7.preference.Preference;
|
||||||
|
import android.text.TextUtils;
|
||||||
|
|
||||||
import com.android.internal.logging.nano.MetricsProto.MetricsEvent;
|
import com.android.internal.logging.nano.MetricsProto.MetricsEvent;
|
||||||
import com.android.settings.R;
|
import com.android.settings.R;
|
||||||
import com.android.settings.RingtonePreference;
|
import com.android.settings.RingtonePreference;
|
||||||
import com.android.settings.dashboard.DashboardFragment;
|
import com.android.settings.dashboard.DashboardFragment;
|
||||||
|
import com.android.settings.dashboard.SummaryLoader;
|
||||||
import com.android.settings.gestures.SwipeToNotificationPreferenceController;
|
import com.android.settings.gestures.SwipeToNotificationPreferenceController;
|
||||||
import com.android.settings.search.BaseSearchIndexProvider;
|
import com.android.settings.search.BaseSearchIndexProvider;
|
||||||
import com.android.settings.search.Indexable;
|
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.
|
* For Search.
|
||||||
*/
|
*/
|
||||||
|
@@ -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 {
|
static class Row {
|
||||||
public String section;
|
public String section;
|
||||||
}
|
}
|
||||||
|
@@ -150,4 +150,13 @@ public class AppNotificationPreferenceControllerTest {
|
|||||||
appRow.channelCount = 10;
|
appRow.channelCount = 10;
|
||||||
assertThat(mController.getNotificationSummary(appRow, mContext).toString()).isEqualTo("On");
|
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");
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@@ -17,17 +17,35 @@
|
|||||||
package com.android.settings.notification;
|
package com.android.settings.notification;
|
||||||
|
|
||||||
import static com.android.settings.notification.ConfigureNotificationSettings.KEY_LOCKSCREEN;
|
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
|
||||||
import static com.android.settings.notification.ConfigureNotificationSettings.KEY_LOCKSCREEN_WORK_PROFILE_HEADER;
|
.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.KEY_SWIPE_DOWN;
|
||||||
|
import static com.android.settings.notification.ConfigureNotificationSettings
|
||||||
|
.SUMMARY_PROVIDER_FACTORY;
|
||||||
|
|
||||||
import static com.google.common.truth.Truth.assertThat;
|
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.SettingsRobolectricTestRunner;
|
||||||
import com.android.settings.testutils.shadow.ShadowLockPatternUtils;
|
import com.android.settings.testutils.shadow.ShadowLockPatternUtils;
|
||||||
import com.android.settings.testutils.shadow.ShadowUtils;
|
import com.android.settings.testutils.shadow.ShadowUtils;
|
||||||
|
|
||||||
|
import org.junit.Before;
|
||||||
import org.junit.Test;
|
import org.junit.Test;
|
||||||
import org.junit.runner.RunWith;
|
import org.junit.runner.RunWith;
|
||||||
|
import org.mockito.ArgumentCaptor;
|
||||||
|
import org.robolectric.Robolectric;
|
||||||
import org.robolectric.RuntimeEnvironment;
|
import org.robolectric.RuntimeEnvironment;
|
||||||
import org.robolectric.annotation.Config;
|
import org.robolectric.annotation.Config;
|
||||||
|
|
||||||
@@ -36,6 +54,13 @@ import java.util.List;
|
|||||||
@RunWith(SettingsRobolectricTestRunner.class)
|
@RunWith(SettingsRobolectricTestRunner.class)
|
||||||
public class ConfigureNotificationSettingsTest {
|
public class ConfigureNotificationSettingsTest {
|
||||||
|
|
||||||
|
private Activity mActivity;
|
||||||
|
|
||||||
|
@Before
|
||||||
|
public void setUp() {
|
||||||
|
mActivity = spy(Robolectric.buildActivity(Activity.class).get());
|
||||||
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
@Config(shadows = {
|
@Config(shadows = {
|
||||||
ShadowUtils.class,
|
ShadowUtils.class,
|
||||||
@@ -49,4 +74,39 @@ public class ConfigureNotificationSettingsTest {
|
|||||||
KEY_SWIPE_DOWN, KEY_LOCKSCREEN, KEY_LOCKSCREEN_WORK_PROFILE,
|
KEY_SWIPE_DOWN, KEY_LOCKSCREEN, KEY_LOCKSCREEN_WORK_PROFILE,
|
||||||
KEY_LOCKSCREEN_WORK_PROFILE_HEADER);
|
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");
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user