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
{
public:
MediaScannerClient();
virtual ~MediaScannerClient();
void setLocale(const char* locale);
void beginFile();
bool addStringTag(const char* name, const char* value);
void endFile();
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 setMimeType(const char* mimeType) = 0;
MediaScannerClient();
virtual ~MediaScannerClient();
void setLocale(const char* locale);
void beginFile();
bool addStringTag(const char* name, const char* value);
void endFile();
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 setMimeType(const char* mimeType) = 0;
virtual bool addNoMediaFolder(const char* path) = 0;
protected:
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
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 addNoMediaFolder(String path);
/**
* Called by native code to return metadata extracted from media files.
*/
public void handleStringTag(String name, String value);
/**
* 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");
mSetMimeTypeMethodID = env->GetMethodID(mediaScannerClientInterface, "setMimeType",
"(Ljava/lang/String;)V");
mAddNoMediaFolderMethodID = env->GetMethodID(mediaScannerClientInterface, "addNoMediaFolder",
"(Ljava/lang/String;)V");
}
}
@@ -111,12 +113,26 @@ public:
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:
JNIEnv *mEnv;
jobject mClient;
jmethodID mScanFileMethodID;
jmethodID mHandleStringTagMethodID;
jmethodID mSetMimeTypeMethodID;
jmethodID mAddNoMediaFolderMethodID;
};