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
+