diff --git a/app/src/main/java/foundation/e/apps/ui/home/HomeFragment.kt b/app/src/main/java/foundation/e/apps/ui/home/HomeFragment.kt index 3992a2b68be98e002b0f007a52e0c14502f3a4ed..4ad17d2122360f4dc837c65c7e1d85053a184c6d 100644 --- a/app/src/main/java/foundation/e/apps/ui/home/HomeFragment.kt +++ b/app/src/main/java/foundation/e/apps/ui/home/HomeFragment.kt @@ -1,6 +1,5 @@ /* - * Apps Quickly and easily install Android apps onto your device! - * Copyright (C) 2021 E FOUNDATION + * Copyright (C) 2021-2025 e Foundation * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -14,29 +13,25 @@ * * You should have received a copy of the GNU General Public License * along with this program. If not, see . + * */ package foundation.e.apps.ui.home import android.os.Bundle import android.view.View -import androidx.appcompat.app.AlertDialog +import androidx.fragment.app.Fragment import androidx.fragment.app.activityViewModels import androidx.fragment.app.viewModels import androidx.lifecycle.lifecycleScope -import androidx.navigation.findNavController import androidx.recyclerview.widget.LinearLayoutManager import androidx.recyclerview.widget.RecyclerView import dagger.hilt.android.AndroidEntryPoint import foundation.e.apps.R -import foundation.e.apps.data.enums.Status import foundation.e.apps.data.application.ApplicationInstaller import foundation.e.apps.data.application.data.Application -import foundation.e.apps.data.login.AuthObject -import foundation.e.apps.data.login.exceptions.GPlayException -import foundation.e.apps.data.login.exceptions.GPlayLoginException +import foundation.e.apps.data.enums.Status import foundation.e.apps.databinding.FragmentHomeBinding -import foundation.e.apps.di.CommonUtilsModule.safeNavigate import foundation.e.apps.install.download.data.DownloadProgress import foundation.e.apps.install.pkg.PwaManager import foundation.e.apps.ui.AppInfoFetchViewModel @@ -45,14 +40,12 @@ import foundation.e.apps.ui.MainActivityViewModel import foundation.e.apps.ui.application.subFrags.ApplicationDialogFragment import foundation.e.apps.ui.home.model.HomeChildRVAdapter import foundation.e.apps.ui.home.model.HomeParentRVAdapter -import foundation.e.apps.ui.parentFragment.TimeoutFragment -import kotlinx.coroutines.delay import kotlinx.coroutines.launch import java.util.Locale import javax.inject.Inject @AndroidEntryPoint -class HomeFragment : TimeoutFragment(R.layout.fragment_home), ApplicationInstaller { +class HomeFragment : Fragment(R.layout.fragment_home), ApplicationInstaller { /* * Make adapter nullable to avoid memory leaks. @@ -63,7 +56,7 @@ class HomeFragment : TimeoutFragment(R.layout.fragment_home), ApplicationInstall private val binding get() = _binding!! private val homeViewModel: HomeViewModel by viewModels() - override val mainActivityViewModel: MainActivityViewModel by activityViewModels() + val mainActivityViewModel: MainActivityViewModel by activityViewModels() private val appProgressViewModel: AppProgressViewModel by viewModels() private val appInfoFetchViewModel: AppInfoFetchViewModel by viewModels() @@ -74,7 +67,7 @@ class HomeFragment : TimeoutFragment(R.layout.fragment_home), ApplicationInstall super.onViewCreated(view, savedInstanceState) _binding = FragmentHomeBinding.bind(view) - loadHomePageData() + loadData() homeParentRVAdapter = initHomeParentRVAdapter() @@ -106,19 +99,6 @@ class HomeFragment : TimeoutFragment(R.layout.fragment_home), ApplicationInstall } } - private fun loadHomePageData() { - setupListening() - - authObjects.observe(viewLifecycleOwner) { - if (it == null) return@observe - loadDataWhenNetworkAvailable(it) - } - - homeViewModel.exceptionsLiveData.observe(viewLifecycleOwner) { - handleExceptionsCommon(it) - } - } - private fun showPaidAppMessage(application: Application) { ApplicationDialogFragment( title = getString(R.string.dialog_title_paid_app, application.name), @@ -135,66 +115,22 @@ class HomeFragment : TimeoutFragment(R.layout.fragment_home), ApplicationInstall ).show(childFragmentManager, "HomeFragment") } - override fun onTimeout( - exception: Exception, - predefinedDialog: AlertDialog.Builder - ): AlertDialog.Builder? { - return predefinedDialog.apply { - if (exception is GPlayException) { - setMessage(R.string.timeout_desc_gplay) - setNegativeButton(R.string.open_settings) { _, _ -> - openSettings() - } - } else { - setMessage(R.string.timeout_desc_cleanapk) - } - setCancelable(false) - } - } - - override fun onSignInError( - exception: GPlayLoginException, - predefinedDialog: AlertDialog.Builder - ): AlertDialog.Builder? { - return predefinedDialog.apply { - setNegativeButton(R.string.open_settings) { _, _ -> - openSettings() - } - } - } - - override fun onDataLoadError( - exception: Exception, - predefinedDialog: AlertDialog.Builder - ): AlertDialog.Builder? { - return predefinedDialog.apply { - if (exception is GPlayException) { - setNegativeButton(R.string.open_settings) { _, _ -> - openSettings() - } - } - } - } - - override fun loadData(authObjectList: List) { + private fun loadData() { if (shouldLoadData()) { showLoadingUI() - homeViewModel.loadData(authObjectList, viewLifecycleOwner) { _ -> - clearAndRestartGPlayLogin() - true - } + homeViewModel.getHomeScreenData(viewLifecycleOwner) } } private fun shouldLoadData() = homeViewModel.haveSourcesChanged() || !homeViewModel.hasData() - override fun showLoadingUI() { + private fun showLoadingUI() { binding.shimmerLayout.startShimmer() binding.shimmerLayout.visibility = View.VISIBLE binding.parentRV.visibility = View.GONE } - override fun stopLoadingUI() { + private fun stopLoadingUI() { binding.shimmerLayout.stopShimmer() binding.shimmerLayout.visibility = View.GONE binding.parentRV.visibility = View.VISIBLE @@ -281,9 +217,4 @@ class HomeFragment : TimeoutFragment(R.layout.fragment_home), ApplicationInstall override fun cancelDownload(app: Application) { mainActivityViewModel.cancelDownload(app) } - - private fun openSettings() { - view?.findNavController() - ?.safeNavigate(R.id.homeFragment, R.id.action_homeFragment_to_SettingsFragment) - } } diff --git a/app/src/main/java/foundation/e/apps/ui/home/HomeViewModel.kt b/app/src/main/java/foundation/e/apps/ui/home/HomeViewModel.kt index 3e57bace086fe8450a271e32bb9a12d9f1601c3a..85f1ce654f6d860d1c6bf028845d2f1899d87c08 100644 --- a/app/src/main/java/foundation/e/apps/ui/home/HomeViewModel.kt +++ b/app/src/main/java/foundation/e/apps/ui/home/HomeViewModel.kt @@ -1,6 +1,5 @@ /* - * Apps Quickly and easily install Android apps onto your device! - * Copyright (C) 2021 E FOUNDATION + * Copyright (C) 2021-2025 e Foundation * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -14,6 +13,7 @@ * * You should have received a copy of the GNU General Public License * along with this program. If not, see . + * */ package foundation.e.apps.ui.home @@ -21,6 +21,7 @@ package foundation.e.apps.ui.home import androidx.annotation.VisibleForTesting import androidx.lifecycle.LifecycleOwner import androidx.lifecycle.MutableLiveData +import androidx.lifecycle.ViewModel import androidx.lifecycle.viewModelScope import dagger.hilt.android.lifecycle.HiltViewModel import foundation.e.apps.data.ResultSupreme @@ -29,10 +30,8 @@ import foundation.e.apps.data.Stores import foundation.e.apps.data.application.ApplicationRepository import foundation.e.apps.data.application.data.Home import foundation.e.apps.data.enums.Source -import foundation.e.apps.data.login.AuthObject import foundation.e.apps.data.preference.AppLoungePreference import foundation.e.apps.ui.applicationlist.ApplicationDiffUtil -import foundation.e.apps.ui.parentFragment.LoadingViewModel import kotlinx.coroutines.launch import javax.inject.Inject @@ -40,7 +39,7 @@ import javax.inject.Inject class HomeViewModel @Inject constructor( private val applicationRepository: ApplicationRepository, private val stores: Stores -) : LoadingViewModel() { +) : ViewModel() { @Inject lateinit var appLoungePreference: AppLoungePreference @@ -61,25 +60,6 @@ class HomeViewModel @Inject constructor( return homeScreenData.value?.data?.isNotEmpty() ?: false } - fun loadData( - authObjectList: List, - lifecycleOwner: LifecycleOwner, - retryBlock: (failedObjects: List) -> Boolean, - ) { - super.onLoadData(authObjectList, { successAuthList, _ -> - - successAuthList.find { it is AuthObject.GPlayAuth }?.run { - getHomeScreenData(lifecycleOwner) - return@onLoadData - } - - successAuthList.find { it is AuthObject.CleanApk }?.run { - getHomeScreenData(lifecycleOwner) - return@onLoadData - } - }, retryBlock) - } - fun haveSourcesChanged(): Boolean { val newStores = stores.getStores() if (newStores == previousStores) { @@ -90,9 +70,7 @@ class HomeViewModel @Inject constructor( return true } - private fun getHomeScreenData( - lifecycleOwner: LifecycleOwner, - ) { + fun getHomeScreenData(lifecycleOwner: LifecycleOwner) { viewModelScope.launch { applicationRepository.getHomeScreenData().observe(lifecycleOwner) { postHomeResult(it) diff --git a/app/src/main/res/layout/application_list_item.xml b/app/src/main/res/layout/application_list_item.xml index e9f1e36a082cfbabddf2507c8314c6b2e91776ae..97a97953be7f0d0c3f388d30c74d77b2d38c8556 100644 --- a/app/src/main/res/layout/application_list_item.xml +++ b/app/src/main/res/layout/application_list_item.xml @@ -1,8 +1,7 @@ @@ -70,7 +71,7 @@ app:layout_constraintLeft_toRightOf="@+id/app_icon_card" app:layout_constraintRight_toLeftOf="@+id/installButton" app:layout_constraintTop_toTopOf="@+id/app_icon_card" - tools:text="Google Chrome - Fast and Secured" /> + tools:text="@tools:sample/lorem/random" /> + tools:text="@tools:sample/full_names" /> - \ No newline at end of file + diff --git a/app/src/main/res/layout/fragment_home.xml b/app/src/main/res/layout/fragment_home.xml index 106c3733653dda315619ef28fe89da88102afdd8..8ea33c002538a37f03f12151562cff3b69999d25 100644 --- a/app/src/main/res/layout/fragment_home.xml +++ b/app/src/main/res/layout/fragment_home.xml @@ -1,6 +1,5 @@ + android:orientation="vertical" + tools:visibility="gone"> + android:visibility="gone" + tools:listitem="@layout/home_parent_list_item" + tools:visibility="visible" /> - \ No newline at end of file + diff --git a/app/src/main/res/layout/home_child_list_item.xml b/app/src/main/res/layout/home_child_list_item.xml index 548f48ac46720bfc2d2331bc783c0a99cf0a0ecb..cfb79c302ab4fb8201f472f34d9460a20ca15c60 100644 --- a/app/src/main/res/layout/home_child_list_item.xml +++ b/app/src/main/res/layout/home_child_list_item.xml @@ -1,6 +1,5 @@ @@ -55,6 +57,7 @@ android:lines="2" android:textAlignment="center" android:textColor="?android:textColorPrimary" + tools:text="@tools:sample/lorem/random" android:textSize="12sp" /> - \ No newline at end of file + diff --git a/app/src/main/res/layout/home_parent_list_item.xml b/app/src/main/res/layout/home_parent_list_item.xml index f5fa944859749ad57150404f0dfc25f2b05f4ede..4b8474246f32a75bed16632cf3ba43a4cecd51d5 100644 --- a/app/src/main/res/layout/home_parent_list_item.xml +++ b/app/src/main/res/layout/home_parent_list_item.xml @@ -1,6 +1,5 @@ + android:paddingBottom="5dp" + tools:layoutManager="androidx.recyclerview.widget.LinearLayoutManager" + tools:listitem="@layout/home_child_list_item" + tools:orientation="horizontal" /> - \ No newline at end of file +