blob: 3f79f8fcac530bbc3b7f98c6d0a6b713a15f39d2 [file] [log] [blame]
/*
* Copyright 2011 Google Inc.
*
* Licensed under the Apache License, Version 2.0 (the "License"); you may not
* use this file except in compliance with the License. You may obtain a copy of
* the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
* License for the specific language governing permissions and limitations under
* the License.
*/
package com.google.gwt.dom.client;
import com.google.gwt.media.dom.client.MediaError;
import com.google.gwt.media.dom.client.TimeRanges;
/**
* Common superclass for Audio and Video elements.
*
* See {@link <a href="http://www.w3.org/TR/html5/video.html">W3C HTML5 Video and Audio</a>}
*/
public class MediaElement extends Element {
/**
* Constant returned from {@link #canPlayType(String)}.
*/
public static final String CAN_PLAY_PROBABLY = "probably";
/**
* Constant returned from {@link #canPlayType(String)}.
*/
public static final String CAN_PLAY_MAYBE = "maybe";
/**
* Constant returned from {@link #canPlayType(String)}.
*/
public static final String CANNOT_PLAY = "";
/**
* Constant returned from {@link #getReadyState()}.
*/
public static final int HAVE_NOTHING = 0;
/**
* Constant returned from {@link #getReadyState()}.
*/
public static final int HAVE_METADATA = 1;
/**
* Constant returned from {@link #getReadyState()}.
*/
public static final int HAVE_CURRENT_DATA = 2;
/**
* Constant returned from {@link #getReadyState()}.
*/
public static final int HAVE_FUTURE_DATA = 3;
/**
* Constant returned from {@link #getReadyState()}.
*/
public static final int HAVE_ENOUGH_DATA = 4;
/**
* Constant returned from {@link #getNetworkState}.
*/
public static final int NETWORK_EMPTY = 0;
/**
* Constant returned from {@link #getNetworkState}.
*/
public static final int NETWORK_IDLE = 1;
/**
* Constant returned from {@link #getNetworkState}.
*/
public static final int NETWORK_LOADING = 2;
/**
* Constant returned from {@link #getNetworkState}.
*/
public static final int NETWORK_NO_SOURCE = 3;
/**
* Constant used by {@link #getPreload()} and {@link #setPreload(String)}.
*/
public static final String PRELOAD_AUTO = "auto";
/**
* Constant used by {@link #getPreload()} and {@link #setPreload(String)}.
*/
public static final String PRELOAD_METADATA = "metadata";
/**
* Constant used by {@link #getPreload()} and {@link #setPreload(String)}.
*/
public static final String PRELOAD_NONE = "none";
protected MediaElement() {
}
/**
* Returns {@code true} if the native player is capable of playing content of
* the given MIME type.
*
* @param type a String representing a MIME type
* @return one of {@link #CAN_PLAY_PROBABLY}, {@link #CAN_PLAY_MAYBE}, or
* {@link #CANNOT_PLAY}
*/
public final native String canPlayType(String type) /*-{
var canPlayType = this.canPlayType(type);
// Some browsers report "no" instead of the empty string.
// See http://gwt-voices.appspot.com/
return canPlayType == "no" ?
@com.google.gwt.dom.client.MediaElement::CANNOT_PLAY : canPlayType;
}-*/;
/**
* Returns a {@link TimeRanges} object indicating which portions of the
* source have been buffered locally.
*
* @return a {@link TimeRanges} instance, or {@code null}.
*/
public final native TimeRanges getBuffered() /*-{
return this.buffered;
}-*/;
/**
* Returns the URL of the current media source, or the empty String
* if no source is set.
*
* @return a String URL
*/
public final native String getCurrentSrc() /*-{
return this.currentSrc;
}-*/;
/**
* Returns the current time within the source media stream.
*
* @return the time, in seconds, as a double
*
* @see #setCurrentTime(double)
*/
public final native double getCurrentTime() /*-{
return this.currentTime;
}-*/;
/**
* Returns the default playback rate, where 1.0 corresponds to normal
* playback. If no rate has been set, 1.0 is returned.
*
* @return the current default playback rate, or 1.0 if it has not been set
*
* @see #setDefaultPlaybackRate(double)
*/
public final double getDefaultPlaybackRate() {
return getDoubleAttr("defaultPlaybackRate", 1.0);
}
/**
* Returns the duration of the source media stream, in seconds. If the
* duration is unknown, {@link Double#NaN} is returned. For unbounded media
* streams, {@link Double#POSITIVE_INFINITY} is returned.
*
* @return a positive duration in seconds, NaN, or Infinity
*/
public final native double getDuration() /*-{
return this.duration;
}-*/;
/**
* Returns the type of error that has occurred while attempting to load
* and play the media. If no error has occurred, {@code null} is returned.
*
* @return a {@link MediaError} instance, or {@code null}
*/
public final native MediaError getError() /*-{
return this.error || null;
}-*/;
/**
* Returns the time to which the media stream was seeked at the time it was
* loaded, in seconds, or 0.0 if the position is unknown.
*
* @return the initial time, or 0.0 if unknown
*/
public final double getInitialTime() {
return getDoubleAttr("initialTime", 0.0);
}
/**
* Returns the network state, one of {@link #NETWORK_EMPTY},
* {@link #NETWORK_IDLE}, {@link #NETWORK_LOADING}, or
* {@link #NETWORK_NO_SOURCE}.
*
* @return an integer constant indicating the network state
*
* @see #NETWORK_EMPTY
* @see #NETWORK_IDLE
* @see #NETWORK_LOADING
* @see #NETWORK_NO_SOURCE
*/
public final native int getNetworkState() /*-{
return this.networkState;
}-*/;
/**
* Returns the playback rate, where 1.0 corresponds to normal
* playback. If the rate has not been set, 1.0 is returned.
*
* @return the playback rate, if known, otherwise 1.0
*
* @see #setPlaybackRate(double)
*/
public final native double getPlaybackRate() /*-{
var rate = this.playbackRate;
if (rate != null && typeof(rate) == 'number') {
return rate;
}
return 1.0;
}-*/;
/**
* Returns a {@link TimeRanges} object indicating which portions of the
* source have been played.
*
* @return a {@link TimeRanges} instance, or {@code null}.
*/
public final native TimeRanges getPlayed() /*-{
return this.played;
}-*/;
/**
* Returns the preload setting, one of {@link #PRELOAD_AUTO},
* {@link #PRELOAD_METADATA}, or {@link #PRELOAD_NONE}.
*
* @return the preload setting
*
* @see #setPreload(String)
* @see #PRELOAD_AUTO
* @see #PRELOAD_METADATA
* @see #PRELOAD_NONE
*/
public final native String getPreload() /*-{
return this.preload;
}-*/;
/**
* Returns the current state of the media with respect to rendering the
* current playback position, as one of the constants
* {@link #HAVE_CURRENT_DATA}, {@link #HAVE_ENOUGH_DATA},
* {@link #HAVE_FUTURE_DATA}, {@link #HAVE_METADATA}, or {@link #HAVE_NOTHING}
* .
*
* @return an integer constant indicating the ready state
*
* @see #HAVE_CURRENT_DATA
* @see #HAVE_ENOUGH_DATA
* @see #HAVE_FUTURE_DATA
* @see #HAVE_METADATA
* @see #HAVE_NOTHING
*/
public final native int getReadyState() /*-{
return this.readyState;
}-*/;
/**
* Returns a {@link TimeRanges} object indicating which portions of the
* source are seekable.
*
* @return a {@link TimeRanges} instance, or {@code null}.
*/
public final native TimeRanges getSeekable() /*-{
return this.seekable;
}-*/;
/**
* Returns the source URL for the media, or {@code null} if none is set.
*
* @return a String URL or {@code null}
*
* @see #setSrc(String)
*/
public final native String getSrc() /*-{
return this.getAttribute('src');
}-*/;
/**
* Returns the time corresponding to the zero time in the media timeline,
* measured in seconds since midnight, January 1 1970 UTC, or
* {@link Double#NaN} if none is specified.
*
* @return the start time
*/
public final double getStartOffsetTime() {
return getDoubleAttr("startOffsetTime", Double.NaN);
}
/**
* Returns the current audio volume setting for the media, as a number
* between 0.0 and 1.0.
*
* @return a number between 0.0 (silent) and 1.0 (loudest)
*
* @see #setVolume(double)
*/
public final native double getVolume() /*-{
return this.volume;
}-*/;
/**
* Returns {@code true} if the media player should display interactive
* controls (for example, to control play/pause, seek position, and volume),
* {@code false} otherwise.
*
* @return whether controls should be displayed
*
* @see #setControls(boolean)
*/
public final native boolean hasControls() /*-{
return this.hasAttribute('controls');
}-*/;
/**
* Returns {@code true} if playback has reached the end of the media, {@code
* false} otherwise.
*
* @return whether playback has ended
*/
public final native boolean hasEnded() /*-{
return this.ended;
}-*/;
/**
* Returns {@code true} if autoplay is enabled, {@code false} otherwise. When
* autoplay is enabled, the user agent will begin playback automatically as
* soon as it can do so without stopping.
*
* @return the autoplay setting
*
* @see #setAutoplay(boolean)
*/
public final native boolean isAutoplay() /*-{
return this.hasAttribute('autoplay');
}-*/;
/**
* Returns {@code true} if the user agent is to seek back to the start of the
* media once playing has ended, {@code false} otherwise.
*
* @return the loop setting
*
* @see #setLoop(boolean)
*/
public final native boolean isLoop() /*-{
return this.hasAttribute('loop');
}-*/;
/**
* Returns {@code true} if the volume is to be muted (overriding the normal
* volume setting), {@code false} otherwise.
*
* @return the muting setting
*
* @see #setMuted(boolean)
* @see #getVolume()
* @see #setVolume(double)
*/
public final native boolean isMuted() /*-{
return !!this.muted;
}-*/;
/**
* Returns {@code true} if playback is paused, {@code false} otherwise.
*
* @return the paused setting
*
* @see #pause()
* @see #play()
*/
public final native boolean isPaused() /*-{
return !!this.paused;
}-*/;
/**
* Returns {@code true} if the playback position is in the process of changing
* discontinuously, e.g., by use of the interactive controls, {@code false}
* otherwise.
*
* @return the seeking status
*
* @see #setControls(boolean)
* @see #hasControls()
*/
public final native boolean isSeeking() /*-{
return !!this.seeking;
}-*/;
/**
* Causes the resource to be loaded.
*/
public final native void load() /*-{
this.load();
}-*/;
/**
* Causes playback of the resource to be paused.
*/
public final native void pause() /*-{
this.pause();
}-*/;
/**
* Causes playback of the resource to be started or resumed.
*/
public final native void play() /*-{
this.play();
}-*/;
/**
* Enables or disables autoplay of the resource.
*
* @param autoplay if {@code true}, enable autoplay
*
* @see #isAutoplay()
*/
public final void setAutoplay(boolean autoplay) {
setBooleanAttr("autoplay", autoplay);
}
/**
* Enables or disables interactive controls.
*
* @param controls if {@code true}, enable controls
*
* @see #hasControls()
*/
public final void setControls(boolean controls) {
setBooleanAttr("controls", controls);
}
/**
* Sets the current playback time within the media stream, in seconds.
*
* @param time a number within the ranges given by {@link #getSeekable()}
*
* @see #getCurrentTime()
*/
public final native void setCurrentTime(double time) /*-{
this.currentTime = time;
}-*/;
/**
* Sets the default playback rate.
*
* @param rate a double value
*
* @see #getDefaultPlaybackRate()
*/
public final native void setDefaultPlaybackRate(double rate) /*-{
this.defaultPlaybackRate = rate;
}-*/;
/**
* Enables or disables looping.
*
* @param loop if {@code true}, enable looping
*
* @see #isLoop()
*/
public final void setLoop(boolean loop) {
setBooleanAttr("loop", loop);
}
/**
* Enables or disables muting.
*
* @param muted if {@code true}, enable muting
*
* @see #isMuted()
*/
public final native void setMuted(boolean muted) /*-{
this.muted = muted;
}-*/;
/**
* Sets the playback rate.
*
* @param rate a double value
*
* @see #getPlaybackRate()
*/
public final native void setPlaybackRate(double rate) /*-{
this.playbackRate = rate;
}-*/;
/**
* Changes the preload setting to one of {@link #PRELOAD_AUTO},
* {@link #PRELOAD_METADATA}, or {@link #PRELOAD_NONE}.
*
* @param preload a String constants
*
* @see #getPreload()
* @see #setPreload(String)
* @see #PRELOAD_AUTO
* @see #PRELOAD_METADATA
* @see #PRELOAD_NONE
*/
public final native void setPreload(String preload) /*-{
this.preload = preload;
}-*/;
/**
* Sets the source URL for the media.
*
* @param url a String URL
*
* @see #getSrc()
*/
public final native void setSrc(String url) /*-{
this.src = url;
}-*/;
/**
* Sets the playback volume.
*
* @param volume a value between 0.0 (silent) and 1.0 (loudest)
*
* @see #getVolume()
*/
public final native void setVolume(double volume) /*-{
this.volume = volume
}-*/;
private native double getDoubleAttr(String name, double def) /*-{
var value = this.getAttribute(name);
if (value == null || typeof(value) == 'undefined') {
return def;
}
return value;
}-*/;
private void setBooleanAttr(String name, boolean value) {
if (value) {
setAttribute(name, "");
} else {
removeAttribute(name);
}
}
}