Merge pull request #82 from kirmanak/splash-screen

Improve splash screen
This commit is contained in:
Kirill Kamakin
2022-11-04 20:13:50 +01:00
committed by GitHub
24 changed files with 629 additions and 237 deletions

View File

@@ -77,6 +77,7 @@ dependencies {
implementation(libs.androidx.navigation.uiKtx)
implementation(libs.androidx.coreKtx)
implementation(libs.androidx.splashScreen)
implementation(libs.androidx.appcompat)

View File

@@ -15,7 +15,7 @@
android:networkSecurityConfig="@xml/network_security_config"
android:roundIcon="@mipmap/ic_launcher"
android:supportsRtl="true"
android:theme="@style/AppTheme"
android:theme="@style/Theme.App.Starting"
tools:ignore="UnusedAttribute">
<activity
android:name=".ui.activity.MainActivity"

View File

@@ -1,17 +1,13 @@
package gq.kirmanak.mealient.extensions
import android.app.Activity
import android.content.SharedPreferences
import android.os.Build
import android.view.View
import android.view.WindowInsets
import android.widget.EditText
import android.widget.TextView
import androidx.annotation.RequiresApi
import androidx.annotation.StringRes
import androidx.appcompat.app.AppCompatActivity
import androidx.core.widget.doAfterTextChanged
import androidx.lifecycle.LifecycleOwner
import androidx.lifecycle.LiveData
import androidx.lifecycle.Observer
import androidx.lifecycle.lifecycleScope
import androidx.swiperefreshlayout.widget.SwipeRefreshLayout
import com.google.android.material.textfield.TextInputLayout
@@ -39,32 +35,6 @@ fun SwipeRefreshLayout.refreshRequestFlow(logger: Logger): Flow<Unit> = callback
}
}
fun Activity.setSystemUiVisibility(isVisible: Boolean, logger: Logger) {
logger.v { "setSystemUiVisibility() called with: isVisible = $isVisible" }
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) setSystemUiVisibilityV30(isVisible, logger)
else setSystemUiVisibilityV1(isVisible, logger)
}
@Suppress("DEPRECATION")
private fun Activity.setSystemUiVisibilityV1(isVisible: Boolean, logger: Logger) {
logger.v { "setSystemUiVisibilityV1() called with: isVisible = $isVisible" }
window.decorView.systemUiVisibility = if (isVisible) 0 else View.SYSTEM_UI_FLAG_FULLSCREEN
}
@RequiresApi(Build.VERSION_CODES.R)
private fun Activity.setSystemUiVisibilityV30(isVisible: Boolean, logger: Logger) {
logger.v { "setSystemUiVisibilityV30() called with: isVisible = $isVisible" }
val systemBars = WindowInsets.Type.systemBars()
window.insetsController?.apply { if (isVisible) show(systemBars) else hide(systemBars) }
?: logger.w { "setSystemUiVisibilityV30: insets controller is null" }
}
fun AppCompatActivity.setActionBarVisibility(isVisible: Boolean, logger: Logger) {
logger.v { "setActionBarVisibility() called with: isVisible = $isVisible" }
supportActionBar?.apply { if (isVisible) show() else hide() }
?: logger.w { "setActionBarVisibility: action bar is null" }
}
fun TextView.textChangesFlow(logger: Logger): Flow<CharSequence?> = callbackFlow {
logger.v { "textChangesFlow() called" }
val textWatcher = doAfterTextChanged {
@@ -116,4 +86,13 @@ fun <T> SharedPreferences.prefsChangeFlow(
sendValue()
registerOnSharedPreferenceChangeListener(listener)
awaitClose { unregisterOnSharedPreferenceChangeListener(listener) }
}
fun <T> LiveData<T>.observeOnce(lifecycleOwner: LifecycleOwner, observer: Observer<T>) {
observe(lifecycleOwner, object : Observer<T> {
override fun onChanged(value: T) {
removeObserver(this)
observer.onChanged(value)
}
})
}

View File

@@ -6,13 +6,16 @@ import android.view.MenuItem
import androidx.activity.viewModels
import androidx.appcompat.app.AppCompatActivity
import androidx.core.net.toUri
import androidx.core.splashscreen.SplashScreen.Companion.installSplashScreen
import androidx.core.view.isVisible
import androidx.navigation.findNavController
import androidx.navigation.NavController
import androidx.navigation.fragment.NavHostFragment
import com.google.android.material.shape.CornerFamily
import com.google.android.material.shape.MaterialShapeDrawable
import dagger.hilt.android.AndroidEntryPoint
import gq.kirmanak.mealient.R
import gq.kirmanak.mealient.databinding.MainActivityBinding
import gq.kirmanak.mealient.extensions.observeOnce
import gq.kirmanak.mealient.logging.Logger
import javax.inject.Inject
@@ -23,21 +26,39 @@ class MainActivity : AppCompatActivity() {
private val viewModel by viewModels<MainActivityViewModel>()
private val title: String by lazy { getString(R.string.app_name) }
private val uiState: MainActivityUiState get() = viewModel.uiState
private val navController: NavController
get() = binding.navHost.getFragment<NavHostFragment>().navController
@Inject
lateinit var logger: Logger
override fun onCreate(savedInstanceState: Bundle?) {
val splashScreen = installSplashScreen()
super.onCreate(savedInstanceState)
logger.v { "onCreate() called with: savedInstanceState = $savedInstanceState" }
splashScreen.setKeepOnScreenCondition { viewModel.startDestination.value == null }
binding = MainActivityBinding.inflate(layoutInflater)
setContentView(binding.root)
configureToolbar()
configureNavGraph()
viewModel.uiStateLive.observe(this, ::onUiStateChange)
binding.navigationView.setNavigationItemSelectedListener(::onNavigationItemSelected)
}
private fun configureNavGraph() {
viewModel.startDestination.observeOnce(this) {
logger.d { "configureNavGraph: received destination" }
val graph = navController.navInflater.inflate(R.navigation.nav_graph)
graph.setStartDestination(it)
navController.setGraph(graph, intent.extras)
}
}
private fun configureToolbar() {
setSupportActionBar(binding.toolbar)
binding.toolbar.setNavigationIcon(R.drawable.ic_toolbar)
binding.toolbar.setNavigationOnClickListener { binding.drawer.open() }
setToolbarRoundCorner()
viewModel.uiStateLive.observe(this, ::onUiStateChange)
binding.navigationView.setNavigationItemSelectedListener(::onNavigationItemSelected)
}
private fun onNavigationItemSelected(menuItem: MenuItem): Boolean {
@@ -102,7 +123,7 @@ class MainActivity : AppCompatActivity() {
private fun navigateDeepLink(deepLink: String) {
logger.v { "navigateDeepLink() called with: deepLink = $deepLink" }
findNavController(binding.navHost.id).navigate(deepLink.toUri())
navController.navigate(deepLink.toUri())
}
companion object {

View File

@@ -2,7 +2,10 @@ package gq.kirmanak.mealient.ui.activity
import androidx.lifecycle.*
import dagger.hilt.android.lifecycle.HiltViewModel
import gq.kirmanak.mealient.R
import gq.kirmanak.mealient.data.auth.AuthRepo
import gq.kirmanak.mealient.data.baseurl.ServerInfoRepo
import gq.kirmanak.mealient.data.disclaimer.DisclaimerStorage
import gq.kirmanak.mealient.logging.Logger
import kotlinx.coroutines.flow.launchIn
import kotlinx.coroutines.flow.onEach
@@ -13,6 +16,8 @@ import javax.inject.Inject
class MainActivityViewModel @Inject constructor(
private val authRepo: AuthRepo,
private val logger: Logger,
private val disclaimerStorage: DisclaimerStorage,
private val serverInfoRepo: ServerInfoRepo,
) : ViewModel() {
private val _uiState = MutableLiveData(MainActivityUiState())
@@ -22,10 +27,21 @@ class MainActivityViewModel @Inject constructor(
get() = checkNotNull(_uiState.value) { "UiState must not be null" }
private set(value) = _uiState.postValue(value)
private val _startDestination = MutableLiveData<Int>()
val startDestination: LiveData<Int> = _startDestination
init {
authRepo.isAuthorizedFlow
.onEach { isAuthorized -> updateUiState { it.copy(isAuthorized = isAuthorized) } }
.launchIn(viewModelScope)
viewModelScope.launch {
_startDestination.value = when {
!disclaimerStorage.isDisclaimerAccepted() -> R.id.disclaimerFragment
serverInfoRepo.getUrl() == null -> R.id.baseURLFragment
else -> R.id.recipesFragment
}
}
}
fun updateUiState(updater: (MainActivityUiState) -> MainActivityUiState) {

View File

@@ -1,53 +0,0 @@
package gq.kirmanak.mealient.ui.splash
import android.os.Bundle
import android.view.View
import androidx.appcompat.app.AppCompatActivity
import androidx.fragment.app.Fragment
import androidx.fragment.app.viewModels
import androidx.navigation.NavDirections
import androidx.navigation.fragment.findNavController
import dagger.hilt.android.AndroidEntryPoint
import gq.kirmanak.mealient.R
import gq.kirmanak.mealient.extensions.setActionBarVisibility
import gq.kirmanak.mealient.extensions.setSystemUiVisibility
import gq.kirmanak.mealient.logging.Logger
import javax.inject.Inject
@AndroidEntryPoint
class SplashFragment : Fragment(R.layout.fragment_splash) {
private val viewModel by viewModels<SplashViewModel>()
@Inject
lateinit var logger: Logger
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
logger.v { "onCreate() called with: savedInstanceState = $savedInstanceState" }
viewModel.nextDestination.observe(this, ::onNextDestination)
}
private fun onNextDestination(navDirections: NavDirections) {
logger.v { "onNextDestination() called with: navDirections = $navDirections" }
findNavController().navigate(navDirections)
}
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
logger.v { "onViewCreated() called with: view = $view, savedInstanceState = $savedInstanceState" }
changeFullscreenState(true)
}
override fun onDestroyView() {
super.onDestroyView()
logger.v { "onDestroyView() called" }
changeFullscreenState(false)
}
private fun changeFullscreenState(isFullscreen: Boolean) {
logger.v { "changeFullscreenState() called with: isFullscreen = $isFullscreen" }
(activity as? AppCompatActivity)?.setActionBarVisibility(!isFullscreen, logger)
activity?.setSystemUiVisibility(!isFullscreen, logger)
}
}

View File

@@ -1,33 +0,0 @@
package gq.kirmanak.mealient.ui.splash
import androidx.lifecycle.LiveData
import androidx.lifecycle.MutableLiveData
import androidx.lifecycle.ViewModel
import androidx.lifecycle.viewModelScope
import androidx.navigation.NavDirections
import dagger.hilt.android.lifecycle.HiltViewModel
import gq.kirmanak.mealient.data.baseurl.ServerInfoRepo
import gq.kirmanak.mealient.data.disclaimer.DisclaimerStorage
import kotlinx.coroutines.delay
import kotlinx.coroutines.launch
import javax.inject.Inject
@HiltViewModel
class SplashViewModel @Inject constructor(
private val disclaimerStorage: DisclaimerStorage,
private val serverInfoRepo: ServerInfoRepo,
) : ViewModel() {
private val _nextDestination = MutableLiveData<NavDirections>()
val nextDestination: LiveData<NavDirections> = _nextDestination
init {
viewModelScope.launch {
delay(1000)
_nextDestination.value = when {
!disclaimerStorage.isDisclaimerAccepted() -> SplashFragmentDirections.actionSplashFragmentToDisclaimerFragment()
serverInfoRepo.getUrl() == null -> SplashFragmentDirections.actionSplashFragmentToBaseURLFragment()
else -> SplashFragmentDirections.actionSplashFragmentToRecipesFragment()
}
}
}
}

File diff suppressed because one or more lines are too long

View File

@@ -0,0 +1,5 @@
<?xml version="1.0" encoding="utf-8"?>
<adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android">
<background android:drawable="@drawable/ic_splash_screen_background" />
<foreground android:drawable="@drawable/ic_splash_screen_foreground" />
</adaptive-icon>

View File

@@ -1,55 +1,31 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:aapt="http://schemas.android.com/aapt"
android:width="113dp"
android:height="200dp"
android:viewportWidth="360"
android:viewportHeight="640">
<group>
<path android:pathData="M0,0h360v640h-360z">
<aapt:attr name="android:fillColor">
<gradient
android:endX="360"
android:endY="640"
android:startX="4.00001"
android:startY="4"
android:type="linear">
<item
android:color="#FF9D76DC"
android:offset="0" />
<item
android:color="#FFDA59B6"
android:offset="0.5" />
<item
android:color="#FFF83563"
android:offset="0.96875" />
</gradient>
</aapt:attr>
</path>
<path
android:fillColor="#00000000"
android:pathData="M230.814,287.612L229.718,288.096L229.409,289.252L203.878,384.534C202.572,389.406 197.608,392.275 192.818,390.991L81.62,361.196C76.83,359.912 73.965,354.946 75.271,350.074L100.802,254.792L101.111,253.636L100.405,252.669C92.484,241.838 89.441,230.471 92.229,220.066C95.646,207.316 107.407,197.662 124.489,192.714C141.52,187.78 163.411,187.688 186.075,193.761C208.739,199.834 227.651,210.859 239.933,223.647C252.253,236.474 257.612,250.714 254.195,263.465C251.407,273.869 243.088,282.193 230.814,287.612ZM258.612,295.757L257.516,296.241L257.207,297.397L231.676,392.679C230.37,397.551 225.406,400.42 220.616,399.136L209.801,396.239C211.856,393.965 213.418,391.179 214.266,388.014L238.803,296.441C251.29,290.046 261.034,280.191 264.584,266.945C269.364,249.106 261.404,231.125 247.686,216.842C247.089,216.221 246.48,215.605 245.858,214.993C256.228,220.978 264.84,228.054 271.15,235.602C281.026,247.414 285.075,260.11 281.993,271.61C279.206,282.015 270.886,290.338 258.612,295.757Z"
android:strokeWidth="5"
android:strokeColor="#ffffff" />
<path
android:fillColor="#00000000"
android:pathData="M132,241.838C146.286,227.515 153.428,231.096 157,249"
android:strokeWidth="5"
android:strokeColor="#ffffff"
android:strokeLineCap="round" />
<path
android:fillColor="#00000000"
android:pathData="M190,257.838C204.286,243.515 211.428,247.096 215,265"
android:strokeWidth="5"
android:strokeColor="#ffffff"
android:strokeLineCap="round" />
<path
android:fillColor="#00000000"
android:pathData="M153.856,286.263C160.462,294.232 165.093,296.181 175.731,292.595"
android:strokeWidth="5"
android:strokeColor="#ffffff"
android:strokeLineCap="round" />
<path
android:fillColor="#ffffff"
android:pathData="M102.547,429.875L113.703,457.719L124.859,429.875H130.695V464H126.195V450.711L126.617,436.367L115.414,464H111.969L100.789,436.438L101.234,450.711V464H96.734V429.875H102.547ZM148.484,464.469C145.047,464.469 142.25,463.344 140.094,461.094C137.938,458.828 136.859,455.805 136.859,452.023V451.227C136.859,448.711 137.336,446.469 138.289,444.5C139.258,442.516 140.602,440.969 142.32,439.859C144.055,438.734 145.93,438.172 147.945,438.172C151.242,438.172 153.805,439.258 155.633,441.43C157.461,443.602 158.375,446.711 158.375,450.758V452.562H141.195C141.258,455.062 141.984,457.086 143.375,458.633C144.781,460.164 146.562,460.93 148.719,460.93C150.25,460.93 151.547,460.617 152.609,459.992C153.672,459.367 154.602,458.539 155.398,457.508L158.047,459.57C155.922,462.836 152.734,464.469 148.484,464.469ZM147.945,441.734C146.195,441.734 144.727,442.375 143.539,443.656C142.352,444.922 141.617,446.703 141.336,449H154.039V448.672C153.914,446.469 153.32,444.766 152.258,443.562C151.195,442.344 149.758,441.734 147.945,441.734ZM179.07,464C178.82,463.5 178.617,462.609 178.461,461.328C176.445,463.422 174.039,464.469 171.242,464.469C168.742,464.469 166.688,463.766 165.078,462.359C163.484,460.938 162.688,459.141 162.688,456.969C162.688,454.328 163.688,452.281 165.688,450.828C167.703,449.359 170.531,448.625 174.172,448.625H178.391V446.633C178.391,445.117 177.938,443.914 177.031,443.023C176.125,442.117 174.789,441.664 173.023,441.664C171.477,441.664 170.18,442.055 169.133,442.836C168.086,443.617 167.562,444.562 167.562,445.672H163.203C163.203,444.406 163.648,443.188 164.539,442.016C165.445,440.828 166.664,439.891 168.195,439.203C169.742,438.516 171.438,438.172 173.281,438.172C176.203,438.172 178.492,438.906 180.148,440.375C181.805,441.828 182.664,443.836 182.727,446.398V458.07C182.727,460.398 183.023,462.25 183.617,463.625V464H179.07ZM171.875,460.695C173.234,460.695 174.523,460.344 175.742,459.641C176.961,458.938 177.844,458.023 178.391,456.898V451.695H174.992C169.68,451.695 167.023,453.25 167.023,456.359C167.023,457.719 167.477,458.781 168.383,459.547C169.289,460.312 170.453,460.695 171.875,460.695ZM194.234,464H189.898V428H194.234V464ZM205.906,464H201.57V438.641H205.906V464ZM201.219,431.914C201.219,431.211 201.43,430.617 201.852,430.133C202.289,429.648 202.93,429.406 203.773,429.406C204.617,429.406 205.258,429.648 205.695,430.133C206.133,430.617 206.352,431.211 206.352,431.914C206.352,432.617 206.133,433.203 205.695,433.672C205.258,434.141 204.617,434.375 203.773,434.375C202.93,434.375 202.289,434.141 201.852,433.672C201.43,433.203 201.219,432.617 201.219,431.914ZM223.391,464.469C219.953,464.469 217.156,463.344 215,461.094C212.844,458.828 211.766,455.805 211.766,452.023V451.227C211.766,448.711 212.242,446.469 213.195,444.5C214.164,442.516 215.508,440.969 217.227,439.859C218.961,438.734 220.836,438.172 222.852,438.172C226.148,438.172 228.711,439.258 230.539,441.43C232.367,443.602 233.281,446.711 233.281,450.758V452.562H216.102C216.164,455.062 216.891,457.086 218.281,458.633C219.688,460.164 221.469,460.93 223.625,460.93C225.156,460.93 226.453,460.617 227.516,459.992C228.578,459.367 229.508,458.539 230.305,457.508L232.953,459.57C230.828,462.836 227.641,464.469 223.391,464.469ZM222.852,441.734C221.102,441.734 219.633,442.375 218.445,443.656C217.258,444.922 216.523,446.703 216.242,449H228.945V448.672C228.82,446.469 228.227,444.766 227.164,443.562C226.102,442.344 224.664,441.734 222.852,441.734ZM242.422,438.641L242.562,441.828C244.5,439.391 247.031,438.172 250.156,438.172C255.516,438.172 258.219,441.195 258.266,447.242V464H253.93V447.219C253.914,445.391 253.492,444.039 252.664,443.164C251.852,442.289 250.578,441.852 248.844,441.852C247.438,441.852 246.203,442.227 245.141,442.977C244.078,443.727 243.25,444.711 242.656,445.93V464H238.32V438.641H242.422ZM270.688,432.5V438.641H275.422V441.992H270.688V457.719C270.688,458.734 270.898,459.5 271.32,460.016C271.742,460.516 272.461,460.766 273.477,460.766C273.977,460.766 274.664,460.672 275.539,460.484V464C274.398,464.312 273.289,464.469 272.211,464.469C270.273,464.469 268.812,463.883 267.828,462.711C266.844,461.539 266.352,459.875 266.352,457.719V441.992H261.734V438.641H266.352V432.5H270.688Z" />
</group>
xmlns:aapt="http://schemas.android.com/aapt"
android:width="288dp"
android:height="288dp"
android:viewportWidth="288"
android:viewportHeight="288">
<group
android:scaleX="7"
android:scaleY="7">
<path android:pathData="M20,20m-20,0a20,20 0,1 1,40 0a20,20 0,1 1,-40 0">
<aapt:attr name="android:fillColor">
<gradient
android:endX="34.5"
android:endY="36"
android:startX="5"
android:startY="9"
android:type="linear">
<item
android:color="#FF9D76DC"
android:offset="0" />
<item
android:color="#FFDA59B6"
android:offset="0.53125" />
<item
android:color="#FFF83563"
android:offset="1" />
</gradient>
</aapt:attr>
</path>
</group>
</vector>

View File

@@ -0,0 +1,35 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="288dp"
android:height="288dp"
android:viewportWidth="288"
android:viewportHeight="288">
<group
android:scaleX="4"
android:scaleY="4"
android:translateX="85"
android:translateY="90">
<path
android:fillColor="#00000000"
android:pathData="M22.6128,14.1675L22.3938,14.2642L22.3318,14.4955L18.7865,27.7266C18.6268,28.3225 18.0205,28.6712 17.4379,28.5151L1.9968,24.3777C1.4142,24.2216 1.0635,23.6165 1.2232,23.0205L4.7684,9.7894L4.8304,9.5581L4.6891,9.3648C3.6072,7.8855 3.2064,6.3541 3.578,4.9673C4.0332,3.2684 5.6083,1.9554 7.9527,1.2763C10.2865,0.6002 13.2976,0.5853 16.4225,1.4226C19.5473,2.2599 22.1475,3.7784 23.8307,5.5308C25.5214,7.2911 26.229,9.2157 25.7737,10.9146C25.4021,12.3014 24.2894,13.4272 22.6128,14.1675ZM25.6576,4.9637C26.6549,5.6419 27.4994,6.3946 28.1585,7.183C29.5107,8.8003 30.0445,10.5131 29.6338,12.0457C29.2623,13.4325 28.1495,14.5583 26.4729,15.2985L26.2539,15.3952L26.1919,15.6265L22.6466,28.8576C22.4869,29.4536 21.8806,29.8023 21.298,29.6462L20.0265,29.3055C20.2507,29.0109 20.4226,28.6685 20.5243,28.2889L23.9141,15.638C25.6464,14.7352 27.0104,13.3474 27.5116,11.477C28.1292,9.1717 27.2542,6.8659 25.6576,4.9637Z"
android:strokeWidth="1"
android:strokeColor="#ffffff" />
<path
android:fillColor="#00000000"
android:pathData="M8,9C10,7 11,7.5 11.5,10"
android:strokeWidth="1"
android:strokeColor="#ffffff"
android:strokeLineCap="round" />
<path
android:fillColor="#00000000"
android:pathData="M16,11.2341C18,9.2341 19,9.7341 19.5,12.2341"
android:strokeWidth="1"
android:strokeColor="#ffffff"
android:strokeLineCap="round" />
<path
android:fillColor="#00000000"
android:pathData="M11,15.1199C11.9172,16.2266 12.5604,16.4972 14.0376,15.9992"
android:strokeWidth="1"
android:strokeColor="#ffffff"
android:strokeLineCap="round" />
</group>
</vector>

View File

@@ -1,7 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@drawable/ic_splash_screen_background"
tools:context=".ui.splash.SplashFragment" />

View File

@@ -33,8 +33,7 @@
android:layout_width="match_parent"
android:layout_height="match_parent"
app:defaultNavHost="true"
app:layout_behavior="@string/appbar_scrolling_view_behavior"
app:navGraph="@navigation/nav_graph" />
app:layout_behavior="@string/appbar_scrolling_view_behavior" />
</androidx.coordinatorlayout.widget.CoordinatorLayout>
<com.google.android.material.navigation.NavigationView

Binary file not shown.

Before

Width:  |  Height:  |  Size: 7.5 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.4 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 11 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 18 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 26 KiB

View File

@@ -3,7 +3,7 @@
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/nav_graph"
app:startDestination="@id/splashFragment">
tools:ignore="InvalidNavigation">
<fragment
android:id="@+id/authenticationFragment"
@@ -49,27 +49,6 @@
app:popUpTo="@id/nav_graph"
app:popUpToInclusive="true" />
</fragment>
<fragment
android:id="@+id/splashFragment"
android:name="gq.kirmanak.mealient.ui.splash.SplashFragment"
android:label="fragment_splash"
tools:layout="@layout/fragment_splash">
<action
android:id="@+id/action_splashFragment_to_disclaimerFragment"
app:destination="@id/disclaimerFragment"
app:popUpTo="@id/nav_graph"
app:popUpToInclusive="true" />
<action
android:id="@+id/action_splashFragment_to_recipesFragment"
app:destination="@id/recipesFragment"
app:popUpTo="@id/nav_graph"
app:popUpToInclusive="true" />
<action
android:id="@+id/action_splashFragment_to_baseURLFragment"
app:destination="@id/baseURLFragment"
app:popUpTo="@id/nav_graph"
app:popUpToInclusive="true" />
</fragment>
<fragment
android:id="@+id/baseURLFragment"
android:name="gq.kirmanak.mealient.ui.baseurl.BaseURLFragment"

View File

@@ -1,32 +1,38 @@
<resources>
<style name="AppTheme" parent="Theme.Material3.Light.NoActionBar">
<item name="colorPrimary">@color/md_theme_light_primary</item>
<item name="colorOnPrimary">@color/md_theme_light_onPrimary</item>
<item name="colorPrimaryContainer">@color/md_theme_light_primaryContainer</item>
<item name="colorOnPrimaryContainer">@color/md_theme_light_onPrimaryContainer</item>
<item name="colorSecondary">@color/md_theme_light_secondary</item>
<item name="colorOnSecondary">@color/md_theme_light_onSecondary</item>
<item name="colorSecondaryContainer">@color/md_theme_light_secondaryContainer</item>
<item name="colorOnSecondaryContainer">@color/md_theme_light_onSecondaryContainer</item>
<item name="colorTertiary">@color/md_theme_light_tertiary</item>
<item name="colorOnTertiary">@color/md_theme_light_onTertiary</item>
<item name="colorTertiaryContainer">@color/md_theme_light_tertiaryContainer</item>
<item name="colorOnTertiaryContainer">@color/md_theme_light_onTertiaryContainer</item>
<item name="colorError">@color/md_theme_light_error</item>
<item name="colorErrorContainer">@color/md_theme_light_errorContainer</item>
<item name="colorOnError">@color/md_theme_light_onError</item>
<item name="colorOnErrorContainer">@color/md_theme_light_onErrorContainer</item>
<item name="android:colorBackground">@color/md_theme_light_background</item>
<item name="colorOnBackground">@color/md_theme_light_onBackground</item>
<item name="colorSurface">@color/md_theme_light_surface</item>
<item name="colorOnSurface">@color/md_theme_light_onSurface</item>
<item name="colorSurfaceVariant">@color/md_theme_light_surfaceVariant</item>
<item name="colorOnSurfaceVariant">@color/md_theme_light_onSurfaceVariant</item>
<item name="colorOutline">@color/md_theme_light_outline</item>
<item name="colorOnSurfaceInverse">@color/md_theme_light_inverseOnSurface</item>
<item name="colorSurfaceInverse">@color/md_theme_light_inverseSurface</item>
<item name="colorPrimaryInverse">@color/md_theme_light_primaryInverse</item>
<item name="android:overScrollMode">never</item>
</style>
<style name="Theme.App.Starting" parent="Theme.SplashScreen">
<item name="postSplashScreenTheme">@style/AppTheme</item>
<item name="windowSplashScreenBackground">@android:color/white</item>
<item name="windowSplashScreenAnimatedIcon">@drawable/ic_splash_screen</item>
</style>
<style name="AppTheme" parent="Theme.Material3.Light.NoActionBar">
<item name="colorPrimary">@color/md_theme_light_primary</item>
<item name="colorOnPrimary">@color/md_theme_light_onPrimary</item>
<item name="colorPrimaryContainer">@color/md_theme_light_primaryContainer</item>
<item name="colorOnPrimaryContainer">@color/md_theme_light_onPrimaryContainer</item>
<item name="colorSecondary">@color/md_theme_light_secondary</item>
<item name="colorOnSecondary">@color/md_theme_light_onSecondary</item>
<item name="colorSecondaryContainer">@color/md_theme_light_secondaryContainer</item>
<item name="colorOnSecondaryContainer">@color/md_theme_light_onSecondaryContainer</item>
<item name="colorTertiary">@color/md_theme_light_tertiary</item>
<item name="colorOnTertiary">@color/md_theme_light_onTertiary</item>
<item name="colorTertiaryContainer">@color/md_theme_light_tertiaryContainer</item>
<item name="colorOnTertiaryContainer">@color/md_theme_light_onTertiaryContainer</item>
<item name="colorError">@color/md_theme_light_error</item>
<item name="colorErrorContainer">@color/md_theme_light_errorContainer</item>
<item name="colorOnError">@color/md_theme_light_onError</item>
<item name="colorOnErrorContainer">@color/md_theme_light_onErrorContainer</item>
<item name="android:colorBackground">@color/md_theme_light_background</item>
<item name="colorOnBackground">@color/md_theme_light_onBackground</item>
<item name="colorSurface">@color/md_theme_light_surface</item>
<item name="colorOnSurface">@color/md_theme_light_onSurface</item>
<item name="colorSurfaceVariant">@color/md_theme_light_surfaceVariant</item>
<item name="colorOnSurfaceVariant">@color/md_theme_light_onSurfaceVariant</item>
<item name="colorOutline">@color/md_theme_light_outline</item>
<item name="colorOnSurfaceInverse">@color/md_theme_light_inverseOnSurface</item>
<item name="colorSurfaceInverse">@color/md_theme_light_inverseSurface</item>
<item name="colorPrimaryInverse">@color/md_theme_light_primaryInverse</item>
<item name="android:overScrollMode">never</item>
</style>
</resources>

View File

@@ -6,7 +6,7 @@ import org.gradle.api.artifacts.VersionCatalogsExtension
import org.gradle.kotlin.dsl.getByType
object Versions {
const val MIN_SDK_VERSION = 23
const val MIN_SDK_VERSION = 26
const val TARGET_SDK_VERSION = 33
const val COMPILE_SDK_VERSION = 33
}

View File

@@ -31,6 +31,8 @@ appcompat = "1.5.1"
contraintLayout = "2.1.4"
# https://developer.android.com/jetpack/androidx/releases/swiperefreshlayout
swipeRefreshLayout = "1.1.0"
# https://developer.android.com/jetpack/androidx/releases/core
splashScreen = "1.0.0"
# https://developer.android.com/jetpack/androidx/releases/lifecycle
lifecycle = "2.5.1"
# https://github.com/square/retrofit/tags
@@ -118,6 +120,7 @@ androidx-coreKtx = { group = "androidx.core", name = "core-ktx", version.ref = "
androidx-appcompat = { group = "androidx.appcompat", name = "appcompat", version.ref = "appcompat" }
androidx-constraintLayout = { group = "androidx.constraintlayout", name = "constraintlayout", version.ref = "contraintLayout" }
androidx-swipeRefreshLayout = { group = "androidx.swiperefreshlayout", name = "swiperefreshlayout", version.ref = "swipeRefreshLayout" }
androidx-splashScreen = { group = "androidx.core", name = "core-splashscreen", version.ref = "splashScreen" }
androidx-paging-runtimeKtx = { group = "androidx.paging", name = "paging-runtime-ktx", version.ref = "paging" }
androidx-paging-commonKtx = { group = "androidx.paging", name = "paging-common-ktx", version.ref = "paging" }