Merge "Offer to wait until broadcasts have drained." into oc-dev
am: 6f4aab2c01
Change-Id: Id6045353ed2293ece7ecdb7697904fa7993a7ed3
This commit is contained in:
@@ -1441,10 +1441,10 @@ public final class Pm {
|
||||
System.err.println("Error: no size specified");
|
||||
return showUsage();
|
||||
}
|
||||
int len = size.length();
|
||||
long multiplier = 1;
|
||||
if (len > 1) {
|
||||
char c = size.charAt(len-1);
|
||||
int len = size.length();
|
||||
char c = size.charAt(len - 1);
|
||||
if (c < '0' || c > '9') {
|
||||
if (c == 'K' || c == 'k') {
|
||||
multiplier = 1024L;
|
||||
} else if (c == 'M' || c == 'm') {
|
||||
|
||||
@@ -37,30 +37,46 @@ public final class ExternalStorageStats implements Parcelable {
|
||||
/**
|
||||
* Return the total bytes used by all files in the shared/external storage
|
||||
* hosted on this volume.
|
||||
* <p>
|
||||
* This value only includes data which is isolated for each user on a
|
||||
* multiuser device. Any OBB data shared between users is not accounted in
|
||||
* this value.
|
||||
*/
|
||||
public @BytesLong long getTotalBytes() {
|
||||
return totalBytes;
|
||||
}
|
||||
|
||||
/**
|
||||
* Return the total bytes used by audio files in the shared/external storage
|
||||
* hosted on this volume.
|
||||
* Return the total bytes used by all audio files in the shared/external
|
||||
* storage hosted on this volume.
|
||||
* <p>
|
||||
* This value only includes data which is isolated for each user on a
|
||||
* multiuser device. This value does not include any app files which are all
|
||||
* accounted under {@link #getAppBytes()}.
|
||||
*/
|
||||
public @BytesLong long getAudioBytes() {
|
||||
return audioBytes;
|
||||
}
|
||||
|
||||
/**
|
||||
* Return the total bytes used by video files in the shared/external storage
|
||||
* hosted on this volume.
|
||||
* Return the total bytes used by all video files in the shared/external
|
||||
* storage hosted on this volume.
|
||||
* <p>
|
||||
* This value only includes data which is isolated for each user on a
|
||||
* multiuser device. This value does not include any app files which are all
|
||||
* accounted under {@link #getAppBytes()}.
|
||||
*/
|
||||
public @BytesLong long getVideoBytes() {
|
||||
return videoBytes;
|
||||
}
|
||||
|
||||
/**
|
||||
* Return the total bytes used by image files in the shared/external storage
|
||||
* hosted on this volume.
|
||||
* Return the total bytes used by all image files in the shared/external
|
||||
* storage hosted on this volume.
|
||||
* <p>
|
||||
* This value only includes data which is isolated for each user on a
|
||||
* multiuser device. This value does not include any app files which are all
|
||||
* accounted under {@link #getAppBytes()}.
|
||||
*/
|
||||
public @BytesLong long getImageBytes() {
|
||||
return imageBytes;
|
||||
@@ -72,6 +88,9 @@ public final class ExternalStorageStats implements Parcelable {
|
||||
* <p>
|
||||
* This data is already accounted against individual apps as returned
|
||||
* through {@link StorageStats}.
|
||||
* <p>
|
||||
* This value only includes data which is isolated for each user on a
|
||||
* multiuser device.
|
||||
*/
|
||||
public @BytesLong long getAppBytes() {
|
||||
return appBytes;
|
||||
|
||||
@@ -23876,6 +23876,34 @@ public class ActivityManagerService extends IActivityManager.Stub
|
||||
}
|
||||
}
|
||||
|
||||
public void waitForBroadcastIdle(PrintWriter pw) {
|
||||
enforceCallingPermission(permission.DUMP, "waitForBroadcastIdle()");
|
||||
while (true) {
|
||||
boolean idle = true;
|
||||
synchronized (this) {
|
||||
for (BroadcastQueue queue : mBroadcastQueues) {
|
||||
if (!queue.isIdle()) {
|
||||
final String msg = "Waiting for queue " + queue + " to become idle...";
|
||||
pw.println(msg);
|
||||
pw.flush();
|
||||
Slog.v(TAG, msg);
|
||||
idle = false;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (idle) {
|
||||
final String msg = "All broadcast queues are idle!";
|
||||
pw.println(msg);
|
||||
pw.flush();
|
||||
Slog.v(TAG, msg);
|
||||
return;
|
||||
} else {
|
||||
SystemClock.sleep(1000);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Return the user id of the last resumed activity.
|
||||
*/
|
||||
|
||||
@@ -251,6 +251,8 @@ final class ActivityManagerShellCommand extends ShellCommand {
|
||||
return runUpdateApplicationInfo(pw);
|
||||
case "no-home-screen":
|
||||
return runNoHomeScreen(pw);
|
||||
case "wait-for-broadcast-idle":
|
||||
return runWaitForBroadcastIdle(pw);
|
||||
default:
|
||||
return handleDefaultCommands(cmd);
|
||||
}
|
||||
@@ -2419,6 +2421,11 @@ final class ActivityManagerShellCommand extends ShellCommand {
|
||||
return 0;
|
||||
}
|
||||
|
||||
int runWaitForBroadcastIdle(PrintWriter pw) throws RemoteException {
|
||||
mInternal.waitForBroadcastIdle(pw);
|
||||
return 0;
|
||||
}
|
||||
|
||||
private Resources getResources(PrintWriter pw) throws RemoteException {
|
||||
// system resources does not contain all the device configuration, construct it manually.
|
||||
Configuration config = mInterface.getConfiguration();
|
||||
|
||||
@@ -203,6 +203,11 @@ public final class BroadcastQueue {
|
||||
mDelayBehindServices = allowDelayBehindServices;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String toString() {
|
||||
return mQueueName;
|
||||
}
|
||||
|
||||
public boolean isPendingBroadcastProcessLocked(int pid) {
|
||||
return mPendingBroadcast != null && mPendingBroadcast.curApp.pid == pid;
|
||||
}
|
||||
@@ -1578,6 +1583,11 @@ public final class BroadcastQueue {
|
||||
record.intent == null ? "" : record.intent.getAction());
|
||||
}
|
||||
|
||||
final boolean isIdle() {
|
||||
return mParallelBroadcasts.isEmpty() && mOrderedBroadcasts.isEmpty()
|
||||
&& (mPendingBroadcast == null);
|
||||
}
|
||||
|
||||
final boolean dumpLocked(FileDescriptor fd, PrintWriter pw, String[] args,
|
||||
int opti, boolean dumpAll, String dumpPackage, boolean needSep) {
|
||||
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
|
||||
|
||||
@@ -112,9 +112,12 @@ public class StorageStatsService extends IStorageStatsManager.Stub {
|
||||
mStorage.registerListener(new StorageEventListener() {
|
||||
@Override
|
||||
public void onVolumeStateChanged(VolumeInfo vol, int oldState, int newState) {
|
||||
if ((vol.type == VolumeInfo.TYPE_PRIVATE)
|
||||
&& (newState == VolumeInfo.STATE_MOUNTED)) {
|
||||
invalidateMounts();
|
||||
switch (vol.type) {
|
||||
case VolumeInfo.TYPE_PRIVATE:
|
||||
case VolumeInfo.TYPE_EMULATED:
|
||||
if (newState == VolumeInfo.STATE_MOUNTED) {
|
||||
invalidateMounts();
|
||||
}
|
||||
}
|
||||
}
|
||||
});
|
||||
@@ -178,9 +181,11 @@ public class StorageStatsService extends IStorageStatsManager.Stub {
|
||||
long cacheBytes = 0;
|
||||
final long token = Binder.clearCallingIdentity();
|
||||
try {
|
||||
for (UserInfo user : mUser.getUsers()) {
|
||||
final StorageStats stats = queryStatsForUser(volumeUuid, user.id, null);
|
||||
cacheBytes += stats.cacheBytes;
|
||||
if (isQuotaSupported(volumeUuid, callingPackage)) {
|
||||
for (UserInfo user : mUser.getUsers()) {
|
||||
final StorageStats stats = queryStatsForUser(volumeUuid, user.id, null);
|
||||
cacheBytes += stats.cacheBytes;
|
||||
}
|
||||
}
|
||||
} finally {
|
||||
Binder.restoreCallingIdentity(token);
|
||||
|
||||
Reference in New Issue
Block a user