diff --git a/app/src/main/java/com/nextcloud/talk/activities/SharedItemsActivity.kt b/app/src/main/java/com/nextcloud/talk/activities/SharedItemsActivity.kt index dade8fb7f..80ba643b2 100644 --- a/app/src/main/java/com/nextcloud/talk/activities/SharedItemsActivity.kt +++ b/app/src/main/java/com/nextcloud/talk/activities/SharedItemsActivity.kt @@ -9,10 +9,12 @@ import androidx.lifecycle.ViewModelProvider import androidx.recyclerview.widget.GridLayoutManager import androidx.recyclerview.widget.LinearLayoutManager import androidx.recyclerview.widget.RecyclerView +import autodagger.AutoInjector import com.google.android.material.tabs.TabLayout import com.nextcloud.talk.R import com.nextcloud.talk.adapters.SharedItemsGridAdapter import com.nextcloud.talk.adapters.SharedItemsListAdapter +import com.nextcloud.talk.application.NextcloudTalkApplication import com.nextcloud.talk.databinding.ActivitySharedItemsBinding import com.nextcloud.talk.models.database.UserEntity import com.nextcloud.talk.repositories.SharedItemType @@ -21,14 +23,20 @@ import com.nextcloud.talk.utils.bundle.BundleKeys.KEY_CONVERSATION_NAME import com.nextcloud.talk.utils.bundle.BundleKeys.KEY_ROOM_TOKEN import com.nextcloud.talk.utils.bundle.BundleKeys.KEY_USER_ENTITY import com.nextcloud.talk.viewmodels.SharedItemsViewModel +import javax.inject.Inject +@AutoInjector(NextcloudTalkApplication::class) class SharedItemsActivity : AppCompatActivity() { + @Inject + lateinit var viewModelFactory: ViewModelProvider.Factory + private lateinit var binding: ActivitySharedItemsBinding private lateinit var viewModel: SharedItemsViewModel override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) + NextcloudTalkApplication.sharedApplication!!.componentApplication.inject(this) val roomToken = intent.getStringExtra(KEY_ROOM_TOKEN)!! val conversationName = intent.getStringExtra(KEY_CONVERSATION_NAME) @@ -52,10 +60,8 @@ class SharedItemsActivity : AppCompatActivity() { supportActionBar?.title = conversationName supportActionBar?.setDisplayHomeAsUpEnabled(true) - viewModel = ViewModelProvider( - this, - SharedItemsViewModel.Factory(userEntity, roomToken, SharedItemType.MEDIA) - ).get(SharedItemsViewModel::class.java) + viewModel = ViewModelProvider(this, viewModelFactory)[SharedItemsViewModel::class.java] + viewModel.initialize(userEntity, roomToken, SharedItemType.MEDIA) viewModel.sharedItemTypes.observe(this) { initTabs(it) diff --git a/app/src/main/java/com/nextcloud/talk/application/NextcloudTalkApplication.kt b/app/src/main/java/com/nextcloud/talk/application/NextcloudTalkApplication.kt index b11c8a60b..dc304b8db 100644 --- a/app/src/main/java/com/nextcloud/talk/application/NextcloudTalkApplication.kt +++ b/app/src/main/java/com/nextcloud/talk/application/NextcloudTalkApplication.kt @@ -55,7 +55,9 @@ import com.nextcloud.talk.components.filebrowser.webdav.DavUtils import com.nextcloud.talk.dagger.modules.BusModule import com.nextcloud.talk.dagger.modules.ContextModule import com.nextcloud.talk.dagger.modules.DatabaseModule +import com.nextcloud.talk.dagger.modules.RepositoryModule import com.nextcloud.talk.dagger.modules.RestModule +import com.nextcloud.talk.dagger.modules.ViewModelModule import com.nextcloud.talk.jobs.AccountRemovalWorker import com.nextcloud.talk.jobs.CapabilitiesWorker import com.nextcloud.talk.jobs.SignalingSettingsWorker @@ -89,7 +91,9 @@ import javax.inject.Singleton DatabaseModule::class, RestModule::class, UserModule::class, - ArbitraryStorageModule::class + ArbitraryStorageModule::class, + ViewModelModule::class, + RepositoryModule::class ] ) @Singleton diff --git a/app/src/main/java/com/nextcloud/talk/dagger/modules/RepositoryModule.kt b/app/src/main/java/com/nextcloud/talk/dagger/modules/RepositoryModule.kt new file mode 100644 index 000000000..e31957085 --- /dev/null +++ b/app/src/main/java/com/nextcloud/talk/dagger/modules/RepositoryModule.kt @@ -0,0 +1,35 @@ +/* + * Nextcloud Talk application + * + * @author Álvaro Brey + * Copyright (C) 2022 Álvaro Brey + * Copyright (C) 2022 Nextcloud GmbH + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +package com.nextcloud.talk.dagger.modules + +import com.nextcloud.talk.api.NcApi +import com.nextcloud.talk.repositories.SharedItemsRepository +import dagger.Module +import dagger.Provides + +@Module +class RepositoryModule { + @Provides + fun provideSharedItemsRepository(ncApi: NcApi): SharedItemsRepository { + return SharedItemsRepository(ncApi) + } +} diff --git a/app/src/main/java/com/nextcloud/talk/dagger/modules/ViewModelModule.kt b/app/src/main/java/com/nextcloud/talk/dagger/modules/ViewModelModule.kt new file mode 100644 index 000000000..39cfd8036 --- /dev/null +++ b/app/src/main/java/com/nextcloud/talk/dagger/modules/ViewModelModule.kt @@ -0,0 +1,56 @@ +/* + * Nextcloud Talk application + * + * @author Álvaro Brey + * Copyright (C) 2022 Álvaro Brey + * Copyright (C) 2022 Nextcloud GmbH + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +package com.nextcloud.talk.dagger.modules + +import androidx.lifecycle.ViewModel +import androidx.lifecycle.ViewModelProvider +import com.nextcloud.talk.viewmodels.SharedItemsViewModel +import dagger.Binds +import dagger.MapKey +import dagger.Module +import dagger.multibindings.IntoMap +import javax.inject.Inject +import javax.inject.Provider +import kotlin.reflect.KClass + +class ViewModelFactory @Inject constructor( + private val viewModels: MutableMap, Provider> +) : ViewModelProvider.Factory { + override fun create(modelClass: Class): T = viewModels[modelClass]?.get() as T +} + +@Target(AnnotationTarget.FUNCTION, AnnotationTarget.PROPERTY_GETTER, AnnotationTarget.PROPERTY_SETTER) +@Retention(AnnotationRetention.RUNTIME) +@MapKey +internal annotation class ViewModelKey(val value: KClass) + +@Module +abstract class ViewModelModule { + + @Binds + abstract fun bindViewModelFactory(factory: ViewModelFactory): ViewModelProvider.Factory + + @Binds + @IntoMap + @ViewModelKey(SharedItemsViewModel::class) + abstract fun sharedItemsViewModel(viewModel: SharedItemsViewModel): ViewModel +} diff --git a/app/src/main/java/com/nextcloud/talk/repositories/SharedItemsRepository.kt b/app/src/main/java/com/nextcloud/talk/repositories/SharedItemsRepository.kt index 270df6139..be6460dd7 100644 --- a/app/src/main/java/com/nextcloud/talk/repositories/SharedItemsRepository.kt +++ b/app/src/main/java/com/nextcloud/talk/repositories/SharedItemsRepository.kt @@ -1,10 +1,8 @@ package com.nextcloud.talk.repositories import android.util.Log -import autodagger.AutoInjector import com.nextcloud.talk.R import com.nextcloud.talk.api.NcApi -import com.nextcloud.talk.application.NextcloudTalkApplication import com.nextcloud.talk.application.NextcloudTalkApplication.Companion.sharedApplication import com.nextcloud.talk.models.database.UserEntity import com.nextcloud.talk.models.json.chat.ChatShareOverall @@ -14,15 +12,7 @@ import retrofit2.Response import java.util.Locale import javax.inject.Inject -@AutoInjector(NextcloudTalkApplication::class) -class SharedItemsRepository { - - @Inject - lateinit var ncApi: NcApi - - init { - sharedApplication!!.componentApplication.inject(this) - } +class SharedItemsRepository @Inject constructor(private val ncApi: NcApi) { fun media(parameters: Parameters, type: SharedItemType): Observable? { return media(parameters, type, null) diff --git a/app/src/main/java/com/nextcloud/talk/viewmodels/SharedItemsViewModel.kt b/app/src/main/java/com/nextcloud/talk/viewmodels/SharedItemsViewModel.kt index 7123b3200..134cd7f23 100644 --- a/app/src/main/java/com/nextcloud/talk/viewmodels/SharedItemsViewModel.kt +++ b/app/src/main/java/com/nextcloud/talk/viewmodels/SharedItemsViewModel.kt @@ -4,7 +4,6 @@ import android.util.Log import androidx.lifecycle.LiveData import androidx.lifecycle.MutableLiveData import androidx.lifecycle.ViewModel -import androidx.lifecycle.ViewModelProvider import com.nextcloud.talk.models.database.UserEntity import com.nextcloud.talk.repositories.SharedItemType import com.nextcloud.talk.repositories.SharedItemsRepository @@ -13,11 +12,10 @@ import io.reactivex.Observer import io.reactivex.android.schedulers.AndroidSchedulers import io.reactivex.disposables.Disposable import io.reactivex.schedulers.Schedulers +import javax.inject.Inject -class SharedItemsViewModel( - private val repository: SharedItemsRepository, - private val initialType: SharedItemType, - private val repositoryParameters: SharedItemsRepository.Parameters +class SharedItemsViewModel @Inject constructor( + private val repository: SharedItemsRepository ) : ViewModel() { @@ -29,11 +27,12 @@ class SharedItemsViewModel( private val _sharedItems: MutableLiveData by lazy { MutableLiveData().also { - loadItems(initialType) + loadItems(_currentItemType) } } - private var _currentItemType = initialType + private lateinit var repositoryParameters: SharedItemsRepository.Parameters + private lateinit var _currentItemType: SharedItemType val sharedItemTypes: LiveData> get() = _sharedItemTypes @@ -120,27 +119,16 @@ class SharedItemsViewModel( }) } - class Factory(val userEntity: UserEntity, val roomToken: String, private val initialType: SharedItemType) : - ViewModelProvider - .Factory { - - override fun create(modelClass: Class): T { - if (modelClass.isAssignableFrom(SharedItemsViewModel::class.java)) { - - val repository = SharedItemsRepository() - val repositoryParameters = SharedItemsRepository.Parameters( - userEntity.userId, - userEntity.token, - userEntity.baseUrl, - userEntity, - roomToken - ) - - return SharedItemsViewModel(repository, initialType, repositoryParameters) as T - } - - throw IllegalArgumentException("Unknown ViewModel class") - } + // TODO cleanup + fun initialize(userEntity: UserEntity, roomToken: String, initialType: SharedItemType) { + repositoryParameters = SharedItemsRepository.Parameters( + userEntity.userId, + userEntity.token, + userEntity.baseUrl, + userEntity, + roomToken + ) + _currentItemType = initialType } companion object {