Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,8 @@ import com.github.ai.simplesplit.android.data.repository.ExpenseRepository
import com.github.ai.simplesplit.android.data.repository.GroupCredentialsRepository
import com.github.ai.simplesplit.android.data.repository.GroupRepository
import com.github.ai.simplesplit.android.data.repository.MemberRepository
import com.github.ai.simplesplit.android.domain.usecase.CreateExportUrlUseCase
import com.github.ai.simplesplit.android.domain.usecase.CreateGroupUrlUseCase
import com.github.ai.simplesplit.android.domain.usecase.ParseGroupUrlUseCase
import com.github.ai.simplesplit.android.presentation.core.ResourceProvider
import com.github.ai.simplesplit.android.presentation.core.ResourceProviderImpl
Expand Down Expand Up @@ -66,6 +68,8 @@ object AndroidAppModule {

// UseCases
singleOf(::ParseGroupUrlUseCase)
singleOf(::CreateExportUrlUseCase)
singleOf(::CreateGroupUrlUseCase)

// Interactors
singleOf(::GroupsInteractor)
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
package com.github.ai.simplesplit.android.domain.usecase

import com.github.ai.simplesplit.android.data.api.ApiClient
import com.github.ai.simplesplit.android.model.db.GroupCredentials

class CreateExportUrlUseCase {

fun createUrl(credentials: GroupCredentials): String {
return "%s/export/%s.csv?password=%s".format(
ApiClient.SERVER_URL,
credentials.groupUid,
credentials.password
)
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
package com.github.ai.simplesplit.android.domain.usecase

import com.github.ai.simplesplit.android.data.api.ApiClient
import com.github.ai.simplesplit.android.model.db.GroupCredentials

class CreateGroupUrlUseCase {

fun createUrl(credentials: GroupCredentials): String {
return "%s/group?ids=%s&passwords=%s".format(
ApiClient.SERVER_URL,
credentials.groupUid,
credentials.password
)
}
}
Original file line number Diff line number Diff line change
@@ -1,21 +1,30 @@
package com.github.ai.simplesplit.android.presentation

import android.content.Intent
import android.os.Bundle
import androidx.activity.compose.setContent
import androidx.appcompat.app.AppCompatActivity
import androidx.lifecycle.lifecycleScope
import com.arkivanov.decompose.defaultComponentContext
import com.github.ai.simplesplit.android.di.GlobalInjector.inject
import com.github.ai.simplesplit.android.presentation.core.compose.navigation.NavigatorImpl
import com.github.ai.simplesplit.android.presentation.core.compose.navigation.Router
import com.github.ai.simplesplit.android.presentation.core.compose.theme.AppTheme
import com.github.ai.simplesplit.android.presentation.core.compose.theme.ThemeProvider
import com.github.ai.simplesplit.android.presentation.core.event.collectWithLifecycle
import com.github.ai.simplesplit.android.presentation.screens.root.RootScreen
import com.github.ai.simplesplit.android.presentation.screens.root.RootScreenComponent
import com.github.ai.simplesplit.android.presentation.screens.root.RootViewModel
import com.github.ai.simplesplit.android.presentation.screens.root.model.StartActivityEvent
import com.github.ai.simplesplit.android.utils.IntentUtils.newOpenUrlIntent
import com.github.ai.simplesplit.android.utils.IntentUtils.newShareUrlIntent
import kotlinx.coroutines.launch

class MainActivity : AppCompatActivity() {

private val themeProvider: ThemeProvider by inject()
private val router: Router by inject()
private val viewModel: RootViewModel by inject()

override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
Expand All @@ -24,9 +33,30 @@ class MainActivity : AppCompatActivity() {
componentContext = defaultComponentContext()
)

router.bindNavigator(NavigatorImpl(component, this))
val navigator = NavigatorImpl(
rootComponent = component,
activity = this,
viewModel = viewModel
)
router.bindNavigator(navigator)
themeProvider.onThemedContextCreated(this)

lifecycleScope.launch {
viewModel.events.collectWithLifecycle(lifecycle) { event ->
when (event) {
is StartActivityEvent.OpenUrl -> {
val intent = Intent.createChooser(newOpenUrlIntent(event.url), null)
startActivity(intent)
}

is StartActivityEvent.ShareUrl -> {
val intent = Intent.createChooser(newShareUrlIntent(event.url), null)
startActivity(intent)
}
}
}
}

setContent {
AppTheme(theme = themeProvider.theme) {
RootScreen(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,7 @@ import androidx.compose.ui.Modifier
import androidx.compose.ui.tooling.preview.Preview
import androidx.compose.ui.unit.dp
import com.github.ai.simplesplit.android.presentation.core.compose.preview.ThemedPreview
import com.github.ai.simplesplit.android.presentation.core.compose.theme.AppIcons
import com.github.ai.simplesplit.android.presentation.core.compose.theme.AppIcon
import com.github.ai.simplesplit.android.presentation.core.compose.theme.LightTheme

@Composable
Expand All @@ -45,7 +45,7 @@ fun AppDropdownField(
readOnly = true,
trailingIcon = {
Icon(
imageVector = AppIcons.ExpandMore,
imageVector = AppIcon.EXPAND_MORE.vector,
contentDescription = null,
modifier = Modifier.clickable { expanded = true }
)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,7 @@ import androidx.compose.ui.text.input.VisualTransformation
import androidx.compose.ui.tooling.preview.Preview
import androidx.compose.ui.unit.dp
import com.github.ai.simplesplit.android.presentation.core.compose.preview.ThemedPreview
import com.github.ai.simplesplit.android.presentation.core.compose.theme.AppIcons
import com.github.ai.simplesplit.android.presentation.core.compose.theme.AppIcon
import com.github.ai.simplesplit.android.presentation.core.compose.theme.LightTheme
import kotlinx.coroutines.flow.MutableStateFlow

Expand Down Expand Up @@ -76,20 +76,20 @@ fun AppTextField(
when {
isError -> {
Icon(
imageVector = AppIcons.ErrorCircle,
imageVector = AppIcon.ERROR_CIRCLE.vector,
contentDescription = null
)
}

isPasswordToggleEnabled -> {
val icon = if (isPasswordVisible) {
AppIcons.VisibilityOff
AppIcon.VISIBILITY_OFF
} else {
AppIcons.VisibilityOn
AppIcon.VISIBILITY_ON
}

Icon(
imageVector = icon,
imageVector = icon.vector,
contentDescription = null,
modifier = Modifier
.clickable(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@ import androidx.compose.material3.TopAppBar
import androidx.compose.material3.TopAppBarDefaults
import androidx.compose.runtime.Composable
import androidx.compose.ui.graphics.vector.ImageVector
import com.github.ai.simplesplit.android.presentation.core.compose.theme.AppIcons
import com.github.ai.simplesplit.android.presentation.core.compose.theme.AppIcon
import com.github.ai.simplesplit.android.presentation.core.compose.theme.AppTheme

enum class TopBarMenuItem {
Expand Down Expand Up @@ -43,7 +43,7 @@ fun TopBar(
) {
Icon(
tint = AppTheme.theme.colors.primaryIcon,
imageVector = AppIcons.ArrowBack,
imageVector = AppIcon.ARROW_BACK.vector,
contentDescription = null
)
}
Expand Down Expand Up @@ -73,7 +73,7 @@ fun TopBar(

private fun TopBarMenuItem.getImageVector(): ImageVector {
return when (this) {
TopBarMenuItem.DONE -> AppIcons.Check
TopBarMenuItem.MENU -> AppIcons.Menu
TopBarMenuItem.DONE -> AppIcon.CHECK.vector
TopBarMenuItem.MENU -> AppIcon.MENU.vector
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,7 @@ import com.github.ai.simplesplit.android.presentation.core.compose.cells.viewMod
import com.github.ai.simplesplit.android.presentation.core.compose.preview.PreviewEventProvider
import com.github.ai.simplesplit.android.presentation.core.compose.preview.ThemedPreview
import com.github.ai.simplesplit.android.presentation.core.compose.rememberOnClickedCallback
import com.github.ai.simplesplit.android.presentation.core.compose.theme.AppIcons
import com.github.ai.simplesplit.android.presentation.core.compose.theme.AppIcon
import com.github.ai.simplesplit.android.presentation.core.compose.theme.AppTheme
import com.github.ai.simplesplit.android.presentation.core.compose.theme.DoubleGroupMargin
import com.github.ai.simplesplit.android.presentation.core.compose.theme.ElementMargin
Expand Down Expand Up @@ -96,7 +96,7 @@ fun BottomSheetHeaderCellPreview() {
}

fun newBottomSheetHeaderCell(
icon: ImageVector = AppIcons.Close,
icon: ImageVector = AppIcon.CLOSE.vector,
title: String = "Beer",
description: String = "15.42$",
titleTextSize: TextSize = TextSize.TITLE_MEDIUM,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,7 @@ import com.github.ai.simplesplit.android.presentation.core.compose.cells.viewMod
import com.github.ai.simplesplit.android.presentation.core.compose.preview.PreviewEventProvider
import com.github.ai.simplesplit.android.presentation.core.compose.preview.ThemedPreview
import com.github.ai.simplesplit.android.presentation.core.compose.rememberOnClickedCallback
import com.github.ai.simplesplit.android.presentation.core.compose.theme.AppIcons
import com.github.ai.simplesplit.android.presentation.core.compose.theme.AppIcon
import com.github.ai.simplesplit.android.presentation.core.compose.theme.AppTheme
import com.github.ai.simplesplit.android.presentation.core.compose.theme.ElementMargin
import com.github.ai.simplesplit.android.presentation.core.compose.theme.HalfMargin
Expand Down Expand Up @@ -75,7 +75,7 @@ fun MenuCellPreview() {
}

fun newMenuCell(
icon: ImageVector = AppIcons.Settings,
icon: ImageVector = AppIcon.SETTINGS.vector,
title: String = "Settings"
) = MenuCellViewModel(
model = MenuCellModel(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,17 +8,22 @@ import com.arkivanov.decompose.router.stack.StackNavigator
import com.arkivanov.decompose.value.Value
import com.github.ai.simplesplit.android.presentation.screens.Screen
import com.github.ai.simplesplit.android.presentation.screens.root.RootScreenComponent
import com.github.ai.simplesplit.android.presentation.screens.root.RootViewModel
import com.github.ai.simplesplit.android.presentation.screens.root.model.RootIntent
import com.github.ai.simplesplit.android.presentation.screens.root.model.StartActivityEvent

interface Navigator {
fun getStackNavigation(): StackNavigator<Screen>
fun getStack(): Value<ChildStack<Screen, ComponentContext>>
fun getFragmentManager(): FragmentManager
fun exitNavigation()
fun startActivity(event: StartActivityEvent)
}

class NavigatorImpl(
private val rootComponent: RootScreenComponent,
private val activity: AppCompatActivity
private val activity: AppCompatActivity,
private val viewModel: RootViewModel
) : Navigator {

override fun getStackNavigation(): StackNavigator<Screen> = rootComponent.navigation
Expand All @@ -28,4 +33,8 @@ class NavigatorImpl(
override fun exitNavigation() = activity.finish()

override fun getFragmentManager(): FragmentManager = activity.supportFragmentManager

override fun startActivity(event: StartActivityEvent) {
viewModel.sendIntent(RootIntent.StartActivity(event))
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@ import com.arkivanov.decompose.router.stack.replaceCurrent
import com.github.ai.simplesplit.android.presentation.dialogs.Dialog
import com.github.ai.simplesplit.android.presentation.dialogs.root.BottomSheetRootDialog
import com.github.ai.simplesplit.android.presentation.screens.Screen
import com.github.ai.simplesplit.android.presentation.screens.root.model.StartActivityEvent
import com.github.ai.simplesplit.android.utils.StringUtils
import com.github.ai.simplesplit.android.utils.mutableStateFlow
import java.util.concurrent.ConcurrentHashMap
Expand All @@ -35,6 +36,8 @@ interface Router {
screenType: KClass<out ResultOwner>,
result: Any
)

fun startActivity(event: StartActivityEvent)
}

fun interface ResultListener {
Expand Down Expand Up @@ -142,6 +145,12 @@ class RouterImpl : Router {
resultListeners.remove(key)?.onResult(result)
}

override fun startActivity(event: StartActivityEvent) {
scope.launch {
getNavigatorOrThrow().startActivity(event)
}
}

private fun isDialogActive(): Boolean {
return currentDialog != null
}
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,57 @@
package com.github.ai.simplesplit.android.presentation.core.compose.theme

import androidx.compose.material.icons.Icons
import androidx.compose.material.icons.automirrored.filled.ArrowBackIos
import androidx.compose.material.icons.filled.Add
import androidx.compose.material.icons.filled.AddLink
import androidx.compose.material.icons.filled.Close
import androidx.compose.material.icons.filled.Delete
import androidx.compose.material.icons.filled.Edit
import androidx.compose.material.icons.filled.ExpandMore
import androidx.compose.material.icons.filled.FileUpload
import androidx.compose.material.icons.filled.MoreVert
import androidx.compose.material.icons.filled.Settings
import androidx.compose.material.icons.filled.Share
import androidx.compose.material.icons.outlined.Check
import androidx.compose.material.icons.outlined.ErrorOutline
import androidx.compose.material.icons.outlined.Visibility
import androidx.compose.material.icons.outlined.VisibilityOff
import androidx.compose.ui.graphics.vector.ImageVector

enum class AppIcon {
ARROW_BACK,
ADD,
LINK,
CHECK,
MENU,
SETTINGS,
VISIBILITY_OFF,
VISIBILITY_ON,
ERROR_CIRCLE,
CLOSE,
EXPAND_MORE,
EDIT,
REMOVE,
EXPORT,
SHARE;

val vector: ImageVector
get() =
when (this) {
ARROW_BACK -> Icons.AutoMirrored.Filled.ArrowBackIos
ADD -> Icons.Filled.Add
LINK -> Icons.Filled.AddLink
CHECK -> Icons.Outlined.Check
MENU -> Icons.Filled.MoreVert
SETTINGS -> Icons.Filled.Settings
VISIBILITY_OFF -> Icons.Outlined.VisibilityOff
VISIBILITY_ON -> Icons.Outlined.Visibility
ERROR_CIRCLE -> Icons.Outlined.ErrorOutline
CLOSE -> Icons.Filled.Close
EXPAND_MORE -> Icons.Filled.ExpandMore
EDIT -> Icons.Filled.Edit
REMOVE -> Icons.Filled.Delete
EXPORT -> Icons.Filled.FileUpload
SHARE -> Icons.Filled.Share
}
}
Loading