[VolumePanel] Fix the Hearable control slice uri parameter

The provided uri doesn't contain the formatted string, so just append
the width at the end

Bug: 229048602
Test: make -j64 RunSettingsRoboTests
Change-Id: Idadbb4d725c8ca65bac31fbead8ac1d429ebcea9
This commit is contained in:
Alan Huang
2022-05-27 21:28:58 +00:00
parent 610538e10b
commit b9be27b006
2 changed files with 34 additions and 12 deletions

View File

@@ -22,6 +22,7 @@ import static android.os.UserManager.DISALLOW_CONFIG_BLUETOOTH;
import android.app.settings.SettingsEnums; import android.app.settings.SettingsEnums;
import android.bluetooth.BluetoothDevice; import android.bluetooth.BluetoothDevice;
import android.content.Context; import android.content.Context;
import android.content.res.TypedArray;
import android.net.Uri; import android.net.Uri;
import android.os.Bundle; import android.os.Bundle;
import android.provider.DeviceConfig; import android.provider.DeviceConfig;
@@ -49,7 +50,6 @@ import com.android.settingslib.core.AbstractPreferenceController;
import com.android.settingslib.core.lifecycle.Lifecycle; import com.android.settingslib.core.lifecycle.Lifecycle;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.IllegalFormatException;
import java.util.List; import java.util.List;
public class BluetoothDeviceDetailsFragment extends RestrictedDashboardFragment { public class BluetoothDeviceDetailsFragment extends RestrictedDashboardFragment {
@@ -136,7 +136,6 @@ public class BluetoothDeviceDetailsFragment extends RestrictedDashboardFragment
use(BlockingSlicePrefController.class).setSliceUri(sliceEnabled use(BlockingSlicePrefController.class).setSliceUri(sliceEnabled
? featureProvider.getBluetoothDeviceSettingsUri(mCachedDevice.getDevice()) ? featureProvider.getBluetoothDeviceSettingsUri(mCachedDevice.getDevice())
: null); : null);
updateExtraControlUri(/* viewWidth */ 0);
} }
private void updateExtraControlUri(int viewWidth) { private void updateExtraControlUri(int viewWidth) {
@@ -148,13 +147,14 @@ public class BluetoothDeviceDetailsFragment extends RestrictedDashboardFragment
String uri = featureProvider.getBluetoothDeviceControlUri(mCachedDevice.getDevice()); String uri = featureProvider.getBluetoothDeviceControlUri(mCachedDevice.getDevice());
if (!TextUtils.isEmpty(uri)) { if (!TextUtils.isEmpty(uri)) {
try { try {
controlUri = Uri.parse(String.format(uri, viewWidth)); controlUri = Uri.parse(uri + viewWidth);
} catch (IllegalFormatException | NullPointerException exception) { } catch (NullPointerException exception) {
Log.d(TAG, "unable to parse uri"); Log.d(TAG, "unable to parse uri");
controlUri = null; controlUri = null;
} }
} }
use(SlicePreferenceController.class).setSliceUri(sliceEnabled ? controlUri : null); use(SlicePreferenceController.class).setSliceUri(sliceEnabled ? controlUri : null);
use(SlicePreferenceController.class).onStart();
} }
private final ViewTreeObserver.OnGlobalLayoutListener mOnGlobalLayoutListener = private final ViewTreeObserver.OnGlobalLayoutListener mOnGlobalLayoutListener =
@@ -165,7 +165,10 @@ public class BluetoothDeviceDetailsFragment extends RestrictedDashboardFragment
if (view == null) { if (view == null) {
return; return;
} }
updateExtraControlUri(view.getWidth()); if (view.getWidth() <= 0) {
return;
}
updateExtraControlUri(view.getWidth() - getPaddingSize());
view.getViewTreeObserver().removeOnGlobalLayoutListener( view.getViewTreeObserver().removeOnGlobalLayoutListener(
mOnGlobalLayoutListener); mOnGlobalLayoutListener);
} }
@@ -251,4 +254,17 @@ public class BluetoothDeviceDetailsFragment extends RestrictedDashboardFragment
} }
return controllers; return controllers;
} }
private int getPaddingSize() {
TypedArray resolvedAttributes =
getContext().obtainStyledAttributes(
new int[]{
android.R.attr.listPreferredItemPaddingStart,
android.R.attr.listPreferredItemPaddingEnd
});
int width = resolvedAttributes.getDimensionPixelSize(0, 0)
+ resolvedAttributes.getDimensionPixelSize(1, 0);
resolvedAttributes.recycle();
return width;
}
} }

View File

@@ -26,6 +26,7 @@ import static com.android.settings.slices.CustomSliceRegistry.VOLUME_CALL_URI;
import static com.android.settings.slices.CustomSliceRegistry.VOLUME_MEDIA_URI; import static com.android.settings.slices.CustomSliceRegistry.VOLUME_MEDIA_URI;
import static com.android.settings.slices.CustomSliceRegistry.VOLUME_RINGER_URI; import static com.android.settings.slices.CustomSliceRegistry.VOLUME_RINGER_URI;
import android.app.Activity;
import android.app.settings.SettingsEnums; import android.app.settings.SettingsEnums;
import android.bluetooth.BluetoothDevice; import android.bluetooth.BluetoothDevice;
import android.content.BroadcastReceiver; import android.content.BroadcastReceiver;
@@ -49,7 +50,6 @@ import com.android.settingslib.bluetooth.LocalBluetoothProfileManager;
import com.android.settingslib.media.MediaOutputConstants; import com.android.settingslib.media.MediaOutputConstants;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.IllegalFormatException;
import java.util.List; import java.util.List;
import java.util.concurrent.ExecutionException; import java.util.concurrent.ExecutionException;
import java.util.concurrent.FutureTask; import java.util.concurrent.FutureTask;
@@ -64,6 +64,7 @@ public class VolumePanel implements PanelContent, LifecycleObserver {
private PanelContentCallback mCallback; private PanelContentCallback mCallback;
private LocalBluetoothProfileManager mProfileManager; private LocalBluetoothProfileManager mProfileManager;
private int mControlSliceWidth;
private final BroadcastReceiver mReceiver = new BroadcastReceiver() { private final BroadcastReceiver mReceiver = new BroadcastReceiver() {
@Override @Override
@@ -80,6 +81,14 @@ public class VolumePanel implements PanelContent, LifecycleObserver {
private VolumePanel(Context context) { private VolumePanel(Context context) {
mContext = context.getApplicationContext(); mContext = context.getApplicationContext();
if (context instanceof Activity) {
int panelWidth =
((Activity) context).getWindowManager().getCurrentWindowMetrics().getBounds()
.width();
// The control slice width = panel width - two left and right horizontal paddings
mControlSliceWidth = panelWidth - context.getResources().getDimensionPixelSize(
R.dimen.panel_slice_Horizontal_padding) * 2;
}
final FutureTask<LocalBluetoothManager> localBtManagerFutureTask = new FutureTask<>( final FutureTask<LocalBluetoothManager> localBtManagerFutureTask = new FutureTask<>(
// Avoid StrictMode ThreadPolicy violation // Avoid StrictMode ThreadPolicy violation
@@ -102,8 +111,7 @@ public class VolumePanel implements PanelContent, LifecycleObserver {
public void onResume() { public void onResume() {
final IntentFilter filter = new IntentFilter(); final IntentFilter filter = new IntentFilter();
filter.addAction(MediaOutputConstants.ACTION_CLOSE_PANEL); filter.addAction(MediaOutputConstants.ACTION_CLOSE_PANEL);
mContext.registerReceiver(mReceiver, filter, mContext.registerReceiver(mReceiver, filter, Context.RECEIVER_EXPORTED_UNAUDITED);
Context.RECEIVER_EXPORTED_UNAUDITED);
} }
/** Invoked when the panel is paused. */ /** Invoked when the panel is paused. */
@@ -159,13 +167,11 @@ public class VolumePanel implements PanelContent, LifecycleObserver {
Uri controlUri = null; Uri controlUri = null;
final BluetoothDevice bluetoothDevice = findActiveDevice(); final BluetoothDevice bluetoothDevice = findActiveDevice();
if (bluetoothDevice != null) { if (bluetoothDevice != null) {
final int width = mContext.getResources().getDimensionPixelSize(
R.dimen.settings_panel_width);
final String uri = BluetoothUtils.getControlUriMetaData(bluetoothDevice); final String uri = BluetoothUtils.getControlUriMetaData(bluetoothDevice);
if (!TextUtils.isEmpty(uri)) { if (!TextUtils.isEmpty(uri)) {
try { try {
controlUri = Uri.parse(String.format(uri, width)); controlUri = Uri.parse(uri + mControlSliceWidth);
} catch (IllegalFormatException | NullPointerException exception) { } catch (NullPointerException exception) {
Log.d(TAG, "unable to parse uri"); Log.d(TAG, "unable to parse uri");
controlUri = null; controlUri = null;
} }