/* * Copyright (C) 2018 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.app.NotificationManager.Policy.PRIORITY_CATEGORY_ALARMS; import static android.app.NotificationManager.Policy.PRIORITY_CATEGORY_REPEAT_CALLERS; import static android.app.NotificationManager.Policy.SUPPRESSED_EFFECT_SCREEN_ON; import static com.android.settings.notification.ZenOnboardingActivity.ALWAYS_SHOW_THRESHOLD; import static com.android.settings.notification.ZenOnboardingActivity .PREF_KEY_SUGGESTION_FIRST_DISPLAY_TIME; import static com.android.settings.notification.ZenOnboardingActivity.isSuggestionComplete; import static com.google.common.truth.Truth.assertThat; import static org.mockito.ArgumentMatchers.any; import static org.mockito.Mockito.never; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; import android.app.NotificationManager; import android.app.NotificationManager.Policy; import android.content.Context; import android.content.SharedPreferences; import android.provider.Settings; import com.android.internal.logging.MetricsLogger; import com.android.internal.logging.nano.MetricsProto.MetricsEvent; import com.android.settings.testutils.FakeFeatureFactory; import com.android.settings.testutils.SettingsRobolectricTestRunner; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; import org.mockito.ArgumentCaptor; import org.mockito.Mock; import org.mockito.MockitoAnnotations; import org.robolectric.Robolectric; import org.robolectric.RuntimeEnvironment; import org.robolectric.shadows.ShadowApplication; @RunWith(SettingsRobolectricTestRunner.class) public class ZenOnboardingActivityTest { @Mock MetricsLogger mMetricsLogger; @Mock NotificationManager mNm; ZenOnboardingActivity mActivity; private Context mContext; private FakeFeatureFactory mFeatureFactory; @Before public void setUp() { MockitoAnnotations.initMocks(this); ShadowApplication shadowApplication = ShadowApplication.getInstance(); shadowApplication.setSystemService(Context.NOTIFICATION_SERVICE, mNm); mActivity = Robolectric.buildActivity(ZenOnboardingActivity.class) .create() .get(); mActivity.setNotificationManager(mNm); mActivity.setMetricsLogger(mMetricsLogger); mActivity.setupUI(); mContext = RuntimeEnvironment.application; mFeatureFactory = FakeFeatureFactory.setupForTest(); when(mFeatureFactory.suggestionsFeatureProvider.getSharedPrefs(any(Context.class))) .thenReturn(getSharedPreferences()); } @Test public void loadUiRecordsEvent() { verify(mMetricsLogger).visible(MetricsEvent.SETTINGS_ZEN_ONBOARDING); } @Test public void saveNewSetting() { Policy policy = new Policy(PRIORITY_CATEGORY_ALARMS, 0, 0, SUPPRESSED_EFFECT_SCREEN_ON); when(mNm.getNotificationPolicy()).thenReturn(policy); mActivity.mNewSetting.performClick(); mActivity.save(null); verify(mMetricsLogger).action(MetricsEvent.ACTION_ZEN_ONBOARDING_OK); ArgumentCaptor<Policy> captor = ArgumentCaptor.forClass(Policy.class); verify(mNm).setNotificationPolicy(captor.capture()); Policy actual = captor.getValue(); assertThat(actual.priorityCategories).isEqualTo(PRIORITY_CATEGORY_ALARMS | PRIORITY_CATEGORY_REPEAT_CALLERS); assertThat(actual.priorityCallSenders).isEqualTo(Policy.PRIORITY_SENDERS_STARRED); assertThat(actual.priorityMessageSenders).isEqualTo(Policy.PRIORITY_SENDERS_ANY); assertThat(actual.suppressedVisualEffects).isEqualTo( Policy.getAllSuppressedVisualEffects()); } @Test public void keepCurrentSetting() { Policy policy = new Policy(PRIORITY_CATEGORY_ALARMS, 0, 0, SUPPRESSED_EFFECT_SCREEN_ON); when(mNm.getNotificationPolicy()).thenReturn(policy); mActivity.mKeepCurrentSetting.performClick(); mActivity.save(null); verify(mMetricsLogger).action(MetricsEvent.ACTION_ZEN_ONBOARDING_KEEP_CURRENT_SETTINGS); verify(mNm, never()).setNotificationPolicy(any()); } @Test public void isSuggestionComplete_zenUpdated() { Policy policy = new Policy(0, 0, 0, 0); when(mNm.getNotificationPolicy()).thenReturn(policy); setZenUpdated(true); setShowSettingsSuggestion(false); setWithinTimeThreshold(true); assertThat(isSuggestionComplete(mContext)).isTrue(); } @Test public void isSuggestionComplete_withinTimeThreshold() { Policy policy = new Policy(0, 0, 0, 0); when(mNm.getNotificationPolicy()).thenReturn(policy); setZenUpdated(false); setShowSettingsSuggestion(false); setWithinTimeThreshold(true); assertThat(isSuggestionComplete(mContext)).isFalse(); } @Test public void isSuggestionComplete_showSettingsSuggestionTrue() { Policy policy = new Policy(0, 0, 0, 0); when(mNm.getNotificationPolicy()).thenReturn(policy); setZenUpdated(false); setShowSettingsSuggestion(true); setWithinTimeThreshold(false); assertThat(isSuggestionComplete(mContext)).isFalse(); } @Test public void isSuggestionComplete_showSettingsSuggestionFalse_notWithinTimeThreshold() { Policy policy = new Policy(0, 0, 0, 0); when(mNm.getNotificationPolicy()).thenReturn(policy); setZenUpdated(false); setShowSettingsSuggestion(false); setWithinTimeThreshold(false); assertThat(isSuggestionComplete(mContext)).isTrue(); } @Test public void isSuggestionComplete_visualEffectsUpdated() { // all values suppressed Policy policy = new Policy(0, 0, 0, 511); when(mNm.getNotificationPolicy()).thenReturn(policy); setZenUpdated(false); setShowSettingsSuggestion(true); setWithinTimeThreshold(true); assertThat(isSuggestionComplete(mContext)).isTrue(); assertThat(Settings.Global.getInt(mContext.getContentResolver(), Settings.Global.ZEN_SETTINGS_UPDATED, -1)).isEqualTo(1); } private void setZenUpdated(boolean updated) { int zenUpdated = updated ? 1 : 0; Settings.Global.putInt(mContext.getContentResolver(), Settings.Global.ZEN_SETTINGS_UPDATED, zenUpdated); } private void setWithinTimeThreshold(boolean withinTime) { long firstTime = System.currentTimeMillis(); if (withinTime) { firstTime -= ALWAYS_SHOW_THRESHOLD / 2; } else { firstTime -= ALWAYS_SHOW_THRESHOLD * 2; } getSharedPreferences().edit().putLong(PREF_KEY_SUGGESTION_FIRST_DISPLAY_TIME, firstTime).commit(); } private void setShowSettingsSuggestion(boolean show) { int showZenSuggestion = 0; if (show) { showZenSuggestion = 1; } Settings.Global.putInt(mContext.getContentResolver(), Settings.Global.SHOW_ZEN_SETTINGS_SUGGESTION, showZenSuggestion); } private SharedPreferences getSharedPreferences() { return mContext.getSharedPreferences("test_zen_sugg", Context.MODE_PRIVATE); } }