diff --git a/packages/CarSystemUI/src/com/android/systemui/car/SUWProgressController.java b/packages/CarSystemUI/src/com/android/systemui/car/SUWProgressController.java new file mode 100644 index 0000000000000..d95293992ec34 --- /dev/null +++ b/packages/CarSystemUI/src/com/android/systemui/car/SUWProgressController.java @@ -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 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() { + } + } +} diff --git a/packages/CarSystemUI/src/com/android/systemui/statusbar/car/CarStatusBar.java b/packages/CarSystemUI/src/com/android/systemui/statusbar/car/CarStatusBar.java index ec3414603db8d..ef24a41511356 100644 --- a/packages/CarSystemUI/src/com/android/systemui/statusbar/car/CarStatusBar.java +++ b/packages/CarSystemUI/src/com/android/systemui/statusbar/car/CarStatusBar.java @@ -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; }