Upstream version 11.39.250.0
[platform/framework/web/crosswalk.git] / src / ui / file_manager / file_manager / background / js / device_handler.js
index ddbc46b..95e1140 100644 (file)
@@ -19,14 +19,6 @@ function DeviceHandler() {
    */
   this.mountStatus_ = {};
 
-  /**
-   * Map of device path and volumeId of the volume that should be navigated to
-   * from the 'device inserted' notification.
-   * @type {Object.<string, DirectoryEntry>}
-   * @private
-   */
-  this.navigationVolumes_ = {};
-
   chrome.fileManagerPrivate.onDeviceChanged.addListener(
       this.onDeviceChanged_.bind(this));
   chrome.fileManagerPrivate.onMountCompleted.addListener(
@@ -175,23 +167,54 @@ DeviceHandler.Notification.FORMAT_FAIL = new DeviceHandler.Notification(
 DeviceHandler.Notification.prototype.show = function(devicePath, opt_message) {
   var notificationId = this.makeId_(devicePath);
   this.queue_.run(function(callback) {
-    var buttons =
-        this.buttonLabel ? [{title: str(this.buttonLabel)}] : undefined;
-    chrome.notifications.create(
-        notificationId,
-        {
-          type: 'basic',
-          title: str(this.title),
-          message: opt_message || str(this.message),
-          iconUrl: chrome.runtime.getURL('/common/images/icon96.png'),
-          buttons: buttons
-        },
-        callback);
+    this.showInternal_(notificationId, opt_message || null, callback);
   }.bind(this));
   return notificationId;
 };
 
 /**
+ * Shows the notification for the device path.
+ * If the existing notification has been already shown, it does not anything.
+ * @param {string} devicePath Device path.
+ */
+DeviceHandler.Notification.prototype.showOnce = function(devicePath) {
+  var notificationId = this.makeId_(devicePath);
+  this.queue_.run(function(callback) {
+    chrome.notifications.getAll(function(idList) {
+      if (idList.indexOf(notificationId) !== -1) {
+        callback();
+        return;
+      }
+      this.showInternal_(notificationId, null, callback);
+    }.bind(this));
+  });
+};
+
+/**
+ * Shows the notificaiton without using AsyncQueue.
+ * @param {string} notificaitonId Notification ID.
+ * @param {?message} message Message overriding the normal message.
+ * @param {function()} callback Callback to be invoked when the notification is
+ *     created.
+ * @private
+ */
+DeviceHandler.Notification.prototype.showInternal_ = function(
+    notificationId, message, callback) {
+  var buttons =
+      this.buttonLabel ? [{title: str(this.buttonLabel)}] : undefined;
+  chrome.notifications.create(
+      notificationId,
+      {
+        type: 'basic',
+        title: str(this.title),
+        message: message || str(this.message),
+        iconUrl: chrome.runtime.getURL('/common/images/icon96.png'),
+        buttons: buttons
+      },
+      callback);
+};
+
+/**
  * Hides the notification for the device path.
  * @param {string} devicePath Device path.
  */
@@ -283,34 +306,10 @@ DeviceHandler.prototype.onMountCompleted_ = function(event) {
 
   // 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.navigationVolumes_[event.volumeMetadata.devicePath]) {
-      // The notification has already shown for the device. It seems the device
-      // has multiple volumes. The order of mount events of volumes are
-      // undetermind, so it compares the volume Id and uses the earier order ID
-      // to prevent Files.app from navigating to different volumes for each
-      // time.
-      if (event.volumeMetadata.volumeId <
-          this.navigationVolumes_[event.volumeMetadata.devicePath]) {
-        this.navigationVolumes_[event.volumeMetadata.devicePath] =
-            event.volumeMetadata.volumeId;
-      }
-    } else {
-      this.navigationVolumes_[event.volumeMetadata.devicePath] =
-          event.volumeMetadata.volumeId;
-      DeviceHandler.Notification.DEVICE_NAVIGATION.show(
-          event.volumeMetadata.devicePath);
-    }
-  } else if (event.status === 'error_unknown_filesystem') {
-    // The volume id is necessary to navigate when users click start
-    // format button.
-    this.navigationVolumes_[event.volumeMetadata.devicePath] =
-        event.volumeMetadata.volumeId;
-  }
-
-  if (event.eventType === 'unmount') {
-    this.navigationVolumes_[volume.devicePath] = null;
+  if (event.eventType === 'mount' && event.status === 'success') {
+    DeviceHandler.Notification.DEVICE_NAVIGATION.show(
+        event.volumeMetadata.devicePath);
+  } else if (event.eventType === 'unmount') {
     DeviceHandler.Notification.DEVICE_NAVIGATION.hide(volume.devicePath);
   }
 
@@ -402,11 +401,11 @@ DeviceHandler.prototype.onMountCompleted_ = function(event) {
 DeviceHandler.prototype.onNotificationButtonClicked_ = function(id) {
   var pos = id.indexOf(':');
   var type = id.substr(0, pos);
-  var path = id.substr(pos + 1);
+  var devicePath = id.substr(pos + 1);
   if (type === 'deviceNavigation' || type === 'deviceFail') {
     chrome.notifications.clear(id, function() {});
     var event = new Event(DeviceHandler.VOLUME_NAVIGATION_REQUESTED);
-    event.volumeId = this.navigationVolumes_[path];
+    event.devicePath = devicePath;
     this.dispatchEvent(event);
   }
 };