19c7844cb91b43929d0a86b1c90aa1efb37f5463aJason Monk/* 29c7844cb91b43929d0a86b1c90aa1efb37f5463aJason Monk * Copyright (C) 2017 The Android Open Source Project 39c7844cb91b43929d0a86b1c90aa1efb37f5463aJason Monk * 49c7844cb91b43929d0a86b1c90aa1efb37f5463aJason Monk * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file 59c7844cb91b43929d0a86b1c90aa1efb37f5463aJason Monk * except in compliance with the License. You may obtain a copy of the License at 69c7844cb91b43929d0a86b1c90aa1efb37f5463aJason Monk * 79c7844cb91b43929d0a86b1c90aa1efb37f5463aJason Monk * http://www.apache.org/licenses/LICENSE-2.0 89c7844cb91b43929d0a86b1c90aa1efb37f5463aJason Monk * 99c7844cb91b43929d0a86b1c90aa1efb37f5463aJason Monk * Unless required by applicable law or agreed to in writing, software distributed under the 109c7844cb91b43929d0a86b1c90aa1efb37f5463aJason Monk * License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY 119c7844cb91b43929d0a86b1c90aa1efb37f5463aJason Monk * KIND, either express or implied. See the License for the specific language governing 129c7844cb91b43929d0a86b1c90aa1efb37f5463aJason Monk * permissions and limitations under the License. 139c7844cb91b43929d0a86b1c90aa1efb37f5463aJason Monk */ 149c7844cb91b43929d0a86b1c90aa1efb37f5463aJason Monk 159c7844cb91b43929d0a86b1c90aa1efb37f5463aJason Monkpackage com.android.systemui.statusbar.policy; 169c7844cb91b43929d0a86b1c90aa1efb37f5463aJason Monk 179c7844cb91b43929d0a86b1c90aa1efb37f5463aJason Monkimport android.app.ActivityManager; 189c7844cb91b43929d0a86b1c90aa1efb37f5463aJason Monkimport android.content.ContentResolver; 199c7844cb91b43929d0a86b1c90aa1efb37f5463aJason Monkimport android.content.Context; 209c7844cb91b43929d0a86b1c90aa1efb37f5463aJason Monkimport android.database.ContentObserver; 219c7844cb91b43929d0a86b1c90aa1efb37f5463aJason Monkimport android.net.Uri; 229c7844cb91b43929d0a86b1c90aa1efb37f5463aJason Monkimport android.provider.Settings.Global; 239c7844cb91b43929d0a86b1c90aa1efb37f5463aJason Monkimport android.provider.Settings.Secure; 249c7844cb91b43929d0a86b1c90aa1efb37f5463aJason Monk 259c7844cb91b43929d0a86b1c90aa1efb37f5463aJason Monkimport com.android.systemui.Dependency; 269c7844cb91b43929d0a86b1c90aa1efb37f5463aJason Monkimport com.android.systemui.settings.CurrentUserTracker; 279c7844cb91b43929d0a86b1c90aa1efb37f5463aJason Monk 289c7844cb91b43929d0a86b1c90aa1efb37f5463aJason Monkimport java.util.ArrayList; 299c7844cb91b43929d0a86b1c90aa1efb37f5463aJason Monk 309c7844cb91b43929d0a86b1c90aa1efb37f5463aJason Monkpublic class DeviceProvisionedControllerImpl extends CurrentUserTracker implements 319c7844cb91b43929d0a86b1c90aa1efb37f5463aJason Monk DeviceProvisionedController { 329c7844cb91b43929d0a86b1c90aa1efb37f5463aJason Monk 339c7844cb91b43929d0a86b1c90aa1efb37f5463aJason Monk private final ArrayList<DeviceProvisionedListener> mListeners = new ArrayList<>(); 349c7844cb91b43929d0a86b1c90aa1efb37f5463aJason Monk private final ContentResolver mContentResolver; 359c7844cb91b43929d0a86b1c90aa1efb37f5463aJason Monk private final Context mContext; 369c7844cb91b43929d0a86b1c90aa1efb37f5463aJason Monk private final Uri mDeviceProvisionedUri; 379c7844cb91b43929d0a86b1c90aa1efb37f5463aJason Monk private final Uri mUserSetupUri; 389c7844cb91b43929d0a86b1c90aa1efb37f5463aJason Monk 399c7844cb91b43929d0a86b1c90aa1efb37f5463aJason Monk public DeviceProvisionedControllerImpl(Context context) { 409c7844cb91b43929d0a86b1c90aa1efb37f5463aJason Monk super(context); 419c7844cb91b43929d0a86b1c90aa1efb37f5463aJason Monk mContext = context; 429c7844cb91b43929d0a86b1c90aa1efb37f5463aJason Monk mContentResolver = context.getContentResolver(); 439c7844cb91b43929d0a86b1c90aa1efb37f5463aJason Monk mDeviceProvisionedUri = Global.getUriFor(Global.DEVICE_PROVISIONED); 449c7844cb91b43929d0a86b1c90aa1efb37f5463aJason Monk mUserSetupUri = Secure.getUriFor(Secure.USER_SETUP_COMPLETE); 459c7844cb91b43929d0a86b1c90aa1efb37f5463aJason Monk } 469c7844cb91b43929d0a86b1c90aa1efb37f5463aJason Monk 479c7844cb91b43929d0a86b1c90aa1efb37f5463aJason Monk @Override 489c7844cb91b43929d0a86b1c90aa1efb37f5463aJason Monk public boolean isDeviceProvisioned() { 499c7844cb91b43929d0a86b1c90aa1efb37f5463aJason Monk return Global.getInt(mContentResolver, Global.DEVICE_PROVISIONED, 0) != 0; 509c7844cb91b43929d0a86b1c90aa1efb37f5463aJason Monk } 519c7844cb91b43929d0a86b1c90aa1efb37f5463aJason Monk 529c7844cb91b43929d0a86b1c90aa1efb37f5463aJason Monk @Override 539c7844cb91b43929d0a86b1c90aa1efb37f5463aJason Monk public boolean isUserSetup(int currentUser) { 549c7844cb91b43929d0a86b1c90aa1efb37f5463aJason Monk return Secure.getIntForUser(mContentResolver, Secure.USER_SETUP_COMPLETE, 0, currentUser) 559c7844cb91b43929d0a86b1c90aa1efb37f5463aJason Monk != 0; 569c7844cb91b43929d0a86b1c90aa1efb37f5463aJason Monk } 579c7844cb91b43929d0a86b1c90aa1efb37f5463aJason Monk 589c7844cb91b43929d0a86b1c90aa1efb37f5463aJason Monk @Override 599c7844cb91b43929d0a86b1c90aa1efb37f5463aJason Monk public int getCurrentUser() { 609c7844cb91b43929d0a86b1c90aa1efb37f5463aJason Monk return ActivityManager.getCurrentUser(); 619c7844cb91b43929d0a86b1c90aa1efb37f5463aJason Monk } 629c7844cb91b43929d0a86b1c90aa1efb37f5463aJason Monk 639c7844cb91b43929d0a86b1c90aa1efb37f5463aJason Monk @Override 649c7844cb91b43929d0a86b1c90aa1efb37f5463aJason Monk public void addCallback(DeviceProvisionedListener listener) { 659c7844cb91b43929d0a86b1c90aa1efb37f5463aJason Monk mListeners.add(listener); 669c7844cb91b43929d0a86b1c90aa1efb37f5463aJason Monk if (mListeners.size() == 1) { 679c7844cb91b43929d0a86b1c90aa1efb37f5463aJason Monk startListening(getCurrentUser()); 689c7844cb91b43929d0a86b1c90aa1efb37f5463aJason Monk } 690288de0e5635b714273ff8185b4bdbfb9ece447cJason Monk listener.onUserSetupChanged(); 700288de0e5635b714273ff8185b4bdbfb9ece447cJason Monk listener.onDeviceProvisionedChanged(); 719c7844cb91b43929d0a86b1c90aa1efb37f5463aJason Monk } 729c7844cb91b43929d0a86b1c90aa1efb37f5463aJason Monk 739c7844cb91b43929d0a86b1c90aa1efb37f5463aJason Monk @Override 749c7844cb91b43929d0a86b1c90aa1efb37f5463aJason Monk public void removeCallback(DeviceProvisionedListener listener) { 759c7844cb91b43929d0a86b1c90aa1efb37f5463aJason Monk mListeners.remove(listener); 769c7844cb91b43929d0a86b1c90aa1efb37f5463aJason Monk if (mListeners.size() == 0) { 779c7844cb91b43929d0a86b1c90aa1efb37f5463aJason Monk stopListening(); 789c7844cb91b43929d0a86b1c90aa1efb37f5463aJason Monk } 799c7844cb91b43929d0a86b1c90aa1efb37f5463aJason Monk } 809c7844cb91b43929d0a86b1c90aa1efb37f5463aJason Monk 819c7844cb91b43929d0a86b1c90aa1efb37f5463aJason Monk private void startListening(int user) { 829c7844cb91b43929d0a86b1c90aa1efb37f5463aJason Monk mContentResolver.registerContentObserver(mDeviceProvisionedUri, true, 839c7844cb91b43929d0a86b1c90aa1efb37f5463aJason Monk mSettingsObserver, 0); 849c7844cb91b43929d0a86b1c90aa1efb37f5463aJason Monk mContentResolver.registerContentObserver(mUserSetupUri, true, 859c7844cb91b43929d0a86b1c90aa1efb37f5463aJason Monk mSettingsObserver, user); 869c7844cb91b43929d0a86b1c90aa1efb37f5463aJason Monk startTracking(); 879c7844cb91b43929d0a86b1c90aa1efb37f5463aJason Monk } 889c7844cb91b43929d0a86b1c90aa1efb37f5463aJason Monk 899c7844cb91b43929d0a86b1c90aa1efb37f5463aJason Monk private void stopListening() { 909c7844cb91b43929d0a86b1c90aa1efb37f5463aJason Monk stopTracking(); 919c7844cb91b43929d0a86b1c90aa1efb37f5463aJason Monk mContentResolver.unregisterContentObserver(mSettingsObserver); 929c7844cb91b43929d0a86b1c90aa1efb37f5463aJason Monk } 939c7844cb91b43929d0a86b1c90aa1efb37f5463aJason Monk 949c7844cb91b43929d0a86b1c90aa1efb37f5463aJason Monk @Override 959c7844cb91b43929d0a86b1c90aa1efb37f5463aJason Monk public void onUserSwitched(int newUserId) { 96b68d6ae5a24e3e53839593bfe17f19c653bfca30Jason Monk mContentResolver.unregisterContentObserver(mSettingsObserver); 97b68d6ae5a24e3e53839593bfe17f19c653bfca30Jason Monk mContentResolver.registerContentObserver(mDeviceProvisionedUri, true, 98b68d6ae5a24e3e53839593bfe17f19c653bfca30Jason Monk mSettingsObserver, 0); 99b68d6ae5a24e3e53839593bfe17f19c653bfca30Jason Monk mContentResolver.registerContentObserver(mUserSetupUri, true, 100b68d6ae5a24e3e53839593bfe17f19c653bfca30Jason Monk mSettingsObserver, newUserId); 1019c7844cb91b43929d0a86b1c90aa1efb37f5463aJason Monk notifyUserChanged(); 1029c7844cb91b43929d0a86b1c90aa1efb37f5463aJason Monk } 1039c7844cb91b43929d0a86b1c90aa1efb37f5463aJason Monk 1049c7844cb91b43929d0a86b1c90aa1efb37f5463aJason Monk private void notifyUserChanged() { 1059c7844cb91b43929d0a86b1c90aa1efb37f5463aJason Monk mListeners.forEach(c -> c.onUserSwitched()); 1069c7844cb91b43929d0a86b1c90aa1efb37f5463aJason Monk } 1079c7844cb91b43929d0a86b1c90aa1efb37f5463aJason Monk 1089c7844cb91b43929d0a86b1c90aa1efb37f5463aJason Monk private void notifySetupChanged() { 1099c7844cb91b43929d0a86b1c90aa1efb37f5463aJason Monk mListeners.forEach(c -> c.onUserSetupChanged()); 1109c7844cb91b43929d0a86b1c90aa1efb37f5463aJason Monk } 1119c7844cb91b43929d0a86b1c90aa1efb37f5463aJason Monk 1129c7844cb91b43929d0a86b1c90aa1efb37f5463aJason Monk private void notifyProvisionedChanged() { 1139c7844cb91b43929d0a86b1c90aa1efb37f5463aJason Monk mListeners.forEach(c -> c.onDeviceProvisionedChanged()); 1149c7844cb91b43929d0a86b1c90aa1efb37f5463aJason Monk } 1159c7844cb91b43929d0a86b1c90aa1efb37f5463aJason Monk 1169c7844cb91b43929d0a86b1c90aa1efb37f5463aJason Monk protected final ContentObserver mSettingsObserver = new ContentObserver(Dependency.get( 1179c7844cb91b43929d0a86b1c90aa1efb37f5463aJason Monk Dependency.MAIN_HANDLER)) { 1189c7844cb91b43929d0a86b1c90aa1efb37f5463aJason Monk 1199c7844cb91b43929d0a86b1c90aa1efb37f5463aJason Monk @Override 1209c7844cb91b43929d0a86b1c90aa1efb37f5463aJason Monk public void onChange(boolean selfChange, Uri uri, int userId) { 1219c7844cb91b43929d0a86b1c90aa1efb37f5463aJason Monk if (mUserSetupUri.equals(uri)) { 1229c7844cb91b43929d0a86b1c90aa1efb37f5463aJason Monk notifySetupChanged(); 1239c7844cb91b43929d0a86b1c90aa1efb37f5463aJason Monk } else { 1249c7844cb91b43929d0a86b1c90aa1efb37f5463aJason Monk notifyProvisionedChanged(); 1259c7844cb91b43929d0a86b1c90aa1efb37f5463aJason Monk } 1269c7844cb91b43929d0a86b1c90aa1efb37f5463aJason Monk } 1279c7844cb91b43929d0a86b1c90aa1efb37f5463aJason Monk }; 1289c7844cb91b43929d0a86b1c90aa1efb37f5463aJason Monk} 129