Dagger: continue reworking on app and sdk [WIP]

This commit is contained in:
ganfra
2019-06-20 19:26:59 +02:00
parent ee87c253fe
commit 07fee8ed3d
156 changed files with 393 additions and 552 deletions

View File

@ -173,7 +173,7 @@ dependencies {
implementation 'com.airbnb.android:mvrx:1.0.1'
// Work
implementation "android.arch.work:work-runtime-ktx:1.0.0"
implementation "androidx.work:work-runtime-ktx:2.1.0-beta01"
// FP
implementation "io.arrow-kt:arrow-core:$arrow_version"

View File

@ -34,7 +34,6 @@ import im.vector.riotredesign.features.notifications.NotifiableEventResolver
import im.vector.riotredesign.features.notifications.NotifiableMessageEvent
import im.vector.riotredesign.features.notifications.NotificationDrawerManager
import im.vector.riotredesign.features.notifications.SimpleNotifiableEvent
import org.koin.android.ext.android.inject
import timber.log.Timber
/**
@ -42,7 +41,7 @@ import timber.log.Timber
*/
class VectorFirebaseMessagingService : FirebaseMessagingService() {
val notificationDrawerManager by inject<NotificationDrawerManager>()
@Inject lateinit var notificationDrawerManager: NotificationDrawerManager
private val notifiableEventResolver by lazy {
NotifiableEventResolver(this)

View File

@ -4,7 +4,9 @@ import android.graphics.Typeface
import androidx.core.provider.FontsContractCompat
import timber.log.Timber
import javax.inject.Inject
import javax.inject.Singleton
@Singleton
class EmojiCompatFontProvider @Inject constructor(): FontsContractCompat.FontRequestCallback() {
var typeface: Typeface? = null

View File

@ -31,6 +31,7 @@ import com.github.piasy.biv.BigImageViewer
import com.github.piasy.biv.loader.glide.GlideImageLoader
import com.jakewharton.threetenabp.AndroidThreeTen
import im.vector.matrix.android.api.Matrix
import im.vector.matrix.android.api.MatrixConfiguration
import im.vector.riotredesign.core.di.DaggerVectorComponent
import im.vector.riotredesign.core.di.HasInjector
import im.vector.riotredesign.core.di.VectorComponent
@ -42,7 +43,7 @@ import timber.log.Timber
import javax.inject.Inject
class VectorApplication : Application(), HasInjector<VectorComponent> {
class VectorApplication : Application(), HasInjector<VectorComponent>, MatrixConfiguration.Provider, androidx.work.Configuration.Provider {
lateinit var appContext: Context
//font thread handler
@ -67,8 +68,6 @@ class VectorApplication : Application(), HasInjector<VectorComponent> {
BigImageViewer.initialize(GlideImageLoader.with(applicationContext))
EpoxyController.defaultDiffingHandler = EpoxyAsyncUtil.getAsyncBackgroundHandler()
EpoxyController.defaultModelBuildingHandler = EpoxyAsyncUtil.getAsyncBackgroundHandler()
Matrix.getInstance().setApplicationFlavor(BuildConfig.FLAVOR_DESCRIPTION)
registerActivityLifecycleCallbacks(VectorActivityLifecycleCallbacks())
val fontRequest = FontRequest(
"com.google.android.gms.fonts",
@ -80,6 +79,10 @@ class VectorApplication : Application(), HasInjector<VectorComponent> {
vectorConfiguration.initConfiguration()
}
override fun providesMatrixConfiguration() = MatrixConfiguration(BuildConfig.FLAVOR_DESCRIPTION)
override fun getWorkManagerConfiguration() = androidx.work.Configuration.Builder().build()
override fun injector(): VectorComponent {
return vectorComponent
}

View File

@ -22,6 +22,7 @@ import dagger.BindsInstance
import dagger.Component
import im.vector.fragments.keysbackup.restore.KeysBackupRestoreFromPassphraseFragment
import im.vector.riotredesign.core.platform.SimpleFragmentActivity
import im.vector.riotredesign.features.MainActivity
import im.vector.riotredesign.features.crypto.keysbackup.restore.KeysBackupRestoreFromKeyFragment
import im.vector.riotredesign.features.crypto.keysbackup.restore.KeysBackupRestoreSuccessFragment
import im.vector.riotredesign.features.crypto.keysbackup.settings.KeysBackupSettingsFragment
@ -40,6 +41,7 @@ import im.vector.riotredesign.features.home.room.detail.timeline.action.MessageM
import im.vector.riotredesign.features.home.room.detail.timeline.action.QuickReactionFragment
import im.vector.riotredesign.features.home.room.detail.timeline.action.ViewReactionBottomSheet
import im.vector.riotredesign.features.home.room.list.RoomListFragment
import im.vector.riotredesign.features.login.LoginActivity
import im.vector.riotredesign.features.reactions.EmojiReactionPickerActivity
import im.vector.riotredesign.features.roomdirectory.PublicRoomsFragment
import im.vector.riotredesign.features.roomdirectory.createroom.CreateRoomFragment
@ -66,7 +68,7 @@ interface ScreenComponent {
fun inject(roomDirectoryPickerFragment: RoomDirectoryPickerFragment)
fun inject(roomPreviewNoPreviewFragment: RoomPreviewNoPreviewFragment)
fun inject(keysBackupSettingsFragment: KeysBackupSettingsFragment)
fun inject(homeDrawerFragment: HomeDrawerFragment)
@ -103,6 +105,10 @@ interface ScreenComponent {
fun inject(emojiReactionPickerActivity: EmojiReactionPickerActivity)
fun inject(loginActivity: LoginActivity)
fun inject(mainActivity: MainActivity)
@Component.Factory
interface Factory {

View File

@ -21,7 +21,9 @@ import android.content.res.Resources
import dagger.BindsInstance
import dagger.Component
import im.vector.matrix.android.api.Matrix
import im.vector.matrix.android.api.auth.Authenticator
import im.vector.matrix.android.api.session.Session
import im.vector.riotredesign.EmojiCompatFontProvider
import im.vector.riotredesign.VectorApplication
import im.vector.riotredesign.features.configuration.VectorConfiguration
import im.vector.riotredesign.features.crypto.keysrequest.KeyRequestHandler
@ -49,6 +51,8 @@ interface VectorComponent {
fun vectorConfiguration(): VectorConfiguration
fun emojiCompatFontProvider(): EmojiCompatFontProvider
fun navigator(): Navigator
fun homeNavigator(): HomeNavigator
@ -63,6 +67,8 @@ interface VectorComponent {
fun inject(vectorApplication: VectorApplication)
fun authenticator(): Authenticator
@Component.Factory
interface Factory {
fun create(@BindsInstance context: Context): VectorComponent

View File

@ -24,6 +24,7 @@ import dagger.Binds
import dagger.Module
import dagger.Provides
import im.vector.matrix.android.api.Matrix
import im.vector.matrix.android.api.auth.Authenticator
import im.vector.matrix.android.api.session.Session
import im.vector.riotredesign.features.navigation.DefaultNavigator
import im.vector.riotredesign.features.navigation.Navigator
@ -48,8 +49,8 @@ abstract class VectorModule {
@Provides
@JvmStatic
fun providesMatrix(): Matrix {
return Matrix.getInstance()
fun providesMatrix(context: Context): Matrix {
return Matrix.getInstance(context)
}
@Provides
@ -58,6 +59,12 @@ abstract class VectorModule {
//TODO: handle session injection better
return matrix.currentSession!!
}
@Provides
@JvmStatic
fun providesAuthenticator(matrix: Matrix): Authenticator{
return matrix.authenticator()
}
}
@Binds

View File

@ -21,10 +21,13 @@ import android.content.Intent
import android.os.Bundle
import im.vector.matrix.android.api.Matrix
import im.vector.matrix.android.api.MatrixCallback
import im.vector.matrix.android.api.auth.Authenticator
import im.vector.riotredesign.core.di.ScreenComponent
import im.vector.riotredesign.core.platform.VectorBaseActivity
import im.vector.riotredesign.features.home.HomeActivity
import im.vector.riotredesign.features.login.LoginActivity
import timber.log.Timber
import javax.inject.Inject
class MainActivity : VectorBaseActivity() {
@ -44,16 +47,18 @@ class MainActivity : VectorBaseActivity() {
}
}
private val authenticator = Matrix.getInstance().authenticator()
@Inject lateinit var matrix: Matrix
@Inject lateinit var authenticator: Authenticator
override fun injectWith(injector: ScreenComponent) {
injector.inject(this)
}
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
val session = Matrix.getInstance().currentSession
val clearCache = intent.getBooleanExtra(EXTRA_CLEAR_CACHE, false)
val clearCredentials = intent.getBooleanExtra(EXTRA_CLEAR_CREDENTIALS, false)
val session = matrix.currentSession
if (session == null) {
start()
} else {

View File

@ -44,7 +44,7 @@ class IncomingVerificationRequestHandler @Inject constructor(val context: Contex
when (tx.state) {
SasVerificationTxState.OnStarted -> {
//Add a notification for every incoming request
val session = Matrix.getInstance().currentSession!!
val session = Matrix.getInstance(context).currentSession!!
val name = session.getUser(tx.otherUserId)?.displayName
?: tx.otherUserId

View File

@ -20,7 +20,6 @@ import android.content.Context
import android.graphics.drawable.Drawable
import android.widget.ImageView
import androidx.annotation.AnyThread
import androidx.annotation.ColorRes
import androidx.annotation.UiThread
import androidx.core.content.ContextCompat
import com.amulyakhare.textdrawable.TextDrawable
@ -79,7 +78,7 @@ object AvatarRenderer {
name
}
val placeholder = getPlaceholderDrawable(context, identifier, displayName)
buildGlideRequest(glideRequest, avatarUrl)
buildGlideRequest(context, glideRequest, avatarUrl)
.placeholder(placeholder)
.into(target)
}
@ -116,8 +115,8 @@ object AvatarRenderer {
// return AVATAR_COLOR_LIST[colorIndex.toInt()]
// }
private fun buildGlideRequest(glideRequest: GlideRequests, avatarUrl: String?): GlideRequest<Drawable> {
val resolvedUrl = Matrix.getInstance().currentSession!!.contentUrlResolver()
private fun buildGlideRequest(context: Context, glideRequest: GlideRequests, avatarUrl: String?): GlideRequest<Drawable> {
val resolvedUrl = Matrix.getInstance(context).currentSession!!.contentUrlResolver()
.resolveThumbnail(avatarUrl, THUMBNAIL_SIZE, THUMBNAIL_SIZE, ContentUrlResolver.ThumbnailMethod.SCALE)
return glideRequest

View File

@ -140,7 +140,7 @@ class HomeActivity : VectorBaseActivity(), ToolbarConfigurable {
override fun onOptionsItemSelected(item: MenuItem): Boolean {
when (item.itemId) {
R.id.sliding_menu_sign_out -> {
SignOutUiWorker(this).perform(Matrix.getInstance().currentSession!!)
SignOutUiWorker(this).perform(Matrix.getInstance(this).currentSession!!)
return true
}
}

View File

@ -78,6 +78,11 @@ class RoomDetailViewModel @AssistedInject constructor(@Assisted initialState: Ro
val fragment: RoomDetailFragment = (viewModelContext as FragmentViewModelContext).fragment()
return fragment.roomDetailViewModelFactory.create(state)
}
override fun initialState(viewModelContext: ViewModelContext): RoomDetailViewState? {
return super.initialState(viewModelContext)
}
}
init {

View File

@ -36,7 +36,7 @@ object ContentUploadStateTrackerBinder {
mediaData: ImageContentRenderer.Data,
progressLayout: ViewGroup) {
Matrix.getInstance().currentSession?.also { session ->
Matrix.getInstance(progressLayout.context).currentSession?.also { session ->
val uploadStateTracker = session.contentUploadProgressTracker()
val updateListener = ContentMediaProgressUpdater(progressLayout, mediaData)
updateListeners[eventId] = updateListener
@ -44,8 +44,8 @@ object ContentUploadStateTrackerBinder {
}
}
fun unbind(eventId: String) {
Matrix.getInstance().currentSession?.also { session ->
fun unbind(eventId: String, progressLayout: ViewGroup) {
Matrix.getInstance(progressLayout.context).currentSession?.also { session ->
val uploadStateTracker = session.contentUploadProgressTracker()
updateListeners[eventId]?.also {
uploadStateTracker.untrack(eventId, it)

View File

@ -17,8 +17,10 @@
package im.vector.riotredesign.features.home.room.detail.timeline.helper
import androidx.recyclerview.widget.RecyclerView
import im.vector.riotredesign.core.di.ScreenScope
import javax.inject.Inject
@ScreenScope
class TimelineMediaSizeProvider @Inject constructor() {
lateinit var recyclerView: RecyclerView

View File

@ -50,7 +50,7 @@ abstract class MessageImageVideoItem : AbsMessageItem<MessageImageVideoItem.Hold
}
override fun unbind(holder: Holder) {
ContentUploadStateTrackerBinder.unbind(informationData.eventId)
ContentUploadStateTrackerBinder.unbind(informationData.eventId, holder.progressLayout)
super.unbind(holder)
}

View File

@ -25,10 +25,12 @@ import arrow.core.Try
import com.jakewharton.rxbinding2.widget.RxTextView
import im.vector.matrix.android.api.Matrix
import im.vector.matrix.android.api.MatrixCallback
import im.vector.matrix.android.api.auth.Authenticator
import im.vector.matrix.android.api.auth.data.HomeServerConnectionConfig
import im.vector.matrix.android.api.session.Session
import im.vector.matrix.android.api.session.sync.FilterService
import im.vector.riotredesign.R
import im.vector.riotredesign.core.di.ScreenComponent
import im.vector.riotredesign.core.extensions.showPassword
import im.vector.riotredesign.core.platform.VectorBaseActivity
import im.vector.riotredesign.features.home.HomeActivity
@ -36,6 +38,7 @@ import io.reactivex.Observable
import io.reactivex.functions.Function3
import io.reactivex.rxkotlin.subscribeBy
import kotlinx.android.synthetic.main.activity_login.*
import javax.inject.Inject
private const val DEFAULT_HOME_SERVER_URI = "https://matrix.org"
private const val DEFAULT_IDENTITY_SERVER_URI = "https://vector.im"
@ -43,10 +46,14 @@ private const val DEFAULT_ANTIVIRUS_SERVER_URI = "https://matrix.org"
class LoginActivity : VectorBaseActivity() {
private val authenticator = Matrix.getInstance().authenticator()
@Inject lateinit var authenticator: Authenticator
private var passwordShown = false
override fun injectWith(injector: ScreenComponent) {
injector.inject(this)
}
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_login)
@ -71,7 +78,7 @@ class LoginActivity : VectorBaseActivity() {
progressBar.visibility = View.VISIBLE
authenticator.authenticate(homeServerConnectionConfig, login, password, object : MatrixCallback<Session> {
override fun onSuccess(data: Session) {
Matrix.getInstance().currentSession = data
Matrix.getInstance(this@LoginActivity).currentSession = data
data.open()
data.setFilter(FilterService.FilterPreset.RiotFilter)
data.startSync()

View File

@ -57,7 +57,7 @@ object ImageContentRenderer {
val (width, height) = processSize(data, mode)
imageView.layoutParams.height = height
imageView.layoutParams.width = width
val contentUrlResolver = Matrix.getInstance().currentSession!!.contentUrlResolver()
val contentUrlResolver = Matrix.getInstance(imageView.context).currentSession!!.contentUrlResolver()
val resolvedUrl = when (mode) {
Mode.FULL_SIZE -> contentUrlResolver.resolveFullSize(data.url)
Mode.THUMBNAIL -> contentUrlResolver.resolveThumbnail(data.url, width, height, ContentUrlResolver.ThumbnailMethod.SCALE)
@ -76,7 +76,7 @@ object ImageContentRenderer {
fun render(data: Data, imageView: BigImageView) {
val (width, height) = processSize(data, Mode.THUMBNAIL)
val contentUrlResolver = Matrix.getInstance().currentSession!!.contentUrlResolver()
val contentUrlResolver = Matrix.getInstance(imageView.context).currentSession!!.contentUrlResolver()
val fullSize = contentUrlResolver.resolveFullSize(data.url)
val thumbnail = contentUrlResolver.resolveThumbnail(data.url, width, height, ContentUrlResolver.ThumbnailMethod.SCALE)
imageView.showImage(

View File

@ -32,7 +32,7 @@ object VideoContentRenderer {
) : Parcelable
fun render(data: Data, thumbnailView: ImageView, videoView: VideoView) {
val contentUrlResolver = Matrix.getInstance().currentSession!!.contentUrlResolver()
val contentUrlResolver = Matrix.getInstance(videoView.context).currentSession!!.contentUrlResolver()
val resolvedUrl = contentUrlResolver.resolveFullSize(data.videoUrl)
videoView.setVideoPath(resolvedUrl)
videoView.start()

View File

@ -195,7 +195,7 @@ object BugReporter {
var matrixSdkVersion = "undefined"
var olmVersion = "undefined"
Matrix.getInstance().currentSession?.let { session ->
Matrix.getInstance(context).currentSession?.let { session ->
userId = session.sessionParams.credentials.userId
deviceId = session.sessionParams.credentials.deviceId ?: "undefined"
// TODO matrixSdkVersion = session.getVersion(true);
@ -207,7 +207,7 @@ object BugReporter {
val builder = BugReporterMultipartBody.Builder()
.addFormDataPart("text", "[RiotX] $bugDescription")
.addFormDataPart("app", "riot-android")
.addFormDataPart("user_agent", Matrix.getInstance().getUserAgent())
.addFormDataPart("user_agent", Matrix.getInstance(context).getUserAgent())
.addFormDataPart("user_id", userId)
.addFormDataPart("device_id", deviceId)
// TODO .addFormDataPart("version", Matrix.getInstance(context).getVersion(true, false))