DO NOT MERGE Create a single provider of car service

am: e0e71bcabb

Change-Id: Ie13dac4c3df795bc0a20acc8b765a7c60fcb8d3e
This commit is contained in:
Heemin Seog
2019-11-13 12:45:12 -08:00
committed by android-build-merger
8 changed files with 98 additions and 31 deletions

View File

@@ -20,6 +20,7 @@ import android.content.Context;
import com.android.internal.widget.LockPatternUtils; import com.android.internal.widget.LockPatternUtils;
import com.android.keyguard.ViewMediatorCallback; import com.android.keyguard.ViewMediatorCallback;
import com.android.systemui.car.CarServiceProvider;
import com.android.systemui.statusbar.car.CarFacetButtonController; import com.android.systemui.statusbar.car.CarFacetButtonController;
import com.android.systemui.statusbar.car.CarStatusBarKeyguardViewManager; import com.android.systemui.statusbar.car.CarStatusBarKeyguardViewManager;
import com.android.systemui.statusbar.phone.StatusBarKeyguardViewManager; import com.android.systemui.statusbar.phone.StatusBarKeyguardViewManager;
@@ -36,6 +37,7 @@ import dagger.Component;
public class CarSystemUIFactory extends SystemUIFactory { public class CarSystemUIFactory extends SystemUIFactory {
private CarDependencyComponent mCarDependencyComponent; private CarDependencyComponent mCarDependencyComponent;
private CarServiceProvider mCarServiceProvider;
@Override @Override
protected SystemUIRootComponent buildSystemUIRootComponent(Context context) { protected SystemUIRootComponent buildSystemUIRootComponent(Context context) {
@@ -48,6 +50,14 @@ public class CarSystemUIFactory extends SystemUIFactory {
.build(); .build();
} }
/** Gets a {@link CarServiceProvider}. */
public CarServiceProvider getCarServiceProvider(Context context) {
if (mCarServiceProvider == null) {
mCarServiceProvider = new CarServiceProvider(context);
}
return mCarServiceProvider;
}
public CarDependencyComponent getCarDependencyComponent() { public CarDependencyComponent getCarDependencyComponent() {
return mCarDependencyComponent; return mCarDependencyComponent;
} }

View File

@@ -0,0 +1,59 @@
/*
* 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.car.Car.CarServiceLifecycleListener;
import android.content.Context;
import java.util.ArrayList;
import java.util.List;
/**
* Connects to the car service a single time for shared use across all of system ui.
*/
public class CarServiceProvider {
private final Context mContext;
private final List<CarServiceLifecycleListener> mListeners = new ArrayList<>();
private Car mCar;
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 (CarServiceLifecycleListener listener : mListeners) {
listener.onLifecycleChanged(mCar, ready);
}
}
});
}
/**
* 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(CarServiceLifecycleListener listener) {
if (mCar.isConnected()) {
listener.onLifecycleChanged(mCar, /* ready= */ true);
}
mListeners.add(listener);
}
}

View File

@@ -199,6 +199,10 @@ public class CarStatusBar extends StatusBar implements CarBatteryController.Batt
@Override @Override
public void start() { public void start() {
// Non blocking call to connect to car service. Call this early so that we'll be connected
// asap.
((CarSystemUIFactory) SystemUIFactory.getInstance()).getCarServiceProvider(mContext);
// get the provisioned state before calling the parent class since it's that flow that // get the provisioned state before calling the parent class since it's that flow that
// builds the nav bar // builds the nav bar
mDeviceProvisionedController = Dependency.get(DeviceProvisionedController.class); mDeviceProvisionedController = Dependency.get(DeviceProvisionedController.class);
@@ -482,11 +486,8 @@ public class CarStatusBar extends StatusBar implements CarBatteryController.Batt
CarNotificationListener carNotificationListener = new CarNotificationListener(); CarNotificationListener carNotificationListener = new CarNotificationListener();
mCarUxRestrictionManagerWrapper = new CarUxRestrictionManagerWrapper(); mCarUxRestrictionManagerWrapper = new CarUxRestrictionManagerWrapper();
// This can take time if car service is not ready up to this time. ((CarSystemUIFactory) SystemUIFactory.getInstance()).getCarServiceProvider(mContext)
// TODO(b/142808072) Refactor CarUxRestrictionManagerWrapper to allow setting .addListener((car, ready) -> {
// 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) { if (!ready) {
return; return;
} }

View File

@@ -26,6 +26,9 @@ import android.util.Log;
import androidx.annotation.NonNull; import androidx.annotation.NonNull;
import com.android.systemui.CarSystemUIFactory;
import com.android.systemui.SystemUIFactory;
/** /**
* Helper class for connecting to the {@link CarDrivingStateManager} and listening for driving state * Helper class for connecting to the {@link CarDrivingStateManager} and listening for driving state
* changes. * changes.
@@ -35,7 +38,6 @@ public class DrivingStateHelper {
private final Context mContext; private final Context mContext;
private CarDrivingStateManager mDrivingStateManager; private CarDrivingStateManager mDrivingStateManager;
private Car mCar;
private CarDrivingStateEventListener mDrivingStateHandler; private CarDrivingStateEventListener mDrivingStateHandler;
public DrivingStateHelper(Context context, public DrivingStateHelper(Context context,
@@ -64,8 +66,8 @@ public class DrivingStateHelper {
* Establishes connection with the Car service. * Establishes connection with the Car service.
*/ */
public void connectToCarService() { public void connectToCarService() {
mCar = Car.createCar(mContext, /* handler= */ null, Car.CAR_WAIT_TIMEOUT_DO_NOT_WAIT, ((CarSystemUIFactory) SystemUIFactory.getInstance()).getCarServiceProvider(mContext)
mCarServiceLifecycleListener); .addListener(mCarServiceLifecycleListener);
} }
private final CarServiceLifecycleListener mCarServiceLifecycleListener = (car, ready) -> { private final CarServiceLifecycleListener mCarServiceLifecycleListener = (car, ready) -> {

View File

@@ -34,7 +34,9 @@ import android.view.ViewStub;
import androidx.recyclerview.widget.GridLayoutManager; import androidx.recyclerview.widget.GridLayoutManager;
import com.android.systemui.CarSystemUIFactory;
import com.android.systemui.R; import com.android.systemui.R;
import com.android.systemui.SystemUIFactory;
import com.android.systemui.statusbar.car.CarTrustAgentUnlockDialogHelper.OnHideListener; import com.android.systemui.statusbar.car.CarTrustAgentUnlockDialogHelper.OnHideListener;
import com.android.systemui.statusbar.car.UserGridRecyclerView.UserRecord; import com.android.systemui.statusbar.car.UserGridRecyclerView.UserRecord;
@@ -65,7 +67,6 @@ public class FullscreenUserSwitcher {
mContext.unregisterReceiver(mUserUnlockReceiver); mContext.unregisterReceiver(mUserUnlockReceiver);
} }
}; };
private final Car mCar;
public FullscreenUserSwitcher(CarStatusBar statusBar, ViewStub containerStub, Context context) { public FullscreenUserSwitcher(CarStatusBar statusBar, ViewStub containerStub, Context context) {
mStatusBar = statusBar; mStatusBar = statusBar;
@@ -85,8 +86,8 @@ public class FullscreenUserSwitcher {
mUnlockDialogHelper = new CarTrustAgentUnlockDialogHelper(mContext); mUnlockDialogHelper = new CarTrustAgentUnlockDialogHelper(mContext);
mUserManager = mContext.getSystemService(UserManager.class); mUserManager = mContext.getSystemService(UserManager.class);
mCar = Car.createCar(mContext, /* handler= */ null, Car.CAR_WAIT_TIMEOUT_DO_NOT_WAIT, ((CarSystemUIFactory) SystemUIFactory.getInstance()).getCarServiceProvider(mContext)
(car, ready) -> { .addListener((car, ready) -> {
if (!ready) { if (!ready) {
return; return;
} }

View File

@@ -24,6 +24,9 @@ import android.car.hardware.power.CarPowerManager.CarPowerStateListener;
import android.content.Context; import android.content.Context;
import android.util.Log; import android.util.Log;
import com.android.systemui.CarSystemUIFactory;
import com.android.systemui.SystemUIFactory;
/** /**
* Helper class for connecting to the {@link CarPowerManager} and listening for power state changes. * Helper class for connecting to the {@link CarPowerManager} and listening for power state changes.
*/ */
@@ -33,7 +36,6 @@ public class PowerManagerHelper {
private final Context mContext; private final Context mContext;
private final CarPowerStateListener mCarPowerStateListener; private final CarPowerStateListener mCarPowerStateListener;
private Car mCar;
private CarPowerManager mCarPowerManager; private CarPowerManager mCarPowerManager;
private final CarServiceLifecycleListener mCarServiceLifecycleListener; private final CarServiceLifecycleListener mCarServiceLifecycleListener;
@@ -59,7 +61,7 @@ public class PowerManagerHelper {
* Connect to Car service. * Connect to Car service.
*/ */
void connectToCarService() { void connectToCarService() {
mCar = Car.createCar(mContext, /* handler= */ null, Car.CAR_WAIT_TIMEOUT_DO_NOT_WAIT, ((CarSystemUIFactory) SystemUIFactory.getInstance()).getCarServiceProvider(mContext)
mCarServiceLifecycleListener); .addListener(mCarServiceLifecycleListener);
} }
} }

View File

@@ -26,9 +26,11 @@ import android.car.hardware.CarPropertyValue;
import android.car.hardware.hvac.CarHvacManager; import android.car.hardware.hvac.CarHvacManager;
import android.car.hardware.hvac.CarHvacManager.CarHvacEventCallback; import android.car.hardware.hvac.CarHvacManager.CarHvacEventCallback;
import android.content.Context; import android.content.Context;
import android.os.Handler;
import android.util.Log; import android.util.Log;
import com.android.systemui.CarSystemUIFactory;
import com.android.systemui.SystemUIFactory;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.HashMap; import java.util.HashMap;
import java.util.Iterator; import java.util.Iterator;
@@ -41,13 +43,9 @@ import java.util.Objects;
* {@link TemperatureView}s * {@link TemperatureView}s
*/ */
public class HvacController { public class HvacController {
public static final String TAG = "HvacController"; public static final String TAG = "HvacController";
public static final int BIND_TO_HVAC_RETRY_DELAY = 5000;
private Context mContext; private Context mContext;
private Handler mHandler;
private Car mCar;
private CarHvacManager mHvacManager; private CarHvacManager mHvacManager;
private HashMap<HvacKey, List<TemperatureView>> mTempComponents = new HashMap<>(); private HashMap<HvacKey, List<TemperatureView>> mTempComponents = new HashMap<>();
@@ -105,9 +103,8 @@ public class HvacController {
* ({@link CarHvacManager}) will happen on the same thread this method was called from. * ({@link CarHvacManager}) will happen on the same thread this method was called from.
*/ */
public void connectToCarService() { public void connectToCarService() {
mHandler = new Handler(); ((CarSystemUIFactory) SystemUIFactory.getInstance()).getCarServiceProvider(mContext)
mCar = Car.createCar(mContext, /* handler= */ mHandler, Car.CAR_WAIT_TIMEOUT_DO_NOT_WAIT, .addListener(mCarServiceLifecycleListener);
mCarServiceLifecycleListener);
} }
/** /**

View File

@@ -55,7 +55,9 @@ import android.widget.SeekBar.OnSeekBarChangeListener;
import androidx.recyclerview.widget.LinearLayoutManager; import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView; import androidx.recyclerview.widget.RecyclerView;
import com.android.systemui.CarSystemUIFactory;
import com.android.systemui.R; import com.android.systemui.R;
import com.android.systemui.SystemUIFactory;
import com.android.systemui.plugins.VolumeDialog; import com.android.systemui.plugins.VolumeDialog;
import org.xmlpull.v1.XmlPullParserException; import org.xmlpull.v1.XmlPullParserException;
@@ -95,7 +97,6 @@ public class CarVolumeDialogImpl implements VolumeDialog {
private CustomDialog mDialog; private CustomDialog mDialog;
private RecyclerView mListView; private RecyclerView mListView;
private CarVolumeItemAdapter mVolumeItemsAdapter; private CarVolumeItemAdapter mVolumeItemsAdapter;
private Car mCar;
private CarAudioManager mCarAudioManager; private CarAudioManager mCarAudioManager;
private boolean mHovering; private boolean mHovering;
private int mCurrentlyDisplayingGroupId; private int mCurrentlyDisplayingGroupId;
@@ -196,8 +197,8 @@ public class CarVolumeDialogImpl implements VolumeDialog {
@Override @Override
public void init(int windowType, Callback callback) { public void init(int windowType, Callback callback) {
initDialog(); initDialog();
mCar = Car.createCar(mContext, /* handler= */ null, Car.CAR_WAIT_TIMEOUT_DO_NOT_WAIT, ((CarSystemUIFactory) SystemUIFactory.getInstance()).getCarServiceProvider(mContext)
mCarServiceLifecycleListener); .addListener(mCarServiceLifecycleListener);
} }
@Override @Override
@@ -205,12 +206,6 @@ public class CarVolumeDialogImpl implements VolumeDialog {
mHandler.removeCallbacksAndMessages(/* token= */ null); mHandler.removeCallbacksAndMessages(/* token= */ null);
cleanupAudioManager(); 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() { private void initDialog() {