1/* 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; 22import android.provider.Settings.Global; 23import android.provider.Settings.Secure; 24 25import com.android.systemui.Dependency; 26import com.android.systemui.settings.CurrentUserTracker; 27 28import java.util.ArrayList; 29 30public class DeviceProvisionedControllerImpl extends CurrentUserTracker implements 31 DeviceProvisionedController { 32 33 private final ArrayList<DeviceProvisionedListener> mListeners = new ArrayList<>(); 34 private final ContentResolver mContentResolver; 35 private final Context mContext; 36 private final Uri mDeviceProvisionedUri; 37 private final Uri mUserSetupUri; 38 39 public DeviceProvisionedControllerImpl(Context context) { 40 super(context); 41 mContext = context; 42 mContentResolver = context.getContentResolver(); 43 mDeviceProvisionedUri = Global.getUriFor(Global.DEVICE_PROVISIONED); 44 mUserSetupUri = Secure.getUriFor(Secure.USER_SETUP_COMPLETE); 45 } 46 47 @Override 48 public boolean isDeviceProvisioned() { 49 return Global.getInt(mContentResolver, Global.DEVICE_PROVISIONED, 0) != 0; 50 } 51 52 @Override 53 public boolean isUserSetup(int currentUser) { 54 return Secure.getIntForUser(mContentResolver, Secure.USER_SETUP_COMPLETE, 0, currentUser) 55 != 0; 56 } 57 58 @Override 59 public int getCurrentUser() { 60 return ActivityManager.getCurrentUser(); 61 } 62 63 @Override 64 public void addCallback(DeviceProvisionedListener listener) { 65 mListeners.add(listener); 66 if (mListeners.size() == 1) { 67 startListening(getCurrentUser()); 68 } 69 listener.onUserSetupChanged(); 70 listener.onDeviceProvisionedChanged(); 71 } 72 73 @Override 74 public void removeCallback(DeviceProvisionedListener listener) { 75 mListeners.remove(listener); 76 if (mListeners.size() == 0) { 77 stopListening(); 78 } 79 } 80 81 private void startListening(int user) { 82 mContentResolver.registerContentObserver(mDeviceProvisionedUri, true, 83 mSettingsObserver, 0); 84 mContentResolver.registerContentObserver(mUserSetupUri, true, 85 mSettingsObserver, user); 86 startTracking(); 87 } 88 89 private void stopListening() { 90 stopTracking(); 91 mContentResolver.unregisterContentObserver(mSettingsObserver); 92 } 93 94 @Override 95 public void onUserSwitched(int newUserId) { 96 mContentResolver.unregisterContentObserver(mSettingsObserver); 97 mContentResolver.registerContentObserver(mDeviceProvisionedUri, true, 98 mSettingsObserver, 0); 99 mContentResolver.registerContentObserver(mUserSetupUri, true, 100 mSettingsObserver, newUserId); 101 notifyUserChanged(); 102 } 103 104 private void notifyUserChanged() { 105 mListeners.forEach(c -> c.onUserSwitched()); 106 } 107 108 private void notifySetupChanged() { 109 mListeners.forEach(c -> c.onUserSetupChanged()); 110 } 111 112 private void notifyProvisionedChanged() { 113 mListeners.forEach(c -> c.onDeviceProvisionedChanged()); 114 } 115 116 protected final ContentObserver mSettingsObserver = new ContentObserver(Dependency.get( 117 Dependency.MAIN_HANDLER)) { 118 119 @Override 120 public void onChange(boolean selfChange, Uri uri, int userId) { 121 if (mUserSetupUri.equals(uri)) { 122 notifySetupChanged(); 123 } else { 124 notifyProvisionedChanged(); 125 } 126 } 127 }; 128} 129