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

Side by Side Diff: ui/file_manager/file_manager/foreground/js/import_controller.js

Issue 914353004: Update import details panel to comply (mostly) with UX direction. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Exclude details panel button from tab index. Created 5 years, 10 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 unified diff | Download patch
OLDNEW
1 // Copyright 2014 The Chromium Authors. All rights reserved. 1 // Copyright 2014 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 // Namespace 5 // Namespace
6 var importer = importer || {}; 6 var importer = importer || {};
7 7
8 /** @enum {string} */ 8 /** @enum {string} */
9 importer.ResponseId = { 9 importer.ResponseId = {
10 EXECUTABLE: 'executable', 10 READY: 'ready',
11 HIDDEN: 'hidden', 11 HIDDEN: 'hidden',
12 ACTIVE_IMPORT: 'active_import', 12 IMPORTING: 'importing',
13 INSUFFICIENT_SPACE: 'insufficient_space', 13 INSUFFICIENT_SPACE: 'insufficient-space',
14 NO_MEDIA: 'no_media', 14 NO_MEDIA: 'no-media',
15 SCANNING: 'scanning' 15 SCANNING: 'scanning'
16 }; 16 };
17 17
18 /** 18 /**
19 * @typedef {{
20 * id: !importer.ResponseId,
21 * label: string,
22 * visible: boolean,
23 * executable: boolean,
24 * coreIcon: string
25 * }}
26 */
27 importer.CommandUpdate;
28
29 /**
30 * Class that orchestrates background activity and UI changes on 19 * Class that orchestrates background activity and UI changes on
31 * behalf of Cloud Import. 20 * behalf of Cloud Import.
32 * 21 *
33 * @constructor 22 * @constructor
34 * @struct 23 * @struct
35 * 24 *
36 * @param {!importer.ControllerEnvironment} environment The class providing 25 * @param {!importer.ControllerEnvironment} environment The class providing
37 * access to runtime environmental information, like the current directory, 26 * access to runtime environmental information, like the current directory,
38 * volume lookup and so-on. 27 * volume lookup and so-on.
39 * @param {!importer.MediaScanner} scanner 28 * @param {!importer.MediaScanner} scanner
(...skipping 13 matching lines...) Expand all
53 this.scanner_ = scanner; 42 this.scanner_ = scanner;
54 43
55 /** @private {!importer.CommandWidget} */ 44 /** @private {!importer.CommandWidget} */
56 this.commandWidget_ = commandWidget; 45 this.commandWidget_ = commandWidget;
57 46
58 /** @type {!importer.ScanManager} */ 47 /** @type {!importer.ScanManager} */
59 this.scanManager_ = new importer.ScanManager(environment, scanner); 48 this.scanManager_ = new importer.ScanManager(environment, scanner);
60 49
61 /** 50 /**
62 * The active import task, if any. 51 * The active import task, if any.
63 * @private {importer.MediaImportHandler.ImportTask} 52 * @private {?{
53 * scan: !importer.ScanResult,
54 * task: !importer.MediaImportHandler.ImportTask
55 * }}
64 */ 56 */
65 this.activeImportTask_ = null; 57 this.activeImport_ = null;
66 58
67 var listener = this.onScanEvent_.bind(this); 59 var listener = this.onScanEvent_.bind(this);
68 this.scanner_.addObserver(listener); 60 this.scanner_.addObserver(listener);
69 // Remove the observer when the foreground window is closed. 61 // Remove the observer when the foreground window is closed.
70 window.addEventListener( 62 window.addEventListener(
71 'pagehide', 63 'pagehide',
72 function() { 64 function() {
73 this.scanner_.removeObserver(listener); 65 this.scanner_.removeObserver(listener);
74 }.bind(this)); 66 }.bind(this));
75 67
76 this.environment_.addVolumeUnmountListener( 68 this.environment_.addVolumeUnmountListener(
77 this.onVolumeUnmounted_.bind(this)); 69 this.onVolumeUnmounted_.bind(this));
78 70
79 this.environment_.addDirectoryChangedListener( 71 this.environment_.addDirectoryChangedListener(
80 this.onDirectoryChanged_.bind(this)); 72 this.onDirectoryChanged_.bind(this));
81 73
82 this.environment_.addSelectionChangedListener( 74 this.environment_.addSelectionChangedListener(
83 this.onSelectionChanged_.bind(this)); 75 this.onSelectionChanged_.bind(this));
84 76
85 this.commandWidget_.addImportClickedListener( 77 this.commandWidget_.addImportClickedListener(
86 this.execute.bind(this)); 78 this.execute.bind(this));
79
80 this.commandWidget_.addDestinationClickedListener(
81 this.showDestination.bind(this));
87 }; 82 };
88 83
89 /** 84 /**
90 * @param {!importer.ScanEvent} event Command event. 85 * @param {!importer.ScanEvent} event Command event.
91 * @param {importer.ScanResult} scan 86 * @param {importer.ScanResult} scan
92 * 87 *
93 * @private 88 * @private
94 */ 89 */
95 importer.ImportController.prototype.onScanEvent_ = function(event, scan) { 90 importer.ImportController.prototype.onScanEvent_ = function(event, scan) {
96 if (!this.scanManager_.isActiveScan(scan)) { 91 if (!this.scanManager_.isActiveScan(scan)) {
(...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after
143 } else { 138 } else {
144 this.checkState_(); 139 this.checkState_();
145 } 140 }
146 }; 141 };
147 142
148 /** 143 /**
149 * @param {!importer.MediaImportHandler.ImportTask} task 144 * @param {!importer.MediaImportHandler.ImportTask} task
150 * @private 145 * @private
151 */ 146 */
152 importer.ImportController.prototype.onImportFinished_ = function(task) { 147 importer.ImportController.prototype.onImportFinished_ = function(task) {
153 this.activeImportTask_ = null; 148 this.activeImport_ = null;
154 this.scanManager_.reset(); 149 this.scanManager_.reset();
155 this.checkState_(); 150 this.checkState_();
156 }; 151 };
157 152
158 /** 153 /**
159 * Executes import against the current directory. Should only 154 * Executes import against the current directory. Should only
160 * be called when the current directory has been validated 155 * be called when the current directory has been validated
161 * by calling "update" on this class. 156 * by calling "update" on this class.
162 */ 157 */
163 importer.ImportController.prototype.execute = function() { 158 importer.ImportController.prototype.execute = function() {
164 console.assert(!this.activeImportTask_, 159 console.assert(!this.activeImport_,
165 'Cannot execute while an import task is already active.'); 160 'Cannot execute while an import task is already active.');
166 metrics.recordEnum('CloudImport.UserAction', 'IMPORT_INITIATED'); 161 metrics.recordEnum('CloudImport.UserAction', 'IMPORT_INITIATED');
167 162
168 var scan = this.scanManager_.getActiveScan(); 163 var scan = this.scanManager_.getActiveScan();
169 assert(scan != null); 164 assert(scan != null);
170 165
171 var importTask = this.importRunner_.importFromScanResult( 166 var importTask = this.importRunner_.importFromScanResult(
172 scan, 167 scan,
173 importer.Destination.GOOGLE_DRIVE); 168 importer.Destination.GOOGLE_DRIVE);
174 169
175 this.activeImportTask_ = importTask; 170 this.activeImport_ = {
171 scan: scan,
172 task: importTask
173 };
176 var taskFinished = this.onImportFinished_.bind(this, importTask); 174 var taskFinished = this.onImportFinished_.bind(this, importTask);
177 importTask.whenFinished.then(taskFinished).catch(taskFinished); 175 importTask.whenFinished.then(taskFinished).catch(taskFinished);
178 this.checkState_(); 176 this.checkState_();
179 }; 177 };
180 178
181 /** 179 /**
180 * Shows the import destination folder.
181 */
182 importer.ImportController.prototype.showDestination = function() {
183 console.log('SET THE CURRENT DIRECTORY TO THE DESTINATION');
184 };
185
186 /**
182 * Checks the environment and updates UI as needed. 187 * Checks the environment and updates UI as needed.
183 * @param {importer.ScanResult=} opt_scan If supplied, 188 * @param {importer.ScanResult=} opt_scan If supplied,
184 * @private 189 * @private
185 */ 190 */
186 importer.ImportController.prototype.checkState_ = function(opt_scan) { 191 importer.ImportController.prototype.checkState_ = function(opt_scan) {
187 // If there is no Google Drive mount, Drive may be disabled 192 // If there is no Google Drive mount, Drive may be disabled
188 // or the machine may be running in guest mode. 193 // or the machine may be running in guest mode.
189 if (!this.environment_.isGoogleDriveMounted()) { 194 if (!this.environment_.isGoogleDriveMounted()) {
190 this.updateUi_(importer.ResponseId.HIDDEN); 195 this.updateUi_(importer.ResponseId.HIDDEN);
191 return; 196 return;
192 } 197 }
193 198
194 if (!!this.activeImportTask_) { 199 if (!!this.activeImport_) {
195 this.updateUi_(importer.ResponseId.ACTIVE_IMPORT); 200 this.updateUi_(importer.ResponseId.IMPORTING, this.activeImport_.scan);
196 return; 201 return;
197 } 202 }
198 203
199 // If we don't have an existing scan, we'll try to create 204 // If we don't have an existing scan, we'll try to create
200 // one. When we do end up creating one (not getting 205 // one. When we do end up creating one (not getting
201 // one from the cache) it'll be empty...even if there is 206 // one from the cache) it'll be empty...even if there is
202 // a current selection. This is because scans are 207 // a current selection. This is because scans are
203 // resolved asynchronously. And we like it that way. 208 // resolved asynchronously. And we like it that way.
204 // We'll get notification when the scan is updated. When 209 // We'll get notification when the scan is updated. When
205 // that happens, we'll be called back with opt_scan 210 // that happens, we'll be called back with opt_scan
(...skipping 30 matching lines...) Expand all
236 /** @param {boolean} fits */ 241 /** @param {boolean} fits */
237 function(fits) { 242 function(fits) {
238 if (!fits) { 243 if (!fits) {
239 this.updateUi_( 244 this.updateUi_(
240 importer.ResponseId.INSUFFICIENT_SPACE, 245 importer.ResponseId.INSUFFICIENT_SPACE,
241 opt_scan); 246 opt_scan);
242 return; 247 return;
243 } 248 }
244 249
245 this.updateUi_( 250 this.updateUi_(
246 importer.ResponseId.EXECUTABLE, 251 importer.ResponseId.READY, // to import...
247 opt_scan); 252 opt_scan);
248 }.bind(this)); 253 }.bind(this));
249 }; 254 };
250 255
251 /** 256 /**
252 * @param {importer.ResponseId} responseId 257 * @param {importer.ResponseId} responseId
253 * @param {importer.ScanResult=} opt_scan 258 * @param {importer.ScanResult=} opt_scan
254 *
255 * @return {!importer.CommandUpdate}
256 * @private 259 * @private
257 */ 260 */
258 importer.ImportController.prototype.updateUi_ = 261 importer.ImportController.prototype.updateUi_ =
259 function(responseId, opt_scan) { 262 function(responseId, opt_scan) {
260 switch(responseId) { 263 this.commandWidget_.update(responseId, opt_scan);
261 case importer.ResponseId.EXECUTABLE:
262 this.commandWidget_.update({
263 id: responseId,
264 label: strf(
265 'CLOUD_IMPORT_BUTTON_LABEL',
266 opt_scan.getFileEntries().length),
267 visible: true,
268 executable: true,
269 coreIcon: 'cloud-upload'
270 });
271 this.commandWidget_.updateDetails(opt_scan);
272 break;
273 case importer.ResponseId.HIDDEN:
274 this.commandWidget_.update({
275 id: responseId,
276 visible: false,
277 executable: false,
278 label: '** SHOULD NOT BE VISIBLE **',
279 coreIcon: 'cloud-off'
280 });
281 this.commandWidget_.setDetailsVisible(false);
282 break;
283 case importer.ResponseId.ACTIVE_IMPORT:
284 this.commandWidget_.update({
285 id: responseId,
286 visible: true,
287 executable: false,
288 label: str('CLOUD_IMPORT_ACTIVE_IMPORT_BUTTON_LABEL'),
289 coreIcon: 'swap-vert'
290 });
291 this.commandWidget_.setDetailsVisible(false);
292 break;
293 case importer.ResponseId.INSUFFICIENT_SPACE:
294 this.commandWidget_.update({
295 id: responseId,
296 visible: true,
297 executable: false,
298 label: strf(
299 'CLOUD_IMPORT_INSUFFICIENT_SPACE_BUTTON_LABEL',
300 util.bytesToString(opt_scan.getTotalBytes())),
301 coreIcon: 'report-problem'
302 });
303 this.commandWidget_.updateDetails(opt_scan);
304 break;
305 case importer.ResponseId.NO_MEDIA:
306 this.commandWidget_.update({
307 id: responseId,
308 visible: true,
309 executable: false,
310 label: str('CLOUD_IMPORT_EMPTY_SCAN_BUTTON_LABEL'),
311 coreIcon: 'cloud-done'
312 });
313 this.commandWidget_.updateDetails(
314 /** @type {!importer.ScanResult} */ (opt_scan));
315 break;
316 case importer.ResponseId.SCANNING:
317 this.commandWidget_.update({
318 id: responseId,
319 visible: true,
320 executable: false,
321 label: str('CLOUD_IMPORT_SCANNING_BUTTON_LABEL'),
322 coreIcon: 'autorenew'
323 });
324 this.commandWidget_.updateDetails(
325 /** @type {!importer.ScanResult} */ (opt_scan));
326 break;
327 default:
328 assertNotReached('Unrecognized response id: ' + responseId);
329 }
330 }; 264 };
331 265
332 /** 266 /**
333 * @return {boolean} true if the current directory is scan eligible. 267 * @return {boolean} true if the current directory is scan eligible.
334 * @private 268 * @private
335 */ 269 */
336 importer.ImportController.prototype.isCurrentDirectoryScannable_ = 270 importer.ImportController.prototype.isCurrentDirectoryScannable_ =
337 function() { 271 function() {
338 var directory = this.environment_.getCurrentDirectory(); 272 var directory = this.environment_.getCurrentDirectory();
339 return !!directory && 273 return !!directory &&
(...skipping 219 matching lines...) Expand 10 before | Expand all | Expand 10 after
559 importer.CommandWidget = function() {}; 493 importer.CommandWidget = function() {};
560 494
561 /** 495 /**
562 * Install a listener that get's called when the user wants to initiate 496 * Install a listener that get's called when the user wants to initiate
563 * import. 497 * import.
564 * 498 *
565 * @param {function()} listener 499 * @param {function()} listener
566 */ 500 */
567 importer.CommandWidget.prototype.addImportClickedListener; 501 importer.CommandWidget.prototype.addImportClickedListener;
568 502
569 /** @param {!importer.CommandUpdate} update */ 503 /**
504 * Install a listener that get's called when the user wants to initiate
505 * import.
506 *
507 * @param {function()} listener
508 */
509 importer.CommandWidget.prototype.addDestinationClickedListener;
510
511 /**
512 * @param {importer.ResponseId} responseId
513 * @param {importer.ScanResult=} opt_scan
514 */
570 importer.CommandWidget.prototype.update; 515 importer.CommandWidget.prototype.update;
571 516
572 /** @param {!importer.ScanResult} scan */
573 importer.CommandWidget.prototype.updateDetails;
574
575 /** Resets details to default. */
576 importer.CommandWidget.prototype.resetDetails;
577
578 /** 517 /**
579 * Runtime implementation of CommandWidget. 518 * Runtime implementation of CommandWidget.
580 * 519 *
581 * @constructor 520 * @constructor
582 * @implements {importer.CommandWidget} 521 * @implements {importer.CommandWidget}
583 * @struct 522 * @struct
584 */ 523 */
585 importer.RuntimeCommandWidget = function() { 524 importer.RuntimeCommandWidget = function() {
586 525
587 /** @private {Element} */ 526 /** @private {Element} */
588 this.importButton_ = document.getElementById('cloud-import-button'); 527 this.importButton_ = document.getElementById('cloud-import-button');
589 this.importButton_.onclick = this.onImportClicked_.bind(this); 528 this.importButton_.onclick = this.onImportClicked_.bind(this);
590 529
591 /** @private {Element} */ 530 /** @private {Element} */
592 this.detailsButton_ = document.getElementById('cloud-import-details-button'); 531 this.detailsButton_ = document.getElementById('cloud-import-details-button');
593 this.detailsButton_.onclick = this.toggleDetails_.bind(this); 532 this.detailsButton_.onclick = this.toggleDetails_.bind(this);
594 533
595 /** @private {Element} */ 534 /** @private {Element} */
596 this.detailsImportButton_ = 535 this.detailsImportButton_ =
597 document.querySelector('#cloud-import-details .import'); 536 document.querySelector('#cloud-import-details paper-button.import');
598 this.detailsImportButton_.onclick = this.onImportClicked_.bind(this); 537 this.detailsImportButton_.onclick = this.onImportClicked_.bind(this);
599 538
600 /** @private {Element} */ 539 /** @private {Element} */
601 this.detailsPanel_ = document.getElementById('cloud-import-details'); 540 this.detailsPanel_ = document.getElementById('cloud-import-details');
541 this.detailsPanel_.addEventListener(
542 'transitionend',
543 this.onDetailsTransitionEnd_.bind(this),
544 false);
602 545
603 /** @private {Element} */ 546 /** @private {Element} */
604 this.photoCount_ = 547 this.detailsPanelBody_ =
605 document.querySelector('#cloud-import-details .photo-count'); 548 document.querySelector('#cloud-import-details .main');
606 549
607 /** @private {Element} */ 550 /** @private {Element} */
608 this.spaceRequired_ = 551 this.statusContent_ =
609 document.querySelector('#cloud-import-details .space-required'); 552 document.querySelector('#cloud-import-details .status .content');
553 this.statusContent_.onclick = this.onStatusClicked_.bind(this);
610 554
611 /** @private {Element} */ 555 /** @private {Element} */
612 this.icon_ = document.querySelector('#cloud-import-button core-icon'); 556 this.toolbarIcon_ =
557 document.querySelector('#cloud-import-button core-icon');
558 this.statusIcon_ =
559 document.querySelector('#cloud-import-details .status core-icon');
613 560
614 /** @private {function()} */ 561 /** @private {function()} */
615 this.importListener_; 562 this.importListener_;
563
564 /** @private {function()} */
565 this.destinationListener_;
616 }; 566 };
617 567
618 /** @override */ 568 /** @override */
619 importer.RuntimeCommandWidget.prototype.addImportClickedListener = 569 importer.RuntimeCommandWidget.prototype.addImportClickedListener =
620 function(listener) { 570 function(listener) {
621 console.assert(!this.importListener_); 571 console.assert(!this.importListener_);
622 this.importListener_ = listener; 572 this.importListener_ = listener;
623 }; 573 };
624 574
625 /** @private */ 575 /** @override */
626 importer.RuntimeCommandWidget.prototype.onImportClicked_ = function() { 576 importer.RuntimeCommandWidget.prototype.addDestinationClickedListener =
627 console.assert(!!this.importListener_); 577 function(listener) {
578 console.assert(!this.destinationListener_);
579 this.destinationListener_ = listener;
580 };
581
582 /**
583 * @param {Event} event Click event.
584 * @private
585 */
586 importer.RuntimeCommandWidget.prototype.onImportClicked_ = function(event) {
587 console.assert(!!this.importListener_, 'Listener not set.');
628 this.importListener_(); 588 this.importListener_();
629 }; 589 };
630 590
591 /**
592 * @param {Event} event Click event.
593 * @private
594 */
595 importer.RuntimeCommandWidget.prototype.onStatusClicked_ = function(event) {
596 console.assert(!!this.destinationListener_, 'Listener not set.');
597 // TODO(smckay): Only if the element is "destination-link".
598 this.destinationListener_();
599 };
600
631 /** @private */ 601 /** @private */
632 importer.RuntimeCommandWidget.prototype.toggleDetails_ = function() { 602 importer.RuntimeCommandWidget.prototype.toggleDetails_ = function() {
633 this.setDetailsVisible(this.detailsPanel_.className === 'offscreen'); 603 this.setDetailsVisible(this.detailsPanel_.className === 'hidden');
mtomasz 2015/02/13 13:26:24 Hidden attribute should be used instead?
Steve McKay 2015/02/13 17:31:44 We both mark the element as hidden AND add the 'hi
634 }; 604 };
635 605
636 importer.RuntimeCommandWidget.prototype.setDetailsVisible = function(visible) { 606 importer.RuntimeCommandWidget.prototype.setDetailsVisible = function(visible) {
637 if (visible) { 607 if (visible) {
608 this.detailsPanel_.hidden = false;
638 this.detailsPanel_.className = ''; 609 this.detailsPanel_.className = '';
mtomasz 2015/02/13 13:26:24 ditto
Steve McKay 2015/02/13 17:31:45 Acknowledged.
639 } else { 610 } else {
640 this.detailsPanel_.className = 'offscreen'; 611 this.detailsPanel_.className = 'hidden';
mtomasz 2015/02/13 13:26:24 ditto
Steve McKay 2015/02/13 17:31:45 Acknowledged.
612 }
613 };
614
615 /** @private */
616 importer.RuntimeCommandWidget.prototype.onDetailsTransitionEnd_ =
617 function() {
618 if (this.detailsPanel_.className === 'hidden') {
619 // if we simply make the panel invisible (via opacity)
620 // it'll still be sitting there grabing mouse events
621 // and so-on. So we *hide* hide it.
622 this.detailsPanel_.hidden = true;
641 } 623 }
642 }; 624 };
643 625
644 /** @override */ 626 /** @override */
645 importer.RuntimeCommandWidget.prototype.update = function(update) { 627 importer.RuntimeCommandWidget.prototype.update =
646 this.importButton_.setAttribute('title', update.label); 628 function(responseId, opt_scan) {
647 this.importButton_.disabled = !update.executable; 629 switch(responseId) {
648 this.importButton_.style.display = 630 case importer.ResponseId.HIDDEN:
649 update.visible ? 'block' : 'none'; 631 this.setDetailsVisible(false);
650 632
651 this.icon_.setAttribute('icon', update.coreIcon); 633 this.importButton_.disabled = true;
634 this.detailsButton_.disabled = true;
652 635
653 this.detailsButton_.disabled = !update.executable; 636 this.importButton_.hidden = true;
654 this.detailsButton_.style.display = 637 this.detailsButton_.hidden = true;
655 update.visible ? 'block' : 'none';
656 };
657 638
658 /** @override */ 639 this.importButton_.setAttribute(
659 importer.RuntimeCommandWidget.prototype.updateDetails = function(scan) { 640 'title',
660 this.photoCount_.textContent = scan.getFileEntries().length.toLocaleString(); 641 '** SHOULD NOT BE VISIBLE **');
661 this.spaceRequired_.textContent = util.bytesToString(scan.getTotalBytes()); 642 this.statusContent_.innerHTML =
662 }; 643 '** SHOULD NOT BE VISIBLE **';
663 644
664 /** @override */ 645 this.toolbarIcon_.setAttribute('icon', 'cloud-off');
665 importer.RuntimeCommandWidget.prototype.resetDetails = function() { 646 this.statusIcon_.setAttribute('icon', 'cloud-off');
666 this.photoCount_.textContent = 0; 647
667 this.spaceRequired_.textContent = 0; 648 break;
649
650 case importer.ResponseId.IMPORTING:
651 console.assert(!!opt_scan, 'Scan not defined, but is required.');
652 this.setDetailsVisible(false);
653
654 this.importButton_.setAttribute('title', strf(
655 'CLOUD_IMPORT_TOOLTIP_IMPORTING',
656 opt_scan.getFileEntries().length));
657 this.statusContent_.innerHTML = strf(
658 'CLOUD_IMPORT_STATUS_IMPORTING',
659 opt_scan.getFileEntries().length);
660
661 this.importButton_.disabled = true;
662 this.detailsButton_.disabled = true;
663 this.detailsImportButton_.disabled = true;
664
665 this.importButton_.hidden = false;
666 this.detailsButton_.hidden = false;
667 this.detailsImportButton_.hidden = false;
668
669 this.toolbarIcon_.setAttribute('icon', 'autorenew');
670 this.statusIcon_.setAttribute('icon', 'autorenew');
671
672 break;
673
674 case importer.ResponseId.INSUFFICIENT_SPACE:
675 console.assert(!!opt_scan, 'Scan not defined, but is required.');
676
677 this.importButton_.setAttribute('title', strf(
678 'CLOUD_IMPORT_STATUS_INSUFFICIENT_SPACE'));
679 this.statusContent_.innerHTML = strf(
680 'CLOUD_IMPORT_STATUS_INSUFFICIENT_SPACE',
681 opt_scan.getFileEntries().length);
682
683 this.importButton_.disabled = true;
684 this.detailsButton_.disabled = false;
685 this.detailsImportButton_.disabled = true;
686
687 this.importButton_.hidden = false;
688 this.detailsButton_.hidden = false;
689 this.detailsImportButton_.hidden = false;
690
691 this.toolbarIcon_.setAttribute('icon', 'image:photo');
692 this.statusIcon_.setAttribute('icon', 'cloud-off');
693 break;
694
695 case importer.ResponseId.NO_MEDIA:
696 this.importButton_.setAttribute('title', str(
697 'CLOUD_IMPORT_STATUS_NO_MEDIA'));
698 this.statusContent_.innerHTML = str(
699 'CLOUD_IMPORT_STATUS_NO_MEDIA');
700
701 this.importButton_.disabled = true;
702 this.detailsButton_.disabled = true;
703 this.detailsImportButton_.disabled = true;
704
705 this.importButton_.hidden = false;
706 this.detailsButton_.hidden = false;
707 // Hidden for now, since this is also the "done" importing case.
708 this.detailsImportButton_.hidden = true;
709
710 this.toolbarIcon_.setAttribute('icon', 'cloud-done');
711 this.statusIcon_.setAttribute('icon', 'cloud-done');
712 break;
713
714 case importer.ResponseId.READY:
715 console.assert(!!opt_scan, 'Scan not defined, but is required.');
716
717 this.importButton_.setAttribute('title', strf(
718 'CLOUD_IMPORT_TOOLTIP_READY',
719 opt_scan.getFileEntries().length));
720 this.statusContent_.innerHTML = strf(
721 'CLOUD_IMPORT_STATUS_READY',
722 opt_scan.getFileEntries().length);
723
724 this.importButton_.disabled = false;
725 this.detailsButton_.disabled = false;
726 this.detailsImportButton_.disabled = false;
727
728 this.importButton_.hidden = false;
729 this.detailsButton_.hidden = false;
730 this.detailsImportButton_.hidden = false;
731
732 this.toolbarIcon_.setAttribute('icon', 'cloud-upload');
733 this.statusIcon_.setAttribute('icon', 'image:photo');
734 break;
735
736 case importer.ResponseId.SCANNING:
737 console.assert(!!opt_scan, 'Scan not defined, but is required.');
738
739 this.importButton_.setAttribute('title', str(
740 'CLOUD_IMPORT_TOOLTIP_SCANNING'));
741 this.statusContent_.innerHTML = strf(
742 'CLOUD_IMPORT_STATUS_SCANNING',
743 opt_scan.getFileEntries().length);
744
745 this.importButton_.disabled = true;
746 this.detailsButton_.disabled = true;
747 this.detailsImportButton_.disabled = true;
748
749 this.importButton_.hidden = false;
750 this.detailsButton_.hidden = false;
751 this.detailsImportButton_.hidden = true;
752
753 this.toolbarIcon_.setAttribute('icon', 'autorenew');
754 this.statusIcon_.setAttribute('icon', 'autorenew');
755 break;
756
757 default:
758 assertNotReached('Unrecognized response id: ' + responseId);
759 }
668 }; 760 };
669 761
670 /** 762 /**
671 * A cache for ScanResults. 763 * A cache for ScanResults.
672 * 764 *
673 * @constructor 765 * @constructor
674 * @struct 766 * @struct
675 * 767 *
676 * @param {!importer.ControllerEnvironment} environment 768 * @param {!importer.ControllerEnvironment} environment
677 * @param {!importer.MediaScanner} scanner 769 * @param {!importer.MediaScanner} scanner
(...skipping 88 matching lines...) Expand 10 before | Expand all | Expand 10 after
766 var directory = this.environment_.getCurrentDirectory(); 858 var directory = this.environment_.getCurrentDirectory();
767 var url = directory.toURL(); 859 var url = directory.toURL();
768 var scan = this.directoryScans_[url]; 860 var scan = this.directoryScans_[url];
769 if (!scan) { 861 if (!scan) {
770 scan = this.scanner_.scan([directory]); 862 scan = this.scanner_.scan([directory]);
771 this.directoryScans_[url] = scan; 863 this.directoryScans_[url] = scan;
772 } 864 }
773 865
774 return scan; 866 return scan;
775 }; 867 };
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698