/*
* NWMVideoScreen.java
*
* Copyright � 1998-2011 Research In Motion Limited
*
* 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.
*
* Note: For the sake of simplicity, this sample application may not leverage
* resource bundles and resource strings. However, it is STRONGLY recommended
* that application developers make use of the localization features available
* within the BlackBerry development platform to ensure a seamless application
* experience across a variety of languages and geographies. For more information
* on localizing your application, please refer to the BlackBerry Java Development
* Environment Development Guide associated with this release.
*/
package com.rim.samples.device.nativewindowmanagerdemo;
import java.io.InputStream;
import javax.microedition.media.Player;
import net.rim.device.api.command.Command;
import net.rim.device.api.command.CommandHandler;
import net.rim.device.api.command.ReadOnlyCommandMetadata;
import net.rim.device.api.media.control.AdvancedVideoControl;
import net.rim.device.api.media.control.StreamingBufferControl;
import net.rim.device.api.system.Bitmap;
import net.rim.device.api.system.Display;
import net.rim.device.api.ui.Color;
import net.rim.device.api.ui.Field;
import net.rim.device.api.ui.component.ButtonField;
import net.rim.device.api.ui.container.AbsoluteFieldManager;
import net.rim.device.api.ui.container.ComponentCanvas;
import net.rim.device.api.ui.container.MainScreen;
import net.rim.device.api.ui.decor.BackgroundFactory;
import net.rim.device.api.ui.image.Image;
import net.rim.device.api.ui.image.ImageFactory;
/**
* MainScreen class for the Native Window Manager Demo application. This screen
* overlays functional play and pause buttons on top of a video field.
*/
public final class NWMVideoScreen extends MainScreen {
private Player _player;
private static final int VIDEO_WIDTH = 300;
private static final int VIDEO_HEIGHT = 250;
private static final int MARGIN = 40;
/**
* Creates a new NWMVideoScreen object
*/
public NWMVideoScreen() {
setTitle("Native Window Manager Demo");
final int displayWidth = Display.getWidth();
final int displayHeight = Display.getHeight();
// Add an AbsoluteFieldManager to contain a video field
final AbsoluteFieldManager absoluteFieldManager =
new AbsoluteFieldManager();
absoluteFieldManager.setBackground(BackgroundFactory
.createSolidBackground(Color.KHAKI));
add(absoluteFieldManager);
// Set up video field
final Field videoField = initializeVideo();
if (videoField != null) {
// Calculate position of video field and add to manager
final int videoFieldX = (displayWidth - VIDEO_WIDTH) / 2;
final int videoFieldY = (displayHeight - VIDEO_HEIGHT) / 2;
absoluteFieldManager.add(videoField, videoFieldX, videoFieldY);
// Create a ComponentCanvas for overlaying fields on the video
final ComponentCanvas componentCanvas =
new ComponentCanvas(VIDEO_WIDTH + MARGIN, VIDEO_HEIGHT
+ MARGIN);
// Calculate the position of the ComponentCanvas
// and add to the manager.
final int canvasX = (displayWidth - (VIDEO_WIDTH + MARGIN)) / 2;
final int canvasY = (displayHeight - (VIDEO_HEIGHT + MARGIN)) / 2;
absoluteFieldManager.add(componentCanvas, canvasX, canvasY);
// Button for pausing the video
final ButtonField pauseButton =
new ButtonField("Pause", ButtonField.CONSUME_CLICK
| ButtonField.NEVER_DIRTY);
pauseButton.setCommand(new Command(new CommandHandler() {
public void execute(final ReadOnlyCommandMetadata metadata,
final Object object) {
// Pause the video
try {
_player.stop();
} catch (final Exception e) {
NWMDemo.errorDialog(e.toString());
}
}
}));
final Image pauseImage =
ImageFactory.createImage(Bitmap
.getBitmapResource("pause.png"));
pauseButton.setImage(pauseImage);
componentCanvas.add(pauseButton, 0, VIDEO_HEIGHT - 15);
// Button to start/re-start the video
final ButtonField playButton =
new ButtonField("Play", ButtonField.CONSUME_CLICK
| ButtonField.NEVER_DIRTY);
playButton.setCommand(new Command(new CommandHandler() {
public void execute(final ReadOnlyCommandMetadata metadata,
final Object object) {
// Start the video
try {
_player.start();
} catch (final Exception e) {
NWMDemo.errorDialog(e.toString());
}
}
}));
final Image playImage =
ImageFactory.createImage(Bitmap
.getBitmapResource("play.png"));
playButton.setImage(playImage);
componentCanvas
.add(playButton, VIDEO_WIDTH - 80, VIDEO_HEIGHT - 15);
}
}
/**
* Creates a Player and returns a Field object containing an
* AdvancedVideoControl
*
* @return A UI Field object containing an AdvancedVideoControl
*/
private Field initializeVideo() {
Field videoField = null;
try {
// Create player from input stream
final InputStream is =
getClass().getResourceAsStream("/media/BlackBerry.mp4");
_player =
javax.microedition.media.Manager.createPlayer(is,
"video/mp4");
// Realize the player
_player.realize();
// Cause playback to begin as soon as possible
// once start()is called on the Player.
final StreamingBufferControl sbc =
(StreamingBufferControl) _player
.getControl("net.rim.device.api.media.control.StreamingBufferControl");
sbc.setBufferTime(0);
// Obtain video control
final AdvancedVideoControl vControl =
(AdvancedVideoControl) _player
.getControl("net.rim.device.api.media.control.AdvancedVideoControl");
// Initialize the video control and get the video field
videoField =
(Field) vControl.initDisplayMode(
AdvancedVideoControl.USE_GUI_ADVANCED,
"net.rim.device.api.ui.Field");
// Set the video to be a size other than full screen.
// This must be done after calling initDisplayMode().
vControl.setDisplaySize(VIDEO_WIDTH, VIDEO_HEIGHT);
vControl.setVisible(true);
} catch (final Exception e) {
NWMDemo.errorDialog(e.toString());
}
return videoField;
}
/**
* @see net.rim.device.api.ui.Screen#close()
*/
public void close() {
if (_player != null) {
_player.close();
}
super.close();
}
}