diff --git a/res/values/strings.xml b/res/values/strings.xml index 978c2947faf..026590efc79 100644 --- a/res/values/strings.xml +++ b/res/values/strings.xml @@ -4879,8 +4879,12 @@ Restrict app? Restrict %1$d apps? - - To save battery, you can stop this app from running in the background when it’s not being used. + + To save battery, stop %1$s from using battery in the background. + + To save battery, stop these apps from using battery in the background.\n\nApps:\n + + To save battery, stop these apps from using battery in the background.\n\nApps:\n%1$s. Restrict diff --git a/src/com/android/settings/fuelgauge/batterytip/BatteryTipDialogFragment.java b/src/com/android/settings/fuelgauge/batterytip/BatteryTipDialogFragment.java index b39e4ef8fbf..a7d542ca69e 100644 --- a/src/com/android/settings/fuelgauge/batterytip/BatteryTipDialogFragment.java +++ b/src/com/android/settings/fuelgauge/batterytip/BatteryTipDialogFragment.java @@ -107,21 +107,30 @@ public class BatteryTipDialogFragment extends InstrumentedDialogFragment impleme final RestrictAppTip restrictAppTip = (RestrictAppTip) mBatteryTip; final List restrictedAppList = restrictAppTip.getRestrictAppList(); final int num = restrictedAppList.size(); + final CharSequence appLabel = Utils.getApplicationLabel(context, + restrictedAppList.get(0).packageName); final AlertDialog.Builder builder = new AlertDialog.Builder(context) .setTitle(context.getResources().getQuantityString( R.plurals.battery_tip_restrict_app_dialog_title, num, num)) - .setMessage(getString(R.string.battery_tip_restrict_app_dialog_message)) .setPositiveButton(R.string.battery_tip_restrict_app_dialog_ok, this) .setNegativeButton(android.R.string.cancel, null); - - // TODO(b/72385333): consider building dialog with 5+ apps when strings are done - if (num > 1) { + if (num == 1) { + builder.setMessage( + getString(R.string.battery_tip_restrict_app_dialog_message, appLabel)); + } else if (num <= 5) { + builder.setMessage( + getString( + R.string.battery_tip_restrict_apps_less_than_5_dialog_message)); final RecyclerView restrictionView = (RecyclerView) LayoutInflater.from( context).inflate(R.layout.recycler_view, null); restrictionView.setLayoutManager(new LinearLayoutManager(context)); restrictionView.setAdapter(new HighUsageAdapter(context, restrictedAppList)); builder.setView(restrictionView); + } else { + builder.setMessage(context.getString( + R.string.battery_tip_restrict_apps_more_than_5_dialog_message, + restrictAppTip.getRestrictAppsString(context))); } return builder.create(); diff --git a/src/com/android/settings/fuelgauge/batterytip/tips/RestrictAppTip.java b/src/com/android/settings/fuelgauge/batterytip/tips/RestrictAppTip.java index 566cbfac882..9c3a9bdc9e0 100644 --- a/src/com/android/settings/fuelgauge/batterytip/tips/RestrictAppTip.java +++ b/src/com/android/settings/fuelgauge/batterytip/tips/RestrictAppTip.java @@ -17,8 +17,9 @@ package com.android.settings.fuelgauge.batterytip.tips; import android.content.Context; -import android.content.res.Resources; +import android.icu.text.ListFormatter; import android.os.Parcel; +import android.text.TextUtils; import android.util.Pair; import com.android.internal.annotations.VisibleForTesting; @@ -72,7 +73,7 @@ public class RestrictAppTip extends BatteryTip { return mState == StateType.HANDLED ? context.getString(R.string.battery_tip_restrict_handled_summary) : context.getResources().getQuantityString(R.plurals.battery_tip_restrict_summary, - num, appLabel, num); + num, appLabel, num); } @Override @@ -118,6 +119,19 @@ public class RestrictAppTip extends BatteryTip { return mRestrictAppList; } + /** + * Construct the app list string(e.g. app1, app2, and app3) + */ + public CharSequence getRestrictAppsString(Context context) { + final List appLabels = new ArrayList<>(); + for (int i = 0, size = mRestrictAppList.size(); i < size; i++) { + appLabels.add(Utils.getApplicationLabel(context, + mRestrictAppList.get(i).packageName)); + } + + return ListFormatter.getInstance().format(appLabels); + } + @Override public String toString() { final StringBuilder stringBuilder = new StringBuilder(super.toString()); 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 6f8bb26e504..85e5b1e05a4 100644 --- a/tests/robotests/src/com/android/settings/fuelgauge/batterytip/BatteryTipDialogFragmentTest.java +++ b/tests/robotests/src/com/android/settings/fuelgauge/batterytip/BatteryTipDialogFragmentTest.java @@ -33,6 +33,7 @@ import com.android.settings.fuelgauge.batterytip.tips.HighUsageTip; import com.android.settings.fuelgauge.batterytip.tips.RestrictAppTip; import com.android.settings.fuelgauge.batterytip.tips.SummaryTip; import com.android.settings.fuelgauge.batterytip.tips.UnrestrictAppTip; +import com.android.settings.testutils.FakeFeatureFactory; import com.android.settings.testutils.SettingsRobolectricTestRunner; import com.android.settings.testutils.shadow.ShadowUtils; @@ -63,33 +64,36 @@ public class BatteryTipDialogFragmentTest { private Context mContext; private HighUsageTip mHighUsageTip; private RestrictAppTip mRestrictedOneAppTip; - private RestrictAppTip mRestrictAppsTip; + private RestrictAppTip mRestrictTwoAppsTip; private UnrestrictAppTip mUnrestrictAppTip; private SummaryTip mSummaryTip; + private AppInfo mAppInfo; @Before public void setUp() { MockitoAnnotations.initMocks(this); mContext = spy(RuntimeEnvironment.application); + FakeFeatureFactory.setupForTest(); + ShadowUtils.setApplicationLabel(PACKAGE_NAME, DISPLAY_NAME); List highUsageTips = new ArrayList<>(); - final AppInfo appInfo = new AppInfo.Builder() + mAppInfo = new AppInfo.Builder() .setScreenOnTimeMs(SCREEN_TIME_MS) .setPackageName(PACKAGE_NAME) .build(); - highUsageTips.add(appInfo); + highUsageTips.add(mAppInfo); mHighUsageTip = new HighUsageTip(SCREEN_TIME_MS, highUsageTips); final List restrictApps = new ArrayList<>(); - restrictApps.add(appInfo); + restrictApps.add(mAppInfo); mRestrictedOneAppTip = new RestrictAppTip(BatteryTip.StateType.NEW, new ArrayList<>(restrictApps)); - restrictApps.add(appInfo); - mRestrictAppsTip = new RestrictAppTip(BatteryTip.StateType.NEW, + restrictApps.add(mAppInfo); + mRestrictTwoAppsTip = new RestrictAppTip(BatteryTip.StateType.NEW, new ArrayList<>(restrictApps)); - mUnrestrictAppTip = new UnrestrictAppTip(BatteryTip.StateType.NEW, appInfo); + mUnrestrictAppTip = new UnrestrictAppTip(BatteryTip.StateType.NEW, mAppInfo); mSummaryTip = spy(new SummaryTip(BatteryTip.StateType.NEW, Estimate.AVERAGE_TIME_TO_DISCHARGE_UNKNOWN)); } @@ -122,14 +126,15 @@ public class BatteryTipDialogFragmentTest { assertThat(shadowDialog.getTitle()).isEqualTo("Restrict app?"); assertThat(shadowDialog.getMessage()) - .isEqualTo(mContext.getString(R.string.battery_tip_restrict_app_dialog_message)); + .isEqualTo("To save battery, stop app from using " + + "battery in the background."); } @Test - public void testOnCreateDialog_restrictAppsTip_fireRestrictAppsDialog() { + public void testOnCreateDialog_restrictTwoAppsTip_fireRestrictTwoAppsDialog() { Robolectric.getForegroundThreadScheduler().pause(); - mDialogFragment = BatteryTipDialogFragment.newInstance(mRestrictAppsTip); + mDialogFragment = BatteryTipDialogFragment.newInstance(mRestrictTwoAppsTip); FragmentTestUtil.startFragment(mDialogFragment); @@ -140,14 +145,40 @@ public class BatteryTipDialogFragmentTest { assertThat(shadowDialog.getTitle()).isEqualTo("Restrict 2 apps?"); assertThat(shadowDialog.getMessage()) - .isEqualTo(mContext.getString(R.string.battery_tip_restrict_app_dialog_message)); + .isEqualTo("To save battery, stop these apps from using battery in the background" + + ".\n\nApps:\n"); assertThat(shadowDialog.getView()).isNotNull(); } + @Test + public void testOnCreateDialog_restrictSixAppsTip_fireRestrictSixAppsDialog() { + Robolectric.getForegroundThreadScheduler().pause(); + + final List appInfos = new ArrayList<>(); + for (int i = 0; i < 6; i++) { + appInfos.add(mAppInfo); + } + final RestrictAppTip restrictSixAppsTip = new RestrictAppTip(BatteryTip.StateType.NEW, + appInfos); + + mDialogFragment = BatteryTipDialogFragment.newInstance(restrictSixAppsTip); + + FragmentTestUtil.startFragment(mDialogFragment); + + Robolectric.getForegroundThreadScheduler().advanceToLastPostedRunnable(); + + final AlertDialog dialog = (AlertDialog) ShadowDialog.getLatestDialog(); + ShadowAlertDialog shadowDialog = shadowOf(dialog); + + assertThat(shadowDialog.getTitle()).isEqualTo("Restrict 6 apps?"); + assertThat(shadowDialog.getMessage()) + .isEqualTo("To save battery, stop these apps from using battery in the background" + + ".\n\nApps:\napp, app, app, app, app, and app."); + } + @Test public void testOnCreateDialog_unRestrictAppTip_fireUnRestrictDialog() { mDialogFragment = BatteryTipDialogFragment.newInstance(mUnrestrictAppTip); - ShadowUtils.setApplicationLabel(PACKAGE_NAME, DISPLAY_NAME); FragmentTestUtil.startFragment(mDialogFragment);