Merge pull request #82 from kirmanak/splash-screen
Improve splash screen
This commit is contained in:
@@ -77,6 +77,7 @@ dependencies {
|
||||
implementation(libs.androidx.navigation.uiKtx)
|
||||
|
||||
implementation(libs.androidx.coreKtx)
|
||||
implementation(libs.androidx.splashScreen)
|
||||
|
||||
implementation(libs.androidx.appcompat)
|
||||
|
||||
|
||||
@@ -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"
|
||||
|
||||
@@ -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)
|
||||
}
|
||||
})
|
||||
}
|
||||
@@ -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 {
|
||||
|
||||
@@ -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) {
|
||||
|
||||
@@ -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)
|
||||
}
|
||||
}
|
||||
@@ -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()
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
465
app/src/main/res/drawable-v31/ic_splash_screen.xml
Normal file
465
app/src/main/res/drawable-v31/ic_splash_screen.xml
Normal file
File diff suppressed because one or more lines are too long
5
app/src/main/res/drawable/ic_splash_screen.xml
Normal file
5
app/src/main/res/drawable/ic_splash_screen.xml
Normal 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>
|
||||
@@ -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>
|
||||
|
||||
35
app/src/main/res/drawable/ic_splash_screen_foreground.xml
Normal file
35
app/src/main/res/drawable/ic_splash_screen_foreground.xml
Normal 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>
|
||||
@@ -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" />
|
||||
@@ -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 |
@@ -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"
|
||||
|
||||
@@ -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>
|
||||
@@ -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
|
||||
}
|
||||
|
||||
@@ -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" }
|
||||
|
||||
Reference in New Issue
Block a user