Loading src/com/android/settings/fuelgauge/batterytip/BatteryTipLoader.java +1 −1 Original line number Diff line number Diff line Loading @@ -71,7 +71,7 @@ public class BatteryTipLoader extends AsyncLoader<List<BatteryTip>> { tips.add(new SmartBatteryDetector(policy, context.getContentResolver()).detect()); tips.add(new EarlyWarningDetector(policy, context).detect()); tips.add(new SummaryDetector(policy).detect()); tips.add(new RestrictAppDetector(policy).detect()); tips.add(new RestrictAppDetector(context, policy).detect()); Collections.sort(tips); return tips; Loading src/com/android/settings/fuelgauge/batterytip/actions/RestrictAppAction.java +7 −0 Original line number Diff line number Diff line Loading @@ -21,7 +21,9 @@ import android.content.Context; import android.support.annotation.VisibleForTesting; import com.android.settings.fuelgauge.BatteryUtils; import com.android.settings.fuelgauge.batterytip.AnomalyDatabaseHelper; import com.android.settings.fuelgauge.batterytip.AppInfo; import com.android.settings.fuelgauge.batterytip.BatteryDatabaseManager; import com.android.settings.fuelgauge.batterytip.tips.RestrictAppTip; import java.util.List; Loading @@ -32,12 +34,15 @@ import java.util.List; public class RestrictAppAction extends BatteryTipAction { private RestrictAppTip mRestrictAppTip; @VisibleForTesting BatteryDatabaseManager mBatteryDatabaseManager; @VisibleForTesting BatteryUtils mBatteryUtils; public RestrictAppAction(Context context, RestrictAppTip tip) { super(context); mRestrictAppTip = tip; mBatteryUtils = BatteryUtils.getInstance(context); mBatteryDatabaseManager = new BatteryDatabaseManager(context); } /** Loading @@ -53,5 +58,7 @@ public class RestrictAppAction extends BatteryTipAction { mBatteryUtils.setForceAppStandby(mBatteryUtils.getPackageUid(packageName), packageName, AppOpsManager.MODE_IGNORED); } mBatteryDatabaseManager.updateAnomalies(appInfos, AnomalyDatabaseHelper.State.HANDLED); } } src/com/android/settings/fuelgauge/batterytip/detectors/RestrictAppDetector.java +40 −5 Original line number Diff line number Diff line Loading @@ -16,7 +16,13 @@ package com.android.settings.fuelgauge.batterytip.detectors; import android.content.Context; import android.support.annotation.VisibleForTesting; import android.text.format.DateUtils; import com.android.settings.fuelgauge.batterytip.AnomalyDatabaseHelper; import com.android.settings.fuelgauge.batterytip.AppInfo; import com.android.settings.fuelgauge.batterytip.BatteryDatabaseManager; import com.android.settings.fuelgauge.batterytip.BatteryTipPolicy; import com.android.settings.fuelgauge.batterytip.tips.BatteryTip; import com.android.settings.fuelgauge.batterytip.tips.RestrictAppTip; Loading @@ -29,18 +35,47 @@ import java.util.List; * {@link BatteryTipDetector} since it need the most up-to-date {@code visibleTips} */ public class RestrictAppDetector implements BatteryTipDetector { @VisibleForTesting static final boolean USE_FAKE_DATA = false; private BatteryTipPolicy mPolicy; @VisibleForTesting BatteryDatabaseManager mBatteryDatabaseManager; public RestrictAppDetector(BatteryTipPolicy policy) { public RestrictAppDetector(Context context, BatteryTipPolicy policy) { mPolicy = policy; mBatteryDatabaseManager = new BatteryDatabaseManager(context); } @Override public BatteryTip detect() { // TODO(b/70570352): Detect restrict apps here, get data from database if (USE_FAKE_DATA) { return getFakeData(); } if (mPolicy.appRestrictionEnabled) { // TODO(b/72385333): hook up the query timestamp to server side final long oneDayBeforeMs = System.currentTimeMillis() - DateUtils.DAY_IN_MILLIS; final List<AppInfo> highUsageApps = mBatteryDatabaseManager.queryAllAnomalies( oneDayBeforeMs, AnomalyDatabaseHelper.State.NEW); if (!highUsageApps.isEmpty()) { // If there are new anomalies, show them return new RestrictAppTip(BatteryTip.StateType.NEW, highUsageApps); } else { // Otherwise, show auto-handled one if it exists final List<AppInfo> autoHandledApps = mBatteryDatabaseManager.queryAllAnomalies( oneDayBeforeMs, AnomalyDatabaseHelper.State.AUTO_HANDLED); return new RestrictAppTip(autoHandledApps.isEmpty() ? BatteryTip.StateType.INVISIBLE : BatteryTip.StateType.HANDLED, autoHandledApps); } } else { return new RestrictAppTip(BatteryTip.StateType.INVISIBLE, new ArrayList<>()); } } private BatteryTip getFakeData() { final List<AppInfo> highUsageApps = new ArrayList<>(); return new RestrictAppTip( highUsageApps.isEmpty() ? BatteryTip.StateType.INVISIBLE : BatteryTip.StateType.NEW, highUsageApps); highUsageApps.add(new AppInfo.Builder() .setPackageName("com.android.settings") .build()); return new RestrictAppTip(BatteryTip.StateType.NEW, highUsageApps); } } src/com/android/settings/fuelgauge/batterytip/tips/RestrictAppTip.java +8 −1 Original line number Diff line number Diff line Loading @@ -81,7 +81,14 @@ public class RestrictAppTip extends BatteryTip { @Override public void updateState(BatteryTip tip) { mState = tip.mState; if (tip.mState == StateType.NEW) { // Display it if new anomaly comes mState = StateType.NEW; mRestrictAppList = ((RestrictAppTip) tip).mRestrictAppList; } else if (mState == StateType.NEW && tip.mState == StateType.INVISIBLE) { // If anomaly becomes invisible, show it as handled mState = StateType.HANDLED; } } public List<AppInfo> getRestrictAppList() { Loading tests/robotests/src/com/android/settings/fuelgauge/batterytip/actions/RestrictAppActionTest.java +7 −1 Original line number Diff line number Diff line Loading @@ -27,8 +27,10 @@ import com.android.settings.fuelgauge.BatteryUtils; import com.android.settings.fuelgauge.batterytip.AppInfo; import com.android.settings.fuelgauge.batterytip.tips.BatteryTip; import com.android.settings.fuelgauge.batterytip.tips.RestrictAppTip; import com.android.settings.testutils.DatabaseTestUtils; import com.android.settings.testutils.SettingsRobolectricTestRunner; import org.junit.After; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; Loading Loading @@ -69,6 +71,11 @@ public class RestrictAppActionTest { mRestrictAppAction.mBatteryUtils = mBatteryUtils; } @After public void cleanUp() { DatabaseTestUtils.clearDb(mContext); } @Test public void testHandlePositiveAction() { mRestrictAppAction.handlePositiveAction(); Loading @@ -79,5 +86,4 @@ public class RestrictAppActionTest { eq(AppOpsManager.MODE_IGNORED)); } } Loading
src/com/android/settings/fuelgauge/batterytip/BatteryTipLoader.java +1 −1 Original line number Diff line number Diff line Loading @@ -71,7 +71,7 @@ public class BatteryTipLoader extends AsyncLoader<List<BatteryTip>> { tips.add(new SmartBatteryDetector(policy, context.getContentResolver()).detect()); tips.add(new EarlyWarningDetector(policy, context).detect()); tips.add(new SummaryDetector(policy).detect()); tips.add(new RestrictAppDetector(policy).detect()); tips.add(new RestrictAppDetector(context, policy).detect()); Collections.sort(tips); return tips; Loading
src/com/android/settings/fuelgauge/batterytip/actions/RestrictAppAction.java +7 −0 Original line number Diff line number Diff line Loading @@ -21,7 +21,9 @@ import android.content.Context; import android.support.annotation.VisibleForTesting; import com.android.settings.fuelgauge.BatteryUtils; import com.android.settings.fuelgauge.batterytip.AnomalyDatabaseHelper; import com.android.settings.fuelgauge.batterytip.AppInfo; import com.android.settings.fuelgauge.batterytip.BatteryDatabaseManager; import com.android.settings.fuelgauge.batterytip.tips.RestrictAppTip; import java.util.List; Loading @@ -32,12 +34,15 @@ import java.util.List; public class RestrictAppAction extends BatteryTipAction { private RestrictAppTip mRestrictAppTip; @VisibleForTesting BatteryDatabaseManager mBatteryDatabaseManager; @VisibleForTesting BatteryUtils mBatteryUtils; public RestrictAppAction(Context context, RestrictAppTip tip) { super(context); mRestrictAppTip = tip; mBatteryUtils = BatteryUtils.getInstance(context); mBatteryDatabaseManager = new BatteryDatabaseManager(context); } /** Loading @@ -53,5 +58,7 @@ public class RestrictAppAction extends BatteryTipAction { mBatteryUtils.setForceAppStandby(mBatteryUtils.getPackageUid(packageName), packageName, AppOpsManager.MODE_IGNORED); } mBatteryDatabaseManager.updateAnomalies(appInfos, AnomalyDatabaseHelper.State.HANDLED); } }
src/com/android/settings/fuelgauge/batterytip/detectors/RestrictAppDetector.java +40 −5 Original line number Diff line number Diff line Loading @@ -16,7 +16,13 @@ package com.android.settings.fuelgauge.batterytip.detectors; import android.content.Context; import android.support.annotation.VisibleForTesting; import android.text.format.DateUtils; import com.android.settings.fuelgauge.batterytip.AnomalyDatabaseHelper; import com.android.settings.fuelgauge.batterytip.AppInfo; import com.android.settings.fuelgauge.batterytip.BatteryDatabaseManager; import com.android.settings.fuelgauge.batterytip.BatteryTipPolicy; import com.android.settings.fuelgauge.batterytip.tips.BatteryTip; import com.android.settings.fuelgauge.batterytip.tips.RestrictAppTip; Loading @@ -29,18 +35,47 @@ import java.util.List; * {@link BatteryTipDetector} since it need the most up-to-date {@code visibleTips} */ public class RestrictAppDetector implements BatteryTipDetector { @VisibleForTesting static final boolean USE_FAKE_DATA = false; private BatteryTipPolicy mPolicy; @VisibleForTesting BatteryDatabaseManager mBatteryDatabaseManager; public RestrictAppDetector(BatteryTipPolicy policy) { public RestrictAppDetector(Context context, BatteryTipPolicy policy) { mPolicy = policy; mBatteryDatabaseManager = new BatteryDatabaseManager(context); } @Override public BatteryTip detect() { // TODO(b/70570352): Detect restrict apps here, get data from database if (USE_FAKE_DATA) { return getFakeData(); } if (mPolicy.appRestrictionEnabled) { // TODO(b/72385333): hook up the query timestamp to server side final long oneDayBeforeMs = System.currentTimeMillis() - DateUtils.DAY_IN_MILLIS; final List<AppInfo> highUsageApps = mBatteryDatabaseManager.queryAllAnomalies( oneDayBeforeMs, AnomalyDatabaseHelper.State.NEW); if (!highUsageApps.isEmpty()) { // If there are new anomalies, show them return new RestrictAppTip(BatteryTip.StateType.NEW, highUsageApps); } else { // Otherwise, show auto-handled one if it exists final List<AppInfo> autoHandledApps = mBatteryDatabaseManager.queryAllAnomalies( oneDayBeforeMs, AnomalyDatabaseHelper.State.AUTO_HANDLED); return new RestrictAppTip(autoHandledApps.isEmpty() ? BatteryTip.StateType.INVISIBLE : BatteryTip.StateType.HANDLED, autoHandledApps); } } else { return new RestrictAppTip(BatteryTip.StateType.INVISIBLE, new ArrayList<>()); } } private BatteryTip getFakeData() { final List<AppInfo> highUsageApps = new ArrayList<>(); return new RestrictAppTip( highUsageApps.isEmpty() ? BatteryTip.StateType.INVISIBLE : BatteryTip.StateType.NEW, highUsageApps); highUsageApps.add(new AppInfo.Builder() .setPackageName("com.android.settings") .build()); return new RestrictAppTip(BatteryTip.StateType.NEW, highUsageApps); } }
src/com/android/settings/fuelgauge/batterytip/tips/RestrictAppTip.java +8 −1 Original line number Diff line number Diff line Loading @@ -81,7 +81,14 @@ public class RestrictAppTip extends BatteryTip { @Override public void updateState(BatteryTip tip) { mState = tip.mState; if (tip.mState == StateType.NEW) { // Display it if new anomaly comes mState = StateType.NEW; mRestrictAppList = ((RestrictAppTip) tip).mRestrictAppList; } else if (mState == StateType.NEW && tip.mState == StateType.INVISIBLE) { // If anomaly becomes invisible, show it as handled mState = StateType.HANDLED; } } public List<AppInfo> getRestrictAppList() { Loading
tests/robotests/src/com/android/settings/fuelgauge/batterytip/actions/RestrictAppActionTest.java +7 −1 Original line number Diff line number Diff line Loading @@ -27,8 +27,10 @@ import com.android.settings.fuelgauge.BatteryUtils; import com.android.settings.fuelgauge.batterytip.AppInfo; import com.android.settings.fuelgauge.batterytip.tips.BatteryTip; import com.android.settings.fuelgauge.batterytip.tips.RestrictAppTip; import com.android.settings.testutils.DatabaseTestUtils; import com.android.settings.testutils.SettingsRobolectricTestRunner; import org.junit.After; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; Loading Loading @@ -69,6 +71,11 @@ public class RestrictAppActionTest { mRestrictAppAction.mBatteryUtils = mBatteryUtils; } @After public void cleanUp() { DatabaseTestUtils.clearDb(mContext); } @Test public void testHandlePositiveAction() { mRestrictAppAction.handlePositiveAction(); Loading @@ -79,5 +86,4 @@ public class RestrictAppActionTest { eq(AppOpsManager.MODE_IGNORED)); } }