テレビではこんな事はできないよな。

どうすんの、テレビ。
うまくパソコン上でキャプチャできないのが謎。
素晴らしいツールを公開されています。
結果は以下。

implementation "com.google.accompanist:accompanist-systemuicontroller:0.17.0"
implementation 'com.google.accompanist:accompanist-swiperefresh:0.26.5-rc'
[versions]
comGoogleAccompanist = "0.17.0"
[libraries]
com-google-accompanist-systemuicontroller = { module = "com.google.accompanist:accompanist-systemuicontroller", version.ref = "comGoogleAccompanist" }
com-google-accompanist-swiperefresh = { module = "com.google.accompanist:accompanist-swiperefresh", version.ref = "comGoogleAccompanist" }
build.gradle
implementation libs.com.google.accompanist.systemuicontroller
implementation libs.com.google.accompanist.swiperefresh
build.gradle.kts
implementation(libs.com.google.accompanist.systemuicontroller)
implementation(libs.com.google.accompanist.swiperefresh)
高機能で便利です。
作った動機はだれもが同感できるでしょう。
ということで、
私も python の勉強がてら雑魚ツールを作ります。
クリップボードにコピーした
implementation "com.google.accompanist:accompanist-systemuicontroller:0.17.0"
implementation 'com.google.accompanist:accompanist-swiperefresh:0.26.5-rc'
を python スクリプト実行後すると
* source
implementation "com.google.accompanist:accompanist-systemuicontroller:0.17.0"
implementation 'com.google.accompanist:accompanist-swiperefresh:0.26.5-rc'
* gradle/libs.versions.toml
[libraries]
accompanist-systemuicontroller = { module = "com.google.accompanist:accompanist-systemuicontroller", version = "0.17.0"" }
accompanist-swiperefresh = { module = "com.google.accompanist:accompanist-swiperefresh", version = "0.26.5-rc" }
* build.gradle
implementation libs.accompanist.systemuicontroller
implementation libs.accompanist.swiperefresh
と表示します。
まずは、ただそれだけです。
[versions] を設定するのもだるい implementation 単独バージョンのライブラリ用。

幼稚なスクリプトなので拡張や変更、削除しやすいです。
重複に注意です。
このへんの変換処理は、
きっと、Android Studio プラグインが登場して、
そのあと、Android Studio に取り込まれいく
のだろうと妄想しています。
それまでのつなぎで。
※ このページは gist を更新しながら更新していきます。
※ 追記: こんなのあったんですね!
libs.versions.tomlを人間が書くのは心が折れるので、Version catalog update pluginで自動生成するといいですよ…#io22jphttps://t.co/F4o3kXhqDf
— quesera2 (@quesera2262) June 5, 2022
👉 【Gradle Version Catalog】libs.versions.toml キー名の形式 camelCase vs kebab-case
👉 Getting Started - Multiplatform - SQLDelight
👉 SQLDelight 1.x Quick Start Guide for Android – Handstand Sam
マルチプラットフォームに対応していますが、
まずは、Android のみで使ってみると良いです。
👉 Getting Started - Android - SQLDelight
Todo アプリ向けの Repository を作ります。

Hilt と Flow を使っています。
Gradleまわりは書き方いろいろですけども適宜書き換えてください。
buildscript {
repositories {
google()
mavenCentral()
}
dependencies {
classpath 'com.squareup.sqldelight:gradle-plugin:1.5.3'
}
}
apply plugin: 'com.squareup.sqldelight'
// android driver
implementation "com.squareup.sqldelight:android-driver:1.5.3"
// flow-coroutine extension
implementation "com.squareup.sqldelight:coroutines-extensions:1.5.3"
パッケージ名を、com.your.package としています。
-- app/src/main/sqldelight/com/your/package/data/Todo.sq
CREATE TABLE todo (
id INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT,
text TEXT NOT NULL,
updated INTEGER NOT NULL DEFAULT (strftime('%s', 'now'))
);
INSERT INTO todo(text) VALUES ('宿題をする');
INSERT INTO todo(text) VALUES ('マンガを読む');
INSERT INTO todo(text) VALUES ('プールに行く');
selectAll:
SELECT * FROM todo ORDER BY updated DESC;
deleteAll:
DELETE FROM todo;
insert:
INSERT INTO todo (text) VALUES (:text);
update:
UPDATE todo SET text = :text, updated = (strftime('%s', 'now')) WHERE id = :entryId;
delete:
DELETE FROM todo
WHERE id = :entryId;
count:
SELECT COUNT(id) FROM todo;
Todo.sq ファイルをテキストで作成して、テーブル定義、実行クエリーとメソッド名を箇条書きします。
配置位置は、上記コメントの位置が自然で分かりやすいと思います。
この場合、SQLDelight によって以下に実装に利用するクラス群が生成されます。
app/build/generated/sqldelight/code/Database/debug/com/your/package/
SQLDelightによって生成された Database クラスを利用して書きます。
今回は Android向けなので、AndroidSqliteDriver を使っています。
@Module
@InstallIn(SingletonComponent::class)
object DatabaseModule {
@Provides
@Singleton
fun provideDatabase(@ApplicationContext context: Context): Database {
val driver = AndroidSqliteDriver(Database.Schema, context, DB_NAME)
return Database(driver)
}
private const val DB_NAME = "database.db"
}
JetpackCompose の UI である Screen-level の Composable はマルチに稼働しているので、 @Singleton としておくことを忘れてはなりません。
時間のかかる処理は Flow を使っておきます。
class TodoRepository @Inject constructor(
private val database: Database
) {
fun load(): Flow<List<Todo>> {
return database.todoQueries.selectAll().asFlow().mapToList(Dispatchers.IO)
}
fun count(): Flow<Long> {
return database.todoQueries.count().asFlow().mapToOne(Dispatchers.IO)
}
fun insert(text: String) {
database.todoQueries.insert(text)
}
fun update(id: Long, text: String) {
database.todoQueries.update(text, id)
}
fun delete(id: Long) {
database.todoQueries.delete(id)
}
}
Flow - Couroutine Extension は非常に便利です。
fun load(): Flow<List<Todo>> {
return database.todoQueries.selectAll().asFlow().mapToList(Dispatchers.IO)
}
Cold な Flow で単発の List<Todo> の emit ではなく、データベースが変更されるたびに、新しい List<Todo> を emit してくれます。
@JvmName("toFlow")
fun <T : Any> Query<T>.asFlow(): Flow<Query<T>> = flow {
val channel = Channel<Unit>(CONFLATED)
channel.trySend(Unit)
val listener = object : Query.Listener {
override fun queryResultsChanged() {
channel.trySend(Unit)
}
}
addListener(listener)
try {
for (item in channel) {
emit(this@asFlow)
}
} finally {
removeListener(listener)
}
}
👉 sqldelight/FlowExtensions.kt at master · cashapp/sqldelight
(更新中...)
数年で一気に変わってます、JSONの取り扱い処理。
Kotlin 内蔵の serialization を使うのが良いでしょう。
👉 Kotlin/kotlinx.serialization: Kotlin multiplatform / multi-format serialization
@Provides
@Singleton
fun provideRetrofit(okHttpClient: OkHttpClient): Retrofit {
val contentType = "application/json".toMediaType()
val json = Json {
ignoreUnknownKeys = true
isLenient = true
} // *
return Retrofit.Builder()
.client(okHttpClient)
.baseUrl(BASE_URL)
.addConverterFactory(json.asConverterFactory(contentType))
.build()
}
処理時に便利に設定を変えられるようになっているので、
よくあるやつを並べておきます。

👉 【仮想通貨】Cryptowatch Public Market REST API を眺める
デフォルトでは、逆シリアル化中に不明なキーが検出されるとエラーが発生します。 これを回避し、ignoreUnknownKeysプロパティをtrueに設定することで、このようなキーを無視できます。
👉 kotlinx.serialization/json.md at master · Kotlin/kotlinx.serialization
公開されている WEB-API には不要なデータがたくさんあります。
それを無視するための設定です。
デフォルトでは、JsonパーサーはさまざまなJSON制限を強制して、可能な限り仕様に準拠します(RFC-4627を参照)。 特に、キーは引用符で囲まれている必要があり、リテラルは引用符で囲まれていない必要があります。 これらの制限は、isLenientプロパティを使用して緩和できます。 isLenient = trueを使用すると、非常に自由にフォーマットされたデータを解析できます。
私はどうしても必要なときにしか使いません。
RFCに基づかないJSONは一応留意しておきたいので。
👉 kotlinx.serialization/json.md at master · Kotlin/kotlinx.serialization
👉 RFC 4627 - The application/json Media Type for JavaScript Object Notation (JSON)
一度、テンプレート化しておくと、当分使い回すことができます。
調べるときに、いろいろ古い情報が多くて時間かかったので、メモとして。
👉 【Retorofit】コピペで使える NetworkModule【Dagger Hilt】
👉 Kotlin/kotlinx.serialization: Kotlin multiplatform / multi-format serialization
【Retorofit】コピペで使える NetworkModule【Dagger Hilt】 https://t.co/zf9cpgxhP8 #android #kotlin #hilt #プログラミング
— chanzmao (@maochanz) June 2, 2022
[Preferences]
↓
[Editor]
↓
[Code Style]
↓
[Kotlin]
↓
[Imports]
↓
[Top-Level Symbols]/[Java Statics and Enum members]
↓
[Use single name import]

Input text 'single name' into search area on Preferences screen 🙆