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