PreviewActivity.java 6.2 KB

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