Only enable telemetry in Mihon production apps (mihonapp/mihon#1976)
(cherry picked from commit 5e029b1fe6838da90fc95009a0f675b59e6f04fd)
This commit is contained in:
parent
f685e6d5fc
commit
62beeb4192
3 changed files with 70 additions and 5 deletions
46
telemetry/src/firebase/kotlin/mihon/telemetry/PackageInfo.kt
Normal file
46
telemetry/src/firebase/kotlin/mihon/telemetry/PackageInfo.kt
Normal file
|
|
@ -0,0 +1,46 @@
|
||||||
|
package mihon.telemetry
|
||||||
|
|
||||||
|
import android.content.pm.PackageInfo
|
||||||
|
import android.content.pm.PackageManager
|
||||||
|
import android.content.pm.Signature
|
||||||
|
import android.os.Build
|
||||||
|
import java.security.MessageDigest
|
||||||
|
|
||||||
|
internal fun PackageInfo.getCertificateFingerprints(): List<String> {
|
||||||
|
return if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) {
|
||||||
|
val signingInfo = signingInfo!!
|
||||||
|
if (signingInfo.hasMultipleSigners()) {
|
||||||
|
signingInfo.apkContentsSigners
|
||||||
|
} else {
|
||||||
|
signingInfo.signingCertificateHistory
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
@Suppress("DEPRECATION")
|
||||||
|
signatures
|
||||||
|
}
|
||||||
|
?.map(Signature::getCertificateFingerprint)
|
||||||
|
?.toList()
|
||||||
|
?: emptyList()
|
||||||
|
}
|
||||||
|
|
||||||
|
internal val SignatureFlags = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) {
|
||||||
|
PackageManager.GET_SIGNING_CERTIFICATES
|
||||||
|
} else {
|
||||||
|
@Suppress("DEPRECATION")
|
||||||
|
PackageManager.GET_SIGNATURES
|
||||||
|
}
|
||||||
|
|
||||||
|
@OptIn(ExperimentalStdlibApi::class)
|
||||||
|
private val CertificateFingerprintHexFormat = HexFormat {
|
||||||
|
upperCase = true
|
||||||
|
bytes {
|
||||||
|
byteSeparator = ":"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@OptIn(ExperimentalStdlibApi::class)
|
||||||
|
private fun Signature.getCertificateFingerprint(): String {
|
||||||
|
return MessageDigest.getInstance("SHA-256")
|
||||||
|
.digest(toByteArray())
|
||||||
|
.toHexString(CertificateFingerprintHexFormat)
|
||||||
|
}
|
||||||
|
|
@ -6,25 +6,40 @@ import com.google.firebase.analytics.FirebaseAnalytics
|
||||||
import com.google.firebase.crashlytics.FirebaseCrashlytics
|
import com.google.firebase.crashlytics.FirebaseCrashlytics
|
||||||
|
|
||||||
object TelemetryConfig {
|
object TelemetryConfig {
|
||||||
private lateinit var analytics: FirebaseAnalytics
|
private var analytics: FirebaseAnalytics? = null
|
||||||
private lateinit var crashlytics: FirebaseCrashlytics
|
private var crashlytics: FirebaseCrashlytics? = null
|
||||||
|
|
||||||
fun init(context: Context, isPreviewBuildType: Boolean, commitCount: String) {
|
fun init(context: Context, isPreviewBuildType: Boolean, commitCount: String) {
|
||||||
|
// To stop forks/test builds from polluting our data
|
||||||
|
if (!context.isMihonProductionApp()) return
|
||||||
|
|
||||||
analytics = FirebaseAnalytics.getInstance(context)
|
analytics = FirebaseAnalytics.getInstance(context)
|
||||||
FirebaseApp.initializeApp(context)
|
FirebaseApp.initializeApp(context)
|
||||||
crashlytics = FirebaseCrashlytics.getInstance()
|
crashlytics = FirebaseCrashlytics.getInstance()
|
||||||
// KMK -->
|
// KMK -->
|
||||||
if (isPreviewBuildType) {
|
if (isPreviewBuildType) {
|
||||||
analytics.setUserProperty("preview_version", commitCount)
|
analytics?.setUserProperty("preview_version", commitCount)
|
||||||
}
|
}
|
||||||
// KMK <--
|
// KMK <--
|
||||||
}
|
}
|
||||||
|
|
||||||
fun setAnalyticsEnabled(enabled: Boolean) {
|
fun setAnalyticsEnabled(enabled: Boolean) {
|
||||||
analytics.setAnalyticsCollectionEnabled(enabled)
|
analytics?.setAnalyticsCollectionEnabled(enabled)
|
||||||
}
|
}
|
||||||
|
|
||||||
fun setCrashlyticsEnabled(enabled: Boolean) {
|
fun setCrashlyticsEnabled(enabled: Boolean) {
|
||||||
crashlytics.isCrashlyticsCollectionEnabled = enabled
|
crashlytics?.isCrashlyticsCollectionEnabled = enabled
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun Context.isMihonProductionApp(): Boolean {
|
||||||
|
if (packageName !in MIHON_PACKAGES) return false
|
||||||
|
|
||||||
|
return packageManager.getPackageInfo(packageName, SignatureFlags)
|
||||||
|
.getCertificateFingerprints()
|
||||||
|
.any { it == MIHON_CERTIFICATE_FINGERPRINT }
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private val MIHON_PACKAGES = hashSetOf("app.komikku", "app.komikku.beta")
|
||||||
|
private const val MIHON_CERTIFICATE_FINGERPRINT =
|
||||||
|
"CB:EC:12:1A:A8:2E:BB:02:AA:A7:38:06:99:2E:03:68:A9:7D:47:B5:45:1E:D6:52:48:16:D0:30:84:C4:59:05"
|
||||||
|
|
|
||||||
|
|
@ -2,6 +2,10 @@
|
||||||
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
|
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
xmlns:tools="http://schemas.android.com/tools">
|
xmlns:tools="http://schemas.android.com/tools">
|
||||||
|
|
||||||
|
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
|
||||||
|
<uses-permission android:name="android.permission.INTERNET" />
|
||||||
|
<uses-permission android:name="android.permission.WAKE_LOCK" />
|
||||||
|
|
||||||
<!-- Remove unnecessary permissions from Firebase dependency -->
|
<!-- Remove unnecessary permissions from Firebase dependency -->
|
||||||
<uses-permission
|
<uses-permission
|
||||||
android:name="android.permission.ACCESS_ADSERVICES_AD_ID"
|
android:name="android.permission.ACCESS_ADSERVICES_AD_ID"
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue