Home | History | Annotate | Download | only in appinfo
      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