Skip to content

Instantly share code, notes, and snippets.

View orcchg's full-sized avatar
🏠
Working from home

Maxim Alov orcchg

🏠
Working from home
View GitHub Profile
@orcchg
orcchg / typical_network_call_using_suspend_method.kt
Created October 21, 2023 08:31
A typical network call using suspend method
interface RestAdapter {
suspend fun upload(data: DataForRequest): DataFromResponse
}
@orcchg
orcchg / critical_section_for_coroutines_with_cached_result.kt
Last active October 21, 2023 17:28
Critical section for coroutines with cached result
import java.util.concurrent.ConcurrentHashMap
import kotlin.coroutines.Continuation
import kotlin.coroutines.resume
import kotlin.coroutines.suspendCoroutine
class KCriticalSection<T> {
private val suspendedJobs = ConcurrentHashMap<Int, Continuation<Boolean>>()
private var id = AtomicInteger(1000)
@Volatile private var isInsideCriticalSection = false
@Volatile private var _cached: T? = null
@orcchg
orcchg / critical_section_for_coroutines.kt
Last active October 21, 2023 17:29
Critical section for coroutines
import java.util.concurrent.ConcurrentHashMap
import kotlin.coroutines.Continuation
import kotlin.coroutines.resume
import kotlin.coroutines.suspendCoroutine
class KCriticalSection {
private val suspendedJobs = ConcurrentHashMap<Int, Continuation<Boolean>>()
private var id = AtomicInteger(1000)
@Volatile private var isInsideCriticalSection = false
// root build.gradle
static boolean isNewTypeProject(Project project) {
project.ext.has("isBuildSystemProject")
}
static boolean isAndroidLibraryPlugin(Plugin plugin) {
plugin.getClass().canonicalName in ["com.android.build.gradle.LibraryPlugin",
"com.android.build.gradle.AppPlugin"]
}
// feature module build.gradle
plugins {
id 'convention.android-feature-impl'
id 'convention.starservices-sdk-permission'
}
dependencies {
}
plugins {
id("com.android.library")
id("kotlin-android")
id("convention.kotlin-base") // this contains extra property
id("convention.android-base")
id("kotlin-kapt")
}
plugins {
id("convention.libraries")
}
project.ext.set("isBuildSystemProject", true) // <- this is extra property
dependencies {
add("implementation", deps.base.androidx.annotation)
add("implementation", deps.base.di.inject)
add("implementation", deps.base.kotlin.stdlib)
@Component(
modules = [
FakeStockListVoConverterModule::class,
FakeStockListFeatureModule::class
]
)
interface TestStockListFeatureComponent : StockListFeatureApi {
fun inject(target: TestStockListViewModel)
}
class TestStockListViewModel {
@Inject internal lateinit var viewModel: StockListViewModel
@get:Rule val instantExecutorRule = InstantTaskExecutorRule()
private val featureApi: TestStockListFeatureComponent =
DaggerTestStockListFeatureComponent.create()
init {
class TestTrustedLoginUserUseCase {
@MockK private lateinit var authTokenStorage: AuthTokenStorage
@MockK private lateinit var repository: AuthRepository
@MockK private lateinit var secureRandom: SecureRandom
@MockK private lateinit var schedulersFactory: SchedulersFactory
private lateinit var trustedLoginUserUseCase
@Before
fun setUp() {