* @param {VolumeManagerWrapper} volumeManager Volume manager instance.
* @param {MultiProfileShareDialog} multiProfileShareDialog Share dialog to be
* used to share files from another profile.
+ * @param {ProgressCenter} progressCenter To notify starting copy operation.
* @constructor
*/
function FileTransferController(doc,
metadataCache,
directoryModel,
volumeManager,
- multiProfileShareDialog) {
+ multiProfileShareDialog,
+ progressCenter) {
this.document_ = doc;
this.fileOperationManager_ = fileOperationManager;
this.metadataCache_ = metadataCache;
this.directoryModel_ = directoryModel;
this.volumeManager_ = volumeManager;
this.multiProfileShareDialog_ = multiProfileShareDialog;
+ this.progressCenter_ = progressCenter;
this.directoryModel_.getFileList().addEventListener(
- 'change', function(event) {
- if (this.directoryModel_.getFileListSelection().
- getIndexSelected(event.index)) {
- this.onSelectionChanged_();
- }
- }.bind(this));
+ 'change',
+ function(event) {
+ if (this.directoryModel_.getFileListSelection().
+ getIndexSelected(event.index)) {
+ this.onSelectionChanged_();
+ }
+ }.bind(this));
this.directoryModel_.getFileListSelection().addEventListener('change',
this.onSelectionChanged_.bind(this));
/**
+ * The array of pending task ID.
+ * @type {Array.<string>}
+ */
+ this.pendingTaskIds = [];
+
+ /**
* Promise to be fulfilled with the thumbnail image of selected file in drag
* operation. Used if only one element is selected.
* @type {Promise}
* @private
*/
this.touching_ = false;
+
+ /**
+ * Task ID counter.
+ * @type {number}
+ * @private
+ */
+ this.taskIdCounter_ = 0;
}
/**
},
/**
- * @this {FileTransferController}
- * @param {NavigationList} tree Its sub items will could be drop target.
- */
- attachNavigationListDropTarget: function(list) {
- list.addEventListener('dragover',
- this.onDragOver_.bind(this, true /* onlyIntoDirectories */, list));
- list.addEventListener('dragenter',
- this.onDragEnterVolumesList_.bind(this, list));
- list.addEventListener('dragleave', this.onDragLeave_.bind(this, list));
- list.addEventListener('drop',
- this.onDrop_.bind(this, true /* onlyIntoDirectories */));
- },
-
- /**
* Attach handlers of copy, cut and paste operations to the document.
*
* @this {FileTransferController}
// Check all file entries and keeps only those need sharing operation.
var processFileEntries = function(entries) {
return new Promise(function(callback) {
+ // TODO(mtomasz): Move conversion from entry to url to custom bindings.
+ // crbug.com/345527.
var urls = util.entriesToURLs(entries);
- chrome.fileBrowserPrivate.getDriveEntryProperties(urls, callback);
- }).
- then(function(metadatas) {
+ chrome.fileManagerPrivate.getEntryProperties(urls, callback);
+ }).then(function(metadatas) {
return entries.filter(function(entry, i) {
var metadata = metadatas[i];
return metadata && metadata.isHosted && !metadata.sharedWithMe;
opt_destinationEntry || this.currentDirectoryContentEntry;
var entries;
var failureUrls;
+ var taskId = this.fileOperationManager_.generateTaskId();
- util.URLsToEntries(sourceURLs).
- then(function(result) {
+ util.URLsToEntries(sourceURLs).then(function(result) {
+ this.pendingTaskIds.push(taskId);
entries = result.entries;
failureUrls = result.failureUrls;
+ var item = new ProgressCenterItem();
+ item.id = taskId;
+ item.type = ProgressItemType.COPY;
+ if (result.entries.length === 1)
+ item.message = strf('COPY_FILE_NAME', result.entries[0].name);
+ else
+ item.message = strf('COPY_ITEMS_REMAINING', result.entries.length);
+ this.progressCenter_.updateItem(item);
// Check if cross share is needed or not.
return this.getMultiProfileShareEntries_(entries);
- }.bind(this)).
- then(function(shareEntries) {
+ }.bind(this)).then(function(shareEntries) {
if (shareEntries.length === 0)
return;
return this.multiProfileShareDialog_.show(shareEntries.length > 1).
if (index >= shareEntries.length)
return;
return new Promise(function(fulfill) {
- chrome.fileBrowserPrivate.requestDriveShare(
+ chrome.fileManagerPrivate.requestDriveShare(
shareEntries[index].toURL(),
dialogResult,
function() {
};
return requestDriveShare(0);
});
- }.bind(this)).
- then(function() {
+ }.bind(this)).then(function() {
// Start the pasting operation.
this.fileOperationManager_.paste(
- entries, destinationEntry, toMove);
+ entries, destinationEntry, toMove, taskId);
+ this.pendingTaskIds.splice(this.pendingTaskIds.indexOf(taskId), 1);
// Publish events for failureUrls.
for (var i = 0; i < failureUrls.length; i++) {
toMove ? ProgressItemType.MOVE : ProgressItemType.COPY;
this.dispatchEvent(event);
}
- }.bind(this)).
- catch(function(error) {
+ }.bind(this)).catch(function(error) {
if (error !== 'ABORT')
console.error(error.stack ? error.stack : error);
});
*/
preloadThumbnailImage_: function(entry) {
var metadataPromise = new Promise(function(fulfill, reject) {
- this.metadataCache_.getOne(entry,
- 'thumbnail|filesystem',
- function(metadata) {
- if (metadata)
- fulfill(metadata);
- else
- reject('Failed to fetch metadata.');
- });
+ this.metadataCache_.getOne(
+ entry,
+ 'thumbnail|filesystem',
+ function(metadata) {
+ if (metadata)
+ fulfill(metadata);
+ else
+ reject('Failed to fetch metadata.');
+ });
}.bind(this));
var imagePromise = metadataPromise.then(function(metadata) {
window[DRAG_AND_DROP_GLOBAL_DATA] = {
sourceRootURL: dt.getData('fs/sourceRootURL'),
- missingFileContents: dt.getData('fs/missingFileContents'),
+ missingFileContents: dt.getData('fs/missingFileContents')
};
},
event.preventDefault(); // Required to prevent the cursor flicker.
this.lastEnteredTarget_ = event.target;
var item = event.target;
- while (item && !(item instanceof DirectoryItem)) {
+ while (item && !(item instanceof cr.ui.TreeItem)) {
item = item.parentNode;
}
/**
* @this {FileTransferController}
- * @param {NavigationList} list Drop target list.
- * @param {Event} event A dragenter event of DOM.
- */
- onDragEnterVolumesList_: function(list, event) {
- event.preventDefault(); // Required to prevent the cursor flicker.
-
- this.lastEnteredTarget_ = event.target;
- var item = list.getListItemAncestor(event.target);
- item = item && list.isItem(item) ? item : null;
- if (item === this.dropTarget_)
- return;
-
- var modelItem = item && list.dataModel.item(item.listIndex);
- if (modelItem && modelItem.isShortcut) {
- this.setDropTarget_(item, event.dataTransfer, modelItem.entry);
- return;
- }
- if (modelItem && modelItem.isVolume && modelItem.volumeInfo.displayRoot) {
- this.setDropTarget_(
- item, event.dataTransfer, modelItem.volumeInfo.displayRoot);
- return;
- }
-
- this.clearDropTarget_();
- },
-
- /**
- * @this {FileTransferController}
* @param {cr.ui.List} list Drop target list.
* @param {Event} event A dragleave event of DOM.
*/
if (this.isOnDrive) {
this.allDriveFilesAvailable = false;
- this.metadataCache_.get(entries, 'drive', function(props) {
+ this.metadataCache_.get(entries, 'external', function(props) {
// We consider directories not available offline for the purposes of
// file transfer since we cannot afford to recursive traversal.
this.allDriveFilesAvailable =