Merge "Put externalSize measurements in PackageStats" into honeycomb
This commit is contained in:
@ -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"
|
||||
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
@ -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;
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
|
@ -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
|
||||
});
|
||||
}
|
||||
|
Reference in New Issue
Block a user