Skip to content

Commit

Permalink
feat: add toggle dark/light mode
Browse files Browse the repository at this point in the history
  • Loading branch information
aleixo-dev committed Nov 6, 2024
1 parent b5c9121 commit 4d25bdf
Show file tree
Hide file tree
Showing 5 changed files with 51 additions and 36 deletions.
24 changes: 20 additions & 4 deletions app/src/main/java/com/nicolas/picstream/MainActivity.kt
Original file line number Diff line number Diff line change
Expand Up @@ -8,31 +8,41 @@ import androidx.activity.compose.setContent
import androidx.activity.enableEdgeToEdge
import androidx.activity.result.contract.ActivityResultContracts
import androidx.annotation.RequiresApi
import androidx.compose.foundation.isSystemInDarkTheme
import androidx.compose.foundation.layout.fillMaxSize
import androidx.compose.foundation.layout.padding
import androidx.compose.material3.Scaffold
import androidx.compose.runtime.Composable
import androidx.compose.runtime.collectAsState
import androidx.compose.runtime.getValue
import androidx.compose.runtime.mutableStateOf
import androidx.compose.runtime.remember
import androidx.compose.runtime.setValue
import androidx.compose.ui.Modifier
import androidx.core.splashscreen.SplashScreen.Companion.installSplashScreen
import androidx.navigation.compose.NavHost
import androidx.navigation.compose.composable
import androidx.navigation.compose.rememberNavController
import com.google.android.gms.ads.MobileAds
import com.nicolas.picstream.helper.DailyScheduleNotificationHelper
import com.nicolas.picstream.manager.DataStore
import com.nicolas.picstream.navigation.Screen
import com.nicolas.picstream.presentation.home.HomeRoute
import com.nicolas.picstream.presentation.notifications.NotificationRoute
import com.nicolas.picstream.presentation.option.OptionRoute
import com.nicolas.picstream.ui.design.theme.PicStreamTheme
import com.nicolas.picstream.ui.home.HomeRoute
import com.nicolas.picstream.ui.notifications.NotificationRoute
import com.nicolas.picstream.ui.option.OptionRoute
import org.koin.androidx.compose.KoinAndroidContext
import org.koin.core.component.KoinComponent
import org.koin.core.component.inject

class MainActivity : ComponentActivity(), KoinComponent {

private val requestPermissionLauncher = registerForActivityResult(
ActivityResultContracts.RequestPermission()
) { _ -> }

private val dataStore by inject<DataStore>()

@RequiresApi(Build.VERSION_CODES.TIRAMISU)
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
Expand All @@ -42,7 +52,13 @@ class MainActivity : ComponentActivity(), KoinComponent {
requestPermissionLauncher.launch(Manifest.permission.POST_NOTIFICATIONS)
DailyScheduleNotificationHelper(this)
setContent {
PicStreamTheme {

var isDarkTheme by remember { mutableStateOf(false) }
dataStore.toggleTheme.collectAsState(initial = isSystemInDarkTheme()).value.let {
isDarkTheme = it
}

PicStreamTheme(darkTheme = isDarkTheme) {
Scaffold(
modifier = Modifier.fillMaxSize()
) { innerPadding ->
Expand Down
11 changes: 6 additions & 5 deletions app/src/main/java/com/nicolas/picstream/data/di/AppModule.kt
Original file line number Diff line number Diff line change
Expand Up @@ -10,9 +10,9 @@ import com.nicolas.picstream.data.remote.mediator.PhotoRemoteMediator
import com.nicolas.picstream.manager.DataStore
import com.nicolas.picstream.manager.NotificationFlag
import com.nicolas.picstream.manager.DataStoreManager
import com.nicolas.picstream.ui.home.HomeViewModel
import com.nicolas.picstream.ui.notifications.NotificationViewModel
import com.nicolas.picstream.ui.option.OptionViewModel
import com.nicolas.picstream.presentation.home.HomeViewModel
import com.nicolas.picstream.presentation.notifications.NotificationViewModel
import com.nicolas.picstream.presentation.option.OptionViewModel
import org.koin.android.ext.koin.androidApplication
import org.koin.core.module.dsl.viewModel
import org.koin.dsl.module
Expand All @@ -37,7 +37,7 @@ val appModule = module {
Pager(
config = PagingConfig(pageSize = Constants.PER_PAGE),
remoteMediator = PhotoRemoteMediator(
unsplashApi = get(),
photoService = get(),
applicationDatabase = get()
),
pagingSourceFactory = { get<ApplicationDatabase>().photoDao().pagingSource() }
Expand All @@ -51,7 +51,8 @@ val appModule = module {
HomeViewModel(
photoRepository = get(),
pager = get(),
networkConnectivityService = get()
networkConnectivityService = get(),
dataStore = get()
)
}

Expand Down
37 changes: 11 additions & 26 deletions app/src/main/java/com/nicolas/picstream/data/mapper/Mapper.kt
Original file line number Diff line number Diff line change
Expand Up @@ -6,25 +6,18 @@ import com.nicolas.picstream.data.model.Notification
import com.nicolas.picstream.data.model.Photo
import com.nicolas.picstream.data.model.PhotoUrl
import com.nicolas.picstream.data.model.Topic
import com.nicolas.picstream.data.response.PagingPhotoResponse
import com.nicolas.picstream.data.response.PhotoResponse
import com.nicolas.picstream.data.response.TopicResponse
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.withContext

suspend fun PhotoResponse.toDomain() = withContext(Dispatchers.IO) {
Photo(
slug = slug,
id = id,
url = PhotoUrl(
raw = url.raw,
full = url.full,
regular = url.regular,
small = url.small,
thumb = url.thumb,
smallS3 = url.smallS3
),
photographerName = user.name,
description = description
url = src.original ?: "",
photographerName = photographer ?: "",
alt = alt ?: ""
)
}

Expand All @@ -35,30 +28,22 @@ fun TopicResponse.toTopic() = Topic(
status = status
)

suspend fun List<PhotoResponse>.toDomain() = map { it.toDomain() }
suspend fun List<PagingPhotoResponse>.toDomain() =
map { it.photos.map { photos -> photos.toDomain() } }


fun PhotoResponse.toPhotoEntity() = PhotoEntity(
id = id,
slug = slug,
imageUrl = url.regular,
photographerName = user.name,
description = description ?: ""
url = src.original ?: "",
photographerName = photographer ?: "",
alt = alt ?: ""
)

fun PhotoEntity.toPhoto() = Photo(
id = id,
slug = slug,
url = PhotoUrl(
raw = "",
full = "",
small = "",
thumb = "",
smallS3 = "",
regular = imageUrl
),
url = url,
photographerName = photographerName,
description = description
alt = alt
)

fun Notification.toNotificationEntity() = NotificationEntity(
Expand Down
5 changes: 4 additions & 1 deletion app/src/main/java/com/nicolas/picstream/manager/DataStore.kt
Original file line number Diff line number Diff line change
Expand Up @@ -3,11 +3,14 @@ package com.nicolas.picstream.manager
import kotlinx.coroutines.flow.Flow

interface NotificationFlag {
val isNotificationEnable : Flow<Boolean>
val isNotificationEnable: Flow<Boolean>
}

interface DataStore : NotificationFlag {

val toggleTheme: Flow<Boolean>

suspend fun toggleNotification(active: Boolean)
suspend fun toggleTheme(mode: Boolean)

}
Original file line number Diff line number Diff line change
Expand Up @@ -13,14 +13,24 @@ class DataStoreManager(private val context: Context) : DataStore {

companion object {
val NOTIFICATION_KEY = booleanPreferencesKey("notification")
val APPLICATION_THEME = booleanPreferencesKey("theme")
}


override suspend fun toggleNotification(active: Boolean) {
context.dataStore.edit {
it[NOTIFICATION_KEY] = active
}
}

override suspend fun toggleTheme(mode: Boolean) {
context.dataStore.edit {
it[APPLICATION_THEME] = mode
}
}
override val toggleTheme: Flow<Boolean>
get() = context.dataStore.data.map { preferences -> preferences[APPLICATION_THEME] ?: false }

override val isNotificationEnable: Flow<Boolean>
get() = context.dataStore.data.map { preferences -> preferences[NOTIFICATION_KEY] ?: true }

Expand Down

0 comments on commit 4d25bdf

Please sign in to comment.