MTP: Add support of ObjectInfoChanged Event
Under MTP mode, new file created at device side shown size zero at PC side
due to file information is not updated to PC in time with ObjectAdded event
Bug: 77883345
Test: 1. Take screenshot of device under MTP mode with Win10 / Linux
2. file copy, delete, rename between PC and device
3. file copy, delete, rename on device with adb shell command
Test: adb shell am instrument -w android.mtp/
android.support.test.runner.AndroidJUnitRunner
Change-Id: If428064fb0104b53b8afd5b050a4fab4a09312f0
diff --git a/media/java/android/mtp/MtpDatabase.java b/media/java/android/mtp/MtpDatabase.java
index 9c58135..e67b100 100755
--- a/media/java/android/mtp/MtpDatabase.java
+++ b/media/java/android/mtp/MtpDatabase.java
@@ -266,6 +266,12 @@
if (MtpDatabase.this.mServer != null)
MtpDatabase.this.mServer.sendObjectRemoved(id);
}
+
+ @Override
+ public void sendObjectInfoChanged(int id) {
+ if (MtpDatabase.this.mServer != null)
+ MtpDatabase.this.mServer.sendObjectInfoChanged(id);
+ }
}, subDirectories == null ? null : Sets.newHashSet(subDirectories));
initDeviceProperties(context);
diff --git a/media/java/android/mtp/MtpServer.java b/media/java/android/mtp/MtpServer.java
index 8af5ff7..a555d37 100644
--- a/media/java/android/mtp/MtpServer.java
+++ b/media/java/android/mtp/MtpServer.java
@@ -77,6 +77,10 @@
native_send_object_removed(handle);
}
+ public void sendObjectInfoChanged(int handle) {
+ native_send_object_info_changed(handle);
+ }
+
public void sendDevicePropertyChanged(int property) {
native_send_device_property_changed(property);
}
@@ -106,6 +110,7 @@
private native final void native_cleanup();
private native final void native_send_object_added(int handle);
private native final void native_send_object_removed(int handle);
+ private native final void native_send_object_info_changed(int handle);
private native final void native_send_device_property_changed(int property);
private native final void native_add_storage(MtpStorage storage);
private native final void native_remove_storage(int storageId);
diff --git a/media/java/android/mtp/MtpStorageManager.java b/media/java/android/mtp/MtpStorageManager.java
index 756e942..f14e7d7 100644
--- a/media/java/android/mtp/MtpStorageManager.java
+++ b/media/java/android/mtp/MtpStorageManager.java
@@ -55,7 +55,8 @@
MtpObjectObserver(MtpObject object) {
super(object.getPath().toString(),
- MOVED_FROM | MOVED_TO | DELETE | CREATE | IN_ONLYDIR);
+ MOVED_FROM | MOVED_TO | DELETE | CREATE | IN_ONLYDIR
+ | CLOSE_WRITE);
mObject = object;
}
@@ -85,6 +86,10 @@
if (mObject.mObserver != null)
mObject.mObserver.stopWatching();
mObject.mObserver = null;
+ } else if ((event & CLOSE_WRITE) != 0) {
+ if (sDebug)
+ Log.i(TAG, "inotify for " + mObject.getPath() + " CLOSE_WRITE: " + path);
+ handleChangedObject(mObject, path);
} else {
Log.w(TAG, "Got unrecognized event " + path + " " + event);
}
@@ -302,6 +307,11 @@
* Called when an object is deleted.
*/
public abstract void sendObjectRemoved(int id);
+
+ /**
+ * Called when an object info is changed.
+ */
+ public abstract void sendObjectInfoChanged(int id);
}
private MtpNotifier mMtpNotifier;
@@ -733,6 +743,25 @@
Log.i(TAG, state + " transitioned to " + obj.getState() + " in op " + op);
}
+ private synchronized void handleChangedObject(MtpObject parent, String path) {
+ MtpOperation op = MtpOperation.NONE;
+ MtpObject obj = parent.getChild(path);
+ if (obj != null) {
+ // Only handle files for size change notification event
+ if ((!obj.isDir()) && (obj.getSize() > 0))
+ {
+ MtpObjectState state = obj.getState();
+ op = obj.getOperation();
+ MtpStorageManager.this.mMtpNotifier.sendObjectInfoChanged(obj.getId());
+ if (sDebug)
+ Log.d(TAG, "sendObjectInfoChanged: id=" + obj.getId() + ",size=" + obj.getSize());
+ }
+ } else {
+ if (sDebug)
+ Log.w(TAG, "object " + path + " null");
+ }
+ }
+
/**
* Block the caller until all events currently in the event queue have been
* read and processed. Used for testing purposes.