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

Commit 81d74743 authored by Tomasz Mikolajewski's avatar Tomasz Mikolajewski
Browse files

Refresh directory changes on Mtp when a child is deleted or created.

Change-Id: I0325c60ac142368c2e61fcf9efa751f678f3f3a3
parent 67a9544e
Loading
Loading
Loading
Loading
+17 −2
Original line number Diff line number Diff line
@@ -91,14 +91,18 @@ class DocumentLoader {
        return task.createCursor(mResolver, columnNames);
    }

    synchronized void clearCache(int deviceId) {
    synchronized void clearTasks(int deviceId) {
        mTaskList.clearTaskForDevice(deviceId);
    }

    synchronized void clearCache() {
    synchronized void clearCompletedTasks() {
        mTaskList.clearCompletedTask();
    }

    synchronized void clearTask(Identifier parentIdentifier) {
        mTaskList.clearTask(parentIdentifier);
    }

    private class BackgroundLoaderThread extends Thread {
        @Override
        public void run() {
@@ -179,6 +183,17 @@ class DocumentLoader {
                }
            }
        }

        void clearTask(Identifier parentIdentifier) {
            for (int i = 0; i < size(); i++) {
                final LoaderTask task = get(i);
                if (task.mIdentifier.mDeviceId == parentIdentifier.mDeviceId &&
                        task.mIdentifier.mObjectHandle == parentIdentifier.mObjectHandle) {
                    remove(i);
                    return;
                }
            }
        }
    }

    private static class LoaderTask {
+11 −6
Original line number Diff line number Diff line
@@ -174,6 +174,8 @@ public class MtpDocumentsProvider extends DocumentsProvider {
                case "r":
                    return mPipeManager.readDocument(mMtpManager, identifier);
                case "w":
                    // TODO: Clear the parent document loader task (if exists) and call notify
                    // when writing is completed.
                    return mPipeManager.writeDocument(getContext(), mMtpManager, identifier);
                default:
                    // TODO: Add support for seekable files.
@@ -208,8 +210,10 @@ public class MtpDocumentsProvider extends DocumentsProvider {
            final int parentHandle =
                    mMtpManager.getParent(identifier.mDeviceId, identifier.mObjectHandle);
            mMtpManager.deleteDocument(identifier.mDeviceId, identifier.mObjectHandle);
            notifyChildDocumentsChange(new Identifier(
                    identifier.mDeviceId, identifier.mStorageId, parentHandle).toDocumentId());
            final Identifier parentIdentifier = new Identifier(
                    identifier.mDeviceId, identifier.mStorageId, parentHandle);
            mDocumentLoader.clearTask(parentIdentifier);
            notifyChildDocumentsChange(parentIdentifier.toDocumentId());
        } catch (IOException error) {
            throw new FileNotFoundException(error.getMessage());
        }
@@ -217,7 +221,7 @@ public class MtpDocumentsProvider extends DocumentsProvider {

    @Override
    public void onTrimMemory(int level) {
        mDocumentLoader.clearCache();
        mDocumentLoader.clearCompletedTasks();
    }

    @Override
@@ -237,6 +241,7 @@ public class MtpDocumentsProvider extends DocumentsProvider {
                            .build(), pipe[1]);
            final String documentId = new Identifier(parentId.mDeviceId, parentId.mStorageId,
                   objectHandle).toDocumentId();
            mDocumentLoader.clearTask(parentId);
            notifyChildDocumentsChange(parentDocumentId);
            return documentId;
        } catch (IOException error) {
@@ -252,7 +257,7 @@ public class MtpDocumentsProvider extends DocumentsProvider {

    void closeDevice(int deviceId) throws IOException {
        mMtpManager.closeDevice(deviceId);
        mDocumentLoader.clearCache(deviceId);
        mDocumentLoader.clearTasks(deviceId);
        mRootScanner.scanNow();
    }

@@ -261,7 +266,7 @@ public class MtpDocumentsProvider extends DocumentsProvider {
        for (int deviceId : mMtpManager.getOpenedDeviceIds()) {
            try {
                mMtpManager.closeDevice(deviceId);
                mDocumentLoader.clearCache(deviceId);
                mDocumentLoader.clearTasks(deviceId);
                closed = true;
            } catch (IOException d) {
                Log.d(TAG, "Failed to close the MTP device: " + deviceId);