Skip to content

Instantly share code, notes, and snippets.

View alaershov's full-sized avatar

Alexey Ershov alaershov

View GitHub Profile
@alaershov
alaershov / SharedEventFlow.kt
Created September 15, 2023 09:11
SharedEventFlow
/**
* Позволет эммитить сразу нескольким подписчикам все отправленные события.
* Ждёт, когда появится хотябы один подписчик, а затем отправляем ему все ивенты.
* credit: @aasitnikov
*/
class SharedEventFlow<T> : FlowCollector<T>, Flow<T> {
private val sharedFlow = MutableSharedFlow<T>()
override suspend fun emit(value: T) {
@alaershov
alaershov / ValueStateFlow.kt
Created August 1, 2023 10:04
Decompose Value to State Flow
private class ValueStateFlow<T : Any>(
private val store: Value<T>,
) : StateFlow<T> {
override val value: T get() = store.value
override val replayCache: List<T> get() = listOf(store.value)
override suspend fun collect(collector: FlowCollector<T>): Nothing {
val flow = MutableStateFlow(store.value)
val observer: (T) -> Unit = { flow.value = it }
@alaershov
alaershov / MyComponent.kt
Created December 4, 2020 04:44
ViewModel + Dagger
interface MyComponent {
val myViewModelFactory: ViewModelFactory<MyViewModel>
}
@alaershov
alaershov / Interactor.kt
Created March 26, 2020 12:06
Property init with when
// this is fine
class CreateApplicationInteractor {
val isApplicationEnabled: Boolean
get() = when (BrandConfiguration.brand) {
BrandConfiguration.Brand.MY_INTERCOM_FOREIGN -> false
else -> true
}
}
@alaershov
alaershov / Fragment.kt
Last active March 25, 2020 07:14
ExposedDropdownMenu input type bug sample
val adapter = ArrayAdapter(
requireContext(),
R.layout.item_dropdown_country,
countryList // List<String>
)
binding.editTextCountry.setAdapter(adapter)
binding.editTextCountry.onItemClickListener = AdapterView.OnItemClickListener { parent, view, position, id ->
binding.editTextPhone.requestFocus()
}
@alaershov
alaershov / Module.java
Created January 23, 2020 13:51
Toothpick bind samples
// Допустим, у вас есть интерфейс ProjectRepository, его реализация ProjectServerRepository.
// И вы хотите забиндить интерфейс к реализации.
public class ProjectServerRepository implements ProjectRepository {
@Inject
public ProjectServerRepository(Context context) {...}
}
public class MyModule extends Module {
@alaershov
alaershov / anton_vs_hannes.kt
Created November 11, 2019 08:09
Delegate comparison
// Ханнес
fun movieCell(listener : (Movie) -> Unit) = adapterDelegateLayoutContainer<Movie, RecyclerItem>(R.layout.item_movie) {
itemView.setClickListener { listener.invoke(item) }
bind { diffPayloads ->
name.text = item.name
}
}
@alaershov
alaershov / RepositoryModule.java
Last active January 8, 2020 12:03
Toothpick: sample Module
public final class RepositoryModule extends Module {
public RepositoryModule(Context context) {
SharedPreferences sharedPreferences = context.getSharedPreferences("app.prefs", MODE_PRIVATE);
bind(SharedPreferences.class).toInstance(sharedPreferences);
bind(UserRepository.class)
.to(PrefUserRepository.class)
.singleton();
}
@alaershov
alaershov / UserActivity.java
Last active June 11, 2019 06:37
Toothpick: sample Activity
public final class UserActivity extends AppCompatActivity {
@Inject
UserRepository userRepository;
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Scope appScope = Toothpick.openScope("APP");
@alaershov
alaershov / App.java
Created June 4, 2019 18:00
Toothpick: sample App
public final class App extends Application {
@Override
public void onCreate() {
super.onCreate();
Scope appScope = Toothpick.openScope("APP");
appScope.installModules(new RepositoryModule(getApplicationContext()));
}
}