Merge change 23835 into eclair

* changes:
  When encountering a .nomedia file, notify the MediaScannerClient, so that it can erase the data column for entries that are in the folder containing the .nomedia file. This prevents us from deleting (via a delete trigger) files when somebody adds a .nomedia file after the fact.
This commit is contained in:
Android (Google) Code Review
2009-09-03 12:27:26 -07:00
4 changed files with 46 additions and 11 deletions

View File

@@ -59,16 +59,17 @@ private:
class MediaScannerClient class MediaScannerClient
{ {
public: public:
MediaScannerClient(); MediaScannerClient();
virtual ~MediaScannerClient(); virtual ~MediaScannerClient();
void setLocale(const char* locale); void setLocale(const char* locale);
void beginFile(); void beginFile();
bool addStringTag(const char* name, const char* value); bool addStringTag(const char* name, const char* value);
void endFile(); void endFile();
virtual bool scanFile(const char* path, long long lastModified, long long fileSize) = 0; virtual bool scanFile(const char* path, long long lastModified, long long fileSize) = 0;
virtual bool handleStringTag(const char* name, const char* value) = 0; virtual bool handleStringTag(const char* name, const char* value) = 0;
virtual bool setMimeType(const char* mimeType) = 0; virtual bool setMimeType(const char* mimeType) = 0;
virtual bool addNoMediaFolder(const char* path) = 0;
protected: protected:
void convertValues(uint32_t encoding); void convertValues(uint32_t encoding);

View File

@@ -825,6 +825,22 @@ public class MediaScanner
} }
} }
public void addNoMediaFolder(String path) {
ContentValues values = new ContentValues();
values.put(MediaStore.Images.ImageColumns.DATA, "");
String [] pathSpec = new String[] {path + '%'};
try {
mMediaProvider.update(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, values,
MediaStore.Images.ImageColumns.DATA + " LIKE ?", pathSpec);
mMediaProvider.update(MediaStore.Video.Media.EXTERNAL_CONTENT_URI, values,
MediaStore.Images.ImageColumns.DATA + " LIKE ?", pathSpec);
mMediaProvider.update(MediaStore.Audio.Media.EXTERNAL_CONTENT_URI, values,
MediaStore.Images.ImageColumns.DATA + " LIKE ?", pathSpec);
} catch (RemoteException e) {
throw new RuntimeException();
}
}
}; // end of anonymous MediaScannerClient instance }; // end of anonymous MediaScannerClient instance
private void prescan(String filePath) throws RemoteException { private void prescan(String filePath) throws RemoteException {

View File

@@ -25,11 +25,13 @@ public interface MediaScannerClient
public void scanFile(String path, String mimeType, long lastModified, long fileSize); public void scanFile(String path, String mimeType, long lastModified, long fileSize);
public void addNoMediaFolder(String path);
/** /**
* Called by native code to return metadata extracted from media files. * Called by native code to return metadata extracted from media files.
*/ */
public void handleStringTag(String name, String value); public void handleStringTag(String name, String value);
/** /**
* Called by native code to return mime type extracted from DRM content. * Called by native code to return mime type extracted from DRM content.
*/ */

View File

@@ -65,6 +65,8 @@ public:
"(Ljava/lang/String;Ljava/lang/String;)V"); "(Ljava/lang/String;Ljava/lang/String;)V");
mSetMimeTypeMethodID = env->GetMethodID(mediaScannerClientInterface, "setMimeType", mSetMimeTypeMethodID = env->GetMethodID(mediaScannerClientInterface, "setMimeType",
"(Ljava/lang/String;)V"); "(Ljava/lang/String;)V");
mAddNoMediaFolderMethodID = env->GetMethodID(mediaScannerClientInterface, "addNoMediaFolder",
"(Ljava/lang/String;)V");
} }
} }
@@ -111,12 +113,26 @@ public:
return (!mEnv->ExceptionCheck()); return (!mEnv->ExceptionCheck());
} }
// returns true if it succeeded, false if an exception occured in the Java code
virtual bool addNoMediaFolder(const char* path)
{
jstring pathStr;
if ((pathStr = mEnv->NewStringUTF(path)) == NULL) return false;
mEnv->CallVoidMethod(mClient, mAddNoMediaFolderMethodID, pathStr);
mEnv->DeleteLocalRef(pathStr);
return (!mEnv->ExceptionCheck());
}
private: private:
JNIEnv *mEnv; JNIEnv *mEnv;
jobject mClient; jobject mClient;
jmethodID mScanFileMethodID; jmethodID mScanFileMethodID;
jmethodID mHandleStringTagMethodID; jmethodID mHandleStringTagMethodID;
jmethodID mSetMimeTypeMethodID; jmethodID mSetMimeTypeMethodID;
jmethodID mAddNoMediaFolderMethodID;
}; };