[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
diff --git a/src/com/android/settings/bluetooth/BluetoothDeviceDetailsFragment.java b/src/com/android/settings/bluetooth/BluetoothDeviceDetailsFragment.java
index a9ac286..c118a43 100644
--- a/src/com/android/settings/bluetooth/BluetoothDeviceDetailsFragment.java
+++ b/src/com/android/settings/bluetooth/BluetoothDeviceDetailsFragment.java
@@ -22,6 +22,7 @@
 import android.app.settings.SettingsEnums;
 import android.bluetooth.BluetoothDevice;
 import android.content.Context;
+import android.content.res.TypedArray;
 import android.net.Uri;
 import android.os.Bundle;
 import android.provider.DeviceConfig;
@@ -49,7 +50,6 @@
 import com.android.settingslib.core.lifecycle.Lifecycle;
 
 import java.util.ArrayList;
-import java.util.IllegalFormatException;
 import java.util.List;
 
 public class BluetoothDeviceDetailsFragment extends RestrictedDashboardFragment {
@@ -136,7 +136,6 @@
         use(BlockingSlicePrefController.class).setSliceUri(sliceEnabled
                 ? featureProvider.getBluetoothDeviceSettingsUri(mCachedDevice.getDevice())
                 : null);
-        updateExtraControlUri(/* viewWidth */ 0);
     }
 
     private void updateExtraControlUri(int viewWidth) {
@@ -148,13 +147,14 @@
         String uri = featureProvider.getBluetoothDeviceControlUri(mCachedDevice.getDevice());
         if (!TextUtils.isEmpty(uri)) {
             try {
-                controlUri = Uri.parse(String.format(uri, viewWidth));
-            } catch (IllegalFormatException | NullPointerException exception) {
+                controlUri = Uri.parse(uri + viewWidth);
+            } catch (NullPointerException exception) {
                 Log.d(TAG, "unable to parse uri");
                 controlUri = null;
             }
         }
         use(SlicePreferenceController.class).setSliceUri(sliceEnabled ? controlUri : null);
+        use(SlicePreferenceController.class).onStart();
     }
 
     private final ViewTreeObserver.OnGlobalLayoutListener mOnGlobalLayoutListener =
@@ -165,7 +165,10 @@
                     if (view == null) {
                         return;
                     }
-                    updateExtraControlUri(view.getWidth());
+                    if (view.getWidth() <= 0) {
+                        return;
+                    }
+                    updateExtraControlUri(view.getWidth() - getPaddingSize());
                     view.getViewTreeObserver().removeOnGlobalLayoutListener(
                             mOnGlobalLayoutListener);
                 }
@@ -251,4 +254,17 @@
         }
         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;
+    }
 }
diff --git a/src/com/android/settings/panel/VolumePanel.java b/src/com/android/settings/panel/VolumePanel.java
index 98939cf..08884d5 100644
--- a/src/com/android/settings/panel/VolumePanel.java
+++ b/src/com/android/settings/panel/VolumePanel.java
@@ -26,6 +26,7 @@
 import static com.android.settings.slices.CustomSliceRegistry.VOLUME_MEDIA_URI;
 import static com.android.settings.slices.CustomSliceRegistry.VOLUME_RINGER_URI;
 
+import android.app.Activity;
 import android.app.settings.SettingsEnums;
 import android.bluetooth.BluetoothDevice;
 import android.content.BroadcastReceiver;
@@ -49,7 +50,6 @@
 import com.android.settingslib.media.MediaOutputConstants;
 
 import java.util.ArrayList;
-import java.util.IllegalFormatException;
 import java.util.List;
 import java.util.concurrent.ExecutionException;
 import java.util.concurrent.FutureTask;
@@ -64,6 +64,7 @@
 
     private PanelContentCallback mCallback;
     private LocalBluetoothProfileManager mProfileManager;
+    private int mControlSliceWidth;
 
     private final BroadcastReceiver mReceiver = new BroadcastReceiver() {
         @Override
@@ -80,6 +81,14 @@
 
     private VolumePanel(Context context) {
         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<>(
                 // Avoid StrictMode ThreadPolicy violation
@@ -102,8 +111,7 @@
     public void onResume() {
         final IntentFilter filter = new IntentFilter();
         filter.addAction(MediaOutputConstants.ACTION_CLOSE_PANEL);
-        mContext.registerReceiver(mReceiver, filter,
-                Context.RECEIVER_EXPORTED_UNAUDITED);
+        mContext.registerReceiver(mReceiver, filter, Context.RECEIVER_EXPORTED_UNAUDITED);
     }
 
     /** Invoked when the panel is paused. */
@@ -159,13 +167,11 @@
         Uri controlUri = null;
         final BluetoothDevice bluetoothDevice = findActiveDevice();
         if (bluetoothDevice != null) {
-            final int width = mContext.getResources().getDimensionPixelSize(
-                    R.dimen.settings_panel_width);
             final String uri = BluetoothUtils.getControlUriMetaData(bluetoothDevice);
             if (!TextUtils.isEmpty(uri)) {
                 try {
-                    controlUri = Uri.parse(String.format(uri, width));
-                } catch (IllegalFormatException | NullPointerException exception) {
+                    controlUri = Uri.parse(uri + mControlSliceWidth);
+                } catch (NullPointerException exception) {
                     Log.d(TAG, "unable to parse uri");
                     controlUri = null;
                 }