Browse Source

增加H5页面加载失败提示页面

Pq 1 year ago
parent
commit
bb842dbeea

+ 64 - 0
BaseLibrary/src/main/java/com/cooleshow/base/widgets/ErrorView.java

@@ -0,0 +1,64 @@
+package com.cooleshow.base.widgets;
+
+import android.content.Context;
+import android.util.AttributeSet;
+import android.view.LayoutInflater;
+import android.widget.ImageView;
+import android.widget.LinearLayout;
+import android.widget.TextView;
+
+import com.cooleshow.base.R;
+
+import androidx.annotation.DrawableRes;
+import androidx.annotation.NonNull;
+import androidx.annotation.Nullable;
+
+/**
+ * Author by pq, Date on 2024/4/24.
+ */
+public class ErrorView extends LinearLayout {
+
+    private ImageView mIvTip;
+    private TextView mTvRefresh;
+    private TextView mTvBack;
+
+    public ErrorView(@NonNull Context context) {
+        this(context, null);
+    }
+
+    public ErrorView(@NonNull Context context, @Nullable AttributeSet attrs) {
+        this(context, attrs, -1);
+    }
+
+    public ErrorView(@NonNull Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
+        super(context, attrs, defStyleAttr);
+        init();
+    }
+
+    private void init() {
+        setOrientation(VERTICAL);
+        LayoutInflater.from(getContext()).inflate(R.layout.view_error_tip_layout, this);
+        mIvTip = findViewById(R.id.iv_tip);
+        mTvRefresh = findViewById(R.id.tv_refresh);
+        mTvBack = findViewById(R.id.tv_back);
+    }
+
+    public void setIcon(@DrawableRes int resId) {
+        if (mIvTip != null) {
+            mIvTip.setImageResource(resId);
+        }
+    }
+
+    public void setOnRefreshClickListener(OnClickListener onRefreshClickListener) {
+        if (mTvRefresh != null) {
+            mTvRefresh.setOnClickListener(onRefreshClickListener);
+        }
+    }
+
+    public void setOnBackClickListener(OnClickListener onRefreshClickListener) {
+        if (mTvBack != null) {
+            mTvBack.setOnClickListener(onRefreshClickListener);
+        }
+    }
+
+}

BIN
BaseLibrary/src/main/res/drawable-xhdpi/icon_error_tip.png


BIN
BaseLibrary/src/main/res/drawable-xxhdpi/icon_error_tip.png


+ 1 - 1
BaseLibrary/src/main/res/drawable/shape_2dc7aa_22dp_dynamic.xml

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

+ 5 - 0
BaseLibrary/src/main/res/drawable/shape_border_cecece_21dp.xml

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

+ 5 - 0
BaseLibrary/src/main/res/drawable/shape_border_main_color_21dp.xml

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

+ 63 - 0
BaseLibrary/src/main/res/layout/view_error_tip_layout.xml

@@ -0,0 +1,63 @@
+<?xml version="1.0" encoding="utf-8"?>
+<merge xmlns:android="http://schemas.android.com/apk/res/android"
+    android:layout_width="wrap_content"
+    android:layout_height="wrap_content"
+    android:orientation="vertical">
+
+    <FrameLayout
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:layout_gravity="center_horizontal">
+
+        <ImageView
+            android:id="@+id/iv_tip"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:layout_gravity="center_horizontal"
+            android:src="@drawable/icon_error_tip" />
+
+        <TextView
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:layout_gravity="center_horizontal|bottom"
+            android:layout_marginBottom="2dp"
+            android:text="@string/error_tip"
+            android:textColor="@color/color_999999"
+            android:textSize="@dimen/sp_16" />
+    </FrameLayout>
+
+    <LinearLayout
+        android:layout_gravity="center_horizontal"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:layout_marginTop="22dp"
+        android:orientation="horizontal">
+
+        <TextView
+            android:id="@+id/tv_back"
+            android:layout_width="100dp"
+            android:layout_height="36dp"
+            android:layout_gravity="center_horizontal"
+            android:background="@drawable/shape_border_cecece_21dp"
+            android:gravity="center"
+            android:includeFontPadding="false"
+            android:text="返回"
+            android:layout_marginEnd="8dp"
+            android:textColor="@color/color_777777"
+            android:textSize="@dimen/sp_16" />
+
+
+        <TextView
+            android:id="@+id/tv_refresh"
+            android:layout_width="100dp"
+            android:layout_height="36dp"
+            android:layout_gravity="center_horizontal"
+            android:layout_marginStart="8dp"
+            android:background="@drawable/shape_border_main_color_21dp"
+            android:gravity="center"
+            android:includeFontPadding="false"
+            android:text="刷新一下"
+            android:textColor="?attr/klx_main_color"
+            android:textSize="@dimen/sp_16" />
+    </LinearLayout>
+</merge>

+ 1 - 1
BaseLibrary/src/main/res/values/colors.xml

@@ -205,5 +205,5 @@
     <color name="color_f0fffc">#F0FFFC</color>
     <color name="color_fff3f5">#FFF3F5</color>
     <color name="color_646566">#646566</color>
-
+    <color name="color_cecece">#cecece</color>
 </resources>

+ 1 - 0
BaseLibrary/src/main/res/values/strings.xml

@@ -27,4 +27,5 @@
     <string name="call_phone_permission_tip">拨打电话权限用于一键联系等场景中快捷拨打电话功能;</string>
 
     <string name="app_version_tip">"版本号 %s"</string>
+    <string name="error_tip">无网络连接,请检查网络后重试</string>
 </resources>

+ 42 - 9
student/src/main/java/com/cooleshow/student/ui/web/HtmlActivity.java

@@ -57,7 +57,6 @@ import com.cooleshow.base.constanst.UploadConstants;
 import com.cooleshow.base.data.net.RetrofitClientNoToken;
 import com.cooleshow.base.router.RouterPath;
 import com.cooleshow.base.ui.activity.BaseActivity;
-import com.cooleshow.base.utils.AndroidBug5497Workaround;
 import com.cooleshow.base.utils.AppUtils;
 import com.cooleshow.base.utils.ClipboardUtils;
 import com.cooleshow.base.utils.EncryptUtils;
@@ -67,14 +66,12 @@ import com.cooleshow.base.utils.LOG;
 import com.cooleshow.base.utils.LogUtils;
 import com.cooleshow.base.utils.MyFileUtils;
 import com.cooleshow.base.utils.NetworkUtil;
-import com.cooleshow.base.utils.PermissionUtils;
 import com.cooleshow.base.utils.ScreenUtils;
 import com.cooleshow.base.utils.ToastUtil;
 import com.cooleshow.base.utils.UiUtils;
 import com.cooleshow.base.utils.UriUtils;
 import com.cooleshow.base.utils.WebParamsUtils;
 import com.cooleshow.base.utils.helper.CommonShareHelper;
-import com.cooleshow.base.utils.helper.DialogHelper;
 import com.cooleshow.base.utils.helper.DownloadHelper;
 import com.cooleshow.base.utils.helper.GlideEngine;
 import com.cooleshow.base.utils.helper.PermissionTipHelper;
@@ -171,6 +168,7 @@ public class HtmlActivity extends BaseActivity<ActivityHtml1Binding> implements
     private String mImageBase64;
     private boolean isNeedResetScreenOrientation = true;
     private boolean isResetOrientation = false;
+    private boolean isLoadError = false;
     private DownloadHelper.OnEventListener saveFileListener;
 
     private DownloadHelper.OnEventListener mEventListener;
@@ -179,7 +177,7 @@ public class HtmlActivity extends BaseActivity<ActivityHtml1Binding> implements
     protected void onCreate(@Nullable Bundle savedInstanceState) {
         //限制截屏和录屏
 //        getWindow().addFlags(WindowManager.LayoutParams.FLAG_SECURE);
-        StyleConfig.setTheme(this);
+        StyleConfig.setTheme(this);//errorView是公共的,里面有引用不同样式,故在老师端设置这个
         super.onCreate(savedInstanceState);
         KeyboardUtils.fixAndroidBug5497(this);
         EventBus.getDefault().register(this);
@@ -1153,12 +1151,16 @@ public class HtmlActivity extends BaseActivity<ActivityHtml1Binding> implements
         @Override
         public void onPageStarted(WebView view, String url, Bitmap favicon) {
             super.onPageStarted(view, url, favicon);
+            isLoadError = false;
         }
 
         //页面载入结束时调用
         @Override
         public void onPageFinished(WebView view, String url) {
             super.onPageFinished(view, url);
+            if (!isLoadError) {
+                showWebView();
+            }
             if (!TextUtils.isEmpty(authorization)) {
                 String js = "window.localStorage.setItem('Authorization','" + authorization + "');";
                 String jsUrl = "javascript:(function({var localStorage = window.localStorage; localStorage.setItem('Authorization','" + authorization + "') })()";
@@ -1216,10 +1218,41 @@ public class HtmlActivity extends BaseActivity<ActivityHtml1Binding> implements
         @Override
         public void onReceivedError(WebView view, WebResourceRequest request, WebResourceError error) {
             super.onReceivedError(view, request, error);
+            showLoadErrorView();
         }
 
     }
 
+    private void showWebView() {
+        viewParent.setVisibility(View.VISIBLE);
+    }
+
+    private void hideErrorView() {
+        viewBinding.flError.setVisibility(View.GONE);
+    }
+
+    private void showLoadErrorView() {
+        isLoadError = true;
+        viewParent.setVisibility(View.GONE);
+        viewBinding.flError.setVisibility(View.VISIBLE);
+        viewBinding.errorView.setIcon(StyleConfig.isStudentStyle ? com.cooleshow.base.R.drawable.icon_error_tip : R.drawable.icon_error_tip2);
+        viewBinding.errorView.setOnRefreshClickListener(new View.OnClickListener() {
+            @Override
+            public void onClick(View v) {
+                if (webView != null) {
+                    webView.reload();
+                    hideErrorView();
+                }
+            }
+        });
+        viewBinding.errorView.setOnBackClickListener(new View.OnClickListener() {
+            @Override
+            public void onClick(View v) {
+                finish();
+            }
+        });
+    }
+
 
     @Override
     public void onBackPressed() {
@@ -1644,8 +1677,8 @@ public class HtmlActivity extends BaseActivity<ActivityHtml1Binding> implements
 
     @Override
     public void checkCoursewareCache(JSONObject jsonObject) {
-        String [] permissions = new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE, Manifest.permission.READ_EXTERNAL_STORAGE};
-        PermissionTipHelper.getInstance().showTipDialog(this,permissions);
+        String[] permissions = new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE, Manifest.permission.READ_EXTERNAL_STORAGE};
+        PermissionTipHelper.getInstance().showTipDialog(this, permissions);
         new RxPermissions(this)
                 .request(permissions)
                 .subscribe(permission -> {
@@ -1676,8 +1709,8 @@ public class HtmlActivity extends BaseActivity<ActivityHtml1Binding> implements
         if (!checkActivityExist()) {
             return;
         }
-        String [] permissions = new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE, Manifest.permission.READ_EXTERNAL_STORAGE};
-        PermissionTipHelper.getInstance().showTipDialog(this,permissions);
+        String[] permissions = new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE, Manifest.permission.READ_EXTERNAL_STORAGE};
+        PermissionTipHelper.getInstance().showTipDialog(this, permissions);
         new RxPermissions(this)
                 .request(permissions)
                 .subscribe(permission -> {
@@ -1700,7 +1733,7 @@ public class HtmlActivity extends BaseActivity<ActivityHtml1Binding> implements
         commonDialog2.show();
         commonDialog2.setTitle("提示");
         Drawable mainBtBackground = StyleConfig.getMainBtBackground(this);
-        commonDialog2.setConfirmBackground(mainBtBackground,R.color.white);
+        commonDialog2.setConfirmBackground(mainBtBackground, R.color.white);
         commonDialog2.setContent("当前非Wi-Fi环境,是否开始下载?");
         commonDialog2.setOnConfirmClickListener(new View.OnClickListener() {
             @Override

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


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


+ 17 - 0
student/src/main/res/layout/activity_html1.xml

@@ -19,6 +19,23 @@
         android:layout_width="match_parent"
         android:layout_height="match_parent"
         android:scrollbars="none" />
+
+    <FrameLayout
+        android:background="@color/white"
+        android:id="@+id/fl_error"
+        android:layout_width="match_parent"
+        android:layout_height="match_parent"
+        android:visibility="gone">
+
+        <com.cooleshow.base.widgets.ErrorView
+            android:id="@+id/error_view"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:layout_gravity="center" />
+
+    </FrameLayout>
+
+
     <LinearLayout
         android:id="@+id/ll_activity_html"
         android:layout_width="match_parent"

+ 39 - 0
teacher/src/main/java/com/cooleshow/teacher/ui/web/HtmlActivity.java

@@ -51,6 +51,7 @@ import com.cooleshow.base.bean.WxPayResult;
 import com.cooleshow.base.common.WebApi;
 import com.cooleshow.base.common.WebConstants;
 import com.cooleshow.base.constanst.Constants;
+import com.cooleshow.base.constanst.StyleConfig;
 import com.cooleshow.base.constanst.UploadConstants;
 import com.cooleshow.base.data.net.RetrofitClientNoToken;
 import com.cooleshow.base.router.RouterPath;
@@ -170,6 +171,8 @@ public class HtmlActivity extends BaseActivity<ActivityHtml1Binding> implements
     private String mImageBase64;
     private boolean isNeedResetScreenOrientation = true;
     private boolean isResetOrientation = false;
+
+    private boolean isLoadError = false;
     private DownloadHelper.OnEventListener mEventListener;
     private DownloadHelper.OnEventListener saveFileListener;
 
@@ -177,6 +180,7 @@ public class HtmlActivity extends BaseActivity<ActivityHtml1Binding> implements
     protected void onCreate(@Nullable Bundle savedInstanceState) {
         //限制截屏和录屏
 //        getWindow().addFlags(WindowManager.LayoutParams.FLAG_SECURE);
+        StyleConfig.setTheme(this);
         super.onCreate(savedInstanceState);
         KeyboardUtils.fixAndroidBug5497(this);
         EventBus.getDefault().register(this);
@@ -1157,12 +1161,16 @@ public class HtmlActivity extends BaseActivity<ActivityHtml1Binding> implements
         @Override
         public void onPageStarted(WebView view, String url, Bitmap favicon) {
             super.onPageStarted(view, url, favicon);
+            isLoadError = false;
         }
 
         //页面载入结束时调用
         @Override
         public void onPageFinished(WebView view, String url) {
             super.onPageFinished(view, url);
+            if (!isLoadError) {
+                showWebView();
+            }
             if (!TextUtils.isEmpty(authorization)) {
                 String js = "window.localStorage.setItem('Authorization','" + authorization + "');";
                 String jsUrl = "javascript:(function({var localStorage = window.localStorage; localStorage.setItem('Authorization','" + authorization + "') })()";
@@ -1220,10 +1228,41 @@ public class HtmlActivity extends BaseActivity<ActivityHtml1Binding> implements
         @Override
         public void onReceivedError(WebView view, WebResourceRequest request, WebResourceError error) {
             super.onReceivedError(view, request, error);
+            showLoadErrorView();
         }
     }
 
 
+    private void showWebView() {
+        viewParent.setVisibility(View.VISIBLE);
+    }
+
+    private void hideErrorView() {
+        viewBinding.flError.setVisibility(View.GONE);
+    }
+
+    private void showLoadErrorView() {
+        isLoadError = true;
+        viewParent.setVisibility(View.GONE);
+        viewBinding.flError.setVisibility(View.VISIBLE);
+        viewBinding.errorView.setOnRefreshClickListener(new View.OnClickListener() {
+            @Override
+            public void onClick(View v) {
+                if (webView != null) {
+                    webView.reload();
+                    hideErrorView();
+                }
+            }
+        });
+        viewBinding.errorView.setOnBackClickListener(new View.OnClickListener() {
+            @Override
+            public void onClick(View v) {
+                finish();
+            }
+        });
+    }
+
+
     @Override
     public void onBackPressed() {
         if (isGoback && webView != null) {

+ 17 - 0
teacher/src/main/res/layout/activity_html1.xml

@@ -19,6 +19,23 @@
         android:layout_width="match_parent"
         android:layout_height="match_parent"
         android:scrollbars="none" />
+
+    <FrameLayout
+        android:background="@color/white"
+        android:id="@+id/fl_error"
+        android:layout_width="match_parent"
+        android:layout_height="match_parent"
+        android:visibility="gone">
+
+        <com.cooleshow.base.widgets.ErrorView
+            android:id="@+id/error_view"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:layout_gravity="center" />
+
+    </FrameLayout>
+
+
     <LinearLayout
         android:id="@+id/ll_activity_html"
         android:layout_width="match_parent"