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