Skip to content

Instantly share code, notes, and snippets.

View diousk's full-sized avatar

David diousk

  • Taipei
View GitHub Profile
@Singleton
class SessionManager @Inject constructor(
private val sessionComponentFactory: SessionComponent.Factory
) {
var sessionComponent: SessionComponent? = null
private set
fun isUserLoggedIn() = sessionComponent != null
fun logout() {
class SettingActivity : DaggerSessionActivity() {
@Inject
lateinit var sessionManager: SessionManager
@Inject
lateinit var sessionPrefs: SessionPrefs
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_setting)
class MainActivity : DaggerSessionActivity() {
@Inject
lateinit var sessionPrefs: SessionPrefs
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
Timber.d("main sessionPrefs = $sessionPrefs")
class LoginActivity : DaggerAppCompatActivity() {
@Inject lateinit var sessionManager: SessionManager
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_login)
Timber.d("sessionManager = $sessionManager")
goMain.setOnClickListener {
abstract class DaggerSessionActivity : AppCompatActivity(), HasAndroidInjector {
@Inject
lateinit var androidInjector: DispatchingAndroidInjector<Any>
override fun onCreate(savedInstanceState: Bundle?) {
val sessionManager = (application as App).appComponent.sessionManager()
sessionManager.sessionComponent?.injector()?.inject(this)
super.onCreate(savedInstanceState)
}
@SessionScope
@Subcomponent(modules = [SessionActivityBuilder::class, SessionModule::class])
interface SessionComponent {
@Subcomponent.Factory
interface Factory {
fun create(): SessionComponent
}
fun injector(): DispatchingAndroidInjector<Any>
}
@Module
abstract class ActivityBuilder {
 @ContributesAndroidInjector
 abstract fun bindLoginActivity(): LoginActivity
}
@Module(subcomponents = [SessionComponent::class])
abstract class AppSubcomponents
@Singleton
@Component(
 modules = [
 AndroidSupportInjectionModule::class,
 ActivityBuilder::class,
 AppSubcomponents::class,
 AppModule::class
 ]
)
interface AppComponent : AndroidInjector<App> {
@Module
abstract class ActivityBuilder {
 @PerActivity
 @ContributesAndroidInjector(modules = [SomeModule::class])
 abstract fun bindSomeActivity(): SomeActivity
}
@Module
abstract class SomeModule {
 @Provides
suspend fun Fragment.awaitKeyboardHidden() = suspendCancellableCoroutine<Unit> { cont ->
if (!KeyboardVisibilityEvent.isKeyboardVisible(activity)) {
cont.resume(Unit)
return@suspendCancellableCoroutine
}
var unRegistrar: Unregistrar? = null
unRegistrar = KeyboardVisibilityEvent.registerEventListener(activity) { open ->
if (!open) {
// keyboard dismissed, time to resume coroutine