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