From 6dc1cf2a8c5b5568d1d3e85cc1324abb64adaf7b Mon Sep 17 00:00:00 2001 From: Rahul Patel Date: Tue, 19 May 2026 12:14:03 +0530 Subject: [PATCH] legacy: remove fragment-based screens and sheets Drops every Fragment, DialogFragment and BottomSheet in view/ui plus the flavoured SplashFragment variants. All call sites now route through compose/ui equivalents and ComposeActivity. --- .../store/view/ui/splash/SplashFragment.kt | 38 -- .../store/view/ui/account/GoogleFragment.kt | 134 ----- .../view/ui/apps/AppsContainerFragment.kt | 148 ------ .../store/view/ui/commons/BaseFragment.kt | 153 ------ .../view/ui/commons/CategoryBrowseFragment.kt | 100 ---- .../store/view/ui/commons/CategoryFragment.kt | 104 ---- .../commons/ExpandedStreamBrowseFragment.kt | 109 ----- .../store/view/ui/commons/ForYouFragment.kt | 113 ----- .../view/ui/commons/ForceRestartDialog.kt | 27 - .../view/ui/commons/MoreDialogFragment.kt | 460 ------------------ .../ui/commons/TopChartContainerFragment.kt | 102 ---- .../store/view/ui/commons/TopChartFragment.kt | 138 ------ .../view/ui/details/DevProfileFragment.kt | 107 ---- .../view/ui/games/GamesContainerFragment.kt | 147 ------ .../ui/preferences/BasePreferenceFragment.kt | 49 -- .../view/ui/preferences/SettingsFragment.kt | 71 --- .../store/view/ui/preferences/UIPreference.kt | 66 --- .../installation/InstallationPreference.kt | 81 --- .../preferences/network/NetworkPreference.kt | 81 --- .../ui/preferences/network/ProxyURLDialog.kt | 97 ---- .../preferences/updates/UpdatesPreference.kt | 161 ------ .../updates/UpdatesRestrictionsDialog.kt | 72 --- .../store/view/ui/sheets/AppMenuSheet.kt | 118 ----- .../store/view/ui/sheets/BaseDialogSheet.kt | 70 --- .../store/view/ui/sheets/DeviceMiuiSheet.kt | 56 --- .../view/ui/sheets/NetworkDialogSheet.kt | 60 --- .../ui/splash/BaseFlavouredSplashFragment.kt | 268 ---------- .../store/view/ui/updates/UpdatesFragment.kt | 234 --------- .../store/view/ui/splash/SplashFragment.kt | 25 - .../store/view/ui/splash/SplashFragment.kt | 25 - 30 files changed, 3414 deletions(-) delete mode 100644 app/src/huawei/java/com/aurora/store/view/ui/splash/SplashFragment.kt delete mode 100644 app/src/main/java/com/aurora/store/view/ui/account/GoogleFragment.kt delete mode 100644 app/src/main/java/com/aurora/store/view/ui/apps/AppsContainerFragment.kt delete mode 100644 app/src/main/java/com/aurora/store/view/ui/commons/BaseFragment.kt delete mode 100644 app/src/main/java/com/aurora/store/view/ui/commons/CategoryBrowseFragment.kt delete mode 100644 app/src/main/java/com/aurora/store/view/ui/commons/CategoryFragment.kt delete mode 100644 app/src/main/java/com/aurora/store/view/ui/commons/ExpandedStreamBrowseFragment.kt delete mode 100644 app/src/main/java/com/aurora/store/view/ui/commons/ForYouFragment.kt delete mode 100644 app/src/main/java/com/aurora/store/view/ui/commons/ForceRestartDialog.kt delete mode 100644 app/src/main/java/com/aurora/store/view/ui/commons/MoreDialogFragment.kt delete mode 100644 app/src/main/java/com/aurora/store/view/ui/commons/TopChartContainerFragment.kt delete mode 100644 app/src/main/java/com/aurora/store/view/ui/commons/TopChartFragment.kt delete mode 100644 app/src/main/java/com/aurora/store/view/ui/details/DevProfileFragment.kt delete mode 100644 app/src/main/java/com/aurora/store/view/ui/games/GamesContainerFragment.kt delete mode 100644 app/src/main/java/com/aurora/store/view/ui/preferences/BasePreferenceFragment.kt delete mode 100644 app/src/main/java/com/aurora/store/view/ui/preferences/SettingsFragment.kt delete mode 100644 app/src/main/java/com/aurora/store/view/ui/preferences/UIPreference.kt delete mode 100644 app/src/main/java/com/aurora/store/view/ui/preferences/installation/InstallationPreference.kt delete mode 100644 app/src/main/java/com/aurora/store/view/ui/preferences/network/NetworkPreference.kt delete mode 100644 app/src/main/java/com/aurora/store/view/ui/preferences/network/ProxyURLDialog.kt delete mode 100644 app/src/main/java/com/aurora/store/view/ui/preferences/updates/UpdatesPreference.kt delete mode 100644 app/src/main/java/com/aurora/store/view/ui/preferences/updates/UpdatesRestrictionsDialog.kt delete mode 100644 app/src/main/java/com/aurora/store/view/ui/sheets/AppMenuSheet.kt delete mode 100644 app/src/main/java/com/aurora/store/view/ui/sheets/BaseDialogSheet.kt delete mode 100644 app/src/main/java/com/aurora/store/view/ui/sheets/DeviceMiuiSheet.kt delete mode 100644 app/src/main/java/com/aurora/store/view/ui/sheets/NetworkDialogSheet.kt delete mode 100644 app/src/main/java/com/aurora/store/view/ui/splash/BaseFlavouredSplashFragment.kt delete mode 100644 app/src/main/java/com/aurora/store/view/ui/updates/UpdatesFragment.kt delete mode 100644 app/src/preload/java/com/aurora/store/view/ui/splash/SplashFragment.kt delete mode 100644 app/src/vanilla/java/com/aurora/store/view/ui/splash/SplashFragment.kt diff --git a/app/src/huawei/java/com/aurora/store/view/ui/splash/SplashFragment.kt b/app/src/huawei/java/com/aurora/store/view/ui/splash/SplashFragment.kt deleted file mode 100644 index 2b5f789be..000000000 --- a/app/src/huawei/java/com/aurora/store/view/ui/splash/SplashFragment.kt +++ /dev/null @@ -1,38 +0,0 @@ -/* - * Aurora Store - * Copyright (C) 2021, Rahul Kumar Patel - * - * Aurora Store is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 2 of the License, or - * (at your option) any later version. - * - * Aurora Store is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with Aurora Store. If not, see . - * - */ - -package com.aurora.store.view.ui.splash - -import com.aurora.extensions.hide -import dagger.hilt.android.AndroidEntryPoint - -@AndroidEntryPoint -class SplashFragment : BaseFlavouredSplashFragment() { - override fun attachActions() { - super.attachActions() - - binding.btnAnonymous.hide() - } - - override fun resetActions() { - super.resetActions() - - binding.btnAnonymous.hide() - } -} diff --git a/app/src/main/java/com/aurora/store/view/ui/account/GoogleFragment.kt b/app/src/main/java/com/aurora/store/view/ui/account/GoogleFragment.kt deleted file mode 100644 index 3ba18ccdb..000000000 --- a/app/src/main/java/com/aurora/store/view/ui/account/GoogleFragment.kt +++ /dev/null @@ -1,134 +0,0 @@ -/* - * Aurora Store - * Copyright (C) 2021, Rahul Kumar Patel - * - * Aurora Store is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 2 of the License, or - * (at your option) any later version. - * - * Aurora Store is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with Aurora Store. If not, see . - * - */ - -package com.aurora.store.view.ui.account - -import android.os.Build -import android.os.Bundle -import android.view.View -import android.webkit.CookieManager -import android.webkit.WebChromeClient -import android.webkit.WebSettings -import android.webkit.WebView -import android.webkit.WebViewClient -import android.widget.Toast -import androidx.core.view.isVisible -import androidx.fragment.app.activityViewModels -import androidx.lifecycle.lifecycleScope -import androidx.navigation.fragment.findNavController -import com.aurora.gplayapi.helpers.AuthHelper -import com.aurora.store.AuroraApp -import com.aurora.store.R -import com.aurora.store.data.event.AuthEvent -import com.aurora.store.databinding.FragmentGoogleBinding -import com.aurora.store.util.AC2DMUtil -import com.aurora.store.view.ui.commons.BaseFragment -import com.aurora.store.viewmodel.auth.AuthViewModel -import dagger.hilt.android.AndroidEntryPoint -import kotlinx.coroutines.launch - -@AndroidEntryPoint -class GoogleFragment : BaseFragment() { - - private val viewModel: AuthViewModel by activityViewModels() - - companion object { - const val EMBEDDED_SETUP_URL = "https://accounts.google.com/EmbeddedSetup" - const val AUTH_TOKEN = "oauth_token" - private const val JS_SCRIPT = - "(function() { return document.getElementById('profileIdentifier').innerHTML; })();" - } - - override fun onViewCreated(view: View, savedInstanceState: Bundle?) { - super.onViewCreated(view, savedInstanceState) - - val cookieManager = CookieManager.getInstance() - - binding.webview.apply { - cookieManager.removeAllCookies(null) - cookieManager.acceptThirdPartyCookies(this) - cookieManager.setAcceptThirdPartyCookies(this, true) - - webChromeClient = object : WebChromeClient() { - override fun onProgressChanged(view: WebView?, newProgress: Int) { - super.onProgressChanged(view, newProgress) - - if (newProgress != 0) { - binding.progressBar.also { - it.isVisible = newProgress < 100 - it.isIndeterminate = false - it.max = 100 - it.progress = newProgress - } - } else { - binding.progressBar.isIndeterminate = true - } - } - } - - webViewClient = object : WebViewClient() { - override fun onPageFinished(view: WebView, url: String) { - val cookies = CookieManager.getInstance().getCookie(url) - // cookies can be null if there is an error - if (cookies != null) { - val cookieMap = AC2DMUtil.parseCookieString(cookies) - if (cookieMap.isNotEmpty() && cookieMap[AUTH_TOKEN] != null) { - val oauthToken = cookieMap[AUTH_TOKEN] - evaluateJavascript(JS_SCRIPT) { - val email = it.replace("\"".toRegex(), "") - viewModel.buildAuthData(view.context, email, oauthToken) - } - } - } - } - } - - settings.apply { - allowContentAccess = true - domStorageEnabled = true - javaScriptEnabled = true - cacheMode = WebSettings.LOAD_DEFAULT - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) safeBrowsingEnabled = false - } - loadUrl(EMBEDDED_SETUP_URL) - } - - viewLifecycleOwner.lifecycleScope.launch { - AuroraApp.events.authEvent.collect { event -> - if (event is AuthEvent.GoogleLogin) onEventReceived(event) - } - } - } - - private fun onEventReceived(event: AuthEvent.GoogleLogin) { - if (event.success) { - viewModel.buildGoogleAuthData(event.email, event.token, AuthHelper.Token.AAS) - } else { - Toast.makeText( - requireContext(), - getString(R.string.toast_aas_token_failed), - Toast.LENGTH_LONG - ).show() - } - - findNavController().navigate( - GoogleFragmentDirections.actionGoogleFragmentToSplashFragment() - ) - } -} diff --git a/app/src/main/java/com/aurora/store/view/ui/apps/AppsContainerFragment.kt b/app/src/main/java/com/aurora/store/view/ui/apps/AppsContainerFragment.kt deleted file mode 100644 index d88f07fca..000000000 --- a/app/src/main/java/com/aurora/store/view/ui/apps/AppsContainerFragment.kt +++ /dev/null @@ -1,148 +0,0 @@ -/* - * Aurora Store - * Copyright (C) 2021, Rahul Kumar Patel - * - * Aurora Store is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 2 of the License, or - * (at your option) any later version. - * - * Aurora Store is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with Aurora Store. If not, see . - * - */ - -package com.aurora.store.view.ui.apps - -import android.os.Bundle -import android.view.View -import android.view.ViewGroup -import androidx.core.view.ViewCompat -import androidx.core.view.WindowInsetsCompat -import androidx.core.view.updateLayoutParams -import androidx.fragment.app.Fragment -import androidx.fragment.app.FragmentManager -import androidx.fragment.app.viewModels -import androidx.lifecycle.Lifecycle -import androidx.navigation.fragment.findNavController -import androidx.viewpager2.adapter.FragmentStateAdapter -import com.aurora.extensions.navigate -import com.aurora.store.MobileNavigationDirections -import com.aurora.store.R -import com.aurora.store.compose.navigation.Screen -import com.aurora.store.databinding.FragmentAppsGamesBinding -import com.aurora.store.util.Preferences -import com.aurora.store.view.ui.commons.BaseFragment -import com.aurora.store.view.ui.commons.CategoryFragment -import com.aurora.store.view.ui.commons.ForYouFragment -import com.aurora.store.view.ui.commons.TopChartContainerFragment -import com.aurora.store.viewmodel.apps.AppsContainerViewModel -import com.google.android.material.tabs.TabLayout -import com.google.android.material.tabs.TabLayoutMediator -import dagger.hilt.android.AndroidEntryPoint - -@AndroidEntryPoint -class AppsContainerFragment : BaseFragment() { - - private val viewModel: AppsContainerViewModel by viewModels() - - override fun onViewCreated(view: View, savedInstanceState: Bundle?) { - super.onViewCreated(view, savedInstanceState) - - // Adjust FAB margins for edgeToEdge display - ViewCompat.setOnApplyWindowInsetsListener(binding.searchFab) { _, windowInsets -> - val insets = windowInsets.getInsets(WindowInsetsCompat.Type.navigationBars()) - binding.searchFab.updateLayoutParams { - bottomMargin = insets.bottom + resources.getDimensionPixelSize(R.dimen.margin_large) - } - WindowInsetsCompat.CONSUMED - } - - // Toolbar - binding.toolbar.apply { - title = getString(R.string.title_apps) - setOnMenuItemClickListener { - when (it.itemId) { - R.id.menu_download_manager -> { - requireContext().navigate(Screen.Downloads) - } - - R.id.menu_more -> { - findNavController().navigate( - MobileNavigationDirections.actionGlobalMoreDialogFragment() - ) - } - } - true - } - } - - // ViewPager - val isForYouEnabled = Preferences.getBoolean( - requireContext(), - Preferences.PREFERENCE_FOR_YOU - ) - - binding.pager.adapter = ViewPagerAdapter( - childFragmentManager, - viewLifecycleOwner.lifecycle, - !viewModel.authProvider.isAnonymous, - isForYouEnabled - ) - - binding.pager.isUserInputEnabled = - false // Disable viewpager scroll to avoid scroll conflicts - - val tabTitles: MutableList = mutableListOf().apply { - if (isForYouEnabled) { - add(getString(R.string.tab_for_you)) - } - - add(getString(R.string.tab_top_charts)) - add(getString(R.string.tab_categories)) - } - - TabLayoutMediator( - binding.tabLayout, - binding.pager, - true - ) { tab: TabLayout.Tab, position: Int -> - tab.text = tabTitles[position] - }.attach() - - binding.searchFab.setOnClickListener { - requireContext().navigate(Screen.Search) - } - } - - override fun onDestroyView() { - binding.pager.adapter = null - super.onDestroyView() - } - - internal class ViewPagerAdapter( - fragment: FragmentManager, - lifecycle: Lifecycle, - private val isGoogleAccount: Boolean, - private val isForYouEnabled: Boolean - ) : - FragmentStateAdapter(fragment, lifecycle) { - - private val tabFragments: MutableList = mutableListOf().apply { - if (isForYouEnabled) { - add(ForYouFragment.newInstance(0)) - } - add(TopChartContainerFragment.newInstance(0)) - add(CategoryFragment.newInstance(0)) - } - - override fun createFragment(position: Int): Fragment = tabFragments[position] - - override fun getItemCount(): Int = tabFragments.size - } -} diff --git a/app/src/main/java/com/aurora/store/view/ui/commons/BaseFragment.kt b/app/src/main/java/com/aurora/store/view/ui/commons/BaseFragment.kt deleted file mode 100644 index ccd05d12f..000000000 --- a/app/src/main/java/com/aurora/store/view/ui/commons/BaseFragment.kt +++ /dev/null @@ -1,153 +0,0 @@ -/* - * Aurora Store - * Copyright (C) 2021, Rahul Kumar Patel - * - * Aurora Store is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 2 of the License, or - * (at your option) any later version. - * - * Aurora Store is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with Aurora Store. If not, see . - * - */ - -package com.aurora.store.view.ui.commons - -import android.os.Bundle -import android.util.Log -import android.view.LayoutInflater -import android.view.View -import android.view.ViewGroup -import androidx.fragment.app.Fragment -import androidx.navigation.fragment.findNavController -import androidx.viewbinding.ViewBinding -import com.airbnb.epoxy.EpoxyRecyclerView -import com.aurora.extensions.TAG -import com.aurora.extensions.navigate -import com.aurora.gplayapi.data.models.Category -import com.aurora.gplayapi.data.models.StreamCluster -import com.aurora.store.MobileNavigationDirections -import com.aurora.store.compose.navigation.Screen -import com.aurora.store.data.model.MinimalApp -import com.aurora.store.data.providers.PermissionProvider -import java.lang.reflect.ParameterizedType - -abstract class BaseFragment : Fragment() { - - lateinit var permissionProvider: PermissionProvider - - protected open var viewBindingType: ViewBindingType? = null - protected val binding get() = viewBindingType!! - - override fun onCreate(savedInstanceState: Bundle?) { - super.onCreate(savedInstanceState) - permissionProvider = PermissionProvider(this) - } - - @Suppress("UNCHECKED_CAST") - override fun onCreateView( - inflater: LayoutInflater, - container: ViewGroup?, - savedInstanceState: Bundle? - ): View? { - val type = (javaClass.genericSuperclass as ParameterizedType) - .actualTypeArguments[0] as Class - val method = type.getMethod( - "inflate", - LayoutInflater::class.java, - ViewGroup::class.java, - Boolean::class.java - ) - viewBindingType = method.invoke(null, inflater, container, false) as ViewBindingType - - return binding.root - } - - override fun onDestroy() { - permissionProvider.unregister() - super.onDestroy() - } - - override fun onDestroyView() { - cleanupRecyclerViews(findAllRecyclerViews(requireView())) - viewBindingType = null - super.onDestroyView() - } - - fun openDetailsFragment(packageName: String) { - requireContext().navigate( - Screen.AppDetails(packageName) - ) - } - - fun openCategoryBrowseFragment(category: Category) { - findNavController().navigate( - MobileNavigationDirections.actionGlobalCategoryBrowseFragment( - category.title, - category.browseUrl - ) - ) - } - - fun openStreamBrowseFragment(browseUrl: String, title: String = "") { - if (browseUrl.lowercase().contains("expanded")) { - findNavController().navigate( - MobileNavigationDirections.actionGlobalExpandedStreamBrowseFragment( - title, - browseUrl - ) - ) - } else if (browseUrl.lowercase().contains("developer")) { - findNavController().navigate( - MobileNavigationDirections.actionGlobalDevProfileFragment( - browseUrl.substringAfter("developer-"), - title - ) - ) - } - } - - fun openStreamBrowseFragment(streamCluster: StreamCluster) { - requireContext().navigate(Screen.StreamBrowse(streamCluster)) - } - - fun openAppMenuSheet(app: MinimalApp) { - findNavController().navigate(MobileNavigationDirections.actionGlobalAppMenuSheet(app)) - } - - fun openGMSWarningFragment() { - // TODO: FIX ME - } - - private fun cleanupRecyclerViews(recyclerViews: List) { - recyclerViews.forEach { recyclerView -> - runCatching { - recyclerView.adapter?.let { - recyclerView.swapAdapter(it, true) - } - }.onFailure { - Log.e(TAG, "Failed to cleanup RecyclerView", it) - } - } - } - - private fun findAllRecyclerViews(view: View): List { - val recyclerViews = mutableListOf() - - if (view is EpoxyRecyclerView) { - recyclerViews.add(view) - } else if (view is ViewGroup) { - for (i in 0 until view.childCount) { - recyclerViews.addAll(findAllRecyclerViews(view.getChildAt(i))) - } - } - - return recyclerViews - } -} diff --git a/app/src/main/java/com/aurora/store/view/ui/commons/CategoryBrowseFragment.kt b/app/src/main/java/com/aurora/store/view/ui/commons/CategoryBrowseFragment.kt deleted file mode 100644 index 319631470..000000000 --- a/app/src/main/java/com/aurora/store/view/ui/commons/CategoryBrowseFragment.kt +++ /dev/null @@ -1,100 +0,0 @@ -/* - * Aurora Store - * Copyright (C) 2021, Rahul Kumar Patel - * - * Aurora Store is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 2 of the License, or - * (at your option) any later version. - * - * Aurora Store is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with Aurora Store. If not, see . - * - */ - -package com.aurora.store.view.ui.commons - -import android.os.Bundle -import android.view.View -import androidx.fragment.app.activityViewModels -import androidx.navigation.fragment.findNavController -import androidx.navigation.fragment.navArgs -import com.aurora.gplayapi.data.models.App -import com.aurora.gplayapi.data.models.StreamBundle -import com.aurora.gplayapi.data.models.StreamCluster -import com.aurora.store.data.model.ViewState -import com.aurora.store.data.model.ViewState.Loading.getDataAs -import com.aurora.store.databinding.FragmentGenericWithToolbarBinding -import com.aurora.store.view.custom.recycler.EndlessRecyclerOnScrollListener -import com.aurora.store.view.epoxy.controller.CategoryCarouselController -import com.aurora.store.view.epoxy.controller.GenericCarouselController -import com.aurora.store.viewmodel.subcategory.CategoryStreamViewModel -import dagger.hilt.android.AndroidEntryPoint - -@AndroidEntryPoint -class CategoryBrowseFragment : - BaseFragment(), - GenericCarouselController.Callbacks { - private val args: CategoryBrowseFragmentArgs by navArgs() - private val viewModel: CategoryStreamViewModel by activityViewModels() - - private var streamBundle: StreamBundle? = StreamBundle() - - override fun onViewCreated(view: View, savedInstanceState: Bundle?) { - super.onViewCreated(view, savedInstanceState) - - val genericCarouselController = CategoryCarouselController(this) - - // Toolbar - binding.toolbar.apply { - title = args.title - setNavigationOnClickListener { findNavController().navigateUp() } - } - - // RecyclerView - binding.recycler.setController(genericCarouselController) - binding.recycler.addOnScrollListener(object : EndlessRecyclerOnScrollListener() { - override fun onLoadMore(currentPage: Int) { - viewModel.observe(args.browseUrl) - } - }) - - viewModel.getStreamBundle(args.browseUrl) - viewModel.liveData.observe(viewLifecycleOwner) { - when (it) { - is ViewState.Loading -> { - genericCarouselController.setData(null) - } - - is ViewState.Success<*> -> { - val stash = it.getDataAs>() - streamBundle = stash[args.browseUrl] - - genericCarouselController.setData(streamBundle) - } - - else -> {} - } - } - } - - override fun onHeaderClicked(streamCluster: StreamCluster) { - openStreamBrowseFragment(streamCluster) - } - - override fun onClusterScrolled(streamCluster: StreamCluster) { - viewModel.observeCluster(args.browseUrl, streamCluster) - } - - override fun onAppClick(app: App) { - openDetailsFragment(app.packageName) - } - - override fun onAppLongClick(app: App) { - } -} diff --git a/app/src/main/java/com/aurora/store/view/ui/commons/CategoryFragment.kt b/app/src/main/java/com/aurora/store/view/ui/commons/CategoryFragment.kt deleted file mode 100644 index a81c6c344..000000000 --- a/app/src/main/java/com/aurora/store/view/ui/commons/CategoryFragment.kt +++ /dev/null @@ -1,104 +0,0 @@ -/* - * Aurora Store - * Copyright (C) 2021, Rahul Kumar Patel - * - * Aurora Store is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 2 of the License, or - * (at your option) any later version. - * - * Aurora Store is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with Aurora Store. If not, see . - * - */ - -package com.aurora.store.view.ui.commons - -import android.os.Bundle -import android.view.View -import androidx.fragment.app.viewModels -import com.aurora.Constants -import com.aurora.gplayapi.data.models.Category -import com.aurora.store.CategoryStash -import com.aurora.store.data.model.ViewState -import com.aurora.store.data.model.ViewState.Empty.getDataAs -import com.aurora.store.databinding.FragmentGenericRecyclerBinding -import com.aurora.store.view.epoxy.views.CategoryViewModel_ -import com.aurora.store.view.epoxy.views.shimmer.AppListViewShimmerModel_ -import com.aurora.store.viewmodel.category.CategoryViewModel -import dagger.hilt.android.AndroidEntryPoint - -@AndroidEntryPoint -class CategoryFragment : BaseFragment() { - private val viewModel: CategoryViewModel by viewModels() - - companion object { - @JvmStatic - fun newInstance(pageType: Int): CategoryFragment = CategoryFragment().apply { - arguments = Bundle().apply { - putInt(Constants.PAGE_TYPE, pageType) - } - } - } - - override fun onViewCreated(view: View, savedInstanceState: Bundle?) { - super.onViewCreated(view, savedInstanceState) - - var pageType = 0 - val bundle = arguments - if (bundle != null) { - pageType = bundle.getInt(Constants.PAGE_TYPE, 0) - } - - when (pageType) { - 0 -> viewModel.getCategoryList(Category.Type.APPLICATION) - 1 -> viewModel.getCategoryList(Category.Type.GAME) - } - - val categoryType = when (pageType) { - 1 -> Category.Type.GAME - else -> Category.Type.APPLICATION - } - - viewModel.liveData.observe(viewLifecycleOwner) { - when (it) { - is ViewState.Success<*> -> { - val stash = it.getDataAs() - updateController(stash[categoryType]) - } - - else -> { - updateController(emptyList()) - } - } - } - } - - fun updateController(categories: List?) { - binding.recycler.withModels { - if (categories == null) { - for (i in 1..10) { - add( - AppListViewShimmerModel_() - .id(i) - ) - } - } else { - setFilterDuplicates(true) - categories.forEach { - add( - CategoryViewModel_() - .id(it.title) - .category(it) - .click { _ -> openCategoryBrowseFragment(it) } - ) - } - } - } - } -} diff --git a/app/src/main/java/com/aurora/store/view/ui/commons/ExpandedStreamBrowseFragment.kt b/app/src/main/java/com/aurora/store/view/ui/commons/ExpandedStreamBrowseFragment.kt deleted file mode 100644 index 667cb6da0..000000000 --- a/app/src/main/java/com/aurora/store/view/ui/commons/ExpandedStreamBrowseFragment.kt +++ /dev/null @@ -1,109 +0,0 @@ -/* - * Aurora Store - * Copyright (C) 2021, Rahul Kumar Patel - * - * Aurora Store is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 2 of the License, or - * (at your option) any later version. - * - * Aurora Store is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with Aurora Store. If not, see . - * - */ - -package com.aurora.store.view.ui.commons - -import android.os.Bundle -import android.view.View -import androidx.fragment.app.viewModels -import androidx.navigation.fragment.findNavController -import androidx.navigation.fragment.navArgs -import com.aurora.gplayapi.data.models.StreamCluster -import com.aurora.store.databinding.FragmentGenericWithToolbarBinding -import com.aurora.store.view.custom.recycler.EndlessRecyclerOnScrollListener -import com.aurora.store.view.epoxy.views.AppProgressViewModel_ -import com.aurora.store.view.epoxy.views.app.AppListViewModel_ -import com.aurora.store.view.epoxy.views.shimmer.AppListViewShimmerModel_ -import com.aurora.store.viewmodel.browse.ExpandedStreamBrowseViewModel -import dagger.hilt.android.AndroidEntryPoint - -@AndroidEntryPoint -class ExpandedStreamBrowseFragment : BaseFragment() { - private val args: ExpandedStreamBrowseFragmentArgs by navArgs() - private val viewModel: ExpandedStreamBrowseViewModel by viewModels() - - private lateinit var endlessRecyclerOnScrollListener: EndlessRecyclerOnScrollListener - private lateinit var cluster: StreamCluster - - override fun onViewCreated(view: View, savedInstanceState: Bundle?) { - super.onViewCreated(view, savedInstanceState) - - // Toolbar - binding.toolbar.apply { - title = args.title - setNavigationOnClickListener { findNavController().navigateUp() } - } - - viewModel.liveData.observe(viewLifecycleOwner) { - if (!::cluster.isInitialized) attachRecycler() - cluster = it - - updateController(cluster) - updateTitle(cluster) - } - - viewModel.getInitialCluster(args.expandedStreamUrl) - updateController(null) - } - - private fun updateTitle(streamCluster: StreamCluster) { - if (streamCluster.clusterTitle.isNotEmpty()) { - binding.toolbar.title = streamCluster.clusterTitle - } - } - - private fun attachRecycler() { - endlessRecyclerOnScrollListener = object : EndlessRecyclerOnScrollListener() { - override fun onLoadMore(currentPage: Int) { - viewModel.next() - } - } - binding.recycler.addOnScrollListener(endlessRecyclerOnScrollListener) - } - - private fun updateController(streamCluster: StreamCluster?) { - binding.recycler.withModels { - setFilterDuplicates(true) - if (streamCluster == null) { - for (i in 1..6) { - add( - AppListViewShimmerModel_() - .id(i) - ) - } - } else { - streamCluster.clusterAppList.forEach { - add( - AppListViewModel_() - .id(it.packageName.hashCode()) - .app(it) - .click { _ -> openDetailsFragment(it.packageName) } - ) - } - - if (streamCluster.hasNext()) { - add( - AppProgressViewModel_() - .id("progress") - ) - } - } - } - } -} diff --git a/app/src/main/java/com/aurora/store/view/ui/commons/ForYouFragment.kt b/app/src/main/java/com/aurora/store/view/ui/commons/ForYouFragment.kt deleted file mode 100644 index e8171bb74..000000000 --- a/app/src/main/java/com/aurora/store/view/ui/commons/ForYouFragment.kt +++ /dev/null @@ -1,113 +0,0 @@ -/* - * Aurora Store - * Copyright (C) 2021, Rahul Kumar Patel - * - * Aurora Store is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 2 of the License, or - * (at your option) any later version. - * - * Aurora Store is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with Aurora Store. If not, see . - * - */ - -package com.aurora.store.view.ui.commons - -import android.os.Bundle -import android.view.View -import androidx.fragment.app.activityViewModels -import com.aurora.Constants -import com.aurora.gplayapi.data.models.App -import com.aurora.gplayapi.data.models.StreamBundle -import com.aurora.gplayapi.data.models.StreamCluster -import com.aurora.gplayapi.helpers.contracts.StreamContract.Category -import com.aurora.gplayapi.helpers.contracts.StreamContract.Type -import com.aurora.store.HomeStash -import com.aurora.store.data.model.ViewState -import com.aurora.store.data.model.ViewState.Loading.getDataAs -import com.aurora.store.databinding.FragmentForYouBinding -import com.aurora.store.view.custom.recycler.EndlessRecyclerOnScrollListener -import com.aurora.store.view.epoxy.controller.GenericCarouselController -import com.aurora.store.viewmodel.homestream.StreamViewModel -import dagger.hilt.android.AndroidEntryPoint - -@AndroidEntryPoint -class ForYouFragment : - BaseFragment(), - GenericCarouselController.Callbacks { - private val viewModel: StreamViewModel by activityViewModels() - - private var category: Category = Category.APPLICATION - private var streamBundle: StreamBundle? = StreamBundle() - - companion object { - @JvmStatic - fun newInstance(pageType: Int): ForYouFragment = ForYouFragment().apply { - arguments = Bundle().apply { - putInt(Constants.PAGE_TYPE, pageType) - } - } - } - - override fun onViewCreated(view: View, savedInstanceState: Bundle?) { - super.onViewCreated(view, savedInstanceState) - - val genericCarouselController = GenericCarouselController(this) - - var pageType = 0 - val bundle = arguments - if (bundle != null) { - pageType = bundle.getInt(Constants.PAGE_TYPE, 0) - } - - category = if (pageType == 0) Category.APPLICATION else Category.GAME - - binding.recycler.setController(genericCarouselController) - binding.recycler.addOnScrollListener( - object : EndlessRecyclerOnScrollListener(visibleThreshold = 4) { - override fun onLoadMore(currentPage: Int) { - viewModel.observe(category, Type.HOME) - } - } - ) - - viewModel.getStreamBundle(category, Type.HOME) - viewModel.liveData.observe(viewLifecycleOwner) { - when (it) { - is ViewState.Loading -> { - genericCarouselController.setData(null) - } - - is ViewState.Success<*> -> { - val stash = it.getDataAs() - streamBundle = stash[category] - - genericCarouselController.setData(streamBundle) - } - - else -> {} - } - } - } - - override fun onHeaderClicked(streamCluster: StreamCluster) { - openStreamBrowseFragment(streamCluster) - } - - override fun onClusterScrolled(streamCluster: StreamCluster) { - viewModel.observeCluster(category, streamCluster) - } - - override fun onAppClick(app: App) { - openDetailsFragment(app.packageName) - } - - override fun onAppLongClick(app: App) { - } -} diff --git a/app/src/main/java/com/aurora/store/view/ui/commons/ForceRestartDialog.kt b/app/src/main/java/com/aurora/store/view/ui/commons/ForceRestartDialog.kt deleted file mode 100644 index 01aeed464..000000000 --- a/app/src/main/java/com/aurora/store/view/ui/commons/ForceRestartDialog.kt +++ /dev/null @@ -1,27 +0,0 @@ -package com.aurora.store.view.ui.commons - -import android.app.Dialog -import android.os.Bundle -import androidx.fragment.app.DialogFragment -import com.aurora.store.R -import com.google.android.material.dialog.MaterialAlertDialogBuilder -import com.jakewharton.processphoenix.ProcessPhoenix -import dagger.hilt.android.AndroidEntryPoint - -@AndroidEntryPoint -class ForceRestartDialog : DialogFragment() { - - override fun onCreateDialog(savedInstanceState: Bundle?): Dialog = - MaterialAlertDialogBuilder(requireContext()) - .setTitle(R.string.force_restart_title) - .setMessage(R.string.force_restart_summary) - .setPositiveButton(getString(R.string.action_restart)) { _, _ -> - ProcessPhoenix.triggerRebirth(requireContext()) - } - .create() - - override fun onResume() { - super.onResume() - dialog?.setCancelable(false) - } -} diff --git a/app/src/main/java/com/aurora/store/view/ui/commons/MoreDialogFragment.kt b/app/src/main/java/com/aurora/store/view/ui/commons/MoreDialogFragment.kt deleted file mode 100644 index c6809ffc3..000000000 --- a/app/src/main/java/com/aurora/store/view/ui/commons/MoreDialogFragment.kt +++ /dev/null @@ -1,460 +0,0 @@ -package com.aurora.store.view.ui.commons - -import android.app.Dialog -import android.content.Context -import android.os.Bundle -import androidx.annotation.DrawableRes -import androidx.annotation.IdRes -import androidx.annotation.StringRes -import androidx.compose.foundation.BorderStroke -import androidx.compose.foundation.Image -import androidx.compose.foundation.background -import androidx.compose.foundation.clickable -import androidx.compose.foundation.layout.Arrangement -import androidx.compose.foundation.layout.Column -import androidx.compose.foundation.layout.Row -import androidx.compose.foundation.layout.fillMaxWidth -import androidx.compose.foundation.layout.padding -import androidx.compose.foundation.layout.requiredSize -import androidx.compose.foundation.layout.wrapContentWidth -import androidx.compose.foundation.rememberScrollState -import androidx.compose.foundation.shape.CircleShape -import androidx.compose.foundation.shape.RoundedCornerShape -import androidx.compose.foundation.verticalScroll -import androidx.compose.material3.MaterialTheme -import androidx.compose.material3.OutlinedButton -import androidx.compose.material3.Text -import androidx.compose.material3.TextButton -import androidx.compose.runtime.Composable -import androidx.compose.runtime.getValue -import androidx.compose.runtime.mutableStateOf -import androidx.compose.runtime.remember -import androidx.compose.runtime.setValue -import androidx.compose.ui.Alignment -import androidx.compose.ui.Modifier -import androidx.compose.ui.draw.clip -import androidx.compose.ui.graphics.Color -import androidx.compose.ui.graphics.ColorFilter -import androidx.compose.ui.layout.ContentScale -import androidx.compose.ui.platform.ComposeView -import androidx.compose.ui.platform.LocalContext -import androidx.compose.ui.platform.ViewCompositionStrategy -import androidx.compose.ui.res.painterResource -import androidx.compose.ui.res.stringResource -import androidx.compose.ui.text.font.FontWeight -import androidx.compose.ui.text.style.TextAlign -import androidx.compose.ui.text.style.TextOverflow -import androidx.compose.ui.unit.dp -import androidx.compose.ui.unit.sp -import androidx.compose.ui.util.fastForEach -import androidx.fragment.app.DialogFragment -import androidx.fragment.app.viewModels -import androidx.navigation.fragment.findNavController -import coil3.compose.AsyncImage -import coil3.request.ImageRequest -import coil3.request.crossfade -import com.aurora.Constants -import com.aurora.Constants.URL_TOS -import com.aurora.extensions.browse -import com.aurora.extensions.getStyledAttributeColor -import com.aurora.extensions.navigate -import com.aurora.extensions.setAppTheme -import com.aurora.store.MR -import com.aurora.store.R -import com.aurora.store.compose.navigation.Screen -import com.aurora.store.compose.theme.AuroraTheme -import com.aurora.store.util.Preferences -import com.aurora.store.viewmodel.commons.MoreViewModel -import com.google.android.material.dialog.MaterialAlertDialogBuilder -import dagger.hilt.android.AndroidEntryPoint - -@AndroidEntryPoint -class MoreDialogFragment : DialogFragment() { - - private val viewModel: MoreViewModel by viewModels() - - private var primaryColor: Color = Color.White - private var onPrimaryColor: Color = Color.Black - private var secondaryColor: Color = Color.White - private var onSecondaryColor: Color = Color.Black - - private abstract class Option( - @StringRes open val title: Int, - @DrawableRes open val icon: Int - ) - - private data class ViewOption( - override val title: Int, - override val icon: Int, - @IdRes val destinationID: Int - ) : Option(title, icon) - - private data class ComposeOption( - override val title: Int, - override val icon: Int, - val screen: Screen - ) : Option(title, icon) - - override fun onCreateDialog(savedInstanceState: Bundle?): Dialog = - MaterialAlertDialogBuilder(requireContext()) - .setView(customDialogView(requireContext())) - .create() - - private fun customDialogView(context: Context): ComposeView = ComposeView(context).apply { - setViewCompositionStrategy(ViewCompositionStrategy.DisposeOnViewTreeLifecycleDestroyed) - setContent { - AuroraTheme { - primaryColor = - Color(requireContext().getStyledAttributeColor(MR.colorSurface)) - onPrimaryColor = - Color(requireContext().getStyledAttributeColor(MR.colorOnSurface)) - secondaryColor = - Color(requireContext().getStyledAttributeColor(MR.colorSecondaryContainer)) - onSecondaryColor = - Color( - requireContext().getStyledAttributeColor(MR.colorOnSecondaryContainer) - ) - - Column( - modifier = Modifier - .fillMaxWidth() - .background(color = primaryColor) - .verticalScroll(rememberScrollState()) - .padding(10.dp), - verticalArrangement = Arrangement.spacedBy( - 4.dp, - Alignment.CenterVertically - ) - ) { - AppBar(onBackgroundColor = onPrimaryColor) - AccountHeader( - backgroundColor = secondaryColor, - onBackgroundColor = onSecondaryColor - ) - Column( - modifier = Modifier - .clip( - RoundedCornerShape( - topStart = 2.dp, - topEnd = 2.dp, - bottomStart = 25.dp, - bottomEnd = 25.dp - ) - ) - .background(color = secondaryColor) - ) { - getOptions().fastForEach { option -> - OptionItem( - option = option, - tintColor = onPrimaryColor, - textColor = onSecondaryColor, - onClick = { - when (option) { - is ViewOption -> { - findNavController().navigate(option.destinationID) - } - - is ComposeOption -> context.navigate(option.screen) - } - } - ) - } - } - getExtraOptions().fastForEach { option -> - OptionItem( - option = option, - tintColor = onPrimaryColor, - textColor = onPrimaryColor, - onClick = { - when (option) { - is ViewOption -> { - findNavController().navigate(option.destinationID) - } - - is ComposeOption -> context.navigate(option.screen) - } - } - ) - } - Footer(onPrimaryColor) - } - } - } - } - - @Composable - fun AppBar(onBackgroundColor: Color) { - Row( - verticalAlignment = Alignment.CenterVertically, - horizontalArrangement = Arrangement.SpaceBetween, - modifier = Modifier - .fillMaxWidth() - .padding(4.dp, 10.dp, 4.dp, 10.dp) - ) { - ThreeStateIconButton(tint = onBackgroundColor) - Text( - modifier = Modifier.wrapContentWidth(), - text = stringResource(id = R.string.app_name), - style = MaterialTheme.typography.titleMedium, - color = onBackgroundColor, - textAlign = TextAlign.Center - ) - - Image( - painter = painterResource(id = R.drawable.ic_cancel), - contentDescription = stringResource(id = R.string.action_cancel), - modifier = Modifier.clickable { - findNavController().navigateUp() - }, - colorFilter = ColorFilter.tint(onBackgroundColor) - ) - } - } - - @Composable - fun Footer(tintColor: Color) { - Row( - modifier = Modifier.fillMaxWidth(), - verticalAlignment = Alignment.CenterVertically, - horizontalArrangement = Arrangement.spacedBy(2.dp, Alignment.CenterHorizontally) - ) { - TextButton(onClick = { requireContext().browse(Constants.URL_POLICY) }) { - Text( - text = stringResource(id = R.string.privacy_policy_title), - fontWeight = FontWeight.Light, - color = tintColor, - fontSize = 12.sp, - maxLines = 1, - overflow = TextOverflow.Ellipsis - ) - } - Text(text = "•", color = tintColor) - TextButton(onClick = { requireContext().browse(URL_TOS) }) { - Text( - text = stringResource(id = R.string.menu_terms), - fontWeight = FontWeight.Light, - color = tintColor, - fontSize = 12.sp, - maxLines = 1, - overflow = TextOverflow.Ellipsis - ) - } - } - } - - @Composable - private fun AccountHeader(backgroundColor: Color, onBackgroundColor: Color = Color.White) { - Column( - modifier = Modifier - .fillMaxWidth() - .clip( - RoundedCornerShape( - topStart = 25.dp, - topEnd = 25.dp, - bottomStart = 2.dp, - bottomEnd = 2.dp - ) - ) - .background(color = backgroundColor) - .padding(20.dp), - verticalArrangement = Arrangement.spacedBy(15.dp), - horizontalAlignment = Alignment.CenterHorizontally - ) { - Row( - modifier = Modifier - .fillMaxWidth(), - verticalAlignment = Alignment.CenterVertically, - horizontalArrangement = Arrangement.spacedBy(15.dp, Alignment.Start) - ) { - AsyncImage( - model = ImageRequest.Builder(LocalContext.current) - .data( - if (viewModel.authProvider.isAnonymous) { - R.mipmap.ic_launcher - } else { - viewModel.authProvider.authData?.userProfile?.artwork?.url - } - ) - .crossfade(true) - .build(), - contentDescription = stringResource(id = R.string.title_account_manager), - placeholder = painterResource(R.drawable.ic_account), - contentScale = ContentScale.Crop, - modifier = Modifier - .requiredSize(36.dp) - .clip(CircleShape) - ) - Column( - verticalArrangement = Arrangement.Top, - horizontalAlignment = Alignment.Start - ) { - Text( - text = if (viewModel.authProvider.isAnonymous) { - stringResource(R.string.account_anonymous) - } else { - viewModel.authProvider.authData?.userProfile?.name - ?: stringResource(R.string.status_unavailable) - }, - fontWeight = FontWeight.Normal, - color = onBackgroundColor, - fontSize = 15.sp, - maxLines = 1, - overflow = TextOverflow.Ellipsis - ) - Text( - text = if (viewModel.authProvider.isAnonymous) { - stringResource(R.string.account_anonymous_email) - } else { - viewModel.authProvider.authData?.userProfile?.email - ?: stringResource(R.string.status_unavailable) - }, - fontWeight = FontWeight.Light, - color = onBackgroundColor, - fontSize = 14.sp, - maxLines = 1, - overflow = TextOverflow.Ellipsis - ) - } - } - OutlinedButton( - onClick = { requireContext().navigate(Screen.Accounts) }, - shape = RoundedCornerShape(12.dp), - border = BorderStroke( - 1.dp, - Color( - requireContext().getStyledAttributeColor( - androidx.appcompat.R.attr.colorControlHighlight - ) - ) - ), - modifier = Modifier.fillMaxWidth() - ) { - Text( - text = stringResource(id = R.string.manage_account), - color = onBackgroundColor, - fontWeight = FontWeight.Normal, - maxLines = 1, - overflow = TextOverflow.Ellipsis - ) - } - } - } - - @Composable - private fun OptionItem( - option: Option, - tintColor: Color = Color.Blue, - textColor: Color = Color.Black, - onClick: () -> Unit - ) { - Row( - modifier = Modifier - .fillMaxWidth() - .clickable { onClick() } - .padding(12.dp), - verticalAlignment = Alignment.CenterVertically, - horizontalArrangement = Arrangement.spacedBy(8.dp, Alignment.Start) - ) { - Image( - painter = painterResource(id = option.icon), - contentDescription = stringResource(id = option.title), - colorFilter = ColorFilter.tint(color = tintColor), - modifier = Modifier - .padding(horizontal = 10.dp) - .requiredSize(23.dp) - ) - Text( - modifier = Modifier.fillMaxWidth(), - text = stringResource(id = option.title), - color = textColor, - fontSize = 14.sp, - maxLines = 1, - overflow = TextOverflow.Ellipsis - ) - } - } - - @Composable - fun ThreeStateIconButton(tint: Color = Color.White) { - var currentState by remember { - mutableStateOf( - Preferences.getInteger( - requireContext(), - Preferences.PREFERENCE_THEME_STYLE - ).let { - State.entries.getOrNull(it) - } ?: State.Auto - ) - } - - val iconRes = when (currentState) { - State.Light -> R.drawable.ic_light - State.Dark -> R.drawable.ic_dark - else -> R.drawable.ic_auto - } - - Image( - painter = painterResource(id = iconRes), - contentDescription = null, - modifier = Modifier.clickable { - currentState = when (currentState) { - State.Light -> State.Dark - State.Dark -> State.Auto - State.Auto -> State.Light - } - - Preferences.putInteger( - requireContext(), - Preferences.PREFERENCE_THEME_STYLE, - currentState.value - ) - - setAppTheme(currentState.value) - findNavController().navigateUp() - }, - colorFilter = ColorFilter.tint(tint) - ) - } - - enum class State(val value: Int) { - Auto(0), - Light(1), - Dark(2) - } - - private fun getOptions(): List