From b4aa69fd116d5486f224914350a57b4befddfe26 Mon Sep 17 00:00:00 2001 From: kyle_tso Date: Wed, 22 Nov 2017 20:11:27 +0800 Subject: Support scanDirectories with JNI callback function MtpServer needs this function to update the database for directory copy operation. Test: Call this function from MtpServer and database is updated in directory copy scenario. Change-Id: I9b316f4dbf7f35922292c33ab02f9efebc867aa8 Signed-off-by: kyle_tso --- media/java/android/mtp/MtpDatabase.java | 6 ++++++ media/jni/android_mtp_MtpDatabase.cpp | 18 ++++++++++++++++++ 2 files changed, 24 insertions(+) diff --git a/media/java/android/mtp/MtpDatabase.java b/media/java/android/mtp/MtpDatabase.java index adcd79bc8bcf..09a04bc1a508 100755 --- a/media/java/android/mtp/MtpDatabase.java +++ b/media/java/android/mtp/MtpDatabase.java @@ -421,6 +421,12 @@ public class MtpDatabase implements AutoCloseable { } } + private void doScanDirectory(String path) { + String[] scanPath; + scanPath = new String[] { path }; + mMediaScanner.scanDirectories(scanPath); + } + private Cursor createObjectQuery(int storageID, int format, int parent) throws RemoteException { String where; String[] whereArgs; diff --git a/media/jni/android_mtp_MtpDatabase.cpp b/media/jni/android_mtp_MtpDatabase.cpp index 0c946ba6afa1..08bf4e144b2f 100644 --- a/media/jni/android_mtp_MtpDatabase.cpp +++ b/media/jni/android_mtp_MtpDatabase.cpp @@ -55,6 +55,7 @@ using namespace android; static jmethodID method_beginSendObject; static jmethodID method_endSendObject; +static jmethodID method_doScanDirectory; static jmethodID method_getObjectList; static jmethodID method_getNumObjects; static jmethodID method_getSupportedPlaybackFormats; @@ -119,6 +120,8 @@ public: MtpObjectFormat format, bool succeeded); + virtual void doScanDirectory(const char* path); + virtual MtpObjectHandleList* getObjectList(MtpStorageID storageID, MtpObjectFormat format, MtpObjectHandle parent); @@ -265,6 +268,16 @@ void MyMtpDatabase::endSendObject(const char* path, MtpObjectHandle handle, checkAndClearExceptionFromCallback(env, __FUNCTION__); } +void MyMtpDatabase::doScanDirectory(const char* path) { + JNIEnv* env = AndroidRuntime::getJNIEnv(); + jstring pathStr = env->NewStringUTF(path); + env->CallVoidMethod(mDatabase, method_doScanDirectory, pathStr); + + if (pathStr) + env->DeleteLocalRef(pathStr); + checkAndClearExceptionFromCallback(env, __FUNCTION__); +} + MtpObjectHandleList* MyMtpDatabase::getObjectList(MtpStorageID storageID, MtpObjectFormat format, MtpObjectHandle parent) { @@ -1308,6 +1321,11 @@ int register_android_mtp_MtpDatabase(JNIEnv *env) ALOGE("Can't find endSendObject"); return -1; } + method_doScanDirectory = env->GetMethodID(clazz, "doScanDirectory", "(Ljava/lang/String;)V"); + if (method_doScanDirectory == NULL) { + ALOGE("Can't find doScanDirectory"); + return -1; + } method_getObjectList = env->GetMethodID(clazz, "getObjectList", "(III)[I"); if (method_getObjectList == NULL) { ALOGE("Can't find getObjectList"); -- cgit v1.2.3-59-g8ed1b