1/*
2 * Copyright (C) 2017 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 *      http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License
15 */
16
17package com.android.settings.deletionhelper;
18
19import static com.google.common.truth.Truth.assertThat;
20
21import static org.mockito.Matchers.any;
22import static org.mockito.Matchers.eq;
23import static org.mockito.Mockito.RETURNS_DEEP_STUBS;
24import static org.mockito.Mockito.mock;
25import static org.mockito.Mockito.never;
26import static org.mockito.Mockito.spy;
27import static org.mockito.Mockito.verify;
28
29import android.app.Fragment;
30import android.app.FragmentManager;
31import android.content.Context;
32import android.provider.Settings;
33import android.support.v7.preference.Preference;
34
35import com.android.internal.logging.nano.MetricsProto;
36import com.android.settings.testutils.SettingsRobolectricTestRunner;
37import com.android.settings.TestConfig;
38import com.android.settings.core.instrumentation.MetricsFeatureProvider;
39import com.android.settings.overlay.FeatureFactory;
40import com.android.settings.testutils.FakeFeatureFactory;
41import com.android.settings.testutils.shadow.SettingsShadowSystemProperties;
42import com.android.settings.widget.SwitchBar;
43
44import org.junit.Before;
45import org.junit.Test;
46import org.junit.runner.RunWith;
47import org.mockito.Answers;
48import org.mockito.Mock;
49import org.mockito.MockitoAnnotations;
50import org.robolectric.RuntimeEnvironment;
51import org.robolectric.annotation.Config;
52
53@RunWith(SettingsRobolectricTestRunner.class)
54@Config(manifest = TestConfig.MANIFEST_PATH, sdk = TestConfig.SDK_VERSION)
55public class AutomaticStorageManagerSwitchBarControllerTest {
56    private Context mContext;
57    private SwitchBar mSwitchBar;
58    private MetricsFeatureProvider mMetricsFeatureProvider;
59    private Preference mPreference;
60
61    @Mock(answer = Answers.RETURNS_DEEP_STUBS)
62    private FragmentManager mFragmentManager;
63
64    private AutomaticStorageManagerSwitchBarController mController;
65
66    @Before
67    public void setUp() {
68        MockitoAnnotations.initMocks(this);
69
70        mContext = spy(RuntimeEnvironment.application);
71        mSwitchBar = new SwitchBar(mContext);
72
73        Context fakeContextForFakeProvider = mock(Context.class, RETURNS_DEEP_STUBS);
74        FakeFeatureFactory.setupForTest(fakeContextForFakeProvider);
75        FeatureFactory featureFactory = FakeFeatureFactory.getFactory(fakeContextForFakeProvider);
76        mMetricsFeatureProvider = featureFactory.getMetricsFeatureProvider();
77        mPreference = new Preference(mContext);
78
79        mController =
80                new AutomaticStorageManagerSwitchBarController(
81                        mContext,
82                        mSwitchBar,
83                        mMetricsFeatureProvider,
84                        mPreference,
85                        mFragmentManager);
86    }
87
88    @Test
89    public void onSwitchChanged_false_recordsAMetric() {
90        mController.onSwitchChanged(null, false);
91
92        verify(mMetricsFeatureProvider)
93                .action(
94                        eq(mContext),
95                        eq(MetricsProto.MetricsEvent.ACTION_TOGGLE_STORAGE_MANAGER),
96                        eq(false));
97    }
98
99    @Test
100    public void onSwitchChanged_true_recordsAMetric() {
101        mController.onSwitchChanged(null, true);
102
103        verify(mMetricsFeatureProvider)
104                .action(
105                        eq(mContext),
106                        eq(MetricsProto.MetricsEvent.ACTION_TOGGLE_STORAGE_MANAGER),
107                        eq(true));
108    }
109
110    @Test
111    public void onSwitchChanged_showWarningFragmentIfNotEnabledByDefault() {
112        mController.onSwitchChanged(null, true);
113
114        verify(mFragmentManager.beginTransaction())
115                .add(any(Fragment.class), eq(ActivationWarningFragment.TAG));
116    }
117
118    @Config(shadows = {SettingsShadowSystemProperties.class})
119    @Test
120    public void onSwitchChange_doNotShowWarningFragmentIfEnabledByDefault() {
121        SettingsShadowSystemProperties.set("ro.storage_manager.enabled", "true");
122
123        mController.onSwitchChanged(null, true);
124
125        verify(mFragmentManager.beginTransaction(), never())
126                .add(any(Fragment.class), eq(ActivationWarningFragment.TAG));
127    }
128
129    @Test
130    public void initializeSwitchOnConstruction() {
131        Settings.Secure.putInt(
132                mContext.getContentResolver(),
133                Settings.Secure.AUTOMATIC_STORAGE_MANAGER_ENABLED,
134                1);
135
136        mController =
137                new AutomaticStorageManagerSwitchBarController(
138                        mContext,
139                        mSwitchBar,
140                        mMetricsFeatureProvider,
141                        mPreference,
142                        mFragmentManager);
143
144        assertThat(mSwitchBar.isChecked()).isTrue();
145    }
146
147    @Test
148    public void initializingSwitchDoesNotTriggerView() {
149        Settings.Secure.putInt(
150                mContext.getContentResolver(),
151                Settings.Secure.AUTOMATIC_STORAGE_MANAGER_ENABLED,
152                1);
153
154        mController =
155                new AutomaticStorageManagerSwitchBarController(
156                        mContext,
157                        mSwitchBar,
158                        mMetricsFeatureProvider,
159                        mPreference,
160                        mFragmentManager);
161
162        verify(mFragmentManager.beginTransaction(), never())
163                .add(any(Fragment.class), eq(ActivationWarningFragment.TAG));
164    }
165}
166