소스 검색

1.修改Android Apex CRM首次加载显示进度指示器以及出错处理。
2.修改Android Apex CRM,增加缓存清理接口。

Pen Li 7 년 전
부모
커밋
5776d5b0f4

+ 107 - 1
ApexDrivers/apexcrm/src/main/java/com/usai/apex/apexcrm/MainActivity.java

@@ -7,17 +7,28 @@ import android.content.DialogInterface;
 import android.content.Intent;
 import android.content.pm.PackageInfo;
 import android.content.pm.PackageManager;
+import android.graphics.Bitmap;
 import android.net.Uri;
+import android.net.http.SslError;
 import android.os.Build;
 import android.os.Bundle;
 import android.support.v4.content.PermissionChecker;
 import android.support.v7.app.ActionBar;
 import android.support.v7.app.AlertDialog;
 import android.support.v7.app.AppCompatActivity;
+import android.text.TextUtils;
 import android.util.Log;
 import android.view.MenuItem;
 import android.view.View;
+import android.webkit.SslErrorHandler;
 import android.webkit.ValueCallback;
+import android.webkit.WebResourceError;
+import android.webkit.WebResourceRequest;
+import android.webkit.WebResourceResponse;
+import android.webkit.WebView;
+import android.widget.Button;
+import android.widget.ProgressBar;
+import android.widget.RelativeLayout;
 import android.widget.Toast;
 
 import com.usai.apex.apexcrm.dataProvider.DataProvider;
@@ -52,7 +63,7 @@ import static com.usai.redant.rautils.infinitephoto.InfinitePhotoItem.PlaceHolde
 import static com.usai.redant.rautils.utils.Network.RESULT_TRUE;
 
 
-public class MainActivity extends AppCompatActivity {
+public class MainActivity extends AppCompatActivity implements RAWebView.WebViewLoadCallback {
 
     private static final String TAG = "MainActivity";
 
@@ -74,6 +85,11 @@ public class MainActivity extends AppCompatActivity {
     private RAJSInterface mJSInterface;
     private ValueCallback<Uri[]> mFileCallback;
 
+    private RelativeLayout mEmptyContainer;
+    private Button mReloadBtn;
+    private ProgressBar mProgressbar;
+    private String mURL;
+
     @Override
     protected void onCreate(Bundle savedInstanceState) {
         super.onCreate(savedInstanceState);
@@ -85,6 +101,16 @@ public class MainActivity extends AppCompatActivity {
             actionBar.hide();
         }
 
+        mEmptyContainer = findViewById(R.id.web_empty_container);
+        mReloadBtn = findViewById(R.id.reload_button);
+        mReloadBtn.setOnClickListener(new View.OnClickListener() {
+            @Override
+            public void onClick(View v) {
+                clickReload();
+            }
+        });
+        mProgressbar = findViewById(R.id.web_progress_indicator);
+
         mWebView = RAWebView.findWebViewByIdWithDelegate(this, R.id.webview);
 
         mJSInterface = new RAJSInterface(mActionHandler);
@@ -105,6 +131,8 @@ public class MainActivity extends AppCompatActivity {
             }
         });
 
+        mWebView.setLoadCallback(this);
+
         if (savedInstanceState != null) {
             mCurrentActionString = savedInstanceState.getString(CurrentActionStringKey);
 
@@ -141,6 +169,11 @@ public class MainActivity extends AppCompatActivity {
         }
     }
 
+    private void clickReload() {
+        mEmptyContainer.setVisibility(View.GONE);
+        mWebView.loadUrl(mURL);
+    }
+
     @Override
     protected void onRestoreInstanceState(Bundle savedInstanceState) {
         super.onRestoreInstanceState(savedInstanceState);
@@ -1007,5 +1040,78 @@ public class MainActivity extends AppCompatActivity {
                 e.printStackTrace();
             }
         }
+
+        @Override
+        public void CleanCache(String msg) {
+            mWebView.clearCache();
+            try {
+                JSONObject json = new JSONObject(msg);
+                String js = mJSInterface.returnToWebPage(json, "");
+                evaluateJavaScript(js);
+            } catch (JSONException e) {
+                e.printStackTrace();
+            }
+
+        }
     };
+
+    // region Loac Callback
+
+    private boolean initialize = false; // 首页加载完成
+    private boolean error = false;
+
+    @Override
+    public void onPageStarted(WebView view, String url, Bitmap favicon) {
+
+        Log.d(TAG, "onPageStarted: 0");
+
+        mURL = url;
+        synchronized (self) {
+            if (!initialize) {
+                mProgressbar.setVisibility(View.VISIBLE);
+                error = false;
+            }
+        }
+        Log.d(TAG, "onPageStarted: 1");
+
+    }
+
+    @Override
+    public void onPageFinished(WebView view, String url) {
+
+        Log.d(TAG, "onPageFinished: 0");
+        
+       synchronized (self) {
+           if (!initialize && !error) {
+               initialize = true;
+           }
+           mProgressbar.setVisibility(View.GONE);
+       }
+
+
+        Log.d(TAG, "onPageFinished: 1");
+    }
+
+    @Override
+    public void onReceivedError(WebView view, int errorCode, String description, String failingUrl) {
+
+        error = true;
+        mEmptyContainer.setVisibility(View.VISIBLE);
+    }
+
+    @Override
+    public void onReceivedHttpError(WebView view, WebResourceRequest request, WebResourceResponse errorResponse) {
+
+        error = true;
+        mEmptyContainer.setVisibility(View.VISIBLE);
+    }
+
+    @Override
+    public void onReceivedSslError(WebView view, SslErrorHandler handler, SslError error) {
+
+        this.error = true;
+        mEmptyContainer.setVisibility(View.VISIBLE);
+    }
+
+    // endregion
 }

+ 8 - 0
ApexDrivers/apexcrm/src/main/java/com/usai/apex/apexcrm/RAJSInterface.java

@@ -22,6 +22,7 @@ public class RAJSInterface extends Object {
         void DatetimePicker(String msg);
         void SelectContact(String msg);
         void RequestAppVersion(String msg);
+        void CleanCache(String msg);
     }
 
     private RAJSInterfaceDelegate delegate;
@@ -141,6 +142,13 @@ public class RAJSInterface extends Object {
         }
     }
 
+    @android.webkit.JavascriptInterface
+    public void cleanCache(String msg) {
+        if (delegate != null) {
+            delegate.CleanCache(msg);
+        }
+    }
+
     private static boolean jsonValueIsNull(JSONObject json, String key) {
 
         if (json != null && key != null && json.has(key)) {

+ 100 - 1
ApexDrivers/apexcrm/src/main/java/com/usai/apex/apexcrm/RAWebView.java

@@ -5,7 +5,9 @@ import android.annotation.SuppressLint;
 import android.content.ActivityNotFoundException;
 import android.content.Context;
 import android.content.Intent;
+import android.graphics.Bitmap;
 import android.net.Uri;
+import android.net.http.SslError;
 import android.os.Bundle;
 import android.support.annotation.Nullable;
 import android.support.v7.app.AppCompatActivity;
@@ -15,8 +17,10 @@ import android.view.View;
 import android.webkit.ConsoleMessage;
 import android.webkit.JsPromptResult;
 import android.webkit.JsResult;
+import android.webkit.SslErrorHandler;
 import android.webkit.ValueCallback;
 import android.webkit.WebChromeClient;
+import android.webkit.WebResourceError;
 import android.webkit.WebResourceRequest;
 import android.webkit.WebResourceResponse;
 import android.webkit.WebSettings;
@@ -158,6 +162,24 @@ public class RAWebView extends RelativeLayout {
         }
     }
 
+    public void clearCache() {
+        if (mWebView != null) {
+            mWebView.clearCache(true);
+        }
+    }
+
+    public void loadHtmlString(String html) {
+        if (html != null) {
+            mWebView.loadData(html, "text/html", null);
+        }
+    }
+
+    public void reload() {
+        if (mWebView != null) {
+            mWebView.reload();
+        }
+    }
+
     public void evaluateJavascript(String script, ValueCallback<String> resultCallback) {
         if (mWebView != null) {
             mWebView.evaluateJavascript(script, resultCallback);
@@ -191,7 +213,7 @@ public class RAWebView extends RelativeLayout {
 
                     Uri uri = request.getUrl();
                     String url = uri.getPath();
-                    if (url.startsWith("/file://")) {
+                    if (url != null && url.startsWith("/file://")) {
 
                         String path = url.replace("/file://","");
                         File file = new File(path);
@@ -208,6 +230,66 @@ public class RAWebView extends RelativeLayout {
                     return response;
                 }
 
+
+                @Override
+                public void onPageStarted(WebView view, String url, Bitmap favicon) {
+                    super.onPageStarted(view, url, favicon);
+
+                    Log.d(TAG, "onPageStarted: ");
+                    if (mLoadCallback != null) {
+                        mLoadCallback.onPageStarted(view, url, favicon);
+                    }
+                }
+
+                @Override
+                public void onPageFinished(WebView view, String url) {
+                    super.onPageFinished(view, url);
+                    Log.d(TAG, "onPageFinished: ");
+                    if (mLoadCallback != null) {
+                        mLoadCallback.onPageFinished(view, url);
+                    }
+                }
+
+                @Override
+                public void onReceivedError(WebView view, int errorCode,String description, String failingUrl) {
+//                    super.onReceivedError(view, errorCode, description, failingUrl);
+
+                    Log.d(TAG, "onReceivedError: 0");
+                    if (mLoadCallback != null) {
+                        mLoadCallback.onReceivedError(view, errorCode, description, failingUrl);
+                    }
+                }
+
+//                @Override
+//                public void onReceivedError(WebView view, WebResourceRequest request, WebResourceError error) {
+//                    super.onReceivedError(view, request, error);
+//
+//                    Log.d(TAG, "onReceivedError: 1");
+//                    if (mLoadCallback != null) {
+//                        mLoadCallback.onReceivedError(view, request, error);
+//                    }
+//                }
+
+                @Override
+                public void onReceivedHttpError(WebView view, WebResourceRequest request, WebResourceResponse errorResponse) {
+                    super.onReceivedHttpError(view, request, errorResponse);
+
+                    Log.d(TAG, "onReceivedHttpError: ");
+                    if (mLoadCallback != null) {
+                        mLoadCallback.onReceivedHttpError(view, request, errorResponse);
+                    }
+                }
+
+                @Override
+                public void onReceivedSslError(WebView view, SslErrorHandler handler, SslError error) {
+                    super.onReceivedSslError(view, handler, error);
+
+                    Log.d(TAG, "onReceivedSslError: ");
+                    if (mLoadCallback != null) {
+                        mLoadCallback.onReceivedSslError(view, handler, error);
+                    }
+                }
+
             });
         }
     }
@@ -291,4 +373,21 @@ public class RAWebView extends RelativeLayout {
     public void setFileChooserCallback(WebViewFileChooserCallback callback) {
         this.mFileChooserCallback = callback;
     }
+
+    /**
+     * Load Callback
+     * */
+    public interface WebViewLoadCallback {
+        void onPageStarted(WebView view, String url, Bitmap favicon);
+        void onPageFinished(WebView view, String url);
+        void onReceivedError(WebView view, int errorCode,String description, String failingUrl);
+//        void onReceivedError(WebView view, WebResourceRequest request, WebResourceError error);
+        void onReceivedHttpError(WebView view, WebResourceRequest request, WebResourceResponse errorResponse);
+        void onReceivedSslError(WebView view, SslErrorHandler handler, SslError error);
+    }
+
+    private WebViewLoadCallback mLoadCallback;
+    public void setLoadCallback(WebViewLoadCallback callback) {
+        this.mLoadCallback = callback;
+    }
 }

+ 17 - 0
ApexDrivers/apexcrm/src/main/res/drawable/crm_clear_round_corner_bg.xml

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

+ 49 - 4
ApexDrivers/apexcrm/src/main/res/layout/activity_main.xml

@@ -10,13 +10,58 @@
         android:id="@+id/webview"
         android:layout_width="0dp"
         android:layout_height="0dp"
-        android:layout_marginBottom="8dp"
-        android:layout_marginEnd="8dp"
-        android:layout_marginStart="8dp"
-        android:layout_marginTop="8dp"
+        android:layout_marginBottom="0dp"
+        android:layout_marginEnd="0dp"
+        android:layout_marginStart="0dp"
+        android:layout_marginTop="0dp"
         app:layout_constraintBottom_toBottomOf="parent"
         app:layout_constraintEnd_toEndOf="parent"
         app:layout_constraintStart_toStartOf="parent"
         app:layout_constraintTop_toTopOf="parent" />
 
+    <RelativeLayout
+        android:id="@+id/web_empty_container"
+        android:layout_width="0dp"
+        android:layout_height="0dp"
+        android:layout_marginBottom="0dp"
+        android:layout_marginEnd="0dp"
+        android:layout_marginStart="0dp"
+        android:layout_marginTop="0dp"
+        app:layout_constraintBottom_toBottomOf="parent"
+        app:layout_constraintEnd_toEndOf="parent"
+        app:layout_constraintStart_toStartOf="parent"
+        app:layout_constraintTop_toTopOf="parent"
+        android:background="#ffffff"
+        android:visibility="gone"
+        >
+
+
+        <Button
+            android:id="@+id/reload_button"
+            android:layout_width="100dp"
+            android:layout_height="60dp"
+            android:background="@drawable/crm_clear_round_corner_bg"
+            android:layout_centerInParent="true"
+            android:textAllCaps="false"
+            android:text="Reload"
+            android:textSize="17sp"
+            />
+
+
+    </RelativeLayout>
+
+
+    <ProgressBar
+        android:id="@+id/web_progress_indicator"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:layout_centerHorizontal="true"
+        android:layout_centerVertical="true"
+        app:layout_constraintBottom_toBottomOf="@+id/webview"
+        app:layout_constraintEnd_toEndOf="@+id/webview"
+        app:layout_constraintStart_toStartOf="@+id/webview"
+        app:layout_constraintTop_toTopOf="@+id/webview"
+        android:visibility="gone"
+        />
+
 </android.support.constraint.ConstraintLayout>