From 917682603c7ef6a9612216a251d53db5d0718c45 Mon Sep 17 00:00:00 2001 From: jasonwshsu Date: Tue, 23 Jan 2024 22:30:35 +0800 Subject: [PATCH 1/4] Fix corss-link hearing device settings Root Cause: There are two device details entries in Connected devices and Hearing devices page which can both go to the same page, it will have the endless loop problem. Solution: Only show hearing device settings comes from Connected devices page. Bug: 320709814 Test: make RunSettingsRoboTests ROBOTEST_FILTER=BluetoothDeviceDetailsFragmentTest Change-Id: I26941d0d16ab3bb0df0cb2c481c25c6c41340261 --- ...etailsHearingDeviceControlsController.java | 3 +- .../BluetoothDeviceDetailsFragment.java | 19 ++++++++- .../BluetoothDeviceDetailsFragmentTest.java | 40 +++++++++++++++++++ 3 files changed, 59 insertions(+), 3 deletions(-) diff --git a/src/com/android/settings/bluetooth/BluetoothDetailsHearingDeviceControlsController.java b/src/com/android/settings/bluetooth/BluetoothDetailsHearingDeviceControlsController.java index 18ad2109405..3d85ca2b0bc 100644 --- a/src/com/android/settings/bluetooth/BluetoothDetailsHearingDeviceControlsController.java +++ b/src/com/android/settings/bluetooth/BluetoothDetailsHearingDeviceControlsController.java @@ -38,7 +38,8 @@ import com.google.common.annotations.VisibleForTesting; public class BluetoothDetailsHearingDeviceControlsController extends BluetoothDetailsController implements Preference.OnPreferenceClickListener { - private static final String KEY_DEVICE_CONTROLS_GENERAL_GROUP = "device_controls_general"; + @VisibleForTesting + static final String KEY_DEVICE_CONTROLS_GENERAL_GROUP = "device_controls_general"; @VisibleForTesting static final String KEY_HEARING_DEVICE_CONTROLS = "hearing_device_controls"; diff --git a/src/com/android/settings/bluetooth/BluetoothDeviceDetailsFragment.java b/src/com/android/settings/bluetooth/BluetoothDeviceDetailsFragment.java index cfe79629c58..898a116989a 100644 --- a/src/com/android/settings/bluetooth/BluetoothDeviceDetailsFragment.java +++ b/src/com/android/settings/bluetooth/BluetoothDeviceDetailsFragment.java @@ -22,6 +22,7 @@ import static android.os.UserManager.DISALLOW_CONFIG_BLUETOOTH; import android.app.settings.SettingsEnums; import android.bluetooth.BluetoothDevice; import android.content.Context; +import android.content.Intent; import android.content.res.TypedArray; import android.hardware.input.InputManager; import android.net.Uri; @@ -53,6 +54,7 @@ import com.android.settings.slices.SlicePreferenceController; import com.android.settingslib.bluetooth.CachedBluetoothDevice; import com.android.settingslib.bluetooth.LocalBluetoothManager; import com.android.settingslib.core.AbstractPreferenceController; +import com.android.settingslib.core.instrumentation.MetricsFeatureProvider; import com.android.settingslib.core.lifecycle.Lifecycle; import java.util.ArrayList; @@ -324,8 +326,11 @@ public class BluetoothDeviceDetailsFragment extends RestrictedDashboardFragment lifecycle)); controllers.add(new BluetoothDetailsPairOtherController(context, this, mCachedDevice, lifecycle)); - controllers.add(new BluetoothDetailsHearingDeviceControlsController(context, this, - mCachedDevice, lifecycle)); + // Don't need to show hearing device again when launched from the same page. + if (!isLaunchFromHearingDevicePage()) { + controllers.add(new BluetoothDetailsHearingDeviceControlsController(context, this, + mCachedDevice, lifecycle)); + } controllers.add(new BluetoothDetailsDataSyncController(context, this, mCachedDevice, lifecycle)); } @@ -345,6 +350,16 @@ public class BluetoothDeviceDetailsFragment extends RestrictedDashboardFragment return width; } + private boolean isLaunchFromHearingDevicePage() { + final Intent intent = getIntent(); + if (intent == null) { + return false; + } + + return intent.getIntExtra(MetricsFeatureProvider.EXTRA_SOURCE_METRICS_CATEGORY, + SettingsEnums.PAGE_UNKNOWN) == SettingsEnums.ACCESSIBILITY_HEARING_AID_SETTINGS; + } + @VisibleForTesting void setTitleForInputDevice() { if (StylusDevicesController.isDeviceStylus(mInputDevice, mCachedDevice)) { diff --git a/tests/robotests/src/com/android/settings/bluetooth/BluetoothDeviceDetailsFragmentTest.java b/tests/robotests/src/com/android/settings/bluetooth/BluetoothDeviceDetailsFragmentTest.java index cfd256f3241..fc72c412b6e 100644 --- a/tests/robotests/src/com/android/settings/bluetooth/BluetoothDeviceDetailsFragmentTest.java +++ b/tests/robotests/src/com/android/settings/bluetooth/BluetoothDeviceDetailsFragmentTest.java @@ -18,6 +18,8 @@ package com.android.settings.bluetooth; import static android.bluetooth.BluetoothDevice.BOND_NONE; +import static com.android.settings.bluetooth.BluetoothDetailsHearingDeviceControlsController.KEY_DEVICE_CONTROLS_GENERAL_GROUP; + import static com.google.common.truth.Truth.assertThat; import static org.mockito.ArgumentMatchers.any; @@ -29,8 +31,10 @@ import static org.mockito.Mockito.times; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; +import android.app.settings.SettingsEnums; import android.companion.CompanionDeviceManager; import android.content.Context; +import android.content.Intent; import android.hardware.input.InputManager; import android.os.Bundle; import android.os.UserManager; @@ -49,6 +53,8 @@ import com.android.settings.R; import com.android.settings.testutils.FakeFeatureFactory; import com.android.settingslib.bluetooth.CachedBluetoothDevice; import com.android.settingslib.bluetooth.LocalBluetoothManager; +import com.android.settingslib.core.AbstractPreferenceController; +import com.android.settingslib.core.instrumentation.MetricsFeatureProvider; import com.google.common.collect.ImmutableList; @@ -65,6 +71,8 @@ import org.robolectric.RuntimeEnvironment; import org.robolectric.annotation.Config; import org.robolectric.fakes.RoboMenu; +import java.util.List; + @RunWith(RobolectricTestRunner.class) @Config(shadows = { com.android.settings.testutils.shadow.ShadowUserManager.class, @@ -216,6 +224,38 @@ public class BluetoothDeviceDetailsFragmentTest { verify(mFragment).finish(); } + @Test + public void createPreferenceControllers_launchFromHAPage_deviceControllerNotExist() { + BluetoothDeviceDetailsFragment fragment = setupFragment(); + Intent intent = fragment.getActivity().getIntent(); + intent.putExtra(MetricsFeatureProvider.EXTRA_SOURCE_METRICS_CATEGORY, + SettingsEnums.ACCESSIBILITY_HEARING_AID_SETTINGS); + fragment.onAttach(mContext); + + List controllerList = fragment.createPreferenceControllers( + mContext); + + assertThat(controllerList.stream() + .anyMatch(controller -> controller.getPreferenceKey().equals( + KEY_DEVICE_CONTROLS_GENERAL_GROUP))).isFalse(); + } + + @Test + public void createPreferenceControllers_notLaunchFromHAPage_deviceControllerExist() { + BluetoothDeviceDetailsFragment fragment = setupFragment(); + Intent intent = fragment.getActivity().getIntent(); + intent.putExtra(MetricsFeatureProvider.EXTRA_SOURCE_METRICS_CATEGORY, + SettingsEnums.PAGE_UNKNOWN); + fragment.onAttach(mContext); + + List controllerList = fragment.createPreferenceControllers( + mContext); + + assertThat(controllerList.stream() + .anyMatch(controller -> controller.getPreferenceKey().equals( + KEY_DEVICE_CONTROLS_GENERAL_GROUP))).isTrue(); + } + private InputDevice createInputDeviceWithMatchingBluetoothAddress() { doReturn(new int[]{0}).when(mInputManager).getInputDeviceIds(); InputDevice device = mock(InputDevice.class); From 5dd8460c3eed58de8ca32102dc629d7548df1a16 Mon Sep 17 00:00:00 2001 From: pajacechen Date: Wed, 31 Jan 2024 16:11:55 +0800 Subject: [PATCH 2/4] [BatteryTips] Separate the low battery tips Bug: 315748218 Test: atest SettingsRoboTestStub:com.android.settings.fuelgauge.batterytip.detectors.LowBatteryDetectorTest Change-Id: Id973be37012da414d6125a4dd29ec4522ab80e95 --- .../BatterySettingsFeatureProvider.java | 7 ++- .../BatterySettingsFeatureProviderImpl.java | 9 ++- .../batterytip/BatteryTipLoader.java | 13 ++--- .../detectors/LowBatteryDetector.java | 25 ++++---- ...atterySettingsFeatureProviderImplTest.java | 17 ++++++ .../detectors/LowBatteryDetectorTest.java | 57 +++++++++++-------- 6 files changed, 81 insertions(+), 47 deletions(-) diff --git a/src/com/android/settings/fuelgauge/BatterySettingsFeatureProvider.java b/src/com/android/settings/fuelgauge/BatterySettingsFeatureProvider.java index cc333a53879..62be5dfc365 100644 --- a/src/com/android/settings/fuelgauge/BatterySettingsFeatureProvider.java +++ b/src/com/android/settings/fuelgauge/BatterySettingsFeatureProvider.java @@ -18,6 +18,7 @@ package com.android.settings.fuelgauge; import android.content.Context; +import com.android.settings.fuelgauge.batterytip.BatteryTipPolicy; import com.android.settings.fuelgauge.batterytip.tips.BatteryTip; import java.util.List; @@ -35,5 +36,9 @@ public interface BatterySettingsFeatureProvider { boolean isBatteryInfoEnabled(Context context); /** A way to add more battery tip detectors. */ - void addBatteryTipDetector(Context context, List tips, BatteryInfo batteryInfo); + void addBatteryTipDetector( + Context context, + List batteryTips, + BatteryInfo batteryInfo, + BatteryTipPolicy batteryTipPolicy); } diff --git a/src/com/android/settings/fuelgauge/BatterySettingsFeatureProviderImpl.java b/src/com/android/settings/fuelgauge/BatterySettingsFeatureProviderImpl.java index f974b9d7df6..f39837370d1 100644 --- a/src/com/android/settings/fuelgauge/BatterySettingsFeatureProviderImpl.java +++ b/src/com/android/settings/fuelgauge/BatterySettingsFeatureProviderImpl.java @@ -18,6 +18,8 @@ package com.android.settings.fuelgauge; import android.content.Context; +import com.android.settings.fuelgauge.batterytip.BatteryTipPolicy; +import com.android.settings.fuelgauge.batterytip.detectors.LowBatteryDetector; import com.android.settings.fuelgauge.batterytip.tips.BatteryTip; import java.util.List; @@ -42,5 +44,10 @@ public class BatterySettingsFeatureProviderImpl implements BatterySettingsFeatur @Override public void addBatteryTipDetector( - Context context, List tips, BatteryInfo batteryInfo) {} + Context context, + List batteryTips, + BatteryInfo batteryInfo, + BatteryTipPolicy batteryTipPolicy) { + batteryTips.add(new LowBatteryDetector(context, batteryTipPolicy, batteryInfo).detect()); + } } diff --git a/src/com/android/settings/fuelgauge/batterytip/BatteryTipLoader.java b/src/com/android/settings/fuelgauge/batterytip/BatteryTipLoader.java index 53521050c8e..d68bf39295c 100644 --- a/src/com/android/settings/fuelgauge/batterytip/BatteryTipLoader.java +++ b/src/com/android/settings/fuelgauge/batterytip/BatteryTipLoader.java @@ -18,7 +18,6 @@ package com.android.settings.fuelgauge.batterytip; import android.content.Context; import android.os.BatteryUsageStats; -import android.os.PowerManager; import androidx.annotation.VisibleForTesting; @@ -27,7 +26,6 @@ import com.android.settings.fuelgauge.BatteryUtils; import com.android.settings.fuelgauge.batterytip.detectors.BatteryDefenderDetector; import com.android.settings.fuelgauge.batterytip.detectors.HighUsageDetector; import com.android.settings.fuelgauge.batterytip.detectors.IncompatibleChargerDetector; -import com.android.settings.fuelgauge.batterytip.detectors.LowBatteryDetector; import com.android.settings.fuelgauge.batterytip.tips.BatteryTip; import com.android.settings.overlay.FeatureFactory; import com.android.settingslib.utils.AsyncLoaderCompat; @@ -56,19 +54,18 @@ public class BatteryTipLoader extends AsyncLoaderCompat> { @Override public List loadInBackground() { final List tips = new ArrayList<>(); - final BatteryTipPolicy policy = new BatteryTipPolicy(getContext()); + final BatteryTipPolicy batteryTipPolicy = new BatteryTipPolicy(getContext()); final BatteryInfo batteryInfo = mBatteryUtils.getBatteryInfo(TAG); final Context context = getContext().getApplicationContext(); - final boolean isPowerSaveMode = - context.getSystemService(PowerManager.class).isPowerSaveMode(); - tips.add(new LowBatteryDetector(context, policy, batteryInfo, isPowerSaveMode).detect()); - tips.add(new HighUsageDetector(context, policy, mBatteryUsageStats, batteryInfo).detect()); + tips.add( + new HighUsageDetector(context, batteryTipPolicy, mBatteryUsageStats, batteryInfo) + .detect()); tips.add(new BatteryDefenderDetector(batteryInfo, context).detect()); tips.add(new IncompatibleChargerDetector(context).detect()); FeatureFactory.getFeatureFactory() .getBatterySettingsFeatureProvider() - .addBatteryTipDetector(context, tips, batteryInfo); + .addBatteryTipDetector(context, tips, batteryInfo, batteryTipPolicy); Collections.sort(tips); return tips; } diff --git a/src/com/android/settings/fuelgauge/batterytip/detectors/LowBatteryDetector.java b/src/com/android/settings/fuelgauge/batterytip/detectors/LowBatteryDetector.java index 1ce5a8ec891..b1a15627407 100644 --- a/src/com/android/settings/fuelgauge/batterytip/detectors/LowBatteryDetector.java +++ b/src/com/android/settings/fuelgauge/batterytip/detectors/LowBatteryDetector.java @@ -17,6 +17,7 @@ package com.android.settings.fuelgauge.batterytip.detectors; import android.content.Context; +import android.os.PowerManager; import com.android.settings.fuelgauge.BatteryInfo; import com.android.settings.fuelgauge.batterytip.BatteryTipPolicy; @@ -26,37 +27,33 @@ import com.android.settings.fuelgauge.batterytip.tips.LowBatteryTip; /** Detect whether the battery is too low */ public class LowBatteryDetector implements BatteryTipDetector { private final BatteryInfo mBatteryInfo; - private final BatteryTipPolicy mPolicy; + private final BatteryTipPolicy mBatteryTipPolicy; private final boolean mIsPowerSaveMode; private final int mWarningLevel; public LowBatteryDetector( - Context context, - BatteryTipPolicy policy, - BatteryInfo batteryInfo, - boolean isPowerSaveMode) { - mPolicy = policy; + Context context, BatteryTipPolicy batteryTipPolicy, BatteryInfo batteryInfo) { + mBatteryTipPolicy = batteryTipPolicy; mBatteryInfo = batteryInfo; mWarningLevel = context.getResources() .getInteger(com.android.internal.R.integer.config_lowBatteryWarningLevel); - mIsPowerSaveMode = isPowerSaveMode; + mIsPowerSaveMode = context.getSystemService(PowerManager.class).isPowerSaveMode(); } @Override public BatteryTip detect() { final boolean lowBattery = mBatteryInfo.batteryLevel <= mWarningLevel; - final boolean lowBatteryEnabled = mPolicy.lowBatteryEnabled && !mIsPowerSaveMode; + final boolean lowBatteryEnabled = mBatteryTipPolicy.lowBatteryEnabled && !mIsPowerSaveMode; final boolean dischargingLowBatteryState = - mPolicy.testLowBatteryTip || (mBatteryInfo.discharging && lowBattery); - - int state = BatteryTip.StateType.INVISIBLE; + mBatteryTipPolicy.testLowBatteryTip || (mBatteryInfo.discharging && lowBattery); // Show it as new if in test or in discharging low battery state, // dismiss it if battery saver is on or disabled by config. - if (lowBatteryEnabled && dischargingLowBatteryState) { - state = BatteryTip.StateType.NEW; - } + final int state = + lowBatteryEnabled && dischargingLowBatteryState + ? BatteryTip.StateType.NEW + : BatteryTip.StateType.INVISIBLE; return new LowBatteryTip(state, mIsPowerSaveMode); } diff --git a/tests/robotests/src/com/android/settings/fuelgauge/BatterySettingsFeatureProviderImplTest.java b/tests/robotests/src/com/android/settings/fuelgauge/BatterySettingsFeatureProviderImplTest.java index 554227ef7e7..14ba337cda6 100644 --- a/tests/robotests/src/com/android/settings/fuelgauge/BatterySettingsFeatureProviderImplTest.java +++ b/tests/robotests/src/com/android/settings/fuelgauge/BatterySettingsFeatureProviderImplTest.java @@ -22,11 +22,17 @@ import android.content.Context; import androidx.test.core.app.ApplicationProvider; +import com.android.settings.fuelgauge.batterytip.BatteryTipPolicy; +import com.android.settings.fuelgauge.batterytip.tips.BatteryTip; +import com.android.settings.fuelgauge.batterytip.tips.LowBatteryTip; + import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; import org.robolectric.RobolectricTestRunner; +import java.util.ArrayList; + @RunWith(RobolectricTestRunner.class) public class BatterySettingsFeatureProviderImplTest { private BatterySettingsFeatureProviderImpl mImpl; @@ -52,4 +58,15 @@ public class BatterySettingsFeatureProviderImplTest { public void isBatteryInfoEnabled_returnFalse() { assertThat(mImpl.isBatteryInfoEnabled(mContext)).isFalse(); } + + @Test + public void addBatteryTipDetector_containsLowBatteryTip() { + var tips = new ArrayList(); + + mImpl.addBatteryTipDetector( + mContext, tips, new BatteryInfo(), new BatteryTipPolicy(mContext)); + + var expectedResult = tips.stream().anyMatch(tip -> tip instanceof LowBatteryTip); + assertThat(expectedResult).isTrue(); + } } diff --git a/tests/robotests/src/com/android/settings/fuelgauge/batterytip/detectors/LowBatteryDetectorTest.java b/tests/robotests/src/com/android/settings/fuelgauge/batterytip/detectors/LowBatteryDetectorTest.java index 8e3de7ca868..c5897f24d93 100644 --- a/tests/robotests/src/com/android/settings/fuelgauge/batterytip/detectors/LowBatteryDetectorTest.java +++ b/tests/robotests/src/com/android/settings/fuelgauge/batterytip/detectors/LowBatteryDetectorTest.java @@ -19,20 +19,25 @@ package com.android.settings.fuelgauge.batterytip.detectors; import static com.google.common.truth.Truth.assertThat; import static org.mockito.Mockito.spy; +import static org.robolectric.Shadows.shadowOf; import android.content.Context; +import android.os.PowerManager; + +import androidx.test.core.app.ApplicationProvider; import com.android.settings.fuelgauge.BatteryInfo; import com.android.settings.fuelgauge.batterytip.BatteryTipPolicy; import com.android.settings.fuelgauge.batterytip.tips.BatteryTip; import org.junit.Before; +import org.junit.Rule; import org.junit.Test; import org.junit.runner.RunWith; import org.mockito.Mock; -import org.mockito.MockitoAnnotations; +import org.mockito.junit.MockitoJUnit; +import org.mockito.junit.MockitoRule; import org.robolectric.RobolectricTestRunner; -import org.robolectric.RuntimeEnvironment; import org.robolectric.util.ReflectionHelpers; import java.util.concurrent.TimeUnit; @@ -40,73 +45,79 @@ import java.util.concurrent.TimeUnit; @RunWith(RobolectricTestRunner.class) public class LowBatteryDetectorTest { + @Rule public MockitoRule mockitoRule = MockitoJUnit.rule(); + @Mock private BatteryInfo mBatteryInfo; - private BatteryTipPolicy mPolicy; + + private BatteryTipPolicy mBatteryTipPolicy; private LowBatteryDetector mLowBatteryDetector; private Context mContext; + private PowerManager mPowerManager; @Before public void setUp() { - MockitoAnnotations.initMocks(this); + mContext = ApplicationProvider.getApplicationContext(); + mBatteryTipPolicy = spy(new BatteryTipPolicy(mContext)); - mPolicy = spy(new BatteryTipPolicy(RuntimeEnvironment.application)); - mContext = RuntimeEnvironment.application; - ReflectionHelpers.setField(mPolicy, "lowBatteryEnabled", true); + mPowerManager = mContext.getSystemService(PowerManager.class); + shadowOf(mPowerManager).setIsPowerSaveMode(false); + + ReflectionHelpers.setField(mBatteryTipPolicy, "lowBatteryEnabled", true); mBatteryInfo.discharging = true; - mLowBatteryDetector = - new LowBatteryDetector( - mContext, mPolicy, mBatteryInfo, false /* isPowerSaveMode */); + mLowBatteryDetector = new LowBatteryDetector(mContext, mBatteryTipPolicy, mBatteryInfo); } @Test - public void testDetect_disabledByPolicy_tipInvisible() { - ReflectionHelpers.setField(mPolicy, "lowBatteryEnabled", false); - mLowBatteryDetector = - new LowBatteryDetector(mContext, mPolicy, mBatteryInfo, true /* isPowerSaveMode */); + public void detect_disabledByPolicy_tipInvisible() { + ReflectionHelpers.setField(mBatteryTipPolicy, "lowBatteryEnabled", false); + shadowOf(mPowerManager).setIsPowerSaveMode(true); + mLowBatteryDetector = new LowBatteryDetector(mContext, mBatteryTipPolicy, mBatteryInfo); assertThat(mLowBatteryDetector.detect().isVisible()).isFalse(); } @Test - public void testDetect_enabledByTest_tipNew() { - ReflectionHelpers.setField(mPolicy, "testLowBatteryTip", true); + public void detect_enabledByTest_tipNew() { + ReflectionHelpers.setField(mBatteryTipPolicy, "testLowBatteryTip", true); assertThat(mLowBatteryDetector.detect().getState()).isEqualTo(BatteryTip.StateType.NEW); } @Test - public void testDetect_lowBattery_tipNew() { + public void detect_lowBattery_tipNew() { mBatteryInfo.batteryLevel = 20; mBatteryInfo.remainingTimeUs = TimeUnit.DAYS.toMillis(1); + assertThat(mLowBatteryDetector.detect().getState()).isEqualTo(BatteryTip.StateType.NEW); } @Test - public void testDetect_batterySaverOn_tipInvisible() { - mLowBatteryDetector = - new LowBatteryDetector(mContext, mPolicy, mBatteryInfo, true /* isPowerSaveMode */); + public void detect_batterySaverOn_tipInvisible() { + shadowOf(mPowerManager).setIsPowerSaveMode(true); + mLowBatteryDetector = new LowBatteryDetector(mContext, mBatteryTipPolicy, mBatteryInfo); assertThat(mLowBatteryDetector.detect().getState()) .isEqualTo(BatteryTip.StateType.INVISIBLE); } @Test - public void testDetect_charging_tipInvisible() { + public void detect_charging_tipInvisible() { mBatteryInfo.discharging = false; assertThat(mLowBatteryDetector.detect().isVisible()).isFalse(); } @Test - public void testDetect_lowTimeEstimation_tipInvisible() { + public void detect_lowTimeEstimation_tipInvisible() { mBatteryInfo.batteryLevel = 50; mBatteryInfo.remainingTimeUs = TimeUnit.MINUTES.toMillis(1); + assertThat(mLowBatteryDetector.detect().isVisible()).isFalse(); } @Test - public void testDetect_noEarlyWarning_tipInvisible() { + public void detect_noEarlyWarning_tipInvisible() { mBatteryInfo.remainingTimeUs = TimeUnit.DAYS.toMicros(1); mBatteryInfo.batteryLevel = 100; From d171a8b9467bfb8ba201619d484215d17ef53d39 Mon Sep 17 00:00:00 2001 From: pajacechen Date: Thu, 1 Feb 2024 09:47:00 +0800 Subject: [PATCH 3/4] [BatteryTip] Implement new CardPreference to apply new style - Implement a new CardPreference to apply SettingsCard - Apply CardPreference on battery tips Bug: 315748218 Test: atest SettingsSpaUnitTests:com.android.settings.widget.CardPreferenceTest Test: atest SettingsRoboTest:com.android.settings.fuelgauge Change-Id: I9a57e7739275854278b2c586793af718b0680d23 --- .../batterytip/tips/BatteryDefenderTip.java | 39 +- .../tips/IncompatibleChargerTip.java | 31 +- .../settings/widget/CardPreference.java | 170 --------- .../android/settings/widget/CardPreference.kt | 119 ++++++ .../tips/BatteryDefenderTipTest.java | 8 +- .../batterytip/tips/BatteryTipTest.java | 2 +- .../tips/IncompatibleChargerTipTest.java | 2 +- .../settings/widget/CardPreferenceTest.java | 344 ------------------ .../settings/widget/CardPreferenceTest.kt | 240 ++++++++++++ 9 files changed, 414 insertions(+), 541 deletions(-) delete mode 100644 src/com/android/settings/widget/CardPreference.java create mode 100644 src/com/android/settings/widget/CardPreference.kt delete mode 100644 tests/robotests/src/com/android/settings/widget/CardPreferenceTest.java create mode 100644 tests/spa_unit/src/com/android/settings/widget/CardPreferenceTest.kt diff --git a/src/com/android/settings/fuelgauge/batterytip/tips/BatteryDefenderTip.java b/src/com/android/settings/fuelgauge/batterytip/tips/BatteryDefenderTip.java index 047bf135741..319ba7a16c8 100644 --- a/src/com/android/settings/fuelgauge/batterytip/tips/BatteryDefenderTip.java +++ b/src/com/android/settings/fuelgauge/batterytip/tips/BatteryDefenderTip.java @@ -16,12 +16,14 @@ package com.android.settings.fuelgauge.batterytip.tips; +import android.app.Activity; import android.app.settings.SettingsEnums; import android.content.Context; import android.content.Intent; import android.os.Parcel; import android.util.Log; +import androidx.core.app.ActivityCompat; import androidx.preference.Preference; import com.android.settings.R; @@ -30,6 +32,8 @@ import com.android.settings.widget.CardPreference; import com.android.settingslib.HelpUtils; import com.android.settingslib.core.instrumentation.MetricsFeatureProvider; +import kotlin.Unit; + /** Tip to show current battery is overheated */ public class BatteryDefenderTip extends BatteryTip { @@ -83,28 +87,39 @@ public class BatteryDefenderTip extends BatteryTip { } cardPreference.setSelectable(false); + cardPreference.setIconResId(getIconId()); cardPreference.setPrimaryButtonText(context.getString(R.string.learn_more)); - cardPreference.setPrimaryButtonClickListener( - button -> - button.startActivityForResult( - HelpUtils.getHelpIntent( - context, - context.getString(R.string.help_url_battery_defender), - /* backupContext */ ""), /* requestCode */ - 0)); - cardPreference.setPrimaryButtonVisible(true); + cardPreference.setPrimaryButtonAction( + () -> { + var helpIntent = + HelpUtils.getHelpIntent( + context, + context.getString(R.string.help_url_battery_defender), + /* backupContext= */ ""); + ActivityCompat.startActivityForResult( + (Activity) preference.getContext(), + helpIntent, + /* requestCode= */ 0, + /* options= */ null); + + return Unit.INSTANCE; + }); + cardPreference.setPrimaryButtonVisibility(true); cardPreference.setPrimaryButtonContentDescription( context.getString( R.string.battery_tip_limited_temporarily_sec_button_content_description)); cardPreference.setSecondaryButtonText( context.getString(R.string.battery_tip_charge_to_full_button)); - cardPreference.setSecondaryButtonClickListener( - unused -> { + cardPreference.setSecondaryButtonAction( + () -> { resumeCharging(context); preference.setVisible(false); + + return Unit.INSTANCE; }); - cardPreference.setSecondaryButtonVisible(mIsPluggedIn); + cardPreference.setSecondaryButtonVisibility(mIsPluggedIn); + cardPreference.buildContent(); } private void resumeCharging(Context context) { diff --git a/src/com/android/settings/fuelgauge/batterytip/tips/IncompatibleChargerTip.java b/src/com/android/settings/fuelgauge/batterytip/tips/IncompatibleChargerTip.java index 882b755a28f..c9ff8641ceb 100644 --- a/src/com/android/settings/fuelgauge/batterytip/tips/IncompatibleChargerTip.java +++ b/src/com/android/settings/fuelgauge/batterytip/tips/IncompatibleChargerTip.java @@ -16,11 +16,13 @@ package com.android.settings.fuelgauge.batterytip.tips; +import android.app.Activity; import android.app.settings.SettingsEnums; import android.content.Context; import android.os.Parcel; import android.util.Log; +import androidx.core.app.ActivityCompat; import androidx.preference.Preference; import com.android.settings.R; @@ -28,6 +30,8 @@ import com.android.settings.widget.CardPreference; import com.android.settingslib.HelpUtils; import com.android.settingslib.core.instrumentation.MetricsFeatureProvider; +import kotlin.Unit; + /** Tip to show incompatible charger state */ public final class IncompatibleChargerTip extends BatteryTip { private static final String TAG = "IncompatibleChargerTip"; @@ -77,18 +81,27 @@ public final class IncompatibleChargerTip extends BatteryTip { } cardPreference.setSelectable(false); + cardPreference.setIconResId(getIconId()); cardPreference.setPrimaryButtonText(context.getString(R.string.learn_more)); - cardPreference.setPrimaryButtonClickListener( - button -> - button.startActivityForResult( - HelpUtils.getHelpIntent( - context, - context.getString(R.string.help_url_incompatible_charging), - /* backupContext */ ""), /* requestCode */ - 0)); - cardPreference.setPrimaryButtonVisible(true); + cardPreference.setPrimaryButtonAction( + () -> { + var helpIntent = + HelpUtils.getHelpIntent( + context, + context.getString(R.string.help_url_incompatible_charging), + /* backupContext */ ""); + ActivityCompat.startActivityForResult( + (Activity) context, + helpIntent, + /* requestCode= */ 0, + /* options= */ null); + + return Unit.INSTANCE; + }); + cardPreference.setPrimaryButtonVisibility(true); cardPreference.setPrimaryButtonContentDescription( context.getString(R.string.battery_tip_incompatible_charging_content_description)); + cardPreference.buildContent(); } public static final Creator CREATOR = diff --git a/src/com/android/settings/widget/CardPreference.java b/src/com/android/settings/widget/CardPreference.java deleted file mode 100644 index 61114d959f2..00000000000 --- a/src/com/android/settings/widget/CardPreference.java +++ /dev/null @@ -1,170 +0,0 @@ -/* - * 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.settings.widget; - -import android.content.Context; -import android.util.AttributeSet; -import android.view.View; -import android.widget.Button; - -import androidx.preference.Preference; -import androidx.preference.PreferenceViewHolder; - -import com.android.settings.R; - -import com.google.android.material.card.MaterialCardView; - -import java.util.Optional; - -/** Preference that wrapped by {@link MaterialCardView} */ -public class CardPreference extends Preference { - - private View.OnClickListener mPrimaryBtnClickListener = null; - private View.OnClickListener mSecondaryBtnClickListener = null; - - private String mPrimaryButtonText = null; - private String mSecondaryButtonText = null; - - private Optional