33import android .app .Activity ;
44import android .app .AlertDialog ;
55import android .content .ActivityNotFoundException ;
6+ import android .content .Context ;
67import android .content .Intent ;
78import android .content .pm .PackageManager ;
89import android .content .pm .ResolveInfo ;
@@ -90,10 +91,6 @@ public void done(String data) {
9091
9192 private class BWebviewClient extends WebViewClient {
9293 private boolean isLoaded = false ;
93- public static final String INTENT_PROTOCOL_START = "intent:" ;
94- public static final String INTENT_PROTOCOL_INTENT = "#Intent;" ;
95- public static final String INTENT_PROTOCOL_END = ";end;" ;
96- public static final String GOOGLE_PLAY_STORE_PREFIX = "market://details?id=" ;
9794
9895 @ Override
9996 public void onPageFinished (WebView view , String url ) {
@@ -106,30 +103,55 @@ public void onPageFinished(WebView view, String url) {
106103
107104 @ Override
108105 public boolean shouldOverrideUrlLoading (WebView view , String url ) {
109- // market 일 경우 있으면 실행하고, 없으면 다운받게
110- if (url .startsWith (GOOGLE_PLAY_STORE_PREFIX ) || url .startsWith (INTENT_PROTOCOL_START )) {
111- final int endIndex = url .indexOf (INTENT_PROTOCOL_END );
112- try {
113- Intent intent = new Intent ().parseUri (url , Intent .URI_INTENT_SCHEME );
114- final int s = url .indexOf (INTENT_PROTOCOL_INTENT ) + INTENT_PROTOCOL_INTENT .length ();
115-
116- PackageManager packageManager = view .getContext ().getPackageManager ();
117- ResolveInfo info = packageManager .resolveActivity (intent , PackageManager .MATCH_DEFAULT_ONLY );
118- if (info != null ) {
119- view .getContext ().startActivity (intent );
120- } else {
121- final String packageName = url .substring (s , endIndex < 0 ? url .length () : endIndex );
122- view .getContext ().startActivity (new Intent (Intent .ACTION_VIEW , Uri .parse (GOOGLE_PLAY_STORE_PREFIX + packageName )));
123- }
124- return true ;
125- } catch (ActivityNotFoundException e ) {
126- final int s = url .indexOf (INTENT_PROTOCOL_INTENT ) + INTENT_PROTOCOL_INTENT .length ();
127- final String packageName = url .substring (s , endIndex < 0 ? url .length () : endIndex );
128- view .getContext ().startActivity (new Intent (Intent .ACTION_VIEW , Uri .parse (GOOGLE_PLAY_STORE_PREFIX + packageName )));
129- } catch (URISyntaxException e ) {
130- e .printStackTrace ();
131- }
106+ Intent intent = parse (url );
107+ if (isIntent (url )) {
108+ if (isExistInfo (intent , view .getContext ()) || isExistPackage (intent , view .getContext ()))
109+ return start (intent , view .getContext ());
110+ else
111+ gotoMarket (intent , view .getContext ());
112+ } else if (isMarket (url )) {
113+ return start (intent , view .getContext ());
132114 }
115+ return url .contains ("https://bootpaymark" );
116+ }
117+
118+ private Intent parse (String url ) {
119+ try {
120+ return Intent .parseUri (url , Intent .URI_INTENT_SCHEME );
121+ } catch (URISyntaxException e ) {
122+ e .printStackTrace ();
123+ return null ;
124+ }
125+ }
126+
127+ private Boolean isIntent (String url ) {
128+ return url .matches ("^intent:?\\ w*://\\ S+$" );
129+ }
130+
131+ private Boolean isMarket (String url ) {
132+ return url .matches ("^market://\\ S+$" );
133+ }
134+
135+ private Boolean isExistInfo (Intent intent , Context context ) {
136+ try {
137+ return intent != null && context .getPackageManager ().getPackageInfo (intent .getPackage (), PackageManager .GET_ACTIVITIES ) != null ;
138+ } catch (PackageManager .NameNotFoundException e ) {
139+ e .printStackTrace ();
140+ return false ;
141+ }
142+ }
143+
144+ private Boolean isExistPackage (Intent intent , Context context ) {
145+ return intent != null && context .getPackageManager ().getLaunchIntentForPackage (intent .getPackage ()) != null ;
146+ }
147+
148+ private boolean start (Intent intent , Context context ) {
149+ context .startActivity (intent );
150+ return true ;
151+ }
152+
153+ private boolean gotoMarket (Intent intent , Context context ) {
154+ context .startActivity (new Intent (Intent .ACTION_VIEW , Uri .parse ("market://details?id=" + intent .getPackage ())));
133155 return true ;
134156 }
135157 }
0 commit comments