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.specialaccess.pictureinpicture; 18 19 import static com.google.common.truth.Truth.assertThat; 20 21 import static org.mockito.ArgumentMatchers.anyInt; 22 import static org.mockito.ArgumentMatchers.eq; 23 import static org.mockito.Mockito.when; 24 25 import android.content.pm.ActivityInfo; 26 import android.content.pm.ApplicationInfo; 27 import android.content.pm.PackageInfo; 28 import android.content.pm.PackageManager; 29 import android.content.pm.UserInfo; 30 import android.os.UserManager; 31 import android.util.Pair; 32 33 import com.android.settings.testutils.FakeFeatureFactory; 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 import org.robolectric.RobolectricTestRunner; 46 47 @RunWith(RobolectricTestRunner.class) 48 public class PictureInPictureSettingsTest { 49 50 private static final int PRIMARY_USER_ID = 0; 51 private static final int PROFILE_USER_ID = 10; 52 53 private PictureInPictureSettings mFragment; 54 @Mock 55 private PackageManager mPackageManager; 56 @Mock 57 private UserManager mUserManager; 58 private ArrayList<PackageInfo> mPrimaryUserPackages; 59 private ArrayList<PackageInfo> mProfileUserPackages; 60 61 @Before setUp()62 public void setUp() { 63 MockitoAnnotations.initMocks(this); 64 FakeFeatureFactory.setupForTest(); 65 mFragment = new PictureInPictureSettings(mPackageManager, mUserManager); 66 mPrimaryUserPackages = new ArrayList<>(); 67 mProfileUserPackages = new ArrayList<>(); 68 when(mPackageManager.getInstalledPackagesAsUser(anyInt(), eq(PRIMARY_USER_ID))) 69 .thenReturn(mPrimaryUserPackages); 70 when(mPackageManager.getInstalledPackagesAsUser(anyInt(), eq(PROFILE_USER_ID))) 71 .thenReturn(mProfileUserPackages); 72 73 UserInfo primaryUserInfo = new UserInfo(); 74 primaryUserInfo.id = PRIMARY_USER_ID; 75 UserInfo profileUserInfo = new UserInfo(); 76 profileUserInfo.id = PROFILE_USER_ID; 77 78 when(mUserManager.getProfiles(PRIMARY_USER_ID)) 79 .thenReturn(ImmutableList.of(primaryUserInfo, profileUserInfo)); 80 } 81 82 @Test testCollectPipApps()83 public void testCollectPipApps() { 84 PackageInfo primaryP1 = createPackage("Calculator", true); 85 PackageInfo primaryP2 = createPackage("Clock", false); 86 PackageInfo profileP1 = createPackage("Calculator", false); 87 PackageInfo profileP2 = createPackage("Clock", true); 88 89 mPrimaryUserPackages.add(primaryP1); 90 mPrimaryUserPackages.add(primaryP2); 91 mProfileUserPackages.add(profileP1); 92 mProfileUserPackages.add(profileP2); 93 94 List<Pair<ApplicationInfo, Integer>> apps = mFragment.collectPipApps(PRIMARY_USER_ID); 95 assertThat(containsPackages(apps, primaryP1, profileP2)).isTrue(); 96 assertThat(containsPackages(apps, primaryP2, profileP1)).isFalse(); 97 } 98 99 @Test testAppSort()100 public void testAppSort() { 101 PackageInfo primaryP1 = createPackage("Android", true); 102 PackageInfo primaryP2 = createPackage("Boop", true); 103 PackageInfo primaryP3 = createPackage("Deck", true); 104 PackageInfo profileP1 = createPackage("Android", true); 105 PackageInfo profileP2 = createPackage("Cool", true); 106 PackageInfo profileP3 = createPackage("Fast", false); 107 108 mPrimaryUserPackages.add(primaryP1); 109 mPrimaryUserPackages.add(primaryP2); 110 mPrimaryUserPackages.add(primaryP3); 111 mProfileUserPackages.add(profileP1); 112 mProfileUserPackages.add(profileP2); 113 mProfileUserPackages.add(profileP3); 114 115 List<Pair<ApplicationInfo, Integer>> apps = mFragment.collectPipApps(PRIMARY_USER_ID); 116 apps.sort(new PictureInPictureSettings.AppComparator(null)); 117 assertThat(isOrdered(apps, primaryP1, profileP1, primaryP2, profileP2, primaryP3)).isTrue(); 118 } 119 containsPackages(List<Pair<ApplicationInfo, Integer>> apps, PackageInfo... packages)120 private boolean containsPackages(List<Pair<ApplicationInfo, Integer>> apps, 121 PackageInfo... packages) { 122 for (PackageInfo aPackage : packages) { 123 boolean found = false; 124 for (Pair<ApplicationInfo, Integer> app : apps) { 125 if (app.first == aPackage.applicationInfo) { 126 found = true; 127 break; 128 } 129 } 130 if (!found) { 131 return false; 132 } 133 } 134 return true; 135 } 136 isOrdered(List<Pair<ApplicationInfo, Integer>> apps, PackageInfo... packages)137 private boolean isOrdered(List<Pair<ApplicationInfo, Integer>> apps, PackageInfo... packages) { 138 if (apps.size() != packages.length) { 139 return false; 140 } 141 142 for (int i = 0; i < packages.length; i++) { 143 if (packages[i].applicationInfo != apps.get(i).first) { 144 return false; 145 } 146 } 147 return true; 148 } 149 createPackage(String appTitle, boolean supportsPip)150 private PackageInfo createPackage(String appTitle, boolean supportsPip) { 151 PackageInfo pi = new PackageInfo(); 152 ActivityInfo ai = new ActivityInfo(); 153 if (supportsPip) { 154 ai.flags |= ActivityInfo.FLAG_SUPPORTS_PICTURE_IN_PICTURE; 155 } 156 pi.activities = new ActivityInfo[1]; 157 pi.activities[0] = ai; 158 pi.applicationInfo = new ApplicationInfo(); 159 pi.applicationInfo.name = appTitle; 160 return pi; 161 } 162 } 163