Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(176)

Unified Diff: ui/file_manager/file_manager/background/js/device_handler.js

Issue 858563005: Immediately open MTP and other eligible removable devices with media directory on mount. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Respond to review comments. Created 5 years, 11 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: ui/file_manager/file_manager/background/js/device_handler.js
diff --git a/ui/file_manager/file_manager/background/js/device_handler.js b/ui/file_manager/file_manager/background/js/device_handler.js
index 523acf1a13ae0006507346faf575021116ef02bd..f5e037953841ea002e6d0cd0de91120015097707 100644
--- a/ui/file_manager/file_manager/background/js/device_handler.js
+++ b/ui/file_manager/file_manager/background/js/device_handler.js
@@ -22,24 +22,6 @@ function DeviceHandler() {
this.onMountCompleted_.bind(this));
chrome.notifications.onButtonClicked.addListener(
this.onNotificationButtonClicked_.bind(this));
-
- /**
- * Controls the popup of a new media import notification when media volumes
- * are mounted.
- * @private {boolean}
- */
- this.mediaImportEnabled_ = false;
-
- // Use the command line switch to enable this new feature.
- importer.importEnabled()
- .then(
- /**
- * @param {boolean} enabled
- * @this {DeviceHandler}
- */
- function(enabled) {
- this.mediaImportEnabled_ = enabled;
- }.bind(this));
}
DeviceHandler.prototype = {
@@ -323,26 +305,18 @@ Object.freeze(DeviceHandler.MountStatus);
* @private
*/
DeviceHandler.prototype.onMountCompleted_ = function(event) {
- // If this is remounting, which happens when resuming ChromeOS, the device has
- // already inserted to the computer. So we suppress the notification.
var volume = event.volumeMetadata;
- if (!volume.deviceType || !volume.devicePath || !event.shouldNotify)
- return;
- // If the current volume status is succeed and it should be handled in
- // Files.app, show the notification to navigate the volume.
- if (event.eventType === 'mount' && event.status === 'success') {
- if (this.mediaImportEnabled_ && volume.hasMedia) {
- DeviceHandler.Notification.DEVICE_IMPORT.show(
- volume.devicePath);
- } else {
- DeviceHandler.Notification.DEVICE_NAVIGATION.show(
- volume.devicePath);
- }
- } else if (event.eventType === 'unmount') {
- DeviceHandler.Notification.DEVICE_NAVIGATION.hide(volume.devicePath);
+ if (event.status === 'success' && event.shouldNotify) {
+ if (event.eventType === 'mount')
+ this.onMount_(event);
+ else if (event.eventType === 'unmount')
+ this.onUnmount_(event);
}
+ if (!volume.deviceType || !volume.devicePath || !event.shouldNotify)
+ return;
+
var getFirstStatus = function(event) {
if (event.status === 'success')
return DeviceHandler.MountStatus.SUCCESS;
@@ -369,7 +343,8 @@ DeviceHandler.prototype.onMountCompleted_ = function(event) {
// unmountable)
case DeviceHandler.MountStatus.ONLY_PARENT_ERROR:
if (!volume.isParentDevice)
- DeviceHandler.Notification.DEVICE_FAIL.hide(volume.devicePath);
+ DeviceHandler.Notification.DEVICE_FAIL.hide(
+ /** @type {string} */ (volume.devicePath));
this.mountStatus_[volume.devicePath] = getFirstStatus(event);
break;
// We have a multi-partition device for which at least one mount
@@ -400,7 +375,7 @@ DeviceHandler.prototype.onMountCompleted_ = function(event) {
strf('MULTIPART_DEVICE_UNSUPPORTED_MESSAGE', volume.deviceLabel) :
str('MULTIPART_DEVICE_UNSUPPORTED_DEFAULT_MESSAGE');
DeviceHandler.Notification.DEVICE_FAIL.show(
- volume.devicePath,
+ /** @type {string} */ (volume.devicePath),
message);
break;
case DeviceHandler.MountStatus.CHILD_ERROR:
@@ -410,20 +385,112 @@ DeviceHandler.prototype.onMountCompleted_ = function(event) {
strf('DEVICE_UNSUPPORTED_MESSAGE', volume.deviceLabel) :
str('DEVICE_UNSUPPORTED_DEFAULT_MESSAGE');
DeviceHandler.Notification.DEVICE_FAIL.show(
- volume.devicePath,
+ /** @type {string} */ (volume.devicePath),
message);
} else {
message = volume.deviceLabel ?
strf('DEVICE_UNKNOWN_MESSAGE', volume.deviceLabel) :
str('DEVICE_UNKNOWN_DEFAULT_MESSAGE');
DeviceHandler.Notification.DEVICE_FAIL_UNKNOWN.show(
- volume.devicePath,
+ /** @type {string} */ (volume.devicePath),
message);
}
}
};
/**
+ * Handles mount events.
+ * @param {MountCompletedEvent} event
+ * @private
+ */
+DeviceHandler.prototype.onMount_ = function(event) {
+ // If this is remounting, which happens when resuming Chrome OS, the device
+ // has already inserted to the computer. So we suppress the notification.
+ var metadata = event.volumeMetadata;
+
+ VolumeManager.getInstance()
+ .then(
+ /**
+ * @param {!VolumeManager} volumeManager
+ * @return {!Promise<!VolumeInfo>}
+ */
+ function(volumeManager) {
+ if (!metadata.volumeId) {
+ return Promise.reject('No volume id associated with event.');
+ }
+ return volumeManager.volumeInfoList.whenVolumeInfoReady(
+ metadata.volumeId);
+ })
+ .then(
+ /**
+ * @param {!VolumeInfo} volumeInfo
+ * @return {Promise<DirectoryEntry>} The root directory
+ * of the volume.
+ */
+ function(volumeInfo) {
+ return importer.importEnabled()
+ .then(
+ /** @param {boolean} enabled */
+ function(enabled) {
+ if (enabled && importer.isEligibleVolume(volumeInfo)) {
+ return volumeInfo.resolveDisplayRoot();
+ }
+ return Promise.reject('Cloud import disabled.');
+ });
+ })
+ .then(
+ /**
+ * @param {!DirectoryEntry} root
+ * @return {!Promise<!Array.<DirectoryEntry>>}
+ */
+ function(root) {
+ return Promise.all([
+ new Promise(
+ root.getDirectory.bind(root, 'DCIM', {create: false}))
+ .catch(
+ function() {
+ return null;
+ }),
+ new Promise(
+ root.getDirectory.bind(root, 'dcim', {create: false}))
+ .catch(
+ function() {
+ return null;
+ })]);
+
+ })
+ .then(
+ /**
+ * @param {!Array.<DirectoryEntry>} results, where index 0 is for
+ * 'DCIM' and 1 is for 'dcim'.
+ */
+ function(results) {
+ if (!!results[0] && results[0].isDirectory) {
+ // It's a "DCIM"!
+ this.openMediaDirectory_(metadata.volumeId, results[0].fullPath);
+ return Promise.resolve();
+ } else if(!!results[1] && results[1].isDirectory) {
+ // It's a "dcim"!
+ this.openMediaDirectory_(metadata.volumeId, results[1].fullPath);
+ return Promise.resolve();
+ }
+ return Promise.reject('Unable to local DCIM or dcim directory.');
+ }.bind(this))
+ .catch(
+ function(error) {
+ if (metadata.deviceType && metadata.devicePath) {
+ DeviceHandler.Notification.DEVICE_NAVIGATION.show(
+ /** @type {string} */ (metadata.devicePath));
+ }
+ });
+};
+
+DeviceHandler.prototype.onUnmount_ = function(event) {
+ DeviceHandler.Notification.DEVICE_NAVIGATION.hide(
+ /** @type {string} */ (event.devicePath));
+};
+
+/**
* Handles notification button click.
* @param {string} id ID of the notification.
* @private
@@ -437,11 +504,18 @@ DeviceHandler.prototype.onNotificationButtonClicked_ = function(id) {
var event = new Event(DeviceHandler.VOLUME_NAVIGATION_REQUESTED);
event.devicePath = devicePath;
this.dispatchEvent(event);
- } else if (type === 'deviceImport') {
- chrome.notifications.clear(id, function() {});
- var event = new Event(DeviceHandler.VOLUME_NAVIGATION_REQUESTED);
- event.devicePath = devicePath;
- event.filePath = 'DCIM';
- this.dispatchEvent(event);
}
};
+
+/**
+ * Handles notification button click.
+ * @param {string} volumeId
+ * @param {string} path
+ * @private
+ */
+DeviceHandler.prototype.openMediaDirectory_ = function(volumeId, path) {
+ var event = new Event(DeviceHandler.VOLUME_NAVIGATION_REQUESTED);
+ event.volumeId = volumeId;
+ event.filePath = path;
+ this.dispatchEvent(event);
+};

Powered by Google App Engine
This is Rietveld 408576698