1ec89a3f57f3b73b6f119eb7b5546ba4e5f1ede20Daniel Nishi/*
2ec89a3f57f3b73b6f119eb7b5546ba4e5f1ede20Daniel Nishi * Copyright (C) 2016 The Android Open Source Project
3ec89a3f57f3b73b6f119eb7b5546ba4e5f1ede20Daniel Nishi *
4ec89a3f57f3b73b6f119eb7b5546ba4e5f1ede20Daniel Nishi * Licensed under the Apache License, Version 2.0 (the "License");
5ec89a3f57f3b73b6f119eb7b5546ba4e5f1ede20Daniel Nishi * you may not use this file except in compliance with the License.
6ec89a3f57f3b73b6f119eb7b5546ba4e5f1ede20Daniel Nishi * You may obtain a copy of the License at
7ec89a3f57f3b73b6f119eb7b5546ba4e5f1ede20Daniel Nishi *
8ec89a3f57f3b73b6f119eb7b5546ba4e5f1ede20Daniel Nishi *      http://www.apache.org/licenses/LICENSE-2.0
9ec89a3f57f3b73b6f119eb7b5546ba4e5f1ede20Daniel Nishi *
10ec89a3f57f3b73b6f119eb7b5546ba4e5f1ede20Daniel Nishi * Unless required by applicable law or agreed to in writing, software
11ec89a3f57f3b73b6f119eb7b5546ba4e5f1ede20Daniel Nishi * distributed under the License is distributed on an "AS IS" BASIS,
12ec89a3f57f3b73b6f119eb7b5546ba4e5f1ede20Daniel Nishi * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13ec89a3f57f3b73b6f119eb7b5546ba4e5f1ede20Daniel Nishi * See the License for the specific language governing permissions and
14ec89a3f57f3b73b6f119eb7b5546ba4e5f1ede20Daniel Nishi * limitations under the License
15ec89a3f57f3b73b6f119eb7b5546ba4e5f1ede20Daniel Nishi */
16ec89a3f57f3b73b6f119eb7b5546ba4e5f1ede20Daniel Nishipackage com.android.settings.deviceinfo.storage;
17ec89a3f57f3b73b6f119eb7b5546ba4e5f1ede20Daniel Nishi
18cf0e659a6c45023db5774d530d80721a7abb616bDaniel Nishi
1959982c6954b215f17e14e8d87efccdc25144a1ccDaniel Nishiimport static com.android.settings.applications.ManageApplications.EXTRA_WORK_ID;
2083ceab82e4f6dd55e03a5832cf4b4ceca71b0722Daniel Nishiimport static com.android.settings.applications.ManageApplications.EXTRA_WORK_ONLY;
2163a11c56de4f51eaabeafb54501fe3f6f564a61cDaniel Nishiimport static com.android.settings.utils.FileSizeFormatter.MEGABYTE_IN_BYTES;
22ec89a3f57f3b73b6f119eb7b5546ba4e5f1ede20Daniel Nishi
23046400c2c407429da47e6b2230ba8bbd21c43e9bMaurice Lamimport static com.google.common.truth.Truth.assertThat;
24046400c2c407429da47e6b2230ba8bbd21c43e9bMaurice Lam
25046400c2c407429da47e6b2230ba8bbd21c43e9bMaurice Lamimport static org.mockito.ArgumentMatchers.nullable;
26e0eb1a2e2708167f3cc962aafce06d13067a5e49Daniel Nishiimport static org.mockito.Matchers.eq;
27884809199fe5dd5cec18292e86ef25f922921d22Daniel Nishiimport static org.mockito.Mockito.mock;
28e0eb1a2e2708167f3cc962aafce06d13067a5e49Daniel Nishiimport static org.mockito.Mockito.spy;
29e0eb1a2e2708167f3cc962aafce06d13067a5e49Daniel Nishiimport static org.mockito.Mockito.times;
308cc6f9f718cc634c7bace3324f1faa1cc76fd822Daniel Nishiimport static org.mockito.Mockito.verify;
318cc6f9f718cc634c7bace3324f1faa1cc76fd822Daniel Nishiimport static org.mockito.Mockito.when;
328cc6f9f718cc634c7bace3324f1faa1cc76fd822Daniel Nishi
338cc6f9f718cc634c7bace3324f1faa1cc76fd822Daniel Nishiimport android.app.Fragment;
34ec89a3f57f3b73b6f119eb7b5546ba4e5f1ede20Daniel Nishiimport android.content.Context;
358cc6f9f718cc634c7bace3324f1faa1cc76fd822Daniel Nishiimport android.content.Intent;
363414a6904b3c411e3f8f1799a377ef7b582f0e5bDaniel Nishiimport android.graphics.drawable.Drawable;
378cc6f9f718cc634c7bace3324f1faa1cc76fd822Daniel Nishiimport android.os.UserHandle;
388cc6f9f718cc634c7bace3324f1faa1cc76fd822Daniel Nishiimport android.os.storage.VolumeInfo;
39884809199fe5dd5cec18292e86ef25f922921d22Daniel Nishiimport android.support.v7.preference.PreferenceScreen;
4077fe8c1e9e0ca06ab723a471c97913ae127959b5Jeff Sharkeyimport android.util.SparseArray;
41ec89a3f57f3b73b6f119eb7b5546ba4e5f1ede20Daniel Nishiimport android.view.LayoutInflater;
42884809199fe5dd5cec18292e86ef25f922921d22Daniel Nishiimport android.view.View;
43ec89a3f57f3b73b6f119eb7b5546ba4e5f1ede20Daniel Nishiimport android.widget.LinearLayout;
44ec89a3f57f3b73b6f119eb7b5546ba4e5f1ede20Daniel Nishi
45e0eb1a2e2708167f3cc962aafce06d13067a5e49Daniel Nishiimport com.android.internal.logging.nano.MetricsProto.MetricsEvent;
468cc6f9f718cc634c7bace3324f1faa1cc76fd822Daniel Nishiimport com.android.settings.R;
478cc6f9f718cc634c7bace3324f1faa1cc76fd822Daniel Nishiimport com.android.settings.SettingsActivity;
489f1e911759dc6fedaac9fa65afb79f6a93022bf4Andrew Sappersteinimport com.android.settings.testutils.SettingsRobolectricTestRunner;
498cc6f9f718cc634c7bace3324f1faa1cc76fd822Daniel Nishiimport com.android.settings.SubSettings;
50ec89a3f57f3b73b6f119eb7b5546ba4e5f1ede20Daniel Nishiimport com.android.settings.TestConfig;
518cc6f9f718cc634c7bace3324f1faa1cc76fd822Daniel Nishiimport com.android.settings.applications.ManageApplications;
52e0eb1a2e2708167f3cc962aafce06d13067a5e49Daniel Nishiimport com.android.settings.core.instrumentation.MetricsFeatureProvider;
53fda5d5a6a8b7902cf05b124522f063863b42ca12Daniel Nishiimport com.android.settings.deviceinfo.PrivateVolumeSettings;
54cf0e659a6c45023db5774d530d80721a7abb616bDaniel Nishiimport com.android.settings.deviceinfo.StorageItemPreference;
55e0eb1a2e2708167f3cc962aafce06d13067a5e49Daniel Nishiimport com.android.settings.testutils.FakeFeatureFactory;
5663a11c56de4f51eaabeafb54501fe3f6f564a61cDaniel Nishiimport com.android.settings.testutils.shadow.SettingsShadowResources;
57422e7c354dc57aea64dd5a455167f5f2a5cb5695Daniel Nishiimport com.android.settingslib.applications.StorageStatsSource;
588cc6f9f718cc634c7bace3324f1faa1cc76fd822Daniel Nishiimport com.android.settingslib.deviceinfo.StorageVolumeProvider;
59ec89a3f57f3b73b6f119eb7b5546ba4e5f1ede20Daniel Nishi
6063a11c56de4f51eaabeafb54501fe3f6f564a61cDaniel Nishiimport org.junit.After;
61ec89a3f57f3b73b6f119eb7b5546ba4e5f1ede20Daniel Nishiimport org.junit.Before;
62ec89a3f57f3b73b6f119eb7b5546ba4e5f1ede20Daniel Nishiimport org.junit.Test;
63ec89a3f57f3b73b6f119eb7b5546ba4e5f1ede20Daniel Nishiimport org.junit.runner.RunWith;
648cc6f9f718cc634c7bace3324f1faa1cc76fd822Daniel Nishiimport org.mockito.Answers;
658cc6f9f718cc634c7bace3324f1faa1cc76fd822Daniel Nishiimport org.mockito.ArgumentCaptor;
668cc6f9f718cc634c7bace3324f1faa1cc76fd822Daniel Nishiimport org.mockito.Mock;
678cc6f9f718cc634c7bace3324f1faa1cc76fd822Daniel Nishiimport org.mockito.MockitoAnnotations;
68ec89a3f57f3b73b6f119eb7b5546ba4e5f1ede20Daniel Nishiimport org.robolectric.RuntimeEnvironment;
69ec89a3f57f3b73b6f119eb7b5546ba4e5f1ede20Daniel Nishiimport org.robolectric.annotation.Config;
70ec89a3f57f3b73b6f119eb7b5546ba4e5f1ede20Daniel Nishi
71ec89a3f57f3b73b6f119eb7b5546ba4e5f1ede20Daniel Nishi@RunWith(SettingsRobolectricTestRunner.class)
72ec89a3f57f3b73b6f119eb7b5546ba4e5f1ede20Daniel Nishi@Config(manifest = TestConfig.MANIFEST_PATH, sdk = TestConfig.SDK_VERSION)
73ec89a3f57f3b73b6f119eb7b5546ba4e5f1ede20Daniel Nishipublic class StorageItemPreferenceControllerTest {
74ec89a3f57f3b73b6f119eb7b5546ba4e5f1ede20Daniel Nishi    private Context mContext;
758cc6f9f718cc634c7bace3324f1faa1cc76fd822Daniel Nishi    private VolumeInfo mVolume;
768cc6f9f718cc634c7bace3324f1faa1cc76fd822Daniel Nishi    @Mock(answer = Answers.RETURNS_DEEP_STUBS)
778cc6f9f718cc634c7bace3324f1faa1cc76fd822Daniel Nishi    private Fragment mFragment;
788cc6f9f718cc634c7bace3324f1faa1cc76fd822Daniel Nishi    @Mock
798cc6f9f718cc634c7bace3324f1faa1cc76fd822Daniel Nishi    private StorageVolumeProvider mSvp;
80ec89a3f57f3b73b6f119eb7b5546ba4e5f1ede20Daniel Nishi    private StorageItemPreferenceController mController;
81cf0e659a6c45023db5774d530d80721a7abb616bDaniel Nishi    private StorageItemPreference mPreference;
82e0eb1a2e2708167f3cc962aafce06d13067a5e49Daniel Nishi    private FakeFeatureFactory mFakeFeatureFactory;
83e0eb1a2e2708167f3cc962aafce06d13067a5e49Daniel Nishi    private MetricsFeatureProvider mMetricsFeatureProvider;
84ec89a3f57f3b73b6f119eb7b5546ba4e5f1ede20Daniel Nishi
85ec89a3f57f3b73b6f119eb7b5546ba4e5f1ede20Daniel Nishi    @Before
86ec89a3f57f3b73b6f119eb7b5546ba4e5f1ede20Daniel Nishi    public void setUp() throws Exception {
878cc6f9f718cc634c7bace3324f1faa1cc76fd822Daniel Nishi        MockitoAnnotations.initMocks(this);
88e0eb1a2e2708167f3cc962aafce06d13067a5e49Daniel Nishi        mContext = spy(RuntimeEnvironment.application.getApplicationContext());
89e0eb1a2e2708167f3cc962aafce06d13067a5e49Daniel Nishi        FakeFeatureFactory.setupForTest(mContext);
90e0eb1a2e2708167f3cc962aafce06d13067a5e49Daniel Nishi        mFakeFeatureFactory = (FakeFeatureFactory) FakeFeatureFactory.getFactory(mContext);
91e0eb1a2e2708167f3cc962aafce06d13067a5e49Daniel Nishi        mMetricsFeatureProvider = mFakeFeatureFactory.getMetricsFeatureProvider();
921f079fbae4785fba9ee673f3e81e6e92852cb7b5Daniel Nishi        mVolume = spy(new VolumeInfo("id", 0, null, "id"));
93884809199fe5dd5cec18292e86ef25f922921d22Daniel Nishi        // Note: null is passed as the Lifecycle because we are handling it outside of the normal
94884809199fe5dd5cec18292e86ef25f922921d22Daniel Nishi        //       Settings fragment lifecycle for test purposes.
957cec1bc53c1d43f8cfd5207ed47d7194c20a4c7dDaniel Nishi        mController = new StorageItemPreferenceController(mContext, mFragment, mVolume, mSvp);
96cf0e659a6c45023db5774d530d80721a7abb616bDaniel Nishi        mPreference = new StorageItemPreference(mContext);
97ec89a3f57f3b73b6f119eb7b5546ba4e5f1ede20Daniel Nishi
98ec89a3f57f3b73b6f119eb7b5546ba4e5f1ede20Daniel Nishi        // Inflate the preference and the widget.
99ec89a3f57f3b73b6f119eb7b5546ba4e5f1ede20Daniel Nishi        LayoutInflater inflater = LayoutInflater.from(mContext);
100884809199fe5dd5cec18292e86ef25f922921d22Daniel Nishi        final View view = inflater.inflate(
101884809199fe5dd5cec18292e86ef25f922921d22Daniel Nishi                mPreference.getLayoutResource(), new LinearLayout(mContext), false);
1028cc6f9f718cc634c7bace3324f1faa1cc76fd822Daniel Nishi    }
103ec89a3f57f3b73b6f119eb7b5546ba4e5f1ede20Daniel Nishi
10463a11c56de4f51eaabeafb54501fe3f6f564a61cDaniel Nishi    @After
10563a11c56de4f51eaabeafb54501fe3f6f564a61cDaniel Nishi    public void tearDown() {
10663a11c56de4f51eaabeafb54501fe3f6f564a61cDaniel Nishi        SettingsShadowResources.reset();
10763a11c56de4f51eaabeafb54501fe3f6f564a61cDaniel Nishi    }
10863a11c56de4f51eaabeafb54501fe3f6f564a61cDaniel Nishi
1098cc6f9f718cc634c7bace3324f1faa1cc76fd822Daniel Nishi    @Test
1108cc6f9f718cc634c7bace3324f1faa1cc76fd822Daniel Nishi    public void testUpdateStateWithInitialState() {
1118cc6f9f718cc634c7bace3324f1faa1cc76fd822Daniel Nishi        assertThat(mPreference.getSummary().toString()).isEqualTo(
1128cc6f9f718cc634c7bace3324f1faa1cc76fd822Daniel Nishi                mContext.getString(R.string.memory_calculating_size));
113ec89a3f57f3b73b6f119eb7b5546ba4e5f1ede20Daniel Nishi    }
114ec89a3f57f3b73b6f119eb7b5546ba4e5f1ede20Daniel Nishi
115ec89a3f57f3b73b6f119eb7b5546ba4e5f1ede20Daniel Nishi    @Test
1168cc6f9f718cc634c7bace3324f1faa1cc76fd822Daniel Nishi    public void testClickPhotos() {
1178cc6f9f718cc634c7bace3324f1faa1cc76fd822Daniel Nishi        mPreference.setKey("pref_photos_videos");
1188cc6f9f718cc634c7bace3324f1faa1cc76fd822Daniel Nishi        mController.handlePreferenceTreeClick(mPreference);
1198cc6f9f718cc634c7bace3324f1faa1cc76fd822Daniel Nishi
1208cc6f9f718cc634c7bace3324f1faa1cc76fd822Daniel Nishi        final ArgumentCaptor<Intent> argumentCaptor = ArgumentCaptor.forClass(Intent.class);
1218cc6f9f718cc634c7bace3324f1faa1cc76fd822Daniel Nishi        verify(mFragment.getActivity()).startActivityAsUser(argumentCaptor.capture(),
122046400c2c407429da47e6b2230ba8bbd21c43e9bMaurice Lam                nullable(UserHandle.class));
1238cc6f9f718cc634c7bace3324f1faa1cc76fd822Daniel Nishi
1248cc6f9f718cc634c7bace3324f1faa1cc76fd822Daniel Nishi        Intent intent = argumentCaptor.getValue();
1259be0ce09c9b3eb2e2d0bac038a3f469f087af652Daniel Nishi        assertThat(intent.getAction()).isEqualTo(Intent.ACTION_MAIN);
1269be0ce09c9b3eb2e2d0bac038a3f469f087af652Daniel Nishi        assertThat(intent.getComponent().getClassName()).isEqualTo(SubSettings.class.getName());
1279be0ce09c9b3eb2e2d0bac038a3f469f087af652Daniel Nishi        assertThat(intent.getStringExtra(SettingsActivity.EXTRA_SHOW_FRAGMENT))
1289be0ce09c9b3eb2e2d0bac038a3f469f087af652Daniel Nishi                .isEqualTo(ManageApplications.class.getName());
1299be0ce09c9b3eb2e2d0bac038a3f469f087af652Daniel Nishi        assertThat(intent.getIntExtra(SettingsActivity.EXTRA_SHOW_FRAGMENT_TITLE_RESID, 0))
1309be0ce09c9b3eb2e2d0bac038a3f469f087af652Daniel Nishi                .isEqualTo(R.string.storage_photos_videos);
131ec89a3f57f3b73b6f119eb7b5546ba4e5f1ede20Daniel Nishi    }
132ec89a3f57f3b73b6f119eb7b5546ba4e5f1ede20Daniel Nishi
133ec89a3f57f3b73b6f119eb7b5546ba4e5f1ede20Daniel Nishi    @Test
1348cc6f9f718cc634c7bace3324f1faa1cc76fd822Daniel Nishi    public void testClickAudio() {
1358cc6f9f718cc634c7bace3324f1faa1cc76fd822Daniel Nishi        mPreference.setKey("pref_music_audio");
1368cc6f9f718cc634c7bace3324f1faa1cc76fd822Daniel Nishi        mController.handlePreferenceTreeClick(mPreference);
1378cc6f9f718cc634c7bace3324f1faa1cc76fd822Daniel Nishi
1388cc6f9f718cc634c7bace3324f1faa1cc76fd822Daniel Nishi        final ArgumentCaptor<Intent> argumentCaptor = ArgumentCaptor.forClass(Intent.class);
1398cc6f9f718cc634c7bace3324f1faa1cc76fd822Daniel Nishi        verify(mFragment.getActivity()).startActivityAsUser(argumentCaptor.capture(),
140046400c2c407429da47e6b2230ba8bbd21c43e9bMaurice Lam                nullable(UserHandle.class));
1418cc6f9f718cc634c7bace3324f1faa1cc76fd822Daniel Nishi        Intent intent = argumentCaptor.getValue();
14231027dae93bc38377630e5589ab2169a021368adDaniel Nishi
14331027dae93bc38377630e5589ab2169a021368adDaniel Nishi        assertThat(intent.getAction()).isEqualTo(Intent.ACTION_MAIN);
14431027dae93bc38377630e5589ab2169a021368adDaniel Nishi        assertThat(intent.getComponent().getClassName()).isEqualTo(SubSettings.class.getName());
14531027dae93bc38377630e5589ab2169a021368adDaniel Nishi        assertThat(intent.getStringExtra(SettingsActivity.EXTRA_SHOW_FRAGMENT)).isEqualTo(
14631027dae93bc38377630e5589ab2169a021368adDaniel Nishi                ManageApplications.class.getName());
14731027dae93bc38377630e5589ab2169a021368adDaniel Nishi        assertThat(intent.getBundleExtra(SettingsActivity.EXTRA_SHOW_FRAGMENT_ARGUMENTS).getInt(
14831027dae93bc38377630e5589ab2169a021368adDaniel Nishi                ManageApplications.EXTRA_STORAGE_TYPE, 0)).isEqualTo(
14931027dae93bc38377630e5589ab2169a021368adDaniel Nishi                ManageApplications.STORAGE_TYPE_MUSIC);
150ec89a3f57f3b73b6f119eb7b5546ba4e5f1ede20Daniel Nishi    }
151ec89a3f57f3b73b6f119eb7b5546ba4e5f1ede20Daniel Nishi
152ec89a3f57f3b73b6f119eb7b5546ba4e5f1ede20Daniel Nishi    @Test
153838175526386a52df85dc2bd502f3bfad2891f54Daniel Nishi    public void handlePreferenceTreeClick_tappingAudioWhileUninitializedDoesntCrash() {
154838175526386a52df85dc2bd502f3bfad2891f54Daniel Nishi        mController.setVolume(null);
155838175526386a52df85dc2bd502f3bfad2891f54Daniel Nishi
156838175526386a52df85dc2bd502f3bfad2891f54Daniel Nishi        mPreference.setKey("pref_music_audio");
157838175526386a52df85dc2bd502f3bfad2891f54Daniel Nishi        mController.handlePreferenceTreeClick(mPreference);
158838175526386a52df85dc2bd502f3bfad2891f54Daniel Nishi    }
159838175526386a52df85dc2bd502f3bfad2891f54Daniel Nishi
160838175526386a52df85dc2bd502f3bfad2891f54Daniel Nishi    @Test
1618cc6f9f718cc634c7bace3324f1faa1cc76fd822Daniel Nishi    public void testClickApps() {
1628cc6f9f718cc634c7bace3324f1faa1cc76fd822Daniel Nishi        mPreference.setKey("pref_other_apps");
1638cc6f9f718cc634c7bace3324f1faa1cc76fd822Daniel Nishi        mController.handlePreferenceTreeClick(mPreference);
1648cc6f9f718cc634c7bace3324f1faa1cc76fd822Daniel Nishi
1658cc6f9f718cc634c7bace3324f1faa1cc76fd822Daniel Nishi        final ArgumentCaptor<Intent> argumentCaptor = ArgumentCaptor.forClass(Intent.class);
1668cc6f9f718cc634c7bace3324f1faa1cc76fd822Daniel Nishi        verify(mFragment.getActivity()).startActivityAsUser(argumentCaptor.capture(),
167046400c2c407429da47e6b2230ba8bbd21c43e9bMaurice Lam                nullable(UserHandle.class));
1688cc6f9f718cc634c7bace3324f1faa1cc76fd822Daniel Nishi
1698cc6f9f718cc634c7bace3324f1faa1cc76fd822Daniel Nishi        Intent intent = argumentCaptor.getValue();
1708cc6f9f718cc634c7bace3324f1faa1cc76fd822Daniel Nishi        assertThat(intent.getAction()).isEqualTo(Intent.ACTION_MAIN);
1718cc6f9f718cc634c7bace3324f1faa1cc76fd822Daniel Nishi        assertThat(intent.getComponent().getClassName()).isEqualTo(SubSettings.class.getName());
1728cc6f9f718cc634c7bace3324f1faa1cc76fd822Daniel Nishi        assertThat(intent.getStringExtra(SettingsActivity.EXTRA_SHOW_FRAGMENT)).isEqualTo(
1738cc6f9f718cc634c7bace3324f1faa1cc76fd822Daniel Nishi                ManageApplications.class.getName());
174c208eff2f88a613db18da339caa47488ddafbb08Daniel Nishi        assertThat(intent.getIntExtra(SettingsActivity.EXTRA_SHOW_FRAGMENT_TITLE_RESID, 0))
175c208eff2f88a613db18da339caa47488ddafbb08Daniel Nishi                .isEqualTo(R.string.apps_storage);
1768cc6f9f718cc634c7bace3324f1faa1cc76fd822Daniel Nishi    }
1778cc6f9f718cc634c7bace3324f1faa1cc76fd822Daniel Nishi
1788cc6f9f718cc634c7bace3324f1faa1cc76fd822Daniel Nishi    @Test
17983ceab82e4f6dd55e03a5832cf4b4ceca71b0722Daniel Nishi    public void testClickAppsForWork() {
18083ceab82e4f6dd55e03a5832cf4b4ceca71b0722Daniel Nishi        mController = new StorageItemPreferenceController(mContext, mFragment, mVolume, mSvp, true);
18183ceab82e4f6dd55e03a5832cf4b4ceca71b0722Daniel Nishi        mPreference.setKey("pref_other_apps");
18283ceab82e4f6dd55e03a5832cf4b4ceca71b0722Daniel Nishi        mController.handlePreferenceTreeClick(mPreference);
18383ceab82e4f6dd55e03a5832cf4b4ceca71b0722Daniel Nishi
18483ceab82e4f6dd55e03a5832cf4b4ceca71b0722Daniel Nishi        final ArgumentCaptor<Intent> argumentCaptor = ArgumentCaptor.forClass(Intent.class);
18583ceab82e4f6dd55e03a5832cf4b4ceca71b0722Daniel Nishi        verify(mFragment.getActivity())
18683ceab82e4f6dd55e03a5832cf4b4ceca71b0722Daniel Nishi                .startActivityAsUser(argumentCaptor.capture(), nullable(UserHandle.class));
18783ceab82e4f6dd55e03a5832cf4b4ceca71b0722Daniel Nishi
18883ceab82e4f6dd55e03a5832cf4b4ceca71b0722Daniel Nishi        Intent intent = argumentCaptor.getValue();
18983ceab82e4f6dd55e03a5832cf4b4ceca71b0722Daniel Nishi        assertThat(intent.getAction()).isEqualTo(Intent.ACTION_MAIN);
19083ceab82e4f6dd55e03a5832cf4b4ceca71b0722Daniel Nishi        assertThat(intent.getComponent().getClassName()).isEqualTo(SubSettings.class.getName());
19183ceab82e4f6dd55e03a5832cf4b4ceca71b0722Daniel Nishi        assertThat(intent.getStringExtra(SettingsActivity.EXTRA_SHOW_FRAGMENT))
19283ceab82e4f6dd55e03a5832cf4b4ceca71b0722Daniel Nishi                .isEqualTo(ManageApplications.class.getName());
19383ceab82e4f6dd55e03a5832cf4b4ceca71b0722Daniel Nishi        assertThat(intent.getIntExtra(SettingsActivity.EXTRA_SHOW_FRAGMENT_TITLE_RESID, 0))
19483ceab82e4f6dd55e03a5832cf4b4ceca71b0722Daniel Nishi                .isEqualTo(R.string.apps_storage);
19583ceab82e4f6dd55e03a5832cf4b4ceca71b0722Daniel Nishi        assertThat(
19683ceab82e4f6dd55e03a5832cf4b4ceca71b0722Daniel Nishi                        intent.getBundleExtra(SettingsActivity.EXTRA_SHOW_FRAGMENT_ARGUMENTS)
19783ceab82e4f6dd55e03a5832cf4b4ceca71b0722Daniel Nishi                                .getBoolean(EXTRA_WORK_ONLY))
19883ceab82e4f6dd55e03a5832cf4b4ceca71b0722Daniel Nishi                .isTrue();
19959982c6954b215f17e14e8d87efccdc25144a1ccDaniel Nishi        assertThat(
20059982c6954b215f17e14e8d87efccdc25144a1ccDaniel Nishi                        intent.getBundleExtra(SettingsActivity.EXTRA_SHOW_FRAGMENT_ARGUMENTS)
20159982c6954b215f17e14e8d87efccdc25144a1ccDaniel Nishi                                .getInt(EXTRA_WORK_ID))
20259982c6954b215f17e14e8d87efccdc25144a1ccDaniel Nishi                .isEqualTo(0);
20383ceab82e4f6dd55e03a5832cf4b4ceca71b0722Daniel Nishi    }
20483ceab82e4f6dd55e03a5832cf4b4ceca71b0722Daniel Nishi
20583ceab82e4f6dd55e03a5832cf4b4ceca71b0722Daniel Nishi    @Test
206838175526386a52df85dc2bd502f3bfad2891f54Daniel Nishi    public void handlePreferenceTreeClick_tappingAppsWhileUninitializedDoesntCrash() {
207838175526386a52df85dc2bd502f3bfad2891f54Daniel Nishi        mController.setVolume(null);
208838175526386a52df85dc2bd502f3bfad2891f54Daniel Nishi
209838175526386a52df85dc2bd502f3bfad2891f54Daniel Nishi        mPreference.setKey("pref_other_apps");
210838175526386a52df85dc2bd502f3bfad2891f54Daniel Nishi        mController.handlePreferenceTreeClick(mPreference);
211838175526386a52df85dc2bd502f3bfad2891f54Daniel Nishi    }
212838175526386a52df85dc2bd502f3bfad2891f54Daniel Nishi
213838175526386a52df85dc2bd502f3bfad2891f54Daniel Nishi    @Test
2148cc6f9f718cc634c7bace3324f1faa1cc76fd822Daniel Nishi    public void testClickFiles() {
215046400c2c407429da47e6b2230ba8bbd21c43e9bMaurice Lam        when(mSvp.findEmulatedForPrivate(nullable(VolumeInfo.class))).thenReturn(mVolume);
2168cc6f9f718cc634c7bace3324f1faa1cc76fd822Daniel Nishi        mPreference.setKey("pref_files");
2178cc6f9f718cc634c7bace3324f1faa1cc76fd822Daniel Nishi        mController.handlePreferenceTreeClick(mPreference);
2188cc6f9f718cc634c7bace3324f1faa1cc76fd822Daniel Nishi
2198cc6f9f718cc634c7bace3324f1faa1cc76fd822Daniel Nishi        final ArgumentCaptor<Intent> argumentCaptor = ArgumentCaptor.forClass(Intent.class);
2208cc6f9f718cc634c7bace3324f1faa1cc76fd822Daniel Nishi        verify(mFragment.getActivity()).startActivityAsUser(argumentCaptor.capture(),
221046400c2c407429da47e6b2230ba8bbd21c43e9bMaurice Lam                nullable(UserHandle.class));
222ec89a3f57f3b73b6f119eb7b5546ba4e5f1ede20Daniel Nishi
2238cc6f9f718cc634c7bace3324f1faa1cc76fd822Daniel Nishi        Intent intent = argumentCaptor.getValue();
2248cc6f9f718cc634c7bace3324f1faa1cc76fd822Daniel Nishi        Intent browseIntent = mVolume.buildBrowseIntent();
2258cc6f9f718cc634c7bace3324f1faa1cc76fd822Daniel Nishi        assertThat(intent.getAction()).isEqualTo(browseIntent.getAction());
2268cc6f9f718cc634c7bace3324f1faa1cc76fd822Daniel Nishi        assertThat(intent.getData()).isEqualTo(browseIntent.getData());
227e0eb1a2e2708167f3cc962aafce06d13067a5e49Daniel Nishi        verify(mMetricsFeatureProvider, times(1)).action(
228046400c2c407429da47e6b2230ba8bbd21c43e9bMaurice Lam                nullable(Context.class), eq(MetricsEvent.STORAGE_FILES));
229ec89a3f57f3b73b6f119eb7b5546ba4e5f1ede20Daniel Nishi    }
230884809199fe5dd5cec18292e86ef25f922921d22Daniel Nishi
231884809199fe5dd5cec18292e86ef25f922921d22Daniel Nishi    @Test
232c208eff2f88a613db18da339caa47488ddafbb08Daniel Nishi    public void testClickGames() {
233c208eff2f88a613db18da339caa47488ddafbb08Daniel Nishi        mPreference.setKey("pref_games");
234c208eff2f88a613db18da339caa47488ddafbb08Daniel Nishi        mController.handlePreferenceTreeClick(mPreference);
235c208eff2f88a613db18da339caa47488ddafbb08Daniel Nishi
236c208eff2f88a613db18da339caa47488ddafbb08Daniel Nishi        final ArgumentCaptor<Intent> argumentCaptor = ArgumentCaptor.forClass(Intent.class);
237c208eff2f88a613db18da339caa47488ddafbb08Daniel Nishi        verify(mFragment.getActivity()).startActivityAsUser(argumentCaptor.capture(),
238046400c2c407429da47e6b2230ba8bbd21c43e9bMaurice Lam                nullable(UserHandle.class));
239c208eff2f88a613db18da339caa47488ddafbb08Daniel Nishi
240c208eff2f88a613db18da339caa47488ddafbb08Daniel Nishi        Intent intent = argumentCaptor.getValue();
241c208eff2f88a613db18da339caa47488ddafbb08Daniel Nishi        assertThat(intent.getAction()).isEqualTo(Intent.ACTION_MAIN);
242c208eff2f88a613db18da339caa47488ddafbb08Daniel Nishi        assertThat(intent.getComponent().getClassName()).isEqualTo(SubSettings.class.getName());
243c208eff2f88a613db18da339caa47488ddafbb08Daniel Nishi        assertThat(intent.getStringExtra(SettingsActivity.EXTRA_SHOW_FRAGMENT)).isEqualTo(
244c208eff2f88a613db18da339caa47488ddafbb08Daniel Nishi                ManageApplications.class.getName());
245c208eff2f88a613db18da339caa47488ddafbb08Daniel Nishi        assertThat(intent.getIntExtra(SettingsActivity.EXTRA_SHOW_FRAGMENT_TITLE_RESID, 0))
246c208eff2f88a613db18da339caa47488ddafbb08Daniel Nishi                .isEqualTo(R.string.game_storage_settings);
247c208eff2f88a613db18da339caa47488ddafbb08Daniel Nishi    }
248c208eff2f88a613db18da339caa47488ddafbb08Daniel Nishi
249c208eff2f88a613db18da339caa47488ddafbb08Daniel Nishi    @Test
250f588f7678db50cb17bf9c1d1976b4a5cc81570a8Daniel Nishi    public void testClickMovies() {
251f588f7678db50cb17bf9c1d1976b4a5cc81570a8Daniel Nishi        mPreference.setKey("pref_movies");
252f588f7678db50cb17bf9c1d1976b4a5cc81570a8Daniel Nishi        mController.handlePreferenceTreeClick(mPreference);
253f588f7678db50cb17bf9c1d1976b4a5cc81570a8Daniel Nishi
254f588f7678db50cb17bf9c1d1976b4a5cc81570a8Daniel Nishi        final ArgumentCaptor<Intent> argumentCaptor = ArgumentCaptor.forClass(Intent.class);
255f588f7678db50cb17bf9c1d1976b4a5cc81570a8Daniel Nishi        verify(mFragment.getActivity()).startActivityAsUser(argumentCaptor.capture(),
256046400c2c407429da47e6b2230ba8bbd21c43e9bMaurice Lam                nullable(UserHandle.class));
257f588f7678db50cb17bf9c1d1976b4a5cc81570a8Daniel Nishi
258f588f7678db50cb17bf9c1d1976b4a5cc81570a8Daniel Nishi        Intent intent = argumentCaptor.getValue();
259f588f7678db50cb17bf9c1d1976b4a5cc81570a8Daniel Nishi        assertThat(intent.getAction()).isEqualTo(Intent.ACTION_MAIN);
260f588f7678db50cb17bf9c1d1976b4a5cc81570a8Daniel Nishi        assertThat(intent.getComponent().getClassName()).isEqualTo(SubSettings.class.getName());
261f588f7678db50cb17bf9c1d1976b4a5cc81570a8Daniel Nishi        assertThat(intent.getStringExtra(SettingsActivity.EXTRA_SHOW_FRAGMENT)).isEqualTo(
262f588f7678db50cb17bf9c1d1976b4a5cc81570a8Daniel Nishi                ManageApplications.class.getName());
263f588f7678db50cb17bf9c1d1976b4a5cc81570a8Daniel Nishi        assertThat(intent.getIntExtra(SettingsActivity.EXTRA_SHOW_FRAGMENT_TITLE_RESID, 0))
264f588f7678db50cb17bf9c1d1976b4a5cc81570a8Daniel Nishi                .isEqualTo(R.string.storage_movies_tv);
265f588f7678db50cb17bf9c1d1976b4a5cc81570a8Daniel Nishi    }
266f588f7678db50cb17bf9c1d1976b4a5cc81570a8Daniel Nishi
267f588f7678db50cb17bf9c1d1976b4a5cc81570a8Daniel Nishi    @Test
268fda5d5a6a8b7902cf05b124522f063863b42ca12Daniel Nishi    public void testClickSystem() {
269fda5d5a6a8b7902cf05b124522f063863b42ca12Daniel Nishi        mPreference.setKey("pref_system");
270fda5d5a6a8b7902cf05b124522f063863b42ca12Daniel Nishi        assertThat(mController.handlePreferenceTreeClick(mPreference)).isTrue();
271fda5d5a6a8b7902cf05b124522f063863b42ca12Daniel Nishi
272fda5d5a6a8b7902cf05b124522f063863b42ca12Daniel Nishi        verify(mFragment.getFragmentManager().beginTransaction()).add(
273046400c2c407429da47e6b2230ba8bbd21c43e9bMaurice Lam                nullable(PrivateVolumeSettings.SystemInfoFragment.class), nullable(String.class));
274fda5d5a6a8b7902cf05b124522f063863b42ca12Daniel Nishi    }
275fda5d5a6a8b7902cf05b124522f063863b42ca12Daniel Nishi
276fda5d5a6a8b7902cf05b124522f063863b42ca12Daniel Nishi    @Test
277884809199fe5dd5cec18292e86ef25f922921d22Daniel Nishi    public void testMeasurementCompletedUpdatesPreferences() {
278cf0e659a6c45023db5774d530d80721a7abb616bDaniel Nishi        StorageItemPreference audio = new StorageItemPreference(mContext);
279cf0e659a6c45023db5774d530d80721a7abb616bDaniel Nishi        StorageItemPreference image = new StorageItemPreference(mContext);
280cf0e659a6c45023db5774d530d80721a7abb616bDaniel Nishi        StorageItemPreference games = new StorageItemPreference(mContext);
281f588f7678db50cb17bf9c1d1976b4a5cc81570a8Daniel Nishi        StorageItemPreference movies = new StorageItemPreference(mContext);
282cf0e659a6c45023db5774d530d80721a7abb616bDaniel Nishi        StorageItemPreference apps = new StorageItemPreference(mContext);
283cf0e659a6c45023db5774d530d80721a7abb616bDaniel Nishi        StorageItemPreference system = new StorageItemPreference(mContext);
284cf0e659a6c45023db5774d530d80721a7abb616bDaniel Nishi        StorageItemPreference files = new StorageItemPreference(mContext);
285884809199fe5dd5cec18292e86ef25f922921d22Daniel Nishi        PreferenceScreen screen = mock(PreferenceScreen.class);
286884809199fe5dd5cec18292e86ef25f922921d22Daniel Nishi        when(screen.findPreference(
287e0eb1a2e2708167f3cc962aafce06d13067a5e49Daniel Nishi                eq(StorageItemPreferenceController.AUDIO_KEY))).thenReturn(audio);
288884809199fe5dd5cec18292e86ef25f922921d22Daniel Nishi        when(screen.findPreference(
289e0eb1a2e2708167f3cc962aafce06d13067a5e49Daniel Nishi                eq(StorageItemPreferenceController.PHOTO_KEY))).thenReturn(image);
290884809199fe5dd5cec18292e86ef25f922921d22Daniel Nishi        when(screen.findPreference(
291e0eb1a2e2708167f3cc962aafce06d13067a5e49Daniel Nishi                eq(StorageItemPreferenceController.GAME_KEY))).thenReturn(games);
292884809199fe5dd5cec18292e86ef25f922921d22Daniel Nishi        when(screen.findPreference(
293f588f7678db50cb17bf9c1d1976b4a5cc81570a8Daniel Nishi                eq(StorageItemPreferenceController.MOVIES_KEY))).thenReturn(movies);
294f588f7678db50cb17bf9c1d1976b4a5cc81570a8Daniel Nishi        when(screen.findPreference(
295e0eb1a2e2708167f3cc962aafce06d13067a5e49Daniel Nishi                eq(StorageItemPreferenceController.OTHER_APPS_KEY))).thenReturn(apps);
296884809199fe5dd5cec18292e86ef25f922921d22Daniel Nishi        when(screen.findPreference(
297e0eb1a2e2708167f3cc962aafce06d13067a5e49Daniel Nishi                eq(StorageItemPreferenceController.SYSTEM_KEY))).thenReturn(system);
298884809199fe5dd5cec18292e86ef25f922921d22Daniel Nishi        when(screen.findPreference(
299e0eb1a2e2708167f3cc962aafce06d13067a5e49Daniel Nishi                eq(StorageItemPreferenceController.FILES_KEY))).thenReturn(files);
300884809199fe5dd5cec18292e86ef25f922921d22Daniel Nishi        mController.displayPreference(screen);
301884809199fe5dd5cec18292e86ef25f922921d22Daniel Nishi
30263a11c56de4f51eaabeafb54501fe3f6f564a61cDaniel Nishi        mController.setUsedSize(MEGABYTE_IN_BYTES * 970); // There should 870MB attributed.
3037cec1bc53c1d43f8cfd5207ed47d7194c20a4c7dDaniel Nishi        StorageAsyncLoader.AppsStorageResult result = new StorageAsyncLoader.AppsStorageResult();
30463a11c56de4f51eaabeafb54501fe3f6f564a61cDaniel Nishi        result.gamesSize = MEGABYTE_IN_BYTES * 80;
30563a11c56de4f51eaabeafb54501fe3f6f564a61cDaniel Nishi        result.videoAppsSize = MEGABYTE_IN_BYTES * 160;
30663a11c56de4f51eaabeafb54501fe3f6f564a61cDaniel Nishi        result.musicAppsSize = MEGABYTE_IN_BYTES * 40;
30763a11c56de4f51eaabeafb54501fe3f6f564a61cDaniel Nishi        result.otherAppsSize = MEGABYTE_IN_BYTES * 90;
30863a11c56de4f51eaabeafb54501fe3f6f564a61cDaniel Nishi        result.externalStats =
30963a11c56de4f51eaabeafb54501fe3f6f564a61cDaniel Nishi                new StorageStatsSource.ExternalStorageStats(
31063a11c56de4f51eaabeafb54501fe3f6f564a61cDaniel Nishi                        MEGABYTE_IN_BYTES * 500, // total
31163a11c56de4f51eaabeafb54501fe3f6f564a61cDaniel Nishi                        MEGABYTE_IN_BYTES * 100, // audio
31263a11c56de4f51eaabeafb54501fe3f6f564a61cDaniel Nishi                        MEGABYTE_IN_BYTES * 150, // video
31377fe8c1e9e0ca06ab723a471c97913ae127959b5Jeff Sharkey                        MEGABYTE_IN_BYTES * 200, 0); // image
3147cec1bc53c1d43f8cfd5207ed47d7194c20a4c7dDaniel Nishi
31577fe8c1e9e0ca06ab723a471c97913ae127959b5Jeff Sharkey        SparseArray<StorageAsyncLoader.AppsStorageResult> results = new SparseArray<>();
31677fe8c1e9e0ca06ab723a471c97913ae127959b5Jeff Sharkey        results.put(0, result);
31777fe8c1e9e0ca06ab723a471c97913ae127959b5Jeff Sharkey        mController.onLoadFinished(results, 0);
318884809199fe5dd5cec18292e86ef25f922921d22Daniel Nishi
319ded99003c45545d739a013caf7ca0c6bf7896785Roozbeh Pournader        assertThat(audio.getSummary().toString()).isEqualTo("0.14 GB");
320ded99003c45545d739a013caf7ca0c6bf7896785Roozbeh Pournader        assertThat(image.getSummary().toString()).isEqualTo("0.35 GB");
321ded99003c45545d739a013caf7ca0c6bf7896785Roozbeh Pournader        assertThat(games.getSummary().toString()).isEqualTo("0.08 GB");
322ded99003c45545d739a013caf7ca0c6bf7896785Roozbeh Pournader        assertThat(movies.getSummary().toString()).isEqualTo("0.16 GB");
323ded99003c45545d739a013caf7ca0c6bf7896785Roozbeh Pournader        assertThat(apps.getSummary().toString()).isEqualTo("0.09 GB");
324ded99003c45545d739a013caf7ca0c6bf7896785Roozbeh Pournader        assertThat(files.getSummary().toString()).isEqualTo("0.05 GB");
325884809199fe5dd5cec18292e86ef25f922921d22Daniel Nishi    }
3263414a6904b3c411e3f8f1799a377ef7b582f0e5bDaniel Nishi
3273414a6904b3c411e3f8f1799a377ef7b582f0e5bDaniel Nishi    @Test
3283414a6904b3c411e3f8f1799a377ef7b582f0e5bDaniel Nishi    public void settingUserIdAppliesNewIcons() {
3293414a6904b3c411e3f8f1799a377ef7b582f0e5bDaniel Nishi        StorageItemPreference audio = spy(new StorageItemPreference(mContext));
3302872e2c6cc62229333b960068c72ad5a5d29cbd4Daniel Nishi        audio.setIcon(R.drawable.ic_media_stream);
33124077d899fc4d0067759d0cd49ae62e3be01f949Daniel Nishi        StorageItemPreference video = spy(new StorageItemPreference(mContext));
3322872e2c6cc62229333b960068c72ad5a5d29cbd4Daniel Nishi        video.setIcon(R.drawable.ic_local_movies);
3333414a6904b3c411e3f8f1799a377ef7b582f0e5bDaniel Nishi        StorageItemPreference image = spy(new StorageItemPreference(mContext));
3342872e2c6cc62229333b960068c72ad5a5d29cbd4Daniel Nishi        image.setIcon(R.drawable.ic_photo_library);
3353414a6904b3c411e3f8f1799a377ef7b582f0e5bDaniel Nishi        StorageItemPreference games = spy(new StorageItemPreference(mContext));
3362872e2c6cc62229333b960068c72ad5a5d29cbd4Daniel Nishi        games.setIcon(R.drawable.ic_videogame_vd_theme_24);
3373414a6904b3c411e3f8f1799a377ef7b582f0e5bDaniel Nishi        StorageItemPreference apps = spy(new StorageItemPreference(mContext));
3382872e2c6cc62229333b960068c72ad5a5d29cbd4Daniel Nishi        apps.setIcon(R.drawable.ic_storage_apps);
3393414a6904b3c411e3f8f1799a377ef7b582f0e5bDaniel Nishi        StorageItemPreference system = spy(new StorageItemPreference(mContext));
3402872e2c6cc62229333b960068c72ad5a5d29cbd4Daniel Nishi        system.setIcon(R.drawable.ic_system_update_vd_theme_24);
3413414a6904b3c411e3f8f1799a377ef7b582f0e5bDaniel Nishi        StorageItemPreference files = spy(new StorageItemPreference(mContext));
3422872e2c6cc62229333b960068c72ad5a5d29cbd4Daniel Nishi        files.setIcon(R.drawable.ic_folder_vd_theme_24);
3433414a6904b3c411e3f8f1799a377ef7b582f0e5bDaniel Nishi        PreferenceScreen screen = mock(PreferenceScreen.class);
3443414a6904b3c411e3f8f1799a377ef7b582f0e5bDaniel Nishi        when(screen.findPreference(
3453414a6904b3c411e3f8f1799a377ef7b582f0e5bDaniel Nishi                eq(StorageItemPreferenceController.AUDIO_KEY))).thenReturn(audio);
3463414a6904b3c411e3f8f1799a377ef7b582f0e5bDaniel Nishi        when(screen.findPreference(
34724077d899fc4d0067759d0cd49ae62e3be01f949Daniel Nishi                eq(StorageItemPreferenceController.MOVIES_KEY))).thenReturn(video);
34824077d899fc4d0067759d0cd49ae62e3be01f949Daniel Nishi        when(screen.findPreference(
3493414a6904b3c411e3f8f1799a377ef7b582f0e5bDaniel Nishi                eq(StorageItemPreferenceController.PHOTO_KEY))).thenReturn(image);
3503414a6904b3c411e3f8f1799a377ef7b582f0e5bDaniel Nishi        when(screen.findPreference(
3513414a6904b3c411e3f8f1799a377ef7b582f0e5bDaniel Nishi                eq(StorageItemPreferenceController.GAME_KEY))).thenReturn(games);
3523414a6904b3c411e3f8f1799a377ef7b582f0e5bDaniel Nishi        when(screen.findPreference(
3533414a6904b3c411e3f8f1799a377ef7b582f0e5bDaniel Nishi                eq(StorageItemPreferenceController.OTHER_APPS_KEY))).thenReturn(apps);
3543414a6904b3c411e3f8f1799a377ef7b582f0e5bDaniel Nishi        when(screen.findPreference(
3553414a6904b3c411e3f8f1799a377ef7b582f0e5bDaniel Nishi                eq(StorageItemPreferenceController.SYSTEM_KEY))).thenReturn(system);
3563414a6904b3c411e3f8f1799a377ef7b582f0e5bDaniel Nishi        when(screen.findPreference(
3573414a6904b3c411e3f8f1799a377ef7b582f0e5bDaniel Nishi                eq(StorageItemPreferenceController.FILES_KEY))).thenReturn(files);
3583414a6904b3c411e3f8f1799a377ef7b582f0e5bDaniel Nishi        mController.displayPreference(screen);
3593414a6904b3c411e3f8f1799a377ef7b582f0e5bDaniel Nishi
3603414a6904b3c411e3f8f1799a377ef7b582f0e5bDaniel Nishi        mController.setUserId(new UserHandle(10));
3613414a6904b3c411e3f8f1799a377ef7b582f0e5bDaniel Nishi
362046400c2c407429da47e6b2230ba8bbd21c43e9bMaurice Lam        verify(audio, times(2)).setIcon(nullable(Drawable.class));
363046400c2c407429da47e6b2230ba8bbd21c43e9bMaurice Lam        verify(video, times(2)).setIcon(nullable(Drawable.class));
364046400c2c407429da47e6b2230ba8bbd21c43e9bMaurice Lam        verify(image, times(2)).setIcon(nullable(Drawable.class));
365046400c2c407429da47e6b2230ba8bbd21c43e9bMaurice Lam        verify(games, times(2)).setIcon(nullable(Drawable.class));
366046400c2c407429da47e6b2230ba8bbd21c43e9bMaurice Lam        verify(apps, times(2)).setIcon(nullable(Drawable.class));
367046400c2c407429da47e6b2230ba8bbd21c43e9bMaurice Lam        verify(system, times(2)).setIcon(nullable(Drawable.class));
368046400c2c407429da47e6b2230ba8bbd21c43e9bMaurice Lam        verify(files, times(2)).setIcon(nullable(Drawable.class));
3693414a6904b3c411e3f8f1799a377ef7b582f0e5bDaniel Nishi    }
3701f079fbae4785fba9ee673f3e81e6e92852cb7b5Daniel Nishi
3711f079fbae4785fba9ee673f3e81e6e92852cb7b5Daniel Nishi    @Test
3721f079fbae4785fba9ee673f3e81e6e92852cb7b5Daniel Nishi    public void displayPreference_dontHideFilePreferenceWhenEmulatedInternalStorageUsed() {
3731f079fbae4785fba9ee673f3e81e6e92852cb7b5Daniel Nishi        StorageItemPreference audio = new StorageItemPreference(mContext);
3741f079fbae4785fba9ee673f3e81e6e92852cb7b5Daniel Nishi        StorageItemPreference image = new StorageItemPreference(mContext);
3751f079fbae4785fba9ee673f3e81e6e92852cb7b5Daniel Nishi        StorageItemPreference games = new StorageItemPreference(mContext);
3761f079fbae4785fba9ee673f3e81e6e92852cb7b5Daniel Nishi        StorageItemPreference apps = new StorageItemPreference(mContext);
3771f079fbae4785fba9ee673f3e81e6e92852cb7b5Daniel Nishi        StorageItemPreference system = new StorageItemPreference(mContext);
3781f079fbae4785fba9ee673f3e81e6e92852cb7b5Daniel Nishi        StorageItemPreference files = new StorageItemPreference(mContext);
3791f079fbae4785fba9ee673f3e81e6e92852cb7b5Daniel Nishi        PreferenceScreen screen = mock(PreferenceScreen.class);
3801f079fbae4785fba9ee673f3e81e6e92852cb7b5Daniel Nishi        when(screen.findPreference(eq(StorageItemPreferenceController.AUDIO_KEY)))
3811f079fbae4785fba9ee673f3e81e6e92852cb7b5Daniel Nishi                .thenReturn(audio);
3821f079fbae4785fba9ee673f3e81e6e92852cb7b5Daniel Nishi        when(screen.findPreference(eq(StorageItemPreferenceController.PHOTO_KEY)))
3831f079fbae4785fba9ee673f3e81e6e92852cb7b5Daniel Nishi                .thenReturn(image);
3841f079fbae4785fba9ee673f3e81e6e92852cb7b5Daniel Nishi        when(screen.findPreference(eq(StorageItemPreferenceController.GAME_KEY))).thenReturn(games);
3851f079fbae4785fba9ee673f3e81e6e92852cb7b5Daniel Nishi        when(screen.findPreference(eq(StorageItemPreferenceController.OTHER_APPS_KEY)))
3861f079fbae4785fba9ee673f3e81e6e92852cb7b5Daniel Nishi                .thenReturn(apps);
3871f079fbae4785fba9ee673f3e81e6e92852cb7b5Daniel Nishi        when(screen.findPreference(eq(StorageItemPreferenceController.SYSTEM_KEY)))
3881f079fbae4785fba9ee673f3e81e6e92852cb7b5Daniel Nishi                .thenReturn(system);
3891f079fbae4785fba9ee673f3e81e6e92852cb7b5Daniel Nishi        when(screen.findPreference(eq(StorageItemPreferenceController.FILES_KEY)))
3901f079fbae4785fba9ee673f3e81e6e92852cb7b5Daniel Nishi                .thenReturn(files);
3911f079fbae4785fba9ee673f3e81e6e92852cb7b5Daniel Nishi
392046400c2c407429da47e6b2230ba8bbd21c43e9bMaurice Lam        when(mSvp.findEmulatedForPrivate(nullable(VolumeInfo.class))).thenReturn(mVolume);
3931f079fbae4785fba9ee673f3e81e6e92852cb7b5Daniel Nishi        when(mVolume.isMountedReadable()).thenReturn(true);
3941f079fbae4785fba9ee673f3e81e6e92852cb7b5Daniel Nishi
3951f079fbae4785fba9ee673f3e81e6e92852cb7b5Daniel Nishi        mController.displayPreference(screen);
3961f079fbae4785fba9ee673f3e81e6e92852cb7b5Daniel Nishi
3971f079fbae4785fba9ee673f3e81e6e92852cb7b5Daniel Nishi        verify(screen, times(0)).removePreference(files);
3981f079fbae4785fba9ee673f3e81e6e92852cb7b5Daniel Nishi    }
3991f079fbae4785fba9ee673f3e81e6e92852cb7b5Daniel Nishi
4001f079fbae4785fba9ee673f3e81e6e92852cb7b5Daniel Nishi    @Test
4011f079fbae4785fba9ee673f3e81e6e92852cb7b5Daniel Nishi    public void displayPreference_hideFilePreferenceWhenEmulatedStorageUnreadable() {
4021f079fbae4785fba9ee673f3e81e6e92852cb7b5Daniel Nishi        StorageItemPreference audio = new StorageItemPreference(mContext);
4031f079fbae4785fba9ee673f3e81e6e92852cb7b5Daniel Nishi        StorageItemPreference image = new StorageItemPreference(mContext);
4041f079fbae4785fba9ee673f3e81e6e92852cb7b5Daniel Nishi        StorageItemPreference games = new StorageItemPreference(mContext);
4051f079fbae4785fba9ee673f3e81e6e92852cb7b5Daniel Nishi        StorageItemPreference apps = new StorageItemPreference(mContext);
4061f079fbae4785fba9ee673f3e81e6e92852cb7b5Daniel Nishi        StorageItemPreference system = new StorageItemPreference(mContext);
4071f079fbae4785fba9ee673f3e81e6e92852cb7b5Daniel Nishi        StorageItemPreference files = new StorageItemPreference(mContext);
4081f079fbae4785fba9ee673f3e81e6e92852cb7b5Daniel Nishi        PreferenceScreen screen = mock(PreferenceScreen.class);
4091f079fbae4785fba9ee673f3e81e6e92852cb7b5Daniel Nishi        when(screen.findPreference(eq(StorageItemPreferenceController.AUDIO_KEY)))
4101f079fbae4785fba9ee673f3e81e6e92852cb7b5Daniel Nishi                .thenReturn(audio);
4111f079fbae4785fba9ee673f3e81e6e92852cb7b5Daniel Nishi        when(screen.findPreference(eq(StorageItemPreferenceController.PHOTO_KEY)))
4121f079fbae4785fba9ee673f3e81e6e92852cb7b5Daniel Nishi                .thenReturn(image);
4131f079fbae4785fba9ee673f3e81e6e92852cb7b5Daniel Nishi        when(screen.findPreference(eq(StorageItemPreferenceController.GAME_KEY))).thenReturn(games);
4141f079fbae4785fba9ee673f3e81e6e92852cb7b5Daniel Nishi        when(screen.findPreference(eq(StorageItemPreferenceController.OTHER_APPS_KEY)))
4151f079fbae4785fba9ee673f3e81e6e92852cb7b5Daniel Nishi                .thenReturn(apps);
4161f079fbae4785fba9ee673f3e81e6e92852cb7b5Daniel Nishi        when(screen.findPreference(eq(StorageItemPreferenceController.SYSTEM_KEY)))
4171f079fbae4785fba9ee673f3e81e6e92852cb7b5Daniel Nishi                .thenReturn(system);
4181f079fbae4785fba9ee673f3e81e6e92852cb7b5Daniel Nishi        when(screen.findPreference(eq(StorageItemPreferenceController.FILES_KEY)))
4191f079fbae4785fba9ee673f3e81e6e92852cb7b5Daniel Nishi                .thenReturn(files);
4201f079fbae4785fba9ee673f3e81e6e92852cb7b5Daniel Nishi
421046400c2c407429da47e6b2230ba8bbd21c43e9bMaurice Lam        when(mSvp.findEmulatedForPrivate(nullable(VolumeInfo.class))).thenReturn(mVolume);
4221f079fbae4785fba9ee673f3e81e6e92852cb7b5Daniel Nishi        when(mVolume.isMountedReadable()).thenReturn(false);
4231f079fbae4785fba9ee673f3e81e6e92852cb7b5Daniel Nishi
4241f079fbae4785fba9ee673f3e81e6e92852cb7b5Daniel Nishi        mController.displayPreference(screen);
4251f079fbae4785fba9ee673f3e81e6e92852cb7b5Daniel Nishi
4261f079fbae4785fba9ee673f3e81e6e92852cb7b5Daniel Nishi        verify(screen).removePreference(files);
4271f079fbae4785fba9ee673f3e81e6e92852cb7b5Daniel Nishi    }
4281f079fbae4785fba9ee673f3e81e6e92852cb7b5Daniel Nishi
4291f079fbae4785fba9ee673f3e81e6e92852cb7b5Daniel Nishi    @Test
4301f079fbae4785fba9ee673f3e81e6e92852cb7b5Daniel Nishi    public void displayPreference_hideFilePreferenceWhenNoEmulatedInternalStorage() {
4311f079fbae4785fba9ee673f3e81e6e92852cb7b5Daniel Nishi        StorageItemPreference audio = new StorageItemPreference(mContext);
4321f079fbae4785fba9ee673f3e81e6e92852cb7b5Daniel Nishi        StorageItemPreference image = new StorageItemPreference(mContext);
4331f079fbae4785fba9ee673f3e81e6e92852cb7b5Daniel Nishi        StorageItemPreference games = new StorageItemPreference(mContext);
4341f079fbae4785fba9ee673f3e81e6e92852cb7b5Daniel Nishi        StorageItemPreference apps = new StorageItemPreference(mContext);
4351f079fbae4785fba9ee673f3e81e6e92852cb7b5Daniel Nishi        StorageItemPreference system = new StorageItemPreference(mContext);
4361f079fbae4785fba9ee673f3e81e6e92852cb7b5Daniel Nishi        StorageItemPreference files = new StorageItemPreference(mContext);
4371f079fbae4785fba9ee673f3e81e6e92852cb7b5Daniel Nishi        PreferenceScreen screen = mock(PreferenceScreen.class);
4381f079fbae4785fba9ee673f3e81e6e92852cb7b5Daniel Nishi        when(screen.findPreference(eq(StorageItemPreferenceController.AUDIO_KEY)))
4391f079fbae4785fba9ee673f3e81e6e92852cb7b5Daniel Nishi                .thenReturn(audio);
4401f079fbae4785fba9ee673f3e81e6e92852cb7b5Daniel Nishi        when(screen.findPreference(eq(StorageItemPreferenceController.PHOTO_KEY)))
4411f079fbae4785fba9ee673f3e81e6e92852cb7b5Daniel Nishi                .thenReturn(image);
4421f079fbae4785fba9ee673f3e81e6e92852cb7b5Daniel Nishi        when(screen.findPreference(eq(StorageItemPreferenceController.GAME_KEY))).thenReturn(games);
4431f079fbae4785fba9ee673f3e81e6e92852cb7b5Daniel Nishi        when(screen.findPreference(eq(StorageItemPreferenceController.OTHER_APPS_KEY)))
4441f079fbae4785fba9ee673f3e81e6e92852cb7b5Daniel Nishi                .thenReturn(apps);
4451f079fbae4785fba9ee673f3e81e6e92852cb7b5Daniel Nishi        when(screen.findPreference(eq(StorageItemPreferenceController.SYSTEM_KEY)))
4461f079fbae4785fba9ee673f3e81e6e92852cb7b5Daniel Nishi                .thenReturn(system);
4471f079fbae4785fba9ee673f3e81e6e92852cb7b5Daniel Nishi        when(screen.findPreference(eq(StorageItemPreferenceController.FILES_KEY)))
4481f079fbae4785fba9ee673f3e81e6e92852cb7b5Daniel Nishi                .thenReturn(files);
4491f079fbae4785fba9ee673f3e81e6e92852cb7b5Daniel Nishi
450046400c2c407429da47e6b2230ba8bbd21c43e9bMaurice Lam        when(mSvp.findEmulatedForPrivate(nullable(VolumeInfo.class))).thenReturn(null);
4511f079fbae4785fba9ee673f3e81e6e92852cb7b5Daniel Nishi
4521f079fbae4785fba9ee673f3e81e6e92852cb7b5Daniel Nishi        mController.displayPreference(screen);
4531f079fbae4785fba9ee673f3e81e6e92852cb7b5Daniel Nishi
4541f079fbae4785fba9ee673f3e81e6e92852cb7b5Daniel Nishi        verify(screen).removePreference(files);
4551f079fbae4785fba9ee673f3e81e6e92852cb7b5Daniel Nishi    }
456f7fa542eb69b598ac014bb9b54b9e5b105c51e59Daniel Nishi
457f7fa542eb69b598ac014bb9b54b9e5b105c51e59Daniel Nishi    @Test
458f7fa542eb69b598ac014bb9b54b9e5b105c51e59Daniel Nishi    public void displayPreference_updateFilePreferenceToHideAfterSettingVolume() {
459f7fa542eb69b598ac014bb9b54b9e5b105c51e59Daniel Nishi        StorageItemPreference audio = new StorageItemPreference(mContext);
460f7fa542eb69b598ac014bb9b54b9e5b105c51e59Daniel Nishi        StorageItemPreference image = new StorageItemPreference(mContext);
461f7fa542eb69b598ac014bb9b54b9e5b105c51e59Daniel Nishi        StorageItemPreference games = new StorageItemPreference(mContext);
462f7fa542eb69b598ac014bb9b54b9e5b105c51e59Daniel Nishi        StorageItemPreference apps = new StorageItemPreference(mContext);
463f7fa542eb69b598ac014bb9b54b9e5b105c51e59Daniel Nishi        StorageItemPreference system = new StorageItemPreference(mContext);
464f7fa542eb69b598ac014bb9b54b9e5b105c51e59Daniel Nishi        StorageItemPreference files = new StorageItemPreference(mContext);
465f7fa542eb69b598ac014bb9b54b9e5b105c51e59Daniel Nishi        PreferenceScreen screen = mock(PreferenceScreen.class);
466f7fa542eb69b598ac014bb9b54b9e5b105c51e59Daniel Nishi        when(screen.findPreference(eq(StorageItemPreferenceController.AUDIO_KEY)))
467f7fa542eb69b598ac014bb9b54b9e5b105c51e59Daniel Nishi                .thenReturn(audio);
468f7fa542eb69b598ac014bb9b54b9e5b105c51e59Daniel Nishi        when(screen.findPreference(eq(StorageItemPreferenceController.PHOTO_KEY)))
469f7fa542eb69b598ac014bb9b54b9e5b105c51e59Daniel Nishi                .thenReturn(image);
470f7fa542eb69b598ac014bb9b54b9e5b105c51e59Daniel Nishi        when(screen.findPreference(eq(StorageItemPreferenceController.GAME_KEY))).thenReturn(games);
471f7fa542eb69b598ac014bb9b54b9e5b105c51e59Daniel Nishi        when(screen.findPreference(eq(StorageItemPreferenceController.OTHER_APPS_KEY)))
472f7fa542eb69b598ac014bb9b54b9e5b105c51e59Daniel Nishi                .thenReturn(apps);
473f7fa542eb69b598ac014bb9b54b9e5b105c51e59Daniel Nishi        when(screen.findPreference(eq(StorageItemPreferenceController.SYSTEM_KEY)))
474f7fa542eb69b598ac014bb9b54b9e5b105c51e59Daniel Nishi                .thenReturn(system);
475f7fa542eb69b598ac014bb9b54b9e5b105c51e59Daniel Nishi        when(screen.findPreference(eq(StorageItemPreferenceController.FILES_KEY)))
476f7fa542eb69b598ac014bb9b54b9e5b105c51e59Daniel Nishi                .thenReturn(files);
477f7fa542eb69b598ac014bb9b54b9e5b105c51e59Daniel Nishi
478046400c2c407429da47e6b2230ba8bbd21c43e9bMaurice Lam        when(mSvp.findEmulatedForPrivate(nullable(VolumeInfo.class))).thenReturn(mVolume);
479f7fa542eb69b598ac014bb9b54b9e5b105c51e59Daniel Nishi        when(mVolume.isMountedReadable()).thenReturn(true);
480f7fa542eb69b598ac014bb9b54b9e5b105c51e59Daniel Nishi
481f7fa542eb69b598ac014bb9b54b9e5b105c51e59Daniel Nishi        mController.displayPreference(screen);
482046400c2c407429da47e6b2230ba8bbd21c43e9bMaurice Lam        when(mSvp.findEmulatedForPrivate(nullable(VolumeInfo.class))).thenReturn(null);
483f7fa542eb69b598ac014bb9b54b9e5b105c51e59Daniel Nishi        mController.setVolume(mVolume);
484f7fa542eb69b598ac014bb9b54b9e5b105c51e59Daniel Nishi
485f7fa542eb69b598ac014bb9b54b9e5b105c51e59Daniel Nishi        verify(screen).removePreference(files);
486f7fa542eb69b598ac014bb9b54b9e5b105c51e59Daniel Nishi    }
487f7fa542eb69b598ac014bb9b54b9e5b105c51e59Daniel Nishi
488f7fa542eb69b598ac014bb9b54b9e5b105c51e59Daniel Nishi
489f7fa542eb69b598ac014bb9b54b9e5b105c51e59Daniel Nishi    @Test
490f7fa542eb69b598ac014bb9b54b9e5b105c51e59Daniel Nishi    public void displayPreference_updateFilePreferenceToShowAfterSettingVolume() {
491f7fa542eb69b598ac014bb9b54b9e5b105c51e59Daniel Nishi        StorageItemPreference audio = new StorageItemPreference(mContext);
492f7fa542eb69b598ac014bb9b54b9e5b105c51e59Daniel Nishi        StorageItemPreference image = new StorageItemPreference(mContext);
493f7fa542eb69b598ac014bb9b54b9e5b105c51e59Daniel Nishi        StorageItemPreference games = new StorageItemPreference(mContext);
494f7fa542eb69b598ac014bb9b54b9e5b105c51e59Daniel Nishi        StorageItemPreference apps = new StorageItemPreference(mContext);
495f7fa542eb69b598ac014bb9b54b9e5b105c51e59Daniel Nishi        StorageItemPreference system = new StorageItemPreference(mContext);
496f7fa542eb69b598ac014bb9b54b9e5b105c51e59Daniel Nishi        StorageItemPreference files = new StorageItemPreference(mContext);
497f7fa542eb69b598ac014bb9b54b9e5b105c51e59Daniel Nishi        PreferenceScreen screen = mock(PreferenceScreen.class);
498f7fa542eb69b598ac014bb9b54b9e5b105c51e59Daniel Nishi        when(screen.findPreference(eq(StorageItemPreferenceController.AUDIO_KEY)))
499f7fa542eb69b598ac014bb9b54b9e5b105c51e59Daniel Nishi                .thenReturn(audio);
500f7fa542eb69b598ac014bb9b54b9e5b105c51e59Daniel Nishi        when(screen.findPreference(eq(StorageItemPreferenceController.PHOTO_KEY)))
501f7fa542eb69b598ac014bb9b54b9e5b105c51e59Daniel Nishi                .thenReturn(image);
502f7fa542eb69b598ac014bb9b54b9e5b105c51e59Daniel Nishi        when(screen.findPreference(eq(StorageItemPreferenceController.GAME_KEY))).thenReturn(games);
503f7fa542eb69b598ac014bb9b54b9e5b105c51e59Daniel Nishi        when(screen.findPreference(eq(StorageItemPreferenceController.OTHER_APPS_KEY)))
504f7fa542eb69b598ac014bb9b54b9e5b105c51e59Daniel Nishi                .thenReturn(apps);
505f7fa542eb69b598ac014bb9b54b9e5b105c51e59Daniel Nishi        when(screen.findPreference(eq(StorageItemPreferenceController.SYSTEM_KEY)))
506f7fa542eb69b598ac014bb9b54b9e5b105c51e59Daniel Nishi                .thenReturn(system);
507f7fa542eb69b598ac014bb9b54b9e5b105c51e59Daniel Nishi        when(screen.findPreference(eq(StorageItemPreferenceController.FILES_KEY)))
508f7fa542eb69b598ac014bb9b54b9e5b105c51e59Daniel Nishi                .thenReturn(files);
509f7fa542eb69b598ac014bb9b54b9e5b105c51e59Daniel Nishi
510f7fa542eb69b598ac014bb9b54b9e5b105c51e59Daniel Nishi        // This will hide it initially.
511f7fa542eb69b598ac014bb9b54b9e5b105c51e59Daniel Nishi        mController.displayPreference(screen);
512f7fa542eb69b598ac014bb9b54b9e5b105c51e59Daniel Nishi
513046400c2c407429da47e6b2230ba8bbd21c43e9bMaurice Lam        when(mSvp.findEmulatedForPrivate(nullable(VolumeInfo.class))).thenReturn(mVolume);
514f7fa542eb69b598ac014bb9b54b9e5b105c51e59Daniel Nishi        when(mVolume.isMountedReadable()).thenReturn(true);
515f7fa542eb69b598ac014bb9b54b9e5b105c51e59Daniel Nishi
516f7fa542eb69b598ac014bb9b54b9e5b105c51e59Daniel Nishi        // And we bring it back.
517f7fa542eb69b598ac014bb9b54b9e5b105c51e59Daniel Nishi        mController.setVolume(mVolume);
518f7fa542eb69b598ac014bb9b54b9e5b105c51e59Daniel Nishi
519f7fa542eb69b598ac014bb9b54b9e5b105c51e59Daniel Nishi        verify(screen).addPreference(files);
520f7fa542eb69b598ac014bb9b54b9e5b105c51e59Daniel Nishi    }
52177fe8c1e9e0ca06ab723a471c97913ae127959b5Jeff Sharkey}
522