Fix some things in settings: manage apps, battery, procstats

Issue #17461567: java.lang.ArithmeticException: divide by zero when
looking at Settings > Battery

Yeah, let's not do that.

Issue #17365562: Running services RAM totals are wrong

Okay so like a few months ago, I had this vacation coming up, and
it was around the feature complete (hahah) deadline, and I had to
rush to get this in before I left.  So I rushed.  And, well, I forgot
a few things.  Here they are.  We now show the right numbers and
even update things correctly when you change what processes are
being shown.  Wow.

Finally, fixed a few issues in the dev tools procstats UI.

Change-Id: I8348a9c2ec3226a455c5c8465729e4487f324c8b
This commit is contained in:
Dianne Hackborn
2014-09-11 18:09:29 -07:00
parent 574db42695
commit c891ce6565
3 changed files with 87 additions and 49 deletions

View File

@@ -404,10 +404,11 @@ public class ProcessStatsUi extends PreferenceFragment
mAppListGroup.removeAll();
mAppListGroup.setOrderingAsAdded(false);
final long elapsedTime = mStats.mTimePeriodEndRealtime-mStats.mTimePeriodStartRealtime;
mMemStatusPref.setOrder(-2);
mAppListGroup.addPreference(mMemStatusPref);
String durationString = Utils.formatElapsedTime(getActivity(),
mStats.mTimePeriodEndRealtime-mStats.mTimePeriodStartRealtime, false);
String durationString = Utils.formatElapsedTime(getActivity(), elapsedTime, false);
CharSequence memString;
CharSequence[] memStatesStr = getResources().getTextArray(R.array.ram_states);
if (mMemState >= 0 && mMemState < memStatesStr.length) {
@@ -480,6 +481,15 @@ public class ProcessStatsUi extends PreferenceFragment
int badnessColor = badColors[1 + Math.round(memBadness*(badColors.length-2))];
colors.setColors(badnessColor, badnessColor, badnessColor);
// We are now going to scale the mMemTimes to match the total elapsed time.
// These are in uptime, so they will often be smaller than the elapsed time,
// but if the user taps on the bar we want to show the times to them. It is confusing
// to see them be smaller than what we told them the measured duration is, so just
// scaling them up with make things look reasonable with them none the wiser.
for (int i=0; i<ProcessStats.ADJ_MEM_FACTOR_COUNT; i++) {
mMemTimes[i] = (long)((mMemTimes[i]*(double)elapsedTime)/mTotalTime);
}
ProcessStats.TotalMemoryUseCollection totalMem = new ProcessStats.TotalMemoryUseCollection(
ProcessStats.ALL_SCREEN_ADJ, memStates);
mStats.computeTotalMemoryUse(totalMem, now);
@@ -728,15 +738,22 @@ public class ProcessStatsUi extends PreferenceFragment
if (DEBUG) Log.d(TAG, "-------------------- BUILDING UI");
for (int i=0, N=(entries != null ? entries.size() : 0); i<N; i++) {
// Find where we should stop. Because we have two properties we are looking at,
// we need to go from the back looking for the first place either holds.
int end = entries != null ? entries.size()-1 : -1;
while (end >= 0) {
ProcStatsEntry proc = entries.get(end);
final double percentOfWeight = (((double)proc.mWeight) / mMaxWeight) * 100;
final double percentOfTime = (((double)proc.mDuration) / memTotalTime) * 100;
if (percentOfWeight >= 1 || percentOfTime >= 25) {
break;
}
end--;
}
for (int i=0; i<=end; i++) {
ProcStatsEntry proc = entries.get(i);
final double percentOfWeight = (((double)proc.mWeight) / mMaxWeight) * 100;
final double percentOfTime = (((double)proc.mDuration) / memTotalTime) * 100;
if (percentOfWeight < 1 && percentOfTime < 33) {
if (DEBUG) Log.d(TAG, "Skipping " + proc.mName + " weight=" + percentOfWeight
+ " time=" + percentOfTime);
continue;
}
ProcessStatsPreference pref = new ProcessStatsPreference(getActivity());
pref.init(null, proc);
proc.evaluateTargetPackage(pm, mStats, totals, sEntryCompare, mUseUss,

View File

@@ -75,17 +75,18 @@ public class RunningProcessesView extends FrameLayout
View mHeader;
ServiceListAdapter mAdapter;
LinearColorBar mColorBar;
TextView mBackgroundProcessPrefix;
TextView mAppsProcessPrefix;
TextView mForegroundProcessPrefix;
TextView mBackgroundProcessText;
TextView mAppsProcessText;
TextView mForegroundProcessText;
int mLastNumBackgroundProcesses = -1;
int mLastNumForegroundProcesses = -1;
int mLastNumServiceProcesses = -1;
long mLastBackgroundProcessMemory = -1;
long mLastForegroundProcessMemory = -1;
long mLastServiceProcessMemory = -1;
long mLastAvailMemory = -1;
long mCurTotalRam = -1;
long mCurHighRam = -1; // "System" or "Used"
long mCurMedRam = -1; // "Apps" or "Cached"
long mCurLowRam = -1; // "Free"
boolean mCurShowCached = false;
Dialog mCurDialog;
@@ -228,8 +229,7 @@ public class RunningProcessesView extends FrameLayout
mShowBackground = showBackground;
mState.setWatchingBackgroundItems(showBackground);
refreshItems();
notifyDataSetChanged();
mColorBar.setShowingGreen(mShowBackground);
refreshUi(true);
}
}
@@ -329,53 +329,71 @@ public class RunningProcessesView extends FrameLayout
mDataAvail = null;
}
mMemInfoReader.readMemInfo();
/*
// This is the amount of available memory until we start killing
// background services.
mMemInfoReader.readMemInfo();
long availMem = mMemInfoReader.getFreeSize() + mMemInfoReader.getCachedSize()
- SECONDARY_SERVER_MEM;
if (availMem < 0) {
availMem = 0;
}
*/
synchronized (mState.mLock) {
if (mLastNumBackgroundProcesses != mState.mNumBackgroundProcesses
|| mLastBackgroundProcessMemory != mState.mBackgroundProcessMemory
|| mLastNumForegroundProcesses != mState.mNumForegroundProcesses
|| mLastForegroundProcessMemory != mState.mForegroundProcessMemory
|| mLastNumServiceProcesses != mState.mNumServiceProcesses
|| mLastServiceProcessMemory != mState.mServiceProcessMemory
|| mLastAvailMemory != availMem) {
mLastNumBackgroundProcesses = mState.mNumBackgroundProcesses;
mLastBackgroundProcessMemory = mState.mBackgroundProcessMemory;
mLastForegroundProcessMemory = mState.mForegroundProcessMemory;
mLastServiceProcessMemory = mState.mServiceProcessMemory;
mLastAvailMemory = availMem;
long freeMem = mLastAvailMemory + mLastBackgroundProcessMemory;
if (mCurShowCached != mAdapter.mShowBackground) {
mCurShowCached = mAdapter.mShowBackground;
if (mCurShowCached) {
mForegroundProcessPrefix.setText(getResources().getText(
R.string.running_processes_header_used_prefix));
mAppsProcessPrefix.setText(getResources().getText(
R.string.running_processes_header_cached_prefix));
} else {
mForegroundProcessPrefix.setText(getResources().getText(
R.string.running_processes_header_system_prefix));
mAppsProcessPrefix.setText(getResources().getText(
R.string.running_processes_header_apps_prefix));
}
}
final long totalRam = mMemInfoReader.getTotalSize();
final long medRam;
final long lowRam;
if (mCurShowCached) {
lowRam = mMemInfoReader.getFreeSize() + mMemInfoReader.getCachedSize();
medRam = mState.mBackgroundProcessMemory;
} else {
lowRam = mMemInfoReader.getFreeSize() + mMemInfoReader.getCachedSize()
+ mState.mBackgroundProcessMemory;
medRam = mState.mServiceProcessMemory;
}
final long highRam = totalRam - medRam - lowRam;
if (mCurTotalRam != totalRam || mCurHighRam != highRam || mCurMedRam != medRam
|| mCurLowRam != lowRam) {
mCurTotalRam = totalRam;
mCurHighRam = highRam;
mCurMedRam = medRam;
mCurLowRam = lowRam;
BidiFormatter bidiFormatter = BidiFormatter.getInstance();
String sizeStr = bidiFormatter.unicodeWrap(
Formatter.formatShortFileSize(getContext(), freeMem));
Formatter.formatShortFileSize(getContext(), lowRam));
mBackgroundProcessText.setText(getResources().getString(
R.string.running_processes_header_ram, sizeStr));
sizeStr = bidiFormatter.unicodeWrap(
Formatter.formatShortFileSize(getContext(),
mLastForegroundProcessMemory + mLastServiceProcessMemory));
Formatter.formatShortFileSize(getContext(), medRam));
mAppsProcessText.setText(getResources().getString(
R.string.running_processes_header_ram, sizeStr));
sizeStr = bidiFormatter.unicodeWrap(
Formatter.formatShortFileSize(getContext(),
mMemInfoReader.getTotalSize() - freeMem
- mLastForegroundProcessMemory - mLastServiceProcessMemory));
Formatter.formatShortFileSize(getContext(), highRam));
mForegroundProcessText.setText(getResources().getString(
R.string.running_processes_header_ram, sizeStr));
mColorBar.setRatios(highRam/(float)totalRam,
medRam/(float)totalRam,
lowRam/(float)totalRam);
}
float totalMem = mMemInfoReader.getTotalSize();
float totalShownMem = availMem + mLastBackgroundProcessMemory
+ mLastServiceProcessMemory;
mColorBar.setRatios((totalMem-totalShownMem)/totalMem,
mLastServiceProcessMemory/totalMem,
mLastBackgroundProcessMemory/totalMem);
}
}
@@ -435,6 +453,9 @@ public class RunningProcessesView extends FrameLayout
mColorBar.setColors(res.getColor(R.color.running_processes_system_ram),
res.getColor(R.color.running_processes_apps_ram),
res.getColor(R.color.running_processes_free_ram));
mBackgroundProcessPrefix = (TextView)mHeader.findViewById(R.id.freeSizePrefix);
mAppsProcessPrefix = (TextView)mHeader.findViewById(R.id.appsSizePrefix);
mForegroundProcessPrefix = (TextView)mHeader.findViewById(R.id.systemSizePrefix);
mBackgroundProcessText = (TextView)mHeader.findViewById(R.id.freeSize);
mAppsProcessText = (TextView)mHeader.findViewById(R.id.appsSize);
mForegroundProcessText = (TextView)mHeader.findViewById(R.id.systemSize);

View File

@@ -1011,7 +1011,7 @@ public class BatteryHistoryChart extends View {
mTimeRemainPath.close();
}
if (mStartWallTime > 0) {
if (mStartWallTime > 0 && mEndWallTime > mStartWallTime) {
// Create the time labels at the bottom.
boolean is24hr = is24Hour();
Calendar calStart = Calendar.getInstance();