From 3dc5246e5f8d38f2e13409a337ef706476a70eb6 Mon Sep 17 00:00:00 2001 From: Anton Tananaev Date: Sat, 5 Nov 2016 17:52:39 +1300 Subject: Implement local file assets --- .gitignore | 1 + .../java/org/traccar/manager/MainFragment.java | 90 ++++++++++++++++++++++ 2 files changed, 91 insertions(+) diff --git a/.gitignore b/.gitignore index e80dccc..1e523ba 100644 --- a/.gitignore +++ b/.gitignore @@ -5,3 +5,4 @@ local.properties app/app.iml build/ app/build/ +app/src/main/assets diff --git a/app/src/main/java/org/traccar/manager/MainFragment.java b/app/src/main/java/org/traccar/manager/MainFragment.java index 5b2c5c5..40e0808 100644 --- a/app/src/main/java/org/traccar/manager/MainFragment.java +++ b/app/src/main/java/org/traccar/manager/MainFragment.java @@ -16,26 +16,45 @@ package org.traccar.manager; import android.content.pm.ApplicationInfo; +import android.content.res.AssetManager; +import android.net.Uri; import android.os.Build; import android.os.Bundle; import android.preference.PreferenceManager; import android.view.View; +import android.webkit.MimeTypeMap; +import android.webkit.WebResourceResponse; import android.webkit.WebSettings; import android.webkit.WebView; +import android.webkit.WebViewClient; import android.webkit.WebViewFragment; +import java.io.IOException; +import java.io.InputStream; +import java.net.HttpURLConnection; +import java.util.HashMap; +import java.util.Map; + public class MainFragment extends WebViewFragment { + private String version = "3.7"; + private Uri serverUri; + private AssetManager assetManager; + @Override public void onViewCreated(View view, Bundle savedInstanceState) { super.onViewCreated(view, savedInstanceState); + assetManager = getActivity().getAssets(); + if ((getActivity().getApplicationInfo().flags &= ApplicationInfo.FLAG_DEBUGGABLE) != 0) { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) { WebView.setWebContentsDebuggingEnabled(true); } } + getWebView().setWebViewClient(webViewClient); + WebSettings webSettings = getWebView().getSettings(); webSettings.setJavaScriptEnabled(true); webSettings.setDomStorageEnabled(true); @@ -43,8 +62,79 @@ public class MainFragment extends WebViewFragment { String url = PreferenceManager.getDefaultSharedPreferences( getActivity()).getString(MainActivity.PREFERENCE_URL, null); + serverUri = Uri.parse(url); getWebView().loadUrl(url); } + public String getMimeType(String url) { + String extension = MimeTypeMap.getFileExtensionFromUrl(url); + if (extension != null) { + switch (extension) { + case "js": + return "text/javascript"; + case "woff": + return "application/font-woff"; + case "woff2": + return "application/font-woff2"; + case "ttf": + return "application/x-font-ttf"; + case "eot": + return "application/vnd.ms-fontobject"; + case "svg": + return "image/svg+xml"; + default: + return MimeTypeMap.getSingleton().getMimeTypeFromExtension(extension); + } + } + return null; + } + + public WebResourceResponse loadFileFromAssets(String url, String file) throws IOException { + String mimeType = getMimeType(url); + String encoding = "UTF-8"; + InputStream inputStream = assetManager.open(file); + + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { + int statusCode = HttpURLConnection.HTTP_OK; + String reasonPhase = "OK"; + Map responseHeaders = new HashMap<>(); + responseHeaders.put("Access-Control-Allow-Origin", "*"); + return new WebResourceResponse(mimeType, encoding, statusCode, reasonPhase, responseHeaders, inputStream); + } else { + return new WebResourceResponse(mimeType, encoding, inputStream); + } + } + + private WebViewClient webViewClient = new WebViewClient() { + + @SuppressWarnings("deprecation") + @Override + public WebResourceResponse shouldInterceptRequest(WebView view, String url) { + Uri uri = Uri.parse(url); + if (uri.getHost().equals(serverUri.getHost())) { + String path = uri.getPath(); + if (!path.startsWith("/api")) { + if (path.equals("/")) { + path = "/release.html"; + } + try { + return loadFileFromAssets(url, "app/" + version + path); + } catch (IOException e) { + return null; + } + } + } else if (uri.getHost().equals("cdnjs.cloudflare.com")) { + String path = uri.getPath().substring("/ajax/libs".length()); + try { + return loadFileFromAssets(url, "cdnjs" + path); + } catch (IOException e) { + return null; + } + } + return null; + } + + }; + } -- cgit v1.2.3