package io.github.mthli.Ninja.Browser;
import android.app.Activity;
import android.app.AlertDialog;
import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
import android.graphics.Bitmap;
import android.graphics.Typeface;
import android.net.MailTo;
import android.net.http.SslError;
import android.os.Build;
import android.os.Message;
import android.support.annotation.NonNull;
import android.text.method.PasswordTransformationMethod;
import android.view.LayoutInflater;
import android.webkit.*;
import android.widget.EditText;
import android.widget.LinearLayout;
import io.github.mthli.Ninja.R;
import io.github.mthli.Ninja.Unit.BrowserUnit;
import io.github.mthli.Ninja.Unit.IntentUnit;
import io.github.mthli.Ninja.View.NinjaWebView;
import java.io.ByteArrayInputStream;
public class NinjaWebViewClient extends WebViewClient {
private NinjaWebView ninjaWebView;
private Context context;
private AdBlock adBlock;
private boolean white;
public void updateWhite(boolean white) {
this.white = white;
}
private boolean enable;
public void enableAdBlock(boolean enable) {
this.enable = enable;
}
public NinjaWebViewClient(NinjaWebView ninjaWebView) {
super();
this.ninjaWebView = ninjaWebView;
this.context = ninjaWebView.getContext();
this.adBlock = ninjaWebView.getAdBlock();
this.white = false;
this.enable = true;
}
@Override
public void onPageStarted(WebView view, String url, Bitmap favicon) {
super.onPageStarted(view, url, favicon);
if (view.getTitle() == null || view.getTitle().isEmpty()) {
ninjaWebView.update(context.getString(R.string.album_untitled), url);
} else {
ninjaWebView.update(view.getTitle(), url);
}
}
@Override
public void onPageFinished(WebView view, String url) {
super.onPageFinished(view, url);
if (!ninjaWebView.getSettings().getLoadsImagesAutomatically()) {
ninjaWebView.getSettings().setLoadsImagesAutomatically(true);
}
if (view.getTitle() == null || view.getTitle().isEmpty()) {
ninjaWebView.update(context.getString(R.string.album_untitled), url);
} else {
ninjaWebView.update(view.getTitle(), url);
}
if (ninjaWebView.isForeground()) {
ninjaWebView.invalidate();
} else {
ninjaWebView.postInvalidate();
}
}
@Override
public boolean shouldOverrideUrlLoading(WebView view, String url) {
if (url.startsWith(BrowserUnit.URL_SCHEME_MAIL_TO)) {
Intent intent = IntentUnit.getEmailIntent(MailTo.parse(url));
context.startActivity(intent);
view.reload();
return true;
} else if (url.startsWith(BrowserUnit.URL_SCHEME_INTENT)) {
Intent intent;
try {
intent = Intent.parseUri(url, Intent.URI_INTENT_SCHEME);
context.startActivity(intent);
return true;
} catch (Exception e) {} // When intent fail will crash
}
white = adBlock.isWhite(url);
return super.shouldOverrideUrlLoading(view, url);
}
@Deprecated
@Override
public WebResourceResponse shouldInterceptRequest(WebView view, String url) {
if (enable && !white && adBlock.isAd(url)) {
return new WebResourceResponse(
BrowserUnit.MIME_TYPE_TEXT_PLAIN,
BrowserUnit.URL_ENCODING,
new ByteArrayInputStream("".getBytes())
);
}
return super.shouldInterceptRequest(view, url);
}
@Override
public WebResourceResponse shouldInterceptRequest(WebView view, WebResourceRequest request) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
if (enable && !white && adBlock.isAd(request.getUrl().toString())) {
return new WebResourceResponse(
BrowserUnit.MIME_TYPE_TEXT_PLAIN,
BrowserUnit.URL_ENCODING,
new ByteArrayInputStream("".getBytes())
);
}
}
return super.shouldInterceptRequest(view, request);
}
@Override
public void onFormResubmission(WebView view, @NonNull final Message dontResend, final Message resend) {
Context holder = IntentUnit.getContext();
if (holder == null || !(holder instanceof Activity)) {
return;
}
AlertDialog.Builder builder = new AlertDialog.Builder(holder);
builder.setCancelable(false);
builder.setTitle(R.string.dialog_title_resubmission);
builder.setMessage(R.string.dialog_content_resubmission);
builder.setPositiveButton(R.string.dialog_button_positive, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
resend.sendToTarget();
}
});
builder.setNegativeButton(R.string.dialog_button_negative, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
dontResend.sendToTarget();
}
});
builder.create().show();
}
@Override
public void onReceivedSslError(WebView view, @NonNull final SslErrorHandler handler, SslError error) {
Context holder = IntentUnit.getContext();
if (holder == null || !(holder instanceof Activity)) {
return;
}
AlertDialog.Builder builder = new AlertDialog.Builder(holder);
builder.setCancelable(false);
builder.setTitle(R.string.dialog_title_warning);
builder.setMessage(R.string.dialog_content_ssl_error);
builder.setPositiveButton(R.string.dialog_button_positive, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
handler.proceed();
}
});
builder.setNegativeButton(R.string.dialog_button_negative, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
handler.cancel();
}
});
AlertDialog dialog = builder.create();
if (error.getPrimaryError() == SslError.SSL_UNTRUSTED) {
dialog.show();
} else {
handler.proceed();
}
}
@Override
public void onReceivedHttpAuthRequest(WebView view, @NonNull final HttpAuthHandler handler, String host, String realm) {
Context holder = IntentUnit.getContext();
if (holder == null || !(holder instanceof Activity)) {
return;
}
AlertDialog.Builder builder = new AlertDialog.Builder(holder);
builder.setCancelable(false);
builder.setTitle(R.string.dialog_title_sign_in);
LinearLayout signInLayout = (LinearLayout) LayoutInflater.from(holder).inflate(R.layout.dialog_sign_in, null, false);
final EditText userEdit = (EditText) signInLayout.findViewById(R.id.dialog_sign_in_username);
final EditText passEdit = (EditText) signInLayout.findViewById(R.id.dialog_sign_in_password);
passEdit.setTypeface(Typeface.DEFAULT);
passEdit.setTransformationMethod(new PasswordTransformationMethod());
builder.setView(signInLayout);
builder.setPositiveButton(R.string.dialog_button_positive, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
String user = userEdit.getText().toString().trim();
String pass = passEdit.getText().toString().trim();
handler.proceed(user, pass);
}
});
builder.setNegativeButton(R.string.dialog_button_negative, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
handler.cancel();
}
});
builder.create().show();
}
}