package com.iwedia.service.system.application; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; import android.content.Context; import android.content.pm.IPackageDataObserver; import android.content.pm.IPackageDeleteObserver; import android.content.pm.IPackageStatsObserver; import android.content.pm.PackageManager; import android.content.pm.PackageStats; import android.os.RemoteException; import android.util.Log; import com.iwedia.comm.system.application.AppSizeInfo; import com.iwedia.service.IWEDIAService; import com.iwedia.service.system.SystemControl; public class PackageObserverManager { private final static String TAG = "PackageObserverManager"; private PackageDeleteObserver observerdelete; private PackageStatsObserver observerStat; private PackageDataObserver observerData; private PackageManager pm; private Method uninstallmethod; private Method getPackageSizeInfo; private Method deleteApplicationCacheFiles; private Method clearApplicationUserData; private String valueString = ""; private AppSizeInfo appSizeInfo; public final static long SIZE_KB = 1024L; public final static long SIZE_MB = SIZE_KB * SIZE_KB; public final static long SIZE_GB = SIZE_MB * SIZE_KB; class PackageDeleteObserver extends IPackageDeleteObserver.Stub { public void packageDeleted(String packageName, int returnCode) throws RemoteException { } } class PackageDataObserver extends IPackageDataObserver.Stub { public void onRemoveCompleted(final String packageName, final boolean succeeded) { if (IWEDIAService.DEBUG) { Log.e(TAG, "Package " + packageName + " succeeded " + succeeded); SystemControl.broadcastClearDataCacheFinished(succeeded); } } } class PackageStatsObserver extends IPackageStatsObserver.Stub { public void onGetStatsCompleted(PackageStats pStats, boolean succeeded) throws RemoteException { appSizeInfo = new AppSizeInfo(); appSizeInfo.setCodeSize(getConvertedValue(pStats.codeSize)); appSizeInfo.setDataSize(getConvertedValue(pStats.dataSize)); appSizeInfo .setExternalCacheSize(getConvertedValue(pStats.externalCacheSize)); appSizeInfo.setCacheSize(getConvertedValue(pStats.cacheSize + pStats.externalCacheSize)); appSizeInfo .setExternalObbSize(getConvertedValue(pStats.externalObbSize)); appSizeInfo .setExternalDataSize(getConvertedValue(pStats.externalDataSize)); appSizeInfo .setExternalMediaSize(getConvertedValue(pStats.externalMediaSize)); appSizeInfo.setTotalSize(getConvertedValue(pStats.codeSize + pStats.dataSize + pStats.externalCacheSize + pStats.externalDataSize)); if (pStats.cacheSize + pStats.externalCacheSize == 0) { appSizeInfo.setCacheEmpty(true); } else { appSizeInfo.setCacheEmpty(false); } if (pStats.dataSize == 0) { appSizeInfo.setDataEmpty(true); } else { appSizeInfo.setDataEmpty(false); } if (IWEDIAService.DEBUG) { Log.e(TAG, "appSizeInfo.getTotalSize" + appSizeInfo.getTotalSize()); } SystemControl.broadcastAppSizeInfo(appSizeInfo); } } private String getConvertedValue(long value) { double tmpValue = value; if ((tmpValue / SIZE_GB) >= 1) { tmpValue = tmpValue / SIZE_GB; valueString = String.format("%.2f", tmpValue); valueString = valueString + " GB"; } else if ((tmpValue / SIZE_MB) >= 1) { tmpValue = tmpValue / SIZE_MB; valueString = String.format("%.2f", tmpValue); valueString = valueString + " MB"; } else if ((tmpValue / SIZE_KB) >= 1) { tmpValue = tmpValue / SIZE_KB; valueString = String.format("%.2f", tmpValue); valueString = valueString + " KB"; } else { valueString = String.format("%.2f", tmpValue); valueString = valueString + " B"; } return valueString; } public PackageObserverManager(Context context) throws SecurityException, NoSuchMethodException { observerStat = new PackageStatsObserver(); observerdelete = new PackageDeleteObserver(); observerData = new PackageDataObserver(); pm = context.getPackageManager(); Class<?>[] uninstalltypes = new Class[] { String.class, IPackageDeleteObserver.class, int.class }; uninstallmethod = pm.getClass().getMethod("deletePackage", uninstalltypes); Class<?>[] statstypes = new Class[] { String.class, IPackageStatsObserver.class }; getPackageSizeInfo = pm.getClass().getMethod("getPackageSizeInfo", statstypes); Class<?>[] dataCacheTypes = new Class[] { String.class, IPackageDataObserver.class }; deleteApplicationCacheFiles = pm.getClass().getMethod( "deleteApplicationCacheFiles", dataCacheTypes); Class<?>[] dataDataTypes = new Class[] { String.class, IPackageDataObserver.class }; clearApplicationUserData = pm.getClass().getMethod( "clearApplicationUserData", dataDataTypes); } public void getPackageSizeInfo(String packagename) throws IllegalArgumentException, IllegalAccessException, InvocationTargetException { getPackageSizeInfo.invoke(pm, new Object[] { packagename, observerStat }); } public void uninstallPackage(String packagename) throws IllegalArgumentException, IllegalAccessException, InvocationTargetException { uninstallmethod.invoke(pm, new Object[] { packagename, observerdelete, 0 }); } public void deleteApplicationCacheFiles(String packagename) throws IllegalArgumentException, IllegalAccessException, InvocationTargetException { deleteApplicationCacheFiles.invoke(pm, new Object[] { packagename, observerData, 0 }); } public void clearApplicationUserData(String packagename) throws IllegalArgumentException, IllegalAccessException, InvocationTargetException { clearApplicationUserData.invoke(pm, new Object[] { packagename, observerData }); } }