Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit c1da7b10 authored by Jeff Sharkey's avatar Jeff Sharkey Committed by Android (Google) Code Review
Browse files

Merge "Use statfs() in IMediaContainerService."

parents 4a824be4 44dda2d7
Loading
Loading
Loading
Loading
+52 −23
Original line number Diff line number Diff line
@@ -20,16 +20,18 @@ import static com.android.settings.Utils.prepareCustomPreferencesList;

import android.app.Activity;
import android.app.Fragment;
import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
import android.content.ServiceConnection;
import android.content.pm.ApplicationInfo;
import android.content.pm.IPackageManager;
import android.content.pm.PackageInfo;
import android.os.Bundle;
import android.os.Environment;
import android.os.IBinder;
import android.os.RemoteException;
import android.os.ServiceManager;
import android.os.StatFs;
import android.preference.PreferenceActivity;
import android.provider.Settings;
import android.text.format.Formatter;
@@ -46,19 +48,19 @@ import android.widget.AbsListView;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.BaseAdapter;
import android.widget.CheckBox;
import android.widget.Filter;
import android.widget.Filterable;
import android.widget.ImageView;
import android.widget.ListView;
import android.widget.TabHost;
import android.widget.TextView;

import com.android.internal.app.IMediaContainerService;
import com.android.internal.content.PackageHelper;
import com.android.settings.R;
import com.android.settings.Settings.RunningServicesActivity;
import com.android.settings.Settings.StorageUseActivity;
import com.android.settings.applications.ApplicationsState.AppEntry;
import com.android.settings.deviceinfo.StorageMeasurement;

import java.util.ArrayList;
import java.util.Comparator;
@@ -179,8 +181,6 @@ public class ManageApplications extends Fragment implements
    private boolean mResumedRunning;
    private boolean mActivityResumed;
    
    private StatFs mDataFileStats;
    private StatFs mSDCardFileStats;
    private boolean mLastShowedInternalStorage = true;
    private long mLastUsedStorage, mLastAppStorage, mLastFreeStorage;

@@ -534,8 +534,9 @@ public class ManageApplications extends Fragment implements
        
        mDefaultTab = defaultTabTag;
        
        mDataFileStats = new StatFs("/data");
        mSDCardFileStats = new StatFs(Environment.getExternalStorageDirectory().toString());
        final Intent containerIntent = new Intent().setComponent(
                StorageMeasurement.DEFAULT_CONTAINER_COMPONENT);
        getActivity().bindService(containerIntent, mContainerConnection, Context.BIND_AUTO_CREATE);

        mInvalidSizeStr = getActivity().getText(R.string.invalid_size_value);
        mComputingSizeStr = getActivity().getText(R.string.computing_size);
@@ -687,6 +688,12 @@ public class ManageApplications extends Fragment implements
        mOptionsMenu = null;
    }

    @Override
    public void onDestroy() {
        getActivity().unbindService(mContainerConnection);
        super.onDestroy();
    }

    void updateOptionsMenu() {
        if (mOptionsMenu == null) {
            return;
@@ -760,15 +767,18 @@ public class ManageApplications extends Fragment implements
                mLastShowedInternalStorage = false;
            }
            newLabel = getActivity().getText(R.string.sd_card_storage);
            mSDCardFileStats.restat(Environment.getExternalStorageDirectory().toString());

            if (mContainerService != null) {
                try {
                totalStorage = (long)mSDCardFileStats.getBlockCount() *
                        mSDCardFileStats.getBlockSize();
                freeStorage = (long) mSDCardFileStats.getAvailableBlocks() *
                mSDCardFileStats.getBlockSize();
            } catch (IllegalArgumentException e) {
                // use the old value of mFreeMem
                    final long[] stats = mContainerService.getFileSystemStats(
                            Environment.getExternalStorageDirectory().getPath());
                    totalStorage = stats[0];
                    freeStorage = stats[1];
                } catch (RemoteException e) {
                    Log.w(TAG, "Problem in container service", e);
                }
            }

            final int N = mApplicationsAdapter.getCount();
            for (int i=0; i<N; i++) {
                ApplicationsState.AppEntry ae = mApplicationsAdapter.getAppEntry(i);
@@ -779,14 +789,18 @@ public class ManageApplications extends Fragment implements
                mLastShowedInternalStorage = true;
            }
            newLabel = getActivity().getText(R.string.internal_storage);
            mDataFileStats.restat("/data");

            if (mContainerService != null) {
                try {
                totalStorage = (long)mDataFileStats.getBlockCount() *
                        mDataFileStats.getBlockSize();
                freeStorage = (long) mDataFileStats.getAvailableBlocks() *
                    mDataFileStats.getBlockSize();
            } catch (IllegalArgumentException e) {
                    final long[] stats = mContainerService.getFileSystemStats(
                            Environment.getDataDirectory().getPath());
                    totalStorage = stats[0];
                    freeStorage = stats[1];
                } catch (RemoteException e) {
                    Log.w(TAG, "Problem in container service", e);
                }
            }

            final boolean emulatedStorage = Environment.isExternalStorageEmulated();
            final int N = mApplicationsAdapter.getCount();
            for (int i=0; i<N; i++) {
@@ -912,4 +926,19 @@ public class ManageApplications extends Fragment implements
    public void onTabChanged(String tabId) {
        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;
        }
    };
}
+14 −14
Original line number Diff line number Diff line
@@ -31,7 +31,7 @@ import android.os.HandlerThread;
import android.os.IBinder;
import android.os.Looper;
import android.os.Message;
import android.os.StatFs;
import android.os.RemoteException;
import android.os.storage.StorageVolume;
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
 * properties:
 *
 *   Filesystem stats (using StatFs)
 *   Filesystem stats (using DefaultContainerService)
 *   Directory measurements (using DefaultContainerService.measureDir)
 *   Application measurements (using PackageManager)
 *
@@ -81,7 +81,7 @@ public class StorageMeasurement {

    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");

    private final MeasurementHandler mHandler;
@@ -258,8 +258,6 @@ public class StorageMeasurement {
                        return;
                    }

                    measureApproximateStorage();

                    synchronized (mLock) {
                        if (mBound) {
                            removeMessages(MSG_DISCONNECT);
@@ -274,6 +272,7 @@ public class StorageMeasurement {
                }
                case MSG_CONNECTED: {
                    IMediaContainerService imcs = (IMediaContainerService) msg.obj;
                    measureApproximateStorage(imcs);
                    measureExactStorage(imcs);
                    break;
                }
@@ -367,15 +366,16 @@ public class StorageMeasurement {
            sendEmptyMessage(MSG_COMPLETED);
        }

        private void measureApproximateStorage() {
            final StatFs stat = new StatFs(mStorageVolume != null
                    ? mStorageVolume.getPath() : Environment.getDataDirectory().getPath());
            final long blockSize = stat.getBlockSize();
            final long totalBlocks = stat.getBlockCount();
            final long availableBlocks = stat.getAvailableBlocks();

            mTotalSize = totalBlocks * blockSize;
            mAvailSize = availableBlocks * blockSize;
        private void measureApproximateStorage(IMediaContainerService imcs) {
            final String path = mStorageVolume != null ? mStorageVolume.getPath()
                    : Environment.getDataDirectory().getPath();
            try {
                final long[] stats = imcs.getFileSystemStats(path);
                mTotalSize = stats[0];
                mAvailSize = stats[1];
            } catch (RemoteException e) {
                Log.w(TAG, "Problem in container service", e);
            }

            sendInternalApproximateUpdate();
        }