Browse Source

增加音频试用功能

zk 1 year ago
parent
commit
b9ff950e79

+ 1 - 1
app/src/main/java/com/datarecovery/master/module/audiorecover/AudioRecoverViewModel.java

@@ -42,7 +42,7 @@ import dagger.hilt.android.lifecycle.HiltViewModel;
 public class AudioRecoverViewModel extends BaseViewModel {
 
     private final long SCANNING_COUNTDOWN = 1000 * 60 * 6;
-    private final long SCANNING_IS_TRIAL_COUNTDOWN = 1000 * 60;
+    private final long SCANNING_IS_TRIAL_COUNTDOWN = 1000 * 5;
     private final LiveData<String> selectedCountTxt;
     private final MutableLiveData<Boolean> checkAll = new MutableLiveData<>(false);
     private final List<FilesSearch.DocumentFile> originalDetectedList = new ArrayList<>();

+ 41 - 11
app/src/main/java/com/datarecovery/master/module/preview/PreviewActivity.java

@@ -16,11 +16,11 @@ import androidx.annotation.Nullable;
 import androidx.viewpager2.widget.ViewPager2;
 
 import com.atmob.app.lib.base.BaseActivity;
-import com.atmob.common.logging.AtmobLog;
 import com.atmob.common.ui.SizeUtil;
 import com.datarecovery.master.R;
 import com.datarecovery.master.databinding.ActivityPreviewBinding;
 import com.datarecovery.master.dialog.CommonSureDialog;
+import com.datarecovery.master.utils.BoxingUtil;
 import com.datarecovery.master.utils.FilesSearch;
 import com.datarecovery.master.utils.ImageDeepDetector;
 import com.datarecovery.master.utils.SafeMediaPlayer;
@@ -29,8 +29,6 @@ import com.gyf.immersionbar.ImmersionBar;
 
 import java.lang.ref.WeakReference;
 import java.util.List;
-import java.util.Timer;
-import java.util.TimerTask;
 
 import dagger.hilt.android.AndroidEntryPoint;
 
@@ -48,6 +46,7 @@ public class PreviewActivity extends BaseActivity<ActivityPreviewBinding> {
     private CommonSureDialog showTrialExportFailDialog;
 
     private ViewPager2.OnPageChangeCallback onPageChangeCallback;
+    private CommonSureDialog showFreeStopDialog;
 
     @IntDef({TYPE_IMG, TYPE_VIDEO, TYPE_AUDIO})
     @interface Type {
@@ -101,10 +100,35 @@ public class PreviewActivity extends BaseActivity<ActivityPreviewBinding> {
     }
 
     private void initObserver() {
-        previewViewModel.getRefreshCurrentProgress().observe(this, o -> binding.previewAudioSeekbar.setProgress(mediaPlayer.getCurrentPosition()));
+        previewViewModel.getSeekBarProgress().observe(this, process -> mediaPlayer.seekTo(BoxingUtil.boxing(process)));
+        previewViewModel.getShowFreeStopDialog().observe(this, o -> {
+            mediaPlayer.pause();
+            previewViewModel.setIsPlaying(false);
+            showFreeStopDialog();
+        });
+        previewViewModel.getHandlePlayProgress().observe(this, o -> {
+            previewViewModel.handleMediaPlayerProgress(mediaPlayer.getCurrentPosition());
+        });
+        previewViewModel.getRefreshAudioCurrentProgress().observe(this, o -> binding.previewAudioSeekbar.setProgress(mediaPlayer.getCurrentPosition()));
         previewViewModel.getShowTrialExportFailDialog().observe(this, o -> showTrialExportFailDialog());
     }
 
+    private void showFreeStopDialog() {
+        if (showFreeStopDialog == null) {
+            showFreeStopDialog = new CommonSureDialog(this);
+            if (previewViewModel.getType() == TYPE_VIDEO) {
+                showFreeStopDialog.setDialogTitle(R.string.trial_export_video_fail_title)
+                        .setDialogContent(R.string.trial_export_video_fail_content);
+            } else if (previewViewModel.getType() == TYPE_AUDIO) {
+                showFreeStopDialog.setDialogTitle(R.string.trial_export_audio_fail_title)
+                        .setDialogContent(R.string.trial_export_audio_fail_content);
+            }
+            showFreeStopDialog.setSureText(R.string.dialog_trial_recover);
+            showFreeStopDialog.setOnDialogClickListener(() -> previewViewModel.onTrialRecoverClick());
+        }
+        showFreeStopDialog.show();
+    }
+
     private void showTrialExportFailDialog() {
         if (showTrialExportFailDialog == null) {
             showTrialExportFailDialog = new CommonSureDialog(this);
@@ -152,7 +176,7 @@ public class PreviewActivity extends BaseActivity<ActivityPreviewBinding> {
             @Override
             public void onStopTrackingTouch(SeekBar seekBar) {
                 previewViewModel.setSeekbarChanging(false);
-                mediaPlayer.seekTo(seekBar.getProgress());
+                previewViewModel.setSeekbarTo(seekBar.getProgress());
             }
         });
         previewViewModel.startMediaTimer();
@@ -222,13 +246,9 @@ public class PreviewActivity extends BaseActivity<ActivityPreviewBinding> {
         try {
             mediaPlayer.setDataSource(this, uri);
             mediaPlayer.setOnPreparedListener(mp -> {
+                previewViewModel.setTotalDuration(mediaPlayer.getDuration());
                 if (previewViewModel.getType() == TYPE_VIDEO) {
-                    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);
+                    initVideo();
                 } else if (previewViewModel.getType() == TYPE_AUDIO) {
                     initSeekBar();
                 }
@@ -251,6 +271,16 @@ public class PreviewActivity extends BaseActivity<ActivityPreviewBinding> {
         }
     }
 
+    private void initVideo() {
+        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);
+        previewViewModel.startMediaTimer();
+    }
+
     @Override
     protected void onDestroy() {
         super.onDestroy();

+ 48 - 6
app/src/main/java/com/datarecovery/master/module/preview/PreviewViewModel.java

@@ -29,7 +29,6 @@ import java.util.TimerTask;
 
 import javax.inject.Inject;
 
-import atmob.reactivex.rxjava3.core.Completable;
 import atmob.rxjava.utils.RxJavaUtil;
 import dagger.hilt.android.lifecycle.HiltViewModel;
 
@@ -44,7 +43,10 @@ public class PreviewViewModel extends BaseViewModel {
     private List<ImageDeepDetector.ImageFile> imagePreviewList;
 
     private final SingleLiveEvent<?> showTrialExportFailDialog = new SingleLiveEvent<>();
-    private final SingleLiveEvent<?> refreshCurrentProgress = new SingleLiveEvent<>();
+    private final SingleLiveEvent<?> showFreeStopDialog = new SingleLiveEvent<>();
+    private final SingleLiveEvent<?> refreshAudioCurrentProgress = new SingleLiveEvent<>();
+    private final SingleLiveEvent<?> handlePlayProgress = new SingleLiveEvent<>();
+    private final MutableLiveData<Integer> seekBarProgress = new MutableLiveData<>();
 
     private int type;
 
@@ -55,14 +57,24 @@ public class PreviewViewModel extends BaseViewModel {
     private boolean isTrial;
     private Timer timer;
     private boolean isSeekbarChanging;
+    private int totalDuration;
+    private int halfwayDuration;
 
     @Inject
     public PreviewViewModel(DeviceFuncRepository deviceFuncRepository) {
         this.deviceFuncRepository = deviceFuncRepository;
     }
 
-    public LiveData<?> getRefreshCurrentProgress() {
-        return refreshCurrentProgress;
+    public LiveData<Integer> getSeekBarProgress() {
+        return seekBarProgress;
+    }
+
+    public LiveData<?> getHandlePlayProgress() {
+        return handlePlayProgress;
+    }
+
+    public LiveData<?> getRefreshAudioCurrentProgress() {
+        return refreshAudioCurrentProgress;
     }
 
     public void setSeekbarChanging(boolean seekbarChanging) {
@@ -73,6 +85,10 @@ public class PreviewViewModel extends BaseViewModel {
         return showTrialExportFailDialog;
     }
 
+    public LiveData<?> getShowFreeStopDialog() {
+        return showFreeStopDialog;
+    }
+
     public MutableLiveData<Boolean> getIsPlayStart() {
         return isPlayStart;
     }
@@ -286,10 +302,36 @@ public class PreviewViewModel extends BaseViewModel {
         timer.schedule(new TimerTask() {
             @Override
             public void run() {
-                if (!isSeekbarChanging) {
-                    refreshCurrentProgress.postValue(null);
+                if (type == PreviewActivity.TYPE_AUDIO) {
+                    if (isSeekbarChanging) {
+                        return;
+                    }
+                    refreshAudioCurrentProgress.postValue(null);
+                }
+                if (isTrial && isPlaying.getValue() != null && isPlaying.getValue()) {
+                    handlePlayProgress.postValue(null);
                 }
             }
         }, 0, 100);
     }
+
+    public void handleMediaPlayerProgress(int currentPosition) {
+        if (currentPosition >= halfwayDuration) {
+            showFreeStopDialog.call();
+        }
+    }
+
+    public void setTotalDuration(int totalDuration) {
+        this.totalDuration = totalDuration;
+        this.halfwayDuration = (int) (totalDuration / 2f);
+    }
+
+    public void setSeekbarTo(int progress) {
+        if (isTrial && progress >= halfwayDuration) {
+            this.seekBarProgress.setValue(halfwayDuration);
+            showFreeStopDialog.call();
+            return;
+        }
+        this.seekBarProgress.setValue(progress);
+    }
 }

+ 4 - 0
app/src/main/res/values/strings.xml

@@ -194,4 +194,8 @@
     <string name="dialog_trial_recover">去恢复</string>
     <string name="trial_go_recover_txt">开放深层扫描查找全部数据</string>
     <string name="preview_source_error">资源加载异常</string>
+    <string name="trial_export_video_fail_title">试看结束</string>
+    <string name="trial_export_audio_fail_title">试听结束</string>
+    <string name="trial_export_video_fail_content">您目前只可以试看该视频的50%,如需观看该视频的全部,请点击「去恢复」。</string>
+    <string name="trial_export_audio_fail_content">您目前只可以试听该音频的50%,如需试听该音频的全部,请点击「去恢复」。</string>
 </resources>