DeviceProvisionedControllerImpl.java revision 9c7844cb91b43929d0a86b1c90aa1efb37f5463a
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 } 699c7844cb91b43929d0a86b1c90aa1efb37f5463aJason Monk } 709c7844cb91b43929d0a86b1c90aa1efb37f5463aJason Monk 719c7844cb91b43929d0a86b1c90aa1efb37f5463aJason Monk @Override 729c7844cb91b43929d0a86b1c90aa1efb37f5463aJason Monk public void removeCallback(DeviceProvisionedListener listener) { 739c7844cb91b43929d0a86b1c90aa1efb37f5463aJason Monk mListeners.remove(listener); 749c7844cb91b43929d0a86b1c90aa1efb37f5463aJason Monk if (mListeners.size() == 0) { 759c7844cb91b43929d0a86b1c90aa1efb37f5463aJason Monk stopListening(); 769c7844cb91b43929d0a86b1c90aa1efb37f5463aJason Monk } 779c7844cb91b43929d0a86b1c90aa1efb37f5463aJason Monk } 789c7844cb91b43929d0a86b1c90aa1efb37f5463aJason Monk 799c7844cb91b43929d0a86b1c90aa1efb37f5463aJason Monk private void startListening(int user) { 809c7844cb91b43929d0a86b1c90aa1efb37f5463aJason Monk mContentResolver.registerContentObserver(mDeviceProvisionedUri, true, 819c7844cb91b43929d0a86b1c90aa1efb37f5463aJason Monk mSettingsObserver, 0); 829c7844cb91b43929d0a86b1c90aa1efb37f5463aJason Monk mContentResolver.registerContentObserver(mUserSetupUri, true, 839c7844cb91b43929d0a86b1c90aa1efb37f5463aJason Monk mSettingsObserver, user); 849c7844cb91b43929d0a86b1c90aa1efb37f5463aJason Monk startTracking(); 859c7844cb91b43929d0a86b1c90aa1efb37f5463aJason Monk } 869c7844cb91b43929d0a86b1c90aa1efb37f5463aJason Monk 879c7844cb91b43929d0a86b1c90aa1efb37f5463aJason Monk private void stopListening() { 889c7844cb91b43929d0a86b1c90aa1efb37f5463aJason Monk stopTracking(); 899c7844cb91b43929d0a86b1c90aa1efb37f5463aJason Monk mContentResolver.unregisterContentObserver(mSettingsObserver); 909c7844cb91b43929d0a86b1c90aa1efb37f5463aJason Monk } 919c7844cb91b43929d0a86b1c90aa1efb37f5463aJason Monk 929c7844cb91b43929d0a86b1c90aa1efb37f5463aJason Monk @Override 939c7844cb91b43929d0a86b1c90aa1efb37f5463aJason Monk public void onUserSwitched(int newUserId) { 949c7844cb91b43929d0a86b1c90aa1efb37f5463aJason Monk stopListening(); 959c7844cb91b43929d0a86b1c90aa1efb37f5463aJason Monk startListening(newUserId); 969c7844cb91b43929d0a86b1c90aa1efb37f5463aJason Monk notifyUserChanged(); 979c7844cb91b43929d0a86b1c90aa1efb37f5463aJason Monk notifyUserChanged(); 989c7844cb91b43929d0a86b1c90aa1efb37f5463aJason Monk } 999c7844cb91b43929d0a86b1c90aa1efb37f5463aJason Monk 1009c7844cb91b43929d0a86b1c90aa1efb37f5463aJason Monk private void notifyUserChanged() { 1019c7844cb91b43929d0a86b1c90aa1efb37f5463aJason Monk mListeners.forEach(c -> c.onUserSwitched()); 1029c7844cb91b43929d0a86b1c90aa1efb37f5463aJason Monk } 1039c7844cb91b43929d0a86b1c90aa1efb37f5463aJason Monk 1049c7844cb91b43929d0a86b1c90aa1efb37f5463aJason Monk private void notifySetupChanged() { 1059c7844cb91b43929d0a86b1c90aa1efb37f5463aJason Monk mListeners.forEach(c -> c.onUserSetupChanged()); 1069c7844cb91b43929d0a86b1c90aa1efb37f5463aJason Monk } 1079c7844cb91b43929d0a86b1c90aa1efb37f5463aJason Monk 1089c7844cb91b43929d0a86b1c90aa1efb37f5463aJason Monk private void notifyProvisionedChanged() { 1099c7844cb91b43929d0a86b1c90aa1efb37f5463aJason Monk mListeners.forEach(c -> c.onDeviceProvisionedChanged()); 1109c7844cb91b43929d0a86b1c90aa1efb37f5463aJason Monk } 1119c7844cb91b43929d0a86b1c90aa1efb37f5463aJason Monk 1129c7844cb91b43929d0a86b1c90aa1efb37f5463aJason Monk protected final ContentObserver mSettingsObserver = new ContentObserver(Dependency.get( 1139c7844cb91b43929d0a86b1c90aa1efb37f5463aJason Monk Dependency.MAIN_HANDLER)) { 1149c7844cb91b43929d0a86b1c90aa1efb37f5463aJason Monk 1159c7844cb91b43929d0a86b1c90aa1efb37f5463aJason Monk @Override 1169c7844cb91b43929d0a86b1c90aa1efb37f5463aJason Monk public void onChange(boolean selfChange, Uri uri, int userId) { 1179c7844cb91b43929d0a86b1c90aa1efb37f5463aJason Monk if (mUserSetupUri.equals(uri)) { 1189c7844cb91b43929d0a86b1c90aa1efb37f5463aJason Monk notifySetupChanged(); 1199c7844cb91b43929d0a86b1c90aa1efb37f5463aJason Monk } else { 1209c7844cb91b43929d0a86b1c90aa1efb37f5463aJason Monk notifyProvisionedChanged(); 1219c7844cb91b43929d0a86b1c90aa1efb37f5463aJason Monk } 1229c7844cb91b43929d0a86b1c90aa1efb37f5463aJason Monk } 1239c7844cb91b43929d0a86b1c90aa1efb37f5463aJason Monk }; 1249c7844cb91b43929d0a86b1c90aa1efb37f5463aJason Monk} 125