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.
diff --git a/include/media/mediascanner.h b/include/media/mediascanner.h
index 7749566..cd0b86e 100644
--- a/include/media/mediascanner.h
+++ b/include/media/mediascanner.h
@@ -59,16 +59,17 @@
 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);
diff --git a/media/java/android/media/MediaScanner.java b/media/java/android/media/MediaScanner.java
index 3d5aae3..fcc76ca5 100644
--- a/media/java/android/media/MediaScanner.java
+++ b/media/java/android/media/MediaScanner.java
@@ -825,6 +825,22 @@
             }
         }
 
+        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 {
diff --git a/media/java/android/media/MediaScannerClient.java b/media/java/android/media/MediaScannerClient.java
index cf1a8da..258c3b4 100644
--- a/media/java/android/media/MediaScannerClient.java
+++ b/media/java/android/media/MediaScannerClient.java
@@ -25,11 +25,13 @@
     
     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.
      */
diff --git a/media/jni/android_media_MediaScanner.cpp b/media/jni/android_media_MediaScanner.cpp
index 97de486..6a5404e3 100644
--- a/media/jni/android_media_MediaScanner.cpp
+++ b/media/jni/android_media_MediaScanner.cpp
@@ -65,6 +65,8 @@
                                                      "(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 @@
         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;
 };