Merge "Add skeleton page for bundling" into main

This commit is contained in:
Julia Reynolds
2024-11-06 16:59:57 +00:00
committed by Android (Google) Code Review
11 changed files with 746 additions and 0 deletions

View File

@@ -9041,6 +9041,13 @@
<string name="notification_polite_work">Apply to work profiles</string>
<string name="notification_polite_work_summary">Apply to work profile apps</string>
<!-- Title for Bundled Notifications setting [CHAR LIMIT=45]-->
<string name="notification_bundle_title">Bundled notifications</string>
<string name="notification_bundle_on">On</string>
<string name="notification_bundle_off">Off</string>
<string name="notification_bundle_main_control_title">Use notification bundling</string>
<string name="notification_bundle_description">Notifications with similar themes will be silenced and grouped together for a quieter experience. Bundling will override an app\'s own notification settings.</string>
<!-- Title for managing VR (virtual reality) helper services. [CHAR LIMIT=50] -->
<string name="vr_listeners_title">VR helper services</string>

View File

@@ -0,0 +1,59 @@
<?xml version="1.0" encoding="utf-8"?>
<!--
Copyright (C) 2024 The Android Open Source Project
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
-->
<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:settings="http://schemas.android.com/apk/res-auto"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:title="@string/notification_bundle_title">
<com.android.settingslib.widget.IllustrationPreference
android:key="illustration"
settings:searchable="false"
android:selectable="false"
app:lottie_cacheComposition="false"
settings:dynamicColor="true"/>
<com.android.settingslib.widget.TopIntroPreference
android:key="feature_description"
settings:searchable="false"
android:title="@string/notification_bundle_description"/>
<com.android.settingslib.widget.MainSwitchPreference
android:key="global_pref"
android:title="@string/notification_bundle_main_control_title"
settings:controller="com.android.settings.notification.BundleGlobalPreferenceController" />
<CheckBoxPreference
android:key="promotions"
android:title="@*android:string/promotional_notification_channel_label"
settings:controller="com.android.settings.notification.BundleTypePreferenceController"/>
<CheckBoxPreference
android:key="news"
android:title="@*android:string/news_notification_channel_label"
settings:controller="com.android.settings.notification.BundleTypePreferenceController"/>
<CheckBoxPreference
android:key="social"
android:title="@*android:string/social_notification_channel_label"
settings:controller="com.android.settings.notification.BundleTypePreferenceController"/>
<CheckBoxPreference
android:key="recs"
android:title="@*android:string/recs_notification_channel_label"
settings:controller="com.android.settings.notification.BundleTypePreferenceController"/>
</PreferenceScreen>

View File

@@ -43,6 +43,14 @@
android:targetPackage="com.android.settings"
android:targetClass="com.android.settings.notification.history.NotificationHistoryActivity" />
</Preference>
<Preference
android:fragment="com.android.settings.notification.BundlePreferenceFragment"
android:key="bundle_notifications_preference"
android:persistent="false"
android:order="12"
android:title="@string/notification_bundle_title"
settings:controller="com.android.settings.notification.BundlePreferenceController" />
</PreferenceCategory>
<PreferenceCategory

View File

@@ -0,0 +1,61 @@
/*
* Copyright (C) 2024 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.android.settings.notification;
import android.app.Flags;
import android.content.Context;
import androidx.annotation.NonNull;
import com.android.settings.widget.SettingsMainSwitchPreferenceController;
public class BundleGlobalPreferenceController extends
SettingsMainSwitchPreferenceController {
NotificationBackend mBackend;
public BundleGlobalPreferenceController(@NonNull Context context,
@NonNull String preferenceKey) {
super(context, preferenceKey);
mBackend = new NotificationBackend();
}
@Override
public int getAvailabilityStatus() {
if (Flags.notificationClassificationUi() && mBackend.isNotificationBundlingSupported()) {
return AVAILABLE;
}
return CONDITIONALLY_UNAVAILABLE;
}
@Override
public boolean isChecked() {
return mBackend.isNotificationBundlingEnabled(mContext);
}
@Override
public boolean setChecked(boolean isChecked) {
mBackend.setNotificationBundlingEnabled(isChecked);
return true;
}
@Override
public int getSliceHighlightMenuRes() {
// not needed since it's not sliceable
return NO_RES;
}
}

View File

@@ -0,0 +1,49 @@
/*
* Copyright (C) 2024 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.android.settings.notification;
import android.app.Flags;
import android.content.Context;
import com.android.settings.R;
import com.android.settings.core.BasePreferenceController;
/**
* Controller for the bundled notifications settings page.
*/
public class BundlePreferenceController extends BasePreferenceController {
NotificationBackend mBackend;
public BundlePreferenceController(Context context, String preferenceKey) {
super(context, preferenceKey);
mBackend = new NotificationBackend();
}
@Override
public int getAvailabilityStatus() {
return Flags.notificationClassificationUi() && mBackend.isNotificationBundlingSupported()
? AVAILABLE : CONDITIONALLY_UNAVAILABLE;
}
@Override
public CharSequence getSummary() {
return mBackend.isNotificationBundlingEnabled(mContext)
? mContext.getString(R.string.notification_bundle_on)
: mContext.getString(R.string.notification_bundle_off);
}
}

View File

@@ -0,0 +1,60 @@
/*
* Copyright (C) 2024 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.android.settings.notification;
import android.app.settings.SettingsEnums;
import android.content.Context;
import android.app.Flags;
import androidx.lifecycle.Lifecycle;
import com.android.settings.R;
import com.android.settings.dashboard.DashboardFragment;
import com.android.settings.search.BaseSearchIndexProvider;
import com.android.settingslib.search.SearchIndexable;
import org.jetbrains.annotations.NotNull;
/**
* Fragment for bundled notifications.
*/
@SearchIndexable(forTarget = SearchIndexable.ALL & ~SearchIndexable.ARC)
public class BundlePreferenceFragment extends DashboardFragment {
@Override
public int getMetricsCategory() {
return SettingsEnums.BUNDLED_NOTIFICATIONS;
}
@Override
protected int getPreferenceScreenResId() {
return R.xml.bundle_notifications_settings;
}
@Override
protected String getLogTag() {
return "BundlePreferenceFragment";
}
public static final BaseSearchIndexProvider SEARCH_INDEX_DATA_PROVIDER =
new BaseSearchIndexProvider(R.xml.bundle_notifications_settings) {
@Override
protected boolean isPageSearchEnabled(Context context) {
return Flags.notificationClassificationUi();
}
};
}

View File

@@ -0,0 +1,83 @@
/*
* Copyright (C) 2024 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.android.settings.notification;
import android.app.Flags;
import android.content.Context;
import android.service.notification.Adjustment;
import androidx.annotation.NonNull;
import com.android.settings.widget.SettingsMainSwitchPreferenceController;
public class BundleTypePreferenceController extends
SettingsMainSwitchPreferenceController {
static final String PROMO_KEY = "promotions";
static final String NEWS_KEY = "news";
static final String SOCIAL_KEY = "social";
static final String RECS_KEY = "recs";
NotificationBackend mBackend;
int mType;
public BundleTypePreferenceController(@NonNull Context context,
@NonNull String preferenceKey) {
super(context, preferenceKey);
mBackend = new NotificationBackend();
mType = getBundleTypeForKey();
}
@Override
public int getAvailabilityStatus() {
if (Flags.notificationClassificationUi() && mBackend.isNotificationBundlingSupported()
&& mBackend.isNotificationBundlingEnabled(mContext)) {
return AVAILABLE;
}
return CONDITIONALLY_UNAVAILABLE;
}
@Override
public boolean isChecked() {
return mBackend.isBundleTypeApproved(mType);
}
@Override
public boolean setChecked(boolean isChecked) {
mBackend.setBundleTypeState(mType, isChecked);
return true;
}
@Override
public int getSliceHighlightMenuRes() {
// not needed since it's not sliceable
return NO_RES;
}
private @Adjustment.Types int getBundleTypeForKey() {
if (PROMO_KEY.equals(mPreferenceKey)) {
return Adjustment.TYPE_PROMOTION;
} else if (NEWS_KEY.equals(mPreferenceKey)) {
return Adjustment.TYPE_NEWS;
} else if (SOCIAL_KEY.equals(mPreferenceKey)) {
return Adjustment.TYPE_SOCIAL_MEDIA;
} else if (RECS_KEY.equals(mPreferenceKey)) {
return Adjustment.TYPE_CONTENT_RECOMMENDATION;
}
return Adjustment.TYPE_OTHER;
}
}

View File

@@ -46,6 +46,7 @@ import android.os.Build;
import android.os.RemoteException;
import android.os.ServiceManager;
import android.os.UserHandle;
import android.service.notification.Adjustment;
import android.service.notification.ConversationChannelWrapper;
import android.service.notification.NotificationListenerFilter;
import android.text.format.DateUtils;
@@ -65,9 +66,11 @@ import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Objects;
import java.util.Set;
public class NotificationBackend {
private static final String TAG = "NotificationBackend";
@@ -651,6 +654,59 @@ public class NotificationBackend {
return false;
}
public boolean isNotificationBundlingSupported() {
try {
return !sINM.getUnsupportedAdjustmentTypes().contains(Adjustment.KEY_TYPE);
} catch (Exception e) {
Log.w(TAG, "Error calling NoMan", e);
}
return false;
}
public boolean isNotificationBundlingEnabled(Context context) {
try {
return sINM.getAllowedAssistantAdjustments(context.getPackageName())
.contains(Adjustment.KEY_TYPE);
} catch (Exception e) {
Log.w(TAG, "Error calling NoMan", e);
}
return false;
}
public void setNotificationBundlingEnabled(boolean enabled) {
try {
if (enabled) {
sINM.allowAssistantAdjustment(Adjustment.KEY_TYPE);
} else {
sINM.disallowAssistantAdjustment(Adjustment.KEY_TYPE);
}
} catch (Exception e) {
Log.w(TAG, "Error calling NoMan", e);
}
}
public boolean isBundleTypeApproved(@Adjustment.Types int type) {
try {
int[] approved = sINM.getAllowedAdjustmentKeyTypes();
for (int approvedType : approved) {
if (type == approvedType) {
return true;
}
}
} catch (Exception e) {
Log.w(TAG, "Error calling NoMan", e);
}
return false;
}
public void setBundleTypeState(@Adjustment.Types int type, boolean enabled) {
try {
sINM.setAssistantAdjustmentKeyTypeState(type, enabled);
} catch (Exception e) {
Log.w(TAG, "Error calling NoMan", e);
}
}
@VisibleForTesting
void setNm(INotificationManager inm) {
sINM = inm;

View File

@@ -0,0 +1,101 @@
/*
* Copyright (C) 2024 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.android.settings.notification;
import static android.service.notification.Adjustment.KEY_IMPORTANCE;
import static android.service.notification.Adjustment.KEY_TYPE;
import static com.google.common.truth.Truth.assertThat;
import static org.mockito.ArgumentMatchers.any;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
import android.app.Flags;
import android.app.INotificationManager;
import android.content.Context;
import android.platform.test.flag.junit.SetFlagsRule;
import org.junit.Before;
import org.junit.Rule;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.Mock;
import org.mockito.MockitoAnnotations;
import org.robolectric.RobolectricTestRunner;
import org.robolectric.RuntimeEnvironment;
import java.util.List;
@RunWith(RobolectricTestRunner.class)
public class BundleGlobalPreferenceControllerTest {
@Rule
public final SetFlagsRule mSetFlagsRule = new SetFlagsRule();
private static final String PREFERENCE_KEY = "preference_key";
private Context mContext;
BundleGlobalPreferenceController mController;
@Mock
INotificationManager mInm;
@Before
public void setUp() {
MockitoAnnotations.initMocks(this);
mContext = RuntimeEnvironment.application;
mSetFlagsRule.enableFlags(
android.service.notification.Flags.FLAG_NOTIFICATION_CLASSIFICATION,
Flags.FLAG_NOTIFICATION_CLASSIFICATION_UI);
mController = new BundleGlobalPreferenceController(mContext, PREFERENCE_KEY);
mController.mBackend.setNm(mInm);
}
@Test
public void isAvailable_flagEnabledNasSupports_shouldReturnTrue() {
assertThat(mController.isAvailable()).isTrue();
}
@Test
public void isAvailable_flagEnabledNasDoesNotSupport_shouldReturnFalse() throws Exception {
when(mInm.getUnsupportedAdjustmentTypes()).thenReturn(List.of(KEY_TYPE));
assertThat(mController.isAvailable()).isFalse();
}
@Test
public void isAvailable_flagDisabledNasSupports_shouldReturnFalse() {
mSetFlagsRule.disableFlags(Flags.FLAG_NOTIFICATION_CLASSIFICATION_UI);
assertThat(mController.isAvailable()).isFalse();
}
@Test
public void isChecked() throws Exception {
when(mInm.getAllowedAssistantAdjustments(any())).thenReturn(List.of(KEY_TYPE));
assertThat(mController.isChecked()).isTrue();
when(mInm.getAllowedAssistantAdjustments(any())).thenReturn(List.of(KEY_IMPORTANCE));
assertThat(mController.isChecked()).isFalse();
}
@Test
public void setChecked() throws Exception {
mController.setChecked(false);
verify(mInm).disallowAssistantAdjustment(KEY_TYPE);
mController.setChecked(true);
verify(mInm).allowAssistantAdjustment(KEY_TYPE);
}
}

View File

@@ -0,0 +1,91 @@
/*
* Copyright (C) 2024 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.android.settings.notification;
import static android.service.notification.Adjustment.KEY_IMPORTANCE;
import static android.service.notification.Adjustment.KEY_TYPE;
import static com.google.common.truth.Truth.assertThat;
import static org.mockito.ArgumentMatchers.any;
import static org.mockito.Mockito.when;
import android.app.Flags;
import android.app.INotificationManager;
import android.content.Context;
import android.platform.test.flag.junit.SetFlagsRule;
import org.junit.Before;
import org.junit.Rule;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.Mock;
import org.mockito.MockitoAnnotations;
import org.robolectric.RobolectricTestRunner;
import org.robolectric.RuntimeEnvironment;
import java.util.List;
@RunWith(RobolectricTestRunner.class)
public class BundlePreferenceControllerTest {
@Rule
public final SetFlagsRule mSetFlagsRule = new SetFlagsRule();
private static final String PREFERENCE_KEY = "preference_key";
private Context mContext;
BundlePreferenceController mController;
@Mock
INotificationManager mInm;
@Before
public void setUp() {
MockitoAnnotations.initMocks(this);
mContext = RuntimeEnvironment.application;
mSetFlagsRule.enableFlags(
android.service.notification.Flags.FLAG_NOTIFICATION_CLASSIFICATION,
Flags.FLAG_NOTIFICATION_CLASSIFICATION_UI);
mController = new BundlePreferenceController(mContext, PREFERENCE_KEY);
mController.mBackend.setNm(mInm);
}
@Test
public void isAvailable_flagEnabledNasSupports_shouldReturnTrue() {
assertThat(mController.isAvailable()).isTrue();
}
@Test
public void isAvailable_flagEnabledNasDoesNotSupport_shouldReturnFalse() throws Exception {
when(mInm.getUnsupportedAdjustmentTypes()).thenReturn(List.of(KEY_TYPE));
assertThat(mController.isAvailable()).isFalse();
}
@Test
public void isAvailable_flagDisabledNasSupports_shouldReturnFalse() {
mSetFlagsRule.disableFlags(Flags.FLAG_NOTIFICATION_CLASSIFICATION_UI);
assertThat(mController.isAvailable()).isFalse();
}
@Test
public void getSummary() throws Exception {
when(mInm.getAllowedAssistantAdjustments(any())).thenReturn(List.of(KEY_TYPE));
assertThat(mController.getSummary()).isEqualTo("On");
when(mInm.getAllowedAssistantAdjustments(any())).thenReturn(List.of(KEY_IMPORTANCE));
assertThat(mController.getSummary()).isEqualTo("Off");
}
}

View File

@@ -0,0 +1,171 @@
/*
* Copyright (C) 2024 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.android.settings.notification;
import static android.service.notification.Adjustment.KEY_TYPE;
import static android.service.notification.Adjustment.TYPE_CONTENT_RECOMMENDATION;
import static android.service.notification.Adjustment.TYPE_NEWS;
import static android.service.notification.Adjustment.TYPE_PROMOTION;
import static android.service.notification.Adjustment.TYPE_SOCIAL_MEDIA;
import static com.google.common.truth.Truth.assertThat;
import static org.mockito.ArgumentMatchers.any;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
import android.app.Flags;
import android.app.INotificationManager;
import android.content.Context;
import android.os.RemoteException;
import android.platform.test.flag.junit.SetFlagsRule;
import org.junit.Before;
import org.junit.Rule;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.Mock;
import org.mockito.MockitoAnnotations;
import org.robolectric.RobolectricTestRunner;
import org.robolectric.RuntimeEnvironment;
import java.util.List;
@RunWith(RobolectricTestRunner.class)
public class BundleTypePreferenceControllerTest {
@Rule
public final SetFlagsRule mSetFlagsRule = new SetFlagsRule();
private static final String PREFERENCE_KEY = "preference_key";
private Context mContext;
BundleTypePreferenceController mController;
@Mock
INotificationManager mInm;
@Before
public void setUp() throws RemoteException {
MockitoAnnotations.initMocks(this);
when(mInm.getAllowedAssistantAdjustments(any())).thenReturn(List.of(KEY_TYPE));
when(mInm.getUnsupportedAdjustmentTypes()).thenReturn(List.of());
mSetFlagsRule.enableFlags(
android.service.notification.Flags.FLAG_NOTIFICATION_CLASSIFICATION,
Flags.FLAG_NOTIFICATION_CLASSIFICATION_UI);
mContext = RuntimeEnvironment.application;
mController = new BundleTypePreferenceController(mContext, PREFERENCE_KEY);
mController.mBackend.setNm(mInm);
}
@Test
public void isAvailable() throws RemoteException {
when(mInm.getAllowedAssistantAdjustments(any())).thenReturn(List.of(KEY_TYPE));
assertThat(mController.isAvailable()).isTrue();
}
@Test
public void isAvailable_flagEnabledNasDoesNotSupport_shouldReturnFalse()
throws RemoteException {
when(mInm.getUnsupportedAdjustmentTypes()).thenReturn(List.of(KEY_TYPE));
when(mInm.getAllowedAssistantAdjustments(any())).thenReturn(List.of(KEY_TYPE));
assertThat(mController.isAvailable()).isFalse();
}
@Test
public void isAvailable_flagDisabledNasSupports_shouldReturnFalse() throws RemoteException {
mSetFlagsRule.disableFlags(Flags.FLAG_NOTIFICATION_CLASSIFICATION_UI);
when(mInm.getUnsupportedAdjustmentTypes()).thenReturn(List.of());
when(mInm.getAllowedAssistantAdjustments(any())).thenReturn(List.of(KEY_TYPE));
assertThat(mController.isAvailable()).isFalse();
}
@Test
public void isAvailable_flagEnabledNasDisabled_shouldReturnFalse() throws RemoteException {
when(mInm.getUnsupportedAdjustmentTypes()).thenReturn(List.of());
when(mInm.getAllowedAssistantAdjustments(any())).thenReturn(List.of());
assertThat(mController.isAvailable()).isFalse();
}
@Test
public void isChecked_promotions() throws RemoteException {
mController = new BundleTypePreferenceController(mContext,
BundleTypePreferenceController.PROMO_KEY);
when(mInm.getAllowedAdjustmentKeyTypes()).thenReturn(new int[]{TYPE_PROMOTION});
assertThat(mController.isChecked()).isTrue();
when(mInm.getAllowedAdjustmentKeyTypes()).thenReturn(new int[]{});
assertThat(mController.isChecked()).isFalse();
}
@Test
public void isChecked_news() throws RemoteException {
mController = new BundleTypePreferenceController(mContext,
BundleTypePreferenceController.NEWS_KEY);
when(mInm.getAllowedAdjustmentKeyTypes()).thenReturn(new int[]{TYPE_NEWS});
assertThat(mController.isChecked()).isTrue();
when(mInm.getAllowedAdjustmentKeyTypes()).thenReturn(new int[]{});
assertThat(mController.isChecked()).isFalse();
}
@Test
public void isChecked_social() throws RemoteException {
mController = new BundleTypePreferenceController(mContext,
BundleTypePreferenceController.SOCIAL_KEY);
when(mInm.getAllowedAdjustmentKeyTypes()).thenReturn(new int[]{TYPE_SOCIAL_MEDIA});
assertThat(mController.isChecked()).isTrue();
when(mInm.getAllowedAdjustmentKeyTypes()).thenReturn(new int[]{});
assertThat(mController.isChecked()).isFalse();
}
@Test
public void isChecked_recs() throws RemoteException {
mController = new BundleTypePreferenceController(mContext,
BundleTypePreferenceController.RECS_KEY);
when(mInm.getAllowedAdjustmentKeyTypes()).thenReturn(
new int[]{TYPE_CONTENT_RECOMMENDATION});
assertThat(mController.isChecked()).isTrue();
when(mInm.getAllowedAdjustmentKeyTypes()).thenReturn(new int[]{});
assertThat(mController.isChecked()).isFalse();
}
@Test
public void isChecked_mixed() throws RemoteException {
mController = new BundleTypePreferenceController(mContext,
BundleTypePreferenceController.RECS_KEY);
when(mInm.getAllowedAdjustmentKeyTypes()).thenReturn(
new int[]{TYPE_PROMOTION, TYPE_CONTENT_RECOMMENDATION});
assertThat(mController.isChecked()).isTrue();
}
@Test
public void setChecked() throws RemoteException {
mController = new BundleTypePreferenceController(mContext,
BundleTypePreferenceController.PROMO_KEY);
mController.setChecked(false);
verify(mInm).setAssistantAdjustmentKeyTypeState(TYPE_PROMOTION, false);
mController.setChecked(true);
verify(mInm).setAssistantAdjustmentKeyTypeState(TYPE_PROMOTION, true);
}
}