PreviewActivity.java 5.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168
  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 androidx.annotation.IntDef;
  10. import androidx.annotation.NonNull;
  11. import androidx.annotation.Nullable;
  12. import androidx.viewpager2.widget.ViewPager2;
  13. import com.atmob.app.lib.base.BaseActivity;
  14. import com.datarecovery.master.databinding.ActivityPreviewBinding;
  15. import com.datarecovery.master.utils.ImageDeepDetector;
  16. import com.datarecovery.master.utils.SafeMediaPlayer;
  17. import com.gyf.immersionbar.ImmersionBar;
  18. import java.lang.ref.WeakReference;
  19. import java.util.List;
  20. import dagger.hilt.android.AndroidEntryPoint;
  21. @AndroidEntryPoint
  22. public class PreviewActivity extends BaseActivity<ActivityPreviewBinding> {
  23. public static final int TYPE_IMG = 1;
  24. public static final int TYPE_VIDEO = 2;
  25. public static final int TYPE_AUDIO = 3;
  26. private PreviewViewModel previewViewModel;
  27. private MediaPlayer mediaPlayer;
  28. private boolean isSurfaceCreated;
  29. private PreviewImagePagerAdapter imagePagerAdapter;
  30. private ViewPager2.OnPageChangeCallback onPageChangeCallback;
  31. @IntDef({TYPE_IMG, TYPE_VIDEO, TYPE_AUDIO})
  32. @interface Type {
  33. }
  34. public static void startImagePreView(Context context, List<ImageDeepDetector.ImageFile> imageFileList, int position) {
  35. Intent intent = new Intent(context, PreviewActivity.class);
  36. intent.putExtra("type", TYPE_IMG);
  37. intent.putExtra("position", position);
  38. PreviewViewModel.weakReference = new WeakReference<>(imageFileList);
  39. if (!(context instanceof Activity)) {
  40. intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
  41. }
  42. context.startActivity(intent);
  43. }
  44. public static void start(Context context, @Type int type, Uri uri) {
  45. Intent intent = new Intent(context, PreviewActivity.class);
  46. intent.putExtra("type", type);
  47. intent.putExtra("uri", uri);
  48. if (!(context instanceof Activity)) {
  49. intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
  50. }
  51. context.startActivity(intent);
  52. }
  53. @Override
  54. protected boolean shouldImmersion() {
  55. return true;
  56. }
  57. @Override
  58. protected void configImmersion(@NonNull ImmersionBar immersionBar) {
  59. immersionBar.statusBarDarkFont(true);
  60. }
  61. @Override
  62. protected void initViewModel() {
  63. previewViewModel = getViewModelProvider().get(PreviewViewModel.class);
  64. binding.setPreviewViewModel(previewViewModel);
  65. }
  66. @Override
  67. protected void onCreate(@Nullable Bundle savedInstanceState) {
  68. super.onCreate(savedInstanceState);
  69. initView();
  70. initIntentData();
  71. initObserver();
  72. }
  73. private void initObserver() {
  74. }
  75. private void initIntentData() {
  76. int type = getIntent().getIntExtra("type", 0);
  77. int position = getIntent().getIntExtra("position", 0);
  78. previewViewModel.setPreviewData(type, position);
  79. if (type == TYPE_IMG) {
  80. initImagePreviewPager();
  81. } else {
  82. Uri uri = getIntent().getParcelableExtra("uri");
  83. previewViewModel.setUri(uri);
  84. if (type == TYPE_VIDEO || type == TYPE_AUDIO) {
  85. initMediaPlayer(uri);
  86. }
  87. if (type == TYPE_VIDEO) {
  88. initSurfaceView();
  89. }
  90. }
  91. }
  92. private void initView() {
  93. addTopStatusBarHeight(binding.previewHeader);
  94. }
  95. private void initImagePreviewPager() {
  96. imagePagerAdapter = new PreviewImagePagerAdapter(previewViewModel.getImagePreviewList());
  97. binding.previewViewPager.setAdapter(imagePagerAdapter);
  98. onPageChangeCallback = new ViewPager2.OnPageChangeCallback() {
  99. @Override
  100. public void onPageSelected(int position) {
  101. previewViewModel.setPosition(position);
  102. }
  103. };
  104. binding.previewViewPager.registerOnPageChangeCallback(onPageChangeCallback);
  105. binding.previewViewPager.setCurrentItem(previewViewModel.getPosition(), false);
  106. }
  107. private void initSurfaceView() {
  108. SurfaceHolder holder = binding.previewVideo.getHolder();
  109. holder.addCallback(new SurfaceHolder.Callback() {
  110. @Override
  111. public void surfaceCreated(@NonNull SurfaceHolder holder) {
  112. mediaPlayer.setDisplay(holder);
  113. isSurfaceCreated = true;
  114. }
  115. @Override
  116. public void surfaceChanged(@NonNull SurfaceHolder holder, int format, int width, int height) {
  117. }
  118. @Override
  119. public void surfaceDestroyed(@NonNull SurfaceHolder holder) {
  120. mediaPlayer.stop();
  121. mediaPlayer.setDisplay(null);
  122. }
  123. });
  124. }
  125. private void initMediaPlayer(Uri uri) {
  126. mediaPlayer = new SafeMediaPlayer();
  127. try {
  128. mediaPlayer.setDataSource(this, uri);
  129. mediaPlayer.setOnPreparedListener(mp -> {
  130. });
  131. mediaPlayer.prepareAsync();
  132. } catch (Exception ignored) {
  133. }
  134. }
  135. @Override
  136. protected void onDestroy() {
  137. super.onDestroy();
  138. binding.previewViewPager.unregisterOnPageChangeCallback(onPageChangeCallback);
  139. }
  140. }