From: Jerry Zhang Date: Tue, 17 Oct 2017 20:47:51 +0000 (-0700) Subject: Add storageId to moveObjects X-Git-Tag: android-x86-9.0-r1~348^2~1^2~3^2~6^2~9^2 X-Git-Url: http://git.osdn.net/view?a=commitdiff_plain;h=def7b1930013e31e85bed904ff38cc3af71e75b2;p=android-x86%2Fframeworks-base.git Add storageId to moveObjects When moving between different storages, the storageId must be changed as well. Bug: 67028892 Test: Move between storages with virtual sdcard. Change-Id: Ie82aa8d53686bfffb7c26b46a49524a00f2f0214 --- diff --git a/media/java/android/mtp/MtpDatabase.java b/media/java/android/mtp/MtpDatabase.java index 8437d03f215d..dd99a1594f5f 100755 --- a/media/java/android/mtp/MtpDatabase.java +++ b/media/java/android/mtp/MtpDatabase.java @@ -466,10 +466,14 @@ public class MtpDatabase implements AutoCloseable { if (parent == 0xFFFFFFFF) { // all objects in root of store parent = 0; + where = STORAGE_PARENT_WHERE; + whereArgs = new String[]{Integer.toString(storageID), + Integer.toString(parent)}; + } else { + // If a parent is specified, the storage is redundant + where = PARENT_WHERE; + whereArgs = new String[]{Integer.toString(parent)}; } - where = STORAGE_PARENT_WHERE; - whereArgs = new String[] { Integer.toString(storageID), - Integer.toString(parent) }; } } else { // query specific format @@ -482,11 +486,16 @@ public class MtpDatabase implements AutoCloseable { if (parent == 0xFFFFFFFF) { // all objects in root of store parent = 0; + where = STORAGE_FORMAT_PARENT_WHERE; + whereArgs = new String[]{Integer.toString(storageID), + Integer.toString(format), + Integer.toString(parent)}; + } else { + // If a parent is specified, the storage is redundant + where = FORMAT_PARENT_WHERE; + whereArgs = new String[]{Integer.toString(format), + Integer.toString(parent)}; } - where = STORAGE_FORMAT_PARENT_WHERE; - whereArgs = new String[] { Integer.toString(storageID), - Integer.toString(format), - Integer.toString(parent) }; } } } @@ -838,7 +847,7 @@ public class MtpDatabase implements AutoCloseable { return MtpConstants.RESPONSE_OK; } - private int moveObject(int handle, int newParent, String newPath) { + private int moveObject(int handle, int newParent, int newStorage, String newPath) { String[] whereArgs = new String[] { Integer.toString(handle) }; // do not allow renaming any of the special subdirectories @@ -850,6 +859,7 @@ public class MtpDatabase implements AutoCloseable { ContentValues values = new ContentValues(); values.put(Files.FileColumns.DATA, newPath); values.put(Files.FileColumns.PARENT, newParent); + values.put(Files.FileColumns.STORAGE_ID, newStorage); int updated = 0; try { // note - we are relying on a special case in MediaProvider.update() to update diff --git a/media/jni/android_mtp_MtpDatabase.cpp b/media/jni/android_mtp_MtpDatabase.cpp index b9d3d8ffd398..0c946ba6afa1 100644 --- a/media/jni/android_mtp_MtpDatabase.cpp +++ b/media/jni/android_mtp_MtpDatabase.cpp @@ -180,7 +180,7 @@ public: virtual MtpProperty* getDevicePropertyDesc(MtpDeviceProperty property); virtual MtpResponseCode moveObject(MtpObjectHandle handle, MtpObjectHandle newParent, - MtpString& newPath); + MtpStorageID newStorage, MtpString& newPath); virtual void sessionStarted(); @@ -998,11 +998,11 @@ MtpResponseCode MyMtpDatabase::deleteFile(MtpObjectHandle handle) { } MtpResponseCode MyMtpDatabase::moveObject(MtpObjectHandle handle, MtpObjectHandle newParent, - MtpString &newPath) { + MtpStorageID newStorage, MtpString &newPath) { JNIEnv* env = AndroidRuntime::getJNIEnv(); jstring stringValue = env->NewStringUTF((const char *) newPath); MtpResponseCode result = env->CallIntMethod(mDatabase, method_moveObject, - (jint)handle, (jint)newParent, stringValue); + (jint)handle, (jint)newParent, (jint) newStorage, stringValue); checkAndClearExceptionFromCallback(env, __FUNCTION__); env->DeleteLocalRef(stringValue); @@ -1374,7 +1374,7 @@ int register_android_mtp_MtpDatabase(JNIEnv *env) ALOGE("Can't find deleteFile"); return -1; } - method_moveObject = env->GetMethodID(clazz, "moveObject", "(IILjava/lang/String;)I"); + method_moveObject = env->GetMethodID(clazz, "moveObject", "(IIILjava/lang/String;)I"); if (method_moveObject == NULL) { ALOGE("Can't find moveObject"); return -1; diff --git a/media/jni/android_mtp_MtpServer.cpp b/media/jni/android_mtp_MtpServer.cpp index e9e93099c1e2..6ce104d01a9e 100644 --- a/media/jni/android_mtp_MtpServer.cpp +++ b/media/jni/android_mtp_MtpServer.cpp @@ -72,7 +72,7 @@ android_mtp_MtpServer_setup(JNIEnv *env, jobject thiz, jobject javaDatabase, jbo const char *deviceInfoDeviceVersionStr = env->GetStringUTFChars(deviceInfoDeviceVersion, NULL); const char *deviceInfoSerialNumberStr = env->GetStringUTFChars(deviceInfoSerialNumber, NULL); MtpServer* server = new MtpServer(getMtpDatabase(env, javaDatabase), - usePtp, AID_MEDIA_RW, 0664, 0775, + usePtp, MtpString((deviceInfoManufacturerStr != NULL) ? deviceInfoManufacturerStr : ""), MtpString((deviceInfoModelStr != NULL) ? deviceInfoModelStr : ""), MtpString((deviceInfoDeviceVersionStr != NULL) ? deviceInfoDeviceVersionStr : ""),