Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 8b046617 authored by Marco Nelissen's avatar Marco Nelissen
Browse files

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.
parent 04e1faf0
Loading
Loading
Loading
Loading
+11 −10
Original line number Diff line number Diff line
@@ -69,6 +69,7 @@ public:
    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);
+16 −0
Original line number Diff line number Diff line
@@ -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 {
+3 −1
Original line number Diff line number Diff line
@@ -25,6 +25,8 @@ 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.
     */
+16 −0
Original line number Diff line number Diff line
@@ -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;
};