Index: ui/file_manager/file_manager/audio_player/js/audio_player.js |
diff --git a/ui/file_manager/file_manager/audio_player/js/audio_player.js b/ui/file_manager/file_manager/audio_player/js/audio_player.js |
deleted file mode 100644 |
index a9a053f821d1653ef8b729c7fe46292828adf1a6..0000000000000000000000000000000000000000 |
--- a/ui/file_manager/file_manager/audio_player/js/audio_player.js |
+++ /dev/null |
@@ -1,429 +0,0 @@ |
-// Copyright (c) 2012 The Chromium Authors. All rights reserved. |
-// Use of this source code is governed by a BSD-style license that can be |
-// found in the LICENSE file. |
- |
-'use strict'; |
- |
-/** |
- * @param {HTMLElement} container Container element. |
- * @constructor |
- */ |
-function AudioPlayer(container) { |
- this.container_ = container; |
- this.volumeManager_ = new VolumeManagerWrapper( |
- VolumeManagerWrapper.DriveEnabledStatus.DRIVE_ENABLED); |
- this.metadataCache_ = MetadataCache.createFull(this.volumeManager_); |
- this.selectedEntry_ = null; |
- |
- this.model_ = new AudioPlayerModel(); |
- var observer = new PathObserver(this.model_, 'expanded'); |
- observer.open(function(newValue, oldValue) { |
- // Inverse arguments intentionally to match the Polymer way. |
- this.onModelExpandedChanged(oldValue, newValue); |
- }.bind(this)); |
- |
- this.entries_ = []; |
- this.currentTrackIndex_ = -1; |
- this.playlistGeneration_ = 0; |
- |
- /** |
- * Whether if the playlist is expanded or not. This value is changed by |
- * this.syncExpanded(). |
- * True: expanded, false: collapsed, null: unset. |
- * |
- * @type {?boolean} |
- * @private |
- */ |
- this.isExpanded_ = null; // Initial value is null. It'll be set in load(). |
- |
- this.player_ = document.querySelector('audio-player'); |
- // TODO(yoshiki): Move tracks into the model. |
- this.player_.tracks = []; |
- this.player_.model = this.model_; |
- Platform.performMicrotaskCheckpoint(); |
- |
- this.errorString_ = ''; |
- this.offlineString_ = ''; |
- chrome.fileManagerPrivate.getStrings(function(strings) { |
- container.ownerDocument.title = strings['AUDIO_PLAYER_TITLE']; |
- this.errorString_ = strings['AUDIO_ERROR']; |
- this.offlineString_ = strings['AUDIO_OFFLINE']; |
- AudioPlayer.TrackInfo.DEFAULT_ARTIST = |
- strings['AUDIO_PLAYER_DEFAULT_ARTIST']; |
- }.bind(this)); |
- |
- this.volumeManager_.addEventListener('externally-unmounted', |
- this.onExternallyUnmounted_.bind(this)); |
- |
- window.addEventListener('resize', this.onResize_.bind(this)); |
- |
- // Show the window after DOM is processed. |
- var currentWindow = chrome.app.window.current(); |
- if (currentWindow) |
- setTimeout(currentWindow.show.bind(currentWindow), 0); |
-} |
- |
-/** |
- * Initial load method (static). |
- */ |
-AudioPlayer.load = function() { |
- document.ondragstart = function(e) { e.preventDefault() }; |
- |
- AudioPlayer.instance = |
- new AudioPlayer(document.querySelector('.audio-player')); |
- |
- reload(); |
-}; |
- |
-/** |
- * Unloads the player. |
- */ |
-function unload() { |
- if (AudioPlayer.instance) |
- AudioPlayer.instance.onUnload(); |
-} |
- |
-/** |
- * Reloads the player. |
- */ |
-function reload() { |
- AudioPlayer.instance.load(window.appState); |
-} |
- |
-/** |
- * Loads a new playlist. |
- * @param {Playlist} playlist Playlist object passed via mediaPlayerPrivate. |
- */ |
-AudioPlayer.prototype.load = function(playlist) { |
- this.playlistGeneration_++; |
- this.currentTrackIndex_ = -1; |
- |
- // Save the app state, in case of restart. Make a copy of the object, so the |
- // playlist member is not changed after entries are resolved. |
- window.appState = JSON.parse(JSON.stringify(playlist)); // cloning |
- util.saveAppState(); |
- |
- this.isExpanded_ = this.model_.expanded; |
- |
- // Resolving entries has to be done after the volume manager is initialized. |
- this.volumeManager_.ensureInitialized(function() { |
- util.URLsToEntries(playlist.items, function(entries) { |
- this.entries_ = entries; |
- |
- var position = playlist.position || 0; |
- var time = playlist.time || 0; |
- |
- if (this.entries_.length == 0) |
- return; |
- |
- var newTracks = []; |
- var currentTracks = this.player_.tracks; |
- var unchanged = (currentTracks.length === this.entries_.length); |
- |
- for (var i = 0; i != this.entries_.length; i++) { |
- var entry = this.entries_[i]; |
- var onClick = this.select_.bind(this, i); |
- newTracks.push(new AudioPlayer.TrackInfo(entry, onClick)); |
- |
- if (unchanged && entry.toURL() !== currentTracks[i].url) |
- unchanged = false; |
- } |
- |
- if (!unchanged) { |
- this.player_.tracks = newTracks; |
- |
- // Makes it sure that the handler of the track list is called, before |
- // the handler of the track index. |
- Platform.performMicrotaskCheckpoint(); |
- } |
- |
- this.select_(position, !!time); |
- |
- // Load the selected track metadata first, then load the rest. |
- this.loadMetadata_(position); |
- for (i = 0; i != this.entries_.length; i++) { |
- if (i != position) |
- this.loadMetadata_(i); |
- } |
- }.bind(this)); |
- }.bind(this)); |
-}; |
- |
-/** |
- * Loads metadata for a track. |
- * @param {number} track Track number. |
- * @private |
- */ |
-AudioPlayer.prototype.loadMetadata_ = function(track) { |
- this.fetchMetadata_( |
- this.entries_[track], this.displayMetadata_.bind(this, track)); |
-}; |
- |
-/** |
- * Displays track's metadata. |
- * @param {number} track Track number. |
- * @param {Object} metadata Metadata object. |
- * @param {string=} opt_error Error message. |
- * @private |
- */ |
-AudioPlayer.prototype.displayMetadata_ = function(track, metadata, opt_error) { |
- this.player_.tracks[track].setMetadata(metadata, opt_error); |
-}; |
- |
-/** |
- * Closes audio player when a volume containing the selected item is unmounted. |
- * @param {Event} event The unmount event. |
- * @private |
- */ |
-AudioPlayer.prototype.onExternallyUnmounted_ = function(event) { |
- if (!this.selectedEntry_) |
- return; |
- |
- if (this.volumeManager_.getVolumeInfo(this.selectedEntry_) === |
- event.volumeInfo) |
- window.close(); |
-}; |
- |
-/** |
- * Called on window is being unloaded. |
- */ |
-AudioPlayer.prototype.onUnload = function() { |
- if (this.player_) |
- this.player_.onPageUnload(); |
- |
- if (this.volumeManager_) |
- this.volumeManager_.dispose(); |
-}; |
- |
-/** |
- * Selects a new track to play. |
- * @param {number} newTrack New track number. |
- * @param {number} time New playback position (in second). |
- * @private |
- */ |
-AudioPlayer.prototype.select_ = function(newTrack, time) { |
- if (this.currentTrackIndex_ == newTrack) return; |
- |
- this.currentTrackIndex_ = newTrack; |
- this.player_.currentTrackIndex = this.currentTrackIndex_; |
- this.player_.audioController.time = time; |
- Platform.performMicrotaskCheckpoint(); |
- |
- if (!window.appReopen) |
- this.player_.audioElement.play(); |
- |
- window.appState.position = this.currentTrackIndex_; |
- window.appState.time = 0; |
- util.saveAppState(); |
- |
- var entry = this.entries_[this.currentTrackIndex_]; |
- |
- this.fetchMetadata_(entry, function(metadata) { |
- if (this.currentTrackIndex_ != newTrack) |
- return; |
- |
- this.selectedEntry_ = entry; |
- }.bind(this)); |
-}; |
- |
-/** |
- * @param {FileEntry} entry Track file entry. |
- * @param {function(object)} callback Callback. |
- * @private |
- */ |
-AudioPlayer.prototype.fetchMetadata_ = function(entry, callback) { |
- this.metadataCache_.getOne(entry, 'thumbnail|media|external', |
- function(generation, metadata) { |
- // Do nothing if another load happened since the metadata request. |
- if (this.playlistGeneration_ == generation) |
- callback(metadata); |
- }.bind(this, this.playlistGeneration_)); |
-}; |
- |
-/** |
- * Media error handler. |
- * @private |
- */ |
-AudioPlayer.prototype.onError_ = function() { |
- var track = this.currentTrackIndex_; |
- |
- this.invalidTracks_[track] = true; |
- |
- this.fetchMetadata_( |
- this.entries_[track], |
- function(metadata) { |
- var error = (!navigator.onLine && !metadata.external.present) ? |
- this.offlineString_ : this.errorString_; |
- this.displayMetadata_(track, metadata, error); |
- this.scheduleAutoAdvance_(); |
- }.bind(this)); |
-}; |
- |
-/** |
- * Toggles the expanded mode when resizing. |
- * |
- * @param {Event} event Resize event. |
- * @private |
- */ |
-AudioPlayer.prototype.onResize_ = function(event) { |
- if (!this.isExpanded_ && |
- window.innerHeight >= AudioPlayer.EXPANDED_MODE_MIN_HEIGHT) { |
- this.isExpanded_ = true; |
- this.model_.expanded = true; |
- } else if (this.isExpanded_ && |
- window.innerHeight < AudioPlayer.EXPANDED_MODE_MIN_HEIGHT) { |
- this.isExpanded_ = false; |
- this.model_.expanded = false; |
- } |
-}; |
- |
-/* Keep the below constants in sync with the CSS. */ |
- |
-/** |
- * Window header size in pixels. |
- * @type {number} |
- * @const |
- */ |
-AudioPlayer.HEADER_HEIGHT = 33; // 32px + border 1px |
- |
-/** |
- * Track height in pixels. |
- * @type {number} |
- * @const |
- */ |
-AudioPlayer.TRACK_HEIGHT = 44; |
- |
-/** |
- * Controls bar height in pixels. |
- * @type {number} |
- * @const |
- */ |
-AudioPlayer.CONTROLS_HEIGHT = 73; // 72px + border 1px |
- |
-/** |
- * Default number of items in the expanded mode. |
- * @type {number} |
- * @const |
- */ |
-AudioPlayer.DEFAULT_EXPANDED_ITEMS = 5; |
- |
-/** |
- * Minimum size of the window in the expanded mode in pixels. |
- * @type {number} |
- * @const |
- */ |
-AudioPlayer.EXPANDED_MODE_MIN_HEIGHT = AudioPlayer.CONTROLS_HEIGHT + |
- AudioPlayer.TRACK_HEIGHT * 2; |
- |
-/** |
- * Invoked when the 'expanded' property in the model is changed. |
- * @param {boolean} oldValue Old value. |
- * @param {boolean} newValue New value. |
- */ |
-AudioPlayer.prototype.onModelExpandedChanged = function(oldValue, newValue) { |
- if (this.isExpanded_ !== null && |
- this.isExpanded_ === newValue) |
- return; |
- |
- if (this.isExpanded_ && !newValue) |
- this.lastExpandedHeight_ = window.innerHeight; |
- |
- if (this.isExpanded_ !== newValue) { |
- this.isExpanded_ = newValue; |
- this.syncHeight_(); |
- |
- // Saves new state. |
- window.appState.expanded = newValue; |
- util.saveAppState(); |
- } |
-}; |
- |
-/** |
- * @private |
- */ |
-AudioPlayer.prototype.syncHeight_ = function() { |
- var targetHeight; |
- |
- if (this.model_.expanded) { |
- // Expanded. |
- if (!this.lastExpandedHeight_ || |
- this.lastExpandedHeight_ < AudioPlayer.EXPANDED_MODE_MIN_HEIGHT) { |
- var expandedListHeight = |
- Math.min(this.entries_.length, AudioPlayer.DEFAULT_EXPANDED_ITEMS) * |
- AudioPlayer.TRACK_HEIGHT; |
- targetHeight = AudioPlayer.CONTROLS_HEIGHT + expandedListHeight; |
- this.lastExpandedHeight_ = targetHeight; |
- } else { |
- targetHeight = this.lastExpandedHeight_; |
- } |
- } else { |
- // Not expanded. |
- targetHeight = AudioPlayer.CONTROLS_HEIGHT + AudioPlayer.TRACK_HEIGHT; |
- } |
- |
- window.resizeTo(window.innerWidth, targetHeight + AudioPlayer.HEADER_HEIGHT); |
-}; |
- |
-/** |
- * Create a TrackInfo object encapsulating the information about one track. |
- * |
- * @param {fileEntry} entry FileEntry to be retrieved the track info from. |
- * @param {function} onClick Click handler. |
- * @constructor |
- */ |
-AudioPlayer.TrackInfo = function(entry, onClick) { |
- this.url = entry.toURL(); |
- this.title = this.getDefaultTitle(); |
- this.artist = this.getDefaultArtist(); |
- |
- // TODO(yoshiki): implement artwork. |
- this.artwork = null; |
- this.active = false; |
-}; |
- |
-/** |
- * @return {HTMLDivElement} The wrapper element for the track. |
- */ |
-AudioPlayer.TrackInfo.prototype.getBox = function() { return this.box_ }; |
- |
-/** |
- * @return {string} Default track title (file name extracted from the url). |
- */ |
-AudioPlayer.TrackInfo.prototype.getDefaultTitle = function() { |
- var title = this.url.split('/').pop(); |
- var dotIndex = title.lastIndexOf('.'); |
- if (dotIndex >= 0) title = title.substr(0, dotIndex); |
- title = decodeURIComponent(title); |
- return title; |
-}; |
- |
-/** |
- * TODO(kaznacheev): Localize. |
- */ |
-AudioPlayer.TrackInfo.DEFAULT_ARTIST = 'Unknown Artist'; |
- |
-/** |
- * @return {string} 'Unknown artist' string. |
- */ |
-AudioPlayer.TrackInfo.prototype.getDefaultArtist = function() { |
- return AudioPlayer.TrackInfo.DEFAULT_ARTIST; |
-}; |
- |
-/** |
- * @param {Object} metadata The metadata object. |
- * @param {string} error Error string. |
- */ |
-AudioPlayer.TrackInfo.prototype.setMetadata = function( |
- metadata, error) { |
- // TODO(yoshiki): Handle error in better way. |
- // TODO(yoshiki): implement artwork (metadata.thumbnail) |
- this.title = (metadata.media && metadata.media.title) || |
- this.getDefaultTitle(); |
- this.artist = error || |
- (metadata.media && metadata.media.artist) || this.getDefaultArtist(); |
-}; |
- |
-// Starts loading the audio player. |
-window.addEventListener('polymer-ready', function(e) { |
- AudioPlayer.load(); |
-}); |