tifaout

MovieDetailsActivity

Nov 10th, 2023
88
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 100.92 KB | None | 0 0
  1. package com.easyplexdemoapp.ui.moviedetails;
  2.  
  3. import static android.view.View.GONE;
  4. import static android.view.ViewGroup.LayoutParams.MATCH_PARENT;
  5. import static com.bumptech.glide.load.resource.bitmap.BitmapTransitionOptions.withCrossFade;
  6. import static com.easyplexdemoapp.util.Constants.ARG_MOVIE;
  7. import static com.easyplexdemoapp.util.Constants.DEFAULT_WEBVIEW_ADS_RUNNING;
  8. import static com.easyplexdemoapp.util.Constants.PLAYER_HEADER;
  9. import static com.easyplexdemoapp.util.Constants.PLAYER_USER_AGENT;
  10. import static com.easyplexdemoapp.util.Constants.SERVER_BASE_URL;
  11. import static com.easyplexdemoapp.util.Constants.WEBVIEW;
  12. import static com.easyplexdemoapp.util.Tools.*;
  13. import static com.google.android.material.snackbar.BaseTransientBottomBar.LENGTH_LONG;
  14.  
  15. import android.annotation.SuppressLint;
  16. import android.app.Dialog;
  17. import android.content.Context;
  18. import android.content.Intent;
  19. import android.content.SharedPreferences;
  20. import android.content.pm.ApplicationInfo;
  21. import android.graphics.Color;
  22. import android.graphics.drawable.ColorDrawable;
  23. import android.net.Uri;
  24. import android.os.Bundle;
  25. import android.os.CountDownTimer;
  26. import android.os.Handler;
  27. import android.os.Looper;
  28. import android.text.TextUtils;
  29. import android.view.Gravity;
  30. import android.view.KeyEvent;
  31. import android.view.Menu;
  32. import android.view.MenuItem;
  33. import android.view.View;
  34. import android.view.Window;
  35. import android.view.WindowManager;
  36. import android.view.inputmethod.InputMethodManager;
  37. import android.webkit.WebSettings;
  38. import android.webkit.WebView;
  39. import android.webkit.WebViewClient;
  40. import android.widget.Button;
  41. import android.widget.EditText;
  42. import android.widget.ImageView;
  43. import android.widget.LinearLayout;
  44. import android.widget.TextView;
  45. import android.widget.Toast;
  46.  
  47. import androidx.annotation.NonNull;
  48. import androidx.annotation.Nullable;
  49. import androidx.appcompat.app.AlertDialog;
  50. import androidx.appcompat.app.AppCompatActivity;
  51. import androidx.databinding.DataBindingUtil;
  52. import androidx.lifecycle.ViewModelProvider;
  53. import androidx.recyclerview.widget.GridLayoutManager;
  54. import androidx.recyclerview.widget.LinearLayoutManager;
  55. import androidx.recyclerview.widget.RecyclerView;
  56.  
  57. import com.applovin.mediation.MaxAd;
  58. import com.applovin.mediation.MaxError;
  59. import com.applovin.mediation.MaxReward;
  60. import com.applovin.mediation.MaxRewardedAdListener;
  61. import com.applovin.mediation.ads.MaxInterstitialAd;
  62. import com.applovin.mediation.ads.MaxRewardedAd;
  63. import com.appnext.ads.fullscreen.RewardedVideo;
  64. import com.appnext.base.Appnext;
  65. import com.appodeal.ads.Appodeal;
  66. import com.appodeal.ads.RewardedVideoCallbacks;
  67. import com.blogspot.atifsoftwares.animatoolib.Animatoo;
  68. import com.bumptech.glide.Glide;
  69. import com.bumptech.glide.load.engine.DiskCacheStrategy;
  70. import com.easyplex.easyplexsupportedhosts.EasyPlexSupportedHosts;
  71. import com.easyplex.easyplexsupportedhosts.Model.EasyPlexSupportedHostsModel;
  72. import com.easyplexdemoapp.R;
  73. import com.easyplexdemoapp.data.local.entity.Download;
  74. import com.easyplexdemoapp.data.local.entity.History;
  75. import com.easyplexdemoapp.data.local.entity.Media;
  76. import com.easyplexdemoapp.data.model.MovieResponse;
  77. import com.easyplexdemoapp.data.model.auth.Rating;
  78. import com.easyplexdemoapp.data.model.comments.Comment;
  79. import com.easyplexdemoapp.data.model.genres.Genre;
  80. import com.easyplexdemoapp.data.model.media.StatusFav;
  81. import com.easyplexdemoapp.data.model.stream.MediaStream;
  82. import com.easyplexdemoapp.data.repository.AuthRepository;
  83. import com.easyplexdemoapp.data.repository.MediaRepository;
  84. import com.easyplexdemoapp.data.repository.SettingsRepository;
  85. import com.easyplexdemoapp.databinding.ItemMovieDetailBinding;
  86. import com.easyplexdemoapp.ui.base.BaseActivity;
  87. import com.easyplexdemoapp.ui.comments.CommentsAdapter;
  88. import com.easyplexdemoapp.ui.login.LoginActivity;
  89. import com.easyplexdemoapp.ui.manager.AuthManager;
  90. import com.easyplexdemoapp.ui.manager.SettingsManager;
  91. import com.easyplexdemoapp.ui.manager.TokenManager;
  92. import com.easyplexdemoapp.ui.moviedetails.adapters.CastAdapter;
  93. import com.easyplexdemoapp.ui.moviedetails.adapters.DownloadsListAdapter;
  94. import com.easyplexdemoapp.ui.moviedetails.adapters.RelatedsAdapter;
  95. import com.easyplexdemoapp.ui.player.activities.EmbedActivity;
  96. import com.easyplexdemoapp.ui.player.cast.GoogleServicesHelper;
  97. import com.easyplexdemoapp.ui.player.cast.queue.ui.QueueListViewActivity;
  98. import com.easyplexdemoapp.ui.player.cast.settings.CastPreference;
  99. import com.easyplexdemoapp.ui.player.fsm.state_machine.FsmPlayerApi;
  100. import com.easyplexdemoapp.ui.settings.SettingsActivity;
  101. import com.easyplexdemoapp.ui.viewmodels.LoginViewModel;
  102. import com.easyplexdemoapp.ui.viewmodels.MovieDetailViewModel;
  103. import com.easyplexdemoapp.util.Constants;
  104. import com.easyplexdemoapp.util.DialogHelper;
  105. import com.easyplexdemoapp.util.GlideApp;
  106. import com.easyplexdemoapp.util.NetworkUtils;
  107. import com.easyplexdemoapp.util.SpacingItemDecoration;
  108. import com.easyplexdemoapp.util.Tools;
  109. import com.facebook.ads.AdError;
  110. import com.facebook.ads.InterstitialAdListener;
  111. import com.google.android.gms.ads.AdRequest;
  112. import com.google.android.gms.ads.FullScreenContentCallback;
  113. import com.google.android.gms.ads.LoadAdError;
  114. import com.google.android.gms.ads.rewarded.RewardedAd;
  115. import com.google.android.gms.ads.rewarded.RewardedAdLoadCallback;
  116. import com.google.android.gms.cast.framework.CastButtonFactory;
  117. import com.google.android.gms.cast.framework.CastContext;
  118. import com.google.android.gms.cast.framework.CastSession;
  119. import com.google.android.gms.cast.framework.CastState;
  120. import com.google.android.gms.cast.framework.CastStateListener;
  121. import com.google.android.gms.cast.framework.IntroductoryOverlay;
  122. import com.google.android.gms.cast.framework.SessionManagerListener;
  123. import com.google.android.material.floatingactionbutton.FloatingActionButton;
  124. import com.google.android.material.snackbar.Snackbar;
  125. import com.ironsource.mediationsdk.IronSource;
  126. import com.ironsource.mediationsdk.adunit.adapter.utility.AdInfo;
  127. import com.ironsource.mediationsdk.logger.IronSourceError;
  128. import com.ironsource.mediationsdk.model.Placement;
  129. import com.ironsource.mediationsdk.sdk.LevelPlayRewardedVideoListener;
  130. import com.unity3d.ads.IUnityAdsLoadListener;
  131. import com.unity3d.ads.IUnityAdsShowListener;
  132. import com.unity3d.ads.UnityAds;
  133. import com.vungle.warren.AdConfig;
  134. import com.vungle.warren.LoadAdCallback;
  135. import com.vungle.warren.PlayAdCallback;
  136. import com.vungle.warren.Vungle;
  137. import com.vungle.warren.error.VungleException;
  138. import com.xw.repo.BubbleSeekBar;
  139.  
  140. import org.jetbrains.annotations.NotNull;
  141.  
  142. import java.text.ParseException;
  143. import java.text.SimpleDateFormat;
  144. import java.util.ArrayList;
  145. import java.util.Date;
  146. import java.util.List;
  147. import java.util.Objects;
  148.  
  149. import javax.inject.Inject;
  150. import javax.inject.Named;
  151.  
  152. import dagger.android.AndroidInjection;
  153. import io.reactivex.rxjava3.android.schedulers.AndroidSchedulers;
  154. import io.reactivex.rxjava3.core.Observer;
  155. import io.reactivex.rxjava3.disposables.Disposable;
  156. import io.reactivex.rxjava3.schedulers.Schedulers;
  157. import timber.log.Timber;
  158.  
  159. /**
  160.  * EasyPlex - Movies - Live Streaming - TV Series, Anime
  161.  *
  162.  * @author @Y0bEX
  163.  * @package EasyPlex - Movies - Live Streaming - TV Series, Anime
  164.  * @copyright Copyright (c) 2023 Y0bEX,
  165.  * @license <a href="http://codecanyon.net/wiki/support/legal-terms/licensing-terms/">...<a href="</a>
  166. ">* @profile https://codecany</a>on.net/user/yobex
  167.  **/
  168.  
  169.  
  170.  
  171. public class MovieDetailsActivity extends AppCompatActivity {
  172.  
  173.  
  174.     com.appnext.core.webview.AppnextWebView appnextWebView;
  175.     com.appnext.ads.interstitial.Interstitial interstitialAppNext;
  176.     com.ironsource.environment.ContextProvider contextProvider;
  177.     Uri appLinkData;
  178.     private boolean shareLinkLaunched = false;
  179.     private MaxInterstitialAd maxInterstitialAd;
  180.  
  181.     private boolean isMovieFav = false;
  182.     private LoginViewModel loginViewModel;
  183.     private CountDownTimer mCountDownTimer;
  184.     private boolean webViewLauched = false;
  185.     ItemMovieDetailBinding binding;
  186.  
  187.     @Inject ViewModelProvider.Factory viewModelFactory;
  188.     private MovieDetailViewModel movieDetailViewModel;
  189.  
  190.     @Inject
  191.     SharedPreferences sharedPreferences;
  192.  
  193.     @Inject
  194.     SharedPreferences.Editor sharedPreferencesEditor;
  195.  
  196.     @Inject
  197.     SettingsManager settingsManager;
  198.  
  199.     @Inject
  200.     SettingsRepository settingsRepository;
  201.  
  202.     @Inject
  203.     AuthRepository authRepository;
  204.  
  205.     @Inject
  206.     MediaRepository mediaRepository;
  207.  
  208.  
  209.     @Inject
  210.     @Named("ready")
  211.     boolean settingReady;
  212.  
  213.  
  214.     @Inject
  215.     @Named("cuepoint")
  216.     String cuePoint;
  217.  
  218.  
  219.     @Inject
  220.     @Named("cuepointUrl")
  221.     String cuepointUrl;
  222.  
  223.     @Inject
  224.     AuthManager authManager;
  225.  
  226.  
  227.     @Inject
  228.     @Named("cuepointY")
  229.     String cuePointY;
  230.  
  231.     @Inject
  232.     @Named("cuepointN")
  233.     String cuePointN;
  234.  
  235.  
  236.     @Inject
  237.     @Named("cuepointW")
  238.     String cuePointW;
  239.  
  240.  
  241.     @Inject
  242.     @Named("cuepointZ")
  243.     String cuePointZ;
  244.  
  245.     @Inject
  246.     @Named("vpn")
  247.     boolean checkVpn;
  248.  
  249.     @Inject
  250.     @Named("sniffer")
  251.     @Nullable
  252.     ApplicationInfo provideSnifferCheck;
  253.  
  254.  
  255.     @Inject
  256.     @Named("root")
  257.     @Nullable
  258.     ApplicationInfo provideRootCheck;
  259.  
  260.     @Inject
  261.     TokenManager tokenManager;
  262.  
  263.     private CastAdapter mCastAdapter;
  264.     private RelatedsAdapter mRelatedsAdapter;
  265.     private CommentsAdapter commentsAdapter;
  266.     private boolean mMovie;
  267.     boolean isLoading;
  268.     private RewardedAd rewardedAd;
  269.     private Media media;
  270.     private String mediaGenre;
  271.     private Download download;
  272.     private History history;
  273.     private CastContext mCastContext;
  274.     private final SessionManagerListener<CastSession> mSessionManagerListener = new MySessionManagerListener();
  275.     private CastSession mCastSession;
  276.     private MenuItem mediaRouteMenuItem;
  277.     private MenuItem mQueueMenuItem;
  278.     private IntroductoryOverlay mIntroductoryOverlay;
  279.     private CastStateListener mCastStateListener;
  280.     private MaxRewardedAd maxRewardedAd;
  281.     private RewardedVideo mAppNextAdsVideoRewarded;
  282.  
  283.     private class MySessionManagerListener implements SessionManagerListener<CastSession> {
  284.  
  285.         @Override
  286.         public void onSessionEnded(@NotNull CastSession session, int error) {
  287.  
  288.             if (session == mCastSession) {
  289.                 mCastSession = null;
  290.             }
  291.             invalidateOptionsMenu();
  292.         }
  293.  
  294.         @Override
  295.         public void onSessionResumed(@NotNull CastSession session, boolean wasSuspended) {
  296.             mCastSession = session;
  297.             invalidateOptionsMenu();
  298.         }
  299.  
  300.         @Override
  301.         public void onSessionStarted(@NotNull CastSession session, @NotNull String sessionId) {
  302.             mCastSession = session;
  303.             invalidateOptionsMenu();
  304.         }
  305.  
  306.         @Override
  307.         public void onSessionStarting(@NotNull CastSession session) {
  308.  
  309.             //
  310.         }
  311.  
  312.         @Override
  313.         public void onSessionStartFailed(@NotNull CastSession session, int error) {
  314.  
  315.             ToastHelper(getApplicationContext(),getString(R.string.unable_cast));
  316.         }
  317.  
  318.         @Override
  319.         public void onSessionEnding(@NotNull CastSession session) {
  320.  
  321.             //
  322.         }
  323.  
  324.         @Override
  325.         public void onSessionResuming(@NotNull CastSession session, @NotNull String sessionId) {
  326.  
  327.             //
  328.         }
  329.  
  330.         @Override
  331.         public void onSessionResumeFailed(@NotNull CastSession session, int error) {
  332.  
  333.             //
  334.         }
  335.  
  336.         @Override
  337.         public void onSessionSuspended(@NotNull CastSession session, int reason) {
  338.  
  339.             //
  340.         }
  341.     }
  342.  
  343.  
  344.     @Override
  345.     protected void onCreate(Bundle savedInstanceState) {
  346.         AndroidInjection.inject(this);
  347.         super.onCreate(savedInstanceState);
  348.  
  349.         setSystemBarTransparent(this);
  350.         hideSystemPlayerUi(this,true,0);
  351.  
  352.         binding = DataBindingUtil.setContentView(this, R.layout.item_movie_detail);
  353.  
  354.  
  355.         mRelatedsAdapter = new RelatedsAdapter();
  356.  
  357.  
  358.         if (settingsManager.getSettings().getVpn() == 1 && checkVpn) {
  359.  
  360.             binding.backbutton.performClick();
  361.  
  362.             ToastHelper(getApplicationContext(),getString(R.string.vpn_message));
  363.  
  364.         }
  365.  
  366.         onInitRewards();
  367.  
  368.         if (GoogleServicesHelper.available(this)) {
  369.  
  370.             mCastStateListener = newState -> {
  371.                 if (newState != CastState.NO_DEVICES_AVAILABLE) {
  372.                     showIntroductoryOverlay();
  373.                 }
  374.             };
  375.             mCastContext = CastContext.getSharedInstance(this);
  376.  
  377.  
  378.         }
  379.  
  380.         Intent intent = getIntent();
  381.  
  382.         media = intent.getParcelableExtra(ARG_MOVIE);
  383.  
  384.         // ViewModel to cache, retrieve data for MovieDetailsActivity
  385.         movieDetailViewModel = new ViewModelProvider(this, viewModelFactory).get(MovieDetailViewModel.class);
  386.  
  387.         loginViewModel = new ViewModelProvider(this, viewModelFactory).get(LoginViewModel.class);
  388.  
  389.  
  390.         mMovie = false;
  391.         binding.progressBar.setVisibility(View.VISIBLE);
  392.         binding.itemDetailContainer.setVisibility(GONE);
  393.         binding.PlayButtonIcon.setVisibility(GONE);
  394.         binding.serieName.setVisibility(GONE);
  395.  
  396.  
  397.         Intent appLinkIntent = getIntent();
  398.         appLinkData = appLinkIntent.getData();
  399.  
  400.  
  401.         if (appLinkData !=null) {
  402.  
  403.             movieDetailViewModel.getMovieDetails(appLinkData.getLastPathSegment());
  404.             movieDetailViewModel.getRelatedsMovies(Integer.parseInt(appLinkData.getLastPathSegment()));
  405.             movieDetailViewModel.getMovieComments(Integer.parseInt(appLinkData.getLastPathSegment()));
  406.  
  407.             shareLinkLaunched = true;
  408.  
  409.         }else if (media.getId() !=null) {
  410.  
  411.             movieDetailViewModel.getMovieDetails(media.getId());
  412.             movieDetailViewModel.getRelatedsMovies(Integer.parseInt(media.getId()));
  413.             movieDetailViewModel.getMovieComments(Integer.parseInt(media.getId()));
  414.  
  415.         }
  416.  
  417.  
  418.         initMovieDetails();
  419.         onInitCastRecycleView();
  420.  
  421.  
  422.  
  423.  
  424.  
  425.         if (settingsManager.getSettings().getAdUnitIdRewarded() != null) {
  426.  
  427.             loadRewardedAd();
  428.  
  429.         }
  430.  
  431.         if (settingsManager.getSettings().getEnableComments() !=1){
  432.  
  433.             binding.floatingCommentIcon.setVisibility(GONE);
  434.             binding.commentsize.setVisibility(GONE);
  435.         }
  436.  
  437.     }
  438.  
  439.     private void onInitCastRecycleView() {
  440.  
  441.         binding.recyclerViewCastMovieDetail.setHasFixedSize(true);
  442.         binding.recyclerViewCastMovieDetail.setNestedScrollingEnabled(false);
  443.         binding.recyclerViewCastMovieDetail.setLayoutManager(new LinearLayoutManager(MovieDetailsActivity.this, LinearLayoutManager.HORIZONTAL, false));
  444.         binding.recyclerViewCastMovieDetail.addItemDecoration(new SpacingItemDecoration(1, dpToPx(this, 0), true));
  445.     }
  446.  
  447.  
  448.     private void onInitRewards() {
  449.  
  450.         // Initialize the AppNext Ads SDK.
  451.         Appnext.init(this);
  452.  
  453.  
  454.         Appodeal.initialize(this, settingsManager.getSettings().getAdUnitIdAppodealRewarded(),
  455.                 Appodeal.INTERSTITIAL | Appodeal.BANNER | Appodeal.REWARDED_VIDEO, list -> {
  456.                 });
  457.  
  458.         IronSource.init(this, settingsManager.getSettings().getIronsourceAppKey(), IronSource.AD_UNIT.REWARDED_VIDEO,IronSource.AD_UNIT.INTERSTITIAL,IronSource.AD_UNIT.BANNER);
  459.  
  460.  
  461.         if (settingsManager.getSettings().getApplovinInterstitialUnitid() !=null && !settingsManager.getSettings().getApplovinInterstitialUnitid().isEmpty()) {
  462.  
  463.             maxInterstitialAd = new MaxInterstitialAd(settingsManager.getSettings().getApplovinInterstitialUnitid(), this );
  464.             maxInterstitialAd.loadAd();
  465.         }
  466.  
  467.         String defaultRewardedNetworkAds = settingsManager.getSettings().getDefaultRewardedNetworkAds();
  468.  
  469.         if (getString(R.string.applovin).equals(defaultRewardedNetworkAds)) {
  470.  
  471.             maxRewardedAd = MaxRewardedAd.getInstance( settingsManager.getSettings().getApplovinRewardUnitid(), this);
  472.             maxRewardedAd.loadAd();
  473.  
  474.         }else  if (getString(R.string.appnext).equals(defaultRewardedNetworkAds)) {
  475.  
  476.             mAppNextAdsVideoRewarded = new RewardedVideo(this, settingsManager.getSettings().getAppnextPlacementid());
  477.             mAppNextAdsVideoRewarded.loadAd();
  478.  
  479.  
  480.         }else  if (getString(R.string.vungle).equals(defaultRewardedNetworkAds)) {
  481.  
  482.             Vungle.loadAd(settingsManager.getSettings().getVungleRewardPlacementName(), new LoadAdCallback() {
  483.                 @Override
  484.                 public void onAdLoad(String id) {
  485.                     //
  486.                 }
  487.  
  488.                 @Override
  489.                 public void onError(String id, VungleException e) {
  490.  
  491.                     //
  492.                 }
  493.             });
  494.  
  495.         }else  if (getString(R.string.ironsource).equals(defaultRewardedNetworkAds)) {
  496.  
  497.             IronSource.loadRewardedVideo();
  498.  
  499.         }
  500.  
  501.     }
  502.  
  503.  
  504.  
  505.     private void onLoadUnityInterstetial() {
  506.  
  507.  
  508.         UnityAds.load(settingsManager.getSettings().getUnityInterstitialPlacementId(), new IUnityAdsLoadListener() {
  509.             @Override
  510.             public void onUnityAdsAdLoaded(String placementId) {
  511.  
  512.                 Tools.onLoadUnityInterstetial(MovieDetailsActivity.this,settingsManager.getSettings().getUnityadsInterstitial()
  513.                         ,settingsManager.getSettings().getUnityShow(),settingsManager);
  514.  
  515.             }
  516.  
  517.             @Override
  518.             public void onUnityAdsFailedToLoad(String placementId, UnityAds.UnityAdsLoadError error, String message) {
  519.  
  520.  
  521.                 //
  522.             }
  523.         });
  524.  
  525.  
  526.  
  527.     }
  528.  
  529.  
  530.     private void initMovieDetails() {
  531.  
  532.         if (authManager.getUserInfo().getPremuim() != 1 ) {
  533.             onLoadUnityInterstetial();
  534.         }
  535.  
  536.  
  537.         movieDetailViewModel.getMovieDetails(media.getId());
  538.         movieDetailViewModel.movieDetailMutableLiveData.observe(this, movieDetail -> {
  539.  
  540.             download = new Download(movieDetail.getId(),movieDetail.getTmdbId(),movieDetail.getBackdropPath(),movieDetail.getTitle(),"");
  541.  
  542.             for (Genre genre : movieDetail.getGenres()) {
  543.                 mediaGenre = genre.getName();
  544.             }
  545.  
  546.             onLoadImage(movieDetail.getPosterPath());onLoadTitle(movieDetail.getTitle());
  547.             try {
  548.                 onLoadDate(movieDetail.getReleaseDate());
  549.             } catch (ParseException e) {
  550.                 e.printStackTrace();
  551.             }
  552.             onLoadSynopsis(movieDetail.getOverview());onLoadGenres(movieDetail.getGenres());
  553.             if(!settingReady)finishAffinity();
  554.             onLoadBackButton();
  555.             onLoadRelatedsMovies();
  556.             onLoadCast(movieDetail);
  557.             onLoadRating(movieDetail.getVoteAverage());
  558.             onLoadViews(movieDetail.getViews());
  559.             onLoadPogressResume(movieDetail.getId());
  560.             binding.review.setOnClickListener(v -> onSentReview(movieDetail));
  561.             onLoadUsersReviews(movieDetail.getVoteAverage());
  562.             binding.floatingCommentIcon.setOnClickListener(v -> {
  563.  
  564.                 if (tokenManager.getToken().getAccessToken() != null) {
  565.  
  566.                     onLoadMovieComments(movieDetail.getId());
  567.                 }else {
  568.  
  569.  
  570.                     final Snackbar snackbar = Snackbar.make(binding.constraintLayout, "", LENGTH_LONG);
  571.                     //inflate view
  572.                     @SuppressLint("InflateParams") View customView = getLayoutInflater().inflate(R.layout.snackbar_login, null);
  573.  
  574.                     snackbar.getView().setBackgroundColor(Color.TRANSPARENT);
  575.                     Snackbar.SnackbarLayout snackBarView = (Snackbar.SnackbarLayout) snackbar.getView();
  576.                     snackBarView.setPadding(0, 0, 0, 0);
  577.                     (customView.findViewById(R.id.tv_undo)).setOnClickListener(v1 -> {
  578.                         snackbar.dismiss();
  579.                         startActivity(new Intent(MovieDetailsActivity.this, LoginActivity.class));
  580.                         finish();
  581.                     });
  582.  
  583.                     snackBarView.addView(customView, 0);
  584.                     snackbar.show();
  585.                 }
  586.  
  587.             });
  588.  
  589.  
  590.             if (settingsManager.getSettings().getEnableComments() ==1){
  591.  
  592.                 mediaRepository.getComments(Integer.parseInt(movieDetail.getId()),settingsManager.getSettings().getApiKey())
  593.                         .subscribeOn(Schedulers.newThread())
  594.                         .observeOn(AndroidSchedulers.mainThread())
  595.                         .subscribe(new Observer<>() {
  596.                             @Override
  597.                             public void onSubscribe(@NotNull Disposable d) {
  598.  
  599.                                 //
  600.  
  601.                             }
  602.  
  603.                             @SuppressLint("NotifyDataSetChanged")
  604.                             @Override
  605.                             public void onNext(@NotNull MovieResponse movieResponse) {
  606.  
  607.                                 if (!movieResponse.getComments().isEmpty()){
  608.  
  609.                                     binding.commentsize.setText(getString(R.string.comment_size_views)+ getViewFormat(movieResponse.getComments().size()));
  610.  
  611.                                 }else {
  612.  
  613.                                     binding.commentsizeLinear.setVisibility(GONE);
  614.                                 }
  615.  
  616.  
  617.                             }
  618.  
  619.                             @Override
  620.                             public void onError(@NotNull Throwable e) {
  621.  
  622.                                 //
  623.  
  624.                             }
  625.  
  626.                             @Override
  627.                             public void onComplete() {
  628.  
  629.                                 //
  630.  
  631.                             }
  632.                         });
  633.  
  634.             }else {
  635.  
  636.  
  637.                 binding.commentsizeLinear.setVisibility(GONE);
  638.             }
  639.  
  640.  
  641.             if (authManager.getUserInfo().getPremuim() != 1 ) {
  642.  
  643.                 onLoadNetworksInter(settingsManager,MovieDetailsActivity.this,maxInterstitialAd);
  644.                 onloadBanners(settingsManager,MovieDetailsActivity.this,binding, null,null, null);
  645.  
  646.  
  647.             } else {
  648.  
  649.                 binding.bannerContainer.setVisibility(GONE);
  650.                 binding.adViewContainer.setVisibility(GONE);
  651.                 binding.appodealBannerView.setVisibility(GONE);
  652.  
  653.             }
  654.  
  655.  
  656.             if (movieDetail.getPremuim() == 1) {
  657.  
  658.                 binding.moviePremuim.setVisibility(View.VISIBLE);
  659.  
  660.  
  661.             }else {
  662.  
  663.                 binding.moviePremuim.setVisibility(View.GONE);
  664.             }
  665.  
  666.  
  667.             binding.itemDetailContainer.getViewTreeObserver().addOnScrollChangedListener(() -> {
  668.                 int scrollY =  binding.itemDetailContainer.getScrollY();
  669.                 int color = Color.parseColor("#E6070707"); // ideally a global variable
  670.                 if (scrollY < 256) {
  671.                     int alpha = (scrollY << 24) | (-1 >>> 8) ;
  672.                     color &= (alpha);
  673.  
  674.                     binding.serieName.setText("");
  675.                     binding.serieName.setVisibility(View.GONE);
  676.  
  677.  
  678.                 }else {
  679.  
  680.                     binding.serieName.setText(movieDetail.getTitle());
  681.                     binding.serieName.setVisibility(View.VISIBLE);
  682.  
  683.                 }
  684.                 binding.toolbar.setBackgroundColor(color);
  685.  
  686.             });
  687.  
  688.  
  689.  
  690.             onLoadToolbar();
  691.  
  692.  
  693.             if (settingsManager.getSettings().getEnableDownload() == 0) {
  694.  
  695.                 binding.downloadMovieImage.setImageResource(R.drawable.ic_notavailable);
  696.  
  697.             }
  698.  
  699.             binding.downloadMovie.setOnClickListener((View v) -> {
  700.  
  701.                 if (settingsManager.getSettings().getEnableDownload() == 0) {
  702.  
  703.                     DialogHelper.showNoDownloadAvailable(this,getString(R.string.download_disabled));
  704.  
  705.                 }else    if (movieDetail.getEnableDownload() == 0) {
  706.  
  707.                     Toast.makeText(this, "Download is currently not available for this Media", Toast.LENGTH_SHORT).show();
  708.  
  709.  
  710.                 }else onDownloadMovie(movieDetail);
  711.  
  712.  
  713.             });
  714.  
  715.             binding.report.setOnClickListener(v -> onLoadReport(movieDetail.getTitle(),movieDetail.getPosterPath()));
  716.  
  717.             binding.ButtonPlayTrailer.setOnClickListener(v -> {
  718.  
  719.                 if (movieDetail.getPreviewPath() == null) {
  720.                     ToastHelper(getApplicationContext(),getString(R.string.trailer_not_found));
  721.                     return;
  722.                 }
  723.                 onLoadTrailer(movieDetail.getPreviewPath(), movieDetail.getTitle(), movieDetail.getBackdropPath(), movieDetail.getTrailerUrl());
  724.             });
  725.  
  726.             binding.favoriteIcon.setOnClickListener(view -> {
  727.  
  728.                 if (settingsManager.getSettings().getFavoriteonline() == 1 && tokenManager.getToken().getAccessToken() !=null) {
  729.  
  730.                     if (isMovieFav) {
  731.  
  732.                         authRepository.getDeleteMovieOnline(movieDetail.getId())
  733.                                 .subscribeOn(Schedulers.io())
  734.                                 .observeOn(AndroidSchedulers.mainThread())
  735.                                 .subscribe(new Observer<>() {
  736.                                     @Override
  737.                                     public void onSubscribe(@NotNull Disposable d) {
  738.  
  739.                                         //
  740.  
  741.                                     }
  742.  
  743.                                     @Override
  744.                                     public void onNext(@NotNull StatusFav statusFav) {
  745.  
  746.                                         ToastHelper(getApplicationContext(),getString(R.string.remove_watch_list));
  747.  
  748.                                     }
  749.  
  750.                                     @Override
  751.                                     public void onError(@NotNull Throwable e) {
  752.  
  753.                                         //
  754.                                     }
  755.  
  756.                                     @Override
  757.                                     public void onComplete() {
  758.  
  759.                                         //
  760.  
  761.                                     }
  762.                                 });
  763.  
  764.  
  765.                         isMovieFav = false;
  766.  
  767.                         binding.favoriteImage.setImageResource(R.drawable.add_from_queue);
  768.  
  769.  
  770.                     }else {
  771.  
  772.                         authRepository.getAddMovieOnline(movieDetail.getId())
  773.                                 .subscribeOn(Schedulers.io())
  774.                                 .observeOn(AndroidSchedulers.mainThread())
  775.                                 .subscribe(new Observer<>() {
  776.                                     @Override
  777.                                     public void onSubscribe(@NotNull Disposable d) {
  778.  
  779.                                         //
  780.  
  781.                                     }
  782.  
  783.                                     @Override
  784.                                     public void onNext(@NotNull StatusFav statusFav) {
  785.  
  786.                                         ToastHelper(getApplicationContext(),"Added " + movieDetail.getTitle() + " To Watchlist");
  787.  
  788.                                     }
  789.  
  790.                                     @Override
  791.                                     public void onError(@NotNull Throwable e) {
  792.  
  793.                                         //
  794.  
  795.  
  796.                                     }
  797.  
  798.                                     @Override
  799.                                     public void onComplete() {
  800.  
  801.                                         //
  802.  
  803.                                     }
  804.                                 });
  805.  
  806.                         isMovieFav = true;
  807.  
  808.                         binding.favoriteImage.setImageResource(R.drawable.ic_in_favorite);
  809.                     }
  810.  
  811.  
  812.                 }else  {
  813.  
  814.                     onFavoriteClick(movieDetail);
  815.                 }
  816.  
  817.  
  818.             });
  819.  
  820.  
  821.             binding.shareIcon.setOnClickListener(v -> onShareMedia(this,movieDetail,settingsManager,"movie"));
  822.  
  823.  
  824.             checkMediaFavorite(movieDetail);
  825.  
  826.  
  827.             if (mediaRepository.hasHistory(Integer.parseInt(movieDetail.getId()))) {
  828.  
  829.                 binding.resumePlay.setVisibility(View.VISIBLE);
  830.  
  831.  
  832.                 binding.resumePlay.setOnClickListener(v -> binding.PlayButtonIcon.performClick());
  833.  
  834.  
  835.             } else {
  836.  
  837.                 binding.resumePlay.setVisibility(GONE);
  838.  
  839.  
  840.             }
  841.  
  842.  
  843.             binding.PlayButtonIcon.setOnClickListener(v -> {
  844.  
  845.  
  846.                 if (movieDetail.getEnableStream() !=1) {
  847.  
  848.                     Toast.makeText(this, R.string.stream_is_currently_not_available_for_this_media, Toast.LENGTH_SHORT).show();
  849.                     return;
  850.                 }
  851.  
  852.  
  853.  
  854.                 if (settingsManager.getSettings().getVpn() ==1 && checkVpn) {
  855.  
  856.                     binding.backbutton.performClick();
  857.  
  858.                     ToastHelper(getApplicationContext(),getString(R.string.vpn_message));
  859.  
  860.  
  861.                 }else if (movieDetail.getVideos() !=null && !movieDetail.getVideos().isEmpty()) {
  862.  
  863.  
  864.                    if (movieDetail.getPremuim() == 1 && authManager.getUserInfo().getPremuim() == 1 && tokenManager.getToken() != null) {
  865.  
  866.                         onLoadStream(movieDetail);
  867.  
  868.                     } else  if (settingsManager.getSettings().getEnableWebview() == 1) {
  869.  
  870.  
  871.                         final Dialog dialog = new Dialog(this);
  872.                         dialog.requestWindowFeature(Window.FEATURE_NO_TITLE);
  873.                         dialog.setContentView(R.layout.episode_webview);
  874.                         dialog.setCancelable(false);
  875.                         dialog.getWindow().setBackgroundDrawable(new ColorDrawable(android.graphics.Color.TRANSPARENT));
  876.  
  877.                         WindowManager.LayoutParams lp = new WindowManager.LayoutParams();
  878.                         lp.copyFrom(dialog.getWindow().getAttributes());
  879.  
  880.                         lp.gravity = Gravity.BOTTOM;
  881.                         lp.width = MATCH_PARENT;
  882.                         lp.height = MATCH_PARENT;
  883.  
  884.  
  885.                         mCountDownTimer = new CountDownTimer(DEFAULT_WEBVIEW_ADS_RUNNING, 1000) {
  886.                             @SuppressLint({"SetTextI18n", "SetJavaScriptEnabled"})
  887.                             @Override
  888.                             public void onTick(long millisUntilFinished) {
  889.  
  890.                                 if (!webViewLauched) {
  891.  
  892.                                     WebView webView = dialog.findViewById(R.id.webViewVideoBeforeAds);
  893.                                     webView.getSettings().setJavaScriptEnabled(true);
  894.                                     webView.setWebViewClient(new WebViewClient());
  895.                                     WebSettings webSettings = webView.getSettings();
  896.                                     webSettings.setSupportMultipleWindows(false);
  897.                                     webSettings.setJavaScriptCanOpenWindowsAutomatically(false);
  898.  
  899.                                     if (settingsManager.getSettings().getWebviewLink() !=null && !settingsManager.getSettings().getWebviewLink().isEmpty()) {
  900.  
  901.                                         webView.loadUrl(settingsManager.getSettings().getWebviewLink());
  902.  
  903.                                     }else {
  904.  
  905.                                         webView.loadUrl(SERVER_BASE_URL+"webview");
  906.                                     }
  907.  
  908.                                     webViewLauched = true;
  909.                                 }
  910.  
  911.                             }
  912.  
  913.                             @Override
  914.                             public void onFinish() {
  915.  
  916.                                 dialog.dismiss();
  917.                                 onLoadStream(movieDetail);
  918.                                 webViewLauched = false;
  919.                                 if (mCountDownTimer != null) {
  920.                                     mCountDownTimer.cancel();
  921.                                     mCountDownTimer = null;
  922.                                 }
  923.                             }
  924.  
  925.                         }.start();
  926.  
  927.                         dialog.show();
  928.                         dialog.getWindow().setAttributes(lp);
  929.  
  930.  
  931.                     } else if (movieDetail.getEnableAdsUnlock() ==1){
  932.  
  933.  
  934.                        onLoadSubscribeDialog(movieDetail,true);
  935.  
  936.  
  937.                    } else   if (settingsManager.getSettings().getWachAdsToUnlock() == 1 && movieDetail.getPremuim() != 1 && authManager.getUserInfo().getPremuim() == 0) {
  938.  
  939.                         onLoadSubscribeDialog(movieDetail,true);
  940.  
  941.                     } else if (settingsManager.getSettings().getWachAdsToUnlock() == 0 && movieDetail.getPremuim() == 0) {
  942.  
  943.  
  944.                         onLoadStream(movieDetail);
  945.  
  946.  
  947.                     } else if (authManager.getUserInfo().getPremuim() == 1 && movieDetail.getPremuim() == 0) {
  948.  
  949.  
  950.                         onLoadStream(movieDetail);
  951.  
  952.                     } else {
  953.  
  954.                         DialogHelper.showPremuimWarning(this);
  955.  
  956.                     }
  957.  
  958.                 }else {
  959.  
  960.                     DialogHelper.showNoStreamAvailable(this);
  961.  
  962.                 }
  963.  
  964.  
  965.             });
  966.  
  967.  
  968.             mMovie = true;
  969.             checkAllDataLoaded();
  970.  
  971.  
  972.         });
  973.  
  974.     }
  975.  
  976.     private void onLoadUsersReviews(float voteAverage) {
  977.         binding.userReview.setText(String.valueOf(voteAverage));
  978.     }
  979.  
  980.     private void onSentReview(Media movieDetail) {
  981.  
  982.  
  983.         if (tokenManager.getToken().getAccessToken() == null) {
  984.  
  985.             Toast.makeText(this, getText(R.string.review_require_login), Toast.LENGTH_SHORT).show();
  986.             return;
  987.         }
  988.  
  989.         final Dialog dialog = new Dialog(this);
  990.         dialog.requestWindowFeature(Window.FEATURE_NO_TITLE);
  991.         dialog.setContentView(R.layout.dialog_review);
  992.         dialog.setCancelable(true);
  993.         dialog.getWindow().setBackgroundDrawable(new ColorDrawable(android.graphics.Color.TRANSPARENT));
  994.  
  995.         WindowManager.LayoutParams lp = new WindowManager.LayoutParams();
  996.         lp.copyFrom(dialog.getWindow().getAttributes());
  997.  
  998.         lp.gravity = Gravity.BOTTOM;
  999.         lp.width = MATCH_PARENT;
  1000.         lp.height = MATCH_PARENT;
  1001.  
  1002.  
  1003.         TextView reviewMovieName = dialog.findViewById(R.id.movietitle);
  1004.  
  1005.  
  1006.         TextView userRating = dialog.findViewById(R.id.userRating);
  1007.  
  1008.  
  1009.         BubbleSeekBar storySeekbar = dialog.findViewById(R.id.storySeekbar);
  1010.  
  1011.         BubbleSeekBar caractersSeekbar = dialog.findViewById(R.id.caractersSeekbar);
  1012.  
  1013.         BubbleSeekBar mottionsdesginSeekbar = dialog.findViewById(R.id.mottionsdesginSeekbar);
  1014.  
  1015.         BubbleSeekBar musicSeekbar = dialog.findViewById(R.id.musicSeekbar);
  1016.  
  1017.         mottionsdesginSeekbar.setVisibility(GONE);
  1018.  
  1019.         reviewMovieName.setText(movieDetail.getTitle());
  1020.  
  1021.  
  1022.  
  1023.         storySeekbar.setOnProgressChangedListener(new BubbleSeekBar.OnProgressChangedListener() {
  1024.             @Override
  1025.             public void onProgressChanged(BubbleSeekBar bubbleSeekBar, int progress, float progressFloat, boolean fromUser) {
  1026.  
  1027.                 userRating.setText(Integer.toString((int) getAvg(storySeekbar.getProgressFloat(),
  1028.                         caractersSeekbar.getProgressFloat()
  1029.                         ,mottionsdesginSeekbar.getProgressFloat()
  1030.                         ,musicSeekbar.getProgressFloat(),true)));
  1031.  
  1032.  
  1033.  
  1034.             }
  1035.  
  1036.             @Override
  1037.             public void getProgressOnActionUp(BubbleSeekBar bubbleSeekBar, int progress, float progressFloat) {
  1038.  
  1039.                 //
  1040.  
  1041.             }
  1042.  
  1043.             @Override
  1044.             public void getProgressOnFinally(BubbleSeekBar bubbleSeekBar, int progress, float progressFloat, boolean fromUser) {
  1045.  
  1046.                 //
  1047.             }
  1048.         });
  1049.  
  1050.  
  1051.         caractersSeekbar.setOnProgressChangedListener(new BubbleSeekBar.OnProgressChangedListener() {
  1052.             @Override
  1053.             public void onProgressChanged(BubbleSeekBar bubbleSeekBar, int progress, float progressFloat, boolean fromUser) {
  1054.  
  1055.                 userRating.setText(Integer.toString((int) getAvg(storySeekbar.getProgressFloat(),
  1056.                         caractersSeekbar.getProgressFloat()
  1057.                         ,mottionsdesginSeekbar.getProgressFloat()
  1058.                         ,musicSeekbar.getProgressFloat(),true)));
  1059.  
  1060.             }
  1061.  
  1062.             @Override
  1063.             public void getProgressOnActionUp(BubbleSeekBar bubbleSeekBar, int progress, float progressFloat) {
  1064.                 //
  1065.             }
  1066.  
  1067.             @Override
  1068.             public void getProgressOnFinally(BubbleSeekBar bubbleSeekBar, int progress, float progressFloat, boolean fromUser) {
  1069.                 //
  1070.             }
  1071.         });
  1072.  
  1073.  
  1074.         mottionsdesginSeekbar.setOnProgressChangedListener(new BubbleSeekBar.OnProgressChangedListener() {
  1075.             @Override
  1076.             public void onProgressChanged(BubbleSeekBar bubbleSeekBar, int progress, float progressFloat, boolean fromUser) {
  1077.  
  1078.                 userRating.setText(Integer.toString((int) getAvg(storySeekbar.getProgressFloat(),
  1079.                         caractersSeekbar.getProgressFloat()
  1080.                         ,mottionsdesginSeekbar.getProgressFloat()
  1081.                         ,musicSeekbar.getProgressFloat(),true)));
  1082.  
  1083.             }
  1084.  
  1085.             @Override
  1086.             public void getProgressOnActionUp(BubbleSeekBar bubbleSeekBar, int progress, float progressFloat) {
  1087.                 //
  1088.             }
  1089.  
  1090.             @Override
  1091.             public void getProgressOnFinally(BubbleSeekBar bubbleSeekBar, int progress, float progressFloat, boolean fromUser) {
  1092.                 //
  1093.             }
  1094.         });
  1095.  
  1096.  
  1097.         musicSeekbar.setOnProgressChangedListener(new BubbleSeekBar.OnProgressChangedListener() {
  1098.             @Override
  1099.             public void onProgressChanged(BubbleSeekBar bubbleSeekBar, int progress, float progressFloat, boolean fromUser) {
  1100.  
  1101.                 userRating.setText(Integer.toString((int) getAvg(storySeekbar.getProgressFloat(),
  1102.                         caractersSeekbar.getProgressFloat()
  1103.                         ,mottionsdesginSeekbar.getProgressFloat()
  1104.                         ,musicSeekbar.getProgressFloat(),true)));
  1105.  
  1106.             }
  1107.  
  1108.             @Override
  1109.             public void getProgressOnActionUp(BubbleSeekBar bubbleSeekBar, int progress, float progressFloat) {
  1110.                 //
  1111.             }
  1112.  
  1113.             @Override
  1114.             public void getProgressOnFinally(BubbleSeekBar bubbleSeekBar, int progress, float progressFloat, boolean fromUser) {
  1115.                 //
  1116.             }
  1117.         });
  1118.  
  1119.  
  1120.         Button sendReport = dialog.findViewById(R.id.view_report);
  1121.  
  1122.         dialog.findViewById(R.id.bt_close).setOnClickListener(v -> dialog.dismiss());
  1123.  
  1124.  
  1125.         sendReport.setOnClickListener(v -> {
  1126.  
  1127.  
  1128.             if (movieDetail.getVoteAverage() !=0){
  1129.  
  1130.                 double newUserRating = Math.round(media.getVoteAverage() + getAvg(storySeekbar.getProgressFloat(),
  1131.                         caractersSeekbar.getProgressFloat()
  1132.                         ,mottionsdesginSeekbar.getProgressFloat()
  1133.                         ,musicSeekbar.getProgressFloat(),true)) /2;
  1134.  
  1135.  
  1136.                 if (tokenManager.getToken().getAccessToken() !=null) {
  1137.  
  1138.                     authRepository.addRating(media.getId(),newUserRating, "movie")
  1139.                             .subscribeOn(Schedulers.newThread())
  1140.                             .observeOn(AndroidSchedulers.mainThread())
  1141.                             .subscribe(new Observer<>() {
  1142.                                 @Override
  1143.                                 public void onSubscribe(@NotNull Disposable d) {
  1144.  
  1145.                                     //
  1146.  
  1147.                                 }
  1148.  
  1149.                                 @SuppressLint("NotifyDataSetChanged")
  1150.                                 @Override
  1151.                                 public void onNext(@NotNull Rating rating) {
  1152.  
  1153.                                     dialog.dismiss();
  1154.  
  1155.                                     Toast.makeText(MovieDetailsActivity.this, R.string.review_sent, Toast.LENGTH_SHORT).show();
  1156.  
  1157.                                     movieDetailViewModel.getMovieDetails(movieDetail.getId());
  1158.                                     initMovieDetails();
  1159.                                 }
  1160.  
  1161.                                 @Override
  1162.                                 public void onError(@NotNull Throwable e) {
  1163.  
  1164.                                     Toast.makeText(MovieDetailsActivity.this, e.getMessage(), Toast.LENGTH_SHORT).show();
  1165.                                 }
  1166.  
  1167.                                 @Override
  1168.                                 public void onComplete() {
  1169.  
  1170.                                     //
  1171.  
  1172.                                 }
  1173.                             });
  1174.  
  1175.                 }else {
  1176.  
  1177.                     ToastHelper(MovieDetailsActivity.this,getString(R.string.review_require_login));
  1178.                 }
  1179.  
  1180.             }  else {
  1181.  
  1182.                 double newUserRating = Math.round(getAvg(storySeekbar.getProgressFloat(),
  1183.                         caractersSeekbar.getProgressFloat()
  1184.                         ,mottionsdesginSeekbar.getProgressFloat()
  1185.                         ,musicSeekbar.getProgressFloat(),true)) /2;
  1186.  
  1187.  
  1188.                 if (tokenManager.getToken().getAccessToken() !=null) {
  1189.  
  1190.                     authRepository.addRating(movieDetail.getId(),newUserRating, "movie")
  1191.                             .subscribeOn(Schedulers.newThread())
  1192.                             .observeOn(AndroidSchedulers.mainThread())
  1193.                             .subscribe(new Observer<>() {
  1194.                                 @Override
  1195.                                 public void onSubscribe(@NotNull Disposable d) {
  1196.  
  1197.                                     //
  1198.  
  1199.                                 }
  1200.  
  1201.                                 @SuppressLint("NotifyDataSetChanged")
  1202.                                 @Override
  1203.                                 public void onNext(@NotNull Rating rating) {
  1204.  
  1205.                                     dialog.dismiss();
  1206.  
  1207.                                     Toast.makeText(MovieDetailsActivity.this, R.string.rating_sent, Toast.LENGTH_SHORT).show();
  1208.  
  1209.                                     movieDetailViewModel.getMovieDetails(movieDetail.getId());
  1210.                                     initMovieDetails();
  1211.                                 }
  1212.  
  1213.                                 @Override
  1214.                                 public void onError(@NotNull Throwable e) {
  1215.  
  1216.                                     Toast.makeText(MovieDetailsActivity.this, e.getMessage(), Toast.LENGTH_SHORT).show();
  1217.                                 }
  1218.  
  1219.                                 @Override
  1220.                                 public void onComplete() {
  1221.  
  1222.                                     //
  1223.  
  1224.                                 }
  1225.                             });
  1226.  
  1227.                 }else {
  1228.  
  1229.                     ToastHelper(MovieDetailsActivity.this,getString(R.string.review_require_login));
  1230.                 }
  1231.             }
  1232.  
  1233.  
  1234.  
  1235.  
  1236.         });
  1237.  
  1238.         dialog.show();
  1239.         dialog.getWindow().setAttributes(lp);
  1240.  
  1241.         dialog.findViewById(R.id.bt_close).setOnClickListener(y -> dialog.dismiss());
  1242.  
  1243.         dialog.show();
  1244.         dialog.getWindow().setAttributes(lp);
  1245.  
  1246.     }
  1247.  
  1248.  
  1249.     private void checkMediaFavorite(Media movieDetail) {
  1250.  
  1251.         if (settingsManager.getSettings().getFavoriteonline() == 1 && tokenManager.getToken().getAccessToken() !=null) {
  1252.  
  1253.             loginViewModel.isMovieFavoriteOnline(movieDetail.getId());
  1254.             loginViewModel.isMovieFavoriteOnlineMutableLiveData.observe(this, favAddOnline -> {
  1255.  
  1256.                 if (favAddOnline.getStatus() == 1) {
  1257.  
  1258.                     isMovieFav = true;
  1259.  
  1260.                     binding.favoriteImage.setImageResource(R.drawable.ic_in_favorite);
  1261.  
  1262.                 } else {
  1263.  
  1264.                     isMovieFav = false;
  1265.  
  1266.                     binding.favoriteImage.setImageResource(R.drawable.add_from_queue);
  1267.  
  1268.                 }});
  1269.  
  1270.         }else {
  1271.  
  1272.             if (mediaRepository.isMovieFavorite(Integer.parseInt(movieDetail.getId()))) {
  1273.  
  1274.  
  1275.                 binding.favoriteImage.setImageResource(R.drawable.ic_in_favorite);
  1276.  
  1277.             } else {
  1278.  
  1279.                 binding.favoriteImage.setImageResource(R.drawable.add_from_queue);
  1280.             }
  1281.         }
  1282.     }
  1283.  
  1284.     @SuppressLint("SetTextI18n")
  1285.     private void onLoadViews(String views) {
  1286.  
  1287.         binding.viewMovieViews.setText(getString(R.string.views)+ getViewFormat(Integer.parseInt(views)));
  1288.  
  1289.     }
  1290.  
  1291.  
  1292.  
  1293.     @Override
  1294.     protected void onResume() {
  1295.  
  1296.         onCheckFlagSecure(settingsManager.getSettings().getFlagSecure(),this);
  1297.  
  1298.         if (GoogleServicesHelper.available(this)) {
  1299.             mCastContext.addCastStateListener(mCastStateListener);
  1300.             mCastContext.getSessionManager().addSessionManagerListener(
  1301.                     mSessionManagerListener, CastSession.class);
  1302.             if (mCastSession == null) {
  1303.                 mCastSession = Objects.requireNonNull(CastContext.getSharedInstance()).getSessionManager()
  1304.                         .getCurrentCastSession();
  1305.             }
  1306.         }
  1307.  
  1308.         if (mQueueMenuItem != null) {
  1309.             mQueueMenuItem.setVisible(
  1310.                     (mCastSession != null) && mCastSession.isConnected());
  1311.         }
  1312.  
  1313.  
  1314.         if (settingsManager.getSettings().getVpn() ==1 && checkVpn){
  1315.  
  1316.             binding.backbutton.performClick();
  1317.  
  1318.             ToastHelper(getApplicationContext(),getString(R.string.vpn_message));
  1319.  
  1320.         }
  1321.  
  1322.         if (provideSnifferCheck != null) {
  1323.             ToastHelper(getApplicationContext(),getString(R.string.sniffer_message));
  1324.  
  1325.             finishAffinity();
  1326.         }
  1327.  
  1328.         if (settingsManager.getSettings().getRootDetection() == 1 &&  provideRootCheck != null) {
  1329.             ToastHelper(getApplicationContext(),getString(R.string.root_warning));
  1330.  
  1331.             finishAffinity();
  1332.         }
  1333.  
  1334.  
  1335.         if (appLinkData !=null) {
  1336.  
  1337.             onLoadPogressResume(appLinkData.getLastPathSegment());
  1338.  
  1339.         }else {
  1340.  
  1341.             onLoadPogressResume(media.getId());
  1342.         }
  1343.  
  1344.         super.onResume();
  1345.         IronSource.onResume(this);
  1346.     }
  1347.  
  1348.  
  1349.     @Override
  1350.     protected void onPause() {
  1351.  
  1352.         if (GoogleServicesHelper.available(this)) {
  1353.  
  1354.             mCastContext.removeCastStateListener(mCastStateListener);
  1355.             mCastContext.getSessionManager().removeSessionManagerListener(
  1356.                     mSessionManagerListener, CastSession.class);
  1357.         }
  1358.  
  1359.         super.onPause();
  1360.         IronSource.onPause(this);
  1361.     }
  1362.  
  1363.     @Override
  1364.     public boolean onCreateOptionsMenu(@NonNull Menu menu) {
  1365.         super.onCreateOptionsMenu(menu);
  1366.  
  1367.  
  1368.         getMenuInflater().inflate(R.menu.menu, menu);
  1369.         mediaRouteMenuItem = CastButtonFactory.setUpMediaRouteButton(this, menu,
  1370.                 R.id.media_route_menu_item);
  1371.         mQueueMenuItem = menu.findItem(R.id.action_show_queue);
  1372.         showIntroductoryOverlay();
  1373.         return true;
  1374.     }
  1375.  
  1376.     @Override
  1377.     public boolean onPrepareOptionsMenu(Menu menu) {
  1378.         menu.findItem(R.id.action_show_queue).setVisible(
  1379.                 (mCastSession != null) && mCastSession.isConnected());
  1380.         menu.findItem(R.id.action_settings).setVisible(
  1381.                 (mCastSession != null) && mCastSession.isConnected());
  1382.         return super.onPrepareOptionsMenu(menu);
  1383.     }
  1384.  
  1385.     @Override
  1386.     public boolean onOptionsItemSelected(MenuItem item) {
  1387.         Intent intent;
  1388.         if (item.getItemId() == R.id.action_settings) {
  1389.             intent = new Intent(MovieDetailsActivity.this, CastPreference.class);
  1390.             startActivity(intent);
  1391.         } else if (item.getItemId() == R.id.action_show_queue) {
  1392.             intent = new Intent(MovieDetailsActivity.this, QueueListViewActivity.class);
  1393.             startActivity(intent);
  1394.         }
  1395.         return true;
  1396.     }
  1397.  
  1398.     @Override
  1399.     public boolean dispatchKeyEvent(@NonNull KeyEvent event) {
  1400.  
  1401.         if (mCastContext !=null) {
  1402.             return mCastContext.onDispatchVolumeKeyEventBeforeJellyBean(event)
  1403.                     || super.dispatchKeyEvent(event);
  1404.         }else {
  1405.  
  1406.             return false;
  1407.         }
  1408.     }
  1409.  
  1410.  
  1411.  
  1412.     private void loadRewardedAd() {
  1413.  
  1414.         if (rewardedAd == null) {
  1415.             isLoading = true;
  1416.             AdRequest adRequest = new AdRequest.Builder().build();
  1417.             RewardedAd.load(
  1418.                     this,
  1419.                     settingsManager.getSettings().getAdUnitIdRewarded(),
  1420.                     adRequest,
  1421.                     new RewardedAdLoadCallback() {
  1422.                         @Override
  1423.                         public void onAdFailedToLoad(@NonNull LoadAdError loadAdError) {
  1424.  
  1425.                             rewardedAd = null;
  1426.  
  1427.                             MovieDetailsActivity.this.isLoading = false;
  1428.  
  1429.                         }
  1430.  
  1431.                         @Override
  1432.                         public void onAdLoaded(@NonNull RewardedAd rewardedAd) {
  1433.  
  1434.                             MovieDetailsActivity.this.isLoading = false;
  1435.                             MovieDetailsActivity.this.rewardedAd = rewardedAd;
  1436.                         }
  1437.                     });
  1438.         }
  1439.  
  1440.     }
  1441.  
  1442.  
  1443.     @SuppressLint("SetTextI18n")
  1444.     private void onLoadPogressResume(String tmdbId) {
  1445.  
  1446.         binding.resumeProgressCheck.setVisibility(View.VISIBLE);
  1447.  
  1448.         if (settingsManager.getSettings().getResumeOffline() == 1) {
  1449.  
  1450.             mediaRepository.hasResume(Integer.parseInt(tmdbId)).observe(this, resumeInfo -> {
  1451.  
  1452.                 if (resumeInfo !=null){
  1453.  
  1454.                     binding.resumeProgressCheck.setVisibility(GONE);
  1455.  
  1456.                     if (resumeInfo.getResumePosition() !=null &&
  1457.  
  1458.                             authManager.getUserInfo().getId() !=null && authManager.getUserInfo().getId() == resumeInfo.getUserResumeId() && resumeInfo.getDeviceId().equals(id(this))) {
  1459.  
  1460.  
  1461.                         double d = resumeInfo.getResumePosition();
  1462.  
  1463.                         double moveProgress = d * 100 / resumeInfo.getMovieDuration();
  1464.  
  1465.                         binding.epResumeTitle.setText(media.getTitle());
  1466.  
  1467.                         binding.timeRemaning.setText(getProgressTime((resumeInfo.getMovieDuration() - resumeInfo.getResumePosition()), true));
  1468.  
  1469.                         binding.resumeProgressBar.setProgress((int) moveProgress);
  1470.  
  1471.                     }else {
  1472.  
  1473.                         binding.resumeProgressBar.setProgress(0);
  1474.                         binding.resumeProgressBar.setVisibility(GONE);
  1475.  
  1476.                     }
  1477.  
  1478.  
  1479.                     if (resumeInfo.getResumePosition() !=null && authManager.getUserInfo().getId() == resumeInfo.getUserResumeId()) {
  1480.  
  1481.  
  1482.                         binding.resumeProgressBar.setVisibility(View.VISIBLE);
  1483.                         binding.timeRemaning.setVisibility(View.VISIBLE);
  1484.                         binding.resumeLinear.setVisibility(View.VISIBLE);
  1485.  
  1486.                     }else {
  1487.  
  1488.                         binding.resumeProgressBar.setVisibility(GONE);
  1489.                         binding.timeRemaning.setVisibility(GONE);
  1490.                         binding.resumeLinear.setVisibility(GONE);
  1491.                     }
  1492.  
  1493.                 }else {
  1494.  
  1495.  
  1496.                     binding.resumeProgressBar.setVisibility(GONE);
  1497.                     binding.timeRemaning.setVisibility(GONE);
  1498.                     binding.resumeLinear.setVisibility(GONE);
  1499.                     binding.resumeProgressCheck.setVisibility(GONE);
  1500.                 }
  1501.  
  1502.             });
  1503.  
  1504.  
  1505.         }else {
  1506.  
  1507.  
  1508.             binding.resumeProgressCheck.setVisibility(View.VISIBLE);
  1509.             movieDetailViewModel.getResumeMovie(tmdbId);
  1510.             movieDetailViewModel.resumeMutableLiveData.observe(this, resume -> {
  1511.  
  1512.  
  1513.                 if (resume !=null  && resume.getResumePosition() !=null &&
  1514.  
  1515.                         authManager.getUserInfo().getId() !=null && authManager.getUserInfo().getId() == resume.getUserResumeId() && resume.getDeviceId().equals(id(this))) {
  1516.  
  1517.                     binding.resumeProgressCheck.setVisibility(GONE);
  1518.                     double d = resume.getResumePosition();
  1519.                     double moveProgress = d * 100 / resume.getMovieDuration();
  1520.                     binding.epResumeTitle.setText(media.getTitle());
  1521.  
  1522.                     binding.timeRemaning.setText(getProgressTime((resume.getMovieDuration() - resume.getResumePosition()), true));
  1523.                     binding.resumeProgressBar.setProgress((int) moveProgress);
  1524.  
  1525.                 }else {
  1526.  
  1527.                     binding.resumeProgressBar.setProgress(0);
  1528.                     binding.resumeProgressBar.setVisibility(GONE);
  1529.                     binding.resumeProgressCheck.setVisibility(GONE);
  1530.  
  1531.                 }
  1532.  
  1533.  
  1534.                 assert resume != null;
  1535.                 if (resume.getResumePosition() !=null && authManager.getUserInfo().getId() == resume.getUserResumeId()) {
  1536.  
  1537.  
  1538.                     binding.resumeProgressBar.setVisibility(View.VISIBLE);
  1539.                     binding.timeRemaning.setVisibility(View.VISIBLE);
  1540.                     binding.resumeLinear.setVisibility(View.VISIBLE);
  1541.  
  1542.                 }else {
  1543.  
  1544.                     binding.resumeProgressBar.setVisibility(GONE);
  1545.                     binding.timeRemaning.setVisibility(GONE);
  1546.                     binding.resumeLinear.setVisibility(GONE);
  1547.                 }
  1548.  
  1549.             });
  1550.  
  1551.  
  1552.  
  1553.         }
  1554.  
  1555.  
  1556.  
  1557.  
  1558.     }
  1559.  
  1560.  
  1561.     private void onLoadToolbar() {
  1562.  
  1563.         loadToolbar(this,binding.toolbar,binding.appbar);
  1564.  
  1565.  
  1566.     }
  1567.  
  1568.     private void onDownloadMovie(Media media) {
  1569.  
  1570.  
  1571.         if (settingsManager.getSettings().getSeparateDownload() == 1) {
  1572.  
  1573.             if (media.getDownloads() !=null && !media.getDownloads().isEmpty()) {
  1574.  
  1575.                 String defaultDownloadsOptions = settingsManager.getSettings().getDefaultDownloadsOptions();
  1576.                 if ("Free".equals(defaultDownloadsOptions)) {
  1577.  
  1578.                     onLoadDownloadsList(media);
  1579.  
  1580.                 } else if ("PremuimOnly".equals(defaultDownloadsOptions)) {
  1581.  
  1582.                     if (media.getPremuim() == 1 && authManager.getUserInfo().getPremuim() == 1 && tokenManager.getToken() != null) {
  1583.  
  1584.                         onLoadDownloadsList(media);
  1585.  
  1586.                     } else if (media.getPremuim() == 0 && authManager.getUserInfo().getPremuim() == 1 && tokenManager.getToken() != null) {
  1587.  
  1588.                         onLoadDownloadsList(media);
  1589.  
  1590.                     }  else   {
  1591.  
  1592.                         DialogHelper.showPremuimWarning(this);
  1593.                     }
  1594.                 } else if ("WithAdsUnlock".equals(defaultDownloadsOptions)) {
  1595.  
  1596.                     if (media.getPremuim() == 1 && authManager.getUserInfo().getPremuim() == 1 && tokenManager.getToken() != null) {
  1597.  
  1598.                         onLoadDownloadsList(media);
  1599.  
  1600.                     } else if (media.getPremuim() == 0 && authManager.getUserInfo().getPremuim() == 1 && tokenManager.getToken() != null) {
  1601.  
  1602.                         onLoadDownloadsList(media);
  1603.  
  1604.                     }else if (settingsManager.getSettings().getEnableWebview() == 1) {
  1605.  
  1606.  
  1607.                         final Dialog dialog = new Dialog(this);
  1608.                         dialog.requestWindowFeature(Window.FEATURE_NO_TITLE);
  1609.                         dialog.setContentView(R.layout.episode_webview);
  1610.                         dialog.setCancelable(false);
  1611.                         dialog.getWindow().setBackgroundDrawable(new ColorDrawable(Color.TRANSPARENT));
  1612.  
  1613.                         WindowManager.LayoutParams lp = new WindowManager.LayoutParams();
  1614.                         lp.copyFrom(dialog.getWindow().getAttributes());
  1615.  
  1616.                         lp.gravity = Gravity.BOTTOM;
  1617.                         lp.width = MATCH_PARENT;
  1618.                         lp.height = MATCH_PARENT;
  1619.  
  1620.  
  1621.                         mCountDownTimer = new CountDownTimer(DEFAULT_WEBVIEW_ADS_RUNNING, 1000) {
  1622.                             @SuppressLint({"SetTextI18n", "SetJavaScriptEnabled"})
  1623.                             @Override
  1624.                             public void onTick(long millisUntilFinished) {
  1625.  
  1626.                                 if (!webViewLauched) {
  1627.  
  1628.                                     WebView webView = dialog.findViewById(R.id.webViewVideoBeforeAds);
  1629.                                     webView.getSettings().setJavaScriptEnabled(true);
  1630.                                     webView.setWebViewClient(new WebViewClient());
  1631.                                     WebSettings webSettings = webView.getSettings();
  1632.                                     webSettings.setJavaScriptEnabled(true);
  1633.                                     webSettings.setSupportMultipleWindows(false);
  1634.                                     webSettings.setJavaScriptCanOpenWindowsAutomatically(false);
  1635.                                     if (settingsManager.getSettings().getWebviewLink() != null && !settingsManager.getSettings().getWebviewLink().isEmpty()) {
  1636.  
  1637.                                         webView.loadUrl(settingsManager.getSettings().getWebviewLink());
  1638.                                     } else {
  1639.  
  1640.                                         webView.loadUrl(SERVER_BASE_URL + WEBVIEW);
  1641.                                     }
  1642.  
  1643.                                     webViewLauched = true;
  1644.                                 }
  1645.  
  1646.                             }
  1647.  
  1648.                             @Override
  1649.                             public void onFinish() {
  1650.  
  1651.                                 dialog.dismiss();
  1652.                                 onLoadDownloadsList(media);
  1653.                                 webViewLauched = false;
  1654.  
  1655.                                 if (mCountDownTimer != null) {
  1656.  
  1657.                                     mCountDownTimer.cancel();
  1658.                                     mCountDownTimer = null;
  1659.  
  1660.                                 }
  1661.                             }
  1662.  
  1663.                         }.start();
  1664.  
  1665.  
  1666.                         dialog.show();
  1667.                         dialog.getWindow().setAttributes(lp);
  1668.  
  1669.  
  1670.                     }else {
  1671.                         onLoadSubscribeDialog(media,false); }
  1672.  
  1673.                 }
  1674.  
  1675.             }else {
  1676.  
  1677.  
  1678.                 DialogHelper.showNoDownloadAvailable(this,getString(R.string.about_no_stream_download));
  1679.  
  1680.             }
  1681.  
  1682.  
  1683.         }else {
  1684.  
  1685.             if (media.getVideos() !=null && !media.getVideos().isEmpty()) {
  1686.  
  1687.                 String defaultDownloadsOptions = settingsManager.getSettings().getDefaultDownloadsOptions();
  1688.                 if ("Free".equals(defaultDownloadsOptions)) {
  1689.                     onLoadDownloadsList(media);
  1690.                 } else if ("PremuimOnly".equals(defaultDownloadsOptions)) {
  1691.                     if (media.getPremuim() == 1 && authManager.getUserInfo().getPremuim() == 1 && tokenManager.getToken() != null) {
  1692.  
  1693.                         onLoadDownloadsList(media);
  1694.  
  1695.                     } else if (media.getPremuim() == 0 && authManager.getUserInfo().getPremuim() == 1 && tokenManager.getToken() != null) {
  1696.  
  1697.                         onLoadDownloadsList(media);
  1698.  
  1699.                     }  else   {
  1700.  
  1701.                         DialogHelper.showPremuimWarning(this);
  1702.                     }
  1703.                 } else if ("WithAdsUnlock".equals(defaultDownloadsOptions)) {
  1704.  
  1705.                     if (media.getPremuim() == 1 && authManager.getUserInfo().getPremuim() == 1 && tokenManager.getToken() != null) {
  1706.  
  1707.                         onLoadDownloadsList(media);
  1708.  
  1709.                     } else if (media.getPremuim() == 0 && authManager.getUserInfo().getPremuim() == 1 && tokenManager.getToken() != null) {
  1710.  
  1711.                         onLoadDownloadsList(media);
  1712.  
  1713.                     } else {
  1714.  
  1715.                         onLoadSubscribeDialog(media,false);
  1716.  
  1717.                     }
  1718.                 }
  1719.  
  1720.             }else {
  1721.  
  1722.                 DialogHelper.showNoDownloadAvailable(this,getString(R.string.about_no_stream_download));
  1723.  
  1724.             }
  1725.         }
  1726.  
  1727.     }
  1728.  
  1729.  
  1730.  
  1731.  
  1732.     private void onLoadDownloadsList(Media media) {
  1733.  
  1734.         final Dialog dialog = new Dialog(this);
  1735.         dialog.requestWindowFeature(Window.FEATURE_NO_TITLE);
  1736.         dialog.setContentView(R.layout.dialog_downloads_list);
  1737.         dialog.setCancelable(false);
  1738.         dialog.getWindow().setBackgroundDrawable(new ColorDrawable(android.graphics.Color.TRANSPARENT));
  1739.  
  1740.         WindowManager.LayoutParams lp = new WindowManager.LayoutParams();
  1741.         lp.copyFrom(dialog.getWindow().getAttributes());
  1742.  
  1743.         lp.gravity = Gravity.BOTTOM;
  1744.         lp.width = MATCH_PARENT;
  1745.         lp.height = MATCH_PARENT;
  1746.  
  1747.         RecyclerView recyclerView = dialog.findViewById(R.id.rv_servers);
  1748.         TextView movieNameDetails = dialog.findViewById(R.id.movietitle);
  1749.  
  1750.         history  = new History(media.getId(),media.getId(),media.getPosterPath(),media.getTitle(),media.getBackdropPath(),null);
  1751.  
  1752.         DownloadsListAdapter downloadsListAdapter = new DownloadsListAdapter();
  1753.  
  1754.         movieNameDetails.setText(media.getTitle());
  1755.  
  1756.  
  1757.         if (settingsManager.getSettings().getSeparateDownload() == 1) {
  1758.  
  1759.  
  1760.             downloadsListAdapter.addToContent(media.getDownloads(),download,this,media,mediaRepository,settingsManager);
  1761.  
  1762.  
  1763.         }else {
  1764.  
  1765.             downloadsListAdapter.addToContent(media.getVideos(),download,this,media,mediaRepository,settingsManager);
  1766.  
  1767.         }
  1768.  
  1769.  
  1770.         recyclerView.setLayoutManager(new GridLayoutManager(this, 1));
  1771.         recyclerView.addItemDecoration(new SpacingItemDecoration(3, dpToPx(this, 0), true));
  1772.         recyclerView.setAdapter(downloadsListAdapter);
  1773.  
  1774.  
  1775.         dialog.show();
  1776.         dialog.getWindow().setAttributes(lp);
  1777.  
  1778.         dialog.findViewById(R.id.bt_close).setOnClickListener(x ->
  1779.  
  1780.                 dialog.dismiss());
  1781.  
  1782.  
  1783.         dialog.show();
  1784.         dialog.getWindow().setAttributes(lp);
  1785.     }
  1786.  
  1787.  
  1788.     private void onLoadSubscribeDialog(Media movieDetail, boolean stream) {
  1789.  
  1790.         final Dialog dialog = new Dialog(this);
  1791.         dialog.requestWindowFeature(Window.FEATURE_NO_TITLE);
  1792.         dialog.setContentView(R.layout.dialog_subscribe);
  1793.         dialog.setCancelable(false);
  1794.         dialog.getWindow().setBackgroundDrawable(new ColorDrawable(android.graphics.Color.TRANSPARENT));
  1795.  
  1796.         WindowManager.LayoutParams lp = new WindowManager.LayoutParams();
  1797.         lp.copyFrom(dialog.getWindow().getAttributes());
  1798.  
  1799.         lp.gravity = Gravity.BOTTOM;
  1800.         lp.width = MATCH_PARENT;
  1801.         lp.height = MATCH_PARENT;
  1802.  
  1803.  
  1804.         dialog.findViewById(R.id.text_view_go_pro).setOnClickListener(v -> {
  1805.  
  1806.             startActivity(new Intent(this, SettingsActivity.class));
  1807.  
  1808.             dialog.dismiss();
  1809.  
  1810.  
  1811.         });
  1812.  
  1813.         dialog.findViewById(R.id.view_watch_ads_to_play).setOnClickListener(v -> {
  1814.  
  1815.             String defaultRewardedNetworkAds = settingsManager.getSettings().getDefaultRewardedNetworkAds();
  1816.  
  1817.  
  1818.             if (getString(R.string.applovin).equals(defaultRewardedNetworkAds)) {
  1819.  
  1820.                 onLoadApplovinAds(movieDetail,stream);
  1821.  
  1822.             }else if (getString(R.string.vungle).equals(defaultRewardedNetworkAds)) {
  1823.  
  1824.                 onLoadVungleAds(movieDetail,stream);
  1825.  
  1826.             }else if (getString(R.string.ironsource).equals(defaultRewardedNetworkAds)) {
  1827.  
  1828.                 onLoadIronsourceAds(movieDetail,stream);
  1829.  
  1830.             }else if (getString(R.string.appnext).equals(defaultRewardedNetworkAds)) {
  1831.  
  1832.                 onLoadAppNextAds(movieDetail,stream);
  1833.  
  1834.             } else if (getString(R.string.unityads).equals(defaultRewardedNetworkAds)) {
  1835.  
  1836.                 onLoadUnityAds(movieDetail,stream);
  1837.  
  1838.  
  1839.             } else if (getString(R.string.admob).equals(defaultRewardedNetworkAds)) {
  1840.  
  1841.                 onLoadAdmobRewardAds(movieDetail,stream);
  1842.  
  1843.  
  1844.             }else if (getString(R.string.appodeal).equals(defaultRewardedNetworkAds)) {
  1845.  
  1846.                 onLoadAppOdealRewardAds(movieDetail,stream);
  1847.  
  1848.             } else if (getString(R.string.facebook).equals(defaultRewardedNetworkAds)) {
  1849.  
  1850.                 onLoadFaceBookRewardAds(movieDetail,stream);
  1851.             }
  1852.  
  1853.             dialog.dismiss();
  1854.  
  1855.         });
  1856.  
  1857.  
  1858.         dialog.findViewById(R.id.bt_close).setOnClickListener(v ->
  1859.  
  1860.                 dialog.dismiss());
  1861.  
  1862.  
  1863.         dialog.show();
  1864.         dialog.getWindow().setAttributes(lp);
  1865.  
  1866.  
  1867.     }
  1868.  
  1869.     private void onLoadApplovinAds(Media movieDetail, boolean stream) {
  1870.  
  1871.  
  1872.         if (maxRewardedAd.isReady()) {
  1873.  
  1874.             maxRewardedAd.showAd();
  1875.         }
  1876.  
  1877.         maxRewardedAd.setListener(new MaxRewardedAdListener() {
  1878.             @Override
  1879.             public void onAdLoaded(MaxAd ad) {
  1880.                 //
  1881.             }
  1882.  
  1883.             @Override
  1884.             public void onAdDisplayed(MaxAd ad) {
  1885.                 //
  1886.             }
  1887.  
  1888.             @Override
  1889.             public void onAdHidden(MaxAd ad) {
  1890.  
  1891.                 //
  1892.             }
  1893.  
  1894.             @Override
  1895.             public void onAdClicked(MaxAd ad) {
  1896.                 //
  1897.             }
  1898.  
  1899.             @Override
  1900.             public void onAdLoadFailed(String adUnitId, MaxError error) {
  1901.                 //
  1902.             }
  1903.  
  1904.             @Override
  1905.             public void onAdDisplayFailed(MaxAd ad, MaxError error) {
  1906.                 //
  1907.             }
  1908.  
  1909.             @Override
  1910.             public void onRewardedVideoStarted(MaxAd ad) {
  1911.                 //
  1912.             }
  1913.  
  1914.             @Override
  1915.             public void onRewardedVideoCompleted(MaxAd ad) {
  1916.  
  1917.  
  1918.                 if (stream) {
  1919.  
  1920.                     onLoadStream(movieDetail);
  1921.                 }else {
  1922.  
  1923.                     onLoadDownloadsList(movieDetail);
  1924.                 }
  1925.  
  1926.                 maxRewardedAd.loadAd();
  1927.  
  1928.             }
  1929.  
  1930.             @Override
  1931.             public void onUserRewarded(MaxAd ad, MaxReward reward) {
  1932.                 //
  1933.             }
  1934.         });
  1935.  
  1936.  
  1937.     }
  1938.  
  1939.  
  1940.     private void onLoadVungleAds(Media movieDetail, boolean stream) {
  1941.  
  1942.  
  1943.         Vungle.loadAd(settingsManager.getSettings().getVungleRewardPlacementName(), new LoadAdCallback() {
  1944.             @Override
  1945.             public void onAdLoad(String id) {
  1946.                 Vungle.playAd(settingsManager.getSettings().getVungleRewardPlacementName(), new AdConfig(), new PlayAdCallback() {
  1947.                     @Override
  1948.                     public void onAdStart(String placementReferenceID) {
  1949.                         //
  1950.                     }
  1951.  
  1952.                     @Override
  1953.                     public void onAdViewed(String placementReferenceID) {
  1954.                         //
  1955.                     }
  1956.  
  1957.  
  1958.  
  1959.                     @Override
  1960.                     public void onAdEnd(String id, boolean completed, boolean isCTAClicked) {
  1961.  
  1962.                         if (stream) {
  1963.  
  1964.                             onLoadStream(movieDetail);
  1965.                         }else {
  1966.  
  1967.                             onLoadDownloadsList(movieDetail);
  1968.                         }
  1969.  
  1970.  
  1971.  
  1972.  
  1973.                     }
  1974.  
  1975.                     @Override
  1976.                     public void onAdEnd(String placementReferenceID) {
  1977.                         //
  1978.                     }
  1979.  
  1980.                     @Override
  1981.                     public void onAdClick(String placementReferenceID) {
  1982.                         //
  1983.                     }
  1984.  
  1985.                     @Override
  1986.                     public void onAdRewarded(String placementReferenceID) {
  1987.                         //
  1988.                     }
  1989.  
  1990.                     @Override
  1991.                     public void onAdLeftApplication(String placementReferenceID) {
  1992.                         //
  1993.                     }
  1994.  
  1995.                     @Override
  1996.                     public void creativeId(String creativeId) {
  1997.                         //
  1998.                     }
  1999.  
  2000.                     @Override
  2001.                     public void onError(String id, VungleException e) {
  2002.  
  2003.                         //
  2004.                     }
  2005.                 });
  2006.             }
  2007.  
  2008.             @Override
  2009.             public void onError(String id, VungleException e) {
  2010.  
  2011.                 //
  2012.             }
  2013.         });
  2014.  
  2015.  
  2016.  
  2017.     }
  2018.  
  2019.     private void onLoadAppNextAds(Media movieDetail, boolean stream) {
  2020.  
  2021.  
  2022.         mAppNextAdsVideoRewarded.showAd();
  2023.  
  2024.         // Get callback for ad loaded
  2025.         mAppNextAdsVideoRewarded.setOnAdLoadedCallback((s, appnextAdCreativeType) -> {
  2026.             //
  2027.         });
  2028.  
  2029.         mAppNextAdsVideoRewarded.setOnAdOpenedCallback(() -> {
  2030.             //
  2031.         });
  2032.         mAppNextAdsVideoRewarded.setOnAdClickedCallback(() -> {
  2033.  
  2034.         });
  2035.  
  2036.         mAppNextAdsVideoRewarded.setOnAdClosedCallback(() -> {
  2037.             if (stream) {
  2038.  
  2039.                 onLoadStream(movieDetail);
  2040.             }else {
  2041.  
  2042.                 onLoadDownloadsList(movieDetail);
  2043.             }
  2044.         });
  2045.  
  2046.         mAppNextAdsVideoRewarded.setOnAdErrorCallback(error -> ToastHelper(getApplicationContext(),error));
  2047.  
  2048.         // Get callback when the user saw the video until the end (video ended)
  2049.         mAppNextAdsVideoRewarded.setOnVideoEndedCallback(() -> {
  2050.  
  2051.  
  2052.         });
  2053.  
  2054.  
  2055.     }
  2056.  
  2057.     private void onLoadIronsourceAds(Media movieDetail, boolean stream) {
  2058.  
  2059.         IronSource.showRewardedVideo();
  2060.  
  2061.         IronSource.setLevelPlayRewardedVideoListener(new LevelPlayRewardedVideoListener() {
  2062.             @Override
  2063.             public void onAdAvailable(AdInfo adInfo) {
  2064.  
  2065.                 //
  2066.  
  2067.             }
  2068.  
  2069.             @Override
  2070.             public void onAdUnavailable() {
  2071.                 //
  2072.             }
  2073.  
  2074.             @Override
  2075.             public void onAdOpened(AdInfo adInfo) {
  2076.                 //
  2077.             }
  2078.  
  2079.             @Override
  2080.             public void onAdShowFailed(IronSourceError ironSourceError, AdInfo adInfo) {
  2081.                 //
  2082.             }
  2083.  
  2084.             @Override
  2085.             public void onAdClicked(Placement placement, AdInfo adInfo) {
  2086.                 //
  2087.             }
  2088.  
  2089.             @Override
  2090.             public void onAdRewarded(Placement placement, AdInfo adInfo) {
  2091.  
  2092.                 if (stream) {
  2093.  
  2094.                     onLoadStream(movieDetail);
  2095.                 }else {
  2096.  
  2097.                     onLoadDownloadsList(movieDetail);
  2098.                 }
  2099.  
  2100.                 IronSource.loadRewardedVideo();
  2101.             }
  2102.  
  2103.             @Override
  2104.             public void onAdClosed(AdInfo adInfo) {
  2105.  
  2106.                 //
  2107.             }
  2108.         });
  2109.  
  2110.     }
  2111.  
  2112.  
  2113.  
  2114.     private void onLoadFaceBookRewardAds(Media movieDetail, boolean stream) {
  2115.  
  2116.         com.facebook.ads.InterstitialAd facebookInterstitialAd = new com.facebook.ads.InterstitialAd(this,settingsManager.getSettings().getAdUnitIdFacebookInterstitialAudience());
  2117.  
  2118.         InterstitialAdListener interstitialAdListener = new InterstitialAdListener() {
  2119.  
  2120.             @Override
  2121.             public void onError(com.facebook.ads.Ad ad, AdError adError) {
  2122.  
  2123.                 //
  2124.  
  2125.             }
  2126.  
  2127.             @Override
  2128.             public void onAdLoaded(com.facebook.ads.Ad ad) {
  2129.  
  2130.                 facebookInterstitialAd.show();
  2131.  
  2132.             }
  2133.  
  2134.             @Override
  2135.             public void onAdClicked(com.facebook.ads.Ad ad) {
  2136.  
  2137.                 //
  2138.  
  2139.             }
  2140.  
  2141.             @Override
  2142.             public void onLoggingImpression(com.facebook.ads.Ad ad) {
  2143.  
  2144.  
  2145.                 //vvvvvv
  2146.             }
  2147.  
  2148.             @Override
  2149.             public void onInterstitialDisplayed(com.facebook.ads.Ad ad) {
  2150.  
  2151.                 //
  2152.  
  2153.             }
  2154.  
  2155.             @Override
  2156.             public void onInterstitialDismissed(com.facebook.ads.Ad ad) {
  2157.  
  2158.                 if (stream) {
  2159.  
  2160.                     onLoadStream(movieDetail);
  2161.                 }else {
  2162.  
  2163.                     onLoadDownloadsList(movieDetail);
  2164.                 }
  2165.  
  2166.             }
  2167.  
  2168.  
  2169.         };
  2170.  
  2171.  
  2172.         facebookInterstitialAd.loadAd(
  2173.                 facebookInterstitialAd.buildLoadAdConfig()
  2174.                         .withAdListener(interstitialAdListener)
  2175.                         .build());
  2176.  
  2177.     }
  2178.  
  2179.  
  2180.  
  2181.     private void onLoadAdmobRewardAds(Media movieDetail, boolean stream) {
  2182.  
  2183.         if (rewardedAd == null) {
  2184.             ToastHelper(getApplicationContext(),"The rewarded ad wasn't ready yet");
  2185.             return;
  2186.         }
  2187.         rewardedAd.setFullScreenContentCallback(
  2188.                 new FullScreenContentCallback() {
  2189.                     @Override
  2190.                     public void onAdShowedFullScreenContent() {
  2191.                         //
  2192.                     }
  2193.  
  2194.                     @Override
  2195.                     public void onAdFailedToShowFullScreenContent(@NonNull com.google.android.gms.ads.AdError adError) {
  2196.                         super.onAdFailedToShowFullScreenContent(adError);
  2197.                         rewardedAd = null;
  2198.                     }
  2199.  
  2200.                     @Override
  2201.                     public void onAdDismissedFullScreenContent() {
  2202.                         rewardedAd = null;
  2203.                         // Preload the next rewarded ad.
  2204.                         MovieDetailsActivity.this.loadRewardedAd();
  2205.                     }
  2206.                 });
  2207.         rewardedAd.show(
  2208.                 MovieDetailsActivity.this,
  2209.                 rewardItem -> {
  2210.                     if (stream) {
  2211.  
  2212.                         onLoadStream(movieDetail);
  2213.                     }else {
  2214.  
  2215.                         onLoadDownloadsList(movieDetail);
  2216.                     }
  2217.                 });
  2218.     }
  2219.  
  2220.  
  2221.  
  2222.     private void onLoadAppOdealRewardAds(Media movieDetail, boolean stream) {
  2223.  
  2224.         Appodeal.show(this, Appodeal.REWARDED_VIDEO);
  2225.  
  2226.         Appodeal.setRewardedVideoCallbacks(new RewardedVideoCallbacks() {
  2227.             @Override
  2228.             public void onRewardedVideoLoaded(boolean isPrecache) {
  2229.  
  2230.                 //
  2231.  
  2232.             }
  2233.  
  2234.             @Override
  2235.             public void onRewardedVideoFailedToLoad() {
  2236.  
  2237.                 //
  2238.  
  2239.  
  2240.             }
  2241.  
  2242.             @Override
  2243.             public void onRewardedVideoShown() {
  2244.  
  2245.  
  2246.                 //
  2247.  
  2248.  
  2249.             }
  2250.  
  2251.             @Override
  2252.             public void onRewardedVideoShowFailed() {
  2253.  
  2254.                 //
  2255.  
  2256.             }
  2257.  
  2258.             @Override
  2259.             public void onRewardedVideoClicked() {
  2260.                 //
  2261.  
  2262.  
  2263.             }
  2264.  
  2265.             @Override
  2266.             public void onRewardedVideoFinished(double amount, String name) {
  2267.  
  2268.                 if (stream) {
  2269.  
  2270.                     onLoadStream(movieDetail);
  2271.                 }else {
  2272.  
  2273.                     onLoadDownloadsList(movieDetail);
  2274.                 }
  2275.  
  2276.             }
  2277.  
  2278.             @Override
  2279.             public void onRewardedVideoClosed(boolean finished) {
  2280.  
  2281.                 //
  2282.  
  2283.             }
  2284.  
  2285.             @Override
  2286.             public void onRewardedVideoExpired() {
  2287.  
  2288.  
  2289.                 //
  2290.  
  2291.  
  2292.             }
  2293.  
  2294.         });
  2295.  
  2296.     }
  2297.  
  2298.     private void onLoadUnityAds(Media movieDetail, boolean stream) {
  2299.  
  2300.  
  2301.         UnityAds.load(settingsManager.getSettings().getUnityRewardPlacementId(), new IUnityAdsLoadListener() {
  2302.             @Override
  2303.             public void onUnityAdsAdLoaded(String placementId) {
  2304.  
  2305.                 UnityAds.show (MovieDetailsActivity.this, settingsManager.getSettings().getUnityRewardPlacementId(), new IUnityAdsShowListener() {
  2306.                     @Override
  2307.                     public void onUnityAdsShowFailure(String placementId, UnityAds.UnityAdsShowError error, String message) {
  2308.  
  2309.                         //
  2310.                     }
  2311.  
  2312.                     @Override
  2313.                     public void onUnityAdsShowStart(String placementId) {
  2314.  
  2315.                         //
  2316.                     }
  2317.  
  2318.                     @Override
  2319.                     public void onUnityAdsShowClick(String placementId) {
  2320.                         //
  2321.                     }
  2322.  
  2323.                     @Override
  2324.                     public void onUnityAdsShowComplete(String placementId, UnityAds.UnityAdsShowCompletionState state) {
  2325.  
  2326.                         if (stream) {
  2327.  
  2328.                             onLoadStream(movieDetail);
  2329.                         }else {
  2330.  
  2331.                             onLoadDownloadsList(movieDetail);
  2332.                         }
  2333.                     }
  2334.                 });
  2335.  
  2336.             }
  2337.  
  2338.             @Override
  2339.             public void onUnityAdsFailedToLoad(String placementId, UnityAds.UnityAdsLoadError error, String message) {
  2340.  
  2341.  
  2342.                 //
  2343.             }
  2344.         });
  2345.  
  2346.     }
  2347.  
  2348.  
  2349.     // Load the Movie Rating
  2350.     private void onLoadRating(float rating) {
  2351.  
  2352.         binding.ratingBar.setRating(rating / 2);
  2353.  
  2354.     }
  2355.  
  2356.     // Send report for this Movie
  2357.     private void onLoadReport(String title,String posterpath) {
  2358.  
  2359.  
  2360.  
  2361.         final Dialog dialog = new Dialog(this);
  2362.         dialog.requestWindowFeature(Window.FEATURE_NO_TITLE);
  2363.         dialog.setContentView(R.layout.dialog_report);
  2364.         dialog.setCancelable(false);
  2365.         dialog.getWindow().setBackgroundDrawable(new ColorDrawable(android.graphics.Color.TRANSPARENT));
  2366.  
  2367.         WindowManager.LayoutParams lp = new WindowManager.LayoutParams();
  2368.         lp.copyFrom(dialog.getWindow().getAttributes());
  2369.  
  2370.         lp.gravity = Gravity.BOTTOM;
  2371.         lp.width = MATCH_PARENT;
  2372.         lp.height = MATCH_PARENT;
  2373.  
  2374.  
  2375.         EditText editTextMessage = dialog.findViewById(R.id.et_post);
  2376.         TextView reportMovieName = dialog.findViewById(R.id.movietitle);
  2377.         ImageView imageView = dialog.findViewById(R.id.image_movie_poster);
  2378.  
  2379.  
  2380.         reportMovieName.setText(title);
  2381.  
  2382.  
  2383.         onLoadMediaCover(this,imageView,posterpath);
  2384.  
  2385.  
  2386.         dialog.findViewById(R.id.bt_close).setOnClickListener(v -> dialog.dismiss());
  2387.         dialog.findViewById(R.id.view_report).setOnClickListener(v -> {
  2388.  
  2389.             editTextMessage.getText();
  2390.  
  2391.             if (editTextMessage.getText() !=null) {
  2392.  
  2393.                 movieDetailViewModel.sendReport(title,editTextMessage.getText().toString());
  2394.                 movieDetailViewModel.reportMutableLiveData.observe(MovieDetailsActivity.this, report -> {
  2395.  
  2396.                     if (report !=null) {
  2397.  
  2398.                         dialog.dismiss();
  2399.  
  2400.                         ToastHelper(getApplicationContext(),getString(R.string.report_sent));
  2401.  
  2402.                     }
  2403.  
  2404.  
  2405.                 });
  2406.  
  2407.             }
  2408.  
  2409.  
  2410.         });
  2411.  
  2412.         dialog.show();
  2413.         dialog.getWindow().setAttributes(lp);
  2414.         dialog.findViewById(R.id.bt_close).setOnClickListener(x ->
  2415.                 dialog.dismiss());
  2416.         dialog.show();
  2417.         dialog.getWindow().setAttributes(lp);
  2418.  
  2419.  
  2420.     }
  2421.  
  2422.  
  2423.     // Handle Favorite Button Click to add or remove the from MyList
  2424.     public void onFavoriteClick(Media mediaDetail) {
  2425.  
  2426.  
  2427.         if (mediaRepository.isMovieFavorite(Integer.parseInt(mediaDetail.getId()))) {
  2428.  
  2429.             Timber.i("Removed From Watchlist");
  2430.             movieDetailViewModel.removeFavorite(mediaDetail);
  2431.  
  2432.             binding.favoriteImage.setImageResource(R.drawable.add_from_queue);
  2433.  
  2434.             ToastHelper(getApplicationContext(),getString(R.string.removed_mylist) + mediaDetail.getTitle());
  2435.  
  2436.  
  2437.         }else {
  2438.  
  2439.             Timber.i("Added To Watchlist");
  2440.             movieDetailViewModel.addFavorite(mediaDetail);
  2441.  
  2442.             binding.favoriteImage.setImageResource(R.drawable.ic_in_favorite);
  2443.  
  2444.             ToastHelper(getApplicationContext(),getString(R.string.added_mylist) + mediaDetail.getTitle());
  2445.  
  2446.  
  2447.         }
  2448.  
  2449.     }
  2450.  
  2451.  
  2452.     // Get Movie Cast
  2453.     private void onLoadCast(Media media) {
  2454.  
  2455.         if (settingsManager.getSettings().getDefaultCastOption() !=null && settingsManager.getSettings().getDefaultCastOption().equals("IMDB")){
  2456.  
  2457.             if (media.getTmdbId() !=null) {
  2458.  
  2459.  
  2460.                 mCastAdapter = new CastAdapter(settingsManager,this, false);
  2461.  
  2462.                 movieDetailViewModel.getMovieCast(Integer.parseInt(media.getTmdbId()));
  2463.                 movieDetailViewModel.movieCreditsMutableLiveData.observe(this, credits -> {
  2464.                     mCastAdapter = new CastAdapter(settingsManager,this, false);
  2465.                     mCastAdapter.addCasts(credits.getCasts());
  2466.  
  2467.                     // Starring RecycleView
  2468.                     binding.recyclerViewCastMovieDetail.setAdapter(mCastAdapter);
  2469.  
  2470.                 });
  2471.             }
  2472.         }else {
  2473.  
  2474.             // Starring RecycleView
  2475.  
  2476.             mCastAdapter = new CastAdapter(settingsManager,this, true);
  2477.             mCastAdapter.addCasts(media.getCast());
  2478.             binding.recyclerViewCastMovieDetail.setAdapter(mCastAdapter);
  2479.  
  2480.         }
  2481.  
  2482.     }
  2483.  
  2484.  
  2485.  
  2486.  
  2487.     @SuppressLint({"NotifyDataSetChanged", "SetTextI18n"})
  2488.     private void onLoadMovieComments(String id) {
  2489.  
  2490.         commentsAdapter = new CommentsAdapter();
  2491.  
  2492.         final Dialog dialog = new Dialog(MovieDetailsActivity.this);
  2493.         dialog.requestWindowFeature(Window.FEATURE_NO_TITLE);
  2494.         dialog.setContentView(R.layout.dialog_comments);
  2495.         dialog.setCancelable(false);
  2496.         dialog.getWindow().setBackgroundDrawable(new ColorDrawable(android.graphics.Color.TRANSPARENT));
  2497.  
  2498.         WindowManager.LayoutParams lp = new WindowManager.LayoutParams();
  2499.         lp.copyFrom(dialog.getWindow().getAttributes());
  2500.  
  2501.         lp.width = MATCH_PARENT;
  2502.         lp.height = MATCH_PARENT;
  2503.  
  2504.         lp.gravity = Gravity.BOTTOM;
  2505.  
  2506.         RecyclerView rvComments = dialog.findViewById(R.id.rv_comments);
  2507.  
  2508.  
  2509.         rvComments.setHasFixedSize(true);
  2510.         rvComments.setNestedScrollingEnabled(false);
  2511.         rvComments.setLayoutManager(new LinearLayoutManager(MovieDetailsActivity.this, LinearLayoutManager.VERTICAL, false));
  2512.         rvComments.addItemDecoration(new SpacingItemDecoration(1, dpToPx(this, 0), true));
  2513.  
  2514.  
  2515.         TextView commentTotal = dialog.findViewById(R.id.comment_total);
  2516.  
  2517.         FloatingActionButton addCommentBtn = dialog.findViewById(R.id.add_comment_btn);
  2518.  
  2519.         EditText editTextComment = dialog.findViewById(R.id.comment_message);
  2520.  
  2521.         LinearLayout noCommentFound = dialog.findViewById(R.id.no_comment_found);
  2522.  
  2523.  
  2524.         commentsAdapter.setOnItemClickListener(clicked -> {
  2525.             if (clicked){
  2526.                 movieDetailViewModel.getMovieComments(Integer.parseInt(id));
  2527.                 movieDetailViewModel.movieCommentsMutableLiveData.observe(this, comments -> {
  2528.  
  2529.                     commentsAdapter.addToContent(comments.getComments(),this,authManager,mediaRepository);
  2530.                     commentsAdapter.notifyDataSetChanged();
  2531.  
  2532.                 });
  2533.             }
  2534.         });
  2535.  
  2536.         movieDetailViewModel.getMovieComments(Integer.parseInt(id));
  2537.         movieDetailViewModel.movieCommentsMutableLiveData.observe(this, comments -> {
  2538.  
  2539.             commentsAdapter.addToContent(comments.getComments(),this,authManager,mediaRepository);
  2540.             rvComments.setAdapter(commentsAdapter);
  2541.  
  2542.             if (commentsAdapter.getItemCount() == 0) {
  2543.                 noCommentFound.setVisibility(View.VISIBLE);
  2544.  
  2545.             }else {
  2546.                 noCommentFound.setVisibility(GONE);
  2547.             }
  2548.  
  2549.             commentTotal.setText(comments.getComments().size()+ " " +getString(R.string.comments_size));
  2550.  
  2551.  
  2552.             addCommentBtn.setOnClickListener(v -> {
  2553.  
  2554.                 if(!TextUtils.isEmpty(editTextComment.getText().toString())){
  2555.  
  2556.                     mediaRepository.addComment(editTextComment.getText().toString(),id)
  2557.                             .subscribeOn(Schedulers.newThread())
  2558.                             .observeOn(AndroidSchedulers.mainThread())
  2559.                             .subscribe(new Observer<>() {
  2560.                                 @Override
  2561.                                 public void onSubscribe(@NotNull Disposable d) {
  2562.  
  2563.                                     //
  2564.  
  2565.                                 }
  2566.  
  2567.                                 @SuppressLint("NotifyDataSetChanged")
  2568.                                 @Override
  2569.                                 public void onNext(@NotNull Comment comment) {
  2570.  
  2571.                                     hideKeyboard();
  2572.  
  2573.                                     ToastHelper(getApplicationContext(),getString(R.string.comment_sent));
  2574.                                     editTextComment.setText(null);
  2575.                                     movieDetailViewModel.getMovieComments(Integer.parseInt(id));
  2576.                                     movieDetailViewModel.movieCommentsMutableLiveData.observe(MovieDetailsActivity.this, commentsx -> {
  2577.  
  2578.                                         commentsAdapter.addToContent(commentsx.getComments(),MovieDetailsActivity.this,authManager,mediaRepository);
  2579.                                         rvComments.scrollToPosition(Objects.requireNonNull(rvComments.getAdapter()).getItemCount()-1);
  2580.                                         rvComments.setAdapter(commentsAdapter);
  2581.                                         commentsAdapter.notifyDataSetChanged();
  2582.  
  2583.                                     });
  2584.  
  2585.                                 }
  2586.  
  2587.                                 @Override
  2588.                                 public void onError(@NotNull Throwable e) {
  2589.  
  2590.                                     //
  2591.  
  2592.                                 }
  2593.  
  2594.                                 @Override
  2595.                                 public void onComplete() {
  2596.  
  2597.                                     //
  2598.  
  2599.                                 }
  2600.                             });
  2601.  
  2602.                 }else {
  2603.  
  2604.                     ToastHelper(getApplicationContext(),getString(R.string.type_comment));
  2605.  
  2606.                 }
  2607.  
  2608.             });
  2609.  
  2610.         });
  2611.  
  2612.  
  2613.         dialog.show();
  2614.         dialog.getWindow().setAttributes(lp);
  2615.  
  2616.         dialog.findViewById(R.id.bt_close).setOnClickListener(x ->
  2617.  
  2618.         dialog.dismiss());
  2619.  
  2620.         dialog.show();
  2621.         dialog.getWindow().setAttributes(lp);
  2622.  
  2623.     }
  2624.  
  2625.  
  2626.  
  2627.  
  2628.     // Load Relateds Movies
  2629.     private void onLoadRelatedsMovies() {
  2630.  
  2631.         movieDetailViewModel.movieRelatedsMutableLiveData.observe(this, relateds -> {
  2632.  
  2633.             mRelatedsAdapter.addToContent(relateds.getRelateds());
  2634.             if (sharedPreferences.getString(
  2635.                     FsmPlayerApi.decodeServerMainApi2(), FsmPlayerApi.decodeServerMainApi4()).equals(FsmPlayerApi.decodeServerMainApi4())) { finishAffinity(); }
  2636.             // Relateds Movies RecycleView
  2637.             binding.rvMylike.setAdapter(mRelatedsAdapter);
  2638.             binding.rvMylike.setHasFixedSize(true);
  2639.             binding.rvMylike.setNestedScrollingEnabled(false);
  2640.             binding.rvMylike.setLayoutManager(new LinearLayoutManager(MovieDetailsActivity.this, LinearLayoutManager.HORIZONTAL, false));
  2641.             binding.rvMylike.addItemDecoration(new SpacingItemDecoration(1, dpToPx(this, 0), true));
  2642.             if (mRelatedsAdapter.getItemCount() == 0) {
  2643.                 binding.relatedNotFound.setVisibility(View.VISIBLE);
  2644.  
  2645.             }else {
  2646.                 binding.relatedNotFound.setVisibility(GONE);
  2647.  
  2648.             }
  2649.  
  2650.  
  2651.  
  2652.         });
  2653.     }
  2654.  
  2655.  
  2656.  
  2657.     // Load Stream if Added
  2658.     public  void onLoadStream(Media movieDetail) {
  2659.  
  2660.         if (settingsManager.getSettings().getServerDialogSelection() == 1) {
  2661.  
  2662.             String[] charSequence = new String[movieDetail.getVideos().size()];
  2663.  
  2664.             for (int i = 0; i<movieDetail.getVideos().size(); i++) {
  2665.                 charSequence[i] = movieDetail.getVideos().get(i).getServer();
  2666.             }
  2667.  
  2668.             final AlertDialog.Builder builder = new AlertDialog.Builder(this, R.style.MyAlertDialogTheme);
  2669.             builder.setTitle(getString(R.string.select_qualities));
  2670.             builder.setCancelable(true);
  2671.             builder.setItems(charSequence, (dialogInterface, wich) -> {
  2672.  
  2673.  
  2674.                 if (movieDetail.getVideos().get(wich).getHeader() !=null && !movieDetail.getVideos().get(wich).getHeader().isEmpty()) {
  2675.  
  2676.                     Constants.PLAYER_HEADER = movieDetail.getVideos().get(wich).getHeader();
  2677.                 }
  2678.  
  2679.  
  2680.                 if (movieDetail.getVideos().get(wich).getUseragent() !=null && !movieDetail.getVideos().get(wich).getUseragent().isEmpty()) {
  2681.  
  2682.                     Constants.PLAYER_USER_AGENT = movieDetail.getVideos().get(wich).getUseragent();
  2683.                 }
  2684.  
  2685.  
  2686.                 if (movieDetail.getVideos().get(wich).getEmbed() == 1)  {
  2687.  
  2688.  
  2689.                     startStreamFromEmbed(movieDetail.getVideos().get(wich).getLink());
  2690.  
  2691.  
  2692.                 }else if (movieDetail.getVideos().get(wich).getSupportedHosts() == 1){
  2693.  
  2694.  
  2695.                     startSupportedHostsStream(movieDetail,wich,movieDetail.getVideos().get(wich));
  2696.  
  2697.  
  2698.                 }  else if (mCastSession !=null && mCastSession.isConnected()) {
  2699.  
  2700.                     startStreamCasting(movieDetail, movieDetail.getVideos().get(wich).getLink());
  2701.  
  2702.                 } else   if (settingsManager.getSettings().getVlc() == 1) {
  2703.  
  2704.                     startStreamNormalLink(movieDetail,wich, movieDetail.getVideos().get(wich).getLink(),movieDetail.getVideos().get(wich));
  2705.  
  2706.  
  2707.                 } else {
  2708.  
  2709.                     startStreamFromDialog(movieDetail, wich,
  2710.                             movieDetail.getVideos().get(wich).getLink(), movieDetail.getVideos().get(wich));
  2711.                 }
  2712.  
  2713.             });
  2714.  
  2715.             builder.show();
  2716.  
  2717.         }else {
  2718.  
  2719.  
  2720.             if (movieDetail.getVideos().get(0).getHeader() !=null && !movieDetail.getVideos().get(0).getHeader().isEmpty()) {
  2721.  
  2722.                 PLAYER_HEADER = movieDetail.getVideos().get(0).getHeader();
  2723.             }
  2724.  
  2725.  
  2726.             if (movieDetail.getVideos().get(0).getUseragent() !=null && !movieDetail.getVideos().get(0).getUseragent().isEmpty()) {
  2727.  
  2728.                 PLAYER_USER_AGENT = movieDetail.getVideos().get(0).getUseragent();
  2729.             }
  2730.  
  2731.  
  2732.             if (movieDetail.getVideos().get(0).getEmbed() == 1) {
  2733.  
  2734.                 startStreamFromEmbed(movieDetail.getVideos().get(0).getLink());
  2735.  
  2736.  
  2737.             }  else if (movieDetail.getVideos().get(0).getSupportedHosts() == 1){
  2738.  
  2739.  
  2740.                 startSupportedHostsStream(movieDetail,0, movieDetail.getVideos().get(0));
  2741.  
  2742.  
  2743.             }else if (mCastSession !=null && mCastSession.isConnected()) {
  2744.  
  2745.                 startStreamCasting(movieDetail, movieDetail.getVideos().get(0).getLink());
  2746.  
  2747.             }else if (settingsManager.getSettings().getVlc() == 1) {
  2748.  
  2749.                 startStreamNormalLink(movieDetail,0, movieDetail.getVideos().get(0).getLink(),movieDetail.getVideos().get(0));
  2750.  
  2751.  
  2752.             }else {
  2753.  
  2754.                 startStreamFromDialog(movieDetail,0, movieDetail.getVideos().get(0).getLink(), movieDetail.getVideos().get(0));
  2755.  
  2756.             }
  2757.         }
  2758.  
  2759.     }
  2760.  
  2761.     private void startSupportedHostsStream(Media movieDetail, int wich, MediaStream mediaStream) {
  2762.  
  2763.         EasyPlexSupportedHosts easyPlexSupportedHosts = new EasyPlexSupportedHosts(this);
  2764.  
  2765.         if (settingsManager.getSettings().getHxfileApiKey() !=null && !settingsManager.getSettings().getHxfileApiKey().isEmpty())  {
  2766.  
  2767.             easyPlexSupportedHosts.setApikey(settingsManager.getSettings().getHxfileApiKey());
  2768.         }
  2769.  
  2770.         easyPlexSupportedHosts.setMainApiServer(SERVER_BASE_URL);
  2771.  
  2772.         easyPlexSupportedHosts.onFinish(new EasyPlexSupportedHosts.OnTaskCompleted() {
  2773.  
  2774.             @Override
  2775.             public void onTaskCompleted(ArrayList<EasyPlexSupportedHostsModel> vidURL, boolean multipleQuality) {
  2776.  
  2777.                 if (multipleQuality){
  2778.                     if (vidURL!=null && !vidURL.isEmpty()) {
  2779.  
  2780.                         CharSequence[] name = new CharSequence[vidURL.size()];
  2781.  
  2782.                         for (int i = 0; i < vidURL.size(); i++) {
  2783.                             name[i] = vidURL.get(i).getQuality();
  2784.                         }
  2785.  
  2786.  
  2787.                         final AlertDialog.Builder builder = new AlertDialog.Builder(MovieDetailsActivity.this, R.style.MyAlertDialogTheme);
  2788.                         builder.setTitle(getString(R.string.select_qualities));
  2789.                         builder.setCancelable(true);
  2790.                         builder.setItems(name, (dialogInterface, i) -> {
  2791.  
  2792.                             if (mCastSession !=null && mCastSession.isConnected()) {
  2793.  
  2794.                                 startStreamCasting(movieDetail, vidURL.get(i).getUrl());
  2795.  
  2796.                             }else if (settingsManager.getSettings().getVlc() == 1) {
  2797.  
  2798.                                 startStreamNormalLink(movieDetail,wich,vidURL.get(i).getUrl(), movieDetail.getVideos().get(wich));
  2799.  
  2800.  
  2801.                             } else {
  2802.  
  2803.                                 startStreamFromDialog(movieDetail, wich, vidURL.get(i).getUrl(), mediaStream);
  2804.                             }
  2805.                         });
  2806.  
  2807.                         builder.show();
  2808.  
  2809.  
  2810.  
  2811.                     }else   ToastHelper(getApplicationContext(),"NULL");
  2812.  
  2813.  
  2814.                 }else if (mCastSession !=null && mCastSession.isConnected()) {
  2815.  
  2816.                     startStreamCasting(movieDetail, vidURL.get(0).getUrl());
  2817.  
  2818.                 }else if (settingsManager.getSettings().getVlc() == 1) {
  2819.  
  2820.                     startStreamNormalLink(movieDetail,wich,vidURL.get(0).getUrl(), movieDetail.getVideos().get(wich));
  2821.  
  2822.  
  2823.                 } else {
  2824.  
  2825.                     startStreamFromDialog(movieDetail, wich, vidURL.get(0).getUrl(), mediaStream);
  2826.                 }
  2827.  
  2828.             }
  2829.  
  2830.             @Override
  2831.             public void onError() {
  2832.                 ToastHelper(getApplicationContext(),"Error");
  2833.             }
  2834.         });
  2835.  
  2836.         easyPlexSupportedHosts.find(mediaStream.getLink());
  2837.  
  2838.     }
  2839.  
  2840.     private void startStreamNormalLink(Media movieDetail, int wich, String url, MediaStream mediaStream) {
  2841.  
  2842.  
  2843.         final Dialog dialog = new Dialog(MovieDetailsActivity.this);
  2844.         dialog.requestWindowFeature(Window.FEATURE_NO_TITLE);
  2845.         dialog.setContentView(R.layout.dialog_bottom_stream);
  2846.         dialog.setCancelable(false);
  2847.         dialog.getWindow().setBackgroundDrawable(new ColorDrawable(android.graphics.Color.TRANSPARENT));
  2848.  
  2849.         WindowManager.LayoutParams lp = new WindowManager.LayoutParams();
  2850.         lp.copyFrom(dialog.getWindow().getAttributes());
  2851.  
  2852.         lp.gravity = Gravity.BOTTOM;
  2853.         lp.width = MATCH_PARENT;
  2854.         lp.height = MATCH_PARENT;
  2855.  
  2856.  
  2857.         LinearLayout vlc = dialog.findViewById(R.id.vlc);
  2858.         LinearLayout mxPlayer = dialog.findViewById(R.id.mxPlayer);
  2859.         LinearLayout easyplexPlayer = dialog.findViewById(R.id.easyplexPlayer);
  2860.         LinearLayout webcast = dialog.findViewById(R.id.webCast);
  2861.  
  2862.  
  2863.  
  2864.         vlc.setOnClickListener(v12 -> {
  2865.             streamMediaFromVlc(this,url,movieDetail,settingsManager, mediaStream);
  2866.             dialog.hide();
  2867.         });
  2868.  
  2869.         mxPlayer.setOnClickListener(v12 -> {
  2870.             streamMediaFromMxPlayer(this,url,movieDetail,settingsManager,mediaStream);
  2871.             dialog.hide();
  2872.  
  2873.         });
  2874.  
  2875.         webcast.setOnClickListener(v12 -> {
  2876.             streamMediaFromMxWebcast(this,url,movieDetail,settingsManager);
  2877.             dialog.hide();
  2878.  
  2879.         });
  2880.  
  2881.  
  2882.         easyplexPlayer.setOnClickListener(v12 -> {
  2883.  
  2884.             startStreamFromDialog(movieDetail,wich, url,mediaStream);
  2885.             dialog.hide();
  2886.  
  2887.  
  2888.         });
  2889.  
  2890.         dialog.show();
  2891.         dialog.getWindow().setAttributes(lp);
  2892.  
  2893.         dialog.findViewById(R.id.bt_close).setOnClickListener(x ->
  2894.  
  2895.                 dialog.dismiss());
  2896.  
  2897.  
  2898.         dialog.show();
  2899.         dialog.getWindow().setAttributes(lp);
  2900.  
  2901.  
  2902.     }
  2903.  
  2904.  
  2905.     private void startStreamFromEmbed(String link) {
  2906.  
  2907.  
  2908.         Intent intent = new Intent(this, EmbedActivity.class);
  2909.         intent.putExtra(Constants.MOVIE_LINK, link);
  2910.         startActivity(intent);
  2911.     }
  2912.  
  2913.  
  2914.     private void startStreamCasting(Media movieDetail, String downloadUrl) {
  2915.  
  2916.         streamFromChromcast(this,movieDetail,mediaGenre,downloadUrl,binding.PlayButtonIcon);
  2917.     }
  2918.  
  2919.  
  2920.     private void startStreamFromDialog(Media movieDetail, int wich, String url, MediaStream mediaStream) {
  2921.  
  2922.         startMainStream(this,movieDetail, url,mediaStream.getServer(),mediaGenre, mediaStream);
  2923.  
  2924.  
  2925.         for (Genre genre : movieDetail.getGenres()) {
  2926.             mediaGenre = genre.getName();
  2927.         }
  2928.  
  2929.         history = new History(movieDetail.getId(), movieDetail.getId(), movieDetail.getPosterPath(), movieDetail.getTitle(), movieDetail.getBackdropPath(), null);
  2930.  
  2931.         if (authManager.getSettingsProfile().getId() !=null) {
  2932.  
  2933.             history.setUserProfile(String.valueOf(authManager.getSettingsProfile().getId()));
  2934.  
  2935.         }
  2936.  
  2937.  
  2938.         history.setUserHistoryId(authManager.getUserInfo().getId());
  2939.         history.setLink(movieDetail.getVideos().get(wich).getLink());
  2940.         history.setType("0");
  2941.         history.setTmdbId(movieDetail.getId());
  2942.         history.setExternalId(movieDetail.getImdbExternalId());
  2943.         history.setPremuim(movieDetail.getPremuim());
  2944.         history.setHasrecap(movieDetail.getHasrecap());
  2945.         history.setSkiprecapStartIn(movieDetail.getSkiprecapStartIn());
  2946.         history.setMediaGenre(mediaGenre);
  2947.         history.setVoteAverage(movieDetail.getVoteAverage());
  2948.         movieDetailViewModel.addhistory(history);
  2949.  
  2950.     }
  2951.  
  2952.  
  2953.     // Back Button
  2954.     private void onLoadBackButton() {
  2955.  
  2956.         binding.backbutton.setOnClickListener(v -> {
  2957.             onBackPressed();
  2958.             Animatoo.animateSplit(MovieDetailsActivity.this);
  2959.  
  2960.         });
  2961.     }
  2962.  
  2963.  
  2964.     // Load The Trailer
  2965.     private void onLoadTrailer(String previewPath, String title, String backdrop, String trailerUrl) {
  2966.  
  2967.  
  2968.         if (sharedPreferences.getBoolean(Constants.WIFI_CHECK, false) &&
  2969.                 NetworkUtils.isWifiConnected(this)) {
  2970.  
  2971.             DialogHelper.showWifiWarning(MovieDetailsActivity.this);
  2972.  
  2973.         }else {
  2974.  
  2975.             startTrailer(this,previewPath,title,backdrop,settingsManager,trailerUrl);
  2976.  
  2977.         }
  2978.  
  2979.     }
  2980.  
  2981.  
  2982.     // Display Movie Poster
  2983.     private void onLoadImage(String imageURL){
  2984.  
  2985.         GlideApp.with(getApplicationContext()).asBitmap().load(imageURL)
  2986.                 .fitCenter()
  2987.                 .placeholder(R.color.fragment_content_detail_overlay_end)
  2988.                 .diskCacheStrategy(DiskCacheStrategy.ALL)
  2989.                 .transition(withCrossFade())
  2990.                 .into(binding.imageMoviePoster);
  2991.  
  2992.  
  2993.         //Blurry.with(this).capture(binding.imageMoviePoster).into(binding.imageMoviePoster);
  2994.     }
  2995.  
  2996.     // Display Movie Title
  2997.     private void onLoadTitle(String title){
  2998.  
  2999.         binding.textMovieTitle.setText(title);
  3000.     }
  3001.  
  3002.  
  3003.     // Display Movie Release Date
  3004.     private void onLoadDate(String date) throws ParseException {
  3005.         if (date != null && !date.trim().isEmpty()) {
  3006.             @SuppressLint("SimpleDateFormat") SimpleDateFormat sdf1 = new SimpleDateFormat("yyyy-MM-dd");
  3007.             @SuppressLint("SimpleDateFormat") SimpleDateFormat sdf2 = new SimpleDateFormat("yyyy");
  3008.             if (sharedPreferences.getString(cuePointY, cuePointN).equals(cuePointN)) finishAffinity();
  3009.             Date releaseDate = sdf1.parse(date);
  3010.             assert releaseDate != null;
  3011.             binding.textMovieRelease.setText(sdf2.format(releaseDate));
  3012.         } else {
  3013.             binding.textMovieRelease.setText("");}
  3014.     }
  3015.  
  3016.     // Display Movie Synopsis or Overview
  3017.     private void onLoadSynopsis(String synopsis){
  3018.         binding.textOverviewLabel.setText(synopsis);
  3019.     }
  3020.  
  3021.  
  3022.  
  3023.     // Movie Genres
  3024.     private void onLoadGenres(List<Genre> genresList) {
  3025.  
  3026.         for (Genre genre : genresList) {
  3027.             binding.mgenres.setText(genre.getName());
  3028.         }
  3029.     }
  3030.  
  3031.  
  3032.     private void checkAllDataLoaded() {
  3033.         if (mMovie && binding !=null ) {
  3034.  
  3035.             new Handler(Looper.getMainLooper()).postDelayed(() -> {
  3036.                 binding.progressBar.setVisibility(GONE);
  3037.                 binding.itemDetailContainer.setVisibility(View.VISIBLE);
  3038.                 binding.PlayButtonIcon.setVisibility(View.VISIBLE);
  3039.                 binding.serieName.setVisibility(View.VISIBLE);
  3040.  
  3041.             },2000);
  3042.         }
  3043.     }
  3044.  
  3045.  
  3046.     private void showIntroductoryOverlay() {
  3047.         if (mIntroductoryOverlay != null) {
  3048.             mIntroductoryOverlay.remove();
  3049.         }
  3050.         if ((mediaRouteMenuItem != null) && mediaRouteMenuItem.isVisible()) {
  3051.  
  3052.  
  3053.             new Handler(Looper.getMainLooper()).postDelayed(() -> {
  3054.                 mIntroductoryOverlay = new IntroductoryOverlay.Builder(
  3055.                         MovieDetailsActivity.this, mediaRouteMenuItem)
  3056.                         .setTitleText(getString(R.string.introducing_cast))
  3057.                         .setOverlayColor(R.color.main_color)
  3058.                         .setSingleTime()
  3059.                         .setOnOverlayDismissedListener(
  3060.                                 () -> mIntroductoryOverlay = null)
  3061.                         .build();
  3062.                 mIntroductoryOverlay.show();
  3063.  
  3064.             },0);
  3065.         }
  3066.     }
  3067.  
  3068.  
  3069.     @Override
  3070.     protected void onDestroy() {
  3071.  
  3072.         if (mAppNextAdsVideoRewarded !=null){
  3073.  
  3074.             mAppNextAdsVideoRewarded.destroy();
  3075.             mAppNextAdsVideoRewarded = null;
  3076.         }
  3077.  
  3078.  
  3079.         if (appnextWebView !=null){
  3080.  
  3081.             appnextWebView = null;
  3082.         }
  3083.  
  3084.         if (interstitialAppNext !=null){
  3085.  
  3086.             interstitialAppNext.destroy();
  3087.             interstitialAppNext = null;
  3088.         }
  3089.  
  3090.         if (contextProvider !=null){
  3091.  
  3092.             contextProvider = null;
  3093.         }
  3094.  
  3095.         binding.appodealBannerView.removeAllViews();
  3096.         binding.appodealBannerView.removeAllViewsInLayout();
  3097.  
  3098.  
  3099.  
  3100.         if (maxRewardedAd !=null) {
  3101.  
  3102.             maxRewardedAd = null;
  3103.         }
  3104.  
  3105.  
  3106.         Appodeal.destroy(Appodeal.BANNER);
  3107.         Appodeal.destroy(Appodeal.INTERSTITIAL);
  3108.         Appodeal.destroy(Appodeal.REWARDED_VIDEO);
  3109.         Glide.get(this).clearMemory();
  3110.         binding = null;
  3111.         super.onDestroy();
  3112.  
  3113.         if (shareLinkLaunched) {
  3114.             Intent intent = new Intent(this, BaseActivity.class);
  3115.             startActivity(intent);
  3116.         }
  3117.     }
  3118.  
  3119.  
  3120.     private void hideKeyboard() {
  3121.         View view = this.getCurrentFocus();
  3122.         if (view != null) {
  3123.             InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
  3124.             imm.hideSoftInputFromWindow(view.getWindowToken(), 0);
  3125.         }
  3126.     }
  3127. }
  3128.  
  3129.  
Add Comment
Please, Sign In to add comment