Merge "Use statfs() in IMediaContainerService."
This commit is contained in:
@@ -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());
|
|
||||||
|
if (mContainerService != null) {
|
||||||
try {
|
try {
|
||||||
totalStorage = (long)mSDCardFileStats.getBlockCount() *
|
final long[] stats = mContainerService.getFileSystemStats(
|
||||||
mSDCardFileStats.getBlockSize();
|
Environment.getExternalStorageDirectory().getPath());
|
||||||
freeStorage = (long) mSDCardFileStats.getAvailableBlocks() *
|
totalStorage = stats[0];
|
||||||
mSDCardFileStats.getBlockSize();
|
freeStorage = stats[1];
|
||||||
} catch (IllegalArgumentException e) {
|
} catch (RemoteException e) {
|
||||||
// use the old value of mFreeMem
|
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");
|
|
||||||
|
if (mContainerService != null) {
|
||||||
try {
|
try {
|
||||||
totalStorage = (long)mDataFileStats.getBlockCount() *
|
final long[] stats = mContainerService.getFileSystemStats(
|
||||||
mDataFileStats.getBlockSize();
|
Environment.getDataDirectory().getPath());
|
||||||
freeStorage = (long) mDataFileStats.getAvailableBlocks() *
|
totalStorage = stats[0];
|
||||||
mDataFileStats.getBlockSize();
|
freeStorage = stats[1];
|
||||||
} catch (IllegalArgumentException e) {
|
} 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;
|
||||||
|
}
|
||||||
|
};
|
||||||
}
|
}
|
||||||
|
@@ -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();
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user