1 /*
2  * Copyright (C) 2020 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.car.admin;
18 
19 import static com.android.car.PermissionHelper.checkHasDumpPermissionGranted;
20 
21 import android.annotation.NonNull;
22 import android.annotation.Nullable;
23 import android.annotation.UserIdInt;
24 import android.car.admin.CarDevicePolicyManager;
25 import android.car.admin.ICarDevicePolicyService;
26 import android.car.user.UserCreationResult;
27 import android.car.user.UserRemovalResult;
28 import android.car.user.UserStartResult;
29 import android.car.user.UserStopResult;
30 import android.content.pm.UserInfo;
31 import android.os.UserManager;
32 import android.sysprop.CarProperties;
33 import android.util.IndentingPrintWriter;
34 import android.util.Slog;
35 
36 import com.android.car.CarLog;
37 import com.android.car.CarServiceBase;
38 import com.android.car.internal.common.UserHelperLite;
39 import com.android.car.user.CarUserService;
40 import com.android.internal.infra.AndroidFuture;
41 
42 /**
43  * Service for device policy related features.
44  */
45 public final class CarDevicePolicyService extends ICarDevicePolicyService.Stub
46         implements CarServiceBase {
47 
48     private static final String TAG = CarLog.tagFor(CarDevicePolicyService.class);
49     static final boolean DEBUG = false;
50 
51     private static final int HAL_TIMEOUT_MS = CarProperties.user_hal_timeout().orElse(5_000);
52 
53     private final CarUserService mCarUserService;
54 
CarDevicePolicyService(@onNull CarUserService carUserService)55     public CarDevicePolicyService(@NonNull CarUserService carUserService) {
56         mCarUserService = carUserService;
57     }
58 
59     @Override
init()60     public void init() {
61         if (DEBUG) Slog.d(TAG, "init()");
62     }
63 
64     @Override
release()65     public void release() {
66         if (DEBUG) Slog.d(TAG, "release()");
67     }
68 
69     @Override
removeUser(@serIdInt int userId, AndroidFuture<UserRemovalResult> receiver)70     public void removeUser(@UserIdInt int userId, AndroidFuture<UserRemovalResult> receiver) {
71         mCarUserService.removeUser(userId, /* hasCallerRestrictions= */ true, receiver);
72     }
73 
74     @Override
createUser(@ullable String name, @CarDevicePolicyManager.UserType int type, AndroidFuture<UserCreationResult> receiver)75     public void createUser(@Nullable String name,
76             @CarDevicePolicyManager.UserType int type, AndroidFuture<UserCreationResult> receiver) {
77         int userInfoFlags = 0;
78         String userType = UserManager.USER_TYPE_FULL_SECONDARY;
79         switch(type) {
80             case CarDevicePolicyManager.USER_TYPE_REGULAR:
81                 break;
82             case CarDevicePolicyManager.USER_TYPE_ADMIN:
83                 userInfoFlags = UserInfo.FLAG_ADMIN;
84                 break;
85             case CarDevicePolicyManager.USER_TYPE_GUEST:
86                 userType = UserManager.USER_TYPE_FULL_GUEST;
87                 break;
88             default:
89                 if (DEBUG) {
90                     Slog.d(TAG, "createUser(): invalid userType (" + userType + ") / flags ("
91                             + userInfoFlags + ") combination");
92                 }
93                 receiver.complete(
94                         new UserCreationResult(UserCreationResult.STATUS_INVALID_REQUEST));
95                 return;
96         }
97 
98         if (DEBUG) {
99             Slog.d(TAG, "calling createUser(" + UserHelperLite.safeName(name) + "," + userType
100                     + ", " + userInfoFlags + ", " + HAL_TIMEOUT_MS + ")");
101         }
102 
103         mCarUserService.createUser(name, userType, userInfoFlags, HAL_TIMEOUT_MS, receiver);
104     }
105 
106     @Override
startUserInBackground(@serIdInt int userId, AndroidFuture<UserStartResult> receiver)107     public void startUserInBackground(@UserIdInt int userId,
108             AndroidFuture<UserStartResult> receiver) {
109         mCarUserService.startUserInBackground(userId, receiver);
110     }
111 
112     @Override
stopUser(@serIdInt int userId, AndroidFuture<UserStopResult> receiver)113     public void stopUser(@UserIdInt int userId, AndroidFuture<UserStopResult> receiver) {
114         mCarUserService.stopUser(userId, receiver);
115     }
116 
117     @Override
dump(@onNull IndentingPrintWriter writer)118     public void dump(@NonNull IndentingPrintWriter writer) {
119         checkHasDumpPermissionGranted("dump()");
120 
121         writer.println("*CarDevicePolicyService*");
122 
123         writer.printf("HAL_TIMEOUT_MS: %d\n", HAL_TIMEOUT_MS);
124     }
125 }
126