StorageVolume.java revision a5250c93928e256738125b265e10c96c3575597e
12f6a3885533a52758c2cd4f81f6123a712be8ae6Mike Lockwood/*
22f6a3885533a52758c2cd4f81f6123a712be8ae6Mike Lockwood * Copyright (C) 2011 The Android Open Source Project
32f6a3885533a52758c2cd4f81f6123a712be8ae6Mike Lockwood *
42f6a3885533a52758c2cd4f81f6123a712be8ae6Mike Lockwood * Licensed under the Apache License, Version 2.0 (the "License");
52f6a3885533a52758c2cd4f81f6123a712be8ae6Mike Lockwood * you may not use this file except in compliance with the License.
62f6a3885533a52758c2cd4f81f6123a712be8ae6Mike Lockwood * You may obtain a copy of the License at
72f6a3885533a52758c2cd4f81f6123a712be8ae6Mike Lockwood *
82f6a3885533a52758c2cd4f81f6123a712be8ae6Mike Lockwood *      http://www.apache.org/licenses/LICENSE-2.0
92f6a3885533a52758c2cd4f81f6123a712be8ae6Mike Lockwood *
102f6a3885533a52758c2cd4f81f6123a712be8ae6Mike Lockwood * Unless required by applicable law or agreed to in writing, software
112f6a3885533a52758c2cd4f81f6123a712be8ae6Mike Lockwood * distributed under the License is distributed on an "AS IS" BASIS,
122f6a3885533a52758c2cd4f81f6123a712be8ae6Mike Lockwood * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
132f6a3885533a52758c2cd4f81f6123a712be8ae6Mike Lockwood * See the License for the specific language governing permissions and
142f6a3885533a52758c2cd4f81f6123a712be8ae6Mike Lockwood * limitations under the License.
152f6a3885533a52758c2cd4f81f6123a712be8ae6Mike Lockwood */
162f6a3885533a52758c2cd4f81f6123a712be8ae6Mike Lockwood
172f6a3885533a52758c2cd4f81f6123a712be8ae6Mike Lockwoodpackage android.os.storage;
182f6a3885533a52758c2cd4f81f6123a712be8ae6Mike Lockwood
192f6a3885533a52758c2cd4f81f6123a712be8ae6Mike Lockwoodimport android.os.Bundle;
202f6a3885533a52758c2cd4f81f6123a712be8ae6Mike Lockwoodimport android.os.Parcel;
212f6a3885533a52758c2cd4f81f6123a712be8ae6Mike Lockwoodimport android.os.Parcelable;
222f6a3885533a52758c2cd4f81f6123a712be8ae6Mike Lockwoodimport android.util.Log;
232f6a3885533a52758c2cd4f81f6123a712be8ae6Mike Lockwood
242f6a3885533a52758c2cd4f81f6123a712be8ae6Mike Lockwood/**
252f6a3885533a52758c2cd4f81f6123a712be8ae6Mike Lockwood * A class representing a storage volume
262f6a3885533a52758c2cd4f81f6123a712be8ae6Mike Lockwood * @hide
272f6a3885533a52758c2cd4f81f6123a712be8ae6Mike Lockwood */
282f6a3885533a52758c2cd4f81f6123a712be8ae6Mike Lockwoodpublic class StorageVolume implements Parcelable {
292f6a3885533a52758c2cd4f81f6123a712be8ae6Mike Lockwood
302f6a3885533a52758c2cd4f81f6123a712be8ae6Mike Lockwood    private static final String TAG = "StorageVolume";
312f6a3885533a52758c2cd4f81f6123a712be8ae6Mike Lockwood
322f6a3885533a52758c2cd4f81f6123a712be8ae6Mike Lockwood    private final String mPath;
332f6a3885533a52758c2cd4f81f6123a712be8ae6Mike Lockwood    private final String mDescription;
342f6a3885533a52758c2cd4f81f6123a712be8ae6Mike Lockwood    private final boolean mRemovable;
352f6a3885533a52758c2cd4f81f6123a712be8ae6Mike Lockwood    private final boolean mEmulated;
362f6a3885533a52758c2cd4f81f6123a712be8ae6Mike Lockwood    private final int mMtpReserveSpace;
37fbfe55512596fd00c1fb51caa851e17dae60fd43Mike Lockwood    private int mStorageId;
382f6a3885533a52758c2cd4f81f6123a712be8ae6Mike Lockwood
39a5250c93928e256738125b265e10c96c3575597eMike Lockwood    // StorageVolume extra for ACTION_MEDIA_REMOVED, ACTION_MEDIA_UNMOUNTED, ACTION_MEDIA_CHECKING,
40a5250c93928e256738125b265e10c96c3575597eMike Lockwood    // ACTION_MEDIA_NOFS, ACTION_MEDIA_MOUNTED, ACTION_MEDIA_SHARED, ACTION_MEDIA_UNSHARED,
41a5250c93928e256738125b265e10c96c3575597eMike Lockwood    // ACTION_MEDIA_BAD_REMOVAL, ACTION_MEDIA_UNMOUNTABLE and ACTION_MEDIA_EJECT broadcasts.
42a5250c93928e256738125b265e10c96c3575597eMike Lockwood    public static final String EXTRA_STORAGE_VOLUME = "storage_volume";
43a5250c93928e256738125b265e10c96c3575597eMike Lockwood
442f6a3885533a52758c2cd4f81f6123a712be8ae6Mike Lockwood    public StorageVolume(String path, String description,
45fbfe55512596fd00c1fb51caa851e17dae60fd43Mike Lockwood            boolean removable, boolean emulated, int mtpReserveSpace) {
462f6a3885533a52758c2cd4f81f6123a712be8ae6Mike Lockwood        mPath = path;
472f6a3885533a52758c2cd4f81f6123a712be8ae6Mike Lockwood        mDescription = description;
482f6a3885533a52758c2cd4f81f6123a712be8ae6Mike Lockwood        mRemovable = removable;
492f6a3885533a52758c2cd4f81f6123a712be8ae6Mike Lockwood        mEmulated = emulated;
502f6a3885533a52758c2cd4f81f6123a712be8ae6Mike Lockwood        mMtpReserveSpace = mtpReserveSpace;
512f6a3885533a52758c2cd4f81f6123a712be8ae6Mike Lockwood    }
522f6a3885533a52758c2cd4f81f6123a712be8ae6Mike Lockwood
53fbfe55512596fd00c1fb51caa851e17dae60fd43Mike Lockwood    // for parcelling only
54fbfe55512596fd00c1fb51caa851e17dae60fd43Mike Lockwood    private StorageVolume(String path, String description,
55fbfe55512596fd00c1fb51caa851e17dae60fd43Mike Lockwood            boolean removable, boolean emulated, int mtpReserveSpace, int storageId) {
56fbfe55512596fd00c1fb51caa851e17dae60fd43Mike Lockwood        mPath = path;
57fbfe55512596fd00c1fb51caa851e17dae60fd43Mike Lockwood        mDescription = description;
58fbfe55512596fd00c1fb51caa851e17dae60fd43Mike Lockwood        mRemovable = removable;
59fbfe55512596fd00c1fb51caa851e17dae60fd43Mike Lockwood        mEmulated = emulated;
60fbfe55512596fd00c1fb51caa851e17dae60fd43Mike Lockwood        mMtpReserveSpace = mtpReserveSpace;
61fbfe55512596fd00c1fb51caa851e17dae60fd43Mike Lockwood        mStorageId = storageId;
62fbfe55512596fd00c1fb51caa851e17dae60fd43Mike Lockwood    }
63fbfe55512596fd00c1fb51caa851e17dae60fd43Mike Lockwood
642f6a3885533a52758c2cd4f81f6123a712be8ae6Mike Lockwood    /**
652f6a3885533a52758c2cd4f81f6123a712be8ae6Mike Lockwood     * Returns the mount path for the volume.
662f6a3885533a52758c2cd4f81f6123a712be8ae6Mike Lockwood     *
672f6a3885533a52758c2cd4f81f6123a712be8ae6Mike Lockwood     * @return the mount path
682f6a3885533a52758c2cd4f81f6123a712be8ae6Mike Lockwood     */
692f6a3885533a52758c2cd4f81f6123a712be8ae6Mike Lockwood    public String getPath() {
702f6a3885533a52758c2cd4f81f6123a712be8ae6Mike Lockwood        return mPath;
712f6a3885533a52758c2cd4f81f6123a712be8ae6Mike Lockwood    }
722f6a3885533a52758c2cd4f81f6123a712be8ae6Mike Lockwood
732f6a3885533a52758c2cd4f81f6123a712be8ae6Mike Lockwood    /**
742f6a3885533a52758c2cd4f81f6123a712be8ae6Mike Lockwood     * Returns a user visible description of the volume.
752f6a3885533a52758c2cd4f81f6123a712be8ae6Mike Lockwood     *
762f6a3885533a52758c2cd4f81f6123a712be8ae6Mike Lockwood     * @return the volume description
772f6a3885533a52758c2cd4f81f6123a712be8ae6Mike Lockwood     */
782f6a3885533a52758c2cd4f81f6123a712be8ae6Mike Lockwood    public String getDescription() {
792f6a3885533a52758c2cd4f81f6123a712be8ae6Mike Lockwood        return mDescription;
802f6a3885533a52758c2cd4f81f6123a712be8ae6Mike Lockwood    }
812f6a3885533a52758c2cd4f81f6123a712be8ae6Mike Lockwood
822f6a3885533a52758c2cd4f81f6123a712be8ae6Mike Lockwood    /**
832f6a3885533a52758c2cd4f81f6123a712be8ae6Mike Lockwood     * Returns true if the volume is removable.
842f6a3885533a52758c2cd4f81f6123a712be8ae6Mike Lockwood     *
852f6a3885533a52758c2cd4f81f6123a712be8ae6Mike Lockwood     * @return is removable
862f6a3885533a52758c2cd4f81f6123a712be8ae6Mike Lockwood     */
872f6a3885533a52758c2cd4f81f6123a712be8ae6Mike Lockwood    public boolean isRemovable() {
882f6a3885533a52758c2cd4f81f6123a712be8ae6Mike Lockwood        return mRemovable;
892f6a3885533a52758c2cd4f81f6123a712be8ae6Mike Lockwood    }
902f6a3885533a52758c2cd4f81f6123a712be8ae6Mike Lockwood
912f6a3885533a52758c2cd4f81f6123a712be8ae6Mike Lockwood    /**
922f6a3885533a52758c2cd4f81f6123a712be8ae6Mike Lockwood     * Returns true if the volume is emulated.
932f6a3885533a52758c2cd4f81f6123a712be8ae6Mike Lockwood     *
942f6a3885533a52758c2cd4f81f6123a712be8ae6Mike Lockwood     * @return is removable
952f6a3885533a52758c2cd4f81f6123a712be8ae6Mike Lockwood     */
962f6a3885533a52758c2cd4f81f6123a712be8ae6Mike Lockwood    public boolean isEmulated() {
972f6a3885533a52758c2cd4f81f6123a712be8ae6Mike Lockwood        return mEmulated;
982f6a3885533a52758c2cd4f81f6123a712be8ae6Mike Lockwood    }
992f6a3885533a52758c2cd4f81f6123a712be8ae6Mike Lockwood
1002f6a3885533a52758c2cd4f81f6123a712be8ae6Mike Lockwood    /**
101fbfe55512596fd00c1fb51caa851e17dae60fd43Mike Lockwood     * Returns the MTP storage ID for the volume.
102fbfe55512596fd00c1fb51caa851e17dae60fd43Mike Lockwood     * this is also used for the storage_id column in the media provider.
103fbfe55512596fd00c1fb51caa851e17dae60fd43Mike Lockwood     *
104fbfe55512596fd00c1fb51caa851e17dae60fd43Mike Lockwood     * @return MTP storage ID
105fbfe55512596fd00c1fb51caa851e17dae60fd43Mike Lockwood     */
106fbfe55512596fd00c1fb51caa851e17dae60fd43Mike Lockwood    public int getStorageId() {
107fbfe55512596fd00c1fb51caa851e17dae60fd43Mike Lockwood        return mStorageId;
108fbfe55512596fd00c1fb51caa851e17dae60fd43Mike Lockwood    }
109fbfe55512596fd00c1fb51caa851e17dae60fd43Mike Lockwood
110fbfe55512596fd00c1fb51caa851e17dae60fd43Mike Lockwood    /**
111fbfe55512596fd00c1fb51caa851e17dae60fd43Mike Lockwood     * Do not call this unless you are MountService
112fbfe55512596fd00c1fb51caa851e17dae60fd43Mike Lockwood     */
113fbfe55512596fd00c1fb51caa851e17dae60fd43Mike Lockwood    public void setStorageId(int index) {
114fbfe55512596fd00c1fb51caa851e17dae60fd43Mike Lockwood        // storage ID is 0x00010001 for primary storage,
115fbfe55512596fd00c1fb51caa851e17dae60fd43Mike Lockwood        // then 0x00020001, 0x00030001, etc. for secondary storages
116fbfe55512596fd00c1fb51caa851e17dae60fd43Mike Lockwood        mStorageId = ((index + 1) << 16) + 1;
117fbfe55512596fd00c1fb51caa851e17dae60fd43Mike Lockwood    }
118fbfe55512596fd00c1fb51caa851e17dae60fd43Mike Lockwood
119fbfe55512596fd00c1fb51caa851e17dae60fd43Mike Lockwood    /**
1202f6a3885533a52758c2cd4f81f6123a712be8ae6Mike Lockwood     * Number of megabytes of space to leave unallocated by MTP.
1212f6a3885533a52758c2cd4f81f6123a712be8ae6Mike Lockwood     * MTP will subtract this value from the free space it reports back
1222f6a3885533a52758c2cd4f81f6123a712be8ae6Mike Lockwood     * to the host via GetStorageInfo, and will not allow new files to
1232f6a3885533a52758c2cd4f81f6123a712be8ae6Mike Lockwood     * be added via MTP if there is less than this amount left free in the storage.
1242f6a3885533a52758c2cd4f81f6123a712be8ae6Mike Lockwood     * If MTP has dedicated storage this value should be zero, but if MTP is
1252f6a3885533a52758c2cd4f81f6123a712be8ae6Mike Lockwood     * sharing storage with the rest of the system, set this to a positive value
1262f6a3885533a52758c2cd4f81f6123a712be8ae6Mike Lockwood     * to ensure that MTP activity does not result in the storage being
1272f6a3885533a52758c2cd4f81f6123a712be8ae6Mike Lockwood     * too close to full.
1282f6a3885533a52758c2cd4f81f6123a712be8ae6Mike Lockwood     *
1292f6a3885533a52758c2cd4f81f6123a712be8ae6Mike Lockwood     * @return MTP reserve space
1302f6a3885533a52758c2cd4f81f6123a712be8ae6Mike Lockwood     */
1312f6a3885533a52758c2cd4f81f6123a712be8ae6Mike Lockwood    public int getMtpReserveSpace() {
1322f6a3885533a52758c2cd4f81f6123a712be8ae6Mike Lockwood        return mMtpReserveSpace;
1332f6a3885533a52758c2cd4f81f6123a712be8ae6Mike Lockwood    }
1342f6a3885533a52758c2cd4f81f6123a712be8ae6Mike Lockwood
1352f6a3885533a52758c2cd4f81f6123a712be8ae6Mike Lockwood    @Override
1362f6a3885533a52758c2cd4f81f6123a712be8ae6Mike Lockwood    public boolean equals(Object obj) {
1372f6a3885533a52758c2cd4f81f6123a712be8ae6Mike Lockwood        if (obj instanceof StorageVolume && mPath != null) {
1382f6a3885533a52758c2cd4f81f6123a712be8ae6Mike Lockwood            StorageVolume volume = (StorageVolume)obj;
1392f6a3885533a52758c2cd4f81f6123a712be8ae6Mike Lockwood            return (mPath.equals(volume.mPath));
1402f6a3885533a52758c2cd4f81f6123a712be8ae6Mike Lockwood        }
1412f6a3885533a52758c2cd4f81f6123a712be8ae6Mike Lockwood        return false;
1422f6a3885533a52758c2cd4f81f6123a712be8ae6Mike Lockwood    }
1432f6a3885533a52758c2cd4f81f6123a712be8ae6Mike Lockwood
1442f6a3885533a52758c2cd4f81f6123a712be8ae6Mike Lockwood    @Override
1452f6a3885533a52758c2cd4f81f6123a712be8ae6Mike Lockwood    public int hashCode() {
1462f6a3885533a52758c2cd4f81f6123a712be8ae6Mike Lockwood        return mPath.hashCode();
1472f6a3885533a52758c2cd4f81f6123a712be8ae6Mike Lockwood    }
1482f6a3885533a52758c2cd4f81f6123a712be8ae6Mike Lockwood
1492f6a3885533a52758c2cd4f81f6123a712be8ae6Mike Lockwood    @Override
1502f6a3885533a52758c2cd4f81f6123a712be8ae6Mike Lockwood    public String toString() {
1512f6a3885533a52758c2cd4f81f6123a712be8ae6Mike Lockwood        return mPath;
1522f6a3885533a52758c2cd4f81f6123a712be8ae6Mike Lockwood    }
1532f6a3885533a52758c2cd4f81f6123a712be8ae6Mike Lockwood
1542f6a3885533a52758c2cd4f81f6123a712be8ae6Mike Lockwood    public static final Parcelable.Creator<StorageVolume> CREATOR =
1552f6a3885533a52758c2cd4f81f6123a712be8ae6Mike Lockwood        new Parcelable.Creator<StorageVolume>() {
1562f6a3885533a52758c2cd4f81f6123a712be8ae6Mike Lockwood        public StorageVolume createFromParcel(Parcel in) {
1572f6a3885533a52758c2cd4f81f6123a712be8ae6Mike Lockwood            String path = in.readString();
1582f6a3885533a52758c2cd4f81f6123a712be8ae6Mike Lockwood            String description = in.readString();
1592f6a3885533a52758c2cd4f81f6123a712be8ae6Mike Lockwood            int removable = in.readInt();
1602f6a3885533a52758c2cd4f81f6123a712be8ae6Mike Lockwood            int emulated = in.readInt();
161fbfe55512596fd00c1fb51caa851e17dae60fd43Mike Lockwood            int storageId = in.readInt();
1622f6a3885533a52758c2cd4f81f6123a712be8ae6Mike Lockwood            int mtpReserveSpace = in.readInt();
1632f6a3885533a52758c2cd4f81f6123a712be8ae6Mike Lockwood            return new StorageVolume(path, description,
164fbfe55512596fd00c1fb51caa851e17dae60fd43Mike Lockwood                    removable == 1, emulated == 1,
165fbfe55512596fd00c1fb51caa851e17dae60fd43Mike Lockwood                    mtpReserveSpace, storageId);
1662f6a3885533a52758c2cd4f81f6123a712be8ae6Mike Lockwood        }
1672f6a3885533a52758c2cd4f81f6123a712be8ae6Mike Lockwood
1682f6a3885533a52758c2cd4f81f6123a712be8ae6Mike Lockwood        public StorageVolume[] newArray(int size) {
1692f6a3885533a52758c2cd4f81f6123a712be8ae6Mike Lockwood            return new StorageVolume[size];
1702f6a3885533a52758c2cd4f81f6123a712be8ae6Mike Lockwood        }
1712f6a3885533a52758c2cd4f81f6123a712be8ae6Mike Lockwood    };
1722f6a3885533a52758c2cd4f81f6123a712be8ae6Mike Lockwood
1732f6a3885533a52758c2cd4f81f6123a712be8ae6Mike Lockwood    public int describeContents() {
1742f6a3885533a52758c2cd4f81f6123a712be8ae6Mike Lockwood        return 0;
1752f6a3885533a52758c2cd4f81f6123a712be8ae6Mike Lockwood    }
1762f6a3885533a52758c2cd4f81f6123a712be8ae6Mike Lockwood
1772f6a3885533a52758c2cd4f81f6123a712be8ae6Mike Lockwood    public void writeToParcel(Parcel parcel, int flags) {
1782f6a3885533a52758c2cd4f81f6123a712be8ae6Mike Lockwood        parcel.writeString(mPath);
1792f6a3885533a52758c2cd4f81f6123a712be8ae6Mike Lockwood        parcel.writeString(mDescription);
1802f6a3885533a52758c2cd4f81f6123a712be8ae6Mike Lockwood        parcel.writeInt(mRemovable ? 1 : 0);
1812f6a3885533a52758c2cd4f81f6123a712be8ae6Mike Lockwood        parcel.writeInt(mEmulated ? 1 : 0);
182fbfe55512596fd00c1fb51caa851e17dae60fd43Mike Lockwood        parcel.writeInt(mStorageId);
1832f6a3885533a52758c2cd4f81f6123a712be8ae6Mike Lockwood        parcel.writeInt(mMtpReserveSpace);
1842f6a3885533a52758c2cd4f81f6123a712be8ae6Mike Lockwood    }
1852f6a3885533a52758c2cd4f81f6123a712be8ae6Mike Lockwood}
186