Skip to content

Commit 49cb956

Browse files
authored
[FEAT/#1491] nmap 스킴 처리 (#1492)
* [FEAT/#1491] nmap 스킴 처리 * [REFACTOR/#1491] handleIntentScheme 리팩토링
1 parent cb15146 commit 49cb956

1 file changed

Lines changed: 61 additions & 79 deletions

File tree

core/webview/src/main/java/org/sopt/official/webview/view/SoptWebViewClient.kt

Lines changed: 61 additions & 79 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)