MTP: Have GetStorageInfo command return correct storage type for removable storage

Change-Id: I09b548483c12080e7d77970babcae2eef379f2f4
Signed-off-by: Mike Lockwood <lockwood@android.com>
diff --git a/media/java/android/mtp/MtpStorage.java b/media/java/android/mtp/MtpStorage.java
index 33146e7..21a18ca 100644
--- a/media/java/android/mtp/MtpStorage.java
+++ b/media/java/android/mtp/MtpStorage.java
@@ -29,12 +29,15 @@
     private final String mPath;
     private final String mDescription;
     private final long mReserveSpace;
+    private final boolean mRemovable;
 
-    public MtpStorage(int id, String path, String description, long reserveSpace) {
+    public MtpStorage(int id, String path, String description,
+            long reserveSpace, boolean removable) {
         mStorageId = id;
         mPath = path;
         mDescription = description;
         mReserveSpace = reserveSpace;
+        mRemovable = removable;
     }
 
     /**
@@ -86,4 +89,12 @@
         return mReserveSpace;
     }
 
+   /**
+     * Returns true if the storage is removable.
+     *
+     * @return is removable
+     */
+    public final boolean isRemovable() {
+        return mRemovable;
+    }
 }
diff --git a/media/jni/android_mtp_MtpServer.cpp b/media/jni/android_mtp_MtpServer.cpp
index c55189f..4f6bb15 100644
--- a/media/jni/android_mtp_MtpServer.cpp
+++ b/media/jni/android_mtp_MtpServer.cpp
@@ -47,6 +47,7 @@
 static jfieldID field_MtpStorage_path;
 static jfieldID field_MtpStorage_description;
 static jfieldID field_MtpStorage_reserveSpace;
+static jfieldID field_MtpStorage_removable;
 
 static Mutex sMutex;
 
@@ -245,11 +246,13 @@
         jstring path = (jstring)env->GetObjectField(jstorage, field_MtpStorage_path);
         jstring description = (jstring)env->GetObjectField(jstorage, field_MtpStorage_description);
         jlong reserveSpace = env->GetLongField(jstorage, field_MtpStorage_reserveSpace);
+        jboolean removable = env->GetBooleanField(jstorage, field_MtpStorage_removable);
 
         const char *pathStr = env->GetStringUTFChars(path, NULL);
         const char *descriptionStr = env->GetStringUTFChars(description, NULL);
 
-        MtpStorage* storage = new MtpStorage(storageID, pathStr, descriptionStr, reserveSpace);
+        MtpStorage* storage = new MtpStorage(storageID, pathStr, descriptionStr,
+                reserveSpace, removable);
         thread->addStorage(storage);
 
         env->ReleaseStringUTFChars(path, pathStr);
@@ -318,7 +321,12 @@
     }
     field_MtpStorage_reserveSpace = env->GetFieldID(clazz, "mReserveSpace", "J");
     if (field_MtpStorage_reserveSpace == NULL) {
-        LOGE("Can't find MtpStorage.mStorageId");
+        LOGE("Can't find MtpStorage.mReserveSpace");
+        return -1;
+    }
+    field_MtpStorage_removable = env->GetFieldID(clazz, "mRemovable", "Z");
+    if (field_MtpStorage_removable == NULL) {
+        LOGE("Can't find MtpStorage.mRemovable");
         return -1;
     }
     clazz_MtpStorage = (jclass)env->NewGlobalRef(clazz);
diff --git a/media/mtp/MtpStorage.cpp b/media/mtp/MtpStorage.cpp
index fff0b5f..fef8066 100644
--- a/media/mtp/MtpStorage.cpp
+++ b/media/mtp/MtpStorage.cpp
@@ -33,12 +33,13 @@
 namespace android {
 
 MtpStorage::MtpStorage(MtpStorageID id, const char* filePath,
-        const char* description, uint64_t reserveSpace)
+        const char* description, uint64_t reserveSpace, bool removable)
     :   mStorageID(id),
         mFilePath(filePath),
         mDescription(description),
         mMaxCapacity(0),
-        mReserveSpace(reserveSpace)
+        mReserveSpace(reserveSpace),
+        mRemovable(removable)
 {
     LOGV("MtpStorage id: %d path: %s\n", id, filePath);
 }
@@ -47,7 +48,7 @@
 }
 
 int MtpStorage::getType() const {
-    return MTP_STORAGE_FIXED_RAM;
+    return (mRemovable ? MTP_STORAGE_REMOVABLE_RAM :  MTP_STORAGE_FIXED_RAM);
 }
 
 int MtpStorage::getFileSystemType() const {
diff --git a/media/mtp/MtpStorage.h b/media/mtp/MtpStorage.h
index d6ad25f..3e4f40d 100644
--- a/media/mtp/MtpStorage.h
+++ b/media/mtp/MtpStorage.h
@@ -33,10 +33,12 @@
     uint64_t                mMaxCapacity;
     // amount of free space to leave unallocated
     uint64_t                mReserveSpace;
+    bool                    mRemovable;
 
 public:
                             MtpStorage(MtpStorageID id, const char* filePath,
-                                    const char* description, uint64_t reserveSpace);
+                                    const char* description, uint64_t reserveSpace,
+                                    bool removable);
     virtual                 ~MtpStorage();
 
     inline MtpStorageID     getStorageID() const { return mStorageID; }
@@ -47,6 +49,7 @@
     uint64_t                getFreeSpace();
     const char*             getDescription() const;
     inline const char*      getPath() const { return (const char *)mFilePath; }
+    inline bool             isRemovable() const { return mRemovable; }
 };
 
 }; // namespace android