diff --git a/app/src/main/kotlin/org/koitharu/kotatsu/core/BaseApp.kt b/app/src/main/kotlin/org/koitharu/kotatsu/core/BaseApp.kt index 8825d4cbe..47833c2ee 100644 --- a/app/src/main/kotlin/org/koitharu/kotatsu/core/BaseApp.kt +++ b/app/src/main/kotlin/org/koitharu/kotatsu/core/BaseApp.kt @@ -13,7 +13,6 @@ import dagger.hilt.android.HiltAndroidApp import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.flow.MutableSharedFlow import kotlinx.coroutines.launch -import kotlinx.coroutines.withContext import org.acra.ACRA import org.acra.ReportField import org.acra.config.dialog @@ -26,12 +25,14 @@ import org.koitharu.kotatsu.BuildConfig import org.koitharu.kotatsu.R import org.koitharu.kotatsu.core.db.MangaDatabase import org.koitharu.kotatsu.core.os.AppValidator +import org.koitharu.kotatsu.core.os.RomCompat import org.koitharu.kotatsu.core.prefs.AppSettings import org.koitharu.kotatsu.core.util.WorkServiceStopHelper import org.koitharu.kotatsu.core.util.ext.processLifecycleScope import org.koitharu.kotatsu.local.data.LocalStorageChanges import org.koitharu.kotatsu.local.data.index.LocalMangaIndex import org.koitharu.kotatsu.local.domain.model.LocalManga +import org.koitharu.kotatsu.parsers.util.suspendlazy.getOrNull import org.koitharu.kotatsu.settings.work.WorkScheduleManager import java.security.Security import javax.inject.Inject @@ -89,10 +90,8 @@ open class BaseApp : Application(), Configuration.Provider { } setupActivityLifecycleCallbacks() processLifecycleScope.launch { - val isOriginalApp = withContext(Dispatchers.Default) { - appValidator.isOriginalApp - } - ACRA.errorReporter.putCustomData("isOriginalApp", isOriginalApp.toString()) + ACRA.errorReporter.putCustomData("isOriginalApp", appValidator.isOriginalApp.getOrNull().toString()) + ACRA.errorReporter.putCustomData("isMiui", RomCompat.isMiui.getOrNull().toString()) } processLifecycleScope.launch(Dispatchers.Default) { setupDatabaseObservers() diff --git a/app/src/main/kotlin/org/koitharu/kotatsu/core/os/AppValidator.kt b/app/src/main/kotlin/org/koitharu/kotatsu/core/os/AppValidator.kt index e95207ca3..897420126 100644 --- a/app/src/main/kotlin/org/koitharu/kotatsu/core/os/AppValidator.kt +++ b/app/src/main/kotlin/org/koitharu/kotatsu/core/os/AppValidator.kt @@ -1,9 +1,12 @@ package org.koitharu.kotatsu.core.os +import android.annotation.SuppressLint import android.content.Context import android.content.pm.PackageManager import androidx.core.content.pm.PackageInfoCompat import dagger.hilt.android.qualifiers.ApplicationContext +import kotlinx.coroutines.Dispatchers +import org.koitharu.kotatsu.parsers.util.suspendlazy.suspendLazy import javax.inject.Inject import javax.inject.Singleton @@ -11,8 +14,8 @@ import javax.inject.Singleton class AppValidator @Inject constructor( @ApplicationContext private val context: Context, ) { - @Suppress("NewApi") - val isOriginalApp by lazy { + @SuppressLint("InlinedApi") + val isOriginalApp = suspendLazy(Dispatchers.Default) { val certificates = mapOf(CERT_SHA256.hexToByteArray() to PackageManager.CERT_INPUT_SHA256) PackageInfoCompat.hasSignatures(context.packageManager, context.packageName, certificates, false) } diff --git a/app/src/main/kotlin/org/koitharu/kotatsu/core/os/RomCompat.kt b/app/src/main/kotlin/org/koitharu/kotatsu/core/os/RomCompat.kt new file mode 100644 index 000000000..ec519c179 --- /dev/null +++ b/app/src/main/kotlin/org/koitharu/kotatsu/core/os/RomCompat.kt @@ -0,0 +1,18 @@ +package org.koitharu.kotatsu.core.os + +import kotlinx.coroutines.Dispatchers +import org.jetbrains.annotations.Blocking +import org.koitharu.kotatsu.parsers.util.suspendlazy.suspendLazy +import java.io.InputStreamReader + +object RomCompat { + + val isMiui = suspendLazy(Dispatchers.IO) { + getProp("ro.miui.ui.version.name").isNotEmpty() + } + + @Blocking + private fun getProp(propName: String) = Runtime.getRuntime().exec("getprop $propName").inputStream.use { + it.reader().use(InputStreamReader::readText).trim() + } +}