Loading app/src/main/java/foundation/e/apps/MainActivityViewModel.kt +5 −6 Original line number Diff line number Diff line Loading @@ -53,15 +53,14 @@ import foundation.e.apps.utils.enums.Type import foundation.e.apps.utils.enums.User import foundation.e.apps.utils.enums.isInitialized import foundation.e.apps.utils.enums.isUnFiltered import foundation.e.apps.utils.modules.CommonUtilsModule import foundation.e.apps.utils.modules.DataStoreModule import foundation.e.apps.utils.modules.PWAManagerModule import java.io.ByteArrayOutputStream import javax.inject.Inject import kotlinx.coroutines.channels.ProducerScope import kotlinx.coroutines.channels.awaitClose import kotlinx.coroutines.flow.callbackFlow import kotlinx.coroutines.launch import java.io.ByteArrayOutputStream import javax.inject.Inject @HiltViewModel class MainActivityViewModel @Inject constructor( Loading Loading @@ -394,9 +393,9 @@ class MainActivityViewModel @Inject constructor( val capabilities = connectivityManager.getNetworkCapabilities(connectivityManager.activeNetwork) val hasInternet = capabilities != null && capabilities.hasCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET) && capabilities.hasCapability(NetworkCapabilities.NET_CAPABILITY_VALIDATED) capabilities != null && capabilities.hasCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET) && capabilities.hasCapability(NetworkCapabilities.NET_CAPABILITY_VALIDATED) trySend(hasInternet) } Loading app/src/main/java/foundation/e/apps/api/fused/FusedAPIImpl.kt +38 −14 Original line number Diff line number Diff line Loading @@ -21,7 +21,6 @@ package foundation.e.apps.api.fused import android.content.Context import android.text.format.Formatter import androidx.lifecycle.LiveData import androidx.lifecycle.LiveDataScope import androidx.lifecycle.liveData import androidx.lifecycle.map import com.aurora.gplayapi.Constants Loading Loading @@ -68,12 +67,17 @@ import foundation.e.apps.utils.eventBus.AppEvent import foundation.e.apps.utils.eventBus.EventBus import foundation.e.apps.utils.modules.PWAManagerModule import foundation.e.apps.utils.modules.PreferenceManagerModule import kotlinx.coroutines.Deferred import kotlinx.coroutines.TimeoutCancellationException import kotlinx.coroutines.async import kotlinx.coroutines.coroutineScope import kotlinx.coroutines.withTimeout import timber.log.Timber import javax.inject.Inject import javax.inject.Singleton typealias FusedHomeDeferred = Deferred<ResultSupreme<List<FusedHome>>> @Singleton class FusedAPIImpl @Inject constructor( private val cleanAPKRepository: CleanAPKRepository, Loading Loading @@ -129,18 +133,34 @@ class FusedAPIImpl @Inject constructor( ): LiveData<ResultSupreme<List<FusedHome>>> { val list = mutableListOf<FusedHome>() var resultGplay: FusedHomeDeferred? = null var resultOpenSource: FusedHomeDeferred? = null var resultPWA: FusedHomeDeferred? = null return liveData { coroutineScope { if (preferenceManagerModule.isGplaySelected()) { loadHomeData(list, Source.GPLAY, authData, this) resultGplay = async { loadHomeData(list, Source.GPLAY, authData) } } if (preferenceManagerModule.isOpenSourceSelected()) { loadHomeData(list, Source.OPEN, authData, this) resultOpenSource = async { loadHomeData(list, Source.OPEN, authData) } } if (preferenceManagerModule.isPWASelected()) { loadHomeData(list, Source.PWA, authData, this) resultPWA = async { loadHomeData(list, Source.PWA, authData) } } resultGplay?.await()?.let { emit(it) } resultOpenSource?.await()?.let { emit(it) } resultPWA?.await()?.let { emit(it) } } } } Loading @@ -149,11 +169,9 @@ class FusedAPIImpl @Inject constructor( priorList: MutableList<FusedHome>, source: Source, authData: AuthData, scope: LiveDataScope<ResultSupreme<List<FusedHome>>>, ) { ): ResultSupreme<List<FusedHome>> { val apiStatus = when (source) { Source.GPLAY -> runCodeBlockWithTimeout({ priorList.addAll(fetchGPlayHome(it ?: authData)) }) Loading @@ -180,8 +198,14 @@ class FusedAPIImpl @Inject constructor( } setHomeErrorMessage(apiStatus, source) scope.emit(ResultSupreme.create(apiStatus, priorList)) priorList.sortByDescending { when (it.source) { APP_TYPE_OPEN -> 2 APP_TYPE_PWA -> 1 else -> 3 } } return ResultSupreme.create(apiStatus, priorList) } private fun setHomeErrorMessage(apiStatus: ResultStatus, source: Source) { Loading app/src/main/java/foundation/e/apps/utils/parentFragment/TimeoutFragment.kt +9 −6 Original line number Diff line number Diff line Loading @@ -99,14 +99,17 @@ abstract class TimeoutFragment(@LayoutRes layoutId: Int) : Fragment(layoutId) { * is disconnected and reconnected multiple times. */ private fun LiveData<Boolean>.loadDataOnce(lifecycleOwner: LifecycleOwner, observer: Observer<Boolean>) { observe(lifecycleOwner, object : Observer<Boolean> { observe( lifecycleOwner, object : Observer<Boolean> { override fun onChanged(t: Boolean) { observer.onChanged(t) if (t) { removeObserver(this) } } }) } ) } /** Loading Loading
app/src/main/java/foundation/e/apps/MainActivityViewModel.kt +5 −6 Original line number Diff line number Diff line Loading @@ -53,15 +53,14 @@ import foundation.e.apps.utils.enums.Type import foundation.e.apps.utils.enums.User import foundation.e.apps.utils.enums.isInitialized import foundation.e.apps.utils.enums.isUnFiltered import foundation.e.apps.utils.modules.CommonUtilsModule import foundation.e.apps.utils.modules.DataStoreModule import foundation.e.apps.utils.modules.PWAManagerModule import java.io.ByteArrayOutputStream import javax.inject.Inject import kotlinx.coroutines.channels.ProducerScope import kotlinx.coroutines.channels.awaitClose import kotlinx.coroutines.flow.callbackFlow import kotlinx.coroutines.launch import java.io.ByteArrayOutputStream import javax.inject.Inject @HiltViewModel class MainActivityViewModel @Inject constructor( Loading Loading @@ -394,9 +393,9 @@ class MainActivityViewModel @Inject constructor( val capabilities = connectivityManager.getNetworkCapabilities(connectivityManager.activeNetwork) val hasInternet = capabilities != null && capabilities.hasCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET) && capabilities.hasCapability(NetworkCapabilities.NET_CAPABILITY_VALIDATED) capabilities != null && capabilities.hasCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET) && capabilities.hasCapability(NetworkCapabilities.NET_CAPABILITY_VALIDATED) trySend(hasInternet) } Loading
app/src/main/java/foundation/e/apps/api/fused/FusedAPIImpl.kt +38 −14 Original line number Diff line number Diff line Loading @@ -21,7 +21,6 @@ package foundation.e.apps.api.fused import android.content.Context import android.text.format.Formatter import androidx.lifecycle.LiveData import androidx.lifecycle.LiveDataScope import androidx.lifecycle.liveData import androidx.lifecycle.map import com.aurora.gplayapi.Constants Loading Loading @@ -68,12 +67,17 @@ import foundation.e.apps.utils.eventBus.AppEvent import foundation.e.apps.utils.eventBus.EventBus import foundation.e.apps.utils.modules.PWAManagerModule import foundation.e.apps.utils.modules.PreferenceManagerModule import kotlinx.coroutines.Deferred import kotlinx.coroutines.TimeoutCancellationException import kotlinx.coroutines.async import kotlinx.coroutines.coroutineScope import kotlinx.coroutines.withTimeout import timber.log.Timber import javax.inject.Inject import javax.inject.Singleton typealias FusedHomeDeferred = Deferred<ResultSupreme<List<FusedHome>>> @Singleton class FusedAPIImpl @Inject constructor( private val cleanAPKRepository: CleanAPKRepository, Loading Loading @@ -129,18 +133,34 @@ class FusedAPIImpl @Inject constructor( ): LiveData<ResultSupreme<List<FusedHome>>> { val list = mutableListOf<FusedHome>() var resultGplay: FusedHomeDeferred? = null var resultOpenSource: FusedHomeDeferred? = null var resultPWA: FusedHomeDeferred? = null return liveData { coroutineScope { if (preferenceManagerModule.isGplaySelected()) { loadHomeData(list, Source.GPLAY, authData, this) resultGplay = async { loadHomeData(list, Source.GPLAY, authData) } } if (preferenceManagerModule.isOpenSourceSelected()) { loadHomeData(list, Source.OPEN, authData, this) resultOpenSource = async { loadHomeData(list, Source.OPEN, authData) } } if (preferenceManagerModule.isPWASelected()) { loadHomeData(list, Source.PWA, authData, this) resultPWA = async { loadHomeData(list, Source.PWA, authData) } } resultGplay?.await()?.let { emit(it) } resultOpenSource?.await()?.let { emit(it) } resultPWA?.await()?.let { emit(it) } } } } Loading @@ -149,11 +169,9 @@ class FusedAPIImpl @Inject constructor( priorList: MutableList<FusedHome>, source: Source, authData: AuthData, scope: LiveDataScope<ResultSupreme<List<FusedHome>>>, ) { ): ResultSupreme<List<FusedHome>> { val apiStatus = when (source) { Source.GPLAY -> runCodeBlockWithTimeout({ priorList.addAll(fetchGPlayHome(it ?: authData)) }) Loading @@ -180,8 +198,14 @@ class FusedAPIImpl @Inject constructor( } setHomeErrorMessage(apiStatus, source) scope.emit(ResultSupreme.create(apiStatus, priorList)) priorList.sortByDescending { when (it.source) { APP_TYPE_OPEN -> 2 APP_TYPE_PWA -> 1 else -> 3 } } return ResultSupreme.create(apiStatus, priorList) } private fun setHomeErrorMessage(apiStatus: ResultStatus, source: Source) { Loading
app/src/main/java/foundation/e/apps/utils/parentFragment/TimeoutFragment.kt +9 −6 Original line number Diff line number Diff line Loading @@ -99,14 +99,17 @@ abstract class TimeoutFragment(@LayoutRes layoutId: Int) : Fragment(layoutId) { * is disconnected and reconnected multiple times. */ private fun LiveData<Boolean>.loadDataOnce(lifecycleOwner: LifecycleOwner, observer: Observer<Boolean>) { observe(lifecycleOwner, object : Observer<Boolean> { observe( lifecycleOwner, object : Observer<Boolean> { override fun onChanged(t: Boolean) { observer.onChanged(t) if (t) { removeObserver(this) } } }) } ) } /** Loading