• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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