Commit e0982e36 authored by pichillilorenzo's avatar pichillilorenzo

updating Android

parent 802663ab
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="AndroidLayouts">
<shared>
<config />
</shared>
</component>
<component name="ChangeListManager">
<list default="true" id="9b41f7a2-a71e-4923-91fb-249d7815b3e7" name="Default" comment="">
<change beforePath="" afterPath="$PROJECT_DIR$/example/flutter_plugin/example/ios/Runner/Storyboard.storyboard" />
<change beforePath="" afterPath="$PROJECT_DIR$/example/ios/Runner/Assets.xcassets/Contents.json" />
<change beforePath="" afterPath="$PROJECT_DIR$/example/ios/Runner/WebView.storyboard" />
<change beforePath="" afterPath="$PROJECT_DIR$/ios/Classes/InAppBrowserOptions.swift" />
<change beforePath="" afterPath="$PROJECT_DIR$/android/src/main/java/com/pichillilorenzo/flutter_inappbrowser/InAppBrowserOptions.java" />
<change beforePath="" afterPath="$PROJECT_DIR$/android/src/main/java/com/pichillilorenzo/flutter_inappbrowser/WebViewActivity.java" />
<change beforePath="" afterPath="$PROJECT_DIR$/android/src/main/res/drawable/ic_more_vert_black_24dp.xml" />
<change beforePath="" afterPath="$PROJECT_DIR$/android/src/main/res/layout/activity_web_view.xml" />
<change beforePath="" afterPath="$PROJECT_DIR$/android/src/main/res/values/strings.xml" />
<change beforePath="" afterPath="$PROJECT_DIR$/android/src/main/res/values/styles.xml" />
<change beforePath="$PROJECT_DIR$/.idea/workspace.xml" afterPath="$PROJECT_DIR$/.idea/workspace.xml" />
<change beforePath="$PROJECT_DIR$/README.md" afterPath="$PROJECT_DIR$/README.md" />
<change beforePath="$PROJECT_DIR$/android/build.gradle" afterPath="$PROJECT_DIR$/android/build.gradle" />
<change beforePath="$PROJECT_DIR$/android/src/main/AndroidManifest.xml" afterPath="$PROJECT_DIR$/android/src/main/AndroidManifest.xml" />
<change beforePath="$PROJECT_DIR$/android/src/main/java/com/pichillilorenzo/flutter_inappbrowser/InAppBrowser.java" afterPath="$PROJECT_DIR$/android/src/main/java/com/pichillilorenzo/flutter_inappbrowser/InAppBrowser.java" />
<change beforePath="$PROJECT_DIR$/example/android/build.gradle" afterPath="$PROJECT_DIR$/example/android/build.gradle" />
<change beforePath="$PROJECT_DIR$/example/ios/Runner.xcodeproj/project.pbxproj" afterPath="$PROJECT_DIR$/example/ios/Runner.xcodeproj/project.pbxproj" />
<change beforePath="$PROJECT_DIR$/example/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme" afterPath="$PROJECT_DIR$/example/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme" />
<change beforePath="$PROJECT_DIR$/example/ios/Runner/Base.lproj/LaunchScreen.storyboard" afterPath="$PROJECT_DIR$/example/ios/Runner/Base.lproj/LaunchScreen.storyboard" />
<change beforePath="$PROJECT_DIR$/example/ios/Runner/Base.lproj/Main.storyboard" afterPath="$PROJECT_DIR$/example/ios/Runner/Base.lproj/Main.storyboard" />
<change beforePath="$PROJECT_DIR$/android/src/main/res/drawable-hdpi/ic_action_next_item.png" afterPath="" />
<change beforePath="$PROJECT_DIR$/android/src/main/res/drawable-hdpi/ic_action_previous_item.png" afterPath="" />
<change beforePath="$PROJECT_DIR$/android/src/main/res/drawable-hdpi/ic_action_remove.png" afterPath="" />
<change beforePath="$PROJECT_DIR$/android/src/main/res/drawable-mdpi/ic_action_next_item.png" afterPath="" />
<change beforePath="$PROJECT_DIR$/android/src/main/res/drawable-mdpi/ic_action_previous_item.png" afterPath="" />
<change beforePath="$PROJECT_DIR$/android/src/main/res/drawable-mdpi/ic_action_remove.png" afterPath="" />
<change beforePath="$PROJECT_DIR$/android/src/main/res/drawable-xhdpi/ic_action_next_item.png" afterPath="" />
<change beforePath="$PROJECT_DIR$/android/src/main/res/drawable-xhdpi/ic_action_previous_item.png" afterPath="" />
<change beforePath="$PROJECT_DIR$/android/src/main/res/drawable-xhdpi/ic_action_remove.png" afterPath="" />
<change beforePath="$PROJECT_DIR$/android/src/main/res/drawable-xxhdpi/ic_action_next_item.png" afterPath="" />
<change beforePath="$PROJECT_DIR$/android/src/main/res/drawable-xxhdpi/ic_action_previous_item.png" afterPath="" />
<change beforePath="$PROJECT_DIR$/android/src/main/res/drawable-xxhdpi/ic_action_remove.png" afterPath="" />
<change beforePath="$PROJECT_DIR$/example/android/app/build.gradle" afterPath="$PROJECT_DIR$/example/android/app/build.gradle" />
<change beforePath="$PROJECT_DIR$/example/ios/Runner/WebView.storyboard" afterPath="$PROJECT_DIR$/example/ios/Runner/WebView.storyboard" />
<change beforePath="$PROJECT_DIR$/example/lib/main.dart" afterPath="$PROJECT_DIR$/example/lib/main.dart" />
<change beforePath="$PROJECT_DIR$/flutter_inappbrowser.iml" afterPath="$PROJECT_DIR$/flutter_inappbrowser.iml" />
<change beforePath="$PROJECT_DIR$/flutter_inappbrowser_android.iml" afterPath="$PROJECT_DIR$/flutter_inappbrowser_android.iml" />
<change beforePath="$PROJECT_DIR$/ios/Classes/InAppBrowserOptions.swift" afterPath="$PROJECT_DIR$/ios/Classes/InAppBrowserOptions.swift" />
<change beforePath="$PROJECT_DIR$/ios/Classes/InAppBrowserWebViewController.swift" afterPath="$PROJECT_DIR$/ios/Classes/InAppBrowserWebViewController.swift" />
<change beforePath="$PROJECT_DIR$/ios/Classes/SwiftFlutterPlugin.swift" afterPath="$PROJECT_DIR$/ios/Classes/SwiftFlutterPlugin.swift" />
<change beforePath="$PROJECT_DIR$/lib/flutter_inappbrowser.dart" afterPath="$PROJECT_DIR$/lib/flutter_inappbrowser.dart" />
</list>
......@@ -36,21 +52,11 @@
</component>
<component name="FileEditorManager">
<leaf SIDE_TABS_SIZE_LIMIT_KEY="300">
<file leaf-file-name="InAppBrowser.java" pinned="false" current-in-tab="false">
<entry file="file://$PROJECT_DIR$/android/src/main/java/com/pichillilorenzo/flutter_inappbrowser/InAppBrowser.java">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="0">
<caret line="157" column="0" lean-forward="false" selection-start-line="157" selection-start-column="0" selection-end-line="157" selection-end-column="0" />
<folding />
</state>
</provider>
</entry>
</file>
<file leaf-file-name="flutter_inappbrowser.dart" pinned="false" current-in-tab="false">
<entry file="file://$PROJECT_DIR$/lib/flutter_inappbrowser.dart">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="381">
<caret line="119" column="89" lean-forward="false" selection-start-line="119" selection-start-column="89" selection-end-line="119" selection-end-column="89" />
<state relative-caret-position="347">
<caret line="154" column="3" lean-forward="false" selection-start-line="154" selection-start-column="3" selection-end-line="154" selection-end-column="3" />
<folding>
<element signature="e#814#834#0" expanded="true" />
</folding>
......@@ -61,8 +67,8 @@
<file leaf-file-name="main.dart" pinned="false" current-in-tab="true">
<entry file="file://$PROJECT_DIR$/example/lib/main.dart">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="434">
<caret line="68" column="16" lean-forward="false" selection-start-line="68" selection-start-column="16" selection-end-line="68" selection-end-column="16" />
<state relative-caret-position="196">
<caret line="20" column="0" lean-forward="false" selection-start-line="20" selection-start-column="0" selection-end-line="20" selection-end-column="0" />
<folding />
</state>
</provider>
......@@ -155,9 +161,9 @@
</option>
</component>
<component name="ProjectFrameBounds">
<option name="x" value="2459" />
<option name="y" value="-20" />
<option name="width" value="1381" />
<option name="x" value="650" />
<option name="y" value="23" />
<option name="width" value="1270" />
<option name="height" value="1057" />
</component>
<component name="ProjectLevelVcsManager" settingsEditedManually="true" />
......@@ -176,10 +182,7 @@
<foldersAlwaysOnTop value="true" />
</navigator>
<panes>
<pane id="Scope" />
<pane id="PackagesPane" />
<pane id="Scratches" />
<pane id="AndroidView" />
<pane id="ProjectPane">
<subPane>
<expand>
......@@ -187,30 +190,6 @@
<item name="flutter_inappbrowser" type="b2602c69:ProjectViewProjectNode" />
<item name="flutter_inappbrowser" type="462c0819:PsiDirectoryNode" />
</path>
<path>
<item name="flutter_inappbrowser" type="b2602c69:ProjectViewProjectNode" />
<item name="flutter_inappbrowser" type="462c0819:PsiDirectoryNode" />
<item name="example" type="462c0819:PsiDirectoryNode" />
</path>
<path>
<item name="flutter_inappbrowser" type="b2602c69:ProjectViewProjectNode" />
<item name="flutter_inappbrowser" type="462c0819:PsiDirectoryNode" />
<item name="example" type="462c0819:PsiDirectoryNode" />
<item name="ios" type="462c0819:PsiDirectoryNode" />
</path>
<path>
<item name="flutter_inappbrowser" type="b2602c69:ProjectViewProjectNode" />
<item name="flutter_inappbrowser" type="462c0819:PsiDirectoryNode" />
<item name="example" type="462c0819:PsiDirectoryNode" />
<item name="ios" type="462c0819:PsiDirectoryNode" />
<item name="Flutter" type="462c0819:PsiDirectoryNode" />
</path>
<path>
<item name="flutter_inappbrowser" type="b2602c69:ProjectViewProjectNode" />
<item name="flutter_inappbrowser" type="462c0819:PsiDirectoryNode" />
<item name="example" type="462c0819:PsiDirectoryNode" />
<item name="lib" type="462c0819:PsiDirectoryNode" />
</path>
<path>
<item name="flutter_inappbrowser" type="b2602c69:ProjectViewProjectNode" />
<item name="flutter_inappbrowser" type="462c0819:PsiDirectoryNode" />
......@@ -232,6 +211,9 @@
</subPane>
<option name="show-excluded-files" value="false" />
</pane>
<pane id="AndroidView" />
<pane id="Scratches" />
<pane id="Scope" />
</panes>
</component>
<component name="PropertiesComponent">
......@@ -418,27 +400,26 @@
<servers />
</component>
<component name="ToolWindowManager">
<frame x="2459" y="-20" width="1381" height="1057" extended-state="0" />
<frame x="650" y="23" width="1270" height="1057" extended-state="0" />
<editor active="true" />
<layout>
<window_info id="Android Profiler" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="false" weight="0.33" sideWeight="0.5" order="7" side_tool="false" content_ui="tabs" />
<window_info id="TODO" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.33" sideWeight="0.5" order="6" side_tool="false" content_ui="tabs" />
<window_info id="Messages" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.31735888" sideWeight="0.5" order="7" side_tool="false" content_ui="tabs" />
<window_info id="Palette&#9;" active="false" anchor="right" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.33" sideWeight="0.5" order="3" side_tool="false" content_ui="tabs" />
<window_info id="Image Layers" active="false" anchor="left" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.33" sideWeight="0.5" order="2" side_tool="false" content_ui="tabs" />
<window_info id="Build Variants" active="false" anchor="left" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.33" sideWeight="0.5" order="2" side_tool="true" content_ui="tabs" />
<window_info id="Capture Analysis" active="false" anchor="right" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.33" sideWeight="0.5" order="3" side_tool="false" content_ui="tabs" />
<window_info id="Event Log" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.33" sideWeight="0.5" order="7" side_tool="true" content_ui="tabs" />
<window_info id="Dart Analysis" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.3290735" sideWeight="0.5" order="7" side_tool="false" content_ui="tabs" />
<window_info id="Run" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.30258304" sideWeight="0.5" order="2" side_tool="false" content_ui="tabs" />
<window_info id="Run" active="true" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="true" show_stripe_button="true" weight="0.3024494" sideWeight="0.5" order="2" side_tool="false" content_ui="tabs" />
<window_info id="Version Control" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.33" sideWeight="0.5" order="7" side_tool="false" content_ui="tabs" />
<window_info id="Terminal" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="true" show_stripe_button="true" weight="0.32800853" sideWeight="0.5" order="7" side_tool="false" content_ui="tabs" />
<window_info id="Terminal" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.31735888" sideWeight="0.5" order="7" side_tool="false" content_ui="tabs" />
<window_info id="Flutter Outline" active="false" anchor="right" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.32977968" sideWeight="0.5" order="3" side_tool="false" content_ui="tabs" />
<window_info id="Logcat" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.33" sideWeight="0.5" order="7" side_tool="false" content_ui="tabs" />
<window_info id="Captures" active="false" anchor="left" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.33" sideWeight="0.5" order="2" side_tool="false" content_ui="tabs" />
<window_info id="Capture Tool" active="false" anchor="left" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.33" sideWeight="0.5" order="2" side_tool="false" content_ui="tabs" />
<window_info id="Designer" active="false" anchor="left" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.33" sideWeight="0.5" order="2" side_tool="false" content_ui="tabs" />
<window_info id="Project" active="false" anchor="left" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="true" show_stripe_button="true" weight="0.25690815" sideWeight="0.5" order="0" side_tool="false" content_ui="combo" />
<window_info id="Project" active="false" anchor="left" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="true" show_stripe_button="true" weight="0.2801303" sideWeight="0.5" order="0" side_tool="false" content_ui="combo" />
<window_info id="Structure" active="false" anchor="left" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.25" sideWeight="0.5" order="1" side_tool="false" content_ui="tabs" />
<window_info id="Device File Explorer" active="false" anchor="right" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.33" sideWeight="0.5" order="3" side_tool="true" content_ui="tabs" />
<window_info id="Theme Preview" active="false" anchor="right" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.33" sideWeight="0.5" order="3" side_tool="false" content_ui="tabs" />
......@@ -451,6 +432,7 @@
<window_info id="Dependency Viewer" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.32800853" sideWeight="0.5" order="8" side_tool="false" content_ui="tabs" />
<window_info id="Hierarchy" active="false" anchor="right" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.25" sideWeight="0.5" order="2" side_tool="false" content_ui="combo" />
<window_info id="Ant Build" active="false" anchor="right" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.25" sideWeight="0.5" order="1" side_tool="false" content_ui="tabs" />
<window_info id="Messages" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.31735888" sideWeight="0.5" order="7" side_tool="false" content_ui="tabs" />
<window_info id="Inspection" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.4" sideWeight="0.5" order="5" side_tool="false" content_ui="tabs" />
<window_info id="Find" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.3290735" sideWeight="0.5" order="1" side_tool="false" content_ui="tabs" />
</layout>
......@@ -810,19 +792,10 @@
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/android/src/main/java/com/pichillilorenzo/flutter_inappbrowser/InAppBrowser.java">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="0">
<caret line="157" column="0" lean-forward="false" selection-start-line="157" selection-start-column="0" selection-end-line="157" selection-end-column="0" />
<folding />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/example/ios/Flutter/Release.xcconfig">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="0">
<caret line="0" column="0" lean-forward="false" selection-start-line="0" selection-start-column="0" selection-end-line="0" selection-end-column="0" />
<folding />
</state>
</provider>
</entry>
......@@ -830,14 +803,21 @@
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="30">
<caret line="2" column="0" lean-forward="false" selection-start-line="2" selection-start-column="0" selection-end-line="2" selection-end-column="24" />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/android/src/main/java/com/pichillilorenzo/flutter_inappbrowser/InAppBrowser.java">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="15">
<caret line="157" column="0" lean-forward="false" selection-start-line="157" selection-start-column="0" selection-end-line="157" selection-end-column="0" />
<folding />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/lib/flutter_inappbrowser.dart">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="381">
<caret line="119" column="89" lean-forward="false" selection-start-line="119" selection-start-column="89" selection-end-line="119" selection-end-column="89" />
<state relative-caret-position="347">
<caret line="154" column="3" lean-forward="false" selection-start-line="154" selection-start-column="3" selection-end-line="154" selection-end-column="3" />
<folding>
<element signature="e#814#834#0" expanded="true" />
</folding>
......@@ -846,8 +826,8 @@
</entry>
<entry file="file://$PROJECT_DIR$/example/lib/main.dart">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="434">
<caret line="68" column="16" lean-forward="false" selection-start-line="68" selection-start-column="16" selection-end-line="68" selection-end-column="16" />
<state relative-caret-position="196">
<caret line="20" column="0" lean-forward="false" selection-start-line="20" selection-start-column="0" selection-end-line="20" selection-end-column="0" />
<folding />
</state>
</provider>
......
......@@ -25,8 +25,10 @@ android {
compileSdkVersion 27
defaultConfig {
minSdkVersion 16
minSdkVersion 17
testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
vectorDrawables.useSupportLibrary = true
}
lintOptions {
disable 'InvalidPackage'
......@@ -35,4 +37,6 @@ android {
dependencies {
implementation 'com.android.support:customtabs:27.1.1'
implementation 'com.android.support:appcompat-v7:27.1.1'
implementation 'com.android.support.constraint:constraint-layout:1.1.3'
}
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.pichillilorenzo.flutter_inappbrowser">
<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.INTERNET" />
<application
android:theme="@style/AppTheme">
<activity android:name=".WebViewActivity"></activity>
</application>
</manifest>
\ No newline at end of file
......@@ -26,6 +26,7 @@ import android.app.Activity;
import android.annotation.SuppressLint;
import android.content.Context;
import android.content.Intent;
import android.os.Parcelable;
import android.provider.Browser;
import android.content.res.Resources;
import android.graphics.Bitmap;
......@@ -34,10 +35,12 @@ import android.graphics.Color;
import android.net.Uri;
import android.os.Build;
import android.os.Bundle;
import android.support.annotation.RequiresApi;
import android.text.InputType;
import android.util.TypedValue;
import android.view.Gravity;
import android.view.KeyEvent;
import android.view.LayoutInflater;
import android.view.View;
import android.view.Window;
import android.view.WindowManager;
......@@ -58,10 +61,12 @@ import android.widget.LinearLayout;
import android.widget.RelativeLayout;
import android.widget.TextView;
import android.util.Log;
import android.support.v7.app.AppCompatActivity;
import org.json.JSONException;
import org.json.JSONObject;
import java.io.Serializable;
import java.util.Arrays;
import java.util.List;
import java.util.HashMap;
......@@ -78,9 +83,10 @@ import io.flutter.plugin.common.PluginRegistry.Registrar;
/** InAppBrowser */
public class InAppBrowser implements MethodCallHandler {
private Registrar registrar;
private Activity activity;
private final MethodChannel channel;
public static Registrar registrar;
public Activity activity;
public static MethodChannel channel;
public static WebViewActivity webViewActivity;
private static final String NULL = "null";
protected static final String LOG_TAG = "InAppBrowser";
......@@ -146,6 +152,7 @@ public class InAppBrowser implements MethodCallHandler {
channel.setMethodCallHandler(new InAppBrowser(registrar, registrar.activity()));
}
@RequiresApi(api = Build.VERSION_CODES.KITKAT)
@Override
public void onMethodCall(MethodCall call, final Result result) {
String source;
......@@ -161,7 +168,8 @@ public class InAppBrowser implements MethodCallHandler {
t = SELF;
}
final String target = t;
final HashMap<String, String> features = parseFeature(call.argument("options").toString());
final InAppBrowserOptions options = new InAppBrowserOptions();
options.parse((HashMap<String, Object>) call.argument("options"));
Log.d(LOG_TAG, "target = " + target);
......@@ -188,7 +196,7 @@ public class InAppBrowser implements MethodCallHandler {
// load in InAppBrowser
else {
Log.d(LOG_TAG, "loading in InAppBrowser");
r = showWebPage(url, features);
r = showWebPage(url, options);
}
}
// SYSTEM
......@@ -199,7 +207,7 @@ public class InAppBrowser implements MethodCallHandler {
// BLANK - or anything else
else {
Log.d(LOG_TAG, "in blank");
r = showWebPage(url, features);
r = showWebPage(url, options);
}
result.success(r);
......@@ -342,436 +350,456 @@ public class InAppBrowser implements MethodCallHandler {
}
@TargetApi(8)
private String showWebPage(final String url, HashMap<String, String> features) {
// Determine if we should hide the location bar.
showLocationBar = true;
showZoomControls = true;
openWindowHidden = false;
mediaPlaybackRequiresUserGesture = false;
if (features != null) {
String show = features.get(LOCATION);
if (show != null) {
showLocationBar = show.equals("yes") ? true : false;
}
if(showLocationBar) {
String hideNavigation = features.get(HIDE_NAVIGATION);
String hideUrl = features.get(HIDE_URL);
if(hideNavigation != null) hideNavigationButtons = hideNavigation.equals("yes") ? true : false;
if(hideUrl != null) hideUrlBar = hideUrl.equals("yes") ? true : false;
}
String zoom = features.get(ZOOM);
if (zoom != null) {
showZoomControls = zoom.equals("yes") ? true : false;
}
String hidden = features.get(HIDDEN);
if (hidden != null) {
openWindowHidden = hidden.equals("yes") ? true : false;
}
String hardwareBack = features.get(HARDWARE_BACK_BUTTON);
if (hardwareBack != null) {
hadwareBackButton = hardwareBack.equals("yes") ? true : false;
} else {
hadwareBackButton = DEFAULT_HARDWARE_BACK;
}
String mediaPlayback = features.get(MEDIA_PLAYBACK_REQUIRES_USER_ACTION);
if (mediaPlayback != null) {
mediaPlaybackRequiresUserGesture = mediaPlayback.equals("yes") ? true : false;
}
String cache = features.get(CLEAR_ALL_CACHE);
if (cache != null) {
clearAllCache = cache.equals("yes") ? true : false;
} else {
cache = features.get(CLEAR_SESSION_CACHE);
if (cache != null) {
clearSessionCache = cache.equals("yes") ? true : false;
}
}
String shouldPause = features.get(SHOULD_PAUSE);
if (shouldPause != null) {
shouldPauseInAppBrowser = shouldPause.equals("yes") ? true : false;
}
String wideViewPort = features.get(USER_WIDE_VIEW_PORT);
if (wideViewPort != null ) {
useWideViewPort = wideViewPort.equals("yes") ? true : false;
}
String closeButtonCaptionSet = features.get(CLOSE_BUTTON_CAPTION);
if (closeButtonCaptionSet != null) {
closeButtonCaption = closeButtonCaptionSet;
}
String closeButtonColorSet = features.get(CLOSE_BUTTON_COLOR);
if (closeButtonColorSet != null) {
closeButtonColor = closeButtonColorSet;
}
String toolbarColorSet = features.get(TOOLBAR_COLOR);
if (toolbarColorSet != null) {
toolbarColor = android.graphics.Color.parseColor(toolbarColorSet);
}
String navigationButtonColorSet = features.get(NAVIGATION_COLOR);
if (navigationButtonColorSet != null) {
navigationButtonColor = navigationButtonColorSet;
}
String showFooterSet = features.get(FOOTER);
if (showFooterSet != null) {
showFooter = showFooterSet.equals("yes") ? true : false;
}
String footerColorSet = features.get(FOOTER_COLOR);
if (footerColorSet != null) {
footerColor = footerColorSet;
}
}
// Create dialog in new thread
Runnable runnable = new Runnable() {
/**
* Convert our DIP units to Pixels
*
* @return int
*/
private int dpToPixels(int dipValue) {
int value = (int) TypedValue.applyDimension( TypedValue.COMPLEX_UNIT_DIP,
(float) dipValue,
activity.getResources().getDisplayMetrics()
);
return value;
}
@TargetApi(8)
private View createCloseButton(int id){
View _close;
Resources activityRes = activity.getResources();
if (closeButtonCaption != "") {
// Use TextView for text
TextView close = new TextView(activity);
close.setText(closeButtonCaption);
close.setTextSize(20);
if (closeButtonColor != "") close.setTextColor(android.graphics.Color.parseColor(closeButtonColor));
close.setGravity(android.view.Gravity.CENTER_VERTICAL);
close.setPadding(this.dpToPixels(10), 0, this.dpToPixels(10), 0);
_close = close;
}
else {
ImageButton close = new ImageButton(activity);
int closeResId = activityRes.getIdentifier("ic_action_remove", "drawable", activity.getPackageName());
Drawable closeIcon = activityRes.getDrawable(closeResId);
if (closeButtonColor != "") close.setColorFilter(android.graphics.Color.parseColor(closeButtonColor));
close.setImageDrawable(closeIcon);
close.setScaleType(ImageView.ScaleType.FIT_CENTER);
if (Build.VERSION.SDK_INT >= 16)
close.getAdjustViewBounds();
_close = close;
}
RelativeLayout.LayoutParams closeLayoutParams = new RelativeLayout.LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.MATCH_PARENT);
closeLayoutParams.addRule(RelativeLayout.ALIGN_PARENT_RIGHT);
_close.setLayoutParams(closeLayoutParams);
if (Build.VERSION.SDK_INT >= 16)
_close.setBackground(null);
else
_close.setBackgroundDrawable(null);
_close.setContentDescription("Close Button");
_close.setId(Integer.valueOf(id));
_close.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
closeDialog();
}
});
return _close;
}
@SuppressLint("NewApi")
public void run() {
// CB-6702 InAppBrowser hangs when opening more than one instance
if (dialog != null) {
dialog.dismiss();
};
// Let's create the main dialog
dialog = new InAppBrowserDialog(activity, android.R.style.Theme_NoTitleBar);
dialog.getWindow().getAttributes().windowAnimations = android.R.style.Animation_Dialog;
dialog.requestWindowFeature(Window.FEATURE_NO_TITLE);
dialog.setCancelable(true);
dialog.setInAppBroswer(getInAppBrowser());
// Main container layout
LinearLayout main = new LinearLayout(activity);
main.setOrientation(LinearLayout.VERTICAL);
// Toolbar layout
RelativeLayout toolbar = new RelativeLayout(activity);
//Please, no more black!
toolbar.setBackgroundColor(toolbarColor);
toolbar.setLayoutParams(new RelativeLayout.LayoutParams(LayoutParams.MATCH_PARENT, this.dpToPixels(44)));
toolbar.setPadding(this.dpToPixels(2), this.dpToPixels(2), this.dpToPixels(2), this.dpToPixels(2));
toolbar.setHorizontalGravity(Gravity.LEFT);
toolbar.setVerticalGravity(Gravity.TOP);
// Action Button Container layout
RelativeLayout actionButtonContainer = new RelativeLayout(activity);
actionButtonContainer.setLayoutParams(new RelativeLayout.LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT));
actionButtonContainer.setHorizontalGravity(Gravity.LEFT);
actionButtonContainer.setVerticalGravity(Gravity.CENTER_VERTICAL);
actionButtonContainer.setId(Integer.valueOf(1));
// Back button
ImageButton back = new ImageButton(activity);
RelativeLayout.LayoutParams backLayoutParams = new RelativeLayout.LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.MATCH_PARENT);
backLayoutParams.addRule(RelativeLayout.ALIGN_LEFT);
back.setLayoutParams(backLayoutParams);
back.setContentDescription("Back Button");
back.setId(Integer.valueOf(2));
Resources activityRes = activity.getResources();
int backResId = activityRes.getIdentifier("ic_action_previous_item", "drawable", activity.getPackageName());
Drawable backIcon = activityRes.getDrawable(backResId);
if (navigationButtonColor != "") back.setColorFilter(android.graphics.Color.parseColor(navigationButtonColor));
if (Build.VERSION.SDK_INT >= 16)
back.setBackground(null);
else
back.setBackgroundDrawable(null);
back.setImageDrawable(backIcon);
back.setScaleType(ImageView.ScaleType.FIT_CENTER);
back.setPadding(0, this.dpToPixels(10), 0, this.dpToPixels(10));
if (Build.VERSION.SDK_INT >= 16)
back.getAdjustViewBounds();
back.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
goBack();
}
});
// Forward button
ImageButton forward = new ImageButton(activity);
RelativeLayout.LayoutParams forwardLayoutParams = new RelativeLayout.LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.MATCH_PARENT);
forwardLayoutParams.addRule(RelativeLayout.RIGHT_OF, 2);
forward.setLayoutParams(forwardLayoutParams);
forward.setContentDescription("Forward Button");
forward.setId(Integer.valueOf(3));
int fwdResId = activityRes.getIdentifier("ic_action_next_item", "drawable", activity.getPackageName());
Drawable fwdIcon = activityRes.getDrawable(fwdResId);
if (navigationButtonColor != "") forward.setColorFilter(android.graphics.Color.parseColor(navigationButtonColor));
if (Build.VERSION.SDK_INT >= 16)
forward.setBackground(null);
else
forward.setBackgroundDrawable(null);
forward.setImageDrawable(fwdIcon);
forward.setScaleType(ImageView.ScaleType.FIT_CENTER);
forward.setPadding(0, this.dpToPixels(10), 0, this.dpToPixels(10));
if (Build.VERSION.SDK_INT >= 16)
forward.getAdjustViewBounds();
forward.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
goForward();
}
});
// Edit Text Box
edittext = new EditText(activity);
RelativeLayout.LayoutParams textLayoutParams = new RelativeLayout.LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT);
textLayoutParams.addRule(RelativeLayout.RIGHT_OF, 1);
textLayoutParams.addRule(RelativeLayout.LEFT_OF, 5);
edittext.setLayoutParams(textLayoutParams);
edittext.setId(Integer.valueOf(4));
edittext.setSingleLine(true);
edittext.setText(url);
edittext.setInputType(InputType.TYPE_TEXT_VARIATION_URI);
edittext.setImeOptions(EditorInfo.IME_ACTION_GO);
edittext.setInputType(InputType.TYPE_NULL); // Will not except input... Makes the text NON-EDITABLE
edittext.setOnKeyListener(new View.OnKeyListener() {
public boolean onKey(View v, int keyCode, KeyEvent event) {
// If the event is a key-down event on the "enter" button
if ((event.getAction() == KeyEvent.ACTION_DOWN) && (keyCode == KeyEvent.KEYCODE_ENTER)) {
navigate(edittext.getText().toString());
return true;
}
return false;
}
});
// Header Close/Done button
View close = createCloseButton(5);
toolbar.addView(close);
// Footer
RelativeLayout footer = new RelativeLayout(activity);
int _footerColor;
if(footerColor != ""){
_footerColor = Color.parseColor(footerColor);
}else{
_footerColor = android.graphics.Color.LTGRAY;
}
footer.setBackgroundColor(_footerColor);
RelativeLayout.LayoutParams footerLayout = new RelativeLayout.LayoutParams(LayoutParams.MATCH_PARENT, this.dpToPixels(44));
footerLayout.addRule(RelativeLayout.ALIGN_PARENT_BOTTOM, RelativeLayout.TRUE);
footer.setLayoutParams(footerLayout);
if (closeButtonCaption != "") footer.setPadding(this.dpToPixels(8), this.dpToPixels(8), this.dpToPixels(8), this.dpToPixels(8));
footer.setHorizontalGravity(Gravity.LEFT);
footer.setVerticalGravity(Gravity.BOTTOM);
View footerClose = createCloseButton(7);
footer.addView(footerClose);
private String showWebPage(final String url, InAppBrowserOptions options) {
Intent intent = new Intent(activity, WebViewActivity.class);
Bundle extras = new Bundle();
extras.putString("url", url);
extras.putSerializable("options", options.getHashMap());
// WebView
inAppWebView = new WebView(activity);
inAppWebView.setLayoutParams(new LinearLayout.LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT));
inAppWebView.setId(Integer.valueOf(6));
inAppWebView.setWebChromeClient(new WebChromeClient() {
intent.putExtras(extras);
@Override
public void onProgressChanged(WebView view, int newProgress) {
super.onProgressChanged(view, newProgress);
}
@Override
public void onReceivedTitle(WebView view, String title) {
super.onReceivedTitle(view, title);
}
@Override
public void onReceivedIcon(WebView view, Bitmap icon) {
super.onReceivedIcon(view, icon);
}
// For Android 5.0+
public boolean onShowFileChooser (WebView webView, ValueCallback<Uri[]> filePathCallback, WebChromeClient.FileChooserParams fileChooserParams)
{
Log.d(LOG_TAG, "File Chooser 5.0+");
// If callback exists, finish it.
if(mUploadCallbackLollipop != null) {
mUploadCallbackLollipop.onReceiveValue(null);
}
mUploadCallbackLollipop = filePathCallback;
// Create File Chooser Intent
Intent content = new Intent(Intent.ACTION_GET_CONTENT);
content.addCategory(Intent.CATEGORY_OPENABLE);
content.setType("*/*");
registrar.context().startActivity(Intent.createChooser(content, "Select File"));
return true;
}
// For Android 4.1+
public void openFileChooser(ValueCallback<Uri> uploadMsg, String acceptType, String capture)
{
Log.d(LOG_TAG, "File Chooser 4.1+");
// Call file chooser for Android 3.0+
openFileChooser(uploadMsg, acceptType);
}
// For Android 3.0+
public void openFileChooser(ValueCallback<Uri> uploadMsg, String acceptType)
{
Log.d(LOG_TAG, "File Chooser 3.0+");
mUploadCallback = uploadMsg;
Intent content = new Intent(Intent.ACTION_GET_CONTENT);
content.addCategory(Intent.CATEGORY_OPENABLE);
registrar.context().startActivity(Intent.createChooser(content, "Select File"));
}
});
WebViewClient client = new InAppBrowserClient(edittext, activity, channel);
inAppWebView.setWebViewClient(client);
WebSettings settings = inAppWebView.getSettings();
settings.setJavaScriptEnabled(true);
settings.setJavaScriptCanOpenWindowsAutomatically(true);
settings.setBuiltInZoomControls(showZoomControls);
settings.setPluginState(android.webkit.WebSettings.PluginState.ON);
if(android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.JELLY_BEAN_MR1) {
settings.setMediaPlaybackRequiresUserGesture(mediaPlaybackRequiresUserGesture);
}
String overrideUserAgent = activity.getPreferences(0).getString("OverrideUserAgent", null);
String appendUserAgent = activity.getPreferences(0).getString("AppendUserAgent", null);
if (overrideUserAgent != null) {
settings.setUserAgentString(overrideUserAgent);
}
if (appendUserAgent != null) {
settings.setUserAgentString(settings.getUserAgentString() + appendUserAgent);
}
//Toggle whether this is enabled or not!
Bundle appSettings = activity.getIntent().getExtras();
boolean enableDatabase = appSettings == null ? true : appSettings.getBoolean("InAppBrowserStorageEnabled", true);
if (enableDatabase) {
String databasePath = activity.getApplicationContext().getDir("inAppBrowserDB", Context.MODE_PRIVATE).getPath();
settings.setDatabasePath(databasePath);
settings.setDatabaseEnabled(true);
}
settings.setDomStorageEnabled(true);
if (clearAllCache) {
CookieManager.getInstance().removeAllCookie();
} else if (clearSessionCache) {
CookieManager.getInstance().removeSessionCookie();
}
// Enable Thirdparty Cookies on >=Android 5.0 device
if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.LOLLIPOP) {
CookieManager.getInstance().setAcceptThirdPartyCookies(inAppWebView,true);
}
inAppWebView.loadUrl(url);
inAppWebView.setId(Integer.valueOf(6));
inAppWebView.getSettings().setLoadWithOverviewMode(true);
inAppWebView.getSettings().setUseWideViewPort(useWideViewPort);
inAppWebView.requestFocus();
inAppWebView.requestFocusFromTouch();
// Add the back and forward buttons to our action button container layout
actionButtonContainer.addView(back);
actionButtonContainer.addView(forward);
// Add the views to our toolbar if they haven't been disabled
if (!hideNavigationButtons) toolbar.addView(actionButtonContainer);
if (!hideUrlBar) toolbar.addView(edittext);
// Don't add the toolbar if its been disabled
if (getShowLocationBar()) {
// Add our toolbar to our main view/layout
main.addView(toolbar);
}
// Add our webview to our main view/layout
RelativeLayout webViewLayout = new RelativeLayout(activity);
webViewLayout.addView(inAppWebView);
main.addView(webViewLayout);
// Don't add the footer unless it's been enabled
if (showFooter) {
webViewLayout.addView(footer);
}
activity.startActivity(intent);
WindowManager.LayoutParams lp = new WindowManager.LayoutParams();
lp.copyFrom(dialog.getWindow().getAttributes());
lp.width = WindowManager.LayoutParams.MATCH_PARENT;
lp.height = WindowManager.LayoutParams.MATCH_PARENT;
//webViewActivity.loadUrl(url);
dialog.setContentView(main);
dialog.show();
dialog.getWindow().setAttributes(lp);
// the goal of openhidden is to load the url and not display it
// Show() needs to be called to cause the URL to be loaded
if(openWindowHidden) {
dialog.hide();
}
}
};
this.activity.runOnUiThread(runnable);
return "";
// Determine if we should hide the location bar.
// showLocationBar = true;
// showZoomControls = true;
// openWindowHidden = false;
// mediaPlaybackRequiresUserGesture = false;
// if (features != null) {
// String show = features.get(LOCATION);
// if (show != null) {
// showLocationBar = show.equals("yes") ? true : false;
// }
// if(showLocationBar) {
// String hideNavigation = features.get(HIDE_NAVIGATION);
// String hideUrl = features.get(HIDE_URL);
// if(hideNavigation != null) hideNavigationButtons = hideNavigation.equals("yes") ? true : false;
// if(hideUrl != null) hideUrlBar = hideUrl.equals("yes") ? true : false;
// }
// String zoom = features.get(ZOOM);
// if (zoom != null) {
// showZoomControls = zoom.equals("yes") ? true : false;
// }
// String hidden = features.get(HIDDEN);
// if (hidden != null) {
// openWindowHidden = hidden.equals("yes") ? true : false;
// }
// String hardwareBack = features.get(HARDWARE_BACK_BUTTON);
// if (hardwareBack != null) {
// hadwareBackButton = hardwareBack.equals("yes") ? true : false;
// } else {
// hadwareBackButton = DEFAULT_HARDWARE_BACK;
// }
// String mediaPlayback = features.get(MEDIA_PLAYBACK_REQUIRES_USER_ACTION);
// if (mediaPlayback != null) {
// mediaPlaybackRequiresUserGesture = mediaPlayback.equals("yes") ? true : false;
// }
// String cache = features.get(CLEAR_ALL_CACHE);
// if (cache != null) {
// clearAllCache = cache.equals("yes") ? true : false;
// } else {
// cache = features.get(CLEAR_SESSION_CACHE);
// if (cache != null) {
// clearSessionCache = cache.equals("yes") ? true : false;
// }
// }
// String shouldPause = features.get(SHOULD_PAUSE);
// if (shouldPause != null) {
// shouldPauseInAppBrowser = shouldPause.equals("yes") ? true : false;
// }
// String wideViewPort = features.get(USER_WIDE_VIEW_PORT);
// if (wideViewPort != null ) {
// useWideViewPort = wideViewPort.equals("yes") ? true : false;
// }
// String closeButtonCaptionSet = features.get(CLOSE_BUTTON_CAPTION);
// if (closeButtonCaptionSet != null) {
// closeButtonCaption = closeButtonCaptionSet;
// }
// String closeButtonColorSet = features.get(CLOSE_BUTTON_COLOR);
// if (closeButtonColorSet != null) {
// closeButtonColor = closeButtonColorSet;
// }
// String toolbarColorSet = features.get(TOOLBAR_COLOR);
// if (toolbarColorSet != null) {
// toolbarColor = android.graphics.Color.parseColor(toolbarColorSet);
// }
// String navigationButtonColorSet = features.get(NAVIGATION_COLOR);
// if (navigationButtonColorSet != null) {
// navigationButtonColor = navigationButtonColorSet;
// }
// String showFooterSet = features.get(FOOTER);
// if (showFooterSet != null) {
// showFooter = showFooterSet.equals("yes") ? true : false;
// }
// String footerColorSet = features.get(FOOTER_COLOR);
// if (footerColorSet != null) {
// footerColor = footerColorSet;
// }
// }
//
// // Create dialog in new thread
// Runnable runnable = new Runnable() {
// /**
// * Convert our DIP units to Pixels
// *
// * @return int
// */
// private int dpToPixels(int dipValue) {
// int value = (int) TypedValue.applyDimension( TypedValue.COMPLEX_UNIT_DIP,
// (float) dipValue,
// activity.getResources().getDisplayMetrics()
// );
//
// return value;
// }
//
// @TargetApi(8)
// private View createCloseButton(int id){
// View _close;
// Resources activityRes = activity.getResources();
//
// if (closeButtonCaption != "") {
// // Use TextView for text
// TextView close = new TextView(activity);
// close.setText(closeButtonCaption);
// close.setTextSize(20);
// if (closeButtonColor != "") close.setTextColor(android.graphics.Color.parseColor(closeButtonColor));
// close.setGravity(android.view.Gravity.CENTER_VERTICAL);
// close.setPadding(this.dpToPixels(10), 0, this.dpToPixels(10), 0);
// _close = close;
// }
// else {
// ImageButton close = new ImageButton(activity);
// int closeResId = activityRes.getIdentifier("ic_action_remove", "drawable", activity.getPackageName());
// Drawable closeIcon = activityRes.getDrawable(closeResId);
// if (closeButtonColor != "") close.setColorFilter(android.graphics.Color.parseColor(closeButtonColor));
// close.setImageDrawable(closeIcon);
// close.setScaleType(ImageView.ScaleType.FIT_CENTER);
// if (Build.VERSION.SDK_INT >= 16)
// close.getAdjustViewBounds();
//
// _close = close;
// }
//
// RelativeLayout.LayoutParams closeLayoutParams = new RelativeLayout.LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.MATCH_PARENT);
// closeLayoutParams.addRule(RelativeLayout.ALIGN_PARENT_RIGHT);
// _close.setLayoutParams(closeLayoutParams);
//
// if (Build.VERSION.SDK_INT >= 16)
// _close.setBackground(null);
// else
// _close.setBackgroundDrawable(null);
//
// _close.setContentDescription("Close Button");
// _close.setId(Integer.valueOf(id));
// _close.setOnClickListener(new View.OnClickListener() {
// public void onClick(View v) {
// closeDialog();
// }
// });
//
// return _close;
// }
//
// @SuppressLint("NewApi")
// public void run() {
// // CB-6702 InAppBrowser hangs when opening more than one instance
// if (dialog != null) {
// dialog.dismiss();
// };
//
// // Let's create the main dialog
// dialog = new InAppBrowserDialog(activity, android.R.style.Theme_NoTitleBar);
// dialog.getWindow().getAttributes().windowAnimations = android.R.style.Animation_Dialog;
// dialog.requestWindowFeature(Window.FEATURE_NO_TITLE);
// dialog.setCancelable(true);
// dialog.setInAppBroswer(getInAppBrowser());
//
// int mainId = activity.getResources().getIdentifier("activity_web_view", "layout", activity.getPackageName());
// LinearLayout main = (LinearLayout) LayoutInflater.from(registrar.context()).inflate(mainId, null);
//
// WebView webView = (WebView) main.getChildAt(1));
// webView.loadUrl("https://www.google.com");
//
// // Main container layout
//// LinearLayout main = new LinearLayout(activity);
//// main.setOrientation(LinearLayout.VERTICAL);
////
//// // Toolbar layout
//// RelativeLayout toolbar = new RelativeLayout(activity);
//// //Please, no more black!
////
//// toolbar.setBackgroundColor(toolbarColor);
//// toolbar.setLayoutParams(new RelativeLayout.LayoutParams(LayoutParams.MATCH_PARENT, this.dpToPixels(44)));
//// toolbar.setPadding(this.dpToPixels(2), this.dpToPixels(2), this.dpToPixels(2), this.dpToPixels(2));
//// toolbar.setHorizontalGravity(Gravity.LEFT);
//// toolbar.setVerticalGravity(Gravity.TOP);
////
//// // Action Button Container layout
//// RelativeLayout actionButtonContainer = new RelativeLayout(activity);
//// actionButtonContainer.setLayoutParams(new RelativeLayout.LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT));
//// actionButtonContainer.setHorizontalGravity(Gravity.LEFT);
//// actionButtonContainer.setVerticalGravity(Gravity.CENTER_VERTICAL);
//// actionButtonContainer.setId(Integer.valueOf(1));
////
//// // Back button
//// ImageButton back = new ImageButton(activity);
//// RelativeLayout.LayoutParams backLayoutParams = new RelativeLayout.LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.MATCH_PARENT);
//// backLayoutParams.addRule(RelativeLayout.ALIGN_LEFT);
//// back.setLayoutParams(backLayoutParams);
//// back.setContentDescription("Back Button");
//// back.setId(Integer.valueOf(2));
//// Resources activityRes = activity.getResources();
//// int backResId = activityRes.getIdentifier("ic_action_previous_item", "drawable", activity.getPackageName());
//// Drawable backIcon = activityRes.getDrawable(backResId);
//// if (navigationButtonColor != "") back.setColorFilter(android.graphics.Color.parseColor(navigationButtonColor));
//// if (Build.VERSION.SDK_INT >= 16)
//// back.setBackground(null);
//// else
//// back.setBackgroundDrawable(null);
//// back.setImageDrawable(backIcon);
//// back.setScaleType(ImageView.ScaleType.FIT_CENTER);
//// back.setPadding(0, this.dpToPixels(10), 0, this.dpToPixels(10));
//// if (Build.VERSION.SDK_INT >= 16)
//// back.getAdjustViewBounds();
////
//// back.setOnClickListener(new View.OnClickListener() {
//// public void onClick(View v) {
//// goBack();
//// }
//// });
////
//// // Forward button
//// ImageButton forward = new ImageButton(activity);
//// RelativeLayout.LayoutParams forwardLayoutParams = new RelativeLayout.LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.MATCH_PARENT);
//// forwardLayoutParams.addRule(RelativeLayout.RIGHT_OF, 2);
//// forward.setLayoutParams(forwardLayoutParams);
//// forward.setContentDescription("Forward Button");
//// forward.setId(Integer.valueOf(3));
//// int fwdResId = activityRes.getIdentifier("ic_action_next_item", "drawable", activity.getPackageName());
//// Drawable fwdIcon = activityRes.getDrawable(fwdResId);
//// if (navigationButtonColor != "") forward.setColorFilter(android.graphics.Color.parseColor(navigationButtonColor));
//// if (Build.VERSION.SDK_INT >= 16)
//// forward.setBackground(null);
//// else
//// forward.setBackgroundDrawable(null);
//// forward.setImageDrawable(fwdIcon);
//// forward.setScaleType(ImageView.ScaleType.FIT_CENTER);
//// forward.setPadding(0, this.dpToPixels(10), 0, this.dpToPixels(10));
//// if (Build.VERSION.SDK_INT >= 16)
//// forward.getAdjustViewBounds();
////
//// forward.setOnClickListener(new View.OnClickListener() {
//// public void onClick(View v) {
//// goForward();
//// }
//// });
////
//// // Edit Text Box
//// edittext = new EditText(activity);
//// RelativeLayout.LayoutParams textLayoutParams = new RelativeLayout.LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT);
//// textLayoutParams.addRule(RelativeLayout.RIGHT_OF, 1);
//// textLayoutParams.addRule(RelativeLayout.LEFT_OF, 5);
//// edittext.setLayoutParams(textLayoutParams);
//// edittext.setId(Integer.valueOf(4));
//// edittext.setSingleLine(true);
//// edittext.setText(url);
//// edittext.setInputType(InputType.TYPE_TEXT_VARIATION_URI);
//// edittext.setImeOptions(EditorInfo.IME_ACTION_GO);
//// edittext.setInputType(InputType.TYPE_NULL); // Will not except input... Makes the text NON-EDITABLE
//// edittext.setOnKeyListener(new View.OnKeyListener() {
//// public boolean onKey(View v, int keyCode, KeyEvent event) {
//// // If the event is a key-down event on the "enter" button
//// if ((event.getAction() == KeyEvent.ACTION_DOWN) && (keyCode == KeyEvent.KEYCODE_ENTER)) {
//// navigate(edittext.getText().toString());
//// return true;
//// }
//// return false;
//// }
//// });
////
////
//// // Header Close/Done button
//// View close = createCloseButton(5);
//// toolbar.addView(close);
////
//// // Footer
//// RelativeLayout footer = new RelativeLayout(activity);
//// int _footerColor;
//// if(footerColor != ""){
//// _footerColor = Color.parseColor(footerColor);
//// }else{
//// _footerColor = android.graphics.Color.LTGRAY;
//// }
//// footer.setBackgroundColor(_footerColor);
//// RelativeLayout.LayoutParams footerLayout = new RelativeLayout.LayoutParams(LayoutParams.MATCH_PARENT, this.dpToPixels(44));
//// footerLayout.addRule(RelativeLayout.ALIGN_PARENT_BOTTOM, RelativeLayout.TRUE);
//// footer.setLayoutParams(footerLayout);
//// if (closeButtonCaption != "") footer.setPadding(this.dpToPixels(8), this.dpToPixels(8), this.dpToPixels(8), this.dpToPixels(8));
//// footer.setHorizontalGravity(Gravity.LEFT);
//// footer.setVerticalGravity(Gravity.BOTTOM);
////
//// View footerClose = createCloseButton(7);
//// footer.addView(footerClose);
////
////
//// // WebView
//// inAppWebView = new WebView(activity);
//// inAppWebView.setLayoutParams(new LinearLayout.LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT));
//// inAppWebView.setId(Integer.valueOf(6));
//// inAppWebView.setWebChromeClient(new WebChromeClient() {
////
//// @Override
//// public void onProgressChanged(WebView view, int newProgress) {
//// super.onProgressChanged(view, newProgress);
//// }
////
//// @Override
//// public void onReceivedTitle(WebView view, String title) {
//// super.onReceivedTitle(view, title);
//// }
////
//// @Override
//// public void onReceivedIcon(WebView view, Bitmap icon) {
//// super.onReceivedIcon(view, icon);
//// }
////
//// // For Android 5.0+
//// public boolean onShowFileChooser (WebView webView, ValueCallback<Uri[]> filePathCallback, WebChromeClient.FileChooserParams fileChooserParams)
//// {
//// Log.d(LOG_TAG, "File Chooser 5.0+");
//// // If callback exists, finish it.
//// if(mUploadCallbackLollipop != null) {
//// mUploadCallbackLollipop.onReceiveValue(null);
//// }
//// mUploadCallbackLollipop = filePathCallback;
////
//// // Create File Chooser Intent
//// Intent content = new Intent(Intent.ACTION_GET_CONTENT);
//// content.addCategory(Intent.CATEGORY_OPENABLE);
//// content.setType("*/*");
////
//// registrar.context().startActivity(Intent.createChooser(content, "Select File"));
//// return true;
//// }
////
//// // For Android 4.1+
//// public void openFileChooser(ValueCallback<Uri> uploadMsg, String acceptType, String capture)
//// {
//// Log.d(LOG_TAG, "File Chooser 4.1+");
//// // Call file chooser for Android 3.0+
//// openFileChooser(uploadMsg, acceptType);
//// }
////
//// // For Android 3.0+
//// public void openFileChooser(ValueCallback<Uri> uploadMsg, String acceptType)
//// {
//// Log.d(LOG_TAG, "File Chooser 3.0+");
//// mUploadCallback = uploadMsg;
//// Intent content = new Intent(Intent.ACTION_GET_CONTENT);
//// content.addCategory(Intent.CATEGORY_OPENABLE);
////
//// registrar.context().startActivity(Intent.createChooser(content, "Select File"));
//// }
//// });
////
//// WebViewClient client = new InAppBrowserClient(edittext, activity, channel);
//// inAppWebView.setWebViewClient(client);
//// WebSettings settings = inAppWebView.getSettings();
//// settings.setJavaScriptEnabled(true);
//// //settings.setJavaScinAppWebViewriptCanOpenWindowsAutomatically(true);
//// settings.setBuiltInZoomControls(showZoomControls);
//// settings.setPluginState(android.webkit.WebSettings.PluginState.ON);
////
//// if(android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.JELLY_BEAN_MR1) {
//// settings.setMediaPlaybackRequiresUserGesture(mediaPlaybackRequiresUserGesture);
//// }
////
//// String overrideUserAgent = activity.getPreferences(0).getString("OverrideUserAgent", null);
//// String appendUserAgent = activity.getPreferences(0).getString("AppendUserAgent", null);
////
//// if (overrideUserAgent != null) {
//// settings.setUserAgentString(overrideUserAgent);
//// }
//// if (appendUserAgent != null) {
//// settings.setUserAgentString(settings.getUserAgentString() + appendUserAgent);
//// }
////
//// //Toggle whether this is enabled or not!
//// Bundle appSettings = activity.getIntent().getExtras();
//// boolean enableDatabase = appSettings == null ? true : appSettings.getBoolean("InAppBrowserStorageEnabled", true);
//// if (enableDatabase) {
//// String databasePath = activity.getApplicationContext().getDir("inAppBrowserDB", Context.MODE_PRIVATE).getPath();
//// settings.setDatabasePath(databasePath);
//// settings.setDatabaseEnabled(true);
//// }
//// settings.setDomStorageEnabled(true);
////
//// if (clearAllCache) {
//// CookieManager.getInstance().removeAllCookie();
//// } else if (clearSessionCache) {
//// CookieManager.getInstance().removeSessionCookie();
//// }
////
//// // Enable Thirdparty Cookies on >=Android 5.0 device
//// if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.LOLLIPOP) {
//// CookieManager.getInstance().setAcceptThirdPartyCookies(inAppWebView,true);
//// }
////
//// inAppWebView.loadUrl(url);
//// inAppWebView.setId(Integer.valueOf(6));
//// inAppWebView.getSettings().setLoadWithOverviewMode(true);
//// inAppWebView.getSettings().setUseWideViewPort(useWideViewPort);
//// inAppWebView.requestFocus();
//// inAppWebView.requestFocusFromTouch();
////
//// // Add the back and forward buttons to our action button container layout
//// actionButtonContainer.addView(back);
//// actionButtonContainer.addView(forward);
////
//// // Add the views to our toolbar if they haven't been disabled
//// if (!hideNavigationButtons) toolbar.addView(actionButtonContainer);
//// if (!hideUrlBar) toolbar.addView(edittext);
////
//// // Don't add the toolbar if its been disabled
//// if (getShowLocationBar()) {
//// // Add our toolbar to our main view/layout
//// main.addView(toolbar);
//// }
////
//// // Add our webview to our main view/layout
//// RelativeLayout webViewLayout = new RelativeLayout(activity);
//// webViewLayout.addView(inAppWebView);
//// main.addView(webViewLayout);
////
//// // Don't add the footer unless it's been enabled
//// if (showFooter) {
//// webViewLayout.addView(footer);
//// }
//
// WindowManager.LayoutParams lp = new WindowManager.LayoutParams();
// lp.copyFrom(dialog.getWindow().getAttributes());
// lp.width = WindowManager.LayoutParams.MATCH_PARENT;
// lp.height = WindowManager.LayoutParams.MATCH_PARENT;
//
// dialog.setContentView(main);
// dialog.show();
// dialog.getWindow().setAttributes(lp);
// // the goal of openhidden is to load the url and not display it
// // Show() needs to be called to cause the URL to be loaded
// if(openWindowHidden) {
// dialog.hide();
// }
// }
// };
// this.activity.runOnUiThread(runnable);
//return "";
}
/**
......
package com.pichillilorenzo.flutter_inappbrowser;
import android.os.Build;
import android.support.annotation.RequiresApi;
import android.util.Log;
import java.lang.reflect.Field;
import java.util.Iterator;
import java.util.Map;
import java.util.HashMap;
public class InAppBrowserOptions {
boolean clearCache = false;
boolean clearSessionCache = false;
boolean spinner = true;
boolean hidden = false;
boolean toolbarTop = true;
String toolbarTopColor = "toolbarTopColor";
boolean hideUrlBar = false;
boolean enableViewportScale = false;
boolean keyboardDisplayRequiresUserAction = true;
boolean suppressesIncrementalRendering = false;
boolean allowsAirPlayForMediaPlayback = true;
boolean mediaTypesRequiringUserActionForPlayback = true;
boolean allowsBackForwardNavigationGestures = true;
boolean allowsLinkPreview = true;
boolean ignoresViewportScaleLimits = false;
boolean allowsInlineMediaPlayback = false;
boolean allowsPictureInPictureMediaPlayback = true;
boolean javaScriptCanOpenWindowsAutomatically = false;
boolean javaScriptEnabled = true;
@RequiresApi(api = Build.VERSION_CODES.KITKAT)
public void parse(HashMap<String, Object> options) {
Iterator it = options.entrySet().iterator();
while (it.hasNext()) {
Map.Entry<String, Object> pair = (Map.Entry<String, Object>)it.next();
try {
this.getClass().getField(pair.getKey()).set(this, pair.getValue());
} catch (NoSuchFieldException | IllegalAccessException e) {
// silent
}
}
}
public HashMap<String, Object> getHashMap() {
HashMap<String, Object> options = new HashMap<>();
for (Field f: this.getClass().getDeclaredFields()) {
try {
options.put(f.getName(), f.get(this));
} catch (IllegalAccessException e) {
// silent
}
}
return options;
}
}
package com.pichillilorenzo.flutter_inappbrowser;
import android.app.SearchManager;
import android.content.Context;
import android.content.Intent;
import android.os.Build;
import android.support.annotation.RequiresApi;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.Menu;
import android.view.MenuInflater;
import android.webkit.WebView;
import android.widget.EditText;
import android.widget.SearchView;
import java.util.HashMap;
public class WebViewActivity extends AppCompatActivity {
WebView wv;
SearchView searchView;
InAppBrowserOptions options;
@RequiresApi(api = Build.VERSION_CODES.KITKAT)
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Bundle b = getIntent().getExtras();
String url = b.getString("url");
options = new InAppBrowserOptions();
options.parse((HashMap<String, Object>) b.getSerializable("options"));
setContentView(R.layout.activity_web_view);
wv = (WebView) findViewById(R.id.webView);
InAppBrowser.webViewActivity = this;
wv.loadUrl(url);
getSupportActionBar().setTitle(wv.getTitle());
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
MenuInflater inflater = getMenuInflater();
// Inflate menu to add items to action bar if it is present.
inflater.inflate(R.menu.menu_main, menu);
searchView = (SearchView) menu.findItem(R.id.menu_search).getActionView();
searchView.setQuery(wv.getUrl(), false);
getSupportActionBar().setTitle(wv.getTitle());
searchView.setOnQueryTextListener(new SearchView.OnQueryTextListener() {
@Override
public boolean onQueryTextSubmit(String query) {
wv.loadUrl(query);
return false;
}
@Override
public boolean onQueryTextChange(String newText) {
return false;
}
});
return true;
}
}
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="24dp"
android:height="24dp"
android:viewportWidth="24.0"
android:viewportHeight="24.0">
<path
android:fillColor="#FF000000"
android:pathData="M12,8c1.1,0 2,-0.9 2,-2s-0.9,-2 -2,-2 -2,0.9 -2,2 0.9,2 2,2zM12,10c-1.1,0 -2,0.9 -2,2s0.9,2 2,2 2,-0.9 2,-2 -0.9,-2 -2,-2zM12,16c-1.1,0 -2,0.9 -2,2s0.9,2 2,2 2,-0.9 2,-2 -0.9,-2 -2,-2z"/>
</vector>
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:focusableInTouchMode="true"
android:orientation="vertical"
tools:context=".WebViewActivity">
<WebView
android:id="@+id/webView"
android:layout_width="match_parent"
android:layout_height="match_parent" />
</LinearLayout>
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:appcompat="http://schemas.android.com/apk/res-auto"
xmlns:app="http://schemas.android.com/tools">
<item
android:id="@+id/action_settings"
android:title="@string/action_settings"
android:orderInCategory="100"
app:showAsAction="never"/>
<item
android:id="@+id/menu_search"
android:title="@string/menu_search"
appcompat:actionViewClass="android.widget.SearchView"
appcompat:showAsAction="always" />
</menu>
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="action_settings">Settings</string>
<string name="menu_search">Search</string>
</resources>
<?xml version="1.0" encoding="utf-8"?>
<resources>
<style name="AppTheme" parent="Theme.AppCompat.Light">
</style>
</resources>
......@@ -34,7 +34,7 @@ android {
defaultConfig {
// TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html).
applicationId "com.pichillilorenzo.flutter_inappbrowserexample"
minSdkVersion 16
minSdkVersion 17
targetSdkVersion 27
versionCode flutterVersionCode.toInteger()
versionName flutterVersionName
......
......@@ -22,7 +22,7 @@
<imageView opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" image="LaunchImage" translatesAutoresizingMaskIntoConstraints="NO" id="5cB-8U-Az3">
<rect key="frame" x="206.66666666666666" y="367.66666666666669" width="1" height="1"/>
</imageView>
<wkWebView contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="gA9-n8-qaQ">
<wkWebView contentMode="scaleToFill" allowsBackForwardNavigationGestures="YES" translatesAutoresizingMaskIntoConstraints="NO" id="gA9-n8-qaQ">
<rect key="frame" x="0.0" y="67" width="414" height="625"/>
<color key="backgroundColor" red="0.36078431370000003" green="0.38823529410000002" blue="0.4039215686" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
<wkWebViewConfiguration key="configuration" applicationNameForUserAgent="">
......
......@@ -18,6 +18,7 @@ class MyInAppBrowser extends InAppBrowser {
this.injectScriptCode("""
\$( "body" ).html( "Next Step..." )
""");
this.injectStyleCode("""
body {
background-color: #3c3c3c !important;
......
......@@ -14,11 +14,6 @@ public class InAppBrowserOptions: NSObject {
var clearCache = false
var clearSessionCache = false
var spinner = true
var enableViewportScale = false
var mediaPlaybackRequiresUserAction = false
var allowInlineMediaPlayback = false
var keyboardDisplayRequiresUserAction = true
var suppressesIncrementalRendering = false
var hidden = false
var disallowOverScroll = false
var toolbarTop = true
......@@ -30,6 +25,18 @@ public class InAppBrowserOptions: NSObject {
var hideUrlBar = false
var presentationStyle = 0 //fullscreen
var transitionStyle = 0 //crossDissolve
var enableViewportScale = false
var keyboardDisplayRequiresUserAction = true
var suppressesIncrementalRendering = false
var allowsAirPlayForMediaPlayback = true
var mediaTypesRequiringUserActionForPlayback = "none"
var allowsBackForwardNavigationGestures = true
var allowsLinkPreview = true
var ignoresViewportScaleLimits = false
var allowsInlineMediaPlayback = false
var allowsPictureInPictureMediaPlayback = true
var javaScriptCanOpenWindowsAutomatically = false
var javaScriptEnabled = true
public func parse(options: [String: Any]) {
for (key, value) in options {
......
......@@ -131,6 +131,9 @@ class InAppBrowserWebViewController: UIViewController, WKUIDelegate, WKNavigatio
func prepareWebView() {
self.webView.configuration.userContentController = WKUserContentController()
self.webView.configuration.preferences = WKPreferences()
if (browserOptions?.hideUrlBar)! {
self.urlField.isHidden = true
self.urlField.isEnabled = false
......@@ -191,9 +194,6 @@ class InAppBrowserWebViewController: UIViewController, WKUIDelegate, WKNavigatio
}
}
let wkUController = WKUserContentController()
self.webView.configuration.userContentController = wkUController
if (browserOptions?.enableViewportScale)! {
let jscript = "var meta = document.createElement('meta'); meta.setAttribute('name', 'viewport'); meta.setAttribute('content', 'width=device-width'); document.getElementsByTagName('head')[0].appendChild(meta);"
let userScript = WKUserScript(source: jscript, injectionTime: .atDocumentEnd, forMainFrameOnly: true)
......@@ -204,18 +204,50 @@ class InAppBrowserWebViewController: UIViewController, WKUIDelegate, WKNavigatio
let jscriptWebkitTouchCallout = WKUserScript(source: "document.body.style.webkitTouchCallout='none';", injectionTime: .atDocumentEnd, forMainFrameOnly: true)
self.webView.configuration.userContentController.addUserScript(jscriptWebkitTouchCallout)
if (browserOptions?.mediaPlaybackRequiresUserAction)! {
if (browserOptions?.mediaTypesRequiringUserActionForPlayback)! != "" {
if #available(iOS 10.0, *) {
switch (browserOptions?.mediaTypesRequiringUserActionForPlayback)! {
case "all":
self.webView.configuration.mediaTypesRequiringUserActionForPlayback = .all
break
case "audio":
self.webView.configuration.mediaTypesRequiringUserActionForPlayback = .audio
break
case "video":
self.webView.configuration.mediaTypesRequiringUserActionForPlayback = .video
break
default:
self.webView.configuration.mediaTypesRequiringUserActionForPlayback = []
break
}
} else {
// Fallback on earlier versions
}
}
self.webView.configuration.allowsInlineMediaPlayback = (browserOptions?.allowInlineMediaPlayback)!
self.webView.configuration.allowsInlineMediaPlayback = (browserOptions?.allowsInlineMediaPlayback)!
self.webView.keyboardDisplayRequiresUserAction = browserOptions?.keyboardDisplayRequiresUserAction
self.webView.configuration.suppressesIncrementalRendering = (browserOptions?.suppressesIncrementalRendering)!
self.webView.allowsBackForwardNavigationGestures = (browserOptions?.allowsBackForwardNavigationGestures)!
if #available(iOS 9.0, *) {
self.webView.allowsLinkPreview = (browserOptions?.allowsLinkPreview)!
} else {
// Fallback on earlier versions
}
if #available(iOS 10.0, *) {
self.webView.configuration.ignoresViewportScaleLimits = (browserOptions?.ignoresViewportScaleLimits)!
} else {
// Fallback on earlier versions
}
self.webView.configuration.allowsInlineMediaPlayback = (browserOptions?.allowsInlineMediaPlayback)!
if #available(iOS 9.0, *) {
self.webView.configuration.allowsPictureInPictureMediaPlayback = (browserOptions?.allowsPictureInPictureMediaPlayback)!
} else {
// Fallback on earlier versions
}
self.webView.configuration.preferences.javaScriptCanOpenWindowsAutomatically = (browserOptions?.javaScriptCanOpenWindowsAutomatically)!
self.webView.configuration.preferences.javaScriptEnabled = (browserOptions?.javaScriptEnabled)!
}
// Load user requested url
......@@ -233,189 +265,11 @@ class InAppBrowserWebViewController: UIViewController, WKUIDelegate, WKNavigatio
return false
}
// func createViews() {
// // We create the views in code for primarily for ease of upgrades and not requiring an external .xib to be included
//// let screenSize: CGRect = view.bounds
//// let myView = UIView(frame: CGRect(x: 0, y: 0, width: screenSize.width, height: screenSize.height-44-CGFloat((browserOptions?.location)! ? FOOTER_HEIGHT : TOOLBAR_HEIGHT)))
////
//
////
//// let webViewFrame = CGRect(x: 0, y: urlField.frame.height, width: screenSize.width, height: screenSize.height-44-CGFloat((browserOptions?.location)! ? FOOTER_HEIGHT : TOOLBAR_HEIGHT))
////
//// let webConfiguration = WKWebViewConfiguration()
//// webView = WKWebView(frame: webViewFrame, configuration: webConfiguration)
//// webView?.autoresizingMask = [.flexibleWidth, .flexibleHeight]
//
// let toolbarIsAtBottom: Bool = browserOptions!.toolbarposition == kInAppBrowserToolbarBarPositionBottom
//
// var webViewBounds: CGRect = view.bounds
// webViewBounds.origin.y += (toolbarIsAtBottom) ? 0 : CGFloat(TOOLBAR_HEIGHT+getStatusBarOffset())
// webViewBounds.size.height -= (browserOptions?.location)! ? CGFloat(TOOLBAR_HEIGHT+getStatusBarOffset()) : 0
// let webConfiguration = WKWebViewConfiguration()
// webView = WKWebView(frame: webViewBounds, configuration: webConfiguration)
// webView?.autoresizingMask = [.flexibleWidth, .flexibleHeight]
// view.addSubview(webView!)
// //view.sendSubview(toBack: webView!)
//
// webView?.uiDelegate = self
// webView?.navigationDelegate = self
// webView?.backgroundColor = UIColor.white
// webView?.clearsContextBeforeDrawing = true
// webView?.clipsToBounds = true
// webView?.contentMode = .scaleToFill
// webView?.isMultipleTouchEnabled = true
// webView?.isOpaque = true
// //webView?.scalesPageToFit = false
// webView?.isUserInteractionEnabled = true
//
// spinner = UIActivityIndicatorView(activityIndicatorStyle: .gray)
// spinner.alpha = 1.000
// spinner.autoresizesSubviews = true
// spinner.autoresizingMask = [.flexibleLeftMargin, .flexibleTopMargin, .flexibleBottomMargin, .flexibleRightMargin]
// spinner.clearsContextBeforeDrawing = false
// spinner.clipsToBounds = false
// spinner.contentMode = .scaleToFill
// spinner.frame = CGRect(x: (webView?.frame.midX)!, y: (webView?.frame.midY)!, width: 20.0, height: 20.0)
// spinner.isHidden = false
// spinner.hidesWhenStopped = true
// spinner.isMultipleTouchEnabled = false
// spinner.isOpaque = false
// spinner.isUserInteractionEnabled = false
// spinner.stopAnimating()
//
// closeButton = UIBarButtonItem(barButtonSystemItem: .done, target: self, action: #selector(self.close))
// closeButton.isEnabled = true
// let flexibleSpaceButton = UIBarButtonItem(barButtonSystemItem: .flexibleSpace, target: nil, action: nil)
// let fixedSpaceButton = UIBarButtonItem(barButtonSystemItem: .fixedSpace, target: nil, action: nil)
// fixedSpaceButton.width = 20
//
//
// let toolbarY: Float = toolbarIsAtBottom ? Float(view.bounds.size.height) - TOOLBAR_HEIGHT : 0.0
// let toolbarFrame = CGRect(x: 0.0, y: CGFloat(toolbarY), width: view.bounds.size.width, height: CGFloat(TOOLBAR_HEIGHT))
//
// toolbar = UIToolbar(frame: toolbarFrame)
// toolbar.alpha = 1.000
// toolbar.autoresizesSubviews = true
// toolbar.autoresizingMask = toolbarIsAtBottom ? ([.flexibleWidth, .flexibleTopMargin]) : .flexibleWidth
// toolbar.barStyle = .blackOpaque
// toolbar.clearsContextBeforeDrawing = false
// toolbar.clipsToBounds = false
// toolbar.contentMode = .scaleToFill
// toolbar.isHidden = false
// toolbar.isMultipleTouchEnabled = false
// toolbar.isOpaque = false
// toolbar.isUserInteractionEnabled = true
// if browserOptions?.toolbarcolor != nil {
// // Set toolbar color if user sets it in options
// toolbar.barTintColor = color(fromHexString: (browserOptions?.toolbarcolor)!)
// }
// if !(browserOptions?.toolbartranslucent)! {
// // Set toolbar translucent to no if user sets it in options
// toolbar.isTranslucent = false
// }
// let labelInset: CGFloat = 5.0
// let locationBarY: Float = toolbarIsAtBottom ? Float(view.bounds.size.height) - FOOTER_HEIGHT : Float(view.bounds.size.height) - LOCATIONBAR_HEIGHT
//
//
// let frontArrowString = NSLocalizedString("►", comment: "")
// // create arrow from Unicode char
// forwardButton = UIBarButtonItem(title: frontArrowString, style: .plain, target: self, action: #selector(self.goForward))
//
// //forwardButton = UIBarButtonItem(barButtonSystemItem: .fastForward, target: self, action: #selector(self.goForward))
// forwardButton.isEnabled = true
// forwardButton.imageInsets = UIEdgeInsets.zero as? UIEdgeInsets ?? UIEdgeInsets()
// if browserOptions?.navigationbuttoncolor != nil {
// // Set button color if user sets it in options
// forwardButton.tintColor = color(fromHexString: (browserOptions?.navigationbuttoncolor)!)
// }
//
// let backArrowString = NSLocalizedString("◄", comment: "")
// // create arrow from Unicode char
// backButton = UIBarButtonItem(title: backArrowString, style: .plain, target: self, action: #selector(self.goBack))
// backButton.isEnabled = true
// backButton.imageInsets = UIEdgeInsets.zero as? UIEdgeInsets ?? UIEdgeInsets()
// if browserOptions?.navigationbuttoncolor != nil {
// // Set button color if user sets it in options
// backButton.tintColor = color(fromHexString: (browserOptions?.navigationbuttoncolor)!)
// }
//
// reloadButton = UIBarButtonItem(barButtonSystemItem: .refresh, target: self, action: #selector(self.reload))
// reloadButton.isEnabled = true
// reloadButton.imageInsets = UIEdgeInsetsMake(0, 0, 0, 15)
//
// urlField = UITextField()
// urlField.bounds.size.width = toolbar.bounds.width - 150
// urlField.bounds.size.height = CGFloat(TOOLBAR_HEIGHT-15)
// urlField.backgroundColor = color(fromHexString: "#ECECED")
// urlField.center.y = toolbar.center.y
// urlField.autoresizesSubviews = true
// urlField.autoresizingMask = [.flexibleWidth, .flexibleHeight]
// urlField.text = currentURL?.absoluteString
// urlField.textAlignment = NSTextAlignment.center
// urlField.font = UIFont.systemFont(ofSize: 15)
// urlField.borderStyle = UITextBorderStyle.roundedRect
// urlField.autocorrectionType = UITextAutocorrectionType.no
// urlField.keyboardType = UIKeyboardType.default
// urlField.returnKeyType = UIReturnKeyType.done
// urlField.clearButtonMode = UITextFieldViewMode.whileEditing;
// urlField.contentVerticalAlignment = UIControlContentVerticalAlignment.center
// urlField.delegate = self
// urlFieldBarButton = UIBarButtonItem.init(customView: urlField)
//
// // Filter out Navigation Buttons if user requests so
// if (browserOptions?.hidenavigationbuttons)! {
// toolbar.items = [closeButton, flexibleSpaceButton, urlFieldBarButton]
// }
// else {
// //toolbar.items = [urlFieldBarButton, closeButton, flexibleSpaceButton, backButton, fixedSpaceButton, forwardButton]
// toolbar.items = [urlFieldBarButton, flexibleSpaceButton, reloadButton, closeButton]
// }
//
// view.backgroundColor = UIColor.gray
// view.addSubview(toolbar)
// view.addSubview(spinner)
// }
func setWebViewFrame(_ frame: CGRect) {
print("Setting the WebView's frame to \(NSStringFromCGRect(frame))")
webView.frame = frame
}
// func showToolBar(_ show: Bool, toolbarPosition: String) {
// var toolbarFrame: CGRect = toolbar.frame
// // prevent double show/hide
// if show == !toolbar.isHidden {
// return
// }
// if show {
// toolbar.isHidden = false
// var webViewBounds: CGRect = view.bounds
//
// webViewBounds.size.height -= CGFloat(TOOLBAR_HEIGHT)
// toolbar.frame = toolbarFrame
//
// if (toolbarPosition == kInAppBrowserToolbarBarPositionTop) {
// toolbarFrame.origin.y = 0
// webViewBounds.origin.y += toolbarFrame.size.height
// setWebViewFrame(webViewBounds)
// }
// else {
// toolbarFrame.origin.y = webViewBounds.size.height + CGFloat(LOCATIONBAR_HEIGHT)
// }
// setWebViewFrame(webViewBounds)
// }
// else {
// toolbar.isHidden = true
// setWebViewFrame(view.bounds)
// }
// }
// override func viewDidUnload() {
// webView?.loadHTMLString(nil, baseURL: nil)
// CDVUserAgentUtil.releaseLock(userAgentLockToken)
// super.viewDidUnload()
// }
@objc func reload () {
webView.reload()
}
......@@ -431,9 +285,7 @@ class InAppBrowserWebViewController: UIViewController, WKUIDelegate, WKNavigatio
if (navigationDelegate != nil) {
navigationDelegate?.browserExit()
}
// if (navigationDelegate != nil) && navigationDelegate?.responds(to: #selector(self.browserExit)) {
// navigationDelegate?.browserExit()
// }
weak var weakSelf = self
// Run later to avoid the "took a long time" log message.
......@@ -460,15 +312,19 @@ class InAppBrowserWebViewController: UIViewController, WKUIDelegate, WKNavigatio
webView.load(request)
}
@objc func goBack(_ sender: Any) {
@objc func goBack() {
if webView.canGoBack {
webView.goBack()
updateUrlTextField(url: (webView?.url?.absoluteString)!)
}
}
@objc func goForward(_ sender: Any) {
@objc func goForward() {
if webView.canGoForward {
webView.goForward()
updateUrlTextField(url: (webView?.url?.absoluteString)!)
}
}
func updateUrlTextField(url: String) {
urlField.text = url
......@@ -486,13 +342,6 @@ class InAppBrowserWebViewController: UIViewController, WKUIDelegate, WKNavigatio
return statusBarOffset
}
// func rePositionViews() {
// if (browserOptions?.toolbarposition == kInAppBrowserToolbarBarPositionTop) {
// webView?.frame = CGRect(x: (webView?.frame.origin.x)!, y: CGFloat(TOOLBAR_HEIGHT+getStatusBarOffset()), width: (webView?.frame.size.width)!, height: (webView?.frame.size.height)!)
// toolbar.frame = CGRect(x: toolbar.frame.origin.x, y: CGFloat(getStatusBarOffset()), width: toolbar.frame.size.width, height: toolbar.frame.size.height)
// }
// }
// Helper function to convert hex color string to UIColor
// Assumes input like "#00FF00" (#RRGGBB).
// Taken from https://stackoverflow.com/questions/1560081/how-can-i-create-a-uicolor-from-a-hex-string
......@@ -522,6 +371,20 @@ class InAppBrowserWebViewController: UIViewController, WKUIDelegate, WKNavigatio
return hexInt
}
func webView(_ webView: WKWebView,
decidePolicyFor navigationAction: WKNavigationAction,
decisionHandler: @escaping (WKNavigationActionPolicy) -> Void) {
let url = navigationAction.request.url
if url != nil && (navigationAction.navigationType == .linkActivated || navigationAction.navigationType == .backForward) {
currentURL = url
updateUrlTextField(url: (url?.absoluteString)!)
}
decisionHandler(.allow)
}
func webView(_ webView: WKWebView, didStartProvisionalNavigation navigation: WKNavigation!) {
// loading url, start spinner, update back/forward
backButton.isEnabled = webView.canGoBack
......@@ -534,15 +397,6 @@ class InAppBrowserWebViewController: UIViewController, WKUIDelegate, WKNavigatio
return (navigationDelegate?.webViewDidStartLoad(webView))!
}
// func webView(_ theWebView: WKWebView, shouldStartLoadWith request: URLRequest, navigationType: UIWebViewNavigationType) -> Bool {
// let isTopLevelNavigation: Bool? = request.url == request.mainDocumentURL
// if isTopLevelNavigation ?? false {
// currentURL = request.url
// }
//
// return (navigationDelegate?.webView(theWebView, shouldStartLoadWith: request, navigationType: navigationType))!
// }
func webView(_ webView: WKWebView, didFinish navigation: WKNavigation!) {
//func webViewDidFinishLoad(_ theWebView: WKWebView) {
// update url, stop spinner, update back/forward
......
......@@ -59,6 +59,25 @@ public class SwiftFlutterPlugin: NSObject, FlutterPlugin {
self.hide()
result(true)
break
case "reload":
self.webViewController?.reload()
result(true)
break
case "goBack":
self.webViewController?.goBack()
result(true)
break
case "goForward":
self.webViewController?.goForward()
result(true)
break
case "isLoading":
result(self.webViewController?.webView.isLoading == true)
break
case "stopLoading":
self.webViewController?.webView.stopLoading()
result(true)
break
case "injectScriptCode":
self.injectScriptCode(arguments: arguments!)
result(true)
......
......@@ -144,6 +144,31 @@ class InAppBrowser {
return await _channel.invokeMethod('close');
}
///Reloads the [InAppBrowser] window.
Future<void> reload() async {
return await _channel.invokeMethod('reload');
}
///Goes back in the history of the [InAppBrowser] window.
Future<void> goBack() async {
return await _channel.invokeMethod('goBack');
}
///Goes forward in the history of the [InAppBrowser] window.
Future<void> goForward() async {
return await _channel.invokeMethod('goForward');
}
///Check if the Web View of the [InAppBrowser] instance is in a loading state.
Future<bool> isLoading() async {
return await _channel.invokeMethod('isLoading');
}
///Stops the Web View of the [InAppBrowser] instance from loading.
Future<void> stopLoading() async {
return await _channel.invokeMethod('stopLoading');
}
///Injects JavaScript code into the [InAppBrowser] window. (Only available when the target is set to `_blank` or to `_self`)
Future<void> injectScriptCode(String source) async {
Map<String, dynamic> args = <String, dynamic>{};
......
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