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
1913fe2a5330a5df662d7b1b136e7b08fe34c94a42Fabrice Di Meglioimport android.content.Context;
202f6a3885533a52758c2cd4f81f6123a712be8ae6Mike Lockwoodimport android.os.Parcel;
212f6a3885533a52758c2cd4f81f6123a712be8ae6Mike Lockwoodimport android.os.Parcelable;
22b049e212ab7fe8967893c202efcb30fecfdb82fbJeff Sharkeyimport android.os.UserHandle;
23b049e212ab7fe8967893c202efcb30fecfdb82fbJeff Sharkey
24b049e212ab7fe8967893c202efcb30fecfdb82fbJeff Sharkeyimport java.io.File;
252f6a3885533a52758c2cd4f81f6123a712be8ae6Mike Lockwood
262f6a3885533a52758c2cd4f81f6123a712be8ae6Mike Lockwood/**
27b049e212ab7fe8967893c202efcb30fecfdb82fbJeff Sharkey * Description of a storage volume and its capabilities, including the
28b049e212ab7fe8967893c202efcb30fecfdb82fbJeff Sharkey * filesystem path where it may be mounted.
29b049e212ab7fe8967893c202efcb30fecfdb82fbJeff Sharkey *
302f6a3885533a52758c2cd4f81f6123a712be8ae6Mike Lockwood * @hide
312f6a3885533a52758c2cd4f81f6123a712be8ae6Mike Lockwood */
322f6a3885533a52758c2cd4f81f6123a712be8ae6Mike Lockwoodpublic class StorageVolume implements Parcelable {
332f6a3885533a52758c2cd4f81f6123a712be8ae6Mike Lockwood
34b049e212ab7fe8967893c202efcb30fecfdb82fbJeff Sharkey    // TODO: switch to more durable token
359545dc020ea11649d70dcbe911a8e82a3254a4eaJeff Sharkey    private int mStorageId;
362f6a3885533a52758c2cd4f81f6123a712be8ae6Mike Lockwood
37b049e212ab7fe8967893c202efcb30fecfdb82fbJeff Sharkey    private final File mPath;
3813fe2a5330a5df662d7b1b136e7b08fe34c94a42Fabrice Di Meglio    private final int mDescriptionId;
399545dc020ea11649d70dcbe911a8e82a3254a4eaJeff Sharkey    private final boolean mPrimary;
402f6a3885533a52758c2cd4f81f6123a712be8ae6Mike Lockwood    private final boolean mRemovable;
412f6a3885533a52758c2cd4f81f6123a712be8ae6Mike Lockwood    private final boolean mEmulated;
422f6a3885533a52758c2cd4f81f6123a712be8ae6Mike Lockwood    private final int mMtpReserveSpace;
438e8b280bd19fa6cb69bb19e1d90cf03a47ba2d72Mike Lockwood    private final boolean mAllowMassStorage;
449545dc020ea11649d70dcbe911a8e82a3254a4eaJeff Sharkey    /** Maximum file size for the storage, or zero for no limit */
457a59dd2ce33b46cbc73eef964ddb4272ea1da8d1Mike Lockwood    private final long mMaxFileSize;
46b049e212ab7fe8967893c202efcb30fecfdb82fbJeff Sharkey    /** When set, indicates exclusive ownership of this volume */
47b049e212ab7fe8967893c202efcb30fecfdb82fbJeff Sharkey    private final UserHandle mOwner;
482f6a3885533a52758c2cd4f81f6123a712be8ae6Mike Lockwood
49a5250c93928e256738125b265e10c96c3575597eMike Lockwood    // StorageVolume extra for ACTION_MEDIA_REMOVED, ACTION_MEDIA_UNMOUNTED, ACTION_MEDIA_CHECKING,
50a5250c93928e256738125b265e10c96c3575597eMike Lockwood    // ACTION_MEDIA_NOFS, ACTION_MEDIA_MOUNTED, ACTION_MEDIA_SHARED, ACTION_MEDIA_UNSHARED,
51a5250c93928e256738125b265e10c96c3575597eMike Lockwood    // ACTION_MEDIA_BAD_REMOVAL, ACTION_MEDIA_UNMOUNTABLE and ACTION_MEDIA_EJECT broadcasts.
52a5250c93928e256738125b265e10c96c3575597eMike Lockwood    public static final String EXTRA_STORAGE_VOLUME = "storage_volume";
53a5250c93928e256738125b265e10c96c3575597eMike Lockwood
54b049e212ab7fe8967893c202efcb30fecfdb82fbJeff Sharkey    public StorageVolume(File path, int descriptionId, boolean primary, boolean removable,
55b049e212ab7fe8967893c202efcb30fecfdb82fbJeff Sharkey            boolean emulated, int mtpReserveSpace, boolean allowMassStorage, long maxFileSize,
56b049e212ab7fe8967893c202efcb30fecfdb82fbJeff Sharkey            UserHandle owner) {
572f6a3885533a52758c2cd4f81f6123a712be8ae6Mike Lockwood        mPath = path;
5813fe2a5330a5df662d7b1b136e7b08fe34c94a42Fabrice Di Meglio        mDescriptionId = descriptionId;
599545dc020ea11649d70dcbe911a8e82a3254a4eaJeff Sharkey        mPrimary = primary;
602f6a3885533a52758c2cd4f81f6123a712be8ae6Mike Lockwood        mRemovable = removable;
612f6a3885533a52758c2cd4f81f6123a712be8ae6Mike Lockwood        mEmulated = emulated;
622f6a3885533a52758c2cd4f81f6123a712be8ae6Mike Lockwood        mMtpReserveSpace = mtpReserveSpace;
638e8b280bd19fa6cb69bb19e1d90cf03a47ba2d72Mike Lockwood        mAllowMassStorage = allowMassStorage;
647a59dd2ce33b46cbc73eef964ddb4272ea1da8d1Mike Lockwood        mMaxFileSize = maxFileSize;
65b049e212ab7fe8967893c202efcb30fecfdb82fbJeff Sharkey        mOwner = owner;
662f6a3885533a52758c2cd4f81f6123a712be8ae6Mike Lockwood    }
672f6a3885533a52758c2cd4f81f6123a712be8ae6Mike Lockwood
689545dc020ea11649d70dcbe911a8e82a3254a4eaJeff Sharkey    private StorageVolume(Parcel in) {
699545dc020ea11649d70dcbe911a8e82a3254a4eaJeff Sharkey        mStorageId = in.readInt();
70b049e212ab7fe8967893c202efcb30fecfdb82fbJeff Sharkey        mPath = new File(in.readString());
719545dc020ea11649d70dcbe911a8e82a3254a4eaJeff Sharkey        mDescriptionId = in.readInt();
72b049e212ab7fe8967893c202efcb30fecfdb82fbJeff Sharkey        mPrimary = in.readInt() != 0;
73b049e212ab7fe8967893c202efcb30fecfdb82fbJeff Sharkey        mRemovable = in.readInt() != 0;
74b049e212ab7fe8967893c202efcb30fecfdb82fbJeff Sharkey        mEmulated = in.readInt() != 0;
759545dc020ea11649d70dcbe911a8e82a3254a4eaJeff Sharkey        mMtpReserveSpace = in.readInt();
76b049e212ab7fe8967893c202efcb30fecfdb82fbJeff Sharkey        mAllowMassStorage = in.readInt() != 0;
779545dc020ea11649d70dcbe911a8e82a3254a4eaJeff Sharkey        mMaxFileSize = in.readLong();
78b049e212ab7fe8967893c202efcb30fecfdb82fbJeff Sharkey        mOwner = in.readParcelable(null);
79b049e212ab7fe8967893c202efcb30fecfdb82fbJeff Sharkey    }
80b049e212ab7fe8967893c202efcb30fecfdb82fbJeff Sharkey
81b049e212ab7fe8967893c202efcb30fecfdb82fbJeff Sharkey    public static StorageVolume fromTemplate(StorageVolume template, File path, UserHandle owner) {
82b049e212ab7fe8967893c202efcb30fecfdb82fbJeff Sharkey        return new StorageVolume(path, template.mDescriptionId, template.mPrimary,
83b049e212ab7fe8967893c202efcb30fecfdb82fbJeff Sharkey                template.mRemovable, template.mEmulated, template.mMtpReserveSpace,
84b049e212ab7fe8967893c202efcb30fecfdb82fbJeff Sharkey                template.mAllowMassStorage, template.mMaxFileSize, owner);
85fbfe55512596fd00c1fb51caa851e17dae60fd43Mike Lockwood    }
86fbfe55512596fd00c1fb51caa851e17dae60fd43Mike Lockwood
872f6a3885533a52758c2cd4f81f6123a712be8ae6Mike Lockwood    /**
882f6a3885533a52758c2cd4f81f6123a712be8ae6Mike Lockwood     * Returns the mount path for the volume.
892f6a3885533a52758c2cd4f81f6123a712be8ae6Mike Lockwood     *
902f6a3885533a52758c2cd4f81f6123a712be8ae6Mike Lockwood     * @return the mount path
912f6a3885533a52758c2cd4f81f6123a712be8ae6Mike Lockwood     */
922f6a3885533a52758c2cd4f81f6123a712be8ae6Mike Lockwood    public String getPath() {
93b049e212ab7fe8967893c202efcb30fecfdb82fbJeff Sharkey        return mPath.toString();
94b049e212ab7fe8967893c202efcb30fecfdb82fbJeff Sharkey    }
95b049e212ab7fe8967893c202efcb30fecfdb82fbJeff Sharkey
96b049e212ab7fe8967893c202efcb30fecfdb82fbJeff Sharkey    public File getPathFile() {
972f6a3885533a52758c2cd4f81f6123a712be8ae6Mike Lockwood        return mPath;
982f6a3885533a52758c2cd4f81f6123a712be8ae6Mike Lockwood    }
992f6a3885533a52758c2cd4f81f6123a712be8ae6Mike Lockwood
1002f6a3885533a52758c2cd4f81f6123a712be8ae6Mike Lockwood    /**
1012f6a3885533a52758c2cd4f81f6123a712be8ae6Mike Lockwood     * Returns a user visible description of the volume.
1022f6a3885533a52758c2cd4f81f6123a712be8ae6Mike Lockwood     *
1032f6a3885533a52758c2cd4f81f6123a712be8ae6Mike Lockwood     * @return the volume description
1042f6a3885533a52758c2cd4f81f6123a712be8ae6Mike Lockwood     */
10513fe2a5330a5df662d7b1b136e7b08fe34c94a42Fabrice Di Meglio    public String getDescription(Context context) {
10613fe2a5330a5df662d7b1b136e7b08fe34c94a42Fabrice Di Meglio        return context.getResources().getString(mDescriptionId);
10713fe2a5330a5df662d7b1b136e7b08fe34c94a42Fabrice Di Meglio    }
10813fe2a5330a5df662d7b1b136e7b08fe34c94a42Fabrice Di Meglio
10913fe2a5330a5df662d7b1b136e7b08fe34c94a42Fabrice Di Meglio    public int getDescriptionId() {
11013fe2a5330a5df662d7b1b136e7b08fe34c94a42Fabrice Di Meglio        return mDescriptionId;
1112f6a3885533a52758c2cd4f81f6123a712be8ae6Mike Lockwood    }
1122f6a3885533a52758c2cd4f81f6123a712be8ae6Mike Lockwood
1139545dc020ea11649d70dcbe911a8e82a3254a4eaJeff Sharkey    public boolean isPrimary() {
1149545dc020ea11649d70dcbe911a8e82a3254a4eaJeff Sharkey        return mPrimary;
1159545dc020ea11649d70dcbe911a8e82a3254a4eaJeff Sharkey    }
1169545dc020ea11649d70dcbe911a8e82a3254a4eaJeff Sharkey
1172f6a3885533a52758c2cd4f81f6123a712be8ae6Mike Lockwood    /**
1182f6a3885533a52758c2cd4f81f6123a712be8ae6Mike Lockwood     * Returns true if the volume is removable.
1192f6a3885533a52758c2cd4f81f6123a712be8ae6Mike Lockwood     *
1202f6a3885533a52758c2cd4f81f6123a712be8ae6Mike Lockwood     * @return is removable
1212f6a3885533a52758c2cd4f81f6123a712be8ae6Mike Lockwood     */
1222f6a3885533a52758c2cd4f81f6123a712be8ae6Mike Lockwood    public boolean isRemovable() {
1232f6a3885533a52758c2cd4f81f6123a712be8ae6Mike Lockwood        return mRemovable;
1242f6a3885533a52758c2cd4f81f6123a712be8ae6Mike Lockwood    }
1252f6a3885533a52758c2cd4f81f6123a712be8ae6Mike Lockwood
1262f6a3885533a52758c2cd4f81f6123a712be8ae6Mike Lockwood    /**
1272f6a3885533a52758c2cd4f81f6123a712be8ae6Mike Lockwood     * Returns true if the volume is emulated.
1282f6a3885533a52758c2cd4f81f6123a712be8ae6Mike Lockwood     *
1292f6a3885533a52758c2cd4f81f6123a712be8ae6Mike Lockwood     * @return is removable
1302f6a3885533a52758c2cd4f81f6123a712be8ae6Mike Lockwood     */
1312f6a3885533a52758c2cd4f81f6123a712be8ae6Mike Lockwood    public boolean isEmulated() {
1322f6a3885533a52758c2cd4f81f6123a712be8ae6Mike Lockwood        return mEmulated;
1332f6a3885533a52758c2cd4f81f6123a712be8ae6Mike Lockwood    }
1342f6a3885533a52758c2cd4f81f6123a712be8ae6Mike Lockwood
1352f6a3885533a52758c2cd4f81f6123a712be8ae6Mike Lockwood    /**
136fbfe55512596fd00c1fb51caa851e17dae60fd43Mike Lockwood     * Returns the MTP storage ID for the volume.
137fbfe55512596fd00c1fb51caa851e17dae60fd43Mike Lockwood     * this is also used for the storage_id column in the media provider.
138fbfe55512596fd00c1fb51caa851e17dae60fd43Mike Lockwood     *
139fbfe55512596fd00c1fb51caa851e17dae60fd43Mike Lockwood     * @return MTP storage ID
140fbfe55512596fd00c1fb51caa851e17dae60fd43Mike Lockwood     */
141fbfe55512596fd00c1fb51caa851e17dae60fd43Mike Lockwood    public int getStorageId() {
142fbfe55512596fd00c1fb51caa851e17dae60fd43Mike Lockwood        return mStorageId;
143fbfe55512596fd00c1fb51caa851e17dae60fd43Mike Lockwood    }
144fbfe55512596fd00c1fb51caa851e17dae60fd43Mike Lockwood
145fbfe55512596fd00c1fb51caa851e17dae60fd43Mike Lockwood    /**
146fbfe55512596fd00c1fb51caa851e17dae60fd43Mike Lockwood     * Do not call this unless you are MountService
147fbfe55512596fd00c1fb51caa851e17dae60fd43Mike Lockwood     */
148fbfe55512596fd00c1fb51caa851e17dae60fd43Mike Lockwood    public void setStorageId(int index) {
149fbfe55512596fd00c1fb51caa851e17dae60fd43Mike Lockwood        // storage ID is 0x00010001 for primary storage,
150fbfe55512596fd00c1fb51caa851e17dae60fd43Mike Lockwood        // then 0x00020001, 0x00030001, etc. for secondary storages
151fbfe55512596fd00c1fb51caa851e17dae60fd43Mike Lockwood        mStorageId = ((index + 1) << 16) + 1;
152fbfe55512596fd00c1fb51caa851e17dae60fd43Mike Lockwood    }
153fbfe55512596fd00c1fb51caa851e17dae60fd43Mike Lockwood
154fbfe55512596fd00c1fb51caa851e17dae60fd43Mike Lockwood    /**
1552f6a3885533a52758c2cd4f81f6123a712be8ae6Mike Lockwood     * Number of megabytes of space to leave unallocated by MTP.
1562f6a3885533a52758c2cd4f81f6123a712be8ae6Mike Lockwood     * MTP will subtract this value from the free space it reports back
1572f6a3885533a52758c2cd4f81f6123a712be8ae6Mike Lockwood     * to the host via GetStorageInfo, and will not allow new files to
1582f6a3885533a52758c2cd4f81f6123a712be8ae6Mike Lockwood     * be added via MTP if there is less than this amount left free in the storage.
1592f6a3885533a52758c2cd4f81f6123a712be8ae6Mike Lockwood     * If MTP has dedicated storage this value should be zero, but if MTP is
1602f6a3885533a52758c2cd4f81f6123a712be8ae6Mike Lockwood     * sharing storage with the rest of the system, set this to a positive value
1612f6a3885533a52758c2cd4f81f6123a712be8ae6Mike Lockwood     * to ensure that MTP activity does not result in the storage being
1622f6a3885533a52758c2cd4f81f6123a712be8ae6Mike Lockwood     * too close to full.
1632f6a3885533a52758c2cd4f81f6123a712be8ae6Mike Lockwood     *
1642f6a3885533a52758c2cd4f81f6123a712be8ae6Mike Lockwood     * @return MTP reserve space
1652f6a3885533a52758c2cd4f81f6123a712be8ae6Mike Lockwood     */
1662f6a3885533a52758c2cd4f81f6123a712be8ae6Mike Lockwood    public int getMtpReserveSpace() {
1672f6a3885533a52758c2cd4f81f6123a712be8ae6Mike Lockwood        return mMtpReserveSpace;
1682f6a3885533a52758c2cd4f81f6123a712be8ae6Mike Lockwood    }
1692f6a3885533a52758c2cd4f81f6123a712be8ae6Mike Lockwood
1708e8b280bd19fa6cb69bb19e1d90cf03a47ba2d72Mike Lockwood    /**
1718e8b280bd19fa6cb69bb19e1d90cf03a47ba2d72Mike Lockwood     * Returns true if this volume can be shared via USB mass storage.
1728e8b280bd19fa6cb69bb19e1d90cf03a47ba2d72Mike Lockwood     *
1738e8b280bd19fa6cb69bb19e1d90cf03a47ba2d72Mike Lockwood     * @return whether mass storage is allowed
1748e8b280bd19fa6cb69bb19e1d90cf03a47ba2d72Mike Lockwood     */
1758e8b280bd19fa6cb69bb19e1d90cf03a47ba2d72Mike Lockwood    public boolean allowMassStorage() {
1768e8b280bd19fa6cb69bb19e1d90cf03a47ba2d72Mike Lockwood        return mAllowMassStorage;
1778e8b280bd19fa6cb69bb19e1d90cf03a47ba2d72Mike Lockwood    }
1788e8b280bd19fa6cb69bb19e1d90cf03a47ba2d72Mike Lockwood
1797a59dd2ce33b46cbc73eef964ddb4272ea1da8d1Mike Lockwood    /**
1807a59dd2ce33b46cbc73eef964ddb4272ea1da8d1Mike Lockwood     * Returns maximum file size for the volume, or zero if it is unbounded.
1817a59dd2ce33b46cbc73eef964ddb4272ea1da8d1Mike Lockwood     *
1827a59dd2ce33b46cbc73eef964ddb4272ea1da8d1Mike Lockwood     * @return maximum file size
1837a59dd2ce33b46cbc73eef964ddb4272ea1da8d1Mike Lockwood     */
1847a59dd2ce33b46cbc73eef964ddb4272ea1da8d1Mike Lockwood    public long getMaxFileSize() {
1857a59dd2ce33b46cbc73eef964ddb4272ea1da8d1Mike Lockwood        return mMaxFileSize;
1867a59dd2ce33b46cbc73eef964ddb4272ea1da8d1Mike Lockwood    }
1877a59dd2ce33b46cbc73eef964ddb4272ea1da8d1Mike Lockwood
188b049e212ab7fe8967893c202efcb30fecfdb82fbJeff Sharkey    public UserHandle getOwner() {
189b049e212ab7fe8967893c202efcb30fecfdb82fbJeff Sharkey        return mOwner;
190b049e212ab7fe8967893c202efcb30fecfdb82fbJeff Sharkey    }
191b049e212ab7fe8967893c202efcb30fecfdb82fbJeff Sharkey
1922f6a3885533a52758c2cd4f81f6123a712be8ae6Mike Lockwood    @Override
1932f6a3885533a52758c2cd4f81f6123a712be8ae6Mike Lockwood    public boolean equals(Object obj) {
1942f6a3885533a52758c2cd4f81f6123a712be8ae6Mike Lockwood        if (obj instanceof StorageVolume && mPath != null) {
1952f6a3885533a52758c2cd4f81f6123a712be8ae6Mike Lockwood            StorageVolume volume = (StorageVolume)obj;
1962f6a3885533a52758c2cd4f81f6123a712be8ae6Mike Lockwood            return (mPath.equals(volume.mPath));
1972f6a3885533a52758c2cd4f81f6123a712be8ae6Mike Lockwood        }
1982f6a3885533a52758c2cd4f81f6123a712be8ae6Mike Lockwood        return false;
1992f6a3885533a52758c2cd4f81f6123a712be8ae6Mike Lockwood    }
2002f6a3885533a52758c2cd4f81f6123a712be8ae6Mike Lockwood
2012f6a3885533a52758c2cd4f81f6123a712be8ae6Mike Lockwood    @Override
2022f6a3885533a52758c2cd4f81f6123a712be8ae6Mike Lockwood    public int hashCode() {
2032f6a3885533a52758c2cd4f81f6123a712be8ae6Mike Lockwood        return mPath.hashCode();
2042f6a3885533a52758c2cd4f81f6123a712be8ae6Mike Lockwood    }
2052f6a3885533a52758c2cd4f81f6123a712be8ae6Mike Lockwood
2062f6a3885533a52758c2cd4f81f6123a712be8ae6Mike Lockwood    @Override
2072f6a3885533a52758c2cd4f81f6123a712be8ae6Mike Lockwood    public String toString() {
208b049e212ab7fe8967893c202efcb30fecfdb82fbJeff Sharkey        final StringBuilder builder = new StringBuilder("StorageVolume [");
209b049e212ab7fe8967893c202efcb30fecfdb82fbJeff Sharkey        builder.append("mStorageId=").append(mStorageId);
210b049e212ab7fe8967893c202efcb30fecfdb82fbJeff Sharkey        builder.append(" mPath=").append(mPath);
211b049e212ab7fe8967893c202efcb30fecfdb82fbJeff Sharkey        builder.append(" mDescriptionId=").append(mDescriptionId);
212b049e212ab7fe8967893c202efcb30fecfdb82fbJeff Sharkey        builder.append(" mPrimary=").append(mPrimary);
213b049e212ab7fe8967893c202efcb30fecfdb82fbJeff Sharkey        builder.append(" mRemovable=").append(mRemovable);
214b049e212ab7fe8967893c202efcb30fecfdb82fbJeff Sharkey        builder.append(" mEmulated=").append(mEmulated);
215b049e212ab7fe8967893c202efcb30fecfdb82fbJeff Sharkey        builder.append(" mMtpReserveSpace=").append(mMtpReserveSpace);
216b049e212ab7fe8967893c202efcb30fecfdb82fbJeff Sharkey        builder.append(" mAllowMassStorage=").append(mAllowMassStorage);
217b049e212ab7fe8967893c202efcb30fecfdb82fbJeff Sharkey        builder.append(" mMaxFileSize=").append(mMaxFileSize);
218b049e212ab7fe8967893c202efcb30fecfdb82fbJeff Sharkey        builder.append(" mOwner=").append(mOwner);
219b049e212ab7fe8967893c202efcb30fecfdb82fbJeff Sharkey        builder.append("]");
220b049e212ab7fe8967893c202efcb30fecfdb82fbJeff Sharkey        return builder.toString();
2212f6a3885533a52758c2cd4f81f6123a712be8ae6Mike Lockwood    }
2222f6a3885533a52758c2cd4f81f6123a712be8ae6Mike Lockwood
2239545dc020ea11649d70dcbe911a8e82a3254a4eaJeff Sharkey    public static final Creator<StorageVolume> CREATOR = new Creator<StorageVolume>() {
2249545dc020ea11649d70dcbe911a8e82a3254a4eaJeff Sharkey        @Override
2252f6a3885533a52758c2cd4f81f6123a712be8ae6Mike Lockwood        public StorageVolume createFromParcel(Parcel in) {
2269545dc020ea11649d70dcbe911a8e82a3254a4eaJeff Sharkey            return new StorageVolume(in);
2272f6a3885533a52758c2cd4f81f6123a712be8ae6Mike Lockwood        }
2282f6a3885533a52758c2cd4f81f6123a712be8ae6Mike Lockwood
2299545dc020ea11649d70dcbe911a8e82a3254a4eaJeff Sharkey        @Override
2302f6a3885533a52758c2cd4f81f6123a712be8ae6Mike Lockwood        public StorageVolume[] newArray(int size) {
2312f6a3885533a52758c2cd4f81f6123a712be8ae6Mike Lockwood            return new StorageVolume[size];
2322f6a3885533a52758c2cd4f81f6123a712be8ae6Mike Lockwood        }
2332f6a3885533a52758c2cd4f81f6123a712be8ae6Mike Lockwood    };
2342f6a3885533a52758c2cd4f81f6123a712be8ae6Mike Lockwood
2359545dc020ea11649d70dcbe911a8e82a3254a4eaJeff Sharkey    @Override
2362f6a3885533a52758c2cd4f81f6123a712be8ae6Mike Lockwood    public int describeContents() {
2372f6a3885533a52758c2cd4f81f6123a712be8ae6Mike Lockwood        return 0;
2382f6a3885533a52758c2cd4f81f6123a712be8ae6Mike Lockwood    }
2392f6a3885533a52758c2cd4f81f6123a712be8ae6Mike Lockwood
2409545dc020ea11649d70dcbe911a8e82a3254a4eaJeff Sharkey    @Override
2412f6a3885533a52758c2cd4f81f6123a712be8ae6Mike Lockwood    public void writeToParcel(Parcel parcel, int flags) {
2429545dc020ea11649d70dcbe911a8e82a3254a4eaJeff Sharkey        parcel.writeInt(mStorageId);
243b049e212ab7fe8967893c202efcb30fecfdb82fbJeff Sharkey        parcel.writeString(mPath.toString());
24413fe2a5330a5df662d7b1b136e7b08fe34c94a42Fabrice Di Meglio        parcel.writeInt(mDescriptionId);
2459545dc020ea11649d70dcbe911a8e82a3254a4eaJeff Sharkey        parcel.writeInt(mPrimary ? 1 : 0);
2462f6a3885533a52758c2cd4f81f6123a712be8ae6Mike Lockwood        parcel.writeInt(mRemovable ? 1 : 0);
2472f6a3885533a52758c2cd4f81f6123a712be8ae6Mike Lockwood        parcel.writeInt(mEmulated ? 1 : 0);
2482f6a3885533a52758c2cd4f81f6123a712be8ae6Mike Lockwood        parcel.writeInt(mMtpReserveSpace);
2498e8b280bd19fa6cb69bb19e1d90cf03a47ba2d72Mike Lockwood        parcel.writeInt(mAllowMassStorage ? 1 : 0);
2507a59dd2ce33b46cbc73eef964ddb4272ea1da8d1Mike Lockwood        parcel.writeLong(mMaxFileSize);
251b049e212ab7fe8967893c202efcb30fecfdb82fbJeff Sharkey        parcel.writeParcelable(mOwner, flags);
2522f6a3885533a52758c2cd4f81f6123a712be8ae6Mike Lockwood    }
2532f6a3885533a52758c2cd4f81f6123a712be8ae6Mike Lockwood}
254