Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 99a2de41 authored by jackqdyulei's avatar jackqdyulei
Browse files

Add restrict and unrestrict dialog

Add a fake unrestrict tip so we could reuse the BatteryTipDialogFragment
to build the unrestrict dialog.

After this cl, restrict dialog has two types:
1. dialog to only restrict one app
2. dialog to restrict more than one app

Will add dialog to restrict more than 5 apps when strings are finalized.

Bug: 72385333
Bug: 72227981
Test: RunSettingsRoboTests
Change-Id: Ib0328f0386efad525b331fd713dd15d060a1a649
parent ab0cde6b
Loading
Loading
Loading
Loading
+13 −0
Original line number Diff line number Diff line
@@ -4860,10 +4860,23 @@
    <!-- Summary for restricted app preference, showing the impact of the apps [CHAR LIMIT=NONE] -->
    <string name="battery_tip_restrict_handled_summary">App changes are in progress</string>
    <!-- Title for dialog to restrict the app [CHAR LIMIT=NONE] -->
    <plurals name="battery_tip_restrict_app_dialog_title">
        <item quantity="one">Restrict app?</item>
        <item quantity="other">Restrict %1$d apps?</item>
    </plurals>
    <!-- Message for battery tip dialog to show the restrict app list [CHAR LIMIT=NONE] -->
    <string name="battery_tip_restrict_app_dialog_message">To save battery, you can stop this app from running in the background when it’s not being used.</string>
    <!-- OK button for battery tip dialog to show the restrict app list [CHAR LIMIT=NONE] -->
    <string name="battery_tip_restrict_app_dialog_ok">Restrict</string>
    <!-- Title for dialog to remove restriction for the app [CHAR LIMIT=NONE] -->
    <string name="battery_tip_unrestrict_app_dialog_title">Remove restriction for <xliff:g id="app">%1$s</xliff:g>?</string>
    <!-- Message for  dialog to show the impact if remove restriction for app [CHAR LIMIT=NONE] -->
    <string name="battery_tip_unrestrict_app_dialog_message">This app will be able to use battery in the background. This may cause your battery to be used up faster.</string>
    <!-- OK button for dialog to remove restriction for app [CHAR LIMIT=NONE] -->
    <string name="battery_tip_unrestrict_app_dialog_ok">Remove</string>
    <!-- CANCEL button for dialog to remove restriction for app [CHAR LIMIT=NONE] -->
    <string name="battery_tip_unrestrict_app_dialog_cancel">Not now</string>
    <!-- Title for the smart battery manager preference [CHAR LIMIT=NONE] -->
    <string name="smart_battery_manager_title">Smart battery manager</string>
+5 −3
Original line number Diff line number Diff line
@@ -46,6 +46,8 @@ import com.android.settings.Utils;
import com.android.settings.applications.LayoutPreference;
import com.android.settings.dashboard.DashboardFragment;
import com.android.settings.fuelgauge.anomaly.AnomalyUtils;
import com.android.settings.fuelgauge.batterytip.BatteryTipPreferenceController;
import com.android.settings.fuelgauge.batterytip.tips.BatteryTip;
import com.android.settings.wrapper.DevicePolicyManagerWrapper;
import com.android.settings.fuelgauge.anomaly.Anomaly;
import com.android.settings.fuelgauge.anomaly.AnomalyDialogFragment;
@@ -69,7 +71,7 @@ public class AdvancedPowerUsageDetail extends DashboardFragment implements
        ButtonActionDialogFragment.AppButtonsDialogListener,
        AnomalyDialogFragment.AnomalyDialogListener,
        LoaderManager.LoaderCallbacks<List<Anomaly>>,
        BackgroundActivityPreferenceController.WarningConfirmationListener {
        BatteryTipPreferenceController.BatteryTipListener {

    public static final String TAG = "AdvancedPowerUsageDetail";
    public static final String EXTRA_UID = "extra_uid";
@@ -373,8 +375,8 @@ public class AdvancedPowerUsageDetail extends DashboardFragment implements
    }

    @Override
    public void onLimitBackgroundActivity() {
        mBackgroundActivityPreferenceController.setRestricted(
    public void onBatteryTipHandled(BatteryTip batteryTip) {
        mBackgroundActivityPreferenceController.updateSummary(
                findPreference(mBackgroundActivityPreferenceController.getPreferenceKey()));
    }
}
+16 −63
Original line number Diff line number Diff line
@@ -14,27 +14,22 @@

package com.android.settings.fuelgauge;

import android.app.AlertDialog;
import android.app.AppOpsManager;
import android.app.Dialog;
import android.app.Fragment;
import android.app.admin.DevicePolicyManager;
import android.content.Context;
import android.content.DialogInterface;
import android.content.pm.ApplicationInfo;
import android.content.pm.PackageManager;
import android.os.Build;
import android.os.Bundle;
import android.os.UserManager;
import android.support.annotation.VisibleForTesting;
import android.support.v14.preference.SwitchPreference;
import android.support.v7.preference.Preference;
import android.util.Log;

import com.android.settings.R;
import com.android.settings.Utils;
import com.android.settings.core.PreferenceControllerMixin;
import com.android.settings.core.instrumentation.InstrumentedDialogFragment;
import com.android.settings.fuelgauge.batterytip.AppInfo;
import com.android.settings.fuelgauge.batterytip.BatteryTipDialogFragment;
import com.android.settings.fuelgauge.batterytip.tips.BatteryTip;
import com.android.settings.fuelgauge.batterytip.tips.RestrictAppTip;
import com.android.settings.fuelgauge.batterytip.tips.UnrestrictAppTip;
import com.android.settings.wrapper.DevicePolicyManagerWrapper;
import com.android.settingslib.core.AbstractPreferenceController;
import com.android.settingslib.fuelgauge.PowerWhitelistBackend;
@@ -99,15 +94,6 @@ public class BackgroundActivityPreferenceController extends AbstractPreferenceCo
        return mTargetPackage != null;
    }

    /**
     * Called from the warning dialog, if the user decides to go ahead and disable background
     * activity for this package
     */
    public void setRestricted(Preference preference) {
        mBatteryUtils.setForceAppStandby(mUid, mTargetPackage, AppOpsManager.MODE_IGNORED);
        updateSummary(preference);
    }

    @Override
    public String getPreferenceKey() {
        return KEY_BACKGROUND_ACTIVITY;
@@ -119,20 +105,13 @@ public class BackgroundActivityPreferenceController extends AbstractPreferenceCo
            final int mode = mAppOpsManager
                    .checkOpNoThrow(AppOpsManager.OP_RUN_ANY_IN_BACKGROUND, mUid, mTargetPackage);
            final boolean restricted = mode == AppOpsManager.MODE_IGNORED;
            if (!restricted) {
                showDialog();
                return false;
            }
            mBatteryUtils.setForceAppStandby(mUid, mTargetPackage, AppOpsManager.MODE_ALLOWED);
            updateSummary(preference);
            return true;
            showDialog(restricted);
        }

        return false;
    }

    @VisibleForTesting
    void updateSummary(Preference preference) {
    public void updateSummary(Preference preference) {
        if (mPowerWhitelistBackend.isWhitelisted(mTargetPackage)) {
            preference.setSummary(R.string.background_activity_summary_whitelisted);
            return;
@@ -150,42 +129,16 @@ public class BackgroundActivityPreferenceController extends AbstractPreferenceCo
    }

    @VisibleForTesting
    void showDialog() {
        final WarningDialogFragment dialogFragment = new WarningDialogFragment();
    void showDialog(boolean restricted) {
        final AppInfo appInfo = new AppInfo.Builder()
                .setPackageName(mTargetPackage)
                .build();
        BatteryTip tip = restricted
                ? new UnrestrictAppTip(BatteryTip.StateType.NEW, appInfo)
                : new RestrictAppTip(BatteryTip.StateType.NEW, appInfo);

        final BatteryTipDialogFragment dialogFragment = BatteryTipDialogFragment.newInstance(tip);
        dialogFragment.setTargetFragment(mFragment, 0 /* requestCode */);
        dialogFragment.show(mFragment.getFragmentManager(), TAG);
    }

    interface WarningConfirmationListener {
        void onLimitBackgroundActivity();
    }

    /**
     * Warning dialog to show to the user as turning off background activity can lead to
     * apps misbehaving as their background task scheduling guarantees will no longer be honored.
     */
    public static class WarningDialogFragment extends InstrumentedDialogFragment {
        @Override
        public int getMetricsCategory() {
            // TODO (b/65494831): add metric id
            return 0;
        }

        @Override
        public Dialog onCreateDialog(Bundle savedInstanceState) {
            final WarningConfirmationListener listener =
                    (WarningConfirmationListener) getTargetFragment();
            return new AlertDialog.Builder(getContext())
                    .setTitle(R.string.background_activity_warning_dialog_title)
                    .setMessage(R.string.background_activity_warning_dialog_text)
                    .setPositiveButton(R.string.dlg_ok, new DialogInterface.OnClickListener() {
                        @Override
                        public void onClick(DialogInterface dialog, int which) {
                            listener.onLimitBackgroundActivity();
                        }
                    })
                    .setNegativeButton(R.string.dlg_cancel, null)
                    .create();
        }
    }
}
+25 −8
Original line number Diff line number Diff line
@@ -35,6 +35,7 @@ import com.android.settings.fuelgauge.batterytip.actions.BatteryTipAction;
import com.android.settings.fuelgauge.batterytip.tips.BatteryTip;
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.util.List;

@@ -89,20 +90,36 @@ public class BatteryTipDialogFragment extends InstrumentedDialogFragment impleme
                        .create();
            case BatteryTip.TipType.APP_RESTRICTION:
                final RestrictAppTip restrictAppTip = (RestrictAppTip) mBatteryTip;
                final RecyclerView restrictionView = (RecyclerView) LayoutInflater.from(
                        context).inflate(R.layout.recycler_view, null);
                final List<AppInfo> restrictedAppList = restrictAppTip.getRestrictAppList();
                final int num = restrictedAppList.size();
                restrictionView.setLayoutManager(new LinearLayoutManager(context));
                restrictionView.setAdapter(new HighUsageAdapter(context, restrictedAppList));

                return new AlertDialog.Builder(context)
                final AlertDialog.Builder builder = new AlertDialog.Builder(context)
                        .setTitle(context.getResources().getQuantityString(
                                R.plurals.battery_tip_restrict_title, num, num))
                                R.plurals.battery_tip_restrict_app_dialog_title, num, num))
                        .setMessage(getString(R.string.battery_tip_restrict_app_dialog_message))
                        .setView(restrictionView)
                        .setPositiveButton(R.string.battery_tip_restrict_app_dialog_ok, this)
                        .setNegativeButton(android.R.string.cancel, null)
                        .setNegativeButton(android.R.string.cancel, null);

                // TODO(b/72385333): consider building dialog with 5+ apps when strings are done
                if (num > 1) {
                    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);
                }

                return builder.create();
            case BatteryTip.TipType.REMOVE_APP_RESTRICTION:
                final UnrestrictAppTip unrestrictAppTip = (UnrestrictAppTip) mBatteryTip;
                final CharSequence name = Utils.getApplicationLabel(context,
                        unrestrictAppTip.getPackageName());

                return new AlertDialog.Builder(context)
                        .setTitle(getString(R.string.battery_tip_unrestrict_app_dialog_title, name))
                        .setMessage(R.string.battery_tip_unrestrict_app_dialog_message)
                        .setPositiveButton(R.string.battery_tip_unrestrict_app_dialog_ok, this)
                        .setNegativeButton(R.string.battery_tip_unrestrict_app_dialog_cancel, null)
                        .create();
            default:
                throw new IllegalArgumentException("unknown type " + mBatteryTip.getType());
+10 −1
Original line number Diff line number Diff line
@@ -17,12 +17,17 @@
package com.android.settings.fuelgauge.batterytip;

import android.app.Fragment;
import android.content.Context;

import com.android.settings.SettingsActivity;
import com.android.settings.fuelgauge.batterytip.actions.BatterySaverAction;
import com.android.settings.fuelgauge.batterytip.actions.BatteryTipAction;
import com.android.settings.fuelgauge.batterytip.actions.RestrictAppAction;
import com.android.settings.fuelgauge.batterytip.actions.SmartBatteryAction;
import com.android.settings.fuelgauge.batterytip.actions.UnrestrictAppAction;
import com.android.settings.fuelgauge.batterytip.tips.BatteryTip;
import com.android.settings.fuelgauge.batterytip.tips.RestrictAppTip;
import com.android.settings.fuelgauge.batterytip.tips.UnrestrictAppTip;

/**
 * Utility class for {@link BatteryTip}
@@ -42,7 +47,11 @@ public class BatteryTipUtils {
            case BatteryTip.TipType.SMART_BATTERY_MANAGER:
                return new SmartBatteryAction(settingsActivity, fragment);
            case BatteryTip.TipType.BATTERY_SAVER:
                return new BatterySaverAction(settingsActivity.getApplicationContext());
                return new BatterySaverAction(settingsActivity);
            case BatteryTip.TipType.APP_RESTRICTION:
                return new RestrictAppAction(settingsActivity, (RestrictAppTip) batteryTip);
            case BatteryTip.TipType.REMOVE_APP_RESTRICTION:
                return new UnrestrictAppAction(settingsActivity, (UnrestrictAppTip) batteryTip);
            default:
                return null;
        }
Loading