Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

More fixes when restoring app from background #527

Merged
merged 2 commits into from
Jan 28, 2025
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 2 additions & 1 deletion app/src/main/AndroidManifest.xml
Original file line number Diff line number Diff line change
Expand Up @@ -35,7 +35,8 @@
android:banner="@mipmap/stash_logo"
android:exported="true"
android:icon="@mipmap/stash_logo"
android:logo="@mipmap/stash_logo">
android:logo="@mipmap/stash_logo"
android:launchMode="singleTop">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
Expand Down
124 changes: 63 additions & 61 deletions app/src/main/java/com/github/damontecres/stashapp/FilterFragment.kt
Original file line number Diff line number Diff line change
Expand Up @@ -90,11 +90,6 @@ class FilterFragment :
NullPresenter(dataType),
),
)

sortButtonManager =
SortButtonManager(StashServer.getCurrentServerVersion()) { sortAndDirection ->
stashGridViewModel.setFilter(sortAndDirection)
}
}

override fun onViewCreated(
Expand All @@ -118,76 +113,83 @@ class FilterFragment :
fragment.requestFocus = true
fragment.init(dataType)

val filter =
if (stashGridViewModel.filterArgs.isInitialized) {
stashGridViewModel.filterArgs.value!!
} else if (savedInstanceState != null) {
savedInstanceState.getFilterArgs(STATE_FILTER) ?: dest.filterArgs
} else {
stashGridViewModel.setFilter(dest.filterArgs)
dest.filterArgs
serverViewModel.currentServer.observe(viewLifecycleOwner) {
sortButtonManager =
SortButtonManager(StashServer.getCurrentServerVersion()) { sortAndDirection ->
stashGridViewModel.setFilter(sortAndDirection)
}
val filter =
if (stashGridViewModel.filterArgs.isInitialized) {
stashGridViewModel.filterArgs.value!!
} else if (savedInstanceState != null) {
val restoredFilter =
savedInstanceState.getFilterArgs(STATE_FILTER) ?: dest.filterArgs
stashGridViewModel.setFilter(restoredFilter)
restoredFilter
} else {
stashGridViewModel.setFilter(dest.filterArgs)
dest.filterArgs
}

filterButton = view.findViewById(R.id.filter_button)
filterButton.setOnClickListener {
Toast
.makeText(requireContext(), "Filters not loaded yet!", Toast.LENGTH_SHORT)
.show()
}
val onFocusChangeListener = StashOnFocusChangeListener(requireContext())
filterButton.onFocusChangeListener = onFocusChangeListener
lifecycleScope.launch(StashCoroutineExceptionHandler()) {
populateSavedFilters(dataType)
}

filterButton = view.findViewById(R.id.filter_button)
filterButton.setOnClickListener {
Toast.makeText(requireContext(), "Filters not loaded yet!", Toast.LENGTH_SHORT).show()
}
val onFocusChangeListener = StashOnFocusChangeListener(requireContext())
filterButton.onFocusChangeListener = onFocusChangeListener
buttonBar = view.findViewById(R.id.button_bar)

buttonBar = view.findViewById(R.id.button_bar)
sortButton = view.findViewById(R.id.sort_button)
sortButton.onFocusChangeListener = onFocusChangeListener
playAllButton = view.findViewById(R.id.play_all_button)
playAllButton.onFocusChangeListener = onFocusChangeListener
titleTextView = view.findViewById(R.id.list_title)
titleTextView.text = filter.name ?: getString(dataType.pluralStringId)

sortButton = view.findViewById(R.id.sort_button)
sortButton.onFocusChangeListener = onFocusChangeListener
playAllButton = view.findViewById(R.id.play_all_button)
playAllButton.onFocusChangeListener = onFocusChangeListener
titleTextView = view.findViewById(R.id.list_title)
titleTextView.text = filter.name ?: getString(dataType.pluralStringId)
searchEditText = view.findViewById(R.id.search_edit_text)
stashGridViewModel.setupSearch(searchEditText)

searchEditText = view.findViewById(R.id.search_edit_text)
stashGridViewModel.setupSearch(searchEditText)
headerTransitionHelper = TitleTransitionHelper(view as ViewGroup, buttonBar)
stashGridViewModel.currentPosition.observe(viewLifecycleOwner) { position ->
val shouldShowTitle = position < fragment.numberOfColumns
headerTransitionHelper.showTitle(shouldShowTitle)
}

headerTransitionHelper = TitleTransitionHelper(view as ViewGroup, buttonBar)
stashGridViewModel.currentPosition.observe(viewLifecycleOwner) { position ->
val shouldShowTitle = position < fragment.numberOfColumns
headerTransitionHelper.showTitle(shouldShowTitle)
}
sortButtonManager.setUpSortButton(
sortButton,
filter.dataType,
filter.sortAndDirection,
)

sortButtonManager.setUpSortButton(
sortButton,
filter.dataType,
filter.sortAndDirection,
)
val playAllListener =
PlayAllOnClickListener(serverViewModel.navigationManager, dataType) {
FilterAndPosition(stashGridViewModel.filterArgs.value!!, 0)
}
playAllButton.setOnClickListener(playAllListener)

val playAllListener =
PlayAllOnClickListener(serverViewModel.navigationManager, dataType) {
FilterAndPosition(stashGridViewModel.filterArgs.value!!, 0)
if (filter.dataType.supportsPlaylists) {
playAllButton.visibility = View.VISIBLE
} else if (filter.dataType == DataType.IMAGE) {
playAllButton.visibility = View.VISIBLE
playAllButton.text = getString(R.string.play_slideshow)
}
playAllButton.setOnClickListener(playAllListener)

if (filter.dataType.supportsPlaylists) {
playAllButton.visibility = View.VISIBLE
} else if (filter.dataType == DataType.IMAGE) {
playAllButton.visibility = View.VISIBLE
playAllButton.text = getString(R.string.play_slideshow)
}

val initialRequestFocus = fragment.requestFocus
if (initialRequestFocus) {
stashGridViewModel.searchBarFocus.observe(viewLifecycleOwner) { hasFocus ->
// If the search text has focus, then the fragment shouldn't take it
fragment.requestFocus = !hasFocus
val initialRequestFocus = fragment.requestFocus
if (initialRequestFocus) {
stashGridViewModel.searchBarFocus.observe(viewLifecycleOwner) { hasFocus ->
// If the search text has focus, then the fragment shouldn't take it
fragment.requestFocus = !hasFocus
}
}
}
}

override fun onResume() {
super.onResume()
lifecycleScope.launch(StashCoroutineExceptionHandler()) {
populateSavedFilters(dataType)
}
}

private suspend fun populateSavedFilters(dataType: DataType) {
val server = StashServer.requireCurrentServer()
val savedFilters =
Expand Down
142 changes: 71 additions & 71 deletions app/src/main/java/com/github/damontecres/stashapp/GalleryFragment.kt
Original file line number Diff line number Diff line change
Expand Up @@ -24,91 +24,91 @@ import com.github.damontecres.stashapp.views.models.GalleryViewModel
class GalleryFragment : TabbedFragment(DataType.GALLERY.name) {
private val viewModel: GalleryViewModel by viewModels()

override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
viewModel.init(requireArguments())
}

override fun onViewCreated(
view: View,
savedInstanceState: Bundle?,
) {
super.onViewCreated(view, savedInstanceState)

viewModel.item.observe(viewLifecycleOwner) { gallery ->
if (gallery == null) {
Toast
.makeText(
requireContext(),
"Gallery '${viewModel.itemId}' not found",
Toast.LENGTH_LONG,
).show()
serverViewModel.navigationManager.goBack()
return@observe
}
tabViewModel.title.value = gallery.name
serverViewModel.currentServer.observe(viewLifecycleOwner) {
viewModel.init(requireArguments())
}
serverViewModel
.withLiveData(viewModel.item)
.observe(viewLifecycleOwner) { (server, gallery) ->
if (gallery == null) {
Toast
.makeText(
requireContext(),
"Gallery '${viewModel.itemId}' not found",
Toast.LENGTH_LONG,
).show()
serverViewModel.navigationManager.goBack()
return@observe
}
tabViewModel.title.value = gallery.name

val galleries =
Optional.present(
MultiCriterionInput(
value = Optional.present(listOf(gallery.id)),
modifier = CriterionModifier.INCLUDES_ALL,
),
)
if (!tabViewModel.tabs.isInitialized) {
tabViewModel.tabs.value =
listOf(
StashFragmentPagerAdapter.PagerEntry(getString(R.string.stashapp_details)) {
GalleryDetailsFragment()
},
StashFragmentPagerAdapter.PagerEntry(DataType.IMAGE) {
StashGridControlsFragment(
dataType = DataType.IMAGE,
findFilter =
serverViewModel
.requireServer()
.serverPreferences
.getDefaultFilter(
PageFilterKey.GALLERY_IMAGES,
).findFilter,
objectFilter = ImageFilterType(galleries = galleries),
)
},
StashFragmentPagerAdapter.PagerEntry(DataType.SCENE) {
StashGridControlsFragment(
dataType = DataType.SCENE,
objectFilter = SceneFilterType(galleries = galleries),
)
},
StashFragmentPagerAdapter.PagerEntry(DataType.PERFORMER) {
val presenter =
ClassPresenterSelector().addClassPresenter(
PerformerData::class.java,
PerformerInScenePresenter(gallery.date),
val galleries =
Optional.present(
MultiCriterionInput(
value = Optional.present(listOf(gallery.id)),
modifier = CriterionModifier.INCLUDES_ALL,
),
)
if (!tabViewModel.tabs.isInitialized) {
tabViewModel.tabs.value =
listOf(
StashFragmentPagerAdapter.PagerEntry(getString(R.string.stashapp_details)) {
GalleryDetailsFragment()
},
StashFragmentPagerAdapter.PagerEntry(DataType.IMAGE) {
StashGridControlsFragment(
dataType = DataType.IMAGE,
findFilter =
serverViewModel
.requireServer()
.serverPreferences
.getDefaultFilter(
PageFilterKey.GALLERY_IMAGES,
).findFilter,
objectFilter = ImageFilterType(galleries = galleries),
)
},
StashFragmentPagerAdapter.PagerEntry(DataType.SCENE) {
StashGridControlsFragment(
dataType = DataType.SCENE,
objectFilter = SceneFilterType(galleries = galleries),
)
val fragment =
},
StashFragmentPagerAdapter.PagerEntry(DataType.PERFORMER) {
val presenter =
ClassPresenterSelector().addClassPresenter(
PerformerData::class.java,
PerformerInScenePresenter(gallery.date),
)
val fragment =
StashGridControlsFragment(
filterArgs =
FilterArgs(
DataType.PERFORMER,
override = DataSupplierOverride.GalleryPerformer(gallery.id),
),
)
fragment.presenterSelector = presenter
fragment
},
StashFragmentPagerAdapter.PagerEntry(DataType.TAG) {
StashGridControlsFragment(
filterArgs =
FilterArgs(
DataType.PERFORMER,
override = DataSupplierOverride.GalleryPerformer(gallery.id),
DataType.TAG,
override = DataSupplierOverride.GalleryTag(gallery.id),
),
)
fragment.presenterSelector = presenter
fragment
},
StashFragmentPagerAdapter.PagerEntry(DataType.TAG) {
StashGridControlsFragment(
filterArgs =
FilterArgs(
DataType.TAG,
override = DataSupplierOverride.GalleryTag(gallery.id),
),
)
},
).filter { it.title in getUiTabs(requireContext(), DataType.GALLERY) }
},
).filter { it.title in getUiTabs(requireContext(), DataType.GALLERY) }
}
}
}
}

companion object {
Expand Down
Loading