diff --git a/app/src/spinner/java/org/thoughtcrime/securesms/SpinnerApplicationContext.kt b/app/src/spinner/java/org/thoughtcrime/securesms/SpinnerApplicationContext.kt index 29d3d2d75..8ddee0c3b 100644 --- a/app/src/spinner/java/org/thoughtcrime/securesms/SpinnerApplicationContext.kt +++ b/app/src/spinner/java/org/thoughtcrime/securesms/SpinnerApplicationContext.kt @@ -51,25 +51,25 @@ class SpinnerApplicationContext : ApplicationContext() { Spinner.init( this, mapOf( - "Device" to "${Build.MODEL} (Android ${Build.VERSION.RELEASE}, API ${Build.VERSION.SDK_INT})", - "Package" to "$packageName (${AppSignatureUtil.getAppSignature(this)})", - "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"), - "PNI" to (SignalStore.account().pni?.toString() ?: "none"), - Spinner.KEY_ENVIRONMENT to BuildConfig.FLAVOR_environment.uppercase(Locale.US) + "Device" to { "${Build.MODEL} (Android ${Build.VERSION.RELEASE}, API ${Build.VERSION.SDK_INT})" }, + "Package" to { "$packageName (${AppSignatureUtil.getAppSignature(this)})" }, + "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" }, + "PNI" to { SignalStore.account().pni?.toString() ?: "none" }, + Spinner.KEY_ENVIRONMENT to { BuildConfig.FLAVOR_environment.uppercase(Locale.US) } ), linkedMapOf( "signal" to DatabaseConfig( - db = SignalDatabase.rawDatabase, + db = { SignalDatabase.rawDatabase }, columnTransformers = listOf(MessageBitmaskColumnTransformer, GV2Transformer, GV2UpdateTransformer, IsStoryTransformer, TimestampTransformer, ProfileKeyCredentialTransformer) ), - "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), + "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 }), ), linkedMapOf( StorageServicePlugin.PATH to StorageServicePlugin() diff --git a/spinner/app/src/main/java/org/signal/spinnertest/MainActivity.kt b/spinner/app/src/main/java/org/signal/spinnertest/MainActivity.kt index 40fee9d01..e0fdcceb8 100644 --- a/spinner/app/src/main/java/org/signal/spinnertest/MainActivity.kt +++ b/spinner/app/src/main/java/org/signal/spinnertest/MainActivity.kt @@ -20,10 +20,10 @@ class MainActivity : AppCompatActivity() { Spinner.init( application, mapOf( - "Name" to "${Build.MODEL} (API ${Build.VERSION.SDK_INT})", - "Package" to packageName + "Name" to { "${Build.MODEL} (API ${Build.VERSION.SDK_INT})" }, + "Package" to { packageName } ), - mapOf("main" to Spinner.DatabaseConfig(db = db)), + mapOf("main" to Spinner.DatabaseConfig(db = { db })), emptyMap() ) } diff --git a/spinner/lib/src/main/java/org/signal/spinner/Spinner.kt b/spinner/lib/src/main/java/org/signal/spinner/Spinner.kt index 5f23a8c42..ff7a0f516 100644 --- a/spinner/lib/src/main/java/org/signal/spinner/Spinner.kt +++ b/spinner/lib/src/main/java/org/signal/spinner/Spinner.kt @@ -18,7 +18,7 @@ object Spinner { private lateinit var server: SpinnerServer - fun init(application: Application, deviceInfo: Map, databases: Map, plugins: Map) { + fun init(application: Application, deviceInfo: Map String>, databases: Map, plugins: Map) { try { server = SpinnerServer(application, deviceInfo, databases, plugins) server.start() @@ -91,7 +91,7 @@ object Spinner { } data class DatabaseConfig( - val db: SupportSQLiteDatabase, + val db: () -> SupportSQLiteDatabase, val columnTransformers: List = emptyList() ) } diff --git a/spinner/lib/src/main/java/org/signal/spinner/SpinnerServer.kt b/spinner/lib/src/main/java/org/signal/spinner/SpinnerServer.kt index 75e991a39..04b5dbb85 100644 --- a/spinner/lib/src/main/java/org/signal/spinner/SpinnerServer.kt +++ b/spinner/lib/src/main/java/org/signal/spinner/SpinnerServer.kt @@ -28,7 +28,7 @@ import kotlin.math.min */ internal class SpinnerServer( private val application: Application, - deviceInfo: Map, + deviceInfo: Map String>, private val databases: Map, private val plugins: Map ) : NanoHTTPD(5000) { @@ -37,8 +37,8 @@ internal class SpinnerServer( private val TAG = Log.tag(SpinnerServer::class.java) } - private val deviceInfo: Map = deviceInfo.filterKeys { !it.startsWith(Spinner.KEY_PREFIX) } - private val environment: String = deviceInfo[Spinner.KEY_ENVIRONMENT] ?: "UNKNOWN" + private val deviceInfo: Map String> = deviceInfo.filterKeys { !it.startsWith(Spinner.KEY_PREFIX) } + private val environment: String = deviceInfo[Spinner.KEY_ENVIRONMENT]?.let { it() } ?: "UNKNOWN" private val handlebars: Handlebars = Handlebars(AssetTemplateLoader(application)).apply { registerHelper("eq", ConditionalHelpers.eq) @@ -61,8 +61,8 @@ internal class SpinnerServer( return when { session.method == Method.GET && session.uri == "/css/main.css" -> newFileResponse("css/main.css", "text/css") session.method == Method.GET && session.uri == "/js/main.js" -> newFileResponse("js/main.js", "text/javascript") - session.method == Method.GET && session.uri == "/" -> getIndex(dbParam, dbConfig.db) - session.method == Method.GET && session.uri == "/browse" -> getBrowse(dbParam, dbConfig.db) + session.method == Method.GET && session.uri == "/" -> getIndex(dbParam, dbConfig.db()) + session.method == Method.GET && session.uri == "/browse" -> getBrowse(dbParam, dbConfig.db()) session.method == Method.POST && session.uri == "/browse" -> postBrowse(dbParam, dbConfig, session) session.method == Method.GET && session.uri == "/query" -> getQuery(dbParam) session.method == Method.POST && session.uri == "/query" -> postQuery(dbParam, dbConfig, session) @@ -98,7 +98,7 @@ internal class SpinnerServer( "overview", OverviewPageModel( environment = environment, - deviceInfo = deviceInfo, + deviceInfo = deviceInfo.resolve(), database = dbName, databases = databases.keys.toList(), plugins = plugins.values.toList(), @@ -115,7 +115,7 @@ internal class SpinnerServer( "browse", BrowsePageModel( environment = environment, - deviceInfo = deviceInfo, + deviceInfo = deviceInfo.resolve(), database = dbName, databases = databases.keys.toList(), plugins = plugins.values.toList(), @@ -130,7 +130,7 @@ internal class SpinnerServer( var pageIndex: Int = session.parameters["pageIndex"]?.get(0)?.toInt() ?: 0 val action: String? = session.parameters["action"]?.get(0) - val rowCount = dbConfig.db.getTableRowCount(table) + val rowCount = dbConfig.db().getTableRowCount(table) val pageCount = ceil(rowCount.toFloat() / pageSize.toFloat()).toInt() when (action) { @@ -141,17 +141,17 @@ internal class SpinnerServer( } val query = "select * from $table limit $pageSize offset ${pageSize * pageIndex}" - val queryResult = dbConfig.db.query(query).use { it.toQueryResult(columnTransformers = dbConfig.columnTransformers) } + val queryResult = dbConfig.db().query(query).use { it.toQueryResult(columnTransformers = dbConfig.columnTransformers) } return renderTemplate( "browse", BrowsePageModel( environment = environment, - deviceInfo = deviceInfo, + deviceInfo = deviceInfo.resolve(), database = dbName, databases = databases.keys.toList(), plugins = plugins.values.toList(), - tableNames = dbConfig.db.getTableNames(), + tableNames = dbConfig.db().getTableNames(), table = table, queryResult = queryResult, pagingData = PagingData( @@ -171,7 +171,7 @@ internal class SpinnerServer( "query", QueryPageModel( environment = environment, - deviceInfo = deviceInfo, + deviceInfo = deviceInfo.resolve(), database = dbName, databases = databases.keys.toList(), plugins = plugins.values.toList(), @@ -193,7 +193,7 @@ internal class SpinnerServer( "recent", RecentPageModel( environment = environment, - deviceInfo = deviceInfo, + deviceInfo = deviceInfo.resolve(), database = dbName, databases = databases.keys.toList(), plugins = plugins.values.toList(), @@ -212,12 +212,12 @@ internal class SpinnerServer( "query", QueryPageModel( environment = environment, - deviceInfo = deviceInfo, + deviceInfo = deviceInfo.resolve(), database = dbName, databases = databases.keys.toList(), plugins = plugins.values.toList(), query = rawQuery, - queryResult = dbConfig.db.query(query).use { it.toQueryResult(queryStartTimeNanos = startTimeNanos, columnTransformers = dbConfig.columnTransformers) } + queryResult = dbConfig.db().query(query).use { it.toQueryResult(queryStartTimeNanos = startTimeNanos, columnTransformers = dbConfig.columnTransformers) } ) ) } @@ -227,7 +227,7 @@ internal class SpinnerServer( "plugin", PluginPageModel( environment = environment, - deviceInfo = deviceInfo, + deviceInfo = deviceInfo.resolve(), database = dbName, databases = databases.keys.toList(), plugins = plugins.values.toList(), @@ -389,6 +389,10 @@ internal class SpinnerServer( return params[name] } + private fun Map String>.resolve(): Map { + return this.mapValues { entry -> entry.value() }.toMap() + } + interface PrefixPageData { val environment: String val deviceInfo: Map