Refresh directory changes on Mtp when a child is deleted or created.
Change-Id: I0325c60ac142368c2e61fcf9efa751f678f3f3a3
diff --git a/packages/MtpDocumentsProvider/src/com/android/mtp/DocumentLoader.java b/packages/MtpDocumentsProvider/src/com/android/mtp/DocumentLoader.java
index eef173c..d4c4331 100644
--- a/packages/MtpDocumentsProvider/src/com/android/mtp/DocumentLoader.java
+++ b/packages/MtpDocumentsProvider/src/com/android/mtp/DocumentLoader.java
@@ -91,14 +91,18 @@
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 @@
}
}
}
+
+ 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 {
diff --git a/packages/MtpDocumentsProvider/src/com/android/mtp/MtpDocumentsProvider.java b/packages/MtpDocumentsProvider/src/com/android/mtp/MtpDocumentsProvider.java
index 028c18d..78ed161 100644
--- a/packages/MtpDocumentsProvider/src/com/android/mtp/MtpDocumentsProvider.java
+++ b/packages/MtpDocumentsProvider/src/com/android/mtp/MtpDocumentsProvider.java
@@ -174,6 +174,8 @@
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 @@
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 @@
@Override
public void onTrimMemory(int level) {
- mDocumentLoader.clearCache();
+ mDocumentLoader.clearCompletedTasks();
}
@Override
@@ -235,8 +239,9 @@
.setFormat(CursorHelper.mimeTypeToFormatType(mimeType))
.setName(displayName)
.build(), pipe[1]);
- final String documentId = new Identifier(parentId.mDeviceId, parentId.mStorageId,
+ 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 @@
void closeDevice(int deviceId) throws IOException {
mMtpManager.closeDevice(deviceId);
- mDocumentLoader.clearCache(deviceId);
+ mDocumentLoader.clearTasks(deviceId);
mRootScanner.scanNow();
}
@@ -261,7 +266,7 @@
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);