getAdditionalSessionProviders(Context appContext) {
47 | return null;
48 | }
49 | }
50 |
--------------------------------------------------------------------------------
/gradlew.bat:
--------------------------------------------------------------------------------
1 | @if "%DEBUG%" == "" @echo off
2 | @rem ##########################################################################
3 | @rem
4 | @rem Gradle startup script for Windows
5 | @rem
6 | @rem ##########################################################################
7 |
8 | @rem Set local scope for the variables with windows NT shell
9 | if "%OS%"=="Windows_NT" setlocal
10 |
11 | set DIRNAME=%~dp0
12 | if "%DIRNAME%" == "" set DIRNAME=.
13 | set APP_BASE_NAME=%~n0
14 | set APP_HOME=%DIRNAME%
15 |
16 | @rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
17 | set DEFAULT_JVM_OPTS=
18 |
19 | @rem Find java.exe
20 | if defined JAVA_HOME goto findJavaFromJavaHome
21 |
22 | set JAVA_EXE=java.exe
23 | %JAVA_EXE% -version >NUL 2>&1
24 | if "%ERRORLEVEL%" == "0" goto init
25 |
26 | echo.
27 | echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
28 | echo.
29 | echo Please set the JAVA_HOME variable in your environment to match the
30 | echo location of your Java installation.
31 |
32 | goto fail
33 |
34 | :findJavaFromJavaHome
35 | set JAVA_HOME=%JAVA_HOME:"=%
36 | set JAVA_EXE=%JAVA_HOME%/bin/java.exe
37 |
38 | if exist "%JAVA_EXE%" goto init
39 |
40 | echo.
41 | echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME%
42 | echo.
43 | echo Please set the JAVA_HOME variable in your environment to match the
44 | echo location of your Java installation.
45 |
46 | goto fail
47 |
48 | :init
49 | @rem Get command-line arguments, handling Windows variants
50 |
51 | if not "%OS%" == "Windows_NT" goto win9xME_args
52 |
53 | :win9xME_args
54 | @rem Slurp the command line arguments.
55 | set CMD_LINE_ARGS=
56 | set _SKIP=2
57 |
58 | :win9xME_args_slurp
59 | if "x%~1" == "x" goto execute
60 |
61 | set CMD_LINE_ARGS=%*
62 |
63 | :execute
64 | @rem Setup the command line
65 |
66 | set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar
67 |
68 | @rem Execute Gradle
69 | "%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS%
70 |
71 | :end
72 | @rem End local scope for the variables with windows NT shell
73 | if "%ERRORLEVEL%"=="0" goto mainEnd
74 |
75 | :fail
76 | rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of
77 | rem the _cmd.exe /c_ return code!
78 | if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1
79 | exit /b 1
80 |
81 | :mainEnd
82 | if "%OS%"=="Windows_NT" endlocal
83 |
84 | :omega
85 |
--------------------------------------------------------------------------------
/app/build.gradle:
--------------------------------------------------------------------------------
1 | apply plugin: 'com.android.application'
2 | apply plugin: 'org.jetbrains.kotlin.android'
3 |
4 | android {
5 | compileSdk 34
6 | defaultConfig {
7 | minSdkVersion 24
8 | targetSdkVersion 34
9 | versionCode 1
10 | versionName "1.0"
11 | applicationId "com.jwplayer.opensourcedemo"
12 | multiDexEnabled true
13 | }
14 | buildTypes {
15 | release {
16 | minifyEnabled false
17 | proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
18 | }
19 | }
20 |
21 | buildFeatures {
22 | viewBinding true
23 | }
24 |
25 | compileOptions {
26 | sourceCompatibility JavaVersion.VERSION_17
27 | targetCompatibility JavaVersion.VERSION_17
28 | }
29 | namespace 'com.jwplayer.opensourcedemo'
30 | }
31 |
32 |
33 | ext.JWPlayerVersion = '4.23.0'
34 |
35 | ext.medai3ExoPlayerVersion = '1.4.1'
36 |
37 | dependencies {
38 | implementation 'androidx.appcompat:appcompat:1.6.1'
39 | implementation 'com.google.android.material:material:1.11.0'
40 | implementation 'androidx.constraintlayout:constraintlayout:2.1.4'
41 |
42 | implementation "com.jwplayer:jwplayer-core:$JWPlayerVersion"
43 | implementation "com.jwplayer:jwplayer-common:$JWPlayerVersion"
44 | implementation "com.jwplayer:jwplayer-chromecast:$JWPlayerVersion"
45 | implementation "com.jwplayer:jwplayer-ima:$JWPlayerVersion"
46 |
47 | // Specify kotlin-bom to avoid Duplicate Class Errors from mismatch kotlin versions
48 | implementation(platform("org.jetbrains.kotlin:kotlin-bom:1.9.22"))
49 |
50 | // // AAR Builds
51 | // implementation fileTree(dir: 'libs', include: "jwplayer-core-${JWPlayerVersion}.aar")
52 | // implementation fileTree(dir: 'libs', include: "jwplayer-common-${JWPlayerVersion}.aar")
53 | // implementation fileTree(dir: 'libs', include: "jwplayer-chromecast-${JWPlayerVersion}.aar")
54 | // implementation fileTree(dir: 'libs', include: "jwplayer-ima-${JWPlayerVersion}.aar")
55 | //
56 |
57 | //// Only needed when building with AAR instead
58 | // implementation("androidx.media3:media3-exoplayer:$medai3ExoPlayerVersion")
59 | // implementation("androidx.media3:media3-exoplayer-dash:$medai3ExoPlayerVersion")
60 | // implementation("androidx.media3:media3-exoplayer-hls:$medai3ExoPlayerVersion")
61 | // implementation("androidx.media3:media3-exoplayer-smoothstreaming:$medai3ExoPlayerVersion")
62 | // implementation("androidx.media3:media3-ui:$medai3ExoPlayerVersion")
63 | // implementation("com.google.android.gms:play-services-cast-framework:21.3.0")
64 | // implementation 'com.squareup.picasso:picasso:2.71828'
65 | // implementation 'androidx.viewpager2:viewpager2:1.0.0'
66 | // implementation 'com.android.volley:volley:1.2.1'
67 | // implementation 'com.google.android.gms:play-services-ads-identifier:18.0.1'
68 | // implementation("com.google.ads.interactivemedia.v3:interactivemedia:3.31.0")
69 | // implementation("com.google.android.gms:play-services-cast-framework:21.3.0")
70 | // implementation 'androidx.recyclerview:recyclerview:1.2.1'
71 | }
--------------------------------------------------------------------------------
/app/src/main/java/com/jwplayer/opensourcedemo/JWPlayerFragmentExample.java:
--------------------------------------------------------------------------------
1 | package com.jwplayer.opensourcedemo;
2 |
3 | import android.os.Bundle;
4 | import android.view.KeyEvent;
5 | import android.view.Menu;
6 | import android.view.MenuItem;
7 |
8 | import androidx.annotation.NonNull;
9 | import androidx.appcompat.app.AppCompatActivity;
10 | import androidx.fragment.app.FragmentManager;
11 | import androidx.fragment.app.FragmentTransaction;
12 |
13 | import com.google.android.gms.cast.framework.CastButtonFactory;
14 | import com.jwplayer.pub.api.JWPlayer;
15 | import com.jwplayer.pub.api.JWPlayerSupportFragment;
16 | import com.jwplayer.pub.api.configuration.PlayerConfig;
17 |
18 |
19 | public class JWPlayerFragmentExample extends AppCompatActivity {
20 |
21 |
22 | private JWPlayerSupportFragment mPlayerFragment;
23 |
24 | private JWPlayer mPlayer;
25 |
26 | private CallbackScreen mCallbackScreen;
27 |
28 | @Override
29 | protected void onCreate(Bundle savedInstanceState) {
30 | super.onCreate(savedInstanceState);
31 | setContentView(R.layout.activity_jwplayerfragment);
32 |
33 | // Construct a new JWPlayerSupportFragment (since we're using AppCompatActivity)
34 | mPlayerFragment = JWPlayerSupportFragment.newInstance(new PlayerConfig.Builder()
35 | .file("https://playertest.longtailvideo.com/adaptive/bipbop/gear4/prog_index.m3u8")
36 | .build());
37 |
38 | // Attach the Fragment to our layout
39 | FragmentManager fm = getSupportFragmentManager();
40 | FragmentTransaction ft = fm.beginTransaction();
41 | ft.add(R.id.fragment_container, mPlayerFragment);
42 | ft.commit();
43 |
44 | // Make sure all the pending fragment transactions have been completed, otherwise
45 | // mPlayerFragment.getPlayer() may return null
46 | fm.executePendingTransactions();
47 |
48 | // Get a reference to the JWPlayerView from the fragment
49 | mPlayer = mPlayerFragment.getPlayer();
50 |
51 | // Keep the screen on during playback
52 | new KeepScreenOnHandler(mPlayer, getWindow());
53 |
54 | // Event Logging
55 | mCallbackScreen = findViewById(R.id.callback_screen);
56 | mCallbackScreen.registerListeners(mPlayer);
57 | }
58 |
59 | @Override
60 | public boolean onKeyDown(int keyCode, KeyEvent event) {
61 | // Exit fullscreen when the user pressed the Back button
62 | if (keyCode == KeyEvent.KEYCODE_BACK) {
63 | if (mPlayer.getFullscreen()) {
64 | mPlayer.setFullscreen(false, true);
65 | return false;
66 | }
67 | }
68 | return super.onKeyDown(keyCode, event);
69 | }
70 |
71 |
72 | @Override
73 | public boolean onCreateOptionsMenu(Menu menu) {
74 | getMenuInflater().inflate(R.menu.menu_jwplayerfragment, menu);
75 |
76 | // Register the MediaRouterButton
77 | CastButtonFactory.setUpMediaRouteButton(getApplicationContext(), menu,
78 | R.id.media_route_menu_item);
79 |
80 | MenuHelper.INSTANCE.fillInMenu(menu, this, this);
81 |
82 | return true;
83 | }
84 |
85 | @Override
86 | public boolean onOptionsItemSelected(@NonNull MenuItem item) {
87 | return super.onOptionsItemSelected(item);
88 | }
89 | }
90 |
--------------------------------------------------------------------------------
/app/src/main/java/com/jwplayer/opensourcedemo/KeepScreenOnHandler.java:
--------------------------------------------------------------------------------
1 | package com.jwplayer.opensourcedemo;
2 |
3 | import android.view.Window;
4 | import android.view.WindowManager;
5 |
6 | import com.jwplayer.pub.api.JWPlayer;
7 | import com.jwplayer.pub.api.events.AdCompleteEvent;
8 | import com.jwplayer.pub.api.events.AdErrorEvent;
9 | import com.jwplayer.pub.api.events.AdPauseEvent;
10 | import com.jwplayer.pub.api.events.AdPlayEvent;
11 | import com.jwplayer.pub.api.events.AdSkippedEvent;
12 | import com.jwplayer.pub.api.events.CompleteEvent;
13 | import com.jwplayer.pub.api.events.ErrorEvent;
14 | import com.jwplayer.pub.api.events.EventType;
15 | import com.jwplayer.pub.api.events.PauseEvent;
16 | import com.jwplayer.pub.api.events.PlayEvent;
17 | import com.jwplayer.pub.api.events.listeners.AdvertisingEvents;
18 | import com.jwplayer.pub.api.events.listeners.VideoPlayerEvents;
19 |
20 | /**
21 | * Sets the FLAG_KEEP_SCREEN_ON flag during playback - disables it when playback is stopped
22 | */
23 | public class KeepScreenOnHandler implements VideoPlayerEvents.OnPlayListener,
24 | VideoPlayerEvents.OnPauseListener,
25 | VideoPlayerEvents.OnCompleteListener,
26 | VideoPlayerEvents.OnErrorListener,
27 | AdvertisingEvents.OnAdPlayListener,
28 | AdvertisingEvents.OnAdPauseListener,
29 | AdvertisingEvents.OnAdCompleteListener,
30 | AdvertisingEvents.OnAdSkippedListener,
31 | AdvertisingEvents.OnAdErrorListener {
32 |
33 | /**
34 | * The application window
35 | */
36 | private Window mWindow;
37 |
38 | public KeepScreenOnHandler(JWPlayer player, Window window) {
39 | player.addListener(EventType.PLAY, this);
40 | player.addListener(EventType.PAUSE, this);
41 | player.addListener(EventType.COMPLETE, this);
42 | player.addListener(EventType.ERROR,this);
43 | player.addListener(EventType.AD_PLAY, this);
44 | player.addListener(EventType.AD_PAUSE, this);
45 | player.addListener(EventType.AD_COMPLETE, this);
46 | player.addListener(EventType.AD_ERROR, this);
47 | mWindow = window;
48 | }
49 |
50 | private void updateWakeLock(boolean enable) {
51 | if (enable) {
52 | mWindow.addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
53 | } else {
54 | mWindow.clearFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
55 | }
56 | }
57 |
58 | @Override
59 | public void onError(ErrorEvent errorEvent) {
60 | updateWakeLock(false);
61 | }
62 |
63 | @Override
64 | public void onAdPlay(AdPlayEvent adPlayEvent) {
65 | updateWakeLock(true);
66 | }
67 |
68 | @Override
69 | public void onAdPause(AdPauseEvent adPauseEvent) {
70 | updateWakeLock(false);
71 | }
72 |
73 | @Override
74 | public void onAdComplete(AdCompleteEvent adCompleteEvent) {
75 | updateWakeLock(false);
76 | }
77 |
78 | @Override
79 | public void onAdSkipped(AdSkippedEvent adSkippedEvent) {
80 | updateWakeLock(false);
81 | }
82 |
83 | @Override
84 | public void onAdError(AdErrorEvent adErrorEvent) {
85 | updateWakeLock(false);
86 | }
87 |
88 | @Override
89 | public void onComplete(CompleteEvent completeEvent) {
90 | updateWakeLock(false);
91 | }
92 |
93 | @Override
94 | public void onPause(PauseEvent pauseEvent) {
95 | updateWakeLock(false);
96 |
97 | }
98 |
99 | @Override
100 | public void onPlay(PlayEvent playEvent) {
101 | updateWakeLock(true);
102 |
103 | }
104 | }
105 |
--------------------------------------------------------------------------------
/app/src/main/java/com/jwplayer/opensourcedemo/JWPlayerViewExample.java:
--------------------------------------------------------------------------------
1 | package com.jwplayer.opensourcedemo;
2 |
3 | import android.content.res.Configuration;
4 | import android.os.Bundle;
5 | import android.view.KeyEvent;
6 | import android.view.Menu;
7 |
8 | import androidx.appcompat.app.ActionBar;
9 | import androidx.appcompat.app.AppCompatActivity;
10 |
11 | import com.google.android.gms.cast.framework.CastContext;
12 | import com.jwplayer.pub.api.JWPlayer;
13 | import com.jwplayer.pub.api.configuration.PlayerConfig;
14 | import com.jwplayer.pub.api.events.EventType;
15 | import com.jwplayer.pub.api.events.FullscreenEvent;
16 | import com.jwplayer.pub.api.events.listeners.VideoPlayerEvents;
17 | import com.jwplayer.pub.api.license.LicenseUtil;
18 | import com.jwplayer.pub.view.JWPlayerView;
19 |
20 |
21 | public class JWPlayerViewExample extends AppCompatActivity
22 | implements VideoPlayerEvents.OnFullscreenListener {
23 |
24 | private JWPlayerView mPlayerView;
25 |
26 | private CastContext mCastContext;
27 |
28 | private CallbackScreen mCallbackScreen;
29 | private JWPlayer mPlayer;
30 |
31 | @Override
32 | protected void onCreate(Bundle savedInstanceState) {
33 | super.onCreate(savedInstanceState);
34 | setContentView(R.layout.activity_jwplayerview);
35 |
36 | // TODO: Add your license key
37 | new LicenseUtil().setLicenseKey(this, YOUR_LICENSE_KEY );
38 | mPlayerView = findViewById(R.id.jwplayer);
39 | mPlayer = mPlayerView.getPlayer(this);
40 |
41 |
42 | // Handle hiding/showing of ActionBar
43 | mPlayer.addListener(EventType.FULLSCREEN, this);
44 |
45 | // Keep the screen on during playback
46 | new KeepScreenOnHandler(mPlayer, getWindow());
47 |
48 | // Event Logging
49 | mCallbackScreen = findViewById(R.id.callback_screen);
50 | mCallbackScreen.registerListeners(mPlayer);
51 |
52 | // Load a media source
53 | PlayerConfig config = new PlayerConfig.Builder()
54 | .playlistUrl("https://cdn.jwplayer.com/v2/media/1sc0kL2N?format=json")
55 | .build();
56 |
57 | mPlayer.setup(config);
58 |
59 | // Get a reference to the CastContext
60 | mCastContext = CastContext.getSharedInstance(this);
61 | }
62 |
63 | @Override
64 | public boolean onCreateOptionsMenu(Menu menu) {
65 | super.onCreateOptionsMenu(menu);
66 | MenuHelper.INSTANCE.fillInMenu(menu, this, this);
67 | return true;
68 | }
69 |
70 |
71 | @Override
72 | public void onConfigurationChanged(Configuration newConfig) {
73 | super.onConfigurationChanged(newConfig);
74 | if (!mPlayer.isInPictureInPictureMode()) {
75 | final boolean isFullscreen = newConfig.orientation == Configuration.ORIENTATION_LANDSCAPE;
76 | mPlayer.setFullscreen(isFullscreen, true);
77 | }
78 | }
79 |
80 | @Override
81 | public boolean onKeyDown(int keyCode, KeyEvent event) {
82 | // Exit fullscreen when the user pressed the Back button
83 | if (keyCode == KeyEvent.KEYCODE_BACK) {
84 | if (mPlayer.getFullscreen()) {
85 | mPlayer.setFullscreen(false, true);
86 | return false;
87 | }
88 | }
89 | return super.onKeyDown(keyCode, event);
90 | }
91 |
92 |
93 | @Override
94 | public void onFullscreen(FullscreenEvent fullscreenEvent) {
95 | ActionBar actionBar = getSupportActionBar();
96 | if (actionBar != null) {
97 | if (fullscreenEvent.getFullscreen()) {
98 | actionBar.hide();
99 | } else {
100 | actionBar.show();
101 | }
102 | }
103 | }
104 | }
105 |
--------------------------------------------------------------------------------
/app/src/main/java/com/jwplayer/opensourcedemo/JWKotlinPlayerViewExample.kt:
--------------------------------------------------------------------------------
1 | package com.jwplayer.opensourcedemo
2 |
3 | import android.content.res.Configuration
4 | import android.os.Bundle
5 | import android.view.KeyEvent
6 | import android.view.Menu
7 | import androidx.appcompat.app.AppCompatActivity
8 | import com.google.android.gms.cast.framework.CastContext
9 | import com.jwplayer.opensourcedemo.MenuHelper.fillInMenu
10 | import com.jwplayer.opensourcedemo.databinding.ActivityJwkotlinPlayerViewExampleBinding
11 | import com.jwplayer.pub.api.JWPlayer
12 | import com.jwplayer.pub.api.configuration.PlayerConfig
13 | import com.jwplayer.pub.api.events.EventType
14 | import com.jwplayer.pub.api.events.FullscreenEvent
15 | import com.jwplayer.pub.api.events.listeners.VideoPlayerEvents
16 | import java.util.concurrent.Executors
17 |
18 | class JWKotlinPlayerViewExample : AppCompatActivity(), VideoPlayerEvents.OnFullscreenListener {
19 |
20 | private var mCastContext: CastContext? = null
21 |
22 | private lateinit var mPlayer: JWPlayer
23 | private lateinit var binding: ActivityJwkotlinPlayerViewExampleBinding
24 |
25 | override fun onCreate(savedInstanceState: Bundle?) {
26 | super.onCreate(savedInstanceState)
27 | binding = ActivityJwkotlinPlayerViewExampleBinding.inflate(layoutInflater)
28 | setContentView(binding.root)
29 |
30 | binding.jwplayer.getPlayerAsync(this,this) {
31 | mPlayer = it
32 | // Handle hiding/showing of ActionBar
33 | mPlayer.addListener(EventType.FULLSCREEN, this)
34 |
35 | // Keep the screen on during playback
36 | KeepScreenOnHandler(mPlayer, window)
37 |
38 | // Event Logging
39 | binding.callbackScreen.registerListeners(mPlayer)
40 |
41 | // Load a media source
42 | val config = PlayerConfig.Builder()
43 | .playlistUrl("https://cdn.jwplayer.com/v2/media/1sc0kL2N?format=json")
44 | .build()
45 | mPlayer.setup(config)
46 | }
47 |
48 | // Get a reference to the CastContext from a Task
49 | val instanceTask = CastContext.getSharedInstance(this, Executors.newSingleThreadExecutor());
50 | instanceTask.addOnCompleteListener {
51 | mCastContext = it.result
52 | }
53 |
54 | }
55 |
56 | override fun onCreateOptionsMenu(menu: Menu): Boolean {
57 | super.onCreateOptionsMenu(menu)
58 | fillInMenu(menu, this, this)
59 | return true
60 | }
61 |
62 | override fun onConfigurationChanged(newConfig: Configuration) {
63 | super.onConfigurationChanged(newConfig)
64 | if (!mPlayer.isInPictureInPictureMode) {
65 | val isFullscreen = newConfig.orientation == Configuration.ORIENTATION_LANDSCAPE
66 | mPlayer.setFullscreen(isFullscreen, true)
67 | }
68 | }
69 |
70 | override fun onKeyDown(keyCode: Int, event: KeyEvent?): Boolean {
71 | // Exit fullscreen when the user pressed the Back button
72 | if (keyCode == KeyEvent.KEYCODE_BACK) {
73 | if (mPlayer.fullscreen) {
74 | mPlayer.setFullscreen(false, true)
75 | return false
76 | }
77 | }
78 | return super.onKeyDown(keyCode, event)
79 | }
80 |
81 |
82 | override fun onFullscreen(fullscreenEvent: FullscreenEvent) {
83 | val actionBar = supportActionBar
84 | if (actionBar != null) {
85 | if (fullscreenEvent.fullscreen) {
86 | actionBar.hide()
87 | } else {
88 | actionBar.show()
89 | }
90 | }
91 | }
92 | }
--------------------------------------------------------------------------------
/gradlew:
--------------------------------------------------------------------------------
1 | #!/usr/bin/env sh
2 |
3 | ##############################################################################
4 | ##
5 | ## Gradle start up script for UN*X
6 | ##
7 | ##############################################################################
8 |
9 | # Attempt to set APP_HOME
10 | # Resolve links: $0 may be a link
11 | PRG="$0"
12 | # Need this for relative symlinks.
13 | while [ -h "$PRG" ] ; do
14 | ls=`ls -ld "$PRG"`
15 | link=`expr "$ls" : '.*-> \(.*\)$'`
16 | if expr "$link" : '/.*' > /dev/null; then
17 | PRG="$link"
18 | else
19 | PRG=`dirname "$PRG"`"/$link"
20 | fi
21 | done
22 | SAVED="`pwd`"
23 | cd "`dirname \"$PRG\"`/" >/dev/null
24 | APP_HOME="`pwd -P`"
25 | cd "$SAVED" >/dev/null
26 |
27 | APP_NAME="Gradle"
28 | APP_BASE_NAME=`basename "$0"`
29 |
30 | # Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
31 | DEFAULT_JVM_OPTS=""
32 |
33 | # Use the maximum available, or set MAX_FD != -1 to use that value.
34 | MAX_FD="maximum"
35 |
36 | warn () {
37 | echo "$*"
38 | }
39 |
40 | die () {
41 | echo
42 | echo "$*"
43 | echo
44 | exit 1
45 | }
46 |
47 | # OS specific support (must be 'true' or 'false').
48 | cygwin=false
49 | msys=false
50 | darwin=false
51 | nonstop=false
52 | case "`uname`" in
53 | CYGWIN* )
54 | cygwin=true
55 | ;;
56 | Darwin* )
57 | darwin=true
58 | ;;
59 | MINGW* )
60 | msys=true
61 | ;;
62 | NONSTOP* )
63 | nonstop=true
64 | ;;
65 | esac
66 |
67 | CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar
68 |
69 | # Determine the Java command to use to start the JVM.
70 | if [ -n "$JAVA_HOME" ] ; then
71 | if [ -x "$JAVA_HOME/jre/sh/java" ] ; then
72 | # IBM's JDK on AIX uses strange locations for the executables
73 | JAVACMD="$JAVA_HOME/jre/sh/java"
74 | else
75 | JAVACMD="$JAVA_HOME/bin/java"
76 | fi
77 | if [ ! -x "$JAVACMD" ] ; then
78 | die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME
79 |
80 | Please set the JAVA_HOME variable in your environment to match the
81 | location of your Java installation."
82 | fi
83 | else
84 | JAVACMD="java"
85 | which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
86 |
87 | Please set the JAVA_HOME variable in your environment to match the
88 | location of your Java installation."
89 | fi
90 |
91 | # Increase the maximum file descriptors if we can.
92 | if [ "$cygwin" = "false" -a "$darwin" = "false" -a "$nonstop" = "false" ] ; then
93 | MAX_FD_LIMIT=`ulimit -H -n`
94 | if [ $? -eq 0 ] ; then
95 | if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then
96 | MAX_FD="$MAX_FD_LIMIT"
97 | fi
98 | ulimit -n $MAX_FD
99 | if [ $? -ne 0 ] ; then
100 | warn "Could not set maximum file descriptor limit: $MAX_FD"
101 | fi
102 | else
103 | warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT"
104 | fi
105 | fi
106 |
107 | # For Darwin, add options to specify how the application appears in the dock
108 | if $darwin; then
109 | GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\""
110 | fi
111 |
112 | # For Cygwin, switch paths to Windows format before running java
113 | if $cygwin ; then
114 | APP_HOME=`cygpath --path --mixed "$APP_HOME"`
115 | CLASSPATH=`cygpath --path --mixed "$CLASSPATH"`
116 | JAVACMD=`cygpath --unix "$JAVACMD"`
117 |
118 | # We build the pattern for arguments to be converted via cygpath
119 | ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null`
120 | SEP=""
121 | for dir in $ROOTDIRSRAW ; do
122 | ROOTDIRS="$ROOTDIRS$SEP$dir"
123 | SEP="|"
124 | done
125 | OURCYGPATTERN="(^($ROOTDIRS))"
126 | # Add a user-defined pattern to the cygpath arguments
127 | if [ "$GRADLE_CYGPATTERN" != "" ] ; then
128 | OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)"
129 | fi
130 | # Now convert the arguments - kludge to limit ourselves to /bin/sh
131 | i=0
132 | for arg in "$@" ; do
133 | CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -`
134 | CHECK2=`echo "$arg"|egrep -c "^-"` ### Determine if an option
135 |
136 | if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then ### Added a condition
137 | eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"`
138 | else
139 | eval `echo args$i`="\"$arg\""
140 | fi
141 | i=$((i+1))
142 | done
143 | case $i in
144 | (0) set -- ;;
145 | (1) set -- "$args0" ;;
146 | (2) set -- "$args0" "$args1" ;;
147 | (3) set -- "$args0" "$args1" "$args2" ;;
148 | (4) set -- "$args0" "$args1" "$args2" "$args3" ;;
149 | (5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;;
150 | (6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;;
151 | (7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;;
152 | (8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;;
153 | (9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;;
154 | esac
155 | fi
156 |
157 | # Escape application args
158 | save () {
159 | for i do printf %s\\n "$i" | sed "s/'/'\\\\''/g;1s/^/'/;\$s/\$/' \\\\/" ; done
160 | echo " "
161 | }
162 | APP_ARGS=$(save "$@")
163 |
164 | # Collect all arguments for the java command, following the shell quoting and substitution rules
165 | eval set -- $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS "\"-Dorg.gradle.appname=$APP_BASE_NAME\"" -classpath "\"$CLASSPATH\"" org.gradle.wrapper.GradleWrapperMain "$APP_ARGS"
166 |
167 | # by default we should be in the correct project dir, but when run from Finder on Mac, the cwd is wrong
168 | if [ "$(uname)" = "Darwin" ] && [ "$HOME" = "$PWD" ]; then
169 | cd "$(dirname "$0")"
170 | fi
171 |
172 | exec "$JAVACMD" "$@"
173 |
--------------------------------------------------------------------------------
/app/src/main/res/layout/view_callback_screen.xml:
--------------------------------------------------------------------------------
1 |
2 |
6 |
7 |
17 |
18 |
23 |
24 |
25 |
30 |
31 |
36 |
37 |
42 |
43 |
48 |
49 |
55 |
56 |
61 |
62 |
67 |
68 |
73 |
74 |
79 |
80 |
85 |
86 |
91 |
92 |
97 |
98 |
103 |
104 |
109 |
110 |
115 |
116 |
121 |
122 |
127 |
128 |
133 |
134 |
139 |
140 |
145 |
146 |
151 |
152 |
157 |
158 |
163 |
164 |
169 |
170 |
175 |
176 |
181 |
182 |
187 |
188 |
193 |
194 |
199 |
200 |
205 |
206 |
211 |
212 |
217 |
218 |
223 |
224 |
229 |
230 |
235 |
236 |
241 |
242 |
248 |
249 |
254 |
255 |
260 |
261 |
266 |
267 |
272 |
273 |
278 |
279 |
284 |
285 |
290 |
291 |
296 |
297 |
302 |
303 |
308 |
309 |
314 |
315 |
320 |
321 |
326 |
327 |
332 |
333 |
334 |
335 |
336 |
342 |
343 |
350 |
351 |
361 |
362 |
367 |
368 |
369 |
370 |
--------------------------------------------------------------------------------
/app/src/main/java/com/jwplayer/opensourcedemo/CallbackScreen.java:
--------------------------------------------------------------------------------
1 | package com.jwplayer.opensourcedemo;
2 |
3 | import android.content.Context;
4 | import android.text.method.ScrollingMovementMethod;
5 | import android.util.AttributeSet;
6 | import android.util.Log;
7 | import android.widget.CheckBox;
8 | import android.widget.CompoundButton;
9 | import android.widget.LinearLayout;
10 | import android.widget.TextView;
11 |
12 | import com.jwplayer.pub.api.JWPlayer;
13 | import com.jwplayer.pub.api.PlayerState;
14 | import com.jwplayer.pub.api.events.AdClickEvent;
15 | import com.jwplayer.pub.api.events.AdCompanionsEvent;
16 | import com.jwplayer.pub.api.events.AdCompleteEvent;
17 | import com.jwplayer.pub.api.events.AdErrorEvent;
18 | import com.jwplayer.pub.api.events.AdImpressionEvent;
19 | import com.jwplayer.pub.api.events.AdPauseEvent;
20 | import com.jwplayer.pub.api.events.AdPlayEvent;
21 | import com.jwplayer.pub.api.events.AdRequestEvent;
22 | import com.jwplayer.pub.api.events.AdScheduleEvent;
23 | import com.jwplayer.pub.api.events.AdSkippedEvent;
24 | import com.jwplayer.pub.api.events.AdStartedEvent;
25 | import com.jwplayer.pub.api.events.AdTimeEvent;
26 | import com.jwplayer.pub.api.events.AudioTrackChangedEvent;
27 | import com.jwplayer.pub.api.events.AudioTracksEvent;
28 | import com.jwplayer.pub.api.events.BeforeCompleteEvent;
29 | import com.jwplayer.pub.api.events.BeforePlayEvent;
30 | import com.jwplayer.pub.api.events.BufferChangeEvent;
31 | import com.jwplayer.pub.api.events.BufferEvent;
32 | import com.jwplayer.pub.api.events.CaptionsChangedEvent;
33 | import com.jwplayer.pub.api.events.CaptionsListEvent;
34 | import com.jwplayer.pub.api.events.CompleteEvent;
35 | import com.jwplayer.pub.api.events.ControlBarVisibilityEvent;
36 | import com.jwplayer.pub.api.events.ControlsEvent;
37 | import com.jwplayer.pub.api.events.DisplayClickEvent;
38 | import com.jwplayer.pub.api.events.ErrorEvent;
39 | import com.jwplayer.pub.api.events.EventType;
40 | import com.jwplayer.pub.api.events.FirstFrameEvent;
41 | import com.jwplayer.pub.api.events.FullscreenEvent;
42 | import com.jwplayer.pub.api.events.IdleEvent;
43 | import com.jwplayer.pub.api.events.LevelsChangedEvent;
44 | import com.jwplayer.pub.api.events.LevelsEvent;
45 | import com.jwplayer.pub.api.events.MetaEvent;
46 | import com.jwplayer.pub.api.events.MuteEvent;
47 | import com.jwplayer.pub.api.events.PauseEvent;
48 | import com.jwplayer.pub.api.events.PlayEvent;
49 | import com.jwplayer.pub.api.events.PlaylistCompleteEvent;
50 | import com.jwplayer.pub.api.events.PlaylistEvent;
51 | import com.jwplayer.pub.api.events.PlaylistItemEvent;
52 | import com.jwplayer.pub.api.events.RelatedCloseEvent;
53 | import com.jwplayer.pub.api.events.RelatedOpenEvent;
54 | import com.jwplayer.pub.api.events.RelatedPlayEvent;
55 | import com.jwplayer.pub.api.events.SeekEvent;
56 | import com.jwplayer.pub.api.events.SeekedEvent;
57 | import com.jwplayer.pub.api.events.SetupErrorEvent;
58 | import com.jwplayer.pub.api.events.TimeEvent;
59 | import com.jwplayer.pub.api.events.VisualQualityEvent;
60 | import com.jwplayer.pub.api.events.listeners.AdvertisingEvents;
61 | import com.jwplayer.pub.api.events.listeners.RelatedPluginEvents;
62 | import com.jwplayer.pub.api.events.listeners.VideoPlayerEvents;
63 | import com.jwplayer.pub.api.media.adaptive.QualityLevel;
64 | import com.jwplayer.pub.api.media.ads.AdCompanion;
65 | import com.jwplayer.pub.api.media.ads.AdPosition;
66 | import com.jwplayer.pub.api.media.ads.VmapAdBreak;
67 | import com.jwplayer.pub.api.media.audio.AudioTrack;
68 | import com.jwplayer.pub.api.media.captions.Caption;
69 | import com.jwplayer.pub.api.media.meta.Metadata;
70 | import com.jwplayer.pub.api.media.playlists.PlaylistItem;
71 |
72 | import org.json.JSONArray;
73 | import org.json.JSONException;
74 | import org.json.JSONObject;
75 |
76 | import java.util.ArrayList;
77 | import java.util.List;
78 |
79 | /**
80 | * Outputs all JW Player Events to your console and the Log TextView
81 | *
82 | * Steps to edit class:
83 | * 1) implement event listener
84 | * 2) create checkbox in view_callback_screen.xml
85 | * 3) create a reference to view in CallbackScreen class
86 | * 4) set a onCheckChangeListener for the checkbox
87 | * 5) add or remove player listeners depending on checkbox state
88 | * 6) add checkbox to mCallbacksList for easy select all
89 | */
90 | public class CallbackScreen extends LinearLayout implements
91 | VideoPlayerEvents.OnIdleListener,
92 | VideoPlayerEvents.OnBufferListener,
93 | VideoPlayerEvents.OnPlayListener,
94 | VideoPlayerEvents.OnPauseListener,
95 | VideoPlayerEvents.OnTimeListener,
96 | VideoPlayerEvents.OnCompleteListener,
97 | VideoPlayerEvents.OnErrorListener,
98 | VideoPlayerEvents.OnSeekListener,
99 | VideoPlayerEvents.OnFullscreenListener,
100 | VideoPlayerEvents.OnAudioTracksListener,
101 | VideoPlayerEvents.OnAudioTrackChangedListener,
102 | VideoPlayerEvents.OnLevelsListener,
103 | VideoPlayerEvents.OnLevelsChangedListener,
104 | VideoPlayerEvents.OnSeekedListener,
105 | VideoPlayerEvents.OnFirstFrameListener,
106 | VideoPlayerEvents.OnDisplayClickListener,
107 | VideoPlayerEvents.OnPlaylistCompleteListener,
108 | VideoPlayerEvents.OnMetaListener,
109 | VideoPlayerEvents.OnCaptionsChangedListener,
110 | VideoPlayerEvents.OnCaptionsListListener,
111 | VideoPlayerEvents.OnPlaylistItemListener,
112 | VideoPlayerEvents.OnPlaylistListener,
113 | VideoPlayerEvents.OnSetupErrorListener,
114 | VideoPlayerEvents.OnMuteListener,
115 | VideoPlayerEvents.OnVisualQualityListener,
116 | VideoPlayerEvents.OnControlsListener,
117 | VideoPlayerEvents.OnBufferChangeListener,
118 | RelatedPluginEvents.OnRelatedCloseListener,
119 | RelatedPluginEvents.OnRelatedOpenListener,
120 | RelatedPluginEvents.OnRelatedPlayListener,
121 | VideoPlayerEvents.OnControlBarVisibilityListener,
122 | AdvertisingEvents.OnAdTimeListener,
123 | AdvertisingEvents.OnAdScheduleListener,
124 | AdvertisingEvents.OnAdPlayListener,
125 | AdvertisingEvents.OnAdPauseListener,
126 | AdvertisingEvents.OnAdImpressionListener,
127 | AdvertisingEvents.OnAdClickListener,
128 | AdvertisingEvents.OnAdErrorListener,
129 | AdvertisingEvents.OnAdCompleteListener,
130 | AdvertisingEvents.OnAdSkippedListener,
131 | AdvertisingEvents.OnAdCompanionsListener,
132 | AdvertisingEvents.OnAdRequestListener,
133 | AdvertisingEvents.OnBeforeCompleteListener,
134 | AdvertisingEvents.OnBeforePlayListener,
135 | AdvertisingEvents.OnAdStartedListener {
136 |
137 |
138 | // CALLBACKS
139 | private TextView mCallbackLog;
140 | private TextView mCallbackPlayerVersion;
141 | private ArrayList mCallbacksList;
142 | private CheckBox mCheckAll;
143 | private CheckBox mOnIdleCheckBox;
144 | private CheckBox mOnBufferingCheckBox;
145 | private CheckBox mOnPlayCheckBox;
146 | private CheckBox mOnPauseCheckBox;
147 | private CheckBox mOnCompleteCheckBox;
148 | private CheckBox mOnErrorCheckBox;
149 | private CheckBox mOnFullscreenCheckBox;
150 | private CheckBox mOnSeekCheckBox;
151 | private CheckBox mOnTimeCheckBox;
152 | private CheckBox mOnAdPlayCheckBox;
153 | private CheckBox mOnAdPauseCheckBox;
154 | private CheckBox mOnAdCompleteCheckBox;
155 | private CheckBox mOnAdErrorCheckBox;
156 | private CheckBox mOnAdSkipCheckBox;
157 | private CheckBox mOnAdTimeCheckBox;
158 | private CheckBox mOnAdClickCheckBox;
159 | private CheckBox mOnAdImpressionCheckBox;
160 | private CheckBox mOnAdRequestCheckBox;
161 | private CheckBox mOnAudioTracksCheckBox;
162 | private CheckBox mOnAudioTracksChangedCheckBox;
163 | private CheckBox mOnLevelsCheckBox;
164 | private CheckBox mOnLevelsChangedCheckBox;
165 | private CheckBox mOnSeekedCheckBox;
166 | private CheckBox mOnFirstFrameCheckBox;
167 | private CheckBox mOnDisplayClickCheckBox;
168 | private CheckBox mOnPlaylistCompleteCheckBox;
169 | private CheckBox mOnMetaCheckBox;
170 | private CheckBox mOnCaptionsChangedCheckBox;
171 | private CheckBox mOnCaptionsListCheckBox;
172 | private CheckBox mOnPlaylistItemCheckBox;
173 | private CheckBox mOnPlaylistCheckBox;
174 | private CheckBox mOnSetupErrorCheckBox;
175 | private CheckBox mOnBeforeCompleteCheckBox;
176 | private CheckBox mOnBeforePlayCheckBox;
177 | private CheckBox mOnMuteCheckBox;
178 | private CheckBox mOnVisualQualityCheckBox;
179 | private CheckBox mOnAdStartedCheckBox;
180 | private CheckBox mTimeSeconds;
181 | private CheckBox mOnControls;
182 | private CheckBox mOnControlbarVisibilityChanged;
183 | private CheckBox mOnBufferChange;
184 | private CheckBox mOnRelatedClose;
185 | private CheckBox mOnRelatedOpen;
186 | private CheckBox mOnRelatedPlay;
187 | private CheckBox mOnAdCompanion;
188 | private CheckBox mOnAdSchedule;
189 |
190 | private JWPlayer mPlayer;
191 |
192 | private boolean timeInSeconds = false;
193 |
194 |
195 | public CallbackScreen(Context context) {
196 | super(context);
197 | inflate(getContext(), R.layout.view_callback_screen, this);
198 | }
199 |
200 | public CallbackScreen(Context context, AttributeSet attrs, int defStyleAttr) {
201 | super(context, attrs, defStyleAttr);
202 | inflate(getContext(), R.layout.view_callback_screen, this);
203 | }
204 |
205 | public CallbackScreen(Context context, AttributeSet attrs) {
206 | super(context, attrs);
207 | inflate(getContext(), R.layout.view_callback_screen, this);
208 | }
209 |
210 | private void setOutput(String output) {
211 | Log.d("CallbackScreen", output);
212 | mCallbackLog.append(output + "\n\n");
213 | }
214 |
215 |
216 | @Override
217 | public void onAdRequest(AdRequestEvent event) {
218 | String client = event.getClient().name();
219 | String tag = event.getTag();
220 | AdPosition adPosition = event.getAdPosition();
221 | String offset = event.getOffset();
222 |
223 |
224 | String output = "/// onAdRequest START ///" + "\n" +
225 | "Tag:" + "\n" +
226 | tag + "\n" +
227 | "Ad Client:" + "\n" +
228 | client + "\n" +
229 | "Ad Position:" + "\n" +
230 | adPosition + "\n" +
231 | "Ad Offset:" + "\n" +
232 | offset + "\n" +
233 | "/// onAdRequest END ///";
234 | setOutput(output);
235 | }
236 |
237 |
238 | @Override
239 | public void onAdSkipped(AdSkippedEvent event) {
240 | String client = event.getClient().name();
241 | String creativeType = event.getCreativeType();
242 | String tag = event.getTag();
243 | String output = "/// onAdSkipped START ///" + "\n" +
244 | "Tag:" + "\n" +
245 | tag + "\n" +
246 | "Creative Type:" + "\n" +
247 | creativeType + "\n" +
248 | "Ad Client:" + "\n" +
249 | client + "\n" +
250 | "/// onAdSkipped END ///";
251 | setOutput(output);
252 | }
253 |
254 |
255 | @Override
256 | public void onAdClick(AdClickEvent event) {
257 | String creativeType = event.getCreativeType();
258 | String tag = event.getTag();
259 | String client = event.getClient().name();
260 |
261 | String output = "/// onAdClick START ///" + "\n" +
262 | "Tag:" + "\n" +
263 | tag + "\n" +
264 | "Creative Type:" + "\n" +
265 | creativeType + "\n" +
266 | "Client:" + "\n" +
267 | client + "\n" +
268 | "/// onAdClick END ///";
269 | setOutput(output);
270 | }
271 |
272 | @Override
273 | public void onAdImpression(AdImpressionEvent event) {
274 | String creativeType = event.getCreativeType();
275 | String tag = event.getTag();
276 | String client = event.getClient().name();
277 | // AdPosition is an enum now and can return pre, mid, post
278 | String adPosition = event.getAdPosition().name();
279 | String adSystem = event.getAdSystem();
280 | String adTitle = event.getAdTitle();
281 | String linear = event.getLinear();
282 | String mediaFile = event.getMediaFile() != null ? event.getMediaFile().getFile() : "";
283 | String vastVersion = event.getVastVersion();
284 | String clickThroughUrl = event.getClickThroughUrl();
285 |
286 |
287 | String output = "/// onAdImpression START ///" + "\n" +
288 | "Tag:" + "\n" +
289 | tag + "\n" +
290 | "Creative Type:" + "\n" +
291 | creativeType + "\n" +
292 | "Client:" + "\n" +
293 | client + "\n" +
294 | "Ad Position:" + "\n" +
295 | adPosition + "\n" +
296 | "Ad System:" + "\n" +
297 | adSystem + "\n" +
298 | "Ad Title:" + "\n" +
299 | adTitle + "\n" +
300 | "Linear:" + "\n" +
301 | linear + "\n" +
302 | "Media File:" + "\n" +
303 | mediaFile + "\n" +
304 | "Vast Version:" + "\n" +
305 | vastVersion + "\n" +
306 | "Clickthrough URL:" + "\n" +
307 | clickThroughUrl + "\n" +
308 | "/// onAdImpression END ///";
309 | setOutput(output);
310 | }
311 |
312 | @Override
313 | public void onAdPause(AdPauseEvent event) {
314 | PlayerState oldState = event.getOldState();
315 | PlayerState currentState = event.getNewState();
316 | String tag = event.getTag();
317 | String creativeType = event.getCreativeType();
318 |
319 | String output = "/// onAdPause START ///" + "\n" +
320 | "Tag:" + "\n" +
321 | tag + "\n" +
322 | "Creative Type:" + "\n" +
323 | creativeType + "\n" +
324 | "Previous Player State:" + "\n" +
325 | oldState.name() + "\n" +
326 | "Current Player State:" + "\n" +
327 | currentState.name() + "\n" +
328 | "/// onAdPause END ///";
329 | setOutput(output);
330 | }
331 |
332 | @Override
333 | public void onAdPlay(AdPlayEvent event) {
334 | String tag = event.getTag();
335 | String creativeType = event.getCreativeType();
336 | PlayerState oldState = event.getOldState();
337 | PlayerState currentState = event.getNewState();
338 |
339 | String output = "/// onAdPlay START ///" + "\n" +
340 | "Tag:" + "\n" +
341 | tag + "\n" +
342 | "Creative Type:" + "\n" +
343 | creativeType + "\n" +
344 | "Previous Player State:" + "\n" +
345 | oldState.name() + "\n" +
346 | "Current Player State:" + "\n" +
347 | currentState.name() + "\n" +
348 | "/// onAdPlay END ///";
349 | setOutput(output);
350 | }
351 |
352 | private double mOldAdTimeSeconds = 0;
353 | private double mOldAdDurationSeconds = 0;
354 |
355 | @Override
356 | public void onAdTime(AdTimeEvent event) {
357 | String creativeType = event.getCreativeType();
358 | int sequence = event.getSequence();
359 | String tag = event.getTag();
360 | double position = event.getPosition();
361 | double duration = event.getDuration();
362 |
363 | if (mTimeSeconds.isChecked()) {
364 | double adTimeSeconds = Math.floor(position / 1000);
365 | double adDurationSeconds = Math.floor(duration / 1000);
366 |
367 | if (mOldAdTimeSeconds != adTimeSeconds || mOldAdDurationSeconds != adDurationSeconds) {
368 |
369 | mOldAdTimeSeconds = adTimeSeconds;
370 | mOldAdDurationSeconds = adDurationSeconds;
371 |
372 | String output = "/// onAdTime START ///" + "\n" +
373 | "Creative Type:" + "\n" +
374 | creativeType + "\n" +
375 | "Tag:" + "\n" +
376 | tag + "\n" +
377 | "Position:" + "\n" +
378 | adTimeSeconds + "s" + "\n" +
379 | "Duration:" + "\n" +
380 | adDurationSeconds + "s" + "\n" +
381 | "Sequence:" + "\n" +
382 | sequence + "\n" +
383 | "/// onAdTime END ///";
384 | setOutput(output);
385 | }
386 | } else {
387 | String output = "/// onAdTime START ///" + "\n" +
388 | "Creative Type:" + "\n" +
389 | creativeType + "\n" +
390 | "Tag:" + "\n" +
391 | tag + "\n" +
392 | "Position:" + "\n" +
393 | position + "s" + "\n" +
394 | "Duration:" + "\n" +
395 | duration + "s" + "\n" +
396 | "Sequence:" + "\n" +
397 | sequence + "\n" +
398 | "/// onAdTime END ///";
399 | setOutput(output);
400 | }
401 | }
402 |
403 |
404 | @Override
405 | public void onAdComplete(AdCompleteEvent event) {
406 | String client = event.getClient().name();
407 | String creativeType = event.getCreativeType();
408 | String tag = event.getTag();
409 |
410 | String output = "/// onAdComplete START ///" + "\n" +
411 | "Tag:" + "\n" +
412 | tag + "\n" +
413 | "Creative Type:" + "\n" +
414 | creativeType + "\n" +
415 | "Ad Client:" + "\n" +
416 | client + "\n" +
417 | "/// onAdComplete END ///";
418 | setOutput(output);
419 | }
420 |
421 |
422 | @Override
423 | public void onError(ErrorEvent event) {
424 | String message = event.getMessage();
425 | String output = "/// onError START ///" + "\n" +
426 | "Error Message:" + "\n" +
427 | message + "\n" +
428 | "/// onError END ///";
429 | setOutput(output);
430 | }
431 |
432 |
433 | public void registerListeners(JWPlayer player) {
434 |
435 | mPlayer = player;
436 |
437 | mCallbackPlayerVersion = findViewById(R.id.callback_player_version);
438 | mCallbackPlayerVersion.setText("Player Version: " + mPlayer.getVersionCode());
439 |
440 | mCallbackLog = findViewById(R.id.callback_status_tv);
441 | mCallbackLog.setMovementMethod(new ScrollingMovementMethod());
442 |
443 |
444 | // This handles clearing the log
445 | findViewById(R.id.callback_clear_btn).setOnClickListener(v -> mCallbackLog.setText(""));
446 |
447 |
448 | mTimeSeconds = findViewById(R.id.callback_time_seconds);
449 | mTimeSeconds.setOnCheckedChangeListener((buttonView, isChecked) -> timeInSeconds = isChecked);
450 |
451 | mOnCompleteCheckBox = findViewById(R.id.callback_on_complete_check);
452 | mOnCompleteCheckBox.setOnCheckedChangeListener(
453 | new EventCheckChangedListener(mPlayer,EventType.COMPLETE,this)
454 | );
455 | mOnErrorCheckBox = findViewById(R.id.callback_on_error_check);
456 | mOnErrorCheckBox.setOnCheckedChangeListener(
457 | new EventCheckChangedListener(mPlayer,EventType.ERROR,this)
458 | );
459 | mOnFullscreenCheckBox = findViewById(R.id.callback_on_fullscreen_check);
460 | mOnFullscreenCheckBox.setOnCheckedChangeListener(
461 | new EventCheckChangedListener(mPlayer,EventType.FULLSCREEN,this)
462 | );
463 | mOnSeekCheckBox = findViewById(R.id.callback_on_seek_check);
464 | mOnSeekCheckBox.setOnCheckedChangeListener(
465 | new EventCheckChangedListener(mPlayer,EventType.SEEK,this)
466 | );
467 | mOnSeekedCheckBox = findViewById(R.id.callback_on_seeked_check);
468 | mOnSeekedCheckBox.setOnCheckedChangeListener(
469 | new EventCheckChangedListener(mPlayer,EventType.SEEKED,this)
470 | );
471 | mOnIdleCheckBox = findViewById(R.id.callback_on_idle_check);
472 | mOnIdleCheckBox.setOnCheckedChangeListener(
473 | new EventCheckChangedListener(mPlayer,EventType.IDLE,this)
474 | );
475 | mOnBufferingCheckBox = findViewById(R.id.callback_on_buffer_check);
476 | mOnBufferingCheckBox.setOnCheckedChangeListener(
477 | new EventCheckChangedListener(mPlayer,EventType.BUFFER,this)
478 | );
479 | mOnPlayCheckBox = findViewById(R.id.callback_on_play_check);
480 | mOnPlayCheckBox.setOnCheckedChangeListener(
481 | new EventCheckChangedListener(mPlayer,EventType.PLAY,this)
482 | );
483 | mOnPauseCheckBox = findViewById(R.id.callback_on_pause_check);
484 | mOnPauseCheckBox.setOnCheckedChangeListener(
485 | new EventCheckChangedListener(mPlayer,EventType.PAUSE,this)
486 | );
487 | mOnTimeCheckBox = findViewById(R.id.callback_on_time_check);
488 | mOnTimeCheckBox.setOnCheckedChangeListener(
489 | new EventCheckChangedListener(mPlayer,EventType.TIME,this)
490 | );
491 | mOnAdCompleteCheckBox = findViewById(R.id.callback_ad_on_complete_check);
492 | mOnAdCompleteCheckBox.setOnCheckedChangeListener(
493 | new EventCheckChangedListener(mPlayer,EventType.AD_COMPLETE,this)
494 | );
495 | mOnAdErrorCheckBox = findViewById(R.id.callback_ad_on_error_check);
496 | mOnAdErrorCheckBox.setOnCheckedChangeListener(
497 | new EventCheckChangedListener(mPlayer,EventType.AD_ERROR,this)
498 | );
499 | mOnAdSkipCheckBox = findViewById(R.id.callback_ad_on_skip_check);
500 | mOnAdSkipCheckBox.setOnCheckedChangeListener(
501 | new EventCheckChangedListener(mPlayer,EventType.AD_SKIPPED,this)
502 | );
503 | mOnAdPlayCheckBox = findViewById(R.id.callback_ad_on_play_check);
504 | mOnAdPlayCheckBox.setOnCheckedChangeListener(
505 | new EventCheckChangedListener(mPlayer,EventType.AD_PLAY,this)
506 | );
507 | mOnAdPauseCheckBox = findViewById(R.id.callback_ad_on_pause_check);
508 | mOnAdPauseCheckBox.setOnCheckedChangeListener(
509 | new EventCheckChangedListener(mPlayer,EventType.AD_PAUSE,this)
510 | );
511 | mOnAdTimeCheckBox = findViewById(R.id.callback_ad_on_time_check);
512 | mOnAdTimeCheckBox.setOnCheckedChangeListener(
513 | new EventCheckChangedListener(mPlayer,EventType.AD_TIME,this)
514 | );
515 | mOnAdImpressionCheckBox = findViewById(R.id.callback_ad_on_impression_check);
516 | mOnAdImpressionCheckBox.setOnCheckedChangeListener(
517 | new EventCheckChangedListener(mPlayer,EventType.AD_IMPRESSION,this)
518 | );
519 | mOnAdClickCheckBox = findViewById(R.id.callback_ad_on_click_check);
520 | mOnAdClickCheckBox.setOnCheckedChangeListener(
521 | new EventCheckChangedListener(mPlayer,EventType.AD_CLICK,this)
522 | );
523 | mOnAdRequestCheckBox = findViewById(R.id.callback_ad_on_request_check);
524 | mOnAdRequestCheckBox.setOnCheckedChangeListener(
525 | new EventCheckChangedListener(mPlayer,EventType.AD_REQUEST,this)
526 | );
527 | mOnAudioTracksCheckBox = findViewById(R.id.callback_on_audio_tracks_check);
528 | mOnAudioTracksCheckBox.setOnCheckedChangeListener(
529 | new EventCheckChangedListener(mPlayer,EventType.AUDIO_TRACKS,this)
530 | );
531 | mOnAudioTracksChangedCheckBox = findViewById(R.id.callback_on_audio_tracks_changed_check);
532 | mOnAudioTracksChangedCheckBox.setOnCheckedChangeListener(
533 | new EventCheckChangedListener(mPlayer,EventType.AUDIO_TRACK_CHANGED,this)
534 | );
535 | mOnLevelsCheckBox = findViewById(R.id.callback_on_levels_check);
536 | mOnLevelsCheckBox.setOnCheckedChangeListener(
537 | new EventCheckChangedListener(mPlayer,EventType.LEVELS,this)
538 | );
539 | mOnLevelsChangedCheckBox = findViewById(R.id.callback_on_levels_changed_check);
540 | mOnLevelsChangedCheckBox.setOnCheckedChangeListener(
541 | new EventCheckChangedListener(mPlayer,EventType.LEVELS_CHANGED,this)
542 | );
543 | mOnFirstFrameCheckBox = findViewById(R.id.callback_on_first_frame_check);
544 | mOnFirstFrameCheckBox.setOnCheckedChangeListener(
545 | new EventCheckChangedListener(mPlayer,EventType.FIRST_FRAME,this)
546 | );
547 | mOnDisplayClickCheckBox = findViewById(R.id.callback_on_display_click_check);
548 | mOnDisplayClickCheckBox.setOnCheckedChangeListener(
549 | new EventCheckChangedListener(mPlayer,EventType.DISPLAY_CLICK,this)
550 | );
551 | mOnPlaylistCompleteCheckBox = findViewById(R.id.callback_on_playlist_complete_check);
552 | mOnPlaylistCompleteCheckBox.setOnCheckedChangeListener(
553 | new EventCheckChangedListener(mPlayer,EventType.PLAYLIST_COMPLETE,this)
554 | );
555 | mOnMetaCheckBox = findViewById(R.id.callback_on_meta_check);
556 | mOnMetaCheckBox.setOnCheckedChangeListener(
557 | new EventCheckChangedListener(mPlayer,EventType.META,this)
558 | );
559 | mOnCaptionsChangedCheckBox = findViewById(R.id.callback_on_captions_changed_check);
560 | mOnCaptionsChangedCheckBox.setOnCheckedChangeListener(
561 | new EventCheckChangedListener(mPlayer,EventType.CAPTIONS_CHANGED,this)
562 | );
563 | mOnCaptionsListCheckBox = findViewById(R.id.callback_on_captions_list_check);
564 | mOnCaptionsListCheckBox.setOnCheckedChangeListener(
565 | new EventCheckChangedListener(mPlayer,EventType.CAPTIONS_LIST,this)
566 | );
567 | mOnPlaylistItemCheckBox = findViewById(R.id.callback_on_playlist_item_check);
568 | mOnPlaylistItemCheckBox.setOnCheckedChangeListener(
569 | new EventCheckChangedListener(mPlayer,EventType.PLAYLIST_ITEM,this)
570 | );
571 | mOnPlaylistCheckBox = findViewById(R.id.callback_on_playlist_check);
572 | mOnPlaylistCheckBox.setOnCheckedChangeListener(
573 | new EventCheckChangedListener(mPlayer,EventType.PLAYLIST,this)
574 | );
575 | mOnSetupErrorCheckBox = findViewById(R.id.callback_on_setup_error_check);
576 | mOnSetupErrorCheckBox.setOnCheckedChangeListener(
577 | new EventCheckChangedListener(mPlayer,EventType.SETUP_ERROR,this)
578 | );
579 | mOnBeforeCompleteCheckBox = findViewById(R.id.callback_ad_on_before_complete_check);
580 | mOnBeforeCompleteCheckBox.setOnCheckedChangeListener(
581 | new EventCheckChangedListener(mPlayer,EventType.BEFORE_COMPLETE,this)
582 | );
583 | mOnBeforePlayCheckBox = findViewById(R.id.callback_ad_on_before_play_check);
584 | mOnBeforePlayCheckBox.setOnCheckedChangeListener(
585 | new EventCheckChangedListener(mPlayer,EventType.BEFORE_PLAY,this)
586 | );
587 | mOnMuteCheckBox = findViewById(R.id.callback_on_mute_check);
588 | mOnMuteCheckBox.setOnCheckedChangeListener(
589 | new EventCheckChangedListener(mPlayer,EventType.MUTE,this)
590 | );
591 | mOnVisualQualityCheckBox = findViewById(R.id.callback_on_visual_quality_check);
592 | mOnVisualQualityCheckBox.setOnCheckedChangeListener(
593 | new EventCheckChangedListener(mPlayer,EventType.VISUAL_QUALITY,this)
594 | );
595 | mOnAdStartedCheckBox = findViewById(R.id.callback_ad_on_started_check);
596 | mOnAdStartedCheckBox.setOnCheckedChangeListener(
597 | new EventCheckChangedListener(mPlayer,EventType.AD_STARTED,this)
598 | );
599 | mOnControls = findViewById(R.id.callback_on_controls_check);
600 | mOnControls.setOnCheckedChangeListener(
601 | new EventCheckChangedListener(mPlayer,EventType.CONTROLS,this)
602 | );
603 | mOnBufferChange = findViewById(R.id.callback_on_buffer_change_check);
604 | mOnBufferChange.setOnCheckedChangeListener(
605 | new EventCheckChangedListener(mPlayer,EventType.BUFFER_CHANGE,this)
606 | );
607 | mOnRelatedClose = findViewById(R.id.callback_on_related_close_check);
608 | mOnRelatedClose.setOnCheckedChangeListener(
609 | new EventCheckChangedListener(mPlayer,EventType.RELATED_CLOSE,this)
610 | );
611 | mOnRelatedOpen = findViewById(R.id.callback_on_related_open_check);
612 | mOnRelatedOpen.setOnCheckedChangeListener(
613 | new EventCheckChangedListener(mPlayer,EventType.RELATED_OPEN,this)
614 | );
615 | mOnRelatedPlay = findViewById(R.id.callback_on_related_play_check);
616 | mOnRelatedPlay.setOnCheckedChangeListener(
617 | new EventCheckChangedListener(mPlayer,EventType.RELATED_PLAY,this)
618 | );
619 | mOnAdCompanion = findViewById(R.id.callback_ad_on_companion_check);
620 | mOnAdCompanion.setOnCheckedChangeListener(
621 | new EventCheckChangedListener(mPlayer,EventType.AD_COMPANIONS,this)
622 | );
623 | mOnControlbarVisibilityChanged = findViewById(R.id.callback_on_controlbar_visibility_changed_check);
624 | mOnControlbarVisibilityChanged.setOnCheckedChangeListener(
625 | new EventCheckChangedListener(mPlayer,EventType.CONTROLBAR_VISIBILITY,this)
626 | );
627 | mOnAdSchedule = findViewById(R.id.callback_ad_on_schedule_check);
628 | mOnAdSchedule.setOnCheckedChangeListener(
629 | new EventCheckChangedListener(mPlayer,EventType.AD_SCHEDULE,this)
630 | );
631 |
632 | // handles unchecking all boxes
633 | mCallbacksList = new ArrayList<>();
634 | mCallbacksList.add(mOnCompleteCheckBox);
635 | mCallbacksList.add(mOnErrorCheckBox);
636 | mCallbacksList.add(mOnFullscreenCheckBox);
637 | mCallbacksList.add(mOnSeekCheckBox);
638 | mCallbacksList.add(mOnSeekedCheckBox);
639 | mCallbacksList.add(mOnIdleCheckBox);
640 | mCallbacksList.add(mOnBufferingCheckBox);
641 | mCallbacksList.add(mOnPlayCheckBox);
642 | mCallbacksList.add(mOnPauseCheckBox);
643 | mCallbacksList.add(mOnTimeCheckBox);
644 | mCallbacksList.add(mOnAdCompleteCheckBox);
645 | mCallbacksList.add(mOnAdErrorCheckBox);
646 | mCallbacksList.add(mOnAdSkipCheckBox);
647 | mCallbacksList.add(mOnAdPlayCheckBox);
648 | mCallbacksList.add(mOnAdPauseCheckBox);
649 | mCallbacksList.add(mOnAdTimeCheckBox);
650 | mCallbacksList.add(mOnAdImpressionCheckBox);
651 | mCallbacksList.add(mOnAdClickCheckBox);
652 | mCallbacksList.add(mOnAdRequestCheckBox);
653 | mCallbacksList.add(mOnAudioTracksCheckBox);
654 | mCallbacksList.add(mOnAudioTracksChangedCheckBox);
655 | mCallbacksList.add(mOnLevelsCheckBox);
656 | mCallbacksList.add(mOnLevelsChangedCheckBox);
657 | mCallbacksList.add(mOnFirstFrameCheckBox);
658 | mCallbacksList.add(mOnDisplayClickCheckBox);
659 | mCallbacksList.add(mOnPlaylistCompleteCheckBox);
660 | mCallbacksList.add(mOnMetaCheckBox);
661 | mCallbacksList.add(mOnCaptionsChangedCheckBox);
662 | mCallbacksList.add(mOnCaptionsListCheckBox);
663 | mCallbacksList.add(mOnPlaylistItemCheckBox);
664 | mCallbacksList.add(mOnPlaylistCheckBox);
665 | mCallbacksList.add(mOnSetupErrorCheckBox);
666 | mCallbacksList.add(mOnBeforeCompleteCheckBox);
667 | mCallbacksList.add(mOnBeforePlayCheckBox);
668 | mCallbacksList.add(mOnMuteCheckBox);
669 | mCallbacksList.add(mOnVisualQualityCheckBox);
670 | mCallbacksList.add(mOnAdStartedCheckBox);
671 | mCallbacksList.add(mOnControls);
672 | mCallbacksList.add(mOnBufferChange);
673 | mCallbacksList.add(mOnRelatedClose);
674 | mCallbacksList.add(mOnRelatedOpen);
675 | mCallbacksList.add(mOnRelatedPlay);
676 | mCallbacksList.add(mOnAdCompanion);
677 | mCallbacksList.add(mOnControlbarVisibilityChanged);
678 | mCallbacksList.add(mOnAdSchedule);
679 |
680 | // This handles unchecking all checkboxes
681 | mCheckAll = findViewById(R.id.callback_check_all);
682 | mCheckAll = findViewById(R.id.callback_check_all);
683 | mCheckAll.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
684 | @Override
685 | public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
686 | for (CheckBox currectCheckBox : mCallbacksList) {
687 | currectCheckBox.setChecked(isChecked);
688 | }
689 | }
690 | });
691 |
692 |
693 | }
694 |
695 | private void updateListeners() {
696 | for (CheckBox currectCheckBox : mCallbacksList) {
697 | if (currectCheckBox.isChecked()) {
698 | currectCheckBox.setChecked(false);
699 | currectCheckBox.setChecked(true);
700 | }
701 | }
702 | }
703 |
704 | public String getCallbackLog() {
705 | return mCallbackLog.getText().toString();
706 | }
707 |
708 |
709 | @Override
710 | public void onControls(ControlsEvent controlsEvent) {
711 | String prefix = "/// onControls START ///" + "\n";
712 |
713 | String controls = "Controls = " + controlsEvent.getControls() + "\n";
714 | String event = "ControlsEvent = " + controlsEvent.toString() + "\n";
715 |
716 | String suffix = "\n" + "/// onControls END ///";
717 | setOutput(prefix + controls + event + suffix);
718 | }
719 |
720 | @Override
721 | public void onBufferChange(BufferChangeEvent bufferChangeEvent) {
722 | String prefix = "/// onBufferChange START ///" + "\n";
723 |
724 | String percentage = "Buffer Percentage = " + bufferChangeEvent.getBufferPercent() + "\n";
725 | String duration = "Duration = " + bufferChangeEvent.getDuration() + "\n";
726 | String position = "Position = " + bufferChangeEvent.getPosition() + "\n";
727 |
728 | String suffix = "\n" + "/// onBufferChange END ///";
729 | setOutput(prefix + percentage + duration + position + suffix);
730 | }
731 |
732 | @Override
733 | public void onRelatedClose(RelatedCloseEvent relatedCloseEvent) {
734 | String prefix = "/// onRelatedClose START ///" + "\n";
735 |
736 | String method = "Method = " + relatedCloseEvent.getMethod() + "\n";
737 |
738 | String suffix = "\n" + "/// onRelatedClose END ///";
739 | setOutput(prefix + method + suffix);
740 | }
741 |
742 | private String playlistToString(List playlist) {
743 | String result = "[\n";
744 |
745 | for (PlaylistItem item : playlist) {
746 | result += item.getFile();
747 | result += ",";
748 | }
749 |
750 | result += "\n]";
751 | return result;
752 | }
753 |
754 | @Override
755 | public void onRelatedOpen(RelatedOpenEvent relatedOpenEvent) {
756 | String prefix = "/// onRelatedOpen START ///" + "\n";
757 |
758 | String method = "Method = " + relatedOpenEvent.getMethod() + "\n";
759 | String file = "File = " + relatedOpenEvent.getUrl() + "\n";
760 |
761 | String playlist = "Playlist = " + playlistToString(relatedOpenEvent.getItems()) + "\n";
762 |
763 | String suffix = "\n" + "/// onRelatedOpen END ///";
764 | setOutput(prefix + method + file + playlist + suffix);
765 | }
766 |
767 | @Override
768 | public void onRelatedPlay(RelatedPlayEvent relatedPlayEvent) {
769 | String prefix = "/// onRelatedPlay START ///" + "\n";
770 |
771 | String auto = "Auto = " + relatedPlayEvent.getAuto() + "\n";
772 | String item = "";
773 | item = "Item = " + relatedPlayEvent.getItem().getFile() + "\n";
774 |
775 |
776 | String suffix = "\n" + "/// onRelatedPlay END ///";
777 | setOutput(prefix + auto + item + suffix);
778 | }
779 |
780 |
781 | public void updateJWPlayerView(JWPlayer player) {
782 | this.mPlayer = player;
783 | updateListeners();
784 | }
785 |
786 | @Override
787 | public void onControlBarVisibilityChanged(ControlBarVisibilityEvent controlBarVisibilityEvent) {
788 | String prefix = "/// onControlBarVisibilityChanged START ///" + "\n";
789 |
790 | String isVisible = "isVisible = " + controlBarVisibilityEvent.isVisible();
791 |
792 | String suffix = "\n" + "/// onControlBarVisibilityChanged END ///";
793 | setOutput(prefix + isVisible + suffix);
794 | }
795 |
796 | @Override
797 | public void onAdSchedule(AdScheduleEvent adScheduleEvent) {
798 | String prefix = "/// onAdSchedule START ///" + "\n";
799 |
800 | String tag = "Tag = " + adScheduleEvent.getTag() + "\n";
801 | String client = "Client = " + adScheduleEvent.getClient().name() + "\n";
802 |
803 | String json = "";
804 | List adCompanionList = adScheduleEvent.getVmapAdBreaks();
805 | StringBuilder stringBuilder = new StringBuilder();
806 | for (VmapAdBreak vmapAdBreak : adCompanionList) {
807 | stringBuilder.append(vmapAdBreak.getVMapInfo().getId());
808 | }
809 |
810 | json = "List = \n" + stringBuilder.toString() + "\n";
811 |
812 |
813 | String suffix = "\n" + "/// onAdSchedule END ///";
814 | setOutput(prefix + client + tag + json + suffix);
815 | }
816 |
817 | @Override
818 | public void onAdCompanions(AdCompanionsEvent adCompanionsEvent) {
819 | String prefix = "/// onAdCompanion START ///" + "\n";
820 |
821 | String tag = "Tag = " + adCompanionsEvent.getTag() + "\n";
822 |
823 | String item = "";
824 | try {
825 | List adCompanionList = adCompanionsEvent.getCompanions();
826 | JSONArray jsonArray = new JSONArray();
827 | for (AdCompanion adCompanion : adCompanionList) {
828 | JSONObject companionJson = new JSONObject();
829 | companionJson.put("height:", adCompanion.getHeight());
830 | companionJson.put("width:", adCompanion.getWidth());
831 | companionJson.put("type:", adCompanion.getType());
832 | companionJson.put("resource:", adCompanion.getResource());
833 | companionJson.put("click:", adCompanion.getClick());
834 | companionJson.put("creatives", adCompanion.getCreativeViews());
835 | jsonArray.put(companionJson);
836 | }
837 |
838 | item = "Ad Companions = \n" + jsonArray.toString(4) + "\n";
839 | } catch (JSONException e) {
840 | e.printStackTrace();
841 | }
842 |
843 | String suffix = "\n" + "/// onAdCompanion END ///";
844 | setOutput(prefix + tag + item + suffix);
845 | }
846 |
847 | @Override
848 | public void onAdError(AdErrorEvent adErrorEvent) {
849 | String output = "/// onAdError START ///" + "\n" +
850 | "Message:" + "\n" +
851 | adErrorEvent.getMessage() + "\n" +
852 | "Tag:" + "\n" +
853 | adErrorEvent.getTag() + "\n" +
854 | "/// onAdError END ///";
855 | setOutput(output);
856 | }
857 |
858 | @Override
859 | public void onAdStarted(AdStartedEvent adStartedEvent) {
860 | String output = "/// onAdStarted START ///" + "\n" +
861 | "Creative Type:" + "\n" +
862 | adStartedEvent.getCreativeType() + "\n" +
863 | "Tag:" + "\n" +
864 | adStartedEvent.getTag() + "\n" +
865 | "/// onAdStarted END ///";
866 | setOutput(output);
867 | }
868 |
869 | @Override
870 | public void onBeforeComplete(BeforeCompleteEvent beforeCompleteEvent) {
871 | String output = "/// onBeforeComplete START ///" + "\n" +
872 | "/// onBeforeComplete END ///";
873 | setOutput(output);
874 | }
875 |
876 | @Override
877 | public void onBeforePlay(BeforePlayEvent beforePlayEvent) {
878 | String output = "/// onBeforePlay START ///" + "\n" +
879 | "/// onBeforePlay END ///";
880 | setOutput(output);
881 | }
882 |
883 | @Override
884 | public void onAudioTrackChanged(AudioTrackChangedEvent audioTrackChangedEvent) {
885 | String output = "/// onAudioTrackChanged START ///" + "\n" +
886 | "Current AudioTrack Index:" + "\n" +
887 | audioTrackChangedEvent.getCurrentTrack() + "\n" +
888 | "/// onAudioTrackChanged END ///";
889 | setOutput(output);
890 | }
891 |
892 | @Override
893 | public void onAudioTracks(AudioTracksEvent audioTracksEvent) {
894 | String prefix = "/// onAudioTracks START ///" + "\n";
895 |
896 | StringBuilder stringBuilder = new StringBuilder();
897 | for (AudioTrack currentTrack : audioTracksEvent.getAudioTracks()) {
898 | String separator = "-------------" + "\n";
899 | String name = "Name: " + currentTrack.getName() + "\n";
900 | String lang = "Language: " + currentTrack.getLanguage() + "\n";
901 | String groupId = "Group ID: " + currentTrack.getGroupId() + "\n";
902 | String autoSelect = "Autoselect: " + currentTrack.isAutoSelect() + "\n";
903 | String defaultTrack = "Default: " + currentTrack.isDefaultTrack() + "\n";
904 | stringBuilder.append(name)
905 | .append(lang)
906 | .append(groupId)
907 | .append(autoSelect)
908 | .append(defaultTrack)
909 | .append(separator);
910 | }
911 |
912 | String suffix = "\n" + "/// onAudioTracks END ///";
913 | setOutput(prefix + stringBuilder.toString() + suffix);
914 | }
915 |
916 | @Override
917 | public void onBuffer(BufferEvent bufferEvent) {
918 | String output = "/// onBuffer START ///" + "\n" +
919 | "Previous Player State:" + "\n" +
920 | bufferEvent.getOldState().name() + "\n" +
921 | "/// onBuffer END ///";
922 | setOutput(output);
923 | }
924 |
925 | @Override
926 | public void onCaptionsChanged(CaptionsChangedEvent captionsChangedEvent) {
927 | String output = "/// onCaptionsChanged START ///" + "\n" +
928 | "Current Caption Index:" + "\n" +
929 | captionsChangedEvent.getCurrentTrack() + "\n" +
930 | "/// onCaptionsChanged END ///";
931 | setOutput(output);
932 | }
933 |
934 | @Override
935 | public void onCaptionsList(CaptionsListEvent captionsListEvent) {
936 | String prefix = "/// onCaptionsList START ///" + "\n";
937 |
938 | StringBuilder stringBuilder = new StringBuilder();
939 | for (Caption currentCaption : captionsListEvent.getCaptions()) {
940 | String separator = "-------------" + "\n";
941 | String isDefault = "";
942 | String file = "";
943 | String label = "";
944 | String kind = "";
945 | if (currentCaption.getFile() != null) {
946 | file = "File: " + currentCaption.getFile() + "\n";
947 | }
948 | if (currentCaption.getLabel() != null) {
949 | label = "Label: " + currentCaption.getLabel() + "\n";
950 | }
951 | if (currentCaption.getKind() != null) {
952 | kind = "Kind: " + currentCaption.getKind().name() + "\n";
953 | }
954 | isDefault = "isDefault: " + currentCaption.isDefault() + "\n";
955 |
956 | stringBuilder.append(file).append(label).append(kind).append(isDefault)
957 | .append(separator);
958 | }
959 |
960 | String suffix = "\n" + "/// onCaptionsList END ///";
961 | setOutput(prefix + stringBuilder.toString() + suffix);
962 | }
963 |
964 | @Override
965 | public void onComplete(CompleteEvent completeEvent) {
966 | String output = "/// onComplete START ///" + "\n" +
967 | "/// onComplete END ///";
968 | setOutput(output);
969 | }
970 |
971 | @Override
972 | public void onDisplayClick(DisplayClickEvent displayClickEvent) {
973 | String output = "/// onDisplayClick START ///" + "\n" +
974 | "/// onDisplayClick END ///";
975 | setOutput(output);
976 | }
977 |
978 | @Override
979 | public void onFirstFrame(FirstFrameEvent firstFrameEvent) {
980 | String output = "/// onFirstFrame START ///" + "\n" +
981 | "First Frame:" + "\n" +
982 | firstFrameEvent.getLoadTime() + "ms" + "\n" +
983 | "/// onFirstFrame END ///";
984 | setOutput(output);
985 | }
986 |
987 | @Override
988 | public void onFullscreen(FullscreenEvent fullscreenEvent) {
989 | String output = "/// onFullscreen START ///" + "\n" +
990 | "Fullscreen:" + "\n" +
991 | fullscreenEvent.getFullscreen() + "\n" +
992 | "/// onFullscreen END ///";
993 | setOutput(output);
994 | }
995 |
996 | @Override
997 | public void onIdle(IdleEvent idleEvent) {
998 | String output = "/// onIdle START ///" + "\n" +
999 | "Previous Player State:" + "\n" +
1000 | idleEvent.getOldState().name() + "\n" +
1001 | "/// onIdle END ///";
1002 | setOutput(output);
1003 | }
1004 |
1005 | @Override
1006 | public void onLevelsChanged(LevelsChangedEvent levelsChangedEvent) {
1007 | String output = "/// onLevelsChanged START ///" + "\n" +
1008 | "Current Level Index:" + "\n" +
1009 | levelsChangedEvent.getCurrentQualityIndex() + "\n" +
1010 | "/// onLevelsChanged END ///";
1011 | setOutput(output);
1012 | }
1013 |
1014 | @Override
1015 | public void onLevels(LevelsEvent levelsEvent) {
1016 | String prefix = "/// onLevels START ///" + "\n";
1017 | StringBuilder stringBuilder = new StringBuilder();
1018 |
1019 | for (QualityLevel currentLevel : levelsEvent.getLevels()) {
1020 | String separator = "-------------" + "\n";
1021 | String index = "Track Index: " + currentLevel.getTrackIndex() + "\n";
1022 | String label = "Label: " + currentLevel.getLabel() + "\n";
1023 | String bitrate = "Bitrate: " + currentLevel.getBitrate() + "\n";
1024 | String height = "Height: " + currentLevel.getHeight() + "\n";
1025 | String width = "Width: " + currentLevel.getWidth() + "\n";
1026 | String playlistPosition = "Playlist Position: " + currentLevel
1027 | .getPlaylistPosition() + "\n";
1028 | stringBuilder.append(index).append(label).append(bitrate).append(height).append(width)
1029 | .append(playlistPosition).append(separator);
1030 | }
1031 |
1032 | String suffix = "\n" + "/// onLevels END ///";
1033 | setOutput(prefix + stringBuilder.toString() + suffix);
1034 | }
1035 |
1036 | @Override
1037 | public void onMeta(MetaEvent metaEvent) {
1038 | String prefix = "/// onMeta START ///" + "\n";
1039 | String body = "";
1040 | Metadata metadata = metaEvent.getMetadata();
1041 | String videoID = "Video ID: " + metadata.getVideoId() + "\n";
1042 | String videoMimeType = "Video MimeType: " + metadata.getVideoMimeType() + "\n";
1043 | String videoBitrate = "Video Bitrate: " + metadata.getVideoBitrate() + "\n";
1044 | String framerate = "Framerate: " + metadata.getFramerate() + "\n";
1045 | String droppedFrames = "Dropped Frames: " + metadata.getDroppedFrames() + "\n";
1046 | String width = "Width: " + metadata.getWidth() + "\n";
1047 | String height = "Height: " + metadata.getHeight() + "\n";
1048 | String lang = "Language: " + metadata.getLanguage() + "\n";
1049 | String audioID = "Audio ID: " + metadata.getAudioId() + "\n";
1050 | String audioMimeType = "Audio MimeType: " + metadata.getAudioMimeType() + "\n";
1051 | String audioBitrate = "Audio Bitrate: " + metadata.getAudioBitrate() + "\n";
1052 | String audioChannels = "Audio Channels: " + metadata.getAudioChannels() + "\n";
1053 | String audioSamplingRate = "Audio Sampling Rate: " + metadata.getAudioSamplingRate() + "\n";
1054 | String meta = "Metadata:\n" + metadata.getId3Metadata().toString() + "\n";
1055 |
1056 | body += videoID + videoMimeType + videoBitrate + framerate + droppedFrames + width + height + lang + audioID + audioMimeType + audioBitrate + audioChannels + audioSamplingRate + meta;
1057 |
1058 | String suffix = "\n" + "/// onMeta END ///";
1059 |
1060 | setOutput(prefix + body + suffix);
1061 | }
1062 |
1063 | @Override
1064 | public void onMute(MuteEvent muteEvent) {
1065 | String output = "/// onMute START ///" + "\n" +
1066 | "Mute: " + "\n" +
1067 | muteEvent.getMute() + "\n" +
1068 | "/// onMute END ///";
1069 | setOutput(output);
1070 | }
1071 |
1072 | @Override
1073 | public void onPause(PauseEvent pauseEvent) {
1074 | String output = "/// onPause START ///" + "\n" +
1075 | "Previous Player State:" + "\n" +
1076 | pauseEvent.getOldState().name() + "\n" +
1077 | "/// onPause END ///";
1078 | setOutput(output);
1079 | }
1080 |
1081 | @Override
1082 | public void onPlay(PlayEvent playEvent) {
1083 | String output = "/// onPlay START ///" + "\n" +
1084 | "Previous Player State:" + "\n" +
1085 | playEvent.getOldState().name() + "\n" +
1086 | "/// onPlay END ///";
1087 | setOutput(output);
1088 | }
1089 |
1090 | @Override
1091 | public void onPlaylistComplete(PlaylistCompleteEvent playlistCompleteEvent) {
1092 | String output = "/// onPlaylistComplete START ///" + "\n" +
1093 | "/// onPlaylistComplete END ///";
1094 | setOutput(output);
1095 | }
1096 |
1097 | @Override
1098 | public void onPlaylistItem(PlaylistItemEvent playlistItemEvent) {
1099 | String output = "/// onPlaylistItem START ///" + "\n" +
1100 | "Current PlaylistItem Index:" + "\n" +
1101 | playlistItemEvent.getIndex() + "\n" +
1102 | "PlaylistItem JSON:" + "\n" +
1103 | playlistItemEvent.getPlaylistItem().getFile() + "\n" +
1104 | "/// onPlaylistItem END ///";
1105 | setOutput(output);
1106 | }
1107 |
1108 | @Override
1109 | public void onPlaylist(PlaylistEvent playlistEvent) {
1110 | String prefix = "/// onPlaylist START ///" + "\n";
1111 |
1112 | StringBuilder builder = new StringBuilder();
1113 | for (PlaylistItem currentItem : playlistEvent.getPlaylist()) {
1114 | String separator = "-------------" + "\n";
1115 | String item = currentItem.getFile();
1116 |
1117 | builder.append(item).append(separator);
1118 | }
1119 |
1120 | String suffix = "\n" + "/// onPlaylist END ///";
1121 | setOutput(prefix + builder.toString() + suffix);
1122 | }
1123 |
1124 | @Override
1125 | public void onSeek(SeekEvent seekEvent) {
1126 | String output = "/// onSeek START ///" + "\n" +
1127 | "Position:" + "\n" +
1128 | seekEvent.getPosition() + "s" + "\n" +
1129 | "Offset:" + "\n" +
1130 | seekEvent.getOffset() + "s" + "\n" +
1131 | "/// onSeek END ///";
1132 | setOutput(output);
1133 | }
1134 |
1135 | @Override
1136 | public void onSeeked(SeekedEvent seekedEvent) {
1137 | String output = "/// onSeeked START ///" + "\n" +
1138 | "Position:" + "\n" +
1139 | seekedEvent.getPosition() + "s" + "\n" +
1140 | "/// onSeeked END ///";
1141 | setOutput(output);
1142 | }
1143 |
1144 | @Override
1145 | public void onSetupError(SetupErrorEvent setupErrorEvent) {
1146 | String output = "/// onSetupError START ///" + "\n" +
1147 | "Error Message:" + "\n" +
1148 | setupErrorEvent.getMessage() + "\n" +
1149 | "/// onSetupError END ///";
1150 | setOutput(output);
1151 | }
1152 |
1153 | private double mOldTime = 0;
1154 |
1155 | @Override
1156 | public void onTime(TimeEvent timeEvent) {
1157 |
1158 | double positionSeconds = timeEvent.getPosition();
1159 | double durationSeconds = timeEvent.getDuration();
1160 |
1161 | if (timeInSeconds) {
1162 | double roundedSeconds = Math.floor(positionSeconds);
1163 | if (mOldTime != roundedSeconds) {
1164 | mOldTime = roundedSeconds;
1165 | String output = "/// onTime START ///" + "\n" +
1166 | "Current Position:" + "\n" +
1167 | roundedSeconds + "s" + "\n" +
1168 | "Total Duration:" + "\n" +
1169 | durationSeconds + "s" + "\n" +
1170 | "/// onTime END ///";
1171 |
1172 | setOutput(output);
1173 | }
1174 | } else {
1175 | String output = "/// onTime START ///" + "\n" +
1176 | "Current Position:" + "\n" +
1177 | positionSeconds + "s" + "\n" +
1178 | "Total Duration:" + "\n" +
1179 | durationSeconds + "s" + "\n" +
1180 | "/// onTime END ///";
1181 |
1182 | setOutput(output);
1183 | }
1184 | }
1185 |
1186 | @Override
1187 | public void onVisualQuality(VisualQualityEvent visualQualityEvent) {
1188 | String prefix = "/// onVisualQuality START ///" + "\n";
1189 |
1190 | String mode = "Mode = " + visualQualityEvent.getMode().name() + "\n";
1191 | String qualityLevel = "Quality Level = " + visualQualityEvent.getQualityLevel().getLabel() + "\n";
1192 | String reason = "Reason = " + visualQualityEvent.getReason().name();
1193 |
1194 | String suffix = "\n" + "/// onVisualQuality END ///";
1195 | setOutput(prefix + mode + qualityLevel + reason + suffix);
1196 | }
1197 | }
--------------------------------------------------------------------------------