Merge "Put externalSize measurements in PackageStats" into honeycomb

This commit is contained in:
Kenny Root
2011-01-16 16:56:44 -08:00
committed by Android (Google) Code Review
4 changed files with 171 additions and 23 deletions

View File

@ -61561,6 +61561,36 @@
visibility="public"
>
</field>
<field name="externalCacheSize"
type="long"
transient="false"
volatile="false"
static="false"
final="false"
deprecated="not deprecated"
visibility="public"
>
</field>
<field name="externalDataSize"
type="long"
transient="false"
volatile="false"
static="false"
final="false"
deprecated="not deprecated"
visibility="public"
>
</field>
<field name="externalMediaSize"
type="long"
transient="false"
volatile="false"
static="false"
final="false"
deprecated="not deprecated"
visibility="public"
>
</field>
<field name="packageName"
type="java.lang.String"
transient="false"

View File

@ -19,20 +19,44 @@ package android.content.pm;
import android.os.Parcel;
import android.os.Parcelable;
import java.util.Arrays;
/**
* implementation of PackageStats associated with a
* application package.
*/
public class PackageStats implements Parcelable {
/** Name of the package to which this stats applies. */
public String packageName;
/** Size of the code (e.g., APK) */
public long codeSize;
/**
* Size of the internal data size for the application. (e.g.,
* /data/data/<app>)
*/
public long dataSize;
/** Size of cache used by the application. (e.g., /data/data/<app>/cache) */
public long cacheSize;
/**
* Size of the external data used by the application (e.g.,
* <sdcard>/Android/data/<app>)
*/
public long externalDataSize;
/**
* Size of the external cache used by the application (i.e., on the SD
* card). If this is a subdirectory of the data directory, this size will be
* subtracted out of the external data size.
*/
public long externalCacheSize;
/** Size of the external media size used by the application. */
public long externalMediaSize;
public static final Parcelable.Creator<PackageStats> CREATOR
= new Parcelable.Creator<PackageStats>() {
= new Parcelable.Creator<PackageStats>() {
public PackageStats createFromParcel(Parcel in) {
return new PackageStats(in);
}
@ -41,29 +65,49 @@ public class PackageStats implements Parcelable {
return new PackageStats[size];
}
};
public String toString() {
return "PackageStats{"
+ Integer.toHexString(System.identityHashCode(this))
+ " " + packageName + "}";
final StringBuilder sb = new StringBuilder("PackageStats{");
sb.append(Integer.toHexString(System.identityHashCode(this)));
sb.append(" packageName=");
sb.append(packageName);
sb.append(",codeSize=");
sb.append(codeSize);
sb.append(",dataSize=");
sb.append(dataSize);
sb.append(",cacheSize=");
sb.append(cacheSize);
sb.append(",externalDataSize=");
sb.append(externalDataSize);
sb.append(",externalCacheSize=");
sb.append(externalCacheSize);
sb.append(",externalMediaSize=");
sb.append(externalMediaSize);
return sb.toString();
}
public PackageStats(String pkgName) {
packageName = pkgName;
}
public PackageStats(Parcel source) {
packageName = source.readString();
codeSize = source.readLong();
dataSize = source.readLong();
cacheSize = source.readLong();
externalDataSize = source.readLong();
externalCacheSize = source.readLong();
externalMediaSize = source.readLong();
}
public PackageStats(PackageStats pStats) {
packageName = pStats.packageName;
codeSize = pStats.codeSize;
dataSize = pStats.dataSize;
cacheSize = pStats.cacheSize;
externalDataSize = pStats.externalDataSize;
externalCacheSize = pStats.externalCacheSize;
externalMediaSize = pStats.externalMediaSize;
}
public int describeContents() {
@ -75,5 +119,8 @@ public class PackageStats implements Parcelable {
dest.writeLong(codeSize);
dest.writeLong(dataSize);
dest.writeLong(cacheSize);
dest.writeLong(externalDataSize);
dest.writeLong(externalCacheSize);
dest.writeLong(externalMediaSize);
}
}

View File

@ -165,8 +165,13 @@ public class DefaultContainerService extends IntentService {
}
@Override
public long calculateDirectorySize(String directory) throws RemoteException {
return MeasurementUtils.measureDirectory(directory);
public long calculateDirectorySize(String path) throws RemoteException {
final File directory = new File(path);
if (directory.exists() && directory.isDirectory()) {
return MeasurementUtils.measureDirectory(path);
} else {
return 0L;
}
}
};

View File

@ -4806,6 +4806,74 @@ class PackageManagerService extends IPackageManager.Stub {
abstract void handleReturnCode();
}
class MeasureParams extends HandlerParams {
private final PackageStats mStats;
private boolean mSuccess;
private final IPackageStatsObserver mObserver;
public MeasureParams(PackageStats stats, boolean success,
IPackageStatsObserver observer) {
mObserver = observer;
mStats = stats;
mSuccess = success;
}
@Override
void handleStartCopy() throws RemoteException {
final boolean mounted;
if (Environment.isExternalStorageEmulated()) {
mounted = true;
} else {
final String status = Environment.getExternalStorageState();
mounted = status.equals(Environment.MEDIA_MOUNTED)
|| status.equals(Environment.MEDIA_MOUNTED_READ_ONLY);
}
if (mounted) {
final File externalCacheDir = Environment
.getExternalStorageAppCacheDirectory(mStats.packageName);
final long externalCacheSize = mContainerService
.calculateDirectorySize(externalCacheDir.getPath());
mStats.externalCacheSize = externalCacheSize;
final File externalDataDir = Environment
.getExternalStorageAppDataDirectory(mStats.packageName);
long externalDataSize = mContainerService.calculateDirectorySize(externalDataDir
.getPath());
if (externalCacheDir.getParentFile().equals(externalDataDir)) {
externalDataSize -= externalCacheSize;
}
mStats.externalDataSize = externalDataSize;
final File externalMediaDir = Environment
.getExternalStorageAppMediaDirectory(mStats.packageName);
mStats.externalMediaSize = mContainerService
.calculateDirectorySize(externalCacheDir.getPath());
}
}
@Override
void handleReturnCode() {
if (mObserver != null) {
try {
mObserver.onGetStatsCompleted(mStats, mSuccess);
} catch (RemoteException e) {
Slog.i(TAG, "Observer no longer exists.");
}
}
}
@Override
void handleServiceError() {
Slog.e(TAG, "Could not measure application " + mStats.packageName
+ " external storage");
}
}
class InstallParams extends HandlerParams {
final IPackageInstallObserver observer;
int flags;
@ -6619,18 +6687,16 @@ class PackageManagerService extends IPackageManager.Stub {
mHandler.post(new Runnable() {
public void run() {
mHandler.removeCallbacks(this);
PackageStats lStats = new PackageStats(packageName);
final boolean succeded;
PackageStats stats = new PackageStats(packageName);
final boolean success;
synchronized (mInstallLock) {
succeded = getPackageSizeInfoLI(packageName, lStats);
success = getPackageSizeInfoLI(packageName, stats);
}
if(observer != null) {
try {
observer.onGetStatsCompleted(lStats, succeded);
} catch (RemoteException e) {
Log.i(TAG, "Observer no longer exists.");
}
} //end if observer
Message msg = mHandler.obtainMessage(INIT_COPY);
msg.obj = new MeasureParams(stats, success, observer);
mHandler.sendMessage(msg);
} //end run
});
}