1 /* 2 * Copyright (C) 2021 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 android.car.apitest; 18 19 import static com.android.compatibility.common.util.ShellUtils.runShellCommand; 20 21 import static com.google.common.truth.Truth.assertThat; 22 23 import static org.junit.Assert.assertThrows; 24 import static org.junit.Assume.assumeTrue; 25 26 import android.app.ActivityManager; 27 import android.car.Car; 28 import android.car.content.pm.CarPackageManager; 29 import android.car.test.ApiCheckerRule.Builder; 30 import android.content.pm.PackageManager; 31 import android.os.Build; 32 import android.test.suitebuilder.annotation.SmallTest; 33 34 import org.junit.After; 35 import org.junit.Before; 36 import org.junit.Test; 37 38 import java.util.List; 39 40 @SmallTest 41 public class DrivingSafetyRegionTest extends CarApiTestBase { 42 private static final String REGION1 = "com.android.car.test.drivingsafetyregion.1"; 43 private static final String REGION2 = "com.android.car.test.drivingsafetyregion.2"; 44 private static final String REGION3 = "com.android.car.test.drivingsafetyregion.3"; 45 46 private static final String TEST_PACKAGE_NAME = "android.car.apitest"; 47 48 private CarPackageManager mCarPackageManager; 49 private String mOriginalDrivingSafetyRegion = null; 50 51 private final int mCurrentUser = ActivityManager.getCurrentUser(); 52 53 // TODO(b/242350638): add missing annotations, remove (on child bug of 242350638) 54 @Override configApiCheckerRule(Builder builder)55 protected void configApiCheckerRule(Builder builder) { 56 builder.disableAnnotationsCheck(); 57 } 58 59 @Before setUp()60 public void setUp() { 61 mCarPackageManager = (CarPackageManager) getCar().getCarManager(Car.PACKAGE_SERVICE); 62 63 assertThat(mCarPackageManager).isNotNull(); 64 65 mOriginalDrivingSafetyRegion = mCarPackageManager.getCurrentDrivingSafetyRegion(); 66 67 assertThat(mOriginalDrivingSafetyRegion).isNotNull(); 68 69 // cannot run this in user build as region change is not allowed in user build for shell. 70 assumeTrue(Build.IS_ENG || Build.IS_USERDEBUG); 71 } 72 73 @After tearDown()74 public void tearDown() { 75 if (mOriginalDrivingSafetyRegion != null) { 76 setDrivingSafetyRegion(mOriginalDrivingSafetyRegion); 77 } 78 } 79 80 @Test testImplicitAllRegions()81 public void testImplicitAllRegions() throws Exception { 82 doTestAllRegions(TestDrivingSafetyAllRegionActivity.class.getName()); 83 } 84 85 @Test testExplicitAllRegions()86 public void testExplicitAllRegions() throws Exception { 87 doTestAllRegions(TestDrivingSafetyExplicitAllRegionsActivity.class.getName()); 88 } 89 doTestAllRegions(String activityClassName)90 private void doTestAllRegions(String activityClassName) throws Exception { 91 assertThat(mCarPackageManager.isActivityDistractionOptimized(TEST_PACKAGE_NAME, 92 activityClassName)).isTrue(); 93 94 List<String> regions = mCarPackageManager.getSupportedDrivingSafetyRegionsForActivityAsUser( 95 TEST_PACKAGE_NAME, activityClassName, ActivityManager.getCurrentUser()); 96 97 assertThat(regions).containsExactly(CarPackageManager.DRIVING_SAFETY_REGION_ALL); 98 99 // all region app should be safe always regardless of bypassing / region change 100 setDrivingSafetyRegion(REGION1); 101 102 assertThat(mCarPackageManager.isActivityDistractionOptimized(TEST_PACKAGE_NAME, 103 activityClassName)).isTrue(); 104 105 mCarPackageManager.controlTemporaryActivityBlockingBypassingAsUser(TEST_PACKAGE_NAME, 106 activityClassName, true, mCurrentUser); 107 108 assertThat(mCarPackageManager.isActivityDistractionOptimized(TEST_PACKAGE_NAME, 109 activityClassName)).isTrue(); 110 111 mCarPackageManager.controlTemporaryActivityBlockingBypassingAsUser(TEST_PACKAGE_NAME, 112 activityClassName, false, mCurrentUser); 113 114 assertThat(mCarPackageManager.isActivityDistractionOptimized(TEST_PACKAGE_NAME, 115 activityClassName)).isTrue(); 116 } 117 118 @Test testOneRegionOnly()119 public void testOneRegionOnly() throws Exception { 120 String activityClassName = TestDrivingSafetyOneRegionActivity.class.getName(); 121 122 List<String> regions = mCarPackageManager.getSupportedDrivingSafetyRegionsForActivityAsUser( 123 TEST_PACKAGE_NAME, activityClassName, ActivityManager.getCurrentUser()); 124 125 assertThat(regions).containsExactly(REGION1); 126 127 setDrivingSafetyRegion(REGION1); 128 129 assertThat(mCarPackageManager.isActivityDistractionOptimized(TEST_PACKAGE_NAME, 130 activityClassName)).isTrue(); 131 132 setDrivingSafetyRegion(REGION2); 133 134 assertThat(mCarPackageManager.isActivityDistractionOptimized(TEST_PACKAGE_NAME, 135 activityClassName)).isFalse(); 136 137 mCarPackageManager.controlTemporaryActivityBlockingBypassingAsUser(TEST_PACKAGE_NAME, 138 activityClassName, true, mCurrentUser); 139 140 assertThat(mCarPackageManager.isActivityDistractionOptimized(TEST_PACKAGE_NAME, 141 activityClassName)).isTrue(); 142 143 mCarPackageManager.controlTemporaryActivityBlockingBypassingAsUser(TEST_PACKAGE_NAME, 144 activityClassName, false, mCurrentUser); 145 146 assertThat(mCarPackageManager.isActivityDistractionOptimized(TEST_PACKAGE_NAME, 147 activityClassName)).isFalse(); 148 149 setDrivingSafetyRegion(CarPackageManager.DRIVING_SAFETY_REGION_ALL); 150 151 assertThat(mCarPackageManager.isActivityDistractionOptimized(TEST_PACKAGE_NAME, 152 activityClassName)).isTrue(); 153 } 154 155 @Test testTwoRegionsOnly()156 public void testTwoRegionsOnly() throws Exception { 157 String activityClassName = TestDrivingSafetyTwoRegionsActivity.class.getName(); 158 159 List<String> regions = mCarPackageManager.getSupportedDrivingSafetyRegionsForActivityAsUser( 160 TEST_PACKAGE_NAME, activityClassName, ActivityManager.getCurrentUser()); 161 162 assertThat(regions).containsExactly(REGION1, REGION2); 163 164 setDrivingSafetyRegion(REGION1); 165 166 assertThat(mCarPackageManager.isActivityDistractionOptimized(TEST_PACKAGE_NAME, 167 activityClassName)).isTrue(); 168 169 setDrivingSafetyRegion(REGION2); 170 171 assertThat(mCarPackageManager.isActivityDistractionOptimized(TEST_PACKAGE_NAME, 172 activityClassName)).isTrue(); 173 174 setDrivingSafetyRegion(REGION3); 175 176 assertThat(mCarPackageManager.isActivityDistractionOptimized(TEST_PACKAGE_NAME, 177 activityClassName)).isFalse(); 178 179 setDrivingSafetyRegion(CarPackageManager.DRIVING_SAFETY_REGION_ALL); 180 181 assertThat(mCarPackageManager.isActivityDistractionOptimized(TEST_PACKAGE_NAME, 182 activityClassName)).isTrue(); 183 } 184 185 @Test testRegion1OnlyActivity()186 public void testRegion1OnlyActivity() throws Exception { 187 doTestRegionOnlyOrNoRegionCase(TestDrivingSafetyRegion1OnlyActivity.class.getName()); 188 } 189 190 @Test testRegionAllOnlyActivity()191 public void testRegionAllOnlyActivity() throws Exception { 192 doTestRegionOnlyOrNoRegionCase(TestDrivingSafetyRegionAllOnlyActivity.class.getName()); 193 } 194 195 @Test testRegionNoMetadataActivity()196 public void testRegionNoMetadataActivity() throws Exception { 197 doTestRegionOnlyOrNoRegionCase(TestDrivingSafetyRegionNoMetadataActivity.class.getName()); 198 } 199 doTestRegionOnlyOrNoRegionCase(String activityClassName)200 private void doTestRegionOnlyOrNoRegionCase(String activityClassName) throws Exception { 201 List<String> regions = mCarPackageManager.getSupportedDrivingSafetyRegionsForActivityAsUser( 202 TEST_PACKAGE_NAME, activityClassName, ActivityManager.getCurrentUser()); 203 204 // not distraction optimized, so list should be empty. 205 assertThat(regions).isEmpty(); 206 207 assertThat(mCarPackageManager.isActivityDistractionOptimized(TEST_PACKAGE_NAME, 208 activityClassName)).isFalse(); 209 210 // should not be safe for any region. 211 setDrivingSafetyRegion(CarPackageManager.DRIVING_SAFETY_REGION_ALL); 212 213 assertThat(mCarPackageManager.isActivityDistractionOptimized(TEST_PACKAGE_NAME, 214 activityClassName)).isFalse(); 215 216 setDrivingSafetyRegion(REGION1); 217 218 assertThat(mCarPackageManager.isActivityDistractionOptimized(TEST_PACKAGE_NAME, 219 activityClassName)).isFalse(); 220 221 setDrivingSafetyRegion(REGION2); 222 223 assertThat(mCarPackageManager.isActivityDistractionOptimized(TEST_PACKAGE_NAME, 224 activityClassName)).isFalse(); 225 226 mCarPackageManager.controlTemporaryActivityBlockingBypassingAsUser(TEST_PACKAGE_NAME, 227 activityClassName, true, mCurrentUser); 228 229 assertThat(mCarPackageManager.isActivityDistractionOptimized(TEST_PACKAGE_NAME, 230 activityClassName)).isTrue(); 231 232 mCarPackageManager.controlTemporaryActivityBlockingBypassingAsUser(TEST_PACKAGE_NAME, 233 activityClassName, false, mCurrentUser); 234 235 assertThat(mCarPackageManager.isActivityDistractionOptimized(TEST_PACKAGE_NAME, 236 activityClassName)).isFalse(); 237 } 238 239 @Test testNoPackage()240 public void testNoPackage() { 241 String noPkg = "NoSuchPackage"; 242 243 assertThrows(PackageManager.NameNotFoundException.class, 244 () -> mCarPackageManager.getSupportedDrivingSafetyRegionsForActivityAsUser( 245 noPkg, "", mCurrentUser)); 246 247 assertThrows(PackageManager.NameNotFoundException.class, 248 () -> mCarPackageManager.controlTemporaryActivityBlockingBypassingAsUser( 249 noPkg, "", true, mCurrentUser)); 250 } 251 252 @Test testNoActivity()253 public void testNoActivity() { 254 String noSuchActivity = "NoSuchActivity"; 255 256 assertThrows(PackageManager.NameNotFoundException.class, 257 () -> mCarPackageManager.getSupportedDrivingSafetyRegionsForActivityAsUser( 258 TEST_PACKAGE_NAME, noSuchActivity, mCurrentUser)); 259 260 assertThrows(PackageManager.NameNotFoundException.class, 261 () -> mCarPackageManager.controlTemporaryActivityBlockingBypassingAsUser( 262 TEST_PACKAGE_NAME, noSuchActivity, true, mCurrentUser)); 263 } 264 265 @Test testResetEmptyRegion()266 public void testResetEmptyRegion() { 267 setDrivingSafetyRegion(REGION1); 268 269 assertThat(mCarPackageManager.getCurrentDrivingSafetyRegion()).isEqualTo(REGION1); 270 271 // no arg means all 272 runShellCommand("cmd car_service set-drivingsafety-region"); 273 274 assertThat(mCarPackageManager.getCurrentDrivingSafetyRegion()).isEqualTo( 275 CarPackageManager.DRIVING_SAFETY_REGION_ALL); 276 } 277 setDrivingSafetyRegion(String region)278 private void setDrivingSafetyRegion(String region) { 279 runShellCommand("cmd car_service set-drivingsafety-region " + region); 280 } 281 } 282