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