Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 4febcb94 authored by Automerger Merge Worker's avatar Automerger Merge Worker
Browse files

DO NOT MERGE Set CarSysUI unprovisioned state depending on SUW progress. am: d185a842

Change-Id: If3c51ad180a84ab656b3d823c7e83d62f09e398c
parents 2c8f4df7 d185a842
Loading
Loading
Loading
Loading
+129 −0
Original line number Diff line number Diff line
/*
 * 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() {
        }
    }
}
+35 −15
Original line number Diff line number Diff line
@@ -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;
            }