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
245aca2b8dc4f4ff2d466a64587d06666c7bbd9749Jeff Sharkeyimport com.android.internal.util.IndentingPrintWriter;
255aca2b8dc4f4ff2d466a64587d06666c7bbd9749Jeff Sharkey
265aca2b8dc4f4ff2d466a64587d06666c7bbd9749Jeff Sharkeyimport java.io.CharArrayWriter;
27b049e212ab7fe8967893c202efcb30fecfdb82fbJeff Sharkeyimport java.io.File;
282f6a3885533a52758c2cd4f81f6123a712be8ae6Mike Lockwood
292f6a3885533a52758c2cd4f81f6123a712be8ae6Mike Lockwood/**
30b049e212ab7fe8967893c202efcb30fecfdb82fbJeff Sharkey * Description of a storage volume and its capabilities, including the
31b049e212ab7fe8967893c202efcb30fecfdb82fbJeff Sharkey * filesystem path where it may be mounted.
32b049e212ab7fe8967893c202efcb30fecfdb82fbJeff Sharkey *
332f6a3885533a52758c2cd4f81f6123a712be8ae6Mike Lockwood * @hide
342f6a3885533a52758c2cd4f81f6123a712be8ae6Mike Lockwood */
352f6a3885533a52758c2cd4f81f6123a712be8ae6Mike Lockwoodpublic class StorageVolume implements Parcelable {
362f6a3885533a52758c2cd4f81f6123a712be8ae6Mike Lockwood
37b049e212ab7fe8967893c202efcb30fecfdb82fbJeff Sharkey    // TODO: switch to more durable token
389545dc020ea11649d70dcbe911a8e82a3254a4eaJeff Sharkey    private int mStorageId;
392f6a3885533a52758c2cd4f81f6123a712be8ae6Mike Lockwood
40b049e212ab7fe8967893c202efcb30fecfdb82fbJeff Sharkey    private final File mPath;
4113fe2a5330a5df662d7b1b136e7b08fe34c94a42Fabrice Di Meglio    private final int mDescriptionId;
429545dc020ea11649d70dcbe911a8e82a3254a4eaJeff Sharkey    private final boolean mPrimary;
432f6a3885533a52758c2cd4f81f6123a712be8ae6Mike Lockwood    private final boolean mRemovable;
442f6a3885533a52758c2cd4f81f6123a712be8ae6Mike Lockwood    private final boolean mEmulated;
452f6a3885533a52758c2cd4f81f6123a712be8ae6Mike Lockwood    private final int mMtpReserveSpace;
468e8b280bd19fa6cb69bb19e1d90cf03a47ba2d72Mike Lockwood    private final boolean mAllowMassStorage;
479545dc020ea11649d70dcbe911a8e82a3254a4eaJeff Sharkey    /** Maximum file size for the storage, or zero for no limit */
487a59dd2ce33b46cbc73eef964ddb4272ea1da8d1Mike Lockwood    private final long mMaxFileSize;
49b049e212ab7fe8967893c202efcb30fecfdb82fbJeff Sharkey    /** When set, indicates exclusive ownership of this volume */
50b049e212ab7fe8967893c202efcb30fecfdb82fbJeff Sharkey    private final UserHandle mOwner;
512f6a3885533a52758c2cd4f81f6123a712be8ae6Mike Lockwood
525aca2b8dc4f4ff2d466a64587d06666c7bbd9749Jeff Sharkey    private String mUuid;
535aca2b8dc4f4ff2d466a64587d06666c7bbd9749Jeff Sharkey    private String mUserLabel;
541f706c6cd1cb841adadc2babc57a34e5728983ecJeff Sharkey    private String mState;
555aca2b8dc4f4ff2d466a64587d06666c7bbd9749Jeff Sharkey
56a5250c93928e256738125b265e10c96c3575597eMike Lockwood    // StorageVolume extra for ACTION_MEDIA_REMOVED, ACTION_MEDIA_UNMOUNTED, ACTION_MEDIA_CHECKING,
57a5250c93928e256738125b265e10c96c3575597eMike Lockwood    // ACTION_MEDIA_NOFS, ACTION_MEDIA_MOUNTED, ACTION_MEDIA_SHARED, ACTION_MEDIA_UNSHARED,
58a5250c93928e256738125b265e10c96c3575597eMike Lockwood    // ACTION_MEDIA_BAD_REMOVAL, ACTION_MEDIA_UNMOUNTABLE and ACTION_MEDIA_EJECT broadcasts.
59a5250c93928e256738125b265e10c96c3575597eMike Lockwood    public static final String EXTRA_STORAGE_VOLUME = "storage_volume";
60a5250c93928e256738125b265e10c96c3575597eMike Lockwood
61b049e212ab7fe8967893c202efcb30fecfdb82fbJeff Sharkey    public StorageVolume(File path, int descriptionId, boolean primary, boolean removable,
62b049e212ab7fe8967893c202efcb30fecfdb82fbJeff Sharkey            boolean emulated, int mtpReserveSpace, boolean allowMassStorage, long maxFileSize,
63b049e212ab7fe8967893c202efcb30fecfdb82fbJeff Sharkey            UserHandle owner) {
642f6a3885533a52758c2cd4f81f6123a712be8ae6Mike Lockwood        mPath = path;
6513fe2a5330a5df662d7b1b136e7b08fe34c94a42Fabrice Di Meglio        mDescriptionId = descriptionId;
669545dc020ea11649d70dcbe911a8e82a3254a4eaJeff Sharkey        mPrimary = primary;
672f6a3885533a52758c2cd4f81f6123a712be8ae6Mike Lockwood        mRemovable = removable;
682f6a3885533a52758c2cd4f81f6123a712be8ae6Mike Lockwood        mEmulated = emulated;
692f6a3885533a52758c2cd4f81f6123a712be8ae6Mike Lockwood        mMtpReserveSpace = mtpReserveSpace;
708e8b280bd19fa6cb69bb19e1d90cf03a47ba2d72Mike Lockwood        mAllowMassStorage = allowMassStorage;
717a59dd2ce33b46cbc73eef964ddb4272ea1da8d1Mike Lockwood        mMaxFileSize = maxFileSize;
72b049e212ab7fe8967893c202efcb30fecfdb82fbJeff Sharkey        mOwner = owner;
732f6a3885533a52758c2cd4f81f6123a712be8ae6Mike Lockwood    }
742f6a3885533a52758c2cd4f81f6123a712be8ae6Mike Lockwood
759545dc020ea11649d70dcbe911a8e82a3254a4eaJeff Sharkey    private StorageVolume(Parcel in) {
769545dc020ea11649d70dcbe911a8e82a3254a4eaJeff Sharkey        mStorageId = in.readInt();
77b049e212ab7fe8967893c202efcb30fecfdb82fbJeff Sharkey        mPath = new File(in.readString());
789545dc020ea11649d70dcbe911a8e82a3254a4eaJeff Sharkey        mDescriptionId = in.readInt();
79b049e212ab7fe8967893c202efcb30fecfdb82fbJeff Sharkey        mPrimary = in.readInt() != 0;
80b049e212ab7fe8967893c202efcb30fecfdb82fbJeff Sharkey        mRemovable = in.readInt() != 0;
81b049e212ab7fe8967893c202efcb30fecfdb82fbJeff Sharkey        mEmulated = in.readInt() != 0;
829545dc020ea11649d70dcbe911a8e82a3254a4eaJeff Sharkey        mMtpReserveSpace = in.readInt();
83b049e212ab7fe8967893c202efcb30fecfdb82fbJeff Sharkey        mAllowMassStorage = in.readInt() != 0;
849545dc020ea11649d70dcbe911a8e82a3254a4eaJeff Sharkey        mMaxFileSize = in.readLong();
85b049e212ab7fe8967893c202efcb30fecfdb82fbJeff Sharkey        mOwner = in.readParcelable(null);
865aca2b8dc4f4ff2d466a64587d06666c7bbd9749Jeff Sharkey        mUuid = in.readString();
875aca2b8dc4f4ff2d466a64587d06666c7bbd9749Jeff Sharkey        mUserLabel = in.readString();
881f706c6cd1cb841adadc2babc57a34e5728983ecJeff Sharkey        mState = in.readString();
89b049e212ab7fe8967893c202efcb30fecfdb82fbJeff Sharkey    }
90b049e212ab7fe8967893c202efcb30fecfdb82fbJeff Sharkey
91b049e212ab7fe8967893c202efcb30fecfdb82fbJeff Sharkey    public static StorageVolume fromTemplate(StorageVolume template, File path, UserHandle owner) {
92b049e212ab7fe8967893c202efcb30fecfdb82fbJeff Sharkey        return new StorageVolume(path, template.mDescriptionId, template.mPrimary,
93b049e212ab7fe8967893c202efcb30fecfdb82fbJeff Sharkey                template.mRemovable, template.mEmulated, template.mMtpReserveSpace,
94b049e212ab7fe8967893c202efcb30fecfdb82fbJeff Sharkey                template.mAllowMassStorage, template.mMaxFileSize, owner);
95fbfe55512596fd00c1fb51caa851e17dae60fd43Mike Lockwood    }
96fbfe55512596fd00c1fb51caa851e17dae60fd43Mike Lockwood
972f6a3885533a52758c2cd4f81f6123a712be8ae6Mike Lockwood    /**
982f6a3885533a52758c2cd4f81f6123a712be8ae6Mike Lockwood     * Returns the mount path for the volume.
992f6a3885533a52758c2cd4f81f6123a712be8ae6Mike Lockwood     *
1002f6a3885533a52758c2cd4f81f6123a712be8ae6Mike Lockwood     * @return the mount path
1012f6a3885533a52758c2cd4f81f6123a712be8ae6Mike Lockwood     */
1022f6a3885533a52758c2cd4f81f6123a712be8ae6Mike Lockwood    public String getPath() {
103b049e212ab7fe8967893c202efcb30fecfdb82fbJeff Sharkey        return mPath.toString();
104b049e212ab7fe8967893c202efcb30fecfdb82fbJeff Sharkey    }
105b049e212ab7fe8967893c202efcb30fecfdb82fbJeff Sharkey
106b049e212ab7fe8967893c202efcb30fecfdb82fbJeff Sharkey    public File getPathFile() {
1072f6a3885533a52758c2cd4f81f6123a712be8ae6Mike Lockwood        return mPath;
1082f6a3885533a52758c2cd4f81f6123a712be8ae6Mike Lockwood    }
1092f6a3885533a52758c2cd4f81f6123a712be8ae6Mike Lockwood
1102f6a3885533a52758c2cd4f81f6123a712be8ae6Mike Lockwood    /**
1112f6a3885533a52758c2cd4f81f6123a712be8ae6Mike Lockwood     * Returns a user visible description of the volume.
1122f6a3885533a52758c2cd4f81f6123a712be8ae6Mike Lockwood     *
1132f6a3885533a52758c2cd4f81f6123a712be8ae6Mike Lockwood     * @return the volume description
1142f6a3885533a52758c2cd4f81f6123a712be8ae6Mike Lockwood     */
11513fe2a5330a5df662d7b1b136e7b08fe34c94a42Fabrice Di Meglio    public String getDescription(Context context) {
11613fe2a5330a5df662d7b1b136e7b08fe34c94a42Fabrice Di Meglio        return context.getResources().getString(mDescriptionId);
11713fe2a5330a5df662d7b1b136e7b08fe34c94a42Fabrice Di Meglio    }
11813fe2a5330a5df662d7b1b136e7b08fe34c94a42Fabrice Di Meglio
11913fe2a5330a5df662d7b1b136e7b08fe34c94a42Fabrice Di Meglio    public int getDescriptionId() {
12013fe2a5330a5df662d7b1b136e7b08fe34c94a42Fabrice Di Meglio        return mDescriptionId;
1212f6a3885533a52758c2cd4f81f6123a712be8ae6Mike Lockwood    }
1222f6a3885533a52758c2cd4f81f6123a712be8ae6Mike Lockwood
1239545dc020ea11649d70dcbe911a8e82a3254a4eaJeff Sharkey    public boolean isPrimary() {
1249545dc020ea11649d70dcbe911a8e82a3254a4eaJeff Sharkey        return mPrimary;
1259545dc020ea11649d70dcbe911a8e82a3254a4eaJeff Sharkey    }
1269545dc020ea11649d70dcbe911a8e82a3254a4eaJeff Sharkey
1272f6a3885533a52758c2cd4f81f6123a712be8ae6Mike Lockwood    /**
1282f6a3885533a52758c2cd4f81f6123a712be8ae6Mike Lockwood     * Returns true if the volume is removable.
1292f6a3885533a52758c2cd4f81f6123a712be8ae6Mike Lockwood     *
1302f6a3885533a52758c2cd4f81f6123a712be8ae6Mike Lockwood     * @return is removable
1312f6a3885533a52758c2cd4f81f6123a712be8ae6Mike Lockwood     */
1322f6a3885533a52758c2cd4f81f6123a712be8ae6Mike Lockwood    public boolean isRemovable() {
1332f6a3885533a52758c2cd4f81f6123a712be8ae6Mike Lockwood        return mRemovable;
1342f6a3885533a52758c2cd4f81f6123a712be8ae6Mike Lockwood    }
1352f6a3885533a52758c2cd4f81f6123a712be8ae6Mike Lockwood
1362f6a3885533a52758c2cd4f81f6123a712be8ae6Mike Lockwood    /**
1372f6a3885533a52758c2cd4f81f6123a712be8ae6Mike Lockwood     * Returns true if the volume is emulated.
1382f6a3885533a52758c2cd4f81f6123a712be8ae6Mike Lockwood     *
1392f6a3885533a52758c2cd4f81f6123a712be8ae6Mike Lockwood     * @return is removable
1402f6a3885533a52758c2cd4f81f6123a712be8ae6Mike Lockwood     */
1412f6a3885533a52758c2cd4f81f6123a712be8ae6Mike Lockwood    public boolean isEmulated() {
1422f6a3885533a52758c2cd4f81f6123a712be8ae6Mike Lockwood        return mEmulated;
1432f6a3885533a52758c2cd4f81f6123a712be8ae6Mike Lockwood    }
1442f6a3885533a52758c2cd4f81f6123a712be8ae6Mike Lockwood
1452f6a3885533a52758c2cd4f81f6123a712be8ae6Mike Lockwood    /**
146fbfe55512596fd00c1fb51caa851e17dae60fd43Mike Lockwood     * Returns the MTP storage ID for the volume.
147fbfe55512596fd00c1fb51caa851e17dae60fd43Mike Lockwood     * this is also used for the storage_id column in the media provider.
148fbfe55512596fd00c1fb51caa851e17dae60fd43Mike Lockwood     *
149fbfe55512596fd00c1fb51caa851e17dae60fd43Mike Lockwood     * @return MTP storage ID
150fbfe55512596fd00c1fb51caa851e17dae60fd43Mike Lockwood     */
151fbfe55512596fd00c1fb51caa851e17dae60fd43Mike Lockwood    public int getStorageId() {
152fbfe55512596fd00c1fb51caa851e17dae60fd43Mike Lockwood        return mStorageId;
153fbfe55512596fd00c1fb51caa851e17dae60fd43Mike Lockwood    }
154fbfe55512596fd00c1fb51caa851e17dae60fd43Mike Lockwood
155fbfe55512596fd00c1fb51caa851e17dae60fd43Mike Lockwood    /**
156fbfe55512596fd00c1fb51caa851e17dae60fd43Mike Lockwood     * Do not call this unless you are MountService
157fbfe55512596fd00c1fb51caa851e17dae60fd43Mike Lockwood     */
158fbfe55512596fd00c1fb51caa851e17dae60fd43Mike Lockwood    public void setStorageId(int index) {
159fbfe55512596fd00c1fb51caa851e17dae60fd43Mike Lockwood        // storage ID is 0x00010001 for primary storage,
160fbfe55512596fd00c1fb51caa851e17dae60fd43Mike Lockwood        // then 0x00020001, 0x00030001, etc. for secondary storages
161fbfe55512596fd00c1fb51caa851e17dae60fd43Mike Lockwood        mStorageId = ((index + 1) << 16) + 1;
162fbfe55512596fd00c1fb51caa851e17dae60fd43Mike Lockwood    }
163fbfe55512596fd00c1fb51caa851e17dae60fd43Mike Lockwood
164fbfe55512596fd00c1fb51caa851e17dae60fd43Mike Lockwood    /**
1652f6a3885533a52758c2cd4f81f6123a712be8ae6Mike Lockwood     * Number of megabytes of space to leave unallocated by MTP.
1662f6a3885533a52758c2cd4f81f6123a712be8ae6Mike Lockwood     * MTP will subtract this value from the free space it reports back
1672f6a3885533a52758c2cd4f81f6123a712be8ae6Mike Lockwood     * to the host via GetStorageInfo, and will not allow new files to
1682f6a3885533a52758c2cd4f81f6123a712be8ae6Mike Lockwood     * be added via MTP if there is less than this amount left free in the storage.
1692f6a3885533a52758c2cd4f81f6123a712be8ae6Mike Lockwood     * If MTP has dedicated storage this value should be zero, but if MTP is
1702f6a3885533a52758c2cd4f81f6123a712be8ae6Mike Lockwood     * sharing storage with the rest of the system, set this to a positive value
1712f6a3885533a52758c2cd4f81f6123a712be8ae6Mike Lockwood     * to ensure that MTP activity does not result in the storage being
1722f6a3885533a52758c2cd4f81f6123a712be8ae6Mike Lockwood     * too close to full.
1732f6a3885533a52758c2cd4f81f6123a712be8ae6Mike Lockwood     *
1742f6a3885533a52758c2cd4f81f6123a712be8ae6Mike Lockwood     * @return MTP reserve space
1752f6a3885533a52758c2cd4f81f6123a712be8ae6Mike Lockwood     */
1762f6a3885533a52758c2cd4f81f6123a712be8ae6Mike Lockwood    public int getMtpReserveSpace() {
1772f6a3885533a52758c2cd4f81f6123a712be8ae6Mike Lockwood        return mMtpReserveSpace;
1782f6a3885533a52758c2cd4f81f6123a712be8ae6Mike Lockwood    }
1792f6a3885533a52758c2cd4f81f6123a712be8ae6Mike Lockwood
1808e8b280bd19fa6cb69bb19e1d90cf03a47ba2d72Mike Lockwood    /**
1818e8b280bd19fa6cb69bb19e1d90cf03a47ba2d72Mike Lockwood     * Returns true if this volume can be shared via USB mass storage.
1828e8b280bd19fa6cb69bb19e1d90cf03a47ba2d72Mike Lockwood     *
1838e8b280bd19fa6cb69bb19e1d90cf03a47ba2d72Mike Lockwood     * @return whether mass storage is allowed
1848e8b280bd19fa6cb69bb19e1d90cf03a47ba2d72Mike Lockwood     */
1858e8b280bd19fa6cb69bb19e1d90cf03a47ba2d72Mike Lockwood    public boolean allowMassStorage() {
1868e8b280bd19fa6cb69bb19e1d90cf03a47ba2d72Mike Lockwood        return mAllowMassStorage;
1878e8b280bd19fa6cb69bb19e1d90cf03a47ba2d72Mike Lockwood    }
1888e8b280bd19fa6cb69bb19e1d90cf03a47ba2d72Mike Lockwood
1897a59dd2ce33b46cbc73eef964ddb4272ea1da8d1Mike Lockwood    /**
1907a59dd2ce33b46cbc73eef964ddb4272ea1da8d1Mike Lockwood     * Returns maximum file size for the volume, or zero if it is unbounded.
1917a59dd2ce33b46cbc73eef964ddb4272ea1da8d1Mike Lockwood     *
1927a59dd2ce33b46cbc73eef964ddb4272ea1da8d1Mike Lockwood     * @return maximum file size
1937a59dd2ce33b46cbc73eef964ddb4272ea1da8d1Mike Lockwood     */
1947a59dd2ce33b46cbc73eef964ddb4272ea1da8d1Mike Lockwood    public long getMaxFileSize() {
1957a59dd2ce33b46cbc73eef964ddb4272ea1da8d1Mike Lockwood        return mMaxFileSize;
1967a59dd2ce33b46cbc73eef964ddb4272ea1da8d1Mike Lockwood    }
1977a59dd2ce33b46cbc73eef964ddb4272ea1da8d1Mike Lockwood
198b049e212ab7fe8967893c202efcb30fecfdb82fbJeff Sharkey    public UserHandle getOwner() {
199b049e212ab7fe8967893c202efcb30fecfdb82fbJeff Sharkey        return mOwner;
200b049e212ab7fe8967893c202efcb30fecfdb82fbJeff Sharkey    }
201b049e212ab7fe8967893c202efcb30fecfdb82fbJeff Sharkey
2025aca2b8dc4f4ff2d466a64587d06666c7bbd9749Jeff Sharkey    public void setUuid(String uuid) {
2035aca2b8dc4f4ff2d466a64587d06666c7bbd9749Jeff Sharkey        mUuid = uuid;
2045aca2b8dc4f4ff2d466a64587d06666c7bbd9749Jeff Sharkey    }
2055aca2b8dc4f4ff2d466a64587d06666c7bbd9749Jeff Sharkey
2065aca2b8dc4f4ff2d466a64587d06666c7bbd9749Jeff Sharkey    public String getUuid() {
2075aca2b8dc4f4ff2d466a64587d06666c7bbd9749Jeff Sharkey        return mUuid;
2085aca2b8dc4f4ff2d466a64587d06666c7bbd9749Jeff Sharkey    }
2095aca2b8dc4f4ff2d466a64587d06666c7bbd9749Jeff Sharkey
2105aca2b8dc4f4ff2d466a64587d06666c7bbd9749Jeff Sharkey    /**
2115aca2b8dc4f4ff2d466a64587d06666c7bbd9749Jeff Sharkey     * Parse and return volume UUID as FAT volume ID, or return -1 if unable to
2125aca2b8dc4f4ff2d466a64587d06666c7bbd9749Jeff Sharkey     * parse or UUID is unknown.
2135aca2b8dc4f4ff2d466a64587d06666c7bbd9749Jeff Sharkey     */
2145aca2b8dc4f4ff2d466a64587d06666c7bbd9749Jeff Sharkey    public int getFatVolumeId() {
2155aca2b8dc4f4ff2d466a64587d06666c7bbd9749Jeff Sharkey        if (mUuid == null || mUuid.length() != 9) {
2165aca2b8dc4f4ff2d466a64587d06666c7bbd9749Jeff Sharkey            return -1;
2175aca2b8dc4f4ff2d466a64587d06666c7bbd9749Jeff Sharkey        }
2185aca2b8dc4f4ff2d466a64587d06666c7bbd9749Jeff Sharkey        try {
21917d5c1b18132e82abb1b828dcc39ca17cff35dd3Tom Marshall            return (int)Long.parseLong(mUuid.replace("-", ""), 16);
2205aca2b8dc4f4ff2d466a64587d06666c7bbd9749Jeff Sharkey        } catch (NumberFormatException e) {
2215aca2b8dc4f4ff2d466a64587d06666c7bbd9749Jeff Sharkey            return -1;
2225aca2b8dc4f4ff2d466a64587d06666c7bbd9749Jeff Sharkey        }
2235aca2b8dc4f4ff2d466a64587d06666c7bbd9749Jeff Sharkey    }
2245aca2b8dc4f4ff2d466a64587d06666c7bbd9749Jeff Sharkey
2255aca2b8dc4f4ff2d466a64587d06666c7bbd9749Jeff Sharkey    public void setUserLabel(String userLabel) {
2265aca2b8dc4f4ff2d466a64587d06666c7bbd9749Jeff Sharkey        mUserLabel = userLabel;
2275aca2b8dc4f4ff2d466a64587d06666c7bbd9749Jeff Sharkey    }
2285aca2b8dc4f4ff2d466a64587d06666c7bbd9749Jeff Sharkey
2295aca2b8dc4f4ff2d466a64587d06666c7bbd9749Jeff Sharkey    public String getUserLabel() {
2305aca2b8dc4f4ff2d466a64587d06666c7bbd9749Jeff Sharkey        return mUserLabel;
2315aca2b8dc4f4ff2d466a64587d06666c7bbd9749Jeff Sharkey    }
2325aca2b8dc4f4ff2d466a64587d06666c7bbd9749Jeff Sharkey
2331f706c6cd1cb841adadc2babc57a34e5728983ecJeff Sharkey    public void setState(String state) {
2341f706c6cd1cb841adadc2babc57a34e5728983ecJeff Sharkey        mState = state;
2351f706c6cd1cb841adadc2babc57a34e5728983ecJeff Sharkey    }
2361f706c6cd1cb841adadc2babc57a34e5728983ecJeff Sharkey
2371f706c6cd1cb841adadc2babc57a34e5728983ecJeff Sharkey    public String getState() {
2381f706c6cd1cb841adadc2babc57a34e5728983ecJeff Sharkey        return mState;
2391f706c6cd1cb841adadc2babc57a34e5728983ecJeff Sharkey    }
2401f706c6cd1cb841adadc2babc57a34e5728983ecJeff Sharkey
2412f6a3885533a52758c2cd4f81f6123a712be8ae6Mike Lockwood    @Override
2422f6a3885533a52758c2cd4f81f6123a712be8ae6Mike Lockwood    public boolean equals(Object obj) {
2432f6a3885533a52758c2cd4f81f6123a712be8ae6Mike Lockwood        if (obj instanceof StorageVolume && mPath != null) {
2442f6a3885533a52758c2cd4f81f6123a712be8ae6Mike Lockwood            StorageVolume volume = (StorageVolume)obj;
2452f6a3885533a52758c2cd4f81f6123a712be8ae6Mike Lockwood            return (mPath.equals(volume.mPath));
2462f6a3885533a52758c2cd4f81f6123a712be8ae6Mike Lockwood        }
2472f6a3885533a52758c2cd4f81f6123a712be8ae6Mike Lockwood        return false;
2482f6a3885533a52758c2cd4f81f6123a712be8ae6Mike Lockwood    }
2492f6a3885533a52758c2cd4f81f6123a712be8ae6Mike Lockwood
2502f6a3885533a52758c2cd4f81f6123a712be8ae6Mike Lockwood    @Override
2512f6a3885533a52758c2cd4f81f6123a712be8ae6Mike Lockwood    public int hashCode() {
2522f6a3885533a52758c2cd4f81f6123a712be8ae6Mike Lockwood        return mPath.hashCode();
2532f6a3885533a52758c2cd4f81f6123a712be8ae6Mike Lockwood    }
2542f6a3885533a52758c2cd4f81f6123a712be8ae6Mike Lockwood
2552f6a3885533a52758c2cd4f81f6123a712be8ae6Mike Lockwood    @Override
2562f6a3885533a52758c2cd4f81f6123a712be8ae6Mike Lockwood    public String toString() {
2575aca2b8dc4f4ff2d466a64587d06666c7bbd9749Jeff Sharkey        final CharArrayWriter writer = new CharArrayWriter();
2585aca2b8dc4f4ff2d466a64587d06666c7bbd9749Jeff Sharkey        dump(new IndentingPrintWriter(writer, "    ", 80));
2595aca2b8dc4f4ff2d466a64587d06666c7bbd9749Jeff Sharkey        return writer.toString();
2605aca2b8dc4f4ff2d466a64587d06666c7bbd9749Jeff Sharkey    }
2615aca2b8dc4f4ff2d466a64587d06666c7bbd9749Jeff Sharkey
2625aca2b8dc4f4ff2d466a64587d06666c7bbd9749Jeff Sharkey    public void dump(IndentingPrintWriter pw) {
2635aca2b8dc4f4ff2d466a64587d06666c7bbd9749Jeff Sharkey        pw.println("StorageVolume:");
2645aca2b8dc4f4ff2d466a64587d06666c7bbd9749Jeff Sharkey        pw.increaseIndent();
2655aca2b8dc4f4ff2d466a64587d06666c7bbd9749Jeff Sharkey        pw.printPair("mStorageId", mStorageId);
2665aca2b8dc4f4ff2d466a64587d06666c7bbd9749Jeff Sharkey        pw.printPair("mPath", mPath);
2675aca2b8dc4f4ff2d466a64587d06666c7bbd9749Jeff Sharkey        pw.printPair("mDescriptionId", mDescriptionId);
2685aca2b8dc4f4ff2d466a64587d06666c7bbd9749Jeff Sharkey        pw.printPair("mPrimary", mPrimary);
2695aca2b8dc4f4ff2d466a64587d06666c7bbd9749Jeff Sharkey        pw.printPair("mRemovable", mRemovable);
2705aca2b8dc4f4ff2d466a64587d06666c7bbd9749Jeff Sharkey        pw.printPair("mEmulated", mEmulated);
2715aca2b8dc4f4ff2d466a64587d06666c7bbd9749Jeff Sharkey        pw.printPair("mMtpReserveSpace", mMtpReserveSpace);
2725aca2b8dc4f4ff2d466a64587d06666c7bbd9749Jeff Sharkey        pw.printPair("mAllowMassStorage", mAllowMassStorage);
2735aca2b8dc4f4ff2d466a64587d06666c7bbd9749Jeff Sharkey        pw.printPair("mMaxFileSize", mMaxFileSize);
2745aca2b8dc4f4ff2d466a64587d06666c7bbd9749Jeff Sharkey        pw.printPair("mOwner", mOwner);
2755aca2b8dc4f4ff2d466a64587d06666c7bbd9749Jeff Sharkey        pw.printPair("mUuid", mUuid);
2765aca2b8dc4f4ff2d466a64587d06666c7bbd9749Jeff Sharkey        pw.printPair("mUserLabel", mUserLabel);
2771f706c6cd1cb841adadc2babc57a34e5728983ecJeff Sharkey        pw.printPair("mState", mState);
2785aca2b8dc4f4ff2d466a64587d06666c7bbd9749Jeff Sharkey        pw.decreaseIndent();
2792f6a3885533a52758c2cd4f81f6123a712be8ae6Mike Lockwood    }
2802f6a3885533a52758c2cd4f81f6123a712be8ae6Mike Lockwood
2819545dc020ea11649d70dcbe911a8e82a3254a4eaJeff Sharkey    public static final Creator<StorageVolume> CREATOR = new Creator<StorageVolume>() {
2829545dc020ea11649d70dcbe911a8e82a3254a4eaJeff Sharkey        @Override
2832f6a3885533a52758c2cd4f81f6123a712be8ae6Mike Lockwood        public StorageVolume createFromParcel(Parcel in) {
2849545dc020ea11649d70dcbe911a8e82a3254a4eaJeff Sharkey            return new StorageVolume(in);
2852f6a3885533a52758c2cd4f81f6123a712be8ae6Mike Lockwood        }
2862f6a3885533a52758c2cd4f81f6123a712be8ae6Mike Lockwood
2879545dc020ea11649d70dcbe911a8e82a3254a4eaJeff Sharkey        @Override
2882f6a3885533a52758c2cd4f81f6123a712be8ae6Mike Lockwood        public StorageVolume[] newArray(int size) {
2892f6a3885533a52758c2cd4f81f6123a712be8ae6Mike Lockwood            return new StorageVolume[size];
2902f6a3885533a52758c2cd4f81f6123a712be8ae6Mike Lockwood        }
2912f6a3885533a52758c2cd4f81f6123a712be8ae6Mike Lockwood    };
2922f6a3885533a52758c2cd4f81f6123a712be8ae6Mike Lockwood
2939545dc020ea11649d70dcbe911a8e82a3254a4eaJeff Sharkey    @Override
2942f6a3885533a52758c2cd4f81f6123a712be8ae6Mike Lockwood    public int describeContents() {
2952f6a3885533a52758c2cd4f81f6123a712be8ae6Mike Lockwood        return 0;
2962f6a3885533a52758c2cd4f81f6123a712be8ae6Mike Lockwood    }
2972f6a3885533a52758c2cd4f81f6123a712be8ae6Mike Lockwood
2989545dc020ea11649d70dcbe911a8e82a3254a4eaJeff Sharkey    @Override
2992f6a3885533a52758c2cd4f81f6123a712be8ae6Mike Lockwood    public void writeToParcel(Parcel parcel, int flags) {
3009545dc020ea11649d70dcbe911a8e82a3254a4eaJeff Sharkey        parcel.writeInt(mStorageId);
301b049e212ab7fe8967893c202efcb30fecfdb82fbJeff Sharkey        parcel.writeString(mPath.toString());
30213fe2a5330a5df662d7b1b136e7b08fe34c94a42Fabrice Di Meglio        parcel.writeInt(mDescriptionId);
3039545dc020ea11649d70dcbe911a8e82a3254a4eaJeff Sharkey        parcel.writeInt(mPrimary ? 1 : 0);
3042f6a3885533a52758c2cd4f81f6123a712be8ae6Mike Lockwood        parcel.writeInt(mRemovable ? 1 : 0);
3052f6a3885533a52758c2cd4f81f6123a712be8ae6Mike Lockwood        parcel.writeInt(mEmulated ? 1 : 0);
3062f6a3885533a52758c2cd4f81f6123a712be8ae6Mike Lockwood        parcel.writeInt(mMtpReserveSpace);
3078e8b280bd19fa6cb69bb19e1d90cf03a47ba2d72Mike Lockwood        parcel.writeInt(mAllowMassStorage ? 1 : 0);
3087a59dd2ce33b46cbc73eef964ddb4272ea1da8d1Mike Lockwood        parcel.writeLong(mMaxFileSize);
309b049e212ab7fe8967893c202efcb30fecfdb82fbJeff Sharkey        parcel.writeParcelable(mOwner, flags);
3105aca2b8dc4f4ff2d466a64587d06666c7bbd9749Jeff Sharkey        parcel.writeString(mUuid);
3115aca2b8dc4f4ff2d466a64587d06666c7bbd9749Jeff Sharkey        parcel.writeString(mUserLabel);
3121f706c6cd1cb841adadc2babc57a34e5728983ecJeff Sharkey        parcel.writeString(mState);
3132f6a3885533a52758c2cd4f81f6123a712be8ae6Mike Lockwood    }
3142f6a3885533a52758c2cd4f81f6123a712be8ae6Mike Lockwood}
315