diff --git a/res/values/strings.xml b/res/values/strings.xml
index e70a1803e7c..272bcb59e71 100644
--- a/res/values/strings.xml
+++ b/res/values/strings.xml
@@ -6203,6 +6203,12 @@
Charging temporarily limited
To preserve your battery. Learn more.
+
+ Resume charging
+
+ In certain conditions, like high temperatures and long charging periods, charging may be limited to %1$s to help preserve battery health.\n\nWhen those conditions end, your phone will automatically charge normally.
+
+ In certain conditions, like high temperatures and long charging periods, charging may be limited to %1$s to help preserve battery health.\n\nWhen those conditions end, your tablet will automatically charge normally.
Because you’ve used your phone more than usual, your battery may run out sooner than it normally would.\n\nApps using most battery:
diff --git a/src/com/android/settings/fuelgauge/PowerUsageFeatureProvider.java b/src/com/android/settings/fuelgauge/PowerUsageFeatureProvider.java
index ff70c57d1c1..dd3b4d4ab95 100644
--- a/src/com/android/settings/fuelgauge/PowerUsageFeatureProvider.java
+++ b/src/com/android/settings/fuelgauge/PowerUsageFeatureProvider.java
@@ -133,6 +133,11 @@ public interface PowerUsageFeatureProvider {
*/
boolean isChartGraphSlotsEnabled(Context context);
+ /**
+ * Gets a intent for one time bypass charge limited to resume charging.
+ */
+ Intent getResumeChargeIntent();
+
/**
* Returns battery history data with corresponding timestamp key.
*/
diff --git a/src/com/android/settings/fuelgauge/PowerUsageFeatureProviderImpl.java b/src/com/android/settings/fuelgauge/PowerUsageFeatureProviderImpl.java
index 0d350941ff6..a0652a7d808 100644
--- a/src/com/android/settings/fuelgauge/PowerUsageFeatureProviderImpl.java
+++ b/src/com/android/settings/fuelgauge/PowerUsageFeatureProviderImpl.java
@@ -147,6 +147,11 @@ public class PowerUsageFeatureProviderImpl implements PowerUsageFeatureProvider
return false;
}
+ @Override
+ public Intent getResumeChargeIntent() {
+ return null;
+ }
+
@Override
public Map> getBatteryHistory(Context context) {
return null;
diff --git a/src/com/android/settings/fuelgauge/batterytip/BatteryTipDialogFragment.java b/src/com/android/settings/fuelgauge/batterytip/BatteryTipDialogFragment.java
index 58038cd4bb4..d4c00a44cd2 100644
--- a/src/com/android/settings/fuelgauge/batterytip/BatteryTipDialogFragment.java
+++ b/src/com/android/settings/fuelgauge/batterytip/BatteryTipDialogFragment.java
@@ -20,6 +20,9 @@ import android.app.Dialog;
import android.app.settings.SettingsEnums;
import android.content.Context;
import android.content.DialogInterface;
+import android.content.Intent;
+import android.content.IntentFilter;
+import android.os.BatteryManager;
import android.os.Bundle;
import android.view.LayoutInflater;
@@ -40,6 +43,7 @@ import com.android.settings.fuelgauge.batterytip.tips.HighUsageTip;
import com.android.settings.fuelgauge.batterytip.tips.RestrictAppTip;
import com.android.settings.fuelgauge.batterytip.tips.UnrestrictAppTip;
+import java.text.NumberFormat;
import java.util.List;
/**
@@ -138,6 +142,29 @@ public class BatteryTipDialogFragment extends InstrumentedDialogFragment impleme
.setPositiveButton(R.string.battery_tip_unrestrict_app_dialog_ok, this)
.setNegativeButton(R.string.battery_tip_unrestrict_app_dialog_cancel, null)
.create();
+ case BatteryTip.TipType.BATTERY_DEFENDER:
+ mMetricsFeatureProvider.action(context,
+ SettingsEnums.ACTION_TIP_BATTERY_DEFENDER, mMetricsKey);
+ final double chargeLimitLevel = 0.8f;
+ final String percentage =
+ NumberFormat.getPercentInstance().format(chargeLimitLevel);
+ final String message = context.getString(
+ R.string.battery_tip_limited_temporarily_dialog_msg, percentage);
+ final boolean isPluggedIn = isPluggedIn();
+ final AlertDialog.Builder dialogBuilder =
+ new AlertDialog.Builder(context)
+ .setTitle(R.string.battery_tip_limited_temporarily_title)
+ .setMessage(message);
+ if (isPluggedIn) {
+ dialogBuilder
+ .setPositiveButton(
+ R.string.battery_tip_limited_temporarily_dialog_resume_charge,
+ this)
+ .setNegativeButton(R.string.okay, null);
+ } else {
+ dialogBuilder.setPositiveButton(R.string.okay, null);
+ }
+ return dialogBuilder.create();
default:
throw new IllegalArgumentException("unknown type " + mBatteryTip.getType());
}
@@ -163,4 +190,11 @@ public class BatteryTipDialogFragment extends InstrumentedDialogFragment impleme
lsn.onBatteryTipHandled(mBatteryTip);
}
+ private boolean isPluggedIn() {
+ final Intent batteryIntent = getContext().registerReceiver(null /* receiver */,
+ new IntentFilter(Intent.ACTION_BATTERY_CHANGED));
+ return batteryIntent != null && batteryIntent.getIntExtra(
+ BatteryManager.EXTRA_PLUGGED, 0) != 0;
+ }
+
}
diff --git a/src/com/android/settings/fuelgauge/batterytip/actions/BatteryDefenderAction.java b/src/com/android/settings/fuelgauge/batterytip/actions/BatteryDefenderAction.java
index 24cddcd809e..824b6bee5ca 100644
--- a/src/com/android/settings/fuelgauge/batterytip/actions/BatteryDefenderAction.java
+++ b/src/com/android/settings/fuelgauge/batterytip/actions/BatteryDefenderAction.java
@@ -16,12 +16,10 @@
package com.android.settings.fuelgauge.batterytip.actions;
-import android.app.settings.SettingsEnums;
import android.content.Intent;
-import com.android.settings.R;
import com.android.settings.SettingsActivity;
-import com.android.settingslib.HelpUtils;
+import com.android.settings.overlay.FeatureFactory;
/**
* Action to open the Support Center article
@@ -34,19 +32,12 @@ public class BatteryDefenderAction extends BatteryTipAction {
mSettingsActivity = settingsActivity;
}
- /**
- * Handle the action when user clicks positive button
- */
@Override
public void handlePositiveAction(int metricsKey) {
- mMetricsFeatureProvider.action(mContext,
- SettingsEnums.ACTION_TIP_BATTERY_DEFENDER, metricsKey);
- final Intent intent = HelpUtils.getHelpIntent(
- mContext,
- mContext.getString(R.string.help_url_battery_defender),
- getClass().getName());
+ final Intent intent = FeatureFactory.getFactory(mContext)
+ .getPowerUsageFeatureProvider(mContext).getResumeChargeIntent();
if (intent != null) {
- mSettingsActivity.startActivityForResult(intent, 0);
+ mContext.sendBroadcast(intent);
}
}
}
diff --git a/src/com/android/settings/fuelgauge/batterytip/detectors/BatteryDefenderDetector.java b/src/com/android/settings/fuelgauge/batterytip/detectors/BatteryDefenderDetector.java
index dc33026c934..5befa330b0a 100644
--- a/src/com/android/settings/fuelgauge/batterytip/detectors/BatteryDefenderDetector.java
+++ b/src/com/android/settings/fuelgauge/batterytip/detectors/BatteryDefenderDetector.java
@@ -17,7 +17,6 @@
package com.android.settings.fuelgauge.batterytip.detectors;
import com.android.settings.fuelgauge.BatteryInfo;
-import com.android.settings.fuelgauge.BatteryUtils;
import com.android.settings.fuelgauge.batterytip.tips.BatteryDefenderTip;
import com.android.settings.fuelgauge.batterytip.tips.BatteryTip;
@@ -34,7 +33,7 @@ public class BatteryDefenderDetector implements BatteryTipDetector {
@Override
public BatteryTip detect() {
final int state =
- BatteryUtils.isBatteryDefenderOn(mBatteryInfo)
+ mBatteryInfo.isOverheated
? BatteryTip.StateType.NEW
: BatteryTip.StateType.INVISIBLE;
return new BatteryDefenderTip(state);
diff --git a/src/com/android/settings/fuelgauge/batterytip/tips/BatteryDefenderTip.java b/src/com/android/settings/fuelgauge/batterytip/tips/BatteryDefenderTip.java
index 242be24b44e..a2890ad9b40 100644
--- a/src/com/android/settings/fuelgauge/batterytip/tips/BatteryDefenderTip.java
+++ b/src/com/android/settings/fuelgauge/batterytip/tips/BatteryDefenderTip.java
@@ -29,7 +29,7 @@ import com.android.settingslib.core.instrumentation.MetricsFeatureProvider;
public class BatteryDefenderTip extends BatteryTip {
public BatteryDefenderTip(@StateType int state) {
- super(TipType.BATTERY_DEFENDER, state, false /* showDialog */);
+ super(TipType.BATTERY_DEFENDER, state, true /* showDialog */);
}
private BatteryDefenderTip(Parcel in) {
diff --git a/tests/robotests/src/com/android/settings/fuelgauge/PowerUsageFeatureProviderImplTest.java b/tests/robotests/src/com/android/settings/fuelgauge/PowerUsageFeatureProviderImplTest.java
index c79059a6db9..6761a34e909 100644
--- a/tests/robotests/src/com/android/settings/fuelgauge/PowerUsageFeatureProviderImplTest.java
+++ b/tests/robotests/src/com/android/settings/fuelgauge/PowerUsageFeatureProviderImplTest.java
@@ -121,4 +121,9 @@ public class PowerUsageFeatureProviderImplTest {
assertThat(mPowerFeatureProvider.isSmartBatterySupported()).isFalse();
}
+
+ @Test
+ public void testGetResumeChargeIntent_returnNull() {
+ assertThat(mPowerFeatureProvider.getResumeChargeIntent()).isNull();
+ }
}
diff --git a/tests/robotests/src/com/android/settings/fuelgauge/batterytip/BatteryTipDialogFragmentTest.java b/tests/robotests/src/com/android/settings/fuelgauge/batterytip/BatteryTipDialogFragmentTest.java
index 331fb343d43..99fbaf3c812 100644
--- a/tests/robotests/src/com/android/settings/fuelgauge/batterytip/BatteryTipDialogFragmentTest.java
+++ b/tests/robotests/src/com/android/settings/fuelgauge/batterytip/BatteryTipDialogFragmentTest.java
@@ -31,6 +31,7 @@ import androidx.appcompat.app.AlertDialog;
import androidx.fragment.app.FragmentActivity;
import com.android.settings.R;
+import com.android.settings.fuelgauge.batterytip.tips.BatteryDefenderTip;
import com.android.settings.fuelgauge.batterytip.tips.BatteryTip;
import com.android.settings.fuelgauge.batterytip.tips.HighUsageTip;
import com.android.settings.fuelgauge.batterytip.tips.RestrictAppTip;
@@ -74,6 +75,7 @@ public class BatteryTipDialogFragmentTest {
private RestrictAppTip mRestrictTwoAppsTip;
private UnrestrictAppTip mUnrestrictAppTip;
private SummaryTip mSummaryTip;
+ private BatteryDefenderTip mDefenderTip;
private AppInfo mAppInfo;
private ShadowPackageManager mPackageManager;
@@ -116,6 +118,7 @@ public class BatteryTipDialogFragmentTest {
mUnrestrictAppTip = new UnrestrictAppTip(BatteryTip.StateType.NEW, mAppInfo);
mSummaryTip = spy(new SummaryTip(BatteryTip.StateType.NEW,
EstimateKt.AVERAGE_TIME_TO_DISCHARGE_UNKNOWN));
+ mDefenderTip = new BatteryDefenderTip(BatteryTip.StateType.NEW);
}
@After
@@ -243,4 +246,20 @@ public class BatteryTipDialogFragmentTest {
+ "your phone will suggest actions you can take.\n\nYou can always turn"
+ " on Battery Saver if you’re running low on battery.");
}
+
+ @Test
+ public void testOnCreateDialog_defenderTip_fireDialog() {
+ mDialogFragment = BatteryTipDialogFragment.newInstance(mDefenderTip, METRICS_KEY);
+
+ FragmentController.setupFragment(mDialogFragment, FragmentActivity.class,
+ 0 /* containerViewId */, null /* bundle */);
+
+ final AlertDialog dialog = ShadowAlertDialogCompat.getLatestAlertDialog();
+ ShadowAlertDialogCompat shadowDialog = ShadowAlertDialogCompat.shadowOf(dialog);
+
+ assertThat(shadowDialog.getTitle()).isEqualTo(
+ mContext.getString(R.string.battery_tip_limited_temporarily_title));
+ assertThat(shadowDialog.getMessage()).isEqualTo(
+ mContext.getString(R.string.battery_tip_limited_temporarily_dialog_msg, "80%"));
+ }
}
diff --git a/tests/robotests/src/com/android/settings/fuelgauge/batterytip/actions/BatteryDefenderActionTest.java b/tests/robotests/src/com/android/settings/fuelgauge/batterytip/actions/BatteryDefenderActionTest.java
deleted file mode 100644
index ad5dc54ca9b..00000000000
--- a/tests/robotests/src/com/android/settings/fuelgauge/batterytip/actions/BatteryDefenderActionTest.java
+++ /dev/null
@@ -1,70 +0,0 @@
-/*
- * Copyright (C) 2021 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.fuelgauge.batterytip.actions;
-
-
-import static com.google.common.truth.Truth.assertThat;
-
-import static org.mockito.Mockito.doReturn;
-import static org.mockito.Mockito.spy;
-import static org.mockito.Mockito.verify;
-
-import android.app.settings.SettingsEnums;
-import android.content.Context;
-
-import com.android.settings.R;
-import com.android.settings.SettingsActivity;
-import com.android.settings.testutils.FakeFeatureFactory;
-import com.android.settingslib.core.instrumentation.MetricsFeatureProvider;
-
-import org.junit.Before;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.mockito.Mock;
-import org.mockito.MockitoAnnotations;
-import org.robolectric.RobolectricTestRunner;
-import org.robolectric.RuntimeEnvironment;
-
-@RunWith(RobolectricTestRunner.class)
-public final class BatteryDefenderActionTest {
-
- private Context mContext;
- private FakeFeatureFactory mFeatureFactory;
- private BatteryDefenderAction mBatteryDefenderAction;
- private MetricsFeatureProvider mMetricsFeatureProvider;
-
- @Mock private SettingsActivity mSettingsActivity;
-
- @Before
- public void setUp() {
- MockitoAnnotations.initMocks(this);
-
- mFeatureFactory = FakeFeatureFactory.setupForTest();
- mMetricsFeatureProvider = mFeatureFactory.metricsFeatureProvider;
- mContext = spy(RuntimeEnvironment.application);
- doReturn(mContext).when(mSettingsActivity).getApplicationContext();
- mBatteryDefenderAction = new BatteryDefenderAction(mSettingsActivity);
- }
-
- @Test
- public void testHandlePositiveAction_logMetric() {
- final int metricKey = 10;
- mBatteryDefenderAction.handlePositiveAction(metricKey);
-
- verify(mMetricsFeatureProvider).action(mContext,
- SettingsEnums.ACTION_TIP_BATTERY_DEFENDER, metricKey);
- }
-}