diff --git a/aconfig/settings_bluetooth_declarations.aconfig b/aconfig/settings_bluetooth_declarations.aconfig index c2684f29124..b8b9d9fe569 100644 --- a/aconfig/settings_bluetooth_declarations.aconfig +++ b/aconfig/settings_bluetooth_declarations.aconfig @@ -24,3 +24,10 @@ flag { purpose: PURPOSE_BUGFIX } } + +flag { + name: "enable_bluetooth_device_details_polish" + namespace: "cross_device_experiences" + description: "Gates whether to enable bluetooth device details polish" + bug: "343317785" +} diff --git a/res/layout/advanced_bt_entity_sub.xml b/res/layout/advanced_bt_entity_sub.xml index d29c34f590e..90ac4567176 100644 --- a/res/layout/advanced_bt_entity_sub.xml +++ b/res/layout/advanced_bt_entity_sub.xml @@ -17,21 +17,43 @@ - + + + + + + #1F1F1F1F + + + #9ED582 diff --git a/src/com/android/settings/bluetooth/AdvancedBluetoothDetailsHeaderController.java b/src/com/android/settings/bluetooth/AdvancedBluetoothDetailsHeaderController.java index 13268314fc3..11ecf8ba90d 100644 --- a/src/com/android/settings/bluetooth/AdvancedBluetoothDetailsHeaderController.java +++ b/src/com/android/settings/bluetooth/AdvancedBluetoothDetailsHeaderController.java @@ -39,6 +39,7 @@ import android.view.View; import android.view.ViewGroup; import android.widget.ImageView; import android.widget.LinearLayout; +import android.widget.ProgressBar; import android.widget.TextView; import androidx.annotation.VisibleForTesting; @@ -46,6 +47,7 @@ import androidx.preference.PreferenceScreen; import com.android.settings.R; import com.android.settings.core.BasePreferenceController; +import com.android.settings.flags.Flags; import com.android.settings.fuelgauge.BatteryMeterView; import com.android.settingslib.bluetooth.BluetoothUtils; import com.android.settingslib.bluetooth.CachedBluetoothDevice; @@ -456,18 +458,24 @@ public class AdvancedBluetoothDetailsHeaderController extends BasePreferenceCont com.android.settings.Utils.formatPercentage(batteryLevel)); batterySummaryView.setVisibility(View.VISIBLE); showBatteryIcon(linearLayout, batteryLevel, lowBatteryLevel, charging); + showBatteryRing(linearLayout, batteryLevel); } else { if (deviceId == MAIN_DEVICE_ID) { linearLayout.setVisibility(View.VISIBLE); linearLayout.findViewById(R.id.bt_battery_icon).setVisibility(View.GONE); + int level = preloadedNativeBatteryLevel.get(); if (level != BluetoothDevice.BATTERY_LEVEL_UNKNOWN && level != BluetoothDevice.BATTERY_LEVEL_BLUETOOTH_OFF) { batterySummaryView.setText( com.android.settings.Utils.formatPercentage(level)); batterySummaryView.setVisibility(View.VISIBLE); + showBatteryRing(linearLayout, level); } else { batterySummaryView.setVisibility(View.GONE); + if (Flags.enableBluetoothDeviceDetailsPolish()) { + linearLayout.findViewById(R.id.battery_ring).setVisibility(View.GONE); + } } } else { // Hide it if it doesn't have battery information @@ -481,6 +489,7 @@ public class AdvancedBluetoothDetailsHeaderController extends BasePreferenceCont com.android.settings.Utils.formatPercentage(batteryLevel)); batterySummaryView.setVisibility(View.VISIBLE); showBatteryIcon(linearLayout, batteryLevel, lowBatteryLevel, charging); + showBatteryRing(linearLayout, batteryLevel); } else { batterySummaryView.setVisibility(View.GONE); } @@ -610,6 +619,14 @@ public class AdvancedBluetoothDetailsHeaderController extends BasePreferenceCont imageView.setVisibility(View.VISIBLE); } + private void showBatteryRing(LinearLayout linearLayout, int level) { + if (Flags.enableBluetoothDeviceDetailsPolish()) { + ProgressBar batteryProgress = linearLayout.findViewById(R.id.battery_ring); + batteryProgress.setProgress(level); + batteryProgress.setVisibility(View.VISIBLE); + } + } + private void updateDisconnectLayout() { mLayoutPreference.findViewById(R.id.layout_left).setVisibility(View.GONE); mLayoutPreference.findViewById(R.id.layout_right).setVisibility(View.GONE); @@ -620,6 +637,9 @@ public class AdvancedBluetoothDetailsHeaderController extends BasePreferenceCont linearLayout.findViewById(R.id.header_title).setVisibility(View.GONE); linearLayout.findViewById(R.id.bt_battery_summary).setVisibility(View.GONE); linearLayout.findViewById(R.id.bt_battery_icon).setVisibility(View.GONE); + if (Flags.enableBluetoothDeviceDetailsPolish()) { + linearLayout.findViewById(R.id.battery_ring).setVisibility(View.GONE); + } // Only show bluetooth icon final BluetoothDevice bluetoothDevice = mCachedDevice.getDevice(); diff --git a/tests/robotests/src/com/android/settings/bluetooth/AdvancedBluetoothDetailsHeaderControllerTest.java b/tests/robotests/src/com/android/settings/bluetooth/AdvancedBluetoothDetailsHeaderControllerTest.java index d24a83b9c4a..8d96f213446 100644 --- a/tests/robotests/src/com/android/settings/bluetooth/AdvancedBluetoothDetailsHeaderControllerTest.java +++ b/tests/robotests/src/com/android/settings/bluetooth/AdvancedBluetoothDetailsHeaderControllerTest.java @@ -28,16 +28,20 @@ import android.bluetooth.BluetoothDevice; import android.content.Context; import android.graphics.Bitmap; import android.graphics.drawable.Drawable; +import android.platform.test.flag.junit.SetFlagsRule; import android.provider.DeviceConfig; import android.view.LayoutInflater; import android.view.View; import android.widget.ImageView; import android.widget.LinearLayout; +import android.widget.ProgressBar; import android.widget.TextView; import com.android.settings.R; +import com.android.settings.SettingsActivity; import com.android.settings.core.BasePreferenceController; import com.android.settings.core.SettingsUIDeviceConfig; +import com.android.settings.flags.Flags; import com.android.settings.fuelgauge.BatteryMeterView; import com.android.settings.testutils.shadow.ShadowDeviceConfig; import com.android.settings.testutils.shadow.ShadowEntityHeaderController; @@ -48,12 +52,13 @@ import com.android.settingslib.widget.LayoutPreference; import org.junit.Before; import org.junit.Ignore; +import org.junit.Rule; import org.junit.Test; import org.junit.runner.RunWith; import org.mockito.Mock; import org.mockito.MockitoAnnotations; +import org.robolectric.Robolectric; import org.robolectric.RobolectricTestRunner; -import org.robolectric.RuntimeEnvironment; import org.robolectric.annotation.Config; import java.util.HashSet; @@ -62,6 +67,8 @@ import java.util.Set; @RunWith(RobolectricTestRunner.class) @Config(shadows = {ShadowEntityHeaderController.class, ShadowDeviceConfig.class}) public class AdvancedBluetoothDetailsHeaderControllerTest { + @Rule public final SetFlagsRule mSetFlagsRule = new SetFlagsRule(); + private static final int BATTERY_LEVEL_MAIN = 30; private static final int BATTERY_LEVEL_LEFT = 25; private static final int BATTERY_LEVEL_RIGHT = 45; @@ -93,7 +100,7 @@ public class AdvancedBluetoothDetailsHeaderControllerTest { public void setUp() { MockitoAnnotations.initMocks(this); - mContext = RuntimeEnvironment.application; + mContext = Robolectric.buildActivity(SettingsActivity.class).get(); mController = new AdvancedBluetoothDetailsHeaderController(mContext, "pref_Key"); when(mCachedDevice.getDevice()).thenReturn(mBluetoothDevice); mController.init(mCachedDevice); @@ -272,6 +279,7 @@ public class AdvancedBluetoothDetailsHeaderControllerTest { View.GONE); assertThat(layout.findViewById(R.id.bt_battery_icon).getVisibility()).isEqualTo(View.GONE); assertThat(layout.findViewById(R.id.header_icon).getVisibility()).isEqualTo(View.VISIBLE); + assertThat(layout.findViewById(R.id.battery_ring).getVisibility()).isEqualTo(View.GONE); } @Ignore @@ -546,6 +554,10 @@ public class AdvancedBluetoothDetailsHeaderControllerTest { final TextView textView = linearLayout.findViewById(R.id.bt_battery_summary); assertThat(textView.getText().toString()).isEqualTo( com.android.settings.Utils.formatPercentage(batteryLevel)); + if (Flags.enableBluetoothDeviceDetailsPolish()) { + final ProgressBar bar = linearLayout.findViewById(R.id.battery_ring); + assertThat(bar.getProgress()).isEqualTo(batteryLevel); + } } private void assertBatteryIcon(LinearLayout linearLayout, int resId) { diff --git a/tests/robotests/src/com/android/settings/connecteddevice/stylus/StylusUsiHeaderControllerTest.java b/tests/robotests/src/com/android/settings/connecteddevice/stylus/StylusUsiHeaderControllerTest.java index 3aad02e011a..4509c7c17ae 100644 --- a/tests/robotests/src/com/android/settings/connecteddevice/stylus/StylusUsiHeaderControllerTest.java +++ b/tests/robotests/src/com/android/settings/connecteddevice/stylus/StylusUsiHeaderControllerTest.java @@ -33,9 +33,9 @@ import android.widget.TextView; import androidx.preference.PreferenceManager; import androidx.preference.PreferenceScreen; -import androidx.test.core.app.ApplicationProvider; import com.android.settings.R; +import com.android.settings.SettingsActivity; import com.android.settingslib.widget.LayoutPreference; import org.junit.Before; @@ -43,6 +43,7 @@ import org.junit.Test; import org.junit.runner.RunWith; import org.mockito.Mock; import org.mockito.MockitoAnnotations; +import org.robolectric.Robolectric; import org.robolectric.RobolectricTestRunner; @RunWith(RobolectricTestRunner.class) @@ -72,7 +73,7 @@ public class StylusUsiHeaderControllerTest { when(mBatteryState.getCapacity()).thenReturn(1f); when(mBatteryState.isPresent()).thenReturn(true); - mContext = spy(ApplicationProvider.getApplicationContext()); + mContext = spy(Robolectric.buildActivity(SettingsActivity.class).get()); when(mContext.getSystemService(InputManager.class)).thenReturn(mInputManager); mController = new StylusUsiHeaderController(mContext, mInputDevice);