ganfra
2 years ago
18 changed files with 176 additions and 104 deletions
@ -0,0 +1,27 @@ |
|||||||
|
package io.element.android.x.di |
||||||
|
|
||||||
|
import com.squareup.anvil.annotations.ContributesTo |
||||||
|
import com.squareup.anvil.annotations.MergeSubcomponent |
||||||
|
import dagger.BindsInstance |
||||||
|
import dagger.Subcomponent |
||||||
|
import io.element.android.x.core.di.DaggerMavericksBindings |
||||||
|
import io.element.android.x.matrix.MatrixClient |
||||||
|
|
||||||
|
@SingleIn(SessionScope::class) |
||||||
|
@MergeSubcomponent(SessionScope::class) |
||||||
|
interface SessionComponent: DaggerMavericksBindings { |
||||||
|
|
||||||
|
fun matrixClient(): MatrixClient |
||||||
|
|
||||||
|
@Subcomponent.Builder |
||||||
|
interface Builder { |
||||||
|
@BindsInstance |
||||||
|
fun client(matrixClient: MatrixClient): Builder |
||||||
|
fun build(): SessionComponent |
||||||
|
} |
||||||
|
|
||||||
|
@ContributesTo(AppScope::class) |
||||||
|
interface ParentBindings { |
||||||
|
fun sessionComponentBuilder(): Builder |
||||||
|
} |
||||||
|
} |
@ -0,0 +1,45 @@ |
|||||||
|
package io.element.android.x.di |
||||||
|
|
||||||
|
import android.content.Context |
||||||
|
import io.element.android.x.core.di.bindings |
||||||
|
import io.element.android.x.matrix.MatrixClient |
||||||
|
import java.util.concurrent.ConcurrentHashMap |
||||||
|
import javax.inject.Inject |
||||||
|
|
||||||
|
@SingleIn(AppScope::class) |
||||||
|
class SessionComponentsOwner @Inject constructor(@ApplicationContext private val context: Context) { |
||||||
|
|
||||||
|
private val sessionComponents = ConcurrentHashMap<String, SessionComponent>() |
||||||
|
var activeSessionComponent: SessionComponent? = null |
||||||
|
private set |
||||||
|
|
||||||
|
fun setActive(sessionId: String) { |
||||||
|
val sessionComponent = sessionComponents[sessionId] |
||||||
|
if (activeSessionComponent != sessionComponent) { |
||||||
|
activeSessionComponent = sessionComponent |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
fun create(matrixClient: MatrixClient) { |
||||||
|
val sessionId = matrixClient.sessionId |
||||||
|
val sessionComponent = |
||||||
|
context.bindings<SessionComponent.ParentBindings>().sessionComponentBuilder() |
||||||
|
.client(matrixClient).build() |
||||||
|
sessionComponents[sessionId] = sessionComponent |
||||||
|
setActive(sessionId) |
||||||
|
} |
||||||
|
|
||||||
|
fun releaseActiveSession() { |
||||||
|
activeSessionComponent?.also { |
||||||
|
release(it.matrixClient().sessionId) |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
fun release(sessionId: String) { |
||||||
|
val sessionComponent = sessionComponents.remove(sessionId) |
||||||
|
if (activeSessionComponent == sessionComponent) { |
||||||
|
activeSessionComponent = null |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
} |
@ -1,19 +0,0 @@ |
|||||||
package io.element.android.x.matrix |
|
||||||
|
|
||||||
import android.annotation.SuppressLint |
|
||||||
import android.app.Application |
|
||||||
import kotlinx.coroutines.CoroutineScope |
|
||||||
|
|
||||||
|
|
||||||
object MatrixInstance { |
|
||||||
@SuppressLint("StaticFieldLeak") |
|
||||||
private lateinit var instance: Matrix |
|
||||||
|
|
||||||
fun init(context: Application, coroutineScope: CoroutineScope) { |
|
||||||
instance = Matrix(coroutineScope, context) |
|
||||||
} |
|
||||||
|
|
||||||
fun getInstance(): Matrix { |
|
||||||
return instance |
|
||||||
} |
|
||||||
} |
|
Loading…
Reference in new issue