Sfoglia il codice sorgente

增加学生端首页统计信息和部分跳转逻辑

Pq 6 mesi fa
parent
commit
998ac824d1

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

@@ -1667,6 +1667,20 @@ public final class TimeUtils {
         return date;
     }
 
+    public static long[] getHmsFromSecond(long timeSecond) {
+        long[] result = new long[3];
+        try{
+            result[0] = timeSecond / 3600;
+            timeSecond = timeSecond % 3600;
+            long minute = timeSecond / 60;//得到分
+            result[1] = minute;
+            result[2] = timeSecond % 60;
+        }catch (Exception e){
+            e.printStackTrace();
+        }
+        return result;
+    }
+
     public static String secondToTime(int second) {
 //        int hour = second / 3600; // 得到分钟数
 //        second = second % 3600;//剩余的秒数

+ 9 - 0
student/src/main/java/com/cooleshow/student/api/APIService.java

@@ -22,6 +22,7 @@ import com.cooleshow.student.bean.HelpCenterContentBean;
 import com.cooleshow.student.bean.HomeHotMusicSheetBean;
 import com.cooleshow.student.bean.HomeHotNewsBean;
 import com.cooleshow.student.bean.HomeLiveAndVideoBean;
+import com.cooleshow.student.bean.HomeStatisticsInfoBean;
 import com.cooleshow.student.bean.HomeStyleBean;
 import com.cooleshow.student.bean.HomeworkDetailBean;
 import com.cooleshow.student.bean.HomeworkListBean;
@@ -598,4 +599,12 @@ public interface APIService {
      */
     @POST(STUDENT_GROUP + "courseSchedule/list")
     Observable<BaseResponse<ArrayList<VIPCourseGroupDetailListBean>>> getCourseGroupCourseList(@Body RequestBody body);
+
+    /**
+     * 学生-首页-数据汇总
+     *
+     * @return
+     */
+    @GET(STUDENT_GROUP + "index/summary")
+    Observable<BaseResponse<HomeStatisticsInfoBean>> getPracticeAndCourseInfo();
 }

+ 41 - 0
student/src/main/java/com/cooleshow/student/bean/HomeStatisticsInfoBean.java

@@ -0,0 +1,41 @@
+package com.cooleshow.student.bean;
+
+/**
+ * Author by pq, Date on 2024/11/27.
+ */
+public class HomeStatisticsInfoBean {
+
+    /**
+     * courseCount : 0
+     * recordTime : 0
+     * totalCourseCount : 0
+     */
+
+    private String courseCount;
+    private long recordTime;
+    private String totalCourseCount;
+
+    public String getCourseCount() {
+        return courseCount;
+    }
+
+    public void setCourseCount(String courseCount) {
+        this.courseCount = courseCount;
+    }
+
+    public long getRecordTime() {
+        return recordTime;
+    }
+
+    public void setRecordTime(long recordTime) {
+        this.recordTime = recordTime;
+    }
+
+    public String getTotalCourseCount() {
+        return totalCourseCount;
+    }
+
+    public void setTotalCourseCount(String totalCourseCount) {
+        this.totalCourseCount = totalCourseCount;
+    }
+}

+ 12 - 0
student/src/main/java/com/cooleshow/student/constants/HomeMenuConstants.java

@@ -0,0 +1,12 @@
+package com.cooleshow.student.constants;
+
+/**
+ * Author by pq, Date on 2024/11/28.
+ */
+public class HomeMenuConstants {
+    public static final String NATIVE_METRONOME = "native-metronome";//调音器
+    public static final String NATIVE_BOOKVIP = "native-bookVip";//约课-vip
+    public static final String NATIVE_BOOKACCOMPANY = "native-bookAccompany";//约课-趣纠课
+    public static final String NATIVE_BOOKLIVE = "native-bookLive";//约课-直播课
+    public static final String NATIVE_BOOKVIDEO = "native-bookVideo";//约课-视频课
+}

+ 4 - 0
student/src/main/java/com/cooleshow/student/contract/HomeContract.java

@@ -8,6 +8,7 @@ import com.cooleshow.student.bean.HelpCenterContentBean;
 import com.cooleshow.student.bean.HomeHotMusicSheetBean;
 import com.cooleshow.student.bean.HomeHotNewsBean;
 import com.cooleshow.student.bean.HomeLiveAndVideoBean;
+import com.cooleshow.student.bean.HomeStatisticsInfoBean;
 import com.cooleshow.student.bean.HomeStyleBean;
 import com.cooleshow.student.bean.HotAlbumBean;
 import com.cooleshow.student.bean.RecommendTalentListBean;
@@ -49,6 +50,9 @@ public interface HomeContract {
         void followTeacherSuccess();
 
         void getAwardStatus(AwardStatusBean awardStatusBean);
+
+        void getHomeStatisticsInfoSuccess(HomeStatisticsInfoBean data);
+
     }
 
     interface Presenter {

+ 13 - 0
student/src/main/java/com/cooleshow/student/presenter/main/HomePresenter.java

@@ -16,6 +16,7 @@ import com.cooleshow.student.bean.HelpCenterContentBean;
 import com.cooleshow.student.bean.HomeHotMusicSheetBean;
 import com.cooleshow.student.bean.HomeHotNewsBean;
 import com.cooleshow.student.bean.HomeLiveAndVideoBean;
+import com.cooleshow.student.bean.HomeStatisticsInfoBean;
 import com.cooleshow.student.bean.HomeStyleBean;
 import com.cooleshow.student.bean.HotAlbumBean;
 import com.cooleshow.student.bean.RecommendTalentListBean;
@@ -424,4 +425,16 @@ public class HomePresenter extends BasePresenter<HomeContract.HomeView> implemen
             }
         });
     }
+
+    public void getPracticeAndCourseInfo() {
+        addSubscribe(create(APIService.class).getPracticeAndCourseInfo(), new BaseObserver<HomeStatisticsInfoBean>(getView()) {
+            @Override
+            protected void onSuccess(HomeStatisticsInfoBean data) {
+                if (getView() != null) {
+                    getView().getHomeStatisticsInfoSuccess(data);
+                }
+            }
+        });
+    }
+
 }

+ 1 - 1
student/src/main/java/com/cooleshow/student/ui/course/AppointmentCourseActivity.java

@@ -102,7 +102,7 @@ public class AppointmentCourseActivity extends BaseMVPActivity<ActivityAppointme
             viewBinding.viewPager.post(new Runnable() {
                 @Override
                 public void run() {
-                    viewBinding.viewPager.setCurrentItem(selectPosition);
+                    viewBinding.viewPager.setCurrentItem(selectPosition,false);
                 }
             });
         }

+ 1 - 1
student/src/main/java/com/cooleshow/student/ui/course/InterestCorrectionCourseListFragment.java

@@ -80,7 +80,6 @@ public class InterestCorrectionCourseListFragment extends BaseMVPFragment<FgInte
         String subjectName = UserHelper.getSubjectName();
         mViewBinding.tvFilter.setText(subjectName);
 
-        initListener();
         DataSortBean dataSortBean = new DataSortBean(DataSortType.RECENT_FREE_TIME);
         DataSortBean dataSortBean2 = new DataSortBean(DataSortType.HAS_COURSE);
         DataSortBean dataSortBean4 = new DataSortBean(DataSortType.COURSE_MARK);
@@ -97,6 +96,7 @@ public class InterestCorrectionCourseListFragment extends BaseMVPFragment<FgInte
         mViewBinding.recyclerViewList.setAdapter(mAdapter);
         mAdapter.setEmptyView(emptyViewLayout);
 
+        initListener();
         getData(true);
     }
 

+ 7 - 7
student/src/main/java/com/cooleshow/student/ui/course/VIPCustomCourseListFragment.java

@@ -75,8 +75,13 @@ public class VIPCustomCourseListFragment extends BaseMVPFragment<FgVipCustomCour
         String subjectName = UserHelper.getSubjectName();
         mViewBinding.tvFilter.setText(subjectName);
 
+        mAdapter = new VIPCourseCourseListAdapter();
+        EmptyViewLayout emptyViewLayout = new EmptyViewLayout(getContext());
+        emptyViewLayout.setContent(com.cooleshow.base.R.drawable.icon_empty_course, "暂无课程");
+        mViewBinding.recyclerViewList.setLayoutManager(new LinearLayoutManager(getContext()));
+        mViewBinding.recyclerViewList.setAdapter(mAdapter);
+        mAdapter.setEmptyView(emptyViewLayout);
 
-        initListener();
         DataSortBean dataSortBean = new DataSortBean(DataSortType.RECENT_FREE_TIME);
         DataSortBean dataSortBean2 = new DataSortBean(DataSortType.HAS_COURSE);
         DataSortBean dataSortBean3 = new DataSortBean(DataSortType.COURSE_PRICE);
@@ -88,12 +93,7 @@ public class VIPCustomCourseListFragment extends BaseMVPFragment<FgVipCustomCour
         list.add(dataSortBean4);
         mViewBinding.sortView.setData(list);
 
-        mAdapter = new VIPCourseCourseListAdapter();
-        EmptyViewLayout emptyViewLayout = new EmptyViewLayout(getContext());
-        emptyViewLayout.setContent(com.cooleshow.base.R.drawable.icon_empty_course, "暂无课程");
-        mViewBinding.recyclerViewList.setLayoutManager(new LinearLayoutManager(getContext()));
-        mViewBinding.recyclerViewList.setAdapter(mAdapter);
-        mAdapter.setEmptyView(emptyViewLayout);
+        initListener();
 
         getData(true);
     }

+ 6 - 0
student/src/main/java/com/cooleshow/student/ui/main/HomeFragment.java

@@ -48,6 +48,7 @@ import com.cooleshow.student.bean.HelpCenterContentBean;
 import com.cooleshow.student.bean.HomeHotMusicSheetBean;
 import com.cooleshow.student.bean.HomeHotNewsBean;
 import com.cooleshow.student.bean.HomeLiveAndVideoBean;
+import com.cooleshow.student.bean.HomeStatisticsInfoBean;
 import com.cooleshow.student.bean.HomeStyleBean;
 import com.cooleshow.student.bean.HotAlbumBean;
 import com.cooleshow.student.bean.RecommendTalentListBean;
@@ -651,4 +652,9 @@ public class HomeFragment extends BaseMVPFragment<FragmentHomeLayoutBinding, Hom
     public void getAwardStatus(AwardStatusBean awardStatusBean) {
 
     }
+
+    @Override
+    public void getHomeStatisticsInfoSuccess(HomeStatisticsInfoBean data) {
+
+    }
 }

+ 25 - 1
student/src/main/java/com/cooleshow/student/ui/main/HomeMenuFragment.java

@@ -19,8 +19,10 @@ import com.cooleshow.metronome.MetronomeActivity;
 import com.cooleshow.student.adapter.HomeMenuItemAdapter;
 import com.cooleshow.student.bean.AppHomeBean;
 import com.cooleshow.student.constants.CommonConfig;
+import com.cooleshow.student.constants.HomeMenuConstants;
 import com.cooleshow.student.databinding.FragmentHomeMenuBinding;
 import com.cooleshow.student.presenter.main.HomeMenuPresenter;
+import com.cooleshow.student.ui.course.AppointmentCourseActivity;
 
 import java.io.Serializable;
 import java.util.ArrayList;
@@ -72,10 +74,26 @@ public class HomeMenuFragment extends BaseMVPFragment<FragmentHomeMenuBinding, H
             public void onItemClick(@NonNull BaseQuickAdapter<?, ?> adapter, @NonNull View view, int position) {
                 AppHomeBean.ItemBean item = (AppHomeBean.ItemBean) adapter.getItem(position);
                 if (!TextUtils.isEmpty(item.linkUrl)) {
-                    if (item.linkUrl.contains("native-metronome")) {
+                    if (item.linkUrl.contains(HomeMenuConstants.NATIVE_METRONOME)) {
                         ARouter.getInstance().build(RouterPath.MusicTuner.MUSIC_TUNER_PAGE).navigation();
                         return;
                     }
+                    if (item.linkUrl.contains(HomeMenuConstants.NATIVE_BOOKVIP)) {
+                        startAppointmentCourseActivity(0);
+                        return;
+                    }
+                    if (item.linkUrl.contains(HomeMenuConstants.NATIVE_BOOKACCOMPANY)) {
+                        startAppointmentCourseActivity(1);
+                        return;
+                    }
+                    if (item.linkUrl.contains(HomeMenuConstants.NATIVE_BOOKLIVE)) {
+                        startAppointmentCourseActivity(2);
+                        return;
+                    }
+                    if (item.linkUrl.contains(HomeMenuConstants.NATIVE_BOOKVIDEO)) {
+                        startAppointmentCourseActivity(3);
+                        return;
+                    }
                     ARouter.getInstance()
                             .build(RouterPath.WebCenter.ACTIVITY_HTML)
                             .withString(WebConstants.WEB_URL, item.linkUrl)
@@ -85,6 +103,12 @@ public class HomeMenuFragment extends BaseMVPFragment<FragmentHomeMenuBinding, H
         });
     }
 
+    private void startAppointmentCourseActivity(int i) {
+        ARouter.getInstance().build(RouterPath.CourseCenter.APPOINTMENT_COURSE)
+                .withInt(AppointmentCourseActivity.SELECT_POSITION,i)
+                .navigation();
+    }
+
     @Override
     protected void initData() {
 

+ 6 - 0
student/src/main/java/com/cooleshow/student/ui/main/NewHomeFragment.java

@@ -49,6 +49,7 @@ import com.cooleshow.student.bean.HomeHotMusicSheetBean;
 import com.cooleshow.student.bean.HomeHotMusicSheetItemBean;
 import com.cooleshow.student.bean.HomeHotNewsBean;
 import com.cooleshow.student.bean.HomeLiveAndVideoBean;
+import com.cooleshow.student.bean.HomeStatisticsInfoBean;
 import com.cooleshow.student.bean.HomeStyleBean;
 import com.cooleshow.student.bean.HotAlbumBean;
 import com.cooleshow.student.bean.RecommendTalentListBean;
@@ -803,6 +804,11 @@ public class NewHomeFragment extends BaseMVPFragment<FragmentNewHomeLayoutBindin
         }
     }
 
+    @Override
+    public void getHomeStatisticsInfoSuccess(HomeStatisticsInfoBean data) {
+
+    }
+
     private void showAwardTipDialog() {
         if (CommonConfig.getTodayShowAwardIsCompleted()) {
             return;

+ 51 - 7
student/src/main/java/com/cooleshow/student/ui/main/NewHomeFragmentV2.java

@@ -41,6 +41,7 @@ import com.cooleshow.student.bean.HomeHotMusicSheetBean;
 import com.cooleshow.student.bean.HomeHotMusicSheetItemBean;
 import com.cooleshow.student.bean.HomeHotNewsBean;
 import com.cooleshow.student.bean.HomeLiveAndVideoBean;
+import com.cooleshow.student.bean.HomeStatisticsInfoBean;
 import com.cooleshow.student.bean.HomeStyleBean;
 import com.cooleshow.student.bean.HotAlbumBean;
 import com.cooleshow.student.bean.RecommendTalentListBean;
@@ -51,6 +52,7 @@ import com.cooleshow.student.databinding.FgNewHomeV2LayoutBinding;
 import com.cooleshow.student.databinding.FragmentNewHomeLayoutBinding;
 import com.cooleshow.student.helper.EventHelper;
 import com.cooleshow.student.presenter.main.HomePresenter;
+import com.cooleshow.student.ui.course.AppointmentCourseActivity;
 import com.cooleshow.student.widgets.AppBarLayoutStateChangeListener;
 import com.cooleshow.student.widgets.DialogUtils;
 import com.cooleshow.student.widgets.HomeHotAlbumDecoration;
@@ -132,11 +134,13 @@ public class NewHomeFragmentV2 extends BaseMVPFragment<FgNewHomeV2LayoutBinding,
         mViewBinding.flCourseEnter.setOnClickListener(this);
         mViewBinding.tvRecommendTeacherMore.setOnClickListener(this);
         mViewBinding.tvVideoCourseMore.setOnClickListener(this);
+        mViewBinding.viewCourseInfoBg.setOnClickListener(this);
+        mViewBinding.viewPracticeInfoBg.setOnClickListener(this);
     }
 
     @Override
     protected void initData() {
-        UiUtils.setCustomFont_DIN_Alternate_Bold(getContext(), mViewBinding.tvPracticeMinutes, mViewBinding.tvPracticeSecond, mViewBinding.tvCourseInfo);
+        UiUtils.setCustomFont_DIN_Alternate_Bold(getContext(), mViewBinding.tvPracticeHour, mViewBinding.tvPracticeMinutes, mViewBinding.tvPracticeSecond, mViewBinding.tvCourseInfo);
         //推荐老师
         mRecommendTalentAdapter = new HomeRecommendTalentAdapter();
         CommonItemDecoration commonItemDecoration = new CommonItemDecoration(0, 0, 0, SizeUtils.dp2px(12), 0);
@@ -339,6 +343,8 @@ public class NewHomeFragmentV2 extends BaseMVPFragment<FgNewHomeV2LayoutBinding,
             presenter.getRecommendTalentList();
             //获取领奖状态
             presenter.getAwardStatus();
+            //统计信息
+            presenter.getPracticeAndCourseInfo();
         }
     }
 
@@ -613,6 +619,35 @@ public class NewHomeFragmentV2 extends BaseMVPFragment<FgNewHomeV2LayoutBinding,
         }
     }
 
+    @Override
+    public void getHomeStatisticsInfoSuccess(HomeStatisticsInfoBean data) {
+        if (isDetached()) {
+            return;
+        }
+        try {
+            if (data != null) {
+                long[] hmsForSecond = TimeUtils.getHmsFromSecond(data.getRecordTime());
+                long hour = hmsForSecond[0];
+                long minute = hmsForSecond[1];
+                long second = hmsForSecond[2];
+                if (hour != 0) {
+                    mViewBinding.tvPracticeHour.setText(String.valueOf(hour));
+                    mViewBinding.tvPracticeHour.setVisibility(View.VISIBLE);
+                    mViewBinding.tvPracticeHourUnit.setVisibility(View.VISIBLE);
+                } else {
+                    mViewBinding.tvPracticeHour.setVisibility(View.GONE);
+                    mViewBinding.tvPracticeHourUnit.setVisibility(View.GONE);
+                }
+                mViewBinding.tvPracticeMinutes.setText(String.valueOf(minute));
+                mViewBinding.tvPracticeSecond.setText(String.valueOf(second));
+
+                mViewBinding.tvCourseInfo.setText(String.format("%s/%s", data.getCourseCount(), data.getTotalCourseCount()));
+            }
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+    }
+
     private void showAwardTipDialog() {
         if (CommonConfig.getTodayShowAwardIsCompleted()) {
             return;
@@ -701,9 +736,8 @@ public class NewHomeFragmentV2 extends BaseMVPFragment<FgNewHomeV2LayoutBinding,
                 return;
             }
             //视频课更多
-            ARouter.getInstance()
-                    .build(RouterPath.WebCenter.ACTIVITY_HTML)
-                    .withString(WebConstants.WEB_URL, WebConstants.STUDENT_VIDEO_CLASS)
+            ARouter.getInstance().build(RouterPath.CourseCenter.APPOINTMENT_COURSE)
+                    .withInt(AppointmentCourseActivity.SELECT_POSITION, 2)
                     .navigation();
             return;
         }
@@ -718,6 +752,18 @@ public class NewHomeFragmentV2 extends BaseMVPFragment<FgNewHomeV2LayoutBinding,
             mViewBinding.viewPagerBottom.setCurrentItem(1);
             return;
         }
+
+        if (id == R.id.view_practice_info_bg) {
+            ARouter.getInstance()
+                    .build(RouterPath.WebCenter.ACTIVITY_HTML)
+                    .withString(WebConstants.WEB_URL, WebConstants.STUDENT_MEMBER_RECORD)
+                    .navigation();
+            return;
+        }
+        if (id == R.id.view_course_info_bg) {
+            JumpUtils.jumpMain(1);
+            return;
+        }
     }
 
     private void showRecommendTalentMenuDialog() {
@@ -726,9 +772,7 @@ public class NewHomeFragmentV2 extends BaseMVPFragment<FgNewHomeV2LayoutBinding,
             @Override
             public void onClickMore() {
                 //老师风采
-                ARouter.getInstance()
-                        .build(RouterPath.WebCenter.ACTIVITY_HTML)
-                        .withString(WebConstants.WEB_URL, WebConstants.STUDENT_TEACHER_ELEGANT)
+                ARouter.getInstance().build(RouterPath.CourseCenter.APPOINTMENT_COURSE)
                         .navigation();
             }
 

+ 96 - 56
student/src/main/res/layout/fg_new_home_v2_layout.xml

@@ -183,7 +183,7 @@
                             android:textSize="@dimen/sp_14"
                             app:layout_constraintBottom_toBottomOf="@+id/view_practice_info_bg"
                             app:layout_constraintLeft_toLeftOf="@+id/view_practice_info_bg"
-                            app:layout_constraintTop_toBottomOf="@+id/tv_practice_minutes" />
+                            app:layout_constraintTop_toBottomOf="@+id/ll_course_time_info" />
 
 
                         <TextView
@@ -202,58 +202,98 @@
                             app:layout_constraintLeft_toLeftOf="@+id/view_course_info_bg"
                             app:layout_constraintTop_toBottomOf="@+id/tv_course_info" />
 
-                        <TextView
-                            android:id="@+id/tv_practice_minutes"
+                        <androidx.constraintlayout.widget.ConstraintLayout
+                            android:id="@+id/ll_course_time_info"
                             android:layout_width="wrap_content"
                             android:layout_height="wrap_content"
-                            android:includeFontPadding="false"
-                            android:text="0"
-                            android:textColor="@color/color_333333"
-                            android:textSize="@dimen/sp_22"
+                            android:orientation="horizontal"
                             app:layout_constraintBottom_toTopOf="@+id/tv_week_pratice_info_title"
                             app:layout_constraintLeft_toLeftOf="@+id/tv_week_pratice_info_title"
                             app:layout_constraintTop_toTopOf="@+id/view_practice_info_bg"
-                            app:layout_constraintVertical_chainStyle="packed"
-                            tools:text="23" />
+                            app:layout_constraintVertical_chainStyle="packed">
 
-                        <TextView
-                            android:id="@+id/tv_practice_minutes_unit"
-                            android:layout_width="wrap_content"
-                            android:layout_height="wrap_content"
-                            android:includeFontPadding="false"
-                            android:paddingStart="2dp"
-                            android:paddingEnd="2dp"
-                            android:text="分"
-                            android:textColor="@color/color_777777"
-                            android:textSize="@dimen/sp_12"
-                            app:layout_constraintBaseline_toBaselineOf="@+id/tv_practice_minutes"
-                            app:layout_constraintLeft_toRightOf="@+id/tv_practice_minutes" />
+                            <TextView
+                                android:id="@+id/tv_practice_hour"
+                                android:layout_width="wrap_content"
+                                android:layout_height="wrap_content"
+                                android:includeFontPadding="false"
+                                android:text="0"
+                                android:textColor="@color/color_333333"
+                                android:textSize="@dimen/sp_22"
+                                android:visibility="gone"
+                                tools:visibility="visible"
+                                app:layout_constraintBaseline_toBaselineOf="@+id/tv_practice_minutes"
+                                app:layout_constraintLeft_toLeftOf="parent"
+                                tools:text="23" />
 
-                        <TextView
-                            android:id="@+id/tv_practice_second"
-                            android:layout_width="wrap_content"
-                            android:layout_height="wrap_content"
-                            android:includeFontPadding="false"
-                            android:text="0"
-                            android:textColor="@color/color_333333"
-                            android:textSize="@dimen/sp_22"
-                            app:layout_constraintBaseline_toBaselineOf="@+id/tv_practice_minutes_unit"
-                            app:layout_constraintLeft_toRightOf="@+id/tv_practice_minutes_unit"
-                            tools:text="23" />
+                            <TextView
+                                android:visibility="gone"
+                                android:id="@+id/tv_practice_hour_unit"
+                                android:layout_width="wrap_content"
+                                android:layout_height="wrap_content"
+                                android:includeFontPadding="false"
+                                android:paddingStart="2dp"
+                                android:paddingEnd="2dp"
+                                android:text="时"
+                                android:textColor="@color/color_777777"
+                                android:textSize="@dimen/sp_12"
+                                tools:visibility="visible"
+                                app:layout_constraintBottom_toBottomOf="@+id/tv_practice_minutes_unit"
+                                app:layout_constraintLeft_toRightOf="@+id/tv_practice_hour" />
 
-                        <TextView
-                            android:id="@+id/tv_practice_second_unit"
-                            android:layout_width="wrap_content"
-                            android:layout_height="wrap_content"
-                            android:includeFontPadding="false"
-                            android:paddingStart="2dp"
-                            android:paddingEnd="2dp"
-                            android:text="秒"
-                            android:textColor="@color/color_777777"
-                            android:textSize="@dimen/sp_12"
-                            app:layout_constraintBaseline_toBaselineOf="@+id/tv_practice_second"
-                            app:layout_constraintLeft_toRightOf="@+id/tv_practice_second" />
+                            <TextView
+                                android:id="@+id/tv_practice_minutes"
+                                android:layout_width="wrap_content"
+                                android:layout_height="wrap_content"
+                                android:includeFontPadding="false"
+                                android:text="0"
+                                android:textColor="@color/color_333333"
+                                android:textSize="@dimen/sp_22"
+                                app:layout_constraintTop_toTopOf="parent"
+                                app:layout_constraintLeft_toRightOf="@+id/tv_practice_hour_unit"
+                                app:layout_constraintVertical_chainStyle="packed"
+                                tools:text="23" />
+
+                            <TextView
+                                android:id="@+id/tv_practice_minutes_unit"
+                                android:layout_width="wrap_content"
+                                android:layout_height="wrap_content"
+                                android:includeFontPadding="false"
+                                android:paddingStart="2dp"
+                                android:paddingEnd="2dp"
+                                android:text="分"
+                                android:layout_marginBottom="3dp"
+                                android:textColor="@color/color_777777"
+                                android:textSize="@dimen/sp_12"
+                                app:layout_constraintBottom_toBottomOf="@+id/tv_practice_minutes"
+                                app:layout_constraintLeft_toRightOf="@+id/tv_practice_minutes" />
+
+                            <TextView
+                                android:id="@+id/tv_practice_second"
+                                android:layout_width="wrap_content"
+                                android:layout_height="wrap_content"
+                                android:includeFontPadding="false"
+                                android:text="0"
+                                android:textColor="@color/color_333333"
+                                android:textSize="@dimen/sp_22"
+                                app:layout_constraintBaseline_toBaselineOf="@+id/tv_practice_minutes"
+                                app:layout_constraintLeft_toRightOf="@+id/tv_practice_minutes_unit"
+                                tools:text="23" />
+
+                            <TextView
+                                android:id="@+id/tv_practice_second_unit"
+                                android:layout_width="wrap_content"
+                                android:layout_height="wrap_content"
+                                android:includeFontPadding="false"
+                                android:paddingStart="2dp"
+                                android:paddingEnd="2dp"
+                                android:text="秒"
+                                android:textColor="@color/color_777777"
+                                android:textSize="@dimen/sp_12"
+                                app:layout_constraintBottom_toBottomOf="@+id/tv_practice_minutes_unit"
+                                app:layout_constraintLeft_toRightOf="@+id/tv_practice_second" />
 
+                        </androidx.constraintlayout.widget.ConstraintLayout>
 
                         <TextView
                             android:id="@+id/tv_course_info"
@@ -287,11 +327,11 @@
                                 android:id="@+id/tv_live_title"
                                 android:layout_width="wrap_content"
                                 android:layout_height="wrap_content"
+                                android:layout_marginStart="16dp"
                                 android:includeFontPadding="false"
                                 android:text="您有新课程即将开始"
                                 android:textColor="@color/color_1a1a1a"
                                 android:textSize="@dimen/sp_16"
-                                android:layout_marginStart="16dp"
                                 app:layout_constraintBottom_toTopOf="@+id/alarm_icon"
                                 app:layout_constraintLeft_toLeftOf="parent"
                                 app:layout_constraintTop_toTopOf="parent"
@@ -331,20 +371,20 @@
                                 app:layout_constraintBottom_toBottomOf="parent"
                                 app:layout_constraintRight_toRightOf="parent"
                                 app:layout_constraintTop_toTopOf="parent" />
-                            
+
                             <TextView
-                                android:textSize="@dimen/sp_14"
-                                android:gravity="center"
+                                android:layout_width="76dp"
+                                android:layout_height="26dp"
                                 android:layout_marginEnd="16dp"
-                                app:layout_constraintRight_toRightOf="parent"
-                                app:layout_constraintBottom_toBottomOf="parent"
-                                app:layout_constraintTop_toTopOf="parent"
                                 android:background="@drawable/shape_2dc7aa_13dp"
-                                android:textColor="@color/white"
-                                android:text="进入教室"
+                                android:gravity="center"
                                 android:includeFontPadding="false"
-                                android:layout_width="76dp"
-                                android:layout_height="26dp"/>
+                                android:text="进入教室"
+                                android:textColor="@color/white"
+                                android:textSize="@dimen/sp_14"
+                                app:layout_constraintBottom_toBottomOf="parent"
+                                app:layout_constraintRight_toRightOf="parent"
+                                app:layout_constraintTop_toTopOf="parent" />
 
                         </androidx.constraintlayout.widget.ConstraintLayout>
 
@@ -563,10 +603,10 @@
                         </androidx.constraintlayout.widget.ConstraintLayout>
 
                         <LinearLayout
-                            android:gravity="center_vertical"
                             android:layout_width="match_parent"
                             android:layout_height="wrap_content"
                             android:layout_marginTop="20dp"
+                            android:gravity="center_vertical"
                             android:orientation="horizontal"
                             app:layout_constraintLeft_toLeftOf="parent"
                             app:layout_constraintTop_toBottomOf="@+id/cl_video_course">