From e491992f06ec3a3537a0407c8d5b38f48715bdce Mon Sep 17 00:00:00 2001 From: Aayush Gupta Date: Fri, 21 Jul 2023 11:47:42 +0530 Subject: [PATCH] MainActivity: Drop dependency upon kovenant Signed-off-by: Aayush Gupta --- .../java/com/aurora/store/MainActivity.kt | 55 ++++++------------ .../aurora/store/viewmodel/MainViewModel.kt | 57 +++++++++++++++++++ 2 files changed, 74 insertions(+), 38 deletions(-) create mode 100644 app/src/main/java/com/aurora/store/viewmodel/MainViewModel.kt diff --git a/app/src/main/java/com/aurora/store/MainActivity.kt b/app/src/main/java/com/aurora/store/MainActivity.kt index 054270996..cb29b5e0c 100644 --- a/app/src/main/java/com/aurora/store/MainActivity.kt +++ b/app/src/main/java/com/aurora/store/MainActivity.kt @@ -28,21 +28,21 @@ import android.os.Build import android.os.Bundle import android.os.Environment import android.provider.Settings -import android.view.MenuItem import android.view.View import android.widget.ImageView import android.widget.TextView import androidx.activity.addCallback import androidx.activity.result.contract.ActivityResultContracts +import androidx.activity.viewModels import androidx.annotation.IdRes import androidx.appcompat.app.AppCompatActivity import androidx.core.content.ContextCompat import androidx.core.graphics.ColorUtils import androidx.core.view.GravityCompat +import androidx.lifecycle.lifecycleScope import androidx.navigation.NavController import androidx.navigation.NavDestination import androidx.navigation.fragment.NavHostFragment -import androidx.navigation.fragment.findNavController import androidx.navigation.ui.AppBarConfiguration import androidx.navigation.ui.navigateUp import androidx.navigation.ui.setupActionBarWithNavController @@ -51,23 +51,22 @@ import com.aurora.Constants import com.aurora.extensions.* import com.aurora.gplayapi.data.models.AuthData import com.aurora.store.data.model.SelfUpdate -import com.aurora.store.data.network.HttpClient import com.aurora.store.data.providers.AuthProvider import com.aurora.store.data.providers.NetworkProvider import com.aurora.store.databinding.ActivityMainBinding -import com.aurora.store.util.CertUtil.isFDroidApp import com.aurora.store.util.Log import com.aurora.store.util.Preferences import com.aurora.store.view.ui.sheets.NetworkDialogSheet import com.aurora.store.view.ui.sheets.SelfUpdateSheet import com.aurora.store.view.ui.sheets.TOSSheet +import com.aurora.store.viewmodel.MainViewModel import com.bumptech.glide.load.resource.bitmap.RoundedCorners import com.google.android.material.bottomnavigation.BottomNavigationView import com.google.android.material.elevation.SurfaceColors import com.google.gson.Gson import com.google.gson.GsonBuilder -import nl.komponents.kovenant.task -import nl.komponents.kovenant.ui.successUi +import kotlinx.coroutines.flow.drop +import kotlinx.coroutines.launch import java.lang.reflect.Modifier @@ -77,6 +76,8 @@ class MainActivity : AppCompatActivity(), NetworkProvider.NetworkListener { private lateinit var navController: NavController private lateinit var authData: AuthData + private val viewModel: MainViewModel by viewModels() + private val startForPermissions = registerForActivityResult(ActivityResultContracts.RequestPermission()) { if (!it) toast(R.string.permissions_denied) @@ -184,7 +185,16 @@ class MainActivity : AppCompatActivity(), NetworkProvider.NetworkListener { } /* Check self update only for stable release, skip debug & nightlies*/ - if (BuildConfig.APPLICATION_ID == Constants.APP_ID) checkSelfUpdate() + if (BuildConfig.APPLICATION_ID == Constants.APP_ID) viewModel.checkSelfUpdate(this) + this.lifecycleScope.launch { + viewModel.selfUpdateAvailable.collect { + if (it != null) { + showUpdatesSheet(it) + } else { + Log.i("No self-update available") + } + } + } // Handle quick exit from back actions onBackPressedDispatcher.addCallback(this) { @@ -285,37 +295,6 @@ class MainActivity : AppCompatActivity(), NetworkProvider.NetworkListener { } } - private fun checkSelfUpdate() { - task { - HttpClient.getPreferredClient().get(Constants.UPDATE_URL, mapOf()) - } successUi { playResponse -> - if (playResponse.isSuccessful) { - val selfUpdate = gson.fromJson( - String(playResponse.responseBytes), - SelfUpdate::class.java - ) - - selfUpdate?.let { it -> - if (it.versionCode > BuildConfig.VERSION_CODE) { - if (isFDroidApp(this, BuildConfig.APPLICATION_ID)) { - if (it.fdroidBuild.isNotEmpty()) { - showUpdatesSheet(it) - } - } else if (it.auroraBuild.isNotEmpty()) { - showUpdatesSheet(it) - } else { - Log.i(getString(R.string.details_no_updates)) - } - } else { - Log.i(getString(R.string.details_no_updates)) - } - } - } else { - Log.e("Failed to check self update") - } - } - } - private fun showUpdatesSheet(selfUpdate: SelfUpdate) { if (!supportFragmentManager.isDestroyed) { val sheet = SelfUpdateSheet.newInstance(selfUpdate) diff --git a/app/src/main/java/com/aurora/store/viewmodel/MainViewModel.kt b/app/src/main/java/com/aurora/store/viewmodel/MainViewModel.kt new file mode 100644 index 000000000..c7f6d467f --- /dev/null +++ b/app/src/main/java/com/aurora/store/viewmodel/MainViewModel.kt @@ -0,0 +1,57 @@ +package com.aurora.store.viewmodel + +import android.content.Context +import android.util.Log +import androidx.lifecycle.ViewModel +import androidx.lifecycle.viewModelScope +import com.aurora.Constants +import com.aurora.store.BuildConfig +import com.aurora.store.data.model.SelfUpdate +import com.aurora.store.data.network.HttpClient +import com.aurora.store.util.CertUtil +import com.google.gson.Gson +import com.google.gson.GsonBuilder +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.flow.MutableSharedFlow +import kotlinx.coroutines.flow.MutableStateFlow +import kotlinx.coroutines.flow.asSharedFlow +import kotlinx.coroutines.flow.asStateFlow +import kotlinx.coroutines.launch +import java.lang.reflect.Modifier + +class MainViewModel : ViewModel() { + + private val TAG = MainViewModel::class.java.simpleName + + private val _selfUpdateAvailable = MutableSharedFlow() + val selfUpdateAvailable = _selfUpdateAvailable.asSharedFlow() + + fun checkSelfUpdate(context: Context) { + viewModelScope.launch(Dispatchers.IO) { + try { + val gson: Gson = + GsonBuilder().excludeFieldsWithModifiers(Modifier.TRANSIENT).create() + val response = HttpClient.getPreferredClient().get(Constants.UPDATE_URL, mapOf()) + val selfUpdate = + gson.fromJson(String(response.responseBytes), SelfUpdate::class.java) + + if (selfUpdate.versionCode > BuildConfig.VERSION_CODE) { + if (CertUtil.isFDroidApp(context, BuildConfig.APPLICATION_ID)) { + if (selfUpdate.fdroidBuild.isNotEmpty()) { + _selfUpdateAvailable.emit(selfUpdate) + } + } else if (selfUpdate.auroraBuild.isNotEmpty()) { + _selfUpdateAvailable.emit(selfUpdate) + } else { + _selfUpdateAvailable.emit(null) + } + } else { + _selfUpdateAvailable.emit(null) + } + } catch (exception: Exception) { + _selfUpdateAvailable.emit(null) + Log.d(TAG, "Failed to check self-update", exception) + } + } + } +} \ No newline at end of file