Skip to content
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,6 @@ package fr.paug.androidmakers

import android.app.Application
import com.androidmakers.di.viewModelModule
import com.androidmakers.ui.LocalPlatformContext
import fr.androidmakers.di.DependenciesBuilder
import io.openfeedback.m3.initializeOpenFeedback
import io.openfeedback.viewmodels.OpenFeedbackFirebaseConfig
Expand All @@ -20,4 +19,3 @@ class AndroidMakersApplication : Application() {
)
}
}

72 changes: 32 additions & 40 deletions androidApp/src/main/java/fr/paug/androidmakers/MainActivity.kt
Original file line number Diff line number Diff line change
Expand Up @@ -9,15 +9,13 @@ import androidx.activity.SystemBarStyle
import androidx.activity.compose.setContent
import androidx.activity.enableEdgeToEdge
import androidx.compose.foundation.isSystemInDarkTheme
import androidx.compose.runtime.CompositionLocalProvider
import androidx.compose.runtime.DisposableEffect
import androidx.compose.runtime.getValue
import androidx.compose.runtime.mutableStateOf
import androidx.compose.runtime.remember
import androidx.compose.runtime.setValue
import androidx.core.view.WindowCompat
import androidx.lifecycle.lifecycleScope
import com.androidmakers.ui.LocalPlatformContext
import com.androidmakers.ui.MainLayout
import com.androidmakers.ui.common.SigninCallbacks
import com.androidmakers.ui.common.navigation.UserData
Expand Down Expand Up @@ -47,50 +45,44 @@ class MainActivity : ComponentActivity() {
logFCMToken()

setContent {
val rememberedActivity = remember { this }

CompositionLocalProvider(
LocalPlatformContext provides rememberedActivity,
) {
KoinContext {
AndroidMakersTheme {
val darkTheme = isSystemInDarkTheme()
DisposableEffect(darkTheme) {
enableEdgeToEdge(
statusBarStyle = SystemBarStyle.auto(
Color.TRANSPARENT,
Color.TRANSPARENT,
) { darkTheme },
navigationBarStyle = SystemBarStyle.auto(
Color.TRANSPARENT,
Color.TRANSPARENT,
) { darkTheme },
)
onDispose { }
}
KoinContext {
AndroidMakersTheme {
val darkTheme = isSystemInDarkTheme()
DisposableEffect(darkTheme) {
enableEdgeToEdge(
statusBarStyle = SystemBarStyle.auto(
Color.TRANSPARENT,
Color.TRANSPARENT,
) { darkTheme },
navigationBarStyle = SystemBarStyle.auto(
Color.TRANSPARENT,
Color.TRANSPARENT,
) { darkTheme },
)
onDispose { }
}

var deeplink: String? by remember { mutableStateOf(null) }
var deeplink: String? by remember { mutableStateOf(null) }

intent.data?.let {
deeplink = it.toString()
}
intent.data?.let {
deeplink = it.toString()
}

addOnNewIntentListener {
it.data?.let {
deeplink = it.toString()
}
addOnNewIntentListener {
it.data?.let {
deeplink = it.toString()
}
}

MainLayout(
versionName = BuildConfig.VERSION_NAME,
versionCode = BuildConfig.VERSION_CODE.toString(),
deeplink = deeplink,
signinCallbacks = SigninCallbacks(
signin = { signin() },
signout = { signout() },
)
MainLayout(
versionName = BuildConfig.VERSION_NAME,
versionCode = BuildConfig.VERSION_CODE.toString(),
deeplink = deeplink,
signinCallbacks = SigninCallbacks(
signin = { signin() },
signout = { signout() },
)
}
)
}
}
}
Expand Down
2 changes: 2 additions & 0 deletions gradle/libs.versions.toml
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@ version-code = "1467"
sdk-compile = "34"
sdk-min = "24"
androidxActivity = "1.9.0"
androidxCore = "1.13.0"
androidxLifecycle = "2.7.0"
apollo = "4.0.0-beta.6"
compose = "1.6.4"
Expand Down Expand Up @@ -30,6 +31,7 @@ okio = "3.9.0"

[libraries]
androidx-activity-compose = { group = "androidx.activity", name = "activity-compose", version.ref = "androidxActivity" }
androidx-core = { group = "androidx.core", name = "core-ktx", version.ref = "androidxCore" }
androidx-lifecycle-runtime = { module = "androidx.lifecycle:lifecycle-runtime-ktx", version.ref = "androidxLifecycle" }
androidx-lifecycle-viewmodel-compose = { module = "androidx.lifecycle:lifecycle-viewmodel-compose", version.ref = "androidxLifecycle" }
apollo-adapters = { module = "com.apollographql.apollo3:apollo-adapters", version.ref = "apollo" }
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,15 +3,14 @@ package fr.androidmakers.di
import fr.androidmakers.domain.interactor.OpenMapUseCase
import fr.androidmakers.domain.interactor.ShareSessionUseCase
import fr.androidmakers.domain.utils.UrlOpener
import org.koin.android.ext.koin.androidContext
import org.koin.dsl.module

actual val domainPlatformModule = module {
single {
UrlOpener(androidContext())
UrlOpener()
}

factory { OpenMapUseCase(get(), get()) }
factory { OpenMapUseCase(get()) }

factory { ShareSessionUseCase(androidContext()) }
factory { ShareSessionUseCase() }
}
3 changes: 3 additions & 0 deletions shared/domain/build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,9 @@ kotlin {
api(libs.kotlinx.datetime)
implementation(libs.okio)
}
androidMain.dependencies {
implementation(libs.androidx.core)
}
}
}

Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
package fr.androidmakers.domain

import android.content.Context

actual class PlatformContext(val context: Context)
Original file line number Diff line number Diff line change
@@ -1,26 +1,27 @@
package fr.androidmakers.domain.interactor

import android.content.Context
import android.content.Intent
import android.net.Uri
import fr.androidmakers.domain.PlatformContext
import fr.androidmakers.domain.utils.UrlOpener

actual class OpenMapUseCase(
private val context: Context,
private val urlOpener: UrlOpener
) {
actual operator fun invoke(coordinates: String, name: String) {
val venueCoordinatesUri = Uri.parse(
"geo:" + coordinates +
"?q=" + Uri.encode(name)
)
actual operator fun invoke(platformContext: PlatformContext, coordinates: String, name: String) {
val venueCoordinatesUri = Uri.Builder()
.scheme("geo")
.encodedAuthority(coordinates)
.appendQueryParameter("q", name)
.build()
try {
val intent = Intent(Intent.ACTION_VIEW, venueCoordinatesUri)
context.startActivity(intent)
platformContext.context.startActivity(intent)
} catch (e: Exception) {
// Open in Webview
urlOpener.openUrl(
url = "https://www.google.com/maps/?q=" + coordinates.replace(" ", "")
platformContext = platformContext,
url = "https://www.google.com/maps/?q=" + coordinates.filter { it != ' ' }
)
}
}
Expand Down
Original file line number Diff line number Diff line change
@@ -1,46 +1,42 @@
package fr.androidmakers.domain.interactor

import android.content.Context
import android.content.Intent
import android.content.Intent.FLAG_ACTIVITY_NEW_TASK
import androidx.core.app.ShareCompat
import fr.androidmakers.domain.PlatformContext
import fr.androidmakers.domain.model.Session
import fr.androidmakers.domain.model.Speaker

actual class ShareSessionUseCase(private val context: Context) {
actual operator fun invoke(session: Session, speakers: List<Speaker>, formattedDateAndRoom: String) {
val speakersString = speakers.joinToString(", ") { it.name ?: "" }

val shareSessionIntent = Intent(Intent.ACTION_SEND)
shareSessionIntent.putExtra(Intent.EXTRA_SUBJECT, session.title)
if (speakers.isEmpty()) {
shareSessionIntent.putExtra(
Intent.EXTRA_TEXT,
String.format(
"%s: %s (%s)",
// TODO put this in resources
"Android Makers",
session.title,
formattedDateAndRoom
)
actual class ShareSessionUseCase {
actual operator fun invoke(
platformContext: PlatformContext,
session: Session,
speakers: List<Speaker>,
formattedDateAndRoom: String
) {
val context = platformContext.context
val shareText = if (speakers.isEmpty()) {
"%s: %s (%s)".format(
// TODO put this in resources
"Android Makers",
session.title,
formattedDateAndRoom
)
} else {
shareSessionIntent.putExtra(
Intent.EXTRA_TEXT,
String.format(
"%s: %s (%s, %s, %s)",
"Android Makers",
session.title,
speakersString,
formattedDateAndRoom,
session.language
)
val speakersString = speakers.joinToString(", ") { it.name.orEmpty() }
"%s: %s (%s, %s, %s)".format(
"Android Makers",
session.title,
speakersString,
formattedDateAndRoom,
session.language
)
}
shareSessionIntent.type = "text/plain"
val shareSheetIntent = Intent.createChooser(shareSessionIntent, null)

// TODO find a solution to use the activity for starting the intent to remove this flag
shareSheetIntent.addFlags(FLAG_ACTIVITY_NEW_TASK)
val shareSheetIntent = ShareCompat.IntentBuilder(context)
.setSubject(session.title)
.setType("text/plain")
.setText(shareText)
.createChooserIntent()

context.startActivity(shareSheetIntent)
}
}
Original file line number Diff line number Diff line change
@@ -1,17 +1,15 @@
package fr.androidmakers.domain.utils

import android.content.ActivityNotFoundException
import android.content.Context
import android.content.Intent
import android.net.Uri
import fr.androidmakers.domain.PlatformContext

actual class UrlOpener(private val context: Context) {
actual fun openUrl(url: String): Boolean {
actual class UrlOpener {
actual fun openUrl(platformContext: PlatformContext, url: String): Boolean {
return try {
val intent = Intent(Intent.ACTION_VIEW, Uri.parse(url)).apply {
addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)
}
context.startActivity(intent)
val intent = Intent(Intent.ACTION_VIEW, Uri.parse(url))
platformContext.context.startActivity(intent)
true
} catch (anfe: ActivityNotFoundException) {
anfe.printStackTrace()
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
package fr.androidmakers.domain

expect class PlatformContext
Original file line number Diff line number Diff line change
@@ -1,12 +1,13 @@
package fr.androidmakers.domain.interactor

import fr.androidmakers.domain.PlatformContext
import fr.androidmakers.domain.model.APPLY_FOR_APP_CLINIC_MAILTO_URL
import fr.androidmakers.domain.utils.UrlOpener

class ApplyForAppClinicUseCase(
private val urlOpener: UrlOpener
) {
operator fun invoke() {
urlOpener.openUrl(APPLY_FOR_APP_CLINIC_MAILTO_URL)
operator fun invoke(platformContext: PlatformContext) {
urlOpener.openUrl(platformContext, APPLY_FOR_APP_CLINIC_MAILTO_URL)
}
}
Original file line number Diff line number Diff line change
@@ -1,10 +1,12 @@
package fr.androidmakers.domain.interactor

import fr.androidmakers.domain.PlatformContext
import fr.androidmakers.domain.utils.Constants
import fr.androidmakers.domain.utils.UrlOpener

class OpenCocUseCase(
private val urlOpener: UrlOpener
) {
operator fun invoke() = urlOpener.openUrl(Constants.Urls.coc)
operator fun invoke(platformContext: PlatformContext) =
urlOpener.openUrl(platformContext, Constants.Urls.coc)
}
Original file line number Diff line number Diff line change
@@ -1,10 +1,12 @@
package fr.androidmakers.domain.interactor

import fr.androidmakers.domain.PlatformContext
import fr.androidmakers.domain.utils.Constants
import fr.androidmakers.domain.utils.UrlOpener

class OpenFaqUseCase(
private val urlOpener: UrlOpener
private val urlOpener: UrlOpener
) {
operator fun invoke() = urlOpener.openUrl(Constants.Urls.faq)
operator fun invoke(platformContext: PlatformContext) =
urlOpener.openUrl(platformContext, Constants.Urls.faq)
}
Original file line number Diff line number Diff line change
@@ -1,11 +1,12 @@
package fr.androidmakers.domain.interactor

import fr.androidmakers.domain.PlatformContext
import fr.androidmakers.domain.utils.UrlOpener

class OpenLinkUseCase(
private val urlOpener: UrlOpener
) {
operator fun invoke(url: String) {
urlOpener.openUrl(url)
operator fun invoke(platformContext: PlatformContext, url: String) {
urlOpener.openUrl(platformContext, url)
}
}
Original file line number Diff line number Diff line change
@@ -1,5 +1,7 @@
package fr.androidmakers.domain.interactor

import fr.androidmakers.domain.PlatformContext

expect class OpenMapUseCase {
operator fun invoke(coordinates: String, name: String)
operator fun invoke(platformContext: PlatformContext, coordinates: String, name: String)
}
Original file line number Diff line number Diff line change
@@ -1,12 +1,13 @@
package fr.androidmakers.domain.interactor

import fr.androidmakers.domain.PlatformContext
import fr.androidmakers.domain.model.Partner
import fr.androidmakers.domain.utils.UrlOpener

class OpenPartnerLinkUseCase(
private val urlOpener: UrlOpener
private val urlOpener: UrlOpener
) {
operator fun invoke(partner: Partner) {
urlOpener.openUrl(partner.url)
operator fun invoke(platformContext: PlatformContext, partner: Partner) {
urlOpener.openUrl(platformContext, partner.url)
}
}
Loading