common: make UrlLauncher use expect/actual

Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
This commit is contained in:
Harsh Shandilya 2021-03-15 00:00:37 +05:30
parent 3021f96465
commit f5c3a950bf
No known key found for this signature in database
GPG key ID: 366D7BBAD1031E80
5 changed files with 15 additions and 11 deletions

View file

@ -7,13 +7,12 @@ import dagger.hilt.InstallIn
import dagger.hilt.android.components.ActivityComponent import dagger.hilt.android.components.ActivityComponent
import dagger.hilt.android.qualifiers.ActivityContext import dagger.hilt.android.qualifiers.ActivityContext
import dev.msfjarvis.lobsters.ui.urllauncher.UrlLauncher import dev.msfjarvis.lobsters.ui.urllauncher.UrlLauncher
import dev.msfjarvis.lobsters.ui.urllauncher.AndroidUrlLauncherImpl
@Module @Module
@InstallIn(ActivityComponent::class) @InstallIn(ActivityComponent::class)
object UrlLauncherModule { object UrlLauncherModule {
@Provides @Provides
fun provideUrlLauncher(@ActivityContext context: Context): UrlLauncher { fun provideUrlLauncher(@ActivityContext context: Context): UrlLauncher {
return AndroidUrlLauncherImpl(context) return UrlLauncher(context)
} }
} }

View file

@ -3,10 +3,9 @@ package dev.msfjarvis.lobsters.ui.urllauncher
import android.content.Context import android.content.Context
import android.net.Uri import android.net.Uri
import androidx.browser.customtabs.CustomTabsIntent import androidx.browser.customtabs.CustomTabsIntent
import dev.msfjarvis.lobsters.ui.urllauncher.UrlLauncher
class AndroidUrlLauncherImpl(private val context: Context) : UrlLauncher { actual class UrlLauncher(private val context: Context) {
override fun launch(url: String) { actual fun launch(url: String) {
val customTabsIntent = CustomTabsIntent.Builder() val customTabsIntent = CustomTabsIntent.Builder()
.setShareState(CustomTabsIntent.SHARE_STATE_ON) .setShareState(CustomTabsIntent.SHARE_STATE_ON)
.setShowTitle(true) .setShowTitle(true)

View file

@ -1,5 +1,5 @@
package dev.msfjarvis.lobsters.ui.urllauncher package dev.msfjarvis.lobsters.ui.urllauncher
fun interface UrlLauncher { expect class UrlLauncher {
fun launch(url: String) fun launch(url: String)
} }

View file

@ -3,8 +3,8 @@ package dev.msfjarvis.lobsters.ui.urllauncher
import java.awt.Desktop import java.awt.Desktop
import java.net.URI import java.net.URI
class JVMUrlLauncherImpl() : UrlLauncher { actual class UrlLauncher {
override fun launch(url: String) { actual fun launch(url: String) {
val desktop = Desktop.getDesktop() val desktop = Desktop.getDesktop()
if (Desktop.isDesktopSupported() && desktop.isSupported(Desktop.Action.BROWSE)) { if (Desktop.isDesktopSupported() && desktop.isSupported(Desktop.Action.BROWSE)) {

View file

@ -11,6 +11,7 @@ import androidx.compose.foundation.rememberScrollState
import androidx.compose.foundation.rememberScrollbarAdapter import androidx.compose.foundation.rememberScrollbarAdapter
import androidx.compose.foundation.verticalScroll import androidx.compose.foundation.verticalScroll
import androidx.compose.material.Text import androidx.compose.material.Text
import androidx.compose.runtime.CompositionLocalProvider
import androidx.compose.runtime.remember import androidx.compose.runtime.remember
import androidx.compose.runtime.rememberCoroutineScope import androidx.compose.runtime.rememberCoroutineScope
import androidx.compose.ui.Alignment import androidx.compose.ui.Alignment
@ -21,6 +22,8 @@ import androidx.compose.runtime.mutableStateOf
import androidx.compose.runtime.setValue import androidx.compose.runtime.setValue
import dev.msfjarvis.lobsters.data.ApiRepository import dev.msfjarvis.lobsters.data.ApiRepository
import dev.msfjarvis.lobsters.model.LobstersPost import dev.msfjarvis.lobsters.model.LobstersPost
import dev.msfjarvis.lobsters.ui.urllauncher.LocalUrlLauncher
import dev.msfjarvis.lobsters.ui.urllauncher.UrlLauncher
import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.launch import kotlinx.coroutines.launch
import kotlinx.coroutines.withContext import kotlinx.coroutines.withContext
@ -29,6 +32,7 @@ val repository = ApiRepository()
@OptIn(ExperimentalStdlibApi::class) @OptIn(ExperimentalStdlibApi::class)
fun main() = Window(title = "Claw for lobste.rs") { fun main() = Window(title = "Claw for lobste.rs") {
val urlLauncher = UrlLauncher()
val coroutineScope = rememberCoroutineScope() val coroutineScope = rememberCoroutineScope()
var items by remember { mutableStateOf(emptyList<SavedPost>()) } var items by remember { mutableStateOf(emptyList<SavedPost>()) }
coroutineScope.launch { coroutineScope.launch {
@ -49,6 +53,7 @@ fun main() = Window(title = "Claw for lobste.rs") {
if (items.isEmpty()) { if (items.isEmpty()) {
Text("Loading...") Text("Loading...")
} else { } else {
CompositionLocalProvider(LocalUrlLauncher provides urlLauncher) {
Column { Column {
items.forEach { items.forEach {
LobstersItem(it) LobstersItem(it)
@ -56,6 +61,7 @@ fun main() = Window(title = "Claw for lobste.rs") {
} }
} }
} }
}
VerticalScrollbar( VerticalScrollbar(
modifier = Modifier.align(Alignment.CenterEnd).fillMaxHeight(), modifier = Modifier.align(Alignment.CenterEnd).fillMaxHeight(),
adapter = rememberScrollbarAdapter(stateVertical), adapter = rememberScrollbarAdapter(stateVertical),