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.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)

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)
}
}
}
}