Merge "Use statfs() in IMediaContainerService."

This commit is contained in:
Jeff Sharkey
2012-04-23 10:08:06 -07:00
committed by Android (Google) Code Review
2 changed files with 66 additions and 37 deletions

View File

@@ -20,16 +20,18 @@ import static com.android.settings.Utils.prepareCustomPreferencesList;
import android.app.Activity; import android.app.Activity;
import android.app.Fragment; import android.app.Fragment;
import android.content.ComponentName;
import android.content.Context; import android.content.Context;
import android.content.Intent; import android.content.Intent;
import android.content.ServiceConnection;
import android.content.pm.ApplicationInfo; import android.content.pm.ApplicationInfo;
import android.content.pm.IPackageManager; import android.content.pm.IPackageManager;
import android.content.pm.PackageInfo; import android.content.pm.PackageInfo;
import android.os.Bundle; import android.os.Bundle;
import android.os.Environment; import android.os.Environment;
import android.os.IBinder;
import android.os.RemoteException; import android.os.RemoteException;
import android.os.ServiceManager; import android.os.ServiceManager;
import android.os.StatFs;
import android.preference.PreferenceActivity; import android.preference.PreferenceActivity;
import android.provider.Settings; import android.provider.Settings;
import android.text.format.Formatter; import android.text.format.Formatter;
@@ -46,19 +48,19 @@ import android.widget.AbsListView;
import android.widget.AdapterView; import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener; import android.widget.AdapterView.OnItemClickListener;
import android.widget.BaseAdapter; import android.widget.BaseAdapter;
import android.widget.CheckBox;
import android.widget.Filter; import android.widget.Filter;
import android.widget.Filterable; import android.widget.Filterable;
import android.widget.ImageView;
import android.widget.ListView; import android.widget.ListView;
import android.widget.TabHost; import android.widget.TabHost;
import android.widget.TextView; import android.widget.TextView;
import com.android.internal.app.IMediaContainerService;
import com.android.internal.content.PackageHelper; import com.android.internal.content.PackageHelper;
import com.android.settings.R; import com.android.settings.R;
import com.android.settings.Settings.RunningServicesActivity; import com.android.settings.Settings.RunningServicesActivity;
import com.android.settings.Settings.StorageUseActivity; import com.android.settings.Settings.StorageUseActivity;
import com.android.settings.applications.ApplicationsState.AppEntry; import com.android.settings.applications.ApplicationsState.AppEntry;
import com.android.settings.deviceinfo.StorageMeasurement;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Comparator; import java.util.Comparator;
@@ -179,8 +181,6 @@ public class ManageApplications extends Fragment implements
private boolean mResumedRunning; private boolean mResumedRunning;
private boolean mActivityResumed; private boolean mActivityResumed;
private StatFs mDataFileStats;
private StatFs mSDCardFileStats;
private boolean mLastShowedInternalStorage = true; private boolean mLastShowedInternalStorage = true;
private long mLastUsedStorage, mLastAppStorage, mLastFreeStorage; private long mLastUsedStorage, mLastAppStorage, mLastFreeStorage;
@@ -534,8 +534,9 @@ public class ManageApplications extends Fragment implements
mDefaultTab = defaultTabTag; mDefaultTab = defaultTabTag;
mDataFileStats = new StatFs("/data"); final Intent containerIntent = new Intent().setComponent(
mSDCardFileStats = new StatFs(Environment.getExternalStorageDirectory().toString()); StorageMeasurement.DEFAULT_CONTAINER_COMPONENT);
getActivity().bindService(containerIntent, mContainerConnection, Context.BIND_AUTO_CREATE);
mInvalidSizeStr = getActivity().getText(R.string.invalid_size_value); mInvalidSizeStr = getActivity().getText(R.string.invalid_size_value);
mComputingSizeStr = getActivity().getText(R.string.computing_size); mComputingSizeStr = getActivity().getText(R.string.computing_size);
@@ -687,6 +688,12 @@ public class ManageApplications extends Fragment implements
mOptionsMenu = null; mOptionsMenu = null;
} }
@Override
public void onDestroy() {
getActivity().unbindService(mContainerConnection);
super.onDestroy();
}
void updateOptionsMenu() { void updateOptionsMenu() {
if (mOptionsMenu == null) { if (mOptionsMenu == null) {
return; return;
@@ -760,15 +767,18 @@ public class ManageApplications extends Fragment implements
mLastShowedInternalStorage = false; mLastShowedInternalStorage = false;
} }
newLabel = getActivity().getText(R.string.sd_card_storage); newLabel = getActivity().getText(R.string.sd_card_storage);
mSDCardFileStats.restat(Environment.getExternalStorageDirectory().toString());
try { if (mContainerService != null) {
totalStorage = (long)mSDCardFileStats.getBlockCount() * try {
mSDCardFileStats.getBlockSize(); final long[] stats = mContainerService.getFileSystemStats(
freeStorage = (long) mSDCardFileStats.getAvailableBlocks() * Environment.getExternalStorageDirectory().getPath());
mSDCardFileStats.getBlockSize(); totalStorage = stats[0];
} catch (IllegalArgumentException e) { freeStorage = stats[1];
// use the old value of mFreeMem } catch (RemoteException e) {
Log.w(TAG, "Problem in container service", e);
}
} }
final int N = mApplicationsAdapter.getCount(); final int N = mApplicationsAdapter.getCount();
for (int i=0; i<N; i++) { for (int i=0; i<N; i++) {
ApplicationsState.AppEntry ae = mApplicationsAdapter.getAppEntry(i); ApplicationsState.AppEntry ae = mApplicationsAdapter.getAppEntry(i);
@@ -779,14 +789,18 @@ public class ManageApplications extends Fragment implements
mLastShowedInternalStorage = true; mLastShowedInternalStorage = true;
} }
newLabel = getActivity().getText(R.string.internal_storage); newLabel = getActivity().getText(R.string.internal_storage);
mDataFileStats.restat("/data");
try { if (mContainerService != null) {
totalStorage = (long)mDataFileStats.getBlockCount() * try {
mDataFileStats.getBlockSize(); final long[] stats = mContainerService.getFileSystemStats(
freeStorage = (long) mDataFileStats.getAvailableBlocks() * Environment.getDataDirectory().getPath());
mDataFileStats.getBlockSize(); totalStorage = stats[0];
} catch (IllegalArgumentException e) { freeStorage = stats[1];
} catch (RemoteException e) {
Log.w(TAG, "Problem in container service", e);
}
} }
final boolean emulatedStorage = Environment.isExternalStorageEmulated(); final boolean emulatedStorage = Environment.isExternalStorageEmulated();
final int N = mApplicationsAdapter.getCount(); final int N = mApplicationsAdapter.getCount();
for (int i=0; i<N; i++) { for (int i=0; i<N; i++) {
@@ -912,4 +926,19 @@ public class ManageApplications extends Fragment implements
public void onTabChanged(String tabId) { public void onTabChanged(String tabId) {
showCurrentTab(); showCurrentTab();
} }
private volatile IMediaContainerService mContainerService;
private final ServiceConnection mContainerConnection = new ServiceConnection() {
@Override
public void onServiceConnected(ComponentName name, IBinder service) {
mContainerService = IMediaContainerService.Stub.asInterface(service);
updateStorageUsage();
}
@Override
public void onServiceDisconnected(ComponentName name) {
mContainerService = null;
}
};
} }

View File

@@ -31,7 +31,7 @@ import android.os.HandlerThread;
import android.os.IBinder; import android.os.IBinder;
import android.os.Looper; import android.os.Looper;
import android.os.Message; import android.os.Message;
import android.os.StatFs; import android.os.RemoteException;
import android.os.storage.StorageVolume; import android.os.storage.StorageVolume;
import android.util.Log; import android.util.Log;
@@ -53,7 +53,7 @@ import java.util.concurrent.ConcurrentHashMap;
* know about by just keeping an array of measurement types of the following * know about by just keeping an array of measurement types of the following
* properties: * properties:
* *
* Filesystem stats (using StatFs) * Filesystem stats (using DefaultContainerService)
* Directory measurements (using DefaultContainerService.measureDir) * Directory measurements (using DefaultContainerService.measureDir)
* Application measurements (using PackageManager) * Application measurements (using PackageManager)
* *
@@ -81,7 +81,7 @@ public class StorageMeasurement {
private static final String DEFAULT_CONTAINER_PACKAGE = "com.android.defcontainer"; private static final String DEFAULT_CONTAINER_PACKAGE = "com.android.defcontainer";
private static final ComponentName DEFAULT_CONTAINER_COMPONENT = new ComponentName( public static final ComponentName DEFAULT_CONTAINER_COMPONENT = new ComponentName(
DEFAULT_CONTAINER_PACKAGE, "com.android.defcontainer.DefaultContainerService"); DEFAULT_CONTAINER_PACKAGE, "com.android.defcontainer.DefaultContainerService");
private final MeasurementHandler mHandler; private final MeasurementHandler mHandler;
@@ -258,8 +258,6 @@ public class StorageMeasurement {
return; return;
} }
measureApproximateStorage();
synchronized (mLock) { synchronized (mLock) {
if (mBound) { if (mBound) {
removeMessages(MSG_DISCONNECT); removeMessages(MSG_DISCONNECT);
@@ -274,6 +272,7 @@ public class StorageMeasurement {
} }
case MSG_CONNECTED: { case MSG_CONNECTED: {
IMediaContainerService imcs = (IMediaContainerService) msg.obj; IMediaContainerService imcs = (IMediaContainerService) msg.obj;
measureApproximateStorage(imcs);
measureExactStorage(imcs); measureExactStorage(imcs);
break; break;
} }
@@ -367,15 +366,16 @@ public class StorageMeasurement {
sendEmptyMessage(MSG_COMPLETED); sendEmptyMessage(MSG_COMPLETED);
} }
private void measureApproximateStorage() { private void measureApproximateStorage(IMediaContainerService imcs) {
final StatFs stat = new StatFs(mStorageVolume != null final String path = mStorageVolume != null ? mStorageVolume.getPath()
? mStorageVolume.getPath() : Environment.getDataDirectory().getPath()); : Environment.getDataDirectory().getPath();
final long blockSize = stat.getBlockSize(); try {
final long totalBlocks = stat.getBlockCount(); final long[] stats = imcs.getFileSystemStats(path);
final long availableBlocks = stat.getAvailableBlocks(); mTotalSize = stats[0];
mAvailSize = stats[1];
mTotalSize = totalBlocks * blockSize; } catch (RemoteException e) {
mAvailSize = availableBlocks * blockSize; Log.w(TAG, "Problem in container service", e);
}
sendInternalApproximateUpdate(); sendInternalApproximateUpdate();
} }