Browse Source

增加视频预览&修复视频显示拉伸问题

zk 1 year ago
parent
commit
6aed0032ef

+ 0 - 1
app/src/main/java/com/datarecovery/master/module/imgrecover/ImageRecoverActivity.java

@@ -223,7 +223,6 @@ public class ImageRecoverActivity extends BaseActivity<ActivityImageRecoverBindi
     }
 
     private void initObserver() {
-        imageRecoverViewModel.getFinishEvent().observe(this, o -> finish());
         imageRecoverViewModel.getShowScanDialogEvent().observe(this, this::showScanProgressDialog);
         imageRecoverViewModel.getDetectedPhotoImg().observe(this, list -> photoAdapter.submit(list));
         imageRecoverViewModel.getDetectedWxImg().observe(this, list -> wxAdapter.submit(list));

+ 2 - 6
app/src/main/java/com/datarecovery/master/module/imgrecover/ImageRecoverViewModel.java

@@ -46,15 +46,14 @@ public class ImageRecoverViewModel extends BaseViewModel {
 
     private final SingleLiveEvent<ImageDeepDetector.ImageFile> previewEvent = new SingleLiveEvent<>();
     private final SingleLiveEvent<?> detectedFinish = new SingleLiveEvent<>();
-    private final SingleLiveEvent<?> finishEvent = new SingleLiveEvent<>();
     private final SingleLiveEvent<Boolean> showScanDialogEvent = new SingleLiveEvent<>();
     private final SingleLiveEvent<Boolean> showLoadingEvent = new SingleLiveEvent<>();
     private final MutableLiveData<String> barTitle = new MutableLiveData<>();
-    private final MutableLiveData<Boolean> checkAll = new MutableLiveData<>();
+    private final MutableLiveData<Boolean> checkAll = new MutableLiveData<>(false);
     //总探测到的图片数量
     private int totalCount = 0;
     private final MutableLiveData<Integer> totalDetectedCount = new MutableLiveData<>();
-    private final MutableLiveData<List<ImageDeepDetector.ImageFile>> selectedList = new MutableLiveData<>();
+    private final MutableLiveData<List<ImageDeepDetector.ImageFile>> selectedList = new MutableLiveData<>(new ArrayList<>());
     private LiveData<String> selectedCountTxt;
     private Disposable scanDisposable;
 
@@ -126,9 +125,6 @@ public class ImageRecoverViewModel extends BaseViewModel {
         return showScanDialogEvent;
     }
 
-    public LiveData<?> getFinishEvent() {
-        return finishEvent;
-    }
 
     public LiveData<Boolean> getCheckAll() {
         return checkAll;

+ 19 - 1
app/src/main/java/com/datarecovery/master/module/preview/PreviewActivity.java

@@ -15,6 +15,7 @@ import androidx.annotation.Nullable;
 import androidx.viewpager2.widget.ViewPager2;
 
 import com.atmob.app.lib.base.BaseActivity;
+import com.atmob.common.ui.SizeUtil;
 import com.datarecovery.master.databinding.ActivityPreviewBinding;
 import com.datarecovery.master.utils.ImageDeepDetector;
 import com.datarecovery.master.utils.SafeMediaPlayer;
@@ -112,6 +113,17 @@ public class PreviewActivity extends BaseActivity<ActivityPreviewBinding> {
 
     private void initView() {
         addTopStatusBarHeight(binding.previewHeader);
+        binding.previewVideoContainer.setOnClickListener(v -> {
+            if (isSurfaceCreated) {
+                previewViewModel.setIsPlayStart();
+                if (mediaPlayer.isPlaying()) {
+                    mediaPlayer.pause();
+                } else {
+                    mediaPlayer.start();
+                }
+                previewViewModel.setIsPlaying(mediaPlayer.isPlaying());
+            }
+        });
     }
 
     private void initImagePreviewPager() {
@@ -138,6 +150,7 @@ public class PreviewActivity extends BaseActivity<ActivityPreviewBinding> {
 
             @Override
             public void surfaceChanged(@NonNull SurfaceHolder holder, int format, int width, int height) {
+
             }
 
             @Override
@@ -153,7 +166,12 @@ public class PreviewActivity extends BaseActivity<ActivityPreviewBinding> {
         try {
             mediaPlayer.setDataSource(this, uri);
             mediaPlayer.setOnPreparedListener(mp -> {
-
+                int videoWidth = mediaPlayer.getVideoWidth();
+                int screenWidth = SizeUtil.getScreenWidth();
+                float scaleX = screenWidth / (videoWidth * 1f);
+                int width = (int) (videoWidth * scaleX);
+                int height = (int) (mediaPlayer.getVideoHeight() * scaleX);
+                binding.previewVideo.resize(width, height);
             });
             mediaPlayer.prepareAsync();
         } catch (Exception ignored) {

+ 18 - 1
app/src/main/java/com/datarecovery/master/module/preview/PreviewViewModel.java

@@ -31,7 +31,8 @@ public class PreviewViewModel extends BaseViewModel {
     private final MutableLiveData<Boolean> isPlaying = new MutableLiveData<>();
     private List<ImageDeepDetector.ImageFile> imagePreviewList;
 
-    private MutableLiveData<ImageDeepDetector.ImageFile> currentImageFile = new MutableLiveData<>();
+    private final MutableLiveData<Boolean> isPlayStart = new MutableLiveData<>();
+    private final MutableLiveData<ImageDeepDetector.ImageFile> currentImageFile = new MutableLiveData<>();
     private int position;
 
 
@@ -40,6 +41,10 @@ public class PreviewViewModel extends BaseViewModel {
 
     }
 
+    public MutableLiveData<Boolean> getIsPlayStart() {
+        return isPlayStart;
+    }
+
     public LiveData<ImageDeepDetector.ImageFile> getCurrentImageFile() {
         return currentImageFile;
     }
@@ -64,6 +69,10 @@ public class PreviewViewModel extends BaseViewModel {
         return previewUri;
     }
 
+    public void setIsPlaying(boolean isPlaying) {
+        this.isPlaying.setValue(isPlaying);
+    }
+
     public LiveData<Boolean> getIsPlaying() {
         return isPlaying;
     }
@@ -84,6 +93,7 @@ public class PreviewViewModel extends BaseViewModel {
         }
     }
 
+
     private void dealImageInit() {
         title.setValue(ContextUtil.getContext().getString(R.string.preview_img));
         if (weakReference != null) {
@@ -96,6 +106,13 @@ public class PreviewViewModel extends BaseViewModel {
         this.previewUri.setValue(uri);
     }
 
+    public void setIsPlayStart() {
+        if (BoxingUtil.boxing(this.isPlayStart.getValue())) {
+            return;
+        }
+        this.isPlayStart.setValue(true);
+    }
+
 
     public void setPosition(int position) {
         int te = BoxingUtil.boxing(type.getValue());

+ 35 - 24
app/src/main/java/com/datarecovery/master/module/videorecover/VideoRecoverViewModel.java

@@ -11,6 +11,7 @@ import com.atmob.common.runtime.ContextUtil;
 import com.datarecovery.master.R;
 import com.datarecovery.master.utils.FileUtil;
 import com.datarecovery.master.utils.FilesSearch;
+import com.datarecovery.master.utils.ImageDeepDetector;
 import com.datarecovery.master.utils.MediaStoreHelper;
 import com.datarecovery.master.utils.ToastUtil;
 
@@ -35,13 +36,12 @@ public class VideoRecoverViewModel extends BaseViewModel {
 
     private final String IS_SHOW_VIDEO_HINT = "isShowVideoHint";
     private final long SCANNING_COUNTDOWN = 1000 * 60 * 6;
-    private LiveData<String> selectedCountTxt;
-    private final MutableLiveData<Boolean> checkAll = new MutableLiveData<>();
-    private final MutableLiveData<List<FilesSearch.DocumentFile>> detectedVideoList = new MutableLiveData<>();
-    private final MutableLiveData<List<FilesSearch.DocumentFile>> selectedList = new MutableLiveData<>();
+    private final LiveData<String> selectedCountTxt;
+    private final MutableLiveData<Boolean> checkAll = new MutableLiveData<>(false);
+    private final MutableLiveData<List<FilesSearch.DocumentFile>> detectedVideoList = new MutableLiveData<>(new ArrayList<>());
+    private final MutableLiveData<List<FilesSearch.DocumentFile>> selectedList = new MutableLiveData<>(new ArrayList<>());
 
     private final SingleLiveEvent<?> detectedFinish = new SingleLiveEvent<>();
-    private final SingleLiveEvent<?> finishEvent = new SingleLiveEvent<>();
     private final SingleLiveEvent<Boolean> showScanDialogEvent = new SingleLiveEvent<>();
     private final SingleLiveEvent<Boolean> showLoadingEvent = new SingleLiveEvent<>();
     private int totalCount = 0;
@@ -76,10 +76,6 @@ public class VideoRecoverViewModel extends BaseViewModel {
         return detectedFinish;
     }
 
-    public LiveData<?> getFinishEvent() {
-        return finishEvent;
-    }
-
     public LiveData<Boolean> getShowScanDialogEvent() {
         return showScanDialogEvent;
     }
@@ -100,13 +96,6 @@ public class VideoRecoverViewModel extends BaseViewModel {
         return selectedCountTxt;
     }
 
-    public void onCheckAllClick(boolean isCheck) {
-        if (!scanDisposable.isDisposed()) {
-            return;
-        }
-        checkAll.setValue(isCheck);
-
-    }
 
     public LiveData<Boolean> getShowLoadingEvent() {
         return showLoadingEvent;
@@ -134,10 +123,7 @@ public class VideoRecoverViewModel extends BaseViewModel {
                         }
                         totalCount += documentFiles.size();
                         totalDetectedCount.setValue(totalCount);
-                        List<FilesSearch.DocumentFile> videoList = detectedVideoList.getValue();
-                        if (videoList == null) {
-                            videoList = new ArrayList<>();
-                        }
+                        List<FilesSearch.DocumentFile> videoList = getList(detectedVideoList);
                         videoList.addAll(0, documentFiles);
                         detectedVideoList.setValue(videoList);
                     }
@@ -154,6 +140,34 @@ public class VideoRecoverViewModel extends BaseViewModel {
                 });
     }
 
+    public void onCheckAllClick(boolean isCheck) {
+        if (!scanDisposable.isDisposed()) {
+            return;
+        }
+        checkAll.setValue(isCheck);
+        List<FilesSearch.DocumentFile> detectedList = getList(detectedVideoList);
+        for (FilesSearch.DocumentFile videoFile : detectedList) {
+            videoFile.setCheck(isCheck);
+        }
+        List<FilesSearch.DocumentFile> selectedList = getList(this.selectedList);
+        if (isCheck) {
+            selectedList.clear();
+            selectedList.addAll(detectedList);
+        } else {
+            selectedList.clear();
+        }
+        this.selectedList.setValue(selectedList);
+
+    }
+
+    private List<FilesSearch.DocumentFile> getList(LiveData<List<FilesSearch.DocumentFile>> liveData) {
+        List<FilesSearch.DocumentFile> selectList = liveData.getValue();
+        if (selectList == null) {
+            selectList = new ArrayList<>();
+        }
+        return selectList;
+    }
+
     public void cancelScan() {
         if (scanDisposable != null) scanDisposable.dispose();
     }
@@ -185,10 +199,7 @@ public class VideoRecoverViewModel extends BaseViewModel {
 
     public void setItemCheck(@NonNull FilesSearch.DocumentFile file) {
         file.setCheck(!file.isCheck());
-        List<FilesSearch.DocumentFile> list = selectedList.getValue();
-        if (list == null) {
-            list = new ArrayList<>();
-        }
+        List<FilesSearch.DocumentFile> list = getList(selectedList);
         if (file.isCheck()) {
             list.add(file);
         } else {

+ 40 - 0
app/src/main/java/com/datarecovery/master/widget/ResizeAbleSurfaceView.java

@@ -0,0 +1,40 @@
+package com.datarecovery.master.widget;
+
+import android.content.Context;
+import android.util.AttributeSet;
+import android.view.SurfaceView;
+
+public class ResizeAbleSurfaceView extends SurfaceView {
+
+    private int mWidth = -1;
+    private int mHeight = -1;
+
+    public ResizeAbleSurfaceView(Context context) {
+        super(context);
+    }
+
+    public ResizeAbleSurfaceView(Context context, AttributeSet attrs) {
+        super(context, attrs);
+    }
+
+    public ResizeAbleSurfaceView(Context context, AttributeSet attrs, int defStyleAttr) {
+        super(context, attrs, defStyleAttr);
+    }
+
+    @Override
+    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
+        if (-1 == mWidth || -1 == mHeight) {
+            super.onMeasure(widthMeasureSpec, heightMeasureSpec);
+        } else {
+            setMeasuredDimension(mWidth, mHeight);
+        }
+    }
+
+    public void resize(int width, int height) {
+        mWidth = width;
+        mHeight = height;
+        getHolder().setFixedSize(width, height);
+        requestLayout();
+        invalidate();
+    }
+}

+ 46 - 18
app/src/main/res/layout/activity_preview.xml

@@ -52,26 +52,53 @@
             app:layout_constraintBottom_toTopOf="@+id/preview_bottom"
             app:layout_constraintTop_toBottomOf="@+id/preview_header" />
 
-        <SurfaceView
-            android:id="@+id/preview_video"
+        <androidx.constraintlayout.widget.ConstraintLayout
+            android:id="@+id/preview_video_container"
             android:layout_width="match_parent"
-            android:layout_height="wrap_content"
+            android:layout_height="0dp"
             app:isGone="@{previewViewModel.type != PreviewActivity.TYPE_VIDEO}"
-            app:layout_constraintBottom_toBottomOf="@id/preview_background"
-            app:layout_constraintTop_toTopOf="@id/preview_background" />
+            app:layout_constraintBottom_toTopOf="@+id/preview_bottom"
+            app:layout_constraintTop_toBottomOf="@+id/preview_header">
+
+            <com.datarecovery.master.widget.ResizeAbleSurfaceView
+                android:id="@+id/preview_video"
+                android:layout_width="match_parent"
+                android:layout_height="wrap_content"
+                app:layout_constraintBottom_toBottomOf="parent"
+                app:layout_constraintTop_toTopOf="parent" />
+
+            <View
+                android:background="#F8F8F8"
+                isGone="@{previewViewModel.isPlayStart}"
+                android:layout_width="match_parent"
+                android:layout_height="match_parent" />
+
+            <ImageView
+                imageUri="@{previewViewModel.previewUri}"
+                isGone="@{previewViewModel.isPlayStart}"
+                android:layout_width="match_parent"
+                android:layout_height="0dp"
+                android:scaleType="centerCrop"
+                app:layout_constraintBottom_toBottomOf="@+id/preview_video_container"
+                app:layout_constraintDimensionRatio="360:254"
+                app:layout_constraintTop_toTopOf="@+id/preview_video_container" />
+
+            <ImageView
+                android:id="@+id/preview_play"
+                android:layout_width="0dp"
+                android:layout_height="0dp"
+                android:src="@drawable/icon_preview_video_play"
+                app:isGone="@{previewViewModel.isPlaying}"
+                app:layout_constraintBottom_toBottomOf="@id/preview_video_container"
+                app:layout_constraintDimensionRatio="1:1"
+                app:layout_constraintLeft_toLeftOf="@id/preview_video_container"
+                app:layout_constraintRight_toRightOf="@id/preview_video_container"
+                app:layout_constraintTop_toTopOf="@id/preview_video_container"
+                app:layout_constraintWidth_percent="0.1333333333333333" />
+
+
+        </androidx.constraintlayout.widget.ConstraintLayout>
 
-        <ImageView
-            android:id="@+id/preview_play"
-            android:layout_width="0dp"
-            android:layout_height="0dp"
-            android:src="@drawable/icon_preview_video_play"
-            app:isGone="@{previewViewModel.type != PreviewActivity.TYPE_VIDEO || previewViewModel.isPlaying}"
-            app:layout_constraintBottom_toBottomOf="@id/preview_video"
-            app:layout_constraintDimensionRatio="1:1"
-            app:layout_constraintLeft_toLeftOf="@id/preview_video"
-            app:layout_constraintRight_toRightOf="@id/preview_video"
-            app:layout_constraintTop_toTopOf="@id/preview_video"
-            app:layout_constraintWidth_percent="0.1333333333333333" />
 
         <View
             android:id="@+id/preview_audio_background"
@@ -118,6 +145,7 @@
             android:id="@+id/preview_bottom"
             android:layout_width="match_parent"
             android:layout_height="wrap_content"
+            app:isGone="@{previewViewModel.type == PreviewActivity.TYPE_VIDEO}"
             app:layout_constraintBottom_toBottomOf="parent">
 
             <View
@@ -133,11 +161,11 @@
                 android:layout_height="0dp"
                 android:background="@drawable/bg_common_btn"
                 android:gravity="center"
+                android:onClick="@{()->previewViewModel.onExportClick()}"
                 android:text="@string/export"
                 android:textColor="@color/white"
                 android:textSize="16sp"
                 android:textStyle="bold"
-                android:onClick="@{()->previewViewModel.onExportClick()}"
                 app:layout_constraintBottom_toBottomOf="@id/v_bottom"
                 app:layout_constraintDimensionRatio="328:44"
                 app:layout_constraintEnd_toEndOf="@+id/v_bottom"

+ 1 - 1
app/src/main/res/layout/activity_video_recover.xml

@@ -25,7 +25,6 @@
                 style="@style/Tool_Bar_Title_Txt"
                 android:text="@string/video_recover_title" />
 
-
             <ImageView
                 imageDraw="@{videoRecoverViewModel.checkAll ? @drawable/icon_image_recover_checked : @drawable/icon_image_recover_uncheck}"
                 android:layout_width="wrap_content"
@@ -35,6 +34,7 @@
                 android:background="?android:attr/selectableItemBackgroundBorderless"
                 android:onClick="@{()->videoRecoverViewModel.onCheckAllClick(!videoRecoverViewModel.checkAll)}"
                 tools:src="@drawable/icon_image_recover_uncheck" />
+
         </androidx.appcompat.widget.Toolbar>