Browse Source

添加老师端个人主页个人风采和乐谱页面,添加签名文件

Pq 2 years ago
parent
commit
3fc8039aea

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

@@ -29,4 +29,8 @@ public abstract class WebConstants {
 
     //老师认证
     public static final String TEACHER_CERT = getBaseUrlH5() + "/#/teacherCert";
+    //音乐人认证
+    public static final String TEACHER_MUSIC_PERSON_CERT = getBaseUrlH5() + "/#/musicCert";
+    //上传乐谱
+    public static final String TEACHER_UPLOAD_SHEET_MUSIC = getBaseUrlH5() + "/#/music-upload";
 }

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

@@ -0,0 +1,28 @@
+package com.cooleshow.base.utils.helper;
+
+import com.alibaba.android.arouter.launcher.ARouter;
+import com.cooleshow.base.common.WebConstants;
+import com.cooleshow.base.router.RouterPath;
+
+/**
+ * Author by pq, Date on 2022/5/10.
+ */
+public class WebStartHelper {
+    /**
+     * 开启音乐人认证页面
+     */
+    public static void startMusicPersonCertPage(){
+        ARouter.getInstance().build(RouterPath.WebCenter.ACTIVITY_HTML)
+                .withString(WebConstants.WEB_URL, WebConstants.TEACHER_MUSIC_PERSON_CERT)
+                .navigation();
+    }
+
+    /**
+     * 开启上传乐谱页面
+     */
+    public static void startUploadSheetMusicPage(){
+        ARouter.getInstance().build(RouterPath.WebCenter.ACTIVITY_HTML)
+                .withString(WebConstants.WEB_URL, WebConstants.TEACHER_UPLOAD_SHEET_MUSIC)
+                .navigation();
+    }
+}

+ 5 - 0
BaseLibrary/src/main/res/drawable/shape_2dc7aa_39dp.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_ff2dc7aa"/>
+    <corners android:radius="39dp"/>
+</shape>

BIN
cooleshow.jks


+ 15 - 2
teacher/build.gradle

@@ -24,19 +24,32 @@ android {
         testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
     }
 
+    signingConfigs {
+        release {
+            storeFile file("../cooleshow.jks")
+            //签名文件
+            storePassword "cooleshow"
+            keyAlias "cooleshow"
+            keyPassword "cooleshow"  //签名密码
+        }
+    }
+
     buildTypes {
         release {
             minifyEnabled false
+            signingConfig signingConfigs.release
             proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
             buildConfigField "String", "BASE_H5_URL", RELEASE_BASE_URL_H5
         }
 
-        debug{
+        debug {
             minifyEnabled false
+            signingConfig signingConfigs.release
             proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
             buildConfigField "String", "BASE_H5_URL", TEST_BASE_URL_H5
         }
     }
+
     compileOptions {
         sourceCompatibility JavaVersion.VERSION_1_8
         targetCompatibility JavaVersion.VERSION_1_8
@@ -44,7 +57,7 @@ android {
     kotlinOptions {
         jvmTarget = '1.8'
     }
-    buildFeatures{
+    buildFeatures {
         viewBinding = true
     }
 }

+ 7 - 2
teacher/src/main/java/com/cooleshow/teacher/ui/homepage/HomePageActivity.java

@@ -43,6 +43,7 @@ import androidx.fragment.app.Fragment;
 public class HomePageActivity extends BaseMVPActivity<ActivityHomePageLayoutBinding, HomePagePresenter> implements HomePageContract.HomePageView, View.OnClickListener {
     public static final String[] titles = new String[]{"个人风采", "陪练课", "直播课", "视频课", "乐谱"};
     private ArrayList<Fragment> fragments = new ArrayList<>();
+    private SheetMusicPageFragment mMusicPageFragment;
 
     @Override
     protected void initView() {
@@ -90,14 +91,15 @@ public class HomePageActivity extends BaseMVPActivity<ActivityHomePageLayoutBind
         SparringCoursePageFragment sparringCoursePageFragment = new SparringCoursePageFragment();
         LiveCoursePageFragment liveCoursePageFragment = new LiveCoursePageFragment();
         VideoCoursePageFragment videoCoursePageFragment = new VideoCoursePageFragment();
-        SheetMusicPageFragment musicPageFragment = new SheetMusicPageFragment();
+        mMusicPageFragment = new SheetMusicPageFragment();
         fragments.add(mineStyleFragment);
         fragments.add(sparringCoursePageFragment);
         fragments.add(liveCoursePageFragment);
         fragments.add(videoCoursePageFragment);
-        fragments.add(musicPageFragment);
+        fragments.add(mMusicPageFragment);
         HomePagerAdapter homePagerAdapter = new HomePagerAdapter(this);
         homePagerAdapter.setData(fragments);
+        viewBinding.viewPager.setOffscreenPageLimit(fragments.size());
         viewBinding.viewPager.setAdapter(homePagerAdapter);
         tabLayoutMediator.attach();
     }
@@ -147,6 +149,9 @@ public class HomePageActivity extends BaseMVPActivity<ActivityHomePageLayoutBind
         if (isFinishing() || isDestroyed()) {
             return;
         }
+        if (mMusicPageFragment != null) {
+            mMusicPageFragment.setMusicPersonCertStatus(info.musicianAuthStatus);
+        }
         //星级
         viewBinding.ratingBar.setRating(info.starGrade);
         //粉丝数

+ 68 - 6
teacher/src/main/java/com/cooleshow/teacher/ui/homepage/SheetMusicPageFragment.java

@@ -1,19 +1,19 @@
 package com.cooleshow.teacher.ui.homepage;
 
+import android.text.TextUtils;
 import android.view.View;
 
 import com.chad.library.adapter.base.listener.OnLoadMoreListener;
 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.teacher.R;
 import com.cooleshow.teacher.adapter.HomePageSheetMusicAdapter;
 import com.cooleshow.teacher.bean.HomePageSheetMusicListBean;
-import com.cooleshow.teacher.contract.MineStyleContract;
+import com.cooleshow.teacher.constants.TeacherInfoConstants;
 import com.cooleshow.teacher.contract.SheetMusicPageContract;
 import com.cooleshow.teacher.databinding.FragmentSheetMusicPageLayoutBinding;
-import com.cooleshow.teacher.databinding.FragmentVideoCoursePageLayoutBinding;
-import com.cooleshow.teacher.presenter.homePage.MineStylePresenter;
 import com.cooleshow.teacher.presenter.homePage.SheetMusicPagePresenter;
 import com.scwang.smart.refresh.layout.api.RefreshLayout;
 import com.scwang.smart.refresh.layout.listener.OnRefreshListener;
@@ -25,16 +25,18 @@ import androidx.recyclerview.widget.LinearLayoutManager;
  * Author by pq, Date on 2022/5/9.
  * 老师个人主页->曲谱列表
  */
-public class SheetMusicPageFragment extends BaseMVPFragment<FragmentSheetMusicPageLayoutBinding, SheetMusicPagePresenter> implements SheetMusicPageContract.SheetMusicPageView {
+public class SheetMusicPageFragment extends BaseMVPFragment<FragmentSheetMusicPageLayoutBinding, SheetMusicPagePresenter> implements SheetMusicPageContract.SheetMusicPageView, View.OnClickListener {
 
     private HomePageSheetMusicAdapter mAdapter;
     private int currentPage = 1;
     private boolean hasNext = true;
     private EmptyViewLayout mEmptyView;
+    private View mCertTipView;
+    private String musicPersonCertStatus = TeacherInfoConstants.MUSICIAN_STATUS_UNPAALY;
 
     @Override
     protected void initView(View rootView) {
-
+        mViewBinding.viewUploadBg.setOnClickListener(this);
     }
 
     @Override
@@ -64,7 +66,34 @@ public class SheetMusicPageFragment extends BaseMVPFragment<FragmentSheetMusicPa
         });
         mViewBinding.recyclerView.setLayoutManager(new LinearLayoutManager(getContext()));
         mViewBinding.recyclerView.setAdapter(mAdapter);
-        presenter.getSheetMusicList(true, currentPage);
+
+    }
+
+    @Override
+    public void onResume() {
+        super.onResume();
+        checkCertStatus();
+    }
+
+    private void checkCertStatus() {
+        if (mViewBinding == null) {
+            return;
+        }
+        if (TextUtils.equals(musicPersonCertStatus, TeacherInfoConstants.MUSICIAN_STATUS_PASS)) {
+            mViewBinding.groupContent.setVisibility(View.VISIBLE);
+            queryList(true);
+            if (mCertTipView != null) {
+                mCertTipView.setVisibility(View.GONE);
+            }
+        } else {
+            mViewBinding.groupContent.setVisibility(View.GONE);
+            if (mCertTipView == null) {
+                mCertTipView = mViewBinding.vsNoCert.inflate();
+                mCertTipView.findViewById(R.id.tv_go_cert).setOnClickListener(this);
+            } else {
+                mCertTipView.setVisibility(View.VISIBLE);
+            }
+        }
     }
 
     private void queryList(boolean isShowLoading) {
@@ -81,6 +110,12 @@ public class SheetMusicPageFragment extends BaseMVPFragment<FragmentSheetMusicPa
         return new SheetMusicPagePresenter();
     }
 
+    /**
+     * 获取乐谱列表
+     *
+     * @param page
+     * @param sheetMusicListBean
+     */
     @Override
     public void getSheetMusicListSuccess(int page, HomePageSheetMusicListBean sheetMusicListBean) {
         if (isDetached()) {
@@ -143,4 +178,31 @@ public class SheetMusicPageFragment extends BaseMVPFragment<FragmentSheetMusicPa
             }
         }
     }
+
+    /**
+     * 设置音乐人认证状态
+     *
+     * @param musicianAuthStatus
+     */
+    public void setMusicPersonCertStatus(String musicianAuthStatus) {
+        if (!TextUtils.equals(this.musicPersonCertStatus, musicianAuthStatus)) {
+            this.musicPersonCertStatus = musicianAuthStatus;
+            checkCertStatus();
+            return;
+        }
+//        this.musicPersonCertStatus = musicianAuthStatus;
+    }
+
+    @Override
+    public void onClick(View v) {
+        if (v.getId() == R.id.tv_go_cert) {
+            //去认证音乐人
+            WebStartHelper.startMusicPersonCertPage();
+            return;
+        }
+        if (v.getId() == R.id.view_upload_bg) {
+            //上传乐谱
+            WebStartHelper.startUploadSheetMusicPage();
+        }
+    }
 }

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

@@ -37,6 +37,9 @@ public class MineFragment extends BaseMVPFragment<FragmentMineLayoutBinding, Min
     }
 
     public void getTeacherInfoSuccess(TeacherUserInfo teacherUserInfo) {
+        if (isDetached() || !isAdded()) {
+            return;
+        }
         //头像
         GlideUtils.INSTANCE.loadImage(requireContext(), teacherUserInfo.heardUrl, mViewBinding.ivAvatar);
         //昵称

+ 105 - 14
teacher/src/main/java/com/cooleshow/teacher/ui/web/WebActivity.java

@@ -15,6 +15,7 @@ import android.webkit.WebChromeClient;
 import android.webkit.WebSettings;
 import android.webkit.WebView;
 import android.widget.FrameLayout;
+import android.widget.TextView;
 
 import com.alibaba.android.arouter.facade.annotation.Route;
 import com.cooleshow.base.BuildConfig;
@@ -23,6 +24,7 @@ import com.cooleshow.base.router.RouterPath;
 import com.cooleshow.base.ui.activity.BaseActivity;
 import com.cooleshow.base.utils.LogUtils;
 import com.cooleshow.base.utils.PermissionUtils;
+import com.cooleshow.base.utils.ToastUtil;
 import com.cooleshow.base.utils.Utils;
 import com.cooleshow.base.utils.helper.QMUIStatusBarHelper;
 import com.cooleshow.teacher.widgets.helper.JsInterfaceHelper;
@@ -39,6 +41,7 @@ import com.luck.picture.lib.config.PictureMimeType;
 import com.luck.picture.lib.entity.LocalMedia;
 import com.luck.picture.lib.tools.PictureFileUtils;
 import com.tbruyelle.rxpermissions3.RxPermissions;
+import com.yalantis.ucrop.util.FileUtils;
 
 import org.json.JSONObject;
 
@@ -55,6 +58,7 @@ import static com.cooleshow.base.common.WebConstants.WEB_URL;
  */
 @Route(path = RouterPath.WebCenter.ACTIVITY_HTML)
 public class WebActivity extends BaseActivity<ActivityHtmlBinding> implements JsInterfaceHelper.OnJsMethodCallListener, View.OnClickListener {
+    private static final int REQUEST_CODE_FILE_CHOOSER = 500;
     private WebView webView;
     private String url;
     private JsInterfaceHelper mInterfaceUtils;
@@ -260,11 +264,18 @@ public class WebActivity extends BaseActivity<ActivityHtmlBinding> implements Js
         }
 
         // Android > 5.0.1
+        @Override
         public boolean onShowFileChooser(
                 WebView webView, ValueCallback<Uri[]> filePathCallback,
                 FileChooserParams fileChooserParams) {
-            mUploadCallbackAboveL = filePathCallback;
-            startPictureSelect();
+            LogUtils.i("pq", "fileChooserParams" + fileChooserParams.toString());
+            if (fileChooserParams.getAcceptTypes().length == 1 && fileChooserParams.getAcceptTypes()[0].equals("image/*")) {
+                mUploadCallbackAboveL = filePathCallback;
+                startPictureSelect();
+            } else {
+                mUploadCallbackAboveL = filePathCallback;
+                startFileSelect(fileChooserParams);
+            }
             return true;
         }
 
@@ -320,6 +331,36 @@ public class WebActivity extends BaseActivity<ActivityHtmlBinding> implements Js
         super.onConfigurationChanged(newConfig);
     }
 
+    private void showFileChooser(String[] contentTypes) {
+
+        Intent intent1 = new Intent(Intent.ACTION_GET_CONTENT);
+        intent1.addCategory(Intent.CATEGORY_OPENABLE);
+        if (contentTypes.length == 0) {
+            intent1.setType("*/*");
+        } else {
+            for (int i = 0; i < contentTypes.length; i++) {
+                intent1.setType(contentTypes[i]);
+            }
+        }
+        Intent chooser = new Intent(Intent.ACTION_CHOOSER);
+        chooser.putExtra(Intent.EXTRA_TITLE, "File Chooser");
+        chooser.putExtra(Intent.EXTRA_INTENT, intent1);
+//        chooser.putExtra(Intent.EXTRA_INITIAL_INTENTS, new Intent[]{intent2});
+        startActivityForResult(chooser, REQUEST_CODE_FILE_CHOOSER);
+    }
+
+    private void startFileSelect(WebChromeClient.FileChooserParams fileChooserParams) {
+        new RxPermissions(this)
+                .request(Manifest.permission.READ_EXTERNAL_STORAGE)
+                .subscribe(permission -> {
+                    if (permission) {
+                        showFileChooser(fileChooserParams.getAcceptTypes());
+                    } else {
+                        String tip = "上传文件需要储存卡读取权限,是否去设置?";
+                        showCommonTipDialog(tip);
+                    }
+                });
+    }
 
     private void startPictureSelect() {
         new RxPermissions(this)
@@ -337,22 +378,27 @@ public class WebActivity extends BaseActivity<ActivityHtmlBinding> implements Js
                                 .circleDimmedLayer(false)// 是否圆形裁剪 true or false
                                 .forResult(PictureConfig.CHOOSE_REQUEST);
                     } else {
-                        CommonDialog dialog = new CommonDialog(this);
-                        dialog.show();
-                        dialog.setTitle("提示");
-                        dialog.setContent("上传照片需要相机权限,是否去设置?");
-                        dialog.setOnCancelClickListener(view1 -> {
-                            dialog.dismiss();
-                        });
-
-                        dialog.setOnConfirmClickListener(view1 -> {
-                            PermissionUtils.toSelfSetting(this);
-                            dialog.dismiss();
-                        });
+                        String tip = "上传照片需要相机权限,是否去设置?";
+                        showCommonTipDialog(tip);
                     }
                 });
     }
 
+    private void showCommonTipDialog(String tip) {
+        CommonDialog dialog = new CommonDialog(this);
+        dialog.show();
+        dialog.setTitle("提示");
+        dialog.setContent(tip);
+        dialog.setOnCancelClickListener(view1 -> {
+            dialog.dismiss();
+        });
+
+        dialog.setOnConfirmClickListener(view1 -> {
+            PermissionUtils.toSelfSetting(this);
+            dialog.dismiss();
+        });
+    }
+
     @Override
     protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
         super.onActivityResult(requestCode, resultCode, data);
@@ -367,6 +413,51 @@ public class WebActivity extends BaseActivity<ActivityHtmlBinding> implements Js
                 mUploadCallbackAboveL.onReceiveValue(new Uri[]{});
             }
             mUploadCallbackAboveL = null;
+            return;
+        }
+        if (requestCode == REQUEST_CODE_FILE_CHOOSER) {
+            Uri result = data == null || resultCode != RESULT_OK ? null : data.getData();
+//            if (result == null && !TextUtils.isEmpty(mCameraFilePath)) {
+//                // 看是否从相机返回
+//                File cameraFile = new File(mCameraFilePath);
+//                if (cameraFile.exists()) {
+//                    result = Uri.fromFile(cameraFile);
+//                    sendBroadcast(new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE, result));
+//                }
+//            }
+            if (result != null) {
+                String path = FileUtils.getPath(this, result);
+                if (!TextUtils.isEmpty(path)) {
+                    File f = new File(path);
+                    if (f.exists() && f.isFile()) {
+                        Uri newUri = Uri.fromFile(f);
+                        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
+                            if (mUploadCallbackAboveL != null) {
+                                if (newUri != null) {
+                                    mUploadCallbackAboveL.onReceiveValue(new Uri[]{newUri});
+                                    mUploadCallbackAboveL = null;
+                                    return;
+                                }
+                            }
+                        }
+                    } else {
+                        ToastUtil.getInstance().show(WebActivity.this, "文件损坏或不存在,请重新选择");
+                    }
+                }
+            }
+            clearUploadMessage();
+            return;
+        }
+
+    }
+
+    /**
+     * webview没有选择文件也要传null,防止下次无法执行
+     */
+    private void clearUploadMessage() {
+        if (mUploadCallbackAboveL != null) {
+            mUploadCallbackAboveL.onReceiveValue(null);
+            mUploadCallbackAboveL = null;
         }
     }
 }

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


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


+ 16 - 3
teacher/src/main/res/layout/fragment_sheet_music_page_layout.xml

@@ -31,6 +31,7 @@
         app:layout_constraintTop_toTopOf="@+id/view_upload_bg" />
 
     <ImageView
+        android:id="@+id/iv_icon_upload"
         android:layout_width="wrap_content"
         android:layout_height="wrap_content"
         android:layout_marginEnd="2dp"
@@ -44,7 +45,7 @@
         android:layout_width="match_parent"
         android:layout_height="0dp"
         app:layout_constraintBottom_toBottomOf="parent"
-        app:layout_constraintTop_toBottomOf="@+id/view_upload_bg" >
+        app:layout_constraintTop_toBottomOf="@+id/view_upload_bg">
 
         <com.scwang.smart.refresh.header.ClassicsHeader
             android:layout_width="match_parent"
@@ -55,7 +56,19 @@
             android:layout_width="match_parent"
             android:layout_height="match_parent"
             android:overScrollMode="never"
-            android:scrollbars="none"
-            />
+            android:scrollbars="none" />
     </com.scwang.smart.refresh.layout.SmartRefreshLayout>
+
+    <androidx.constraintlayout.widget.Group
+        android:id="@+id/group_content"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:visibility="gone"
+        app:constraint_referenced_ids="refreshLayout,view_upload_bg,iv_icon_upload,tv_upload_sheet_music,view_upload_bg" />
+
+    <ViewStub
+        android:id="@+id/vs_no_cert"
+        android:layout_width="match_parent"
+        android:layout_height="match_parent"
+        android:layout="@layout/view_go_cert_music_person_tip_layout" />
 </androidx.constraintlayout.widget.ConstraintLayout>

+ 37 - 0
teacher/src/main/res/layout/view_go_cert_music_person_tip_layout.xml

@@ -0,0 +1,37 @@
+<?xml version="1.0" encoding="utf-8"?>
+<LinearLayout 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"
+    android:gravity="center_horizontal"
+    android:orientation="vertical">
+
+    <ImageView
+        android:id="@+id/iv_bg"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:src="@drawable/bg_go_music_cert_tip"
+        app:layout_constraintLeft_toLeftOf="parent"
+        app:layout_constraintTop_toTopOf="parent" />
+
+    <TextView
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:layout_marginTop="15dp"
+        android:gravity="center"
+        android:includeFontPadding="false"
+        android:text="@string/go_cert_music_person_tip"
+        android:textColor="@color/color_999999"
+        android:textSize="@dimen/sp_15" />
+
+    <TextView
+        android:id="@+id/tv_go_cert"
+        android:layout_width="180dp"
+        android:layout_height="40dp"
+        android:layout_marginTop="26dp"
+        android:background="@drawable/shape_2dc7aa_39dp"
+        android:gravity="center"
+        android:text="@string/go_cert"
+        android:textColor="@color/white"
+        android:textSize="@dimen/sp_18" />
+</LinearLayout>

+ 2 - 0
teacher/src/main/res/values/strings.xml

@@ -20,4 +20,6 @@
     <string name="un_cert_str">未认证</string>
     <string name="cert_completed_str">已认证</string>
     <string name="self_introduction_str">个人介绍</string>
+    <string name="go_cert_music_person_tip">您还没有完成音乐人认证,认证后\n才可上传乐谱哦~</string>
+    <string name="go_cert">去认证</string>
 </resources>