Index: ui/file_manager/audio_player/elements/audio_player.js |
diff --git a/ui/file_manager/audio_player/elements/audio_player.js b/ui/file_manager/audio_player/elements/audio_player.js |
index 979dc719d6e1c2bd3e7d9f6bad0a919a3edccc64..c2aa4220085438149181b733df142048edc8057b 100644 |
--- a/ui/file_manager/audio_player/elements/audio_player.js |
+++ b/ui/file_manager/audio_player/elements/audio_player.js |
@@ -9,46 +9,139 @@ |
var AudioPlayerElement = function() {}; |
AudioPlayerElement.prototype = { |
+ is: 'audio-player', |
+ |
// Child Elements |
- audioController: null, |
audioElement: null, |
trackList: null, |
- // Published values |
- playing: true, |
- currenttrackurl: '', |
- playcount: 0, |
- |
- // Attributes of the element (lower characters only). |
- // These values must be used only to data binding and shouldn't be assigned |
- // any value nowhere except in the handler. |
- publish: { |
+ properties: { |
+ /** |
+ * Flag whether the audio is playing or paused. True if playing, or false |
+ * paused. |
+ */ |
playing: { |
- value: true, |
- reflect: true |
+ type: Boolean, |
+ observer: 'playingChanged', |
+ reflectToAttribute: true |
+ }, |
+ |
+ /** |
+ * Current elapsed time in the current music in millisecond. |
+ */ |
+ time: { |
+ type: Number, |
+ observer: 'timeChanged' |
+ }, |
+ |
+ /** |
+ * Whether the shuffle button is ON. |
+ */ |
+ shuffle: { |
+ type: Boolean, |
+ observer: 'shuffleChanged' |
+ }, |
+ |
+ /** |
+ * Whether the repeat button is ON. |
+ */ |
+ repeat: { |
+ type: Boolean, |
+ observer: 'repeatChanged' |
+ }, |
+ |
+ /** |
+ * The audio volume. 0 is silent, and 100 is maximum loud. |
+ */ |
+ volume: { |
+ type: Number, |
+ observer: 'volumeChanged' |
+ }, |
+ |
+ /** |
+ * Whether the expanded button is ON. |
+ */ |
+ expanded: { |
+ type: Boolean, |
+ observer: 'expandedChanged' |
+ }, |
+ |
+ /** |
+ * Track index of the current track. |
+ */ |
+ currentTrackIndex: { |
+ type: Number, |
+ observer: 'currentTrackIndexChanged' |
+ }, |
+ |
+ /** |
+ * Model object of the Audio Player. |
+ * @type {AudioPlayerModel} |
+ */ |
+ model: { |
+ type: Object, |
+ observer: 'modelChanged' |
}, |
+ |
+ /** |
+ * URL of the current track. (exposed publicly for tests) |
+ */ |
currenttrackurl: { |
+ type: String, |
value: '', |
- reflect: true |
+ reflectToAttribute: true |
}, |
+ |
+ /** |
+ * The number of played tracks. (exposed publicly for tests) |
+ */ |
playcount: { |
+ type: Number, |
value: 0, |
- reflect: true |
+ reflectToAttribute: true |
} |
}, |
/** |
- * Model object of the Audio Player. |
- * @type {AudioPlayerModel} |
+ * Handles change event for shuffle mode. |
+ * @param {boolean} shuffle |
+ */ |
+ shuffleChanged: function(shuffle) { |
+ if (this.model) |
+ this.model.shuffle = shuffle; |
+ }, |
+ |
+ /** |
+ * Handles change event for repeat mode. |
+ * @param {boolean} repeat |
*/ |
- model: null, |
+ repeatChanged: function(repeat) { |
+ if (this.model) |
+ this.model.repeat = repeat; |
+ }, |
+ |
+ /** |
+ * Handles change event for audio volume. |
+ * @param {boolean} volume |
+ */ |
+ volumeChanged: function(volume) { |
+ if (this.model) |
+ this.model.volume = volume; |
+ }, |
+ |
+ /** |
+ * Handles change event for expanded state of track list. |
+ */ |
+ expandedChanged: function(expanded) { |
+ if (this.model) |
+ this.model.expanded = expanded; |
+ }, |
/** |
* Initializes an element. This method is called automatically when the |
* element is ready. |
*/ |
ready: function() { |
- this.audioController = this.$.audioController; |
this.audioElement = this.$.audio; |
this.trackList = this.$.trackList; |
@@ -71,21 +164,14 @@ AudioPlayerElement.prototype = { |
}, |
/** |
- * Registers handlers for changing of external variables |
- */ |
- observe: { |
- 'trackList.currentTrackIndex': 'onCurrentTrackIndexChanged', |
- 'audioController.playing': 'onControllerPlayingChanged', |
- 'audioController.time': 'onControllerTimeChanged', |
- 'model.volume': 'onVolumeChanged', |
- }, |
- |
- /** |
* Invoked when trackList.currentTrackIndex is changed. |
- * @param {number} oldValue old value. |
* @param {number} newValue new value. |
+ * @param {number} oldValue old value. |
*/ |
- onCurrentTrackIndexChanged: function(oldValue, newValue) { |
+ currentTrackIndexChanged: function(newValue, oldValue) { |
+ if (!this.trackList) |
+ return; |
+ |
var currentTrackUrl = ''; |
if (oldValue != newValue) { |
@@ -93,7 +179,7 @@ AudioPlayerElement.prototype = { |
if (currentTrack && currentTrack.url != this.audioElement.src) { |
this.audioElement.src = currentTrack.url; |
currentTrackUrl = this.audioElement.src; |
- if (this.audioController.playing) |
+ if (this.playing) |
this.audioElement.play(); |
} |
} |
@@ -103,13 +189,11 @@ AudioPlayerElement.prototype = { |
}, |
/** |
- * Invoked when audioController.playing is changed. |
- * @param {boolean} oldValue old value. |
+ * Invoked when playing is changed. |
* @param {boolean} newValue new value. |
+ * @param {boolean} oldValue old value. |
*/ |
- onControllerPlayingChanged: function(oldValue, newValue) { |
- this.playing = newValue; |
- |
+ playingChanged: function(newValue, oldValue) { |
if (newValue) { |
if (!this.audioElement.src) { |
var currentTrack = this.trackList.getCurrentTrack(); |
@@ -133,39 +217,32 @@ AudioPlayerElement.prototype = { |
}, |
/** |
- * Invoked when audioController.volume is changed. |
- * @param {number} oldValue old value. |
- * @param {number} newValue new value. |
- */ |
- onVolumeChanged: function(oldValue, newValue) { |
- this.audioElement.volume = newValue / 100; |
- }, |
- |
- /** |
* Invoked when the model changed. |
- * @param {AudioPlayerModel} oldValue Old Value. |
- * @param {AudioPlayerModel} newValue New Value. |
+ * @param {AudioPlayerModel} newModel New model. |
+ * @param {AudioPlayerModel} oldModel Old model. |
*/ |
- modelChanged: function(oldValue, newValue) { |
- this.trackList.model = newValue; |
- this.audioController.model = newValue; |
- |
- // Invoke the handler manually. |
- this.onVolumeChanged(0, newValue.volume); |
+ modelChanged: function(newModel, oldModel) { |
+ // Setting up the UI |
+ if (newModel !== oldModel && newModel) { |
+ this.shuffle = newModel.shuffle; |
+ this.repeat = newModel.repeat; |
+ this.volume = newModel.volume; |
+ this.expanded = newModel.expanded; |
+ } |
}, |
/** |
- * Invoked when audioController.time is changed. |
- * @param {number} oldValue old time (in ms). |
+ * Invoked when time is changed. |
* @param {number} newValue new time (in ms). |
+ * @param {number} oldValue old time (in ms). |
*/ |
- onControllerTimeChanged: function(oldValue, newValue) { |
+ timeChanged: function(newValue, oldValue) { |
// Ignores updates from the audio element. |
if (this.lastAudioUpdateTime_ === newValue) |
return; |
- if (this.audioElement.readyState !== 0) |
- this.audioElement.currentTime = this.audioController.time / 1000; |
+ if (this.audioElement && this.audioElement.readyState !== 0) |
+ this.audioElement.currentTime = this.time / 1000; |
}, |
/** |
@@ -190,7 +267,7 @@ AudioPlayerElement.prototype = { |
*/ |
onAudioEnded: function() { |
this.playcount++; |
- this.advance_(true /* forward */, this.model.repeat); |
+ this.advance_(true /* forward */, this.repeat); |
}, |
/** |
@@ -198,7 +275,7 @@ AudioPlayerElement.prototype = { |
* This handler is registered in this.ready(). |
*/ |
onAudioError: function() { |
- this.scheduleAutoAdvance_(true /* forward */, this.model.repeat); |
+ this.scheduleAutoAdvance_(true /* forward */, this.repeat); |
}, |
/** |
@@ -207,10 +284,10 @@ AudioPlayerElement.prototype = { |
* @private |
*/ |
onAudioStatusUpdate_: function() { |
- this.audioController.time = |
+ this.time = |
(this.lastAudioUpdateTime_ = this.audioElement.currentTime * 1000); |
- this.audioController.duration = this.audioElement.duration * 1000; |
- this.audioController.playing = !this.audioElement.paused; |
+ this.duration = this.audioElement.duration * 1000; |
+ this.playing = !this.audioElement.paused; |
}, |
/** |
@@ -221,7 +298,7 @@ AudioPlayerElement.prototype = { |
// Changes the current time back to the beginning, regardless of the current |
// status (playing or paused). |
this.audioElement.currentTime = 0; |
- this.audioController.time = 0; |
+ this.time = 0; |
}, |
/** |
@@ -237,7 +314,7 @@ AudioPlayerElement.prototype = { |
var isNextTrackAvailable = |
(this.trackList.getNextTrackIndex(forward, repeat) !== -1); |
- this.audioController.playing = isNextTrackAvailable; |
+ this.playing = isNextTrackAvailable; |
// If there is only a single file in the list, 'currentTrackInde' is not |
// changed and the handler is not invoked. Instead, plays here. |
@@ -303,19 +380,6 @@ AudioPlayerElement.prototype = { |
}, |
/** |
- * The index of the current track. |
- * If the list has no tracks, the value must be -1. |
- * |
- * @type {number} |
- */ |
- get currentTrackIndex() { |
- return this.trackList.currentTrackIndex; |
- }, |
- set currentTrackIndex(value) { |
- this.trackList.currentTrackIndex = value; |
- }, |
- |
- /** |
* The list of the tracks in the playlist. |
* |
* When it changed, current operation including playback is stopped and |
@@ -354,27 +418,26 @@ AudioPlayerElement.prototype = { |
onKeyDown_: function(event) { |
switch (event.keyIdentifier) { |
case 'Up': |
- if (this.audioController.volumeSliderShown && this.model.volume < 100) |
+ if (this.$.audioController.volumeSliderShown && this.model.volume < 100) |
this.model.volume += 1; |
break; |
case 'Down': |
- if (this.audioController.volumeSliderShown && this.model.volume > 0) |
+ if (this.$.audioController.volumeSliderShown && this.model.volume > 0) |
this.model.volume -= 1; |
break; |
case 'PageUp': |
- if (this.audioController.volumeSliderShown && this.model.volume < 91) |
+ if (this.$.audioController.volumeSliderShown && this.model.volume < 91) |
this.model.volume += 10; |
break; |
case 'PageDown': |
- if (this.audioController.volumeSliderShown && this.model.volume > 9) |
+ if (this.$.audioController.volumeSliderShown && this.model.volume > 9) |
this.model.volume -= 10; |
break; |
case 'MediaNextTrack': |
this.onControllerNextClicked(); |
break; |
case 'MediaPlayPause': |
- var playing = this.audioController.playing; |
- this.onControllerPlayingChanged(playing, !playing); |
+ this.playing = !this.playing; |
break; |
case 'MediaPreviousTrack': |
this.onControllerPreviousClicked(); |
@@ -384,6 +447,15 @@ AudioPlayerElement.prototype = { |
break; |
} |
}, |
+ |
+ /** |
+ * Computes volume value for audio element. (should be in [0.0, 1.0]) |
+ * @param {number} volume Volume which is set in the UI. ([0, 100]) |
+ * @return {number} |
+ */ |
+ computeAudioVolume_: function(volume) { |
+ return volume / 100; |
+ } |
}; |
-Polymer('audio-player', AudioPlayerElement.prototype); |
+Polymer(AudioPlayerElement.prototype); |