PreviewActivity.java 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313
  1. package com.datarecovery.master.module.preview;
  2. import android.app.Activity;
  3. import android.content.Context;
  4. import android.content.Intent;
  5. import android.media.MediaPlayer;
  6. import android.net.Uri;
  7. import android.os.Bundle;
  8. import android.view.SurfaceHolder;
  9. import android.widget.SeekBar;
  10. import androidx.annotation.IntDef;
  11. import androidx.annotation.NonNull;
  12. import androidx.annotation.Nullable;
  13. import androidx.viewpager2.widget.ViewPager2;
  14. import com.atmob.app.lib.base.BaseActivity;
  15. import com.atmob.common.ui.SizeUtil;
  16. import com.datarecovery.master.R;
  17. import com.datarecovery.master.data.consts.AdFuncId;
  18. import com.datarecovery.master.databinding.ActivityPreviewBinding;
  19. import com.datarecovery.master.dialog.CommonSureDialog;
  20. import com.datarecovery.master.dialog.UnlockFunctionDialog;
  21. import com.datarecovery.master.module.member.MemberType;
  22. import com.datarecovery.master.sdk.ad.AtmobAdHelper;
  23. import com.datarecovery.master.sdk.ad.RewardVideoListenerAdapter;
  24. import com.datarecovery.master.utils.BoxingUtil;
  25. import com.datarecovery.master.utils.FilesSearch;
  26. import com.datarecovery.master.utils.ImageDeepDetector;
  27. import com.datarecovery.master.utils.SafeMediaPlayer;
  28. import com.datarecovery.master.utils.ToastUtil;
  29. import com.gyf.immersionbar.ImmersionBar;
  30. import java.lang.ref.WeakReference;
  31. import java.util.List;
  32. import dagger.hilt.android.AndroidEntryPoint;
  33. @AndroidEntryPoint
  34. public class PreviewActivity extends BaseActivity<ActivityPreviewBinding> {
  35. public static final int TYPE_IMG = 1;
  36. public static final int TYPE_VIDEO = 2;
  37. public static final int TYPE_AUDIO = 3;
  38. private PreviewViewModel previewViewModel;
  39. private MediaPlayer mediaPlayer;
  40. private CommonSureDialog showTrialExportFailDialog;
  41. private ViewPager2.OnPageChangeCallback onPageChangeCallback;
  42. private CommonSureDialog showFreeStopDialog;
  43. private UnlockFunctionDialog unlockFunctionDialog;
  44. public static void startImagePreView(Context context, List<ImageDeepDetector.ImageFile> imageFileList, int position) {
  45. Intent intent = new Intent(context, PreviewActivity.class);
  46. intent.putExtra("type", TYPE_IMG);
  47. intent.putExtra("position", position);
  48. PreviewViewModel.weakReference = new WeakReference<>(imageFileList);
  49. if (!(context instanceof Activity)) {
  50. intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
  51. }
  52. context.startActivity(intent);
  53. }
  54. public static void startDocumentPreView(Context context, @Type int type, FilesSearch.DocumentFile documentFile) {
  55. Intent intent = new Intent(context, PreviewActivity.class);
  56. intent.putExtra("type", type);
  57. PreviewViewModel.weakReference = new WeakReference<>(documentFile);
  58. if (!(context instanceof Activity)) {
  59. intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
  60. }
  61. context.startActivity(intent);
  62. }
  63. @Override
  64. protected boolean shouldImmersion() {
  65. return true;
  66. }
  67. @Override
  68. protected void configImmersion(@NonNull ImmersionBar immersionBar) {
  69. immersionBar.statusBarDarkFont(true);
  70. }
  71. @Override
  72. protected void initViewModel() {
  73. previewViewModel = getViewModelProvider().get(PreviewViewModel.class);
  74. binding.setPreviewViewModel(previewViewModel);
  75. }
  76. @Override
  77. protected void onCreate(@Nullable Bundle savedInstanceState) {
  78. super.onCreate(savedInstanceState);
  79. initView();
  80. initIntentData();
  81. initObserver();
  82. AtmobAdHelper.showInterstitial(AdFuncId.INTERSTITIAL_PREVIEW, null);
  83. }
  84. private void initObserver() {
  85. previewViewModel.getClickMediaPlayerEvent().observe(this, o -> {
  86. if (mediaPlayer.isPlaying()) {
  87. mediaPlayer.pause();
  88. } else {
  89. mediaPlayer.start();
  90. }
  91. previewViewModel.setIsPlaying(mediaPlayer.isPlaying());
  92. });
  93. previewViewModel.getSeekBarProgress().observe(this, process -> mediaPlayer.seekTo(BoxingUtil.boxing(process)));
  94. previewViewModel.getShowFreeStopDialog().observe(this, o -> {
  95. if (mediaPlayer.isPlaying()) {
  96. mediaPlayer.pause();
  97. }
  98. previewViewModel.setIsPlaying(false);
  99. showFreeStopDialog();
  100. });
  101. previewViewModel.getHandlePlayProgress().observe(this, o -> previewViewModel.handleMediaPlayerProgress(mediaPlayer.getCurrentPosition()));
  102. previewViewModel.getRefreshAudioCurrentProgress().observe(this, o -> binding.previewAudioSeekbar.setProgress(mediaPlayer.getCurrentPosition()));
  103. previewViewModel.getShowTrialExportFailDialog().observe(this, o -> showTrialExportFailDialog());
  104. previewViewModel.getShowUnlockEvent().observe(this, o -> showUnlockDialog());
  105. }
  106. private void showUnlockDialog() {
  107. if (unlockFunctionDialog == null) {
  108. unlockFunctionDialog = new UnlockFunctionDialog(this)
  109. .setActionHandler(new UnlockFunctionDialog.ActionHandler() {
  110. @Override
  111. public void onUnlock() {
  112. AtmobAdHelper.showVideo(AdFuncId.REWARD_RECOVER, new RewardVideoListenerAdapter() {
  113. @Override
  114. public void onRewarded(@NonNull String token) {
  115. super.onRewarded(token);
  116. previewViewModel.doExport();
  117. }
  118. });
  119. }
  120. });
  121. }
  122. unlockFunctionDialog.show();
  123. }
  124. private void showFreeStopDialog() {
  125. if (showFreeStopDialog == null) {
  126. showFreeStopDialog = new CommonSureDialog(this);
  127. if (previewViewModel.getType() == TYPE_VIDEO) {
  128. showFreeStopDialog.setDialogTitle(R.string.trial_export_video_fail_title)
  129. .setDialogContent(R.string.trial_export_video_fail_content);
  130. } else if (previewViewModel.getType() == TYPE_AUDIO) {
  131. showFreeStopDialog.setDialogTitle(R.string.trial_export_audio_fail_title)
  132. .setDialogContent(R.string.trial_export_audio_fail_content);
  133. }
  134. showFreeStopDialog.setSureText(R.string.dialog_trial_recover);
  135. showFreeStopDialog.setOnDialogClickListener(() -> previewViewModel.onTrialRecoverClick());
  136. }
  137. showFreeStopDialog.show();
  138. }
  139. private void showTrialExportFailDialog() {
  140. if (showTrialExportFailDialog == null) {
  141. showTrialExportFailDialog = new CommonSureDialog(this);
  142. showTrialExportFailDialog.setDialogTitle(R.string.trial_export_fail_title)
  143. .setDialogContent(R.string.trial_export_fail_content).setSureText(R.string.dialog_trial_recover);
  144. String evenType;
  145. if (previewViewModel.getType() == TYPE_IMG) {
  146. evenType = MemberType.APP_IMAGE_RECOVER;
  147. } else if (previewViewModel.getType() == TYPE_VIDEO) {
  148. evenType = MemberType.APP_VIDEO_RECOVER;
  149. } else if (previewViewModel.getType() == TYPE_AUDIO) {
  150. evenType = MemberType.APP_AUDIO_RECOVER;
  151. } else {
  152. evenType = null;
  153. }
  154. showTrialExportFailDialog.setOnDialogClickListener(() -> previewViewModel.onTrialRecoverClick());
  155. }
  156. showTrialExportFailDialog.show();
  157. }
  158. private void initIntentData() {
  159. int type = getIntent().getIntExtra("type", 0);
  160. int position = getIntent().getIntExtra("position", 0);
  161. previewViewModel.setPreviewData(type, position);
  162. if (type == TYPE_IMG) {
  163. initImagePreviewPager();
  164. } else {
  165. if (type == TYPE_VIDEO || type == TYPE_AUDIO) {
  166. initMediaPlayer(previewViewModel.getUri());
  167. }
  168. if (type == TYPE_VIDEO) {
  169. initSurfaceView();
  170. }
  171. }
  172. }
  173. private void initSeekBar() {
  174. binding.previewAudioSeekbar.setProgress(0);
  175. binding.previewAudioSeekbar.setMax(mediaPlayer.getDuration());
  176. binding.previewAudioSeekbar.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {
  177. @Override
  178. public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
  179. if (fromUser) {
  180. mediaPlayer.seekTo(progress);
  181. }
  182. }
  183. @Override
  184. public void onStartTrackingTouch(SeekBar seekBar) {
  185. previewViewModel.setSeekbarChanging(true);
  186. }
  187. @Override
  188. public void onStopTrackingTouch(SeekBar seekBar) {
  189. previewViewModel.setSeekbarChanging(false);
  190. previewViewModel.setSeekbarTo(seekBar.getProgress());
  191. }
  192. });
  193. previewViewModel.startMediaTimer();
  194. }
  195. private void initView() {
  196. binding.previewHeader.setNavigationOnClickListener(v -> finish());
  197. addTopStatusBarHeight(binding.previewHeader);
  198. }
  199. private void initImagePreviewPager() {
  200. PreviewImagePagerAdapter imagePagerAdapter = new PreviewImagePagerAdapter(previewViewModel.getImagePreviewList());
  201. binding.previewViewPager.setAdapter(imagePagerAdapter);
  202. onPageChangeCallback = new ViewPager2.OnPageChangeCallback() {
  203. @Override
  204. public void onPageSelected(int position) {
  205. previewViewModel.setPosition(position);
  206. }
  207. };
  208. binding.previewViewPager.registerOnPageChangeCallback(onPageChangeCallback);
  209. binding.previewViewPager.setCurrentItem(previewViewModel.getPosition(), false);
  210. }
  211. private void initSurfaceView() {
  212. SurfaceHolder holder = binding.previewVideo.getHolder();
  213. previewViewModel.setSurfaceCreated(false);
  214. holder.addCallback(new SurfaceHolder.Callback() {
  215. @Override
  216. public void surfaceCreated(@NonNull SurfaceHolder holder) {
  217. mediaPlayer.setDisplay(holder);
  218. previewViewModel.setSurfaceCreated(true);
  219. }
  220. @Override
  221. public void surfaceChanged(@NonNull SurfaceHolder holder, int format, int width, int height) {
  222. }
  223. @Override
  224. public void surfaceDestroyed(@NonNull SurfaceHolder holder) {
  225. mediaPlayer.stop();
  226. mediaPlayer.setDisplay(null);
  227. }
  228. });
  229. }
  230. private void initMediaPlayer(Uri uri) {
  231. mediaPlayer = new SafeMediaPlayer();
  232. try {
  233. mediaPlayer.setDataSource(this, uri);
  234. mediaPlayer.setOnPreparedListener(mp -> {
  235. previewViewModel.setTotalDuration(mediaPlayer.getDuration());
  236. if (previewViewModel.getType() == TYPE_VIDEO) {
  237. initVideo();
  238. } else if (previewViewModel.getType() == TYPE_AUDIO) {
  239. initSeekBar();
  240. }
  241. });
  242. mediaPlayer.prepareAsync();
  243. mediaPlayer.setOnErrorListener((mp, what, extra) -> {
  244. ToastUtil.show(R.string.preview_source_error, ToastUtil.LENGTH_SHORT);
  245. return false;
  246. });
  247. mediaPlayer.setOnCompletionListener(mp -> {
  248. if (previewViewModel.getType() == TYPE_VIDEO) {
  249. previewViewModel.setIsPlaying(false);
  250. previewViewModel.setIsPlayStart(false);
  251. } else if (previewViewModel.getType() == TYPE_AUDIO) {
  252. mediaPlayer.seekTo(0);
  253. previewViewModel.setIsPlaying(false);
  254. }
  255. });
  256. } catch (Exception ignored) {
  257. }
  258. }
  259. private void initVideo() {
  260. int videoWidth = mediaPlayer.getVideoWidth();
  261. int screenWidth = SizeUtil.getScreenWidth();
  262. float scaleX = screenWidth / (videoWidth * 1f);
  263. int width = (int) (videoWidth * scaleX);
  264. int height = (int) (mediaPlayer.getVideoHeight() * scaleX);
  265. binding.previewVideo.resize(width, height);
  266. previewViewModel.startMediaTimer();
  267. }
  268. @Override
  269. protected void onDestroy() {
  270. super.onDestroy();
  271. if (mediaPlayer != null) mediaPlayer.release();
  272. binding.previewViewPager.unregisterOnPageChangeCallback(onPageChangeCallback);
  273. }
  274. @IntDef({TYPE_IMG, TYPE_VIDEO, TYPE_AUDIO})
  275. @interface Type {
  276. }
  277. }