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