/* * Copyright (C) 2017 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file * except in compliance with the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software distributed under the * License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * KIND, either express or implied. See the License for the specific language governing * permissions and limitations under the License. */ package com.android.systemui.statusbar.policy; import android.app.ActivityManager; import android.content.ContentResolver; import android.content.Context; import android.database.ContentObserver; import android.net.Uri; import android.provider.Settings.Global; import android.provider.Settings.Secure; import com.android.systemui.Dependency; import com.android.systemui.settings.CurrentUserTracker; import java.util.ArrayList; public class DeviceProvisionedControllerImpl extends CurrentUserTracker implements DeviceProvisionedController { private final ArrayList mListeners = new ArrayList<>(); private final ContentResolver mContentResolver; private final Context mContext; private final Uri mDeviceProvisionedUri; private final Uri mUserSetupUri; public DeviceProvisionedControllerImpl(Context context) { super(context); mContext = context; mContentResolver = context.getContentResolver(); mDeviceProvisionedUri = Global.getUriFor(Global.DEVICE_PROVISIONED); mUserSetupUri = Secure.getUriFor(Secure.USER_SETUP_COMPLETE); } @Override public boolean isDeviceProvisioned() { return Global.getInt(mContentResolver, Global.DEVICE_PROVISIONED, 0) != 0; } @Override public boolean isUserSetup(int currentUser) { return Secure.getIntForUser(mContentResolver, Secure.USER_SETUP_COMPLETE, 0, currentUser) != 0; } @Override public int getCurrentUser() { return ActivityManager.getCurrentUser(); } @Override public void addCallback(DeviceProvisionedListener listener) { mListeners.add(listener); if (mListeners.size() == 1) { startListening(getCurrentUser()); } listener.onUserSetupChanged(); listener.onDeviceProvisionedChanged(); } @Override public void removeCallback(DeviceProvisionedListener listener) { mListeners.remove(listener); if (mListeners.size() == 0) { stopListening(); } } private void startListening(int user) { mContentResolver.registerContentObserver(mDeviceProvisionedUri, true, mSettingsObserver, 0); mContentResolver.registerContentObserver(mUserSetupUri, true, mSettingsObserver, user); startTracking(); } private void stopListening() { stopTracking(); mContentResolver.unregisterContentObserver(mSettingsObserver); } @Override public void onUserSwitched(int newUserId) { mContentResolver.unregisterContentObserver(mSettingsObserver); mContentResolver.registerContentObserver(mDeviceProvisionedUri, true, mSettingsObserver, 0); mContentResolver.registerContentObserver(mUserSetupUri, true, mSettingsObserver, newUserId); notifyUserChanged(); } private void notifyUserChanged() { mListeners.forEach(c -> c.onUserSwitched()); } private void notifySetupChanged() { mListeners.forEach(c -> c.onUserSetupChanged()); } private void notifyProvisionedChanged() { mListeners.forEach(c -> c.onDeviceProvisionedChanged()); } protected final ContentObserver mSettingsObserver = new ContentObserver(Dependency.get( Dependency.MAIN_HANDLER)) { @Override public void onChange(boolean selfChange, Uri uri, int userId) { if (mUserSetupUri.equals(uri)) { notifySetupChanged(); } else { notifyProvisionedChanged(); } } }; }