44
55package io .flutter .plugins .urllauncher ;
66
7- import android .app .Activity ;
8- import android .content .BroadcastReceiver ;
97import android .content .ComponentName ;
108import android .content .Context ;
119import android .content .Intent ;
12- import android .content .IntentFilter ;
1310import android .net .Uri ;
14- import android .os .Build ;
1511import android .os .Bundle ;
1612import android .provider .Browser ;
17- import android .view .KeyEvent ;
18- import android .webkit .WebResourceRequest ;
19- import android .webkit .WebView ;
20- import android .webkit .WebViewClient ;
2113import io .flutter .plugin .common .MethodCall ;
2214import io .flutter .plugin .common .MethodChannel ;
2315import io .flutter .plugin .common .MethodChannel .MethodCallHandler ;
2416import io .flutter .plugin .common .MethodChannel .Result ;
2517import io .flutter .plugin .common .PluginRegistry .Registrar ;
26- import java .util .HashMap ;
2718import java .util .Map ;
2819
2920/** UrlLauncherPlugin */
@@ -43,15 +34,20 @@ private UrlLauncherPlugin(Registrar registrar) {
4334
4435 @ Override
4536 public void onMethodCall (MethodCall call , Result result ) {
46- String url = call .argument ("url" );
47- if (call .method .equals ("canLaunch" )) {
48- canLaunch (url , result );
49- } else if (call .method .equals ("launch" )) {
50- launch (call , result , url );
51- } else if (call .method .equals ("closeWebView" )) {
52- closeWebView (result );
53- } else {
54- result .notImplemented ();
37+ final String url = call .argument ("url" );
38+ switch (call .method ) {
39+ case "canLaunch" :
40+ canLaunch (url , result );
41+ break ;
42+ case "launch" :
43+ launch (call , result , url );
44+ break ;
45+ case "closeWebView" :
46+ closeWebView (result );
47+ break ;
48+ default :
49+ result .notImplemented ();
50+ break ;
5551 }
5652 }
5753
@@ -74,31 +70,31 @@ private void launch(MethodCall call, Result result, String url) {
7470 final boolean enableJavaScript = call .argument ("enableJavaScript" );
7571 final boolean enableDomStorage = call .argument ("enableDomStorage" );
7672 final Map <String , String > headersMap = call .argument ("headers" );
77- final Activity activity = mRegistrar .activity ();
73+ final Bundle headersBundle = extractBundle (headersMap );
74+ final Context context = mRegistrar .activity ();
7875
79- if (activity == null ) {
76+ if (context == null ) {
8077 result .error ("NO_ACTIVITY" , "Launching a URL requires a foreground activity." , null );
8178 return ;
8279 }
80+
8381 if (useWebView ) {
84- launchIntent = new Intent (activity , WebViewActivity .class );
85- launchIntent .putExtra ("url" , url );
86- launchIntent .putExtra ("enableJavaScript" , enableJavaScript );
87- launchIntent .putExtra ("enableDomStorage" , enableDomStorage );
82+ launchIntent =
83+ WebViewActivity .createIntent (
84+ context , url , enableJavaScript , enableDomStorage , headersBundle );
8885 } else {
89- launchIntent = new Intent (Intent .ACTION_VIEW );
90- launchIntent .setData (Uri .parse (url ));
86+ launchIntent =
87+ new Intent (Intent .ACTION_VIEW )
88+ .setData (Uri .parse (url ))
89+ .putExtra (Browser .EXTRA_HEADERS , headersBundle );
9190 }
9291
93- final Bundle headersBundle = extractBundle (headersMap );
94- launchIntent .putExtra (Browser .EXTRA_HEADERS , headersBundle );
95-
96- activity .startActivity (launchIntent );
92+ context .startActivity (launchIntent );
9793 result .success (true );
9894 }
9995
10096 private void closeWebView (Result result ) {
101- Intent intent = new Intent ("close" );
97+ Intent intent = new Intent (WebViewActivity . ACTION_CLOSE );
10298 mRegistrar .context ().sendBroadcast (intent );
10399 result .success (null );
104100 }
@@ -111,89 +107,4 @@ private Bundle extractBundle(Map<String, String> headersMap) {
111107 }
112108 return headersBundle ;
113109 }
114-
115- /* Launches WebView activity */
116- public static class WebViewActivity extends Activity {
117- private WebView webview ;
118- private BroadcastReceiver broadcastReceiver ;
119-
120- @ Override
121- public void onCreate (Bundle savedInstanceState ) {
122- super .onCreate (savedInstanceState );
123- webview = new WebView (this );
124- setContentView (webview );
125- // Get the Intent that started this activity and extract the string
126- final Intent intent = getIntent ();
127- final String url = intent .getStringExtra ("url" );
128- final boolean enableJavaScript = intent .getBooleanExtra ("enableJavaScript" , false );
129- final boolean enableDomStorage = intent .getBooleanExtra ("enableDomStorage" , false );
130- final Bundle headersBundle = intent .getBundleExtra (Browser .EXTRA_HEADERS );
131-
132- final Map <String , String > headersMap = extractHeaders (headersBundle );
133- webview .loadUrl (url , headersMap );
134-
135- webview .getSettings ().setJavaScriptEnabled (enableJavaScript );
136- webview .getSettings ().setDomStorageEnabled (enableDomStorage );
137-
138- // Open new urls inside the webview itself.
139- webview .setWebViewClient (
140- new WebViewClient () {
141-
142- @ Override
143- @ SuppressWarnings ("deprecation" )
144- public boolean shouldOverrideUrlLoading (WebView view , String url ) {
145- if (Build .VERSION .SDK_INT < Build .VERSION_CODES .LOLLIPOP ) {
146- view .loadUrl (url );
147- return false ;
148- }
149- return super .shouldOverrideUrlLoading (view , url );
150- }
151-
152- @ Override
153- public boolean shouldOverrideUrlLoading (WebView view , WebResourceRequest request ) {
154- if (Build .VERSION .SDK_INT >= Build .VERSION_CODES .LOLLIPOP ) {
155- view .loadUrl (request .getUrl ().toString ());
156- }
157- return false ;
158- }
159- });
160-
161- // Set broadcast receiver to handle calls to close the web view
162- broadcastReceiver =
163- new BroadcastReceiver () {
164- @ Override
165- public void onReceive (Context arg0 , Intent intent ) {
166- String action = intent .getAction ();
167- if ("close" .equals (action )) {
168- finish ();
169- }
170- }
171- };
172- registerReceiver (broadcastReceiver , new IntentFilter ("close" ));
173- }
174-
175- private Map <String , String > extractHeaders (Bundle headersBundle ) {
176- final Map <String , String > headersMap = new HashMap <>();
177- for (String key : headersBundle .keySet ()) {
178- final String value = headersBundle .getString (key );
179- headersMap .put (key , value );
180- }
181- return headersMap ;
182- }
183-
184- @ Override
185- protected void onDestroy () {
186- super .onDestroy ();
187- unregisterReceiver (broadcastReceiver );
188- }
189-
190- @ Override
191- public boolean onKeyDown (int keyCode , KeyEvent event ) {
192- if (keyCode == KeyEvent .KEYCODE_BACK && webview .canGoBack ()) {
193- webview .goBack ();
194- return true ;
195- }
196- return super .onKeyDown (keyCode , event );
197- }
198- }
199110}
0 commit comments