Browse Source

增加机构端首页专辑切换效果

Pq 1 year ago
parent
commit
72a4eba6e1
36 changed files with 1268 additions and 25 deletions
  1. 1 0
      BaseLibrary/src/main/java/com/cooleshow/base/utils/PopupUtil.java
  2. 1 1
      BaseLibrary/src/main/java/com/cooleshow/base/widgets/BaseDialog.java
  3. 8 0
      BaseLibrary/src/main/res/anim/top_enter_anim2.xml
  4. 9 0
      BaseLibrary/src/main/res/anim/top_exit_anim2.xml
  5. BIN
      BaseLibrary/src/main/res/drawable/bg_loading.9.png
  6. 5 0
      BaseLibrary/src/main/res/values/styles.xml
  7. 55 0
      institution/src/main/java/com/cooleshow/institution/stu/adapter/SwitchAlbumAdapter.java
  8. 14 2
      institution/src/main/java/com/cooleshow/institution/stu/api/APIService.java
  9. 243 0
      institution/src/main/java/com/cooleshow/institution/stu/bean/AlbumDetailBean.java
  10. 221 0
      institution/src/main/java/com/cooleshow/institution/stu/bean/AlbumListBean.java
  11. 2 1
      institution/src/main/java/com/cooleshow/institution/stu/constants/HomePageType.java
  12. 17 0
      institution/src/main/java/com/cooleshow/institution/stu/contract/HomeCardContract.java
  13. 5 1
      institution/src/main/java/com/cooleshow/institution/stu/contract/HomeContract.java
  14. 33 0
      institution/src/main/java/com/cooleshow/institution/stu/presenter/HomeCardPresenter.java
  15. 9 4
      institution/src/main/java/com/cooleshow/institution/stu/presenter/HomePresenter.java
  16. 4 0
      institution/src/main/java/com/cooleshow/institution/stu/ui/main/CardAnimFragment.java
  17. 143 13
      institution/src/main/java/com/cooleshow/institution/stu/ui/main/HomeCardFragment.java
  18. 12 3
      institution/src/main/java/com/cooleshow/institution/stu/ui/main/HomeFragment.java
  19. 98 0
      institution/src/main/java/com/cooleshow/institution/stu/widget/ExpandAndCollapseAnimPopupWindow.java
  20. 224 0
      institution/src/main/java/com/cooleshow/institution/stu/widget/SwitchAlbumView.java
  21. BIN
      institution/src/main/res/drawable-xhdpi/icon_institution_img2.png
  22. BIN
      institution/src/main/res/drawable-xhdpi/jg_icon_selected.png
  23. BIN
      institution/src/main/res/drawable-xhdpi/jg_icon_switch_album_tag.png
  24. BIN
      institution/src/main/res/drawable-xhdpi/jg_icon_switch_album_title.png
  25. BIN
      institution/src/main/res/drawable-xxhdpi/icon_institution_img2.png
  26. BIN
      institution/src/main/res/drawable-xxhdpi/jg_icon_selected.png
  27. BIN
      institution/src/main/res/drawable-xxhdpi/jg_icon_switch_album_tag.png
  28. BIN
      institution/src/main/res/drawable-xxhdpi/jg_icon_switch_album_title.png
  29. 8 0
      institution/src/main/res/drawable/shape_12dp_border_ff608e_1dp.xml
  30. 6 0
      institution/src/main/res/drawable/shape_15ffffff_10dp_border_80ffffff_1dp.xml
  31. 6 0
      institution/src/main/res/drawable/shape_162648_bottom_20dp.xml
  32. 30 0
      institution/src/main/res/layout/fg_home_card_layout.xml
  33. 70 0
      institution/src/main/res/layout/item_switch_album_list_layout.xml
  34. 37 0
      institution/src/main/res/layout/view_switch_album_layout.xml
  35. 3 0
      institution/src/main/res/values/colors.xml
  36. 4 0
      usercenter/src/main/java/com/cooleshow/usercenter/helper/UserHelper.java

+ 1 - 0
BaseLibrary/src/main/java/com/cooleshow/base/utils/PopupUtil.java

@@ -192,6 +192,7 @@ public class PopupUtil {
                 //设置宽高
                 .setWidthAndHeight(width, height)
                 //设置动画
+                .setAnimationStyle(R.style.TopAnimation2)
                 //设置PopupWindow里的子View及点击事件
                 .setViewOnclickListener(new CommonPopupWindow.ViewInterface() {
                     @Override

+ 1 - 1
BaseLibrary/src/main/java/com/cooleshow/base/widgets/BaseDialog.java

@@ -172,7 +172,7 @@ public abstract class BaseDialog extends DialogFragment {
                     break;
                 case Gravity.TOP:
                     if (animStyle == 0) {
-                        animStyle = R.style.TopAnimation;
+                        animStyle = R.style.TopAnimation2;
                     }
                     break;
                 case Gravity.RIGHT:

+ 8 - 0
BaseLibrary/src/main/res/anim/top_enter_anim2.xml

@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="utf-8"?>
+<set xmlns:android="http://schemas.android.com/apk/res/android"
+    android:duration="200">
+
+    <alpha
+        android:fromAlpha="0.0"
+        android:toAlpha="1.0" />
+</set>

+ 9 - 0
BaseLibrary/src/main/res/anim/top_exit_anim2.xml

@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="utf-8"?>
+<set xmlns:android="http://schemas.android.com/apk/res/android"
+    android:duration="200">
+
+    <alpha
+        android:duration="@android:integer/config_mediumAnimTime"
+        android:fromAlpha="1.0"
+        android:toAlpha="0.3" />
+</set>

BIN
BaseLibrary/src/main/res/drawable/bg_loading.9.png


+ 5 - 0
BaseLibrary/src/main/res/values/styles.xml

@@ -228,6 +228,11 @@
         <item name="android:windowExitAnimation">@anim/top_exit_anim</item>
     </style>
 
+    <style name="TopAnimation2" parent="android:Animation">
+        <item name="android:windowEnterAnimation">@anim/top_enter_anim2</item>
+        <item name="android:windowExitAnimation">@anim/top_exit_anim2</item>
+    </style>
+
     <style name="DialogStyle" parent="@android:style/Theme.Dialog">
         <!-- 背景透明 -->
         <item name="android:windowBackground">@android:color/transparent</item>

+ 55 - 0
institution/src/main/java/com/cooleshow/institution/stu/adapter/SwitchAlbumAdapter.java

@@ -0,0 +1,55 @@
+package com.cooleshow.institution.stu.adapter;
+
+import android.graphics.Color;
+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.institution.stu.R;
+import com.cooleshow.institution.stu.bean.AlbumListBean;
+
+import androidx.annotation.NonNull;
+
+/**
+ * Author by pq, Date on 2024/4/15.
+ */
+public class SwitchAlbumAdapter extends BaseQuickAdapter<AlbumListBean, BaseViewHolder> {
+    private String selectId = "";
+
+    public SwitchAlbumAdapter() {
+        super(R.layout.item_switch_album_list_layout);
+    }
+
+    public void setSelectId(String selectId) {
+        this.selectId = selectId;
+    }
+
+    public void setSelectIdRefresh(String selectId) {
+        this.selectId = selectId;
+        notifyDataSetChanged();
+    }
+
+    @Override
+    protected void convert(@NonNull BaseViewHolder holder, AlbumListBean albumListBean) {
+        holder.setText(R.id.tv_name, albumListBean.getName());
+        String tip = albumListBean.isStatus() ? "到期时间:xxx" : "暂未开通";
+        holder.setText(R.id.tv_des, tip);
+
+        ImageView iv_cover = holder.getView(R.id.iv_cover);
+        GlideImageLoaderUtils.getInstance().loadImage(getContext(), albumListBean.getCoverImg(), iv_cover);
+
+        View cs_root = holder.getView(R.id.cs_root);
+        View iv_select = holder.getView(R.id.iv_select);
+        boolean isSelect = TextUtils.equals(albumListBean.getId(), selectId);
+        if (isSelect) {
+            iv_select.setVisibility(View.VISIBLE);
+            cs_root.setBackgroundResource(R.drawable.shape_15ffffff_10dp_border_80ffffff_1dp);
+        } else {
+            iv_select.setVisibility(View.GONE);
+            cs_root.setBackgroundColor(Color.TRANSPARENT);
+        }
+    }
+}

+ 14 - 2
institution/src/main/java/com/cooleshow/institution/stu/api/APIService.java

@@ -2,6 +2,8 @@ package com.cooleshow.institution.stu.api;
 
 import com.cooleshow.base.data.net.BaseResponse;
 import com.cooleshow.institution.stu.bean.ActivationCodeNumBean;
+import com.cooleshow.institution.stu.bean.AlbumDetailBean;
+import com.cooleshow.institution.stu.bean.AlbumListBean;
 import com.cooleshow.institution.stu.bean.AppHomeBean;
 import com.cooleshow.institution.stu.bean.CountOfUnreadBean;
 import com.cooleshow.institution.stu.bean.HomeAlbumListBean;
@@ -10,6 +12,7 @@ import com.cooleshow.institution.stu.bean.HotAlbumBean;
 import com.cooleshow.institution.stu.bean.SystemMessageBean;
 import com.cooleshow.usercenter.bean.SetDetailBean;
 
+import java.util.ArrayList;
 import java.util.List;
 
 import io.reactivex.rxjava3.core.Observable;
@@ -18,6 +21,7 @@ import retrofit2.http.Body;
 import retrofit2.http.GET;
 import retrofit2.http.POST;
 import retrofit2.http.Path;
+import retrofit2.http.Query;
 
 import static com.cooleshow.base.common.BaseConstant.AUTH_GROUP;
 import static com.cooleshow.base.common.BaseConstant.CMS_SERVER;
@@ -74,8 +78,16 @@ public interface APIService {
      *
      * @return
      */
-    @POST(STUDENT_GROUP + "userTenantAlbumRecord/detail")
-    Observable<BaseResponse<HomeAlbumListBean>> getHomeAlbumList();
+    @GET(STUDENT_GROUP + "tenantGroupAlbum/buyAlbumInfoDetail")
+    Observable<BaseResponse<AlbumDetailBean>> getAlbumDetail(@Query("tenantAlbumId") String tenantAlbumId);
+
+    /**
+     * app首页卡片专辑
+     *
+     * @return
+     */
+    @GET(STUDENT_GROUP + "tenantGroupAlbum/buyAlbumInfo")
+    Observable<BaseResponse<ArrayList<AlbumListBean>>> getHomeAllAlbumList();
 
     /**
      * 获取所有消息列表

+ 243 - 0
institution/src/main/java/com/cooleshow/institution/stu/bean/AlbumDetailBean.java

@@ -0,0 +1,243 @@
+package com.cooleshow.institution.stu.bean;
+
+/**
+ * Author by pq, Date on 2024/4/16.
+ */
+public class AlbumDetailBean {
+
+
+    /**
+     * actualPrice : 0.01
+     * buyTimes : 0
+     * buyTimesFlag : false
+     * buyedTimes : 0
+     * coursewareCounts : 0
+     * coverImg : https://oss.dayaedu.com/klx/1706261552667music_bg.png
+     * describe : 避光咋没有避光咋没有避光咋没有避光咋没有避光咋没有避光咋没有
+     * ensembleCounts : 6
+     * expireTime : 2051-06-16 23:59:59
+     * id : 11
+     * musicCounts : 2
+     * musicNum : 10
+     * name : 避光咋没有
+     * originalPrice : 222.0
+     * purchaseJson : [{"type": "MONTH", "price": "1"}, {"type": "QUARTERLY", "price": "2"}, {"type": "YEAR_HALF", "price": "3"}, {"type": "YEAR", "price": "4"}]
+     * purchaseNum : 9999
+     * purchasePeriod : DAY
+     * purchaseTypes : MONTH,QUARTERLY,YEAR_HALF,YEAR
+     * status : true
+     * subjectCounts : 2
+     * subjectTypes : SUBJECT,MUSIC,ENSEMBLE
+     * tenantGroupAlbumId : 19
+     * tenantGroupId : 23
+     */
+
+    private String actualPrice;
+    private String buyTimes;
+    private boolean buyTimesFlag;
+    private String buyedTimes;
+    private int coursewareCounts;
+    private String coverImg;
+    private String describe;
+    private int ensembleCounts;
+    private String expireTime;
+    private String id;
+    private int musicCounts;
+    private int musicNum;
+    private String name;
+    private String originalPrice;
+    private String purchaseJson;
+    private int purchaseNum;
+    private String purchasePeriod;
+    private String purchaseTypes;
+    private boolean status;
+    private int subjectCounts;
+    private String subjectTypes;
+    private String tenantGroupAlbumId;
+    private String tenantGroupId;
+
+
+    public String getActualPrice() {
+        return actualPrice;
+    }
+
+    public void setActualPrice(String actualPrice) {
+        this.actualPrice = actualPrice;
+    }
+
+    public String getBuyTimes() {
+        return buyTimes;
+    }
+
+    public void setBuyTimes(String buyTimes) {
+        this.buyTimes = buyTimes;
+    }
+
+    public boolean isBuyTimesFlag() {
+        return buyTimesFlag;
+    }
+
+    public void setBuyTimesFlag(boolean buyTimesFlag) {
+        this.buyTimesFlag = buyTimesFlag;
+    }
+
+    public String getBuyedTimes() {
+        return buyedTimes;
+    }
+
+    public void setBuyedTimes(String buyedTimes) {
+        this.buyedTimes = buyedTimes;
+    }
+
+    public int getCoursewareCounts() {
+        return coursewareCounts;
+    }
+
+    public void setCoursewareCounts(int coursewareCounts) {
+        this.coursewareCounts = coursewareCounts;
+    }
+
+    public String getCoverImg() {
+        return coverImg;
+    }
+
+    public void setCoverImg(String coverImg) {
+        this.coverImg = coverImg;
+    }
+
+    public String getDescribe() {
+        return describe;
+    }
+
+    public void setDescribe(String describe) {
+        this.describe = describe;
+    }
+
+    public int getEnsembleCounts() {
+        return ensembleCounts;
+    }
+
+    public void setEnsembleCounts(int ensembleCounts) {
+        this.ensembleCounts = ensembleCounts;
+    }
+
+    public String getExpireTime() {
+        return expireTime;
+    }
+
+    public void setExpireTime(String expireTime) {
+        this.expireTime = expireTime;
+    }
+
+    public String getId() {
+        return id;
+    }
+
+    public void setId(String id) {
+        this.id = id;
+    }
+
+    public int getMusicCounts() {
+        return musicCounts;
+    }
+
+    public void setMusicCounts(int musicCounts) {
+        this.musicCounts = musicCounts;
+    }
+
+    public int getMusicNum() {
+        return musicNum;
+    }
+
+    public void setMusicNum(int musicNum) {
+        this.musicNum = musicNum;
+    }
+
+    public String getName() {
+        return name;
+    }
+
+    public void setName(String name) {
+        this.name = name;
+    }
+
+    public String getOriginalPrice() {
+        return originalPrice;
+    }
+
+    public void setOriginalPrice(String originalPrice) {
+        this.originalPrice = originalPrice;
+    }
+
+    public String getPurchaseJson() {
+        return purchaseJson;
+    }
+
+    public void setPurchaseJson(String purchaseJson) {
+        this.purchaseJson = purchaseJson;
+    }
+
+    public int getPurchaseNum() {
+        return purchaseNum;
+    }
+
+    public void setPurchaseNum(int purchaseNum) {
+        this.purchaseNum = purchaseNum;
+    }
+
+    public String getPurchasePeriod() {
+        return purchasePeriod;
+    }
+
+    public void setPurchasePeriod(String purchasePeriod) {
+        this.purchasePeriod = purchasePeriod;
+    }
+
+    public String getPurchaseTypes() {
+        return purchaseTypes;
+    }
+
+    public void setPurchaseTypes(String purchaseTypes) {
+        this.purchaseTypes = purchaseTypes;
+    }
+
+    public boolean isStatus() {
+        return status;
+    }
+
+    public void setStatus(boolean status) {
+        this.status = status;
+    }
+
+    public int getSubjectCounts() {
+        return subjectCounts;
+    }
+
+    public void setSubjectCounts(int subjectCounts) {
+        this.subjectCounts = subjectCounts;
+    }
+
+    public String getSubjectTypes() {
+        return subjectTypes;
+    }
+
+    public void setSubjectTypes(String subjectTypes) {
+        this.subjectTypes = subjectTypes;
+    }
+
+    public String getTenantGroupAlbumId() {
+        return tenantGroupAlbumId;
+    }
+
+    public void setTenantGroupAlbumId(String tenantGroupAlbumId) {
+        this.tenantGroupAlbumId = tenantGroupAlbumId;
+    }
+
+    public String getTenantGroupId() {
+        return tenantGroupId;
+    }
+
+    public void setTenantGroupId(String tenantGroupId) {
+        this.tenantGroupId = tenantGroupId;
+    }
+}

+ 221 - 0
institution/src/main/java/com/cooleshow/institution/stu/bean/AlbumListBean.java

@@ -0,0 +1,221 @@
+package com.cooleshow.institution.stu.bean;
+
+/**
+ * Author by pq, Date on 2024/4/15.
+ */
+public class AlbumListBean {
+
+    /**
+     * actualPrice : 3.0
+     * buyTimes : 0
+     * buyTimesFlag : false
+     * buyedTimes : 0
+     * coverImg : https://oss.dayaedu.com/klx/17061480275427f90d4994e1d56c51db20d0d6ccb7579.jpeg
+     * describe : 测试2测试22222
+     * ensembleCounts : 0
+     * id : 9
+     * musicCounts : 0
+     * musicNum : 10
+     * name : 测试2222
+     * originalPrice : 3.0
+     * purchaseJson : [{"type": "MONTH", "price": "0.01"}, {"type": "QUARTERLY", "price": "2"}, {"type": "YEAR_HALF", "price": "0.01"}, {"type": "YEAR", "price": "4"}]
+     * purchaseNum : 22
+     * purchasePeriod : DAY
+     * purchaseTypes : MONTH,YEAR_HALF,YEAR,QUARTERLY
+     * status : false
+     * subjectCounts : 10
+     * subjectTypes : SUBJECT
+     * tenantGroupAlbumId : 2
+     * tenantGroupId : 23
+     */
+
+    private double actualPrice;
+    private String buyTimes;
+    private boolean buyTimesFlag;
+    private String buyedTimes;
+    private String coverImg;
+    private String describe;
+    private String ensembleCounts;
+    private String id;
+    private String musicCounts;
+    private String musicNum;
+    private String name;
+    private double originalPrice;
+    private String purchaseJson;
+    private String purchaseNum;
+    private String purchasePeriod;
+    private String purchaseTypes;
+    private boolean status;
+    private int subjectCounts;
+    private String subjectTypes;
+    private String tenantGroupAlbumId;
+    private String tenantGroupId;
+
+    public double getActualPrice() {
+        return actualPrice;
+    }
+
+    public void setActualPrice(double actualPrice) {
+        this.actualPrice = actualPrice;
+    }
+
+    public String getBuyTimes() {
+        return buyTimes;
+    }
+
+    public void setBuyTimes(String buyTimes) {
+        this.buyTimes = buyTimes;
+    }
+
+    public boolean isBuyTimesFlag() {
+        return buyTimesFlag;
+    }
+
+    public void setBuyTimesFlag(boolean buyTimesFlag) {
+        this.buyTimesFlag = buyTimesFlag;
+    }
+
+    public String getBuyedTimes() {
+        return buyedTimes;
+    }
+
+    public void setBuyedTimes(String buyedTimes) {
+        this.buyedTimes = buyedTimes;
+    }
+
+    public String getCoverImg() {
+        return coverImg;
+    }
+
+    public void setCoverImg(String coverImg) {
+        this.coverImg = coverImg;
+    }
+
+    public String getDescribe() {
+        return describe;
+    }
+
+    public void setDescribe(String describe) {
+        this.describe = describe;
+    }
+
+    public String getEnsembleCounts() {
+        return ensembleCounts;
+    }
+
+    public void setEnsembleCounts(String ensembleCounts) {
+        this.ensembleCounts = ensembleCounts;
+    }
+
+    public String getId() {
+        return id;
+    }
+
+    public void setId(String id) {
+        this.id = id;
+    }
+
+    public String getMusicCounts() {
+        return musicCounts;
+    }
+
+    public void setMusicCounts(String musicCounts) {
+        this.musicCounts = musicCounts;
+    }
+
+    public String getMusicNum() {
+        return musicNum;
+    }
+
+    public void setMusicNum(String musicNum) {
+        this.musicNum = musicNum;
+    }
+
+    public String getName() {
+        return name;
+    }
+
+    public void setName(String name) {
+        this.name = name;
+    }
+
+    public double getOriginalPrice() {
+        return originalPrice;
+    }
+
+    public void setOriginalPrice(double originalPrice) {
+        this.originalPrice = originalPrice;
+    }
+
+    public String getPurchaseJson() {
+        return purchaseJson;
+    }
+
+    public void setPurchaseJson(String purchaseJson) {
+        this.purchaseJson = purchaseJson;
+    }
+
+    public String getPurchaseNum() {
+        return purchaseNum;
+    }
+
+    public void setPurchaseNum(String purchaseNum) {
+        this.purchaseNum = purchaseNum;
+    }
+
+    public String getPurchasePeriod() {
+        return purchasePeriod;
+    }
+
+    public void setPurchasePeriod(String purchasePeriod) {
+        this.purchasePeriod = purchasePeriod;
+    }
+
+    public String getPurchaseTypes() {
+        return purchaseTypes;
+    }
+
+    public void setPurchaseTypes(String purchaseTypes) {
+        this.purchaseTypes = purchaseTypes;
+    }
+
+    public boolean isStatus() {
+        return status;
+    }
+
+    public void setStatus(boolean status) {
+        this.status = status;
+    }
+
+    public int getSubjectCounts() {
+        return subjectCounts;
+    }
+
+    public void setSubjectCounts(int subjectCounts) {
+        this.subjectCounts = subjectCounts;
+    }
+
+    public String getSubjectTypes() {
+        return subjectTypes;
+    }
+
+    public void setSubjectTypes(String subjectTypes) {
+        this.subjectTypes = subjectTypes;
+    }
+
+    public String getTenantGroupAlbumId() {
+        return tenantGroupAlbumId;
+    }
+
+    public void setTenantGroupAlbumId(String tenantGroupAlbumId) {
+        this.tenantGroupAlbumId = tenantGroupAlbumId;
+    }
+
+    public String getTenantGroupId() {
+        return tenantGroupId;
+    }
+
+    public void setTenantGroupId(String tenantGroupId) {
+        this.tenantGroupId = tenantGroupId;
+    }
+}

+ 2 - 1
institution/src/main/java/com/cooleshow/institution/stu/constants/HomePageType.java

@@ -7,7 +7,8 @@ public enum HomePageType {
     EMPTY(0,""),//暂无声部训练
     SUBJECT_PRACTICE(1,"SUBJECT"),//声部练习
     ALL_PRACTICE(2,"ENSEMBLE"),//合奏练习
-    TRACK_LIST(3,"MUSIC");//独奏曲目
+    TRACK_LIST(3,"MUSIC"),//独奏曲目
+    ACCOMPANY_HELP(4,"ACCOMPANY_HELP");//云教程
     private int value;
     private String type;
 

+ 17 - 0
institution/src/main/java/com/cooleshow/institution/stu/contract/HomeCardContract.java

@@ -0,0 +1,17 @@
+package com.cooleshow.institution.stu.contract;
+
+import com.cooleshow.base.presenter.view.BaseView;
+import com.cooleshow.institution.stu.bean.AlbumDetailBean;
+import com.cooleshow.institution.stu.bean.AlbumListBean;
+
+import java.util.ArrayList;
+
+/**
+ * Author by pq, Date on 2023/9/11.
+ */
+public interface HomeCardContract {
+    public interface HomeContractView extends BaseView{
+
+        void getHomeAlbumDetailSuccess(AlbumDetailBean data);
+    }
+}

+ 5 - 1
institution/src/main/java/com/cooleshow/institution/stu/contract/HomeContract.java

@@ -1,15 +1,19 @@
 package com.cooleshow.institution.stu.contract;
 
 import com.cooleshow.base.presenter.view.BaseView;
+import com.cooleshow.institution.stu.bean.AlbumDetailBean;
+import com.cooleshow.institution.stu.bean.AlbumListBean;
 import com.cooleshow.institution.stu.bean.HomeAlbumListBean;
 
+import java.util.ArrayList;
+
 /**
  * Author by pq, Date on 2023/9/11.
  */
 public interface HomeContract {
     public interface HomeContractView extends BaseView{
 
-        void getHomeAlbumListSuccess(HomeAlbumListBean data);
+        void getAllAlbumListSuccess(ArrayList<AlbumListBean> data);
 
     }
 }

+ 33 - 0
institution/src/main/java/com/cooleshow/institution/stu/presenter/HomeCardPresenter.java

@@ -0,0 +1,33 @@
+package com.cooleshow.institution.stu.presenter;
+
+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.institution.stu.api.APIService;
+import com.cooleshow.institution.stu.bean.AlbumDetailBean;
+import com.cooleshow.institution.stu.bean.AppHomeBean;
+import com.cooleshow.institution.stu.bean.HomeHotMusicSheetBean;
+import com.cooleshow.institution.stu.bean.HotAlbumBean;
+import com.cooleshow.institution.stu.contract.HomeCardContract;
+import com.cooleshow.institution.stu.contract.HomeContract;
+import com.cooleshow.institution.stu.contract.HomeMusicContract;
+
+import org.json.JSONException;
+import org.json.JSONObject;
+
+/**
+ * Author by pq, Date on 2023/9/11.
+ */
+public class HomeCardPresenter extends BasePresenter<HomeCardContract.HomeContractView> {
+    public void getAlbumList(String id) {
+        addSubscribe(create(APIService.class).getAlbumDetail(id), new BaseObserver<AlbumDetailBean>(getView()) {
+            @Override
+            protected void onSuccess(AlbumDetailBean data) {
+                if (null != getView()) {
+                    getView().getHomeAlbumDetailSuccess(data);
+                }
+            }
+        });
+    }
+}

+ 9 - 4
institution/src/main/java/com/cooleshow/institution/stu/presenter/HomePresenter.java

@@ -4,6 +4,8 @@ import com.cooleshow.base.presenter.BasePresenter;
 import com.cooleshow.base.rx.BaseObserver;
 import com.cooleshow.base.utils.RequestBodyUtil;
 import com.cooleshow.institution.stu.api.APIService;
+import com.cooleshow.institution.stu.bean.AlbumDetailBean;
+import com.cooleshow.institution.stu.bean.AlbumListBean;
 import com.cooleshow.institution.stu.bean.HomeAlbumListBean;
 import com.cooleshow.institution.stu.bean.HomeHotMusicSheetBean;
 import com.cooleshow.institution.stu.contract.HomeContract;
@@ -11,16 +13,19 @@ import com.cooleshow.institution.stu.contract.HomeContract;
 import org.json.JSONException;
 import org.json.JSONObject;
 
+import java.util.ArrayList;
+
 /**
  * Author by pq, Date on 2023/9/11.
  */
 public class HomePresenter extends BasePresenter<HomeContract.HomeContractView> {
-    public void getAlbumList() {
-        addSubscribe(create(APIService.class).getHomeAlbumList(), new BaseObserver<HomeAlbumListBean>(getView()) {
+
+    public void getAllAlbumList() {
+        addSubscribe(create(APIService.class).getHomeAllAlbumList(), new BaseObserver<ArrayList<AlbumListBean>>(getView()) {
             @Override
-            protected void onSuccess(HomeAlbumListBean data) {
+            protected void onSuccess(ArrayList<AlbumListBean> data) {
                 if (null != getView()) {
-                    getView().getHomeAlbumListSuccess(data);
+                    getView().getAllAlbumListSuccess(data);
                 }
             }
         });

+ 4 - 0
institution/src/main/java/com/cooleshow/institution/stu/ui/main/CardAnimFragment.java

@@ -79,6 +79,10 @@ public class CardAnimFragment extends BaseFragment<FgCardAnimLayoutBinding> {
         if (pageType == HomePageType.TRACK_LIST.getValue()) {
             assetName = "lottieHome/track_list.json";
         }
+
+        if (pageType == HomePageType.ACCOMPANY_HELP.getValue()) {
+            assetName = "lottieHome/accompany_help.json";
+        }
         mViewBinding.viewLiveAnim.setAnimation(assetName);
         if(isCanPlay){
             mViewBinding.viewLiveAnim.playAnimation();

+ 143 - 13
institution/src/main/java/com/cooleshow/institution/stu/ui/main/HomeCardFragment.java

@@ -1,25 +1,38 @@
 package com.cooleshow.institution.stu.ui.main;
 
+import android.text.TextUtils;
 import android.view.View;
+import android.view.ViewGroup;
+import android.widget.PopupWindow;
 
 import com.cooleshow.base.ui.fragment.BaseFragment;
 import com.cooleshow.base.ui.fragment.BaseMVPFragment;
 import com.cooleshow.base.utils.LOG;
+import com.cooleshow.base.utils.PopupUtil;
 import com.cooleshow.base.utils.SizeUtils;
 import com.cooleshow.base.utils.Utils;
 import com.cooleshow.base.utils.helper.QMUIDeviceHelper;
+import com.cooleshow.chatmodule.ui.ContactPersonListFragment;
 import com.cooleshow.institution.stu.R;
 import com.cooleshow.institution.stu.adapter.HomeCardPageAdapter;
+import com.cooleshow.institution.stu.bean.AlbumDetailBean;
+import com.cooleshow.institution.stu.bean.AlbumListBean;
 import com.cooleshow.institution.stu.bean.HomeAlbumListBean;
 import com.cooleshow.institution.stu.bean.HomePageMode;
 import com.cooleshow.institution.stu.constants.Constants;
 import com.cooleshow.institution.stu.constants.HomePageType;
 import com.cooleshow.institution.stu.constants.JGWebStartHelper;
+import com.cooleshow.institution.stu.contract.HomeCardContract;
+import com.cooleshow.institution.stu.contract.HomeContract;
 import com.cooleshow.institution.stu.databinding.FgHomeCardLayoutBinding;
+import com.cooleshow.institution.stu.presenter.HomeCardPresenter;
 import com.cooleshow.institution.stu.presenter.HomePresenter;
 import com.cooleshow.institution.stu.viewmodel.HomeViewModel;
+import com.cooleshow.institution.stu.widget.ExpandAndCollapseAnimPopupWindow;
 import com.cooleshow.institution.stu.widget.ScaleTransformer;
+import com.cooleshow.institution.stu.widget.SwitchAlbumView;
 import com.cooleshow.usercenter.bean.StudentUserInfo;
+import com.cooleshow.usercenter.helper.UserHelper;
 
 import java.util.ArrayList;
 import java.util.List;
@@ -36,11 +49,10 @@ import androidx.viewpager2.widget.ViewPager2;
 /**
  * Author by pq, Date on 2023/9/11.
  */
-public class HomeCardFragment extends BaseMVPFragment<FgHomeCardLayoutBinding, HomePresenter> implements View.OnClickListener {
-
-
+public class HomeCardFragment extends BaseMVPFragment<FgHomeCardLayoutBinding, HomeCardPresenter> implements View.OnClickListener, HomeCardContract.HomeContractView {
     private HomeCardPageAdapter mCardPageAdapter;
     private HomeViewModel mHomeViewModel;
+    private String defaultAlbumId = "";
 
     private ViewPager2.OnPageChangeCallback mPageChangeCallback = new ViewPager2.OnPageChangeCallback() {
         @Override
@@ -59,6 +71,9 @@ public class HomeCardFragment extends BaseMVPFragment<FgHomeCardLayoutBinding, H
             }
         }
     };
+    private SwitchAlbumView mSwitchAlbumView;
+
+    private ArrayList<AlbumListBean> allAlbumDatas;
 
     @Override
     protected void initView(View rootView) {
@@ -94,6 +109,7 @@ public class HomeCardFragment extends BaseMVPFragment<FgHomeCardLayoutBinding, H
         mViewBinding.viewSearchBg.setOnClickListener(this);
         mViewBinding.ivMoreTrack.setOnClickListener(this);
         mViewBinding.viewPager.registerOnPageChangeCallback(mPageChangeCallback);
+        mViewBinding.tvSwitchAlbum.setOnClickListener(this);
     }
 
     @Override
@@ -102,8 +118,8 @@ public class HomeCardFragment extends BaseMVPFragment<FgHomeCardLayoutBinding, H
     }
 
     @Override
-    protected HomePresenter createPresenter() {
-        return new HomePresenter();
+    protected HomeCardPresenter createPresenter() {
+        return new HomeCardPresenter();
     }
 
     @Override
@@ -123,6 +139,65 @@ public class HomeCardFragment extends BaseMVPFragment<FgHomeCardLayoutBinding, H
             JGWebStartHelper.startSearchBlack();
             return;
         }
+
+        if (id == R.id.tv_switch_album) {
+            showSelectAlbumView();
+            return;
+        }
+    }
+
+    private void showSelectAlbumView() {
+        if (allAlbumDatas == null || allAlbumDatas.size() == 0) {
+            return;
+        }
+        if (mSwitchAlbumView == null) {
+            mSwitchAlbumView = new SwitchAlbumView(getContext());
+        }
+        mSwitchAlbumView.setData(defaultAlbumId, allAlbumDatas);
+        ViewGroup parent = (ViewGroup) mSwitchAlbumView.getParent();
+        if (parent != null) {
+            parent.removeView(mSwitchAlbumView);
+        }
+//        PopupWindow popupWindow = PopupUtil.showInDropWrapNObg(getContext(), mSwitchAlbumView, mViewBinding.viewSelectAlbumAnchor, new PopupUtil.ShowListener() {
+//            @Override
+//            public void onShow(View view, PopupWindow popupWindow) {
+//            }
+//        });
+
+        ExpandAndCollapseAnimPopupWindow popupWindow = new ExpandAndCollapseAnimPopupWindow(mSwitchAlbumView,ViewGroup.LayoutParams.MATCH_PARENT,
+                ViewGroup.LayoutParams.WRAP_CONTENT);
+        popupWindow.setOnEventListener(new ExpandAndCollapseAnimPopupWindow.OnEventListener() {
+            @Override
+            public void preDismiss() {
+                mSwitchAlbumView.showHideAnim();
+            }
+        });
+        popupWindow.showAsDropDown(mViewBinding.viewSelectAlbumAnchor);
+        mSwitchAlbumView.setOnEventListener(new SwitchAlbumView.OnEventListener() {
+            @Override
+            public void onDismiss(boolean isAnimEnd) {
+                if (popupWindow != null) {
+                    popupWindow.setCanDismiss(isAnimEnd);
+                    popupWindow.dismiss();
+                }
+            }
+
+            @Override
+            public void onSelect(AlbumListBean albumListBean) {
+                setDefaultText(albumListBean);
+                //
+                if (popupWindow != null) {
+                    popupWindow.dismiss();
+                }
+            }
+
+        });
+        popupWindow.setOnDismissListener(new PopupWindow.OnDismissListener() {
+            @Override
+            public void onDismiss() {
+            }
+        });
+
     }
 
     public void refreshUserInfo(StudentUserInfo data) {
@@ -135,11 +210,11 @@ public class HomeCardFragment extends BaseMVPFragment<FgHomeCardLayoutBinding, H
         mViewBinding.tvName.setText(data.getTenantName());
     }
 
-    private int currentStatus = -1;
+    private int currentStatus = Constants.HOME_PAGE_STATUS_EMPTY;
     private ArrayList<HomePageType> currentPageTypeList;
 
-    private void load(HomeAlbumListBean data) {
-        int tenantAlbumStatus = data.getTenantAlbumStatus();
+    private void load(AlbumDetailBean data) {
+        int tenantAlbumStatus = data.isStatus() ? Constants.HOME_PAGE_STATUS_HASLOCK : Constants.HOME_PAGE_STATUS_UNLOCK;
         ArrayList<HomePageType> pageList = new ArrayList<>();
         if (data.getSubjectCounts() > 0) {
             //声部训练
@@ -153,6 +228,10 @@ public class HomeCardFragment extends BaseMVPFragment<FgHomeCardLayoutBinding, H
             //合奏训练
             pageList.add(HomePageType.ALL_PRACTICE);
         }
+        if (data.getSubjectCounts() > 0) {
+            //云教程
+            pageList.add(HomePageType.ACCOMPANY_HELP);
+        }
         if (!isNeedRefresh(tenantAlbumStatus, pageList)) {
             return;
         }
@@ -201,16 +280,15 @@ public class HomeCardFragment extends BaseMVPFragment<FgHomeCardLayoutBinding, H
     }
 
     public void refreshAlbumData(HomeAlbumListBean data) {
+    }
+
+    public void refreshAlbumDataV2(AlbumDetailBean data) {
         if (isDetached() || mViewBinding == null) {
             return;
         }
         if (data != null) {
             int cPos = mViewBinding.viewPager.getCurrentItem();
-            if (data.getTenantAlbumStatus() == Constants.HOME_PAGE_STATUS_EMPTY) {
-                loadEmpty(data.getTenantAlbumStatus());
-            } else {
-                load(data);
-            }
+            load(data);
             if (cPos >= mCardPageAdapter.getFragments().size()) {
                 cPos = 0;
             }
@@ -219,4 +297,56 @@ public class HomeCardFragment extends BaseMVPFragment<FgHomeCardLayoutBinding, H
             loadEmpty(Constants.HOME_PAGE_STATUS_EMPTY);
         }
     }
+
+    public void getAllAlbumListSuccess(ArrayList<AlbumListBean> data) {
+        if (data != null && data.size() > 0) {
+            boolean hasMore = data.size() > 1;
+            mViewBinding.tvSwitchAlbum.setVisibility(hasMore ? View.VISIBLE : View.GONE);
+            allAlbumDatas = data;
+            AlbumListBean defaultSelectAlbum = getDefaultSelectAlbum(data);
+            setDefaultText(defaultSelectAlbum);
+        } else {
+            //显示空
+            allAlbumDatas = null;
+            showEmpty();
+        }
+    }
+
+    private void setDefaultText(AlbumListBean defaultSelectAlbum) {
+        this.defaultAlbumId = defaultSelectAlbum.getId();
+        mViewBinding.tvSwitchAlbum.setText(defaultSelectAlbum.getName());
+        presenter.getAlbumList(defaultAlbumId);
+    }
+
+    private AlbumListBean getDefaultSelectAlbum(ArrayList<AlbumListBean> data) {
+        String defaultAlbumId = UserHelper.getCustomCache(UserHelper.DEFAULT_ALBUM_ID);
+        if (TextUtils.isEmpty(defaultAlbumId)) {
+            return data.get(0);
+        }
+        for (int i = 0; i < data.size(); i++) {
+            AlbumListBean albumListBean = data.get(i);
+            if (TextUtils.equals(defaultAlbumId, albumListBean.getId())) {
+                return albumListBean;
+            }
+        }
+        return data.get(0);
+    }
+
+
+    @Override
+    public void getHomeAlbumDetailSuccess(AlbumDetailBean data) {
+        if (isDetached() || mViewBinding == null) {
+            return;
+        }
+        if (data != null) {
+            refreshAlbumDataV2(data);
+        } else {
+            showEmpty();
+        }
+    }
+
+    private void showEmpty() {
+        mViewBinding.tvSwitchAlbum.setVisibility(View.GONE);
+        loadEmpty(Constants.HOME_PAGE_STATUS_EMPTY);
+    }
 }

+ 12 - 3
institution/src/main/java/com/cooleshow/institution/stu/ui/main/HomeFragment.java

@@ -9,6 +9,8 @@ import com.cooleshow.base.ui.fragment.BaseMVPFragment;
 import com.cooleshow.base.utils.LOG;
 import com.cooleshow.chatmodule.ui.ChatFragment;
 import com.cooleshow.institution.stu.adapter.HomePageAdapter;
+import com.cooleshow.institution.stu.bean.AlbumDetailBean;
+import com.cooleshow.institution.stu.bean.AlbumListBean;
 import com.cooleshow.institution.stu.bean.HomeAlbumListBean;
 import com.cooleshow.institution.stu.bean.HomePageMode;
 import com.cooleshow.institution.stu.constants.Constants;
@@ -27,7 +29,7 @@ import androidx.lifecycle.ViewModelProviders;
 /**
  * Author by pq, Date on 2023/9/11.
  */
-public class HomeFragment extends BaseMVPFragment<FgHomeLayoutBinding,HomePresenter> implements HomeContract.HomeContractView {
+public class HomeFragment extends BaseMVPFragment<FgHomeLayoutBinding, HomePresenter> implements HomeContract.HomeContractView {
 
     private HomeCardFragment mHomeCardFragment;
     private HomeMusicFragment mMusicFragment;
@@ -91,7 +93,7 @@ public class HomeFragment extends BaseMVPFragment<FgHomeLayoutBinding,HomePresen
     @Override
     public void onResume() {
         super.onResume();
-        presenter.getAlbumList();
+        presenter.getAllAlbumList();
     }
 
     private void selectPage(int pos) {
@@ -124,10 +126,17 @@ public class HomeFragment extends BaseMVPFragment<FgHomeLayoutBinding,HomePresen
         }
     }
 
-    @Override
     public void getHomeAlbumListSuccess(HomeAlbumListBean data) {
         if (mHomeCardFragment != null) {
             mHomeCardFragment.refreshAlbumData(data);
         }
     }
+
+
+    @Override
+    public void getAllAlbumListSuccess(ArrayList<AlbumListBean> data) {
+        if (mHomeCardFragment != null) {
+            mHomeCardFragment.getAllAlbumListSuccess(data);
+        }
+    }
 }

+ 98 - 0
institution/src/main/java/com/cooleshow/institution/stu/widget/ExpandAndCollapseAnimPopupWindow.java

@@ -0,0 +1,98 @@
+package com.cooleshow.institution.stu.widget;
+
+import android.animation.Animator;
+import android.animation.AnimatorListenerAdapter;
+import android.animation.AnimatorSet;
+import android.animation.ObjectAnimator;
+import android.animation.ValueAnimator;
+import android.content.Context;
+import android.graphics.Rect;
+import android.os.Build;
+import android.view.View;
+import android.view.ViewGroup;
+import android.widget.PopupWindow;
+
+import com.cooleshow.base.utils.DeviceUtils;
+import com.cooleshow.base.utils.Utils;
+import com.cooleshow.base.utils.helper.QMUIStatusBarHelper;
+import com.cooleshow.base.widgets.CommonPopupWindow;
+
+/**
+ * Author by pq, Date on 2024/4/16.
+ */
+public class ExpandAndCollapseAnimPopupWindow extends PopupWindow {
+    private boolean isCanDismiss = false;
+
+    public ExpandAndCollapseAnimPopupWindow(Context context) {
+        super(context);
+
+        init();
+    }
+
+    public ExpandAndCollapseAnimPopupWindow(View contentView, int width, int height) {
+        super(contentView, width, height);
+        init();
+    }
+
+    private void init() {
+        setOutsideTouchable(true);//设置outside可点击
+        setFocusable(true);
+    }
+
+
+    @Override
+    public void dismiss() {
+        if (isCanDismiss) {
+            isCanDismiss = false;
+            super.dismiss();
+        } else {
+            if (mEventListener != null) {
+                mEventListener.preDismiss();
+            }
+        }
+    }
+
+
+    public void setCanDismiss(boolean isCanDismiss) {
+        this.isCanDismiss = isCanDismiss;
+    }
+
+    private OnEventListener mEventListener;
+
+    public void setOnEventListener(OnEventListener onEventListener) {
+        this.mEventListener = onEventListener;
+    }
+
+    public interface OnEventListener {
+        void preDismiss();
+    }
+
+    @Override
+    public void showAsDropDown(View anchor, int xoff, int yoff) {
+        adapterApiV24ForShowAsDropDown(anchor, xoff, yoff);
+    }
+
+    public void adapterApiV24ForShowAsDropDown(View parent, int xoff, int offsetY) {
+
+        if (null == parent) {
+            return;
+        }
+        if (Build.VERSION.SDK_INT >= 24) {
+            Rect visibleFrame = new Rect();
+            parent.getGlobalVisibleRect(visibleFrame);
+            int height;
+            height = DeviceUtils.getWindowVisibleDisplay(getContentView().getContext()) + getStatusBarHeight() - visibleFrame.bottom + Math.abs(offsetY);
+            setHeight(height);
+        }
+        super.showAsDropDown(parent, xoff, offsetY);
+    }
+
+    /**
+     * 获取状态栏高度
+     *
+     * @return
+     */
+    public int getStatusBarHeight() {
+        return QMUIStatusBarHelper.getStatusbarHeight(Utils.getApp());
+    }
+}

+ 224 - 0
institution/src/main/java/com/cooleshow/institution/stu/widget/SwitchAlbumView.java

@@ -0,0 +1,224 @@
+package com.cooleshow.institution.stu.widget;
+
+import android.animation.Animator;
+import android.animation.AnimatorListenerAdapter;
+import android.animation.ObjectAnimator;
+import android.content.Context;
+import android.graphics.Color;
+import android.util.AttributeSet;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.animation.TranslateAnimation;
+import android.widget.FrameLayout;
+import android.widget.TextView;
+
+import com.bigkoo.pickerview.builder.TimePickerBuilder;
+import com.bigkoo.pickerview.listener.CustomListener;
+import com.bigkoo.pickerview.view.TimePickerView;
+import com.chad.library.adapter.base.BaseQuickAdapter;
+import com.chad.library.adapter.base.listener.OnItemClickListener;
+import com.cooleshow.base.constanst.StyleConfig;
+import com.cooleshow.base.utils.DateUtil;
+import com.cooleshow.base.utils.LOG;
+import com.cooleshow.base.utils.ScreenUtils;
+import com.cooleshow.base.utils.ToastUtil;
+import com.cooleshow.base.utils.UiUtils;
+import com.cooleshow.institution.stu.R;
+import com.cooleshow.institution.stu.adapter.SwitchAlbumAdapter;
+import com.cooleshow.institution.stu.bean.AlbumListBean;
+
+import java.util.ArrayList;
+import java.util.Calendar;
+import java.util.Date;
+
+import androidx.annotation.NonNull;
+import androidx.annotation.Nullable;
+import androidx.constraintlayout.widget.ConstraintLayout;
+import androidx.constraintlayout.widget.ConstraintSet;
+import androidx.recyclerview.widget.GridLayoutManager;
+import androidx.recyclerview.widget.LinearLayoutManager;
+import androidx.recyclerview.widget.RecyclerView;
+
+/**
+ * Author by pq, Date on 2023/12/26.
+ */
+public class SwitchAlbumView extends FrameLayout implements View.OnClickListener {
+
+    private RecyclerView mRecyclerView;
+
+    private OnEventListener mEventListener;
+
+
+    private boolean isSelectStart = true;
+    private SwitchAlbumAdapter mAdapter;
+    private ConstraintLayout mCsContent;
+    private ObjectAnimator mShowAnim;
+    private ObjectAnimator mHideAnim;
+    private View mFlRoot;
+
+    public SwitchAlbumView(@NonNull Context context) {
+        this(context, null);
+    }
+
+    public SwitchAlbumView(@NonNull Context context, @Nullable AttributeSet attrs) {
+        this(context, attrs, -1);
+    }
+
+    public SwitchAlbumView(@NonNull Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
+        super(context, attrs, defStyleAttr);
+        init();
+    }
+
+    private void init() {
+        LayoutInflater.from(getContext()).inflate(R.layout.view_switch_album_layout, this);
+        initView();
+        initListener();
+    }
+
+
+    @Override
+    protected void onAttachedToWindow() {
+        super.onAttachedToWindow();
+        if (mCsContent != null) {
+            if (mFlRoot != null) {
+                mFlRoot.setBackgroundColor(getResources().getColor(R.color.color_60000000));
+            }
+            LOG.i("onAttachedToWindow:" + mCsContent.getMeasuredHeight());
+            if (mCsContent.getMeasuredHeight() == 0) {
+                mCsContent.measure(0, 0);
+            }
+            mShowAnim = createShowAnim();
+            mShowAnim.start();
+        }
+    }
+
+
+    private ObjectAnimator createShowAnim() {
+        ObjectAnimator objectAnimator = ObjectAnimator.ofFloat(mCsContent, "translationY", -mCsContent.getMeasuredHeight(), 0f);
+        objectAnimator.setDuration(200);
+        return objectAnimator;
+    }
+
+    private ObjectAnimator createHideAnim() {
+        ObjectAnimator objectAnimator = ObjectAnimator.ofFloat(mCsContent, "translationY", 0f, -mCsContent.getMeasuredHeight());
+        objectAnimator.setDuration(200);
+        return objectAnimator;
+    }
+
+    @Override
+    protected void onDetachedFromWindow() {
+        super.onDetachedFromWindow();
+        LOG.i("onDetachedFromWindow");
+        if (mShowAnim != null) {
+            mShowAnim.cancel();
+            mShowAnim = null;
+        }
+        if (mHideAnim != null) {
+            mHideAnim.cancel();
+            mHideAnim = null;
+        }
+    }
+
+    public void showHideAnim() {
+        if (mFlRoot != null) {
+            mFlRoot.setBackgroundColor(Color.TRANSPARENT);
+        }
+        LOG.i("showHideAnim");
+        mHideAnim = createHideAnim();
+        mHideAnim.addListener(new AnimatorListenerAdapter() {
+            @Override
+            public void onAnimationCancel(Animator animation) {
+                super.onAnimationCancel(animation);
+                if (mEventListener != null) {
+                    mEventListener.onDismiss(true);
+                }
+            }
+
+            @Override
+            public void onAnimationEnd(Animator animation) {
+                super.onAnimationEnd(animation);
+                if (mEventListener != null) {
+                    mEventListener.onDismiss(true);
+                }
+            }
+        });
+        mHideAnim.start();
+    }
+
+    private void initView() {
+
+        mRecyclerView = findViewById(R.id.recyclerView);
+        mCsContent = findViewById(R.id.cs_content);
+
+        ConstraintSet set = new ConstraintSet();
+        set.clone(mCsContent);
+        int maxHeight = (int) (ScreenUtils.getAppScreenHeight() * 0.45);
+        set.constrainMaxHeight(R.id.recyclerView, maxHeight);
+        set.applyTo(mCsContent);
+
+        mFlRoot = findViewById(R.id.fl_root);
+        mFlRoot.setOnClickListener(this);
+        mCsContent.setOnClickListener(this);
+        mAdapter = new SwitchAlbumAdapter();
+        LinearLayoutManager linearLayoutManager = new LinearLayoutManager(getContext());
+        mRecyclerView.setLayoutManager(linearLayoutManager);
+        mRecyclerView.setAdapter(mAdapter);
+    }
+
+    private void initListener() {
+
+        mAdapter.setOnItemClickListener(new OnItemClickListener() {
+            @Override
+            public void onItemClick(@NonNull BaseQuickAdapter<?, ?> adapter, @NonNull View view, int position) {
+                if (position < mAdapter.getData().size()) {
+                    AlbumListBean albumListBean = mAdapter.getData().get(position);
+                    mAdapter.setSelectIdRefresh(albumListBean.getId());
+                    if (mEventListener != null) {
+                        mEventListener.onSelect(albumListBean);
+                    }
+                }
+            }
+        });
+    }
+
+
+    public void setData(String defaultId, ArrayList<AlbumListBean> data) {
+        if (mAdapter != null) {
+            if (data != null && data.size() > 0) {
+                mAdapter.setSelectId(defaultId);
+                mAdapter.setList(data);
+            } else {
+                mAdapter.getData().clear();
+                mAdapter.notifyDataSetChanged();
+            }
+        }
+    }
+
+    @Override
+    public void onClick(View v) {
+        int id = v.getId();
+        if (id == R.id.fl_root) {
+            if (UiUtils.isFastClick(500)) {
+                return;
+            }
+            if (mEventListener != null) {
+                mEventListener.onDismiss(false);
+            }
+            return;
+        }
+        if (id == R.id.cs_content) {
+            return;
+        }
+    }
+
+
+    public void setOnEventListener(OnEventListener onEventListener) {
+        this.mEventListener = onEventListener;
+    }
+
+    public interface OnEventListener {
+        void onDismiss(boolean isAnimEnd);
+
+        void onSelect(AlbumListBean albumListBean);
+    }
+}

BIN
institution/src/main/res/drawable-xhdpi/icon_institution_img2.png


BIN
institution/src/main/res/drawable-xhdpi/jg_icon_selected.png


BIN
institution/src/main/res/drawable-xhdpi/jg_icon_switch_album_tag.png


BIN
institution/src/main/res/drawable-xhdpi/jg_icon_switch_album_title.png


BIN
institution/src/main/res/drawable-xxhdpi/icon_institution_img2.png


BIN
institution/src/main/res/drawable-xxhdpi/jg_icon_selected.png


BIN
institution/src/main/res/drawable-xxhdpi/jg_icon_switch_album_tag.png


BIN
institution/src/main/res/drawable-xxhdpi/jg_icon_switch_album_title.png


+ 8 - 0
institution/src/main/res/drawable/shape_12dp_border_ff608e_1dp.xml

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

+ 6 - 0
institution/src/main/res/drawable/shape_15ffffff_10dp_border_80ffffff_1dp.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="#15ffffff"/>
+    <stroke android:color="#80ffffff" android:width="0.8dp"/>
+    <corners android:radius="10dp"/>
+</shape>

+ 6 - 0
institution/src/main/res/drawable/shape_162648_bottom_20dp.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="@color/color_162648"/>
+    <corners android:bottomLeftRadius="20dp"
+        android:bottomRightRadius="20dp"/>
+</shape>

+ 30 - 0
institution/src/main/res/layout/fg_home_card_layout.xml

@@ -42,6 +42,7 @@
         app:layout_constraintLeft_toLeftOf="parent"
         app:layout_constraintTop_toBottomOf="@+id/view_status_bar" />
 
+
     <TextView
         app:layout_constraintRight_toLeftOf="@+id/iv_more_track"
         android:id="@+id/tv_name"
@@ -60,6 +61,35 @@
         tools:text="满天都是小星星机构满天都是小星星机构满天都是小星星机构" />
 
 
+    <TextView
+        android:maxLength="5"
+        android:id="@+id/tv_switch_album"
+        android:layout_marginEnd="12dp"
+        app:layout_constraintRight_toRightOf="parent"
+        app:layout_constraintBottom_toBottomOf="@+id/tv_name"
+        app:layout_constraintTop_toTopOf="@+id/tv_name"
+        android:gravity="center"
+        android:includeFontPadding="false"
+        android:drawablePadding="4dp"
+        android:textColor="@color/color_ff608e"
+        android:textSize="@dimen/sp_13"
+        tools:text="宫崎骏合集"
+        android:textStyle="bold"
+        android:paddingEnd="8dp"
+        android:paddingStart="8dp"
+        android:background="@drawable/shape_12dp_border_ff608e_1dp"
+        android:drawableEnd="@drawable/jg_icon_switch_album_tag"
+        android:layout_width="wrap_content"
+        android:layout_height="24dp"/>
+
+    <View
+        android:layout_marginTop="15dp"
+        android:id="@+id/view_select_album_anchor"
+        app:layout_constraintLeft_toLeftOf="parent"
+        app:layout_constraintTop_toBottomOf="@+id/tv_name"
+        android:layout_width="1px"
+        android:layout_height="1px"/>
+
     <View
         android:id="@+id/view_search_bg"
         android:layout_width="match_parent"

+ 70 - 0
institution/src/main/res/layout/item_switch_album_list_layout.xml

@@ -0,0 +1,70 @@
+<?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="match_parent"
+    android:id="@+id/cs_root"
+    android:layout_height="wrap_content"
+    android:layout_marginStart="10dp"
+    android:layout_marginEnd="10dp"
+    android:layout_marginBottom="12dp">
+
+    <com.cooleshow.base.widgets.QMUIRadiusImageView
+        android:id="@+id/iv_cover"
+        android:layout_width="48dp"
+        android:layout_height="48dp"
+        app:qmui_corner_radius="8dp"
+        android:layout_marginStart="10dp"
+        android:layout_marginTop="10dp"
+        android:layout_marginBottom="10dp"
+        app:layout_constraintBottom_toBottomOf="parent"
+        app:layout_constraintLeft_toLeftOf="parent"
+        app:layout_constraintTop_toTopOf="parent" />
+
+    <TextView
+        android:id="@+id/tv_name"
+        android:layout_width="0dp"
+        android:layout_height="wrap_content"
+        android:layout_marginStart="10dp"
+        android:layout_marginEnd="20dp"
+        android:ellipsize="end"
+        android:maxLines="1"
+        android:textColor="@color/white"
+        android:textSize="@dimen/sp_15"
+        android:textStyle="bold"
+        app:layout_constraintBottom_toTopOf="@+id/tv_des"
+        app:layout_constraintLeft_toRightOf="@+id/iv_cover"
+        app:layout_constraintRight_toLeftOf="@+id/iv_select"
+        app:layout_constraintTop_toTopOf="@+id/iv_cover"
+        app:layout_constraintVertical_chainStyle="packed"
+        app:layout_goneMarginEnd="10dp"
+        tools:ignore="MissingConstraints"
+        tools:text="宫崎骏合集 | 一起感受宫崎骏的夏…" />
+
+    <TextView
+        android:id="@+id/tv_des"
+        android:layout_width="0dp"
+        android:layout_height="wrap_content"
+        android:layout_marginTop="4dp"
+        android:ellipsize="end"
+        android:maxLines="1"
+        android:textColor="@color/white"
+        android:textSize="@dimen/sp_12"
+        app:layout_constraintBottom_toBottomOf="@+id/iv_cover"
+        app:layout_constraintLeft_toLeftOf="@+id/tv_name"
+        app:layout_constraintRight_toRightOf="@+id/tv_name"
+        app:layout_constraintTop_toBottomOf="@+id/tv_name"
+        tools:ignore="MissingConstraints"
+        tools:text="宫崎骏合集 | 一起感受宫崎骏的夏…" />
+
+    <ImageView
+        android:id="@+id/iv_select"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:layout_marginEnd="10dp"
+        android:src="@drawable/jg_icon_selected"
+        android:visibility="gone"
+        app:layout_constraintBottom_toBottomOf="parent"
+        app:layout_constraintRight_toRightOf="parent"
+        app:layout_constraintTop_toTopOf="parent" />
+</androidx.constraintlayout.widget.ConstraintLayout>

+ 37 - 0
institution/src/main/res/layout/view_switch_album_layout.xml

@@ -0,0 +1,37 @@
+<?xml version="1.0" encoding="utf-8"?>
+<FrameLayout 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:id="@+id/fl_root"
+    android:layout_width="match_parent"
+    android:layout_height="match_parent"
+    android:background="#60000000">
+
+    <androidx.constraintlayout.widget.ConstraintLayout
+        android:id="@+id/cs_content"
+        android:layout_width="match_parent"
+        android:layout_height="wrap_content"
+        android:background="@drawable/shape_162648_bottom_20dp"
+        android:paddingTop="20dp"
+        android:paddingBottom="2dp">
+
+        <ImageView
+            android:layout_marginStart="20dp"
+            android:id="@+id/iv_title"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:src="@drawable/jg_icon_switch_album_title"
+            app:layout_constraintLeft_toLeftOf="parent"
+            app:layout_constraintTop_toTopOf="parent" />
+
+        <androidx.recyclerview.widget.RecyclerView
+            android:layout_marginTop="16dp"
+            android:id="@+id/recyclerView"
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content"
+            android:overScrollMode="never"
+            android:scrollbars="none"
+            app:layout_constraintTop_toBottomOf="@+id/iv_title" />
+
+    </androidx.constraintlayout.widget.ConstraintLayout>
+</FrameLayout>

+ 3 - 0
institution/src/main/res/values/colors.xml

@@ -5,9 +5,12 @@
     <color name="color_121b2e">#121B2E</color>
     <color name="color_131415">#131415</color>
     <color name="color_66000000">#66000000</color>
+    <color name="color_60000000">#60000000</color>
     <color name="color_fe2451">#FE2451</color>
     <color name="color_777777">#777777</color>
     <color name="color_fe2c57">#FE2C57</color>
     <color name="color_f25756">#F25756</color>
     <color name="color_ff4d72">#ff4d72</color>
+    <color name="color_ff608e">#FF608E</color>
+    <color name="color_162648">#162648</color>
 </resources>

+ 4 - 0
usercenter/src/main/java/com/cooleshow/usercenter/helper/UserHelper.java

@@ -34,6 +34,8 @@ public class UserHelper {
     public static final String TENANTID_KEY = "tenantId";
     public static final String TENANTNAME_KEY = "tenantName";
 
+    public static final String DEFAULT_ALBUM_ID = "default_album_id";
+
     /**
      * 获取用户是否同意app隐私协议
      */
@@ -237,6 +239,8 @@ public class UserHelper {
         SPUtils.getInstance().put(USER_PHONE, "");
         //头像
         SPUtils.getInstance().put(USER_AVATAR, "");
+        //机构端默认选中的专辑id
+        SPUtils.getInstance().put(DEFAULT_ALBUM_ID, "");
     }
 
     /**