Advertisement
lazar00

viewmodel

Feb 22nd, 2017
1,186
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 12.99 KB | None | 0 0
  1. package mypackage.viewmodel;
  2.  
  3. import android.content.Context;
  4. import android.content.Intent;
  5. import android.databinding.BaseObservable;
  6. import android.databinding.Bindable;
  7. import android.net.Uri;
  8. import android.os.Handler;
  9. import android.support.v7.widget.LinearLayoutManager;
  10. import android.util.Log;
  11. import android.view.View;
  12. import android.view.WindowManager;
  13.  
  14. import com.android.databinding.library.baseAdapters.BR;
  15. import com.google.android.exoplayer2.DefaultLoadControl;
  16. import com.google.android.exoplayer2.ExoPlaybackException;
  17. import com.google.android.exoplayer2.ExoPlayer;
  18. import com.google.android.exoplayer2.ExoPlayerFactory;
  19. import com.google.android.exoplayer2.Format;
  20. import com.google.android.exoplayer2.LoadControl;
  21. import com.google.android.exoplayer2.SimpleExoPlayer;
  22. import com.google.android.exoplayer2.Timeline;
  23. import com.google.android.exoplayer2.source.AdaptiveMediaSourceEventListener;
  24. import com.google.android.exoplayer2.source.BehindLiveWindowException;
  25. import com.google.android.exoplayer2.source.MediaSource;
  26. import com.google.android.exoplayer2.source.TrackGroupArray;
  27. import com.google.android.exoplayer2.source.hls.HlsMediaSource;
  28. import com.google.android.exoplayer2.trackselection.AdaptiveVideoTrackSelection;
  29. import com.google.android.exoplayer2.trackselection.DefaultTrackSelector;
  30. import com.google.android.exoplayer2.trackselection.TrackSelection;
  31. import com.google.android.exoplayer2.trackselection.TrackSelectionArray;
  32. import com.google.android.exoplayer2.trackselection.TrackSelector;
  33. import com.google.android.exoplayer2.upstream.BandwidthMeter;
  34. import com.google.android.exoplayer2.upstream.DataSource;
  35. import com.google.android.exoplayer2.upstream.DataSpec;
  36. import com.google.android.exoplayer2.upstream.DefaultBandwidthMeter;
  37. import com.google.android.exoplayer2.upstream.DefaultHttpDataSourceFactory;
  38. import com.google.android.exoplayer2.util.Util;
  39.  
  40. import java.io.IOException;
  41. import java.util.ArrayList;
  42. import java.util.List;
  43. import java.util.concurrent.Executors;
  44. import java.util.concurrent.ScheduledExecutorService;
  45. import java.util.concurrent.TimeUnit;
  46.  
  47. import mypackage.ChannelRecyclerViewAdapter;
  48. import mypackage.DBHelper;
  49. import mypackage.ChannelRCV;
  50. import mypackage.WebTvChannel;
  51. import mypackage.DownloadEPGService;
  52.  
  53. /**
  54.  * Created by lazar on 3.2.17..
  55.  */
  56.  
  57. public class MainViewModel extends BaseObservable implements ExoPlayer.EventListener {
  58.  
  59.     private static MainViewModel mainViewModel;
  60.     private final Context context;
  61.     private LinearLayoutManager mLinearLayoutManager;
  62.     private List<ChannelRCV> channelRCVList;
  63.     private SimpleExoPlayer player;
  64.     private ChannelRecyclerViewAdapter recyclerViewAdapter;
  65.  
  66.     private ChannelRCV currentChannelRCV;
  67.  
  68.     private Handler mainHandler;
  69.     private BandwidthMeter bandwidthMeter;
  70.     private TrackSelection.Factory videoTrackSelectionFactory;
  71.     private TrackSelector trackSelector;
  72.     private LoadControl loadControl;
  73.     private DataSource.Factory dataSourceFactory;
  74.     private DBHelper dbHelper = DBHelper.getInstance();
  75.     private MediaSource videoSource;
  76.     private View previousView = null;
  77.     private Intent mServiceIntent;
  78.  
  79.  
  80.     //TODO CONSTRUCTOR MainViewModel
  81.     private MainViewModel(Context context) {
  82.         this.context = context;
  83.  
  84.         recyclerViewAdapter = new ChannelRecyclerViewAdapter();
  85.         channelRCVList = convertList(dbHelper.getWebTvChannelDao().loadAll());
  86.        
  87.         currentChannelRCV = channelRCVList.get(0);
  88.         recyclerViewAdapter.setList(channelRCVList);
  89.         recyclerViewAdapter.notifyDataSetChanged();
  90.         mLinearLayoutManager = new LinearLayoutManager(context);
  91.         mLinearLayoutManager.setOrientation(LinearLayoutManager.VERTICAL);
  92.         mLinearLayoutManager.setSmoothScrollbarEnabled(true);
  93.         mServiceIntent = new Intent(context, DownloadEPGService.class);
  94.  
  95.         /*Intent downloadEPGService = new Intent(context, DownloadEPGService.class);
  96.  
  97.         context.startService(downloadEPGService);*/
  98.  
  99.     }
  100.  
  101.     public static MainViewModel getInstance(Context context) {
  102.  
  103.         if (mainViewModel == null) {
  104.             mainViewModel = new MainViewModel(context);
  105.             mainViewModel.setupPlayer();
  106.             return mainViewModel;
  107.         } else
  108.             return mainViewModel;
  109.     }
  110.  
  111.     private List<ChannelRCV> convertList(List<WebTvChannel> webTvChannels) {
  112.         List<ChannelRCV> channelRCVs = new ArrayList<>();
  113.         for (WebTvChannel ch : webTvChannels) {
  114.             channelRCVs.add(new ChannelRCV(ch.getName(), ch.getUrl()));
  115.         }
  116.  
  117.         return channelRCVs;
  118.     }
  119.  
  120.     @Bindable
  121.     public SimpleExoPlayer getPlayer() {
  122.         return player;
  123.     }
  124.  
  125.     public void setPlayer(SimpleExoPlayer player) {
  126.  
  127.         this.player = player;
  128.  
  129.         notifyPropertyChanged(BR.player);
  130.     }
  131.  
  132.     public void setupPlayer() {
  133.  
  134.         /*try {*/
  135.             mainHandler = new Handler();
  136.             bandwidthMeter = new DefaultBandwidthMeter();
  137.             videoTrackSelectionFactory = new AdaptiveVideoTrackSelection.Factory(bandwidthMeter);
  138.             trackSelector = new DefaultTrackSelector(videoTrackSelectionFactory);
  139.             loadControl = new DefaultLoadControl();
  140.  
  141.  
  142.             player = ExoPlayerFactory.newSimpleInstance(context, trackSelector, loadControl, null, SimpleExoPlayer.EXTENSION_RENDERER_MODE_PREFER);
  143.  
  144.             DefaultBandwidthMeter defaultBandwidthMeter = new DefaultBandwidthMeter();
  145.             dataSourceFactory = new DefaultHttpDataSourceFactory(Util.getUserAgent(context, "AOC"),defaultBandwidthMeter);
  146.             videoSource = new HlsMediaSource(Uri.parse(currentChannelRCV.getUrl()), dataSourceFactory, mainHandler,  new AdaptiveMediaSourceEventListener() {
  147.                 @Override
  148.                 public void onLoadStarted(DataSpec dataSpec, int dataType, int trackType, Format trackFormat, int trackSelectionReason, Object trackSelectionData, long mediaStartTimeMs, long mediaEndTimeMs, long elapsedRealtimeMs) {
  149.  
  150.                 }
  151.  
  152.                 @Override
  153.                 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) {
  154.  
  155.                 }
  156.  
  157.                 @Override
  158.                 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) {
  159.  
  160.                 }
  161.  
  162.                 @Override
  163.                 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) {
  164.  
  165.                 }
  166.  
  167.                 @Override
  168.                 public void onUpstreamDiscarded(int trackType, long mediaStartTimeMs, long mediaEndTimeMs) {
  169.  
  170.                 }
  171.  
  172.                 @Override
  173.                 public void onDownstreamFormatChanged(int trackType, Format trackFormat, int trackSelectionReason, Object trackSelectionData, long mediaTimeMs) {
  174.  
  175.                 }
  176.  
  177.             });
  178.  
  179.  
  180.             player.prepare(videoSource);
  181.  
  182.             player.setPlayWhenReady(true);
  183.  
  184.             setPlayer(player);
  185.  
  186.         /*} catch (Exception ex) {
  187.             //setupPlayer();
  188.             System.out.println("Start Player error : " + ex.toString());
  189.         }*/
  190.  
  191.     }
  192.  
  193.     public void changeChannel(ChannelRCV channelRCV) {
  194.  
  195.         if (channelRCV.getUrl() == null) {
  196.             return;
  197.         }
  198.       /*  try {*/
  199.             videoSource = new HlsMediaSource(Uri.parse(currentChannelRCV.getUrl()), dataSourceFactory, mainHandler,  new AdaptiveMediaSourceEventListener() {
  200.                 @Override
  201.                 public void onLoadStarted(DataSpec dataSpec, int dataType, int trackType, Format trackFormat, int trackSelectionReason, Object trackSelectionData, long mediaStartTimeMs, long mediaEndTimeMs, long elapsedRealtimeMs) {
  202.  
  203.                 }
  204.  
  205.                 @Override
  206.                 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) {
  207.  
  208.                 }
  209.  
  210.                 @Override
  211.                 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) {
  212.  
  213.                 }
  214.  
  215.                 @Override
  216.                 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) {
  217.  
  218.                 }
  219.  
  220.                 @Override
  221.                 public void onUpstreamDiscarded(int trackType, long mediaStartTimeMs, long mediaEndTimeMs) {
  222.  
  223.                 }
  224.  
  225.                 @Override
  226.                 public void onDownstreamFormatChanged(int trackType, Format trackFormat, int trackSelectionReason, Object trackSelectionData, long mediaTimeMs) {
  227.  
  228.                 }
  229.  
  230.             });
  231.             player.prepare(videoSource);
  232.             player.setPlayWhenReady(true);
  233.             setPlayer(player);
  234.        /* } catch (Exception ex) {
  235.             System.out.println("CHANGE CHANNEL ERROR:"+ ex.toString());
  236.             changeChannel(channelRCV);
  237.         }*/
  238.     }
  239.  
  240.  
  241.     public ChannelRecyclerViewAdapter getRecyclerViewAdapter() {
  242.         return recyclerViewAdapter;
  243.     }
  244.  
  245.     public LinearLayoutManager getLinearLayoutManager() {
  246.         return mLinearLayoutManager;
  247.     }
  248.  
  249.     public int fullscreen() {
  250.         return WindowManager.LayoutParams.FLAG_FULLSCREEN;
  251.     }
  252.  
  253.     public void onClick(View view, ChannelRCV channelRCV) {
  254.  
  255.         /*if (previousView == null) {
  256.             recyclerViewAdapter.getFirstHolder().itemView.setBackgroundColor(Color.TRANSPARENT);
  257.             previousView = view;
  258.             view.setBackgroundColor(Color.parseColor("#4287F4"));
  259.         } else {
  260.  
  261.             previousView.setBackgroundColor(Color.TRANSPARENT);
  262.             previousView = view;
  263.             view.setBackgroundColor(Color.parseColor("#4287F4"));
  264.         }
  265.         //view.setBackgroundColor(Color.parseColor("#FF0000"));*/
  266.  
  267.         currentChannelRCV = channelRCV;
  268.         changeChannel(channelRCV);
  269.     }
  270.  
  271.     // TODO Scheduler
  272.     private void testSchedule() {
  273.  
  274.         ScheduledExecutorService scheduler = Executors.newSingleThreadScheduledExecutor();
  275.  
  276.         scheduler.scheduleAtFixedRate(new Runnable() {
  277.             public void run() {
  278.                 //TODO WORK HERE for Scheduler
  279.                 System.out.println("*** 789 ***");
  280.  
  281.  
  282.                 context.startService(mServiceIntent);
  283.             }
  284.         }, 0, 5, TimeUnit.MINUTES);
  285.     }
  286.  
  287.     public void updateRecyclerViewList(List<ChannelRCV> channelRCVs) {
  288.  
  289.         //get data from db, parse them to list
  290.         //set list and notify update
  291.         channelRCVList = channelRCVs;
  292.         recyclerViewAdapter.setList(channelRCVs);
  293.         changeChannel(channelRCVs.get(0));
  294.         recyclerViewAdapter.notifyDataSetChanged();
  295.         player.release();
  296.         setupPlayer();
  297.  
  298.     }
  299.  
  300.  
  301.     @Override
  302.     public void onTimelineChanged(Timeline timeline, Object manifest) {
  303.  
  304.     }
  305.  
  306.     @Override
  307.     public void onTracksChanged(TrackGroupArray trackGroups, TrackSelectionArray trackSelections) {
  308.  
  309.     }
  310.  
  311.     @Override
  312.     public void onLoadingChanged(boolean isLoading) {
  313.  
  314.     }
  315.  
  316.     @Override
  317.     public void onPlayerStateChanged(boolean playWhenReady, int playbackState) {
  318.  
  319.     }
  320.  
  321.     @Override
  322.     public void onPlayerError(ExoPlaybackException error) {
  323.         Log.e("OnPlayerError","Error ExoPlayer");
  324.         if (isBehindLiveWindow(error)) {
  325.             Log.e("OnPlayerError","starting again");
  326.             //player.release();
  327.             player.release();
  328.             changeChannel(currentChannelRCV);
  329.         }
  330.     }
  331.  
  332.     @Override
  333.     public void onPositionDiscontinuity() {
  334.  
  335.     }
  336.         private static boolean isBehindLiveWindow(ExoPlaybackException e) {
  337.             if (e.type != ExoPlaybackException.TYPE_SOURCE) {
  338.                 return false;
  339.             }
  340.             Throwable cause = e.getSourceException();
  341.             while (cause != null) {
  342.                 if (cause instanceof BehindLiveWindowException) {
  343.                     return true;
  344.                 }
  345.                 cause = cause.getCause();
  346.             }
  347.             return false;
  348.         }
  349. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement