Add build info screen
This commit is contained in:
@@ -32,6 +32,7 @@ import de.mm20.launcher2.ui.settings.main.MainSettingsScreen
|
||||
import de.mm20.launcher2.ui.settings.musicwidget.MusicWidgetSettingsScreen
|
||||
import de.mm20.launcher2.ui.settings.search.SearchSettingsScreen
|
||||
import de.mm20.launcher2.ui.settings.accounts.AccountsSettingsScreen
|
||||
import de.mm20.launcher2.ui.settings.buildinfo.BuildInfoSettingsScreen
|
||||
import de.mm20.launcher2.ui.settings.weatherwidget.WeatherWidgetSettingsScreen
|
||||
import de.mm20.launcher2.ui.settings.widgets.WidgetsSettingsScreen
|
||||
import de.mm20.launcher2.ui.settings.wikipedia.WikipediaSettingsScreen
|
||||
@@ -120,6 +121,9 @@ class SettingsActivity : BaseActivity() {
|
||||
composable("settings/about") {
|
||||
AboutSettingsScreen()
|
||||
}
|
||||
composable("settings/about/buildinfo") {
|
||||
BuildInfoSettingsScreen()
|
||||
}
|
||||
composable("settings/debug") {
|
||||
DebugSettingsScreen()
|
||||
}
|
||||
|
||||
@@ -41,6 +41,13 @@ fun AboutSettingsScreen() {
|
||||
title = stringResource(R.string.preference_version),
|
||||
summary = appVersion
|
||||
)
|
||||
Preference(
|
||||
title = stringResource(R.string.preference_screen_buildinfo),
|
||||
summary = stringResource(R.string.preference_screen_buildinfo_summary),
|
||||
onClick = {
|
||||
navController?.navigate("settings/about/buildinfo")
|
||||
}
|
||||
)
|
||||
}
|
||||
}
|
||||
item {
|
||||
|
||||
@@ -0,0 +1,59 @@
|
||||
package de.mm20.launcher2.ui.settings.buildinfo
|
||||
|
||||
import android.content.pm.PackageManager
|
||||
import android.os.Build
|
||||
import android.util.Base64
|
||||
import androidx.compose.runtime.*
|
||||
import androidx.compose.ui.platform.LocalContext
|
||||
import androidx.compose.ui.res.stringResource
|
||||
import androidx.lifecycle.viewmodel.compose.viewModel
|
||||
import de.mm20.launcher2.ui.BuildConfig
|
||||
import de.mm20.launcher2.ui.R
|
||||
import de.mm20.launcher2.ui.component.preferences.Preference
|
||||
import de.mm20.launcher2.ui.component.preferences.PreferenceCategory
|
||||
import de.mm20.launcher2.ui.component.preferences.PreferenceScreen
|
||||
import java.security.MessageDigest
|
||||
|
||||
@Composable
|
||||
fun BuildInfoSettingsScreen() {
|
||||
val viewModel: BuildInfoSettingsScreenVM = viewModel()
|
||||
val context = LocalContext.current
|
||||
PreferenceScreen(title = stringResource(R.string.preference_screen_buildinfo)) {
|
||||
item {
|
||||
Preference(title = "Build type", summary = BuildConfig.BUILD_TYPE)
|
||||
var buildSignature by remember { mutableStateOf<String?>(null) }
|
||||
LaunchedEffect(null) {
|
||||
val signature = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) {
|
||||
val pi = context.packageManager.getPackageInfo(
|
||||
context.packageName,
|
||||
PackageManager.GET_SIGNING_CERTIFICATES
|
||||
)
|
||||
pi.signingInfo.apkContentsSigners.firstOrNull()
|
||||
} else {
|
||||
val pi = context.packageManager.getPackageInfo(
|
||||
context.packageName,
|
||||
PackageManager.GET_SIGNATURES
|
||||
)
|
||||
pi.signatures.firstOrNull()
|
||||
}
|
||||
val signatureHash = if (signature != null) {
|
||||
val digest = MessageDigest.getInstance("SHA")
|
||||
digest.update(signature.toByteArray())
|
||||
Base64.encodeToString(digest.digest(), Base64.NO_WRAP)
|
||||
} else "null"
|
||||
buildSignature = signatureHash
|
||||
}
|
||||
Preference(title = "Signature hash", summary = buildSignature)
|
||||
}
|
||||
item {
|
||||
PreferenceCategory(title = "Features") {
|
||||
for (feature in viewModel.buildFeatures) {
|
||||
Preference(
|
||||
title = feature.key,
|
||||
summary = if (feature.value) "YES" else "NO"
|
||||
)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,30 @@
|
||||
package de.mm20.launcher2.ui.settings.buildinfo
|
||||
|
||||
import android.content.pm.PackageManager
|
||||
import android.os.Build
|
||||
import android.util.Base64
|
||||
import androidx.lifecycle.ViewModel
|
||||
import androidx.lifecycle.liveData
|
||||
import de.mm20.launcher2.accounts.AccountType
|
||||
import de.mm20.launcher2.accounts.AccountsRepository
|
||||
import de.mm20.launcher2.preferences.Settings.WeatherSettings.WeatherProvider
|
||||
import de.mm20.launcher2.weather.WeatherRepository
|
||||
import org.koin.core.component.KoinComponent
|
||||
import org.koin.core.component.inject
|
||||
import java.security.MessageDigest
|
||||
|
||||
class BuildInfoSettingsScreenVM : ViewModel(), KoinComponent {
|
||||
private val accountsRepository: AccountsRepository by inject()
|
||||
private val weatherRepository: WeatherRepository by inject()
|
||||
|
||||
private val availableWeatherProviders = weatherRepository.getAvailableProviders()
|
||||
|
||||
val buildFeatures = mapOf(
|
||||
"Accounts: Google" to accountsRepository.isSupported(AccountType.Google),
|
||||
"Accounts: Microsoft" to accountsRepository.isSupported(AccountType.Microsoft),
|
||||
"Weather providers: HERE" to availableWeatherProviders.contains(WeatherProvider.Here),
|
||||
"Weather providers: Met No" to availableWeatherProviders.contains(WeatherProvider.MetNo),
|
||||
"Weather providers: OpenWeatherMap" to availableWeatherProviders.contains(WeatherProvider.OpenWeatherMap),
|
||||
"Weather providers: BrightSky" to availableWeatherProviders.contains(WeatherProvider.BrightSky),
|
||||
)
|
||||
}
|
||||
Reference in New Issue
Block a user