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; 18 19 import android.content.Context; 20 21 import com.android.internal.logging.nano.MetricsProto; 22 import com.android.settings.SettingsRobolectricTestRunner; 23 import com.android.settings.TestConfig; 24 import com.android.settings.testutils.FakeFeatureFactory; 25 26 import org.junit.Before; 27 import org.junit.Test; 28 import org.junit.runner.RunWith; 29 import org.mockito.Answers; 30 import org.mockito.Mock; 31 import org.mockito.MockitoAnnotations; 32 import org.robolectric.annotation.Config; 33 import org.robolectric.util.ReflectionHelpers; 34 35 import static com.google.common.truth.Truth.assertThat; 36 import static org.mockito.Matchers.any; 37 import static org.mockito.Matchers.eq; 38 import static org.mockito.Mockito.verify; 39 40 @RunWith(SettingsRobolectricTestRunner.class) 41 @Config(manifest = TestConfig.MANIFEST_PATH, sdk = TestConfig.SDK_VERSION) 42 public class PictureInPictureDetailsTest { 43 44 @Mock(answer = Answers.RETURNS_DEEP_STUBS) 45 private Context mContext; 46 47 private FakeFeatureFactory mFeatureFactory; 48 private PictureInPictureDetails mFragment; 49 50 @Before setUp()51 public void setUp() { 52 MockitoAnnotations.initMocks(this); 53 FakeFeatureFactory.setupForTest(mContext); 54 mFeatureFactory = (FakeFeatureFactory) FakeFeatureFactory.getFactory(mContext); 55 mFragment = new PictureInPictureDetails(); 56 } 57 58 @Test testIgnoredApp()59 public void testIgnoredApp() { 60 for (String ignoredPackage : PictureInPictureSettings.IGNORE_PACKAGE_LIST) { 61 assertThat(checkPackageHasPictureInPictureActivities(ignoredPackage, true)) 62 .isFalse(); 63 } 64 } 65 66 @Test testNonPippableApp()67 public void testNonPippableApp() { 68 assertThat(checkPackageHasPictureInPictureActivities("com.android.dummypackage")).isFalse(); 69 assertThat(checkPackageHasPictureInPictureActivities("com.android.dummypackage", 70 false, false, false)).isFalse(); 71 } 72 73 @Test testPippableApp()74 public void testPippableApp() { 75 assertThat(checkPackageHasPictureInPictureActivities("com.android.dummypackage", 76 true)).isTrue(); 77 assertThat(checkPackageHasPictureInPictureActivities("com.android.dummypackage", 78 false, true)).isTrue(); 79 assertThat(checkPackageHasPictureInPictureActivities("com.android.dummypackage", 80 true, false)).isTrue(); 81 } 82 83 @Test logSpecialPermissionChange()84 public void logSpecialPermissionChange() { 85 mFragment.logSpecialPermissionChange(true, "app"); 86 verify(mFeatureFactory.metricsFeatureProvider).action(any(Context.class), 87 eq(MetricsProto.MetricsEvent.APP_PICTURE_IN_PICTURE_ALLOW), eq("app")); 88 89 mFragment.logSpecialPermissionChange(false, "app"); 90 verify(mFeatureFactory.metricsFeatureProvider).action(any(Context.class), 91 eq(MetricsProto.MetricsEvent.APP_PICTURE_IN_PICTURE_DENY), eq("app")); 92 } 93 checkPackageHasPictureInPictureActivities(String packageName, boolean... resizeableActivityState)94 private boolean checkPackageHasPictureInPictureActivities(String packageName, 95 boolean... resizeableActivityState) { 96 ActivityInfoWrapper[] activities = null; 97 if (resizeableActivityState.length > 0) { 98 activities = new ActivityInfoWrapper[resizeableActivityState.length]; 99 for (int i = 0; i < activities.length; i++) { 100 activities[i] = new MockActivityInfo(resizeableActivityState[i]); 101 } 102 } 103 return PictureInPictureSettings.checkPackageHasPictureInPictureActivities(packageName, 104 activities); 105 } 106 107 private class MockActivityInfo implements ActivityInfoWrapper { 108 109 private boolean mSupportsPictureInPicture; 110 MockActivityInfo(boolean supportsPictureInPicture)111 public MockActivityInfo(boolean supportsPictureInPicture) { 112 mSupportsPictureInPicture = supportsPictureInPicture; 113 } 114 115 @Override supportsPictureInPicture()116 public boolean supportsPictureInPicture() { 117 return mSupportsPictureInPicture; 118 } 119 } 120 } 121