Remove splash screen after TimelineTab lazy column is populated

This commit is contained in:
Shinokuni 2024-11-21 19:19:46 +01:00
parent cfcc5c48c7
commit 3e76597b8f
5 changed files with 39 additions and 11 deletions

View File

@ -13,7 +13,6 @@ import androidx.compose.runtime.collectAsState
import androidx.compose.runtime.getValue
import androidx.core.splashscreen.SplashScreen.Companion.installSplashScreen
import androidx.lifecycle.lifecycleScope
import androidx.preference.PreferenceManager
import cafe.adriel.voyager.core.annotation.ExperimentalVoyagerApi
import cafe.adriel.voyager.navigator.Navigator
import cafe.adriel.voyager.navigator.NavigatorDisposeBehavior
@ -24,7 +23,6 @@ import com.readrops.app.home.HomeScreen
import com.readrops.app.repositories.BaseRepository
import com.readrops.app.sync.SyncWorker
import com.readrops.app.timelime.TimelineTab
import com.readrops.app.util.Migrations
import com.readrops.app.util.Preferences
import com.readrops.app.util.theme.ReadropsTheme
import com.readrops.db.Database
@ -41,19 +39,14 @@ import org.koin.core.parameter.parametersOf
class MainActivity : ComponentActivity(), KoinComponent {
var ready = false
@OptIn(ExperimentalVoyagerApi::class)
override fun onCreate(savedInstanceState: Bundle?) {
installSplashScreen()
val splashScreen = installSplashScreen()
super.onCreate(savedInstanceState)
runBlocking {
Migrations.upgrade(
appPreferences = get(),
encryptedPreferences = get(),
oldPreferences = PreferenceManager.getDefaultSharedPreferences(this@MainActivity),
database = get(),
)
}
splashScreen.setKeepOnScreenCondition { !ready }
val screenModel = get<AccountSelectionScreenModel>()
val accountExists = screenModel.accountExists()

View File

@ -6,6 +6,7 @@ import android.app.NotificationManager
import android.content.Intent
import android.os.Build
import androidx.core.app.NotificationManagerCompat
import androidx.preference.PreferenceManager
import coil3.ImageLoader
import coil3.PlatformContext
import coil3.SingletonImageLoader
@ -16,7 +17,9 @@ import coil3.request.crossfade
import com.readrops.api.apiModule
import com.readrops.app.util.CrashActivity
import com.readrops.app.util.FeverFaviconFetcher
import com.readrops.app.util.Migrations
import com.readrops.db.dbModule
import kotlinx.coroutines.runBlocking
import okhttp3.OkHttpClient
import org.koin.android.ext.android.get
import org.koin.android.ext.koin.androidContext
@ -52,6 +55,15 @@ open class ReadropsApp : Application(), KoinComponent, SingletonImageLoader.Fact
}
createNotificationChannels()
runBlocking {
Migrations.upgrade(
appPreferences = get(),
encryptedPreferences = get(),
oldPreferences = PreferenceManager.getDefaultSharedPreferences(this@ReadropsApp),
database = get(),
)
}
}
override fun newImageLoader(context: PlatformContext): ImageLoader {

View File

@ -38,6 +38,7 @@ import cafe.adriel.voyager.navigator.LocalNavigator
import cafe.adriel.voyager.navigator.currentOrThrow
import com.readrops.api.utils.ApiUtils
import com.readrops.app.BuildConfig
import com.readrops.app.MainActivity
import com.readrops.app.R
import com.readrops.app.account.OPMLImportProgressDialog
import com.readrops.app.account.credentials.AccountCredentialsScreen
@ -78,6 +79,11 @@ class AccountSelectionScreen : AndroidScreen() {
)
}
// remove splash screen when opening the app with no account available
LaunchedEffect(Unit) {
(context as MainActivity).ready = true
}
LaunchedEffect(state.exception) {
if (state.exception != null) {
snackbarHostState.showSnackbar(ErrorMessage.get(state.exception!!, context))

View File

@ -32,6 +32,7 @@ import androidx.compose.ui.Modifier
import androidx.compose.ui.graphics.vector.rememberVectorPainter
import androidx.compose.ui.hapticfeedback.HapticFeedbackType
import androidx.compose.ui.input.nestedscroll.nestedScroll
import androidx.compose.ui.platform.LocalContext
import androidx.compose.ui.platform.LocalHapticFeedback
import androidx.compose.ui.platform.LocalUriHandler
import androidx.compose.ui.res.painterResource
@ -43,6 +44,7 @@ import cafe.adriel.voyager.navigator.LocalNavigator
import cafe.adriel.voyager.navigator.currentOrThrow
import cafe.adriel.voyager.navigator.tab.Tab
import cafe.adriel.voyager.navigator.tab.TabOptions
import com.readrops.app.MainActivity
import com.readrops.app.R
import com.readrops.app.feeds.dialogs.FeedModalBottomSheet
import com.readrops.app.feeds.dialogs.UpdateFeedDialog
@ -74,6 +76,7 @@ object FeedTab : Tab {
val haptic = LocalHapticFeedback.current
val uriHandler = LocalUriHandler.current
val navigator = LocalNavigator.currentOrThrow
val context = LocalContext.current
val screenModel = koinScreenModel<FeedScreenModel>()
val state by screenModel.feedsState.collectAsStateWithLifecycle()
@ -82,6 +85,11 @@ object FeedTab : Tab {
val topAppBarScrollBehavior =
TopAppBarDefaults.pinnedScrollBehavior(rememberTopAppBarState())
// remove splash screen when opening the app from <new feed> intent
LaunchedEffect(Unit) {
(context as MainActivity).ready = true
}
LaunchedEffect(state.error) {
if (state.error != null) {
snackbarHostState.showSnackbar((state.error!!))

View File

@ -56,6 +56,7 @@ import cafe.adriel.voyager.navigator.LocalNavigator
import cafe.adriel.voyager.navigator.currentOrThrow
import cafe.adriel.voyager.navigator.tab.Tab
import cafe.adriel.voyager.navigator.tab.TabOptions
import com.readrops.app.MainActivity
import com.readrops.app.R
import com.readrops.app.item.ItemScreen
import com.readrops.app.timelime.drawer.TimelineDrawer
@ -118,6 +119,14 @@ object TimelineTab : Tab {
}
}
// remove splash screen when opening the app
LaunchedEffect(items.isLoading()) {
val activity = (context as MainActivity)
if (!items.isLoading() && !activity.ready) {
activity.ready = true
}
}
val drawerState = rememberDrawerState(
initialValue = DrawerValue.Closed,
confirmStateChange = {