blob: 72e313f3ba3cc31b51e0fc80343cb37cde15da65 [file] [log] [blame]
Ying Zhengd3cb98e2018-05-11 11:42:48 -07001/*
2 * Copyright (C) 2018 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
17package com.android.car.user;
18
19import android.annotation.Nullable;
jovanak24470652018-09-11 17:51:57 -070020import android.car.settings.CarSettings;
Ying Zheng9fc99402018-09-19 14:23:59 -070021import android.car.userlib.CarUserManagerHelper;
Ying Zhengd3cb98e2018-05-11 11:42:48 -070022import android.content.BroadcastReceiver;
23import android.content.Context;
24import android.content.Intent;
25import android.content.IntentFilter;
Ying Zheng1ab32b62018-06-26 12:47:26 -070026import android.location.LocationManager;
Ying Zhengcf20f442018-06-22 16:54:51 -070027import android.os.UserHandle;
Ying Zheng8f90edb2018-06-13 12:42:31 -070028import android.os.UserManager;
jovanak24470652018-09-11 17:51:57 -070029import android.provider.Settings;
Ying Zhengd3cb98e2018-05-11 11:42:48 -070030import android.util.Log;
31
32import com.android.car.CarServiceBase;
Ying Zhengd3cb98e2018-05-11 11:42:48 -070033
34import java.io.PrintWriter;
35
36/**
37 * User service for cars. Manages users at boot time. Including:
38 *
39 * <ol>
40 * <li> Creates a secondary admin user on first run.
Ying Zhengf4339b82018-06-19 16:01:05 -070041 * <li> Log in to the last active user.
Ying Zhengd3cb98e2018-05-11 11:42:48 -070042 * <ol/>
43 */
44public class CarUserService extends BroadcastReceiver implements CarServiceBase {
Ying Zhengd3cb98e2018-05-11 11:42:48 -070045 private static final String TAG = "CarUserService";
46 private final Context mContext;
47 private final CarUserManagerHelper mCarUserManagerHelper;
48
49 public CarUserService(
50 @Nullable Context context, @Nullable CarUserManagerHelper carUserManagerHelper) {
51 if (Log.isLoggable(TAG, Log.DEBUG)) {
52 Log.d(TAG, "constructed");
53 }
54 mContext = context;
55 mCarUserManagerHelper = carUserManagerHelper;
56 }
57
58 @Override
59 public void init() {
60 if (Log.isLoggable(TAG, Log.DEBUG)) {
61 Log.d(TAG, "init");
62 }
63 IntentFilter filter = new IntentFilter();
64 filter.addAction(Intent.ACTION_LOCKED_BOOT_COMPLETED);
Ying Zhengf4339b82018-06-19 16:01:05 -070065 filter.addAction(Intent.ACTION_USER_SWITCHED);
Ying Zhengd3cb98e2018-05-11 11:42:48 -070066
67 mContext.registerReceiver(this, filter);
68 }
69
70 @Override
71 public void release() {
72 if (Log.isLoggable(TAG, Log.DEBUG)) {
73 Log.d(TAG, "release");
74 }
75 mContext.unregisterReceiver(this);
76 }
77
78 @Override
79 public void dump(PrintWriter writer) {
80 writer.println(TAG);
81 writer.println("Context: " + mContext);
82 }
83
84 @Override
85 public void onReceive(Context context, Intent intent) {
86 if (Log.isLoggable(TAG, Log.DEBUG)) {
87 Log.d(TAG, "onReceive " + intent);
88 }
89
Ying Zhengcf20f442018-06-22 16:54:51 -070090 if (Intent.ACTION_LOCKED_BOOT_COMPLETED.equals(intent.getAction())) {
jovanak24470652018-09-11 17:51:57 -070091 // We want to set restrictions on system and guest users only once. These are persisted
92 // onto disk, so it's sufficient to do it once + we minimize the number of disk writes.
93 if (Settings.Global.getInt(mContext.getContentResolver(),
94 CarSettings.Global.DEFAULT_USER_RESTRICTIONS_SET, /* default= */ 0) == 0) {
Ying Zheng1ab32b62018-06-26 12:47:26 -070095 setSystemUserRestrictions();
jovanak811265f2018-06-28 11:22:14 -070096 mCarUserManagerHelper.initDefaultGuestRestrictions();
jovanak24470652018-09-11 17:51:57 -070097 Settings.Global.putInt(mContext.getContentResolver(),
98 CarSettings.Global.DEFAULT_USER_RESTRICTIONS_SET, 1);
Ying Zhengf4339b82018-06-19 16:01:05 -070099 }
jovanak24470652018-09-11 17:51:57 -0700100
Ying Zhengcf20f442018-06-22 16:54:51 -0700101 } else if (Intent.ACTION_USER_SWITCHED.equals(intent.getAction())) {
102 // Update last active user if the switched-to user is a persistent, non-system user.
103 int currentUser = intent.getIntExtra(Intent.EXTRA_USER_HANDLE, -1);
104 if (currentUser > UserHandle.USER_SYSTEM
105 && mCarUserManagerHelper.isPersistentUser(currentUser)) {
Ying Zhengbb1ba2d2018-11-08 10:46:16 -0800106 mCarUserManagerHelper.setLastActiveUser(currentUser);
Ying Zhengd3cb98e2018-05-11 11:42:48 -0700107 }
108 }
109 }
Ying Zheng1ab32b62018-06-26 12:47:26 -0700110
111 private void setSystemUserRestrictions() {
112 // Disable adding accounts for system user.
113 mCarUserManagerHelper.setUserRestriction(mCarUserManagerHelper.getSystemUserInfo(),
114 UserManager.DISALLOW_MODIFY_ACCOUNTS, /* enable= */ true);
115
116 // Disable Location service for system user.
117 LocationManager locationManager =
118 (LocationManager) mContext.getSystemService(Context.LOCATION_SERVICE);
119 locationManager.setLocationEnabledForUser(
120 /* enabled= */ false, UserHandle.of(UserHandle.USER_SYSTEM));
121 }
Ying Zhengd3cb98e2018-05-11 11:42:48 -0700122}