incognito does not require app restart

This commit is contained in:
Finnley Somdahl 2023-12-27 10:30:50 -06:00
parent a8711241a7
commit 42c3b42c05
9 changed files with 121 additions and 60 deletions

View file

@ -2,6 +2,7 @@ package ani.dantotsu.home
import android.animation.ObjectAnimator import android.animation.ObjectAnimator
import android.annotation.SuppressLint import android.annotation.SuppressLint
import android.content.Context
import android.content.Intent import android.content.Intent
import android.os.Build import android.os.Build
import android.os.Bundle import android.os.Bundle
@ -26,6 +27,7 @@ import ani.dantotsu.connections.anilist.Anilist
import ani.dantotsu.connections.anilist.AnilistAnimeViewModel import ani.dantotsu.connections.anilist.AnilistAnimeViewModel
import ani.dantotsu.connections.anilist.SearchResults import ani.dantotsu.connections.anilist.SearchResults
import ani.dantotsu.connections.anilist.getUserId import ani.dantotsu.connections.anilist.getUserId
import ani.dantotsu.currContext
import ani.dantotsu.databinding.FragmentAnimeBinding import ani.dantotsu.databinding.FragmentAnimeBinding
import ani.dantotsu.loadData import ani.dantotsu.loadData
import ani.dantotsu.media.MediaAdaptor import ani.dantotsu.media.MediaAdaptor
@ -47,16 +49,17 @@ import kotlin.math.min
class AnimeFragment : Fragment() { class AnimeFragment : Fragment() {
private var _binding: FragmentAnimeBinding? = null private var _binding: FragmentAnimeBinding? = null
private val binding get() = _binding!! private val binding get() = _binding!!
private lateinit var animePageAdapter: AnimePageAdapter
private var uiSettings: UserInterfaceSettings = private var uiSettings: UserInterfaceSettings =
loadData("ui_settings") ?: UserInterfaceSettings() loadData("ui_settings") ?: UserInterfaceSettings()
val model: AnilistAnimeViewModel by activityViewModels() val model: AnilistAnimeViewModel by activityViewModels()
override fun onCreateView( override fun onCreateView(
inflater: LayoutInflater, inflater: LayoutInflater,
container: ViewGroup?, container: ViewGroup?,
savedInstanceState: Bundle? savedInstanceState: Bundle?
): View { ): View {
_binding = FragmentAnimeBinding.inflate(inflater, container, false) _binding = FragmentAnimeBinding.inflate(inflater, container, false)
return binding.root return binding.root
@ -78,11 +81,11 @@ class AnimeFragment : Fragment() {
if (displayCutout != null) { if (displayCutout != null) {
if (displayCutout.boundingRects.size > 0) { if (displayCutout.boundingRects.size > 0) {
height = max( height = max(
statusBarHeight, statusBarHeight,
min( min(
displayCutout.boundingRects[0].width(), displayCutout.boundingRects[0].width(),
displayCutout.boundingRects[0].height() displayCutout.boundingRects[0].height()
) )
) )
} }
} }
@ -95,18 +98,18 @@ class AnimeFragment : Fragment() {
binding.animePageRecyclerView.updatePaddingRelative(bottom = navBarHeight + 160f.px) binding.animePageRecyclerView.updatePaddingRelative(bottom = navBarHeight + 160f.px)
val animePageAdapter = AnimePageAdapter() animePageAdapter = AnimePageAdapter()
var loading = true var loading = true
if (model.notSet) { if (model.notSet) {
model.notSet = false model.notSet = false
model.searchResults = SearchResults( model.searchResults = SearchResults(
"ANIME", "ANIME",
isAdult = false, isAdult = false,
onList = false, onList = false,
results = mutableListOf(), results = mutableListOf(),
hasNextPage = true, hasNextPage = true,
sort = Anilist.sortBy[1] sort = Anilist.sortBy[1]
) )
} }
val popularAdaptor = MediaAdaptor(1, model.searchResults.results, requireActivity()) val popularAdaptor = MediaAdaptor(1, model.searchResults.results, requireActivity())
@ -174,7 +177,7 @@ class AnimeFragment : Fragment() {
} }
binding.animePageRecyclerView.addOnScrollListener(object : binding.animePageRecyclerView.addOnScrollListener(object :
RecyclerView.OnScrollListener() { RecyclerView.OnScrollListener() {
override fun onScrolled(v: RecyclerView, dx: Int, dy: Int) { override fun onScrolled(v: RecyclerView, dx: Int, dy: Int) {
if (!v.canScrollVertically(1)) { if (!v.canScrollVertically(1)) {
if (model.searchResults.hasNextPage && model.searchResults.results.isNotEmpty() && !loading) { if (model.searchResults.hasNextPage && model.searchResults.results.isNotEmpty() && !loading) {
@ -214,19 +217,19 @@ class AnimeFragment : Fragment() {
model.getTrending().observe(viewLifecycleOwner) { model.getTrending().observe(viewLifecycleOwner) {
if (it != null) { if (it != null) {
animePageAdapter.updateTrending( animePageAdapter.updateTrending(
MediaAdaptor( MediaAdaptor(
if (uiSettings.smallView) 3 else 2, if (uiSettings.smallView) 3 else 2,
it, it,
requireActivity(), requireActivity(),
viewPager = animePageAdapter.trendingViewPager viewPager = animePageAdapter.trendingViewPager
) )
) )
animePageAdapter.updateAvatar() animePageAdapter.updateAvatar()
} }
} }
} }
binding.animePageScrollTop.translationY = binding.animePageScrollTop.translationY =
-(navBarHeight + bottomBar.height + bottomBar.marginBottom).toFloat() -(navBarHeight + bottomBar.height + bottomBar.marginBottom).toFloat()
} }
} }
@ -244,13 +247,13 @@ class AnimeFragment : Fragment() {
animePageAdapter.onSeasonLongClick = { i -> animePageAdapter.onSeasonLongClick = { i ->
val (season, year) = Anilist.currentSeasons[i] val (season, year) = Anilist.currentSeasons[i]
ContextCompat.startActivity( ContextCompat.startActivity(
requireContext(), requireContext(),
Intent(requireContext(), SearchActivity::class.java) Intent(requireContext(), SearchActivity::class.java)
.putExtra("type", "ANIME") .putExtra("type", "ANIME")
.putExtra("season", season) .putExtra("season", season)
.putExtra("seasonYear", year.toString()) .putExtra("seasonYear", year.toString())
.putExtra("search", true), .putExtra("search", true),
null null
) )
true true
} }
@ -277,6 +280,12 @@ class AnimeFragment : Fragment() {
override fun onResume() { override fun onResume() {
if (!model.loaded) Refresh.activity[this.hashCode()]!!.postValue(true) if (!model.loaded) Refresh.activity[this.hashCode()]!!.postValue(true)
if (animePageAdapter.trendingViewPager != null) {
animePageAdapter.setIncognito()
binding.root.requestApplyInsets()
binding.root.requestLayout()
}
super.onResume() super.onResume()
} }
} }

View file

@ -157,6 +157,19 @@ class AnimePageAdapter : RecyclerView.Adapter<AnimePageAdapter.AnimePageViewHold
trendingViewPager!!.updateLayoutParams { height += statusBarHeight } trendingViewPager!!.updateLayoutParams { height += statusBarHeight }
} }
fun setIncognito() {
val incognito = currContext()?.getSharedPreferences("Dantotsu", Context.MODE_PRIVATE)
?.getBoolean("incognito", false) ?: false
if(incognito) {
binding.incognitoTextView.visibility = View.VISIBLE
if (!uiSettings.immersiveMode) {
binding.root.fitsSystemWindows = true
}
} else {
binding.incognitoTextView.visibility = View.GONE
}
}
fun updateTrending(adaptor: MediaAdaptor) { fun updateTrending(adaptor: MediaAdaptor) {
binding.animeTrendingProgressBar.visibility = View.GONE binding.animeTrendingProgressBar.visibility = View.GONE
binding.animeTrendingViewPager.adapter = adaptor binding.animeTrendingViewPager.adapter = adaptor

View file

@ -10,6 +10,7 @@ import android.os.Bundle
import android.view.LayoutInflater import android.view.LayoutInflater
import android.view.View import android.view.View
import android.view.ViewGroup import android.view.ViewGroup
import android.view.WindowManager
import android.view.animation.LayoutAnimationController import android.view.animation.LayoutAnimationController
import androidx.core.content.ContextCompat import androidx.core.content.ContextCompat
import androidx.core.view.updateLayoutParams import androidx.core.view.updateLayoutParams
@ -371,6 +372,23 @@ class HomeFragment : Fragment() {
override fun onResume() { override fun onResume() {
if (!model.loaded) Refresh.activity[1]!!.postValue(true) if (!model.loaded) Refresh.activity[1]!!.postValue(true)
val incognito = currContext()?.getSharedPreferences("Dantotsu", Context.MODE_PRIVATE)
?.getBoolean("incognito", false) ?: false
if(incognito) {
val uiSettings = loadData<UserInterfaceSettings>("ui_settings") ?: UserInterfaceSettings()
binding.incognitoTextView.visibility = View.VISIBLE
if (!uiSettings.immersiveMode) {
binding.root.fitsSystemWindows = true
//holy deprecation
binding.root.systemUiVisibility = View.SYSTEM_UI_FLAG_LAYOUT_STABLE or
View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN or
View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION
binding.root.requestApplyInsets()
binding.root.requestLayout()
}
} else {
binding.incognitoTextView.visibility = View.GONE
}
super.onResume() super.onResume()
} }
} }

View file

@ -2,6 +2,7 @@ package ani.dantotsu.home
import android.animation.ObjectAnimator import android.animation.ObjectAnimator
import android.annotation.SuppressLint import android.annotation.SuppressLint
import android.content.Context
import android.os.Build import android.os.Build
import android.os.Bundle import android.os.Bundle
import android.view.LayoutInflater import android.view.LayoutInflater
@ -24,6 +25,7 @@ import ani.dantotsu.connections.anilist.Anilist
import ani.dantotsu.connections.anilist.AnilistMangaViewModel import ani.dantotsu.connections.anilist.AnilistMangaViewModel
import ani.dantotsu.connections.anilist.SearchResults import ani.dantotsu.connections.anilist.SearchResults
import ani.dantotsu.connections.anilist.getUserId import ani.dantotsu.connections.anilist.getUserId
import ani.dantotsu.currContext
import ani.dantotsu.databinding.FragmentMangaBinding import ani.dantotsu.databinding.FragmentMangaBinding
import ani.dantotsu.loadData import ani.dantotsu.loadData
import ani.dantotsu.media.MediaAdaptor import ani.dantotsu.media.MediaAdaptor
@ -43,16 +45,17 @@ import kotlin.math.min
class MangaFragment : Fragment() { class MangaFragment : Fragment() {
private var _binding: FragmentMangaBinding? = null private var _binding: FragmentMangaBinding? = null
private val binding get() = _binding!! private val binding get() = _binding!!
private lateinit var mangaPageAdapter: MangaPageAdapter
private var uiSettings: UserInterfaceSettings = private var uiSettings: UserInterfaceSettings =
loadData("ui_settings") ?: UserInterfaceSettings() loadData("ui_settings") ?: UserInterfaceSettings()
val model: AnilistMangaViewModel by activityViewModels() val model: AnilistMangaViewModel by activityViewModels()
override fun onCreateView( override fun onCreateView(
inflater: LayoutInflater, inflater: LayoutInflater,
container: ViewGroup?, container: ViewGroup?,
savedInstanceState: Bundle? savedInstanceState: Bundle?
): View { ): View {
_binding = FragmentMangaBinding.inflate(inflater, container, false) _binding = FragmentMangaBinding.inflate(inflater, container, false)
return binding.root return binding.root
@ -73,11 +76,11 @@ class MangaFragment : Fragment() {
if (displayCutout != null) { if (displayCutout != null) {
if (displayCutout.boundingRects.size > 0) { if (displayCutout.boundingRects.size > 0) {
height = max( height = max(
statusBarHeight, statusBarHeight,
min( min(
displayCutout.boundingRects[0].width(), displayCutout.boundingRects[0].width(),
displayCutout.boundingRects[0].height() displayCutout.boundingRects[0].height()
) )
) )
} }
} }
@ -90,23 +93,23 @@ class MangaFragment : Fragment() {
binding.mangaPageRecyclerView.updatePaddingRelative(bottom = navBarHeight + 160f.px) binding.mangaPageRecyclerView.updatePaddingRelative(bottom = navBarHeight + 160f.px)
val mangaPageAdapter = MangaPageAdapter() mangaPageAdapter = MangaPageAdapter()
var loading = true var loading = true
if (model.notSet) { if (model.notSet) {
model.notSet = false model.notSet = false
model.searchResults = SearchResults( model.searchResults = SearchResults(
"MANGA", "MANGA",
isAdult = false, isAdult = false,
onList = false, onList = false,
results = arrayListOf(), results = arrayListOf(),
hasNextPage = true, hasNextPage = true,
sort = Anilist.sortBy[1] sort = Anilist.sortBy[1]
) )
} }
val popularAdaptor = MediaAdaptor(1, model.searchResults.results, requireActivity()) val popularAdaptor = MediaAdaptor(1, model.searchResults.results, requireActivity())
val progressAdaptor = ProgressAdapter(searched = model.searched) val progressAdaptor = ProgressAdapter(searched = model.searched)
binding.mangaPageRecyclerView.adapter = binding.mangaPageRecyclerView.adapter =
ConcatAdapter(mangaPageAdapter, popularAdaptor, progressAdaptor) ConcatAdapter(mangaPageAdapter, popularAdaptor, progressAdaptor)
val layout = LinearLayoutManager(requireContext()) val layout = LinearLayoutManager(requireContext())
binding.mangaPageRecyclerView.layoutManager = layout binding.mangaPageRecyclerView.layoutManager = layout
@ -132,7 +135,7 @@ class MangaFragment : Fragment() {
} }
binding.mangaPageRecyclerView.addOnScrollListener(object : binding.mangaPageRecyclerView.addOnScrollListener(object :
RecyclerView.OnScrollListener() { RecyclerView.OnScrollListener() {
override fun onScrolled(v: RecyclerView, dx: Int, dy: Int) { override fun onScrolled(v: RecyclerView, dx: Int, dy: Int) {
if (!v.canScrollVertically(1)) { if (!v.canScrollVertically(1)) {
if (model.searchResults.hasNextPage && model.searchResults.results.isNotEmpty() && !loading) { if (model.searchResults.hasNextPage && model.searchResults.results.isNotEmpty() && !loading) {
@ -172,19 +175,19 @@ class MangaFragment : Fragment() {
model.getTrending().observe(viewLifecycleOwner) { model.getTrending().observe(viewLifecycleOwner) {
if (it != null) { if (it != null) {
mangaPageAdapter.updateTrending( mangaPageAdapter.updateTrending(
MediaAdaptor( MediaAdaptor(
if (uiSettings.smallView) 3 else 2, if (uiSettings.smallView) 3 else 2,
it, it,
requireActivity(), requireActivity(),
viewPager = mangaPageAdapter.trendingViewPager viewPager = mangaPageAdapter.trendingViewPager
) )
) )
mangaPageAdapter.updateAvatar() mangaPageAdapter.updateAvatar()
} }
} }
} }
binding.mangaPageScrollTop.translationY = binding.mangaPageScrollTop.translationY =
-(navBarHeight + bottomBar.height + bottomBar.marginBottom).toFloat() -(navBarHeight + bottomBar.height + bottomBar.marginBottom).toFloat()
} }
} }
@ -251,6 +254,12 @@ class MangaFragment : Fragment() {
override fun onResume() { override fun onResume() {
if (!model.loaded) Refresh.activity[this.hashCode()]!!.postValue(true) if (!model.loaded) Refresh.activity[this.hashCode()]!!.postValue(true)
//make sure mangaPageAdapter is initialized
if (mangaPageAdapter.trendingViewPager != null) {
mangaPageAdapter.setIncognito()
binding.root.requestApplyInsets()
binding.root.requestLayout()
}
super.onResume() super.onResume()
} }

View file

@ -150,6 +150,19 @@ class MangaPageAdapter : RecyclerView.Adapter<MangaPageAdapter.MangaPageViewHold
trendingViewPager!!.updateLayoutParams { height += statusBarHeight } trendingViewPager!!.updateLayoutParams { height += statusBarHeight }
} }
fun setIncognito() {
val incognito = currContext()?.getSharedPreferences("Dantotsu", Context.MODE_PRIVATE)
?.getBoolean("incognito", false) ?: false
if(incognito) {
binding.incognitoTextView.visibility = View.VISIBLE
if (!uiSettings.immersiveMode) {
binding.root.fitsSystemWindows = true
}
} else {
binding.incognitoTextView.visibility = View.GONE
}
}
fun updateTrending(adaptor: MediaAdaptor) { fun updateTrending(adaptor: MediaAdaptor) {
binding.mangaTrendingProgressBar.visibility = View.GONE binding.mangaTrendingProgressBar.visibility = View.GONE
binding.mangaTrendingViewPager.adapter = adaptor binding.mangaTrendingViewPager.adapter = adaptor

View file

@ -413,7 +413,6 @@ class SettingsActivity : AppCompatActivity(), SimpleDialog.OnDialogResultListen
binding.settingsIncognito.setOnCheckedChangeListener { _, isChecked -> binding.settingsIncognito.setOnCheckedChangeListener { _, isChecked ->
getSharedPreferences("Dantotsu", Context.MODE_PRIVATE).edit() getSharedPreferences("Dantotsu", Context.MODE_PRIVATE).edit()
.putBoolean("incognito", isChecked).apply() .putBoolean("incognito", isChecked).apply()
restartApp()
} }
var previousStart: View = when (uiSettings.defaultStartUpTab) { var previousStart: View = when (uiSettings.defaultStartUpTab) {

View file

@ -24,7 +24,7 @@
android:text="Incognito Mode" android:text="Incognito Mode"
android:fontFamily="@font/poppins_bold" android:fontFamily="@font/poppins_bold"
android:textSize="15sp" android:textSize="15sp"
android:textColor="#4f2dbd" android:textColor="?attr/colorPrimary"
android:layout_gravity="bottom|center_horizontal" android:layout_gravity="bottom|center_horizontal"
android:padding="8dp" android:padding="8dp"
android:visibility="gone"/> android:visibility="gone"/>

View file

@ -16,7 +16,7 @@
android:text="Incognito Mode" android:text="Incognito Mode"
android:fontFamily="@font/poppins_bold" android:fontFamily="@font/poppins_bold"
android:textSize="15sp" android:textSize="15sp"
android:textColor="#4f2dbd" android:textColor="?attr/colorPrimary"
android:layout_gravity="bottom|center_horizontal" android:layout_gravity="bottom|center_horizontal"
android:background="#00FFFFFF" android:background="#00FFFFFF"
android:padding="8dp" android:padding="8dp"

View file

@ -16,7 +16,7 @@
android:text="Incognito Mode" android:text="Incognito Mode"
android:fontFamily="@font/poppins_bold" android:fontFamily="@font/poppins_bold"
android:textSize="15sp" android:textSize="15sp"
android:textColor="#4f2dbd" android:textColor="?attr/colorPrimary"
android:layout_gravity="bottom|center_horizontal" android:layout_gravity="bottom|center_horizontal"
android:background="#00FFFFFF" android:background="#00FFFFFF"
android:padding="8dp" android:padding="8dp"