Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add Theme, ValidityPeriod, DownloadLimit & EmailLanguage settings #40

Merged
merged 20 commits into from
Sep 4, 2024
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
2 changes: 2 additions & 0 deletions app/build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -83,6 +83,8 @@ dependencies {
implementation(libs.androidx.adaptive.layout)
implementation(libs.androidx.adaptive.navigation)

implementation(libs.swisstransfer.core)

// Compose preview tools
implementation(libs.compose.ui.tooling.preview)
debugImplementation(libs.compose.ui.tooling)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -17,11 +17,26 @@
*/
package com.infomaniak.swisstransfer.di

import com.infomaniak.multiplatform_swisstransfer.SwissTransferInjection
import dagger.Module
import dagger.Provides
import dagger.hilt.InstallIn
import dagger.hilt.components.SingletonComponent
import kotlinx.coroutines.CoroutineDispatcher
import kotlinx.coroutines.CoroutineScope
import javax.inject.Singleton

@Module
@InstallIn(SingletonComponent::class)
object ApplicationModule {

// @Provides
// @Singleton
// fun providesSwissTransferInjection() {
// // TODO: Implement this method
// }
@Provides
@Singleton
fun providesSwissTransferInjection() = SwissTransferInjection()

@Provides
@Singleton
fun providesGlobalCoroutineScope(@DefaultDispatcher defaultDispatcher: CoroutineDispatcher): CoroutineScope {
return CoroutineScope(defaultDispatcher)
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -18,8 +18,23 @@
package com.infomaniak.swisstransfer.ui

import android.app.Application
import com.infomaniak.multiplatform_swisstransfer.SwissTransferInjection
import dagger.hilt.android.HiltAndroidApp
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.launch
import javax.inject.Inject

@HiltAndroidApp
class MainApplication : Application() {

@Inject
lateinit var swissTransferInjection: SwissTransferInjection

@Inject
lateinit var globalCoroutineScope: CoroutineScope

override fun onCreate() {
super.onCreate()
globalCoroutineScope.launch { swissTransferInjection.loadDefaultAccount() }
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -24,10 +24,13 @@ import androidx.compose.foundation.verticalScroll
import androidx.compose.material3.Scaffold
import androidx.compose.material3.Surface
import androidx.compose.runtime.Composable
import androidx.compose.runtime.getValue
import androidx.compose.runtime.mutableIntStateOf
import androidx.compose.runtime.saveable.rememberSaveable
import androidx.compose.runtime.setValue
import androidx.compose.ui.Modifier
import androidx.compose.ui.graphics.vector.ImageVector
import com.infomaniak.multiplatform_swisstransfer.common.models.DownloadLimit
import com.infomaniak.swisstransfer.R
import com.infomaniak.swisstransfer.ui.components.SwissTransferTobAppBar
import com.infomaniak.swisstransfer.ui.components.TopAppBarButton
Expand All @@ -38,7 +41,11 @@ import com.infomaniak.swisstransfer.ui.theme.SwissTransferTheme
import com.infomaniak.swisstransfer.ui.utils.PreviewMobile

@Composable
fun SettingsDownloadsLimitScreen(navigateBack: (() -> Unit)?) {
fun SettingsDownloadsLimitScreen(
downloadLimit: DownloadLimit,
navigateBack: (() -> Unit)?,
onDownloadLimitChange: (DownloadLimit) -> Unit,
) {
Scaffold(topBar = {
val canDisplayBackButton = navigateBack?.let { TopAppBarButton.backButton(navigateBack) }
SwissTransferTobAppBar(R.string.settingsOptionDownloadLimit, navigationMenu = canDisplayBackButton)
Expand All @@ -50,13 +57,17 @@ fun SettingsDownloadsLimitScreen(navigateBack: (() -> Unit)?) {
) {
SettingTitle(titleRes = R.string.settingsDownloadsLimitTitle)

val (selectedItem, setSelectedItem) = rememberSaveable { mutableIntStateOf(0) } // TODO: Use DataStore or Realm
SingleSelectOptions(DownloadsLimit.entries, { selectedItem }, setSelectedItem)
var selectedItem by rememberSaveable { mutableIntStateOf(downloadLimit.ordinal) }
SingleSelectOptions(DownloadLimitOption.entries, { selectedItem }, { position ->
selectedItem = position
val selectedDownloadLimit = DownloadLimit.entries[position]
onDownloadLimitChange(selectedDownloadLimit)
})
}
}
}

enum class DownloadsLimit(
enum class DownloadLimitOption(
override val title: @Composable () -> String,
override val imageVector: ImageVector? = null,
override val imageVectorResId: Int? = null,
Expand All @@ -72,7 +83,11 @@ enum class DownloadsLimit(
private fun SettingsThemeScreenPreview() {
SwissTransferTheme {
Surface {
SettingsDownloadsLimitScreen {}
SettingsDownloadsLimitScreen(
downloadLimit = DownloadLimit.TWOHUNDREDFIFTY,
navigateBack = {},
onDownloadLimitChange = {},
)
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -24,11 +24,14 @@ import androidx.compose.foundation.verticalScroll
import androidx.compose.material3.Scaffold
import androidx.compose.material3.Surface
import androidx.compose.runtime.Composable
import androidx.compose.runtime.getValue
import androidx.compose.runtime.mutableIntStateOf
import androidx.compose.runtime.saveable.rememberSaveable
import androidx.compose.runtime.setValue
import androidx.compose.ui.Modifier
import androidx.compose.ui.graphics.vector.ImageVector
import androidx.compose.ui.res.stringResource
import com.infomaniak.multiplatform_swisstransfer.common.models.EmailLanguage
import com.infomaniak.swisstransfer.R
import com.infomaniak.swisstransfer.ui.components.SwissTransferTobAppBar
import com.infomaniak.swisstransfer.ui.components.TopAppBarButton
Expand All @@ -39,7 +42,11 @@ import com.infomaniak.swisstransfer.ui.theme.SwissTransferTheme
import com.infomaniak.swisstransfer.ui.utils.PreviewMobile

@Composable
fun SettingsEmailLanguageScreen(navigateBack: (() -> Unit)?) {
fun SettingsEmailLanguageScreen(
emailLanguage: EmailLanguage,
navigateBack: (() -> Unit)?,
onEmailLanguageChange: (EmailLanguage) -> Unit,
) {
Scaffold(topBar = {
val canDisplayBackButton = navigateBack?.let { TopAppBarButton.backButton(navigateBack) }
SwissTransferTobAppBar(R.string.settingsOptionEmailLanguage, navigationMenu = canDisplayBackButton)
Expand All @@ -51,13 +58,17 @@ fun SettingsEmailLanguageScreen(navigateBack: (() -> Unit)?) {
) {
SettingTitle(titleRes = R.string.settingsEmailLanguageTitle)

val (selectedItem, setSelectedItem) = rememberSaveable { mutableIntStateOf(0) } // TODO: Use DataStore or Realm
SingleSelectOptions(EmailLanguage.entries, { selectedItem }, setSelectedItem)
var selectedItem by rememberSaveable { mutableIntStateOf(emailLanguage.ordinal) }
SingleSelectOptions(EmailLanguageOption.entries, { selectedItem }, { position ->
selectedItem = position
val selectedEmailLanguage = EmailLanguage.entries[position]
onEmailLanguageChange(selectedEmailLanguage)
})
}
}
}

enum class EmailLanguage(
enum class EmailLanguageOption(
override val title: @Composable () -> String,
override val imageVector: ImageVector? = null,
override val imageVectorResId: Int? = null,
Expand All @@ -74,7 +85,11 @@ enum class EmailLanguage(
private fun SettingsThemeScreenPreview() {
SwissTransferTheme {
Surface {
SettingsEmailLanguageScreen {}
SettingsEmailLanguageScreen(
emailLanguage = EmailLanguage.FRENCH,
navigateBack = {},
onEmailLanguageChange = {},
)
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,13 @@ import androidx.compose.material3.Surface
import androidx.compose.material3.Text
import androidx.compose.runtime.Composable
import androidx.compose.ui.Modifier
import androidx.compose.ui.res.pluralStringResource
import androidx.compose.ui.res.stringResource
import com.infomaniak.multiplatform_swisstransfer.common.interfaces.appSettings.AppSettings
import com.infomaniak.multiplatform_swisstransfer.common.models.DownloadLimit
import com.infomaniak.multiplatform_swisstransfer.common.models.EmailLanguage
import com.infomaniak.multiplatform_swisstransfer.common.models.Theme
import com.infomaniak.multiplatform_swisstransfer.common.models.ValidityPeriod
import com.infomaniak.swisstransfer.BuildConfig
import com.infomaniak.swisstransfer.R
import com.infomaniak.swisstransfer.ui.components.BrandTobAppBar
Expand All @@ -45,8 +51,11 @@ import com.infomaniak.swisstransfer.ui.theme.SwissTransferTheme
import com.infomaniak.swisstransfer.ui.utils.PreviewMobile

@Composable
fun SettingsScreen(onItemClick: (SettingsOptionScreens) -> Unit, getSelectedSetting: () -> SettingsOptionScreens?) {

fun SettingsScreen(
appSettings: AppSettings,
onItemClick: (SettingsOptionScreens) -> Unit,
getSelectedSetting: () -> SettingsOptionScreens?,
) {
val selectedSetting = getSelectedSetting()

Scaffold(topBar = { BrandTobAppBar() }) { paddingsValue ->
Expand All @@ -67,7 +76,7 @@ fun SettingsScreen(onItemClick: (SettingsOptionScreens) -> Unit, getSelectedSett
titleRes = R.string.settingsOptionTheme,
isSelected = { selectedSetting == THEME },
icon = AppIcons.PaintbrushPalette,
description = "TODO",
description = appSettings.theme.getString(),
endIcon = CHEVRON,
onClick = { onItemClick(THEME) },
)
Expand All @@ -86,23 +95,23 @@ fun SettingsScreen(onItemClick: (SettingsOptionScreens) -> Unit, getSelectedSett
titleRes = R.string.settingsOptionValidityPeriod,
isSelected = { selectedSetting == VALIDITY_PERIOD },
icon = AppIcons.ArrowDownFile,
description = "TODO",
description = appSettings.validityPeriod.getString(),
endIcon = CHEVRON,
onClick = { onItemClick(VALIDITY_PERIOD) },
)
SettingItem(
titleRes = R.string.settingsOptionDownloadLimit,
isSelected = { selectedSetting == DOWNLOAD_LIMIT },
icon = AppIcons.Clock,
description = "TODO",
description = appSettings.downloadLimit.getString(),
endIcon = CHEVRON,
onClick = { onItemClick(DOWNLOAD_LIMIT) },
)
SettingItem(
titleRes = R.string.settingsOptionEmailLanguage,
isSelected = { selectedSetting == EMAIL_LANGUAGE },
icon = AppIcons.SpeechBubble,
description = "TODO",
description = appSettings.emailLanguage.getString(),
endIcon = CHEVRON,
onClick = { onItemClick(EMAIL_LANGUAGE) },
)
Expand Down Expand Up @@ -137,18 +146,57 @@ fun SettingsScreen(onItemClick: (SettingsOptionScreens) -> Unit, getSelectedSett
}
}

@Composable
private fun Theme?.getString(): String {
return when (this) {
Theme.SYSTEM -> stringResource(R.string.settingsOptionThemeSystem)
Theme.DARK -> stringResource(R.string.settingsOptionThemeDark)
Theme.LIGHT -> stringResource(R.string.settingsOptionThemeLight)
else -> ""
}
}

@Composable
private fun ValidityPeriod?.getString(): String {
return this?.value?.toInt()?.let {
pluralStringResource(R.plurals.settingsValidityPeriodValue, it, it)
} ?: ""
}

@Composable
private fun DownloadLimit?.getString() = this?.value ?: ""

@Composable
private fun EmailLanguage?.getString(): String {
return when (this) {
EmailLanguage.ENGLISH -> stringResource(R.string.settingsEmailLanguageValueEnglish)
EmailLanguage.FRENCH -> stringResource(R.string.settingsEmailLanguageValueFrench)
EmailLanguage.GERMAN -> stringResource(R.string.settingsEmailLanguageValueGerman)
EmailLanguage.ITALIAN -> stringResource(R.string.settingsEmailLanguageValueItalian)
EmailLanguage.SPANISH -> stringResource(R.string.settingsEmailLanguageValueSpanish)
else -> ""
}
}

enum class SettingsOptionScreens {
THEME, NOTIFICATIONS,
VALIDITY_PERIOD, DOWNLOAD_LIMIT, EMAIL_LANGUAGE,
DISCOVER_INFOMANIAK, SHARE_IDEAS, GIVE_FEEDBACK,
}

private class DummyAppSettings(
override var theme: Theme = Theme.SYSTEM,
override var downloadLimit: DownloadLimit = DownloadLimit.TWOHUNDREDFIFTY,
override var emailLanguage: EmailLanguage = EmailLanguage.FRENCH,
override var validityPeriod: ValidityPeriod = ValidityPeriod.THIRTY,
) : AppSettings

@PreviewMobile
@Composable
private fun SettingsScreenPreview() {
SwissTransferTheme {
Surface(color = MaterialTheme.colorScheme.background) {
SettingsScreen(onItemClick = {}, getSelectedSetting = { null })
SettingsScreen(appSettings = DummyAppSettings(), onItemClick = {}, getSelectedSetting = { null })
}
}
}
Loading
Loading