@@ -47,107 +47,89 @@ class SoptWebViewClient(
4747 val url = request?.url.toString().toUri()
4848
4949 Timber .d(" SoptWebViewClient#shouldOverrideUrlLoading url: $url " )
50- return if (super .shouldOverrideUrlLoading(view, request)) {
51- true
52- } else {
53- handleMarketScheme(view, url)
54- || handleKakaoLinkScheme(view, url)
55- || handleTelScheme(view, url)
56- || handleMailScheme(view, url)
57- || handleIntentScheme(view, url)
58- || handleNotionScheme(view, url)
50+
51+ if (super .shouldOverrideUrlLoading(view, request)) return true
52+
53+ return when {
54+ url.toString().startsWith(" intent:kakaolink://" ) -> handleKakaoLinkScheme(view, url)
55+ url.scheme?.startsWith(" tel" ) == true -> navigateToExternal(view, url)
56+
57+ url.scheme == " mailto" -> navigateToExternal(view, url)
58+ url.scheme == " market" -> navigateToExternal(view, url)
59+ url.scheme == " notion" -> handleNotionScheme(view, url)
60+ url.scheme == " nmap" -> handleNMapScheme(view, url)
61+ url.scheme == " intent" -> handleIntentScheme(view, url)
62+
63+ else -> false
5964 }
6065 }
6166
62- /* *
63- * Comment by HyunWoo Lee
64- * 저사양기기/낮은 API 기기들은 위의 함수가 아닌 해당 함수를 실행할 수 있어
65- * 추가 대응을 위해 구현을 해놓습니다.
66- */
67- @Deprecated(" Deprecated in Java" )
68- override fun shouldOverrideUrlLoading (view : WebView ? , url : String? ): Boolean {
69- Timber .d(" SoptWebViewClient#shouldOverrideUrlLoading url: $url " )
70- return if (super .shouldOverrideUrlLoading(view, url)) {
71- true
72- } else {
73- val uri = url?.toUri() ? : return true
74- handleMarketScheme(view, uri)
75- || handleKakaoLinkScheme(view, uri)
76- || handleTelScheme(view, uri)
77- || handleMailScheme(view, uri)
78- || handleIntentScheme(view, uri)
79- || handleNotionScheme(view, uri)
80- }
67+ private fun navigateToExternal (view : WebView ? , url : Uri ): Boolean {
68+ view?.context?.navigateTo(url)
69+ return true
8170 }
8271
83- private fun handleMailScheme (view : WebView ? , url : Uri ): Boolean {
84- if (url.scheme == " mailto" ) {
85- view?.context?.navigateTo(url)
86- return true
87- }
88- return false
72+ private fun handleKakaoLinkScheme (view : WebView ? , url : Uri ): Boolean {
73+ val kakaoLinkScheme = url.toString().replace(" intent:" , " " ).toUri()
74+ view?.context?.navigateTo(kakaoLinkScheme)
75+ return true
8976 }
9077
91- private fun handleIntentScheme (view : WebView ? , url : Uri ): Boolean {
78+ private fun handleNotionScheme (view : WebView ? , url : Uri ): Boolean {
9279 try {
93- if (url.scheme == " intent" ) {
94- val urlString = url.toString()
95- val intent = Intent .parseUri(urlString, Intent .URI_INTENT_SCHEME ).apply {
96- addCategory(Intent .CATEGORY_BROWSABLE )
97- component = null
98- selector = null
99- }
100- try {
101- view?.context?.startActivity(intent)
102- return true
103- } catch (e: ActivityNotFoundException ) {
104- val packageName = intent.`package`
105- if (packageName != null ) {
106- view?.context?.navigateTo(" market://details?id=${packageName} " .toUri())
107- return true
108- }
109- }
110- return true
80+ Intent (Intent .ACTION_VIEW , url).apply {
81+ view?.context?.startActivity(this )
11182 }
83+ } catch (e: ActivityNotFoundException ) {
84+ val webUrl = url.toString()
85+ .replaceFirst(" notion://" , " https://" )
86+
87+ view?.context?.navigateTo(webUrl.toUri())
11288 } catch (e: Exception ) {
113- Timber .e(" SoptWebViewClient#handleIntentScheme failed $e " )
89+ Timber .e(e)
90+ return false
11491 }
115- return false
116- }
11792
118- private fun handleTelScheme (view : WebView ? , url : Uri ): Boolean {
119- if (url.scheme?.startsWith(" tel" ) == true ) {
120- view?.context?.navigateTo(url)
121- return true
122- }
123- return false
93+ return true
12494 }
12595
126- private fun handleKakaoLinkScheme (view : WebView ? , url : Uri ): Boolean {
127- if (url.scheme?.startsWith(" intent:kakaolink://" ) == true ) {
128- val kakaoLinkScheme = url.toString().replace(" intent:" , " " ).toUri()
129- view?.context?.navigateTo(kakaoLinkScheme)
130- return true
96+ private fun handleNMapScheme (view : WebView ? , url : Uri ): Boolean {
97+ try {
98+ Intent (Intent .ACTION_VIEW , url).apply {
99+ view?.context?.startActivity(this )
100+ }
101+ } catch (e: ActivityNotFoundException ) {
102+ view?.context?.navigateTo(" market://details?id=com.nhn.android.nmap" .toUri())
103+ } catch (e: Exception ) {
104+ Timber .e(e)
105+ return false
131106 }
132- return false
107+
108+ return true
133109 }
134110
135- private fun handleMarketScheme (view : WebView ? , url : Uri ): Boolean {
136- if (url.scheme == " market" ) {
137- view?.context?.navigateTo(url)
111+ private fun handleIntentScheme (view : WebView ? , url : Uri ): Boolean {
112+ val intent = runCatching {
113+ val urlString = url.toString()
114+ Intent .parseUri(urlString, Intent .URI_INTENT_SCHEME ).apply {
115+ addCategory(Intent .CATEGORY_BROWSABLE )
116+ component = null
117+ selector = null
118+ }
119+ }.getOrElse { e ->
120+ Timber .e(" SoptWebViewClient#handleIntentScheme failed $e " )
138121 return true
139122 }
140- return false
141- }
142123
143- private fun handleNotionScheme (view : WebView ? , url : Uri ? ): Boolean {
144- if (url?.scheme?.startsWith(" notion" ) == true ) {
145- Intent (Intent .ACTION_VIEW , url).apply {
146- view?.context?.startActivity(this )
124+ try {
125+ view?.context?.startActivity(intent)
126+ } catch (e: ActivityNotFoundException ) {
127+ val packageName = intent.`package`
128+ if (packageName != null ) {
129+ view?.context?.navigateTo(" market://details?id=${packageName} " .toUri())
147130 }
148- return true
149131 }
150- return false
132+ return true
151133 }
152134
153135 private fun Context.navigateTo (to : Uri ) {
0 commit comments