1 /* 2 * Copyright (C) 2017 The Android Open Source Project 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License 15 */ 16 17 package com.android.settings.applications.appinfo; 18 19 import static com.google.common.truth.Truth.assertThat; 20 import static org.mockito.Matchers.anyInt; 21 import static org.mockito.Matchers.eq; 22 import static org.mockito.Mockito.when; 23 24 import android.content.pm.ActivityInfo; 25 import android.content.pm.ApplicationInfo; 26 import android.content.pm.PackageInfo; 27 import android.content.pm.UserInfo; 28 import android.os.UserManager; 29 import android.util.Pair; 30 31 import com.android.settings.testutils.FakeFeatureFactory; 32 import com.android.settings.testutils.SettingsRobolectricTestRunner; 33 import com.android.settingslib.wrapper.PackageManagerWrapper; 34 35 import com.google.common.collect.ImmutableList; 36 37 import org.junit.Before; 38 import org.junit.Test; 39 import org.junit.runner.RunWith; 40 import org.mockito.Mock; 41 import org.mockito.MockitoAnnotations; 42 43 import java.util.ArrayList; 44 import java.util.List; 45 46 @RunWith(SettingsRobolectricTestRunner.class) 47 public class PictureInPictureSettingsTest { 48 49 private static final int PRIMARY_USER_ID = 0; 50 private static final int PROFILE_USER_ID = 10; 51 52 private PictureInPictureSettings mFragment; 53 @Mock 54 private PackageManagerWrapper mPackageManager; 55 @Mock 56 private UserManager mUserManager; 57 private ArrayList<PackageInfo> mPrimaryUserPackages; 58 private ArrayList<PackageInfo> mProfileUserPackages; 59 60 @Before 61 public void setUp() { 62 MockitoAnnotations.initMocks(this); 63 FakeFeatureFactory.setupForTest(); 64 mFragment = new PictureInPictureSettings(mPackageManager, mUserManager); 65 mPrimaryUserPackages = new ArrayList<>(); 66 mProfileUserPackages = new ArrayList<>(); 67 when(mPackageManager.getInstalledPackagesAsUser(anyInt(), eq(PRIMARY_USER_ID))) 68 .thenReturn(mPrimaryUserPackages); 69 when(mPackageManager.getInstalledPackagesAsUser(anyInt(), eq(PROFILE_USER_ID))) 70 .thenReturn(mProfileUserPackages); 71 72 UserInfo primaryUserInfo = new UserInfo(); 73 primaryUserInfo.id = PRIMARY_USER_ID; 74 UserInfo profileUserInfo = new UserInfo(); 75 profileUserInfo.id = PROFILE_USER_ID; 76 77 when(mUserManager.getProfiles(PRIMARY_USER_ID)) 78 .thenReturn(ImmutableList.of(primaryUserInfo, profileUserInfo)); 79 } 80 81 @Test 82 public void testCollectPipApps() { 83 PackageInfo primaryP1 = createPackage("Calculator", true); 84 PackageInfo primaryP2 = createPackage("Clock", false); 85 PackageInfo profileP1 = createPackage("Calculator", false); 86 PackageInfo profileP2 = createPackage("Clock", true); 87 88 mPrimaryUserPackages.add(primaryP1); 89 mPrimaryUserPackages.add(primaryP2); 90 mProfileUserPackages.add(profileP1); 91 mProfileUserPackages.add(profileP2); 92 93 List<Pair<ApplicationInfo, Integer>> apps = mFragment.collectPipApps(PRIMARY_USER_ID); 94 assertThat(containsPackages(apps, primaryP1, profileP2)).isTrue(); 95 assertThat(containsPackages(apps, primaryP2, profileP1)).isFalse(); 96 } 97 98 @Test 99 public void testAppSort() { 100 PackageInfo primaryP1 = createPackage("Android", true); 101 PackageInfo primaryP2 = createPackage("Boop", true); 102 PackageInfo primaryP3 = createPackage("Deck", true); 103 PackageInfo profileP1 = createPackage("Android", true); 104 PackageInfo profileP2 = createPackage("Cool", true); 105 PackageInfo profileP3 = createPackage("Fast", false); 106 107 mPrimaryUserPackages.add(primaryP1); 108 mPrimaryUserPackages.add(primaryP2); 109 mPrimaryUserPackages.add(primaryP3); 110 mProfileUserPackages.add(profileP1); 111 mProfileUserPackages.add(profileP2); 112 mProfileUserPackages.add(profileP3); 113 114 List<Pair<ApplicationInfo, Integer>> apps = mFragment.collectPipApps(PRIMARY_USER_ID); 115 apps.sort(new PictureInPictureSettings.AppComparator(null)); 116 assertThat(isOrdered(apps, primaryP1, profileP1, primaryP2, profileP2, primaryP3)).isTrue(); 117 } 118 119 private boolean containsPackages(List<Pair<ApplicationInfo, Integer>> apps, 120 PackageInfo... packages) { 121 for (PackageInfo aPackage : packages) { 122 boolean found = false; 123 for (Pair<ApplicationInfo, Integer> app : apps) { 124 if (app.first == aPackage.applicationInfo) { 125 found = true; 126 break; 127 } 128 } 129 if (!found) { 130 return false; 131 } 132 } 133 return true; 134 } 135 136 private boolean isOrdered(List<Pair<ApplicationInfo, Integer>> apps, PackageInfo... packages) { 137 if (apps.size() != packages.length) { 138 return false; 139 } 140 141 for (int i = 0; i < packages.length; i++) { 142 if (packages[i].applicationInfo != apps.get(i).first) { 143 return false; 144 } 145 } 146 return true; 147 } 148 149 private PackageInfo createPackage(String appTitle, boolean supportsPip) { 150 PackageInfo pi = new PackageInfo(); 151 ActivityInfo ai = new ActivityInfo(); 152 if (supportsPip) { 153 ai.flags |= ActivityInfo.FLAG_SUPPORTS_PICTURE_IN_PICTURE; 154 } 155 pi.activities = new ActivityInfo[1]; 156 pi.activities[0] = ai; 157 pi.applicationInfo = new ApplicationInfo(); 158 pi.applicationInfo.name = appTitle; 159 return pi; 160 } 161 } 162