blob: b6ffd58be81671fdbf9a9bba9cfa210f1fb581d1 [file] [log] [blame]
Jason Monk9c7844c2017-01-18 15:21:53 -05001/*
2 * Copyright (C) 2017 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file
5 * except in compliance with the License. You may obtain a copy of the License at
6 *
7 * http://www.apache.org/licenses/LICENSE-2.0
8 *
9 * Unless required by applicable law or agreed to in writing, software distributed under the
10 * License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
11 * KIND, either express or implied. See the License for the specific language governing
12 * permissions and limitations under the License.
13 */
14
15package com.android.systemui.statusbar.policy;
16
17import android.app.ActivityManager;
18import android.content.ContentResolver;
19import android.content.Context;
20import android.database.ContentObserver;
21import android.net.Uri;
Fabian Kozynskie9077742019-03-27 13:33:15 -040022import android.os.Handler;
Jason Monk9c7844c2017-01-18 15:21:53 -050023import android.provider.Settings.Global;
24import android.provider.Settings.Secure;
Fabian Kozynskie9077742019-03-27 13:33:15 -040025import android.util.Log;
Jason Monk9c7844c2017-01-18 15:21:53 -050026
Fabian Kozynski5ca7a512019-10-16 19:56:11 +000027import com.android.systemui.broadcast.BroadcastDispatcher;
Dave Mankofff4736812019-10-18 17:25:50 -040028import com.android.systemui.dagger.qualifiers.MainHandler;
Jason Monk9c7844c2017-01-18 15:21:53 -050029import com.android.systemui.settings.CurrentUserTracker;
30
31import java.util.ArrayList;
32
Jason Monk196d6392018-12-20 13:25:34 -050033import javax.inject.Inject;
34import javax.inject.Singleton;
35
36/**
37 */
38@Singleton
Jason Monk9c7844c2017-01-18 15:21:53 -050039public class DeviceProvisionedControllerImpl extends CurrentUserTracker implements
40 DeviceProvisionedController {
41
yoshiki iguchiac2ffdd2019-03-20 19:17:35 +090042 protected static final String TAG = DeviceProvisionedControllerImpl.class.getSimpleName();
Jason Monk9c7844c2017-01-18 15:21:53 -050043 private final ArrayList<DeviceProvisionedListener> mListeners = new ArrayList<>();
44 private final ContentResolver mContentResolver;
45 private final Context mContext;
46 private final Uri mDeviceProvisionedUri;
47 private final Uri mUserSetupUri;
Jason Monkcfa61ff2018-12-21 13:15:26 -050048 protected final ContentObserver mSettingsObserver;
Jason Monk9c7844c2017-01-18 15:21:53 -050049
Jason Monk196d6392018-12-20 13:25:34 -050050 /**
51 */
52 @Inject
Fabian Kozynski5ca7a512019-10-16 19:56:11 +000053 public DeviceProvisionedControllerImpl(Context context, @MainHandler Handler mainHandler,
54 BroadcastDispatcher broadcastDispatcher) {
55 super(broadcastDispatcher);
Jason Monk9c7844c2017-01-18 15:21:53 -050056 mContext = context;
57 mContentResolver = context.getContentResolver();
58 mDeviceProvisionedUri = Global.getUriFor(Global.DEVICE_PROVISIONED);
59 mUserSetupUri = Secure.getUriFor(Secure.USER_SETUP_COMPLETE);
Jason Monkcfa61ff2018-12-21 13:15:26 -050060 mSettingsObserver = new ContentObserver(mainHandler) {
61 @Override
62 public void onChange(boolean selfChange, Uri uri, int userId) {
Fabian Kozynskie9077742019-03-27 13:33:15 -040063 Log.d(TAG, "Setting change: " + uri);
Jason Monkcfa61ff2018-12-21 13:15:26 -050064 if (mUserSetupUri.equals(uri)) {
65 notifySetupChanged();
66 } else {
67 notifyProvisionedChanged();
68 }
69 }
70 };
Jason Monk9c7844c2017-01-18 15:21:53 -050071 }
72
73 @Override
74 public boolean isDeviceProvisioned() {
75 return Global.getInt(mContentResolver, Global.DEVICE_PROVISIONED, 0) != 0;
76 }
77
78 @Override
79 public boolean isUserSetup(int currentUser) {
80 return Secure.getIntForUser(mContentResolver, Secure.USER_SETUP_COMPLETE, 0, currentUser)
81 != 0;
82 }
83
84 @Override
85 public int getCurrentUser() {
86 return ActivityManager.getCurrentUser();
87 }
88
89 @Override
90 public void addCallback(DeviceProvisionedListener listener) {
91 mListeners.add(listener);
92 if (mListeners.size() == 1) {
93 startListening(getCurrentUser());
94 }
Jason Monk0288de02017-02-23 14:48:05 -050095 listener.onUserSetupChanged();
96 listener.onDeviceProvisionedChanged();
Jason Monk9c7844c2017-01-18 15:21:53 -050097 }
98
99 @Override
100 public void removeCallback(DeviceProvisionedListener listener) {
101 mListeners.remove(listener);
102 if (mListeners.size() == 0) {
103 stopListening();
104 }
105 }
106
107 private void startListening(int user) {
108 mContentResolver.registerContentObserver(mDeviceProvisionedUri, true,
109 mSettingsObserver, 0);
110 mContentResolver.registerContentObserver(mUserSetupUri, true,
111 mSettingsObserver, user);
112 startTracking();
113 }
114
115 private void stopListening() {
116 stopTracking();
117 mContentResolver.unregisterContentObserver(mSettingsObserver);
118 }
119
120 @Override
121 public void onUserSwitched(int newUserId) {
Jason Monkb68d6ae2017-01-24 10:53:57 -0500122 mContentResolver.unregisterContentObserver(mSettingsObserver);
123 mContentResolver.registerContentObserver(mDeviceProvisionedUri, true,
124 mSettingsObserver, 0);
125 mContentResolver.registerContentObserver(mUserSetupUri, true,
126 mSettingsObserver, newUserId);
Jason Monk9c7844c2017-01-18 15:21:53 -0500127 notifyUserChanged();
128 }
129
130 private void notifyUserChanged() {
Philip Quinn4847ed92017-05-18 17:13:47 -0700131 for (int i = mListeners.size() - 1; i >= 0; --i) {
132 mListeners.get(i).onUserSwitched();
133 }
Jason Monk9c7844c2017-01-18 15:21:53 -0500134 }
135
136 private void notifySetupChanged() {
Philip Quinn4847ed92017-05-18 17:13:47 -0700137 for (int i = mListeners.size() - 1; i >= 0; --i) {
138 mListeners.get(i).onUserSetupChanged();
139 }
Jason Monk9c7844c2017-01-18 15:21:53 -0500140 }
141
142 private void notifyProvisionedChanged() {
Philip Quinn4847ed92017-05-18 17:13:47 -0700143 for (int i = mListeners.size() - 1; i >= 0; --i) {
144 mListeners.get(i).onDeviceProvisionedChanged();
145 }
Jason Monk9c7844c2017-01-18 15:21:53 -0500146 }
Jason Monk9c7844c2017-01-18 15:21:53 -0500147}