package com.kaltura.basicplayerdemo;
import android.content.pm.ActivityInfo;
import android.content.res.Configuration;
import android.os.Build;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.webkit.WebView;
import android.widget.Button;
import android.widget.LinearLayout;
import android.widget.PopupMenu;
import android.widget.RelativeLayout;
import android.widget.SeekBar;
import com.kaltura.playersdk.KPPlayerConfig;
import com.kaltura.playersdk.PlayerViewController;
import com.kaltura.playersdk.events.KPErrorEventListener;
import com.kaltura.playersdk.events.KPPlayheadUpdateEventListener;
import com.kaltura.playersdk.events.KPStateChangedEventListener;
import com.kaltura.playersdk.events.KPlayerState;
import com.kaltura.playersdk.tracks.KTrackActions;
import com.kaltura.playersdk.tracks.TrackFormat;
import com.kaltura.playersdk.tracks.TrackType;
import com.kaltura.playersdk.types.KPError;
import java.util.Timer;
import java.util.TimerTask;
import static com.kaltura.playersdk.utils.LogUtils.LOGD;
import static com.kaltura.playersdk.utils.LogUtils.LOGE;
public class MainActivity extends AppCompatActivity implements View.OnClickListener, SeekBar.OnSeekBarChangeListener,KTrackActions.VideoTrackEventListener,KTrackActions.AudioTrackEventListener, KTrackActions.TextTrackEventListener,KTrackActions.EventListener, KPErrorEventListener, KPPlayheadUpdateEventListener, KPStateChangedEventListener /*--deprecated, KPEventListener*/ {
private static final String TAG = "BasicPlayerDemo";
private static final int MENU_GROUP_TRACKS = 1;
private static final int TRACK_DISABLED = -1;
private static final int ID_OFFSET = 2;
private Button mPlayPauseButton;
private SeekBar mSeekBar;
private PlayerViewController mPlayer;
private boolean onCreate = false;
private boolean enableBackgroundAudio;
private Button videoButton;
private Button audioButton;
private Button textButton;
private Button replayButton;
private RelativeLayout.LayoutParams defaultVideoViewParams;
private int defaultScreenOrientationMode;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_SENSOR);
setContentView(R.layout.activity_main);
if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
WebView.setWebContentsDebuggingEnabled(true);
}
videoButton = (Button) findViewById(R.id.video_controls);
audioButton = (Button) findViewById(R.id.audio_controls);
textButton = (Button) findViewById(R.id.text_controls);
replayButton = (Button) findViewById(R.id.replay);
mPlayPauseButton = (Button)findViewById(R.id.button);
mPlayPauseButton.setOnClickListener(this);
mPlayPauseButton.setOnLongClickListener(new View.OnLongClickListener() {
@Override
public boolean onLongClick(View v) {
getPlayer().getMediaControl().replay();
return true;
}
});
mSeekBar = (SeekBar)findViewById(R.id.seekBar);
mSeekBar.setOnSeekBarChangeListener(this);
onCreate = true;
getPlayer();
}
private PlayerViewController getPlayer() {
if (mPlayer == null) {
mPlayer = (PlayerViewController)findViewById(R.id.player);
mPlayer.loadPlayerIntoActivity(this);
KPPlayerConfig config = new KPPlayerConfig("http://kgit.html5video.org/tags/v2.49/mwEmbedFrame.php", "31638861", "1831271").setEntryId("1_ng282arr");
//KPPlayerConfig config = new KPPlayerConfig("http://kgit.html5video.org/tags/v2.46.rc9/mwEmbedFrame.php", "12905712", "243342").setEntryId("0_uka1msg4");
config.setAutoPlay(true);
mPlayPauseButton.setText("Pause");
//config.addConfig("debugKalturaPlayer", "true");
//config.addConfig("controlBarContainer.hover", "true");
//config.addConfig("fullScreenBtn.plugin", "true");
config.addConfig("closedCaptions.plugin", "true");
config.addConfig("sourceSelector.plugin", "true");
config.addConfig("sourceSelector.displayMode", "bitrate");
config.addConfig("audioSelector.plugin", "true");
config.addConfig("closedCaptions.showEmbeddedCaptions", "true");
//String adTagUrl = "http://pubads.g.doubleclick.net/gampad/ads?sz=640x360&iu=/6062/iab_vast_samples/skippable&ciu_szs=300x250,728x90&impl=s&gdfp_req=1&env=vp&output=xml_vast2&unviewed_position_start=1&url=[referrer_url]&correlator=[timestamp]";
//config.addConfig("doubleClick.adTagUrl",adTagUrl);
//config.addConfig("doubleClick.plugin","true");
mPlayer.initWithConfiguration(config);
mPlayer.setOnKPErrorEventListener(this);
mPlayer.setOnKPPlayheadUpdateEventListener(this);
//mPlayer.setOnKPFullScreenToggeledEventListener(this);
mPlayer.setOnKPStateChangedEventListener(this);
/****FOR TRACKS****/
//// Tracks on Web supported only from 2.44
//// if TracksEventListener is removed the tracks will be pushed to the web layer o/w app controled via
////onTracksUpdate and the mPlayer.getTrackManager() methodes
//mPlayer.setTracksEventListener(this);
//mPlayer.setVideoTrackEventListener(this);
//mPlayer.setTextTrackEventListener(this);
//mPlayer.setAudioTrackEventListener(this);
}
return mPlayer;
}
private RelativeLayout getPlayerContainer() {
return (RelativeLayout)findViewById(R.id.playerContainer);
}
@Override
protected void onPause() {
if (mPlayer != null) {
mPlayer.releaseAndSavePosition(true);
}
super.onPause();
}
@Override
protected void onStop() {
super.onStop();
}
@Override
protected void onResume() {
if (onCreate) {
onCreate = false;
}
if (mPlayer != null) {
mPlayer.resumePlayer();
}
super.onResume();
}
@Override
protected void onDestroy() {
if (mPlayer != null) {
mPlayer.removePlayer();
}
super.onDestroy();
}
@Override
public void onConfigurationChanged(final Configuration newConfig) {
super.onConfigurationChanged(newConfig);
Timer swapTimer = new Timer();
swapTimer.schedule(new TimerTask() {
@Override
public void run() {
runOnUiThread(new Runnable() {
public void run() {
LinearLayout.LayoutParams lp = (LinearLayout.LayoutParams) getPlayerContainer().getLayoutParams();
lp.weight = newConfig.orientation == Configuration.ORIENTATION_PORTRAIT ? 2 : 8;
lp.height = newConfig.orientation == Configuration.ORIENTATION_PORTRAIT ? 7 : 3;
getPlayerContainer().setLayoutParams(lp);
}
});
}
}, 100);
}
@Override
public void onClick(View v) {
if (v.getId() != R.id.replay) {
if (mPlayPauseButton.getText().equals("Play")) {
mPlayPauseButton.setText("Pause");
getPlayer().getMediaControl().start();
} else {
mPlayPauseButton.setText("Play");
getPlayer().getMediaControl().pause();
}
}
}
@Override
public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
if (fromUser) {
float progressInPercent = progress / 100f;
float seekVal = (float) (progressInPercent * mPlayer.getDurationSec());
getPlayer().getMediaControl().seek(seekVal);
}
}
@Override
public void onStartTrackingTouch(SeekBar seekBar) {
}
@Override
public void onStopTrackingTouch(SeekBar seekBar) {
}
@Override
public void onKPlayerStateChanged(PlayerViewController playerViewController, KPlayerState state) {
LOGD(TAG, "onKPlayerStateChanged: state = " + state.name());
if (state == KPlayerState.PAUSED && playerViewController.getCurrentPlaybackTime() > 0) {
// findViewById(R.id.replay).setVisibility(View.VISIBLE);
mPlayPauseButton.setText("Play");
} else if (state == KPlayerState.PLAYING) {
// findViewById(R.id.replay).setVisibility(View.INVISIBLE);
mPlayPauseButton.setText("Pause");
} else if (state == KPlayerState.ENDED) {
replayButton.setVisibility(View.VISIBLE);
} else if (state == KPlayerState.READY) {
replayButton.setVisibility(View.INVISIBLE);
}
}
@Override
public void onKPlayerError(PlayerViewController playerViewController, KPError error) {
LOGD(TAG, "onKPlayerError Error Received:" + error.getErrorMsg());
}
// @Override
// public void onKPlayerFullScreenToggeled(PlayerViewController playerViewController, boolean isFullscreen) {
// LOGD(TAG, "onKPlayerFullScreenToggeled isFullscreen " + isFullscreen);
// }
@Override
public void onKPlayerPlayheadUpdate(PlayerViewController playerViewController, long currentTime) {
long currentSeconds = (int) (currentTime / 1000);
long totalSeconds = (int) (playerViewController.getDurationSec());
double percentage = 0;
if (totalSeconds > 0) {
percentage = (((double) currentSeconds) / totalSeconds) * 100;
}
LOGD(TAG, "onKPlayerPlayheadUpdate " + currentSeconds + "/" + totalSeconds + " => " + (int)percentage + "%");
mSeekBar.setProgress((int)percentage);
}
private void configurePopupWithTracks(PopupMenu popup,
final PopupMenu.OnMenuItemClickListener customActionClickListener,
final TrackType trackType) {
int trackCount = 0;
if (mPlayer == null || mPlayer.getTrackManager() == null) {
return;
}
if (TrackType.AUDIO.equals(trackType)) {
trackCount = mPlayer.getTrackManager().getAudioTrackList().size();
}else if (TrackType.TEXT.equals(trackType)) {
trackCount = mPlayer.getTrackManager().getTextTrackList().size();
} else if (TrackType.VIDEO.equals(trackType)) {
trackCount = mPlayer.getTrackManager().getVideoTrackList().size();
}
if (trackCount <= 0) {
return;
}
popup.setOnMenuItemClickListener(new PopupMenu.OnMenuItemClickListener() {
@Override
public boolean onMenuItemClick(MenuItem item) {
return (customActionClickListener != null
&& customActionClickListener.onMenuItemClick(item))
|| onTrackItemClick(item, trackType);
}
});
Menu menu = popup.getMenu();
// ID_OFFSET ensures we avoid clashing with Menu.NONE (which equals 0).
menu.add(MENU_GROUP_TRACKS, TRACK_DISABLED + ID_OFFSET, Menu.NONE, R.string.off);
for (int i = 0; i < trackCount; i++) {
if (TrackType.AUDIO.equals(trackType)) {
menu.add(MENU_GROUP_TRACKS, i + ID_OFFSET, Menu.NONE,
mPlayer.getTrackManager().getAudioTrackList().get(i).trackLabel);
}else if (TrackType.TEXT.equals(trackType)) {
menu.add(MENU_GROUP_TRACKS, i + ID_OFFSET, Menu.NONE,
mPlayer.getTrackManager().getTextTrackList().get(i).trackLabel);
} else if (TrackType.VIDEO.equals(trackType)) {
menu.add(MENU_GROUP_TRACKS, i + ID_OFFSET, Menu.NONE,
mPlayer.getTrackManager().getVideoTrackList().get(i).trackLabel);
}
}
menu.setGroupCheckable(MENU_GROUP_TRACKS, true, true);
menu.findItem(mPlayer.getTrackManager().getCurrentTrack(trackType).index + ID_OFFSET).setChecked(true);
}
private boolean onTrackItemClick(MenuItem item, TrackType type) {
if (mPlayer == null || item.getGroupId() != MENU_GROUP_TRACKS) {
return false;
}
int switchTrackIndex = item.getItemId() - ID_OFFSET;
LOGD(TAG, "onTrackItemClick switchTrackIndex: " + switchTrackIndex);
mPlayer.getTrackManager().switchTrack(type, switchTrackIndex);
return true;
}
public void doReplay(View v) {
if (mPlayer != null) {
mPlayer.getMediaControl().replay();
mPlayPauseButton.setText("Pause");
}
}
public void showVideoPopup(View v) {
PopupMenu popup = new PopupMenu(this, v);
configurePopupWithTracks(popup, null,TrackType.VIDEO);
popup.show();
}
public void showAudioPopup(View v) {
PopupMenu popup = new PopupMenu(this, v);
Menu menu = popup.getMenu();
menu.add(Menu.NONE, Menu.NONE, Menu.NONE, R.string.enable_background_audio);
final MenuItem backgroundAudioItem = menu.findItem(0);
backgroundAudioItem.setCheckable(true);
backgroundAudioItem.setChecked(enableBackgroundAudio);
PopupMenu.OnMenuItemClickListener clickListener = new PopupMenu.OnMenuItemClickListener() {
@Override
public boolean onMenuItemClick(MenuItem item) {
if (item == backgroundAudioItem) {
enableBackgroundAudio = !item.isChecked();
return true;
}
return false;
}
};
configurePopupWithTracks(popup, clickListener, TrackType.AUDIO);
popup.show();
}
public void showTextPopup(View v) {
PopupMenu popup = new PopupMenu(this, v);
configurePopupWithTracks(popup, null, TrackType.TEXT);
popup.show();
}
@Override
public void onTracksUpdate(KTrackActions tracksManager) {
if (mPlayer != null) {
updateButtonVisibilities();
LOGE(TAG, "----------------");
for (TrackFormat track : mPlayer.getTrackManager().getAudioTrackList()) {
LOGD(TAG, track.toString());
}
LOGE(TAG, "----------------");
for (TrackFormat track : mPlayer.getTrackManager().getVideoTrackList()) {
LOGE(TAG, track.toString());
}
LOGE(TAG, "----------------");
for (TrackFormat track : mPlayer.getTrackManager().getTextTrackList()) {
LOGD(TAG, track.toString());
}
LOGE(TAG, "----------------");
}
}
private void updateButtonVisibilities() {
if (mPlayer != null) {
if (mPlayer.getTrackManager() != null) {
videoButton.setVisibility((mPlayer.getTrackManager().getVideoTrackList().size() > 0) ? View.VISIBLE : View.GONE);
audioButton.setVisibility((mPlayer.getTrackManager().getAudioTrackList().size() > 0) ? View.VISIBLE : View.GONE);
textButton.setVisibility((mPlayer.getTrackManager().getTextTrackList().size() > 0) ? View.VISIBLE : View.GONE);
}
}
}
@Override
public void onVideoTrackChanged(int currentTrack) {
LOGD(TAG, "** onVideoTrackChanged ** " + currentTrack);
}
@Override
public void onTextTrackChanged(int currentTrack) {
LOGD(TAG, "** onTextTrackChanged ** " + currentTrack);
}
@Override
public void onAudioTrackChanged(int currentTrack) {
LOGD(TAG, "** onAudioTrackChanged ** " + currentTrack);
}
}