DO NOT MERGE Set CarSysUI unprovisioned state depending on SUW progress. am: d185a842c1
Change-Id: If3c51ad180a84ab656b3d823c7e83d62f09e398c
This commit is contained in:
@@ -0,0 +1,129 @@
|
||||
/*
|
||||
* Copyright (C) 2019 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.car;
|
||||
|
||||
import android.app.ActivityManager;
|
||||
import android.car.settings.CarSettings;
|
||||
import android.content.ContentResolver;
|
||||
import android.content.Context;
|
||||
import android.database.ContentObserver;
|
||||
import android.net.Uri;
|
||||
import android.provider.Settings;
|
||||
|
||||
import com.android.systemui.Dependency;
|
||||
|
||||
import java.util.ArrayList;
|
||||
|
||||
/**
|
||||
* A controller that monitors the status of SUW progress for each user.
|
||||
*/
|
||||
public class SUWProgressController {
|
||||
private static final Uri USER_SETUP_IN_PROGRESS_URI = Settings.Secure.getUriFor(
|
||||
CarSettings.Secure.KEY_SETUP_WIZARD_IN_PROGRESS);
|
||||
private final ArrayList<SUWProgressListener> mListeners = new ArrayList<>();
|
||||
private final ContentObserver mCarSettingsObserver = new ContentObserver(
|
||||
Dependency.get(Dependency.MAIN_HANDLER)) {
|
||||
@Override
|
||||
public void onChange(boolean selfChange, Uri uri, int userId) {
|
||||
if (USER_SETUP_IN_PROGRESS_URI.equals(uri)) {
|
||||
notifyUserSetupInProgressChanged();
|
||||
}
|
||||
}
|
||||
};
|
||||
private final ContentResolver mContentResolver;
|
||||
|
||||
public SUWProgressController(Context context) {
|
||||
mContentResolver = context.getContentResolver();
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns {@code true} then SUW is in progress for the given user.
|
||||
*/
|
||||
public boolean isUserSetupInProgress(int user) {
|
||||
return Settings.Secure.getIntForUser(mContentResolver,
|
||||
CarSettings.Secure.KEY_SETUP_WIZARD_IN_PROGRESS, /* def= */ 0, user) != 0;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns {@code true} then SUW is in progress for the current user.
|
||||
*/
|
||||
public boolean isCurrentUserSetupInProgress() {
|
||||
return isUserSetupInProgress(ActivityManager.getCurrentUser());
|
||||
}
|
||||
|
||||
/**
|
||||
* Adds a {@link SUWProgressListener} callback.
|
||||
*/
|
||||
public void addCallback(SUWProgressListener listener) {
|
||||
mListeners.add(listener);
|
||||
if (mListeners.size() == 1) {
|
||||
startListening(ActivityManager.getCurrentUser());
|
||||
}
|
||||
listener.onUserSetupInProgressChanged();
|
||||
}
|
||||
|
||||
/**
|
||||
* Removes a {@link SUWProgressListener} callback.
|
||||
*/
|
||||
public void removeCallback(SUWProgressListener listener) {
|
||||
mListeners.remove(listener);
|
||||
if (mListeners.size() == 0) {
|
||||
stopListening();
|
||||
}
|
||||
}
|
||||
|
||||
private void startListening(int user) {
|
||||
mContentResolver.registerContentObserver(
|
||||
USER_SETUP_IN_PROGRESS_URI, /* notifyForDescendants= */ true, mCarSettingsObserver,
|
||||
user);
|
||||
}
|
||||
|
||||
private void stopListening() {
|
||||
mContentResolver.unregisterContentObserver(mCarSettingsObserver);
|
||||
}
|
||||
|
||||
/**
|
||||
* Allows SUWProgressController to switch its listeners to observe SUW progress for new user.
|
||||
*/
|
||||
public void onUserSwitched() {
|
||||
if (mListeners.size() == 0) {
|
||||
return;
|
||||
}
|
||||
|
||||
mContentResolver.unregisterContentObserver(mCarSettingsObserver);
|
||||
mContentResolver.registerContentObserver(
|
||||
USER_SETUP_IN_PROGRESS_URI, /* notifyForDescendants= */ true, mCarSettingsObserver,
|
||||
ActivityManager.getCurrentUser());
|
||||
}
|
||||
|
||||
private void notifyUserSetupInProgressChanged() {
|
||||
for (int i = mListeners.size() - 1; i >= 0; --i) {
|
||||
mListeners.get(i).onUserSetupInProgressChanged();
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* A listener that listens for changes in SUW progress for a user.
|
||||
*/
|
||||
public interface SUWProgressListener {
|
||||
/**
|
||||
* A callback for when a change occurs in SUW progress for a user.
|
||||
*/
|
||||
default void onUserSetupInProgressChanged() {
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -72,6 +72,7 @@ import com.android.systemui.ForegroundServiceController;
|
||||
import com.android.systemui.Prefs;
|
||||
import com.android.systemui.R;
|
||||
import com.android.systemui.SystemUIFactory;
|
||||
import com.android.systemui.car.SUWProgressController;
|
||||
import com.android.systemui.classifier.FalsingLog;
|
||||
import com.android.systemui.colorextraction.SysuiColorExtractor;
|
||||
import com.android.systemui.fragments.FragmentHostManager;
|
||||
@@ -155,7 +156,9 @@ public class CarStatusBar extends StatusBar implements CarBatteryController.Batt
|
||||
private CarFacetButtonController mCarFacetButtonController;
|
||||
private ActivityManagerWrapper mActivityManagerWrapper;
|
||||
private DeviceProvisionedController mDeviceProvisionedController;
|
||||
private SUWProgressController mSUWProgressController;
|
||||
private boolean mDeviceIsSetUpForUser = true;
|
||||
private boolean mIsUserSetupInProgress = false;
|
||||
private HvacController mHvacController;
|
||||
private DrivingStateHelper mDrivingStateHelper;
|
||||
private PowerManagerHelper mPowerManagerHelper;
|
||||
@@ -273,7 +276,9 @@ public class CarStatusBar extends StatusBar implements CarBatteryController.Batt
|
||||
// get the provisioned state before calling the parent class since it's that flow that
|
||||
// builds the nav bar
|
||||
mDeviceProvisionedController = Dependency.get(DeviceProvisionedController.class);
|
||||
mSUWProgressController = new SUWProgressController(mContext);
|
||||
mDeviceIsSetUpForUser = mDeviceProvisionedController.isCurrentUserSetup();
|
||||
mIsUserSetupInProgress = mSUWProgressController.isCurrentUserSetupInProgress();
|
||||
|
||||
// Keyboard related setup, before nav bars are created.
|
||||
mHideNavBarForKeyboard = mContext.getResources().getBoolean(
|
||||
@@ -326,6 +331,13 @@ public class CarStatusBar extends StatusBar implements CarBatteryController.Batt
|
||||
|
||||
mHvacController.connectToCarService();
|
||||
|
||||
mSUWProgressController.addCallback(
|
||||
new SUWProgressController.SUWProgressListener() {
|
||||
@Override
|
||||
public void onUserSetupInProgressChanged() {
|
||||
mHandler.post(() -> restartNavBarsIfNecessary());
|
||||
}
|
||||
});
|
||||
mDeviceProvisionedController.addCallback(
|
||||
new DeviceProvisionedController.DeviceProvisionedListener() {
|
||||
@Override
|
||||
@@ -335,6 +347,7 @@ public class CarStatusBar extends StatusBar implements CarBatteryController.Batt
|
||||
|
||||
@Override
|
||||
public void onUserSwitched() {
|
||||
mSUWProgressController.onUserSwitched();
|
||||
mHandler.post(() -> restartNavBarsIfNecessary());
|
||||
}
|
||||
});
|
||||
@@ -367,14 +380,6 @@ public class CarStatusBar extends StatusBar implements CarBatteryController.Batt
|
||||
});
|
||||
}
|
||||
|
||||
private void restartNavBarsIfNecessary() {
|
||||
boolean currentUserSetup = mDeviceProvisionedController.isCurrentUserSetup();
|
||||
if (mDeviceIsSetUpForUser != currentUserSetup) {
|
||||
mDeviceIsSetUpForUser = currentUserSetup;
|
||||
restartNavBars();
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void getDependencies() {
|
||||
// Keyguard
|
||||
@@ -424,6 +429,17 @@ public class CarStatusBar extends StatusBar implements CarBatteryController.Batt
|
||||
mContext.unregisterReceiver(mBootCompletedReceiver);
|
||||
}
|
||||
|
||||
private void restartNavBarsIfNecessary() {
|
||||
boolean currentUserSetup = mDeviceProvisionedController.isCurrentUserSetup();
|
||||
boolean currentUserSetupInProgress = mSUWProgressController.isCurrentUserSetupInProgress();
|
||||
if (mIsUserSetupInProgress != currentUserSetupInProgress
|
||||
|| mDeviceIsSetUpForUser != currentUserSetup) {
|
||||
mDeviceIsSetUpForUser = currentUserSetup;
|
||||
mIsUserSetupInProgress = currentUserSetupInProgress;
|
||||
restartNavBars();
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Remove all content from navbars and rebuild them. Used to allow for different nav bars
|
||||
* before and after the device is provisioned. . Also for change of density and font size.
|
||||
@@ -592,7 +608,7 @@ public class CarStatusBar extends StatusBar implements CarBatteryController.Batt
|
||||
new HandleBarCloseNotificationGestureListener());
|
||||
|
||||
mTopNavBarNotificationTouchListener = (v, event) -> {
|
||||
if (!mDeviceIsSetUpForUser) {
|
||||
if (!mDeviceIsSetUpForUser || mIsUserSetupInProgress) {
|
||||
return true;
|
||||
}
|
||||
boolean consumed = openGestureDetector.onTouchEvent(event);
|
||||
@@ -932,22 +948,24 @@ public class CarStatusBar extends StatusBar implements CarBatteryController.Batt
|
||||
}
|
||||
|
||||
private void buildNavBarContent() {
|
||||
boolean shouldBuildNavBarContent = mDeviceIsSetUpForUser && !mIsUserSetupInProgress;
|
||||
|
||||
// Always build top bar.
|
||||
buildTopBar((mDeviceIsSetUpForUser) ? R.layout.car_top_navigation_bar :
|
||||
buildTopBar(shouldBuildNavBarContent ? R.layout.car_top_navigation_bar :
|
||||
R.layout.car_top_navigation_bar_unprovisioned);
|
||||
|
||||
if (mShowBottom) {
|
||||
buildBottomBar((mDeviceIsSetUpForUser) ? R.layout.car_navigation_bar :
|
||||
buildBottomBar(shouldBuildNavBarContent ? R.layout.car_navigation_bar :
|
||||
R.layout.car_navigation_bar_unprovisioned);
|
||||
}
|
||||
|
||||
if (mShowLeft) {
|
||||
buildLeft((mDeviceIsSetUpForUser) ? R.layout.car_left_navigation_bar :
|
||||
buildLeft(shouldBuildNavBarContent ? R.layout.car_left_navigation_bar :
|
||||
R.layout.car_left_navigation_bar_unprovisioned);
|
||||
}
|
||||
|
||||
if (mShowRight) {
|
||||
buildRight((mDeviceIsSetUpForUser) ? R.layout.car_right_navigation_bar :
|
||||
buildRight(shouldBuildNavBarContent ? R.layout.car_right_navigation_bar :
|
||||
R.layout.car_right_navigation_bar_unprovisioned);
|
||||
}
|
||||
}
|
||||
@@ -1570,8 +1588,10 @@ public class CarStatusBar extends StatusBar implements CarBatteryController.Batt
|
||||
|
||||
@Override
|
||||
protected void setHeadsUpVisible() {
|
||||
// if the Notifications panel is showing don't show the Heads up
|
||||
if (!mEnableHeadsUpNotificationWhenNotificationShadeOpen && mPanelExpanded) {
|
||||
// if the Notifications panel is showing or SUW for user is in progress then don't show
|
||||
// heads up notifications
|
||||
if ((!mEnableHeadsUpNotificationWhenNotificationShadeOpen && mPanelExpanded)
|
||||
|| !mDeviceIsSetUpForUser || mIsUserSetupInProgress) {
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user