Widevine sample player
For bug 4245169 Change-Id: Ie110d5603f19cd54878d2c4506e8ffad11207f10
This commit is contained in:
@@ -0,0 +1,329 @@
|
||||
/*
|
||||
* (c)Copyright 2011 Widevine Technologies, Inc
|
||||
*/
|
||||
|
||||
package com.widevine.demo;
|
||||
|
||||
import android.app.Activity;
|
||||
import android.os.Bundle;
|
||||
import android.os.Handler;
|
||||
import android.os.Message;
|
||||
import android.widget.FrameLayout;
|
||||
import android.widget.LinearLayout;
|
||||
import android.widget.MediaController;
|
||||
import android.widget.ScrollView;
|
||||
import android.widget.TextView;
|
||||
import android.widget.Button;
|
||||
import android.view.Gravity;
|
||||
import android.view.View;
|
||||
import android.content.Context;
|
||||
|
||||
import android.media.MediaPlayer;
|
||||
import android.media.MediaPlayer.OnErrorListener;
|
||||
import android.media.MediaPlayer.OnCompletionListener;
|
||||
|
||||
public class VideoPlayerView extends Activity {
|
||||
private final static String EXIT_FULLSCREEN = "Exit Full Screen";
|
||||
private final static String FULLSCREEN = "Enter Full Screen";
|
||||
private final static String PLAY = "Play";
|
||||
private final static int REFRESH = 1;
|
||||
|
||||
private WidevineDrm drm;
|
||||
private FullScreenVideoView videoView;
|
||||
private String assetUri;
|
||||
private TextView logs;
|
||||
private ScrollView scrollView;
|
||||
private Context context;
|
||||
private ClipImageView bgImage;
|
||||
private Button playButton;
|
||||
private Button fullScreen;
|
||||
private Handler hRefresh;
|
||||
private View contentView;
|
||||
private LinearLayout main;
|
||||
private LinearLayout sidePanel;
|
||||
private boolean enteringFullScreen;
|
||||
|
||||
public void onCreate(Bundle savedInstanceState) {
|
||||
super.onCreate(savedInstanceState);
|
||||
context = this;
|
||||
contentView = createView();
|
||||
setContentView(contentView);
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void onStop() {
|
||||
if (videoView != null) {
|
||||
if (videoView.isPlaying()) {
|
||||
stopPlayback();
|
||||
}
|
||||
}
|
||||
super.onStop();
|
||||
}
|
||||
|
||||
private View createView() {
|
||||
enteringFullScreen = false;
|
||||
assetUri = this.getIntent().getStringExtra("com.widevine.demo.Path");
|
||||
|
||||
drm = new WidevineDrm(this);
|
||||
drm.logBuffer.append("Asset Uri: " + assetUri + "\n");
|
||||
drm.logBuffer.append("Drm Server: " + WidevineDrm.Settings.DRM_SERVER_URI + "\n");
|
||||
drm.logBuffer.append("Device Id: " + WidevineDrm.Settings.DEVICE_ID + "\n");
|
||||
drm.logBuffer.append("Portal Name: " + WidevineDrm.Settings.PORTAL_NAME + "\n");
|
||||
|
||||
// Set log update listener
|
||||
WidevineDrm.WidevineDrmLogEventListener drmLogListener =
|
||||
new WidevineDrm.WidevineDrmLogEventListener() {
|
||||
|
||||
public void logUpdated() {
|
||||
updateLogs();
|
||||
|
||||
}
|
||||
};
|
||||
|
||||
videoView = new FullScreenVideoView(this);
|
||||
|
||||
logs = new TextView(this);
|
||||
drm.setLogListener(drmLogListener);
|
||||
|
||||
scrollView = new ScrollView(this);
|
||||
scrollView.addView(logs);
|
||||
|
||||
// Set message handler for log events
|
||||
hRefresh = new Handler() {
|
||||
@Override
|
||||
public void handleMessage(Message msg) {
|
||||
switch (msg.what) {
|
||||
case REFRESH:
|
||||
/* Refresh UI */
|
||||
logs.setText(drm.logBuffer.toString());
|
||||
scrollView.fullScroll(ScrollView.FOCUS_DOWN);
|
||||
break;
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
updateLogs();
|
||||
|
||||
sidePanel = new LinearLayout(this);
|
||||
sidePanel.setOrientation(LinearLayout.VERTICAL);
|
||||
sidePanel.addView(scrollView, new LinearLayout.LayoutParams(300, 450));
|
||||
|
||||
LinearLayout.LayoutParams paramsSidePanel = new LinearLayout.LayoutParams(
|
||||
LinearLayout.LayoutParams.WRAP_CONTENT,
|
||||
LinearLayout.LayoutParams.WRAP_CONTENT);
|
||||
paramsSidePanel.gravity = Gravity.CENTER;
|
||||
sidePanel.addView(createButtons(), paramsSidePanel);
|
||||
|
||||
FrameLayout playerFrame = new FrameLayout(this);
|
||||
playerFrame.addView(videoView, new FrameLayout.LayoutParams(
|
||||
LinearLayout.LayoutParams.WRAP_CONTENT,
|
||||
FrameLayout.LayoutParams.MATCH_PARENT));
|
||||
|
||||
bgImage = new ClipImageView(this);
|
||||
bgImage.setBackgroundDrawable(getResources().getDrawable(R.drawable.play_shield));
|
||||
|
||||
bgImage.setOnClickListener(new View.OnClickListener() {
|
||||
public void onClick(View v) {
|
||||
startPlayback();
|
||||
|
||||
}
|
||||
});
|
||||
|
||||
fullScreen = new Button(this);
|
||||
fullScreen.setText(FULLSCREEN);
|
||||
|
||||
fullScreen.setOnClickListener(new View.OnClickListener() {
|
||||
public void onClick(View v) {
|
||||
int currentPosition = videoView.getCurrentPosition();
|
||||
videoView.setVisibility(View.INVISIBLE);
|
||||
if (fullScreen.getText().equals(FULLSCREEN)) {
|
||||
|
||||
videoView.setFullScreen(true);
|
||||
fullScreen.setText(EXIT_FULLSCREEN);
|
||||
enteringFullScreen = true;
|
||||
} else {
|
||||
videoView.setFullScreen(false);
|
||||
fullScreen.setText(FULLSCREEN);
|
||||
}
|
||||
videoView.setVisibility(View.VISIBLE);
|
||||
|
||||
stopPlayback();
|
||||
startPlayback();
|
||||
try {
|
||||
Thread.sleep(100);
|
||||
} catch (InterruptedException e) {
|
||||
}
|
||||
videoView.seekTo(currentPosition);
|
||||
}
|
||||
});
|
||||
playerFrame.addView(fullScreen, new FrameLayout.LayoutParams(
|
||||
FrameLayout.LayoutParams.WRAP_CONTENT,
|
||||
FrameLayout.LayoutParams.WRAP_CONTENT));
|
||||
fullScreen.setVisibility(View.INVISIBLE);
|
||||
playerFrame.addView(bgImage, new FrameLayout.LayoutParams(
|
||||
FrameLayout.LayoutParams.WRAP_CONTENT,
|
||||
FrameLayout.LayoutParams.WRAP_CONTENT));
|
||||
|
||||
main = new LinearLayout(this);
|
||||
main.addView(playerFrame, new LinearLayout.LayoutParams(900,
|
||||
LinearLayout.LayoutParams.FILL_PARENT, 1));
|
||||
main.addView(sidePanel, new LinearLayout.LayoutParams(
|
||||
LinearLayout.LayoutParams.WRAP_CONTENT,
|
||||
LinearLayout.LayoutParams.FILL_PARENT, 3));
|
||||
|
||||
return main;
|
||||
}
|
||||
|
||||
private void startPlayback() {
|
||||
playButton.setText(R.string.stop);
|
||||
|
||||
bgImage.setVisibility(View.GONE);
|
||||
|
||||
videoView.setVideoPath(assetUri);
|
||||
videoView.setMediaController(new MediaController(context));
|
||||
|
||||
videoView.setOnErrorListener(new OnErrorListener() {
|
||||
public boolean onError(MediaPlayer mp, int what, int extra) {
|
||||
String message = "Unknown error";
|
||||
switch (what) {
|
||||
case MediaPlayer.MEDIA_ERROR_UNKNOWN:
|
||||
message = "Unable to play media";
|
||||
break;
|
||||
case MediaPlayer.MEDIA_ERROR_SERVER_DIED:
|
||||
message = "Server failed";
|
||||
break;
|
||||
case MediaPlayer.MEDIA_ERROR_NOT_VALID_FOR_PROGRESSIVE_PLAYBACK:
|
||||
message = "Invalid media";
|
||||
break;
|
||||
}
|
||||
drm.logBuffer.append(message + "\n");
|
||||
updateLogs();
|
||||
bgImage.setVisibility(View.VISIBLE);
|
||||
return false;
|
||||
}
|
||||
});
|
||||
videoView.setOnCompletionListener(new OnCompletionListener() {
|
||||
public void onCompletion(MediaPlayer mp) {
|
||||
stopPlayback();
|
||||
}
|
||||
});
|
||||
videoView.requestFocus();
|
||||
|
||||
videoView.start();
|
||||
|
||||
if (videoView.getFullScreen()) {
|
||||
sidePanel.setVisibility(View.GONE);
|
||||
} else {
|
||||
sidePanel.setVisibility(View.VISIBLE);
|
||||
}
|
||||
|
||||
fullScreen.setVisibility(View.VISIBLE);
|
||||
videoView.setFullScreenDimensions(contentView.getRight() - contentView.getLeft(),
|
||||
contentView.getBottom() - contentView.getTop());
|
||||
}
|
||||
|
||||
private void stopPlayback() {
|
||||
playButton.setText(R.string.play);
|
||||
videoView.stopPlayback();
|
||||
fullScreen.setVisibility(View.INVISIBLE);
|
||||
bgImage.setVisibility(View.VISIBLE);
|
||||
|
||||
if (videoView.getFullScreen() && !enteringFullScreen) {
|
||||
videoView.setVisibility(View.INVISIBLE);
|
||||
videoView.setFullScreen(false);
|
||||
videoView.setVisibility(View.VISIBLE);
|
||||
sidePanel.setVisibility(View.VISIBLE);
|
||||
fullScreen.setText(FULLSCREEN);
|
||||
}
|
||||
enteringFullScreen = false;
|
||||
|
||||
}
|
||||
|
||||
private View createButtons() {
|
||||
playButton = new Button(this);
|
||||
playButton.setText(R.string.play);
|
||||
|
||||
playButton.setOnClickListener(new View.OnClickListener() {
|
||||
public void onClick(View v) {
|
||||
Button b = (Button) v;
|
||||
if (b.getText().equals(PLAY)) {
|
||||
startPlayback();
|
||||
} else {
|
||||
stopPlayback();
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
Button rightsButton = new Button(this);
|
||||
rightsButton.setText(R.string.acquire_rights);
|
||||
|
||||
rightsButton.setOnClickListener(new View.OnClickListener() {
|
||||
public void onClick(View v) {
|
||||
drm.acquireRights(assetUri);
|
||||
updateLogs();
|
||||
}
|
||||
});
|
||||
|
||||
Button removeButton = new Button(this);
|
||||
removeButton.setText(R.string.remove_rights);
|
||||
|
||||
removeButton.setOnClickListener(new View.OnClickListener() {
|
||||
public void onClick(View v) {
|
||||
drm.removeRights(assetUri);
|
||||
updateLogs();
|
||||
}
|
||||
});
|
||||
|
||||
Button checkButton = new Button(this);
|
||||
checkButton.setText(R.string.show_rights);
|
||||
|
||||
checkButton.setOnClickListener(new View.OnClickListener() {
|
||||
public void onClick(View v) {
|
||||
drm.showRights(assetUri);
|
||||
updateLogs();
|
||||
}
|
||||
});
|
||||
|
||||
Button checkConstraints = new Button(this);
|
||||
checkConstraints.setText(R.string.constraints);
|
||||
|
||||
checkConstraints.setOnClickListener(new View.OnClickListener() {
|
||||
public void onClick(View v) {
|
||||
drm.getConstraints(assetUri);
|
||||
updateLogs();
|
||||
|
||||
}
|
||||
});
|
||||
|
||||
LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(
|
||||
LinearLayout.LayoutParams.FILL_PARENT,
|
||||
LinearLayout.LayoutParams.WRAP_CONTENT, 1);
|
||||
params.setMargins(0, 0, 0, 5);
|
||||
LinearLayout buttonsLeft = new LinearLayout(this);
|
||||
|
||||
buttonsLeft.setOrientation(LinearLayout.VERTICAL);
|
||||
buttonsLeft.addView(playButton, params);
|
||||
buttonsLeft.addView(rightsButton, params);
|
||||
buttonsLeft.addView(checkConstraints, params);
|
||||
|
||||
LinearLayout buttonsRight = new LinearLayout(this);
|
||||
buttonsRight.setOrientation(LinearLayout.VERTICAL);
|
||||
buttonsRight.addView(checkButton, params);
|
||||
buttonsRight.addView(removeButton, params);
|
||||
|
||||
LinearLayout.LayoutParams paramsSides = new LinearLayout.LayoutParams(
|
||||
LinearLayout.LayoutParams.FILL_PARENT,
|
||||
LinearLayout.LayoutParams.WRAP_CONTENT, 1);
|
||||
paramsSides.gravity = Gravity.BOTTOM;
|
||||
|
||||
LinearLayout buttons = new LinearLayout(this);
|
||||
buttons.addView(buttonsLeft, paramsSides);
|
||||
buttons.addView(buttonsRight, paramsSides);
|
||||
|
||||
return buttons;
|
||||
}
|
||||
|
||||
private void updateLogs() {
|
||||
hRefresh.sendEmptyMessage(REFRESH);
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user