blob: 0a40b3c4831c240235e5c454e9869be304f7f306 [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
Dave Mankofff4736812019-10-18 17:25:50 -040027import com.android.systemui.dagger.qualifiers.MainHandler;
Jason Monk9c7844c2017-01-18 15:21:53 -050028import com.android.systemui.settings.CurrentUserTracker;
29
30import java.util.ArrayList;
31
Jason Monk196d6392018-12-20 13:25:34 -050032import javax.inject.Inject;
33import javax.inject.Singleton;
34
35/**
36 */
37@Singleton
Jason Monk9c7844c2017-01-18 15:21:53 -050038public class DeviceProvisionedControllerImpl extends CurrentUserTracker implements
39 DeviceProvisionedController {
40
yoshiki iguchiac2ffdd2019-03-20 19:17:35 +090041 protected static final String TAG = DeviceProvisionedControllerImpl.class.getSimpleName();
Jason Monk9c7844c2017-01-18 15:21:53 -050042 private final ArrayList<DeviceProvisionedListener> mListeners = new ArrayList<>();
43 private final ContentResolver mContentResolver;
44 private final Context mContext;
45 private final Uri mDeviceProvisionedUri;
46 private final Uri mUserSetupUri;
Jason Monkcfa61ff2018-12-21 13:15:26 -050047 protected final ContentObserver mSettingsObserver;
Jason Monk9c7844c2017-01-18 15:21:53 -050048
Jason Monk196d6392018-12-20 13:25:34 -050049 /**
50 */
51 @Inject
Dave Mankofff4736812019-10-18 17:25:50 -040052 public DeviceProvisionedControllerImpl(Context context, @MainHandler Handler mainHandler) {
Jason Monk9c7844c2017-01-18 15:21:53 -050053 super(context);
54 mContext = context;
55 mContentResolver = context.getContentResolver();
56 mDeviceProvisionedUri = Global.getUriFor(Global.DEVICE_PROVISIONED);
57 mUserSetupUri = Secure.getUriFor(Secure.USER_SETUP_COMPLETE);
Jason Monkcfa61ff2018-12-21 13:15:26 -050058 mSettingsObserver = new ContentObserver(mainHandler) {
59 @Override
60 public void onChange(boolean selfChange, Uri uri, int userId) {
Fabian Kozynskie9077742019-03-27 13:33:15 -040061 Log.d(TAG, "Setting change: " + uri);
Jason Monkcfa61ff2018-12-21 13:15:26 -050062 if (mUserSetupUri.equals(uri)) {
63 notifySetupChanged();
64 } else {
65 notifyProvisionedChanged();
66 }
67 }
68 };
Jason Monk9c7844c2017-01-18 15:21:53 -050069 }
70
71 @Override
72 public boolean isDeviceProvisioned() {
73 return Global.getInt(mContentResolver, Global.DEVICE_PROVISIONED, 0) != 0;
74 }
75
76 @Override
77 public boolean isUserSetup(int currentUser) {
78 return Secure.getIntForUser(mContentResolver, Secure.USER_SETUP_COMPLETE, 0, currentUser)
79 != 0;
80 }
81
82 @Override
83 public int getCurrentUser() {
84 return ActivityManager.getCurrentUser();
85 }
86
87 @Override
88 public void addCallback(DeviceProvisionedListener listener) {
89 mListeners.add(listener);
90 if (mListeners.size() == 1) {
91 startListening(getCurrentUser());
92 }
Jason Monk0288de02017-02-23 14:48:05 -050093 listener.onUserSetupChanged();
94 listener.onDeviceProvisionedChanged();
Jason Monk9c7844c2017-01-18 15:21:53 -050095 }
96
97 @Override
98 public void removeCallback(DeviceProvisionedListener listener) {
99 mListeners.remove(listener);
100 if (mListeners.size() == 0) {
101 stopListening();
102 }
103 }
104
105 private void startListening(int user) {
106 mContentResolver.registerContentObserver(mDeviceProvisionedUri, true,
107 mSettingsObserver, 0);
108 mContentResolver.registerContentObserver(mUserSetupUri, true,
109 mSettingsObserver, user);
110 startTracking();
111 }
112
113 private void stopListening() {
114 stopTracking();
115 mContentResolver.unregisterContentObserver(mSettingsObserver);
116 }
117
118 @Override
119 public void onUserSwitched(int newUserId) {
Jason Monkb68d6ae2017-01-24 10:53:57 -0500120 mContentResolver.unregisterContentObserver(mSettingsObserver);
121 mContentResolver.registerContentObserver(mDeviceProvisionedUri, true,
122 mSettingsObserver, 0);
123 mContentResolver.registerContentObserver(mUserSetupUri, true,
124 mSettingsObserver, newUserId);
Jason Monk9c7844c2017-01-18 15:21:53 -0500125 notifyUserChanged();
126 }
127
128 private void notifyUserChanged() {
Philip Quinn4847ed92017-05-18 17:13:47 -0700129 for (int i = mListeners.size() - 1; i >= 0; --i) {
130 mListeners.get(i).onUserSwitched();
131 }
Jason Monk9c7844c2017-01-18 15:21:53 -0500132 }
133
134 private void notifySetupChanged() {
Philip Quinn4847ed92017-05-18 17:13:47 -0700135 for (int i = mListeners.size() - 1; i >= 0; --i) {
136 mListeners.get(i).onUserSetupChanged();
137 }
Jason Monk9c7844c2017-01-18 15:21:53 -0500138 }
139
140 private void notifyProvisionedChanged() {
Philip Quinn4847ed92017-05-18 17:13:47 -0700141 for (int i = mListeners.size() - 1; i >= 0; --i) {
142 mListeners.get(i).onDeviceProvisionedChanged();
143 }
Jason Monk9c7844c2017-01-18 15:21:53 -0500144 }
Jason Monk9c7844c2017-01-18 15:21:53 -0500145}