2021-11-04 16:56:54 +00:00
|
|
|
package org.thoughtcrime.securesms
|
|
|
|
|
2022-02-21 17:39:07 +00:00
|
|
|
import android.content.ContentValues
|
2022-02-14 19:18:03 +00:00
|
|
|
import android.os.Build
|
2022-05-11 16:00:56 +00:00
|
|
|
import android.os.StrictMode
|
|
|
|
import android.os.StrictMode.ThreadPolicy
|
2021-11-04 16:56:54 +00:00
|
|
|
import leakcanary.LeakCanary
|
2022-02-14 19:18:03 +00:00
|
|
|
import org.signal.spinner.Spinner
|
2022-02-23 23:22:58 +00:00
|
|
|
import org.signal.spinner.Spinner.DatabaseConfig
|
2022-02-21 17:39:07 +00:00
|
|
|
import org.thoughtcrime.securesms.database.DatabaseMonitor
|
2022-03-15 00:49:40 +00:00
|
|
|
import org.thoughtcrime.securesms.database.GV2Transformer
|
|
|
|
import org.thoughtcrime.securesms.database.GV2UpdateTransformer
|
2022-03-28 23:43:42 +00:00
|
|
|
import org.thoughtcrime.securesms.database.IsStoryTransformer
|
2022-02-14 19:18:03 +00:00
|
|
|
import org.thoughtcrime.securesms.database.JobDatabase
|
|
|
|
import org.thoughtcrime.securesms.database.KeyValueDatabase
|
|
|
|
import org.thoughtcrime.securesms.database.LocalMetricsDatabase
|
|
|
|
import org.thoughtcrime.securesms.database.LogDatabase
|
|
|
|
import org.thoughtcrime.securesms.database.MegaphoneDatabase
|
2022-02-23 23:22:58 +00:00
|
|
|
import org.thoughtcrime.securesms.database.MessageBitmaskColumnTransformer
|
2022-07-11 19:20:00 +00:00
|
|
|
import org.thoughtcrime.securesms.database.ProfileKeyCredentialTransformer
|
2022-02-21 17:39:07 +00:00
|
|
|
import org.thoughtcrime.securesms.database.QueryMonitor
|
2022-02-14 19:18:03 +00:00
|
|
|
import org.thoughtcrime.securesms.database.SignalDatabase
|
2022-04-20 13:48:44 +00:00
|
|
|
import org.thoughtcrime.securesms.database.TimestampTransformer
|
2022-03-09 22:22:52 +00:00
|
|
|
import org.thoughtcrime.securesms.keyvalue.SignalStore
|
|
|
|
import org.thoughtcrime.securesms.recipients.Recipient
|
2022-02-14 19:18:03 +00:00
|
|
|
import org.thoughtcrime.securesms.util.AppSignatureUtil
|
2021-11-04 16:56:54 +00:00
|
|
|
import shark.AndroidReferenceMatchers
|
2022-04-25 16:37:25 +00:00
|
|
|
import java.util.Locale
|
2021-11-04 16:56:54 +00:00
|
|
|
|
2022-02-14 19:18:03 +00:00
|
|
|
class SpinnerApplicationContext : ApplicationContext() {
|
2021-11-04 16:56:54 +00:00
|
|
|
override fun onCreate() {
|
|
|
|
super.onCreate()
|
|
|
|
|
2022-05-11 16:00:56 +00:00
|
|
|
StrictMode.setThreadPolicy(
|
|
|
|
ThreadPolicy.Builder()
|
|
|
|
.detectDiskReads()
|
|
|
|
.detectDiskWrites()
|
2022-05-11 23:21:55 +00:00
|
|
|
.detectNetwork()
|
2022-05-11 16:00:56 +00:00
|
|
|
.penaltyLog()
|
|
|
|
.build()
|
|
|
|
)
|
|
|
|
|
2022-05-25 20:42:48 +00:00
|
|
|
try {
|
|
|
|
Class.forName("dalvik.system.CloseGuard")
|
|
|
|
.getMethod("setEnabled", Boolean::class.javaPrimitiveType)
|
|
|
|
.invoke(null, true)
|
|
|
|
} catch (e: ReflectiveOperationException) {
|
|
|
|
throw RuntimeException(e)
|
|
|
|
}
|
|
|
|
|
2022-02-14 19:18:03 +00:00
|
|
|
Spinner.init(
|
|
|
|
this,
|
2022-03-09 22:22:52 +00:00
|
|
|
mapOf(
|
|
|
|
"Device" to "${Build.MODEL} (Android ${Build.VERSION.RELEASE}, API ${Build.VERSION.SDK_INT})",
|
2022-05-19 20:21:37 +00:00
|
|
|
"Package" to "$packageName (${AppSignatureUtil.getAppSignature(this)})",
|
2022-03-09 22:22:52 +00:00
|
|
|
"App Version" to "${BuildConfig.VERSION_NAME} (${BuildConfig.CANONICAL_VERSION_CODE}, ${BuildConfig.GIT_HASH})",
|
|
|
|
"Profile Name" to (if (SignalStore.account().isRegistered) Recipient.self().profileName.toString() else "none"),
|
|
|
|
"E164" to (SignalStore.account().e164 ?: "none"),
|
|
|
|
"ACI" to (SignalStore.account().aci?.toString() ?: "none"),
|
2022-04-25 16:37:25 +00:00
|
|
|
"PNI" to (SignalStore.account().pni?.toString() ?: "none"),
|
|
|
|
Spinner.KEY_ENVIRONMENT to BuildConfig.FLAVOR_environment.toUpperCase(Locale.US)
|
2022-02-14 19:18:03 +00:00
|
|
|
),
|
|
|
|
linkedMapOf(
|
2022-02-23 23:22:58 +00:00
|
|
|
"signal" to DatabaseConfig(
|
|
|
|
db = SignalDatabase.rawDatabase,
|
2022-07-11 19:20:00 +00:00
|
|
|
columnTransformers = listOf(MessageBitmaskColumnTransformer, GV2Transformer, GV2UpdateTransformer, IsStoryTransformer, TimestampTransformer, ProfileKeyCredentialTransformer)
|
2022-02-23 23:22:58 +00:00
|
|
|
),
|
|
|
|
"jobmanager" to DatabaseConfig(db = JobDatabase.getInstance(this).sqlCipherDatabase),
|
|
|
|
"keyvalue" to DatabaseConfig(db = KeyValueDatabase.getInstance(this).sqlCipherDatabase),
|
|
|
|
"megaphones" to DatabaseConfig(db = MegaphoneDatabase.getInstance(this).sqlCipherDatabase),
|
|
|
|
"localmetrics" to DatabaseConfig(db = LocalMetricsDatabase.getInstance(this).sqlCipherDatabase),
|
|
|
|
"logs" to DatabaseConfig(db = LogDatabase.getInstance(this).sqlCipherDatabase),
|
2022-06-24 15:07:37 +00:00
|
|
|
),
|
|
|
|
linkedMapOf(
|
|
|
|
StorageServicePlugin.PATH to StorageServicePlugin()
|
2022-02-14 19:18:03 +00:00
|
|
|
)
|
|
|
|
)
|
2021-11-04 16:56:54 +00:00
|
|
|
|
2022-02-21 17:39:07 +00:00
|
|
|
DatabaseMonitor.initialize(object : QueryMonitor {
|
|
|
|
override fun onSql(sql: String, args: Array<Any>?) {
|
|
|
|
Spinner.onSql("signal", sql, args)
|
|
|
|
}
|
|
|
|
|
|
|
|
override fun onQuery(distinct: Boolean, table: String, projection: Array<String>?, selection: String?, args: Array<Any>?, groupBy: String?, having: String?, orderBy: String?, limit: String?) {
|
|
|
|
Spinner.onQuery("signal", distinct, table, projection, selection, args, groupBy, having, orderBy, limit)
|
|
|
|
}
|
|
|
|
|
|
|
|
override fun onDelete(table: String, selection: String?, args: Array<Any>?) {
|
|
|
|
Spinner.onDelete("signal", table, selection, args)
|
|
|
|
}
|
|
|
|
|
|
|
|
override fun onUpdate(table: String, values: ContentValues, selection: String?, args: Array<Any>?) {
|
|
|
|
Spinner.onUpdate("signal", table, values, selection, args)
|
|
|
|
}
|
|
|
|
})
|
|
|
|
|
2021-11-04 16:56:54 +00:00
|
|
|
LeakCanary.config = LeakCanary.config.copy(
|
|
|
|
referenceMatchers = AndroidReferenceMatchers.appDefaults +
|
2021-11-11 17:27:22 +00:00
|
|
|
AndroidReferenceMatchers.ignoredInstanceField(
|
2021-11-04 16:56:54 +00:00
|
|
|
className = "android.service.media.MediaBrowserService\$ServiceBinder",
|
2021-11-11 17:27:22 +00:00
|
|
|
fieldName = "this\$0"
|
2021-11-04 16:56:54 +00:00
|
|
|
) +
|
2021-11-11 17:27:22 +00:00
|
|
|
AndroidReferenceMatchers.ignoredInstanceField(
|
2021-11-04 16:56:54 +00:00
|
|
|
className = "androidx.media.MediaBrowserServiceCompat\$MediaBrowserServiceImplApi26\$MediaBrowserServiceApi26",
|
2021-11-11 17:27:22 +00:00
|
|
|
fieldName = "mBase"
|
2021-11-04 16:56:54 +00:00
|
|
|
) +
|
2021-11-11 17:27:22 +00:00
|
|
|
AndroidReferenceMatchers.ignoredInstanceField(
|
|
|
|
className = "android.support.v4.media.MediaBrowserCompat",
|
|
|
|
fieldName = "mImpl"
|
|
|
|
) +
|
|
|
|
AndroidReferenceMatchers.ignoredInstanceField(
|
|
|
|
className = "android.support.v4.media.session.MediaControllerCompat",
|
|
|
|
fieldName = "mToken"
|
|
|
|
) +
|
|
|
|
AndroidReferenceMatchers.ignoredInstanceField(
|
|
|
|
className = "android.support.v4.media.session.MediaControllerCompat",
|
|
|
|
fieldName = "mImpl"
|
|
|
|
) +
|
|
|
|
AndroidReferenceMatchers.ignoredInstanceField(
|
2021-11-04 16:56:54 +00:00
|
|
|
className = "org.thoughtcrime.securesms.components.voice.VoiceNotePlaybackService",
|
2021-11-11 17:27:22 +00:00
|
|
|
fieldName = "mApplication"
|
|
|
|
) +
|
|
|
|
AndroidReferenceMatchers.ignoredInstanceField(
|
|
|
|
className = "org.thoughtcrime.securesms.service.GenericForegroundService\$LocalBinder",
|
|
|
|
fieldName = "this\$0"
|
|
|
|
) +
|
|
|
|
AndroidReferenceMatchers.ignoredInstanceField(
|
|
|
|
className = "org.thoughtcrime.securesms.contacts.ContactsSyncAdapter",
|
|
|
|
fieldName = "mContext"
|
2021-11-04 16:56:54 +00:00
|
|
|
)
|
|
|
|
)
|
|
|
|
}
|
2021-11-04 16:59:02 +00:00
|
|
|
}
|