Commit ffb36fa9 authored by crazecoder's avatar crazecoder

Fix bugs when selecting a file crash when a webview widget is reopened

parent fead4fb2
package com.pichillilorenzo.flutter_inappbrowser; package com.pichillilorenzo.flutter_inappbrowser;
import android.net.Uri;
import android.os.Build; import android.os.Build;
import android.webkit.ValueCallback;
import io.flutter.plugin.common.MethodChannel; import io.flutter.plugin.common.MethodChannel;
import io.flutter.plugin.common.PluginRegistry; import io.flutter.plugin.common.PluginRegistry;
...@@ -15,6 +17,8 @@ public class InAppBrowserFlutterPlugin implements FlutterPlugin { ...@@ -15,6 +17,8 @@ public class InAppBrowserFlutterPlugin implements FlutterPlugin {
public static InAppBrowser inAppBrowser; public static InAppBrowser inAppBrowser;
public static MyCookieManager myCookieManager; public static MyCookieManager myCookieManager;
public static CredentialDatabaseHandler credentialDatabaseHandler; public static CredentialDatabaseHandler credentialDatabaseHandler;
public static ValueCallback<Uri[]> uploadMessageArray;
public InAppBrowserFlutterPlugin() {} public InAppBrowserFlutterPlugin() {}
...@@ -61,5 +65,6 @@ public class InAppBrowserFlutterPlugin implements FlutterPlugin { ...@@ -61,5 +65,6 @@ public class InAppBrowserFlutterPlugin implements FlutterPlugin {
credentialDatabaseHandler.dispose(); credentialDatabaseHandler.dispose();
credentialDatabaseHandler = null; credentialDatabaseHandler = null;
} }
uploadMessageArray = null;
} }
} }
...@@ -40,516 +40,515 @@ import static android.app.Activity.RESULT_OK; ...@@ -40,516 +40,515 @@ import static android.app.Activity.RESULT_OK;
public class InAppWebChromeClient extends WebChromeClient implements PluginRegistry.ActivityResultListener { public class InAppWebChromeClient extends WebChromeClient implements PluginRegistry.ActivityResultListener {
protected static final String LOG_TAG = "IABWebChromeClient"; protected static final String LOG_TAG = "IABWebChromeClient";
private PluginRegistry.Registrar registrar; private PluginRegistry.Registrar registrar;
private FlutterWebView flutterWebView; private FlutterWebView flutterWebView;
private InAppBrowserActivity inAppBrowserActivity; private InAppBrowserActivity inAppBrowserActivity;
private ValueCallback<Uri[]> mUploadMessageArray; private ValueCallback<Uri> mUploadMessage;
private ValueCallback<Uri> mUploadMessage; private final static int FILECHOOSER_RESULTCODE = 1;
private final static int FILECHOOSER_RESULTCODE = 1;
private View mCustomView;
private View mCustomView; private WebChromeClient.CustomViewCallback mCustomViewCallback;
private WebChromeClient.CustomViewCallback mCustomViewCallback; protected FrameLayout mFullscreenContainer;
protected FrameLayout mFullscreenContainer; private int mOriginalOrientation;
private int mOriginalOrientation; private int mOriginalSystemUiVisibility;
private int mOriginalSystemUiVisibility;
public InAppWebChromeClient(Object obj, PluginRegistry.Registrar registrar) {
public InAppWebChromeClient(Object obj, PluginRegistry.Registrar registrar) { super();
super(); this.registrar = registrar;
this.registrar = registrar; if (obj instanceof InAppBrowserActivity)
if (obj instanceof InAppBrowserActivity) this.inAppBrowserActivity = (InAppBrowserActivity) obj;
this.inAppBrowserActivity = (InAppBrowserActivity) obj; else if (obj instanceof FlutterWebView)
else if (obj instanceof FlutterWebView) this.flutterWebView = (FlutterWebView) obj;
this.flutterWebView = (FlutterWebView) obj;
registrar.addActivityResultListener(this);
registrar.addActivityResultListener(this);
}
public Bitmap getDefaultVideoPoster() {
if (mCustomView == null) {
return null;
} }
return BitmapFactory.decodeResource(this.registrar.activeContext().getResources(), 2130837573);
} public Bitmap getDefaultVideoPoster() {
if (mCustomView == null) {
public void onHideCustomView() { return null;
View decorView = this.registrar.activity().getWindow().getDecorView(); }
((FrameLayout) decorView).removeView(this.mCustomView); return BitmapFactory.decodeResource(this.registrar.activeContext().getResources(), 2130837573);
this.mCustomView = null;
decorView.setSystemUiVisibility(this.mOriginalSystemUiVisibility);
this.registrar.activity().setRequestedOrientation(this.mOriginalOrientation);
this.mCustomViewCallback.onCustomViewHidden();
this.mCustomViewCallback = null;
}
public void onShowCustomView(View paramView, WebChromeClient.CustomViewCallback paramCustomViewCallback) {
if (this.mCustomView != null) {
onHideCustomView();
return;
} }
View decorView = this.registrar.activity().getWindow().getDecorView();
this.mCustomView = paramView; public void onHideCustomView() {
this.mOriginalSystemUiVisibility = decorView.getSystemUiVisibility(); View decorView = this.registrar.activity().getWindow().getDecorView();
this.mOriginalOrientation = this.registrar.activity().getRequestedOrientation(); ((FrameLayout) decorView).removeView(this.mCustomView);
this.mCustomViewCallback = paramCustomViewCallback; this.mCustomView = null;
this.mCustomView.setBackgroundColor(Color.parseColor("#000000")); decorView.setSystemUiVisibility(this.mOriginalSystemUiVisibility);
((FrameLayout) decorView).addView(this.mCustomView, new FrameLayout.LayoutParams(-1, -1)); this.registrar.activity().setRequestedOrientation(this.mOriginalOrientation);
decorView.setSystemUiVisibility(3846 | View.SYSTEM_UI_FLAG_LAYOUT_STABLE); this.mCustomViewCallback.onCustomViewHidden();
} this.mCustomViewCallback = null;
}
@Override
public boolean onJsAlert(final WebView view, String url, final String message, public void onShowCustomView(View paramView, WebChromeClient.CustomViewCallback paramCustomViewCallback) {
final JsResult result) { if (this.mCustomView != null) {
Map<String, Object> obj = new HashMap<>(); onHideCustomView();
if (inAppBrowserActivity != null) return;
obj.put("uuid", inAppBrowserActivity.uuid); }
obj.put("message", message); View decorView = this.registrar.activity().getWindow().getDecorView();
this.mCustomView = paramView;
getChannel().invokeMethod("onJsAlert", obj, new MethodChannel.Result() { this.mOriginalSystemUiVisibility = decorView.getSystemUiVisibility();
@Override this.mOriginalOrientation = this.registrar.activity().getRequestedOrientation();
public void success(Object response) { this.mCustomViewCallback = paramCustomViewCallback;
String responseMessage = null; this.mCustomView.setBackgroundColor(Color.parseColor("#000000"));
String confirmButtonTitle = null; ((FrameLayout) decorView).addView(this.mCustomView, new FrameLayout.LayoutParams(-1, -1));
decorView.setSystemUiVisibility(3846 | View.SYSTEM_UI_FLAG_LAYOUT_STABLE);
if (response != null) { }
Map<String, Object> responseMap = (Map<String, Object>) response;
responseMessage = (String) responseMap.get("message"); @Override
confirmButtonTitle = (String) responseMap.get("confirmButtonTitle"); public boolean onJsAlert(final WebView view, String url, final String message,
Boolean handledByClient = (Boolean) responseMap.get("handledByClient"); final JsResult result) {
if (handledByClient != null && handledByClient) { Map<String, Object> obj = new HashMap<>();
Integer action = (Integer) responseMap.get("action"); if (inAppBrowserActivity != null)
action = action != null ? action : 1; obj.put("uuid", inAppBrowserActivity.uuid);
switch (action) { obj.put("message", message);
case 0:
result.confirm(); getChannel().invokeMethod("onJsAlert", obj, new MethodChannel.Result() {
break; @Override
case 1: public void success(Object response) {
default: String responseMessage = null;
String confirmButtonTitle = null;
if (response != null) {
Map<String, Object> responseMap = (Map<String, Object>) response;
responseMessage = (String) responseMap.get("message");
confirmButtonTitle = (String) responseMap.get("confirmButtonTitle");
Boolean handledByClient = (Boolean) responseMap.get("handledByClient");
if (handledByClient != null && handledByClient) {
Integer action = (Integer) responseMap.get("action");
action = action != null ? action : 1;
switch (action) {
case 0:
result.confirm();
break;
case 1:
default:
result.cancel();
}
return;
}
}
createAlertDialog(view, message, result, responseMessage, confirmButtonTitle);
}
@Override
public void error(String s, String s1, Object o) {
Log.e(LOG_TAG, s + ", " + s1);
result.cancel(); result.cancel();
} }
return;
} @Override
public void notImplemented() {
createAlertDialog(view, message, result, null, null);
}
});
return true;
}
public void createAlertDialog(WebView view, String message, final JsResult result, String responseMessage, String confirmButtonTitle) {
String alertMessage = (responseMessage != null && !responseMessage.isEmpty()) ? responseMessage : message;
DialogInterface.OnClickListener clickListener = new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
result.confirm();
dialog.dismiss();
}
};
AlertDialog.Builder alertDialogBuilder = new AlertDialog.Builder(view.getContext(), R.style.Theme_AppCompat_Dialog_Alert);
alertDialogBuilder.setMessage(alertMessage);
if (confirmButtonTitle != null && !confirmButtonTitle.isEmpty()) {
alertDialogBuilder.setPositiveButton(confirmButtonTitle, clickListener);
} else {
alertDialogBuilder.setPositiveButton(android.R.string.ok, clickListener);
} }
createAlertDialog(view, message, result, responseMessage, confirmButtonTitle); alertDialogBuilder.setOnCancelListener(new DialogInterface.OnCancelListener() {
} @Override
public void onCancel(DialogInterface dialog) {
@Override result.cancel();
public void error(String s, String s1, Object o) { dialog.dismiss();
Log.e(LOG_TAG, s + ", " + s1); }
result.cancel(); });
}
AlertDialog alertDialog = alertDialogBuilder.create();
@Override alertDialog.show();
public void notImplemented() {
createAlertDialog(view, message, result, null, null);
}
});
return true;
}
public void createAlertDialog(WebView view, String message, final JsResult result, String responseMessage, String confirmButtonTitle) {
String alertMessage = (responseMessage != null && !responseMessage.isEmpty()) ? responseMessage : message;
DialogInterface.OnClickListener clickListener = new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
result.confirm();
dialog.dismiss();
}
};
AlertDialog.Builder alertDialogBuilder = new AlertDialog.Builder(view.getContext(), R.style.Theme_AppCompat_Dialog_Alert);
alertDialogBuilder.setMessage(alertMessage);
if (confirmButtonTitle != null && !confirmButtonTitle.isEmpty()) {
alertDialogBuilder.setPositiveButton(confirmButtonTitle, clickListener);
} else {
alertDialogBuilder.setPositiveButton(android.R.string.ok, clickListener);
} }
alertDialogBuilder.setOnCancelListener(new DialogInterface.OnCancelListener() { @Override
@Override public boolean onJsConfirm(final WebView view, String url, final String message,
public void onCancel(DialogInterface dialog) { final JsResult result) {
result.cancel(); Map<String, Object> obj = new HashMap<>();
dialog.dismiss(); if (inAppBrowserActivity != null)
} obj.put("uuid", inAppBrowserActivity.uuid);
}); obj.put("message", message);
getChannel().invokeMethod("onJsConfirm", obj, new MethodChannel.Result() {
@Override
public void success(Object response) {
String responseMessage = null;
String confirmButtonTitle = null;
String cancelButtonTitle = null;
if (response != null) {
Map<String, Object> responseMap = (Map<String, Object>) response;
responseMessage = (String) responseMap.get("message");
confirmButtonTitle = (String) responseMap.get("confirmButtonTitle");
cancelButtonTitle = (String) responseMap.get("cancelButtonTitle");
Boolean handledByClient = (Boolean) responseMap.get("handledByClient");
if (handledByClient != null && handledByClient) {
Integer action = (Integer) responseMap.get("action");
action = action != null ? action : 1;
switch (action) {
case 0:
result.confirm();
break;
case 1:
default:
result.cancel();
}
return;
}
}
createConfirmDialog(view, message, result, responseMessage, confirmButtonTitle, cancelButtonTitle);
}
AlertDialog alertDialog = alertDialogBuilder.create(); @Override
alertDialog.show(); public void error(String s, String s1, Object o) {
} Log.e(LOG_TAG, s + ", " + s1);
result.cancel();
}
@Override @Override
public boolean onJsConfirm(final WebView view, String url, final String message, public void notImplemented() {
final JsResult result) { createConfirmDialog(view, message, result, null, null, null);
Map<String, Object> obj = new HashMap<>(); }
if (inAppBrowserActivity != null) });
obj.put("uuid", inAppBrowserActivity.uuid);
obj.put("message", message); return true;
}
getChannel().invokeMethod("onJsConfirm", obj, new MethodChannel.Result() {
@Override public void createConfirmDialog(WebView view, String message, final JsResult result, String responseMessage, String confirmButtonTitle, String cancelButtonTitle) {
public void success(Object response) { String alertMessage = (responseMessage != null && !responseMessage.isEmpty()) ? responseMessage : message;
String responseMessage = null; DialogInterface.OnClickListener confirmClickListener = new DialogInterface.OnClickListener() {
String confirmButtonTitle = null; @Override
String cancelButtonTitle = null; public void onClick(DialogInterface dialog, int which) {
if (response != null) {
Map<String, Object> responseMap = (Map<String, Object>) response;
responseMessage = (String) responseMap.get("message");
confirmButtonTitle = (String) responseMap.get("confirmButtonTitle");
cancelButtonTitle = (String) responseMap.get("cancelButtonTitle");
Boolean handledByClient = (Boolean) responseMap.get("handledByClient");
if (handledByClient != null && handledByClient) {
Integer action = (Integer) responseMap.get("action");
action = action != null ? action : 1;
switch (action) {
case 0:
result.confirm(); result.confirm();
break; dialog.dismiss();
case 1: }
default: };
DialogInterface.OnClickListener cancelClickListener = new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
result.cancel(); result.cancel();
dialog.dismiss();
} }
return; };
}
AlertDialog.Builder alertDialogBuilder = new AlertDialog.Builder(view.getContext(), R.style.Theme_AppCompat_Dialog_Alert);
alertDialogBuilder.setMessage(alertMessage);
if (confirmButtonTitle != null && !confirmButtonTitle.isEmpty()) {
alertDialogBuilder.setPositiveButton(confirmButtonTitle, confirmClickListener);
} else {
alertDialogBuilder.setPositiveButton(android.R.string.ok, confirmClickListener);
}
if (cancelButtonTitle != null && !cancelButtonTitle.isEmpty()) {
alertDialogBuilder.setNegativeButton(cancelButtonTitle, cancelClickListener);
} else {
alertDialogBuilder.setNegativeButton(android.R.string.cancel, cancelClickListener);
} }
createConfirmDialog(view, message, result, responseMessage, confirmButtonTitle, cancelButtonTitle); alertDialogBuilder.setOnCancelListener(new DialogInterface.OnCancelListener() {
} @Override
public void onCancel(DialogInterface dialog) {
@Override result.cancel();
public void error(String s, String s1, Object o) { dialog.dismiss();
Log.e(LOG_TAG, s + ", " + s1); }
result.cancel(); });
}
AlertDialog alertDialog = alertDialogBuilder.create();
@Override alertDialog.show();
public void notImplemented() {
createConfirmDialog(view, message, result, null, null, null);
}
});
return true;
}
public void createConfirmDialog(WebView view, String message, final JsResult result, String responseMessage, String confirmButtonTitle, String cancelButtonTitle) {
String alertMessage = (responseMessage != null && !responseMessage.isEmpty()) ? responseMessage : message;
DialogInterface.OnClickListener confirmClickListener = new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
result.confirm();
dialog.dismiss();
}
};
DialogInterface.OnClickListener cancelClickListener = new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
result.cancel();
dialog.dismiss();
}
};
AlertDialog.Builder alertDialogBuilder = new AlertDialog.Builder(view.getContext(), R.style.Theme_AppCompat_Dialog_Alert);
alertDialogBuilder.setMessage(alertMessage);
if (confirmButtonTitle != null && !confirmButtonTitle.isEmpty()) {
alertDialogBuilder.setPositiveButton(confirmButtonTitle, confirmClickListener);
} else {
alertDialogBuilder.setPositiveButton(android.R.string.ok, confirmClickListener);
} }
if (cancelButtonTitle != null && !cancelButtonTitle.isEmpty()) {
alertDialogBuilder.setNegativeButton(cancelButtonTitle, cancelClickListener); @Override
} else { public boolean onJsPrompt(final WebView view, String url, final String message,
alertDialogBuilder.setNegativeButton(android.R.string.cancel, cancelClickListener); final String defaultValue, final JsPromptResult result) {
Map<String, Object> obj = new HashMap<>();
if (inAppBrowserActivity != null)
obj.put("uuid", inAppBrowserActivity.uuid);
obj.put("message", message);
obj.put("defaultValue", defaultValue);
getChannel().invokeMethod("onJsPrompt", obj, new MethodChannel.Result() {
@Override
public void success(Object response) {
String responseMessage = null;
String responseDefaultValue = null;
String confirmButtonTitle = null;
String cancelButtonTitle = null;
String value = null;
if (response != null) {
Map<String, Object> responseMap = (Map<String, Object>) response;
responseMessage = (String) responseMap.get("message");
responseDefaultValue = (String) responseMap.get("defaultValue");
confirmButtonTitle = (String) responseMap.get("confirmButtonTitle");
cancelButtonTitle = (String) responseMap.get("cancelButtonTitle");
value = (String) responseMap.get("value");
Boolean handledByClient = (Boolean) responseMap.get("handledByClient");
if (handledByClient != null && handledByClient) {
Integer action = (Integer) responseMap.get("action");
action = action != null ? action : 1;
switch (action) {
case 0:
result.confirm(value);
break;
case 1:
default:
result.cancel();
}
return;
}
}
createPromptDialog(view, message, defaultValue, result, responseMessage, responseDefaultValue, value, cancelButtonTitle, confirmButtonTitle);
}
@Override
public void error(String s, String s1, Object o) {
Log.e(LOG_TAG, s + ", " + s1);
result.cancel();
}
@Override
public void notImplemented() {
createPromptDialog(view, message, defaultValue, result, null, null, null, null, null);
}
});
return true;
} }
alertDialogBuilder.setOnCancelListener(new DialogInterface.OnCancelListener() { public void createPromptDialog(WebView view, String message, String defaultValue, final JsPromptResult result, String responseMessage, String responseDefaultValue, String value, String cancelButtonTitle, String confirmButtonTitle) {
@Override FrameLayout layout = new FrameLayout(view.getContext());
public void onCancel(DialogInterface dialog) {
result.cancel(); final EditText input = new EditText(view.getContext());
dialog.dismiss(); input.setMaxLines(1);
} input.setText((responseDefaultValue != null && !responseDefaultValue.isEmpty()) ? responseDefaultValue : defaultValue);
}); LinearLayout.LayoutParams lp = new LinearLayout.LayoutParams(
LinearLayout.LayoutParams.MATCH_PARENT,
AlertDialog alertDialog = alertDialogBuilder.create(); LinearLayout.LayoutParams.MATCH_PARENT);
alertDialog.show(); input.setLayoutParams(lp);
}
layout.setPaddingRelative(45, 15, 45, 0);
@Override layout.addView(input);
public boolean onJsPrompt(final WebView view, String url, final String message,
final String defaultValue, final JsPromptResult result) { String alertMessage = (responseMessage != null && !responseMessage.isEmpty()) ? responseMessage : message;
Map<String, Object> obj = new HashMap<>();
if (inAppBrowserActivity != null) final String finalValue = value;
obj.put("uuid", inAppBrowserActivity.uuid); DialogInterface.OnClickListener confirmClickListener = new DialogInterface.OnClickListener() {
obj.put("message", message); @Override
obj.put("defaultValue", defaultValue); public void onClick(DialogInterface dialog, int which) {
String text = input.getText().toString();
getChannel().invokeMethod("onJsPrompt", obj, new MethodChannel.Result() { result.confirm(finalValue != null ? finalValue : text);
@Override dialog.dismiss();
public void success(Object response) { }
String responseMessage = null; };
String responseDefaultValue = null; DialogInterface.OnClickListener cancelClickListener = new DialogInterface.OnClickListener() {
String confirmButtonTitle = null; @Override
String cancelButtonTitle = null; public void onClick(DialogInterface dialog, int which) {
String value = null;
if (response != null) {
Map<String, Object> responseMap = (Map<String, Object>) response;
responseMessage = (String) responseMap.get("message");
responseDefaultValue = (String) responseMap.get("defaultValue");
confirmButtonTitle = (String) responseMap.get("confirmButtonTitle");
cancelButtonTitle = (String) responseMap.get("cancelButtonTitle");
value = (String) responseMap.get("value");
Boolean handledByClient = (Boolean) responseMap.get("handledByClient");
if (handledByClient != null && handledByClient) {
Integer action = (Integer) responseMap.get("action");
action = action != null ? action : 1;
switch (action) {
case 0:
result.confirm(value);
break;
case 1:
default:
result.cancel(); result.cancel();
dialog.dismiss();
}
};
AlertDialog.Builder alertDialogBuilder = new AlertDialog.Builder(view.getContext(), R.style.Theme_AppCompat_Dialog_Alert);
alertDialogBuilder.setMessage(alertMessage);
if (confirmButtonTitle != null && !confirmButtonTitle.isEmpty()) {
alertDialogBuilder.setPositiveButton(confirmButtonTitle, confirmClickListener);
} else {
alertDialogBuilder.setPositiveButton(android.R.string.ok, confirmClickListener);
}
if (cancelButtonTitle != null && !cancelButtonTitle.isEmpty()) {
alertDialogBuilder.setNegativeButton(cancelButtonTitle, cancelClickListener);
} else {
alertDialogBuilder.setNegativeButton(android.R.string.cancel, cancelClickListener);
}
alertDialogBuilder.setOnCancelListener(new DialogInterface.OnCancelListener() {
@Override
public void onCancel(DialogInterface dialog) {
result.cancel();
dialog.dismiss();
}
});
AlertDialog alertDialog = alertDialogBuilder.create();
alertDialog.setView(layout);
alertDialog.show();
}
@Override
public boolean onCreateWindow(WebView view, boolean dialog, boolean userGesture, android.os.Message resultMsg) {
WebView.HitTestResult result = view.getHitTestResult();
String data = result.getExtra();
Map<String, Object> obj = new HashMap<>();
if (inAppBrowserActivity != null)
obj.put("uuid", inAppBrowserActivity.uuid);
obj.put("url", data);
getChannel().invokeMethod("onTargetBlank", obj);
return false;
}
@Override
public void onGeolocationPermissionsShowPrompt(final String origin, final GeolocationPermissions.Callback callback) {
Map<String, Object> obj = new HashMap<>();
if (inAppBrowserActivity != null)
obj.put("uuid", inAppBrowserActivity.uuid);
obj.put("origin", origin);
getChannel().invokeMethod("onGeolocationPermissionsShowPrompt", obj, new MethodChannel.Result() {
@Override
public void success(Object o) {
Map<String, Object> response = (Map<String, Object>) o;
if (response != null)
callback.invoke((String) response.get("origin"), (Boolean) response.get("allow"), (Boolean) response.get("retain"));
else
callback.invoke(origin, false, false);
}
@Override
public void error(String s, String s1, Object o) {
callback.invoke(origin, false, false);
}
@Override
public void notImplemented() {
callback.invoke(origin, false, false);
}
});
}
@Override
public boolean onConsoleMessage(ConsoleMessage consoleMessage) {
Map<String, Object> obj = new HashMap<>();
if (inAppBrowserActivity != null)
obj.put("uuid", inAppBrowserActivity.uuid);
obj.put("sourceURL", consoleMessage.sourceId());
obj.put("lineNumber", consoleMessage.lineNumber());
obj.put("message", consoleMessage.message());
obj.put("messageLevel", consoleMessage.messageLevel().ordinal());
getChannel().invokeMethod("onConsoleMessage", obj);
return true;
}
@Override
public void onProgressChanged(WebView view, int progress) {
if (inAppBrowserActivity != null && inAppBrowserActivity.progressBar != null) {
inAppBrowserActivity.progressBar.setVisibility(View.VISIBLE);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
inAppBrowserActivity.progressBar.setProgress(progress, true);
} else {
inAppBrowserActivity.progressBar.setProgress(progress);
}
if (progress == 100) {
inAppBrowserActivity.progressBar.setVisibility(View.GONE);
} }
return;
}
} }
createPromptDialog(view, message, defaultValue, result, responseMessage, responseDefaultValue, value, cancelButtonTitle, confirmButtonTitle); Map<String, Object> obj = new HashMap<>();
} if (inAppBrowserActivity != null)
obj.put("uuid", inAppBrowserActivity.uuid);
@Override obj.put("progress", progress);
public void error(String s, String s1, Object o) { getChannel().invokeMethod("onProgressChanged", obj);
Log.e(LOG_TAG, s + ", " + s1);
result.cancel(); super.onProgressChanged(view, progress);
}
@Override
public void notImplemented() {
createPromptDialog(view, message, defaultValue, result, null, null, null, null, null);
}
});
return true;
}
public void createPromptDialog(WebView view, String message, String defaultValue, final JsPromptResult result, String responseMessage, String responseDefaultValue, String value, String cancelButtonTitle, String confirmButtonTitle) {
FrameLayout layout = new FrameLayout(view.getContext());
final EditText input = new EditText(view.getContext());
input.setMaxLines(1);
input.setText((responseDefaultValue != null && !responseDefaultValue.isEmpty()) ? responseDefaultValue : defaultValue);
LinearLayout.LayoutParams lp = new LinearLayout.LayoutParams(
LinearLayout.LayoutParams.MATCH_PARENT,
LinearLayout.LayoutParams.MATCH_PARENT);
input.setLayoutParams(lp);
layout.setPaddingRelative(45, 15, 45, 0);
layout.addView(input);
String alertMessage = (responseMessage != null && !responseMessage.isEmpty()) ? responseMessage : message;
final String finalValue = value;
DialogInterface.OnClickListener confirmClickListener = new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
String text = input.getText().toString();
result.confirm(finalValue != null ? finalValue : text);
dialog.dismiss();
}
};
DialogInterface.OnClickListener cancelClickListener = new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
result.cancel();
dialog.dismiss();
}
};
AlertDialog.Builder alertDialogBuilder = new AlertDialog.Builder(view.getContext(), R.style.Theme_AppCompat_Dialog_Alert);
alertDialogBuilder.setMessage(alertMessage);
if (confirmButtonTitle != null && !confirmButtonTitle.isEmpty()) {
alertDialogBuilder.setPositiveButton(confirmButtonTitle, confirmClickListener);
} else {
alertDialogBuilder.setPositiveButton(android.R.string.ok, confirmClickListener);
} }
if (cancelButtonTitle != null && !cancelButtonTitle.isEmpty()) {
alertDialogBuilder.setNegativeButton(cancelButtonTitle, cancelClickListener); @Override
} else { public void onReceivedTitle(WebView view, String title) {
alertDialogBuilder.setNegativeButton(android.R.string.cancel, cancelClickListener); super.onReceivedTitle(view, title);
if (inAppBrowserActivity != null && inAppBrowserActivity.actionBar != null && inAppBrowserActivity.options.toolbarTopFixedTitle.isEmpty())
inAppBrowserActivity.actionBar.setTitle(title);
} }
alertDialogBuilder.setOnCancelListener(new DialogInterface.OnCancelListener() { @Override
@Override public void onReceivedIcon(WebView view, Bitmap icon) {
public void onCancel(DialogInterface dialog) { super.onReceivedIcon(view, icon);
result.cancel();
dialog.dismiss();
}
});
AlertDialog alertDialog = alertDialogBuilder.create();
alertDialog.setView(layout);
alertDialog.show();
}
@Override
public boolean onCreateWindow(WebView view, boolean dialog, boolean userGesture, android.os.Message resultMsg) {
WebView.HitTestResult result = view.getHitTestResult();
String data = result.getExtra();
Map<String, Object> obj = new HashMap<>();
if (inAppBrowserActivity != null)
obj.put("uuid", inAppBrowserActivity.uuid);
obj.put("url", data);
getChannel().invokeMethod("onTargetBlank", obj);
return false;
}
@Override
public void onGeolocationPermissionsShowPrompt(final String origin, final GeolocationPermissions.Callback callback) {
Map<String, Object> obj = new HashMap<>();
if (inAppBrowserActivity != null)
obj.put("uuid", inAppBrowserActivity.uuid);
obj.put("origin", origin);
getChannel().invokeMethod("onGeolocationPermissionsShowPrompt", obj, new MethodChannel.Result() {
@Override
public void success(Object o) {
Map<String, Object> response = (Map<String, Object>) o;
if (response != null)
callback.invoke((String) response.get("origin"), (Boolean) response.get("allow"), (Boolean) response.get("retain"));
else
callback.invoke(origin, false, false);
}
@Override
public void error(String s, String s1, Object o) {
callback.invoke(origin, false, false);
}
@Override
public void notImplemented() {
callback.invoke(origin, false, false);
}
});
}
@Override
public boolean onConsoleMessage(ConsoleMessage consoleMessage) {
Map<String, Object> obj = new HashMap<>();
if (inAppBrowserActivity != null)
obj.put("uuid", inAppBrowserActivity.uuid);
obj.put("sourceURL", consoleMessage.sourceId());
obj.put("lineNumber", consoleMessage.lineNumber());
obj.put("message", consoleMessage.message());
obj.put("messageLevel", consoleMessage.messageLevel().ordinal());
getChannel().invokeMethod("onConsoleMessage", obj);
return true;
}
@Override
public void onProgressChanged(WebView view, int progress) {
if (inAppBrowserActivity != null && inAppBrowserActivity.progressBar != null) {
inAppBrowserActivity.progressBar.setVisibility(View.VISIBLE);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
inAppBrowserActivity.progressBar.setProgress(progress, true);
} else {
inAppBrowserActivity.progressBar.setProgress(progress);
}
if (progress == 100) {
inAppBrowserActivity.progressBar.setVisibility(View.GONE);
}
} }
Map<String, Object> obj = new HashMap<>(); //The undocumented magic method override
if (inAppBrowserActivity != null) //Eclipse will swear at you if you try to put @Override here
obj.put("uuid", inAppBrowserActivity.uuid); // For Android 3.0+
obj.put("progress", progress); public void openFileChooser(ValueCallback<Uri> uploadMsg) {
getChannel().invokeMethod("onProgressChanged", obj);
mUploadMessage = uploadMsg;
super.onProgressChanged(view, progress); Intent i = new Intent(Intent.ACTION_GET_CONTENT);
} i.addCategory(Intent.CATEGORY_OPENABLE);
i.setType("image/*");
@Override ((inAppBrowserActivity != null) ? inAppBrowserActivity : flutterWebView.activity).startActivityForResult(Intent.createChooser(i, "File Chooser"), FILECHOOSER_RESULTCODE);
public void onReceivedTitle(WebView view, String title) {
super.onReceivedTitle(view, title);
if (inAppBrowserActivity != null && inAppBrowserActivity.actionBar != null && inAppBrowserActivity.options.toolbarTopFixedTitle.isEmpty())
inAppBrowserActivity.actionBar.setTitle(title);
}
@Override
public void onReceivedIcon(WebView view, Bitmap icon) {
super.onReceivedIcon(view, icon);
}
//The undocumented magic method override
//Eclipse will swear at you if you try to put @Override here
// For Android 3.0+
public void openFileChooser(ValueCallback<Uri> uploadMsg) {
mUploadMessage = uploadMsg;
Intent i = new Intent(Intent.ACTION_GET_CONTENT);
i.addCategory(Intent.CATEGORY_OPENABLE);
i.setType("image/*");
((inAppBrowserActivity != null) ? inAppBrowserActivity : flutterWebView.activity).startActivityForResult(Intent.createChooser(i, "File Chooser"), FILECHOOSER_RESULTCODE);
}
// For Android 3.0+
public void openFileChooser(ValueCallback uploadMsg, String acceptType) {
mUploadMessage = uploadMsg;
Intent i = new Intent(Intent.ACTION_GET_CONTENT);
i.addCategory(Intent.CATEGORY_OPENABLE);
i.setType("*/*");
((inAppBrowserActivity != null) ? inAppBrowserActivity : flutterWebView.activity).startActivityForResult(
Intent.createChooser(i, "File Browser"),
FILECHOOSER_RESULTCODE);
}
//For Android 4.1
public void openFileChooser(ValueCallback<Uri> uploadMsg, String acceptType, String capture) {
mUploadMessage = uploadMsg;
Intent i = new Intent(Intent.ACTION_GET_CONTENT);
i.addCategory(Intent.CATEGORY_OPENABLE);
i.setType("image/*");
((inAppBrowserActivity != null) ? inAppBrowserActivity : flutterWebView.activity).startActivityForResult(Intent.createChooser(i, "File Chooser"), FILECHOOSER_RESULTCODE);
}
//For Android 5.0+
public boolean onShowFileChooser(
WebView webView, ValueCallback<Uri[]> filePathCallback,
FileChooserParams fileChooserParams) {
mUploadMessageArray = filePathCallback;
try {
Intent contentSelectionIntent = new Intent(Intent.ACTION_GET_CONTENT);
contentSelectionIntent.addCategory(Intent.CATEGORY_OPENABLE);
contentSelectionIntent.setType("*/*");
Intent[] intentArray;
intentArray = new Intent[0];
Intent chooserIntent = new Intent(Intent.ACTION_CHOOSER);
chooserIntent.putExtra(Intent.EXTRA_INTENT, contentSelectionIntent);
chooserIntent.putExtra(Intent.EXTRA_TITLE, "Image Chooser");
chooserIntent.putExtra(Intent.EXTRA_INITIAL_INTENTS, intentArray);
((inAppBrowserActivity != null) ? inAppBrowserActivity : flutterWebView.activity).startActivityForResult(chooserIntent, FILECHOOSER_RESULTCODE);
} catch (ActivityNotFoundException e) {
e.printStackTrace();
return false;
} }
return true;
} // For Android 3.0+
public void openFileChooser(ValueCallback uploadMsg, String acceptType) {
@TargetApi(Build.VERSION_CODES.LOLLIPOP) mUploadMessage = uploadMsg;
@Override Intent i = new Intent(Intent.ACTION_GET_CONTENT);
public boolean onActivityResult(int requestCode, int resultCode, Intent data) { i.addCategory(Intent.CATEGORY_OPENABLE);
if (requestCode == FILECHOOSER_RESULTCODE && (resultCode == RESULT_OK || resultCode == RESULT_CANCELED)) { i.setType("*/*");
mUploadMessageArray.onReceiveValue(WebChromeClient.FileChooserParams.parseResult(resultCode, data)); ((inAppBrowserActivity != null) ? inAppBrowserActivity : flutterWebView.activity).startActivityForResult(
Intent.createChooser(i, "File Browser"),
FILECHOOSER_RESULTCODE);
} }
return false;
}
private MethodChannel getChannel() { //For Android 4.1
return (inAppBrowserActivity != null) ? InAppBrowserFlutterPlugin.inAppBrowser.channel : flutterWebView.channel; public void openFileChooser(ValueCallback<Uri> uploadMsg, String acceptType, String capture) {
} mUploadMessage = uploadMsg;
Intent i = new Intent(Intent.ACTION_GET_CONTENT);
i.addCategory(Intent.CATEGORY_OPENABLE);
i.setType("image/*");
((inAppBrowserActivity != null) ? inAppBrowserActivity : flutterWebView.activity).startActivityForResult(Intent.createChooser(i, "File Chooser"), FILECHOOSER_RESULTCODE);
}
//For Android 5.0+
public boolean onShowFileChooser(
WebView webView, ValueCallback<Uri[]> filePathCallback,
FileChooserParams fileChooserParams) {
InAppBrowserFlutterPlugin.uploadMessageArray = filePathCallback;
try {
Intent contentSelectionIntent = new Intent(Intent.ACTION_GET_CONTENT);
contentSelectionIntent.addCategory(Intent.CATEGORY_OPENABLE);
contentSelectionIntent.setType("*/*");
Intent[] intentArray;
intentArray = new Intent[0];
Intent chooserIntent = new Intent(Intent.ACTION_CHOOSER);
chooserIntent.putExtra(Intent.EXTRA_INTENT, contentSelectionIntent);
chooserIntent.putExtra(Intent.EXTRA_TITLE, "Image Chooser");
chooserIntent.putExtra(Intent.EXTRA_INITIAL_INTENTS, intentArray);
((inAppBrowserActivity != null) ? inAppBrowserActivity : flutterWebView.activity).startActivityForResult(chooserIntent, FILECHOOSER_RESULTCODE);
} catch (ActivityNotFoundException e) {
e.printStackTrace();
return false;
}
return true;
}
@TargetApi(Build.VERSION_CODES.LOLLIPOP)
@Override
public boolean onActivityResult(int requestCode, int resultCode, Intent data) {
if (requestCode == FILECHOOSER_RESULTCODE && (resultCode == RESULT_OK || resultCode == RESULT_CANCELED) && InAppBrowserFlutterPlugin.uploadMessageArray != null) {
InAppBrowserFlutterPlugin.uploadMessageArray.onReceiveValue(WebChromeClient.FileChooserParams.parseResult(resultCode, data));
}
return true;
}
private MethodChannel getChannel() {
return (inAppBrowserActivity != null) ? InAppBrowserFlutterPlugin.inAppBrowser.channel : flutterWebView.channel;
}
} }
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment