Browse Source

增加我的作品页面

Pq 1 year ago
parent
commit
d1fcc71e73
48 changed files with 1428 additions and 16 deletions
  1. 2 0
      BaseLibrary/src/main/java/com/cooleshow/base/common/WebConstants.java
  2. 6 0
      BaseLibrary/src/main/java/com/cooleshow/base/router/RouterPath.kt
  3. 4 0
      BaseLibrary/src/main/java/com/cooleshow/base/utils/TimeUtils.java
  4. 13 0
      BaseLibrary/src/main/java/com/cooleshow/base/utils/Utils.java
  5. 7 0
      BaseLibrary/src/main/java/com/cooleshow/base/utils/helper/WebStartHelper.java
  6. 17 0
      BaseLibrary/src/main/res/layout/custom_tab_layout.xml
  7. 5 0
      musicMerge/src/main/AndroidManifest.xml
  8. 108 0
      musicMerge/src/main/java/com/cooleshow/musicmerge/adapter/MyDraftWorkListAdapter.java
  9. 49 0
      musicMerge/src/main/java/com/cooleshow/musicmerge/adapter/MyWorkListAdapter.java
  10. 46 0
      musicMerge/src/main/java/com/cooleshow/musicmerge/adapter/MyWorkPagerAdapter.java
  11. 11 0
      musicMerge/src/main/java/com/cooleshow/musicmerge/api/Api.java
  12. 6 6
      musicMerge/src/main/java/com/cooleshow/musicmerge/bean/MusicDataBean.java
  13. 16 0
      musicMerge/src/main/java/com/cooleshow/musicmerge/bean/MyWorkListBean.java
  14. 19 0
      musicMerge/src/main/java/com/cooleshow/musicmerge/contract/MyWorkContract.java
  15. 84 0
      musicMerge/src/main/java/com/cooleshow/musicmerge/presenter/work/MyWorkPresenter.java
  16. 155 0
      musicMerge/src/main/java/com/cooleshow/musicmerge/ui/work/MyWorkActivity.java
  17. 255 0
      musicMerge/src/main/java/com/cooleshow/musicmerge/ui/work/MyWorkDraftFragment.java
  18. 158 0
      musicMerge/src/main/java/com/cooleshow/musicmerge/ui/work/MyWorkPublishFragment.java
  19. BIN
      musicMerge/src/main/res/drawable-xhdpi/icon_edit_works.png
  20. BIN
      musicMerge/src/main/res/drawable-xhdpi/icon_my_work_clock.png
  21. BIN
      musicMerge/src/main/res/drawable-xhdpi/icon_my_work_likes.png
  22. BIN
      musicMerge/src/main/res/drawable-xhdpi/icon_my_work_play.png
  23. BIN
      musicMerge/src/main/res/drawable-xhdpi/icon_my_work_title.png
  24. BIN
      musicMerge/src/main/res/drawable-xxhdpi/bg_my_work_top.png
  25. BIN
      musicMerge/src/main/res/drawable-xxhdpi/icon_edit_works.png
  26. BIN
      musicMerge/src/main/res/drawable-xxhdpi/icon_my_work_clock.png
  27. BIN
      musicMerge/src/main/res/drawable-xxhdpi/icon_my_work_likes.png
  28. BIN
      musicMerge/src/main/res/drawable-xxhdpi/icon_my_work_play.png
  29. BIN
      musicMerge/src/main/res/drawable-xxhdpi/icon_my_work_title.png
  30. 5 0
      musicMerge/src/main/res/drawable/shape_2dc7aa_to_77ffef.xml
  31. 6 0
      musicMerge/src/main/res/drawable/shape_bdffffff_12dp.xml
  32. 5 0
      musicMerge/src/main/res/drawable/shape_f8f9fc_top_20dp.xml
  33. 6 0
      musicMerge/src/main/res/drawable/shape_ff0868_to_ff0303_4dp.xml
  34. 142 0
      musicMerge/src/main/res/layout/ac_my_work_layout.xml
  35. 65 0
      musicMerge/src/main/res/layout/fg_my_work_draft_layout.xml
  36. 22 0
      musicMerge/src/main/res/layout/fg_my_work_publish_layout.xml
  37. 88 0
      musicMerge/src/main/res/layout/item_my_draft_work_layout.xml
  38. 103 0
      musicMerge/src/main/res/layout/item_my_work_layout.xml
  39. 1 0
      musicMerge/src/main/res/values/colors.xml
  40. 1 0
      student/build.gradle
  41. 7 0
      student/src/main/java/com/cooleshow/student/ui/main/MineFragment.java
  42. BIN
      student/src/main/res/drawable-xhdpi/icon_mine_works.png
  43. BIN
      student/src/main/res/drawable-xxhdpi/icon_mine_works.png
  44. 5 7
      student/src/main/res/layout/fragment_mine_layout.xml
  45. 7 0
      teacher/src/main/java/com/cooleshow/teacher/ui/main/MineFragment.java
  46. 4 3
      teacher/src/main/java/com/cooleshow/teacher/widgets/helper/MineFragmentToolsHelper.java
  47. BIN
      teacher/src/main/res/drawable-xhdpi/icon_mine_works.png
  48. BIN
      teacher/src/main/res/drawable-xxhdpi/icon_mine_works.png

+ 2 - 0
BaseLibrary/src/main/java/com/cooleshow/base/common/WebConstants.java

@@ -167,4 +167,6 @@ public abstract class WebConstants {
     public static final String TEACHER_HOME_PAGE_FOR_TEACHER = getBaseUrlH5() + "/#/teacherHome?teacherId=%s";
 
     public static final String TRAIN_TOOLS = getBaseUrlH5() + "/#/train-tool";
+
+    public static final String MY_WORKS = getBaseUrlH5() + "/#/creation?id=%s";////我的作品
 }

+ 6 - 0
BaseLibrary/src/main/java/com/cooleshow/base/router/RouterPath.kt

@@ -215,4 +215,10 @@ object RouterPath {
         }
     }
 
+    class Homework {
+        companion object {
+            const val MY_WORK = "/instrument/work/MyWorkActivity"
+        }
+    }
+
 }

+ 4 - 0
BaseLibrary/src/main/java/com/cooleshow/base/utils/TimeUtils.java

@@ -41,6 +41,10 @@ public final class TimeUtils {
         return getSafeDateFormat("yyyy-MM-dd HH:mm:ss");
     }
 
+    public static SimpleDateFormat getSafeDateFormatForDay() {
+        return getSafeDateFormat("yyyy-MM-dd");
+    }
+
     /**
      * Checks whether the device is using Network Provided Time or not.
      * Useful in situations where you want to verify that the device has a correct time set, to avoid fraud, or if you want to prevent the user from messing with the time and abusing your "one-time" and "expiring" features.

+ 13 - 0
BaseLibrary/src/main/java/com/cooleshow/base/utils/Utils.java

@@ -16,6 +16,8 @@ import android.view.ViewGroup;
 
 import com.cooleshow.base.utils.helper.QMUIDisplayHelper;
 
+import java.util.List;
+
 import androidx.annotation.NonNull;
 import androidx.lifecycle.Lifecycle;
 
@@ -198,4 +200,15 @@ public final class Utils {
         }
         return result;
     }
+
+    public static String getIds(List<String> ids) {
+        StringBuilder stringBuilder = new StringBuilder();
+        for (int i = 0; i < ids.size(); i++) {
+            stringBuilder.append(ids.get(i));
+            if (i != ids.size() - 1) {
+                stringBuilder.append(",");
+            }
+        }
+        return stringBuilder.toString();
+    }
 }

+ 7 - 0
BaseLibrary/src/main/java/com/cooleshow/base/utils/helper/WebStartHelper.java

@@ -242,4 +242,11 @@ public class WebStartHelper {
                 .withString(WebConstants.WEB_URL, WebConstants.TRAIN_TOOLS)
                 .navigation();
     }
+
+    public static void startMyWorks(String worksId) {
+        ARouter.getInstance()
+                .build(RouterPath.WebCenter.ACTIVITY_HTML)
+                .withString(WebConstants.WEB_URL, String.format(WebConstants.MY_WORKS, worksId))
+                .navigation();
+    }
 }

+ 17 - 0
BaseLibrary/src/main/res/layout/custom_tab_layout.xml

@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="utf-8"?>
+<FrameLayout
+    xmlns:android="http://schemas.android.com/apk/res/android"
+    android:layout_width="wrap_content"
+    android:layout_gravity="center"
+    android:layout_height="wrap_content">
+    <TextView
+        android:layout_gravity="center"
+        android:gravity="center"
+        android:includeFontPadding="false"
+        android:textSize="@dimen/sp_16"
+        android:textColor="@color/color_777777"
+        android:id="@+id/tv_text"
+        android:minWidth="60dp"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"/>
+</FrameLayout>

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

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

+ 108 - 0
musicMerge/src/main/java/com/cooleshow/musicmerge/adapter/MyDraftWorkListAdapter.java

@@ -0,0 +1,108 @@
+package com.cooleshow.musicmerge.adapter;
+
+import android.text.TextUtils;
+import android.view.View;
+import android.widget.ImageView;
+
+import com.chad.library.adapter.base.BaseQuickAdapter;
+import com.chad.library.adapter.base.viewholder.BaseViewHolder;
+import com.cooleshow.base.utils.GlideImageLoaderUtils;
+import com.cooleshow.base.utils.SizeUtils;
+import com.cooleshow.base.utils.TimeUtils;
+import com.cooleshow.musicmerge.R;
+import com.cooleshow.musicmerge.bean.MyWorkListBean;
+
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.List;
+
+import androidx.annotation.NonNull;
+import androidx.recyclerview.widget.RecyclerView;
+
+/**
+ * Author by pq, Date on 2023/10/31.
+ */
+public class MyDraftWorkListAdapter extends BaseQuickAdapter<MyWorkListBean.RowsBean, BaseViewHolder> {
+    private ArrayList<String> selectIds;
+    private boolean isEditMode = false;
+
+    public MyDraftWorkListAdapter() {
+        super(R.layout.item_my_draft_work_layout);
+        selectIds = new ArrayList<>();
+    }
+
+    public void setEditMode(boolean isEditMode) {
+        this.isEditMode = isEditMode;
+        notifyDataSetChanged();
+    }
+
+    public ArrayList<String> getSelectIds() {
+        return selectIds;
+    }
+
+    public void checkAll() {
+        selectIds.clear();
+        List<MyWorkListBean.RowsBean> data = getData();
+        for (int i = 0; i < data.size(); i++) {
+            MyWorkListBean.RowsBean rowsBean = data.get(i);
+            selectIds.add(rowsBean.getId());
+        }
+        notifyDataSetChanged();
+    }
+
+    public void clearAllCheck() {
+        selectIds.clear();
+        notifyDataSetChanged();
+    }
+
+    public void setSelectId(String id) {
+        int resultPos = isContain(id);
+        if (resultPos != -1) {
+            selectIds.remove(resultPos);
+        } else {
+            selectIds.add(id);
+        }
+        notifyDataSetChanged();
+    }
+
+    @Override
+    protected void convert(@NonNull BaseViewHolder holder, MyWorkListBean.RowsBean bean) {
+        ImageView iv_icon = holder.getView(R.id.iv_icon);
+        GlideImageLoaderUtils.getInstance().loadImage(getContext(), bean.getImg(), iv_icon, R.drawable.icon_default_music_song_cover);
+
+        holder.setText(R.id.tv_title, bean.getMusicSheetName());
+
+        if (!TextUtils.isEmpty(bean.getCreateTime())) {
+            Date date = TimeUtils.string2Date(bean.getCreateTime());
+            String dateStr = TimeUtils.date2String(date, TimeUtils.getSafeDateFormatForDay());
+            holder.setText(R.id.tv_date, dateStr);
+        } else {
+            holder.setText(R.id.tv_date, "");
+        }
+
+        View selectView = holder.getView(R.id.view_select);
+        selectView.setVisibility(isEditMode ? View.VISIBLE : View.GONE);
+        int posResult = isContain(bean.getId());
+        selectView.setSelected(posResult != -1);
+
+        View cs_root = holder.getView(R.id.cs_root);
+        RecyclerView.LayoutParams params = (RecyclerView.LayoutParams) cs_root.getLayoutParams();
+        if(holder.getLayoutPosition() == 0){
+            params.setMargins(SizeUtils.dp2px(13),SizeUtils.dp2px(12),SizeUtils.dp2px(13),SizeUtils.dp2px(12));
+        }else{
+            params.setMargins(SizeUtils.dp2px(13),0,SizeUtils.dp2px(13),SizeUtils.dp2px(12));
+        }
+        cs_root.setLayoutParams(params);
+    }
+
+    private int isContain(String id) {
+        boolean contains = selectIds.contains(id);
+        for (int i = 0; i < selectIds.size(); i++) {
+            String s = selectIds.get(i);
+            if (TextUtils.equals(id, s)) {
+                return i;
+            }
+        }
+        return -1;
+    }
+}

+ 49 - 0
musicMerge/src/main/java/com/cooleshow/musicmerge/adapter/MyWorkListAdapter.java

@@ -0,0 +1,49 @@
+package com.cooleshow.musicmerge.adapter;
+
+import android.view.View;
+import android.widget.ImageView;
+
+import com.chad.library.adapter.base.BaseQuickAdapter;
+import com.chad.library.adapter.base.viewholder.BaseViewHolder;
+import com.cooleshow.base.utils.GlideImageLoaderUtils;
+import com.cooleshow.base.utils.SizeUtils;
+import com.cooleshow.base.utils.TimeUtils;
+import com.cooleshow.musicmerge.R;
+import com.cooleshow.musicmerge.bean.MyWorkListBean;
+
+import java.util.Date;
+
+import androidx.annotation.NonNull;
+import androidx.recyclerview.widget.RecyclerView;
+
+/**
+ * Author by pq, Date on 2023/10/31.
+ */
+public class MyWorkListAdapter extends BaseQuickAdapter<MyWorkListBean.RowsBean, BaseViewHolder> {
+    public MyWorkListAdapter() {
+        super(R.layout.item_my_work_layout);
+    }
+
+    @Override
+    protected void convert(@NonNull BaseViewHolder holder, MyWorkListBean.RowsBean bean) {
+        ImageView iv_icon = holder.getView(R.id.iv_icon);
+        GlideImageLoaderUtils.getInstance().loadImage(getContext(), bean.getImg(), iv_icon, R.drawable.icon_default_music_song_cover);
+
+        holder.setText(R.id.tv_title, bean.getMusicSheetName());
+        holder.setText(R.id.tv_likes_num, String.valueOf(bean.getLikeNum()));
+
+
+        Date date = TimeUtils.string2Date(bean.getSubmitTime());
+        String dateStr = TimeUtils.date2String(date, TimeUtils.getSafeDateFormatForDay());
+        holder.setText(R.id.tv_date, dateStr);
+
+        View cs_root = holder.getView(R.id.cs_root);
+        RecyclerView.LayoutParams params = (RecyclerView.LayoutParams) cs_root.getLayoutParams();
+        if(holder.getLayoutPosition() == 0){
+            params.setMargins(SizeUtils.dp2px(13),SizeUtils.dp2px(12),SizeUtils.dp2px(13),SizeUtils.dp2px(12));
+        }else{
+            params.setMargins(SizeUtils.dp2px(13),0,SizeUtils.dp2px(13),SizeUtils.dp2px(12));
+        }
+        cs_root.setLayoutParams(params);
+    }
+}

+ 46 - 0
musicMerge/src/main/java/com/cooleshow/musicmerge/adapter/MyWorkPagerAdapter.java

@@ -0,0 +1,46 @@
+package com.cooleshow.musicmerge.adapter;
+
+import java.util.ArrayList;
+
+import androidx.annotation.NonNull;
+import androidx.fragment.app.Fragment;
+import androidx.fragment.app.FragmentActivity;
+import androidx.viewpager2.adapter.FragmentStateAdapter;
+
+/**
+ * Author by pq, Date on 2022/5/6.
+ */
+public class MyWorkPagerAdapter extends FragmentStateAdapter {
+    private ArrayList<Fragment> mFragments;
+
+    public MyWorkPagerAdapter(@NonNull FragmentActivity fragmentActivity) {
+        super(fragmentActivity);
+    }
+
+    public void setData(ArrayList<Fragment> fragments) {
+        this.mFragments = fragments;
+        notifyDataSetChanged();
+    }
+
+    @NonNull
+    @Override
+    public Fragment createFragment(int position) {
+        return mFragments.get(position);
+    }
+
+    @Override
+    public int getItemCount() {
+        return mFragments != null ? mFragments.size() : 0;
+    }
+
+    @Override
+    public long getItemId(int position) {
+        Fragment fragment = mFragments.get(position);
+        return fragment != null ? fragment.hashCode() : super.getItemId(position);
+    }
+
+    @Override
+    public boolean containsItem(long itemId) {
+        return super.containsItem(itemId);
+    }
+}

+ 11 - 0
musicMerge/src/main/java/com/cooleshow/musicmerge/api/Api.java

@@ -1,13 +1,17 @@
 package com.cooleshow.musicmerge.api;
 
+import com.cooleshow.base.common.BaseConstant;
 import com.cooleshow.base.data.net.BaseResponse;
 import com.cooleshow.musicmerge.bean.MusicDataBean;
+import com.cooleshow.musicmerge.bean.MyWorkListBean;
 
 import io.reactivex.rxjava3.core.Observable;
 import okhttp3.RequestBody;
 import okhttp3.ResponseBody;
 import retrofit2.Call;
 import retrofit2.http.Body;
+import retrofit2.http.Field;
+import retrofit2.http.FormUrlEncoded;
 import retrofit2.http.GET;
 import retrofit2.http.Headers;
 import retrofit2.http.POST;
@@ -25,4 +29,11 @@ public interface Api {
 
     @GET("{group_name}" + "/userMusic/detail/{id}")
     Observable<BaseResponse<MusicDataBean>> getDetail(@Path("group_name") String group_name, @Path("id") String id);
+
+    @POST("{group_name}" + "/userMusic/page")
+    Observable<BaseResponse<MyWorkListBean>> getMyWorks(@Path("group_name") String group_name,@Body RequestBody requestBody);
+
+    @FormUrlEncoded
+    @POST("{group_name}" + "/userMusic/remove")
+    Observable<BaseResponse<Object>> delDraftWorks(@Path("group_name") String group_name,@Field("id") String ids);
 }

+ 6 - 6
musicMerge/src/main/java/com/cooleshow/musicmerge/bean/MusicDataBean.java

@@ -40,8 +40,8 @@ public class MusicDataBean {
     private String avatar;
     private String subjectId;
     private String subjectName;
-    private int currentGradeNum;
-    private int currentClass;
+    private String currentGradeNum;
+    private String currentClass;
     private boolean vipFlag;
     private String musicPracticeRecordId;
     private String musicSheetId;
@@ -124,19 +124,19 @@ public class MusicDataBean {
         this.subjectName = subjectName;
     }
 
-    public int getCurrentGradeNum() {
+    public String getCurrentGradeNum() {
         return currentGradeNum;
     }
 
-    public void setCurrentGradeNum(int currentGradeNum) {
+    public void setCurrentGradeNum(String currentGradeNum) {
         this.currentGradeNum = currentGradeNum;
     }
 
-    public int getCurrentClass() {
+    public String getCurrentClass() {
         return currentClass;
     }
 
-    public void setCurrentClass(int currentClass) {
+    public void setCurrentClass(String currentClass) {
         this.currentClass = currentClass;
     }
 

File diff suppressed because it is too large
+ 16 - 0
musicMerge/src/main/java/com/cooleshow/musicmerge/bean/MyWorkListBean.java


+ 19 - 0
musicMerge/src/main/java/com/cooleshow/musicmerge/contract/MyWorkContract.java

@@ -0,0 +1,19 @@
+package com.cooleshow.musicmerge.contract;
+
+import com.cooleshow.base.presenter.view.BaseView;
+import com.cooleshow.musicmerge.bean.MyWorkListBean;
+
+/**
+ * Author by pq, Date on 2023/8/31.
+ */
+public interface MyWorkContract {
+    interface View extends BaseView {
+        void getMyPublishWorkSuccess(int page, MyWorkListBean data);
+
+        void getMyPublishWorkError(int page);
+
+        void delSuccess();
+
+
+    }
+}

+ 84 - 0
musicMerge/src/main/java/com/cooleshow/musicmerge/presenter/work/MyWorkPresenter.java

@@ -0,0 +1,84 @@
+package com.cooleshow.musicmerge.presenter.work;
+
+import com.cooleshow.base.common.BaseConstant;
+import com.cooleshow.base.constanst.Constants;
+import com.cooleshow.base.presenter.BasePresenter;
+import com.cooleshow.base.rx.BaseObserver;
+import com.cooleshow.base.utils.RequestBodyUtil;
+import com.cooleshow.musicmerge.api.Api;
+import com.cooleshow.musicmerge.bean.MyWorkListBean;
+import com.cooleshow.musicmerge.contract.MyWorkContract;
+
+import org.json.JSONException;
+import org.json.JSONObject;
+
+/**
+ * Author by pq, Date on 2023/8/31.
+ */
+public class MyWorkPresenter extends BasePresenter<MyWorkContract.View> {
+    public void getMyPublishWorks(int page) {
+        JSONObject jsonObject = new JSONObject();
+        try {
+            jsonObject.put("type", "FORMAL");
+            jsonObject.put("page", page);
+            jsonObject.put("rows", Constants.DEFAULT_DATA_SIZE);
+        } catch (JSONException e) {
+            throw new RuntimeException(e);
+        }
+        addSubscribe(create(Api.class).getMyWorks(BaseConstant.CLIENT_API_GROUP_NAME,RequestBodyUtil.convertToRequestBodyJson(jsonObject.toString())), new BaseObserver<MyWorkListBean>(getView()) {
+            @Override
+            protected void onSuccess(MyWorkListBean data) {
+                if (getView() != null) {
+                    getView().getMyPublishWorkSuccess(page, data);
+                }
+            }
+
+            @Override
+            public void onError(Throwable e) {
+                super.onError(e);
+                if (getView() != null) {
+                    getView().getMyPublishWorkError(page);
+                }
+            }
+        });
+    }
+
+    public void getMyDraftWorks(int page) {
+        JSONObject jsonObject = new JSONObject();
+        try {
+            jsonObject.put("type", "DRAFT");
+            jsonObject.put("page", page);
+            jsonObject.put("rows", Constants.DEFAULT_DATA_SIZE);
+        } catch (JSONException e) {
+            throw new RuntimeException(e);
+        }
+        addSubscribe(create(Api.class).getMyWorks(BaseConstant.CLIENT_API_GROUP_NAME,RequestBodyUtil.convertToRequestBodyJson(jsonObject.toString())), new BaseObserver<MyWorkListBean>(getView()) {
+            @Override
+            protected void onSuccess(MyWorkListBean data) {
+                if (getView() != null) {
+                    getView().getMyPublishWorkSuccess(page, data);
+                }
+            }
+
+            @Override
+            public void onError(Throwable e) {
+                super.onError(e);
+                if (getView() != null) {
+                    getView().getMyPublishWorkError(page);
+                }
+            }
+        });
+    }
+
+    public void delWorks(String ids){
+        addSubscribe(create(Api.class).delDraftWorks(BaseConstant.CLIENT_API_GROUP_NAME,ids), new BaseObserver<Object>(getView()) {
+            @Override
+            protected void onSuccess(Object o) {
+                if (getView() != null) {
+                    getView().delSuccess();
+                }
+            }
+        });
+    }
+
+}

+ 155 - 0
musicMerge/src/main/java/com/cooleshow/musicmerge/ui/work/MyWorkActivity.java

@@ -0,0 +1,155 @@
+package com.cooleshow.musicmerge.ui.work;
+
+import android.content.Intent;
+import android.os.Bundle;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.widget.TextView;
+
+import com.alibaba.android.arouter.facade.annotation.Route;
+import com.cooleshow.base.router.RouterPath;
+import com.cooleshow.base.ui.activity.BaseMVPActivity;
+import com.cooleshow.base.utils.Utils;
+import com.cooleshow.base.utils.helper.QMUIStatusBarHelper;
+import com.cooleshow.musicmerge.R;
+import com.cooleshow.musicmerge.adapter.MyWorkPagerAdapter;
+import com.cooleshow.musicmerge.databinding.AcMyWorkLayoutBinding;
+import com.cooleshow.musicmerge.presenter.work.MyWorkPresenter;
+import com.google.android.material.tabs.TabLayout;
+import com.google.android.material.tabs.TabLayoutMediator;
+
+import java.util.ArrayList;
+
+import androidx.annotation.NonNull;
+import androidx.annotation.Nullable;
+import androidx.fragment.app.Fragment;
+import androidx.viewpager2.widget.ViewPager2;
+
+/**
+ * Author by pq, Date on 2023/10/30.
+ */
+@Route(path = RouterPath.Homework.MY_WORK)
+public class MyWorkActivity extends BaseMVPActivity<AcMyWorkLayoutBinding, MyWorkPresenter> implements View.OnClickListener {
+    public static final String[] titles = new String[]{"作品", "草稿"};
+    private MyWorkPublishFragment mPublishFragment;
+    private MyWorkDraftFragment mDraftFragment;
+
+    @Override
+    protected void onCreate(@Nullable Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+        QMUIStatusBarHelper.setStatusBarLightMode(this);
+    }
+
+
+    @Override
+    protected void initView() {
+        Utils.setHeadView(viewBinding.viewStatusBar, this, 0);
+    }
+
+    @Override
+    public void initData() {
+        super.initData();
+        initListener();
+        TabLayoutMediator tabLayoutMediator = new TabLayoutMediator(viewBinding.tabLayout, viewBinding.viewPager, new TabLayoutMediator.TabConfigurationStrategy() {
+            @Override
+            public void onConfigureTab(@NonNull TabLayout.Tab tab, int position) {
+                createTab(tab, titles[position]);
+            }
+        });
+        mPublishFragment = new MyWorkPublishFragment();
+        mDraftFragment = new MyWorkDraftFragment();
+        ArrayList<Fragment> fragments = new ArrayList<Fragment>();
+        fragments.add(mPublishFragment);
+        fragments.add(mDraftFragment);
+        MyWorkPagerAdapter workPagerAdapter = new MyWorkPagerAdapter(this);
+        workPagerAdapter.setData(fragments);
+        viewBinding.viewPager.setAdapter(workPagerAdapter);
+        tabLayoutMediator.attach();
+    }
+
+    private void initListener() {
+        viewBinding.ivBack.setOnClickListener(this);
+        viewBinding.llEditBg.setOnClickListener(this);
+        viewBinding.viewPager.registerOnPageChangeCallback(new ViewPager2.OnPageChangeCallback() {
+            @Override
+            public void onPageSelected(int position) {
+                super.onPageSelected(position);
+                changeEditBt(position == 1);
+            }
+        });
+    }
+
+    private void changeEditBt(boolean isSelectDraft) {
+        viewBinding.llEditBg.setVisibility(isSelectDraft ? View.VISIBLE : View.GONE);
+        if (mDraftFragment != null) {
+            if (!isSelectDraft) {
+                changeDraftEditMode(false);
+            }
+        }
+    }
+
+    @Override
+    public void onClick(View v) {
+        int id = v.getId();
+        if (id == R.id.iv_back) {
+            finish();
+            return;
+        }
+
+        if (id == R.id.ll_edit_bg) {
+            if (mDraftFragment != null) {
+                boolean editMode = mDraftFragment.isEditMode();
+                if (editMode) {//便于理解这样写
+                    changeDraftEditMode(false);
+                } else {
+                    changeDraftEditMode(true);
+                }
+            }
+            return;
+        }
+    }
+
+    private void changeDraftEditMode(boolean isEditMode) {
+        mDraftFragment.handleSelectMode(isEditMode);
+        viewBinding.tvEdit.setText(isEditMode ? "退出编辑" : "编辑");
+    }
+
+    @Override
+    protected void onResume() {
+        super.onResume();
+        refreshData();
+    }
+
+    @Override
+    protected AcMyWorkLayoutBinding getLayoutView() {
+        return AcMyWorkLayoutBinding.inflate(getLayoutInflater());
+    }
+
+    @Override
+    protected MyWorkPresenter createPresenter() {
+        return new MyWorkPresenter();
+    }
+
+    private TabLayout.Tab createTab(TabLayout.Tab tab, String text) {
+        View view = LayoutInflater.from(this).inflate(com.cooleshow.base.R.layout.custom_tab_layout, null);
+        TextView tv_text = view.findViewById(com.cooleshow.base.R.id.tv_text);
+        tv_text.setText(text);
+        tab.setCustomView(view);
+        return tab;
+    }
+
+    @Override
+    protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
+        super.onActivityResult(requestCode, resultCode, data);
+    }
+
+    private void refreshData() {
+        if (mPublishFragment != null) {
+            mPublishFragment.refreshData();
+        }
+
+        if (mDraftFragment != null) {
+            mDraftFragment.refreshData();
+        }
+    }
+}

+ 255 - 0
musicMerge/src/main/java/com/cooleshow/musicmerge/ui/work/MyWorkDraftFragment.java

@@ -0,0 +1,255 @@
+package com.cooleshow.musicmerge.ui.work;
+
+import android.view.View;
+import android.widget.CompoundButton;
+
+import com.alibaba.android.arouter.launcher.ARouter;
+import com.chad.library.adapter.base.BaseQuickAdapter;
+import com.chad.library.adapter.base.listener.OnItemClickListener;
+import com.cooleshow.base.constanst.Constants;
+import com.cooleshow.base.router.RouterPath;
+import com.cooleshow.base.ui.fragment.BaseMVPFragment;
+import com.cooleshow.base.utils.ToastUtil;
+import com.cooleshow.base.utils.Utils;
+import com.cooleshow.base.widgets.EmptyViewLayout;
+import com.cooleshow.base.widgets.dialog.CommonConfirmDialog;
+import com.cooleshow.base.widgets.dialog.CommonConfirmDialog2;
+import com.cooleshow.musicmerge.adapter.MyDraftWorkListAdapter;
+import com.cooleshow.musicmerge.bean.MyWorkListBean;
+import com.cooleshow.musicmerge.contract.MyWorkContract;
+import com.cooleshow.musicmerge.databinding.FgMyWorkDraftLayoutBinding;
+import com.cooleshow.musicmerge.presenter.work.MyWorkPresenter;
+import com.scwang.smart.refresh.layout.api.RefreshLayout;
+import com.scwang.smart.refresh.layout.listener.OnRefreshListener;
+
+import java.util.ArrayList;
+
+import androidx.annotation.NonNull;
+import androidx.recyclerview.widget.LinearLayoutManager;
+
+/**
+ * Author by pq, Date on 2023/10/30.
+ */
+public class MyWorkDraftFragment extends BaseMVPFragment<FgMyWorkDraftLayoutBinding, MyWorkPresenter> implements MyWorkContract.View {
+    public static final int REQUEST_CODE = 10001;
+    private int currentPage = 1;
+    private boolean hasNext = true;
+    private MyDraftWorkListAdapter mListAdapter;
+
+    private boolean isEditMode = false;
+
+    @Override
+    protected FgMyWorkDraftLayoutBinding getLayoutView() {
+        return FgMyWorkDraftLayoutBinding.inflate(getLayoutInflater());
+    }
+
+    @Override
+    protected MyWorkPresenter createPresenter() {
+        return new MyWorkPresenter();
+    }
+
+    @Override
+    protected void initView(View rootView) {
+
+    }
+
+    @Override
+    protected void initData() {
+        mListAdapter = new MyDraftWorkListAdapter();
+        EmptyViewLayout emptyViewLayout = new EmptyViewLayout(getContext());
+        emptyViewLayout.setContent(com.cooleshow.base.R.drawable.icon_empty_content, "暂无内容");
+        mListAdapter.setEmptyView(emptyViewLayout);
+        mViewBinding.recyclerView.setLayoutManager(new LinearLayoutManager(getContext()));
+        mViewBinding.recyclerView.setAdapter(mListAdapter);
+        initListener();
+        getData();
+    }
+
+    @Override
+    public void refreshData() {
+        refresh();
+    }
+
+    private void refresh() {
+        currentPage = 1;
+        getData();
+    }
+
+    public void handleSelectMode(boolean isEditMode) {
+        if (isAdded()) {
+            this.isEditMode = isEditMode;
+            mViewBinding.csBottom.setVisibility(isEditMode ? View.VISIBLE : View.GONE);
+            mListAdapter.setEditMode(isEditMode);
+        }
+    }
+
+    public boolean isEditMode() {
+        return isEditMode;
+    }
+
+    private void initListener() {
+        mListAdapter.setOnItemClickListener(new OnItemClickListener() {
+            @Override
+            public void onItemClick(@NonNull BaseQuickAdapter<?, ?> adapter, @NonNull View view, int position) {
+                if (position < mListAdapter.getData().size()) {
+                    MyWorkListBean.RowsBean rowsBean = mListAdapter.getData().get(position);
+                    if (isEditMode) {
+                        mListAdapter.setSelectId(rowsBean.getId());
+                        updateSelectNum();
+                    } else {
+                        ARouter.getInstance().build(RouterPath.MusicTuner.MUSIC_MERGE_PAGE)
+                                .withString("recordId", rowsBean.getMusicPracticeRecordId())
+                                .withString("worksId", rowsBean.getId())
+                                .withString("coverImg", rowsBean.getImg())
+                                .withString("title", rowsBean.getMusicSheetName())
+                                .navigation(getActivity(), REQUEST_CODE);
+                    }
+                }
+
+            }
+        });
+        mViewBinding.refreshLayout.setOnRefreshListener(new OnRefreshListener() {
+            @Override
+            public void onRefresh(@NonNull RefreshLayout refreshLayout) {
+                currentPage = 1;
+                getData();
+            }
+        });
+        mViewBinding.refreshLayout.setOnLoadMoreListener(new com.scwang.smart.refresh.layout.listener.OnLoadMoreListener() {
+            @Override
+            public void onLoadMore(@NonNull RefreshLayout refreshLayout) {
+                //上拉加载
+                if (hasNext) {
+                    currentPage++;
+                    getData();
+                } else {
+                    mViewBinding.refreshLayout.finishLoadMoreWithNoMoreData();
+                }
+            }
+        });
+
+        mViewBinding.selectCheckbox.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
+            @Override
+            public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
+                if (buttonView.isPressed()) {
+                    if (isChecked) {
+                        mListAdapter.checkAll();
+                    } else {
+                        mListAdapter.clearAllCheck();
+                    }
+                    updateSelectNum();
+                }
+            }
+        });
+
+        mViewBinding.tvDel.setOnClickListener(new View.OnClickListener() {
+            @Override
+            public void onClick(View v) {
+                ArrayList<String> selectIds = mListAdapter.getSelectIds();
+                if (selectIds == null || selectIds.isEmpty()) {
+                    ToastUtil.getInstance().showShort("请选择需要删除的草稿");
+                    return;
+                }
+                showConfirmDialog();
+            }
+        });
+    }
+
+    private void updateSelectNum() {
+        ArrayList<String> selectIds = mListAdapter.getSelectIds();
+        if (selectIds != null) {
+            int num = selectIds.size();
+            mViewBinding.selectCheckbox.setText("全选(已选择" + num + ")");
+            int size = mListAdapter.getData().size();
+            mViewBinding.selectCheckbox.setChecked(num == size);
+        }
+    }
+
+    private void handleDel() {
+        ArrayList<String> selectIds = mListAdapter.getSelectIds();
+        String ids = Utils.getIds(selectIds);
+        presenter.delWorks(ids);
+    }
+
+    private void showConfirmDialog() {
+        CommonConfirmDialog2 commonConfirmDialog = new CommonConfirmDialog2(getContext());
+        commonConfirmDialog.show();
+        commonConfirmDialog.setTitle("提示");
+        commonConfirmDialog.setContent("确认删除吗?");
+        commonConfirmDialog.setOnConfirmClickListener(new View.OnClickListener() {
+            @Override
+            public void onClick(View v) {
+                commonConfirmDialog.dismiss();
+                handleDel();
+            }
+        });
+        commonConfirmDialog.setOnCancelClickListener(new View.OnClickListener() {
+            @Override
+            public void onClick(View v) {
+                commonConfirmDialog.dismiss();
+            }
+        });
+    }
+
+    private void getData() {
+        if (presenter != null) {
+            presenter.getMyDraftWorks(currentPage);
+        }
+    }
+
+    @Override
+    public void getMyPublishWorkSuccess(int page, MyWorkListBean data) {
+        if (data != null) {
+            if (page == 1) {
+                mViewBinding.refreshLayout.finishRefresh();
+                mListAdapter.getData().clear();
+                mListAdapter.notifyDataSetChanged();
+                if (data.getRows() != null && data.getRows().size() > 0) {
+                    checkHasNext(data.getRows().size());
+                    mListAdapter.setNewInstance(data.getRows());
+                }
+            } else {
+                if (data.getRows() != null && data.getRows().size() > 0) {
+                    mViewBinding.refreshLayout.finishLoadMore();
+                    mListAdapter.addData(data.getRows());
+                    checkHasNext(data.getRows().size());
+                } else {
+                    mViewBinding.refreshLayout.finishLoadMoreWithNoMoreData();
+                }
+            }
+        }
+    }
+
+    @Override
+    public void getMyPublishWorkError(int page) {
+        if (page == 1) {
+            mViewBinding.refreshLayout.finishRefresh();
+        } else {
+            if (mListAdapter != null) {
+                currentPage--;
+                mViewBinding.refreshLayout.finishLoadMore(false);
+            }
+        }
+    }
+
+    @Override
+    public void delSuccess() {
+        if (isDetached()) {
+            return;
+        }
+        mListAdapter.clearAllCheck();
+        ToastUtil.getInstance().showShort("删除成功");
+        updateSelectNum();
+        refreshData();
+    }
+
+    /**
+     * 检查是否还有下一页
+     *
+     * @param dataSize
+     */
+    private void checkHasNext(int dataSize) {
+        hasNext = dataSize >= Constants.DEFAULT_DATA_SIZE;
+        mViewBinding.refreshLayout.setNoMoreData(!hasNext);
+    }
+}

+ 158 - 0
musicMerge/src/main/java/com/cooleshow/musicmerge/ui/work/MyWorkPublishFragment.java

@@ -0,0 +1,158 @@
+package com.cooleshow.musicmerge.ui.work;
+
+import android.view.View;
+
+import com.chad.library.adapter.base.BaseQuickAdapter;
+import com.chad.library.adapter.base.listener.OnItemClickListener;
+import com.cooleshow.base.constanst.Constants;
+import com.cooleshow.base.ui.fragment.BaseMVPFragment;
+import com.cooleshow.base.utils.helper.WebStartHelper;
+import com.cooleshow.base.widgets.EmptyViewLayout;
+import com.cooleshow.musicmerge.adapter.MyWorkListAdapter;
+import com.cooleshow.musicmerge.bean.MyWorkListBean;
+import com.cooleshow.musicmerge.contract.MyWorkContract;
+import com.cooleshow.musicmerge.databinding.FgMyWorkPublishLayoutBinding;
+import com.cooleshow.musicmerge.presenter.work.MyWorkPresenter;
+import com.scwang.smart.refresh.layout.api.RefreshLayout;
+import com.scwang.smart.refresh.layout.listener.OnRefreshListener;
+
+import androidx.annotation.NonNull;
+import androidx.recyclerview.widget.LinearLayoutManager;
+
+/**
+ * Author by pq, Date on 2023/10/30.
+ */
+public class MyWorkPublishFragment extends BaseMVPFragment<FgMyWorkPublishLayoutBinding, MyWorkPresenter> implements MyWorkContract.View {
+
+    private MyWorkListAdapter mListAdapter;
+
+    private int currentPage = 1;
+    private boolean hasNext = true;
+
+    @Override
+    protected FgMyWorkPublishLayoutBinding getLayoutView() {
+        return FgMyWorkPublishLayoutBinding.inflate(getLayoutInflater());
+    }
+
+    @Override
+    protected MyWorkPresenter createPresenter() {
+        return new MyWorkPresenter();
+    }
+
+    @Override
+    protected void initView(View rootView) {
+    }
+
+    @Override
+    protected void initData() {
+        mListAdapter = new MyWorkListAdapter();
+        EmptyViewLayout emptyViewLayout = new EmptyViewLayout(getContext());
+        emptyViewLayout.setContent(com.cooleshow.base.R.drawable.icon_empty_content, "暂无内容");
+        mListAdapter.setEmptyView(emptyViewLayout);
+        mViewBinding.recyclerView.setLayoutManager(new LinearLayoutManager(getContext()));
+        mViewBinding.recyclerView.setAdapter(mListAdapter);
+
+
+        initListener();
+        getData();
+    }
+
+    @Override
+    public void refreshData() {
+        refresh();
+    }
+
+    private void refresh() {
+        currentPage = 1;
+        getData();
+    }
+
+    private void initListener() {
+
+        mListAdapter.setOnItemClickListener(new OnItemClickListener() {
+            @Override
+            public void onItemClick(@NonNull BaseQuickAdapter<?, ?> adapter, @NonNull View view, int position) {
+                if (position < mListAdapter.getData().size()) {
+                    MyWorkListBean.RowsBean rowsBean = mListAdapter.getData().get(position);
+                    WebStartHelper.startMyWorks(rowsBean.getId());
+                }
+            }
+        });
+        mViewBinding.refreshLayout.setOnRefreshListener(new OnRefreshListener() {
+            @Override
+            public void onRefresh(@NonNull RefreshLayout refreshLayout) {
+                refresh();
+            }
+        });
+        mViewBinding.refreshLayout.setOnLoadMoreListener(new com.scwang.smart.refresh.layout.listener.OnLoadMoreListener() {
+            @Override
+            public void onLoadMore(@NonNull RefreshLayout refreshLayout) {
+                //上拉加载
+                if (hasNext) {
+                    currentPage++;
+                    getData();
+                } else {
+                    mViewBinding.refreshLayout.finishLoadMoreWithNoMoreData();
+                }
+            }
+        });
+    }
+
+    private void getData() {
+        if (presenter != null) {
+            presenter.getMyPublishWorks(currentPage);
+        }
+    }
+
+
+    /**
+     * 检查是否还有下一页
+     *
+     * @param dataSize
+     */
+    private void checkHasNext(int dataSize) {
+        hasNext = dataSize >= Constants.DEFAULT_DATA_SIZE;
+        mViewBinding.refreshLayout.setNoMoreData(!hasNext);
+    }
+
+    @Override
+    public void getMyPublishWorkSuccess(int page, MyWorkListBean data) {
+        if (data != null) {
+            if (page == 1) {
+                mViewBinding.refreshLayout.finishRefresh();
+                mListAdapter.getData().clear();
+                mListAdapter.notifyDataSetChanged();
+                if (data.getRows() != null && data.getRows().size() > 0) {
+                    checkHasNext(data.getRows().size());
+                    mListAdapter.setNewInstance(data.getRows());
+                    mViewBinding.recyclerView.scrollToPosition(0);
+                }
+            } else {
+                if (data.getRows() != null && data.getRows().size() > 0) {
+                    mViewBinding.refreshLayout.finishLoadMore();
+                    mListAdapter.addData(data.getRows());
+                    checkHasNext(data.getRows().size());
+                } else {
+                    mViewBinding.refreshLayout.finishLoadMoreWithNoMoreData();
+                }
+            }
+        }
+    }
+
+    @Override
+    public void getMyPublishWorkError(int page) {
+        if (page == 1) {
+            mViewBinding.refreshLayout.finishRefresh();
+        } else {
+            if (mListAdapter != null) {
+                currentPage--;
+                mViewBinding.refreshLayout.finishLoadMore(false);
+            }
+        }
+    }
+
+    @Override
+    public void delSuccess() {
+
+    }
+}

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


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


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


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


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


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


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


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


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


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


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


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

@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="utf-8"?>
+<shape xmlns:android="http://schemas.android.com/apk/res/android">
+    <gradient android:startColor="#2dc7aa"
+        android:endColor="#8077FFEF"/>
+</shape>

+ 6 - 0
musicMerge/src/main/res/drawable/shape_bdffffff_12dp.xml

@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8"?>
+<shape xmlns:android="http://schemas.android.com/apk/res/android">
+    <solid android:color="#ffffff"/>
+    <corners android:radius="12dp"/>
+    <stroke android:color="@color/main_style_color" android:width="1dp"/>
+</shape>

+ 5 - 0
musicMerge/src/main/res/drawable/shape_f8f9fc_top_20dp.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="@color/color_f8f9fc"/>
+    <corners android:topRightRadius="20dp" android:topLeftRadius="20dp"/>
+</shape>

+ 6 - 0
musicMerge/src/main/res/drawable/shape_ff0868_to_ff0303_4dp.xml

@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8"?>
+<shape xmlns:android="http://schemas.android.com/apk/res/android">
+    <gradient android:startColor="#A3ff0868"
+        android:endColor="#A3ff0303"/>
+    <corners android:radius="4dp"/>
+</shape>

+ 142 - 0
musicMerge/src/main/res/layout/ac_my_work_layout.xml

@@ -0,0 +1,142 @@
+<?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"
+    android:layout_width="match_parent"
+    android:layout_height="match_parent"
+    xmlns:tools="http://schemas.android.com/tools">
+
+    <ImageView
+        android:id="@+id/iv_top_bg"
+        android:layout_width="match_parent"
+        android:layout_height="wrap_content"
+        android:adjustViewBounds="true"
+        android:src="@drawable/bg_my_work_top"
+        app:layout_constraintLeft_toLeftOf="parent"
+        app:layout_constraintTop_toTopOf="parent" />
+
+    <View
+        android:id="@+id/view_status_bar"
+        android:layout_width="wrap_content"
+        android:layout_height="1px"
+        app:layout_constraintLeft_toLeftOf="parent"
+        app:layout_constraintTop_toTopOf="parent" />
+
+    <ImageView
+        android:id="@+id/iv_back"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:layout_gravity="center_vertical"
+        android:layout_marginStart="3dp"
+        android:layout_marginTop="11dp"
+        android:padding="15dp"
+        android:src="@drawable/icon_back_black"
+        app:layout_constraintLeft_toLeftOf="parent"
+        app:layout_constraintTop_toBottomOf="@+id/view_status_bar" />
+
+    <View
+        android:layout_width="58dp"
+        android:layout_height="6dp"
+        android:layout_marginStart="1dp"
+        android:background="@drawable/shape_2dc7aa_to_77ffef"
+        app:layout_constraintLeft_toLeftOf="@+id/iv_title_tag"
+        app:layout_constraintTop_toBottomOf="@+id/view_point" />
+
+    <View
+        android:id="@+id/view_point"
+        android:layout_width="1px"
+        android:layout_height="1px"
+        android:layout_marginBottom="2dp"
+        app:layout_constraintBottom_toBottomOf="@+id/iv_title_tag"
+        app:layout_constraintLeft_toLeftOf="@+id/iv_title_tag" />
+
+    <ImageView
+        android:id="@+id/iv_title_tag"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:layout_marginStart="5dp"
+        android:src="@drawable/icon_my_work_title"
+        app:layout_constraintBottom_toBottomOf="@+id/iv_back"
+        app:layout_constraintLeft_toRightOf="@+id/iv_back"
+        app:layout_constraintTop_toTopOf="@+id/iv_back" />
+
+
+    <LinearLayout
+        android:paddingEnd="10dp"
+        android:paddingStart="10dp"
+        tools:visibility="visible"
+        android:visibility="gone"
+        android:orientation="horizontal"
+        android:id="@+id/ll_edit_bg"
+        android:layout_marginEnd="12dp"
+        app:layout_constraintBottom_toBottomOf="@+id/iv_title_tag"
+        app:layout_constraintTop_toTopOf="@+id/iv_title_tag"
+        app:layout_constraintRight_toRightOf="parent"
+        android:background="@drawable/shape_bdffffff_12dp"
+        android:layout_width="wrap_content"
+        android:minWidth="66dp"
+        android:gravity="center"
+        android:layout_height="24dp">
+
+        <ImageView
+            android:src="@drawable/icon_edit_works"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"/>
+
+        <TextView
+            android:id="@+id/tv_edit"
+            android:layout_marginStart="3dp"
+            android:layout_gravity="center"
+            app:layout_constraintBottom_toBottomOf="@+id/view_edit_bg"
+            app:layout_constraintRight_toRightOf="@+id/view_edit_bg"
+            app:layout_constraintLeft_toLeftOf="@+id/view_edit_bg"
+            app:layout_constraintTop_toTopOf="@+id/view_edit_bg"
+            android:text="编辑"
+            android:gravity="center"
+            android:includeFontPadding="false"
+            android:textColor="@color/color_1aa48a"
+            android:textSize="@dimen/sp_14"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"/>
+    </LinearLayout>
+
+
+    <View
+        android:id="@+id/view_tab_bg"
+        android:layout_width="match_parent"
+        android:layout_height="0dp"
+        android:layout_marginTop="168dp"
+        android:background="@drawable/shape_f8f9fc_top_20dp"
+        app:layout_constraintBottom_toBottomOf="@+id/iv_top_bg"
+        app:layout_constraintTop_toTopOf="parent" />
+
+    <com.google.android.material.tabs.TabLayout
+        android:layout_marginTop="15dp"
+        android:id="@+id/tab_layout"
+        android:layout_width="0dp"
+        android:layout_height="31dp"
+        app:layout_constraintLeft_toLeftOf="parent"
+        app:layout_constraintRight_toRightOf="parent"
+        app:layout_constraintTop_toTopOf="@+id/view_tab_bg"
+        app:tabBackground="@color/transparent"
+        app:tabMode="fixed"
+        app:tabIndicator="@drawable/custom_indicator_drawable"
+        app:tabIndicatorColor="@color/colorAccent"
+        app:tabIndicatorFullWidth="false"
+        app:tabIndicatorHeight="4dp"
+        app:tabPaddingEnd="0dp"
+        app:tabPaddingStart="0dp"
+        app:tabGravity="fill"
+        app:tabMaxWidth="0dp"
+        app:tabRippleColor="@color/transparent"
+        app:tabSelectedTextColor="@color/color_333333"
+        app:tabTextColor="@color/color_666666" />
+
+    <androidx.viewpager2.widget.ViewPager2
+        android:id="@+id/viewPager"
+        android:layout_width="match_parent"
+        android:layout_height="0dp"
+        android:overScrollMode="never"
+        android:scrollbars="none"
+        app:layout_constraintBottom_toBottomOf="parent"
+        app:layout_constraintTop_toBottomOf="@+id/tab_layout" />
+</androidx.constraintlayout.widget.ConstraintLayout>

+ 65 - 0
musicMerge/src/main/res/layout/fg_my_work_draft_layout.xml

@@ -0,0 +1,65 @@
+<?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"
+    android:layout_width="match_parent"
+    android:layout_height="match_parent">
+
+    <com.scwang.smart.refresh.layout.SmartRefreshLayout
+        android:id="@+id/refreshLayout"
+        android:layout_width="match_parent"
+        android:layout_height="0dp"
+        app:layout_constraintBottom_toBottomOf="parent"
+        app:layout_constraintBottom_toTopOf="@+id/cs_bottom"
+        app:layout_constraintTop_toTopOf="parent"
+        app:srlEnableLoadMore="true">
+
+        <androidx.recyclerview.widget.RecyclerView
+            android:id="@+id/recyclerView"
+            android:layout_width="match_parent"
+            android:layout_height="match_parent"
+            android:overScrollMode="never"
+            android:scrollbars="none" />
+    </com.scwang.smart.refresh.layout.SmartRefreshLayout>
+
+    <androidx.constraintlayout.widget.ConstraintLayout
+        android:visibility="gone"
+        android:id="@+id/cs_bottom"
+        android:layout_width="match_parent"
+        android:layout_height="80dp"
+        android:background="@color/white"
+        android:elevation="1dp"
+        app:layout_constraintBottom_toBottomOf="parent"
+        app:layout_constraintLeft_toLeftOf="parent">
+
+        <CheckBox
+            android:id="@+id/select_checkbox"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:layout_alignParentLeft="true"
+            android:layout_gravity="center_vertical"
+            android:layout_marginStart="25dp"
+            android:layout_marginTop="21dp"
+            android:button="@drawable/selector_check_bt_20dp_v2"
+            android:paddingStart="12dp"
+            android:text="全选(已选择0)"
+            android:textColor="@color/color_777777"
+            android:textSize="@dimen/sp_14"
+            android:visibility="visible"
+            app:layout_constraintLeft_toLeftOf="parent"
+            app:layout_constraintTop_toTopOf="parent" />
+
+        <TextView
+            android:id="@+id/tv_del"
+            android:layout_width="80dp"
+            android:layout_height="30dp"
+            android:layout_marginTop="15dp"
+            android:layout_marginEnd="12dp"
+            android:background="@drawable/shape_login_bt_bg"
+            android:gravity="center"
+            android:text="删除"
+            android:textColor="@color/white"
+            android:textSize="@dimen/sp_15"
+            app:layout_constraintRight_toRightOf="parent"
+            app:layout_constraintTop_toTopOf="parent" />
+    </androidx.constraintlayout.widget.ConstraintLayout>
+</androidx.constraintlayout.widget.ConstraintLayout>

+ 22 - 0
musicMerge/src/main/res/layout/fg_my_work_publish_layout.xml

@@ -0,0 +1,22 @@
+<?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"
+    android:layout_width="match_parent"
+    android:layout_height="match_parent">
+
+    <com.scwang.smart.refresh.layout.SmartRefreshLayout
+        android:id="@+id/refreshLayout"
+        android:layout_width="match_parent"
+        android:layout_height="0dp"
+        app:layout_constraintBottom_toBottomOf="parent"
+        app:layout_constraintTop_toTopOf="parent"
+        app:srlEnableLoadMore="true">
+
+        <androidx.recyclerview.widget.RecyclerView
+            android:id="@+id/recyclerView"
+            android:layout_width="match_parent"
+            android:layout_height="match_parent"
+            android:overScrollMode="never"
+            android:scrollbars="none" />
+    </com.scwang.smart.refresh.layout.SmartRefreshLayout>
+</androidx.constraintlayout.widget.ConstraintLayout>

+ 88 - 0
musicMerge/src/main/res/layout/item_my_draft_work_layout.xml

@@ -0,0 +1,88 @@
+<?xml version="1.0" encoding="utf-8"?>
+<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
+    android:layout_width="match_parent"
+    xmlns:app="http://schemas.android.com/apk/res-auto"
+    xmlns:tools="http://schemas.android.com/tools"
+    android:layout_marginBottom="12dp"
+    android:layout_marginStart="13dp"
+    android:layout_marginEnd="13dp"
+    android:paddingTop="16dp"
+    android:paddingStart="12dp"
+    android:id="@+id/cs_root"
+    android:paddingEnd="12dp"
+    android:paddingBottom="16dp"
+    android:background="@drawable/shape_16dp_white"
+    android:layout_height="wrap_content">
+
+    <View
+        android:layout_marginStart="7dp"
+        app:layout_constraintLeft_toLeftOf="@+id/iv_icon"
+        app:layout_constraintBottom_toBottomOf="@+id/iv_icon"
+        app:layout_constraintTop_toTopOf="@+id/iv_icon"
+        android:background="@drawable/shape_434343_to_666666_round"
+        android:layout_width="54dp"
+        android:layout_height="54dp"/>
+    
+    <View
+        android:id="@+id/view_select"
+        app:layout_constraintLeft_toLeftOf="parent"
+        app:layout_constraintBottom_toBottomOf="parent"
+        app:layout_constraintTop_toTopOf="parent"
+        android:background="@drawable/selector_check_bt_20dp_v2"
+        android:layout_width="18dp"
+        android:layout_height="18dp"/>
+
+
+    <com.cooleshow.base.widgets.QMUIRadiusImageView
+        android:layout_marginStart="11dp"
+        app:layout_goneMarginStart="0dp"
+        android:layout_width="56dp"
+        app:qmui_corner_radius="5dp"
+        android:id="@+id/iv_icon"
+        android:src="@drawable/icon_default_music_song_cover"
+        app:layout_constraintLeft_toRightOf="@+id/view_select"
+        app:layout_constraintTop_toTopOf="parent"
+        android:layout_height="56dp"/>
+
+    <TextView
+        app:layout_constraintRight_toLeftOf="@+id/iv_play_tag"
+        android:id="@+id/tv_title"
+        tools:text="山茶花读不懂白玫瑰山茶花读不懂白玫瑰山茶花读不懂白玫瑰山茶花读不懂白玫瑰山茶花读不懂白玫瑰"
+        android:textStyle="bold"
+        android:textColor="@color/color_131415"
+        android:layout_marginStart="15dp"
+        android:textSize="@dimen/sp_15"
+        android:layout_marginEnd="5dp"
+        app:layout_constraintBottom_toTopOf="@+id/tv_date"
+        app:layout_constraintTop_toTopOf="@+id/iv_icon"
+        app:layout_constraintLeft_toRightOf="@+id/iv_icon"
+        android:layout_width="0dp"
+        android:maxLines="1"
+        android:ellipsize="end"
+        android:layout_height="wrap_content"/>
+
+
+    <TextView
+        app:layout_constraintBottom_toBottomOf="@+id/iv_icon"
+        android:layout_marginTop="5dp"
+        android:drawableStart="@drawable/icon_my_work_clock"
+        android:includeFontPadding="false"
+        app:layout_constraintLeft_toLeftOf="@+id/tv_title"
+        app:layout_constraintTop_toBottomOf="@+id/tv_title"
+        tools:text="2023-04-20"
+        android:drawablePadding="5dp"
+        android:textColor="@color/color_aaaaaa"
+        android:textSize="@dimen/sp_13"
+        android:id="@+id/tv_date"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"/>
+
+    <ImageView
+        android:id="@+id/iv_play_tag"
+        app:layout_constraintRight_toRightOf="parent"
+        app:layout_constraintBottom_toBottomOf="parent"
+        app:layout_constraintTop_toTopOf="parent"
+        android:src="@drawable/icon_my_work_play"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"/>
+</androidx.constraintlayout.widget.ConstraintLayout>

+ 103 - 0
musicMerge/src/main/res/layout/item_my_work_layout.xml

@@ -0,0 +1,103 @@
+<?xml version="1.0" encoding="utf-8"?>
+<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
+    android:layout_width="match_parent"
+    xmlns:app="http://schemas.android.com/apk/res-auto"
+    xmlns:tools="http://schemas.android.com/tools"
+    android:layout_marginStart="13dp"
+    android:layout_marginBottom="12dp"
+    android:layout_marginEnd="13dp"
+    android:paddingTop="16dp"
+    android:paddingStart="12dp"
+    android:id="@+id/cs_root"
+    android:paddingEnd="12dp"
+    android:paddingBottom="16dp"
+    android:background="@drawable/shape_16dp_white"
+    android:layout_height="wrap_content">
+
+    <View
+        android:layout_marginStart="7dp"
+        app:layout_constraintLeft_toLeftOf="@+id/iv_icon"
+        app:layout_constraintBottom_toBottomOf="@+id/iv_icon"
+        app:layout_constraintTop_toTopOf="@+id/iv_icon"
+        android:background="@drawable/shape_434343_to_666666_round"
+        android:layout_width="54dp"
+        android:layout_height="54dp"/>
+
+
+    <com.cooleshow.base.widgets.QMUIRadiusImageView
+        android:layout_width="56dp"
+        app:qmui_corner_radius="5dp"
+        android:id="@+id/iv_icon"
+        android:src="@drawable/icon_default_music_song_cover"
+        app:layout_constraintLeft_toLeftOf="parent"
+        app:layout_constraintTop_toTopOf="parent"
+        android:layout_height="56dp"/>
+
+    <TextView
+        android:id="@+id/tv_title"
+        tools:text="山茶花读不懂白玫瑰山茶花读不懂白玫瑰山茶花读不懂白玫瑰山茶花读不懂白玫瑰山茶花读不懂白玫瑰"
+        android:textStyle="bold"
+        android:textColor="@color/color_131415"
+        android:layout_marginStart="15dp"
+        android:textSize="@dimen/sp_15"
+        android:layout_marginEnd="5dp"
+        android:maxLines="1"
+        android:ellipsize="end"
+        app:layout_constraintRight_toLeftOf="@+id/iv_play_tag"
+        app:layout_constraintBottom_toTopOf="@+id/ll_likes"
+        app:layout_constraintTop_toTopOf="@+id/iv_icon"
+        app:layout_constraintLeft_toRightOf="@+id/iv_icon"
+        android:layout_width="0dp"
+        android:layout_height="wrap_content"/>
+
+    <LinearLayout
+        android:gravity="center_vertical"
+        android:id="@+id/ll_likes"
+        android:paddingStart="3dp"
+        android:paddingEnd="3dp"
+        app:layout_constraintBottom_toBottomOf="@+id/iv_icon"
+        app:layout_constraintLeft_toLeftOf="@+id/tv_title"
+        app:layout_constraintTop_toBottomOf="@+id/tv_title"
+        android:background="@drawable/shape_ff0868_to_ff0303_4dp"
+        android:layout_width="wrap_content"
+        android:layout_height="17dp">
+        <ImageView
+            android:src="@drawable/icon_my_work_likes"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"/>
+
+        <TextView
+            android:layout_marginStart="2dp"
+            android:textStyle="bold"
+            android:text="0"
+            android:includeFontPadding="false"
+            android:textSize="@dimen/sp_12"
+            android:textColor="@color/white"
+            android:id="@+id/tv_likes_num"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"/>
+    </LinearLayout>
+
+
+    <TextView
+        android:includeFontPadding="false"
+        android:paddingStart="9dp"
+        app:layout_constraintLeft_toRightOf="@+id/ll_likes"
+        app:layout_constraintBottom_toBottomOf="@+id/ll_likes"
+        app:layout_constraintTop_toTopOf="@+id/ll_likes"
+        tools:text="2023-04-20"
+        android:textColor="@color/color_aaaaaa"
+        android:textSize="@dimen/sp_13"
+        android:id="@+id/tv_date"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"/>
+
+    <ImageView
+        android:id="@+id/iv_play_tag"
+        app:layout_constraintRight_toRightOf="parent"
+        app:layout_constraintBottom_toBottomOf="parent"
+        app:layout_constraintTop_toTopOf="parent"
+        android:src="@drawable/icon_my_work_play"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"/>
+</androidx.constraintlayout.widget.ConstraintLayout>

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

@@ -4,5 +4,6 @@
     <color name="color_131415">#131415</color>
     <color name="color_8f8f8f">#8F8F8F</color>
     <color name="color_48494b">#48494B</color>
+    <color name="color_1aa48a">#1AA48A</color>
 </resources>
 

+ 1 - 0
student/build.gradle

@@ -126,6 +126,7 @@ dependencies {
     implementation project(path: ':tclive')
     implementation project(path: ':classRoom')
     implementation project(path: ':institution')
+    implementation project(path: ':musicMerge')
     implementation "com.alibaba:arouter-api:$rootProject.ext.android.arouter_api_version"
     kapt "com.alibaba:arouter-compiler:$rootProject.ext.android.arouter_api_version"
 

+ 7 - 0
student/src/main/java/com/cooleshow/student/ui/main/MineFragment.java

@@ -185,6 +185,12 @@ public class MineFragment extends BaseMVPFragment<FragmentMineLayoutBinding, Min
                 //活动领奖
                 WebStartHelper.startAwardPage();
                 break;
+
+            case R.id.ll_my_works:
+                //我的作品
+                ARouter.getInstance().build(RouterPath.Homework.MY_WORK)
+                        .navigation();
+                break;
         }
     }
 
@@ -239,6 +245,7 @@ public class MineFragment extends BaseMVPFragment<FragmentMineLayoutBinding, Min
         mViewBinding.llMineHomework.setOnClickListener(this);
         mViewBinding.llMineCourse.setOnClickListener(this);
         mViewBinding.llMeterRecords.setOnClickListener(this);
+        mViewBinding.llMyWorks.setOnClickListener(this);
 
         mViewBinding.ivOrder.setOnClickListener(this);
         mViewBinding.tvOrderTitle.setOnClickListener(this);

BIN
student/src/main/res/drawable-xhdpi/icon_mine_works.png


BIN
student/src/main/res/drawable-xxhdpi/icon_mine_works.png


+ 5 - 7
student/src/main/res/layout/fragment_mine_layout.xml

@@ -469,25 +469,23 @@
                 </LinearLayout>
 
                 <LinearLayout
-                    android:id="@+id/ll_goods_order"
+                    android:id="@+id/ll_my_works"
                     android:layout_width="0dp"
                     android:layout_height="match_parent"
-                    android:layout_marginRight="20dp"
                     android:layout_weight="1"
                     android:gravity="center"
-                    android:orientation="vertical"
-                    android:visibility="gone">
+                    android:orientation="vertical">
 
                     <ImageView
                         android:layout_width="@dimen/dp_33"
-                        android:layout_height="@dimen/dp_35"
-                        android:background="@drawable/icon_mine_goods_order" />
+                        android:layout_height="@dimen/dp_33"
+                        android:background="@drawable/icon_mine_works" />
 
                     <TextView
                         android:layout_width="wrap_content"
                         android:layout_height="wrap_content"
                         android:layout_marginTop="9dp"
-                        android:text="商品订单"
+                        android:text="我的作品"
                         android:textColor="@color/color_333333"
                         android:textSize="@dimen/sp_11" />
                 </LinearLayout>

+ 7 - 0
teacher/src/main/java/com/cooleshow/teacher/ui/main/MineFragment.java

@@ -450,6 +450,13 @@ public class MineFragment extends BaseMVPFragment<FragmentMineLayoutBinding, Min
             WebStartHelper.startMineFavorite();
             return;
         }
+
+        if (TextUtils.equals(type, MineFragmentToolsHelper.TYPE_MINE_WORKS)) {
+            //我的作品
+            ARouter.getInstance().build(RouterPath.Homework.MY_WORK)
+                    .navigation();
+            return;
+        }
     }
 
     private void goStyle() {

+ 4 - 3
teacher/src/main/java/com/cooleshow/teacher/widgets/helper/MineFragmentToolsHelper.java

@@ -20,13 +20,14 @@ public class MineFragmentToolsHelper {
     public static final String TYPE_MINE_COURSE = "COURSE";//我的课程
     public static final String TYPE_MINE_COUPON = "COUPON";//我的优惠券
     public static final String TYPE_MINE_UPLOAD_MUSIC_SHEET = "TYPE_MINE_UPLOAD_MUSIC_SHEET";//上传曲谱
+    public static final String TYPE_MINE_WORKS = "TYPE_MINE_WORKS";//我的作品
     public static final String[] TYPES = new String[]{TYPE_MINE_HOME_PAGE, TYPE_MINE_INCOME,
-            TYPE_MINE_STYLE, TYPE_MINE_GOODS_ORDER, TYPE_MINE_COURSE, TYPE_MINE_COUPON,TYPE_MINE_MUSIC_SHEET,TYPE_MINE_UPLOAD_MUSIC_SHEET};
+            TYPE_MINE_STYLE, TYPE_MINE_GOODS_ORDER, TYPE_MINE_COURSE, TYPE_MINE_COUPON,TYPE_MINE_MUSIC_SHEET,TYPE_MINE_UPLOAD_MUSIC_SHEET,TYPE_MINE_WORKS};
     public static final String[] TITLES = new String[]{"我的主页", "我的收入",
-            "个人风采", "商品订单", "我的课程", "我的优惠券","我的乐谱","上传乐谱"};
+            "个人风采", "商品订单", "我的课程", "我的优惠券","我的乐谱","上传乐谱","我的作品"};
     public static final int[] ICON_DRAWABLES = new int[]{R.drawable.icon_mine_page, R.drawable.icon_mine_income,
             R.drawable.icon_mine_style, R.drawable.icon_goods_order
-            , R.drawable.icon_mine_course, R.drawable.icon_mine_coupon,R.drawable.icon_mine_sheet_music, R.drawable.icon_mine_upload_music_sheet};
+            , R.drawable.icon_mine_course, R.drawable.icon_mine_coupon,R.drawable.icon_mine_sheet_music, R.drawable.icon_mine_upload_music_sheet,R.drawable.icon_mine_works};
 
     public static ArrayList<MineToolMenuBean> getData(String... filterDatas) {
         ArrayList<MineToolMenuBean> list = new ArrayList<>();

BIN
teacher/src/main/res/drawable-xhdpi/icon_mine_works.png


BIN
teacher/src/main/res/drawable-xxhdpi/icon_mine_works.png


Some files were not shown because too many files changed in this diff