Skip to content

Commit 38086b0

Browse files
committed
Launch url using CustomTab for better ux experience
1 parent 44a26d1 commit 38086b0

File tree

8 files changed

+85
-33
lines changed

8 files changed

+85
-33
lines changed

app/build.gradle.kts

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -99,6 +99,9 @@ dependencies {
9999
/* exoplayer - for podcast */
100100
implementation(libs.bundles.exoplayer)
101101

102+
/* browser - for chrome custom tabs */
103+
implementation(libs.androidx.browser)
104+
102105
/* for notification compat */
103106
implementation(libs.androidx.media)
104107
// implementation("com.google.android.exoplayer:extension-mediasession:${version("exoplayer")}")
Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
package com.worker8.androiddevnews
2+
3+
import android.content.Context
4+
import android.net.Uri
5+
import androidx.browser.customtabs.CustomTabColorSchemeParams
6+
import androidx.browser.customtabs.CustomTabsIntent
7+
import androidx.compose.ui.graphics.Color
8+
import androidx.compose.ui.graphics.toArgb
9+
10+
fun launchCustomTab(context: Context, url: String, backgroundColor: Color) {
11+
CustomTabsIntent.Builder()
12+
// .setInitialActivityHeightPx(400, ACTIVITY_HEIGHT_FIXED)
13+
// .setInitialActivityHeightPx(500)
14+
// .setCloseButtonPosition(CustomTabsIntent.CLOSE_BUTTON_POSITION_END)
15+
// .setToolbarCornerRadiusDp(10)
16+
// set the default color scheme
17+
.setDefaultColorSchemeParams(
18+
CustomTabColorSchemeParams.Builder()
19+
.setToolbarColor(backgroundColor.toArgb())
20+
.build()
21+
)
22+
// set the alternative dark color scheme
23+
.setColorSchemeParams(
24+
CustomTabsIntent.COLOR_SCHEME_DARK,
25+
CustomTabColorSchemeParams.Builder()
26+
.setToolbarColor(backgroundColor.toArgb())
27+
.build()
28+
)
29+
.build()
30+
.launchUrl(context, Uri.parse(url))
31+
}

app/src/main/java/com/worker8/androiddevnews/main/MainActivity.kt

Lines changed: 9 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,7 @@ import com.kirkbushman.araw.models.Submission
4141
import com.worker8.androiddevnews.R
4242
import com.worker8.androiddevnews.common.compose.theme.AndroidDevNewsTheme
4343
import com.worker8.androiddevnews.common.compose.theme.BottomNavBg
44+
import com.worker8.androiddevnews.launchCustomTab
4445
import com.worker8.androiddevnews.newsletter.NewsletterScreen
4546
import com.worker8.androiddevnews.podcast.PodcastContract
4647
import com.worker8.androiddevnews.podcast.PodcastController
@@ -49,10 +50,7 @@ import com.worker8.androiddevnews.podcast.PodcastService
4950
import com.worker8.androiddevnews.podcast.PodcastServiceAction
5051
import com.worker8.androiddevnews.reddit.RedditController
5152
import com.worker8.androiddevnews.reddit.RedditScreen
52-
import com.worker8.androiddevnews.ui.WebViewActivity
5353
import dagger.hilt.android.AndroidEntryPoint
54-
import javax.inject.Inject
55-
import kotlin.time.ExperimentalTime
5654
import kotlinx.coroutines.CoroutineScope
5755
import kotlinx.coroutines.Dispatchers
5856
import kotlinx.coroutines.Job
@@ -62,6 +60,8 @@ import kotlinx.coroutines.flow.flowOn
6260
import kotlinx.coroutines.flow.launchIn
6361
import kotlinx.coroutines.flow.onEach
6462
import kotlinx.coroutines.launch
63+
import javax.inject.Inject
64+
import kotlin.time.ExperimentalTime
6565

6666

6767
@ExperimentalTime
@@ -205,16 +205,18 @@ fun MainScreen(
205205
modifier = Modifier.weight(1f)
206206
) {
207207
composable(BottomNavRoute.REDDIT.toString()) {
208+
val backgroundColor = MaterialTheme.colors.background
208209
RedditScreen(
209210
navController,
210211
redditController,
211212
redditState,
212213
redditListState
213214
) { url ->
214-
val intent = Intent(context, WebViewActivity::class.java).apply {
215-
putExtra(WebViewActivity.UrlKey, url)
216-
}
217-
context.startActivity(intent)
215+
launchCustomTab(
216+
context = context,
217+
url = url,
218+
backgroundColor = backgroundColor
219+
)
218220
}
219221
}
220222

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
package com.worker8.androiddevnews.newsletter
22

3+
import androidx.compose.material.MaterialTheme
34
import androidx.compose.runtime.Composable
45
import androidx.compose.ui.viewinterop.AndroidView
56
import com.worker8.androiddevnews.ui.createWebView
@@ -8,7 +9,12 @@ private const val LatestAndroidWeeklyUrl = "https://androidweekly.net/#latest-is
89

910
@Composable
1011
fun AndroidWeeklyScreen() {
12+
val backgroundColor = MaterialTheme.colors.background
1113
AndroidView(factory = { context ->
12-
createWebView(context, LatestAndroidWeeklyUrl, false)
14+
createWebView(
15+
context = context,
16+
linkUrl = LatestAndroidWeeklyUrl,
17+
backgroundColor = backgroundColor
18+
)
1319
})
1420
}

app/src/main/java/com/worker8/androiddevnews/newsletter/KotlinWeeklyScreen.kt

Lines changed: 11 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,19 @@
11
package com.worker8.androiddevnews.newsletter
22

3-
import android.util.Log
43
import androidx.compose.foundation.layout.Arrangement
54
import androidx.compose.foundation.layout.Column
65
import androidx.compose.foundation.layout.fillMaxHeight
76
import androidx.compose.foundation.layout.fillMaxWidth
87
import androidx.compose.material.CircularProgressIndicator
9-
import androidx.compose.material.Text
10-
import androidx.compose.runtime.*
8+
import androidx.compose.material.MaterialTheme
9+
import androidx.compose.runtime.Composable
10+
import androidx.compose.runtime.LaunchedEffect
11+
import androidx.compose.runtime.mutableStateOf
12+
import androidx.compose.runtime.remember
1113
import androidx.compose.ui.Alignment
1214
import androidx.compose.ui.Modifier
1315
import androidx.compose.ui.platform.LocalContext
1416
import androidx.compose.ui.viewinterop.AndroidView
15-
import com.prof.rssparser.Channel
1617
import com.prof.rssparser.Parser
1718
import com.worker8.androiddevnews.ui.createWebView
1819
import java.nio.charset.Charset
@@ -27,10 +28,14 @@ fun KotlinWeeklyScreen() {
2728
.cacheExpirationMillis(24L * 60L * 60L * 100L) // one day
2829
.build()
2930
val latestIssueLink = remember { mutableStateOf<String?>(null) }
30-
3131
if (latestIssueLink.value != null) {
32+
val backgroundColor = MaterialTheme.colors.background
3233
AndroidView(factory = { context ->
33-
createWebView(context, latestIssueLink.value!!, false)
34+
createWebView(
35+
context = context,
36+
linkUrl = latestIssueLink.value!!,
37+
backgroundColor = backgroundColor
38+
)
3439
})
3540
} else {
3641
Column(

app/src/main/java/com/worker8/androiddevnews/podcast/PodcastService.kt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -273,15 +273,15 @@ class PodcastService : Service() {
273273
}
274274

275275
override fun onRebind(intent: Intent?) {
276-
Log.d("ccw", "REBINDed-----")
276+
Log.d("ccw", "onRebind(intent)")
277277
super.onRebind(intent)
278278
scope.launch {
279279
bindedFlow.emit(Unit)
280280
}
281281
}
282282

283283
override fun onBind(intent: Intent?): IBinder? {
284-
Log.d("ccw", "onBinded!!")
284+
Log.d("ccw", "onBind(intent)")
285285
scope.launch {
286286
bindedFlow.emit(Unit)
287287
}

app/src/main/java/com/worker8/androiddevnews/ui/WebViewBuilder.kt

Lines changed: 20 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,6 @@ package com.worker8.androiddevnews.ui
22

33
import android.annotation.SuppressLint
44
import android.content.Context
5-
import android.content.Intent
65
import android.view.ViewGroup
76
import android.webkit.WebSettings
87
import android.webkit.WebView
@@ -26,20 +25,23 @@ import androidx.compose.runtime.mutableStateOf
2625
import androidx.compose.runtime.remember
2726
import androidx.compose.ui.Modifier
2827
import androidx.compose.ui.draw.alpha
28+
import androidx.compose.ui.graphics.Color
2929
import androidx.compose.ui.platform.LocalContext
3030
import androidx.compose.ui.text.font.FontWeight
3131
import androidx.compose.ui.text.style.TextOverflow
3232
import androidx.compose.ui.unit.dp
3333
import androidx.compose.ui.unit.sp
3434
import androidx.compose.ui.viewinterop.AndroidView
3535
import com.worker8.androiddevnews.common.util.getActivity
36+
import com.worker8.androiddevnews.launchCustomTab
3637
import java.net.URL
3738

39+
3840
@SuppressLint("SetJavaScriptEnabled")
3941
fun createWebView(
4042
context: Context,
4143
linkUrl: String,
42-
shouldRedirectInSamePage: Boolean,
44+
backgroundColor: Color,
4345
onPageFinished: ((String) -> Unit)? = null
4446
) =
4547
WebView(context).apply {
@@ -68,20 +70,16 @@ fun createWebView(
6870
view: WebView?,
6971
url: String?
7072
): Boolean {
71-
if (shouldRedirectInSamePage) {
72-
url?.let {
73-
view?.loadUrl(it)
74-
}
73+
return if (url.isNullOrBlank()) {
74+
false
7575
} else {
76-
if (url.isNullOrBlank()) {
77-
return false
78-
}
79-
val intent = Intent(context, WebViewActivity::class.java).apply {
80-
putExtra(WebViewActivity.UrlKey, url)
81-
}
82-
context.startActivity(intent)
76+
launchCustomTab(
77+
context = context,
78+
url = url,
79+
backgroundColor = backgroundColor
80+
)
81+
true
8382
}
84-
return true
8583
}
8684
}
8785
loadUrl(linkUrl)
@@ -137,10 +135,15 @@ fun WebViewScreen(linkUrl: String) {
137135
}
138136
}
139137
Surface(color = MaterialTheme.colors.background) {
138+
val backgroundColor = MaterialTheme.colors.background
140139
AndroidView(factory = { context ->
141-
createWebView(context, linkUrl, true, onPageFinished = {
142-
pageTitle.value = it
143-
})
140+
createWebView(
141+
context = context,
142+
linkUrl = linkUrl,
143+
backgroundColor = backgroundColor,
144+
onPageFinished = {
145+
pageTitle.value = it
146+
})
144147
})
145148
}
146149
}

gradle/libs.versions.toml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ araw = "f0171e78e4"
1212
rssProf18 = "4.0.2"
1313
rssPodcastFeed = "2.4.1"
1414
coil = "2.2.2"
15+
browser = "1.5.0"
1516
hiltDagger = "2.44"
1617
exoplayer = "2.18.1"
1718
media = "1.6.0"
@@ -38,6 +39,7 @@ androidx-core-ktx = { group = "androidx.core", name = "core-ktx", version.ref =
3839
androidx-appcompat = { group = "androidx.appcompat", name = "appcompat", version.ref = "appCompat" }
3940
androidx-media = { group = "androidx.media", name = "media", version.ref = "media" }
4041
android-material = { group = "com.google.android.material", name = "material", version.ref = "material" }
42+
androidx-browser = { group = "androidx.browser", name = "browser", version.ref = "browser" }
4143
araw = { group = "com.github.KirkBushman", name = "ARAW", version.ref = "araw" }
4244
rssProf18 = { group = "com.prof18.rssparser", name = "rssparser", version.ref = "rssProf18" }
4345
rssPodcastFeed = { group = "com.icosillion.podengine", name = "podengine", version.ref = "rssPodcastFeed" }

0 commit comments

Comments
 (0)