Merge "Refactor BluetoothRouteProvider"

This commit is contained in:
Sungsoo Lim
2020-02-17 00:24:12 +00:00
committed by Android (Google) Code Review
2 changed files with 52 additions and 56 deletions

View File

@@ -29,7 +29,6 @@ import android.content.Intent;
import android.content.IntentFilter;
import android.media.AudioManager;
import android.media.MediaRoute2Info;
import android.text.TextUtils;
import android.util.Slog;
import android.util.SparseBooleanArray;
@@ -49,6 +48,8 @@ class BluetoothRouteProvider {
@SuppressWarnings("WeakerAccess") /* synthetic access */
final Map<String, BluetoothRouteInfo> mBluetoothRoutes = new HashMap<>();
@SuppressWarnings("WeakerAccess") /* synthetic access */
BluetoothRouteInfo mSelectedRoute = null;
@SuppressWarnings("WeakerAccess") /* synthetic access */
BluetoothA2dp mA2dpProfile;
@SuppressWarnings("WeakerAccess") /* synthetic access */
BluetoothHearingAid mHearingAidProfile;
@@ -62,8 +63,6 @@ class BluetoothRouteProvider {
private final BroadcastReceiver mBroadcastReceiver = new BluetoothBroadcastReceiver();
private final BluetoothProfileListener mProfileListener = new BluetoothProfileListener();
private BluetoothDevice mActiveDevice = null;
static synchronized BluetoothRouteProvider getInstance(@NonNull Context context,
@NonNull BluetoothRoutesUpdatedListener listener) {
Objects.requireNonNull(context);
@@ -108,27 +107,21 @@ class BluetoothRouteProvider {
}
/**
* Clears the active device for all known profiles.
* Transfers to a given bluetooth route.
* The dedicated BT device with the route would be activated.
*
* @param routeId the id of the Bluetooth device. {@code null} denotes to clear the use of
* BT routes.
*/
public void clearActiveDevices() {
BluetoothA2dp a2dpProfile = mA2dpProfile;
BluetoothHearingAid hearingAidProfile = mHearingAidProfile;
if (a2dpProfile != null) {
a2dpProfile.setActiveDevice(null);
public void transferTo(@Nullable String routeId) {
if (routeId == null) {
clearActiveDevices();
return;
}
if (hearingAidProfile != null) {
hearingAidProfile.setActiveDevice(null);
}
}
/**
* Sets the active device.
* @param deviceId the id of the Bluetooth device
*/
public void setActiveDevice(@NonNull String deviceId) {
BluetoothRouteInfo btRouteInfo = mBluetoothRoutes.get(deviceId);
BluetoothRouteInfo btRouteInfo = mBluetoothRoutes.get(routeId);
if (btRouteInfo == null) {
Slog.w(TAG, "setActiveDevice: unknown device id=" + deviceId);
Slog.w(TAG, "setActiveDevice: unknown route id=" + routeId);
return;
}
BluetoothA2dp a2dpProfile = mA2dpProfile;
@@ -144,6 +137,20 @@ class BluetoothRouteProvider {
}
}
/**
* Clears the active device for all known profiles.
*/
private void clearActiveDevices() {
BluetoothA2dp a2dpProfile = mA2dpProfile;
BluetoothHearingAid hearingAidProfile = mHearingAidProfile;
if (a2dpProfile != null) {
a2dpProfile.setActiveDevice(null);
}
if (hearingAidProfile != null) {
hearingAidProfile.setActiveDevice(null);
}
}
private void addEventReceiver(String action, BluetoothEventReceiver eventReceiver) {
mEventReceiverMap.put(action, eventReceiver);
mIntentFilter.addAction(action);
@@ -159,7 +166,8 @@ class BluetoothRouteProvider {
}
}
@NonNull List<MediaRoute2Info> getBluetoothRoutes() {
@NonNull
List<MediaRoute2Info> getAllBluetoothRoutes() {
ArrayList<MediaRoute2Info> routes = new ArrayList<>();
for (BluetoothRouteInfo btRoute : mBluetoothRoutes.values()) {
routes.add(btRoute.route);
@@ -167,17 +175,14 @@ class BluetoothRouteProvider {
return routes;
}
@Nullable String getActiveDeviceAddress() {
BluetoothDevice device = mActiveDevice;
if (device == null) {
return null;
}
return device.getAddress();
@Nullable
String getSelectedRouteId() {
return mSelectedRoute == null ? null : mSelectedRoute.route.getId();
}
private void notifyBluetoothRoutesUpdated() {
if (mListener != null) {
mListener.onBluetoothRoutesUpdated(getBluetoothRoutes());
mListener.onBluetoothRoutesUpdated(getAllBluetoothRoutes());
}
}
@@ -198,15 +203,10 @@ class BluetoothRouteProvider {
return newBtRoute;
}
private void setRouteConnectionStateForDevice(BluetoothDevice device,
private void setRouteConnectionState(@NonNull BluetoothRouteInfo btRoute,
@MediaRoute2Info.ConnectionState int state) {
if (device == null) {
Slog.w(TAG, "setRouteConnectionStateForDevice: device shouldn't be null");
return;
}
BluetoothRouteInfo btRoute = mBluetoothRoutes.get(device.getAddress());
if (btRoute == null) {
Slog.w(TAG, "setRouteConnectionStateForDevice: route shouldn't be null");
Slog.w(TAG, "setRouteConnectionState: route shouldn't be null");
return;
}
if (btRoute.route.getConnectionState() == state) {
@@ -260,8 +260,8 @@ class BluetoothRouteProvider {
mBluetoothRoutes.put(device.getAddress(), btRoute);
}
if (activeDevices.contains(device)) {
mActiveDevice = device;
setRouteConnectionStateForDevice(device,
mSelectedRoute = btRoute;
setRouteConnectionState(mSelectedRoute,
MediaRoute2Info.CONNECTION_STATE_CONNECTED);
}
@@ -344,20 +344,18 @@ class BluetoothRouteProvider {
public void onReceive(Context context, Intent intent, BluetoothDevice device) {
switch (intent.getAction()) {
case BluetoothA2dp.ACTION_ACTIVE_DEVICE_CHANGED:
String prevActiveDeviceAddress =
(mActiveDevice == null) ? null : mActiveDevice.getAddress();
String curActiveDeviceAddress =
(device == null) ? null : device.getAddress();
if (!TextUtils.equals(prevActiveDeviceAddress, curActiveDeviceAddress)) {
if (mActiveDevice != null) {
setRouteConnectionStateForDevice(mActiveDevice,
if (mSelectedRoute == null
|| !mSelectedRoute.btDevice.equals(device)) {
if (mSelectedRoute != null) {
setRouteConnectionState(mSelectedRoute,
MediaRoute2Info.CONNECTION_STATE_DISCONNECTED);
}
if (device != null) {
setRouteConnectionStateForDevice(device,
mSelectedRoute = (device == null) ? null
: mBluetoothRoutes.get(device.getAddress());
if (mSelectedRoute != null) {
setRouteConnectionState(mSelectedRoute,
MediaRoute2Info.CONNECTION_STATE_CONNECTED);
}
mActiveDevice = device;
notifyBluetoothRoutesUpdated();
}
break;
@@ -386,10 +384,8 @@ class BluetoothRouteProvider {
btRoute.connectedProfiles.delete(profile);
if (btRoute.connectedProfiles.size() == 0) {
mBluetoothRoutes.remove(device.getAddress());
if (mActiveDevice != null
&& TextUtils.equals(mActiveDevice.getAddress(),
device.getAddress())) {
mActiveDevice = null;
if (mSelectedRoute != null && mSelectedRoute.btDevice.equals(device)) {
mSelectedRoute = null;
}
notifyBluetoothRoutesUpdated();
}

View File

@@ -145,9 +145,9 @@ class SystemMediaRoute2Provider extends MediaRoute2Provider {
@Override
public void transferToRoute(String sessionId, String routeId) {
if (TextUtils.equals(routeId, mDefaultRoute.getId())) {
mBtRouteProvider.clearActiveDevices();
mBtRouteProvider.transferTo(null);
} else {
mBtRouteProvider.setActiveDevice(routeId);
mBtRouteProvider.transferTo(routeId);
}
}
@@ -196,7 +196,7 @@ class SystemMediaRoute2Provider extends MediaRoute2Provider {
}
private void initializeSessionInfo() {
mBluetoothRoutes = mBtRouteProvider.getBluetoothRoutes();
mBluetoothRoutes = mBtRouteProvider.getAllBluetoothRoutes();
MediaRoute2ProviderInfo.Builder builder = new MediaRoute2ProviderInfo.Builder();
builder.addRoute(mDefaultRoute);
@@ -251,7 +251,7 @@ class SystemMediaRoute2Provider extends MediaRoute2Provider {
RoutingSessionInfo.Builder builder = new RoutingSessionInfo.Builder(
SYSTEM_SESSION_ID, "" /* clientPackageName */)
.setSystemSession(true);
String activeBtDeviceAddress = mBtRouteProvider.getActiveDeviceAddress();
String activeBtDeviceAddress = mBtRouteProvider.getSelectedRouteId();
mSelectedRouteId = TextUtils.isEmpty(activeBtDeviceAddress) ? mDefaultRoute.getId()
: activeBtDeviceAddress;
builder.addSelectedRoute(mSelectedRouteId);
@@ -311,7 +311,7 @@ class SystemMediaRoute2Provider extends MediaRoute2Provider {
AudioManager.EXTRA_PREV_VOLUME_STREAM_VALUE, 0);
if (newVolume != oldVolume) {
String activeBtDeviceAddress = mBtRouteProvider.getActiveDeviceAddress();
String activeBtDeviceAddress = mBtRouteProvider.getSelectedRouteId();
if (!TextUtils.isEmpty(activeBtDeviceAddress)) {
for (int i = mBluetoothRoutes.size() - 1; i >= 0; i--) {
MediaRoute2Info route = mBluetoothRoutes.get(i);