Browse Source

预览增加图片滚动查看

zhoukun 1 year ago
parent
commit
17bcc8a0e4

+ 2 - 0
app/build.gradle

@@ -146,4 +146,6 @@ dependencies {
     //RefreshLayout
     implementation "androidx.swiperefreshlayout:swiperefreshlayout:$rootProject.swiperefreshlayout_version"
 
+    //PhotoView
+    implementation 'com.github.chrisbanes:PhotoView:2.3.0'
 }

+ 7 - 4
app/src/main/java/com/datarecovery/master/module/imgrecover/ImageRecoverActivity.java

@@ -11,25 +11,24 @@ import androidx.annotation.NonNull;
 import androidx.annotation.Nullable;
 import androidx.recyclerview.widget.ConcatAdapter;
 import androidx.recyclerview.widget.GridLayoutManager;
-import androidx.recyclerview.widget.LinearLayoutManager;
 import androidx.recyclerview.widget.RecyclerView;
 
 import com.atmob.app.lib.base.BaseActivity;
 import com.datarecovery.master.R;
 import com.datarecovery.master.databinding.ActivityImageRecoverBinding;
-import com.datarecovery.master.databinding.ItemMainTabLayoutBinding;
 import com.datarecovery.master.databinding.ItemTabImageRecoverBinding;
 import com.datarecovery.master.dialog.CommonLoadingDialog;
 import com.datarecovery.master.dialog.CommonSureDialog;
 import com.datarecovery.master.dialog.ScanProgressDialog;
 import com.datarecovery.master.module.preview.PreviewActivity;
 import com.datarecovery.master.utils.BoxingUtil;
-import com.datarecovery.master.utils.GridLayoutItemDecoration;
 import com.datarecovery.master.utils.GridRecoverItemDecoration;
 import com.datarecovery.master.utils.ImageDeepDetector;
 import com.google.android.material.tabs.TabLayout;
 import com.gyf.immersionbar.ImmersionBar;
 
+import java.util.List;
+
 import dagger.hilt.android.AndroidEntryPoint;
 
 
@@ -231,7 +230,11 @@ public class ImageRecoverActivity extends BaseActivity<ActivityImageRecoverBindi
         imageRecoverViewModel.getDetectedQQImg().observe(this, list -> qqAdapter.submit(list));
         imageRecoverViewModel.getDetectedOtherImg().observe(this, list -> otherAdapter.submit(list));
         imageRecoverViewModel.getDetectedFinish().observe(this, o -> scanProgressDialog.detectedFinish());
-        imageRecoverViewModel.getPreviewEvent().observe(this, uri -> PreviewActivity.start(this, PreviewActivity.TYPE_IMG, uri));
+        imageRecoverViewModel.getPreviewEvent().observe(this, imageFile -> {
+            List<ImageDeepDetector.ImageFile> allDetectedList = imageRecoverViewModel.getAllDetectedList();
+            int position = imageRecoverViewModel.getPosition(allDetectedList, imageFile);
+            PreviewActivity.startImagePreView(this, allDetectedList, position);
+        });
         imageRecoverViewModel.getShowLoadingEvent().observe(this, this::showLoadingDialog);
     }
 

+ 18 - 3
app/src/main/java/com/datarecovery/master/module/imgrecover/ImageRecoverViewModel.java

@@ -48,7 +48,7 @@ public class ImageRecoverViewModel extends BaseViewModel {
     private LiveData<String> detectedQQTitle;
     private LiveData<String> detectedOtherTitle;
 
-    private final SingleLiveEvent<Uri> previewEvent = new SingleLiveEvent<>();
+    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<>();
@@ -74,7 +74,7 @@ public class ImageRecoverViewModel extends BaseViewModel {
         return showLoadingEvent;
     }
 
-    public LiveData<Uri> getPreviewEvent() {
+    public LiveData<ImageDeepDetector.ImageFile> getPreviewEvent() {
         return previewEvent;
     }
 
@@ -278,7 +278,7 @@ public class ImageRecoverViewModel extends BaseViewModel {
 
     public void checkPreview(@NonNull ImageDeepDetector.ImageFile imageFile) {
         //TODO 判断是否有会员
-        previewEvent.setValue(imageFile.getUri());
+        previewEvent.setValue(imageFile);
     }
 
     public void onExportClick() {
@@ -307,4 +307,19 @@ public class ImageRecoverViewModel extends BaseViewModel {
         });
     }
 
+
+    public List<ImageDeepDetector.ImageFile> getAllDetectedList() {
+        ArrayList<ImageDeepDetector.ImageFile> allList = new ArrayList<>();
+        allList.addAll(getList(detectedPhotoImg));
+        allList.addAll(getList(detectedWxImg));
+        allList.addAll(getList(detectedQQImg));
+        allList.addAll(getList(detectedOtherImg));
+        return allList;
+    }
+
+    public int getPosition(@NonNull List<ImageDeepDetector.ImageFile> list, ImageDeepDetector.ImageFile target) {
+        return list.indexOf(target);
+    }
+
+
 }

+ 64 - 8
app/src/main/java/com/datarecovery/master/module/preview/PreviewActivity.java

@@ -1,5 +1,6 @@
 package com.datarecovery.master.module.preview;
 
+
 import android.app.Activity;
 import android.content.Context;
 import android.content.Intent;
@@ -11,10 +12,16 @@ import android.view.SurfaceHolder;
 import androidx.annotation.IntDef;
 import androidx.annotation.NonNull;
 import androidx.annotation.Nullable;
+import androidx.viewpager2.widget.ViewPager2;
 
 import com.atmob.app.lib.base.BaseActivity;
 import com.datarecovery.master.databinding.ActivityPreviewBinding;
+import com.datarecovery.master.utils.ImageDeepDetector;
 import com.datarecovery.master.utils.SafeMediaPlayer;
+import com.gyf.immersionbar.ImmersionBar;
+
+import java.lang.ref.WeakReference;
+import java.util.List;
 
 import dagger.hilt.android.AndroidEntryPoint;
 
@@ -28,10 +35,25 @@ public class PreviewActivity extends BaseActivity<ActivityPreviewBinding> {
     private MediaPlayer mediaPlayer;
     private boolean isSurfaceCreated;
 
+    private PreviewImagePagerAdapter imagePagerAdapter;
+    private ViewPager2.OnPageChangeCallback onPageChangeCallback;
+
     @IntDef({TYPE_IMG, TYPE_VIDEO, TYPE_AUDIO})
     @interface Type {
     }
 
+    public static void startImagePreView(Context context, List<ImageDeepDetector.ImageFile> imageFileList, int position) {
+        Intent intent = new Intent(context, PreviewActivity.class);
+        intent.putExtra("type", TYPE_IMG);
+        intent.putExtra("position", position);
+        PreviewViewModel.weakReference = new WeakReference<>(imageFileList);
+        if (!(context instanceof Activity)) {
+            intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
+        }
+        context.startActivity(intent);
+    }
+
+
     public static void start(Context context, @Type int type, Uri uri) {
         Intent intent = new Intent(context, PreviewActivity.class);
         intent.putExtra("type", type);
@@ -48,6 +70,11 @@ public class PreviewActivity extends BaseActivity<ActivityPreviewBinding> {
     }
 
     @Override
+    protected void configImmersion(@NonNull ImmersionBar immersionBar) {
+        immersionBar.statusBarDarkFont(true);
+    }
+
+    @Override
     protected void initViewModel() {
         previewViewModel = getViewModelProvider().get(PreviewViewModel.class);
         binding.setPreviewViewModel(previewViewModel);
@@ -58,18 +85,28 @@ public class PreviewActivity extends BaseActivity<ActivityPreviewBinding> {
         super.onCreate(savedInstanceState);
         initView();
         initIntentData();
+        initObserver();
+    }
+
+    private void initObserver() {
+
     }
 
     private void initIntentData() {
         int type = getIntent().getIntExtra("type", 0);
-        Uri uri = getIntent().getParcelableExtra("uri");
-        previewViewModel.setPreviewData(type, uri);
-
-        if (type == TYPE_VIDEO || type == TYPE_AUDIO) {
-            initMediaPlayer(uri);
-        }
-        if (type == TYPE_VIDEO) {
-            initSurfaceView();
+        int position = getIntent().getIntExtra("position", 0);
+        previewViewModel.setPreviewData(type, position);
+        if (type == TYPE_IMG) {
+            initImagePreviewPager();
+        } else {
+            Uri uri = getIntent().getParcelableExtra("uri");
+            previewViewModel.setUri(uri);
+            if (type == TYPE_VIDEO || type == TYPE_AUDIO) {
+                initMediaPlayer(uri);
+            }
+            if (type == TYPE_VIDEO) {
+                initSurfaceView();
+            }
         }
     }
 
@@ -77,6 +114,19 @@ public class PreviewActivity extends BaseActivity<ActivityPreviewBinding> {
         addTopStatusBarHeight(binding.previewHeader);
     }
 
+    private void initImagePreviewPager() {
+        imagePagerAdapter = new PreviewImagePagerAdapter(previewViewModel.getImagePreviewList());
+        binding.previewViewPager.setAdapter(imagePagerAdapter);
+        onPageChangeCallback = new ViewPager2.OnPageChangeCallback() {
+            @Override
+            public void onPageSelected(int position) {
+                previewViewModel.setPosition(position);
+            }
+        };
+        binding.previewViewPager.registerOnPageChangeCallback(onPageChangeCallback);
+        binding.previewViewPager.setCurrentItem(previewViewModel.getPosition(), false);
+    }
+
     private void initSurfaceView() {
         SurfaceHolder holder = binding.previewVideo.getHolder();
         holder.addCallback(new SurfaceHolder.Callback() {
@@ -109,4 +159,10 @@ public class PreviewActivity extends BaseActivity<ActivityPreviewBinding> {
         } catch (Exception ignored) {
         }
     }
+
+    @Override
+    protected void onDestroy() {
+        super.onDestroy();
+        binding.previewViewPager.unregisterOnPageChangeCallback(onPageChangeCallback);
+    }
 }

+ 53 - 0
app/src/main/java/com/datarecovery/master/module/preview/PreviewImagePagerAdapter.java

@@ -0,0 +1,53 @@
+package com.datarecovery.master.module.preview;
+
+import android.view.LayoutInflater;
+import android.view.ViewGroup;
+
+import androidx.annotation.NonNull;
+import androidx.recyclerview.widget.RecyclerView;
+
+import com.datarecovery.master.databinding.ItemPreviewImgBinding;
+import com.datarecovery.master.utils.ImageDeepDetector;
+
+import java.util.List;
+
+public class PreviewImagePagerAdapter extends RecyclerView.Adapter<PreviewImagePagerAdapter.ViewHolder> {
+
+    private final List<ImageDeepDetector.ImageFile> imageFileList;
+
+    public PreviewImagePagerAdapter(List<ImageDeepDetector.ImageFile> imageFileList) {
+        this.imageFileList = imageFileList;
+    }
+
+    @NonNull
+    @Override
+    public PreviewImagePagerAdapter.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
+        ItemPreviewImgBinding imgBinding = ItemPreviewImgBinding.inflate(LayoutInflater.from(parent.getContext()), parent, false);
+        return new ViewHolder(imgBinding);
+    }
+
+    @Override
+    public void onBindViewHolder(@NonNull PreviewImagePagerAdapter.ViewHolder holder, int position) {
+        holder.bind(imageFileList.get(position));
+    }
+
+    @Override
+    public int getItemCount() {
+        return imageFileList == null ? 0 : imageFileList.size();
+    }
+
+
+    public class ViewHolder extends RecyclerView.ViewHolder {
+
+        private final ItemPreviewImgBinding binding;
+
+        public ViewHolder(@NonNull ItemPreviewImgBinding binding) {
+            super(binding.getRoot());
+            this.binding = binding;
+        }
+
+        public void bind(ImageDeepDetector.ImageFile imageFile) {
+            binding.previewImg.setImageURI(imageFile.getUri());
+        }
+    }
+}

+ 75 - 3
app/src/main/java/com/datarecovery/master/module/preview/PreviewViewModel.java

@@ -8,6 +8,13 @@ import androidx.lifecycle.MutableLiveData;
 import com.atmob.app.lib.base.BaseViewModel;
 import com.atmob.common.runtime.ContextUtil;
 import com.datarecovery.master.R;
+import com.datarecovery.master.utils.BoxingUtil;
+import com.datarecovery.master.utils.ImageDeepDetector;
+import com.datarecovery.master.utils.MediaStoreHelper;
+import com.datarecovery.master.utils.ToastUtil;
+
+import java.lang.ref.WeakReference;
+import java.util.List;
 
 import javax.inject.Inject;
 
@@ -16,16 +23,34 @@ import dagger.hilt.android.lifecycle.HiltViewModel;
 @HiltViewModel
 public class PreviewViewModel extends BaseViewModel {
 
+    public static WeakReference<List<ImageDeepDetector.ImageFile>> weakReference;
     private final MutableLiveData<String> title = new MutableLiveData<>();
     private final MutableLiveData<Integer> type = new MutableLiveData<>();
     private final MutableLiveData<Uri> previewUri = new MutableLiveData<>();
     private final MutableLiveData<Boolean> isPlaying = new MutableLiveData<>();
+    private List<ImageDeepDetector.ImageFile> imagePreviewList;
+
+    private MutableLiveData<ImageDeepDetector.ImageFile> currentImageFile = new MutableLiveData<>();
+    private int position;
+
 
     @Inject
     public PreviewViewModel() {
 
     }
 
+    public LiveData<ImageDeepDetector.ImageFile> getCurrentImageFile() {
+        return currentImageFile;
+    }
+
+    public int getPosition() {
+        return position;
+    }
+
+    public List<ImageDeepDetector.ImageFile> getImagePreviewList() {
+        return imagePreviewList;
+    }
+
     public LiveData<String> getTitle() {
         return title;
     }
@@ -42,19 +67,66 @@ public class PreviewViewModel extends BaseViewModel {
         return isPlaying;
     }
 
-    public void setPreviewData(@PreviewActivity.Type int type, Uri uri) {
+    public void setPreviewData(@PreviewActivity.Type int type, int position) {
         this.type.setValue(type);
-        this.previewUri.setValue(uri);
+        this.position = position;
         switch (type) {
             case PreviewActivity.TYPE_AUDIO:
                 title.setValue(ContextUtil.getContext().getString(R.string.preview_audio));
                 break;
             case PreviewActivity.TYPE_IMG:
-                title.setValue(ContextUtil.getContext().getString(R.string.preview_img));
+                dealImageInit();
                 break;
             case PreviewActivity.TYPE_VIDEO:
                 title.setValue(ContextUtil.getContext().getString(R.string.preview_video));
                 break;
         }
     }
+
+    private void dealImageInit() {
+        title.setValue(ContextUtil.getContext().getString(R.string.preview_img));
+        if (weakReference != null) {
+            this.imagePreviewList = weakReference.get();
+        }
+    }
+
+
+    public void setUri(Uri uri) {
+        this.previewUri.setValue(uri);
+    }
+
+
+    public void setPosition(int position) {
+        int te = BoxingUtil.boxing(type.getValue());
+        if (te == PreviewActivity.TYPE_IMG) {
+            if (position != -1 && imagePreviewList != null && position < imagePreviewList.size()) {
+                ImageDeepDetector.ImageFile imageFile = imagePreviewList.get(position);
+                currentImageFile.setValue(imageFile);
+            }
+
+        }
+    }
+
+    public void onExportClick() {
+        if (BoxingUtil.boxing(type.getValue()) == PreviewActivity.TYPE_IMG) {
+            ImageDeepDetector.ImageFile value = currentImageFile.getValue();
+            if (value == null) {
+                return;
+            }
+            try {
+                MediaStoreHelper.saveToSharedStorage(MediaStoreHelper.TYPE_IMAGE, value.newInputStream(), value.getName());
+                ToastUtil.show(R.string.export_success, ToastUtil.LENGTH_SHORT);
+            } catch (Exception e) {
+                ToastUtil.show(R.string.export_fail, ToastUtil.LENGTH_SHORT);
+            }
+        }
+    }
+
+    @Override
+    protected void onCleared() {
+        super.onCleared();
+        if (weakReference != null) {
+            weakReference.clear();
+        }
+    }
 }

+ 26 - 0
app/src/main/java/com/datarecovery/master/utils/DateUtil.java

@@ -0,0 +1,26 @@
+package com.datarecovery.master.utils;
+
+import java.text.SimpleDateFormat;
+import java.util.Date;
+import java.util.Locale;
+
+public class DateUtil {
+
+
+    public static final String YYYY_MM_DD_HH_MM = "yyyy-MM-dd HH:mm";
+
+    /**
+     * @param timestamp
+     * @return
+     */
+    public static String formatNormalDate(String format, long timestamp) {
+        if (timestamp == 0) {
+            return "";
+        }
+        Date date = new Date(timestamp);
+        SimpleDateFormat dateFormat = new SimpleDateFormat(format, Locale.getDefault());
+        return dateFormat.format(date);
+    }
+
+
+}

+ 50 - 0
app/src/main/java/com/datarecovery/master/utils/FileUtil.java

@@ -0,0 +1,50 @@
+package com.datarecovery.master.utils;
+
+import android.content.Context;
+import android.database.Cursor;
+import android.net.Uri;
+import android.provider.MediaStore;
+import android.text.format.Formatter;
+
+import com.atmob.common.runtime.ContextUtil;
+
+import java.util.Locale;
+
+public class FileUtil {
+
+    private FileUtil() {
+
+    }
+
+    public static String formatShortBytes(long bytes) {
+        Context context = ContextUtil.getContext();
+        return Formatter.formatShortFileSize(context, bytes);
+    }
+
+    public static String getImageFileType(String fileName) {
+        if (fileName == null) {
+            return "IMG";
+        }
+        String[] split = fileName.split("\\.");
+        if (split.length <= 1) {
+            return "IMG";
+        }
+        return split[split.length - 1].toUpperCase(Locale.getDefault());
+    }
+
+    public static long getFileCreationDate(Context context, Uri uri) {
+        String[] projection = new String[]{MediaStore.Images.ImageColumns.DATE_ADDED}; // 根据不同类型的文件选择合适的列名
+
+        try (Cursor cursor = context.getContentResolver().query(uri, projection, null, null, null)) {
+
+            if (cursor != null && cursor.moveToFirst()) {
+                int dateAddedColumnIndex = cursor.getColumnIndexOrThrow(projection[0]);
+
+                return cursor.getLong(dateAddedColumnIndex);
+            }
+        }
+        return 0;
+    }
+
+
+}

+ 0 - 53
app/src/main/java/com/datarecovery/master/utils/GridLayoutItemDecoration.java

@@ -1,53 +0,0 @@
-package com.datarecovery.master.utils;
-
-import android.graphics.Rect;
-import android.view.View;
-
-import androidx.annotation.NonNull;
-import androidx.recyclerview.widget.RecyclerView;
-
-public class GridLayoutItemDecoration extends RecyclerView.ItemDecoration {
-
-    private final int spanCount;
-    private final float horizontalGapPercent;
-    private final float verticalGapPercent;
-
-    private boolean showLastVertical = true;
-
-    public GridLayoutItemDecoration(int spanCount, float horizontalGapPercent, float verticalGapPercent) {
-        this(spanCount, horizontalGapPercent, verticalGapPercent, true);
-    }
-
-    public GridLayoutItemDecoration(int spanCount, float horizontalGapPercent, float verticalGapPercent, boolean showLastVertical) {
-        this.spanCount = spanCount;
-        this.horizontalGapPercent = horizontalGapPercent;
-        this.verticalGapPercent = verticalGapPercent;
-        this.showLastVertical = showLastVertical;
-    }
-
-    @Override
-    public void getItemOffsets(@NonNull Rect outRect, @NonNull View view, @NonNull RecyclerView parent, @NonNull RecyclerView.State state) {
-        super.getItemOffsets(outRect, view, parent, state);
-        int horizontalGap = (int) (parent.getMeasuredWidth() * horizontalGapPercent);
-        int verticalGap = (int) (parent.getMeasuredWidth() * verticalGapPercent);
-        int singleGap = horizontalGap * (spanCount - 1) / spanCount;
-        int childAdapterPosition = parent.getChildAdapterPosition(view);
-        int i = childAdapterPosition % spanCount;
-        outRect.top = 0;
-        if (!showLastVertical && parent.getAdapter() != null && parent.getAdapter().getItemCount() - spanCount <= childAdapterPosition) {
-            outRect.bottom = 0;
-        } else {
-            outRect.bottom = verticalGap;
-        }
-        outRect.left = 0;
-        outRect.right = 0;
-        if (i == 0) {
-            outRect.right = singleGap;
-        } else if (i == spanCount - 1) {
-            outRect.left = singleGap;
-        } else {
-            outRect.left = singleGap / 2;
-            outRect.right = singleGap / 2;
-        }
-    }
-}

+ 23 - 0
app/src/main/java/com/datarecovery/master/utils/ImageDeepDetector.java

@@ -138,6 +138,7 @@ public class ImageDeepDetector {
                 .doOnTerminate(() -> releaseWakeLock(context));
     }
 
+
     private static void releaseWakeLock(Context context) {
         PowerManager powerManager = (PowerManager) context.getSystemService(POWER_SERVICE);
         PowerManager.WakeLock wakeLock = powerManager.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK,
@@ -528,10 +529,15 @@ public class ImageDeepDetector {
         private final XFile xFile;
         private String name;
         private long size;
+        private String sizeDescribe;
         private Uri uri;
         private String path;
         private int category;
 
+        private String fileType;
+
+        private long createTime;
+
         private boolean isCheck;
 
 
@@ -558,6 +564,23 @@ public class ImageDeepDetector {
                 this.path = xFile.getPath();
             } catch (Exception ignore) {
             }
+            this.fileType = FileUtil.getImageFileType(name);
+            this.sizeDescribe = FileUtil.formatShortBytes(this.size);
+        }
+
+        public long getCreateTime() {
+            if (createTime == 0 && uri != null) {
+                this.createTime = FileUtil.getFileCreationDate(ContextUtil.getContext(), uri);
+            }
+            return createTime;
+        }
+
+        public String getSizeDescribe() {
+            return sizeDescribe;
+        }
+
+        public String getFileType() {
+            return fileType;
         }
 
         public String getName() {

+ 0 - 32
app/src/main/java/com/datarecovery/master/utils/StringUtil.java

@@ -1,32 +0,0 @@
-package com.datarecovery.master.utils;
-
-import android.content.Context;
-import android.text.format.Formatter;
-
-import com.atmob.common.runtime.ContextUtil;
-
-import java.util.Locale;
-
-public class StringUtil {
-
-    private StringUtil() {
-
-    }
-
-    public static String formatShortBytes(long bytes) {
-        Context context = ContextUtil.getContext();
-        return Formatter.formatShortFileSize(context, bytes);
-    }
-
-    public static String getImageFileType(String fileName) {
-        if (fileName == null) {
-            return "IMG";
-        }
-        String[] split = fileName.split("\\.");
-        if (split.length <= 1) {
-            return "IMG";
-        }
-        return split[split.length - 1].toUpperCase(Locale.getDefault());
-    }
-
-}

+ 29 - 26
app/src/main/res/layout/activity_preview.xml

@@ -9,6 +9,8 @@
             type="com.datarecovery.master.module.preview.PreviewViewModel" />
 
         <import type="com.datarecovery.master.module.preview.PreviewActivity" />
+
+        <import type="com.datarecovery.master.utils.DateUtil" />
     </data>
 
     <androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
@@ -43,15 +45,12 @@
             app:layout_constraintBottom_toBottomOf="parent"
             app:layout_constraintTop_toBottomOf="@id/preview_header" />
 
-        <ImageView
-            android:id="@+id/preview_image"
+        <androidx.viewpager2.widget.ViewPager2
+            android:id="@+id/preview_view_pager"
             android:layout_width="match_parent"
-            android:layout_height="wrap_content"
-            android:scaleType="fitCenter"
-            app:imageUri="@{previewViewModel.previewUri}"
-            app:isGone="@{previewViewModel.type != PreviewActivity.TYPE_IMG}"
-            app:layout_constraintBottom_toBottomOf="@id/preview_background"
-            app:layout_constraintTop_toTopOf="@id/preview_background" />
+            android:layout_height="0dp"
+            app:layout_constraintBottom_toTopOf="@+id/preview_bottom"
+            app:layout_constraintTop_toBottomOf="@+id/preview_header" />
 
         <SurfaceView
             android:id="@+id/preview_video"
@@ -138,6 +137,7 @@
                 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"
@@ -199,34 +199,37 @@
                     app:layout_constraintVertical_bias="0.8372093023255814" />
 
                 <TextView
-                    app:layout_constraintStart_toEndOf="@+id/tv_preview_img_name"
-                    app:layout_constraintBaseline_toBaselineOf="@+id/tv_preview_img_name"
+                    android:layout_width="wrap_content"
+                    android:layout_height="wrap_content"
+                    android:layout_marginStart="12dp"
+                    android:text="@{DateUtil.formatNormalDate(DateUtil.YYYY_MM_DD_HH_MM,previewViewModel.currentImageFile.createTime)}"
                     android:textColor="#404040"
                     android:textSize="12sp"
-                    android:layout_marginStart="12dp"
-                    tools:text="2023-06-26  16:21"
-                    android:layout_width="wrap_content"
-                    android:layout_height="wrap_content" />
+                    app:layout_constraintBaseline_toBaselineOf="@+id/tv_preview_img_name"
+                    app:layout_constraintStart_toEndOf="@+id/tv_preview_img_name"
+                    tools:text="2023-06-26  16:21" />
 
                 <TextView
-                    app:layout_constraintStart_toEndOf="@+id/tv_preview_file_type"
-                    app:layout_constraintBaseline_toBaselineOf="@+id/tv_preview_file_type"
+                    android:layout_width="wrap_content"
+                    android:layout_height="wrap_content"
+                    android:layout_marginStart="12dp"
+                    android:text="@{previewViewModel.currentImageFile.fileType}"
                     android:textColor="#404040"
                     android:textSize="12sp"
-                    android:layout_marginStart="12dp"
-                    tools:text="PNG"
-                    android:layout_width="wrap_content"
-                    android:layout_height="wrap_content" />
+                    app:layout_constraintBaseline_toBaselineOf="@+id/tv_preview_file_type"
+                    app:layout_constraintStart_toEndOf="@+id/tv_preview_file_type"
+                    tools:text="PNG" />
 
                 <TextView
-                    app:layout_constraintStart_toEndOf="@+id/tv_preview_file_size"
-                    app:layout_constraintBaseline_toBaselineOf="@+id/tv_preview_file_size"
+                    android:layout_width="wrap_content"
+                    android:layout_height="wrap_content"
+                    android:layout_marginStart="12dp"
+                    android:text="@{previewViewModel.currentImageFile.sizeDescribe}"
                     android:textColor="#404040"
                     android:textSize="12sp"
-                    android:layout_marginStart="12dp"
-                    tools:text="14.10KB"
-                    android:layout_width="wrap_content"
-                    android:layout_height="wrap_content" />
+                    app:layout_constraintBaseline_toBaselineOf="@+id/tv_preview_file_size"
+                    app:layout_constraintStart_toEndOf="@+id/tv_preview_file_size"
+                    tools:text="14.10KB" />
 
             </androidx.constraintlayout.widget.ConstraintLayout>
 

+ 1 - 3
app/src/main/res/layout/item_data_img.xml

@@ -12,8 +12,6 @@
         <variable
             name="checkBoxClick"
             type="android.view.View.OnClickListener" />
-
-        <import type="com.datarecovery.master.utils.StringUtil" />
     </data>
 
     <androidx.constraintlayout.widget.ConstraintLayout
@@ -41,7 +39,7 @@
         <TextView
             android:layout_width="wrap_content"
             android:layout_height="wrap_content"
-            android:text="@{@string/recover_img_label_text(StringUtil.getImageFileType(file.name),StringUtil.formatShortBytes(file.size))}"
+            android:text="@{@string/recover_img_label_text(file.fileType,file.sizeDescribe)}"
             android:textColor="@color/white"
             android:textSize="12dp"
             app:layout_constraintBottom_toBottomOf="@+id/bg_label"

+ 7 - 0
app/src/main/res/layout/item_preview_img.xml

@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="utf-8"?>
+<com.github.chrisbanes.photoview.PhotoView xmlns:android="http://schemas.android.com/apk/res/android"
+    android:layout_width="match_parent"
+    android:id="@+id/preview_img"
+    android:layout_height="match_parent">
+
+</com.github.chrisbanes.photoview.PhotoView>