Linked the recent location apps to battery page

* Extracted BatteryStatsHelper from PowerUsageSummary

* Dropped the "pause" and "resume" method from the
RadioButtonPreference

* Opening battery usage page when the user clicks the recent location
apps item

Change-Id: I5a2d03271434765780154265976d8caa7f8060d8
This commit is contained in:
Lifu Tang
2013-08-12 16:34:45 -07:00
parent 5db411db98
commit c3e9ac937a
7 changed files with 1049 additions and 808 deletions

View File

@@ -20,14 +20,22 @@ import android.app.AppOpsManager;
import android.content.Context;
import android.content.pm.ApplicationInfo;
import android.content.pm.PackageManager;
import android.os.Bundle;
import android.preference.Preference;
import android.preference.PreferenceActivity;
import android.preference.PreferenceCategory;
import android.preference.PreferenceManager;
import android.preference.PreferenceScreen;
import android.util.Log;
import com.android.settings.R;
import com.android.settings.applications.InstalledAppDetails;
import com.android.settings.fuelgauge.BatterySipper;
import com.android.settings.fuelgauge.BatteryStatsHelper;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
/**
* Retrieves the information of applications which accessed location recently.
@@ -37,12 +45,52 @@ public class RecentLocationApps {
private static final int RECENT_TIME_INTERVAL_MILLIS = 15 * 60 * 1000;
private Context mContext;
PackageManager mPackageManager;
private final PreferenceActivity mActivity;
private final BatteryStatsHelper mStatsHelper;
private final PackageManager mPackageManager;
public RecentLocationApps(Context context) {
mContext = context;
mPackageManager = context.getPackageManager();
// Stores all the packages that requested location within the designated interval
// key - package name of the app
// value - whether the app has requested high power location
public RecentLocationApps(PreferenceActivity activity, BatteryStatsHelper sipperUtil) {
mActivity = activity;
mPackageManager = activity.getPackageManager();
mStatsHelper = sipperUtil;
}
private class UidEntryClickedListener
implements Preference.OnPreferenceClickListener {
private BatterySipper mSipper;
public UidEntryClickedListener(BatterySipper sipper) {
mSipper = sipper;
}
@Override
public boolean onPreferenceClick(Preference preference) {
mStatsHelper.startBatteryDetailPage(mActivity, mSipper);
return true;
}
}
private class PackageEntryClickedListener
implements Preference.OnPreferenceClickListener {
private String mPackage;
public PackageEntryClickedListener(String packageName) {
mPackage = packageName;
}
@Override
public boolean onPreferenceClick(Preference preference) {
// start new fragment to display extended information
Bundle args = new Bundle();
args.putString(InstalledAppDetails.ARG_PACKAGE_NAME, mPackage);
mActivity.startPreferencePanel(InstalledAppDetails.class.getName(), args,
R.string.application_info_label, null, null, 0);
return true;
}
}
/**
@@ -50,17 +98,68 @@ public class RecentLocationApps {
* specified time.
*/
public void fillAppList(PreferenceCategory container) {
HashMap<String, Boolean> packageMap = new HashMap<String, Boolean>();
AppOpsManager aoManager =
(AppOpsManager) mContext.getSystemService(Context.APP_OPS_SERVICE);
(AppOpsManager) mActivity.getSystemService(Context.APP_OPS_SERVICE);
List<AppOpsManager.PackageOps> appOps = aoManager.getPackagesForOps(
new int[] {
AppOpsManager.OP_MONITOR_LOCATION,
AppOpsManager.OP_MONITOR_HIGH_POWER_LOCATION,
AppOpsManager.OP_MONITOR_HIGH_POWER_LOCATION,
});
PreferenceManager preferenceManager = container.getPreferenceManager();
long now = System.currentTimeMillis();
for (AppOpsManager.PackageOps ops : appOps) {
processPackageOps(now, container, preferenceManager, ops);
processPackageOps(now, container, preferenceManager, ops, packageMap);
}
mStatsHelper.refreshStats();
List<BatterySipper> usageList = mStatsHelper.getUsageList();
for (BatterySipper sipper : usageList) {
sipper.loadNameAndIcon();
String[] packages = sipper.getPackages();
if (packages == null) {
continue;
}
for (String curPackage : packages) {
if (packageMap.containsKey(curPackage)) {
PreferenceScreen screen = preferenceManager.createPreferenceScreen(mActivity);
screen.setIcon(sipper.getIcon());
screen.setTitle(sipper.getLabel());
if (packageMap.get(curPackage)) {
screen.setSummary(R.string.location_high_battery_use);
} else {
screen.setSummary(R.string.location_low_battery_use);
}
container.addPreference(screen);
screen.setOnPreferenceClickListener(new UidEntryClickedListener(sipper));
packageMap.remove(curPackage);
break;
}
}
}
// Typically there shouldn't be any entry left in the HashMap. But if there are any, add
// them to the list and link them to the app info page.
for (Map.Entry<String, Boolean> entry : packageMap.entrySet()) {
try {
PreferenceScreen screen = preferenceManager.createPreferenceScreen(mActivity);
ApplicationInfo appInfo = mPackageManager.getApplicationInfo(
entry.getKey(), PackageManager.GET_META_DATA);
screen.setIcon(mPackageManager.getApplicationIcon(appInfo));
screen.setTitle(mPackageManager.getApplicationLabel(appInfo));
// if used both high and low battery within the time interval, show as "high
// battery"
if (entry.getValue()) {
screen.setSummary(R.string.location_high_battery_use);
} else {
screen.setSummary(R.string.location_low_battery_use);
}
screen.setOnPreferenceClickListener(
new PackageEntryClickedListener(entry.getKey()));
container.addPreference(screen);
} catch (PackageManager.NameNotFoundException e) {
// ignore the current app and move on to the next.
}
}
}
@@ -68,7 +167,8 @@ public class RecentLocationApps {
long now,
PreferenceCategory container,
PreferenceManager preferenceManager,
AppOpsManager.PackageOps ops) {
AppOpsManager.PackageOps ops,
HashMap<String, Boolean> packageMap) {
String packageName = ops.getPackageName();
List<AppOpsManager.OpEntry> entries = ops.getOps();
boolean highBattery = false;
@@ -96,22 +196,6 @@ public class RecentLocationApps {
return;
}
try {
PreferenceScreen screen = preferenceManager.createPreferenceScreen(mContext);
ApplicationInfo appInfo = mPackageManager.getApplicationInfo(
packageName, PackageManager.GET_META_DATA);
screen.setIcon(mPackageManager.getApplicationIcon(appInfo));
screen.setTitle(mPackageManager.getApplicationLabel(appInfo));
// if used both high and low battery within the time interval, show as "high
// battery"
if (highBattery) {
screen.setSummary(R.string.location_high_battery_use);
} else {
screen.setSummary(R.string.location_low_battery_use);
}
container.addPreference(screen);
} catch (PackageManager.NameNotFoundException e) {
// ignore the current app and move on to the next.
}
packageMap.put(packageName, highBattery);
}
}