1dee882c960b4db9bae9f2c9144b84c6ba001a051Salvador Martinez/*
2dee882c960b4db9bae9f2c9144b84c6ba001a051Salvador Martinez * Copyright (C) 2016 The Android Open Source Project
3dee882c960b4db9bae9f2c9144b84c6ba001a051Salvador Martinez *
4dee882c960b4db9bae9f2c9144b84c6ba001a051Salvador Martinez * Licensed under the Apache License, Version 2.0 (the "License"); you may not
5dee882c960b4db9bae9f2c9144b84c6ba001a051Salvador Martinez * use this file except in compliance with the License. You may obtain a copy of
6dee882c960b4db9bae9f2c9144b84c6ba001a051Salvador Martinez * the License at
7dee882c960b4db9bae9f2c9144b84c6ba001a051Salvador Martinez *
8dee882c960b4db9bae9f2c9144b84c6ba001a051Salvador Martinez * http://www.apache.org/licenses/LICENSE-2.0
9dee882c960b4db9bae9f2c9144b84c6ba001a051Salvador Martinez *
10dee882c960b4db9bae9f2c9144b84c6ba001a051Salvador Martinez * Unless required by applicable law or agreed to in writing, software
11dee882c960b4db9bae9f2c9144b84c6ba001a051Salvador Martinez * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
12dee882c960b4db9bae9f2c9144b84c6ba001a051Salvador Martinez * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
13dee882c960b4db9bae9f2c9144b84c6ba001a051Salvador Martinez * License for the specific language governing permissions and limitations under
14dee882c960b4db9bae9f2c9144b84c6ba001a051Salvador Martinez * the License.
15dee882c960b4db9bae9f2c9144b84c6ba001a051Salvador Martinez */
16dee882c960b4db9bae9f2c9144b84c6ba001a051Salvador Martinez
17dee882c960b4db9bae9f2c9144b84c6ba001a051Salvador Martinezpackage com.android.storagemanager.deletionhelper;
18dee882c960b4db9bae9f2c9144b84c6ba001a051Salvador Martinez
19dee882c960b4db9bae9f2c9144b84c6ba001a051Salvador Martinezimport android.app.usage.UsageStats;
20dee882c960b4db9bae9f2c9144b84c6ba001a051Salvador Martinezimport android.app.usage.UsageStatsManager;
2100b4488ec14591753239e9ee507d04a62c4d146cDaniel Nishiimport android.content.ComponentName;
22dee882c960b4db9bae9f2c9144b84c6ba001a051Salvador Martinezimport android.content.Context;
23dee882c960b4db9bae9f2c9144b84c6ba001a051Salvador Martinezimport android.content.pm.ApplicationInfo;
24dee882c960b4db9bae9f2c9144b84c6ba001a051Salvador Martinezimport android.content.pm.PackageManager.NameNotFoundException;
25dee882c960b4db9bae9f2c9144b84c6ba001a051Salvador Martinezimport android.os.storage.VolumeInfo;
26dee882c960b4db9bae9f2c9144b84c6ba001a051Salvador Martinezimport android.text.TextUtils;
27dee882c960b4db9bae9f2c9144b84c6ba001a051Salvador Martinezimport com.android.settingslib.applications.PackageManagerWrapper;
28dee882c960b4db9bae9f2c9144b84c6ba001a051Salvador Martinezimport com.android.settingslib.applications.StorageStatsSource;
29dee882c960b4db9bae9f2c9144b84c6ba001a051Salvador Martinezimport com.android.settingslib.applications.StorageStatsSource.AppStorageStats;
30dee882c960b4db9bae9f2c9144b84c6ba001a051Salvador Martinezimport com.android.storagemanager.deletionhelper.AppsAsyncLoader.PackageInfo;
31dee882c960b4db9bae9f2c9144b84c6ba001a051Salvador Martinezimport com.android.storagemanager.testing.StorageManagerRobolectricTestRunner;
32dee882c960b4db9bae9f2c9144b84c6ba001a051Salvador Martinezimport com.android.storagemanager.testing.TestingConstants;
33dee882c960b4db9bae9f2c9144b84c6ba001a051Salvador Martinezimport java.util.List;
34dee882c960b4db9bae9f2c9144b84c6ba001a051Salvador Martinezimport org.junit.Before;
35dee882c960b4db9bae9f2c9144b84c6ba001a051Salvador Martinezimport org.junit.Test;
36dee882c960b4db9bae9f2c9144b84c6ba001a051Salvador Martinezimport org.junit.runner.RunWith;
37dee882c960b4db9bae9f2c9144b84c6ba001a051Salvador Martinezimport org.mockito.Mock;
38dee882c960b4db9bae9f2c9144b84c6ba001a051Salvador Martinezimport org.mockito.MockitoAnnotations;
39dee882c960b4db9bae9f2c9144b84c6ba001a051Salvador Martinezimport org.robolectric.RuntimeEnvironment;
40dee882c960b4db9bae9f2c9144b84c6ba001a051Salvador Martinezimport org.robolectric.Shadows;
41dee882c960b4db9bae9f2c9144b84c6ba001a051Salvador Martinezimport org.robolectric.annotation.Config;
42dee882c960b4db9bae9f2c9144b84c6ba001a051Salvador Martinezimport org.robolectric.shadows.ShadowApplication;
43dee882c960b4db9bae9f2c9144b84c6ba001a051Salvador Martinez
44dee882c960b4db9bae9f2c9144b84c6ba001a051Salvador Martinezimport java.util.ArrayList;
45dee882c960b4db9bae9f2c9144b84c6ba001a051Salvador Martinezimport java.util.HashMap;
46dee882c960b4db9bae9f2c9144b84c6ba001a051Salvador Martinezimport java.util.concurrent.TimeUnit;
47dee882c960b4db9bae9f2c9144b84c6ba001a051Salvador Martinez
48dee882c960b4db9bae9f2c9144b84c6ba001a051Salvador Martinezimport static com.google.common.truth.Truth.assertThat;
49dee882c960b4db9bae9f2c9144b84c6ba001a051Salvador Martinezimport static org.mockito.Matchers.any;
50dee882c960b4db9bae9f2c9144b84c6ba001a051Salvador Martinezimport static org.mockito.Matchers.anyInt;
51dee882c960b4db9bae9f2c9144b84c6ba001a051Salvador Martinezimport static org.mockito.Matchers.anyLong;
52dee882c960b4db9bae9f2c9144b84c6ba001a051Salvador Martinezimport static org.mockito.Matchers.eq;
53dee882c960b4db9bae9f2c9144b84c6ba001a051Salvador Martinezimport static org.mockito.Mockito.mock;
54dee882c960b4db9bae9f2c9144b84c6ba001a051Salvador Martinezimport static org.mockito.Mockito.when;
55dee882c960b4db9bae9f2c9144b84c6ba001a051Salvador Martinez
56dee882c960b4db9bae9f2c9144b84c6ba001a051Salvador Martinez@RunWith(StorageManagerRobolectricTestRunner.class)
57dee882c960b4db9bae9f2c9144b84c6ba001a051Salvador Martinez@Config(manifest = TestingConstants.MANIFEST, sdk = 23)
58dee882c960b4db9bae9f2c9144b84c6ba001a051Salvador Martinezpublic class AppsAsyncLoaderTest {
59dee882c960b4db9bae9f2c9144b84c6ba001a051Salvador Martinez
60dee882c960b4db9bae9f2c9144b84c6ba001a051Salvador Martinez    public static final String PACKAGE_SYSTEM = "package.system";
61dee882c960b4db9bae9f2c9144b84c6ba001a051Salvador Martinez    private static final long STARTING_TIME = TimeUnit.DAYS.toMillis(1000);
62dee882c960b4db9bae9f2c9144b84c6ba001a051Salvador Martinez    private static final String PACKAGE_NAME = "package.mcpackageface";
63dee882c960b4db9bae9f2c9144b84c6ba001a051Salvador Martinez    public static final String PACKAGE_CLEARABLE = "package.clearable";
64dee882c960b4db9bae9f2c9144b84c6ba001a051Salvador Martinez    public static final String PACKAGE_TOO_NEW_TO_DELETE = "package.tooNewToDelete";
6500b4488ec14591753239e9ee507d04a62c4d146cDaniel Nishi    public static final String PACKAGE_DEFAULT_LAUNCHER = "package.launcherface";
66dee882c960b4db9bae9f2c9144b84c6ba001a051Salvador Martinez
67dee882c960b4db9bae9f2c9144b84c6ba001a051Salvador Martinez    @Mock private UsageStatsManager mUsageStatsManager;
68dee882c960b4db9bae9f2c9144b84c6ba001a051Salvador Martinez    @Mock private StorageStatsSource mStorageStatsSource;
69dee882c960b4db9bae9f2c9144b84c6ba001a051Salvador Martinez    @Mock private AppsAsyncLoader.Clock mClock;
70dee882c960b4db9bae9f2c9144b84c6ba001a051Salvador Martinez    @Mock private PackageManagerWrapper mPackageManager;
71dee882c960b4db9bae9f2c9144b84c6ba001a051Salvador Martinez    @Mock private AppStorageStats mAppStorageStats;
72dee882c960b4db9bae9f2c9144b84c6ba001a051Salvador Martinez    private AppsAsyncLoader mLoader;
73dee882c960b4db9bae9f2c9144b84c6ba001a051Salvador Martinez    private HashMap<String, UsageStats> mUsageStats;
74dee882c960b4db9bae9f2c9144b84c6ba001a051Salvador Martinez    private ArrayList<ApplicationInfo> mInfo;
75dee882c960b4db9bae9f2c9144b84c6ba001a051Salvador Martinez
76dee882c960b4db9bae9f2c9144b84c6ba001a051Salvador Martinez    @Before
77909617163fcf714c9933160d60060b27568ad791Jeff Sharkey    public void setUp() throws Exception {
78dee882c960b4db9bae9f2c9144b84c6ba001a051Salvador Martinez        MockitoAnnotations.initMocks(this);
79dee882c960b4db9bae9f2c9144b84c6ba001a051Salvador Martinez
80dee882c960b4db9bae9f2c9144b84c6ba001a051Salvador Martinez        // Set up our mock usage app service.
81dee882c960b4db9bae9f2c9144b84c6ba001a051Salvador Martinez        ShadowApplication app = Shadows.shadowOf(RuntimeEnvironment.application);
82dee882c960b4db9bae9f2c9144b84c6ba001a051Salvador Martinez        app.setSystemService(Context.USAGE_STATS_SERVICE, mUsageStatsManager);
83dee882c960b4db9bae9f2c9144b84c6ba001a051Salvador Martinez
84dee882c960b4db9bae9f2c9144b84c6ba001a051Salvador Martinez        // Initialize filters and loader with mock objects
85dee882c960b4db9bae9f2c9144b84c6ba001a051Salvador Martinez        AppsAsyncLoader.FILTER_NO_THRESHOLD.init();
86dee882c960b4db9bae9f2c9144b84c6ba001a051Salvador Martinez        AppsAsyncLoader.FILTER_USAGE_STATS.init();
87dee882c960b4db9bae9f2c9144b84c6ba001a051Salvador Martinez
88dee882c960b4db9bae9f2c9144b84c6ba001a051Salvador Martinez        // Set up the AppsAsyncLoader with a fake clock for us to manipulate the time.
89dee882c960b4db9bae9f2c9144b84c6ba001a051Salvador Martinez        when(mClock.getCurrentTime()).thenReturn(STARTING_TIME);
90dee882c960b4db9bae9f2c9144b84c6ba001a051Salvador Martinez
91dee882c960b4db9bae9f2c9144b84c6ba001a051Salvador Martinez        // Set up the loader to return our fake list of apps.
92dee882c960b4db9bae9f2c9144b84c6ba001a051Salvador Martinez        mInfo = new ArrayList<>();
93dee882c960b4db9bae9f2c9144b84c6ba001a051Salvador Martinez        when(mPackageManager.getInstalledApplicationsAsUser(anyInt(), anyInt())).thenReturn(mInfo);
9400b4488ec14591753239e9ee507d04a62c4d146cDaniel Nishi        when(mPackageManager.getHomeActivities(any(List.class)))
9500b4488ec14591753239e9ee507d04a62c4d146cDaniel Nishi                .thenReturn(new ComponentName(PACKAGE_DEFAULT_LAUNCHER, ""));
96dee882c960b4db9bae9f2c9144b84c6ba001a051Salvador Martinez
97dee882c960b4db9bae9f2c9144b84c6ba001a051Salvador Martinez        AppsAsyncLoader.FILTER_USAGE_STATS.init();
98dee882c960b4db9bae9f2c9144b84c6ba001a051Salvador Martinez
99dee882c960b4db9bae9f2c9144b84c6ba001a051Salvador Martinez        // Set up our fake usage app.
100dee882c960b4db9bae9f2c9144b84c6ba001a051Salvador Martinez        mUsageStats = new HashMap<>();
101dee882c960b4db9bae9f2c9144b84c6ba001a051Salvador Martinez        when(mUsageStatsManager.queryAndAggregateUsageStats(anyLong(), anyLong()))
102dee882c960b4db9bae9f2c9144b84c6ba001a051Salvador Martinez                .thenReturn(mUsageStats);
103dee882c960b4db9bae9f2c9144b84c6ba001a051Salvador Martinez        when(mStorageStatsSource.getStatsForUid(any(), anyInt())).thenReturn(mAppStorageStats);
104dee882c960b4db9bae9f2c9144b84c6ba001a051Salvador Martinez
105dee882c960b4db9bae9f2c9144b84c6ba001a051Salvador Martinez        mLoader =
106dee882c960b4db9bae9f2c9144b84c6ba001a051Salvador Martinez                new AppsAsyncLoader.Builder(RuntimeEnvironment.application)
107dee882c960b4db9bae9f2c9144b84c6ba001a051Salvador Martinez                        .setUid(0)
108dee882c960b4db9bae9f2c9144b84c6ba001a051Salvador Martinez                        .setUuid(VolumeInfo.ID_PRIVATE_INTERNAL)
109dee882c960b4db9bae9f2c9144b84c6ba001a051Salvador Martinez                        .setStorageStatsSource(mStorageStatsSource)
110dee882c960b4db9bae9f2c9144b84c6ba001a051Salvador Martinez                        .setPackageManager(mPackageManager)
111dee882c960b4db9bae9f2c9144b84c6ba001a051Salvador Martinez                        .setUsageStatsManager(mUsageStatsManager)
112dee882c960b4db9bae9f2c9144b84c6ba001a051Salvador Martinez                        .setFilter(AppsAsyncLoader.FILTER_NO_THRESHOLD)
113dee882c960b4db9bae9f2c9144b84c6ba001a051Salvador Martinez                        .build();
114dee882c960b4db9bae9f2c9144b84c6ba001a051Salvador Martinez        mLoader.mClock = mClock;
115dee882c960b4db9bae9f2c9144b84c6ba001a051Salvador Martinez    }
116dee882c960b4db9bae9f2c9144b84c6ba001a051Salvador Martinez
117dee882c960b4db9bae9f2c9144b84c6ba001a051Salvador Martinez    @Test
118dee882c960b4db9bae9f2c9144b84c6ba001a051Salvador Martinez    public void test_appInstalledSameDayNeverUsed_isInvalid() {
119dee882c960b4db9bae9f2c9144b84c6ba001a051Salvador Martinez        AppsAsyncLoader.PackageInfo app =
120dee882c960b4db9bae9f2c9144b84c6ba001a051Salvador Martinez                createPackage(PACKAGE_NAME, AppsAsyncLoader.NEVER_USED, 0);
121dee882c960b4db9bae9f2c9144b84c6ba001a051Salvador Martinez
122dee882c960b4db9bae9f2c9144b84c6ba001a051Salvador Martinez        assertThat(AppsAsyncLoader.FILTER_USAGE_STATS.filterApp(app)).isFalse();
123dee882c960b4db9bae9f2c9144b84c6ba001a051Salvador Martinez    }
124dee882c960b4db9bae9f2c9144b84c6ba001a051Salvador Martinez
125dee882c960b4db9bae9f2c9144b84c6ba001a051Salvador Martinez    @Test
126dee882c960b4db9bae9f2c9144b84c6ba001a051Salvador Martinez    public void test_noThresholdFilter_appInstalledSameDayNeverUsed_isValid() {
127dee882c960b4db9bae9f2c9144b84c6ba001a051Salvador Martinez        AppsAsyncLoader.PackageInfo app =
128dee882c960b4db9bae9f2c9144b84c6ba001a051Salvador Martinez                createPackage(PACKAGE_NAME, AppsAsyncLoader.NEVER_USED, 0);
129dee882c960b4db9bae9f2c9144b84c6ba001a051Salvador Martinez
130dee882c960b4db9bae9f2c9144b84c6ba001a051Salvador Martinez        assertThat(AppsAsyncLoader.FILTER_NO_THRESHOLD.filterApp(app)).isTrue();
131dee882c960b4db9bae9f2c9144b84c6ba001a051Salvador Martinez    }
132dee882c960b4db9bae9f2c9144b84c6ba001a051Salvador Martinez
133dee882c960b4db9bae9f2c9144b84c6ba001a051Salvador Martinez    @Test
134dee882c960b4db9bae9f2c9144b84c6ba001a051Salvador Martinez    public void test_unusedApp_isValid() {
135dee882c960b4db9bae9f2c9144b84c6ba001a051Salvador Martinez        AppsAsyncLoader.PackageInfo app =
136dee882c960b4db9bae9f2c9144b84c6ba001a051Salvador Martinez                createPackage(PACKAGE_NAME, AppsAsyncLoader.NEVER_USED, 90);
137dee882c960b4db9bae9f2c9144b84c6ba001a051Salvador Martinez
138dee882c960b4db9bae9f2c9144b84c6ba001a051Salvador Martinez        assertThat(AppsAsyncLoader.FILTER_USAGE_STATS.filterApp(app)).isTrue();
139dee882c960b4db9bae9f2c9144b84c6ba001a051Salvador Martinez    }
140dee882c960b4db9bae9f2c9144b84c6ba001a051Salvador Martinez
141dee882c960b4db9bae9f2c9144b84c6ba001a051Salvador Martinez    @Test
142dee882c960b4db9bae9f2c9144b84c6ba001a051Salvador Martinez    public void test_noThresholdFilter_unusedApp_isValid() {
143dee882c960b4db9bae9f2c9144b84c6ba001a051Salvador Martinez        AppsAsyncLoader.PackageInfo app =
144dee882c960b4db9bae9f2c9144b84c6ba001a051Salvador Martinez                createPackage(PACKAGE_NAME, AppsAsyncLoader.NEVER_USED, 90);
145dee882c960b4db9bae9f2c9144b84c6ba001a051Salvador Martinez
146dee882c960b4db9bae9f2c9144b84c6ba001a051Salvador Martinez        assertThat(AppsAsyncLoader.FILTER_NO_THRESHOLD.filterApp(app)).isTrue();
147dee882c960b4db9bae9f2c9144b84c6ba001a051Salvador Martinez    }
148dee882c960b4db9bae9f2c9144b84c6ba001a051Salvador Martinez
149dee882c960b4db9bae9f2c9144b84c6ba001a051Salvador Martinez    @Test
150dee882c960b4db9bae9f2c9144b84c6ba001a051Salvador Martinez    public void test_unknownLastUse_isFilteredOut() {
151dee882c960b4db9bae9f2c9144b84c6ba001a051Salvador Martinez        AppsAsyncLoader.PackageInfo app = createPackage(PACKAGE_NAME, -1, 90);
152dee882c960b4db9bae9f2c9144b84c6ba001a051Salvador Martinez
153dee882c960b4db9bae9f2c9144b84c6ba001a051Salvador Martinez        assertThat(AppsAsyncLoader.FILTER_USAGE_STATS.filterApp(app)).isFalse();
154dee882c960b4db9bae9f2c9144b84c6ba001a051Salvador Martinez    }
155dee882c960b4db9bae9f2c9144b84c6ba001a051Salvador Martinez
156dee882c960b4db9bae9f2c9144b84c6ba001a051Salvador Martinez    @Test
157dee882c960b4db9bae9f2c9144b84c6ba001a051Salvador Martinez    public void test_noThresholdFilter_unknownLastUse_isFilteredOut() {
158dee882c960b4db9bae9f2c9144b84c6ba001a051Salvador Martinez        AppsAsyncLoader.PackageInfo app = createPackage(PACKAGE_NAME, -1, 90);
159dee882c960b4db9bae9f2c9144b84c6ba001a051Salvador Martinez
160dee882c960b4db9bae9f2c9144b84c6ba001a051Salvador Martinez        assertThat(AppsAsyncLoader.FILTER_NO_THRESHOLD.filterApp(app)).isFalse();
161dee882c960b4db9bae9f2c9144b84c6ba001a051Salvador Martinez    }
162dee882c960b4db9bae9f2c9144b84c6ba001a051Salvador Martinez
163dee882c960b4db9bae9f2c9144b84c6ba001a051Salvador Martinez    @Test
164dee882c960b4db9bae9f2c9144b84c6ba001a051Salvador Martinez    public void test_oldAppRecentlyUsed_isNotValid() {
165dee882c960b4db9bae9f2c9144b84c6ba001a051Salvador Martinez        AppsAsyncLoader.PackageInfo app = createPackage(PACKAGE_NAME, 1, 200);
166dee882c960b4db9bae9f2c9144b84c6ba001a051Salvador Martinez
167dee882c960b4db9bae9f2c9144b84c6ba001a051Salvador Martinez        assertThat(AppsAsyncLoader.FILTER_USAGE_STATS.filterApp(app)).isFalse();
168dee882c960b4db9bae9f2c9144b84c6ba001a051Salvador Martinez    }
169dee882c960b4db9bae9f2c9144b84c6ba001a051Salvador Martinez
170dee882c960b4db9bae9f2c9144b84c6ba001a051Salvador Martinez    @Test
171dee882c960b4db9bae9f2c9144b84c6ba001a051Salvador Martinez    public void test_noThresholdFilter_oldAppRecentlyUsed_isValid() {
172dee882c960b4db9bae9f2c9144b84c6ba001a051Salvador Martinez        AppsAsyncLoader.PackageInfo app = createPackage(PACKAGE_NAME, 1, 200);
173dee882c960b4db9bae9f2c9144b84c6ba001a051Salvador Martinez
174dee882c960b4db9bae9f2c9144b84c6ba001a051Salvador Martinez        assertThat(AppsAsyncLoader.FILTER_NO_THRESHOLD.filterApp(app)).isTrue();
175dee882c960b4db9bae9f2c9144b84c6ba001a051Salvador Martinez    }
176dee882c960b4db9bae9f2c9144b84c6ba001a051Salvador Martinez
177dee882c960b4db9bae9f2c9144b84c6ba001a051Salvador Martinez    @Test
178dee882c960b4db9bae9f2c9144b84c6ba001a051Salvador Martinez    public void test_oldUnusedApp_isValid() {
179dee882c960b4db9bae9f2c9144b84c6ba001a051Salvador Martinez        AppsAsyncLoader.PackageInfo app = createPackage(PACKAGE_NAME, 199, 200);
180dee882c960b4db9bae9f2c9144b84c6ba001a051Salvador Martinez
181dee882c960b4db9bae9f2c9144b84c6ba001a051Salvador Martinez        assertThat(AppsAsyncLoader.FILTER_USAGE_STATS.filterApp(app)).isTrue();
182dee882c960b4db9bae9f2c9144b84c6ba001a051Salvador Martinez    }
183dee882c960b4db9bae9f2c9144b84c6ba001a051Salvador Martinez
184dee882c960b4db9bae9f2c9144b84c6ba001a051Salvador Martinez    @Test
185dee882c960b4db9bae9f2c9144b84c6ba001a051Salvador Martinez    public void test_noThresholdFilter_oldUnusedApp_isValid() {
186dee882c960b4db9bae9f2c9144b84c6ba001a051Salvador Martinez        AppsAsyncLoader.PackageInfo app = createPackage(PACKAGE_NAME, 199, 200);
187dee882c960b4db9bae9f2c9144b84c6ba001a051Salvador Martinez
188dee882c960b4db9bae9f2c9144b84c6ba001a051Salvador Martinez        assertThat(AppsAsyncLoader.FILTER_NO_THRESHOLD.filterApp(app)).isTrue();
189dee882c960b4db9bae9f2c9144b84c6ba001a051Salvador Martinez    }
190dee882c960b4db9bae9f2c9144b84c6ba001a051Salvador Martinez
191dee882c960b4db9bae9f2c9144b84c6ba001a051Salvador Martinez    @Test
192dee882c960b4db9bae9f2c9144b84c6ba001a051Salvador Martinez    public void test_systemApps_areInvalid() {
193dee882c960b4db9bae9f2c9144b84c6ba001a051Salvador Martinez        AppsAsyncLoader.PackageInfo app = createPackage(PACKAGE_NAME, 200, 200);
194dee882c960b4db9bae9f2c9144b84c6ba001a051Salvador Martinez        app.flags = ApplicationInfo.FLAG_SYSTEM;
195dee882c960b4db9bae9f2c9144b84c6ba001a051Salvador Martinez
196dee882c960b4db9bae9f2c9144b84c6ba001a051Salvador Martinez        assertThat(AppsAsyncLoader.FILTER_USAGE_STATS.filterApp(app)).isFalse();
197dee882c960b4db9bae9f2c9144b84c6ba001a051Salvador Martinez    }
198dee882c960b4db9bae9f2c9144b84c6ba001a051Salvador Martinez
199dee882c960b4db9bae9f2c9144b84c6ba001a051Salvador Martinez    @Test
200dee882c960b4db9bae9f2c9144b84c6ba001a051Salvador Martinez    public void test_noThresholdFilter_systemApps_areInvalid() {
201dee882c960b4db9bae9f2c9144b84c6ba001a051Salvador Martinez        AppsAsyncLoader.PackageInfo app = createPackage(PACKAGE_NAME, 200, 200);
202dee882c960b4db9bae9f2c9144b84c6ba001a051Salvador Martinez        app.flags = ApplicationInfo.FLAG_SYSTEM;
203dee882c960b4db9bae9f2c9144b84c6ba001a051Salvador Martinez
204dee882c960b4db9bae9f2c9144b84c6ba001a051Salvador Martinez        assertThat(AppsAsyncLoader.FILTER_NO_THRESHOLD.filterApp(app)).isFalse();
205dee882c960b4db9bae9f2c9144b84c6ba001a051Salvador Martinez    }
206dee882c960b4db9bae9f2c9144b84c6ba001a051Salvador Martinez
207dee882c960b4db9bae9f2c9144b84c6ba001a051Salvador Martinez    @Test
208dee882c960b4db9bae9f2c9144b84c6ba001a051Salvador Martinez    public void test_persistentProcessApps_areInvalid() {
209dee882c960b4db9bae9f2c9144b84c6ba001a051Salvador Martinez        AppsAsyncLoader.PackageInfo app = createPackage(PACKAGE_NAME, 200, 200);
210dee882c960b4db9bae9f2c9144b84c6ba001a051Salvador Martinez        app.flags = ApplicationInfo.FLAG_PERSISTENT;
211dee882c960b4db9bae9f2c9144b84c6ba001a051Salvador Martinez
212dee882c960b4db9bae9f2c9144b84c6ba001a051Salvador Martinez        assertThat(AppsAsyncLoader.FILTER_USAGE_STATS.filterApp(app)).isFalse();
213dee882c960b4db9bae9f2c9144b84c6ba001a051Salvador Martinez    }
214dee882c960b4db9bae9f2c9144b84c6ba001a051Salvador Martinez
215dee882c960b4db9bae9f2c9144b84c6ba001a051Salvador Martinez    @Test
216dee882c960b4db9bae9f2c9144b84c6ba001a051Salvador Martinez    public void test_noThresholdFilter_persistentProcessApps_areInvalid() {
217dee882c960b4db9bae9f2c9144b84c6ba001a051Salvador Martinez        AppsAsyncLoader.PackageInfo app = createPackage(PACKAGE_NAME, 200, 200);
218dee882c960b4db9bae9f2c9144b84c6ba001a051Salvador Martinez        app.flags = ApplicationInfo.FLAG_PERSISTENT;
219dee882c960b4db9bae9f2c9144b84c6ba001a051Salvador Martinez
220dee882c960b4db9bae9f2c9144b84c6ba001a051Salvador Martinez        assertThat(AppsAsyncLoader.FILTER_NO_THRESHOLD.filterApp(app)).isFalse();
221dee882c960b4db9bae9f2c9144b84c6ba001a051Salvador Martinez    }
222dee882c960b4db9bae9f2c9144b84c6ba001a051Salvador Martinez
223dee882c960b4db9bae9f2c9144b84c6ba001a051Salvador Martinez    @Test
224dee882c960b4db9bae9f2c9144b84c6ba001a051Salvador Martinez    public void test_multipleApps_processCorrectly() {
225dee882c960b4db9bae9f2c9144b84c6ba001a051Salvador Martinez        mLoader.mFilter = AppsAsyncLoader.FILTER_USAGE_STATS;
226dee882c960b4db9bae9f2c9144b84c6ba001a051Salvador Martinez        mLoader.mFilter.init();
227dee882c960b4db9bae9f2c9144b84c6ba001a051Salvador Martinez        AppsAsyncLoader.PackageInfo clearable =
228dee882c960b4db9bae9f2c9144b84c6ba001a051Salvador Martinez                createPackage(
229dee882c960b4db9bae9f2c9144b84c6ba001a051Salvador Martinez                        PACKAGE_CLEARABLE,
230dee882c960b4db9bae9f2c9144b84c6ba001a051Salvador Martinez                        TimeUnit.DAYS.toMillis(800),
231dee882c960b4db9bae9f2c9144b84c6ba001a051Salvador Martinez                        TimeUnit.DAYS.toMillis(800));
232dee882c960b4db9bae9f2c9144b84c6ba001a051Salvador Martinez        registerLastUse(PACKAGE_CLEARABLE, TimeUnit.DAYS.toMillis(800));
233dee882c960b4db9bae9f2c9144b84c6ba001a051Salvador Martinez        registerApp(clearable, 0, TimeUnit.DAYS.toMillis(800));
234dee882c960b4db9bae9f2c9144b84c6ba001a051Salvador Martinez        AppsAsyncLoader.PackageInfo tooNewtoDelete =
235dee882c960b4db9bae9f2c9144b84c6ba001a051Salvador Martinez                createPackage(
236dee882c960b4db9bae9f2c9144b84c6ba001a051Salvador Martinez                        PACKAGE_TOO_NEW_TO_DELETE,
237dee882c960b4db9bae9f2c9144b84c6ba001a051Salvador Martinez                        TimeUnit.DAYS.toMillis(1000),
238dee882c960b4db9bae9f2c9144b84c6ba001a051Salvador Martinez                        TimeUnit.DAYS.toMillis(1000));
239dee882c960b4db9bae9f2c9144b84c6ba001a051Salvador Martinez        registerLastUse(PACKAGE_TOO_NEW_TO_DELETE, TimeUnit.DAYS.toMillis(1000));
240dee882c960b4db9bae9f2c9144b84c6ba001a051Salvador Martinez        registerApp(tooNewtoDelete, 1, TimeUnit.DAYS.toMillis(1000));
241dee882c960b4db9bae9f2c9144b84c6ba001a051Salvador Martinez        AppsAsyncLoader.PackageInfo systemApp =
242dee882c960b4db9bae9f2c9144b84c6ba001a051Salvador Martinez                createPackage(
243dee882c960b4db9bae9f2c9144b84c6ba001a051Salvador Martinez                        PACKAGE_SYSTEM, TimeUnit.DAYS.toMillis(800), TimeUnit.DAYS.toMillis(800));
244dee882c960b4db9bae9f2c9144b84c6ba001a051Salvador Martinez        registerLastUse(PACKAGE_SYSTEM, TimeUnit.DAYS.toMillis(800));
245dee882c960b4db9bae9f2c9144b84c6ba001a051Salvador Martinez        systemApp.flags = ApplicationInfo.FLAG_SYSTEM;
246dee882c960b4db9bae9f2c9144b84c6ba001a051Salvador Martinez        registerApp(systemApp, 2, TimeUnit.DAYS.toMillis(800));
247dee882c960b4db9bae9f2c9144b84c6ba001a051Salvador Martinez        AppsAsyncLoader.PackageInfo persistentApp =
248dee882c960b4db9bae9f2c9144b84c6ba001a051Salvador Martinez                createPackage(
249dee882c960b4db9bae9f2c9144b84c6ba001a051Salvador Martinez                        PACKAGE_NAME, TimeUnit.DAYS.toMillis(800), TimeUnit.DAYS.toMillis(800));
250dee882c960b4db9bae9f2c9144b84c6ba001a051Salvador Martinez        registerLastUse(PACKAGE_NAME, TimeUnit.DAYS.toMillis(800));
251dee882c960b4db9bae9f2c9144b84c6ba001a051Salvador Martinez        persistentApp.flags = ApplicationInfo.FLAG_PERSISTENT;
252dee882c960b4db9bae9f2c9144b84c6ba001a051Salvador Martinez        registerApp(persistentApp, 3, TimeUnit.DAYS.toMillis(800));
253dee882c960b4db9bae9f2c9144b84c6ba001a051Salvador Martinez        List<AppsAsyncLoader.PackageInfo> infos = mLoader.loadInBackground();
254dee882c960b4db9bae9f2c9144b84c6ba001a051Salvador Martinez
255dee882c960b4db9bae9f2c9144b84c6ba001a051Salvador Martinez        assertThat(containsPackage(infos, PACKAGE_CLEARABLE)).isTrue();
256dee882c960b4db9bae9f2c9144b84c6ba001a051Salvador Martinez        assertThat(containsPackage(infos, PACKAGE_TOO_NEW_TO_DELETE)).isFalse();
257dee882c960b4db9bae9f2c9144b84c6ba001a051Salvador Martinez        assertThat(containsPackage(infos, PACKAGE_NAME)).isFalse();
258dee882c960b4db9bae9f2c9144b84c6ba001a051Salvador Martinez        assertThat(containsPackage(infos, PACKAGE_SYSTEM)).isFalse();
259dee882c960b4db9bae9f2c9144b84c6ba001a051Salvador Martinez    }
260dee882c960b4db9bae9f2c9144b84c6ba001a051Salvador Martinez
261dee882c960b4db9bae9f2c9144b84c6ba001a051Salvador Martinez    @Test
262dee882c960b4db9bae9f2c9144b84c6ba001a051Salvador Martinez    public void test_noThresholdFilter_ignoresUsageForFiltering() {
263dee882c960b4db9bae9f2c9144b84c6ba001a051Salvador Martinez        mLoader.mFilter = AppsAsyncLoader.FILTER_NO_THRESHOLD;
264dee882c960b4db9bae9f2c9144b84c6ba001a051Salvador Martinez        mLoader.mFilter.init();
265dee882c960b4db9bae9f2c9144b84c6ba001a051Salvador Martinez        AppsAsyncLoader.PackageInfo clearable =
266dee882c960b4db9bae9f2c9144b84c6ba001a051Salvador Martinez                createPackage(
267dee882c960b4db9bae9f2c9144b84c6ba001a051Salvador Martinez                        PACKAGE_CLEARABLE,
268dee882c960b4db9bae9f2c9144b84c6ba001a051Salvador Martinez                        TimeUnit.DAYS.toMillis(800),
269dee882c960b4db9bae9f2c9144b84c6ba001a051Salvador Martinez                        TimeUnit.DAYS.toMillis(800));
270dee882c960b4db9bae9f2c9144b84c6ba001a051Salvador Martinez        registerLastUse(PACKAGE_CLEARABLE, TimeUnit.DAYS.toMillis(800));
271dee882c960b4db9bae9f2c9144b84c6ba001a051Salvador Martinez        registerApp(clearable, 0, TimeUnit.DAYS.toMillis(800));
272dee882c960b4db9bae9f2c9144b84c6ba001a051Salvador Martinez        AppsAsyncLoader.PackageInfo tooNewtoDelete =
273dee882c960b4db9bae9f2c9144b84c6ba001a051Salvador Martinez                createPackage(
274dee882c960b4db9bae9f2c9144b84c6ba001a051Salvador Martinez                        PACKAGE_TOO_NEW_TO_DELETE,
275dee882c960b4db9bae9f2c9144b84c6ba001a051Salvador Martinez                        TimeUnit.DAYS.toMillis(1000),
276dee882c960b4db9bae9f2c9144b84c6ba001a051Salvador Martinez                        TimeUnit.DAYS.toMillis(1000));
277dee882c960b4db9bae9f2c9144b84c6ba001a051Salvador Martinez        registerLastUse(PACKAGE_TOO_NEW_TO_DELETE, TimeUnit.DAYS.toMillis(1000));
278dee882c960b4db9bae9f2c9144b84c6ba001a051Salvador Martinez        registerApp(tooNewtoDelete, 1, TimeUnit.DAYS.toMillis(1000));
279dee882c960b4db9bae9f2c9144b84c6ba001a051Salvador Martinez        AppsAsyncLoader.PackageInfo systemApp =
280dee882c960b4db9bae9f2c9144b84c6ba001a051Salvador Martinez                createPackage(
281dee882c960b4db9bae9f2c9144b84c6ba001a051Salvador Martinez                        PACKAGE_SYSTEM, TimeUnit.DAYS.toMillis(800), TimeUnit.DAYS.toMillis(800));
282dee882c960b4db9bae9f2c9144b84c6ba001a051Salvador Martinez        registerLastUse(PACKAGE_SYSTEM, TimeUnit.DAYS.toMillis(800));
283dee882c960b4db9bae9f2c9144b84c6ba001a051Salvador Martinez        systemApp.flags = ApplicationInfo.FLAG_SYSTEM;
284dee882c960b4db9bae9f2c9144b84c6ba001a051Salvador Martinez        registerApp(systemApp, 2, TimeUnit.DAYS.toMillis(800));
285dee882c960b4db9bae9f2c9144b84c6ba001a051Salvador Martinez        AppsAsyncLoader.PackageInfo persistentApp =
286dee882c960b4db9bae9f2c9144b84c6ba001a051Salvador Martinez                createPackage(
287dee882c960b4db9bae9f2c9144b84c6ba001a051Salvador Martinez                        PACKAGE_NAME, TimeUnit.DAYS.toMillis(800), TimeUnit.DAYS.toMillis(800));
288dee882c960b4db9bae9f2c9144b84c6ba001a051Salvador Martinez        registerLastUse(PACKAGE_NAME, TimeUnit.DAYS.toMillis(800));
289dee882c960b4db9bae9f2c9144b84c6ba001a051Salvador Martinez        persistentApp.flags = ApplicationInfo.FLAG_PERSISTENT;
290dee882c960b4db9bae9f2c9144b84c6ba001a051Salvador Martinez        registerApp(persistentApp, 3, TimeUnit.DAYS.toMillis(800));
291dee882c960b4db9bae9f2c9144b84c6ba001a051Salvador Martinez        List<AppsAsyncLoader.PackageInfo> infos = mLoader.loadInBackground();
292dee882c960b4db9bae9f2c9144b84c6ba001a051Salvador Martinez
293dee882c960b4db9bae9f2c9144b84c6ba001a051Salvador Martinez        assertThat(containsPackage(infos, PACKAGE_CLEARABLE)).isTrue();
294dee882c960b4db9bae9f2c9144b84c6ba001a051Salvador Martinez        assertThat(containsPackage(infos, PACKAGE_TOO_NEW_TO_DELETE)).isTrue();
295dee882c960b4db9bae9f2c9144b84c6ba001a051Salvador Martinez        assertThat(containsPackage(infos, PACKAGE_NAME)).isFalse();
296dee882c960b4db9bae9f2c9144b84c6ba001a051Salvador Martinez        assertThat(containsPackage(infos, PACKAGE_SYSTEM)).isFalse();
297dee882c960b4db9bae9f2c9144b84c6ba001a051Salvador Martinez    }
298dee882c960b4db9bae9f2c9144b84c6ba001a051Salvador Martinez
299dee882c960b4db9bae9f2c9144b84c6ba001a051Salvador Martinez    @Test
300dee882c960b4db9bae9f2c9144b84c6ba001a051Salvador Martinez    public void testAppUsedOverOneYearAgoIsValid() {
301dee882c960b4db9bae9f2c9144b84c6ba001a051Salvador Martinez        AppsAsyncLoader.PackageInfo app = createPackage(PACKAGE_NAME, 1000 - 366, 400);
302dee882c960b4db9bae9f2c9144b84c6ba001a051Salvador Martinez
303dee882c960b4db9bae9f2c9144b84c6ba001a051Salvador Martinez        assertThat(AppsAsyncLoader.FILTER_USAGE_STATS.filterApp(app)).isTrue();
304dee882c960b4db9bae9f2c9144b84c6ba001a051Salvador Martinez    }
305dee882c960b4db9bae9f2c9144b84c6ba001a051Salvador Martinez
306886d2cf4134f84425351e34c8be3e81a8747163bDaniel Nishi    @Test
30736e04d3e9d2f35bdeda8ababa6f4fb8db23f673eDaniel Nishi    public void test_getGreaterUsageStats_primaryIsNull() {
30836e04d3e9d2f35bdeda8ababa6f4fb8db23f673eDaniel Nishi        UsageStats secondary = mock(UsageStats.class);
30936e04d3e9d2f35bdeda8ababa6f4fb8db23f673eDaniel Nishi        when(secondary.getLastTimeUsed()).thenReturn(1000L);
31036e04d3e9d2f35bdeda8ababa6f4fb8db23f673eDaniel Nishi        assertThat(mLoader.getGreaterUsageStats(PACKAGE_NAME, null, secondary))
31136e04d3e9d2f35bdeda8ababa6f4fb8db23f673eDaniel Nishi                .isEqualTo(secondary);
31236e04d3e9d2f35bdeda8ababa6f4fb8db23f673eDaniel Nishi    }
31336e04d3e9d2f35bdeda8ababa6f4fb8db23f673eDaniel Nishi
31436e04d3e9d2f35bdeda8ababa6f4fb8db23f673eDaniel Nishi    @Test
31536e04d3e9d2f35bdeda8ababa6f4fb8db23f673eDaniel Nishi    public void test_getGreaterUsageStats_secondaryIsNull() {
31636e04d3e9d2f35bdeda8ababa6f4fb8db23f673eDaniel Nishi        UsageStats primary = mock(UsageStats.class);
31736e04d3e9d2f35bdeda8ababa6f4fb8db23f673eDaniel Nishi        when(primary.getLastTimeUsed()).thenReturn(1000L);
31836e04d3e9d2f35bdeda8ababa6f4fb8db23f673eDaniel Nishi        assertThat(mLoader.getGreaterUsageStats(PACKAGE_NAME, primary, null)).isEqualTo(primary);
31936e04d3e9d2f35bdeda8ababa6f4fb8db23f673eDaniel Nishi    }
320886d2cf4134f84425351e34c8be3e81a8747163bDaniel Nishi
32136e04d3e9d2f35bdeda8ababa6f4fb8db23f673eDaniel Nishi    @Test
32236e04d3e9d2f35bdeda8ababa6f4fb8db23f673eDaniel Nishi    public void test_getGreaterUsageStats_primaryIsGreater() {
32336e04d3e9d2f35bdeda8ababa6f4fb8db23f673eDaniel Nishi        UsageStats primary = mock(UsageStats.class);
32436e04d3e9d2f35bdeda8ababa6f4fb8db23f673eDaniel Nishi        when(primary.getLastTimeUsed()).thenReturn(1000L);
32536e04d3e9d2f35bdeda8ababa6f4fb8db23f673eDaniel Nishi        UsageStats secondary = mock(UsageStats.class);
32636e04d3e9d2f35bdeda8ababa6f4fb8db23f673eDaniel Nishi        when(secondary.getLastTimeUsed()).thenReturn(900L);
32736e04d3e9d2f35bdeda8ababa6f4fb8db23f673eDaniel Nishi        assertThat(mLoader.getGreaterUsageStats(PACKAGE_NAME, primary, secondary))
32836e04d3e9d2f35bdeda8ababa6f4fb8db23f673eDaniel Nishi                .isEqualTo(primary);
32936e04d3e9d2f35bdeda8ababa6f4fb8db23f673eDaniel Nishi    }
33036e04d3e9d2f35bdeda8ababa6f4fb8db23f673eDaniel Nishi
33136e04d3e9d2f35bdeda8ababa6f4fb8db23f673eDaniel Nishi    @Test
33236e04d3e9d2f35bdeda8ababa6f4fb8db23f673eDaniel Nishi    public void test_getGreaterUsageStats_secondaryIsGreater() {
33336e04d3e9d2f35bdeda8ababa6f4fb8db23f673eDaniel Nishi        UsageStats primary = mock(UsageStats.class);
33436e04d3e9d2f35bdeda8ababa6f4fb8db23f673eDaniel Nishi        when(primary.getLastTimeUsed()).thenReturn(900L);
33536e04d3e9d2f35bdeda8ababa6f4fb8db23f673eDaniel Nishi        UsageStats secondary = mock(UsageStats.class);
33636e04d3e9d2f35bdeda8ababa6f4fb8db23f673eDaniel Nishi        when(secondary.getLastTimeUsed()).thenReturn(1000L);
33736e04d3e9d2f35bdeda8ababa6f4fb8db23f673eDaniel Nishi        assertThat(mLoader.getGreaterUsageStats(PACKAGE_NAME, primary, secondary))
33836e04d3e9d2f35bdeda8ababa6f4fb8db23f673eDaniel Nishi                .isEqualTo(secondary);
339886d2cf4134f84425351e34c8be3e81a8747163bDaniel Nishi    }
340886d2cf4134f84425351e34c8be3e81a8747163bDaniel Nishi
34100b4488ec14591753239e9ee507d04a62c4d146cDaniel Nishi    @Test
34200b4488ec14591753239e9ee507d04a62c4d146cDaniel Nishi    public void test_defaultLauncherDisallowedFromDeletion() {
34300b4488ec14591753239e9ee507d04a62c4d146cDaniel Nishi        mLoader.mFilter = AppsAsyncLoader.FILTER_USAGE_STATS;
34400b4488ec14591753239e9ee507d04a62c4d146cDaniel Nishi        mLoader.mFilter.init();
34500b4488ec14591753239e9ee507d04a62c4d146cDaniel Nishi        AppsAsyncLoader.PackageInfo defaultLauncher =
34600b4488ec14591753239e9ee507d04a62c4d146cDaniel Nishi                createPackage(
34700b4488ec14591753239e9ee507d04a62c4d146cDaniel Nishi                        PACKAGE_DEFAULT_LAUNCHER,
34800b4488ec14591753239e9ee507d04a62c4d146cDaniel Nishi                        TimeUnit.DAYS.toMillis(800),
34900b4488ec14591753239e9ee507d04a62c4d146cDaniel Nishi                        TimeUnit.DAYS.toMillis(800));
35000b4488ec14591753239e9ee507d04a62c4d146cDaniel Nishi        registerLastUse(PACKAGE_DEFAULT_LAUNCHER, TimeUnit.DAYS.toMillis(800));
35100b4488ec14591753239e9ee507d04a62c4d146cDaniel Nishi        registerApp(defaultLauncher, 0, TimeUnit.DAYS.toMillis(800));
35200b4488ec14591753239e9ee507d04a62c4d146cDaniel Nishi        List<AppsAsyncLoader.PackageInfo> infos = mLoader.loadInBackground();
35300b4488ec14591753239e9ee507d04a62c4d146cDaniel Nishi
35400b4488ec14591753239e9ee507d04a62c4d146cDaniel Nishi        assertThat(containsPackage(infos, PACKAGE_DEFAULT_LAUNCHER)).isFalse();
35500b4488ec14591753239e9ee507d04a62c4d146cDaniel Nishi    }
35600b4488ec14591753239e9ee507d04a62c4d146cDaniel Nishi
357dee882c960b4db9bae9f2c9144b84c6ba001a051Salvador Martinez    private AppsAsyncLoader.PackageInfo createPackage(
358dee882c960b4db9bae9f2c9144b84c6ba001a051Salvador Martinez            String packageName, long lastUse, long installTime) {
359dee882c960b4db9bae9f2c9144b84c6ba001a051Salvador Martinez        AppsAsyncLoader.PackageInfo app =
360dee882c960b4db9bae9f2c9144b84c6ba001a051Salvador Martinez                new AppsAsyncLoader.PackageInfo.Builder()
361dee882c960b4db9bae9f2c9144b84c6ba001a051Salvador Martinez                        .setDaysSinceLastUse(lastUse)
362dd4f3f0854b75a6ee20587d0d000829f38433617Daniel Nishi                        .setDaysSinceFirstInstall(installTime)
363dee882c960b4db9bae9f2c9144b84c6ba001a051Salvador Martinez                        .setPackageName(packageName)
364dee882c960b4db9bae9f2c9144b84c6ba001a051Salvador Martinez                        .setLabel("")
365dee882c960b4db9bae9f2c9144b84c6ba001a051Salvador Martinez                        .build();
366dee882c960b4db9bae9f2c9144b84c6ba001a051Salvador Martinez        app.packageName = packageName;
367dee882c960b4db9bae9f2c9144b84c6ba001a051Salvador Martinez        app.label = packageName;
368dee882c960b4db9bae9f2c9144b84c6ba001a051Salvador Martinez        return app;
369dee882c960b4db9bae9f2c9144b84c6ba001a051Salvador Martinez    }
370dee882c960b4db9bae9f2c9144b84c6ba001a051Salvador Martinez
371dee882c960b4db9bae9f2c9144b84c6ba001a051Salvador Martinez    private void registerApp(AppsAsyncLoader.PackageInfo info, int uid, long installed) {
372dee882c960b4db9bae9f2c9144b84c6ba001a051Salvador Martinez        ApplicationInfo applicationInfo = mock(ApplicationInfo.class);
373dee882c960b4db9bae9f2c9144b84c6ba001a051Salvador Martinez        applicationInfo.uid = uid;
374dee882c960b4db9bae9f2c9144b84c6ba001a051Salvador Martinez        applicationInfo.packageName = info.packageName;
375dee882c960b4db9bae9f2c9144b84c6ba001a051Salvador Martinez        applicationInfo.flags = info.flags;
376dee882c960b4db9bae9f2c9144b84c6ba001a051Salvador Martinez        mInfo.add(applicationInfo);
377dee882c960b4db9bae9f2c9144b84c6ba001a051Salvador Martinez        android.content.pm.PackageInfo packageInfo = mock(android.content.pm.PackageInfo.class);
378dee882c960b4db9bae9f2c9144b84c6ba001a051Salvador Martinez        packageInfo.firstInstallTime = installed;
379dee882c960b4db9bae9f2c9144b84c6ba001a051Salvador Martinez        try {
380dee882c960b4db9bae9f2c9144b84c6ba001a051Salvador Martinez            when(mPackageManager.getPackageInfo(eq(info.packageName), anyInt()))
381dee882c960b4db9bae9f2c9144b84c6ba001a051Salvador Martinez                    .thenReturn(packageInfo);
382dee882c960b4db9bae9f2c9144b84c6ba001a051Salvador Martinez            when(mPackageManager.loadLabel(eq(applicationInfo)))
383dee882c960b4db9bae9f2c9144b84c6ba001a051Salvador Martinez                    .thenReturn(applicationInfo.packageName);
384dee882c960b4db9bae9f2c9144b84c6ba001a051Salvador Martinez        } catch (NameNotFoundException e) {
385dee882c960b4db9bae9f2c9144b84c6ba001a051Salvador Martinez            e.printStackTrace();
386dee882c960b4db9bae9f2c9144b84c6ba001a051Salvador Martinez        }
387dee882c960b4db9bae9f2c9144b84c6ba001a051Salvador Martinez    }
388dee882c960b4db9bae9f2c9144b84c6ba001a051Salvador Martinez
389dee882c960b4db9bae9f2c9144b84c6ba001a051Salvador Martinez    private void registerLastUse(String packageName, long time) {
390dee882c960b4db9bae9f2c9144b84c6ba001a051Salvador Martinez        UsageStats usageStats = mock(UsageStats.class);
391dee882c960b4db9bae9f2c9144b84c6ba001a051Salvador Martinez        when(usageStats.getPackageName()).thenReturn(packageName);
392dee882c960b4db9bae9f2c9144b84c6ba001a051Salvador Martinez        when(usageStats.getLastTimeUsed()).thenReturn(time);
393dee882c960b4db9bae9f2c9144b84c6ba001a051Salvador Martinez        mUsageStats.put(packageName, usageStats);
394dee882c960b4db9bae9f2c9144b84c6ba001a051Salvador Martinez    }
395dee882c960b4db9bae9f2c9144b84c6ba001a051Salvador Martinez
396dee882c960b4db9bae9f2c9144b84c6ba001a051Salvador Martinez    private boolean containsPackage(List<PackageInfo> infos, String expectedPackage) {
397dee882c960b4db9bae9f2c9144b84c6ba001a051Salvador Martinez        for (PackageInfo info : infos) {
398dee882c960b4db9bae9f2c9144b84c6ba001a051Salvador Martinez            if (TextUtils.equals(info.packageName, expectedPackage)) {
399dee882c960b4db9bae9f2c9144b84c6ba001a051Salvador Martinez                return true;
400dee882c960b4db9bae9f2c9144b84c6ba001a051Salvador Martinez            }
401dee882c960b4db9bae9f2c9144b84c6ba001a051Salvador Martinez        }
402dee882c960b4db9bae9f2c9144b84c6ba001a051Salvador Martinez        return false;
403dee882c960b4db9bae9f2c9144b84c6ba001a051Salvador Martinez    }
404dee882c960b4db9bae9f2c9144b84c6ba001a051Salvador Martinez}
405