فهرست منبع

修改音频合成模块loading和部分问题

Pq 1 سال پیش
والد
کامیت
992d1d89f3
26فایلهای تغییر یافته به همراه999 افزوده شده و 339 حذف شده
  1. 9 2
      ffmpegCmd/src/main/java/com/cooleshow/ffmpegcmd/util/FFmpegUtil.java
  2. 7 0
      musicMerge/src/main/AndroidManifest.xml
  3. 9 0
      musicMerge/src/main/java/com/cooleshow/musicmerge/bean/MusicInfoBean.java
  4. 1 1
      musicMerge/src/main/java/com/cooleshow/musicmerge/contract/MusicFileHandleContract.java
  5. 28 28
      musicMerge/src/main/java/com/cooleshow/musicmerge/helper/MixHelper.java
  6. 16 6
      musicMerge/src/main/java/com/cooleshow/musicmerge/player/CustomPlayer.java
  7. 101 42
      musicMerge/src/main/java/com/cooleshow/musicmerge/presenter/MusicFileHandlePresenter.java
  8. 218 68
      musicMerge/src/main/java/com/cooleshow/musicmerge/ui/MusicHandleActivity.java
  9. 24 11
      musicMerge/src/main/java/com/cooleshow/musicmerge/ui/MusicHandleSettingFragment.java
  10. 28 1
      musicMerge/src/main/java/com/cooleshow/musicmerge/viewmodel/MusicMergeViewModel.java
  11. 77 0
      musicMerge/src/main/java/com/cooleshow/musicmerge/widget/MergeLoadingTipDialog.java
  12. 48 0
      musicMerge/src/main/java/com/cooleshow/musicmerge/widget/SolveEditTextScrollClash.java
  13. 52 8
      musicMerge/src/main/java/com/cooleshow/musicmerge/widget/UploadCoverTipDialog.java
  14. BIN
      musicMerge/src/main/res/drawable-xhdpi/icon_merge_loading_thumb.png
  15. BIN
      musicMerge/src/main/res/drawable-xhdpi/icon_merge_loading_top.png
  16. BIN
      musicMerge/src/main/res/drawable-xxhdpi/icon_get_cover_by_album.png
  17. BIN
      musicMerge/src/main/res/drawable-xxhdpi/icon_get_cover_by_crop.png
  18. BIN
      musicMerge/src/main/res/drawable-xxhdpi/icon_merge_loading_thumb.png
  19. BIN
      musicMerge/src/main/res/drawable-xxhdpi/icon_merge_loading_top.png
  20. BIN
      musicMerge/src/main/res/drawable-xxhdpi/icon_upload_video_cover.png
  21. 7 0
      musicMerge/src/main/res/drawable/shape_80b1c8_to_3a98a2_15dp.xml
  22. 5 0
      musicMerge/src/main/res/drawable/shape_b8878787_26dp.xml
  23. 26 0
      musicMerge/src/main/res/drawable/shape_loading_progress_bar_bg.xml
  24. 73 0
      musicMerge/src/main/res/layout/dialog_merge_custom_loading_layout.xml
  25. 269 172
      musicMerge/src/main/res/layout/dialog_upload_cover_tip_layout.xml
  26. 1 0
      musicMerge/src/main/res/values/colors.xml

+ 9 - 2
ffmpegCmd/src/main/java/com/cooleshow/ffmpegcmd/util/FFmpegUtil.java

@@ -146,7 +146,7 @@ public class FFmpegUtil {
         return mixAudioCmd;
     }
 
-    public static String[] mixAudio(String inputPath, String mixPath, int weight1, int weight2,float volume1,float volume2,
+    public static String[] mixAudio(String inputPath, String mixPath, int weight1, int weight2, float volume1, float volume2,
                                     boolean disableThumb, String outputPath, int delay, int delay2) {
         //duration: first shortest longest
         //weight: adjust weight(volume) of each audio stream
@@ -154,7 +154,7 @@ public class FFmpegUtil {
         int len = 8;
 //        String amix = "[1]adelay=%d|%d[b];[0][b]amix=inputs=2:duration=shortest";
         String amix = "[0]volume=%f,adelay=%d|%d[a];[1]volume=%f,adelay=%d|%d[b];[a][b]amix=inputs=2:duration=first";
-        amix = String.format(Locale.getDefault(), amix,volume1, delay, delay, volume2,delay2, delay2);
+        amix = String.format(Locale.getDefault(), amix, volume1, delay, delay, volume2, delay2, delay2);
         if (disableThumb) len += 1;
         String[] mixAudioCmd = new String[len];
         mixAudioCmd[0] = "ffmpeg";
@@ -298,6 +298,13 @@ public class FFmpegUtil {
         return mediaMuxCmd.split(" ");
     }
 
+    public static String[] getVideoFrame(String input, String output) {
+//        String mediaMuxCmd = "ffmpeg -i %s -vf fps=1/1 %simg%03d.jpg";
+        String mediaMuxCmd = "ffmpeg -i %s -vf fps=1/1 %s";
+        mediaMuxCmd = String.format(Locale.getDefault(), mediaMuxCmd, input, output);
+        return mediaMuxCmd.split(" ");
+    }
+
     /**
      * extract audio from media file
      *

+ 7 - 0
musicMerge/src/main/AndroidManifest.xml

@@ -12,5 +12,12 @@
             android:configChanges="orientation|screenSize|keyboardHidden|fontScale|smallestScreenSize|screenLayout"
             android:screenOrientation="portrait"
             android:windowSoftInputMode="adjustPan" />
+
+        <activity
+            android:name=".ui.SelectVideoFrameActivity"
+            android:configChanges="orientation|screenSize|keyboardHidden|fontScale|smallestScreenSize|screenLayout"
+            android:screenOrientation="landscape"
+            android:exported="false">
+        </activity>
     </application>
 </manifest>

+ 9 - 0
musicMerge/src/main/java/com/cooleshow/musicmerge/bean/MusicInfoBean.java

@@ -5,10 +5,19 @@ package com.cooleshow.musicmerge.bean;
  */
 public class MusicInfoBean {
     private String cover;
+    private String videoCover;
     private String preCover;
     private String musicTitle;
     private String des;
 
+    public String getVideoCover() {
+        return videoCover;
+    }
+
+    public void setVideoCover(String videoCover) {
+        this.videoCover = videoCover;
+    }
+
     public String getPreCover() {
         return preCover;
     }

+ 1 - 1
musicMerge/src/main/java/com/cooleshow/musicmerge/contract/MusicFileHandleContract.java

@@ -11,7 +11,7 @@ public interface MusicFileHandleContract extends BaseView {
     void getDetailSuccess(MusicDataBean data);
     void saveWorksDraftSuccess();
 
-    void upLoadImageSuccess(String url);
+    void upLoadImageSuccess(String url,boolean isVideoCover);
 
     void upLoadImageFailure();
 

+ 28 - 28
musicMerge/src/main/java/com/cooleshow/musicmerge/helper/MixHelper.java

@@ -4,20 +4,16 @@ import android.text.TextUtils;
 import android.util.Log;
 
 import com.cooleshow.base.data.net.RetrofitClientNoToken;
-import com.cooleshow.base.utils.ConvertUtils;
-import com.cooleshow.base.utils.EncodeUtils;
 import com.cooleshow.base.utils.EncryptUtils;
 import com.cooleshow.base.utils.FileUtils;
 import com.cooleshow.base.utils.LOG;
 import com.cooleshow.base.utils.LogUtils;
-import com.cooleshow.base.utils.MyFileUtils;
 import com.cooleshow.base.utils.Utils;
 import com.cooleshow.ffmpegcmd.FFmpegCmd;
 import com.cooleshow.ffmpegcmd.listener.OnHandleListener;
 import com.cooleshow.ffmpegcmd.util.FFmpegUtil;
 import com.cooleshow.musicmerge.api.DownloadApi;
 import com.cooleshow.musicmerge.callback.ResultCallback;
-import com.ksyun.ks3.util.Md5Utils;
 
 import java.io.File;
 import java.io.FileOutputStream;
@@ -58,7 +54,7 @@ public class MixHelper {
     public static final String onlyVideoPath = BASE_PATH + File.separator + "onlyVideoPath.mp4";
 
     public static String getVoicePath() {
-        return MyFileUtils.getRecordFilePath();
+        return FileUtils.getCacheDir(Utils.getApp()) + File.separator + "wav-accompany" + ".wav";
     }
 
     private MixHelper() {
@@ -98,14 +94,15 @@ public class MixHelper {
         @Override
         public void onProgress(int progress, int duration) {
             if (max_task_num != 0) {
-                LOG.i(TAG,"onProgress:"+progress+"--duration:"+duration);
-                float percent = progress * 1.0f /100;
-                LOG.i(TAG,"percent:"+percent);
+                LOG.i(TAG, "onProgress:" + progress + "--duration:" + duration);
+                float percent = progress * 1.0f / 100;
+                LOG.i(TAG, "percent:" + percent);
                 float average = 100f / max_task_num;
-                LOG.i(TAG,"average:"+average);
+                LOG.i(TAG, "average:" + average);
                 int cProgress = (int) (average * completed_num + average * percent);
-                LOG.i(TAG,"cProgress:"+cProgress);
-                if (tempResultCallback != null) {
+                LOG.i(TAG, "cProgress:" + cProgress);
+                if (tempResultCallback != null && cProgress < 100) {
+                    //此处回调会有延迟,所以100的进度由success回调触发吧
                     tempResultCallback.onProgress(cProgress);
                 }
             }
@@ -121,14 +118,7 @@ public class MixHelper {
 
     }
 
-    public String getDownloadSavePath(String url) {
-        String fileName = EncryptUtils.encryptMD5ToString(url);
-        String path = BASE_PATH + File.separator + fileName + ".mp3";
-        LOG.i(TAG, "getDownloadSavePath:" + path);
-        return path;
-    }
-
-    public String getDownloadSavePath(String url,String fileEndSuffix) {
+    public String getDownloadSavePath(String url, String fileEndSuffix) {
         String fileName = EncryptUtils.encryptMD5ToString(url);
         String path = BASE_PATH + File.separator + fileName + fileEndSuffix;
         LOG.i(TAG, "getDownloadSavePath:" + path);
@@ -142,22 +132,22 @@ public class MixHelper {
         return path;
     }
 
-    public String getDownloadSaveTempPath(String url,String fileEndSuffix) {
+    public String getDownloadSaveTempPath(String url, String fileEndSuffix) {
         String fileName = EncryptUtils.encryptMD5ToString(url);
         return BASE_PATH + File.separator + fileName + "_temp" + fileEndSuffix;
     }
 
-    public void download(String url,String fileEndSuffix, ResultCallback<String> resultCallback) {
+    public void download(String url, String fileEndSuffix, ResultCallback<String> resultCallback) {
         Observable.create(new ObservableOnSubscribe<String>() {
                     @Override
                     public void subscribe(@NonNull ObservableEmitter<String> emitter) throws Throwable {
                         deleteAllTempFile();
-                        String downloadSaveTempPath = getDownloadSaveTempPath(url,fileEndSuffix);
+                        String downloadSaveTempPath = getDownloadSaveTempPath(url, fileEndSuffix);
                         FileUtils.createOrExistsFile(downloadSaveTempPath);
                         File file = new File(downloadSaveTempPath);
                         downloadAccompany(url, file, resultCallback);
                         if (emitter != null) {
-                            emitter.onNext(getDownloadSavePath(url));
+                            emitter.onNext(getDownloadSavePath(url, fileEndSuffix));
                         }
                     }
                 }).subscribeOn(Schedulers.newThread())
@@ -246,7 +236,7 @@ public class MixHelper {
 //        LogUtils.i(TAG, "deleteAllTempFile:" + b);
     }
 
-    public int mp3ToWav(String input,String outPut) {
+    public int mp3ToWav(String input, String outPut) {
         String[] commands = FFmpegUtil.transformAudio(input, outPut);
         if (commands != null) {
             println(commands);
@@ -361,7 +351,7 @@ public class MixHelper {
                     @Override
                     public void subscribe(@NonNull ObservableEmitter<String> emitter) throws Throwable {
                         deleteAllTempFile();
-                        resetCondition(resultCallback,offsetValue < 0 ? 5 : 4);
+                        resetCondition(resultCallback, offsetValue < 0 ? 6 : 5);
 
                         Log.i(TAG, "转换开始");
                         int getVideoMp3Result = getVideoMp3_2(recordFilePath, videoMp3Path);
@@ -370,6 +360,7 @@ public class MixHelper {
                         //mix原音和视频bgm mp3
 //                        String accompanyPath = accompanimentMp3Path;
                         int i = mp3ToWav(accompanimentMp3Path, accompanimentWAVPath);
+                        completed_num++;
                         Log.i(TAG, "mp3ToWav complete:" + i);
                         String accompanyPath = accompanimentWAVPath;
                         int recordFileOffset = 0;
@@ -438,7 +429,7 @@ public class MixHelper {
     }
 
 
-    private void resetCondition(ResultCallback<String> resultCallback,int num){
+    private void resetCondition(ResultCallback<String> resultCallback, int num) {
         resetCount();
         tempResultCallback = resultCallback;
         max_task_num = num;
@@ -454,7 +445,7 @@ public class MixHelper {
 //                        Log.i(TAG, "getVideoMp3 complete:" + getVideoMp3Result);
 //                        Log.i(TAG, "getMp3FromWav start");
                         deleteAllTempFile();
-                        resetCondition(resultCallback,offsetValue < 0 ? 3 : 2);
+                        resetCondition(resultCallback, offsetValue < 0 ? 3 : 2);
                         int mp3FromWav = getMp3FromWav(recordFilePath, recordFileMp3Path);
                         completed_num++;
                         Log.i(TAG, "getMp3FromWav complete:" + mp3FromWav);
@@ -468,7 +459,7 @@ public class MixHelper {
                             Log.i(TAG, "cutAudio start");
                             int cutAudioResult = cutAudio(accompanyPath, cutM, 1000000, cutPath);
                             completed_num++;
-                            Log.i(TAG, "cutAudio end:"+cutAudioResult);
+                            Log.i(TAG, "cutAudio end:" + cutAudioResult);
                             accompanyPath = cutPath;
                         }
                         //mix原音和视频bgm mp3
@@ -516,4 +507,13 @@ public class MixHelper {
                     }
                 });
     }
+
+    public int getVideoFrame(String videoPath, String outPath) {
+        String[] commands = FFmpegUtil.getVideoFrame(videoPath, outPath);
+        if (commands != null) {
+            println(commands);
+            return FFmpegCmd.executeSync(commands);
+        }
+        return -1;
+    }
 }

+ 16 - 6
musicMerge/src/main/java/com/cooleshow/musicmerge/player/CustomPlayer.java

@@ -73,7 +73,7 @@ public class CustomPlayer implements MediaPlayer.OnErrorListener, MediaPlayer.On
         }
     }
 
-    public MediaPlayer getPlayer(){
+    public MediaPlayer getPlayer() {
         return mPlayer;
     }
 
@@ -112,9 +112,13 @@ public class CustomPlayer implements MediaPlayer.OnErrorListener, MediaPlayer.On
     }
 
     public int getCu() {
-        if (mPlayer != null) {
-            int currentPosition = mPlayer.getCurrentPosition();
-            return currentPosition;
+        try {
+            if (mPlayer != null) {
+                int currentPosition = mPlayer.getCurrentPosition();
+                return currentPosition;
+            }
+        } catch (Exception e) {
+            e.printStackTrace();
         }
         return -1;
     }
@@ -282,7 +286,7 @@ public class CustomPlayer implements MediaPlayer.OnErrorListener, MediaPlayer.On
     @Override
     public void onVideoSizeChanged(MediaPlayer mp, int width, int height) {
         if (onEventListener != null) {
-            onEventListener.onVideoSizeChanged(mp,width,height);
+            onEventListener.onVideoSizeChanged(mp, width, height);
         }
     }
 
@@ -299,9 +303,15 @@ public class CustomPlayer implements MediaPlayer.OnErrorListener, MediaPlayer.On
     }
 
 
-    public void setSurface(SurfaceHolder sh){
+    public void setSurface(SurfaceHolder sh) {
         if (mPlayer != null) {
             mPlayer.setDisplay(sh);
         }
     }
+
+    public void setSurface(Surface sh) {
+        if (mPlayer != null) {
+            mPlayer.setSurface(sh);
+        }
+    }
 }

+ 101 - 42
musicMerge/src/main/java/com/cooleshow/musicmerge/presenter/MusicFileHandlePresenter.java

@@ -1,6 +1,7 @@
 package com.cooleshow.musicmerge.presenter;
 
 import android.app.Activity;
+import android.text.TextUtils;
 
 import com.cooleshow.base.common.BaseConstant;
 import com.cooleshow.base.constanst.UploadConstants;
@@ -17,90 +18,148 @@ import org.json.JSONObject;
 
 import java.io.File;
 
+import io.reactivex.rxjava3.android.schedulers.AndroidSchedulers;
+import io.reactivex.rxjava3.annotations.NonNull;
+import io.reactivex.rxjava3.core.Observable;
+import io.reactivex.rxjava3.core.ObservableEmitter;
+import io.reactivex.rxjava3.core.ObservableOnSubscribe;
+import io.reactivex.rxjava3.core.Observer;
+import io.reactivex.rxjava3.disposables.Disposable;
+import io.reactivex.rxjava3.schedulers.Schedulers;
+
 /**
  * Author by pq, Date on 2023/9/7.
  */
 public class MusicFileHandlePresenter extends BasePresenter<MusicFileHandleContract> {
 
-    public void save(String recordId,String url,String imgCover,String des,String configJson) {
-        if (getView() != null) {
-            getView().showLoading();
-        }
-        JSONObject jsonObject =new JSONObject();
+    public void save(String recordId, String url, String imgCover, String videoCover,String des, String configJson) {
+        JSONObject jsonObject = new JSONObject();
         try {
-            jsonObject.put("musicPracticeRecordId",recordId);
-            jsonObject.put("img",imgCover);
-            jsonObject.put("type","FORMAL");//FORMAL作品 草稿DRAFT
-            jsonObject.put("videoUrl",url);
-            jsonObject.put("jsonConfig",configJson);
-            jsonObject.put("desc",des);
+            jsonObject.put("musicPracticeRecordId", recordId);
+            jsonObject.put("img", imgCover);
+            if(!TextUtils.isEmpty(videoCover)){
+                jsonObject.put("videoImg", videoCover);
+            }
+            jsonObject.put("type", "FORMAL");//FORMAL作品 草稿DRAFT
+            jsonObject.put("videoUrl", url);
+            jsonObject.put("jsonConfig", configJson);
+            jsonObject.put("desc", des);
         } catch (JSONException e) {
             e.printStackTrace();
         }
-        addSubscribe(create(Api.class).save(RequestBodyUtil.convertToRequestBodyJson(jsonObject.toString()),BaseConstant.CLIENT_API_GROUP_NAME), new BaseObserver<Object>(getView()) {
+        addSubscribe(create(Api.class).save(RequestBodyUtil.convertToRequestBodyJson(jsonObject.toString()), BaseConstant.CLIENT_API_GROUP_NAME), new BaseObserver<Object>(getView()) {
             @Override
             protected void onSuccess(Object data) {
                 if (getView() != null) {
                     getView().saveWorksSuccess();
                 }
             }
+
+            @Override
+            public void onComplete() {
+            }
         });
     }
 
-    public void saveDraft(String recordId,String url,String accompanyUrl,String imgCover,String configJson) {
-        if (getView() != null) {
-            getView().showLoading();
-        }
-        JSONObject jsonObject =new JSONObject();
+    public void saveDraft(String recordId, String url, String accompanyUrl, String imgCover, String configJson) {
+        JSONObject jsonObject = new JSONObject();
         try {
-            jsonObject.put("musicPracticeRecordId",recordId);
-            jsonObject.put("img",imgCover);
-            jsonObject.put("type","DRAFT");//FORMAL作品 草稿DRAFT
-            jsonObject.put("videoUrl",url);
-            jsonObject.put("accompanyUrl",accompanyUrl);
-            jsonObject.put("jsonConfig",configJson);
+            jsonObject.put("musicPracticeRecordId", recordId);
+            jsonObject.put("img", imgCover);
+            jsonObject.put("type", "DRAFT");//FORMAL作品 草稿DRAFT
+            jsonObject.put("videoUrl", url);
+            jsonObject.put("accompanyUrl", accompanyUrl);
+            jsonObject.put("jsonConfig", configJson);
         } catch (JSONException e) {
             e.printStackTrace();
         }
-        addSubscribe(create(Api.class).save(RequestBodyUtil.convertToRequestBodyJson(jsonObject.toString()),BaseConstant.CLIENT_API_GROUP_NAME), new BaseObserver<Object>(getView()) {
+        addSubscribe(create(Api.class).save(RequestBodyUtil.convertToRequestBodyJson(jsonObject.toString()), BaseConstant.CLIENT_API_GROUP_NAME), new BaseObserver<Object>(getView()) {
             @Override
             protected void onSuccess(Object data) {
                 if (getView() != null) {
                     getView().saveWorksDraftSuccess();
                 }
             }
+
+            @Override
+            public void onComplete() {
+            }
         });
     }
 
     public void getDetail(String recordId) {
         getView().showLoading();
-        addSubscribe(create(Api.class).getDetail(BaseConstant.CLIENT_API_GROUP_NAME,recordId), new BaseObserver<MusicDataBean>(getView()) {
+        addSubscribe(create(Api.class).getDetail(BaseConstant.CLIENT_API_GROUP_NAME, recordId), new BaseObserver<MusicDataBean>(getView()) {
             @Override
             protected void onSuccess(MusicDataBean data) {
                 if (getView() != null) {
+                    getView().hideLoading();
                     getView().getDetailSuccess(data);
                 }
             }
-        });
-    }
 
-    public void upLoadImage(Activity activity, String filePath) {
-        UploadHelper uploadHelper = new UploadHelper(activity, UploadConstants.UPLOAD_TYPE_OTHER);
-        uploadHelper.uploadFile(new File(filePath));
-        uploadHelper.setUpLoadCallBack(new UploadHelper.UpLoadCallBack() {
             @Override
-            public void onSuccess(String url) {
-                if (getView() != null) {
-                    getView().upLoadImageSuccess(url);
-                }
-            }
-
-            @Override
-            protected void onFailure() {
-                if (getView() != null) {
-                    getView().upLoadImageFailure();
-                }
+            public void onComplete() {
             }
         });
     }
+
+    public void upLoadImage(Activity activity, String filePath,boolean isVideoCover) {
+        Observable.create(new ObservableOnSubscribe<String>() {
+                    @Override
+                    public void subscribe(@NonNull ObservableEmitter<String> emitter) throws Throwable {
+                        UploadHelper uploadHelper = new UploadHelper(activity, UploadConstants.UPLOAD_TYPE_OTHER);
+                        uploadHelper.uploadFile(new File(filePath));
+                        uploadHelper.setUpLoadCallBack(new UploadHelper.UpLoadCallBack() {
+                            @Override
+                            public void onSuccess(String url) {
+                                if (emitter != null) {
+                                    emitter.onNext(url);
+                                }
+                            }
+
+                            @Override
+                            protected void onFailure() {
+                                if (emitter != null) {
+                                    emitter.onNext(null);
+                                }
+                            }
+                        });
+                    }
+                }).subscribeOn(Schedulers.io())
+                .observeOn(AndroidSchedulers.mainThread())
+                .subscribe(new Observer<String>() {
+                    @Override
+                    public void onSubscribe(@NonNull Disposable d) {
+
+                    }
+
+                    @Override
+                    public void onNext(@NonNull String s) {
+                        if (!TextUtils.isEmpty(s)) {
+                            if (getView() != null) {
+                                getView().upLoadImageSuccess(s,isVideoCover);
+                            }
+                        } else {
+                            if (getView() != null) {
+                                getView().upLoadImageFailure();
+                            }
+                        }
+                    }
+
+                    @Override
+                    public void onError(@NonNull Throwable e) {
+                        if (getView() != null) {
+                            getView().upLoadImageFailure();
+                        }
+                    }
+
+                    @Override
+                    public void onComplete() {
+
+                    }
+                });
+
+    }
+
 }

+ 218 - 68
musicMerge/src/main/java/com/cooleshow/musicmerge/ui/MusicHandleActivity.java

@@ -5,6 +5,7 @@ import android.content.Intent;
 import android.content.pm.ActivityInfo;
 import android.graphics.Color;
 import android.graphics.Rect;
+import android.graphics.SurfaceTexture;
 import android.graphics.drawable.Drawable;
 import android.media.MediaPlayer;
 import android.os.Bundle;
@@ -14,14 +15,15 @@ import android.text.TextUtils;
 import android.util.Log;
 import android.view.Gravity;
 import android.view.KeyEvent;
-import android.view.SurfaceHolder;
-import android.view.SurfaceView;
+import android.view.Surface;
+import android.view.TextureView;
 import android.view.View;
 import android.view.animation.LinearInterpolator;
 import android.widget.FrameLayout;
 import android.widget.SeekBar;
 
 import com.alibaba.android.arouter.facade.annotation.Route;
+import com.cooleshow.base.constanst.Constants;
 import com.cooleshow.base.constanst.UploadConstants;
 import com.cooleshow.base.router.RouterPath;
 import com.cooleshow.base.ui.activity.BaseMVPActivity;
@@ -33,7 +35,6 @@ import com.cooleshow.base.utils.NumberUtils;
 import com.cooleshow.base.utils.SizeUtils;
 import com.cooleshow.base.utils.TimeUtils;
 import com.cooleshow.base.utils.ToastUtil;
-import com.cooleshow.base.utils.UiUtils;
 import com.cooleshow.base.utils.helper.QMUIStatusBarHelper;
 import com.cooleshow.base.utils.helper.upload.UploadHelper;
 import com.cooleshow.base.widgets.dialog.CommonConfirmDialog;
@@ -48,12 +49,12 @@ import com.cooleshow.musicmerge.helper.MixHelper;
 import com.cooleshow.musicmerge.player.CustomPlayer;
 import com.cooleshow.musicmerge.presenter.MusicFileHandlePresenter;
 import com.cooleshow.musicmerge.viewmodel.MusicMergeViewModel;
+import com.cooleshow.musicmerge.widget.MergeLoadingTipDialog;
 import com.luck.picture.lib.PictureSelector;
 import com.luck.picture.lib.entity.LocalMedia;
 
 import java.io.File;
 import java.util.List;
-import java.util.Locale;
 
 import androidx.annotation.NonNull;
 import androidx.annotation.Nullable;
@@ -63,15 +64,18 @@ import androidx.lifecycle.ViewModelProvider;
  * Author by pq, Date on 2023/8/28.
  */
 @Route(path = RouterPath.MusicTuner.MUSIC_MERGE_PAGE)
-public class MusicHandleActivity extends BaseMVPActivity<AcMusicHandleLayoutBinding, MusicFileHandlePresenter> implements View.OnClickListener, SurfaceHolder.Callback, MusicFileHandleContract {
+public class MusicHandleActivity extends BaseMVPActivity<AcMusicHandleLayoutBinding, MusicFileHandlePresenter> implements View.OnClickListener, MusicFileHandleContract, TextureView.SurfaceTextureListener {
     public static final int REQUEST_CODE_LOCAL = 0x19;
+    public static final int REQUEST_CODE_LOCAL_VIDEO_COVER = 0x20;
+    public static final int REQUEST_CODE_VIDEO_COVER = 0x29;
     private CustomPlayer player1;
     private CustomPlayer player2;
     private String accompanyUrl;
     private String recordFilePath;
     private MusicHandleSettingFragment mSettingFragment;
     private boolean isVideo;
-    private SurfaceView mSurfaceView;
+    private TextureView mSurfaceView;
+    private SurfaceTexture mSurfaceTexture;
     private int videoWidth;
     private int videoHeight;
     private Handler mHandler = new Handler(Looper.getMainLooper());
@@ -88,6 +92,11 @@ public class MusicHandleActivity extends BaseMVPActivity<AcMusicHandleLayoutBind
     private boolean isNeedFinishPage = false;
 
     private boolean isNeedResetScreenOrientation = true;
+    private MergeLoadingTipDialog mLoadingTipDialog;
+
+    private static int MAX_STEP = 3;
+    private static final int MAX_PROGRESS = 100;
+    private int currentStep = 0;
 
 
     @Override
@@ -115,18 +124,17 @@ public class MusicHandleActivity extends BaseMVPActivity<AcMusicHandleLayoutBind
 
     private void initSurfaceView() {
         initVideoUIStyle();
+        mViewModel.getVideoFilePath().setValue(recordFilePath);
         viewBinding.groupAudioView.setVisibility(View.GONE);
         viewBinding.flSurface.setVisibility(View.VISIBLE);
         viewBinding.viewVideoTopBg.setVisibility(View.VISIBLE);
         viewBinding.viewVideoBottomBg.setVisibility(View.VISIBLE);
         viewBinding.viewVideoBg.setVisibility(View.VISIBLE);
-        mSurfaceView = new SurfaceView(MusicHandleActivity.this);
-        SurfaceHolder holder = mSurfaceView.getHolder();
+        mSurfaceView = new TextureView(MusicHandleActivity.this);
+        mSurfaceView.setSurfaceTextureListener(this);
         FrameLayout.LayoutParams layoutParams = new FrameLayout.LayoutParams(FrameLayout.LayoutParams.MATCH_PARENT, FrameLayout.LayoutParams.MATCH_PARENT);
         layoutParams.gravity = Gravity.CENTER;
         viewBinding.flSurface.addView(mSurfaceView, layoutParams);
-        holder.addCallback(MusicHandleActivity.this);
-        holder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
     }
 
     private void initVideoUIStyle() {
@@ -165,7 +173,7 @@ public class MusicHandleActivity extends BaseMVPActivity<AcMusicHandleLayoutBind
         }
         accompanyUrl = getIntent().getStringExtra("accompanyUrl");
         recordFilePath = getIntent().getStringExtra("recordFilePath");
-
+        initLoadingDialog();
         initViewModel();
         initFragment();
         initListener();
@@ -197,6 +205,7 @@ public class MusicHandleActivity extends BaseMVPActivity<AcMusicHandleLayoutBind
     private void preLoad() {
         isVideo = MyFileUtils.isVideo(recordFilePath);
         LOG.i("isVideo:" + isVideo);
+        mViewModel.getIsVideoFile().setValue(isVideo);
         boolean b = checkAccompanimentMp3File();
         if (b) {
             preparePlay();
@@ -242,6 +251,8 @@ public class MusicHandleActivity extends BaseMVPActivity<AcMusicHandleLayoutBind
 
             @Override
             public void toMix(int offsetValue, float volume1, float volume2, boolean isNeedNotify) {
+                MAX_STEP = 3;
+                checkCoverToUpload();
                 if (isVideo) {
                     startMixForMp4(getAccompanyPath(), recordFilePath, offsetValue, volume1, volume2, isNeedNotify);
                 } else {
@@ -280,28 +291,48 @@ public class MusicHandleActivity extends BaseMVPActivity<AcMusicHandleLayoutBind
         });
     }
 
+    private void checkCoverToUpload() {
+        MusicInfoBean value = mViewModel.getMusicInfoLiveData().getValue();
+        if (value != null) {
+            String preCover = value.getPreCover();
+            String videoCover = value.getVideoCover();
+            LOG.i("preCover:" + preCover);
+            LOG.i("videoCover:" + videoCover);
+            if (!TextUtils.isEmpty(preCover)) {
+                presenter.upLoadImage(null, preCover, false);
+            }
+            if (!TextUtils.isEmpty(videoCover)) {
+                presenter.upLoadImage(null, videoCover, true);
+            }
+        }
+    }
+
     private void toSaveDraft() {
         if (!TextUtils.isEmpty(recordFilePath)) {
             if (!TextUtils.isEmpty(originalFileUrl)) {
+                MAX_STEP = 1;
+                toShowLoading(0, getString(R.string.save_draft_tip));
                 toNotifyDraft(originalFileUrl);
             } else {
+                MAX_STEP = 2;
                 uploadDraft(recordFilePath);
             }
         }
     }
 
     private void uploadDraft(String filePath) {
+        currentStep = 0;
         File file = new File(filePath);
         if (!file.exists()) {
             return;
         }
-        setLoadingCancelable(false);
-        showLoading("正在上传草稿0%");
+        toSetLoadingCancelable(false);
+        toShowLoading(getCurrentProgress(0), getString(R.string.updload_draft_tip));
         UploadHelper uploadHelper = new UploadHelper(null, UploadConstants.UPLOAD_TYPE_HOMEWORK);
         uploadHelper.setUpLoadCallBack(new UploadHelper.UpLoadCallBack() {
             @Override
             protected void onSuccess(String url) {
-                updateLoadingText("正在上传草稿100%");
+                toUpdateLoadingText(getCurrentProgress(100), getString(R.string.updload_draft_tip));
                 toNotifyDraft(url);
             }
 
@@ -318,26 +349,28 @@ public class MusicHandleActivity extends BaseMVPActivity<AcMusicHandleLayoutBind
 
             @Override
             public void onUploadProgress(double v) {
-                Log.i("pq","onUploadProgress"+v);
-                updateLoadingText("正在上传草稿"+UiUtils.convertDouble(v)+"%");
+                Log.i("pq", "onUploadProgress" + v);
+//                UiUtils.convertDouble(v)
+                toUpdateLoadingText(getCurrentProgress((int) v), getString(R.string.updload_draft_tip));
             }
         });
-        uploadHelper.setLoadingTip("正在上传草稿");
+        uploadHelper.setLoadingTip(getString(R.string.updload_draft_tip));
 
         uploadHelper.uploadFile(file);
     }
 
     private void upload(String filePath) {
+        currentStep = 1;
         File file = new File(filePath);
         if (!file.exists()) {
             return;
         }
-        updateLoadingText("正在上传作品0%");
+        toUpdateLoadingText(getCurrentProgress(0), getString(R.string.upload_works_tip));
         UploadHelper uploadHelper = new UploadHelper(null, UploadConstants.UPLOAD_TYPE_HOMEWORK);
         uploadHelper.setUpLoadCallBack(new UploadHelper.UpLoadCallBack() {
             @Override
             protected void onSuccess(String url) {
-                updateLoadingText("正在上传作品100%");
+                toUpdateLoadingText(getCurrentProgress(100), getString(R.string.upload_works_tip));
                 toNotify(url);
             }
 
@@ -354,10 +387,10 @@ public class MusicHandleActivity extends BaseMVPActivity<AcMusicHandleLayoutBind
 
             @Override
             public void onUploadProgress(double v) {
-                updateLoadingText("正在上传作品"+ UiUtils.convertDouble(v)+"%");
+                toUpdateLoadingText(getCurrentProgress((int) v), getString(R.string.upload_works_tip));
             }
         });
-        uploadHelper.setLoadingTip("正在上传作品");
+        uploadHelper.setLoadingTip(getString(R.string.upload_works_tip));
 
         uploadHelper.uploadFile(file);
     }
@@ -365,15 +398,17 @@ public class MusicHandleActivity extends BaseMVPActivity<AcMusicHandleLayoutBind
     private void toNotify(String url) {
         String configJson = mSettingFragment.getConfigJson();
         MusicInfoBean value = mViewModel.getMusicInfoLiveData().getValue();
+        String videoCover = "";
         String cover = imgCover;
         if (value != null) {
-            String preCover = value.getPreCover();
-            if (!TextUtils.isEmpty(preCover)) {
-                cover = preCover;
-            }
             des = value.getDes();
+            videoCover = value.getVideoCover();
+            String cover1 = value.getCover();
+            if (!TextUtils.isEmpty(cover1)) {
+                cover = cover1;
+            }
         }
-        presenter.save(mRecordId, url, cover, des, configJson);
+        presenter.save(mRecordId, url, cover, videoCover, des, configJson);
     }
 
     private void toNotifyDraft(String url) {
@@ -384,24 +419,28 @@ public class MusicHandleActivity extends BaseMVPActivity<AcMusicHandleLayoutBind
     }
 
     public void startMixForMp4(String accompanimentMp3Path, String recordFilePath, int offsetValue, float recordFileVolume, float accompanyFileVolume, boolean isNeedNotify) {
-        setLoadingCancelable(false);
-        showLoading(String.format(Locale.getDefault(), "视频合成中 %d%%", 0));
+        currentStep = 0;
+        toSetLoadingCancelable(false);
+        toShowLoading(getCurrentProgress(0), getString(R.string.video_merge_tip));
         MixHelper.getInstance().startMixForMp4(accompanimentMp3Path, recordFilePath, offsetValue, recordFileVolume, accompanyFileVolume, new ResultCallback<String>() {
             @Override
             public void onSuccess(String s) {
+                if(!checkActivityExist()){
+                    return;
+                }
                 runOnUiThread(new Runnable() {
                     @Override
                     public void run() {
-                        updateLoadingText(String.format(Locale.getDefault(), "视频合成中 %d%%", 100));
+                        toUpdateLoadingText(getCurrentProgress(100), getString(R.string.video_merge_tip));
                         if (!TextUtils.isEmpty(s)) {
-//                            ToastUtil.getInstance().showShort("mix completed:" + s);
-                            FileUtils.notifySystemToScan(s);
                             if (isNeedNotify) {
                                 upload(s);
                             } else {
+                                FileUtils.notifySystemToScan(s);
                                 ToastUtil.getInstance().showShort("保存成功");
                             }
                         } else {
+                            hideLoading();
                             ToastUtil.getInstance().showShort("mix onFail");
                         }
                     }
@@ -410,17 +449,23 @@ public class MusicHandleActivity extends BaseMVPActivity<AcMusicHandleLayoutBind
 
             @Override
             public void onProgress(int progressPercent) {
+                if(!checkActivityExist()){
+                    return;
+                }
                 runOnUiThread(new Runnable() {
                     @Override
                     public void run() {
                         LOG.i("progressPercent:" + progressPercent);
-                        updateLoadingText(String.format(Locale.getDefault(), "视频合成中 %d%%", progressPercent));
+                        toUpdateLoadingText(getCurrentProgress(progressPercent), getString(R.string.video_merge_tip));
                     }
                 });
             }
 
             @Override
             public void onFail(int errorCode, String errorStr) {
+                if(!checkActivityExist()){
+                    return;
+                }
                 runOnUiThread(new Runnable() {
                     @Override
                     public void run() {
@@ -433,25 +478,28 @@ public class MusicHandleActivity extends BaseMVPActivity<AcMusicHandleLayoutBind
     }
 
     private void startMix(String accompanimentMp3Path, String recordFilePath, int offsetValue, float recordFileVolume, float accompanyFileVolume, boolean isNeedNotify) {
-        setLoadingCancelable(false);
-        showLoading(String.format(Locale.getDefault(), "音频合成中 %d%%", 0));
+        currentStep = 0;
+        toSetLoadingCancelable(false);
+        toShowLoading(getCurrentProgress(0), getString(R.string.audio_merge_tip));
         MixHelper.getInstance().startMix(accompanimentMp3Path, recordFilePath, offsetValue, recordFileVolume, accompanyFileVolume, new ResultCallback<String>() {
             @Override
             public void onSuccess(String s) {
+                if(!checkActivityExist()){
+                    return;
+                }
                 runOnUiThread(new Runnable() {
                     @Override
                     public void run() {
-                        updateLoadingText(String.format(Locale.getDefault(), "音频合成中 %d%%", 100));
-                        hideLoading();
-//                        ToastUtil.getInstance().showShort("mix completed:" + s);
+                        toUpdateLoadingText(getCurrentProgress(100), getString(R.string.audio_merge_tip));
                         if (!TextUtils.isEmpty(s)) {
-                            FileUtils.notifySystemToScan(s);
                             if (isNeedNotify) {
                                 upload(s);
                             } else {
+                                FileUtils.notifySystemToScan(s);
                                 ToastUtil.getInstance().showShort("保存成功");
                             }
                         } else {
+                            hideLoading();
                             ToastUtil.getInstance().showShort("mix onFail");
                         }
                     }
@@ -460,17 +508,23 @@ public class MusicHandleActivity extends BaseMVPActivity<AcMusicHandleLayoutBind
 
             @Override
             public void onProgress(int progressPercent) {
+                if(!checkActivityExist()){
+                    return;
+                }
                 runOnUiThread(new Runnable() {
                     @Override
                     public void run() {
                         LOG.i("progressPercent:" + progressPercent);
-                        updateLoadingText(String.format(Locale.getDefault(), "音频合成中 %d%%", progressPercent));
+                        toUpdateLoadingText(getCurrentProgress(progressPercent), getString(R.string.audio_merge_tip));
                     }
                 });
             }
 
             @Override
             public void onFail(int errorCode, String errorStr) {
+                if(!checkActivityExist()){
+                    return;
+                }
                 runOnUiThread(new Runnable() {
                     @Override
                     public void run() {
@@ -630,7 +684,7 @@ public class MusicHandleActivity extends BaseMVPActivity<AcMusicHandleLayoutBind
         layoutParams.width = w;
         layoutParams.height = h;
         mSurfaceView.setLayoutParams(layoutParams);
-        mSurfaceView.getHolder().setFixedSize(w, h);
+//        mSurfaceView.getHolder().setFixedSize(w, h);
     }
 
     private boolean checkRecordFile() {
@@ -664,6 +718,9 @@ public class MusicHandleActivity extends BaseMVPActivity<AcMusicHandleLayoutBind
         MixHelper.getInstance().download(recordUrl, fileEndSuffix, new ResultCallback<String>() {
             @Override
             public void onSuccess(String s) {
+                if(!checkActivityExist()){
+                    return;
+                }
                 runOnUiThread(new Runnable() {
                     @Override
                     public void run() {
@@ -675,6 +732,9 @@ public class MusicHandleActivity extends BaseMVPActivity<AcMusicHandleLayoutBind
 
             @Override
             public void onProgress(int progressPercent) {
+                if(!checkActivityExist()){
+                    return;
+                }
                 runOnUiThread(new Runnable() {
                     @Override
                     public void run() {
@@ -685,6 +745,9 @@ public class MusicHandleActivity extends BaseMVPActivity<AcMusicHandleLayoutBind
 
             @Override
             public void onFail(int errorCode, String errorStr) {
+                if(!checkActivityExist()){
+                    return;
+                }
                 runOnUiThread(new Runnable() {
                     @Override
                     public void run() {
@@ -712,6 +775,9 @@ public class MusicHandleActivity extends BaseMVPActivity<AcMusicHandleLayoutBind
         MixHelper.getInstance().download(accompanyUrl, MyFileUtils.MP3_FILE_SUFFIX, new ResultCallback<String>() {
             @Override
             public void onSuccess(String s) {
+                if(!checkActivityExist()){
+                    return;
+                }
                 runOnUiThread(new Runnable() {
                     @Override
                     public void run() {
@@ -723,6 +789,9 @@ public class MusicHandleActivity extends BaseMVPActivity<AcMusicHandleLayoutBind
 
             @Override
             public void onProgress(int progressPercent) {
+                if(!checkActivityExist()){
+                    return;
+                }
                 runOnUiThread(new Runnable() {
                     @Override
                     public void run() {
@@ -733,6 +802,9 @@ public class MusicHandleActivity extends BaseMVPActivity<AcMusicHandleLayoutBind
 
             @Override
             public void onFail(int errorCode, String errorStr) {
+                if(!checkActivityExist()){
+                    return;
+                }
                 runOnUiThread(new Runnable() {
                     @Override
                     public void run() {
@@ -749,11 +821,15 @@ public class MusicHandleActivity extends BaseMVPActivity<AcMusicHandleLayoutBind
     @Override
     public void hideLoading() {
         setLoadingCancelable(true);
+        toSetLoadingCancelable(true);
+        if (mLoadingTipDialog != null) {
+            mLoadingTipDialog.hide();
+        }
         super.hideLoading();
     }
 
     private String getAccompanyPath() {
-        String accompanyPath = MixHelper.getInstance().getDownloadSavePath(accompanyUrl);
+        String accompanyPath = MixHelper.getInstance().getDownloadSavePath(accompanyUrl, MyFileUtils.MP3_FILE_SUFFIX);
         return accompanyPath;
     }
 
@@ -941,12 +1017,15 @@ public class MusicHandleActivity extends BaseMVPActivity<AcMusicHandleLayoutBind
         if (!checkActivityExist()) {
             return;
         }
-        showToastViewAndFinish("发布成功");
+        currentStep = 2;
+        showToastViewAndFinish("发布成功",true);
     }
 
-    private void toFinish() {
+    private void toFinish(boolean isReCallBack) {
         Intent intent = new Intent();
-        intent.putExtra("saveWorksStatus", 1);
+        if (isReCallBack) {
+            intent.putExtra("saveWorksStatus", 1);
+        }
         setResult(RESULT_OK, intent);
         finish();
     }
@@ -983,38 +1062,58 @@ public class MusicHandleActivity extends BaseMVPActivity<AcMusicHandleLayoutBind
         if (!checkActivityExist()) {
             return;
         }
+        currentStep = 1;
         mViewModel.getUpdateEvent().setValue(false);
         if (isNeedFinishPage) {
-            showToastViewAndFinish("保存成功");
+            showToastViewAndFinish("保存成功",false);
         } else {
-            ToastUtil.getInstance().showShort("保存成功");
+            toUpdateLoadingText(getCurrentProgress(100), "保存成功");
+            mHandler.postDelayed(new Runnable() {
+                @Override
+                public void run() {
+                    hideLoading();
+                }
+            }, 1500);
         }
     }
 
-    private void showToastViewAndFinish(String tip) {
+    private void showToastViewAndFinish(String tip, boolean isReCallBack) {
         //测试lyr提出提示要在当前面提示,所以给出延迟finish
-        viewBinding.tvToastView.setText(tip);
-        viewBinding.tvToastView.setVisibility(View.VISIBLE);
+//        viewBinding.tvToastView.setText(tip);
+//        viewBinding.tvToastView.setVisibility(View.VISIBLE);
+        toUpdateLoadingText(getCurrentProgress(100), tip);
         mHandler.postDelayed(new Runnable() {
             @Override
             public void run() {
-                toFinish();
+                hideLoading();
+                toFinish(isReCallBack);
             }
         }, 1500);
     }
 
     @Override
-    public void upLoadImageSuccess(String url) {
+    public void upLoadImageSuccess(String url, boolean isVideoCover) {
         if (!checkActivityExist()) {
             return;
         }
-        refreshMusicInfoPreCover(url);
+        if (mViewModel != null) {
+            if (isVideoCover) {
+                mViewModel.refreshMusicVideoCover(url);
+            } else {
+                mViewModel.refreshMusicWorksCover(url);
+            }
+        }
     }
 
     private void refreshMusicInfoPreCover(String imgCover) {
         mViewModel.refreshMusicPreCover(imgCover);
     }
 
+    private void refreshMusicInfoVideoCover(String imgCover) {
+        mViewModel.refreshMusicVideoCover(imgCover);
+    }
+
+
     private void refreshMusicInfo(String imgCover) {
         MusicInfoBean bean = new MusicInfoBean();
         bean.setCover(imgCover);
@@ -1022,16 +1121,24 @@ public class MusicHandleActivity extends BaseMVPActivity<AcMusicHandleLayoutBind
         mViewModel.getMusicInfoLiveData().setValue(bean);
     }
 
+    private int getCurrentProgress(int progress) {
+        float singleStepMaxProgress = MAX_PROGRESS * 1.0f / MAX_STEP;
+        float progressPercent = progress * 1.0f / 100;
+        int result = (int) (singleStepMaxProgress * currentStep + singleStepMaxProgress * progressPercent);
+        LOG.i("progress:" + progress + "--currentStep:" + currentStep + "--currentStepProgress" + singleStepMaxProgress * currentStep + "--progressPercent:" + progressPercent + "--result:" + result);
+        return result;
+    }
+
     @Override
     public void upLoadImageFailure() {
-        ToastUtil.getInstance().showShort("上传失败,请重试");
+        ToastUtil.getInstance().showShort("封面上传失败");
     }
 
     @Override
     protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
         super.onActivityResult(requestCode, resultCode, data);
         if (resultCode == RESULT_OK) {
-            if (requestCode == REQUEST_CODE_LOCAL) {
+            if (requestCode == REQUEST_CODE_LOCAL || requestCode == REQUEST_CODE_LOCAL_VIDEO_COVER) {
                 if (data != null) {
                     // 图片、视频、音频选择结果回调
                     List<LocalMedia> selectList = PictureSelector.obtainMultipleResult(data);
@@ -1042,13 +1149,48 @@ public class MusicHandleActivity extends BaseMVPActivity<AcMusicHandleLayoutBind
                     if (!TextUtils.isEmpty(v_path)) {
                         boolean isImg = MyFileUtils.isImg(v_path);
                         if (isImg) {
-                            presenter.upLoadImage(MusicHandleActivity.this, v_path);
+                            if (requestCode == REQUEST_CODE_LOCAL_VIDEO_COVER) {
+                                refreshMusicInfoVideoCover(v_path);
+                            } else {
+                                refreshMusicInfoPreCover(v_path);
+                            }
                         } else {
                             ToastUtil.getInstance().showShort("请选择图片类型文件");
                         }
                     }
                 }
             }
+            if (requestCode == REQUEST_CODE_VIDEO_COVER) {
+                if (data != null) {
+                    String imgPath = data.getStringExtra(Constants.COMMON_EXTRA_KEY);
+                    refreshMusicInfoVideoCover(imgPath);
+                    return;
+                }
+            }
+        }
+    }
+
+    private void toShowLoading(int progress, String text) {
+        if (mLoadingTipDialog != null) {
+            mLoadingTipDialog.showLoading(progress, text);
+        }
+    }
+
+    private void toSetLoadingCancelable(boolean flag) {
+        if (mLoadingTipDialog != null) {
+            mLoadingTipDialog.setLoadingCancelable(flag);
+        }
+    }
+
+    private void toUpdateLoadingText(int progress, String text) {
+        if (mLoadingTipDialog != null) {
+            mLoadingTipDialog.updateLoadingText(progress, text);
+        }
+    }
+
+    private void initLoadingDialog() {
+        if (mLoadingTipDialog == null) {
+            mLoadingTipDialog = new MergeLoadingTipDialog(this);
         }
     }
 
@@ -1059,7 +1201,9 @@ public class MusicHandleActivity extends BaseMVPActivity<AcMusicHandleLayoutBind
         if (mHandler != null) {
             mHandler.removeCallbacksAndMessages(null);
         }
-
+        if (mSurfaceView != null && mSurfaceView.getSurfaceTexture() != null) {
+            mSurfaceView.getSurfaceTexture().release();
+        }
         if (player1 != null) {
             player1.release();
         }
@@ -1083,26 +1227,32 @@ public class MusicHandleActivity extends BaseMVPActivity<AcMusicHandleLayoutBind
     }
 
     @Override
-    public void surfaceCreated(@NonNull SurfaceHolder holder) {
-        LOG.i("surfaceCreated");
-        player1.setSurface(holder);
-        toPlay(getAccompanyPath());
+    public void onSurfaceTextureAvailable(@NonNull SurfaceTexture surface, int width, int height) {
+        if (mSurfaceTexture == null) {
+            mSurfaceTexture = surface;
+        } else {
+            mSurfaceView.setSurfaceTexture(mSurfaceTexture);
+        }
+        if (player1 != null) {
+            toPlay(getAccompanyPath());
+            player1.setSurface(new Surface(mSurfaceTexture));
+        }
     }
 
     @Override
-    public void surfaceChanged(@NonNull SurfaceHolder holder, int format, int width, int height) {
-        LOG.i("surfaceChanged");
-        player1.setSurface(holder);
+    public void onSurfaceTextureSizeChanged(@NonNull SurfaceTexture surface, int width, int height) {
+
     }
 
     @Override
-    public void surfaceDestroyed(@NonNull SurfaceHolder holder) {
-        LOG.i("surfaceDestroyed");
-        if (player1 != null && player1.isPlaying()) {
-            pausePlay();
-        }
+    public boolean onSurfaceTextureDestroyed(@NonNull SurfaceTexture surface) {
+        return false;
     }
 
+    @Override
+    public void onSurfaceTextureUpdated(@NonNull SurfaceTexture surface) {
+
+    }
 
     @Override
     public void finish() {

+ 24 - 11
musicMerge/src/main/java/com/cooleshow/musicmerge/ui/MusicHandleSettingFragment.java

@@ -10,8 +10,11 @@ import android.widget.ImageView;
 import android.widget.SeekBar;
 import android.widget.TextView;
 
+import com.alibaba.android.arouter.launcher.ARouter;
+import com.cooleshow.base.router.RouterPath;
 import com.cooleshow.base.ui.fragment.BaseFragment;
 import com.cooleshow.base.utils.FileUtils;
+import com.cooleshow.base.utils.MyFileUtils;
 import com.cooleshow.base.utils.PermissionUtils;
 import com.cooleshow.base.utils.ToastUtil;
 import com.cooleshow.base.utils.helper.GlideEngine;
@@ -285,7 +288,7 @@ public class MusicHandleSettingFragment extends BaseFragment<FgMusicHandleSettin
         coverTipDialog.setEventListener(new UploadCoverTipDialog.OnEventListener() {
             @Override
             public void onUploadCover() {
-                toAlbum();
+                toAlbum(1,1,MusicHandleActivity.REQUEST_CODE_LOCAL);
             }
 
             @Override
@@ -293,41 +296,53 @@ public class MusicHandleSettingFragment extends BaseFragment<FgMusicHandleSettin
                 mViewModel.refreshMusicDes(des);
                 toCheckDownload(true);
             }
+
+            @Override
+            public void onSelectVideoCover(boolean isByAlbum) {
+                if (isByAlbum) {
+                    toAlbum(16,9,MusicHandleActivity.REQUEST_CODE_LOCAL_VIDEO_COVER);
+                } else {
+                    String value = mViewModel.getVideoFilePath().getValue();
+                    ARouter.getInstance().build(RouterPath.MusicTuner.MUSIC_SELECT_VIDEO_FRAME)
+                            .withString("videoFilePath", value)
+                            .navigation(getActivity(), MusicHandleActivity.REQUEST_CODE_VIDEO_COVER);
+                }
+            }
         });
         coverTipDialog.show(getChildFragmentManager(), "");
     }
 
-    private void toAlbum() {
+    private void toAlbum(int aspect_ratio_x, int aspect_ratio_y,int requestCode) {
         new RxPermissions(this)
                 .request(Manifest.permission.CAMERA,
                         Manifest.permission.READ_EXTERNAL_STORAGE,
                         Manifest.permission.WRITE_EXTERNAL_STORAGE)
                 .subscribe(granted -> {
                     if (granted) {
-                        goAlbum();
+                        goAlbum(aspect_ratio_x,aspect_ratio_y,requestCode);
                     } else {
                         ToastUtil.getInstance().show(getContext(), "请打开存储和相机权限!");
                     }
                 });
     }
 
-    private void goAlbum() {
+    private void goAlbum(int aspect_ratio_x, int aspect_ratio_y,int requestCode) {
         PictureSelector.create(getActivity())
                 .openGallery(PictureMimeType.ofImage())//全部.PictureMimeType.ofAll()、图片.ofImage()、视频.ofVideo()、音频.ofAudio()
                 .loadImageEngine(GlideEngine.createGlideEngine())
                 .theme(com.cooleshow.base.R.style.picture_daya_style)// 主题样式设置 具体参考 values/styles   用法:R .style.picture.white.style
                 .selectionMode(PictureConfig.SINGLE)// 多选 or 单选 PictureConfig.MULTIPLE or PictureConfig.SINGLE
                 .enableCrop(true)// 是否裁剪 true or false
-                .withAspectRatio(1, 1)
+                .withAspectRatio(aspect_ratio_x, aspect_ratio_y)
                 .cutOutQuality(100)
                 .showCropGrid(false)// 是否显示裁剪矩形网格 圆形裁剪时建议设为false    true or false
                 .compress(true)// 是否压缩 true or false
                 .circleDimmedLayer(false)// 是否圆形裁剪 true or false
-                .forResult(MusicHandleActivity.REQUEST_CODE_LOCAL);
+                .forResult(requestCode);
     }
 
     private void checkDownload(boolean isNeedNotify) {
-        String downloadSavePath = MixHelper.getInstance().getDownloadSavePath(accompanyUrl);
+        String downloadSavePath = MixHelper.getInstance().getDownloadSavePath(accompanyUrl, MyFileUtils.MP3_FILE_SUFFIX);
         boolean fileExists = FileUtils.isFileExists(downloadSavePath);
         if (!fileExists) {
             return;
@@ -466,10 +481,8 @@ public class MusicHandleSettingFragment extends BaseFragment<FgMusicHandleSettin
 
     @Override
     public void onDestroy() {
-        if (mViewBinding != null) {
-            removeCallBack(mViewBinding.tvRecordVolumeValue, mRunnable);
-            removeCallBack(mViewBinding.tvAccompanyVolumeValue, mRunnable2);
-        }
+        removeCallBack(mViewBinding.tvRecordVolumeValue, mRunnable);
+        removeCallBack(mViewBinding.tvAccompanyVolumeValue, mRunnable2);
         super.onDestroy();
     }
 

+ 28 - 1
musicMerge/src/main/java/com/cooleshow/musicmerge/viewmodel/MusicMergeViewModel.java

@@ -11,6 +11,8 @@ import androidx.lifecycle.ViewModel;
 public class MusicMergeViewModel extends ViewModel {
     private MutableLiveData<MusicInfoBean> musicInfoLiveData = new MutableLiveData<>();   //
     private MutableLiveData<String> worksId = new MutableLiveData<>();   //
+    private MutableLiveData<Boolean> isVideoFile = new MutableLiveData<>();   //
+    private MutableLiveData<String> videoFilePath = new MutableLiveData<>();   //
     private MutableLiveData<Boolean> updateStatus = new MutableLiveData<>();   //
 
     public MutableLiveData<MusicInfoBean> getMusicInfoLiveData() {
@@ -21,15 +23,24 @@ public class MusicMergeViewModel extends ViewModel {
         return worksId;
     }
 
+    public MutableLiveData<String> getVideoFilePath() {
+        return videoFilePath;
+    }
+
     public MutableLiveData<Boolean> getUpdateEvent() {
         return updateStatus;
     }
 
-    public void refreshMusicDesAndPreCover(String des, String url) {
+    public MutableLiveData<Boolean> getIsVideoFile() {
+        return isVideoFile;
+    }
+
+    public void resetMusicInfo(String des, String url,String videoCover) {
         MusicInfoBean value = getMusicInfoLiveData().getValue();
         if (value != null) {
             value.setDes(des);
             value.setPreCover(url);
+            value.setVideoCover(videoCover);
             getMusicInfoLiveData().setValue(value);
         }
     }
@@ -50,6 +61,22 @@ public class MusicMergeViewModel extends ViewModel {
         }
     }
 
+    public void refreshMusicVideoCover(String preCover) {
+        MusicInfoBean value = getMusicInfoLiveData().getValue();
+        if (value != null) {
+            value.setVideoCover(preCover);
+            getMusicInfoLiveData().setValue(value);
+        }
+    }
+
+    public void refreshMusicWorksCover(String cover) {
+        MusicInfoBean value = getMusicInfoLiveData().getValue();
+        if (value != null) {
+            value.setCover(cover);
+            getMusicInfoLiveData().setValue(value);
+        }
+    }
+
     public boolean isHasUpdate() {
         Boolean value = getUpdateEvent().getValue();
         if (value != null && value) {

+ 77 - 0
musicMerge/src/main/java/com/cooleshow/musicmerge/widget/MergeLoadingTipDialog.java

@@ -0,0 +1,77 @@
+package com.cooleshow.musicmerge.widget;
+
+import android.content.Context;
+import android.os.Bundle;
+import android.view.View;
+import android.widget.ProgressBar;
+import android.widget.TextView;
+
+import com.cooleshow.base.widgets.dialog.BaseFullDialog;
+import com.cooleshow.musicmerge.R;
+
+import androidx.annotation.NonNull;
+import androidx.constraintlayout.widget.ConstraintLayout;
+
+/**
+ * Author by pq, Date on 2023/11/9.
+ */
+public class MergeLoadingTipDialog extends BaseFullDialog {
+
+    private View mViewLine;
+    private ProgressBar mProgress;
+    private TextView mTvText;
+
+    public MergeLoadingTipDialog(@NonNull Context context) {
+        super(context);
+    }
+
+    @Override
+    protected void onCreate(Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+        setContentView(R.layout.dialog_merge_custom_loading_layout);
+        mViewLine = findViewById(R.id.view_line);
+        mProgress = findViewById(R.id.progress);
+        mTvText = findViewById(R.id.tv_text);
+
+        initListener();
+    }
+
+    private void initListener() {
+    }
+
+    public void setLoadingCancelable(boolean flag) {
+        setCancelable(flag);
+        setCanceledOnTouchOutside(flag);
+    }
+
+    public void updateLoadingText(int progress, String text) {
+        if (mTvText != null) {
+            mTvText.setText(text);
+        }
+        setProgress(progress);
+    }
+
+    public void showLoading(int progress, String text) {
+        super.show();
+        if (mTvText != null) {
+            mTvText.setText(text);
+        }
+        setProgress(progress);
+    }
+
+    private void setProgress(int progress) {
+        if (progress < 0) {
+            progress = 0;
+        }
+        if (progress > 100) {
+            progress = 100;
+        }
+        if (mProgress != null) {
+            mProgress.setProgress(progress);
+            float value = mProgress.getProgress() * 1.0f / mProgress.getMax();
+            ConstraintLayout.LayoutParams layoutParams = (ConstraintLayout.LayoutParams) mViewLine.getLayoutParams();
+            layoutParams.horizontalBias = value;
+            mViewLine.setLayoutParams(layoutParams);
+        }
+    }
+}

+ 48 - 0
musicMerge/src/main/java/com/cooleshow/musicmerge/widget/SolveEditTextScrollClash.java

@@ -0,0 +1,48 @@
+package com.cooleshow.musicmerge.widget;
+
+import android.view.MotionEvent;
+import android.view.View;
+import android.widget.EditText;
+
+/**
+ * Author by pq, Date on 2023/11/10.
+ */
+public class SolveEditTextScrollClash implements View.OnTouchListener{
+    private EditText editText;
+
+    public SolveEditTextScrollClash(EditText editText) {
+        this.editText = editText;
+    }
+
+    @Override
+    public boolean onTouch(View view, MotionEvent event) {
+        //触摸的是EditText而且当前EditText能够滚动则将事件交给EditText处理。否则将事件交由其父类处理
+        if ((view.getId() == editText.getId() && canVerticalScroll(editText))) {
+            view.getParent().requestDisallowInterceptTouchEvent(true);
+            if (event.getAction() == MotionEvent.ACTION_UP) {
+                view.getParent().requestDisallowInterceptTouchEvent(false);
+            }
+        }
+        return false;
+    }
+
+    /**
+     * EditText竖直方向能否够滚动
+     * @param editText  须要推断的EditText
+     * @return  true:能够滚动   false:不能够滚动
+     */
+    private boolean canVerticalScroll(EditText editText) {
+        //滚动的距离
+        int scrollY = editText.getScrollY();
+        //控件内容的总高度
+        int scrollRange = editText.getLayout().getHeight();
+        //控件实际显示的高度
+        int scrollExtent = editText.getHeight() - editText.getCompoundPaddingTop() -editText.getCompoundPaddingBottom();
+        //控件内容总高度与实际显示高度的差值
+        int scrollDifference = scrollRange - scrollExtent;
+        if(scrollDifference == 0) {
+            return false;
+        }
+        return (scrollY > 0) || (scrollY < scrollDifference - 1);
+    }
+}

+ 52 - 8
musicMerge/src/main/java/com/cooleshow/musicmerge/widget/UploadCoverTipDialog.java

@@ -20,6 +20,7 @@ import com.cooleshow.usercenter.helper.UserHelper;
 import java.util.Locale;
 
 import androidx.annotation.NonNull;
+import androidx.constraintlayout.widget.Group;
 import androidx.lifecycle.Observer;
 import androidx.lifecycle.ViewModelProvider;
 
@@ -44,7 +45,8 @@ public class UploadCoverTipDialog extends BaseDialog implements View.OnClickList
 
         @Override
         public void afterTextChanged(Editable s) {
-            int cLength = mEtContent.getText().toString().trim().length();
+            String text = mEtContent.getText().toString().trim();
+            int cLength = text.length();
             mTvTextNum.setText(String.format(Locale.getDefault(), "%d/150", cLength));
         }
     };
@@ -53,6 +55,12 @@ public class UploadCoverTipDialog extends BaseDialog implements View.OnClickList
     private TextView mTvMusicTitle;
     private TextView mTvName;
     private MusicMergeViewModel mViewModel;
+    private Group mGroupVideoCover;
+    private TextView mTvByAlbum;
+    private TextView mTvByCrop;
+    private ImageView mIvVideoCover;
+
+    private boolean isVideoFile = false;
 
     @Override
     public int intLayoutId() {
@@ -68,14 +76,24 @@ public class UploadCoverTipDialog extends BaseDialog implements View.OnClickList
         mTvMusicTitle = holder.getView(R.id.tv_music_title);
         mTvName = holder.getView(R.id.tv_name);
         mIvIcon = holder.getView(R.id.iv_icon);
+        mGroupVideoCover = holder.getView(R.id.group_video_cover);
+        mTvByAlbum = holder.getView(R.id.tv_by_album);
+        mTvByCrop = holder.getView(R.id.tv_by_crop);
+        mIvVideoCover = holder.getView(R.id.iv_video_cover);
+
         String userName = UserHelper.getUserName();
         mTvName.setText(userName);
         setCancelable(false);
         setOutCancel(false);
         initViewModel();
+        initData();
         initListener();
     }
 
+    private void initData() {
+        mGroupVideoCover.setVisibility(isVideoFile ?View.VISIBLE:View.GONE);
+    }
+
     private void initViewModel() {
         ViewModelProvider.AndroidViewModelFactory instance =
                 ViewModelProvider.AndroidViewModelFactory
@@ -83,32 +101,43 @@ public class UploadCoverTipDialog extends BaseDialog implements View.OnClickList
         mViewModel = new ViewModelProvider(getActivity(), instance)
                 .get(MusicMergeViewModel.class);
 
+        Boolean value = mViewModel.getIsVideoFile().getValue();
+        isVideoFile = value != null && value;
+
         mViewModel.getMusicInfoLiveData().observe(this, new Observer<MusicInfoBean>() {
             @Override
             public void onChanged(MusicInfoBean musicInfoBean) {
                 if (musicInfoBean != null) {
                     String imgCover = musicInfoBean.getPreCover() != null ? musicInfoBean.getPreCover() : musicInfoBean.getCover();
-                    setData(imgCover, musicInfoBean.getMusicTitle(), musicInfoBean.getDes());
+                    String videoCover = musicInfoBean.getVideoCover();
+                    setData(imgCover, musicInfoBean.getMusicTitle(),videoCover);
                 }
             }
         });
     }
 
     private void initListener() {
+        mEtContent.setOnTouchListener(new SolveEditTextScrollClash(mEtContent));
         mIvClose.setOnClickListener(this);
         mTvPublish.setOnClickListener(this);
         mIvIcon.setOnClickListener(this);
+        mTvByAlbum.setOnClickListener(this);
+        mTvByCrop.setOnClickListener(this);
+
 
         mEtContent.addTextChangedListener(mTextWatcher);
     }
 
-    public void setData(String cover, String musicName, String des) {
+    public void setData(String cover, String musicName,String videoCover) {
         if (mTvMusicTitle != null) {
             mTvMusicTitle.setText(musicName);
         }
-        if (mEtContent != null) {
-            mEtContent.setText(des);
+        if (mIvVideoCover != null) {
+            GlideImageLoaderUtils.getInstance().loadImage(getContext(), videoCover, mIvVideoCover, R.drawable.icon_upload_video_cover);
         }
+//        if (mEtContent != null) {
+//            mEtContent.setText(des);
+//        }
         if (mIvIcon != null) {
             GlideImageLoaderUtils.getInstance().loadImage(getContext(), cover, mIvIcon, R.drawable.icon_default_music_song_cover);
         }
@@ -118,7 +147,7 @@ public class UploadCoverTipDialog extends BaseDialog implements View.OnClickList
     public void onClick(View v) {
         int id = v.getId();
         if (id == R.id.iv_close) {
-            saveDes("", null);
+            saveDes("", null,null);
             dismiss();
             return;
         }
@@ -140,6 +169,19 @@ public class UploadCoverTipDialog extends BaseDialog implements View.OnClickList
             }
             return;
         }
+        if (id == R.id.tv_by_crop) {
+            if (mEventListener != null) {
+                mEventListener.onSelectVideoCover(false);
+            }
+            return;
+        }
+
+        if (id == R.id.tv_by_album) {
+            if (mEventListener != null) {
+                mEventListener.onSelectVideoCover(true);
+            }
+            return;
+        }
     }
 
     @Override
@@ -147,9 +189,9 @@ public class UploadCoverTipDialog extends BaseDialog implements View.OnClickList
         super.onDismiss(dialog);
     }
 
-    private void saveDes(String des, String url) {
+    private void saveDes(String des, String url,String videoCover) {
         if (mEtContent != null) {
-            mViewModel.refreshMusicDesAndPreCover(des, url);
+            mViewModel.resetMusicInfo(des, url,videoCover);
         }
     }
 
@@ -163,6 +205,8 @@ public class UploadCoverTipDialog extends BaseDialog implements View.OnClickList
         void onUploadCover();
 
         void onPublish(String des);
+
+        void onSelectVideoCover(boolean isByAlbum);
     }
 
 

BIN
musicMerge/src/main/res/drawable-xhdpi/icon_merge_loading_thumb.png


BIN
musicMerge/src/main/res/drawable-xhdpi/icon_merge_loading_top.png


BIN
musicMerge/src/main/res/drawable-xxhdpi/icon_get_cover_by_album.png


BIN
musicMerge/src/main/res/drawable-xxhdpi/icon_get_cover_by_crop.png


BIN
musicMerge/src/main/res/drawable-xxhdpi/icon_merge_loading_thumb.png


BIN
musicMerge/src/main/res/drawable-xxhdpi/icon_merge_loading_top.png


BIN
musicMerge/src/main/res/drawable-xxhdpi/icon_upload_video_cover.png


+ 7 - 0
musicMerge/src/main/res/drawable/shape_80b1c8_to_3a98a2_15dp.xml

@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="utf-8"?>
+<shape xmlns:android="http://schemas.android.com/apk/res/android">
+    <gradient android:startColor="#9680B1C8"
+        android:endColor="#963A98A2"
+        android:angle="270"/>
+    <corners android:radius="15dp"/>
+</shape>

+ 5 - 0
musicMerge/src/main/res/drawable/shape_b8878787_26dp.xml

@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="utf-8"?>
+<shape xmlns:android="http://schemas.android.com/apk/res/android">
+    <solid android:color="#b8878787"/>
+    <corners android:radius="26dp"/>
+</shape>

+ 26 - 0
musicMerge/src/main/res/drawable/shape_loading_progress_bar_bg.xml

@@ -0,0 +1,26 @@
+<?xml version="1.0" encoding="utf-8"?>
+<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
+    <!-- 背景 -->
+    <item android:id="@android:id/background">
+        <shape>
+            <!-- 圆角 -->
+            <corners android:radius="8dp" />
+            <!--            背景色-->
+            <solid android:color="#DADADA"/>
+            <size android:height="8dp"/>
+        </shape>
+    </item>
+    <!--    滑动条-->
+    <item android:id="@android:id/progress">
+        <clip>
+            <shape>
+                <!-- 圆角 -->
+                <corners android:radius="8dp" />
+                <gradient android:startColor="@color/main_style_color"
+                    android:endColor="@color/main_style_color2"/>
+                <size android:height="8dp"/>
+                <stroke android:color="#7Dfff5f5" android:width="1dp"/>
+            </shape>
+        </clip>
+    </item>
+</layer-list>

+ 73 - 0
musicMerge/src/main/res/layout/dialog_merge_custom_loading_layout.xml

@@ -0,0 +1,73 @@
+<?xml version="1.0" encoding="utf-8"?>
+<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:app="http://schemas.android.com/apk/res-auto"
+    xmlns:tools="http://schemas.android.com/tools"
+    android:layout_width="wrap_content"
+    android:layout_height="wrap_content">
+
+    <View
+        android:background="@drawable/shape_b8878787_26dp"
+        android:layout_marginTop="38dp"
+        android:id="@+id/view_bg"
+        android:layout_width="316dp"
+        android:layout_height="52dp"
+        app:layout_constraintLeft_toLeftOf="parent"
+        app:layout_constraintTop_toTopOf="parent" />
+
+    <ImageView
+        android:src="@drawable/icon_merge_loading_top"
+        android:layout_width="232dp"
+        android:layout_height="52dp"
+        app:layout_constraintTop_toTopOf="parent"
+        app:layout_constraintLeft_toLeftOf="@+id/view_bg"
+        app:layout_constraintRight_toRightOf="@+id/view_bg" />
+
+    <View
+        android:id="@+id/view_line"
+        android:layout_width="1px"
+        android:layout_height="1px"
+        android:layout_marginStart="6dp"
+        android:layout_marginEnd="6dp"
+        app:layout_constraintHorizontal_bias="0"
+        app:layout_constraintLeft_toLeftOf="@+id/progress"
+        app:layout_constraintRight_toRightOf="@+id/progress"
+        app:layout_constraintTop_toTopOf="parent" />
+
+    <ProgressBar
+        android:id="@+id/progress"
+        style="@style/Widget.AppCompat.ProgressBar.Horizontal"
+        android:layout_width="0dp"
+        android:layout_height="8dp"
+        android:layout_marginStart="18dp"
+        android:layout_marginEnd="18dp"
+        android:max="100"
+        android:progressDrawable="@drawable/shape_loading_progress_bar_bg"
+        app:layout_constraintBottom_toBottomOf="@+id/view_bg"
+        app:layout_constraintLeft_toLeftOf="@+id/view_bg"
+        app:layout_constraintRight_toRightOf="@+id/view_bg"
+        app:layout_constraintTop_toTopOf="@+id/view_bg"
+        tools:progress="50" />
+
+
+    <ImageView
+        app:layout_constraintTop_toTopOf="@+id/view_bg"
+        app:layout_constraintRight_toRightOf="@+id/view_line"
+        app:layout_constraintLeft_toLeftOf="@+id/view_line"
+        android:src="@drawable/icon_merge_loading_thumb"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"/>
+
+    <TextView
+        android:id="@+id/tv_text"
+        android:includeFontPadding="false"
+        android:layout_marginTop="15dp"
+        app:layout_constraintRight_toRightOf="@+id/view_bg"
+        app:layout_constraintLeft_toLeftOf="@+id/view_bg"
+        app:layout_constraintTop_toBottomOf="@+id/view_bg"
+        tools:text="音频合成中"
+        android:textSize="@dimen/sp_14"
+        android:textColor="@color/white"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"/>
+
+</androidx.constraintlayout.widget.ConstraintLayout>

+ 269 - 172
musicMerge/src/main/res/layout/dialog_upload_cover_tip_layout.xml

@@ -4,184 +4,281 @@
     xmlns:tools="http://schemas.android.com/tools"
     android:layout_width="wrap_content"
     android:layout_height="wrap_content"
-    android:gravity="center"
-    android:layout_gravity="center">
+    android:layout_gravity="center"
+    android:gravity="center">
 
-    <androidx.constraintlayout.widget.ConstraintLayout
+    <FrameLayout
         android:layout_width="316dp"
-        android:background="@drawable/shape_f8f8f8_10dp"
-        android:layout_height="wrap_content">
-
-
-        <TextView
-            android:id="@+id/tv_title"
-            android:layout_width="wrap_content"
-            android:layout_height="wrap_content"
-            android:paddingTop="15dp"
-            android:paddingBottom="15dp"
-            android:text="作品详情"
-            android:textColor="@color/color_131415"
-            android:textSize="@dimen/sp_16"
-            android:textStyle="bold"
-            app:layout_constraintLeft_toLeftOf="parent"
-            app:layout_constraintRight_toRightOf="parent"
-            app:layout_constraintTop_toTopOf="parent" />
-
-        <ImageView
-            android:id="@+id/iv_close"
-            android:layout_width="wrap_content"
-            android:layout_height="wrap_content"
-            android:padding="10dp"
-            android:src="@drawable/icon_close_dialog"
-            app:layout_constraintRight_toRightOf="parent"
-            app:layout_constraintTop_toTopOf="parent" />
-
-        <FrameLayout
-            android:id="@+id/fl_input"
-            android:layout_width="match_parent"
-            android:layout_height="87dp"
-            android:layout_marginStart="12dp"
-            android:layout_marginEnd="12dp"
-            android:background="@drawable/bg_white_10dp"
-            app:layout_constraintLeft_toLeftOf="parent"
-            app:layout_constraintRight_toRightOf="parent"
-            app:layout_constraintTop_toBottomOf="@+id/tv_title">
+        android:layout_height="wrap_content"
+        android:background="@drawable/shape_f8f8f8_10dp">
 
+        <androidx.constraintlayout.widget.ConstraintLayout
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content">
 
-            <androidx.appcompat.widget.AppCompatEditText
-                android:id="@+id/et_content"
-                android:layout_width="match_parent"
-                android:layout_height="match_parent"
-                android:layout_marginBottom="27dp"
-                android:background="@color/transparent"
-                android:gravity="left"
-                android:theme="@style/MyEditText"
-                android:hint="我发布了一首演奏作品,快来听听吧~"
-                android:maxLength="150"
-                android:paddingLeft="12dp"
-                android:paddingTop="12dp"
-                android:paddingRight="12dp"
-                android:textColor="@color/black_333"
-                android:textColorHint="@color/color_aaaaaa"
-                android:textSize="@dimen/sp_14"
+            <TextView
+                android:id="@+id/tv_title"
+                android:layout_width="wrap_content"
+                android:layout_height="wrap_content"
+                android:paddingTop="15dp"
+                android:paddingBottom="15dp"
+                android:text="作品详情"
+                android:textColor="@color/color_131415"
+                android:textSize="@dimen/sp_16"
+                android:textStyle="bold"
                 app:layout_constraintLeft_toLeftOf="parent"
+                app:layout_constraintRight_toRightOf="parent"
                 app:layout_constraintTop_toTopOf="parent" />
 
-
-            <TextView
-                android:id="@+id/tv_text_num"
+            <ImageView
+                android:id="@+id/iv_close"
                 android:layout_width="wrap_content"
-                android:layout_height="20dp"
-                android:layout_marginEnd="12dp"
-                android:layout_marginBottom="7dp"
-                android:text="0/150"
-                android:gravity="center"
-                android:layout_gravity="bottom|right"
-                android:textColor="@color/color_aaaaaa"
-                android:textSize="@dimen/sp_12"
-                app:layout_constraintBottom_toBottomOf="@+id/fl_input"
-                app:layout_constraintRight_toRightOf="@+id/fl_input" />
-        </FrameLayout>
-
-
-        <View
-            android:id="@+id/view_info_bg"
-            android:layout_width="match_parent"
-            android:layout_height="86dp"
-            android:layout_marginStart="12dp"
-            android:layout_marginTop="12dp"
-            android:layout_marginEnd="12dp"
-            android:background="@drawable/bg_white_10dp"
-            app:layout_constraintLeft_toLeftOf="parent"
-            app:layout_constraintRight_toRightOf="parent"
-            app:layout_constraintTop_toBottomOf="@+id/fl_input" />
-
-        <View
-            android:layout_width="61dp"
-            android:layout_height="61dp"
-            android:layout_marginStart="7dp"
-            android:background="@drawable/shape_434343_to_666666_round"
-            app:layout_constraintBottom_toBottomOf="@+id/iv_icon"
-            app:layout_constraintLeft_toLeftOf="@+id/iv_icon"
-            app:layout_constraintTop_toTopOf="@+id/iv_icon" />
-
-
-        <com.cooleshow.base.widgets.QMUIRadiusImageView
-            android:id="@+id/iv_icon"
-            android:layout_width="62dp"
-            android:layout_height="62dp"
-            android:layout_marginStart="12dp"
-            android:src="@drawable/icon_default_music_song_cover"
-            app:layout_constraintBottom_toBottomOf="@+id/view_info_bg"
-            app:layout_constraintLeft_toLeftOf="@+id/view_info_bg"
-            app:layout_constraintTop_toTopOf="@+id/view_info_bg"
-            app:layout_goneMarginStart="0dp"
-            app:qmui_corner_radius="8dp" />
-
-        <TextView
-            android:background="@drawable/shape_5e000000_bottom_5dp"
-            android:includeFontPadding="false"
-            android:gravity="center"
-            android:textColor="@color/white"
-            android:textSize="@dimen/sp_13"
-            android:text="选封面"
-            app:layout_constraintRight_toRightOf="@+id/iv_icon"
-            app:layout_constraintLeft_toLeftOf="@+id/iv_icon"
-            app:layout_constraintBottom_toBottomOf="@+id/iv_icon"
-            android:layout_width="0dp"
-            android:layout_height="19dp"/>
-
-        <TextView
-            android:layout_marginEnd="12dp"
-            android:maxLines="1"
-            android:ellipsize="end"
-            app:layout_constraintRight_toRightOf="@+id/view_info_bg"
-            android:id="@+id/tv_music_title"
-            android:layout_width="0dp"
-            android:layout_height="wrap_content"
-            android:layout_marginStart="15dp"
-            android:textColor="@color/color_131415"
-            android:textSize="@dimen/sp_16"
-            android:textStyle="bold"
-            android:includeFontPadding="false"
-            app:layout_constraintBottom_toTopOf="@+id/tv_name"
-            app:layout_constraintLeft_toRightOf="@+id/iv_icon"
-            app:layout_constraintTop_toTopOf="@+id/iv_icon"
-            tools:text="山茶花读不懂白玫瑰" />
-
-        <TextView
-            android:layout_marginEnd="12dp"
-            android:maxLines="1"
-            android:ellipsize="end"
-            app:layout_constraintRight_toRightOf="@+id/view_info_bg"
-            android:id="@+id/tv_name"
-            android:layout_width="0dp"
-            android:layout_height="wrap_content"
-            android:layout_marginTop="4dp"
-            android:drawablePadding="5dp"
-            android:includeFontPadding="false"
-            android:textColor="@color/color_777777"
-            android:textSize="@dimen/sp_14"
-            app:layout_constraintBottom_toBottomOf="@+id/iv_icon"
-            app:layout_constraintLeft_toLeftOf="@+id/tv_music_title"
-            app:layout_constraintTop_toBottomOf="@+id/tv_music_title"
-            tools:text="张子珊" />
-
-
-        <TextView
-            android:id="@+id/tv_publish"
-            android:layout_width="220dp"
-            android:layout_height="38dp"
-            android:layout_marginTop="18dp"
-            android:layout_marginBottom="18dp"
-            android:background="@drawable/shape_login_bt_bg"
-            android:gravity="center"
-            android:text="发布作品"
-            android:textColor="@color/white"
-            android:textStyle="bold"
-            app:layout_constraintBottom_toBottomOf="parent"
-            app:layout_constraintLeft_toLeftOf="parent"
-            app:layout_constraintRight_toRightOf="parent"
-            app:layout_constraintTop_toBottomOf="@+id/view_info_bg" />
-    </androidx.constraintlayout.widget.ConstraintLayout>
+                android:layout_height="wrap_content"
+                android:padding="10dp"
+                android:src="@drawable/icon_close_dialog"
+                app:layout_constraintRight_toRightOf="parent"
+                app:layout_constraintTop_toTopOf="parent" />
+
+            <ScrollView
+                android:fillViewport="true"
+                android:id="@+id/scrollView"
+                app:layout_constraintTop_toBottomOf="@+id/tv_title"
+                android:layout_width="match_parent"
+                android:layout_height="275dp">
+
+                <androidx.constraintlayout.widget.ConstraintLayout
+                    android:paddingBottom="18dp"
+                    android:layout_width="match_parent"
+                    android:layout_height="wrap_content">
+
+                    <ImageView
+                        android:visibility="visible"
+                        android:layout_marginStart="12dp"
+                        android:layout_marginEnd="12dp"
+                        app:layout_constraintLeft_toLeftOf="parent"
+                        app:layout_constraintTop_toTopOf="parent"
+                        android:id="@+id/iv_video_cover"
+                        android:adjustViewBounds="true"
+                        android:src="@drawable/icon_upload_video_cover"
+                        android:layout_width="match_parent"
+                        android:layout_height="wrap_content"/>
+
+                    <View
+                        android:id="@+id/view_line_helper"
+                        app:layout_constraintLeft_toLeftOf="@+id/iv_video_cover"
+                        app:layout_constraintBottom_toBottomOf="@+id/iv_video_cover"
+                        android:layout_width="1px"
+                        android:layout_height="1px"/>
+
+                    <View
+                        android:id="@+id/view_select_cover_bg"
+                        app:layout_constraintRight_toRightOf="@+id/iv_video_cover"
+                        app:layout_constraintLeft_toLeftOf="@+id/iv_video_cover"
+                        app:layout_constraintBottom_toBottomOf="@+id/view_line_helper"
+                        app:layout_constraintTop_toTopOf="@+id/view_line_helper"
+                        android:background="@drawable/shape_80b1c8_to_3a98a2_15dp"
+                        android:layout_width="248dp"
+                        android:layout_height="30dp"/>
+
+                    <View
+                        android:id="@+id/view_center"
+                        app:layout_constraintRight_toRightOf="@+id/view_select_cover_bg"
+                        app:layout_constraintBottom_toBottomOf="@+id/view_select_cover_bg"
+                        app:layout_constraintLeft_toLeftOf="@+id/view_select_cover_bg"
+                        app:layout_constraintTop_toTopOf="@+id/view_select_cover_bg"
+                        android:background="@color/white"
+                        android:layout_width="2dp"
+                        android:layout_height="11dp"/>
+
+                    <TextView
+                        android:id="@+id/tv_by_album"
+                        app:layout_constraintRight_toLeftOf="@+id/view_center"
+                        app:layout_constraintBottom_toBottomOf="@+id/view_select_cover_bg"
+                        app:layout_constraintLeft_toLeftOf="@+id/view_select_cover_bg"
+                        app:layout_constraintTop_toTopOf="@+id/view_select_cover_bg"
+                        android:drawableStart="@drawable/icon_get_cover_by_album"
+                        android:text="相册获取封面"
+                        android:drawablePadding="4dp"
+                        android:gravity="center"
+                        android:includeFontPadding="false"
+                        android:textColor="@color/white"
+                        android:textSize="@dimen/sp_12"
+                        android:layout_width="wrap_content"
+                        android:layout_height="0dp"/>
+
+                    <TextView
+                        android:id="@+id/tv_by_crop"
+                        app:layout_constraintLeft_toRightOf="@+id/view_center"
+                        app:layout_constraintBottom_toBottomOf="@+id/view_select_cover_bg"
+                        app:layout_constraintRight_toRightOf="@+id/view_select_cover_bg"
+                        app:layout_constraintTop_toTopOf="@+id/view_select_cover_bg"
+                        android:drawableStart="@drawable/icon_get_cover_by_crop"
+                        android:text="视频截取封面"
+                        android:drawablePadding="4dp"
+                        android:gravity="center"
+                        android:includeFontPadding="false"
+                        android:textColor="@color/white"
+                        android:textSize="@dimen/sp_12"
+                        android:layout_width="wrap_content"
+                        android:layout_height="0dp"/>
+
+                    <androidx.constraintlayout.widget.Group
+                        android:visibility="gone"
+                        android:id="@+id/group_video_cover"
+                        app:constraint_referenced_ids="tv_by_crop,tv_by_album,view_center,view_select_cover_bg,view_line_helper,iv_video_cover"
+                        android:layout_width="wrap_content"
+                        android:layout_height="wrap_content"/>
+
+
+                    <FrameLayout
+                        app:layout_goneMarginTop="0dp"
+                        android:layout_marginTop="26dp"
+                        app:layout_constraintTop_toBottomOf="@+id/iv_video_cover"
+                        android:id="@+id/fl_input"
+                        android:layout_width="match_parent"
+                        android:layout_height="87dp"
+                        android:layout_marginStart="12dp"
+                        android:layout_marginEnd="12dp"
+                        android:background="@drawable/bg_white_10dp"
+                        app:layout_constraintLeft_toLeftOf="parent"
+                        app:layout_constraintRight_toRightOf="parent">
+
+
+                        <androidx.appcompat.widget.AppCompatEditText
+                            android:id="@+id/et_content"
+                            android:layout_width="match_parent"
+                            android:layout_height="match_parent"
+                            android:layout_marginBottom="27dp"
+                            android:background="@color/transparent"
+                            android:gravity="left"
+                            android:hint="我发布了一首演奏作品,快来听听吧~"
+                            android:maxLength="150"
+                            android:paddingLeft="12dp"
+                            android:paddingTop="12dp"
+                            android:paddingRight="12dp"
+                            android:textColor="@color/black_333"
+                            android:textColorHint="@color/color_aaaaaa"
+                            android:textSize="@dimen/sp_14"
+                            android:theme="@style/MyEditText"
+                            app:layout_constraintLeft_toLeftOf="parent"
+                            app:layout_constraintTop_toTopOf="parent" />
+
+
+                        <TextView
+                            android:id="@+id/tv_text_num"
+                            android:layout_width="wrap_content"
+                            android:layout_height="20dp"
+                            android:layout_gravity="bottom|right"
+                            android:layout_marginEnd="12dp"
+                            android:layout_marginBottom="7dp"
+                            android:gravity="center"
+                            android:text="0/150"
+                            android:textColor="@color/color_aaaaaa"
+                            android:textSize="@dimen/sp_12"
+                            app:layout_constraintBottom_toBottomOf="@+id/fl_input"
+                            app:layout_constraintRight_toRightOf="@+id/fl_input" />
+                    </FrameLayout>
+
+
+                    <View
+                        android:id="@+id/view_info_bg"
+                        android:layout_width="match_parent"
+                        android:layout_height="86dp"
+                        android:layout_marginStart="12dp"
+                        android:layout_marginTop="12dp"
+                        android:layout_marginEnd="12dp"
+                        android:background="@drawable/bg_white_10dp"
+                        app:layout_constraintLeft_toLeftOf="parent"
+                        app:layout_constraintRight_toRightOf="parent"
+                        app:layout_constraintTop_toBottomOf="@+id/fl_input" />
+
+                    <View
+                        android:layout_width="61dp"
+                        android:layout_height="61dp"
+                        android:layout_marginStart="7dp"
+                        android:background="@drawable/shape_434343_to_666666_round"
+                        app:layout_constraintBottom_toBottomOf="@+id/iv_icon"
+                        app:layout_constraintLeft_toLeftOf="@+id/iv_icon"
+                        app:layout_constraintTop_toTopOf="@+id/iv_icon" />
+
+
+                    <com.cooleshow.base.widgets.QMUIRadiusImageView
+                        android:id="@+id/iv_icon"
+                        android:layout_width="62dp"
+                        android:layout_height="62dp"
+                        android:layout_marginStart="12dp"
+                        android:src="@drawable/icon_default_music_song_cover"
+                        app:layout_constraintBottom_toBottomOf="@+id/view_info_bg"
+                        app:layout_constraintLeft_toLeftOf="@+id/view_info_bg"
+                        app:layout_constraintTop_toTopOf="@+id/view_info_bg"
+                        app:layout_goneMarginStart="0dp"
+                        app:qmui_corner_radius="8dp" />
+
+                    <TextView
+                        android:layout_width="0dp"
+                        android:layout_height="19dp"
+                        android:background="@drawable/shape_5e000000_bottom_5dp"
+                        android:gravity="center"
+                        android:includeFontPadding="false"
+                        android:text="选封面"
+                        android:textColor="@color/white"
+                        android:textSize="@dimen/sp_13"
+                        app:layout_constraintBottom_toBottomOf="@+id/iv_icon"
+                        app:layout_constraintLeft_toLeftOf="@+id/iv_icon"
+                        app:layout_constraintRight_toRightOf="@+id/iv_icon" />
+
+                    <TextView
+                        android:id="@+id/tv_music_title"
+                        android:layout_width="0dp"
+                        android:layout_height="wrap_content"
+                        android:layout_marginStart="15dp"
+                        android:layout_marginEnd="12dp"
+                        android:ellipsize="end"
+                        android:includeFontPadding="false"
+                        android:maxLines="1"
+                        android:textColor="@color/color_131415"
+                        android:textSize="@dimen/sp_16"
+                        android:textStyle="bold"
+                        app:layout_constraintBottom_toTopOf="@+id/tv_name"
+                        app:layout_constraintLeft_toRightOf="@+id/iv_icon"
+                        app:layout_constraintRight_toRightOf="@+id/view_info_bg"
+                        app:layout_constraintTop_toTopOf="@+id/iv_icon"
+                        tools:text="山茶花读不懂白玫瑰" />
+
+                    <TextView
+                        android:id="@+id/tv_name"
+                        android:layout_width="0dp"
+                        android:layout_height="wrap_content"
+                        android:layout_marginTop="4dp"
+                        android:layout_marginEnd="12dp"
+                        android:drawablePadding="5dp"
+                        android:ellipsize="end"
+                        android:includeFontPadding="false"
+                        android:maxLines="1"
+                        android:textColor="@color/color_777777"
+                        android:textSize="@dimen/sp_14"
+                        app:layout_constraintBottom_toBottomOf="@+id/iv_icon"
+                        app:layout_constraintLeft_toLeftOf="@+id/tv_music_title"
+                        app:layout_constraintRight_toRightOf="@+id/view_info_bg"
+                        app:layout_constraintTop_toBottomOf="@+id/tv_music_title"
+                        tools:text="张子珊" />
+
+                    <TextView
+                        android:id="@+id/tv_publish"
+                        android:layout_width="220dp"
+                        android:layout_height="38dp"
+                        android:layout_marginTop="18dp"
+                        android:background="@drawable/shape_login_bt_bg"
+                        android:gravity="center"
+                        android:text="发布作品"
+                        android:textColor="@color/white"
+                        android:textStyle="bold"
+                        app:layout_constraintLeft_toLeftOf="parent"
+                        app:layout_constraintRight_toRightOf="parent"
+                        app:layout_constraintTop_toBottomOf="@+id/view_info_bg" />
+                </androidx.constraintlayout.widget.ConstraintLayout>
+            </ScrollView>
+
+        </androidx.constraintlayout.widget.ConstraintLayout>
+    </FrameLayout>
 </LinearLayout>

+ 1 - 0
musicMerge/src/main/res/values/colors.xml

@@ -1,6 +1,7 @@
 <?xml version="1.0" encoding="utf-8"?>
 <resources>
     <color name="main_style_color">#2dc7aa</color>
+    <color name="main_style_color2">#44F1D0</color>
     <color name="color_131415">#131415</color>
     <color name="color_8f8f8f">#8F8F8F</color>
     <color name="color_48494b">#48494B</color>