131 lines
5.0 KiB
Java
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

package com.cradle.iitc_mobile;
import android.content.Context;
import android.content.Intent;
import android.content.SharedPreferences;
import android.net.Uri;
import android.net.http.SslError;
import android.preference.PreferenceManager;
import android.util.Log;
import android.webkit.SslErrorHandler;
import android.webkit.WebResourceResponse;
import android.webkit.WebView;
import android.webkit.WebViewClient;
import java.io.ByteArrayInputStream;
import java.io.InputStream;
import java.io.IOException;
import java.net.URL;
import java.util.Scanner;
public class IITC_WebViewClient extends WebViewClient {
private static final ByteArrayInputStream style = new ByteArrayInputStream(
"body, #dashboard_container, #map_canvas { background: #000 !important; }".getBytes());
private static final ByteArrayInputStream empty = new ByteArrayInputStream("".getBytes());
private WebResourceResponse iitcjs;
private String js = null;
Context context;
public IITC_WebViewClient(Context c) {
this.context = c;
try {
loadIITC_JS(c);
} catch(IOException e) {
e.printStackTrace();
}
}
public String getIITCVersion() {
String header = js.substring(js.indexOf("==UserScript=="), js.indexOf("==/UserScript=="));
// remove new line comments
header = header.replace("\n//", "");
// get a list of key-value
String[] attributes = header.split(" +");
String iitc_version = "not found";
for (int i = 0; i < attributes.length; i++) {
// search vor version and use the value
if (attributes[i].equals("@version")) iitc_version = attributes[i+1];
}
return iitc_version;
}
public void loadIITC_JS(Context c) throws java.io.IOException {
// in developer options, you are able to load the script from external source
// if a http address is given, use script from this address. else use the local script
SharedPreferences sharedPref = PreferenceManager.getDefaultSharedPreferences(c);
String iitc_source = sharedPref.getString("pref_iitc_source", "local");
String js = "";
if (iitc_source.contains("http")) {
URL url = new URL(iitc_source);
js = new Scanner(url.openStream(), "UTF-8").useDelimiter("\\A").next();
} else {
InputStream input;
input = c.getAssets().open("iitc.js");
int size = input.available();
byte[] buffer = new byte[size];
input.read(buffer);
input.close();
js = new String(buffer);
}
this.js = js;
// need to wrap the mobile iitc.js version in a document ready. IITC
// expects to be injected after the DOM has been loaded completely.
// Since the mobile client injects IITC by replacing the gen_dashboard
// file, IITC runs to early. The document.ready delays IITC long enough
// so it boots correctly.
js = "$(document).ready(function(){" + js + "});";
iitcjs = new WebResourceResponse(
"text/javascript",
"UTF-8",
new ByteArrayInputStream(js.getBytes())
);
};
// enable https
@Override
public void onReceivedSslError (WebView view, SslErrorHandler handler, SslError error) {
handler.proceed() ;
};
// Check every external resource if its okay to load it and maybe replace it
// with our own content. This is used to block loading Niantic resources
// which arent required and to inject IITC early into the site.
// via http://stackoverflow.com/a/8274881/1684530
@Override
public WebResourceResponse shouldInterceptRequest (final WebView view, String url) {
if(url.contains("/css/common.css")) {
return new WebResourceResponse("text/css", "UTF-8", style);
} else if(url.contains("gen_dashboard.js")) {
return this.iitcjs;
} else if(url.contains("/css/ap_icons.css")
|| url.contains("/css/map_icons.css")
|| url.contains("/css/misc_icons.css")
|| url.contains("/css/style_full.css")
|| url.contains("/css/style_mobile.css")
|| url.contains("/css/portalrender.css")
|| url.contains("js/analytics.js")
|| url.contains("google-analytics.com/ga.js")) {
return new WebResourceResponse("text/plain", "UTF-8", empty);
} else {
return super.shouldInterceptRequest(view, url);
}
}
// start non-ingress-intel-urls in another app...
@Override
public boolean shouldOverrideUrlLoading(WebView view, String url) {
if (url.contains("ingress.com/intel")) {
return false;
} else {
Log.d("iitcm", "no ingress intel link, start external app to load url");
Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse(url));
context.startActivity(intent);
return true;
}
}
}