Create a single car service to share in sysui

Using this as an opportunity to daggerize related classes.

Bug: 144189328
Test: manual, atest CarNavigationBarControllerTest
Change-Id: I58d142bf20b50dca509d84fce6b6258e7d47e98e
This commit is contained in:
Heemin Seog
2019-11-08 16:16:49 -08:00
parent ec3c03ea24
commit eeca9a9fd6
10 changed files with 278 additions and 147 deletions

View File

@@ -0,0 +1,71 @@
/*
* 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.car.Car;
import android.content.Context;
import java.util.ArrayList;
import java.util.List;
import javax.inject.Inject;
import javax.inject.Singleton;
/** Provides a common connection to the car service that can be shared. */
@Singleton
public class CarServiceProvider {
private final Context mContext;
private final List<CarServiceOnConnectedListener> mListeners = new ArrayList<>();
private Car mCar;
@Inject
public CarServiceProvider(Context context) {
mContext = context;
mCar = Car.createCar(mContext, /* handler= */ null, Car.CAR_WAIT_TIMEOUT_DO_NOT_WAIT,
(car, ready) -> {
mCar = car;
synchronized (mListeners) {
for (CarServiceOnConnectedListener listener : mListeners) {
if (ready) {
listener.onConnected(mCar);
}
}
}
});
}
/**
* Let's other components hook into the connection to the car service. If we're already
* connected to the car service, the callback is immediately triggered.
*/
public void addListener(CarServiceOnConnectedListener listener) {
if (mCar.isConnected()) {
listener.onConnected(mCar);
}
mListeners.add(listener);
}
/**
* Listener which is triggered when Car Service is connected.
*/
public interface CarServiceOnConnectedListener {
/** This will be called when the car service has successfully been connected. */
void onConnected(Car car);
}
}

View File

@@ -66,6 +66,7 @@ import com.android.systemui.UiOffloadThread;
import com.android.systemui.assist.AssistManager;
import com.android.systemui.broadcast.BroadcastDispatcher;
import com.android.systemui.bubbles.BubbleController;
import com.android.systemui.car.CarServiceProvider;
import com.android.systemui.classifier.FalsingLog;
import com.android.systemui.colorextraction.SysuiColorExtractor;
import com.android.systemui.fragments.FragmentHostManager;
@@ -164,6 +165,7 @@ public class CarStatusBar extends StatusBar implements CarBatteryController.Batt
private float mBackgroundAlphaDiff;
private float mInitialBackgroundAlpha;
private final Lazy<FullscreenUserSwitcher> mFullscreenUserSwitcherLazy;
private FullscreenUserSwitcher mFullscreenUserSwitcher;
private CarBatteryController mCarBatteryController;
@@ -175,6 +177,9 @@ public class CarStatusBar extends StatusBar implements CarBatteryController.Batt
private final Object mQueueLock = new Object();
private final CarNavigationBarController mCarNavigationBarController;
private final Lazy<DrivingStateHelper> mDrivingStateHelperLazy;
private final Lazy<PowerManagerHelper> mPowerManagerHelperLazy;
private final CarServiceProvider mCarServiceProvider;
private CarFacetButtonController mCarFacetButtonController;
private DeviceProvisionedController mDeviceProvisionedController;
private boolean mDeviceIsSetUpForUser = true;
@@ -311,6 +316,10 @@ public class CarStatusBar extends StatusBar implements CarBatteryController.Batt
ViewMediatorCallback viewMediatorCallback,
DismissCallbackRegistry dismissCallbackRegistry,
/* Car Settings injected components. */
CarServiceProvider carServiceProvider,
Lazy<DrivingStateHelper> drivingStateHelperLazy,
Lazy<PowerManagerHelper> powerManagerHelperLazy,
Lazy<FullscreenUserSwitcher> fullscreenUserSwitcherLazy,
CarNavigationBarController carNavigationBarController) {
super(
context,
@@ -384,6 +393,10 @@ public class CarStatusBar extends StatusBar implements CarBatteryController.Batt
viewMediatorCallback,
dismissCallbackRegistry);
mScrimController = scrimController;
mCarServiceProvider = carServiceProvider;
mDrivingStateHelperLazy = drivingStateHelperLazy;
mPowerManagerHelperLazy = powerManagerHelperLazy;
mFullscreenUserSwitcherLazy = fullscreenUserSwitcherLazy;
mCarNavigationBarController = carNavigationBarController;
}
@@ -449,10 +462,12 @@ public class CarStatusBar extends StatusBar implements CarBatteryController.Batt
mSwitchToGuestTimer = new SwitchToGuestTimer(mContext);
// Register a listener for driving state changes.
mDrivingStateHelper = new DrivingStateHelper(mContext, this::onDrivingStateChanged);
mDrivingStateHelper = mDrivingStateHelperLazy.get();
mDrivingStateHelper.setCarDrivingStateEventListener(this::onDrivingStateChanged);
mDrivingStateHelper.connectToCarService();
mPowerManagerHelper = new PowerManagerHelper(mContext, mCarPowerStateListener);
mPowerManagerHelper = mPowerManagerHelperLazy.get();
mPowerManagerHelper.setCarPowerStateListener(mCarPowerStateListener);
mPowerManagerHelper.connectToCarService();
}
@@ -592,20 +607,13 @@ public class CarStatusBar extends StatusBar implements CarBatteryController.Batt
});
CarNotificationListener carNotificationListener = new CarNotificationListener();
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);
});
mCarServiceProvider.addListener(car -> {
CarUxRestrictionsManager carUxRestrictionsManager =
(CarUxRestrictionsManager)
car.getCarManager(Car.CAR_UX_RESTRICTION_SERVICE);
mCarUxRestrictionManagerWrapper.setCarUxRestrictionsManager(
carUxRestrictionsManager);
});
mNotificationDataManager = new NotificationDataManager();
mNotificationDataManager.setOnUnseenCountUpdateListener(
@@ -974,8 +982,10 @@ public class CarStatusBar extends StatusBar implements CarBatteryController.Batt
UserSwitcherController userSwitcherController =
Dependency.get(UserSwitcherController.class);
if (userSwitcherController.useFullscreenUserSwitcher()) {
mFullscreenUserSwitcher = new FullscreenUserSwitcher(this,
mStatusBarWindow.findViewById(R.id.fullscreen_user_switcher_stub), mContext);
mFullscreenUserSwitcher = mFullscreenUserSwitcherLazy.get();
mFullscreenUserSwitcher.setStatusBar(this);
mFullscreenUserSwitcher.setContainer(
mStatusBarWindow.findViewById(R.id.fullscreen_user_switcher_stub));
} else {
super.createUserSwitcher();
}

View File

@@ -29,6 +29,7 @@ import com.android.systemui.UiOffloadThread;
import com.android.systemui.assist.AssistManager;
import com.android.systemui.broadcast.BroadcastDispatcher;
import com.android.systemui.bubbles.BubbleController;
import com.android.systemui.car.CarServiceProvider;
import com.android.systemui.colorextraction.SysuiColorExtractor;
import com.android.systemui.keyguard.DismissCallbackRegistry;
import com.android.systemui.keyguard.KeyguardViewMediator;
@@ -179,6 +180,10 @@ public class CarStatusBarModule {
StatusBarKeyguardViewManager statusBarKeyguardViewManager,
ViewMediatorCallback viewMediatorCallback,
DismissCallbackRegistry dismissCallbackRegistry,
CarServiceProvider carServiceProvider,
Lazy<DrivingStateHelper> drivingStateHelperLazy,
Lazy<PowerManagerHelper> powerManagerHelperLazy,
Lazy<FullscreenUserSwitcher> fullscreenUserSwitcherLazy,
CarNavigationBarController carNavigationBarController) {
return new CarStatusBar(
context,
@@ -250,6 +255,10 @@ public class CarStatusBarModule {
statusBarKeyguardViewManager,
viewMediatorCallback,
dismissCallbackRegistry,
carServiceProvider,
drivingStateHelperLazy,
powerManagerHelperLazy,
fullscreenUserSwitcherLazy,
carNavigationBarController);
}
}

View File

@@ -22,6 +22,7 @@ import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.content.res.Resources;
import android.graphics.PixelFormat;
import android.os.Handler;
import android.os.UserHandle;
@@ -36,15 +37,21 @@ import android.widget.TextView;
import com.android.internal.widget.LockPatternUtils;
import com.android.systemui.R;
import com.android.systemui.dagger.qualifiers.MainResources;
import javax.inject.Inject;
import javax.inject.Singleton;
/**
* A helper class displays an unlock dialog and receives broadcast about detecting trusted device
* & unlocking state to show the appropriate message on the dialog.
*/
@Singleton
class CarTrustAgentUnlockDialogHelper extends BroadcastReceiver{
private static final String TAG = CarTrustAgentUnlockDialogHelper.class.getSimpleName();
private final Context mContext;
private final Resources mResources;
private final WindowManager mWindowManager;
private final UserManager mUserManager;
private final WindowManager.LayoutParams mParams;
@@ -60,10 +67,13 @@ class CarTrustAgentUnlockDialogHelper extends BroadcastReceiver{
private boolean mIsDialogShowing;
private OnHideListener mOnHideListener;
CarTrustAgentUnlockDialogHelper(Context context) {
@Inject
CarTrustAgentUnlockDialogHelper(Context context, @MainResources Resources resources,
UserManager userManager, WindowManager windowManager) {
mContext = context;
mUserManager = mContext.getSystemService(UserManager.class);
mWindowManager = mContext.getSystemService(WindowManager.class);
mResources = resources;
mUserManager = userManager;
mWindowManager = windowManager;
mParams = createLayoutParams();
mFilter = getIntentFilter();
@@ -125,7 +135,7 @@ class CarTrustAgentUnlockDialogHelper extends BroadcastReceiver{
* @param listener listener that listens to dialog hide
*/
void showUnlockDialogAfterDelay(int uid, OnHideListener listener) {
long delayMillis = mContext.getResources().getInteger(R.integer.unlock_dialog_delay_ms);
long delayMillis = mResources.getInteger(R.integer.unlock_dialog_delay_ms);
showUnlockDialogAfterDelay(uid, delayMillis, listener);
}

View File

@@ -17,31 +17,43 @@
package com.android.systemui.statusbar.car;
import android.car.Car;
import android.car.Car.CarServiceLifecycleListener;
import android.car.drivingstate.CarDrivingStateEvent;
import android.car.drivingstate.CarDrivingStateManager;
import android.car.drivingstate.CarDrivingStateManager.CarDrivingStateEventListener;
import android.content.Context;
import android.util.Log;
import androidx.annotation.NonNull;
import com.android.systemui.car.CarServiceProvider;
import javax.inject.Inject;
import javax.inject.Singleton;
/**
* Helper class for connecting to the {@link CarDrivingStateManager} and listening for driving state
* changes.
*/
@Singleton
public class DrivingStateHelper {
public static final String TAG = "DrivingStateHelper";
private final Context mContext;
private final CarServiceProvider mCarServiceProvider;
private CarDrivingStateManager mDrivingStateManager;
private Car mCar;
private CarDrivingStateEventListener mDrivingStateHandler;
public DrivingStateHelper(Context context,
@NonNull CarDrivingStateEventListener drivingStateHandler) {
mContext = context;
mDrivingStateHandler = drivingStateHandler;
@Inject
public DrivingStateHelper(CarServiceProvider carServiceProvider) {
mCarServiceProvider = carServiceProvider;
}
/**
* Sets the {@link CarDrivingStateEventListener}. Should be set before calling {@link
* #connectToCarService()}.
*/
public void setCarDrivingStateEventListener(
@NonNull CarDrivingStateEventListener carDrivingStateEventListener) {
mDrivingStateHandler = carDrivingStateEventListener;
}
/**
@@ -64,25 +76,22 @@ public class DrivingStateHelper {
* Establishes connection with the Car service.
*/
public void connectToCarService() {
mCar = Car.createCar(mContext, /* handler= */ null, Car.CAR_WAIT_TIMEOUT_DO_NOT_WAIT,
mCarServiceLifecycleListener);
mCarServiceProvider.addListener(mCarServiceLifecycleListener);
}
private final CarServiceLifecycleListener mCarServiceLifecycleListener = (car, ready) -> {
if (!ready) {
return;
}
logD("Car Service connected");
mDrivingStateManager = (CarDrivingStateManager) car.getCarManager(
Car.CAR_DRIVING_STATE_SERVICE);
if (mDrivingStateManager != null) {
mDrivingStateManager.registerListener(mDrivingStateHandler);
mDrivingStateHandler.onDrivingStateChanged(
mDrivingStateManager.getCurrentCarDrivingState());
} else {
Log.e(TAG, "CarDrivingStateService service not available");
}
};
private final CarServiceProvider.CarServiceOnConnectedListener mCarServiceLifecycleListener =
car -> {
logD("Car Service connected");
mDrivingStateManager = (CarDrivingStateManager) car.getCarManager(
Car.CAR_DRIVING_STATE_SERVICE);
if (mDrivingStateManager != null) {
mDrivingStateManager.registerListener(mDrivingStateHandler);
mDrivingStateHandler.onDrivingStateChanged(
mDrivingStateManager.getCurrentCarDrivingState());
} else {
Log.e(TAG, "CarDrivingStateService service not available");
}
};
private void logD(String message) {
if (Log.isLoggable(TAG, Log.DEBUG)) {

View File

@@ -26,6 +26,7 @@ import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.content.pm.UserInfo;
import android.content.res.Resources;
import android.os.UserHandle;
import android.os.UserManager;
import android.util.Log;
@@ -35,24 +36,34 @@ import android.view.ViewStub;
import androidx.recyclerview.widget.GridLayoutManager;
import com.android.systemui.R;
import com.android.systemui.car.CarServiceProvider;
import com.android.systemui.dagger.qualifiers.MainResources;
import com.android.systemui.statusbar.car.CarTrustAgentUnlockDialogHelper.OnHideListener;
import com.android.systemui.statusbar.car.UserGridRecyclerView.UserRecord;
import javax.inject.Inject;
import javax.inject.Singleton;
/**
* Manages the fullscreen user switcher.
*/
@Singleton
public class FullscreenUserSwitcher {
private static final String TAG = FullscreenUserSwitcher.class.getSimpleName();
// Because user 0 is headless, user count for single user is 2
private static final int NUMBER_OF_BACKGROUND_USERS = 1;
private final UserGridRecyclerView mUserGridView;
private final View mParent;
private final int mShortAnimDuration;
private final CarStatusBar mStatusBar;
private final Context mContext;
private final Resources mResources;
private final UserManager mUserManager;
private final CarServiceProvider mCarServiceProvider;
private final CarTrustAgentUnlockDialogHelper mUnlockDialogHelper;
private final int mShortAnimDuration;
private CarStatusBar mStatusBar;
private View mParent;
private UserGridRecyclerView mUserGridView;
private CarTrustAgentEnrollmentManager mEnrollmentManager;
private CarTrustAgentUnlockDialogHelper mUnlockDialogHelper;
private UserGridRecyclerView.UserRecord mSelectedUser;
private CarUserManagerHelper mCarUserManagerHelper;
private final BroadcastReceiver mUserUnlockReceiver = new BroadcastReceiver() {
@@ -65,37 +76,46 @@ public class FullscreenUserSwitcher {
mContext.unregisterReceiver(mUserUnlockReceiver);
}
};
private final Car mCar;
public FullscreenUserSwitcher(CarStatusBar statusBar, ViewStub containerStub, Context context) {
mStatusBar = statusBar;
mParent = containerStub.inflate();
@Inject
public FullscreenUserSwitcher(
Context context,
@MainResources Resources resources,
UserManager userManager,
CarServiceProvider carServiceProvider,
CarTrustAgentUnlockDialogHelper carTrustAgentUnlockDialogHelper) {
mContext = context;
mResources = resources;
mUserManager = userManager;
mCarServiceProvider = carServiceProvider;
mUnlockDialogHelper = carTrustAgentUnlockDialogHelper;
mShortAnimDuration = mResources.getInteger(android.R.integer.config_shortAnimTime);
}
/** Sets the status bar which controls the keyguard. */
public void setStatusBar(CarStatusBar statusBar) {
mStatusBar = statusBar;
}
/** Sets the {@link ViewStub} to show the user switcher. */
public void setContainer(ViewStub containerStub) {
mParent = containerStub.inflate();
View container = mParent.findViewById(R.id.container);
// Initialize user grid.
mUserGridView = container.findViewById(R.id.user_grid);
GridLayoutManager layoutManager = new GridLayoutManager(context,
context.getResources().getInteger(R.integer.user_fullscreen_switcher_num_col));
GridLayoutManager layoutManager = new GridLayoutManager(mContext,
mResources.getInteger(R.integer.user_fullscreen_switcher_num_col));
mUserGridView.setLayoutManager(layoutManager);
mUserGridView.buildAdapter();
mUserGridView.setUserSelectionListener(this::onUserSelected);
mCarUserManagerHelper = new CarUserManagerHelper(context);
mUnlockDialogHelper = new CarTrustAgentUnlockDialogHelper(mContext);
mUserManager = mContext.getSystemService(UserManager.class);
mCarUserManagerHelper = new CarUserManagerHelper(mContext);
mCarServiceProvider.addListener(
car -> mEnrollmentManager = (CarTrustAgentEnrollmentManager) car.getCarManager(
Car.CAR_TRUST_AGENT_ENROLLMENT_SERVICE));
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);
if (mUserManager.isUserUnlocked(UserHandle.USER_SYSTEM)) {
// User0 is unlocked, switched to the initial user

View File

@@ -18,33 +18,33 @@ package com.android.systemui.statusbar.car;
import android.annotation.NonNull;
import android.car.Car;
import android.car.Car.CarServiceLifecycleListener;
import android.car.hardware.power.CarPowerManager;
import android.car.hardware.power.CarPowerManager.CarPowerStateListener;
import android.content.Context;
import android.util.Log;
import com.android.systemui.car.CarServiceProvider;
import javax.inject.Inject;
import javax.inject.Singleton;
/**
* Helper class for connecting to the {@link CarPowerManager} and listening for power state changes.
*/
@Singleton
public class PowerManagerHelper {
public static final String TAG = "PowerManagerHelper";
private final Context mContext;
private final CarPowerStateListener mCarPowerStateListener;
private final CarServiceProvider mCarServiceProvider;
private Car mCar;
private CarPowerManager mCarPowerManager;
private CarPowerStateListener mCarPowerStateListener;
private final CarServiceLifecycleListener mCarServiceLifecycleListener;
private final CarServiceProvider.CarServiceOnConnectedListener mCarServiceLifecycleListener;
PowerManagerHelper(Context context, @NonNull CarPowerStateListener listener) {
mContext = context;
mCarPowerStateListener = listener;
mCarServiceLifecycleListener = (car, ready) -> {
if (!ready) {
return;
}
@Inject
PowerManagerHelper(CarServiceProvider carServiceProvider) {
mCarServiceProvider = carServiceProvider;
mCarServiceLifecycleListener = car -> {
Log.d(TAG, "Car Service connected");
mCarPowerManager = (CarPowerManager) car.getCarManager(Car.POWER_SERVICE);
if (mCarPowerManager != null) {
@@ -55,11 +55,17 @@ public class PowerManagerHelper {
};
}
/**
* Sets a {@link CarPowerStateListener}. Should be set before {@link #connectToCarService()}.
*/
void setCarPowerStateListener(@NonNull CarPowerStateListener listener) {
mCarPowerStateListener = listener;
}
/**
* Connect to Car service.
*/
void connectToCarService() {
mCar = Car.createCar(mContext, /* handler= */ null, Car.CAR_WAIT_TIMEOUT_DO_NOT_WAIT,
mCarServiceLifecycleListener);
mCarServiceProvider.addListener(mCarServiceLifecycleListener);
}
}

View File

@@ -20,15 +20,14 @@ 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.Context;
import android.os.Handler;
import android.util.Log;
import com.android.systemui.car.CarServiceProvider;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
@@ -37,19 +36,18 @@ import java.util.Map;
import java.util.Objects;
import javax.inject.Inject;
import javax.inject.Singleton;
/**
* Manages the connection to the Car service and delegates value changes to the registered
* {@link TemperatureView}s
*/
@Singleton
public class HvacController {
public static final String TAG = "HvacController";
public static final int BIND_TO_HVAC_RETRY_DELAY = 5000;
private Context mContext;
private Handler mHandler;
private Car mCar;
private final CarServiceProvider mCarServiceProvider;
private CarHvacManager mHvacManager;
private HashMap<HvacKey, List<TemperatureView>> mTempComponents = new HashMap<>();
@@ -85,22 +83,20 @@ public class HvacController {
}
};
private final CarServiceLifecycleListener mCarServiceLifecycleListener = (car, ready) -> {
if (!ready) {
return;
}
try {
mHvacManager = (CarHvacManager) car.getCarManager(Car.HVAC_SERVICE);
mHvacManager.registerCallback(mHardwareCallback);
initComponents();
} catch (Exception e) {
Log.e(TAG, "Failed to correctly connect to HVAC", e);
}
};
private final CarServiceProvider.CarServiceOnConnectedListener mCarServiceLifecycleListener =
car -> {
try {
mHvacManager = (CarHvacManager) car.getCarManager(Car.HVAC_SERVICE);
mHvacManager.registerCallback(mHardwareCallback);
initComponents();
} catch (Exception e) {
Log.e(TAG, "Failed to correctly connect to HVAC", e);
}
};
@Inject
public HvacController(Context context) {
mContext = context;
public HvacController(CarServiceProvider carServiceProvider) {
mCarServiceProvider = carServiceProvider;
}
/**
@@ -108,9 +104,7 @@ public class HvacController {
* ({@link CarHvacManager}) will happen on the same thread this method was called from.
*/
public void connectToCarService() {
mHandler = new Handler();
mCar = Car.createCar(mContext, /* handler= */ mHandler, Car.CAR_WAIT_TIMEOUT_DO_NOT_WAIT,
mCarServiceLifecycleListener);
mCarServiceProvider.addListener(mCarServiceLifecycleListener);
}
/**

View File

@@ -18,6 +18,7 @@ package com.android.systemui.volume;
import android.content.Context;
import com.android.systemui.car.CarServiceProvider;
import com.android.systemui.keyguard.KeyguardViewMediator;
import com.android.systemui.plugins.VolumeDialog;
@@ -30,13 +31,20 @@ import javax.inject.Singleton;
@Singleton
public class CarVolumeDialogComponent extends VolumeDialogComponent {
private CarVolumeDialogImpl mCarVolumeDialog;
@Inject
public CarVolumeDialogComponent(Context context, KeyguardViewMediator keyguardViewMediator,
VolumeDialogControllerImpl volumeDialogController) {
VolumeDialogControllerImpl volumeDialogController,
CarServiceProvider carServiceProvider) {
super(context, keyguardViewMediator, volumeDialogController);
mCarVolumeDialog.setCarServiceProvider(carServiceProvider);
}
/** This method is called while calling the super constructor. */
@Override
protected VolumeDialog createDefault() {
return new CarVolumeDialogImpl(mContext);
mCarVolumeDialog = new CarVolumeDialogImpl(mContext);
return mCarVolumeDialog;
}
}

View File

@@ -24,7 +24,6 @@ import android.annotation.Nullable;
import android.app.Dialog;
import android.app.KeyguardManager;
import android.car.Car;
import android.car.Car.CarServiceLifecycleListener;
import android.car.media.CarAudioManager;
import android.content.Context;
import android.content.DialogInterface;
@@ -56,6 +55,7 @@ import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;
import com.android.systemui.R;
import com.android.systemui.car.CarServiceProvider;
import com.android.systemui.plugins.VolumeDialog;
import org.xmlpull.v1.XmlPullParserException;
@@ -95,7 +95,6 @@ public class CarVolumeDialogImpl implements VolumeDialog {
private CustomDialog mDialog;
private RecyclerView mListView;
private CarVolumeItemAdapter mVolumeItemsAdapter;
private Car mCar;
private CarAudioManager mCarAudioManager;
private boolean mHovering;
private int mCurrentlyDisplayingGroupId;
@@ -147,30 +146,28 @@ public class CarVolumeDialogImpl implements VolumeDialog {
}
};
private final CarServiceLifecycleListener mCarServiceLifecycleListener = (car, ready) -> {
if (!ready) {
return;
}
mExpanded = false;
mCarAudioManager = (CarAudioManager) car.getCarManager(Car.AUDIO_SERVICE);
int volumeGroupCount = mCarAudioManager.getVolumeGroupCount();
// Populates volume slider items from volume groups to UI.
for (int groupId = 0; groupId < volumeGroupCount; groupId++) {
VolumeItem volumeItem = getVolumeItemForUsages(
mCarAudioManager.getUsagesForVolumeGroupId(groupId));
mAvailableVolumeItems.add(volumeItem);
// The first one is the default item.
if (groupId == 0) {
clearAllAndSetupDefaultCarVolumeLineItem(0);
}
}
private final CarServiceProvider.CarServiceOnConnectedListener mCarServiceOnConnectedListener =
car -> {
mExpanded = false;
mCarAudioManager = (CarAudioManager) car.getCarManager(Car.AUDIO_SERVICE);
int volumeGroupCount = mCarAudioManager.getVolumeGroupCount();
// Populates volume slider items from volume groups to UI.
for (int groupId = 0; groupId < volumeGroupCount; groupId++) {
VolumeItem volumeItem = getVolumeItemForUsages(
mCarAudioManager.getUsagesForVolumeGroupId(groupId));
mAvailableVolumeItems.add(volumeItem);
// The first one is the default item.
if (groupId == 0) {
clearAllAndSetupDefaultCarVolumeLineItem(0);
}
}
// If list is already initiated, update its content.
if (mVolumeItemsAdapter != null) {
mVolumeItemsAdapter.notifyDataSetChanged();
}
mCarAudioManager.registerCarVolumeCallback(mVolumeChangeCallback);
};
// If list is already initiated, update its content.
if (mVolumeItemsAdapter != null) {
mVolumeItemsAdapter.notifyDataSetChanged();
}
mCarAudioManager.registerCarVolumeCallback(mVolumeChangeCallback);
};
public CarVolumeDialogImpl(Context context) {
mContext = context;
@@ -181,6 +178,11 @@ public class CarVolumeDialogImpl implements VolumeDialog {
R.integer.car_volume_dialog_display_hovering_timeout);
}
/** Sets a {@link CarServiceProvider} which connects to the audio service. */
public void setCarServiceProvider(CarServiceProvider carServiceProvider) {
carServiceProvider.addListener(mCarServiceOnConnectedListener);
}
private static int getSeekbarValue(CarAudioManager carAudioManager, int volumeGroupId) {
return carAudioManager.getGroupVolume(volumeGroupId);
}
@@ -196,8 +198,6 @@ public class CarVolumeDialogImpl implements VolumeDialog {
@Override
public void init(int windowType, Callback callback) {
initDialog();
mCar = Car.createCar(mContext, /* handler= */ null, Car.CAR_WAIT_TIMEOUT_DO_NOT_WAIT,
mCarServiceLifecycleListener);
}
@Override
@@ -205,12 +205,6 @@ public class CarVolumeDialogImpl implements VolumeDialog {
mHandler.removeCallbacksAndMessages(/* token= */ null);
cleanupAudioManager();
// unregisterVolumeCallback is not being called when disconnect car, so we manually cleanup
// audio manager beforehand.
if (mCar != null) {
mCar.disconnect();
mCar = null;
}
}
private void initDialog() {