Skip to content

Instantly share code, notes, and snippets.

Avatar

Nikolai Kotchetkov motorro

View GitHub Profile
@motorro
motorro / ContextTest.kt
Created Jan 24, 2023
Context receiver mocking with mock
View ContextTest.kt
package com.myexample
import io.mockk.every
import io.mockk.mockk
import io.mockk.verify
import org.junit.Test
import kotlin.test.assertEquals
interface CallContext
@motorro
motorro / MainActivity.kt
Last active Sep 22, 2022
Main activity setup
View MainActivity.kt
@AndroidEntryPoint
class MainActivity : BaseActivity() {
// The model to run authentication and content visibility
private val model: MainScreenModel by viewModels
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
MainContent(model) {
View FlowStarter.kt
/**
* Common interface to start feature-flow
*/
interface FlowStarter<G: Any, U: Any> {
/**
* Creates a starting state
* @param email Email to proceed with
*/
fun start(email: String): CommonMachineState<G, U>
}
@motorro
motorro / EmailCheckState.kt
Last active Aug 14, 2022
Email check state
View EmailCheckState.kt
class EmailCheckState(
context: WelcomeContext,
private val data: WelcomeDataState,
private val checkEmail: CheckEmail
) : WelcomeState(context) {
private val email = requireNotNull(data.email) {
"Email is not provided"
}
@motorro
motorro / LoginFlowProxy.kt
Created Aug 14, 2022
Login flow state proxy
View LoginFlowProxy.kt
/**
* Proxy definition (for readability)
*/
private typealias LoginProxy = ProxyMachineState<
WelcomeGesture, // Host gesture system
WelcomeUiState, // Host ui-state system
LoginGesture, // Feature gesture system
LoginUiState // Feature ui-state system
>
View ProxyMachineState.kt
abstract class ProxyMachineState<PG: Any, PU: Any, CG: Any, CU: Any> : CommonMachineState<PG, PU>() {
/**
* Proxy state machine
*/
private val machine = object : CommonStateMachine.Base<CG, CU>(::init) {
fun doStart() {
start()
}
View BaseInterfaces.kt
/**
* Common state machine
* @param G UI gesture
* @param U UI state
*/
interface CommonStateMachine<G: Any, U: Any> : MachineInput<G>, MachineOutput<G, U>
/**
* Common state-machine state
* @param G UI gesture
@motorro
motorro / WelcomeScreen.kt
Created Aug 14, 2022
Application master view
View WelcomeScreen.kt
fun WelcomeScreen(onTerminate: @Composable () -> Unit) {
val model = hiltViewModel<WelcomeViewModel>()
val state = model.state.collectAsState(WelcomeUiState.Loading)
BackHandler(onBack = { model.process(Back) })
when (val uiState = state.value) {
// Native ui-state rendering...
@motorro
motorro / MasterView.kt
Created Aug 14, 2022
Feature master view
View MasterView.kt
@Composable
fun LoginScreen(state: LoginUiState, onGesture: (LoginGesture) -> Unit) {
// Login screen rendering...
}
@Composable
fun RegistrationScreen(state: RegisterUiState, onGesture: (RegisterGesture) -> Unit) {
// Registration screen rendering...
}
View WelcomeUiState.kt
sealed class WelcomeUiState {
/**
* Login state wrapper
* @property value Login UI state
*/
data class Login(val value: LoginUiState) : WelcomeUiState()
/**
* Register state wrapper
* @property value Register UI state