Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- package mypackage.viewmodel;
- import android.content.Context;
- import android.content.Intent;
- import android.databinding.BaseObservable;
- import android.databinding.Bindable;
- import android.net.Uri;
- import android.os.Handler;
- import android.support.v7.widget.LinearLayoutManager;
- import android.util.Log;
- import android.view.View;
- import android.view.WindowManager;
- import com.android.databinding.library.baseAdapters.BR;
- import com.google.android.exoplayer2.DefaultLoadControl;
- import com.google.android.exoplayer2.ExoPlaybackException;
- import com.google.android.exoplayer2.ExoPlayer;
- import com.google.android.exoplayer2.ExoPlayerFactory;
- import com.google.android.exoplayer2.Format;
- import com.google.android.exoplayer2.LoadControl;
- import com.google.android.exoplayer2.SimpleExoPlayer;
- import com.google.android.exoplayer2.Timeline;
- import com.google.android.exoplayer2.source.AdaptiveMediaSourceEventListener;
- import com.google.android.exoplayer2.source.BehindLiveWindowException;
- import com.google.android.exoplayer2.source.MediaSource;
- import com.google.android.exoplayer2.source.TrackGroupArray;
- import com.google.android.exoplayer2.source.hls.HlsMediaSource;
- import com.google.android.exoplayer2.trackselection.AdaptiveVideoTrackSelection;
- import com.google.android.exoplayer2.trackselection.DefaultTrackSelector;
- import com.google.android.exoplayer2.trackselection.TrackSelection;
- import com.google.android.exoplayer2.trackselection.TrackSelectionArray;
- import com.google.android.exoplayer2.trackselection.TrackSelector;
- import com.google.android.exoplayer2.upstream.BandwidthMeter;
- import com.google.android.exoplayer2.upstream.DataSource;
- import com.google.android.exoplayer2.upstream.DataSpec;
- import com.google.android.exoplayer2.upstream.DefaultBandwidthMeter;
- import com.google.android.exoplayer2.upstream.DefaultHttpDataSourceFactory;
- import com.google.android.exoplayer2.util.Util;
- import java.io.IOException;
- import java.util.ArrayList;
- import java.util.List;
- import java.util.concurrent.Executors;
- import java.util.concurrent.ScheduledExecutorService;
- import java.util.concurrent.TimeUnit;
- import mypackage.ChannelRecyclerViewAdapter;
- import mypackage.DBHelper;
- import mypackage.ChannelRCV;
- import mypackage.WebTvChannel;
- import mypackage.DownloadEPGService;
- /**
- * Created by lazar on 3.2.17..
- */
- public class MainViewModel extends BaseObservable implements ExoPlayer.EventListener {
- private static MainViewModel mainViewModel;
- private final Context context;
- private LinearLayoutManager mLinearLayoutManager;
- private List<ChannelRCV> channelRCVList;
- private SimpleExoPlayer player;
- private ChannelRecyclerViewAdapter recyclerViewAdapter;
- private ChannelRCV currentChannelRCV;
- private Handler mainHandler;
- private BandwidthMeter bandwidthMeter;
- private TrackSelection.Factory videoTrackSelectionFactory;
- private TrackSelector trackSelector;
- private LoadControl loadControl;
- private DataSource.Factory dataSourceFactory;
- private DBHelper dbHelper = DBHelper.getInstance();
- private MediaSource videoSource;
- private View previousView = null;
- private Intent mServiceIntent;
- //TODO CONSTRUCTOR MainViewModel
- private MainViewModel(Context context) {
- this.context = context;
- recyclerViewAdapter = new ChannelRecyclerViewAdapter();
- channelRCVList = convertList(dbHelper.getWebTvChannelDao().loadAll());
- currentChannelRCV = channelRCVList.get(0);
- recyclerViewAdapter.setList(channelRCVList);
- recyclerViewAdapter.notifyDataSetChanged();
- mLinearLayoutManager = new LinearLayoutManager(context);
- mLinearLayoutManager.setOrientation(LinearLayoutManager.VERTICAL);
- mLinearLayoutManager.setSmoothScrollbarEnabled(true);
- mServiceIntent = new Intent(context, DownloadEPGService.class);
- /*Intent downloadEPGService = new Intent(context, DownloadEPGService.class);
- context.startService(downloadEPGService);*/
- }
- public static MainViewModel getInstance(Context context) {
- if (mainViewModel == null) {
- mainViewModel = new MainViewModel(context);
- mainViewModel.setupPlayer();
- return mainViewModel;
- } else
- return mainViewModel;
- }
- private List<ChannelRCV> convertList(List<WebTvChannel> webTvChannels) {
- List<ChannelRCV> channelRCVs = new ArrayList<>();
- for (WebTvChannel ch : webTvChannels) {
- channelRCVs.add(new ChannelRCV(ch.getName(), ch.getUrl()));
- }
- return channelRCVs;
- }
- @Bindable
- public SimpleExoPlayer getPlayer() {
- return player;
- }
- public void setPlayer(SimpleExoPlayer player) {
- this.player = player;
- notifyPropertyChanged(BR.player);
- }
- public void setupPlayer() {
- /*try {*/
- mainHandler = new Handler();
- bandwidthMeter = new DefaultBandwidthMeter();
- videoTrackSelectionFactory = new AdaptiveVideoTrackSelection.Factory(bandwidthMeter);
- trackSelector = new DefaultTrackSelector(videoTrackSelectionFactory);
- loadControl = new DefaultLoadControl();
- player = ExoPlayerFactory.newSimpleInstance(context, trackSelector, loadControl, null, SimpleExoPlayer.EXTENSION_RENDERER_MODE_PREFER);
- DefaultBandwidthMeter defaultBandwidthMeter = new DefaultBandwidthMeter();
- dataSourceFactory = new DefaultHttpDataSourceFactory(Util.getUserAgent(context, "AOC"),defaultBandwidthMeter);
- videoSource = new HlsMediaSource(Uri.parse(currentChannelRCV.getUrl()), dataSourceFactory, mainHandler, new AdaptiveMediaSourceEventListener() {
- @Override
- public void onLoadStarted(DataSpec dataSpec, int dataType, int trackType, Format trackFormat, int trackSelectionReason, Object trackSelectionData, long mediaStartTimeMs, long mediaEndTimeMs, long elapsedRealtimeMs) {
- }
- @Override
- public void onLoadCompleted(DataSpec dataSpec, int dataType, int trackType, Format trackFormat, int trackSelectionReason, Object trackSelectionData, long mediaStartTimeMs, long mediaEndTimeMs, long elapsedRealtimeMs, long loadDurationMs, long bytesLoaded) {
- }
- @Override
- public void onLoadCanceled(DataSpec dataSpec, int dataType, int trackType, Format trackFormat, int trackSelectionReason, Object trackSelectionData, long mediaStartTimeMs, long mediaEndTimeMs, long elapsedRealtimeMs, long loadDurationMs, long bytesLoaded) {
- }
- @Override
- public void onLoadError(DataSpec dataSpec, int dataType, int trackType, Format trackFormat, int trackSelectionReason, Object trackSelectionData, long mediaStartTimeMs, long mediaEndTimeMs, long elapsedRealtimeMs, long loadDurationMs, long bytesLoaded, IOException error, boolean wasCanceled) {
- }
- @Override
- public void onUpstreamDiscarded(int trackType, long mediaStartTimeMs, long mediaEndTimeMs) {
- }
- @Override
- public void onDownstreamFormatChanged(int trackType, Format trackFormat, int trackSelectionReason, Object trackSelectionData, long mediaTimeMs) {
- }
- });
- player.prepare(videoSource);
- player.setPlayWhenReady(true);
- setPlayer(player);
- /*} catch (Exception ex) {
- //setupPlayer();
- System.out.println("Start Player error : " + ex.toString());
- }*/
- }
- public void changeChannel(ChannelRCV channelRCV) {
- if (channelRCV.getUrl() == null) {
- return;
- }
- /* try {*/
- videoSource = new HlsMediaSource(Uri.parse(currentChannelRCV.getUrl()), dataSourceFactory, mainHandler, new AdaptiveMediaSourceEventListener() {
- @Override
- public void onLoadStarted(DataSpec dataSpec, int dataType, int trackType, Format trackFormat, int trackSelectionReason, Object trackSelectionData, long mediaStartTimeMs, long mediaEndTimeMs, long elapsedRealtimeMs) {
- }
- @Override
- public void onLoadCompleted(DataSpec dataSpec, int dataType, int trackType, Format trackFormat, int trackSelectionReason, Object trackSelectionData, long mediaStartTimeMs, long mediaEndTimeMs, long elapsedRealtimeMs, long loadDurationMs, long bytesLoaded) {
- }
- @Override
- public void onLoadCanceled(DataSpec dataSpec, int dataType, int trackType, Format trackFormat, int trackSelectionReason, Object trackSelectionData, long mediaStartTimeMs, long mediaEndTimeMs, long elapsedRealtimeMs, long loadDurationMs, long bytesLoaded) {
- }
- @Override
- public void onLoadError(DataSpec dataSpec, int dataType, int trackType, Format trackFormat, int trackSelectionReason, Object trackSelectionData, long mediaStartTimeMs, long mediaEndTimeMs, long elapsedRealtimeMs, long loadDurationMs, long bytesLoaded, IOException error, boolean wasCanceled) {
- }
- @Override
- public void onUpstreamDiscarded(int trackType, long mediaStartTimeMs, long mediaEndTimeMs) {
- }
- @Override
- public void onDownstreamFormatChanged(int trackType, Format trackFormat, int trackSelectionReason, Object trackSelectionData, long mediaTimeMs) {
- }
- });
- player.prepare(videoSource);
- player.setPlayWhenReady(true);
- setPlayer(player);
- /* } catch (Exception ex) {
- System.out.println("CHANGE CHANNEL ERROR:"+ ex.toString());
- changeChannel(channelRCV);
- }*/
- }
- public ChannelRecyclerViewAdapter getRecyclerViewAdapter() {
- return recyclerViewAdapter;
- }
- public LinearLayoutManager getLinearLayoutManager() {
- return mLinearLayoutManager;
- }
- public int fullscreen() {
- return WindowManager.LayoutParams.FLAG_FULLSCREEN;
- }
- public void onClick(View view, ChannelRCV channelRCV) {
- /*if (previousView == null) {
- recyclerViewAdapter.getFirstHolder().itemView.setBackgroundColor(Color.TRANSPARENT);
- previousView = view;
- view.setBackgroundColor(Color.parseColor("#4287F4"));
- } else {
- previousView.setBackgroundColor(Color.TRANSPARENT);
- previousView = view;
- view.setBackgroundColor(Color.parseColor("#4287F4"));
- }
- //view.setBackgroundColor(Color.parseColor("#FF0000"));*/
- currentChannelRCV = channelRCV;
- changeChannel(channelRCV);
- }
- // TODO Scheduler
- private void testSchedule() {
- ScheduledExecutorService scheduler = Executors.newSingleThreadScheduledExecutor();
- scheduler.scheduleAtFixedRate(new Runnable() {
- public void run() {
- //TODO WORK HERE for Scheduler
- System.out.println("*** 789 ***");
- context.startService(mServiceIntent);
- }
- }, 0, 5, TimeUnit.MINUTES);
- }
- public void updateRecyclerViewList(List<ChannelRCV> channelRCVs) {
- //get data from db, parse them to list
- //set list and notify update
- channelRCVList = channelRCVs;
- recyclerViewAdapter.setList(channelRCVs);
- changeChannel(channelRCVs.get(0));
- recyclerViewAdapter.notifyDataSetChanged();
- player.release();
- setupPlayer();
- }
- @Override
- public void onTimelineChanged(Timeline timeline, Object manifest) {
- }
- @Override
- public void onTracksChanged(TrackGroupArray trackGroups, TrackSelectionArray trackSelections) {
- }
- @Override
- public void onLoadingChanged(boolean isLoading) {
- }
- @Override
- public void onPlayerStateChanged(boolean playWhenReady, int playbackState) {
- }
- @Override
- public void onPlayerError(ExoPlaybackException error) {
- Log.e("OnPlayerError","Error ExoPlayer");
- if (isBehindLiveWindow(error)) {
- Log.e("OnPlayerError","starting again");
- //player.release();
- player.release();
- changeChannel(currentChannelRCV);
- }
- }
- @Override
- public void onPositionDiscontinuity() {
- }
- private static boolean isBehindLiveWindow(ExoPlaybackException e) {
- if (e.type != ExoPlaybackException.TYPE_SOURCE) {
- return false;
- }
- Throwable cause = e.getSourceException();
- while (cause != null) {
- if (cause instanceof BehindLiveWindowException) {
- return true;
- }
- cause = cause.getCause();
- }
- return false;
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement