Merge "Changed logic when dumpstate's max progress increases." into nyc-dev

This commit is contained in:
Felipe Leme
2016-03-22 17:21:19 +00:00
committed by Android (Google) Code Review
3 changed files with 90 additions and 25 deletions

View File

@@ -149,6 +149,10 @@ public class BugreportProgressService extends Service {
// Passed to Message.obtain() when msg.arg2 is not used.
private static final int UNUSED_ARG2 = -2;
// Maximum progress displayed (like 99.00%).
private static final int CAPPED_PROGRESS = 9900;
private static final int CAPPED_MAX = 10000;
/**
* Delay before a screenshot is taken.
* <p>
@@ -427,7 +431,7 @@ public class BugreportProgressService extends Service {
final NumberFormat nf = NumberFormat.getPercentInstance();
nf.setMinimumFractionDigits(2);
nf.setMaximumFractionDigits(2);
final String percentText = nf.format((double) info.progress / info.max);
final String percentageText = nf.format((double) info.progress / info.max);
final Action cancelAction = new Action.Builder(null, mContext.getString(
com.android.internal.R.string.cancel), newCancelIntent(mContext, info)).build();
final Intent infoIntent = new Intent(mContext, BugreportProgressService.class);
@@ -458,7 +462,7 @@ public class BugreportProgressService extends Service {
.setContentTitle(title)
.setTicker(title)
.setContentText(name)
.setContentInfo(percentText)
.setContentInfo(percentageText)
.setProgress(info.max, info.progress, false)
.setOngoing(true)
.setContentIntent(infoPendingIntent)
@@ -472,7 +476,7 @@ public class BugreportProgressService extends Service {
}
if (DEBUG) {
Log.d(TAG, "Sending 'Progress' notification for id " + info.id + "(pid " + info.pid
+ "): " + percentText);
+ "): " + percentageText);
}
NotificationManager.from(mContext).notify(TAG, info.id, notification);
}
@@ -545,25 +549,47 @@ public class BugreportProgressService extends Service {
}
activeProcesses++;
final String progressKey = DUMPSTATE_PREFIX + pid + PROGRESS_SUFFIX;
final int progress = SystemProperties.getInt(progressKey, 0);
if (progress == 0) {
info.realProgress = SystemProperties.getInt(progressKey, 0);
if (info.realProgress == 0) {
Log.v(TAG, "System property " + progressKey + " is not set yet");
}
final int max = SystemProperties.getInt(DUMPSTATE_PREFIX + pid + MAX_SUFFIX, 0);
final boolean maxChanged = max > 0 && max != info.max;
final boolean progressChanged = progress > 0 && progress != info.progress;
final String maxKey = DUMPSTATE_PREFIX + pid + MAX_SUFFIX;
info.realMax = SystemProperties.getInt(maxKey, info.max);
if (info.realMax <= 0 ) {
Log.w(TAG, "Property " + maxKey + " is not positive: " + info.max);
continue;
}
/*
* Checks whether the progress changed in a way that should be displayed to the user:
* - info.progress / info.max represents the displayed progress
* - info.realProgress / info.realMax represents the real progress
* - since the real progress can decrease, the displayed progress is only updated if it
* increases
* - the displayed progress is capped at a maximum (like 99%)
*/
final int oldPercentage = (CAPPED_MAX * info.progress) / info.max;
int newPercentage = (CAPPED_MAX * info.realProgress) / info.realMax;
int max = info.realMax;
int progress = info.realProgress;
if (progressChanged || maxChanged) {
if (progressChanged) {
if (DEBUG) Log.v(TAG, "Updating progress for PID " + pid + "(id: " + id
+ ") from " + info.progress + " to " + progress);
info.progress = progress;
}
if (maxChanged) {
Log.i(TAG, "Updating max progress for PID " + pid + "(id: " + id
+ ") from " + info.max + " to " + max);
info.max = max;
if (newPercentage > CAPPED_PROGRESS) {
progress = newPercentage = CAPPED_PROGRESS;
max = CAPPED_MAX;
}
if (newPercentage > oldPercentage) {
if (DEBUG) {
if (progress != info.progress) {
Log.v(TAG, "Updating progress for PID " + pid + "(id: " + id + ") from "
+ info.progress + " to " + progress);
}
if (max != info.max) {
Log.v(TAG, "Updating max progress for PID " + pid + "(id: " + id + ") from "
+ info.max + " to " + max);
}
}
info.progress = progress;
info.max = max;
info.lastUpdate = System.currentTimeMillis();
updateProgress(info);
} else {
@@ -1450,15 +1476,25 @@ public class BugreportProgressService extends Service {
String description;
/**
* Maximum progress of the bugreport generation.
* Maximum progress of the bugreport generation as displayed by the UI.
*/
int max;
/**
* Current progress of the bugreport generation.
* Current progress of the bugreport generation as displayed by the UI.
*/
int progress;
/**
* Maximum progress of the bugreport generation as reported by dumpstate.
*/
int realMax;
/**
* Current progress of the bugreport generation as reported by dumpstate.
*/
int realProgress;
/**
* Time of the last progress update.
*/
@@ -1568,10 +1604,12 @@ public class BugreportProgressService extends Service {
@Override
public String toString() {
final float percent = ((float) progress * 100 / max);
final float realPercent = ((float) realProgress * 100 / realMax);
return "id: " + id + ", pid: " + pid + ", name: " + name + ", finished: " + finished
+ "\n\ttitle: " + title + "\n\tdescription: " + description
+ "\n\tfile: " + bugreportFile + "\n\tscreenshots: " + screenshotFiles
+ "\n\tprogress: " + progress + "/" + max + " (" + percent + ")"
+ "\n\treal progress: " + realProgress + "/" + realMax + " (" + realPercent + ")"
+ "\n\tlast_update: " + getFormattedLastUpdate()
+ "\naddingDetailsToZip: " + addingDetailsToZip
+ " addedDetailsToZip: " + addedDetailsToZip;
@@ -1587,6 +1625,8 @@ public class BugreportProgressService extends Service {
description = in.readString();
max = in.readInt();
progress = in.readInt();
realMax = in.readInt();
realProgress = in.readInt();
lastUpdate = in.readLong();
formattedLastUpdate = in.readString();
bugreportFile = readFile(in);
@@ -1609,6 +1649,8 @@ public class BugreportProgressService extends Service {
dest.writeString(description);
dest.writeInt(max);
dest.writeInt(progress);
dest.writeInt(realMax);
dest.writeInt(realProgress);
dest.writeLong(lastUpdate);
dest.writeString(getFormattedLastUpdate());
writeFile(dest, bugreportFile);

View File

@@ -26,6 +26,7 @@ import static com.android.shell.BugreportProgressService.EXTRA_PID;
import static com.android.shell.BugreportProgressService.EXTRA_SCREENSHOT;
import static com.android.shell.BugreportProgressService.INTENT_BUGREPORT_FINISHED;
import static com.android.shell.BugreportProgressService.INTENT_BUGREPORT_STARTED;
import static com.android.shell.BugreportProgressService.POLLING_FREQUENCY;
import static com.android.shell.BugreportProgressService.SCREENSHOT_DELAY_SECONDS;
import java.io.BufferedOutputStream;
@@ -92,7 +93,7 @@ public class BugreportReceiverTest extends InstrumentationTestCase {
private static final String TAG = "BugreportReceiverTest";
// Timeout for UI operations, in milliseconds.
private static final int TIMEOUT = (int) BugreportProgressService.POLLING_FREQUENCY * 4;
private static final int TIMEOUT = (int) POLLING_FREQUENCY * 4;
// Timeout for when waiting for a screenshot to finish.
private static final int SAFE_SCREENSHOT_DELAY = SCREENSHOT_DELAY_SECONDS + 10;
@@ -190,8 +191,30 @@ public class BugreportReceiverTest extends InstrumentationTestCase {
SystemProperties.set(PROGRESS_PROPERTY, "500");
assertProgressNotification(NAME, nf.format(0.50));
SystemProperties.set(PROGRESS_PROPERTY, "950");
assertProgressNotification(NAME, nf.format(0.95));
// Make sure progress never goes back...
SystemProperties.set(MAX_PROPERTY, "2000");
assertProgressNotification(NAME, nf.format(0.25));
Thread.sleep(POLLING_FREQUENCY + DateUtils.SECOND_IN_MILLIS);
assertProgressNotification(NAME, nf.format(0.95));
SystemProperties.set(PROGRESS_PROPERTY, "1000");
assertProgressNotification(NAME, nf.format(0.95));
// ...only forward...
SystemProperties.set(PROGRESS_PROPERTY, "1902");
assertProgressNotification(NAME, nf.format(0.9510));
SystemProperties.set(PROGRESS_PROPERTY, "1960");
assertProgressNotification(NAME, nf.format(0.98));
// ...but never more than the capped value.
SystemProperties.set(PROGRESS_PROPERTY, "2000");
assertProgressNotification(NAME, nf.format(0.99));
SystemProperties.set(PROGRESS_PROPERTY, "3000");
assertProgressNotification(NAME, nf.format(0.99));
Bundle extras =
sendBugreportFinishedAndGetSharedIntent(ID, mPlainTextPath, mScreenshotPath);

View File

@@ -32,7 +32,7 @@ import static junit.framework.Assert.assertTrue;
final class UiBot {
private static final String TAG = "UiBot";
private static final String SYSTEMUI_PACKAGED = "com.android.systemui";
private static final String SYSTEMUI_PACKAGE = "com.android.systemui";
private final UiDevice mDevice;
private final int mTimeout;
@@ -51,8 +51,8 @@ final class UiBot {
public UiObject getNotification(String text) {
boolean opened = mDevice.openNotification();
Log.v(TAG, "openNotification(): " + opened);
boolean gotIt = mDevice.wait(Until.hasObject(By.pkg(SYSTEMUI_PACKAGED)), mTimeout);
assertTrue("could not get system ui (" + SYSTEMUI_PACKAGED + ")", gotIt);
boolean gotIt = mDevice.wait(Until.hasObject(By.pkg(SYSTEMUI_PACKAGE)), mTimeout);
assertTrue("could not get system ui (" + SYSTEMUI_PACKAGE + ")", gotIt);
return getObject(text);
}