package io.github.xwz.base.player; import android.os.Handler; import android.util.Log; import android.util.Pair; import com.google.android.exoplayer.ExoPlayer; import java.util.ArrayList; import java.util.List; public class DurationLogger implements Runnable, VideoPlayer.Listener { private static final String TAG = "VideoTimeLogger"; private static final int REFRESH_INTERVAL_MS = 1000; private final Handler handler = new Handler(); private VideoPlayer player; private int state; private List<Pair<Long, OnTimeReached>> listeners = new ArrayList<>(); public void start(VideoPlayer player) { this.stop(); this.player = player; this.run(); } private void stop() { handler.removeCallbacks(this); player = null; } public void endSession() { stop(); listeners = new ArrayList<>(); } /** * Listen for time remaining, in seconds, during play back. * * @param remaining seconds remaining * @param listener listener */ public void addListener(long remaining, OnTimeReached listener) { listeners.add(new Pair<>(remaining, listener)); } @Override public void run() { if (player != null) { //Log.d(TAG, "duration: " + player.getDuration() / 1000 + ", position:" + player.getCurrentPosition() / 1000); executeListeners(); } handler.postDelayed(this, REFRESH_INTERVAL_MS); } private void executeListeners() { long duration = player.getDuration() / 1000; long position = player.getCurrentPosition() / 1000; List<Pair<Long, OnTimeReached>> executed = new ArrayList<>(); if (duration > 0 && (state == ExoPlayer.STATE_READY || state == ExoPlayer.STATE_ENDED)) { long remain = duration - position; for (Pair<Long, OnTimeReached> listener : listeners) { long condition = listener.first; if (remain <= condition) { Log.d(TAG, "Executing listener, duration=" + duration + ", position=" + position + ", remaining=" + remain); listener.second.onPositionRemainingReached(duration, position); executed.add(listener); } } } listeners.removeAll(executed); } @Override public void onStateChanged(boolean playWhenReady, int playbackState) { state = playbackState; String text = "playWhenReady=" + playWhenReady + ", playbackState="; switch (playbackState) { case ExoPlayer.STATE_BUFFERING: text += "buffering"; break; case ExoPlayer.STATE_ENDED: text += "ended"; break; case ExoPlayer.STATE_IDLE: text += "idle"; break; case ExoPlayer.STATE_PREPARING: text += "preparing"; break; case ExoPlayer.STATE_READY: text += "ready"; break; default: text += "unknown"; break; } Log.d(TAG, text); } @Override public void onError(Exception e) { } @Override public void onVideoSizeChanged(int width, int height, float pixelWidthHeightRatio) { } public interface OnTimeReached { void onPositionRemainingReached(long duration, long position); } }