diff --git a/apng_android/build.gradle b/apng_android/build.gradle
index ce76d118..232def65 100644
--- a/apng_android/build.gradle
+++ b/apng_android/build.gradle
@@ -31,11 +31,11 @@ android {
kotlinOptions {
jvmTarget = jvm_target
freeCompilerArgs += [
- "-Xopt-in=kotlin.ExperimentalStdlibApi",
- "-Xopt-in=kotlinx.coroutines.ExperimentalCoroutinesApi",
- "-Xopt-in=kotlinx.serialization.ExperimentalSerializationApi",
- "-Xopt-in=androidx.compose.foundation.ExperimentalFoundationApi",
- "-Xopt-in=androidx.compose.animation.ExperimentalAnimationApi",
+ // "-opt-in=kotlin.ExperimentalStdlibApi",
+ // "-opt-in=kotlinx.coroutines.ExperimentalCoroutinesApi",
+ // "-opt-in=kotlinx.serialization.ExperimentalSerializationApi",
+ // "-opt-in=androidx.compose.foundation.ExperimentalFoundationApi",
+ // "-opt-in=androidx.compose.animation.ExperimentalAnimationApi",
]
}
}
@@ -46,13 +46,12 @@ repositories {
dependencies {
testImplementation "junit:junit:$junit_version"
- androidTestImplementation 'androidx.test:runner:1.4.0'
- androidTestImplementation 'androidx.test.espresso:espresso-core:3.4.0'
+ androidTestImplementation 'androidx.test:runner:1.5.1'
+ androidTestImplementation 'androidx.test.espresso:espresso-core:3.5.0'
api project(':apng')
// 'api' に指定した依存関係はこのライブラリの利用者に公開されます
// 'implementation' に指定した依存関係はこのライブラリの利用者に公開されません
implementation fileTree(dir: 'libs', include: ['*.jar'])
- implementation "org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version"
}
diff --git a/app/build.gradle b/app/build.gradle
index 70df08e4..1f1796d2 100644
--- a/app/build.gradle
+++ b/app/build.gradle
@@ -135,7 +135,7 @@ dependencies {
// targetSdkVersion 31 で androidTest 時に android:exported 云々で怒られる問題の対策
// https://github.com/android/android-test/issues/1022
- androidTestImplementation "androidx.test:core:1.4.0"
+ androidTestImplementation "androidx.test:core:$androidx_test_version"
androidTestImplementation('androidx.test.espresso:espresso-core:3.1.0-alpha4', {
exclude group: 'com.android.support', module: 'support-annotations'
@@ -176,7 +176,7 @@ dependencies {
kapt 'androidx.annotation:annotation:1.5.0'
// https://firebase.google.com/support/release-notes/android
- implementation "com.google.firebase:firebase-messaging:23.1.0"
+ implementation "com.google.firebase:firebase-messaging:23.1.1"
implementation "org.jetbrains.kotlin:kotlin-reflect"
testImplementation "org.jetbrains.kotlin:kotlin-test"
@@ -231,7 +231,7 @@ dependencies {
implementation 'com.astuetz:pagerslidingtabstrip:1.0.1'
- implementation 'com.google.android.exoplayer:exoplayer:2.18.1'
+ implementation 'com.google.android.exoplayer:exoplayer:2.18.2'
/*
WARNING: [Processor] Library '…\exoplayer-ui-2.12.0.aar' contains references to both AndroidX and old support library. This seems like the library is partially migrated. Jetifier will try to rewrite the library anyway.
Example of androidX reference: 'androidx/core/app/NotificationCompat$Builder'
@@ -267,7 +267,7 @@ dependencies {
// optional - Test helpers for LiveData
testImplementation "androidx.arch.core:core-testing:$arch_version"
- implementation 'androidx.work:work-runtime-ktx:2.8.0-beta01'
+ implementation 'androidx.work:work-runtime-ktx:2.8.0-rc01'
def roomVersion = "2.4.3"
implementation "androidx.room:room-runtime:$roomVersion"
diff --git a/app/src/main/java/com/bumptech/glide/load/resource/gif/MyGifDrawable.kt b/app/src/main/java/com/bumptech/glide/load/resource/gif/MyGifDrawable.kt
index f95e0287..9910f2f2 100644
--- a/app/src/main/java/com/bumptech/glide/load/resource/gif/MyGifDrawable.kt
+++ b/app/src/main/java/com/bumptech/glide/load/resource/gif/MyGifDrawable.kt
@@ -1,16 +1,15 @@
package com.bumptech.glide.load.resource.gif
import android.annotation.SuppressLint
-import com.bumptech.glide.gifdecoder.GifDecoder.TOTAL_ITERATION_COUNT_FOREVER
-
import android.content.Context
import android.graphics.*
import android.graphics.drawable.Animatable
import android.graphics.drawable.Drawable
-import androidx.annotation.VisibleForTesting
import android.view.Gravity
+import androidx.annotation.VisibleForTesting
import com.bumptech.glide.Glide
import com.bumptech.glide.gifdecoder.GifDecoder
+import com.bumptech.glide.gifdecoder.GifDecoder.TOTAL_ITERATION_COUNT_FOREVER
import com.bumptech.glide.load.Transformation
import com.bumptech.glide.load.engine.bitmap_recycle.BitmapPool
import com.bumptech.glide.util.Preconditions
@@ -349,10 +348,10 @@ class MyGifDrawable internal constructor(
return p
}
- override fun getOpacity(): Int {
- // We can't tell, so default to transparent to be safe.
- return PixelFormat.TRANSPARENT
- }
+ // We can't tell, so default to transparent to be safe.
+ @Suppress("DeprecatedCallableAddReplaceWith")
+ @Deprecated("deprecated in API level 29.")
+ override fun getOpacity() = PixelFormat.TRANSPARENT
// See #1087.
private fun findCallback(): Callback? {
diff --git a/app/src/main/java/jp/juggler/subwaytooter/ActHighlightWordEdit.kt b/app/src/main/java/jp/juggler/subwaytooter/ActHighlightWordEdit.kt
index 21739f44..5bfcff13 100644
--- a/app/src/main/java/jp/juggler/subwaytooter/ActHighlightWordEdit.kt
+++ b/app/src/main/java/jp/juggler/subwaytooter/ActHighlightWordEdit.kt
@@ -61,16 +61,15 @@ class ActHighlightWordEdit
}
}
- override fun onBackPressed() {
- AlertDialog.Builder(this)
- .setCancelable(true)
- .setMessage(R.string.discard_changes)
- .setPositiveButton(R.string.no, null)
- .setNegativeButton(R.string.yes) { _, _ -> finish() }
- .show()
- }
-
override fun onCreate(savedInstanceState: Bundle?) {
+ backPressed{
+ AlertDialog.Builder(this)
+ .setCancelable(true)
+ .setMessage(R.string.discard_changes)
+ .setPositiveButton(R.string.no, null)
+ .setNegativeButton(R.string.yes) { _, _ -> finish() }
+ .show()
+ }
super.onCreate(savedInstanceState)
arNotificationSound.register(this)
App1.setActivityTheme(this)
diff --git a/app/src/main/java/jp/juggler/subwaytooter/ActMain.kt b/app/src/main/java/jp/juggler/subwaytooter/ActMain.kt
index 96149597..fd274004 100644
--- a/app/src/main/java/jp/juggler/subwaytooter/ActMain.kt
+++ b/app/src/main/java/jp/juggler/subwaytooter/ActMain.kt
@@ -295,7 +295,7 @@ class ActMain : AppCompatActivity(),
val arActText = ActivityResultHandler(log) { r ->
when (r.resultCode) {
ActText.RESULT_SEARCH_MSP -> searchFromActivityResult(r.data, ColumnType.SEARCH_MSP)
- ActText.RESULT_SEARCH_TS -> searchFromActivityResult(r.data, ColumnType.SEARCH_TS)
+ // ActText.RESULT_SEARCH_TS -> searchFromActivityResult(r.data, ColumnType.SEARCH_TS)
ActText.RESULT_SEARCH_NOTESTOCK -> searchFromActivityResult(
r.data,
ColumnType.SEARCH_NOTESTOCK
@@ -315,6 +315,7 @@ class ActMain : AppCompatActivity(),
// ライフサイクルイベント
override fun onCreate(savedInstanceState: Bundle?) {
+ backPressed { onBackPressedImpl() }
log.d("onCreate")
super.onCreate(savedInstanceState)
refActMain = WeakReference(this)
@@ -617,8 +618,6 @@ class ActMain : AppCompatActivity(),
}
}
- override fun onBackPressed() = onBackPressedImpl()
-
override fun onClick(v: View) = onClickImpl(v)
override fun onMyClickableSpanClicked(viewClicked: View, span: MyClickableSpan) =
diff --git a/app/src/main/java/jp/juggler/subwaytooter/ActText.kt b/app/src/main/java/jp/juggler/subwaytooter/ActText.kt
index a74d905f..0c0b7340 100644
--- a/app/src/main/java/jp/juggler/subwaytooter/ActText.kt
+++ b/app/src/main/java/jp/juggler/subwaytooter/ActText.kt
@@ -25,7 +25,7 @@ class ActText : AppCompatActivity() {
internal val log = LogCategory("ActText")
internal const val RESULT_SEARCH_MSP = RESULT_FIRST_USER + 1
- internal const val RESULT_SEARCH_TS = RESULT_FIRST_USER + 2
+ // internal const val RESULT_SEARCH_TS = RESULT_FIRST_USER + 2
internal const val RESULT_SEARCH_NOTESTOCK = RESULT_FIRST_USER + 3
internal const val EXTRA_TEXT = "text"
@@ -83,7 +83,7 @@ class ActText : AppCompatActivity() {
selection,
)
- R.id.btnSearchTS -> searchToot(RESULT_SEARCH_TS)
+ // R.id.btnSearchTS -> searchToot(RESULT_SEARCH_TS)
R.id.btnSearchNotestock -> searchToot(RESULT_SEARCH_NOTESTOCK)
diff --git a/app/src/main/java/jp/juggler/subwaytooter/actmain/ActMainActions.kt b/app/src/main/java/jp/juggler/subwaytooter/actmain/ActMainActions.kt
index 35fefc88..bdb50e40 100644
--- a/app/src/main/java/jp/juggler/subwaytooter/actmain/ActMainActions.kt
+++ b/app/src/main/java/jp/juggler/subwaytooter/actmain/ActMainActions.kt
@@ -5,8 +5,6 @@ import android.view.View
import android.widget.TextView
import androidx.core.view.GravityCompat
import jp.juggler.subwaytooter.ActMain
-import jp.juggler.subwaytooter.pref.PrefB
-import jp.juggler.subwaytooter.pref.PrefI
import jp.juggler.subwaytooter.R
import jp.juggler.subwaytooter.action.openColumnList
import jp.juggler.subwaytooter.action.openPost
@@ -19,10 +17,11 @@ import jp.juggler.subwaytooter.columnviewholder.ViewHolderHeaderBase
import jp.juggler.subwaytooter.columnviewholder.ViewHolderItem
import jp.juggler.subwaytooter.dialog.ActionsDialog
import jp.juggler.subwaytooter.itemviewholder.ItemViewHolder
+import jp.juggler.subwaytooter.pref.PrefB
+import jp.juggler.subwaytooter.pref.PrefI
import jp.juggler.subwaytooter.span.MyClickableSpan
import jp.juggler.subwaytooter.util.openCustomTab
import jp.juggler.util.*
-import java.util.*
private val log = LogCategory("ActMainActions")
@@ -61,22 +60,24 @@ fun ActMain.onBackPressedImpl() {
}
// カラムが1個以上ある場合は設定に合わせて挙動を変える
- when (PrefI.ipBackButtonAction(pref)) {
+ when (PrefI.ipBackButtonAction.invoke(pref)) {
PrefI.BACK_EXIT_APP -> finish()
PrefI.BACK_OPEN_COLUMN_LIST -> openColumnList()
PrefI.BACK_CLOSE_COLUMN -> {
val closeableColumnList = getClosableColumnList()
when (closeableColumnList.size) {
0 -> when {
- PrefB.bpExitAppWhenCloseProtectedColumn(pref) && PrefB.bpDontConfirmBeforeCloseColumn(pref) -> finish()
+ PrefB.bpExitAppWhenCloseProtectedColumn(pref) &&
+ PrefB.bpDontConfirmBeforeCloseColumn.invoke(pref) ->
+ finish()
else -> showToast(false, R.string.missing_closeable_column)
}
1 -> closeColumn(closeableColumnList.first())
- else -> showToast(false, R.string.cant_close_column_by_back_button_when_multiple_column_shown)
+ else -> showToast(false,
+ R.string.cant_close_column_by_back_button_when_multiple_column_shown)
}
}
- // ActAppSetting.BACK_ASK_ALWAYS
- else -> {
+ else /* PrefI.BACK_ASK_ALWAYS */ -> {
val closeableColumnList = getClosableColumnList()
val dialog = ActionsDialog()
if (closeableColumnList.size == 1) {
diff --git a/app/src/main/java/jp/juggler/subwaytooter/actmain/SideMenuAdapter.kt b/app/src/main/java/jp/juggler/subwaytooter/actmain/SideMenuAdapter.kt
index f0d665e8..3937b138 100644
--- a/app/src/main/java/jp/juggler/subwaytooter/actmain/SideMenuAdapter.kt
+++ b/app/src/main/java/jp/juggler/subwaytooter/actmain/SideMenuAdapter.kt
@@ -2,7 +2,6 @@ package jp.juggler.subwaytooter.actmain
import android.content.Context
import android.content.Intent
-import android.content.pm.PackageManager
import android.graphics.drawable.StateListDrawable
import android.os.Build
import android.os.Handler
@@ -382,9 +381,9 @@ class SideMenuAdapter(
Item(icon = R.drawable.ic_search, title = R.string.mastodon_search_portal) {
addColumn(defaultInsertPosition, SavedAccount.na, ColumnType.SEARCH_MSP, "")
},
- Item(icon = R.drawable.ic_search, title = R.string.tootsearch) {
- addColumn(defaultInsertPosition, SavedAccount.na, ColumnType.SEARCH_TS, "")
- },
+// Item(icon = R.drawable.ic_search, title = R.string.tootsearch) {
+// addColumn(defaultInsertPosition, SavedAccount.na, ColumnType.SEARCH_TS, "")
+// },
Item(icon = R.drawable.ic_search, title = R.string.notestock) {
addColumn(defaultInsertPosition, SavedAccount.na, ColumnType.SEARCH_NOTESTOCK, "")
},
diff --git a/app/src/main/java/jp/juggler/subwaytooter/drawable/MediaBackgroundDrawable.kt b/app/src/main/java/jp/juggler/subwaytooter/drawable/MediaBackgroundDrawable.kt
index 2e5a730c..ee00e7e7 100644
--- a/app/src/main/java/jp/juggler/subwaytooter/drawable/MediaBackgroundDrawable.kt
+++ b/app/src/main/java/jp/juggler/subwaytooter/drawable/MediaBackgroundDrawable.kt
@@ -41,6 +41,8 @@ class MediaBackgroundDrawable(
paint.colorFilter = colorFilter
}
+ @Suppress("DeprecatedCallableAddReplaceWith")
+ @Deprecated("deprecated in API level 29.")
override fun getOpacity() = when (paint.alpha) {
255 -> PixelFormat.OPAQUE
0 -> PixelFormat.TRANSPARENT
diff --git a/app/src/main/java/jp/juggler/subwaytooter/drawable/PollPlotDrawable.kt b/app/src/main/java/jp/juggler/subwaytooter/drawable/PollPlotDrawable.kt
index d05edaf3..069a0ba8 100644
--- a/app/src/main/java/jp/juggler/subwaytooter/drawable/PollPlotDrawable.kt
+++ b/app/src/main/java/jp/juggler/subwaytooter/drawable/PollPlotDrawable.kt
@@ -13,6 +13,8 @@ class PollPlotDrawable(
override fun setAlpha(alpha: Int) {
}
+ @Suppress("DeprecatedCallableAddReplaceWith")
+ @Deprecated("deprecated in API level 29.")
override fun getOpacity(): Int = PixelFormat.TRANSLUCENT
override fun setColorFilter(colorFilter: ColorFilter?) {
diff --git a/app/src/main/java/jp/juggler/subwaytooter/drawable/PreviewCardBorder.kt b/app/src/main/java/jp/juggler/subwaytooter/drawable/PreviewCardBorder.kt
index 764ed6ef..45d688b4 100644
--- a/app/src/main/java/jp/juggler/subwaytooter/drawable/PreviewCardBorder.kt
+++ b/app/src/main/java/jp/juggler/subwaytooter/drawable/PreviewCardBorder.kt
@@ -29,6 +29,8 @@ class PreviewCardBorder : Drawable() {
canvas.drawRoundRect(left, top, right, bottom, round, round, paint)
}
+ @Suppress("DeprecatedCallableAddReplaceWith")
+ @Deprecated("deprecated in API level 29.")
override fun getOpacity(): Int = PixelFormat.TRANSLUCENT
override fun setAlpha(alpha: Int) = Unit
diff --git a/app/src/main/java/jp/juggler/subwaytooter/notification/PollingWorker2.kt b/app/src/main/java/jp/juggler/subwaytooter/notification/PollingWorker2.kt
index c0534eb7..05c46d10 100644
--- a/app/src/main/java/jp/juggler/subwaytooter/notification/PollingWorker2.kt
+++ b/app/src/main/java/jp/juggler/subwaytooter/notification/PollingWorker2.kt
@@ -84,7 +84,7 @@ class PollingWorker2(
workManager.enqueueUniquePeriodicWork(
WORK_NAME,
- ExistingPeriodicWorkPolicy.REPLACE,
+ ExistingPeriodicWorkPolicy.CANCEL_AND_REENQUEUE,
workRequest
).await()
diff --git a/app/src/main/java/jp/juggler/subwaytooter/search/TootsearchHelper.kt b/app/src/main/java/jp/juggler/subwaytooter/search/TootsearchHelper.kt
index 05532a21..6fb59c84 100644
--- a/app/src/main/java/jp/juggler/subwaytooter/search/TootsearchHelper.kt
+++ b/app/src/main/java/jp/juggler/subwaytooter/search/TootsearchHelper.kt
@@ -1,7 +1,7 @@
package jp.juggler.subwaytooter.search
-import jp.juggler.subwaytooter.*
-import jp.juggler.subwaytooter.column.addWithFilterStatus
+import android.content.Context
+import jp.juggler.subwaytooter.R
import jp.juggler.subwaytooter.api.TootApiClient
import jp.juggler.subwaytooter.api.TootApiResult
import jp.juggler.subwaytooter.api.TootParser
@@ -10,8 +10,11 @@ import jp.juggler.subwaytooter.api.entity.ServiceType
import jp.juggler.subwaytooter.api.entity.TootStatus
import jp.juggler.subwaytooter.column.ColumnTask_Loading
import jp.juggler.subwaytooter.column.ColumnTask_Refresh
-import jp.juggler.util.*
-import okhttp3.Request
+import jp.juggler.subwaytooter.column.addWithFilterStatus
+import jp.juggler.util.JsonArray
+import jp.juggler.util.JsonObject
+import jp.juggler.util.LogCategory
+import jp.juggler.util.cast
object TootsearchHelper {
@@ -26,21 +29,33 @@ object TootsearchHelper {
private fun getNextId(root: JsonObject, oldSize: Int): String? =
getHits(root)?.size?.takeIf { it > 0 }?.let { (oldSize + it) }?.toString()
- private suspend fun TootApiClient.search(query: String, from: Int?): TootApiResult? {
- val result = TootApiResult.makeWithCaption("Tootsearch")
- if (result.error != null) return result
- if (!sendRequest(result) {
- val url = StringBuilder().apply {
- append("https://tootsearch.chotto.moe/api/v1/search?sort=")
- append("created_at:desc".encodePercent())
- append("&q=").append(query.encodePercent())
- if (from != null) append("&from=").append(from.toString())
- }.toString()
+ @Suppress(
+ "unused",
+ "RedundantNullableReturnType",
+ "RedundantSuspendModifier",
+ "UNUSED_PARAMETER",
+ )
+ private suspend fun TootApiClient.search(
+ context: Context,
+ query: String,
+ from: Int?,
+ ): TootApiResult? {
+ return TootApiResult("Tootsearch discontinued service on 2022/12/25.")
- Request.Builder().url(url).build()
- }) return result
-
- return parseJson(result)
+// val result = TootApiResult.makeWithCaption("Tootsearch")
+// if (result.error != null) return result
+// if (!sendRequest(result) {
+// val url = StringBuilder().apply {
+// append("https://tootsearch.chotto.moe/api/v1/search?sort=")
+// append("created_at:desc".encodePercent())
+// append("&q=").append(query.encodePercent())
+// if (from != null) append("&from=").append(from.toString())
+// }.toString()
+//
+// Request.Builder().url(url).build()
+// }) return result
+//
+// return parseJson(result)
}
private fun parseList(parser: TootParser, root: JsonObject) =
@@ -66,7 +81,11 @@ object TootsearchHelper {
listTmp = java.util.ArrayList()
TootApiResult()
} else {
- client.search(column.searchQuery, null)?.also { result ->
+ client.search(
+ context = context,
+ query = column.searchQuery,
+ from = null
+ )?.also { result ->
result.jsonObject?.let { root ->
column.idOld = EntityId.mayNull(getNextId(root, 0))
listTmp = addWithFilterStatus(
@@ -92,7 +111,11 @@ object TootsearchHelper {
listTmp = ArrayList()
TootApiResult(context.getString(R.string.end_of_list))
} else {
- client.search(q, oldSize)?.also { result ->
+ client.search(
+ context = context,
+ query = q,
+ from = oldSize,
+ )?.also { result ->
result.jsonObject?.let { root ->
column.idOld = EntityId.mayNull(getNextId(root, oldSize))
listTmp = addWithFilterStatus(listTmp, parseList(parser, root))
diff --git a/app/src/main/res/menu/act_text.xml b/app/src/main/res/menu/act_text.xml
index df44423b..c5b02cfb 100644
--- a/app/src/main/res/menu/act_text.xml
+++ b/app/src/main/res/menu/act_text.xml
@@ -17,10 +17,10 @@
android:title="@string/search_web"
app:showAsAction="never" />
-
+
+
+
+
- Bundle.getParcelableCompat(key: String) =
+ if (Build.VERSION.SDK_INT >= 33) {
+ getParcelable(key, T::class.java)
+ } else {
+ @Suppress("DEPRECATION")
+ getParcelable(key)
+ }
diff --git a/emoji/build.gradle b/emoji/build.gradle
index 1c430d0a..f6195a4f 100644
--- a/emoji/build.gradle
+++ b/emoji/build.gradle
@@ -16,7 +16,6 @@ android {
versionCode 1
versionName "1.0"
- // testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
vectorDrawables.useSupportLibrary = true
}
@@ -29,15 +28,5 @@ android {
kotlinOptions {
jvmTarget = jvm_target
- freeCompilerArgs += [
- "-Xopt-in=kotlin.ExperimentalStdlibApi",
- "-Xopt-in=kotlinx.coroutines.ExperimentalCoroutinesApi",
- "-Xopt-in=kotlinx.serialization.ExperimentalSerializationApi",
- "-Xopt-in=androidx.compose.foundation.ExperimentalFoundationApi",
- "-Xopt-in=androidx.compose.animation.ExperimentalAnimationApi",
- ]
}
}
-
-dependencies {
-}
diff --git a/sample_apng/build.gradle b/sample_apng/build.gradle
index 34bcd51a..16367057 100644
--- a/sample_apng/build.gradle
+++ b/sample_apng/build.gradle
@@ -37,8 +37,8 @@ android {
kotlinOptions {
jvmTarget = jvm_target
freeCompilerArgs += [
- "-Xopt-in=kotlin.ExperimentalStdlibApi",
- "-Xopt-in=kotlinx.coroutines.ExperimentalCoroutinesApi",
+ "-opt-in=kotlin.ExperimentalStdlibApi",
+ "-opt-in=kotlinx.coroutines.ExperimentalCoroutinesApi",
// "-Xopt-in=kotlinx.serialization.ExperimentalSerializationApi",
// "-Xopt-in=androidx.compose.foundation.ExperimentalFoundationApi",
// "-Xopt-in=androidx.compose.animation.ExperimentalAnimationApi",
@@ -56,8 +56,8 @@ dependencies {
implementation "androidx.lifecycle:lifecycle-viewmodel:$lifecycle_version"
testImplementation "junit:junit:$junit_version"
- androidTestImplementation 'androidx.test:runner:1.4.0'
- androidTestImplementation 'androidx.test.espresso:espresso-core:3.4.0'
+ androidTestImplementation 'androidx.test:runner:1.5.1'
+ androidTestImplementation 'androidx.test.espresso:espresso-core:3.5.0'
implementation "org.jetbrains.kotlinx:kotlinx-coroutines-core:$kotlinx_coroutines_version"
implementation "org.jetbrains.kotlinx:kotlinx-coroutines-android:$kotlinx_coroutines_version"