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

Commit eeb9a61f authored by Keun-young Park's avatar Keun-young Park Committed by Android (Google) Code Review
Browse files

Merge "Migrate car sysui to use new createCar call and prevent crash" into qt-qpr1-dev

parents 5a7e009b 9e395bb0
Loading
Loading
Loading
Loading
+25 −16
Original line number Diff line number Diff line
@@ -26,7 +26,6 @@ import android.car.Car;
import android.car.drivingstate.CarDrivingStateEvent;
import android.car.drivingstate.CarUxRestrictionsManager;
import android.car.hardware.power.CarPowerManager.CarPowerStateListener;
import android.car.trust.CarTrustAgentEnrollmentManager;
import android.content.Context;
import android.graphics.PixelFormat;
import android.graphics.Rect;
@@ -182,6 +181,8 @@ public class CarStatusBar extends StatusBar implements CarBatteryController.Batt
    private boolean mHideNavBarForKeyboard;
    private boolean mBottomNavBarVisible;

    private CarUxRestrictionManagerWrapper mCarUxRestrictionManagerWrapper;

    private final CarPowerStateListener mCarPowerStateListener =
            (int state) -> {
                // When the car powers on, clear all notifications and mute/unread states.
@@ -267,14 +268,16 @@ public class CarStatusBar extends StatusBar implements CarBatteryController.Batt
                    }
                });

        // Used by onDrivingStateChanged and it can be called inside
        // DrivingStateHelper.connectToCarService()
        mSwitchToGuestTimer = new SwitchToGuestTimer(mContext);

        // Register a listener for driving state changes.
        mDrivingStateHelper = new DrivingStateHelper(mContext, this::onDrivingStateChanged);
        mDrivingStateHelper.connectToCarService();

        mPowerManagerHelper = new PowerManagerHelper(mContext, mCarPowerStateListener);
        mPowerManagerHelper.connectToCarService();

        mSwitchToGuestTimer = new SwitchToGuestTimer(mContext);
    }

    private void restartNavBarsIfNecessary() {
@@ -476,13 +479,23 @@ public class CarStatusBar extends StatusBar implements CarBatteryController.Batt
                        animateCollapsePanels();
                    }
                });
        Car car = Car.createCar(mContext);
        CarUxRestrictionsManager carUxRestrictionsManager = (CarUxRestrictionsManager)
                car.getCarManager(Car.CAR_UX_RESTRICTION_SERVICE);

        CarNotificationListener carNotificationListener = new CarNotificationListener();
        CarUxRestrictionManagerWrapper carUxRestrictionManagerWrapper =
                new CarUxRestrictionManagerWrapper();
        carUxRestrictionManagerWrapper.setCarUxRestrictionsManager(carUxRestrictionsManager);
        mCarUxRestrictionManagerWrapper = new CarUxRestrictionManagerWrapper();
        // This can take time if car service is not ready up to this time.
        // TODO(b/142808072) Refactor CarUxRestrictionManagerWrapper to allow setting
        // CarUxRestrictionsManager later and switch to Car.CAR_WAIT_TIMEOUT_DO_NOT_WAIT.
        Car.createCar(mContext, /* handler= */ null, Car.CAR_WAIT_TIMEOUT_WAIT_FOREVER,
                (car, ready) -> {
                    if (!ready) {
                        return;
                    }
                    CarUxRestrictionsManager carUxRestrictionsManager =
                            (CarUxRestrictionsManager)
                                    car.getCarManager(Car.CAR_UX_RESTRICTION_SERVICE);
                    mCarUxRestrictionManagerWrapper.setCarUxRestrictionsManager(
                            carUxRestrictionsManager);
                });

        mNotificationDataManager = new NotificationDataManager();
        mNotificationDataManager.setOnUnseenCountUpdateListener(
@@ -511,7 +524,7 @@ public class CarStatusBar extends StatusBar implements CarBatteryController.Batt
                        mNotificationClickHandlerFactory, mNotificationDataManager);
        mNotificationClickHandlerFactory.setNotificationDataManager(mNotificationDataManager);

        carNotificationListener.registerAsSystemService(mContext, carUxRestrictionManagerWrapper,
        carNotificationListener.registerAsSystemService(mContext, mCarUxRestrictionManagerWrapper,
                carHeadsUpNotificationManager, mNotificationDataManager);

        mNotificationView = mStatusBarWindow.findViewById(R.id.notification_view);
@@ -611,7 +624,7 @@ public class CarStatusBar extends StatusBar implements CarBatteryController.Batt
                mNotificationView,
                PreprocessingManager.getInstance(mContext),
                carNotificationListener,
                carUxRestrictionManagerWrapper,
                mCarUxRestrictionManagerWrapper,
                mNotificationDataManager);
        mNotificationViewController.enable();
    }
@@ -1061,12 +1074,8 @@ public class CarStatusBar extends StatusBar implements CarBatteryController.Batt
        UserSwitcherController userSwitcherController =
                Dependency.get(UserSwitcherController.class);
        if (userSwitcherController.useFullscreenUserSwitcher()) {
            Car car = Car.createCar(mContext);
            CarTrustAgentEnrollmentManager enrollmentManager = (CarTrustAgentEnrollmentManager) car
                    .getCarManager(Car.CAR_TRUST_AGENT_ENROLLMENT_SERVICE);
            mFullscreenUserSwitcher = new FullscreenUserSwitcher(this,
                    mStatusBarWindow.findViewById(R.id.fullscreen_user_switcher_stub),
                    enrollmentManager, mContext);
                    mStatusBarWindow.findViewById(R.id.fullscreen_user_switcher_stub), mContext);
        } else {
            super.createUserSwitcher();
        }
+20 −58
Original line number Diff line number Diff line
@@ -17,14 +17,11 @@
package com.android.systemui.statusbar.car;

import android.car.Car;
import android.car.CarNotConnectedException;
import android.car.Car.CarServiceLifecycleListener;
import android.car.drivingstate.CarDrivingStateEvent;
import android.car.drivingstate.CarDrivingStateManager;
import android.car.drivingstate.CarDrivingStateManager.CarDrivingStateEventListener;
import android.content.ComponentName;
import android.content.Context;
import android.content.ServiceConnection;
import android.os.IBinder;
import android.util.Log;

import androidx.annotation.NonNull;
@@ -55,16 +52,11 @@ public class DrivingStateHelper {
        if (mDrivingStateManager == null) {
            return false;
        }
        try {
        CarDrivingStateEvent currentState = mDrivingStateManager.getCurrentCarDrivingState();
        if (currentState != null) {
            return currentState.eventValue == CarDrivingStateEvent.DRIVING_STATE_IDLING
                    || currentState.eventValue == CarDrivingStateEvent.DRIVING_STATE_MOVING;
        }
        } catch (CarNotConnectedException e) {
            Log.e(TAG, "Cannot determine current driving state. Car not connected", e);
        }

        return false; // Default to false.
    }

@@ -72,27 +64,16 @@ public class DrivingStateHelper {
     * Establishes connection with the Car service.
     */
    public void connectToCarService() {
        mCar = Car.createCar(mContext, mCarConnectionListener);
        if (mCar != null) {
            mCar.connect();
        }
        mCar = Car.createCar(mContext, /* handler= */ null, Car.CAR_WAIT_TIMEOUT_DO_NOT_WAIT,
                mCarServiceLifecycleListener);
    }

    /**
     * Disconnects from Car service and cleans up listeners.
     */
    public void disconnectFromCarService() {
        if (mCar != null) {
            mCar.disconnect();
        }
    private final CarServiceLifecycleListener mCarServiceLifecycleListener = (car, ready) -> {
        if (!ready) {
            return;
        }

    private final ServiceConnection mCarConnectionListener =
            new ServiceConnection() {
                public void onServiceConnected(ComponentName name, IBinder service) {
        logD("Car Service connected");
                    try {
                        mDrivingStateManager = (CarDrivingStateManager) mCar.getCarManager(
        mDrivingStateManager = (CarDrivingStateManager) car.getCarManager(
                Car.CAR_DRIVING_STATE_SERVICE);
        if (mDrivingStateManager != null) {
            mDrivingStateManager.registerListener(mDrivingStateHandler);
@@ -101,27 +82,8 @@ public class DrivingStateHelper {
        } else {
            Log.e(TAG, "CarDrivingStateService service not available");
        }
                    } catch (CarNotConnectedException e) {
                        Log.e(TAG, "Car not connected", e);
                    }
                }

                @Override
                public void onServiceDisconnected(ComponentName name) {
                    destroyDrivingStateManager();
                }
    };

    private void destroyDrivingStateManager() {
        try {
            if (mDrivingStateManager != null) {
                mDrivingStateManager.unregisterListener();
            }
        } catch (CarNotConnectedException e) {
            Log.e(TAG, "Error unregistering listeners", e);
        }
    }

    private void logD(String message) {
        if (Log.isLoggable(TAG, Log.DEBUG)) {
            Log.d(TAG, message);
+16 −5
Original line number Diff line number Diff line
@@ -18,6 +18,7 @@ package com.android.systemui.statusbar.car;

import android.animation.Animator;
import android.animation.AnimatorListenerAdapter;
import android.car.Car;
import android.car.trust.CarTrustAgentEnrollmentManager;
import android.car.userlib.CarUserManagerHelper;
import android.content.BroadcastReceiver;
@@ -50,7 +51,7 @@ public class FullscreenUserSwitcher {
    private final CarStatusBar mStatusBar;
    private final Context mContext;
    private final UserManager mUserManager;
    private final CarTrustAgentEnrollmentManager mEnrollmentManager;
    private CarTrustAgentEnrollmentManager mEnrollmentManager;
    private CarTrustAgentUnlockDialogHelper mUnlockDialogHelper;
    private UserGridRecyclerView.UserRecord mSelectedUser;
    private CarUserManagerHelper mCarUserManagerHelper;
@@ -64,13 +65,11 @@ public class FullscreenUserSwitcher {
            mContext.unregisterReceiver(mUserUnlockReceiver);
        }
    };
    private final Car mCar;


    public FullscreenUserSwitcher(CarStatusBar statusBar, ViewStub containerStub,
            CarTrustAgentEnrollmentManager enrollmentManager, Context context) {
    public FullscreenUserSwitcher(CarStatusBar statusBar, ViewStub containerStub, Context context) {
        mStatusBar = statusBar;
        mParent = containerStub.inflate();
        mEnrollmentManager = enrollmentManager;
        mContext = context;

        View container = mParent.findViewById(R.id.container);
@@ -86,6 +85,15 @@ public class FullscreenUserSwitcher {
        mUnlockDialogHelper = new CarTrustAgentUnlockDialogHelper(mContext);
        mUserManager = mContext.getSystemService(UserManager.class);

        mCar = Car.createCar(mContext, /* handler= */ null, Car.CAR_WAIT_TIMEOUT_DO_NOT_WAIT,
                (car, ready) -> {
                    if (!ready) {
                        return;
                    }
                    mEnrollmentManager = (CarTrustAgentEnrollmentManager) car
                            .getCarManager(Car.CAR_TRUST_AGENT_ENROLLMENT_SERVICE);
                });

        mShortAnimDuration = container.getResources()
                .getInteger(android.R.integer.config_shortAnimTime);
        IntentFilter filter = new IntentFilter(Intent.ACTION_USER_UNLOCKED);
@@ -201,6 +209,9 @@ public class FullscreenUserSwitcher {
    }

    private boolean hasTrustedDevice(int uid) {
        if (mEnrollmentManager == null) { // car service not ready, so it cannot be available.
            return false;
        }
        return !mEnrollmentManager.getEnrolledDeviceInfoForUser(uid).isEmpty();
    }

+16 −44
Original line number Diff line number Diff line
@@ -18,13 +18,10 @@ package com.android.systemui.statusbar.car;

import android.annotation.NonNull;
import android.car.Car;
import android.car.CarNotConnectedException;
import android.car.Car.CarServiceLifecycleListener;
import android.car.hardware.power.CarPowerManager;
import android.car.hardware.power.CarPowerManager.CarPowerStateListener;
import android.content.ComponentName;
import android.content.Context;
import android.content.ServiceConnection;
import android.os.IBinder;
import android.util.Log;

/**
@@ -39,55 +36,30 @@ public class PowerManagerHelper {
    private Car mCar;
    private CarPowerManager mCarPowerManager;

    private final ServiceConnection mCarConnectionListener =
            new ServiceConnection() {
                public void onServiceConnected(ComponentName name, IBinder service) {
    private final CarServiceLifecycleListener mCarServiceLifecycleListener;

    PowerManagerHelper(Context context, @NonNull CarPowerStateListener listener) {
        mContext = context;
        mCarPowerStateListener = listener;
        mCarServiceLifecycleListener = (car, ready) -> {
            if (!ready) {
                return;
            }
            Log.d(TAG, "Car Service connected");
                    try {
                        mCarPowerManager = (CarPowerManager) mCar.getCarManager(Car.POWER_SERVICE);
            mCarPowerManager = (CarPowerManager) car.getCarManager(Car.POWER_SERVICE);
            if (mCarPowerManager != null) {
                mCarPowerManager.setListener(mCarPowerStateListener);
            } else {
                Log.e(TAG, "CarPowerManager service not available");
            }
                    } catch (CarNotConnectedException e) {
                        Log.e(TAG, "Car not connected", e);
                    }
                }

                @Override
                public void onServiceDisconnected(ComponentName name) {
                    destroyCarPowerManager();
                }
        };

    PowerManagerHelper(Context context, @NonNull CarPowerStateListener listener) {
        mContext = context;
        mCarPowerStateListener = listener;
    }

    /**
     * Connect to Car service.
     */
    void connectToCarService() {
        mCar = Car.createCar(mContext, mCarConnectionListener);
        if (mCar != null) {
            mCar.connect();
        }
    }

    /**
     * Disconnects from Car service.
     */
    void disconnectFromCarService() {
        if (mCar != null) {
            mCar.disconnect();
        }
    }

    private void destroyCarPowerManager() {
        if (mCarPowerManager != null) {
            mCarPowerManager.clearListener();
        }
        mCar = Car.createCar(mContext, /* handler= */ null, Car.CAR_WAIT_TIMEOUT_DO_NOT_WAIT,
                mCarServiceLifecycleListener);
    }
}
+14 −47
Original line number Diff line number Diff line
@@ -20,15 +20,13 @@ import static android.car.VehicleAreaType.VEHICLE_AREA_TYPE_GLOBAL;
import static android.car.VehiclePropertyIds.HVAC_TEMPERATURE_DISPLAY_UNITS;

import android.car.Car;
import android.car.Car.CarServiceLifecycleListener;
import android.car.VehicleUnit;
import android.car.hardware.CarPropertyValue;
import android.car.hardware.hvac.CarHvacManager;
import android.car.hardware.hvac.CarHvacManager.CarHvacEventCallback;
import android.content.ComponentName;
import android.content.Context;
import android.content.ServiceConnection;
import android.os.Handler;
import android.os.IBinder;
import android.util.Log;

import java.util.ArrayList;
@@ -52,6 +50,7 @@ public class HvacController {
    private Car mCar;
    private CarHvacManager mHvacManager;
    private HashMap<HvacKey, List<TemperatureView>> mTempComponents = new HashMap<>();

    /**
     * Callback for getting changes from {@link CarHvacManager} and setting the UI elements to
     * match.
@@ -83,40 +82,18 @@ public class HvacController {
                    + " zone: " + zone);
        }
    };
    /**
     * If the connection to car service goes away then restart it.
     */
    private final IBinder.DeathRecipient mRestart = new IBinder.DeathRecipient() {
        @Override
        public void binderDied() {
            Log.d(TAG, "Death of HVAC triggering a restart");
            if (mCar != null) {
                mCar.disconnect();
            }
            destroyHvacManager();
            mHandler.postDelayed(() -> mCar.connect(), BIND_TO_HVAC_RETRY_DELAY);

    private final CarServiceLifecycleListener mCarServiceLifecycleListener = (car, ready) -> {
        if (!ready) {
            return;
        }
    };
    /**
     * Registers callbacks and initializes components upon connection.
     */
    private ServiceConnection mServiceConnection = new ServiceConnection() {
        @Override
        public void onServiceConnected(ComponentName name, IBinder service) {
        try {
                service.linkToDeath(mRestart, 0);
                mHvacManager = (CarHvacManager) mCar.getCarManager(Car.HVAC_SERVICE);
            mHvacManager = (CarHvacManager) car.getCarManager(Car.HVAC_SERVICE);
            mHvacManager.registerCallback(mHardwareCallback);
            initComponents();
        } catch (Exception e) {
            Log.e(TAG, "Failed to correctly connect to HVAC", e);
        }
        }

        @Override
        public void onServiceDisconnected(ComponentName name) {
            destroyHvacManager();
        }
    };

    public HvacController(Context context) {
@@ -129,18 +106,8 @@ public class HvacController {
     */
    public void connectToCarService() {
        mHandler = new Handler();
        mCar = Car.createCar(mContext, mServiceConnection, mHandler);
        if (mCar != null) {
            // note: this connect call handles the retries
            mCar.connect();
        }
    }

    private void destroyHvacManager() {
        if (mHvacManager != null) {
            mHvacManager.unregisterCallback(mHardwareCallback);
            mHvacManager = null;
        }
        mCar = Car.createCar(mContext, /* handler= */ mHandler, Car.CAR_WAIT_TIMEOUT_DO_NOT_WAIT,
                mCarServiceLifecycleListener);
    }

    /**
Loading