Fix issue #11033002: Percentages in proc stats details are not rounded correctly

Use round instead of ceil.  Also, when showing services from multiple packages,
sort the package categories by the duration of the longest running service in
each, so that the more important ones come first.

Change-Id: I42b47b0522cd786a1c4ee5b59a549ec7c0c6ffe1
This commit is contained in:
Dianne Hackborn
2013-10-09 12:06:59 -07:00
parent 8a4c53ac2b
commit 020999103b

View File

@@ -74,7 +74,7 @@ public class ProcessStatsDetail extends Fragment implements Button.OnClickListen
public static String makePercentString(Resources res, long amount, long total) { public static String makePercentString(Resources res, long amount, long total) {
final double percent = (((double)amount) / total) * 100; final double percent = (((double)amount) / total) * 100;
return res.getString(R.string.percentage, (int) Math.ceil(percent)); return res.getString(R.string.percentage, (int) Math.round(percent));
} }
@Override @Override
@@ -220,17 +220,42 @@ public class ProcessStatsDetail extends Fragment implements Button.OnClickListen
} }
}; };
final static Comparator<ArrayList<ProcStatsEntry.Service>> sServicePkgCompare
= new Comparator<ArrayList<ProcStatsEntry.Service>>() {
@Override
public int compare(ArrayList<ProcStatsEntry.Service> lhs,
ArrayList<ProcStatsEntry.Service> rhs) {
long topLhs = lhs.size() > 0 ? lhs.get(0).mDuration : 0;
long topRhs = rhs.size() > 0 ? rhs.get(0).mDuration : 0;
if (topLhs < topRhs) {
return 1;
} else if (topLhs > topRhs) {
return -1;
}
return 0;
}
};
private void fillServicesSection() { private void fillServicesSection() {
if (mEntry.mServices.size() > 0) { if (mEntry.mServices.size() > 0) {
boolean addPackageSections = false; boolean addPackageSections = false;
if (mEntry.mServices.size() > 1 // Sort it all.
|| !mEntry.mServices.valueAt(0).get(0).mPackage.equals(mEntry.mPackage)) { ArrayList<ArrayList<ProcStatsEntry.Service>> servicePkgs
addPackageSections = true; = new ArrayList<ArrayList<ProcStatsEntry.Service>>();
}
for (int ip=0; ip<mEntry.mServices.size(); ip++) { for (int ip=0; ip<mEntry.mServices.size(); ip++) {
ArrayList<ProcStatsEntry.Service> services = ArrayList<ProcStatsEntry.Service> services =
(ArrayList<ProcStatsEntry.Service>)mEntry.mServices.valueAt(ip).clone(); (ArrayList<ProcStatsEntry.Service>)mEntry.mServices.valueAt(ip).clone();
Collections.sort(services, sServiceCompare); Collections.sort(services, sServiceCompare);
servicePkgs.add(services);
}
if (mEntry.mServices.size() > 1
|| !mEntry.mServices.valueAt(0).get(0).mPackage.equals(mEntry.mPackage)) {
addPackageSections = true;
// Sort these so that the one(s) with the longest run durations are on top.
Collections.sort(servicePkgs, sServicePkgCompare);
}
for (int ip=0; ip<servicePkgs.size(); ip++) {
ArrayList<ProcStatsEntry.Service> services = servicePkgs.get(ip);
if (addPackageSections) { if (addPackageSections) {
addPackageHeaderItem(mServicesParent, services.get(0).mPackage); addPackageHeaderItem(mServicesParent, services.get(0).mPackage);
} }