MainActivity: Drop dependency upon kovenant

Signed-off-by: Aayush Gupta <aayushgupta219@gmail.com>
This commit is contained in:
Aayush Gupta
2023-07-21 11:47:42 +05:30
parent d59ed4dc20
commit e491992f06
2 changed files with 74 additions and 38 deletions

View File

@@ -28,21 +28,21 @@ import android.os.Build
import android.os.Bundle import android.os.Bundle
import android.os.Environment import android.os.Environment
import android.provider.Settings import android.provider.Settings
import android.view.MenuItem
import android.view.View import android.view.View
import android.widget.ImageView import android.widget.ImageView
import android.widget.TextView import android.widget.TextView
import androidx.activity.addCallback import androidx.activity.addCallback
import androidx.activity.result.contract.ActivityResultContracts import androidx.activity.result.contract.ActivityResultContracts
import androidx.activity.viewModels
import androidx.annotation.IdRes import androidx.annotation.IdRes
import androidx.appcompat.app.AppCompatActivity import androidx.appcompat.app.AppCompatActivity
import androidx.core.content.ContextCompat import androidx.core.content.ContextCompat
import androidx.core.graphics.ColorUtils import androidx.core.graphics.ColorUtils
import androidx.core.view.GravityCompat import androidx.core.view.GravityCompat
import androidx.lifecycle.lifecycleScope
import androidx.navigation.NavController import androidx.navigation.NavController
import androidx.navigation.NavDestination import androidx.navigation.NavDestination
import androidx.navigation.fragment.NavHostFragment import androidx.navigation.fragment.NavHostFragment
import androidx.navigation.fragment.findNavController
import androidx.navigation.ui.AppBarConfiguration import androidx.navigation.ui.AppBarConfiguration
import androidx.navigation.ui.navigateUp import androidx.navigation.ui.navigateUp
import androidx.navigation.ui.setupActionBarWithNavController import androidx.navigation.ui.setupActionBarWithNavController
@@ -51,23 +51,22 @@ import com.aurora.Constants
import com.aurora.extensions.* import com.aurora.extensions.*
import com.aurora.gplayapi.data.models.AuthData import com.aurora.gplayapi.data.models.AuthData
import com.aurora.store.data.model.SelfUpdate 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.AuthProvider
import com.aurora.store.data.providers.NetworkProvider import com.aurora.store.data.providers.NetworkProvider
import com.aurora.store.databinding.ActivityMainBinding import com.aurora.store.databinding.ActivityMainBinding
import com.aurora.store.util.CertUtil.isFDroidApp
import com.aurora.store.util.Log import com.aurora.store.util.Log
import com.aurora.store.util.Preferences import com.aurora.store.util.Preferences
import com.aurora.store.view.ui.sheets.NetworkDialogSheet import com.aurora.store.view.ui.sheets.NetworkDialogSheet
import com.aurora.store.view.ui.sheets.SelfUpdateSheet import com.aurora.store.view.ui.sheets.SelfUpdateSheet
import com.aurora.store.view.ui.sheets.TOSSheet import com.aurora.store.view.ui.sheets.TOSSheet
import com.aurora.store.viewmodel.MainViewModel
import com.bumptech.glide.load.resource.bitmap.RoundedCorners import com.bumptech.glide.load.resource.bitmap.RoundedCorners
import com.google.android.material.bottomnavigation.BottomNavigationView import com.google.android.material.bottomnavigation.BottomNavigationView
import com.google.android.material.elevation.SurfaceColors import com.google.android.material.elevation.SurfaceColors
import com.google.gson.Gson import com.google.gson.Gson
import com.google.gson.GsonBuilder import com.google.gson.GsonBuilder
import nl.komponents.kovenant.task import kotlinx.coroutines.flow.drop
import nl.komponents.kovenant.ui.successUi import kotlinx.coroutines.launch
import java.lang.reflect.Modifier import java.lang.reflect.Modifier
@@ -77,6 +76,8 @@ class MainActivity : AppCompatActivity(), NetworkProvider.NetworkListener {
private lateinit var navController: NavController private lateinit var navController: NavController
private lateinit var authData: AuthData private lateinit var authData: AuthData
private val viewModel: MainViewModel by viewModels()
private val startForPermissions = private val startForPermissions =
registerForActivityResult(ActivityResultContracts.RequestPermission()) { registerForActivityResult(ActivityResultContracts.RequestPermission()) {
if (!it) toast(R.string.permissions_denied) 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*/ /* 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 // Handle quick exit from back actions
onBackPressedDispatcher.addCallback(this) { 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) { private fun showUpdatesSheet(selfUpdate: SelfUpdate) {
if (!supportFragmentManager.isDestroyed) { if (!supportFragmentManager.isDestroyed) {
val sheet = SelfUpdateSheet.newInstance(selfUpdate) val sheet = SelfUpdateSheet.newInstance(selfUpdate)

View File

@@ -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<SelfUpdate?>()
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)
}
}
}
}