diff --git a/app/src/main/java/org/koitharu/kotatsu/main/ui/MainActivity.kt b/app/src/main/java/org/koitharu/kotatsu/main/ui/MainActivity.kt index b8dba1b8f..03b0a90c5 100644 --- a/app/src/main/java/org/koitharu/kotatsu/main/ui/MainActivity.kt +++ b/app/src/main/java/org/koitharu/kotatsu/main/ui/MainActivity.kt @@ -15,15 +15,21 @@ import androidx.core.app.ActivityOptionsCompat import androidx.core.content.ContextCompat import androidx.core.graphics.Insets import androidx.core.util.size -import androidx.core.view.* +import androidx.core.view.ViewCompat +import androidx.core.view.WindowInsetsCompat +import androidx.core.view.isVisible +import androidx.core.view.updateLayoutParams +import androidx.core.view.updatePadding import androidx.fragment.app.Fragment import androidx.fragment.app.FragmentTransaction import androidx.fragment.app.commit import androidx.lifecycle.lifecycleScope import androidx.transition.TransitionManager -import com.google.android.material.R as materialR import com.google.android.material.appbar.AppBarLayout -import com.google.android.material.appbar.AppBarLayout.LayoutParams.* +import com.google.android.material.appbar.AppBarLayout.LayoutParams.SCROLL_FLAG_ENTER_ALWAYS +import com.google.android.material.appbar.AppBarLayout.LayoutParams.SCROLL_FLAG_NO_SCROLL +import com.google.android.material.appbar.AppBarLayout.LayoutParams.SCROLL_FLAG_SCROLL +import com.google.android.material.appbar.AppBarLayout.LayoutParams.SCROLL_FLAG_SNAP import com.google.android.material.snackbar.Snackbar import dagger.hilt.android.AndroidEntryPoint import kotlinx.coroutines.Dispatchers @@ -34,7 +40,6 @@ import org.koitharu.kotatsu.base.ui.BaseActivity import org.koitharu.kotatsu.base.ui.widgets.SlidingBottomNavigationView import org.koitharu.kotatsu.databinding.ActivityMainBinding import org.koitharu.kotatsu.details.ui.DetailsActivity -import org.koitharu.kotatsu.shelf.ui.ShelfFragment import org.koitharu.kotatsu.main.ui.owners.AppBarOwner import org.koitharu.kotatsu.main.ui.owners.BottomNavOwner import org.koitharu.kotatsu.parsers.model.Manga @@ -48,11 +53,18 @@ import org.koitharu.kotatsu.search.ui.suggestion.SearchSuggestionListener import org.koitharu.kotatsu.search.ui.suggestion.SearchSuggestionViewModel import org.koitharu.kotatsu.settings.newsources.NewSourcesDialogFragment import org.koitharu.kotatsu.settings.onboard.OnboardDialogFragment +import org.koitharu.kotatsu.shelf.ui.ShelfFragment import org.koitharu.kotatsu.suggestions.ui.SuggestionsWorker import org.koitharu.kotatsu.tracker.work.TrackWorker import org.koitharu.kotatsu.utils.VoiceInputContract -import org.koitharu.kotatsu.utils.ext.* -import kotlin.text.Typography.dagger +import org.koitharu.kotatsu.utils.ext.drawableEnd +import org.koitharu.kotatsu.utils.ext.getDisplayMessage +import org.koitharu.kotatsu.utils.ext.hideKeyboard +import org.koitharu.kotatsu.utils.ext.resolve +import org.koitharu.kotatsu.utils.ext.scaleUpActivityOptionsOf +import org.koitharu.kotatsu.utils.ext.setNavigationBarTransparentCompat +import org.koitharu.kotatsu.utils.ext.tryLaunch +import com.google.android.material.R as materialR private const val TAG_SEARCH = "search" @@ -116,6 +128,7 @@ class MainActivity : viewModel.isLoading.observe(this, this::onLoadingStateChanged) viewModel.isResumeEnabled.observe(this, this::onResumeEnabledChanged) viewModel.counters.observe(this, ::onCountersChanged) + viewModel.isFeedAvailable.observe(this, ::onFeedAvailabilityChanged) } override fun onRestoreInstanceState(savedInstanceState: Bundle) { @@ -261,6 +274,10 @@ class MainActivity : } } + private fun onFeedAvailabilityChanged(isFeedAvailable: Boolean) { + navigationDelegate.setItemVisibility(R.id.nav_feed, isFeedAvailable) + } + private fun onLoadingStateChanged(isLoading: Boolean) { binding.fab?.isEnabled = !isLoading } diff --git a/app/src/main/java/org/koitharu/kotatsu/main/ui/MainNavigationDelegate.kt b/app/src/main/java/org/koitharu/kotatsu/main/ui/MainNavigationDelegate.kt index 5b2789d6f..755df3550 100644 --- a/app/src/main/java/org/koitharu/kotatsu/main/ui/MainNavigationDelegate.kt +++ b/app/src/main/java/org/koitharu/kotatsu/main/ui/MainNavigationDelegate.kt @@ -3,6 +3,7 @@ package org.koitharu.kotatsu.main.ui import android.os.Bundle import android.view.MenuItem import androidx.annotation.IdRes +import androidx.core.view.iterator import androidx.fragment.app.Fragment import androidx.fragment.app.FragmentManager import androidx.fragment.app.FragmentTransaction @@ -62,6 +63,14 @@ class MainNavigationDelegate( } } + fun setItemVisibility(@IdRes itemId: Int, isVisible: Boolean) { + val item = navBar.menu.findItem(itemId) ?: return + item.isVisible = isVisible + if (item.isChecked && !isVisible) { + navBar.selectedItemId = firstItem()?.itemId ?: return + } + } + fun addOnFragmentChangedListener(listener: OnFragmentChangedListener) { listeners.add(listener) } @@ -96,6 +105,14 @@ class MainNavigationDelegate( listeners.forEach { it.onFragmentChanged(fragment, fromUser) } } + private fun firstItem(): MenuItem? { + val menu = navBar.menu + for (item in menu) { + if (item.isVisible) return item + } + return null + } + interface OnFragmentChangedListener { fun onFragmentChanged(fragment: Fragment, fromUser: Boolean) diff --git a/app/src/main/java/org/koitharu/kotatsu/main/ui/MainViewModel.kt b/app/src/main/java/org/koitharu/kotatsu/main/ui/MainViewModel.kt index 72ea00cf0..7d35e99cf 100644 --- a/app/src/main/java/org/koitharu/kotatsu/main/ui/MainViewModel.kt +++ b/app/src/main/java/org/koitharu/kotatsu/main/ui/MainViewModel.kt @@ -4,7 +4,6 @@ import android.util.SparseIntArray import androidx.core.util.set import androidx.lifecycle.viewModelScope import dagger.hilt.android.lifecycle.HiltViewModel -import javax.inject.Inject import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.flow.combine import org.koitharu.kotatsu.R @@ -12,6 +11,8 @@ import org.koitharu.kotatsu.base.ui.BaseViewModel import org.koitharu.kotatsu.core.db.MangaDatabase import org.koitharu.kotatsu.core.exceptions.EmptyHistoryException import org.koitharu.kotatsu.core.github.AppUpdateRepository +import org.koitharu.kotatsu.core.prefs.AppSettings +import org.koitharu.kotatsu.core.prefs.observeAsLiveData import org.koitharu.kotatsu.history.domain.HistoryRepository import org.koitharu.kotatsu.parsers.model.Manga import org.koitharu.kotatsu.sync.domain.SyncController @@ -19,6 +20,7 @@ import org.koitharu.kotatsu.tracker.domain.TrackingRepository import org.koitharu.kotatsu.utils.SingleLiveEvent import org.koitharu.kotatsu.utils.asFlowLiveData import org.koitharu.kotatsu.utils.ext.asLiveDataDistinct +import javax.inject.Inject @HiltViewModel class MainViewModel @Inject constructor( @@ -27,6 +29,7 @@ class MainViewModel @Inject constructor( private val trackingRepository: TrackingRepository, syncController: SyncController, database: MangaDatabase, + private val settings: AppSettings, ) : BaseViewModel() { val onOpenReader = SingleLiveEvent() @@ -35,6 +38,12 @@ class MainViewModel @Inject constructor( .observeHasItems() .asFlowLiveData(viewModelScope.coroutineContext + Dispatchers.Default, false) + val isFeedAvailable = settings.observeAsLiveData( + context = viewModelScope.coroutineContext + Dispatchers.Default, + key = AppSettings.KEY_TRACKER_ENABLED, + valueProducer = { isTrackerEnabled }, + ) + val counters = combine( appUpdateRepository.observeAvailableUpdate(), trackingRepository.observeUpdatedMangaCount(),