1 /*
2  * Copyright (C) 2019 The Android Open Source Project
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *      http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 
17 package com.android.systemui.car;
18 
19 import android.annotation.NonNull;
20 import android.app.ActivityManager;
21 import android.car.settings.CarSettings;
22 import android.database.ContentObserver;
23 import android.net.Uri;
24 import android.os.Handler;
25 import android.os.UserHandle;
26 
27 import com.android.systemui.dagger.SysUISingleton;
28 import com.android.systemui.dagger.qualifiers.Background;
29 import com.android.systemui.dagger.qualifiers.Main;
30 import com.android.systemui.dump.DumpManager;
31 import com.android.systemui.settings.UserTracker;
32 import com.android.systemui.statusbar.policy.DeviceProvisionedControllerImpl;
33 import com.android.systemui.util.settings.GlobalSettings;
34 import com.android.systemui.util.settings.SecureSettings;
35 
36 import java.util.concurrent.Executor;
37 import java.util.concurrent.atomic.AtomicBoolean;
38 
39 import javax.inject.Inject;
40 
41 import kotlin.Unit;
42 
43 /**
44  * A controller that monitors the status of SUW progress for each user in addition to the
45  * functionality provided by {@link DeviceProvisionedControllerImpl}.
46  */
47 @SysUISingleton
48 public class CarDeviceProvisionedControllerImpl extends DeviceProvisionedControllerImpl implements
49         CarDeviceProvisionedController {
50     private final Uri mUserSetupInProgressUri;
51     private final ContentObserver mCarSettingsObserver;
52     private final Handler mMainHandler;
53     private final SecureSettings mSecureSettings;
54     private final AtomicBoolean mInitted = new AtomicBoolean(false);
55 
56     @Inject
CarDeviceProvisionedControllerImpl( SecureSettings secureSettings, GlobalSettings globalSettings, UserTracker userTracker, DumpManager dumpManager, @Background Handler backgroundHandler, @Main Handler mainHandler, @Main Executor mainExecutor)57     public CarDeviceProvisionedControllerImpl(
58             SecureSettings secureSettings,
59             GlobalSettings globalSettings,
60             UserTracker userTracker,
61             DumpManager dumpManager,
62             @Background Handler backgroundHandler,
63             @Main Handler mainHandler,
64             @Main Executor mainExecutor) {
65         super(secureSettings, globalSettings, userTracker, dumpManager, backgroundHandler,
66                 mainExecutor);
67 
68         mMainHandler = mainHandler;
69         mSecureSettings = secureSettings;
70         mUserSetupInProgressUri = mSecureSettings.getUriFor(
71                 CarSettings.Secure.KEY_SETUP_WIZARD_IN_PROGRESS);
72         mCarSettingsObserver = new ContentObserver(mMainHandler) {
73             @Override
74             public void onChange(boolean selfChange, Uri uri, int flags) {
75                 if (mUserSetupInProgressUri.equals(uri)) {
76                     notifyUserSetupInProgressChanged();
77                 }
78             }
79         };
80     }
81 
82     @Override
init()83     public void init() {
84         if (!mInitted.compareAndSet(false, true)) {
85             return;
86         }
87         mSecureSettings.registerContentObserverForUser(
88                 mUserSetupInProgressUri, /* notifyForDescendants= */ true,
89                 mCarSettingsObserver, UserHandle.USER_ALL);
90         super.init();
91     }
92 
93     @Override
isUserSetupInProgress(int user)94     public boolean isUserSetupInProgress(int user) {
95         return mSecureSettings.getIntForUser(
96                 CarSettings.Secure.KEY_SETUP_WIZARD_IN_PROGRESS, /* def= */ 0, user) != 0;
97     }
98 
99     @Override
isCurrentUserSetupInProgress()100     public boolean isCurrentUserSetupInProgress() {
101         return isUserSetupInProgress(ActivityManager.getCurrentUser());
102     }
103 
104     @Override
addCallback(@onNull DeviceProvisionedListener listener)105     public void addCallback(@NonNull DeviceProvisionedListener listener) {
106         super.addCallback(listener);
107         if (listener instanceof CarDeviceProvisionedListener) {
108             ((CarDeviceProvisionedListener) listener).onUserSetupInProgressChanged();
109         }
110     }
111 
notifyUserSetupInProgressChanged()112     private void notifyUserSetupInProgressChanged() {
113         dispatchChange(listener -> {
114             if (listener instanceof CarDeviceProvisionedListener) {
115                 ((CarDeviceProvisionedListener) listener).onUserSetupInProgressChanged();
116             }
117             return Unit.INSTANCE;
118         });
119     }
120 }
121