From 0233be9cf4edef570cee6267157f726c62e6fe69 Mon Sep 17 00:00:00 2001 From: Sanju S Date: Fri, 21 May 2021 09:10:06 +0530 Subject: [PATCH 1/7] Update Dependencies & Use HiltNavGraphViewModel Signed-off-by: Spikeysanju --- app/build.gradle | 2 +- .../jetquotes/data/preference/UIModeDataStore.kt | 1 - .../spikeysanju/jetquotes/navigation/JetQuotesMain.kt | 11 ++++++++++- build.gradle | 2 +- 4 files changed, 12 insertions(+), 4 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index 032c9b4..dff6a12 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -112,7 +112,7 @@ dependencies { implementation "androidx.hilt:hilt-lifecycle-viewmodel:$hiltAndroidXVersion" kapt "androidx.hilt:hilt-compiler:$hiltAndroidXVersion" implementation "androidx.hilt:hilt-navigation-compose:1.0.0-alpha01" - implementation "androidx.hilt:hilt-common:1.0.0-beta01" + implementation "androidx.hilt:hilt-common:1.0.0" kapt "com.google.dagger:hilt-compiler:2.33-beta" // Lottie diff --git a/app/src/main/java/www/spikeysanju/jetquotes/data/preference/UIModeDataStore.kt b/app/src/main/java/www/spikeysanju/jetquotes/data/preference/UIModeDataStore.kt index d732a44..69f109e 100644 --- a/app/src/main/java/www/spikeysanju/jetquotes/data/preference/UIModeDataStore.kt +++ b/app/src/main/java/www/spikeysanju/jetquotes/data/preference/UIModeDataStore.kt @@ -42,7 +42,6 @@ abstract class PrefsDataStore(context: Context, fileName: String) { val mDataStore: DataStore = context.dataStore } - class UIModeDataStore(context: Context) : PrefsDataStore(context = context, PREF_FILE_UI_MODE), UIModeImpl { diff --git a/app/src/main/java/www/spikeysanju/jetquotes/navigation/JetQuotesMain.kt b/app/src/main/java/www/spikeysanju/jetquotes/navigation/JetQuotesMain.kt index 9ae9daf..ffc7787 100644 --- a/app/src/main/java/www/spikeysanju/jetquotes/navigation/JetQuotesMain.kt +++ b/app/src/main/java/www/spikeysanju/jetquotes/navigation/JetQuotesMain.kt @@ -31,6 +31,10 @@ package www.spikeysanju.jetquotes.navigation import androidx.compose.material.ExperimentalMaterialApi import androidx.compose.runtime.Composable import androidx.compose.runtime.remember +import androidx.compose.ui.platform.LocalContext +import androidx.hilt.navigation.HiltViewModelFactory +import androidx.hilt.navigation.compose.hiltNavGraphViewModel +import androidx.lifecycle.viewmodel.compose.viewModel import androidx.navigation.NavHostController import androidx.navigation.NavType import androidx.navigation.compose.NavHost @@ -51,13 +55,16 @@ object EndPoints { @ExperimentalMaterialApi @Composable -fun JetQuotesMain(viewModel: MainViewModel, toggleTheme: () -> Unit) { +fun JetQuotesMain(toggleTheme: () -> Unit) { val navController = rememberNavController() val actions = remember(navController) { MainActions(navController) } NavHost(navController, startDestination = Screen.Home.route) { // Quotes List composable(Screen.Home.route) { + val viewModel: MainViewModel = viewModel( + factory = HiltViewModelFactory(LocalContext.current, it) + ) QuotesListScreen(viewModel, toggleTheme, actions) } @@ -70,6 +77,7 @@ fun JetQuotesMain(viewModel: MainViewModel, toggleTheme: () -> Unit) { type = NavType.StringType }) ) { + val viewModel = hiltNavGraphViewModel(backStackEntry = it) DetailScreen( viewModel, actions.upPress, @@ -80,6 +88,7 @@ fun JetQuotesMain(viewModel: MainViewModel, toggleTheme: () -> Unit) { // Favourites composable(Screen.Favourites.route) { + val viewModel = hiltNavGraphViewModel(backStackEntry = it) FavouritesScreen(viewModel, actions) } } diff --git a/build.gradle b/build.gradle index 70aa7af..1e86d28 100644 --- a/build.gradle +++ b/build.gradle @@ -29,7 +29,7 @@ // Top-level build file where you can add configuration options common to all sub-projects/modules. buildscript { ext { - compose_version = '1.0.0-beta05' + compose_version = '1.0.0-beta07' hiltAndroidXVersion = "1.0.0-alpha03" hiltVersion = "2.33-beta" coroutinesVersion = "1.4.3" From 8dd807f67a84cb12569028331d92ee5f3e02384b Mon Sep 17 00:00:00 2001 From: Sanju S Date: Fri, 21 May 2021 09:14:19 +0530 Subject: [PATCH 2/7] Refactor MainActivity.kt Signed-off-by: Spikeysanju --- .../{JetQuotesMain.kt => NavGraph.kt} | 2 +- .../jetquotes/view/MainActivity.kt | 44 +++++++++++-------- 2 files changed, 26 insertions(+), 20 deletions(-) rename app/src/main/java/www/spikeysanju/jetquotes/navigation/{JetQuotesMain.kt => NavGraph.kt} (98%) diff --git a/app/src/main/java/www/spikeysanju/jetquotes/navigation/JetQuotesMain.kt b/app/src/main/java/www/spikeysanju/jetquotes/navigation/NavGraph.kt similarity index 98% rename from app/src/main/java/www/spikeysanju/jetquotes/navigation/JetQuotesMain.kt rename to app/src/main/java/www/spikeysanju/jetquotes/navigation/NavGraph.kt index ffc7787..89f459f 100644 --- a/app/src/main/java/www/spikeysanju/jetquotes/navigation/JetQuotesMain.kt +++ b/app/src/main/java/www/spikeysanju/jetquotes/navigation/NavGraph.kt @@ -55,7 +55,7 @@ object EndPoints { @ExperimentalMaterialApi @Composable -fun JetQuotesMain(toggleTheme: () -> Unit) { +fun NavGraph(toggleTheme: () -> Unit) { val navController = rememberNavController() val actions = remember(navController) { MainActions(navController) } diff --git a/app/src/main/java/www/spikeysanju/jetquotes/view/MainActivity.kt b/app/src/main/java/www/spikeysanju/jetquotes/view/MainActivity.kt index 9d46826..f2c6641 100644 --- a/app/src/main/java/www/spikeysanju/jetquotes/view/MainActivity.kt +++ b/app/src/main/java/www/spikeysanju/jetquotes/view/MainActivity.kt @@ -36,52 +36,58 @@ import androidx.compose.foundation.isSystemInDarkTheme import androidx.compose.material.ExperimentalMaterialApi import androidx.compose.material.MaterialTheme import androidx.compose.material.Surface +import androidx.compose.runtime.Composable import androidx.compose.runtime.collectAsState import androidx.compose.runtime.getValue import androidx.lifecycle.lifecycleScope -import androidx.lifecycle.viewmodel.compose.viewModel import dagger.hilt.android.AndroidEntryPoint import kotlinx.coroutines.InternalCoroutinesApi import kotlinx.coroutines.flow.collect import kotlinx.coroutines.launch -import www.spikeysanju.jetquotes.navigation.JetQuotesMain +import www.spikeysanju.jetquotes.data.preference.UIModeDataStore +import www.spikeysanju.jetquotes.navigation.NavGraph import www.spikeysanju.jetquotes.ui.JetQuotesTheme import www.spikeysanju.jetquotes.view.viewModel.MainViewModel +import javax.inject.Inject @ExperimentalMaterialApi @AndroidEntryPoint class MainActivity : AppCompatActivity() { + + @Inject + lateinit var uiModeDataStore: UIModeDataStore private lateinit var viewModel: MainViewModel @InternalCoroutinesApi override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContent { - //init viewModel - viewModel = viewModel() + JetQuotesMain() + } + // observe theme change + observeUITheme() + } - // get all quotes - viewModel.getAllQuotes(application) + @Composable + fun JetQuotesMain() { - // observe theme change - observeUITheme() + // check UI mode + val darkMode by uiModeDataStore.uiMode.collectAsState(initial = isSystemInDarkTheme()) - // check UI mode - val darkMode by viewModel.getUIMode.collectAsState(initial = isSystemInDarkTheme()) - // set UI mode accordingly - val toggleTheme: () -> Unit = { - lifecycleScope.launch { - viewModel.setUIMode(!darkMode) - } + // set UI mode accordingly + val toggleTheme: () -> Unit = { + lifecycleScope.launch { + uiModeDataStore.saveToDataStore(!darkMode) } + } - JetQuotesTheme(darkTheme = darkMode) { - Surface(color = MaterialTheme.colors.background) { - JetQuotesMain(viewModel, toggleTheme) - } + JetQuotesTheme(darkTheme = darkMode) { + Surface(color = MaterialTheme.colors.background) { + NavGraph(toggleTheme) } } + } private fun observeUITheme() { From ce279bf3cdd05cff148a9a2a5437fbeaedc725da Mon Sep 17 00:00:00 2001 From: Sanju S Date: Fri, 21 May 2021 09:19:27 +0530 Subject: [PATCH 3/7] Refactor QuotesListScreen.kt Signed-off-by: Spikeysanju --- .../jetquotes/view/quotes/QuotesListScreen.kt | 7 +++-- .../jetquotes/view/viewModel/MainViewModel.kt | 29 ++++--------------- 2 files changed, 10 insertions(+), 26 deletions(-) diff --git a/app/src/main/java/www/spikeysanju/jetquotes/view/quotes/QuotesListScreen.kt b/app/src/main/java/www/spikeysanju/jetquotes/view/quotes/QuotesListScreen.kt index 1f210a9..515c710 100644 --- a/app/src/main/java/www/spikeysanju/jetquotes/view/quotes/QuotesListScreen.kt +++ b/app/src/main/java/www/spikeysanju/jetquotes/view/quotes/QuotesListScreen.kt @@ -28,7 +28,6 @@ package www.spikeysanju.jetquotes.view.quotes -import android.annotation.SuppressLint import android.widget.Toast import androidx.compose.material.Scaffold import androidx.compose.runtime.Composable @@ -40,7 +39,6 @@ import www.spikeysanju.jetquotes.navigation.MainActions import www.spikeysanju.jetquotes.utils.ViewState import www.spikeysanju.jetquotes.view.viewModel.MainViewModel -@SuppressLint("CoroutineCreationDuringComposition") @Composable fun QuotesListScreen( viewModel: MainViewModel, @@ -55,6 +53,11 @@ fun QuotesListScreen( ) }, content = { val context = LocalContext.current + + // get all quotes + viewModel.getAllQuotes(context) + + // observe quotes when (val result = viewModel.uiState.collectAsState().value) { is ViewState.Error -> { Toast.makeText( diff --git a/app/src/main/java/www/spikeysanju/jetquotes/view/viewModel/MainViewModel.kt b/app/src/main/java/www/spikeysanju/jetquotes/view/viewModel/MainViewModel.kt index 2746bf1..9a91796 100644 --- a/app/src/main/java/www/spikeysanju/jetquotes/view/viewModel/MainViewModel.kt +++ b/app/src/main/java/www/spikeysanju/jetquotes/view/viewModel/MainViewModel.kt @@ -28,21 +28,19 @@ package www.spikeysanju.jetquotes.view.viewModel -import android.app.Application -import androidx.lifecycle.AndroidViewModel +import android.content.Context +import androidx.lifecycle.ViewModel import androidx.lifecycle.viewModelScope import com.squareup.moshi.JsonAdapter import com.squareup.moshi.Moshi import com.squareup.moshi.Types import com.squareup.moshi.kotlin.reflect.KotlinJsonAdapterFactory import dagger.hilt.android.lifecycle.HiltViewModel -import kotlinx.coroutines.Dispatchers.IO import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.flow.asStateFlow import kotlinx.coroutines.flow.collect import kotlinx.coroutines.flow.distinctUntilChanged import kotlinx.coroutines.launch -import www.spikeysanju.jetquotes.data.preference.UIModeDataStore import www.spikeysanju.jetquotes.model.Quote import www.spikeysanju.jetquotes.repository.MainRepository import www.spikeysanju.jetquotes.utils.FavouriteViewState @@ -50,14 +48,7 @@ import www.spikeysanju.jetquotes.utils.ViewState import javax.inject.Inject @HiltViewModel -class MainViewModel @Inject constructor( - application: Application, - private val repository: MainRepository -) : - AndroidViewModel(application) { - - // init UIModeDataStore - private val uiModeDataStore = UIModeDataStore(application) +class MainViewModel @Inject constructor(private val repository: MainRepository) : ViewModel() { // Backing property to avoid state updates from other classes private val _uiState = MutableStateFlow(ViewState.Loading) @@ -68,7 +59,7 @@ class MainViewModel @Inject constructor( val favState = _favState.asStateFlow() // get all quotes from assets folder - fun getAllQuotes(application: Application) = viewModelScope.launch { + fun getAllQuotes(context: Context) = viewModelScope.launch { try { val moshi = Moshi.Builder() .add(KotlinJsonAdapterFactory()) @@ -76,23 +67,13 @@ class MainViewModel @Inject constructor( val listType = Types.newParameterizedType(List::class.java, Quote::class.java) val adapter: JsonAdapter> = moshi.adapter(listType) val myJson = - application.assets.open("quotes.json").bufferedReader().use { it.readText() } + context.assets.open("quotes.json").bufferedReader().use { it.readText() } _uiState.value = ViewState.Success(adapter.fromJson(myJson)!!) } catch (e: Exception) { _uiState.value = ViewState.Error(exception = e) } } - // get ui mode - val getUIMode = uiModeDataStore.uiMode - - // save ui mode - fun setUIMode(isNightMode: Boolean) { - viewModelScope.launch(IO) { - uiModeDataStore.saveToDataStore(isNightMode) - } - } - // get all favourites init { viewModelScope.launch { From 3333f716b583f8836f02615f1893bd38159dca65 Mon Sep 17 00:00:00 2001 From: Sanju S Date: Fri, 21 May 2021 09:21:16 +0530 Subject: [PATCH 4/7] Add DI for DataStore Preference Signed-off-by: Spikeysanju --- .../java/www/spikeysanju/jetquotes/di/AppComponent.kt | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/app/src/main/java/www/spikeysanju/jetquotes/di/AppComponent.kt b/app/src/main/java/www/spikeysanju/jetquotes/di/AppComponent.kt index 6a27612..88f1ef3 100644 --- a/app/src/main/java/www/spikeysanju/jetquotes/di/AppComponent.kt +++ b/app/src/main/java/www/spikeysanju/jetquotes/di/AppComponent.kt @@ -35,6 +35,8 @@ import dagger.Provides import dagger.hilt.InstallIn import dagger.hilt.android.qualifiers.ApplicationContext import dagger.hilt.components.SingletonComponent +import www.spikeysanju.jetquotes.data.preference.UIModeDataStore +import www.spikeysanju.jetquotes.data.preference.UIModeImpl import www.spikeysanju.jetquotes.data.preference.db.FavouritesDao import www.spikeysanju.jetquotes.data.preference.db.JetQuotesDatabase import javax.inject.Singleton @@ -43,6 +45,12 @@ import javax.inject.Singleton @InstallIn(SingletonComponent::class) object AppComponent { + @Singleton + @Provides + fun providePreferenceManager(@ApplicationContext context: Context): UIModeImpl { + return UIModeDataStore(context) + } + @Singleton @Provides fun provideDao(jetQuotesDatabase: JetQuotesDatabase): FavouritesDao = From 7bff8780da62213837b1c75b88f2cf14c3ade3c3 Mon Sep 17 00:00:00 2001 From: Sanju S Date: Fri, 21 May 2021 09:22:31 +0530 Subject: [PATCH 5/7] Remove unused imports Signed-off-by: Spikeysanju --- .../java/www/spikeysanju/jetquotes/view/MainActivity.kt | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/app/src/main/java/www/spikeysanju/jetquotes/view/MainActivity.kt b/app/src/main/java/www/spikeysanju/jetquotes/view/MainActivity.kt index f2c6641..55445d9 100644 --- a/app/src/main/java/www/spikeysanju/jetquotes/view/MainActivity.kt +++ b/app/src/main/java/www/spikeysanju/jetquotes/view/MainActivity.kt @@ -47,18 +47,14 @@ import kotlinx.coroutines.launch import www.spikeysanju.jetquotes.data.preference.UIModeDataStore import www.spikeysanju.jetquotes.navigation.NavGraph import www.spikeysanju.jetquotes.ui.JetQuotesTheme -import www.spikeysanju.jetquotes.view.viewModel.MainViewModel import javax.inject.Inject - @ExperimentalMaterialApi @AndroidEntryPoint class MainActivity : AppCompatActivity() { @Inject lateinit var uiModeDataStore: UIModeDataStore - private lateinit var viewModel: MainViewModel - @InternalCoroutinesApi override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) @@ -92,7 +88,7 @@ class MainActivity : AppCompatActivity() { private fun observeUITheme() { lifecycleScope.launchWhenStarted { - viewModel.getUIMode.collect { + uiModeDataStore.uiMode.collect { val mode = when (it) { true -> AppCompatDelegate.MODE_NIGHT_YES false -> AppCompatDelegate.MODE_NIGHT_NO From 5b8d183d53d83eb51e22378a734786c9627a3288 Mon Sep 17 00:00:00 2001 From: Sanju S Date: Fri, 21 May 2021 09:55:29 +0530 Subject: [PATCH 6/7] Update strings.xml Signed-off-by: Spikeysanju --- .../www/spikeysanju/jetquotes/components/Button.kt | 8 ++++++-- .../spikeysanju/jetquotes/components/CTAButtons.kt | 7 ++++--- .../spikeysanju/jetquotes/components/DetailCard.kt | 6 ++++-- .../spikeysanju/jetquotes/components/EmptyScreen.kt | 7 ++++--- .../spikeysanju/jetquotes/components/QuotesCard.kt | 6 ++++-- .../jetquotes/components/QuotesThemeSwitch.kt | 3 ++- .../www/spikeysanju/jetquotes/components/TopBar.kt | 7 ++++--- .../jetquotes/data/preference/UIModeDataStore.kt | 2 ++ .../www/spikeysanju/jetquotes/view/MainActivity.kt | 8 +++----- app/src/main/res/values/strings.xml | 12 ++++++++++++ build.gradle | 2 +- 11 files changed, 46 insertions(+), 22 deletions(-) diff --git a/app/src/main/java/www/spikeysanju/jetquotes/components/Button.kt b/app/src/main/java/www/spikeysanju/jetquotes/components/Button.kt index f0c2d65..62c823a 100644 --- a/app/src/main/java/www/spikeysanju/jetquotes/components/Button.kt +++ b/app/src/main/java/www/spikeysanju/jetquotes/components/Button.kt @@ -40,17 +40,21 @@ import androidx.compose.material.Text import androidx.compose.runtime.Composable import androidx.compose.ui.Modifier import androidx.compose.ui.graphics.painter.Painter +import androidx.compose.ui.res.stringResource import androidx.compose.ui.text.style.TextOverflow import androidx.compose.ui.unit.dp +import www.spikeysanju.jetquotes.R @Composable fun Button(icon: Painter, name: String?, modifier: Modifier) { Column( - modifier.background(MaterialTheme.colors.primaryVariant).padding(12.dp)) { + modifier + .background(MaterialTheme.colors.primaryVariant) + .padding(12.dp)) { Icon( painter = icon, - contentDescription = "" + contentDescription = stringResource(R.string.text_cta_icons) ) Spacer(modifier = Modifier.height(8.dp)) Text(text = name.toString(), diff --git a/app/src/main/java/www/spikeysanju/jetquotes/components/CTAButtons.kt b/app/src/main/java/www/spikeysanju/jetquotes/components/CTAButtons.kt index 9473239..0a41926 100644 --- a/app/src/main/java/www/spikeysanju/jetquotes/components/CTAButtons.kt +++ b/app/src/main/java/www/spikeysanju/jetquotes/components/CTAButtons.kt @@ -43,6 +43,7 @@ import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.res.painterResource +import androidx.compose.ui.res.stringResource import androidx.compose.ui.unit.dp import www.spikeysanju.jetquotes.R import www.spikeysanju.jetquotes.model.Quote @@ -64,7 +65,7 @@ fun CTAButtons(viewModel: MainViewModel, quote: String, author: String) { Button( icon = painterResource(id = R.drawable.ic_heart), - name = "FAVOURITE", + name = stringResource(R.string.text_favourite), modifier = Modifier.clickable(onClick = { val quotes = Quote(quote, author) viewModel.insertFavourite(quotes) @@ -76,7 +77,7 @@ fun CTAButtons(viewModel: MainViewModel, quote: String, author: String) { Button( icon = painterResource(id = R.drawable.ic_copy), - name = "COPY", + name = stringResource(R.string.text_copy), modifier = Modifier.clickable(onClick = { context.copyToClipboard(quote.plus("").plus("- $author")) Toast.makeText(context, "Quote Copied!", Toast.LENGTH_SHORT).show() @@ -87,7 +88,7 @@ fun CTAButtons(viewModel: MainViewModel, quote: String, author: String) { Button( icon = painterResource(id = R.drawable.ic_share), - name = "SHARE", + name = stringResource(R.string.text_share), modifier = Modifier.clickable(onClick = { context.shareToOthers(quote.plus("").plus("- $author")) }) diff --git a/app/src/main/java/www/spikeysanju/jetquotes/components/DetailCard.kt b/app/src/main/java/www/spikeysanju/jetquotes/components/DetailCard.kt index 650e533..1c49c8b 100644 --- a/app/src/main/java/www/spikeysanju/jetquotes/components/DetailCard.kt +++ b/app/src/main/java/www/spikeysanju/jetquotes/components/DetailCard.kt @@ -45,8 +45,10 @@ import androidx.compose.runtime.Composable import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.platform.LocalContext +import androidx.compose.ui.res.stringResource import androidx.compose.ui.text.style.TextAlign import androidx.compose.ui.unit.dp +import www.spikeysanju.jetquotes.R import www.spikeysanju.jetquotes.utils.copyToClipboard import www.spikeysanju.jetquotes.view.viewModel.MainViewModel @@ -90,7 +92,7 @@ fun DetailCard(viewModel: MainViewModel, quote: String, author: String) { modifier = Modifier .align(Alignment.CenterHorizontally) .wrapContentSize(align = Alignment.Center), - text = quote.ifBlank { " No Quotes found" }, + text = quote.ifBlank { stringResource(R.string.no_quotes_found) }, style = typography.h5, color = MaterialTheme.colors.onBackground, textAlign = TextAlign.Center @@ -100,7 +102,7 @@ fun DetailCard(viewModel: MainViewModel, quote: String, author: String) { Text( modifier = Modifier.align(Alignment.CenterHorizontally), - text = author.ifBlank { " - Unknown" }, + text = author.ifBlank { stringResource(R.string.text_unknow) }, style = typography.body1, color = MaterialTheme.colors.onBackground, textAlign = TextAlign.Center diff --git a/app/src/main/java/www/spikeysanju/jetquotes/components/EmptyScreen.kt b/app/src/main/java/www/spikeysanju/jetquotes/components/EmptyScreen.kt index 1061ed5..90f8076 100644 --- a/app/src/main/java/www/spikeysanju/jetquotes/components/EmptyScreen.kt +++ b/app/src/main/java/www/spikeysanju/jetquotes/components/EmptyScreen.kt @@ -42,6 +42,7 @@ import androidx.compose.runtime.Composable import androidx.compose.runtime.remember import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier +import androidx.compose.ui.res.stringResource import androidx.compose.ui.text.style.TextAlign import androidx.compose.ui.unit.dp import com.airbnb.lottie.compose.LottieAnimation @@ -62,14 +63,14 @@ fun EmptyScreen(actions: MainActions) { ) { Loader() Text( - text = "Your wish list is empty!", + text = stringResource(R.string.text_empty_wish_list), modifier = Modifier.fillMaxWidth(), style = typography.h6, textAlign = TextAlign.Center ) Spacer(modifier = Modifier.height(8.dp)) Text( - text = "Explore more and add some quotes!", + text = stringResource(R.string.text_empty_explore), modifier = Modifier.fillMaxWidth(), style = typography.body2, textAlign = TextAlign.Center, @@ -82,7 +83,7 @@ fun EmptyScreen(actions: MainActions) { contentColor = MaterialTheme.colors.background ) ) { - Text(text = "Back to home") + Text(text = stringResource(R.string.text_back_to_home)) } } } diff --git a/app/src/main/java/www/spikeysanju/jetquotes/components/QuotesCard.kt b/app/src/main/java/www/spikeysanju/jetquotes/components/QuotesCard.kt index fdc263c..1a7a679 100644 --- a/app/src/main/java/www/spikeysanju/jetquotes/components/QuotesCard.kt +++ b/app/src/main/java/www/spikeysanju/jetquotes/components/QuotesCard.kt @@ -43,7 +43,9 @@ import androidx.compose.material.Text import androidx.compose.runtime.Composable import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier +import androidx.compose.ui.res.stringResource import androidx.compose.ui.unit.dp +import www.spikeysanju.jetquotes.R import www.spikeysanju.jetquotes.model.Quote import www.spikeysanju.jetquotes.navigation.MainActions @@ -70,7 +72,7 @@ fun QuotesCard(quote: Quote, actions: MainActions) { text = quote.quote, style = typography.body1, color = MaterialTheme.colors.onBackground, - modifier = Modifier.padding(12.dp, 0.dp, 0.dp, 0.dp) + modifier = Modifier.padding(start = 12.dp) ) Spacer(Modifier.height(12.dp)) @@ -80,7 +82,7 @@ fun QuotesCard(quote: Quote, actions: MainActions) { modifier = Modifier .align(Alignment.CenterEnd) .padding(12.dp), - text = quote.author.toString().ifBlank { " - Unknown" }, + text = quote.author.toString().ifBlank { stringResource(R.string.text_unknow) }, style = typography.caption, color = MaterialTheme.colors.onBackground ) diff --git a/app/src/main/java/www/spikeysanju/jetquotes/components/QuotesThemeSwitch.kt b/app/src/main/java/www/spikeysanju/jetquotes/components/QuotesThemeSwitch.kt index 804a7eb..dcf1225 100644 --- a/app/src/main/java/www/spikeysanju/jetquotes/components/QuotesThemeSwitch.kt +++ b/app/src/main/java/www/spikeysanju/jetquotes/components/QuotesThemeSwitch.kt @@ -35,6 +35,7 @@ import androidx.compose.material.Icon import androidx.compose.runtime.Composable import androidx.compose.ui.Modifier import androidx.compose.ui.res.painterResource +import androidx.compose.ui.res.stringResource import androidx.compose.ui.unit.dp import www.spikeysanju.jetquotes.R @@ -47,7 +48,7 @@ fun QuotesThemeSwitch(onToggle: () -> Unit) { } Icon( - painter = icon, contentDescription = "", + painter = icon, contentDescription = stringResource(id = R.string.text_day_night), Modifier .padding(end = 8.dp) .clickable(onClick = onToggle) diff --git a/app/src/main/java/www/spikeysanju/jetquotes/components/TopBar.kt b/app/src/main/java/www/spikeysanju/jetquotes/components/TopBar.kt index 1befba6..9e08d74 100644 --- a/app/src/main/java/www/spikeysanju/jetquotes/components/TopBar.kt +++ b/app/src/main/java/www/spikeysanju/jetquotes/components/TopBar.kt @@ -48,6 +48,7 @@ import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.graphics.painter.Painter import androidx.compose.ui.res.painterResource +import androidx.compose.ui.res.stringResource import androidx.compose.ui.unit.dp import www.spikeysanju.jetquotes.R import www.spikeysanju.jetquotes.ui.typography @@ -81,7 +82,7 @@ fun TopBar(title: String, onToggle: () -> Unit, onFavouritesClick: () -> Unit) { val settingsIcon: Painter = painterResource(id = R.drawable.ic_heart) Icon( painter = settingsIcon, - contentDescription = "Favourites Icon", + contentDescription = stringResource(R.string.text_favourites_icon), tint = MaterialTheme.colors.onPrimary ) } @@ -93,7 +94,7 @@ fun TopBar(title: String, onToggle: () -> Unit, onFavouritesClick: () -> Unit) { painterResource(id = R.drawable.ic_day) Icon( painter = toggleIcon, - contentDescription = "Day/Night Icon", + contentDescription = stringResource(R.string.text_day_night), tint = MaterialTheme.colors.onPrimary ) } @@ -115,7 +116,7 @@ fun TopBarWithBack(title: String, onBackClick: () -> Unit) { IconButton(onClick = { onBackClick() }, modifier = Modifier.padding(start = 16.dp)) { Icon( imageVector = Icons.Default.ArrowBack, - contentDescription = "Back Icon", + contentDescription = stringResource(R.string.text_back_icon), tint = MaterialTheme.colors.onPrimary ) } diff --git a/app/src/main/java/www/spikeysanju/jetquotes/data/preference/UIModeDataStore.kt b/app/src/main/java/www/spikeysanju/jetquotes/data/preference/UIModeDataStore.kt index 69f109e..3486c10 100644 --- a/app/src/main/java/www/spikeysanju/jetquotes/data/preference/UIModeDataStore.kt +++ b/app/src/main/java/www/spikeysanju/jetquotes/data/preference/UIModeDataStore.kt @@ -36,6 +36,7 @@ import androidx.datastore.preferences.core.edit import androidx.datastore.preferences.preferencesDataStore import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.map +import javax.inject.Singleton abstract class PrefsDataStore(context: Context, fileName: String) { private val Context.dataStore: DataStore by preferencesDataStore(fileName) @@ -67,6 +68,7 @@ class UIModeDataStore(context: Context) : PrefsDataStore(context = context, PREF } } +@Singleton interface UIModeImpl { val uiMode: Flow suspend fun saveToDataStore(isNightMode: Boolean) diff --git a/app/src/main/java/www/spikeysanju/jetquotes/view/MainActivity.kt b/app/src/main/java/www/spikeysanju/jetquotes/view/MainActivity.kt index 55445d9..6105d15 100644 --- a/app/src/main/java/www/spikeysanju/jetquotes/view/MainActivity.kt +++ b/app/src/main/java/www/spikeysanju/jetquotes/view/MainActivity.kt @@ -41,10 +41,9 @@ import androidx.compose.runtime.collectAsState import androidx.compose.runtime.getValue import androidx.lifecycle.lifecycleScope import dagger.hilt.android.AndroidEntryPoint -import kotlinx.coroutines.InternalCoroutinesApi import kotlinx.coroutines.flow.collect import kotlinx.coroutines.launch -import www.spikeysanju.jetquotes.data.preference.UIModeDataStore +import www.spikeysanju.jetquotes.data.preference.UIModeImpl import www.spikeysanju.jetquotes.navigation.NavGraph import www.spikeysanju.jetquotes.ui.JetQuotesTheme import javax.inject.Inject @@ -52,10 +51,9 @@ import javax.inject.Inject @ExperimentalMaterialApi @AndroidEntryPoint class MainActivity : AppCompatActivity() { - @Inject - lateinit var uiModeDataStore: UIModeDataStore - @InternalCoroutinesApi + lateinit var uiModeDataStore: UIModeImpl + override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContent { diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index acae8a5..3d25ccb 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -33,4 +33,16 @@ Quotes Details Favourites + \" - Unknown\" + COPY + SHARE + FAVOURITE + \" No Quotes found\" + Your wish list is empty! + Explore more and add some quotes! + Back to home + Back Icon + Day/Night Icon + Favourites Icon + CTA Icons \ No newline at end of file diff --git a/build.gradle b/build.gradle index 1e86d28..2f7a20e 100644 --- a/build.gradle +++ b/build.gradle @@ -29,7 +29,7 @@ // Top-level build file where you can add configuration options common to all sub-projects/modules. buildscript { ext { - compose_version = '1.0.0-beta07' + compose_version = '1.0.0-beta06' hiltAndroidXVersion = "1.0.0-alpha03" hiltVersion = "2.33-beta" coroutinesVersion = "1.4.3" From 1180d69b151a7933673cca39ed5ea7119bf51b07 Mon Sep 17 00:00:00 2001 From: Sanju S Date: Fri, 21 May 2021 09:56:59 +0530 Subject: [PATCH 7/7] Fix Bug #93 | Release v1.3.1 Signed-off-by: Spikeysanju --- app/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/build.gradle b/app/build.gradle index dff6a12..f06876c 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -41,7 +41,7 @@ android { minSdkVersion 21 targetSdkVersion 30 versionCode 1 - versionName "1.3.0" + versionName "1.3.1" testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" }