@capawesome/capacitor-in-app-browser 0.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CapawesomeCapacitorInAppBrowser.podspec +17 -0
- package/LICENSE +21 -0
- package/Package.swift +28 -0
- package/README.md +690 -0
- package/android/build.gradle +60 -0
- package/android/src/main/AndroidManifest.xml +2 -0
- package/android/src/main/java/io/capawesome/capacitorjs/plugins/inappbrowser/InAppBrowser.java +242 -0
- package/android/src/main/java/io/capawesome/capacitorjs/plugins/inappbrowser/InAppBrowserPlugin.java +289 -0
- package/android/src/main/java/io/capawesome/capacitorjs/plugins/inappbrowser/classes/CustomException.java +20 -0
- package/android/src/main/java/io/capawesome/capacitorjs/plugins/inappbrowser/classes/CustomExceptions.java +20 -0
- package/android/src/main/java/io/capawesome/capacitorjs/plugins/inappbrowser/classes/WebViewDialog.java +343 -0
- package/android/src/main/java/io/capawesome/capacitorjs/plugins/inappbrowser/classes/events/BrowserPageNavigationCompletedEvent.java +23 -0
- package/android/src/main/java/io/capawesome/capacitorjs/plugins/inappbrowser/classes/events/MessageReceivedEvent.java +23 -0
- package/android/src/main/java/io/capawesome/capacitorjs/plugins/inappbrowser/classes/options/ExecuteScriptOptions.java +29 -0
- package/android/src/main/java/io/capawesome/capacitorjs/plugins/inappbrowser/classes/options/GetCookiesOptions.java +29 -0
- package/android/src/main/java/io/capawesome/capacitorjs/plugins/inappbrowser/classes/options/OpenInExternalBrowserOptions.java +30 -0
- package/android/src/main/java/io/capawesome/capacitorjs/plugins/inappbrowser/classes/options/OpenInSystemBrowserOptions.java +74 -0
- package/android/src/main/java/io/capawesome/capacitorjs/plugins/inappbrowser/classes/options/OpenInWebViewOptions.java +112 -0
- package/android/src/main/java/io/capawesome/capacitorjs/plugins/inappbrowser/classes/options/PostMessageOptions.java +30 -0
- package/android/src/main/java/io/capawesome/capacitorjs/plugins/inappbrowser/classes/options/WebViewToolbarOptions.java +87 -0
- package/android/src/main/java/io/capawesome/capacitorjs/plugins/inappbrowser/classes/results/ExecuteScriptResult.java +25 -0
- package/android/src/main/java/io/capawesome/capacitorjs/plugins/inappbrowser/classes/results/GetCookiesResult.java +28 -0
- package/android/src/main/java/io/capawesome/capacitorjs/plugins/inappbrowser/interfaces/Callback.java +5 -0
- package/android/src/main/java/io/capawesome/capacitorjs/plugins/inappbrowser/interfaces/EmptyCallback.java +5 -0
- package/android/src/main/java/io/capawesome/capacitorjs/plugins/inappbrowser/interfaces/NonEmptyResultCallback.java +7 -0
- package/android/src/main/java/io/capawesome/capacitorjs/plugins/inappbrowser/interfaces/Result.java +7 -0
- package/android/src/main/res/.gitkeep +0 -0
- package/dist/docs.json +1173 -0
- package/dist/esm/definitions.d.ts +540 -0
- package/dist/esm/definitions.js +19 -0
- package/dist/esm/definitions.js.map +1 -0
- package/dist/esm/index.d.ts +4 -0
- package/dist/esm/index.js +7 -0
- package/dist/esm/index.js.map +1 -0
- package/dist/esm/web.d.ts +14 -0
- package/dist/esm/web.js +35 -0
- package/dist/esm/web.js.map +1 -0
- package/dist/plugin.cjs.js +68 -0
- package/dist/plugin.cjs.js.map +1 -0
- package/dist/plugin.js +71 -0
- package/dist/plugin.js.map +1 -0
- package/ios/Plugin/Classes/Events/BrowserPageNavigationCompletedEvent.swift +16 -0
- package/ios/Plugin/Classes/Events/MessageReceivedEvent.swift +24 -0
- package/ios/Plugin/Classes/Options/ExecuteScriptOptions.swift +17 -0
- package/ios/Plugin/Classes/Options/GetCookiesOptions.swift +20 -0
- package/ios/Plugin/Classes/Options/OpenInExternalBrowserOptions.swift +20 -0
- package/ios/Plugin/Classes/Options/OpenInSystemBrowserOptions.swift +52 -0
- package/ios/Plugin/Classes/Options/OpenInWebViewOptions.swift +48 -0
- package/ios/Plugin/Classes/Options/PostMessageOptions.swift +17 -0
- package/ios/Plugin/Classes/Options/WebViewToolbarOptions.swift +37 -0
- package/ios/Plugin/Classes/Results/ExecuteScriptResult.swift +25 -0
- package/ios/Plugin/Classes/Results/GetCookiesResult.swift +20 -0
- package/ios/Plugin/Classes/WebViewController.swift +224 -0
- package/ios/Plugin/Enums/CustomError.swift +49 -0
- package/ios/Plugin/InAppBrowser.swift +194 -0
- package/ios/Plugin/InAppBrowserHelper.swift +49 -0
- package/ios/Plugin/InAppBrowserPlugin.swift +191 -0
- package/ios/Plugin/Info.plist +24 -0
- package/ios/Plugin/Protocols/Result.swift +5 -0
- package/package.json +91 -0
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
ext {
|
|
2
|
+
junitVersion = project.hasProperty('junitVersion') ? rootProject.ext.junitVersion : '4.13.2'
|
|
3
|
+
androidxAppCompatVersion = project.hasProperty('androidxAppCompatVersion') ? rootProject.ext.androidxAppCompatVersion : '1.7.1'
|
|
4
|
+
androidxBrowserVersion = project.hasProperty('androidxBrowserVersion') ? rootProject.ext.androidxBrowserVersion : '1.9.0'
|
|
5
|
+
androidxJunitVersion = project.hasProperty('androidxJunitVersion') ? rootProject.ext.androidxJunitVersion : '1.3.0'
|
|
6
|
+
androidxEspressoCoreVersion = project.hasProperty('androidxEspressoCoreVersion') ? rootProject.ext.androidxEspressoCoreVersion : '3.7.0'
|
|
7
|
+
}
|
|
8
|
+
|
|
9
|
+
buildscript {
|
|
10
|
+
repositories {
|
|
11
|
+
google()
|
|
12
|
+
mavenCentral()
|
|
13
|
+
}
|
|
14
|
+
dependencies {
|
|
15
|
+
classpath 'com.android.tools.build:gradle:8.13.0'
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
apply plugin: 'com.android.library'
|
|
20
|
+
|
|
21
|
+
android {
|
|
22
|
+
namespace = "io.capawesome.capacitorjs.plugins.inappbrowser"
|
|
23
|
+
compileSdk = project.hasProperty('compileSdkVersion') ? rootProject.ext.compileSdkVersion : 36
|
|
24
|
+
defaultConfig {
|
|
25
|
+
minSdkVersion project.hasProperty('minSdkVersion') ? rootProject.ext.minSdkVersion : 24
|
|
26
|
+
targetSdkVersion project.hasProperty('targetSdkVersion') ? rootProject.ext.targetSdkVersion : 36
|
|
27
|
+
versionCode 1
|
|
28
|
+
versionName "1.0"
|
|
29
|
+
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
|
|
30
|
+
}
|
|
31
|
+
buildTypes {
|
|
32
|
+
release {
|
|
33
|
+
minifyEnabled false
|
|
34
|
+
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
lintOptions {
|
|
38
|
+
abortOnError = false
|
|
39
|
+
}
|
|
40
|
+
compileOptions {
|
|
41
|
+
sourceCompatibility JavaVersion.VERSION_21
|
|
42
|
+
targetCompatibility JavaVersion.VERSION_21
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
repositories {
|
|
47
|
+
google()
|
|
48
|
+
mavenCentral()
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
|
|
52
|
+
dependencies {
|
|
53
|
+
implementation fileTree(dir: 'libs', include: ['*.jar'])
|
|
54
|
+
implementation project(':capacitor-android')
|
|
55
|
+
implementation "androidx.appcompat:appcompat:$androidxAppCompatVersion"
|
|
56
|
+
implementation "androidx.browser:browser:$androidxBrowserVersion"
|
|
57
|
+
testImplementation "junit:junit:$junitVersion"
|
|
58
|
+
androidTestImplementation "androidx.test.ext:junit:$androidxJunitVersion"
|
|
59
|
+
androidTestImplementation "androidx.test.espresso:espresso-core:$androidxEspressoCoreVersion"
|
|
60
|
+
}
|
package/android/src/main/java/io/capawesome/capacitorjs/plugins/inappbrowser/InAppBrowser.java
ADDED
|
@@ -0,0 +1,242 @@
|
|
|
1
|
+
package io.capawesome.capacitorjs.plugins.inappbrowser;
|
|
2
|
+
|
|
3
|
+
import android.content.ActivityNotFoundException;
|
|
4
|
+
import android.content.Intent;
|
|
5
|
+
import android.webkit.CookieManager;
|
|
6
|
+
import android.webkit.WebStorage;
|
|
7
|
+
import android.webkit.WebView;
|
|
8
|
+
import androidx.annotation.NonNull;
|
|
9
|
+
import androidx.annotation.Nullable;
|
|
10
|
+
import androidx.browser.customtabs.CustomTabColorSchemeParams;
|
|
11
|
+
import androidx.browser.customtabs.CustomTabsIntent;
|
|
12
|
+
import io.capawesome.capacitorjs.plugins.inappbrowser.classes.CustomExceptions;
|
|
13
|
+
import io.capawesome.capacitorjs.plugins.inappbrowser.classes.WebViewDialog;
|
|
14
|
+
import io.capawesome.capacitorjs.plugins.inappbrowser.classes.events.BrowserPageNavigationCompletedEvent;
|
|
15
|
+
import io.capawesome.capacitorjs.plugins.inappbrowser.classes.events.MessageReceivedEvent;
|
|
16
|
+
import io.capawesome.capacitorjs.plugins.inappbrowser.classes.options.ExecuteScriptOptions;
|
|
17
|
+
import io.capawesome.capacitorjs.plugins.inappbrowser.classes.options.GetCookiesOptions;
|
|
18
|
+
import io.capawesome.capacitorjs.plugins.inappbrowser.classes.options.OpenInExternalBrowserOptions;
|
|
19
|
+
import io.capawesome.capacitorjs.plugins.inappbrowser.classes.options.OpenInSystemBrowserOptions;
|
|
20
|
+
import io.capawesome.capacitorjs.plugins.inappbrowser.classes.options.OpenInWebViewOptions;
|
|
21
|
+
import io.capawesome.capacitorjs.plugins.inappbrowser.classes.options.PostMessageOptions;
|
|
22
|
+
import io.capawesome.capacitorjs.plugins.inappbrowser.classes.results.ExecuteScriptResult;
|
|
23
|
+
import io.capawesome.capacitorjs.plugins.inappbrowser.classes.results.GetCookiesResult;
|
|
24
|
+
import io.capawesome.capacitorjs.plugins.inappbrowser.interfaces.EmptyCallback;
|
|
25
|
+
import io.capawesome.capacitorjs.plugins.inappbrowser.interfaces.NonEmptyResultCallback;
|
|
26
|
+
import java.util.HashMap;
|
|
27
|
+
import java.util.Map;
|
|
28
|
+
import org.json.JSONException;
|
|
29
|
+
import org.json.JSONTokener;
|
|
30
|
+
|
|
31
|
+
public class InAppBrowser {
|
|
32
|
+
|
|
33
|
+
@NonNull
|
|
34
|
+
private final InAppBrowserPlugin plugin;
|
|
35
|
+
|
|
36
|
+
private boolean customTabOpened = false;
|
|
37
|
+
|
|
38
|
+
@Nullable
|
|
39
|
+
private WebViewDialog webViewDialog;
|
|
40
|
+
|
|
41
|
+
public InAppBrowser(@NonNull InAppBrowserPlugin plugin) {
|
|
42
|
+
this.plugin = plugin;
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
public void clearCache(@NonNull EmptyCallback callback) {
|
|
46
|
+
plugin
|
|
47
|
+
.getActivity()
|
|
48
|
+
.runOnUiThread(() -> {
|
|
49
|
+
WebView webView = new WebView(plugin.getContext());
|
|
50
|
+
webView.clearCache(true);
|
|
51
|
+
webView.destroy();
|
|
52
|
+
callback.success();
|
|
53
|
+
});
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
public void clearSessionData(@NonNull EmptyCallback callback) {
|
|
57
|
+
plugin
|
|
58
|
+
.getActivity()
|
|
59
|
+
.runOnUiThread(() -> {
|
|
60
|
+
CookieManager cookieManager = CookieManager.getInstance();
|
|
61
|
+
cookieManager.removeAllCookies(value -> {
|
|
62
|
+
cookieManager.flush();
|
|
63
|
+
WebStorage.getInstance().deleteAllData();
|
|
64
|
+
callback.success();
|
|
65
|
+
});
|
|
66
|
+
});
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
public void close(@NonNull EmptyCallback callback) {
|
|
70
|
+
plugin
|
|
71
|
+
.getActivity()
|
|
72
|
+
.runOnUiThread(() -> {
|
|
73
|
+
WebViewDialog webViewDialog = this.webViewDialog;
|
|
74
|
+
if (webViewDialog != null) {
|
|
75
|
+
webViewDialog.dismiss();
|
|
76
|
+
callback.success();
|
|
77
|
+
return;
|
|
78
|
+
}
|
|
79
|
+
if (customTabOpened) {
|
|
80
|
+
Intent intent = new Intent(plugin.getContext(), plugin.getActivity().getClass());
|
|
81
|
+
intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_SINGLE_TOP);
|
|
82
|
+
plugin.getActivity().startActivity(intent);
|
|
83
|
+
callback.success();
|
|
84
|
+
return;
|
|
85
|
+
}
|
|
86
|
+
callback.error(CustomExceptions.NO_BROWSER_OPEN);
|
|
87
|
+
});
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
public void executeScript(@NonNull ExecuteScriptOptions options, @NonNull NonEmptyResultCallback<ExecuteScriptResult> callback) {
|
|
91
|
+
plugin
|
|
92
|
+
.getActivity()
|
|
93
|
+
.runOnUiThread(() -> {
|
|
94
|
+
WebViewDialog webViewDialog = this.webViewDialog;
|
|
95
|
+
if (webViewDialog == null) {
|
|
96
|
+
callback.error(CustomExceptions.NO_BROWSER_OPEN);
|
|
97
|
+
return;
|
|
98
|
+
}
|
|
99
|
+
webViewDialog.executeScript(options.getScript(), value -> {
|
|
100
|
+
String result = value == null || value.equals("null") ? null : value;
|
|
101
|
+
callback.success(new ExecuteScriptResult(result));
|
|
102
|
+
});
|
|
103
|
+
});
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
public void getCookies(@NonNull GetCookiesOptions options, @NonNull NonEmptyResultCallback<GetCookiesResult> callback) {
|
|
107
|
+
plugin
|
|
108
|
+
.getActivity()
|
|
109
|
+
.runOnUiThread(() -> {
|
|
110
|
+
Map<String, String> cookies = new HashMap<>();
|
|
111
|
+
String cookieString = CookieManager.getInstance().getCookie(options.getUrl());
|
|
112
|
+
if (cookieString != null) {
|
|
113
|
+
for (String cookie : cookieString.split("; ")) {
|
|
114
|
+
int separatorIndex = cookie.indexOf('=');
|
|
115
|
+
if (separatorIndex < 0) {
|
|
116
|
+
continue;
|
|
117
|
+
}
|
|
118
|
+
String name = cookie.substring(0, separatorIndex);
|
|
119
|
+
String value = cookie.substring(separatorIndex + 1);
|
|
120
|
+
cookies.put(name, value);
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
callback.success(new GetCookiesResult(cookies));
|
|
124
|
+
});
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
public void handleOnPause() {
|
|
128
|
+
WebViewDialog webViewDialog = this.webViewDialog;
|
|
129
|
+
if (webViewDialog != null) {
|
|
130
|
+
webViewDialog.handleOnPause();
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
|
|
134
|
+
public void handleOnResume() {
|
|
135
|
+
WebViewDialog webViewDialog = this.webViewDialog;
|
|
136
|
+
if (webViewDialog != null) {
|
|
137
|
+
webViewDialog.handleOnResume();
|
|
138
|
+
}
|
|
139
|
+
if (customTabOpened) {
|
|
140
|
+
customTabOpened = false;
|
|
141
|
+
plugin.notifyBrowserClosedListeners();
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
|
|
145
|
+
public void openInExternalBrowser(@NonNull OpenInExternalBrowserOptions options, @NonNull EmptyCallback callback) {
|
|
146
|
+
Intent intent = new Intent(Intent.ACTION_VIEW, options.getUri());
|
|
147
|
+
try {
|
|
148
|
+
plugin.getActivity().startActivity(intent);
|
|
149
|
+
callback.success();
|
|
150
|
+
} catch (ActivityNotFoundException exception) {
|
|
151
|
+
callback.error(CustomExceptions.BROWSER_NOT_FOUND);
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
|
|
155
|
+
public void openInSystemBrowser(@NonNull OpenInSystemBrowserOptions options, @NonNull EmptyCallback callback) {
|
|
156
|
+
plugin
|
|
157
|
+
.getActivity()
|
|
158
|
+
.runOnUiThread(() -> {
|
|
159
|
+
CustomTabsIntent.Builder builder = new CustomTabsIntent.Builder();
|
|
160
|
+
Integer toolbarColor = options.getToolbarColor();
|
|
161
|
+
if (toolbarColor != null) {
|
|
162
|
+
builder.setDefaultColorSchemeParams(new CustomTabColorSchemeParams.Builder().setToolbarColor(toolbarColor).build());
|
|
163
|
+
}
|
|
164
|
+
builder.setShowTitle(options.getShowTitle());
|
|
165
|
+
builder.setUrlBarHidingEnabled(options.getHideToolbarOnScroll());
|
|
166
|
+
CustomTabsIntent customTabsIntent = builder.build();
|
|
167
|
+
try {
|
|
168
|
+
customTabsIntent.launchUrl(plugin.getActivity(), options.getUri());
|
|
169
|
+
customTabOpened = true;
|
|
170
|
+
callback.success();
|
|
171
|
+
} catch (ActivityNotFoundException exception) {
|
|
172
|
+
callback.error(CustomExceptions.BROWSER_NOT_FOUND);
|
|
173
|
+
}
|
|
174
|
+
});
|
|
175
|
+
}
|
|
176
|
+
|
|
177
|
+
public void openInWebView(@NonNull OpenInWebViewOptions options, @NonNull EmptyCallback callback) {
|
|
178
|
+
plugin
|
|
179
|
+
.getActivity()
|
|
180
|
+
.runOnUiThread(() -> {
|
|
181
|
+
WebViewDialog existingWebViewDialog = this.webViewDialog;
|
|
182
|
+
if (existingWebViewDialog != null) {
|
|
183
|
+
existingWebViewDialog.dismiss();
|
|
184
|
+
}
|
|
185
|
+
WebViewDialog webViewDialog = new WebViewDialog(
|
|
186
|
+
plugin.getActivity(),
|
|
187
|
+
options,
|
|
188
|
+
new WebViewDialog.Listener() {
|
|
189
|
+
@Override
|
|
190
|
+
public void onClosed(@NonNull WebViewDialog dialog) {
|
|
191
|
+
if (InAppBrowser.this.webViewDialog == dialog) {
|
|
192
|
+
InAppBrowser.this.webViewDialog = null;
|
|
193
|
+
}
|
|
194
|
+
plugin.notifyBrowserClosedListeners();
|
|
195
|
+
}
|
|
196
|
+
|
|
197
|
+
@Override
|
|
198
|
+
public void onMessageReceived(@NonNull String data) {
|
|
199
|
+
handleMessageReceived(data);
|
|
200
|
+
}
|
|
201
|
+
|
|
202
|
+
@Override
|
|
203
|
+
public void onPageLoaded() {
|
|
204
|
+
plugin.notifyBrowserPageLoadedListeners();
|
|
205
|
+
}
|
|
206
|
+
|
|
207
|
+
@Override
|
|
208
|
+
public void onPageNavigationCompleted(@NonNull String url) {
|
|
209
|
+
plugin.notifyBrowserPageNavigationCompletedListeners(new BrowserPageNavigationCompletedEvent(url));
|
|
210
|
+
}
|
|
211
|
+
}
|
|
212
|
+
);
|
|
213
|
+
this.webViewDialog = webViewDialog;
|
|
214
|
+
webViewDialog.show();
|
|
215
|
+
callback.success();
|
|
216
|
+
});
|
|
217
|
+
}
|
|
218
|
+
|
|
219
|
+
public void postMessage(@NonNull PostMessageOptions options, @NonNull EmptyCallback callback) {
|
|
220
|
+
plugin
|
|
221
|
+
.getActivity()
|
|
222
|
+
.runOnUiThread(() -> {
|
|
223
|
+
WebViewDialog webViewDialog = this.webViewDialog;
|
|
224
|
+
if (webViewDialog == null) {
|
|
225
|
+
callback.error(CustomExceptions.NO_BROWSER_OPEN);
|
|
226
|
+
return;
|
|
227
|
+
}
|
|
228
|
+
webViewDialog.postMessage(options.getData().toString());
|
|
229
|
+
callback.success();
|
|
230
|
+
});
|
|
231
|
+
}
|
|
232
|
+
|
|
233
|
+
private void handleMessageReceived(@NonNull String data) {
|
|
234
|
+
Object value;
|
|
235
|
+
try {
|
|
236
|
+
value = new JSONTokener(data).nextValue();
|
|
237
|
+
} catch (JSONException exception) {
|
|
238
|
+
value = data;
|
|
239
|
+
}
|
|
240
|
+
plugin.notifyMessageReceivedListeners(new MessageReceivedEvent(value));
|
|
241
|
+
}
|
|
242
|
+
}
|
package/android/src/main/java/io/capawesome/capacitorjs/plugins/inappbrowser/InAppBrowserPlugin.java
ADDED
|
@@ -0,0 +1,289 @@
|
|
|
1
|
+
package io.capawesome.capacitorjs.plugins.inappbrowser;
|
|
2
|
+
|
|
3
|
+
import androidx.annotation.NonNull;
|
|
4
|
+
import androidx.annotation.Nullable;
|
|
5
|
+
import com.getcapacitor.JSObject;
|
|
6
|
+
import com.getcapacitor.Logger;
|
|
7
|
+
import com.getcapacitor.Plugin;
|
|
8
|
+
import com.getcapacitor.PluginCall;
|
|
9
|
+
import com.getcapacitor.PluginMethod;
|
|
10
|
+
import com.getcapacitor.annotation.CapacitorPlugin;
|
|
11
|
+
import io.capawesome.capacitorjs.plugins.inappbrowser.classes.CustomException;
|
|
12
|
+
import io.capawesome.capacitorjs.plugins.inappbrowser.classes.events.BrowserPageNavigationCompletedEvent;
|
|
13
|
+
import io.capawesome.capacitorjs.plugins.inappbrowser.classes.events.MessageReceivedEvent;
|
|
14
|
+
import io.capawesome.capacitorjs.plugins.inappbrowser.classes.options.ExecuteScriptOptions;
|
|
15
|
+
import io.capawesome.capacitorjs.plugins.inappbrowser.classes.options.GetCookiesOptions;
|
|
16
|
+
import io.capawesome.capacitorjs.plugins.inappbrowser.classes.options.OpenInExternalBrowserOptions;
|
|
17
|
+
import io.capawesome.capacitorjs.plugins.inappbrowser.classes.options.OpenInSystemBrowserOptions;
|
|
18
|
+
import io.capawesome.capacitorjs.plugins.inappbrowser.classes.options.OpenInWebViewOptions;
|
|
19
|
+
import io.capawesome.capacitorjs.plugins.inappbrowser.classes.options.PostMessageOptions;
|
|
20
|
+
import io.capawesome.capacitorjs.plugins.inappbrowser.classes.results.ExecuteScriptResult;
|
|
21
|
+
import io.capawesome.capacitorjs.plugins.inappbrowser.classes.results.GetCookiesResult;
|
|
22
|
+
import io.capawesome.capacitorjs.plugins.inappbrowser.interfaces.EmptyCallback;
|
|
23
|
+
import io.capawesome.capacitorjs.plugins.inappbrowser.interfaces.NonEmptyResultCallback;
|
|
24
|
+
import io.capawesome.capacitorjs.plugins.inappbrowser.interfaces.Result;
|
|
25
|
+
|
|
26
|
+
@CapacitorPlugin(name = "InAppBrowser")
|
|
27
|
+
public class InAppBrowserPlugin extends Plugin {
|
|
28
|
+
|
|
29
|
+
public static final String EVENT_BROWSER_CLOSED = "browserClosed";
|
|
30
|
+
public static final String EVENT_BROWSER_PAGE_LOADED = "browserPageLoaded";
|
|
31
|
+
public static final String EVENT_BROWSER_PAGE_NAVIGATION_COMPLETED = "browserPageNavigationCompleted";
|
|
32
|
+
public static final String EVENT_MESSAGE_RECEIVED = "messageReceived";
|
|
33
|
+
public static final String TAG = "InAppBrowserPlugin";
|
|
34
|
+
|
|
35
|
+
private static final String ERROR_UNKNOWN_ERROR = "An unknown error occurred.";
|
|
36
|
+
|
|
37
|
+
private InAppBrowser implementation;
|
|
38
|
+
|
|
39
|
+
@PluginMethod
|
|
40
|
+
public void clearCache(PluginCall call) {
|
|
41
|
+
try {
|
|
42
|
+
EmptyCallback callback = new EmptyCallback() {
|
|
43
|
+
@Override
|
|
44
|
+
public void success() {
|
|
45
|
+
resolveCall(call);
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
@Override
|
|
49
|
+
public void error(@NonNull Exception exception) {
|
|
50
|
+
rejectCall(call, exception);
|
|
51
|
+
}
|
|
52
|
+
};
|
|
53
|
+
|
|
54
|
+
implementation.clearCache(callback);
|
|
55
|
+
} catch (Exception exception) {
|
|
56
|
+
rejectCall(call, exception);
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
@PluginMethod
|
|
61
|
+
public void clearSessionData(PluginCall call) {
|
|
62
|
+
try {
|
|
63
|
+
EmptyCallback callback = new EmptyCallback() {
|
|
64
|
+
@Override
|
|
65
|
+
public void success() {
|
|
66
|
+
resolveCall(call);
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
@Override
|
|
70
|
+
public void error(@NonNull Exception exception) {
|
|
71
|
+
rejectCall(call, exception);
|
|
72
|
+
}
|
|
73
|
+
};
|
|
74
|
+
|
|
75
|
+
implementation.clearSessionData(callback);
|
|
76
|
+
} catch (Exception exception) {
|
|
77
|
+
rejectCall(call, exception);
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
@PluginMethod
|
|
82
|
+
public void close(PluginCall call) {
|
|
83
|
+
try {
|
|
84
|
+
EmptyCallback callback = new EmptyCallback() {
|
|
85
|
+
@Override
|
|
86
|
+
public void success() {
|
|
87
|
+
resolveCall(call);
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
@Override
|
|
91
|
+
public void error(@NonNull Exception exception) {
|
|
92
|
+
rejectCall(call, exception);
|
|
93
|
+
}
|
|
94
|
+
};
|
|
95
|
+
|
|
96
|
+
implementation.close(callback);
|
|
97
|
+
} catch (Exception exception) {
|
|
98
|
+
rejectCall(call, exception);
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
@PluginMethod
|
|
103
|
+
public void executeScript(PluginCall call) {
|
|
104
|
+
try {
|
|
105
|
+
ExecuteScriptOptions options = new ExecuteScriptOptions(call);
|
|
106
|
+
NonEmptyResultCallback<ExecuteScriptResult> callback = new NonEmptyResultCallback<>() {
|
|
107
|
+
@Override
|
|
108
|
+
public void success(@NonNull ExecuteScriptResult result) {
|
|
109
|
+
resolveCall(call, result);
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
@Override
|
|
113
|
+
public void error(@NonNull Exception exception) {
|
|
114
|
+
rejectCall(call, exception);
|
|
115
|
+
}
|
|
116
|
+
};
|
|
117
|
+
|
|
118
|
+
implementation.executeScript(options, callback);
|
|
119
|
+
} catch (Exception exception) {
|
|
120
|
+
rejectCall(call, exception);
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
@PluginMethod
|
|
125
|
+
public void getCookies(PluginCall call) {
|
|
126
|
+
try {
|
|
127
|
+
GetCookiesOptions options = new GetCookiesOptions(call);
|
|
128
|
+
NonEmptyResultCallback<GetCookiesResult> callback = new NonEmptyResultCallback<>() {
|
|
129
|
+
@Override
|
|
130
|
+
public void success(@NonNull GetCookiesResult result) {
|
|
131
|
+
resolveCall(call, result);
|
|
132
|
+
}
|
|
133
|
+
|
|
134
|
+
@Override
|
|
135
|
+
public void error(@NonNull Exception exception) {
|
|
136
|
+
rejectCall(call, exception);
|
|
137
|
+
}
|
|
138
|
+
};
|
|
139
|
+
|
|
140
|
+
implementation.getCookies(options, callback);
|
|
141
|
+
} catch (Exception exception) {
|
|
142
|
+
rejectCall(call, exception);
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
|
|
146
|
+
@Override
|
|
147
|
+
public void load() {
|
|
148
|
+
implementation = new InAppBrowser(this);
|
|
149
|
+
}
|
|
150
|
+
|
|
151
|
+
public void notifyBrowserClosedListeners() {
|
|
152
|
+
notifyListeners(EVENT_BROWSER_CLOSED, new JSObject());
|
|
153
|
+
}
|
|
154
|
+
|
|
155
|
+
public void notifyBrowserPageLoadedListeners() {
|
|
156
|
+
notifyListeners(EVENT_BROWSER_PAGE_LOADED, new JSObject());
|
|
157
|
+
}
|
|
158
|
+
|
|
159
|
+
public void notifyBrowserPageNavigationCompletedListeners(@NonNull BrowserPageNavigationCompletedEvent event) {
|
|
160
|
+
notifyListeners(EVENT_BROWSER_PAGE_NAVIGATION_COMPLETED, event.toJSObject());
|
|
161
|
+
}
|
|
162
|
+
|
|
163
|
+
public void notifyMessageReceivedListeners(@NonNull MessageReceivedEvent event) {
|
|
164
|
+
notifyListeners(EVENT_MESSAGE_RECEIVED, event.toJSObject());
|
|
165
|
+
}
|
|
166
|
+
|
|
167
|
+
@PluginMethod
|
|
168
|
+
public void openInExternalBrowser(PluginCall call) {
|
|
169
|
+
try {
|
|
170
|
+
OpenInExternalBrowserOptions options = new OpenInExternalBrowserOptions(call);
|
|
171
|
+
EmptyCallback callback = new EmptyCallback() {
|
|
172
|
+
@Override
|
|
173
|
+
public void success() {
|
|
174
|
+
resolveCall(call);
|
|
175
|
+
}
|
|
176
|
+
|
|
177
|
+
@Override
|
|
178
|
+
public void error(@NonNull Exception exception) {
|
|
179
|
+
rejectCall(call, exception);
|
|
180
|
+
}
|
|
181
|
+
};
|
|
182
|
+
|
|
183
|
+
implementation.openInExternalBrowser(options, callback);
|
|
184
|
+
} catch (Exception exception) {
|
|
185
|
+
rejectCall(call, exception);
|
|
186
|
+
}
|
|
187
|
+
}
|
|
188
|
+
|
|
189
|
+
@PluginMethod
|
|
190
|
+
public void openInSystemBrowser(PluginCall call) {
|
|
191
|
+
try {
|
|
192
|
+
OpenInSystemBrowserOptions options = new OpenInSystemBrowserOptions(call);
|
|
193
|
+
EmptyCallback callback = new EmptyCallback() {
|
|
194
|
+
@Override
|
|
195
|
+
public void success() {
|
|
196
|
+
resolveCall(call);
|
|
197
|
+
}
|
|
198
|
+
|
|
199
|
+
@Override
|
|
200
|
+
public void error(@NonNull Exception exception) {
|
|
201
|
+
rejectCall(call, exception);
|
|
202
|
+
}
|
|
203
|
+
};
|
|
204
|
+
|
|
205
|
+
implementation.openInSystemBrowser(options, callback);
|
|
206
|
+
} catch (Exception exception) {
|
|
207
|
+
rejectCall(call, exception);
|
|
208
|
+
}
|
|
209
|
+
}
|
|
210
|
+
|
|
211
|
+
@PluginMethod
|
|
212
|
+
public void openInWebView(PluginCall call) {
|
|
213
|
+
try {
|
|
214
|
+
OpenInWebViewOptions options = new OpenInWebViewOptions(call);
|
|
215
|
+
EmptyCallback callback = new EmptyCallback() {
|
|
216
|
+
@Override
|
|
217
|
+
public void success() {
|
|
218
|
+
resolveCall(call);
|
|
219
|
+
}
|
|
220
|
+
|
|
221
|
+
@Override
|
|
222
|
+
public void error(@NonNull Exception exception) {
|
|
223
|
+
rejectCall(call, exception);
|
|
224
|
+
}
|
|
225
|
+
};
|
|
226
|
+
|
|
227
|
+
implementation.openInWebView(options, callback);
|
|
228
|
+
} catch (Exception exception) {
|
|
229
|
+
rejectCall(call, exception);
|
|
230
|
+
}
|
|
231
|
+
}
|
|
232
|
+
|
|
233
|
+
@PluginMethod
|
|
234
|
+
public void postMessage(PluginCall call) {
|
|
235
|
+
try {
|
|
236
|
+
PostMessageOptions options = new PostMessageOptions(call);
|
|
237
|
+
EmptyCallback callback = new EmptyCallback() {
|
|
238
|
+
@Override
|
|
239
|
+
public void success() {
|
|
240
|
+
resolveCall(call);
|
|
241
|
+
}
|
|
242
|
+
|
|
243
|
+
@Override
|
|
244
|
+
public void error(@NonNull Exception exception) {
|
|
245
|
+
rejectCall(call, exception);
|
|
246
|
+
}
|
|
247
|
+
};
|
|
248
|
+
|
|
249
|
+
implementation.postMessage(options, callback);
|
|
250
|
+
} catch (Exception exception) {
|
|
251
|
+
rejectCall(call, exception);
|
|
252
|
+
}
|
|
253
|
+
}
|
|
254
|
+
|
|
255
|
+
@Override
|
|
256
|
+
protected void handleOnPause() {
|
|
257
|
+
implementation.handleOnPause();
|
|
258
|
+
}
|
|
259
|
+
|
|
260
|
+
@Override
|
|
261
|
+
protected void handleOnResume() {
|
|
262
|
+
implementation.handleOnResume();
|
|
263
|
+
}
|
|
264
|
+
|
|
265
|
+
private void rejectCall(@NonNull PluginCall call, @NonNull Exception exception) {
|
|
266
|
+
String message = exception.getMessage();
|
|
267
|
+
if (message == null) {
|
|
268
|
+
message = ERROR_UNKNOWN_ERROR;
|
|
269
|
+
}
|
|
270
|
+
String code = null;
|
|
271
|
+
if (exception instanceof CustomException) {
|
|
272
|
+
code = ((CustomException) exception).getCode();
|
|
273
|
+
}
|
|
274
|
+
Logger.error(TAG, message, exception);
|
|
275
|
+
call.reject(message, code);
|
|
276
|
+
}
|
|
277
|
+
|
|
278
|
+
private void resolveCall(@NonNull PluginCall call) {
|
|
279
|
+
call.resolve();
|
|
280
|
+
}
|
|
281
|
+
|
|
282
|
+
private void resolveCall(@NonNull PluginCall call, @Nullable Result result) {
|
|
283
|
+
if (result == null) {
|
|
284
|
+
call.resolve();
|
|
285
|
+
} else {
|
|
286
|
+
call.resolve(result.toJSObject());
|
|
287
|
+
}
|
|
288
|
+
}
|
|
289
|
+
}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
package io.capawesome.capacitorjs.plugins.inappbrowser.classes;
|
|
2
|
+
|
|
3
|
+
import androidx.annotation.NonNull;
|
|
4
|
+
import androidx.annotation.Nullable;
|
|
5
|
+
|
|
6
|
+
public class CustomException extends Exception {
|
|
7
|
+
|
|
8
|
+
@Nullable
|
|
9
|
+
private final String code;
|
|
10
|
+
|
|
11
|
+
public CustomException(@Nullable String code, @NonNull String message) {
|
|
12
|
+
super(message);
|
|
13
|
+
this.code = code;
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
@Nullable
|
|
17
|
+
public String getCode() {
|
|
18
|
+
return code;
|
|
19
|
+
}
|
|
20
|
+
}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
package io.capawesome.capacitorjs.plugins.inappbrowser.classes;
|
|
2
|
+
|
|
3
|
+
public class CustomExceptions {
|
|
4
|
+
|
|
5
|
+
public static final CustomException BACKGROUND_COLOR_INVALID = new CustomException(
|
|
6
|
+
null,
|
|
7
|
+
"backgroundColor must be a valid hex color code."
|
|
8
|
+
);
|
|
9
|
+
public static final CustomException BROWSER_NOT_FOUND = new CustomException(
|
|
10
|
+
"BROWSER_NOT_FOUND",
|
|
11
|
+
"No app was found on the device that can open the URL."
|
|
12
|
+
);
|
|
13
|
+
public static final CustomException COLOR_INVALID = new CustomException(null, "color must be a valid hex color code.");
|
|
14
|
+
public static final CustomException DATA_MISSING = new CustomException(null, "data must be provided.");
|
|
15
|
+
public static final CustomException NO_BROWSER_OPEN = new CustomException("NO_BROWSER_OPEN", "No browser is currently open.");
|
|
16
|
+
public static final CustomException SCRIPT_MISSING = new CustomException(null, "script must be provided.");
|
|
17
|
+
public static final CustomException TOOLBAR_COLOR_INVALID = new CustomException(null, "toolbarColor must be a valid hex color code.");
|
|
18
|
+
public static final CustomException URL_INVALID = new CustomException(null, "url is invalid.");
|
|
19
|
+
public static final CustomException URL_MISSING = new CustomException(null, "url must be provided.");
|
|
20
|
+
}
|