From 577357011e7d43c02b89b06eda408d32e7526bed Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tim=20Kr=C3=BCger?= Date: Tue, 10 May 2022 13:09:45 +0200 Subject: [PATCH 01/16] Let repository not expose API responses MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Tim Krüger --- .../repositories/SharedItemsRepository.kt | 76 +++++++++++++++-- .../talk/repositories/SharedMediaItems.kt | 2 +- .../talk/viewmodels/SharedItemsViewModel.kt | 84 ++++--------------- 3 files changed, 86 insertions(+), 76 deletions(-) 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 f34cd5497..6e496002f 100644 --- a/app/src/main/java/com/nextcloud/talk/repositories/SharedItemsRepository.kt +++ b/app/src/main/java/com/nextcloud/talk/repositories/SharedItemsRepository.kt @@ -1,5 +1,6 @@ package com.nextcloud.talk.repositories +import android.util.Log import autodagger.AutoInjector import com.nextcloud.talk.R import com.nextcloud.talk.api.NcApi @@ -7,8 +8,8 @@ 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 -import com.nextcloud.talk.models.json.chat.ChatShareOverviewOverall import com.nextcloud.talk.utils.ApiUtils +import com.nextcloud.talk.viewmodels.SharedItemsViewModel import io.reactivex.Observable import retrofit2.Response import java.util.Locale @@ -26,11 +27,11 @@ class SharedItemsRepository { sharedApplication!!.componentApplication.inject(this) } - fun media(type: SharedItemType): Observable>? { + fun media(type: SharedItemType): Observable? { return media(type, null) } - fun media(type: SharedItemType, lastKnownMessageId: Int?): Observable>? { + fun media(type: SharedItemType, lastKnownMessageId: Int?): Observable? { val credentials = ApiUtils.getCredentials(parameters!!.userName, parameters!!.userToken) return ncApi.getSharedItems( @@ -39,24 +40,86 @@ class SharedItemsRepository { type.toString().lowercase(Locale.ROOT), lastKnownMessageId, BATCH_SIZE + ).map { map(it, type) } + } + + private fun map(response: Response, type: SharedItemType): SharedMediaItems { + + var chatLastGiven: Int? = null + val items = mutableMapOf() + + if (response.headers()["x-chat-last-given"] != null) { + chatLastGiven = response.headers()["x-chat-last-given"]!!.toInt() + } + + val mediaItems = response.body()!!.ocs!!.data + if (mediaItems != null) { + for (it in mediaItems) { + if (it.value.messageParameters?.containsKey("file") == true) { + val fileParameters = it.value.messageParameters!!["file"]!! + + val previewAvailable = + "yes".equals(fileParameters["preview-available"]!!, ignoreCase = true) + + items[it.value.id] = SharedItem( + fileParameters["id"]!!, + fileParameters["name"]!!, + fileParameters["size"]!!.toLong(), + it.value.timestamp, + fileParameters["path"]!!, + fileParameters["link"]!!, + fileParameters["mimetype"]!!, + previewAvailable, + previewLink(fileParameters["id"]), + parameters!!.userEntity + ) + } else { + Log.w(TAG, "location and deckcard are not yet supported") + } + } + } + + val sortedMutableItems = items.toSortedMap().values.toList().reversed().toMutableList() + val moreItemsExisting = items.count() == SharedItemsViewModel.BATCH_SIZE + + return SharedMediaItems( + type, + sortedMutableItems, + chatLastGiven, + moreItemsExisting, + authHeader() ) } - fun availableTypes(): Observable>? { + fun availableTypes(): Observable> { val credentials = ApiUtils.getCredentials(parameters!!.userName, parameters!!.userToken) return ncApi.getSharedItemsOverview( credentials, ApiUtils.getUrlForChatSharedItemsOverview(1, parameters!!.baseUrl, parameters!!.roomToken), 1 - ) + ).map { + val types = mutableSetOf() + val typeMap = it.body()!!.ocs!!.data!! + for (t in typeMap) { + if (t.value.isNotEmpty()) { + try { + types += SharedItemType.typeFor(t.key) + } catch (e: IllegalArgumentException) { + Log.w(TAG, "Server responds an unknown shared item type: ${t.key}") + } + } + } + + types.toSet() + } } fun authHeader(): Map { return mapOf(Pair("Authorization", ApiUtils.getCredentials(parameters!!.userName, parameters!!.userToken))) } - fun previewLink(fileId: String?): String { + private fun previewLink(fileId: String?): String { return ApiUtils.getUrlForFilePreviewWithFileId( parameters!!.baseUrl, fileId, @@ -74,5 +137,6 @@ class SharedItemsRepository { companion object { const val BATCH_SIZE: Int = 28 + private val TAG = SharedItemsRepository::class.simpleName } } diff --git a/app/src/main/java/com/nextcloud/talk/repositories/SharedMediaItems.kt b/app/src/main/java/com/nextcloud/talk/repositories/SharedMediaItems.kt index 91f5fcf10..fc5e6b897 100644 --- a/app/src/main/java/com/nextcloud/talk/repositories/SharedMediaItems.kt +++ b/app/src/main/java/com/nextcloud/talk/repositories/SharedMediaItems.kt @@ -2,7 +2,7 @@ package com.nextcloud.talk.repositories class SharedMediaItems( val type: SharedItemType, - val items: MutableList, + val items: List, var lastSeenId: Int?, var moreItemsExisting: Boolean, val authHeader: Map 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 03210d6cf..1d5c80b2c 100644 --- a/app/src/main/java/com/nextcloud/talk/viewmodels/SharedItemsViewModel.kt +++ b/app/src/main/java/com/nextcloud/talk/viewmodels/SharedItemsViewModel.kt @@ -6,9 +6,6 @@ import androidx.lifecycle.MutableLiveData import androidx.lifecycle.ViewModel import androidx.lifecycle.ViewModelProvider import com.nextcloud.talk.models.database.UserEntity -import com.nextcloud.talk.models.json.chat.ChatShareOverall -import com.nextcloud.talk.models.json.chat.ChatShareOverviewOverall -import com.nextcloud.talk.repositories.SharedItem import com.nextcloud.talk.repositories.SharedItemType import com.nextcloud.talk.repositories.SharedItemsRepository import com.nextcloud.talk.repositories.SharedMediaItems @@ -16,7 +13,6 @@ import io.reactivex.Observer import io.reactivex.android.schedulers.AndroidSchedulers import io.reactivex.disposables.Disposable import io.reactivex.schedulers.Schedulers -import retrofit2.Response class SharedItemsViewModel(private val repository: SharedItemsRepository, private val initialType: SharedItemType) : ViewModel() { @@ -55,46 +51,15 @@ class SharedItemsViewModel(private val repository: SharedItemsRepository, privat ?.subscribe(observer(type, true)) } - private fun observer(type: SharedItemType, initModel: Boolean): Observer> { - return object : Observer> { + private fun observer(type: SharedItemType, initModel: Boolean): Observer { + return object : Observer { - var chatLastGiven: Int? = null - val items = mutableMapOf() + var newSharedItems: SharedMediaItems? = null override fun onSubscribe(d: Disposable) = Unit - override fun onNext(response: Response) { - - if (response.headers()["x-chat-last-given"] != null) { - chatLastGiven = response.headers()["x-chat-last-given"]!!.toInt() - } - - val mediaItems = response.body()!!.ocs!!.data - if (mediaItems != null) { - for (it in mediaItems) { - if (it.value.messageParameters!!.containsKey("file")) { - val fileParameters = it.value.messageParameters!!["file"]!! - - val previewAvailable = - "yes".equals(fileParameters["preview-available"], ignoreCase = true) - - items[it.value.id] = SharedItem( - fileParameters["id"]!!, - fileParameters["name"]!!, - fileParameters["size"]?.toLong(), - it.value.timestamp, - fileParameters["path"]!!, - fileParameters["link"], - fileParameters["mimetype"], - previewAvailable, - repository.previewLink(fileParameters["id"]), - repository.parameters!!.userEntity - ) - } else { - Log.w(TAG, "location and deckcard are not yet supported") - } - } - } + override fun onNext(response: SharedMediaItems) { + newSharedItems = response } override fun onError(e: Throwable) { @@ -102,27 +67,17 @@ class SharedItemsViewModel(private val repository: SharedItemsRepository, privat } override fun onComplete() { - - val sortedMutableItems = items.toSortedMap().values.toList().reversed().toMutableList() - val moreItemsExisting = items.count() == BATCH_SIZE - if (initModel) { this@SharedItemsViewModel._sharedItems.value = - SharedMediaItems( - type, - sortedMutableItems, - chatLastGiven, - moreItemsExisting, - repository.authHeader() - ) + newSharedItems } else { val oldItems = this@SharedItemsViewModel._sharedItems.value!!.items this@SharedItemsViewModel._sharedItems.value = SharedMediaItems( type, - (oldItems.toMutableList() + sortedMutableItems) as MutableList, - chatLastGiven, - moreItemsExisting, + oldItems + newSharedItems!!.items, + newSharedItems!!.lastSeenId, + newSharedItems!!.moreItemsExisting, repository.authHeader() ) } @@ -131,25 +86,16 @@ class SharedItemsViewModel(private val repository: SharedItemsRepository, privat } private fun availableTypes() { - repository.availableTypes()?.subscribeOn(Schedulers.io()) + repository.availableTypes().subscribeOn(Schedulers.io()) ?.observeOn(AndroidSchedulers.mainThread()) - ?.subscribe(object : Observer> { + ?.subscribe(object : Observer> { - val types = mutableSetOf() + var types: Set? = null override fun onSubscribe(d: Disposable) = Unit - override fun onNext(response: Response) { - val typeMap = response.body()!!.ocs!!.data!! - for (it in typeMap) { - if (it.value.size > 0) { - try { - types += SharedItemType.typeFor(it.key) - } catch (e: IllegalArgumentException) { - Log.w(TAG, "Server responds an unknown shared item type: ${it.key}") - } - } - } + override fun onNext(types: Set) { + this.types = types } override fun onError(e: Throwable) { @@ -157,7 +103,7 @@ class SharedItemsViewModel(private val repository: SharedItemsRepository, privat } override fun onComplete() { - this@SharedItemsViewModel._sharedItemType.value = types + this@SharedItemsViewModel._sharedItemType.value = this.types } }) } From 6a27dc7dba57705046f93e13c17f69a2da42fa61 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tim=20Kr=C3=BCger?= Date: Tue, 10 May 2022 15:06:27 +0200 Subject: [PATCH 02/16] Pass needed parameters during every call to repository MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Tim Krüger --- .../repositories/SharedItemsRepository.kt | 40 ++++++++++--------- .../talk/viewmodels/SharedItemsViewModel.kt | 19 +++++---- 2 files changed, 33 insertions(+), 26 deletions(-) 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 6e496002f..531937df5 100644 --- a/app/src/main/java/com/nextcloud/talk/repositories/SharedItemsRepository.kt +++ b/app/src/main/java/com/nextcloud/talk/repositories/SharedItemsRepository.kt @@ -18,8 +18,6 @@ import javax.inject.Inject @AutoInjector(NextcloudTalkApplication::class) class SharedItemsRepository { - var parameters: Parameters? = null - @Inject lateinit var ncApi: NcApi @@ -27,23 +25,27 @@ class SharedItemsRepository { sharedApplication!!.componentApplication.inject(this) } - fun media(type: SharedItemType): Observable? { - return media(type, null) + fun media(parameters: Parameters, type: SharedItemType): Observable? { + return media(parameters, type, null) } - fun media(type: SharedItemType, lastKnownMessageId: Int?): Observable? { - val credentials = ApiUtils.getCredentials(parameters!!.userName, parameters!!.userToken) + fun media(parameters: Parameters, type: SharedItemType, lastKnownMessageId: Int?): Observable? { + val credentials = ApiUtils.getCredentials(parameters.userName, parameters.userToken) return ncApi.getSharedItems( credentials, - ApiUtils.getUrlForChatSharedItems(1, parameters!!.baseUrl, parameters!!.roomToken), + ApiUtils.getUrlForChatSharedItems(1, parameters.baseUrl, parameters.roomToken), type.toString().lowercase(Locale.ROOT), lastKnownMessageId, BATCH_SIZE - ).map { map(it, type) } + ).map { map(it, type, parameters) } } - private fun map(response: Response, type: SharedItemType): SharedMediaItems { + private fun map( + response: Response, + type: SharedItemType, + parameters: Parameters + ): SharedMediaItems { var chatLastGiven: Int? = null val items = mutableMapOf() @@ -70,8 +72,8 @@ class SharedItemsRepository { fileParameters["link"]!!, fileParameters["mimetype"]!!, previewAvailable, - previewLink(fileParameters["id"]), - parameters!!.userEntity + previewLink(fileParameters["id"], parameters.baseUrl), + parameters.userEntity ) } else { Log.w(TAG, "location and deckcard are not yet supported") @@ -87,16 +89,16 @@ class SharedItemsRepository { sortedMutableItems, chatLastGiven, moreItemsExisting, - authHeader() + authHeader(parameters.userName, parameters.userToken) ) } - fun availableTypes(): Observable> { - val credentials = ApiUtils.getCredentials(parameters!!.userName, parameters!!.userToken) + fun availableTypes(parameters: Parameters): Observable> { + val credentials = ApiUtils.getCredentials(parameters.userName, parameters.userToken) return ncApi.getSharedItemsOverview( credentials, - ApiUtils.getUrlForChatSharedItemsOverview(1, parameters!!.baseUrl, parameters!!.roomToken), + ApiUtils.getUrlForChatSharedItemsOverview(1, parameters.baseUrl, parameters.roomToken), 1 ).map { val types = mutableSetOf() @@ -115,13 +117,13 @@ class SharedItemsRepository { } } - fun authHeader(): Map { - return mapOf(Pair("Authorization", ApiUtils.getCredentials(parameters!!.userName, parameters!!.userToken))) + private fun authHeader(userName: String, userToken: String): Map { + return mapOf(Pair("Authorization", ApiUtils.getCredentials(userName, userToken))) } - private fun previewLink(fileId: String?): String { + private fun previewLink(fileId: String?, baseUrl: String): String { return ApiUtils.getUrlForFilePreviewWithFileId( - parameters!!.baseUrl, + baseUrl, fileId, sharedApplication!!.resources.getDimensionPixelSize(R.dimen.maximum_file_preview_size) ) 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 1d5c80b2c..25d912dc1 100644 --- a/app/src/main/java/com/nextcloud/talk/viewmodels/SharedItemsViewModel.kt +++ b/app/src/main/java/com/nextcloud/talk/viewmodels/SharedItemsViewModel.kt @@ -14,7 +14,11 @@ import io.reactivex.android.schedulers.AndroidSchedulers import io.reactivex.disposables.Disposable import io.reactivex.schedulers.Schedulers -class SharedItemsViewModel(private val repository: SharedItemsRepository, private val initialType: SharedItemType) : +class SharedItemsViewModel( + private val repository: SharedItemsRepository, + private val initialType: SharedItemType, + private val repositoryParameters: SharedItemsRepository.Parameters +) : ViewModel() { private val _sharedItemType: MutableLiveData> by lazy { @@ -39,14 +43,15 @@ class SharedItemsViewModel(private val repository: SharedItemsRepository, privat val currentSharedItems = sharedItems.value!! if (currentSharedItems.moreItemsExisting) { - repository.media(currentSharedItems.type, currentSharedItems.lastSeenId)?.subscribeOn(Schedulers.io()) + repository.media(repositoryParameters, currentSharedItems.type, currentSharedItems.lastSeenId) + ?.subscribeOn(Schedulers.io()) ?.observeOn(AndroidSchedulers.mainThread()) ?.subscribe(observer(currentSharedItems.type, false)) } } fun loadItems(type: SharedItemType) { - repository.media(type)?.subscribeOn(Schedulers.io()) + repository.media(repositoryParameters, type)?.subscribeOn(Schedulers.io()) ?.observeOn(AndroidSchedulers.mainThread()) ?.subscribe(observer(type, true)) } @@ -78,7 +83,7 @@ class SharedItemsViewModel(private val repository: SharedItemsRepository, privat oldItems + newSharedItems!!.items, newSharedItems!!.lastSeenId, newSharedItems!!.moreItemsExisting, - repository.authHeader() + newSharedItems!!.authHeader ) } } @@ -86,7 +91,7 @@ class SharedItemsViewModel(private val repository: SharedItemsRepository, privat } private fun availableTypes() { - repository.availableTypes().subscribeOn(Schedulers.io()) + repository.availableTypes(repositoryParameters).subscribeOn(Schedulers.io()) ?.observeOn(AndroidSchedulers.mainThread()) ?.subscribe(object : Observer> { @@ -116,7 +121,7 @@ class SharedItemsViewModel(private val repository: SharedItemsRepository, privat if (modelClass.isAssignableFrom(SharedItemsViewModel::class.java)) { val repository = SharedItemsRepository() - repository.parameters = SharedItemsRepository.Parameters( + val repositoryParameters = SharedItemsRepository.Parameters( userEntity.userId, userEntity.token, userEntity.baseUrl, @@ -124,7 +129,7 @@ class SharedItemsViewModel(private val repository: SharedItemsRepository, privat roomToken ) - return SharedItemsViewModel(repository, initialType) as T + return SharedItemsViewModel(repository, initialType, repositoryParameters) as T } throw IllegalArgumentException("Unknown ViewModel class") From 36769e4fbe6a08451bef68fa1d1f0116541fb819 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tim=20Kr=C3=BCger?= Date: Tue, 10 May 2022 15:48:23 +0200 Subject: [PATCH 03/16] Remove constand BATCH_SIZE from SharedItemsViewModel MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Tim Krüger --- .../com/nextcloud/talk/repositories/SharedItemsRepository.kt | 3 +-- .../java/com/nextcloud/talk/viewmodels/SharedItemsViewModel.kt | 1 - 2 files changed, 1 insertion(+), 3 deletions(-) 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 531937df5..aa9d97fbc 100644 --- a/app/src/main/java/com/nextcloud/talk/repositories/SharedItemsRepository.kt +++ b/app/src/main/java/com/nextcloud/talk/repositories/SharedItemsRepository.kt @@ -9,7 +9,6 @@ import com.nextcloud.talk.application.NextcloudTalkApplication.Companion.sharedA import com.nextcloud.talk.models.database.UserEntity import com.nextcloud.talk.models.json.chat.ChatShareOverall import com.nextcloud.talk.utils.ApiUtils -import com.nextcloud.talk.viewmodels.SharedItemsViewModel import io.reactivex.Observable import retrofit2.Response import java.util.Locale @@ -82,7 +81,7 @@ class SharedItemsRepository { } val sortedMutableItems = items.toSortedMap().values.toList().reversed().toMutableList() - val moreItemsExisting = items.count() == SharedItemsViewModel.BATCH_SIZE + val moreItemsExisting = items.count() == BATCH_SIZE return SharedMediaItems( type, 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 25d912dc1..9f6121071 100644 --- a/app/src/main/java/com/nextcloud/talk/viewmodels/SharedItemsViewModel.kt +++ b/app/src/main/java/com/nextcloud/talk/viewmodels/SharedItemsViewModel.kt @@ -138,6 +138,5 @@ class SharedItemsViewModel( companion object { private val TAG = SharedItemsViewModel::class.simpleName - const val BATCH_SIZE: Int = 28 } } From 6716726ff106bed34770dcf9bc4d75e33a0e9a1a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tim=20Kr=C3=BCger?= Date: Tue, 10 May 2022 16:22:29 +0200 Subject: [PATCH 04/16] Move currentTab from activity to viewmodel MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Tim Krüger --- .../talk/activities/SharedItemsActivity.kt | 16 ++++---------- .../repositories/SharedItemsRepository.kt | 4 +--- .../talk/repositories/SharedMediaItems.kt | 1 - .../talk/viewmodels/SharedItemsViewModel.kt | 21 ++++++++++++------- 4 files changed, 19 insertions(+), 23 deletions(-) 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 76fb75600..dade8fb7f 100644 --- a/app/src/main/java/com/nextcloud/talk/activities/SharedItemsActivity.kt +++ b/app/src/main/java/com/nextcloud/talk/activities/SharedItemsActivity.kt @@ -26,13 +26,10 @@ class SharedItemsActivity : AppCompatActivity() { private lateinit var binding: ActivitySharedItemsBinding private lateinit var viewModel: SharedItemsViewModel - private lateinit var currentTab: SharedItemType override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) - currentTab = SharedItemType.MEDIA - val roomToken = intent.getStringExtra(KEY_ROOM_TOKEN)!! val conversationName = intent.getStringExtra(KEY_CONVERSATION_NAME) val userEntity = intent.getParcelableExtra(KEY_USER_ENTITY)!! @@ -57,17 +54,17 @@ class SharedItemsActivity : AppCompatActivity() { viewModel = ViewModelProvider( this, - SharedItemsViewModel.Factory(userEntity, roomToken, currentTab) + SharedItemsViewModel.Factory(userEntity, roomToken, SharedItemType.MEDIA) ).get(SharedItemsViewModel::class.java) - viewModel.sharedItemType.observe(this) { + viewModel.sharedItemTypes.observe(this) { initTabs(it) } viewModel.sharedItems.observe(this) { Log.d(TAG, "Items received: $it") - if (currentTab == SharedItemType.MEDIA) { + if (viewModel.currentItemType == SharedItemType.MEDIA) { val adapter = SharedItemsGridAdapter() adapter.items = it.items adapter.authHeader = it.authHeader @@ -97,11 +94,6 @@ class SharedItemsActivity : AppCompatActivity() { }) } - fun updateItems(type: SharedItemType) { - currentTab = type - viewModel.loadItems(type) - } - private fun initTabs(sharedItemTypes: Set) { if (sharedItemTypes.contains(SharedItemType.MEDIA)) { @@ -155,7 +147,7 @@ class SharedItemsActivity : AppCompatActivity() { binding.sharedItemsTabs.addOnTabSelectedListener(object : TabLayout.OnTabSelectedListener { override fun onTabSelected(tab: TabLayout.Tab) { - updateItems(tab.tag as SharedItemType) + viewModel.loadItems(tab.tag as SharedItemType) } override fun onTabUnselected(tab: TabLayout.Tab) = Unit 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 aa9d97fbc..270df6139 100644 --- a/app/src/main/java/com/nextcloud/talk/repositories/SharedItemsRepository.kt +++ b/app/src/main/java/com/nextcloud/talk/repositories/SharedItemsRepository.kt @@ -37,12 +37,11 @@ class SharedItemsRepository { type.toString().lowercase(Locale.ROOT), lastKnownMessageId, BATCH_SIZE - ).map { map(it, type, parameters) } + ).map { map(it, parameters) } } private fun map( response: Response, - type: SharedItemType, parameters: Parameters ): SharedMediaItems { @@ -84,7 +83,6 @@ class SharedItemsRepository { val moreItemsExisting = items.count() == BATCH_SIZE return SharedMediaItems( - type, sortedMutableItems, chatLastGiven, moreItemsExisting, diff --git a/app/src/main/java/com/nextcloud/talk/repositories/SharedMediaItems.kt b/app/src/main/java/com/nextcloud/talk/repositories/SharedMediaItems.kt index fc5e6b897..6572c1595 100644 --- a/app/src/main/java/com/nextcloud/talk/repositories/SharedMediaItems.kt +++ b/app/src/main/java/com/nextcloud/talk/repositories/SharedMediaItems.kt @@ -1,7 +1,6 @@ package com.nextcloud.talk.repositories class SharedMediaItems( - val type: SharedItemType, val items: List, var lastSeenId: Int?, var moreItemsExisting: Boolean, 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 9f6121071..7123b3200 100644 --- a/app/src/main/java/com/nextcloud/talk/viewmodels/SharedItemsViewModel.kt +++ b/app/src/main/java/com/nextcloud/talk/viewmodels/SharedItemsViewModel.kt @@ -21,7 +21,7 @@ class SharedItemsViewModel( ) : ViewModel() { - private val _sharedItemType: MutableLiveData> by lazy { + private val _sharedItemTypes: MutableLiveData> by lazy { MutableLiveData>().also { availableTypes() } @@ -33,24 +33,32 @@ class SharedItemsViewModel( } } - val sharedItemType: LiveData> - get() = _sharedItemType + private var _currentItemType = initialType + + val sharedItemTypes: LiveData> + get() = _sharedItemTypes val sharedItems: LiveData get() = _sharedItems + val currentItemType: SharedItemType + get() = _currentItemType + fun loadNextItems() { val currentSharedItems = sharedItems.value!! if (currentSharedItems.moreItemsExisting) { - repository.media(repositoryParameters, currentSharedItems.type, currentSharedItems.lastSeenId) + repository.media(repositoryParameters, _currentItemType, currentSharedItems.lastSeenId) ?.subscribeOn(Schedulers.io()) ?.observeOn(AndroidSchedulers.mainThread()) - ?.subscribe(observer(currentSharedItems.type, false)) + ?.subscribe(observer(_currentItemType, false)) } } fun loadItems(type: SharedItemType) { + + _currentItemType = type + repository.media(repositoryParameters, type)?.subscribeOn(Schedulers.io()) ?.observeOn(AndroidSchedulers.mainThread()) ?.subscribe(observer(type, true)) @@ -79,7 +87,6 @@ class SharedItemsViewModel( val oldItems = this@SharedItemsViewModel._sharedItems.value!!.items this@SharedItemsViewModel._sharedItems.value = SharedMediaItems( - type, oldItems + newSharedItems!!.items, newSharedItems!!.lastSeenId, newSharedItems!!.moreItemsExisting, @@ -108,7 +115,7 @@ class SharedItemsViewModel( } override fun onComplete() { - this@SharedItemsViewModel._sharedItemType.value = this.types + this@SharedItemsViewModel._sharedItemTypes.value = this.types } }) } From 716dcfe01de619e77cae72e5fea4d23126f012d3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=81lvaro=20Brey?= Date: Tue, 10 May 2022 17:43:39 +0200 Subject: [PATCH 05/16] DI: Setup viewmodel injection MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Álvaro Brey --- .../talk/activities/SharedItemsActivity.kt | 14 +++-- .../application/NextcloudTalkApplication.kt | 6 +- .../talk/dagger/modules/RepositoryModule.kt | 35 ++++++++++++ .../talk/dagger/modules/ViewModelModule.kt | 56 +++++++++++++++++++ .../repositories/SharedItemsRepository.kt | 12 +--- .../talk/viewmodels/SharedItemsViewModel.kt | 44 ++++++--------- 6 files changed, 123 insertions(+), 44 deletions(-) create mode 100644 app/src/main/java/com/nextcloud/talk/dagger/modules/RepositoryModule.kt create mode 100644 app/src/main/java/com/nextcloud/talk/dagger/modules/ViewModelModule.kt 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 { From fd76f8231d9271f26d5d13837b0d5c90cbdc5a9f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tim=20Kr=C3=BCger?= Date: Wed, 11 May 2022 18:48:00 +0200 Subject: [PATCH 06/16] Move 'Shared items' related classes to own package MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Tim Krüger --- app/src/main/AndroidManifest.xml | 2 +- .../com/nextcloud/talk/controllers/ChatController.kt | 2 +- .../talk/controllers/ConversationInfoController.kt | 2 +- .../nextcloud/talk/dagger/modules/RepositoryModule.kt | 2 +- .../nextcloud/talk/dagger/modules/ViewModelModule.kt | 2 +- .../activities/SharedItemsActivity.kt | 10 +++++----- .../adapters/SharedItemsGridAdapter.kt | 4 ++-- .../adapters/SharedItemsListAdapter.kt | 4 ++-- .../{repositories => shareditems/model}/SharedItem.kt | 2 +- .../model}/SharedItemType.kt | 2 +- .../model}/SharedMediaItems.kt | 2 +- .../repositories/SharedItemsRepository.kt | 5 ++++- .../viewmodels/SharedItemsViewModel.kt | 8 ++++---- app/src/main/res/layout/activity_shared_items.xml | 2 +- 14 files changed, 26 insertions(+), 23 deletions(-) rename app/src/main/java/com/nextcloud/talk/{ => shareditems}/activities/SharedItemsActivity.kt (95%) rename app/src/main/java/com/nextcloud/talk/{ => shareditems}/adapters/SharedItemsGridAdapter.kt (97%) rename app/src/main/java/com/nextcloud/talk/{ => shareditems}/adapters/SharedItemsListAdapter.kt (97%) rename app/src/main/java/com/nextcloud/talk/{repositories => shareditems/model}/SharedItem.kt (88%) rename app/src/main/java/com/nextcloud/talk/{repositories => shareditems/model}/SharedItemType.kt (84%) rename app/src/main/java/com/nextcloud/talk/{repositories => shareditems/model}/SharedMediaItems.kt (78%) rename app/src/main/java/com/nextcloud/talk/{ => shareditems}/repositories/SharedItemsRepository.kt (95%) rename app/src/main/java/com/nextcloud/talk/{ => shareditems}/viewmodels/SharedItemsViewModel.kt (94%) diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index e2f11f867..41ae4ce7f 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -169,7 +169,7 @@ android:windowSoftInputMode="stateHidden" /> diff --git a/app/src/main/java/com/nextcloud/talk/controllers/ChatController.kt b/app/src/main/java/com/nextcloud/talk/controllers/ChatController.kt index e4714ea08..cfba72955 100644 --- a/app/src/main/java/com/nextcloud/talk/controllers/ChatController.kt +++ b/app/src/main/java/com/nextcloud/talk/controllers/ChatController.kt @@ -103,7 +103,7 @@ import com.nextcloud.talk.BuildConfig import com.nextcloud.talk.R import com.nextcloud.talk.activities.CallActivity import com.nextcloud.talk.activities.MainActivity -import com.nextcloud.talk.activities.SharedItemsActivity +import com.nextcloud.talk.shareditems.activities.SharedItemsActivity import com.nextcloud.talk.activities.TakePhotoActivity import com.nextcloud.talk.adapters.messages.IncomingLocationMessageViewHolder import com.nextcloud.talk.adapters.messages.IncomingPreviewMessageViewHolder diff --git a/app/src/main/java/com/nextcloud/talk/controllers/ConversationInfoController.kt b/app/src/main/java/com/nextcloud/talk/controllers/ConversationInfoController.kt index bc6c25a1e..7068af0c5 100644 --- a/app/src/main/java/com/nextcloud/talk/controllers/ConversationInfoController.kt +++ b/app/src/main/java/com/nextcloud/talk/controllers/ConversationInfoController.kt @@ -51,7 +51,7 @@ import com.bluelinelabs.conductor.RouterTransaction import com.bluelinelabs.conductor.changehandler.HorizontalChangeHandler import com.facebook.drawee.backends.pipeline.Fresco import com.nextcloud.talk.R -import com.nextcloud.talk.activities.SharedItemsActivity +import com.nextcloud.talk.shareditems.activities.SharedItemsActivity import com.nextcloud.talk.adapters.items.ParticipantItem import com.nextcloud.talk.api.NcApi import com.nextcloud.talk.application.NextcloudTalkApplication 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 index e31957085..b070689b8 100644 --- a/app/src/main/java/com/nextcloud/talk/dagger/modules/RepositoryModule.kt +++ b/app/src/main/java/com/nextcloud/talk/dagger/modules/RepositoryModule.kt @@ -22,7 +22,7 @@ package com.nextcloud.talk.dagger.modules import com.nextcloud.talk.api.NcApi -import com.nextcloud.talk.repositories.SharedItemsRepository +import com.nextcloud.talk.shareditems.repositories.SharedItemsRepository import dagger.Module import dagger.Provides 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 index 39cfd8036..d684db1b2 100644 --- a/app/src/main/java/com/nextcloud/talk/dagger/modules/ViewModelModule.kt +++ b/app/src/main/java/com/nextcloud/talk/dagger/modules/ViewModelModule.kt @@ -23,7 +23,7 @@ package com.nextcloud.talk.dagger.modules import androidx.lifecycle.ViewModel import androidx.lifecycle.ViewModelProvider -import com.nextcloud.talk.viewmodels.SharedItemsViewModel +import com.nextcloud.talk.shareditems.viewmodels.SharedItemsViewModel import dagger.Binds import dagger.MapKey import dagger.Module diff --git a/app/src/main/java/com/nextcloud/talk/activities/SharedItemsActivity.kt b/app/src/main/java/com/nextcloud/talk/shareditems/activities/SharedItemsActivity.kt similarity index 95% rename from app/src/main/java/com/nextcloud/talk/activities/SharedItemsActivity.kt rename to app/src/main/java/com/nextcloud/talk/shareditems/activities/SharedItemsActivity.kt index 80ba643b2..2582c7729 100644 --- a/app/src/main/java/com/nextcloud/talk/activities/SharedItemsActivity.kt +++ b/app/src/main/java/com/nextcloud/talk/shareditems/activities/SharedItemsActivity.kt @@ -1,4 +1,4 @@ -package com.nextcloud.talk.activities +package com.nextcloud.talk.shareditems.activities import android.os.Bundle import android.util.Log @@ -12,17 +12,17 @@ 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.shareditems.adapters.SharedItemsGridAdapter +import com.nextcloud.talk.shareditems.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 +import com.nextcloud.talk.shareditems.model.SharedItemType import com.nextcloud.talk.utils.DisplayUtils 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 com.nextcloud.talk.shareditems.viewmodels.SharedItemsViewModel import javax.inject.Inject @AutoInjector(NextcloudTalkApplication::class) diff --git a/app/src/main/java/com/nextcloud/talk/adapters/SharedItemsGridAdapter.kt b/app/src/main/java/com/nextcloud/talk/shareditems/adapters/SharedItemsGridAdapter.kt similarity index 97% rename from app/src/main/java/com/nextcloud/talk/adapters/SharedItemsGridAdapter.kt rename to app/src/main/java/com/nextcloud/talk/shareditems/adapters/SharedItemsGridAdapter.kt index 240842254..29134f172 100644 --- a/app/src/main/java/com/nextcloud/talk/adapters/SharedItemsGridAdapter.kt +++ b/app/src/main/java/com/nextcloud/talk/shareditems/adapters/SharedItemsGridAdapter.kt @@ -1,4 +1,4 @@ -package com.nextcloud.talk.adapters +package com.nextcloud.talk.shareditems.adapters import android.net.Uri import android.util.Log @@ -16,7 +16,7 @@ import com.facebook.imagepipeline.common.RotationOptions import com.facebook.imagepipeline.image.ImageInfo import com.facebook.imagepipeline.request.ImageRequestBuilder import com.nextcloud.talk.databinding.SharedItemGridBinding -import com.nextcloud.talk.repositories.SharedItem +import com.nextcloud.talk.shareditems.model.SharedItem import com.nextcloud.talk.utils.DrawableUtils import com.nextcloud.talk.utils.FileViewerUtils diff --git a/app/src/main/java/com/nextcloud/talk/adapters/SharedItemsListAdapter.kt b/app/src/main/java/com/nextcloud/talk/shareditems/adapters/SharedItemsListAdapter.kt similarity index 97% rename from app/src/main/java/com/nextcloud/talk/adapters/SharedItemsListAdapter.kt rename to app/src/main/java/com/nextcloud/talk/shareditems/adapters/SharedItemsListAdapter.kt index 56a084b21..7b5bbd6e7 100644 --- a/app/src/main/java/com/nextcloud/talk/adapters/SharedItemsListAdapter.kt +++ b/app/src/main/java/com/nextcloud/talk/shareditems/adapters/SharedItemsListAdapter.kt @@ -1,4 +1,4 @@ -package com.nextcloud.talk.adapters +package com.nextcloud.talk.shareditems.adapters import android.net.Uri import android.text.format.Formatter @@ -16,7 +16,7 @@ import com.facebook.imagepipeline.common.RotationOptions import com.facebook.imagepipeline.image.ImageInfo import com.facebook.imagepipeline.request.ImageRequestBuilder import com.nextcloud.talk.databinding.SharedItemListBinding -import com.nextcloud.talk.repositories.SharedItem +import com.nextcloud.talk.shareditems.model.SharedItem import com.nextcloud.talk.utils.DateUtils import com.nextcloud.talk.utils.DrawableUtils import com.nextcloud.talk.utils.FileViewerUtils diff --git a/app/src/main/java/com/nextcloud/talk/repositories/SharedItem.kt b/app/src/main/java/com/nextcloud/talk/shareditems/model/SharedItem.kt similarity index 88% rename from app/src/main/java/com/nextcloud/talk/repositories/SharedItem.kt rename to app/src/main/java/com/nextcloud/talk/shareditems/model/SharedItem.kt index 38aeef303..1e684f7ed 100644 --- a/app/src/main/java/com/nextcloud/talk/repositories/SharedItem.kt +++ b/app/src/main/java/com/nextcloud/talk/shareditems/model/SharedItem.kt @@ -1,4 +1,4 @@ -package com.nextcloud.talk.repositories +package com.nextcloud.talk.shareditems.model import com.nextcloud.talk.models.database.UserEntity diff --git a/app/src/main/java/com/nextcloud/talk/repositories/SharedItemType.kt b/app/src/main/java/com/nextcloud/talk/shareditems/model/SharedItemType.kt similarity index 84% rename from app/src/main/java/com/nextcloud/talk/repositories/SharedItemType.kt rename to app/src/main/java/com/nextcloud/talk/shareditems/model/SharedItemType.kt index e263ae8cc..7ddf9228e 100644 --- a/app/src/main/java/com/nextcloud/talk/repositories/SharedItemType.kt +++ b/app/src/main/java/com/nextcloud/talk/shareditems/model/SharedItemType.kt @@ -1,4 +1,4 @@ -package com.nextcloud.talk.repositories +package com.nextcloud.talk.shareditems.model import java.util.Locale diff --git a/app/src/main/java/com/nextcloud/talk/repositories/SharedMediaItems.kt b/app/src/main/java/com/nextcloud/talk/shareditems/model/SharedMediaItems.kt similarity index 78% rename from app/src/main/java/com/nextcloud/talk/repositories/SharedMediaItems.kt rename to app/src/main/java/com/nextcloud/talk/shareditems/model/SharedMediaItems.kt index 6572c1595..7d4fd1ed3 100644 --- a/app/src/main/java/com/nextcloud/talk/repositories/SharedMediaItems.kt +++ b/app/src/main/java/com/nextcloud/talk/shareditems/model/SharedMediaItems.kt @@ -1,4 +1,4 @@ -package com.nextcloud.talk.repositories +package com.nextcloud.talk.shareditems.model class SharedMediaItems( val items: List, diff --git a/app/src/main/java/com/nextcloud/talk/repositories/SharedItemsRepository.kt b/app/src/main/java/com/nextcloud/talk/shareditems/repositories/SharedItemsRepository.kt similarity index 95% rename from app/src/main/java/com/nextcloud/talk/repositories/SharedItemsRepository.kt rename to app/src/main/java/com/nextcloud/talk/shareditems/repositories/SharedItemsRepository.kt index be6460dd7..0aecfe12f 100644 --- a/app/src/main/java/com/nextcloud/talk/repositories/SharedItemsRepository.kt +++ b/app/src/main/java/com/nextcloud/talk/shareditems/repositories/SharedItemsRepository.kt @@ -1,4 +1,4 @@ -package com.nextcloud.talk.repositories +package com.nextcloud.talk.shareditems.repositories import android.util.Log import com.nextcloud.talk.R @@ -6,6 +6,9 @@ import com.nextcloud.talk.api.NcApi import com.nextcloud.talk.application.NextcloudTalkApplication.Companion.sharedApplication import com.nextcloud.talk.models.database.UserEntity import com.nextcloud.talk.models.json.chat.ChatShareOverall +import com.nextcloud.talk.shareditems.model.SharedItem +import com.nextcloud.talk.shareditems.model.SharedItemType +import com.nextcloud.talk.shareditems.model.SharedMediaItems import com.nextcloud.talk.utils.ApiUtils import io.reactivex.Observable import retrofit2.Response diff --git a/app/src/main/java/com/nextcloud/talk/viewmodels/SharedItemsViewModel.kt b/app/src/main/java/com/nextcloud/talk/shareditems/viewmodels/SharedItemsViewModel.kt similarity index 94% rename from app/src/main/java/com/nextcloud/talk/viewmodels/SharedItemsViewModel.kt rename to app/src/main/java/com/nextcloud/talk/shareditems/viewmodels/SharedItemsViewModel.kt index 134cd7f23..23bf6028e 100644 --- a/app/src/main/java/com/nextcloud/talk/viewmodels/SharedItemsViewModel.kt +++ b/app/src/main/java/com/nextcloud/talk/shareditems/viewmodels/SharedItemsViewModel.kt @@ -1,13 +1,13 @@ -package com.nextcloud.talk.viewmodels +package com.nextcloud.talk.shareditems.viewmodels import android.util.Log import androidx.lifecycle.LiveData import androidx.lifecycle.MutableLiveData import androidx.lifecycle.ViewModel import com.nextcloud.talk.models.database.UserEntity -import com.nextcloud.talk.repositories.SharedItemType -import com.nextcloud.talk.repositories.SharedItemsRepository -import com.nextcloud.talk.repositories.SharedMediaItems +import com.nextcloud.talk.shareditems.model.SharedItemType +import com.nextcloud.talk.shareditems.repositories.SharedItemsRepository +import com.nextcloud.talk.shareditems.model.SharedMediaItems import io.reactivex.Observer import io.reactivex.android.schedulers.AndroidSchedulers import io.reactivex.disposables.Disposable diff --git a/app/src/main/res/layout/activity_shared_items.xml b/app/src/main/res/layout/activity_shared_items.xml index 5b2b2f6b5..dc65d9f27 100644 --- a/app/src/main/res/layout/activity_shared_items.xml +++ b/app/src/main/res/layout/activity_shared_items.xml @@ -25,7 +25,7 @@ android:layout_width="match_parent" android:layout_height="match_parent" android:background="@color/bg_default" - tools:context=".activities.SharedItemsActivity"> + tools:context=".shareditems.activities.SharedItemsActivity"> Date: Thu, 19 May 2022 12:21:00 +0200 Subject: [PATCH 07/16] Merge 'SharedItemsListAdapter' and 'SharedItemsGridAdapter' MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Tim Krüger --- .../activities/SharedItemsActivity.kt | 31 ++--- .../adapters/SharedItemsAdapter.kt | 50 ++++++++ .../adapters/SharedItemsGridAdapter.kt | 105 ---------------- .../adapters/SharedItemsGridViewHolder.kt | 20 +++ .../adapters/SharedItemsListAdapter.kt | 119 ------------------ .../adapters/SharedItemsListViewHolder.kt | 43 +++++++ .../adapters/SharedItemsViewHolder.kt | 100 +++++++++++++++ .../shareditems/model/SharedMediaItems.kt | 3 +- .../viewmodels/SharedItemsViewModel.kt | 3 +- 9 files changed, 227 insertions(+), 247 deletions(-) create mode 100644 app/src/main/java/com/nextcloud/talk/shareditems/adapters/SharedItemsAdapter.kt delete mode 100644 app/src/main/java/com/nextcloud/talk/shareditems/adapters/SharedItemsGridAdapter.kt create mode 100644 app/src/main/java/com/nextcloud/talk/shareditems/adapters/SharedItemsGridViewHolder.kt delete mode 100644 app/src/main/java/com/nextcloud/talk/shareditems/adapters/SharedItemsListAdapter.kt create mode 100644 app/src/main/java/com/nextcloud/talk/shareditems/adapters/SharedItemsListViewHolder.kt create mode 100644 app/src/main/java/com/nextcloud/talk/shareditems/adapters/SharedItemsViewHolder.kt diff --git a/app/src/main/java/com/nextcloud/talk/shareditems/activities/SharedItemsActivity.kt b/app/src/main/java/com/nextcloud/talk/shareditems/activities/SharedItemsActivity.kt index 2582c7729..b8cd07968 100644 --- a/app/src/main/java/com/nextcloud/talk/shareditems/activities/SharedItemsActivity.kt +++ b/app/src/main/java/com/nextcloud/talk/shareditems/activities/SharedItemsActivity.kt @@ -12,17 +12,16 @@ import androidx.recyclerview.widget.RecyclerView import autodagger.AutoInjector import com.google.android.material.tabs.TabLayout import com.nextcloud.talk.R -import com.nextcloud.talk.shareditems.adapters.SharedItemsGridAdapter -import com.nextcloud.talk.shareditems.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.shareditems.adapters.SharedItemsAdapter import com.nextcloud.talk.shareditems.model.SharedItemType +import com.nextcloud.talk.shareditems.viewmodels.SharedItemsViewModel import com.nextcloud.talk.utils.DisplayUtils 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.shareditems.viewmodels.SharedItemsViewModel import javax.inject.Inject @AutoInjector(NextcloudTalkApplication::class) @@ -70,24 +69,18 @@ class SharedItemsActivity : AppCompatActivity() { viewModel.sharedItems.observe(this) { Log.d(TAG, "Items received: $it") - if (viewModel.currentItemType == SharedItemType.MEDIA) { - val adapter = SharedItemsGridAdapter() - adapter.items = it.items - adapter.authHeader = it.authHeader - binding.imageRecycler.adapter = adapter - - val layoutManager = GridLayoutManager(this, SPAN_COUNT) - binding.imageRecycler.layoutManager = layoutManager + val showGrid = viewModel.currentItemType == SharedItemType.MEDIA + val layoutManager = if (showGrid) { + GridLayoutManager(this, SPAN_COUNT) } else { - val adapter = SharedItemsListAdapter() - adapter.items = it.items - adapter.authHeader = it.authHeader - binding.imageRecycler.adapter = adapter - - val layoutManager = LinearLayoutManager(this) - layoutManager.orientation = LinearLayoutManager.VERTICAL - binding.imageRecycler.layoutManager = layoutManager + LinearLayoutManager(this, LinearLayoutManager.VERTICAL, false) } + + val adapter = SharedItemsAdapter(showGrid, userEntity.username, userEntity.token).apply { + items = it.items + } + binding.imageRecycler.adapter = adapter + binding.imageRecycler.layoutManager = layoutManager } binding.imageRecycler.addOnScrollListener(object : RecyclerView.OnScrollListener() { diff --git a/app/src/main/java/com/nextcloud/talk/shareditems/adapters/SharedItemsAdapter.kt b/app/src/main/java/com/nextcloud/talk/shareditems/adapters/SharedItemsAdapter.kt new file mode 100644 index 000000000..d3516ebdb --- /dev/null +++ b/app/src/main/java/com/nextcloud/talk/shareditems/adapters/SharedItemsAdapter.kt @@ -0,0 +1,50 @@ +package com.nextcloud.talk.shareditems.adapters + +import android.view.LayoutInflater +import android.view.ViewGroup +import androidx.recyclerview.widget.RecyclerView +import com.nextcloud.talk.databinding.SharedItemGridBinding +import com.nextcloud.talk.databinding.SharedItemListBinding +import com.nextcloud.talk.shareditems.model.SharedItem + +class SharedItemsAdapter( + private val showGrid: Boolean, + private val userName: String, + private val userToken: String +) : RecyclerView.Adapter() { + + var items: List = emptyList() + + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): SharedItemsViewHolder { + + return if (showGrid) { + SharedItemsGridViewHolder( + SharedItemGridBinding.inflate( + LayoutInflater.from(parent.context), + parent, + false + ), + userName, + userToken + ) + } else { + SharedItemsListViewHolder( + SharedItemListBinding.inflate( + LayoutInflater.from(parent.context), + parent, + false + ), + userName, + userToken + ) + } + } + + override fun onBindViewHolder(holder: SharedItemsViewHolder, position: Int) { + holder.onBind(items[position]) + } + + override fun getItemCount(): Int { + return items.size + } +} diff --git a/app/src/main/java/com/nextcloud/talk/shareditems/adapters/SharedItemsGridAdapter.kt b/app/src/main/java/com/nextcloud/talk/shareditems/adapters/SharedItemsGridAdapter.kt deleted file mode 100644 index 29134f172..000000000 --- a/app/src/main/java/com/nextcloud/talk/shareditems/adapters/SharedItemsGridAdapter.kt +++ /dev/null @@ -1,105 +0,0 @@ -package com.nextcloud.talk.shareditems.adapters - -import android.net.Uri -import android.util.Log -import android.view.LayoutInflater -import android.view.View -import android.view.ViewGroup -import androidx.core.content.ContextCompat -import androidx.recyclerview.widget.RecyclerView -import com.facebook.drawee.backends.pipeline.Fresco -import com.facebook.drawee.controller.BaseControllerListener -import com.facebook.drawee.controller.ControllerListener -import com.facebook.drawee.interfaces.DraweeController -import com.facebook.drawee.view.SimpleDraweeView -import com.facebook.imagepipeline.common.RotationOptions -import com.facebook.imagepipeline.image.ImageInfo -import com.facebook.imagepipeline.request.ImageRequestBuilder -import com.nextcloud.talk.databinding.SharedItemGridBinding -import com.nextcloud.talk.shareditems.model.SharedItem -import com.nextcloud.talk.utils.DrawableUtils -import com.nextcloud.talk.utils.FileViewerUtils - -class SharedItemsGridAdapter : RecyclerView.Adapter() { - - companion object { - private val TAG = SharedItemsGridAdapter::class.simpleName - } - - class ViewHolder(val binding: SharedItemGridBinding, itemView: View) : RecyclerView.ViewHolder(itemView) - - var authHeader: Map = emptyMap() - var items: List = emptyList() - - override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder { - val binding = SharedItemGridBinding.inflate(LayoutInflater.from(parent.context), parent, false) - return ViewHolder(binding, binding.root) - } - - override fun onBindViewHolder(holder: ViewHolder, position: Int) { - - val currentItem = items[position] - - if (currentItem.previewAvailable == true) { - val imageRequest = ImageRequestBuilder.newBuilderWithSource(Uri.parse(currentItem.previewLink)) - .setProgressiveRenderingEnabled(true) - .setRotationOptions(RotationOptions.autoRotate()) - .disableDiskCache() - .setHeaders(authHeader) - .build() - - val listener: ControllerListener = object : BaseControllerListener() { - override fun onFailure(id: String, e: Throwable) { - Log.w(TAG, "Failed to load image. A static mimetype image will be used", e) - setStaticMimetypeImage(currentItem, holder) - } - } - - val draweeController: DraweeController = Fresco.newDraweeControllerBuilder() - .setOldController(holder.binding.image.controller) - .setAutoPlayAnimations(true) - .setImageRequest(imageRequest) - .setControllerListener(listener) - .build() - holder.binding.image.controller = draweeController - } else { - setStaticMimetypeImage(currentItem, holder) - } - - val fileViewerUtils = FileViewerUtils(holder.binding.image.context, currentItem.userEntity) - - holder.binding.image.setOnClickListener { - fileViewerUtils.openFile( - FileViewerUtils.FileInfo(currentItem.id, currentItem.name, currentItem.fileSize), - currentItem.path, - currentItem.link, - currentItem.mimeType, - FileViewerUtils.ProgressUi( - holder.binding.progressBar, - null, - it as SimpleDraweeView - ) - ) - } - - fileViewerUtils.resumeToUpdateViewsByProgress( - currentItem.name, - currentItem.id, - currentItem.mimeType, - FileViewerUtils.ProgressUi(holder.binding.progressBar, null, holder.binding.image) - ) - } - - private fun setStaticMimetypeImage( - currentItem: SharedItem, - holder: ViewHolder - ) { - val drawableResourceId = DrawableUtils.getDrawableResourceIdForMimeType(currentItem.mimeType) - val drawable = ContextCompat.getDrawable(holder.binding.image.context, drawableResourceId) - holder.binding.image.hierarchy.setPlaceholderImage(drawable) - } - - override fun getItemCount(): Int { - return items.size - } -} diff --git a/app/src/main/java/com/nextcloud/talk/shareditems/adapters/SharedItemsGridViewHolder.kt b/app/src/main/java/com/nextcloud/talk/shareditems/adapters/SharedItemsGridViewHolder.kt new file mode 100644 index 000000000..a2792671a --- /dev/null +++ b/app/src/main/java/com/nextcloud/talk/shareditems/adapters/SharedItemsGridViewHolder.kt @@ -0,0 +1,20 @@ +package com.nextcloud.talk.shareditems.adapters + +import android.view.View +import android.widget.ProgressBar +import com.facebook.drawee.view.SimpleDraweeView +import com.nextcloud.talk.databinding.SharedItemGridBinding + +class SharedItemsGridViewHolder( + override val binding: SharedItemGridBinding, + userName: String, + userToken: String +) : SharedItemsViewHolder(binding, userName, userToken) { + + override val image: SimpleDraweeView + get() = binding.image + override val clickTarget: View + get() = binding.image + override val progressBar: ProgressBar + get() = binding.progressBar +} diff --git a/app/src/main/java/com/nextcloud/talk/shareditems/adapters/SharedItemsListAdapter.kt b/app/src/main/java/com/nextcloud/talk/shareditems/adapters/SharedItemsListAdapter.kt deleted file mode 100644 index 7b5bbd6e7..000000000 --- a/app/src/main/java/com/nextcloud/talk/shareditems/adapters/SharedItemsListAdapter.kt +++ /dev/null @@ -1,119 +0,0 @@ -package com.nextcloud.talk.shareditems.adapters - -import android.net.Uri -import android.text.format.Formatter -import android.util.Log -import android.view.LayoutInflater -import android.view.View -import android.view.ViewGroup -import androidx.core.content.ContextCompat -import androidx.recyclerview.widget.RecyclerView -import com.facebook.drawee.backends.pipeline.Fresco -import com.facebook.drawee.controller.BaseControllerListener -import com.facebook.drawee.controller.ControllerListener -import com.facebook.drawee.interfaces.DraweeController -import com.facebook.imagepipeline.common.RotationOptions -import com.facebook.imagepipeline.image.ImageInfo -import com.facebook.imagepipeline.request.ImageRequestBuilder -import com.nextcloud.talk.databinding.SharedItemListBinding -import com.nextcloud.talk.shareditems.model.SharedItem -import com.nextcloud.talk.utils.DateUtils -import com.nextcloud.talk.utils.DrawableUtils -import com.nextcloud.talk.utils.FileViewerUtils -import com.nextcloud.talk.utils.FileViewerUtils.ProgressUi - -class SharedItemsListAdapter : RecyclerView.Adapter() { - - companion object { - private val TAG = SharedItemsListAdapter::class.simpleName - private const val ONE_SECOND_IN_MILLIS = 1000 - } - - class ViewHolder(val binding: SharedItemListBinding, itemView: View) : RecyclerView.ViewHolder(itemView) - - var authHeader: Map = emptyMap() - var items: List = emptyList() - - override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder { - val binding = SharedItemListBinding.inflate(LayoutInflater.from(parent.context), parent, false) - return ViewHolder(binding, binding.root) - } - - override fun onBindViewHolder(holder: ViewHolder, position: Int) { - - val currentItem = items[position] - - holder.binding.fileName.text = currentItem.name - holder.binding.fileSize.text = currentItem.fileSize?.let { - Formatter.formatShortFileSize( - holder.binding.fileSize.context, - it - ) - } - holder.binding.fileDate.text = DateUtils.getLocalDateTimeStringFromTimestamp( - currentItem.date * ONE_SECOND_IN_MILLIS - ) - - if (currentItem.previewAvailable == true) { - val imageRequest = ImageRequestBuilder.newBuilderWithSource(Uri.parse(currentItem.previewLink)) - .setProgressiveRenderingEnabled(true) - .setRotationOptions(RotationOptions.autoRotate()) - .disableDiskCache() - .setHeaders(authHeader) - .build() - - val listener: ControllerListener = object : BaseControllerListener() { - override fun onFailure(id: String, e: Throwable) { - Log.w(TAG, "Failed to load image. A static mimetype image will be used", e) - setStaticMimetypeImage(currentItem, holder) - } - } - - val draweeController: DraweeController = Fresco.newDraweeControllerBuilder() - .setOldController(holder.binding.fileImage.controller) - .setAutoPlayAnimations(true) - .setImageRequest(imageRequest) - .setControllerListener(listener) - .build() - holder.binding.fileImage.controller = draweeController - } else { - setStaticMimetypeImage(currentItem, holder) - } - - val fileViewerUtils = FileViewerUtils(holder.binding.fileImage.context, currentItem.userEntity) - - holder.binding.fileItem.setOnClickListener { - fileViewerUtils.openFile( - FileViewerUtils.FileInfo(currentItem.id, currentItem.name, currentItem.fileSize), - currentItem.path, - currentItem.link, - currentItem.mimeType, - ProgressUi( - holder.binding.progressBar, - null, - holder.binding.fileImage - ) - ) - } - - fileViewerUtils.resumeToUpdateViewsByProgress( - currentItem.name, - currentItem.id, - currentItem.mimeType, - ProgressUi(holder.binding.progressBar, null, holder.binding.fileImage) - ) - } - - private fun setStaticMimetypeImage( - currentItem: SharedItem, - holder: ViewHolder - ) { - val drawableResourceId = DrawableUtils.getDrawableResourceIdForMimeType(currentItem.mimeType) - val drawable = ContextCompat.getDrawable(holder.binding.fileImage.context, drawableResourceId) - holder.binding.fileImage.hierarchy.setPlaceholderImage(drawable) - } - - override fun getItemCount(): Int { - return items.size - } -} diff --git a/app/src/main/java/com/nextcloud/talk/shareditems/adapters/SharedItemsListViewHolder.kt b/app/src/main/java/com/nextcloud/talk/shareditems/adapters/SharedItemsListViewHolder.kt new file mode 100644 index 000000000..e7b2fbbf2 --- /dev/null +++ b/app/src/main/java/com/nextcloud/talk/shareditems/adapters/SharedItemsListViewHolder.kt @@ -0,0 +1,43 @@ +package com.nextcloud.talk.shareditems.adapters + +import android.text.format.Formatter +import android.view.View +import android.widget.ProgressBar +import com.facebook.drawee.view.SimpleDraweeView +import com.nextcloud.talk.databinding.SharedItemListBinding +import com.nextcloud.talk.shareditems.model.SharedItem +import com.nextcloud.talk.utils.DateUtils + +class SharedItemsListViewHolder( + override val binding: SharedItemListBinding, + userName: String, + userToken: String +) : SharedItemsViewHolder(binding, userName, userToken) { + + override val image: SimpleDraweeView + get() = binding.fileImage + override val clickTarget: View + get() = binding.fileItem + override val progressBar: ProgressBar + get() = binding.progressBar + + override fun onBind(item: SharedItem) { + + super.onBind(item) + + binding.fileName.text = item.name + binding.fileSize.text = item.fileSize?.let { + Formatter.formatShortFileSize( + binding.fileSize.context, + it + ) + } + binding.fileDate.text = DateUtils.getLocalDateTimeStringFromTimestamp( + item.date * ONE_SECOND_IN_MILLIS + ) + } + + companion object { + private const val ONE_SECOND_IN_MILLIS = 1000 + } +} diff --git a/app/src/main/java/com/nextcloud/talk/shareditems/adapters/SharedItemsViewHolder.kt b/app/src/main/java/com/nextcloud/talk/shareditems/adapters/SharedItemsViewHolder.kt new file mode 100644 index 000000000..159345ab0 --- /dev/null +++ b/app/src/main/java/com/nextcloud/talk/shareditems/adapters/SharedItemsViewHolder.kt @@ -0,0 +1,100 @@ +package com.nextcloud.talk.shareditems.adapters + +import android.graphics.drawable.Drawable +import android.net.Uri +import android.util.Log +import android.view.View +import android.widget.ProgressBar +import androidx.core.content.ContextCompat +import androidx.recyclerview.widget.RecyclerView +import androidx.viewbinding.ViewBinding +import com.facebook.drawee.backends.pipeline.Fresco +import com.facebook.drawee.controller.BaseControllerListener +import com.facebook.drawee.controller.ControllerListener +import com.facebook.drawee.interfaces.DraweeController +import com.facebook.drawee.view.SimpleDraweeView +import com.facebook.imagepipeline.common.RotationOptions +import com.facebook.imagepipeline.image.ImageInfo +import com.facebook.imagepipeline.request.ImageRequestBuilder +import com.nextcloud.talk.shareditems.model.SharedItem +import com.nextcloud.talk.utils.ApiUtils +import com.nextcloud.talk.utils.DrawableUtils +import com.nextcloud.talk.utils.FileViewerUtils + +abstract class SharedItemsViewHolder( + open val binding: ViewBinding, + userName: String, + userToken: String +) : RecyclerView.ViewHolder(binding.root) { + + companion object { + private val TAG = SharedItemsViewHolder::class.simpleName + } + + abstract val image: SimpleDraweeView + abstract val clickTarget: View + abstract val progressBar: ProgressBar + + private val authHeader = mapOf(Pair("Authorization", ApiUtils.getCredentials(userName, userToken))) + + open fun onBind(item: SharedItem) { + image.hierarchy.setPlaceholderImage(staticImage(item.mimeType, image)) + if (item.previewAvailable == true) { + image.controller = configurePreview(item) + } + + val fileViewerUtils = FileViewerUtils(image.context, item.userEntity) + + clickTarget.setOnClickListener { + fileViewerUtils.openFile( + FileViewerUtils.FileInfo(item.id, item.name, item.fileSize), + item.path, + item.link, + item.mimeType, + FileViewerUtils.ProgressUi( + progressBar, + null, + image + ) + ) + } + + fileViewerUtils.resumeToUpdateViewsByProgress( + item.name, + item.id, + item.mimeType, + FileViewerUtils.ProgressUi(progressBar, null, image) + ) + } + + private fun configurePreview(item: SharedItem): DraweeController { + + val imageRequest = ImageRequestBuilder.newBuilderWithSource(Uri.parse(item.previewLink)) + .setProgressiveRenderingEnabled(true) + .setRotationOptions(RotationOptions.autoRotate()) + .disableDiskCache() + .setHeaders(authHeader) + .build() + + val listener: ControllerListener = object : BaseControllerListener() { + override fun onFailure(id: String, e: Throwable) { + Log.w(TAG, "Failed to load image. A static mimetype image will be used", e) + } + } + + return Fresco.newDraweeControllerBuilder() + .setOldController(image.controller) + .setAutoPlayAnimations(true) + .setImageRequest(imageRequest) + .setControllerListener(listener) + .build() + } + + private fun staticImage( + mimeType: String?, + image: SimpleDraweeView + ): Drawable { + val drawableResourceId = DrawableUtils.getDrawableResourceIdForMimeType(mimeType) + return ContextCompat.getDrawable(image.context, drawableResourceId)!! + } +} diff --git a/app/src/main/java/com/nextcloud/talk/shareditems/model/SharedMediaItems.kt b/app/src/main/java/com/nextcloud/talk/shareditems/model/SharedMediaItems.kt index 7d4fd1ed3..ea70050ba 100644 --- a/app/src/main/java/com/nextcloud/talk/shareditems/model/SharedMediaItems.kt +++ b/app/src/main/java/com/nextcloud/talk/shareditems/model/SharedMediaItems.kt @@ -3,6 +3,5 @@ package com.nextcloud.talk.shareditems.model class SharedMediaItems( val items: List, var lastSeenId: Int?, - var moreItemsExisting: Boolean, - val authHeader: Map + var moreItemsExisting: Boolean ) diff --git a/app/src/main/java/com/nextcloud/talk/shareditems/viewmodels/SharedItemsViewModel.kt b/app/src/main/java/com/nextcloud/talk/shareditems/viewmodels/SharedItemsViewModel.kt index 23bf6028e..9c7f04cd5 100644 --- a/app/src/main/java/com/nextcloud/talk/shareditems/viewmodels/SharedItemsViewModel.kt +++ b/app/src/main/java/com/nextcloud/talk/shareditems/viewmodels/SharedItemsViewModel.kt @@ -88,8 +88,7 @@ class SharedItemsViewModel @Inject constructor( SharedMediaItems( oldItems + newSharedItems!!.items, newSharedItems!!.lastSeenId, - newSharedItems!!.moreItemsExisting, - newSharedItems!!.authHeader + newSharedItems!!.moreItemsExisting ) } } From 6b9ab738cb5ad3e5494a12dd56fd03c94108baab Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tim=20Kr=C3=BCger?= Date: Thu, 19 May 2022 16:26:47 +0200 Subject: [PATCH 08/16] Introduce interface for 'SharedItemsRepository' MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Tim Krüger --- .../talk/dagger/modules/RepositoryModule.kt | 3 +- .../repositories/SharedItemsRepository.kt | 123 ++--------------- .../repositories/SharedItemsRepositoryImpl.kt | 127 ++++++++++++++++++ 3 files changed, 137 insertions(+), 116 deletions(-) create mode 100644 app/src/main/java/com/nextcloud/talk/shareditems/repositories/SharedItemsRepositoryImpl.kt 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 index b070689b8..50da11477 100644 --- a/app/src/main/java/com/nextcloud/talk/dagger/modules/RepositoryModule.kt +++ b/app/src/main/java/com/nextcloud/talk/dagger/modules/RepositoryModule.kt @@ -23,6 +23,7 @@ package com.nextcloud.talk.dagger.modules import com.nextcloud.talk.api.NcApi import com.nextcloud.talk.shareditems.repositories.SharedItemsRepository +import com.nextcloud.talk.shareditems.repositories.SharedItemsRepositoryImpl import dagger.Module import dagger.Provides @@ -30,6 +31,6 @@ import dagger.Provides class RepositoryModule { @Provides fun provideSharedItemsRepository(ncApi: NcApi): SharedItemsRepository { - return SharedItemsRepository(ncApi) + return SharedItemsRepositoryImpl(ncApi) } } diff --git a/app/src/main/java/com/nextcloud/talk/shareditems/repositories/SharedItemsRepository.kt b/app/src/main/java/com/nextcloud/talk/shareditems/repositories/SharedItemsRepository.kt index 0aecfe12f..388c68634 100644 --- a/app/src/main/java/com/nextcloud/talk/shareditems/repositories/SharedItemsRepository.kt +++ b/app/src/main/java/com/nextcloud/talk/shareditems/repositories/SharedItemsRepository.kt @@ -1,123 +1,21 @@ package com.nextcloud.talk.shareditems.repositories -import android.util.Log -import com.nextcloud.talk.R -import com.nextcloud.talk.api.NcApi -import com.nextcloud.talk.application.NextcloudTalkApplication.Companion.sharedApplication import com.nextcloud.talk.models.database.UserEntity -import com.nextcloud.talk.models.json.chat.ChatShareOverall -import com.nextcloud.talk.shareditems.model.SharedItem import com.nextcloud.talk.shareditems.model.SharedItemType import com.nextcloud.talk.shareditems.model.SharedMediaItems -import com.nextcloud.talk.utils.ApiUtils import io.reactivex.Observable -import retrofit2.Response -import java.util.Locale -import javax.inject.Inject -class SharedItemsRepository @Inject constructor(private val ncApi: NcApi) { +interface SharedItemsRepository { - fun media(parameters: Parameters, type: SharedItemType): Observable? { - return media(parameters, type, null) - } + fun media(parameters: Parameters, type: SharedItemType): Observable? - fun media(parameters: Parameters, type: SharedItemType, lastKnownMessageId: Int?): Observable? { - val credentials = ApiUtils.getCredentials(parameters.userName, parameters.userToken) + fun media( + parameters: Parameters, + type: SharedItemType, + lastKnownMessageId: Int? + ): Observable? - return ncApi.getSharedItems( - credentials, - ApiUtils.getUrlForChatSharedItems(1, parameters.baseUrl, parameters.roomToken), - type.toString().lowercase(Locale.ROOT), - lastKnownMessageId, - BATCH_SIZE - ).map { map(it, parameters) } - } - - private fun map( - response: Response, - parameters: Parameters - ): SharedMediaItems { - - var chatLastGiven: Int? = null - val items = mutableMapOf() - - if (response.headers()["x-chat-last-given"] != null) { - chatLastGiven = response.headers()["x-chat-last-given"]!!.toInt() - } - - val mediaItems = response.body()!!.ocs!!.data - if (mediaItems != null) { - for (it in mediaItems) { - if (it.value.messageParameters?.containsKey("file") == true) { - val fileParameters = it.value.messageParameters!!["file"]!! - - val previewAvailable = - "yes".equals(fileParameters["preview-available"]!!, ignoreCase = true) - - items[it.value.id] = SharedItem( - fileParameters["id"]!!, - fileParameters["name"]!!, - fileParameters["size"]!!.toLong(), - it.value.timestamp, - fileParameters["path"]!!, - fileParameters["link"]!!, - fileParameters["mimetype"]!!, - previewAvailable, - previewLink(fileParameters["id"], parameters.baseUrl), - parameters.userEntity - ) - } else { - Log.w(TAG, "location and deckcard are not yet supported") - } - } - } - - val sortedMutableItems = items.toSortedMap().values.toList().reversed().toMutableList() - val moreItemsExisting = items.count() == BATCH_SIZE - - return SharedMediaItems( - sortedMutableItems, - chatLastGiven, - moreItemsExisting, - authHeader(parameters.userName, parameters.userToken) - ) - } - - fun availableTypes(parameters: Parameters): Observable> { - val credentials = ApiUtils.getCredentials(parameters.userName, parameters.userToken) - - return ncApi.getSharedItemsOverview( - credentials, - ApiUtils.getUrlForChatSharedItemsOverview(1, parameters.baseUrl, parameters.roomToken), - 1 - ).map { - val types = mutableSetOf() - val typeMap = it.body()!!.ocs!!.data!! - for (t in typeMap) { - if (t.value.isNotEmpty()) { - try { - types += SharedItemType.typeFor(t.key) - } catch (e: IllegalArgumentException) { - Log.w(TAG, "Server responds an unknown shared item type: ${t.key}") - } - } - } - - types.toSet() - } - } - - private fun authHeader(userName: String, userToken: String): Map { - return mapOf(Pair("Authorization", ApiUtils.getCredentials(userName, userToken))) - } - - private fun previewLink(fileId: String?, baseUrl: String): String { - return ApiUtils.getUrlForFilePreviewWithFileId( - baseUrl, - fileId, - sharedApplication!!.resources.getDimensionPixelSize(R.dimen.maximum_file_preview_size) - ) - } + fun availableTypes(parameters: Parameters): Observable> data class Parameters( val userName: String, @@ -126,9 +24,4 @@ class SharedItemsRepository @Inject constructor(private val ncApi: NcApi) { val userEntity: UserEntity, val roomToken: String ) - - companion object { - const val BATCH_SIZE: Int = 28 - private val TAG = SharedItemsRepository::class.simpleName - } } diff --git a/app/src/main/java/com/nextcloud/talk/shareditems/repositories/SharedItemsRepositoryImpl.kt b/app/src/main/java/com/nextcloud/talk/shareditems/repositories/SharedItemsRepositoryImpl.kt new file mode 100644 index 000000000..81f8c8134 --- /dev/null +++ b/app/src/main/java/com/nextcloud/talk/shareditems/repositories/SharedItemsRepositoryImpl.kt @@ -0,0 +1,127 @@ +package com.nextcloud.talk.shareditems.repositories + +import android.util.Log +import com.nextcloud.talk.R +import com.nextcloud.talk.api.NcApi +import com.nextcloud.talk.application.NextcloudTalkApplication.Companion.sharedApplication +import com.nextcloud.talk.models.json.chat.ChatShareOverall +import com.nextcloud.talk.shareditems.model.SharedItem +import com.nextcloud.talk.shareditems.model.SharedItemType +import com.nextcloud.talk.shareditems.model.SharedMediaItems +import com.nextcloud.talk.utils.ApiUtils +import io.reactivex.Observable +import retrofit2.Response +import java.util.Locale +import javax.inject.Inject + +class SharedItemsRepositoryImpl @Inject constructor(private val ncApi: NcApi) : SharedItemsRepository { + + override fun media( + parameters: SharedItemsRepository.Parameters, + type: SharedItemType + ): Observable? { + return media(parameters, type, null) + } + + override fun media( + parameters: SharedItemsRepository.Parameters, + type: SharedItemType, + lastKnownMessageId: Int? + ): Observable? { + val credentials = ApiUtils.getCredentials(parameters.userName, parameters.userToken) + + return ncApi.getSharedItems( + credentials, + ApiUtils.getUrlForChatSharedItems(1, parameters.baseUrl, parameters.roomToken), + type.toString().lowercase(Locale.ROOT), + lastKnownMessageId, + BATCH_SIZE + ).map { map(it, parameters) } + } + + private fun map( + response: Response, + parameters: SharedItemsRepository.Parameters + ): SharedMediaItems { + + var chatLastGiven: Int? = null + val items = mutableMapOf() + + if (response.headers()["x-chat-last-given"] != null) { + chatLastGiven = response.headers()["x-chat-last-given"]!!.toInt() + } + + val mediaItems = response.body()!!.ocs!!.data + if (mediaItems != null) { + for (it in mediaItems) { + if (it.value.messageParameters?.containsKey("file") == true) { + val fileParameters = it.value.messageParameters!!["file"]!! + + val previewAvailable = + "yes".equals(fileParameters["preview-available"]!!, ignoreCase = true) + + items[it.value.id] = SharedItem( + fileParameters["id"]!!, + fileParameters["name"]!!, + fileParameters["size"]!!.toLong(), + it.value.timestamp, + fileParameters["path"]!!, + fileParameters["link"]!!, + fileParameters["mimetype"]!!, + previewAvailable, + previewLink(fileParameters["id"], parameters.baseUrl), + parameters.userEntity + ) + } else { + Log.w(TAG, "location and deckcard are not yet supported") + } + } + } + + val sortedMutableItems = items.toSortedMap().values.toList().reversed().toMutableList() + val moreItemsExisting = items.count() == BATCH_SIZE + + return SharedMediaItems( + sortedMutableItems, + chatLastGiven, + moreItemsExisting + ) + } + + override fun availableTypes(parameters: SharedItemsRepository.Parameters): Observable> { + val credentials = ApiUtils.getCredentials(parameters.userName, parameters.userToken) + + return ncApi.getSharedItemsOverview( + credentials, + ApiUtils.getUrlForChatSharedItemsOverview(1, parameters.baseUrl, parameters.roomToken), + 1 + ).map { + val types = mutableSetOf() + val typeMap = it.body()!!.ocs!!.data!! + for (t in typeMap) { + if (t.value.isNotEmpty()) { + try { + types += SharedItemType.typeFor(t.key) + } catch (e: IllegalArgumentException) { + Log.w(TAG, "Server responds an unknown shared item type: ${t.key}") + } + } + } + + types.toSet() + } + } + + private fun previewLink(fileId: String?, baseUrl: String): String { + return ApiUtils.getUrlForFilePreviewWithFileId( + baseUrl, + fileId, + sharedApplication!!.resources.getDimensionPixelSize(R.dimen.maximum_file_preview_size) + ) + } + + companion object { + const val BATCH_SIZE: Int = 28 + private val TAG = SharedItemsRepositoryImpl::class.simpleName + } +} From 0d65824fa6520f03d52b3d17cc72bc73c59a8e5c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tim=20Kr=C3=BCger?= Date: Thu, 19 May 2022 17:11:47 +0200 Subject: [PATCH 09/16] Remove 'UserEntity' from 'SharedItem' model MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Tim Krüger --- .../shareditems/activities/SharedItemsActivity.kt | 2 +- .../talk/shareditems/adapters/SharedItemsAdapter.kt | 10 ++++------ .../adapters/SharedItemsGridViewHolder.kt | 6 +++--- .../adapters/SharedItemsListViewHolder.kt | 6 +++--- .../shareditems/adapters/SharedItemsViewHolder.kt | 13 +++++++++---- .../nextcloud/talk/shareditems/model/SharedItem.kt | 5 +---- .../repositories/SharedItemsRepository.kt | 2 -- .../repositories/SharedItemsRepositoryImpl.kt | 3 +-- .../shareditems/viewmodels/SharedItemsViewModel.kt | 3 +-- 9 files changed, 23 insertions(+), 27 deletions(-) diff --git a/app/src/main/java/com/nextcloud/talk/shareditems/activities/SharedItemsActivity.kt b/app/src/main/java/com/nextcloud/talk/shareditems/activities/SharedItemsActivity.kt index b8cd07968..1c7544453 100644 --- a/app/src/main/java/com/nextcloud/talk/shareditems/activities/SharedItemsActivity.kt +++ b/app/src/main/java/com/nextcloud/talk/shareditems/activities/SharedItemsActivity.kt @@ -76,7 +76,7 @@ class SharedItemsActivity : AppCompatActivity() { LinearLayoutManager(this, LinearLayoutManager.VERTICAL, false) } - val adapter = SharedItemsAdapter(showGrid, userEntity.username, userEntity.token).apply { + val adapter = SharedItemsAdapter(showGrid, userEntity).apply { items = it.items } binding.imageRecycler.adapter = adapter diff --git a/app/src/main/java/com/nextcloud/talk/shareditems/adapters/SharedItemsAdapter.kt b/app/src/main/java/com/nextcloud/talk/shareditems/adapters/SharedItemsAdapter.kt index d3516ebdb..1aef5b377 100644 --- a/app/src/main/java/com/nextcloud/talk/shareditems/adapters/SharedItemsAdapter.kt +++ b/app/src/main/java/com/nextcloud/talk/shareditems/adapters/SharedItemsAdapter.kt @@ -5,12 +5,12 @@ import android.view.ViewGroup import androidx.recyclerview.widget.RecyclerView import com.nextcloud.talk.databinding.SharedItemGridBinding import com.nextcloud.talk.databinding.SharedItemListBinding +import com.nextcloud.talk.models.database.UserEntity import com.nextcloud.talk.shareditems.model.SharedItem class SharedItemsAdapter( private val showGrid: Boolean, - private val userName: String, - private val userToken: String + private val userEntity: UserEntity ) : RecyclerView.Adapter() { var items: List = emptyList() @@ -24,8 +24,7 @@ class SharedItemsAdapter( parent, false ), - userName, - userToken + userEntity ) } else { SharedItemsListViewHolder( @@ -34,8 +33,7 @@ class SharedItemsAdapter( parent, false ), - userName, - userToken + userEntity ) } } diff --git a/app/src/main/java/com/nextcloud/talk/shareditems/adapters/SharedItemsGridViewHolder.kt b/app/src/main/java/com/nextcloud/talk/shareditems/adapters/SharedItemsGridViewHolder.kt index a2792671a..bff6d72d7 100644 --- a/app/src/main/java/com/nextcloud/talk/shareditems/adapters/SharedItemsGridViewHolder.kt +++ b/app/src/main/java/com/nextcloud/talk/shareditems/adapters/SharedItemsGridViewHolder.kt @@ -4,12 +4,12 @@ import android.view.View import android.widget.ProgressBar import com.facebook.drawee.view.SimpleDraweeView import com.nextcloud.talk.databinding.SharedItemGridBinding +import com.nextcloud.talk.models.database.UserEntity class SharedItemsGridViewHolder( override val binding: SharedItemGridBinding, - userName: String, - userToken: String -) : SharedItemsViewHolder(binding, userName, userToken) { + userEntity: UserEntity +) : SharedItemsViewHolder(binding, userEntity) { override val image: SimpleDraweeView get() = binding.image diff --git a/app/src/main/java/com/nextcloud/talk/shareditems/adapters/SharedItemsListViewHolder.kt b/app/src/main/java/com/nextcloud/talk/shareditems/adapters/SharedItemsListViewHolder.kt index e7b2fbbf2..568ad915b 100644 --- a/app/src/main/java/com/nextcloud/talk/shareditems/adapters/SharedItemsListViewHolder.kt +++ b/app/src/main/java/com/nextcloud/talk/shareditems/adapters/SharedItemsListViewHolder.kt @@ -5,14 +5,14 @@ import android.view.View import android.widget.ProgressBar import com.facebook.drawee.view.SimpleDraweeView import com.nextcloud.talk.databinding.SharedItemListBinding +import com.nextcloud.talk.models.database.UserEntity import com.nextcloud.talk.shareditems.model.SharedItem import com.nextcloud.talk.utils.DateUtils class SharedItemsListViewHolder( override val binding: SharedItemListBinding, - userName: String, - userToken: String -) : SharedItemsViewHolder(binding, userName, userToken) { + userEntity: UserEntity +) : SharedItemsViewHolder(binding, userEntity) { override val image: SimpleDraweeView get() = binding.fileImage diff --git a/app/src/main/java/com/nextcloud/talk/shareditems/adapters/SharedItemsViewHolder.kt b/app/src/main/java/com/nextcloud/talk/shareditems/adapters/SharedItemsViewHolder.kt index 159345ab0..a3d2a3dc3 100644 --- a/app/src/main/java/com/nextcloud/talk/shareditems/adapters/SharedItemsViewHolder.kt +++ b/app/src/main/java/com/nextcloud/talk/shareditems/adapters/SharedItemsViewHolder.kt @@ -16,6 +16,7 @@ import com.facebook.drawee.view.SimpleDraweeView import com.facebook.imagepipeline.common.RotationOptions import com.facebook.imagepipeline.image.ImageInfo import com.facebook.imagepipeline.request.ImageRequestBuilder +import com.nextcloud.talk.models.database.UserEntity import com.nextcloud.talk.shareditems.model.SharedItem import com.nextcloud.talk.utils.ApiUtils import com.nextcloud.talk.utils.DrawableUtils @@ -23,8 +24,7 @@ import com.nextcloud.talk.utils.FileViewerUtils abstract class SharedItemsViewHolder( open val binding: ViewBinding, - userName: String, - userToken: String + private val userEntity: UserEntity ) : RecyclerView.ViewHolder(binding.root) { companion object { @@ -35,7 +35,12 @@ abstract class SharedItemsViewHolder( abstract val clickTarget: View abstract val progressBar: ProgressBar - private val authHeader = mapOf(Pair("Authorization", ApiUtils.getCredentials(userName, userToken))) + private val authHeader = mapOf( + Pair( + "Authorization", + ApiUtils.getCredentials(userEntity.username, userEntity.token) + ) + ) open fun onBind(item: SharedItem) { image.hierarchy.setPlaceholderImage(staticImage(item.mimeType, image)) @@ -43,7 +48,7 @@ abstract class SharedItemsViewHolder( image.controller = configurePreview(item) } - val fileViewerUtils = FileViewerUtils(image.context, item.userEntity) + val fileViewerUtils = FileViewerUtils(image.context, userEntity) clickTarget.setOnClickListener { fileViewerUtils.openFile( diff --git a/app/src/main/java/com/nextcloud/talk/shareditems/model/SharedItem.kt b/app/src/main/java/com/nextcloud/talk/shareditems/model/SharedItem.kt index 1e684f7ed..7f2bc0300 100644 --- a/app/src/main/java/com/nextcloud/talk/shareditems/model/SharedItem.kt +++ b/app/src/main/java/com/nextcloud/talk/shareditems/model/SharedItem.kt @@ -1,7 +1,5 @@ package com.nextcloud.talk.shareditems.model -import com.nextcloud.talk.models.database.UserEntity - data class SharedItem( val id: String, val name: String, @@ -11,6 +9,5 @@ data class SharedItem( val link: String?, val mimeType: String?, val previewAvailable: Boolean?, - val previewLink: String, - val userEntity: UserEntity, + val previewLink: String ) diff --git a/app/src/main/java/com/nextcloud/talk/shareditems/repositories/SharedItemsRepository.kt b/app/src/main/java/com/nextcloud/talk/shareditems/repositories/SharedItemsRepository.kt index 388c68634..cbfc2046b 100644 --- a/app/src/main/java/com/nextcloud/talk/shareditems/repositories/SharedItemsRepository.kt +++ b/app/src/main/java/com/nextcloud/talk/shareditems/repositories/SharedItemsRepository.kt @@ -1,6 +1,5 @@ package com.nextcloud.talk.shareditems.repositories -import com.nextcloud.talk.models.database.UserEntity import com.nextcloud.talk.shareditems.model.SharedItemType import com.nextcloud.talk.shareditems.model.SharedMediaItems import io.reactivex.Observable @@ -21,7 +20,6 @@ interface SharedItemsRepository { val userName: String, val userToken: String, val baseUrl: String, - val userEntity: UserEntity, val roomToken: String ) } diff --git a/app/src/main/java/com/nextcloud/talk/shareditems/repositories/SharedItemsRepositoryImpl.kt b/app/src/main/java/com/nextcloud/talk/shareditems/repositories/SharedItemsRepositoryImpl.kt index 81f8c8134..0c063de31 100644 --- a/app/src/main/java/com/nextcloud/talk/shareditems/repositories/SharedItemsRepositoryImpl.kt +++ b/app/src/main/java/com/nextcloud/talk/shareditems/repositories/SharedItemsRepositoryImpl.kt @@ -69,8 +69,7 @@ class SharedItemsRepositoryImpl @Inject constructor(private val ncApi: NcApi) : fileParameters["link"]!!, fileParameters["mimetype"]!!, previewAvailable, - previewLink(fileParameters["id"], parameters.baseUrl), - parameters.userEntity + previewLink(fileParameters["id"], parameters.baseUrl) ) } else { Log.w(TAG, "location and deckcard are not yet supported") diff --git a/app/src/main/java/com/nextcloud/talk/shareditems/viewmodels/SharedItemsViewModel.kt b/app/src/main/java/com/nextcloud/talk/shareditems/viewmodels/SharedItemsViewModel.kt index 9c7f04cd5..6075b9b23 100644 --- a/app/src/main/java/com/nextcloud/talk/shareditems/viewmodels/SharedItemsViewModel.kt +++ b/app/src/main/java/com/nextcloud/talk/shareditems/viewmodels/SharedItemsViewModel.kt @@ -6,8 +6,8 @@ import androidx.lifecycle.MutableLiveData import androidx.lifecycle.ViewModel import com.nextcloud.talk.models.database.UserEntity import com.nextcloud.talk.shareditems.model.SharedItemType -import com.nextcloud.talk.shareditems.repositories.SharedItemsRepository import com.nextcloud.talk.shareditems.model.SharedMediaItems +import com.nextcloud.talk.shareditems.repositories.SharedItemsRepository import io.reactivex.Observer import io.reactivex.android.schedulers.AndroidSchedulers import io.reactivex.disposables.Disposable @@ -124,7 +124,6 @@ class SharedItemsViewModel @Inject constructor( userEntity.userId, userEntity.token, userEntity.baseUrl, - userEntity, roomToken ) _currentItemType = initialType From 52ec1b76faaff2c0edc45ce711c0cd91c04bdf3c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tim=20Kr=C3=BCger?= Date: Thu, 19 May 2022 17:20:26 +0200 Subject: [PATCH 10/16] Add comment for refactoring FileViewerUtils MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Tim Krüger --- .../talk/shareditems/adapters/SharedItemsViewHolder.kt | 6 ++++++ .../main/java/com/nextcloud/talk/utils/FileViewerUtils.kt | 6 ++++++ 2 files changed, 12 insertions(+) diff --git a/app/src/main/java/com/nextcloud/talk/shareditems/adapters/SharedItemsViewHolder.kt b/app/src/main/java/com/nextcloud/talk/shareditems/adapters/SharedItemsViewHolder.kt index a3d2a3dc3..d8c9dbf3a 100644 --- a/app/src/main/java/com/nextcloud/talk/shareditems/adapters/SharedItemsViewHolder.kt +++ b/app/src/main/java/com/nextcloud/talk/shareditems/adapters/SharedItemsViewHolder.kt @@ -48,6 +48,12 @@ abstract class SharedItemsViewHolder( image.controller = configurePreview(item) } + /* + The FileViewerUtils forces us to do things at this points which should be done separated in the activity and + the view model. + + This should be done after a refactoring of FileViewerUtils. + */ val fileViewerUtils = FileViewerUtils(image.context, userEntity) clickTarget.setOnClickListener { diff --git a/app/src/main/java/com/nextcloud/talk/utils/FileViewerUtils.kt b/app/src/main/java/com/nextcloud/talk/utils/FileViewerUtils.kt index f3eaf5b34..03c7fca0f 100644 --- a/app/src/main/java/com/nextcloud/talk/utils/FileViewerUtils.kt +++ b/app/src/main/java/com/nextcloud/talk/utils/FileViewerUtils.kt @@ -52,6 +52,12 @@ import com.nextcloud.talk.utils.bundle.BundleKeys.KEY_FILE_ID import java.io.File import java.util.concurrent.ExecutionException +/* +Usage of this class forces us to do things at one location which should be separated in a activity and view model. + +Example: + - SharedItemsViewHolder + */ class FileViewerUtils(private val context: Context, private val userEntity: UserEntity) { fun openFile( From e5b38856ebbd6f8b5b2c01274279cf9ce59eb816 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tim=20Kr=C3=BCger?= Date: Thu, 19 May 2022 17:31:04 +0200 Subject: [PATCH 11/16] Add missing license headers MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Tim Krüger --- .../activities/SharedItemsActivity.kt | 22 +++++++++++++++++++ .../adapters/SharedItemsAdapter.kt | 22 +++++++++++++++++++ .../adapters/SharedItemsGridViewHolder.kt | 22 +++++++++++++++++++ .../adapters/SharedItemsListViewHolder.kt | 22 +++++++++++++++++++ .../adapters/SharedItemsViewHolder.kt | 22 +++++++++++++++++++ .../talk/shareditems/model/SharedItem.kt | 22 +++++++++++++++++++ .../talk/shareditems/model/SharedItemType.kt | 22 +++++++++++++++++++ .../shareditems/model/SharedMediaItems.kt | 22 +++++++++++++++++++ .../repositories/SharedItemsRepository.kt | 22 +++++++++++++++++++ .../repositories/SharedItemsRepositoryImpl.kt | 22 +++++++++++++++++++ .../viewmodels/SharedItemsViewModel.kt | 22 +++++++++++++++++++ 11 files changed, 242 insertions(+) diff --git a/app/src/main/java/com/nextcloud/talk/shareditems/activities/SharedItemsActivity.kt b/app/src/main/java/com/nextcloud/talk/shareditems/activities/SharedItemsActivity.kt index 1c7544453..6d9ad7b0a 100644 --- a/app/src/main/java/com/nextcloud/talk/shareditems/activities/SharedItemsActivity.kt +++ b/app/src/main/java/com/nextcloud/talk/shareditems/activities/SharedItemsActivity.kt @@ -1,3 +1,25 @@ +/* + * Nextcloud Talk application + * + * @author Tim Krüger + * @author Álvaro Brey + * Copyright (C) 2022 Álvaro Brey + * Copyright (C) 2022 Tim Krüger + * + * 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.shareditems.activities import android.os.Bundle diff --git a/app/src/main/java/com/nextcloud/talk/shareditems/adapters/SharedItemsAdapter.kt b/app/src/main/java/com/nextcloud/talk/shareditems/adapters/SharedItemsAdapter.kt index 1aef5b377..63cab9b81 100644 --- a/app/src/main/java/com/nextcloud/talk/shareditems/adapters/SharedItemsAdapter.kt +++ b/app/src/main/java/com/nextcloud/talk/shareditems/adapters/SharedItemsAdapter.kt @@ -1,3 +1,25 @@ +/* + * Nextcloud Talk application + * + * @author Tim Krüger + * @author Álvaro Brey + * Copyright (C) 2022 Álvaro Brey + * Copyright (C) 2022 Tim Krüger + * + * 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.shareditems.adapters import android.view.LayoutInflater diff --git a/app/src/main/java/com/nextcloud/talk/shareditems/adapters/SharedItemsGridViewHolder.kt b/app/src/main/java/com/nextcloud/talk/shareditems/adapters/SharedItemsGridViewHolder.kt index bff6d72d7..b7bf7be6c 100644 --- a/app/src/main/java/com/nextcloud/talk/shareditems/adapters/SharedItemsGridViewHolder.kt +++ b/app/src/main/java/com/nextcloud/talk/shareditems/adapters/SharedItemsGridViewHolder.kt @@ -1,3 +1,25 @@ +/* + * Nextcloud Talk application + * + * @author Tim Krüger + * @author Álvaro Brey + * Copyright (C) 2022 Álvaro Brey + * Copyright (C) 2022 Tim Krüger + * + * 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.shareditems.adapters import android.view.View diff --git a/app/src/main/java/com/nextcloud/talk/shareditems/adapters/SharedItemsListViewHolder.kt b/app/src/main/java/com/nextcloud/talk/shareditems/adapters/SharedItemsListViewHolder.kt index 568ad915b..7f5e4cbe7 100644 --- a/app/src/main/java/com/nextcloud/talk/shareditems/adapters/SharedItemsListViewHolder.kt +++ b/app/src/main/java/com/nextcloud/talk/shareditems/adapters/SharedItemsListViewHolder.kt @@ -1,3 +1,25 @@ +/* + * Nextcloud Talk application + * + * @author Tim Krüger + * @author Álvaro Brey + * Copyright (C) 2022 Álvaro Brey + * Copyright (C) 2022 Tim Krüger + * + * 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.shareditems.adapters import android.text.format.Formatter diff --git a/app/src/main/java/com/nextcloud/talk/shareditems/adapters/SharedItemsViewHolder.kt b/app/src/main/java/com/nextcloud/talk/shareditems/adapters/SharedItemsViewHolder.kt index d8c9dbf3a..397750dd8 100644 --- a/app/src/main/java/com/nextcloud/talk/shareditems/adapters/SharedItemsViewHolder.kt +++ b/app/src/main/java/com/nextcloud/talk/shareditems/adapters/SharedItemsViewHolder.kt @@ -1,3 +1,25 @@ +/* + * Nextcloud Talk application + * + * @author Tim Krüger + * @author Álvaro Brey + * Copyright (C) 2022 Álvaro Brey + * Copyright (C) 2022 Tim Krüger + * + * 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.shareditems.adapters import android.graphics.drawable.Drawable diff --git a/app/src/main/java/com/nextcloud/talk/shareditems/model/SharedItem.kt b/app/src/main/java/com/nextcloud/talk/shareditems/model/SharedItem.kt index 7f2bc0300..3a7033fe4 100644 --- a/app/src/main/java/com/nextcloud/talk/shareditems/model/SharedItem.kt +++ b/app/src/main/java/com/nextcloud/talk/shareditems/model/SharedItem.kt @@ -1,3 +1,25 @@ +/* + * Nextcloud Talk application + * + * @author Tim Krüger + * @author Álvaro Brey + * Copyright (C) 2022 Álvaro Brey + * Copyright (C) 2022 Tim Krüger + * + * 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.shareditems.model data class SharedItem( diff --git a/app/src/main/java/com/nextcloud/talk/shareditems/model/SharedItemType.kt b/app/src/main/java/com/nextcloud/talk/shareditems/model/SharedItemType.kt index 7ddf9228e..caedd4c02 100644 --- a/app/src/main/java/com/nextcloud/talk/shareditems/model/SharedItemType.kt +++ b/app/src/main/java/com/nextcloud/talk/shareditems/model/SharedItemType.kt @@ -1,3 +1,25 @@ +/* + * Nextcloud Talk application + * + * @author Tim Krüger + * @author Álvaro Brey + * Copyright (C) 2022 Álvaro Brey + * Copyright (C) 2022 Tim Krüger + * + * 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.shareditems.model import java.util.Locale diff --git a/app/src/main/java/com/nextcloud/talk/shareditems/model/SharedMediaItems.kt b/app/src/main/java/com/nextcloud/talk/shareditems/model/SharedMediaItems.kt index ea70050ba..ef891ffc7 100644 --- a/app/src/main/java/com/nextcloud/talk/shareditems/model/SharedMediaItems.kt +++ b/app/src/main/java/com/nextcloud/talk/shareditems/model/SharedMediaItems.kt @@ -1,3 +1,25 @@ +/* + * Nextcloud Talk application + * + * @author Tim Krüger + * @author Álvaro Brey + * Copyright (C) 2022 Álvaro Brey + * Copyright (C) 2022 Tim Krüger + * + * 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.shareditems.model class SharedMediaItems( diff --git a/app/src/main/java/com/nextcloud/talk/shareditems/repositories/SharedItemsRepository.kt b/app/src/main/java/com/nextcloud/talk/shareditems/repositories/SharedItemsRepository.kt index cbfc2046b..a668d672d 100644 --- a/app/src/main/java/com/nextcloud/talk/shareditems/repositories/SharedItemsRepository.kt +++ b/app/src/main/java/com/nextcloud/talk/shareditems/repositories/SharedItemsRepository.kt @@ -1,3 +1,25 @@ +/* + * Nextcloud Talk application + * + * @author Tim Krüger + * @author Álvaro Brey + * Copyright (C) 2022 Álvaro Brey + * Copyright (C) 2022 Tim Krüger + * + * 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.shareditems.repositories import com.nextcloud.talk.shareditems.model.SharedItemType diff --git a/app/src/main/java/com/nextcloud/talk/shareditems/repositories/SharedItemsRepositoryImpl.kt b/app/src/main/java/com/nextcloud/talk/shareditems/repositories/SharedItemsRepositoryImpl.kt index 0c063de31..22745b088 100644 --- a/app/src/main/java/com/nextcloud/talk/shareditems/repositories/SharedItemsRepositoryImpl.kt +++ b/app/src/main/java/com/nextcloud/talk/shareditems/repositories/SharedItemsRepositoryImpl.kt @@ -1,3 +1,25 @@ +/* + * Nextcloud Talk application + * + * @author Tim Krüger + * @author Álvaro Brey + * Copyright (C) 2022 Álvaro Brey + * Copyright (C) 2022 Tim Krüger + * + * 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.shareditems.repositories import android.util.Log diff --git a/app/src/main/java/com/nextcloud/talk/shareditems/viewmodels/SharedItemsViewModel.kt b/app/src/main/java/com/nextcloud/talk/shareditems/viewmodels/SharedItemsViewModel.kt index 6075b9b23..c926931df 100644 --- a/app/src/main/java/com/nextcloud/talk/shareditems/viewmodels/SharedItemsViewModel.kt +++ b/app/src/main/java/com/nextcloud/talk/shareditems/viewmodels/SharedItemsViewModel.kt @@ -1,3 +1,25 @@ +/* + * Nextcloud Talk application + * + * @author Tim Krüger + * @author Álvaro Brey + * Copyright (C) 2022 Álvaro Brey + * Copyright (C) 2022 Tim Krüger + * + * 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.shareditems.viewmodels import android.util.Log From 10857114f5d379b99e7c9edc85aac07630c3d0d8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tim=20Kr=C3=BCger?= Date: Thu, 19 May 2022 20:44:18 +0200 Subject: [PATCH 12/16] Avoid NPE when 'sharedItems' is null MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Tim Krüger --- .../talk/shareditems/viewmodels/SharedItemsViewModel.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/java/com/nextcloud/talk/shareditems/viewmodels/SharedItemsViewModel.kt b/app/src/main/java/com/nextcloud/talk/shareditems/viewmodels/SharedItemsViewModel.kt index c926931df..a1e220f82 100644 --- a/app/src/main/java/com/nextcloud/talk/shareditems/viewmodels/SharedItemsViewModel.kt +++ b/app/src/main/java/com/nextcloud/talk/shareditems/viewmodels/SharedItemsViewModel.kt @@ -66,7 +66,7 @@ class SharedItemsViewModel @Inject constructor( get() = _currentItemType fun loadNextItems() { - val currentSharedItems = sharedItems.value!! + val currentSharedItems = sharedItems.value ?: return if (currentSharedItems.moreItemsExisting) { repository.media(repositoryParameters, _currentItemType, currentSharedItems.lastSeenId) From ae65de6cce0d0bbabd4615f80852caeaf8bc7c0c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=81lvaro=20Brey?= Date: Fri, 20 May 2022 12:50:14 +0200 Subject: [PATCH 13/16] SharedItemsViewModel: use unified state livedata MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Tim Krüger Signed-off-by: Álvaro Brey --- .../activities/SharedItemsActivity.kt | 42 +++++---- .../viewmodels/SharedItemsViewModel.kt | 88 ++++++++++++------- 2 files changed, 81 insertions(+), 49 deletions(-) diff --git a/app/src/main/java/com/nextcloud/talk/shareditems/activities/SharedItemsActivity.kt b/app/src/main/java/com/nextcloud/talk/shareditems/activities/SharedItemsActivity.kt index 6d9ad7b0a..4ebed5b75 100644 --- a/app/src/main/java/com/nextcloud/talk/shareditems/activities/SharedItemsActivity.kt +++ b/app/src/main/java/com/nextcloud/talk/shareditems/activities/SharedItemsActivity.kt @@ -82,27 +82,31 @@ class SharedItemsActivity : AppCompatActivity() { supportActionBar?.setDisplayHomeAsUpEnabled(true) viewModel = ViewModelProvider(this, viewModelFactory)[SharedItemsViewModel::class.java] - viewModel.initialize(userEntity, roomToken, SharedItemType.MEDIA) - viewModel.sharedItemTypes.observe(this) { - initTabs(it) - } + viewModel.viewState.observe(this) { state -> + when (state) { + SharedItemsViewModel.NoSharedItemsState -> { + // todo + } + is SharedItemsViewModel.LoadedState -> { + val sharedMediaItems = state.items + Log.d(TAG, "Items received: $sharedMediaItems") - viewModel.sharedItems.observe(this) { - Log.d(TAG, "Items received: $it") + val showGrid = viewModel.currentItemType == SharedItemType.MEDIA + val layoutManager = if (showGrid) { + GridLayoutManager(this, SPAN_COUNT) + } else { + LinearLayoutManager(this, LinearLayoutManager.VERTICAL, false) + } - val showGrid = viewModel.currentItemType == SharedItemType.MEDIA - val layoutManager = if (showGrid) { - GridLayoutManager(this, SPAN_COUNT) - } else { - LinearLayoutManager(this, LinearLayoutManager.VERTICAL, false) + val adapter = SharedItemsAdapter(showGrid, userEntity).apply { + items = sharedMediaItems.items + } + binding.imageRecycler.adapter = adapter + binding.imageRecycler.layoutManager = layoutManager + } + is SharedItemsViewModel.TabsLoadedState -> initTabs(state.types) } - - val adapter = SharedItemsAdapter(showGrid, userEntity).apply { - items = it.items - } - binding.imageRecycler.adapter = adapter - binding.imageRecycler.layoutManager = layoutManager } binding.imageRecycler.addOnScrollListener(object : RecyclerView.OnScrollListener() { @@ -113,6 +117,8 @@ class SharedItemsActivity : AppCompatActivity() { } } }) + + viewModel.initialize(userEntity, roomToken, SharedItemType.MEDIA) } private fun initTabs(sharedItemTypes: Set) { @@ -175,6 +181,8 @@ class SharedItemsActivity : AppCompatActivity() { override fun onTabReselected(tab: TabLayout.Tab) = Unit }) + + viewModel.loadItems(SharedItemType.MEDIA) } override fun onOptionsItemSelected(item: MenuItem): Boolean { diff --git a/app/src/main/java/com/nextcloud/talk/shareditems/viewmodels/SharedItemsViewModel.kt b/app/src/main/java/com/nextcloud/talk/shareditems/viewmodels/SharedItemsViewModel.kt index a1e220f82..f4ca8a4f2 100644 --- a/app/src/main/java/com/nextcloud/talk/shareditems/viewmodels/SharedItemsViewModel.kt +++ b/app/src/main/java/com/nextcloud/talk/shareditems/viewmodels/SharedItemsViewModel.kt @@ -41,38 +41,41 @@ class SharedItemsViewModel @Inject constructor( ) : ViewModel() { - private val _sharedItemTypes: MutableLiveData> by lazy { - MutableLiveData>().also { - availableTypes() - } - } - - private val _sharedItems: MutableLiveData by lazy { - MutableLiveData().also { - loadItems(_currentItemType) - } - } - private lateinit var repositoryParameters: SharedItemsRepository.Parameters private lateinit var _currentItemType: SharedItemType - - val sharedItemTypes: LiveData> - get() = _sharedItemTypes - - val sharedItems: LiveData - get() = _sharedItems - val currentItemType: SharedItemType get() = _currentItemType - fun loadNextItems() { - val currentSharedItems = sharedItems.value ?: return + // items + sealed interface ViewState + object NoSharedItemsState : ViewState + open class TabsLoadedState(val types: Set) : ViewState + class LoadedState(types: Set, val items: SharedMediaItems) : TabsLoadedState(types) - if (currentSharedItems.moreItemsExisting) { - repository.media(repositoryParameters, _currentItemType, currentSharedItems.lastSeenId) - ?.subscribeOn(Schedulers.io()) - ?.observeOn(AndroidSchedulers.mainThread()) - ?.subscribe(observer(_currentItemType, false)) + private val _viewState: MutableLiveData = MutableLiveData(NoSharedItemsState) + val viewState: LiveData + get() = _viewState + + // private val _sharedItems: MutableLiveData by lazy { + // MutableLiveData().also { + // loadItems(_currentItemType) + // } + // } + // val sharedItems: LiveData + // get() = _sharedItems + + fun loadNextItems() { + when (val currentState = _viewState.value) { + is LoadedState -> { + val currentSharedItems = currentState.items + if (currentSharedItems.moreItemsExisting) { + repository.media(repositoryParameters, _currentItemType, currentSharedItems.lastSeenId) + ?.subscribeOn(Schedulers.io()) + ?.observeOn(AndroidSchedulers.mainThread()) + ?.subscribe(observer(_currentItemType, false)) + } + } + else -> return } } @@ -101,23 +104,38 @@ class SharedItemsViewModel @Inject constructor( } override fun onComplete() { + val items = newSharedItems!! + // todo replace initmodel with tabsloadedstate if (initModel) { - this@SharedItemsViewModel._sharedItems.value = - newSharedItems + setCurrentState(items) } else { - val oldItems = this@SharedItemsViewModel._sharedItems.value!!.items - this@SharedItemsViewModel._sharedItems.value = + val state = this@SharedItemsViewModel._viewState.value as LoadedState + val oldItems = state.items.items + val newItems = SharedMediaItems( oldItems + newSharedItems!!.items, newSharedItems!!.lastSeenId, newSharedItems!!.moreItemsExisting ) + setCurrentState(newItems) + } + } + + private fun setCurrentState(items: SharedMediaItems) { + when (val state = this@SharedItemsViewModel._viewState.value) { + is TabsLoadedState -> { + this@SharedItemsViewModel._viewState.value = LoadedState( + state.types, + items + ) + } + else -> return } } } } - private fun availableTypes() { + private fun loadAvailableTypes() { repository.availableTypes(repositoryParameters).subscribeOn(Schedulers.io()) ?.observeOn(AndroidSchedulers.mainThread()) ?.subscribe(object : Observer> { @@ -135,7 +153,12 @@ class SharedItemsViewModel @Inject constructor( } override fun onComplete() { - this@SharedItemsViewModel._sharedItemTypes.value = this.types + val newTypes = this.types + if (newTypes.isNullOrEmpty()) { + this@SharedItemsViewModel._viewState.value = NoSharedItemsState + } else { + this@SharedItemsViewModel._viewState.value = TabsLoadedState(newTypes) + } } }) } @@ -149,6 +172,7 @@ class SharedItemsViewModel @Inject constructor( roomToken ) _currentItemType = initialType + loadAvailableTypes() } companion object { From 5310ed3f3d7e2ada7bf644ba15d26f809d5f63d7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=81lvaro=20Brey?= Date: Fri, 20 May 2022 15:24:53 +0200 Subject: [PATCH 14/16] SharedItems: show empty state when there are no shared items MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Tim Krüger Signed-off-by: Álvaro Brey --- .../activities/SharedItemsActivity.kt | 22 ++++++++++++++++--- .../viewmodels/SharedItemsViewModel.kt | 11 ++-------- .../main/res/layout/activity_shared_items.xml | 6 +++++ app/src/main/res/values/strings.xml | 1 + 4 files changed, 28 insertions(+), 12 deletions(-) diff --git a/app/src/main/java/com/nextcloud/talk/shareditems/activities/SharedItemsActivity.kt b/app/src/main/java/com/nextcloud/talk/shareditems/activities/SharedItemsActivity.kt index 4ebed5b75..a74a2adea 100644 --- a/app/src/main/java/com/nextcloud/talk/shareditems/activities/SharedItemsActivity.kt +++ b/app/src/main/java/com/nextcloud/talk/shareditems/activities/SharedItemsActivity.kt @@ -25,6 +25,7 @@ package com.nextcloud.talk.shareditems.activities import android.os.Bundle import android.util.Log import android.view.MenuItem +import android.view.View import androidx.appcompat.app.AppCompatActivity import androidx.core.content.res.ResourcesCompat import androidx.lifecycle.ViewModelProvider @@ -84,10 +85,8 @@ class SharedItemsActivity : AppCompatActivity() { viewModel = ViewModelProvider(this, viewModelFactory)[SharedItemsViewModel::class.java] viewModel.viewState.observe(this) { state -> + handleEmptyView(state) when (state) { - SharedItemsViewModel.NoSharedItemsState -> { - // todo - } is SharedItemsViewModel.LoadedState -> { val sharedMediaItems = state.items Log.d(TAG, "Items received: $sharedMediaItems") @@ -106,6 +105,9 @@ class SharedItemsActivity : AppCompatActivity() { binding.imageRecycler.layoutManager = layoutManager } is SharedItemsViewModel.TabsLoadedState -> initTabs(state.types) + else -> { + // noop + } } } @@ -121,6 +123,20 @@ class SharedItemsActivity : AppCompatActivity() { viewModel.initialize(userEntity, roomToken, SharedItemType.MEDIA) } + private fun handleEmptyView(state: SharedItemsViewModel.ViewState?) { + when (state) { + SharedItemsViewModel.NoSharedItemsState -> { + binding.emptyContainer.emptyListViewHeadline.text = getString(R.string.nc_shared_items_empty) + binding.emptyContainer.emptyListView.visibility = View.VISIBLE + binding.sharedItemsTabs.visibility = View.GONE + } + else -> { + binding.emptyContainer.emptyListView.visibility = View.GONE + binding.sharedItemsTabs.visibility = View.VISIBLE + } + } + } + private fun initTabs(sharedItemTypes: Set) { if (sharedItemTypes.contains(SharedItemType.MEDIA)) { diff --git a/app/src/main/java/com/nextcloud/talk/shareditems/viewmodels/SharedItemsViewModel.kt b/app/src/main/java/com/nextcloud/talk/shareditems/viewmodels/SharedItemsViewModel.kt index f4ca8a4f2..47e665505 100644 --- a/app/src/main/java/com/nextcloud/talk/shareditems/viewmodels/SharedItemsViewModel.kt +++ b/app/src/main/java/com/nextcloud/talk/shareditems/viewmodels/SharedItemsViewModel.kt @@ -48,22 +48,15 @@ class SharedItemsViewModel @Inject constructor( // items sealed interface ViewState + object InitialState : ViewState object NoSharedItemsState : ViewState open class TabsLoadedState(val types: Set) : ViewState class LoadedState(types: Set, val items: SharedMediaItems) : TabsLoadedState(types) - private val _viewState: MutableLiveData = MutableLiveData(NoSharedItemsState) + private val _viewState: MutableLiveData = MutableLiveData(InitialState) val viewState: LiveData get() = _viewState - // private val _sharedItems: MutableLiveData by lazy { - // MutableLiveData().also { - // loadItems(_currentItemType) - // } - // } - // val sharedItems: LiveData - // get() = _sharedItems - fun loadNextItems() { when (val currentState = _viewState.value) { is LoadedState -> { diff --git a/app/src/main/res/layout/activity_shared_items.xml b/app/src/main/res/layout/activity_shared_items.xml index dc65d9f27..54243b293 100644 --- a/app/src/main/res/layout/activity_shared_items.xml +++ b/app/src/main/res/layout/activity_shared_items.xml @@ -56,6 +56,12 @@ + + Shared items Images, files, voice messages… + No shared items Talk recording from %1$s (%2$s) From 05340fc4666a5eb7f8ec4806113533a7ff6de8d6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=81lvaro=20Brey?= Date: Fri, 20 May 2022 16:31:11 +0200 Subject: [PATCH 15/16] SharedItems: show loading state when initially loading a tab, and clear remaining TODOs MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Tim Krüger Signed-off-by: Álvaro Brey --- .../activities/SharedItemsActivity.kt | 39 ++-- .../viewmodels/SharedItemsViewModel.kt | 177 +++++++++--------- 2 files changed, 112 insertions(+), 104 deletions(-) diff --git a/app/src/main/java/com/nextcloud/talk/shareditems/activities/SharedItemsActivity.kt b/app/src/main/java/com/nextcloud/talk/shareditems/activities/SharedItemsActivity.kt index a74a2adea..984b76e55 100644 --- a/app/src/main/java/com/nextcloud/talk/shareditems/activities/SharedItemsActivity.kt +++ b/app/src/main/java/com/nextcloud/talk/shareditems/activities/SharedItemsActivity.kt @@ -85,13 +85,13 @@ class SharedItemsActivity : AppCompatActivity() { viewModel = ViewModelProvider(this, viewModelFactory)[SharedItemsViewModel::class.java] viewModel.viewState.observe(this) { state -> - handleEmptyView(state) + handleEmptyLoadingView(state) when (state) { is SharedItemsViewModel.LoadedState -> { val sharedMediaItems = state.items Log.d(TAG, "Items received: $sharedMediaItems") - val showGrid = viewModel.currentItemType == SharedItemType.MEDIA + val showGrid = state.selectedType == SharedItemType.MEDIA val layoutManager = if (showGrid) { GridLayoutManager(this, SPAN_COUNT) } else { @@ -104,7 +104,9 @@ class SharedItemsActivity : AppCompatActivity() { binding.imageRecycler.adapter = adapter binding.imageRecycler.layoutManager = layoutManager } - is SharedItemsViewModel.TabsLoadedState -> initTabs(state.types) + is SharedItemsViewModel.TypesLoadedState -> { + initTabs(state.types) + } else -> { // noop } @@ -120,25 +122,28 @@ class SharedItemsActivity : AppCompatActivity() { } }) - viewModel.initialize(userEntity, roomToken, SharedItemType.MEDIA) + viewModel.initialize(userEntity, roomToken) } - private fun handleEmptyView(state: SharedItemsViewModel.ViewState?) { - when (state) { - SharedItemsViewModel.NoSharedItemsState -> { - binding.emptyContainer.emptyListViewHeadline.text = getString(R.string.nc_shared_items_empty) - binding.emptyContainer.emptyListView.visibility = View.VISIBLE - binding.sharedItemsTabs.visibility = View.GONE - } - else -> { - binding.emptyContainer.emptyListView.visibility = View.GONE - binding.sharedItemsTabs.visibility = View.VISIBLE - } + private fun handleEmptyLoadingView(state: SharedItemsViewModel.ViewState?) { + binding.emptyContainer.emptyListViewHeadline.text = when (state) { + SharedItemsViewModel.NoSharedItemsState -> getString(R.string.nc_shared_items_description) + else -> getString(R.string.file_list_loading) + } + binding.emptyContainer.emptyListView.visibility = when (state) { + SharedItemsViewModel.NoSharedItemsState, is SharedItemsViewModel.LoadingItemsState -> View.VISIBLE + else -> View.GONE + } + binding.sharedItemsTabs.visibility = when (state) { + SharedItemsViewModel.NoSharedItemsState -> View.GONE + else -> View.VISIBLE } } private fun initTabs(sharedItemTypes: Set) { + binding.sharedItemsTabs.removeAllTabs() + if (sharedItemTypes.contains(SharedItemType.MEDIA)) { val tabMedia: TabLayout.Tab = binding.sharedItemsTabs.newTab() tabMedia.tag = SharedItemType.MEDIA @@ -190,15 +195,13 @@ class SharedItemsActivity : AppCompatActivity() { binding.sharedItemsTabs.addOnTabSelectedListener(object : TabLayout.OnTabSelectedListener { override fun onTabSelected(tab: TabLayout.Tab) { - viewModel.loadItems(tab.tag as SharedItemType) + viewModel.initialLoadItems(tab.tag as SharedItemType) } override fun onTabUnselected(tab: TabLayout.Tab) = Unit override fun onTabReselected(tab: TabLayout.Tab) = Unit }) - - viewModel.loadItems(SharedItemType.MEDIA) } override fun onOptionsItemSelected(item: MenuItem): Boolean { diff --git a/app/src/main/java/com/nextcloud/talk/shareditems/viewmodels/SharedItemsViewModel.kt b/app/src/main/java/com/nextcloud/talk/shareditems/viewmodels/SharedItemsViewModel.kt index 47e665505..e26b5cbe6 100644 --- a/app/src/main/java/com/nextcloud/talk/shareditems/viewmodels/SharedItemsViewModel.kt +++ b/app/src/main/java/com/nextcloud/talk/shareditems/viewmodels/SharedItemsViewModel.kt @@ -42,90 +42,29 @@ class SharedItemsViewModel @Inject constructor( ViewModel() { private lateinit var repositoryParameters: SharedItemsRepository.Parameters - private lateinit var _currentItemType: SharedItemType - val currentItemType: SharedItemType - get() = _currentItemType - // items sealed interface ViewState object InitialState : ViewState object NoSharedItemsState : ViewState - open class TabsLoadedState(val types: Set) : ViewState - class LoadedState(types: Set, val items: SharedMediaItems) : TabsLoadedState(types) + open class TypesLoadedState(val types: Set, val selectedType: SharedItemType) : ViewState + class LoadingItemsState(types: Set, selectedType: SharedItemType) : + TypesLoadedState(types, selectedType) + + class LoadedState(types: Set, selectedType: SharedItemType, val items: SharedMediaItems) : + TypesLoadedState(types, selectedType) private val _viewState: MutableLiveData = MutableLiveData(InitialState) val viewState: LiveData get() = _viewState - fun loadNextItems() { - when (val currentState = _viewState.value) { - is LoadedState -> { - val currentSharedItems = currentState.items - if (currentSharedItems.moreItemsExisting) { - repository.media(repositoryParameters, _currentItemType, currentSharedItems.lastSeenId) - ?.subscribeOn(Schedulers.io()) - ?.observeOn(AndroidSchedulers.mainThread()) - ?.subscribe(observer(_currentItemType, false)) - } - } - else -> return - } - } - - fun loadItems(type: SharedItemType) { - - _currentItemType = type - - repository.media(repositoryParameters, type)?.subscribeOn(Schedulers.io()) - ?.observeOn(AndroidSchedulers.mainThread()) - ?.subscribe(observer(type, true)) - } - - private fun observer(type: SharedItemType, initModel: Boolean): Observer { - return object : Observer { - - var newSharedItems: SharedMediaItems? = null - - override fun onSubscribe(d: Disposable) = Unit - - override fun onNext(response: SharedMediaItems) { - newSharedItems = response - } - - override fun onError(e: Throwable) { - Log.d(TAG, "An error occurred: $e") - } - - override fun onComplete() { - val items = newSharedItems!! - // todo replace initmodel with tabsloadedstate - if (initModel) { - setCurrentState(items) - } else { - val state = this@SharedItemsViewModel._viewState.value as LoadedState - val oldItems = state.items.items - val newItems = - SharedMediaItems( - oldItems + newSharedItems!!.items, - newSharedItems!!.lastSeenId, - newSharedItems!!.moreItemsExisting - ) - setCurrentState(newItems) - } - } - - private fun setCurrentState(items: SharedMediaItems) { - when (val state = this@SharedItemsViewModel._viewState.value) { - is TabsLoadedState -> { - this@SharedItemsViewModel._viewState.value = LoadedState( - state.types, - items - ) - } - else -> return - } - } - } + fun initialize(userEntity: UserEntity, roomToken: String) { + repositoryParameters = SharedItemsRepository.Parameters( + userEntity.userId, + userEntity.token, + userEntity.baseUrl, + roomToken + ) + loadAvailableTypes() } private fun loadAvailableTypes() { @@ -150,22 +89,88 @@ class SharedItemsViewModel @Inject constructor( if (newTypes.isNullOrEmpty()) { this@SharedItemsViewModel._viewState.value = NoSharedItemsState } else { - this@SharedItemsViewModel._viewState.value = TabsLoadedState(newTypes) + val selectedType = chooseInitialType(newTypes) + this@SharedItemsViewModel._viewState.value = + TypesLoadedState(newTypes, selectedType) + initialLoadItems(selectedType) } } }) } - // TODO cleanup - fun initialize(userEntity: UserEntity, roomToken: String, initialType: SharedItemType) { - repositoryParameters = SharedItemsRepository.Parameters( - userEntity.userId, - userEntity.token, - userEntity.baseUrl, - roomToken - ) - _currentItemType = initialType - loadAvailableTypes() + private fun chooseInitialType(newTypes: Set): SharedItemType = when { + newTypes.contains(SharedItemType.MEDIA) -> SharedItemType.MEDIA + else -> newTypes.toList().first() + } + + fun initialLoadItems(type: SharedItemType) { + val state = _viewState.value + if (state is TypesLoadedState) { + _viewState.value = LoadingItemsState(state.types, type) + repository.media(repositoryParameters, type)?.subscribeOn(Schedulers.io()) + ?.observeOn(AndroidSchedulers.mainThread()) + ?.subscribe(SharedMediaItemsObserver()) + } + } + + fun loadNextItems() { + when (val currentState = _viewState.value) { + is LoadedState -> { + val currentSharedItems = currentState.items + if (currentSharedItems.moreItemsExisting) { + repository.media(repositoryParameters, currentState.selectedType, currentSharedItems.lastSeenId) + ?.subscribeOn(Schedulers.io()) + ?.observeOn(AndroidSchedulers.mainThread()) + ?.subscribe(SharedMediaItemsObserver()) + } + } + else -> return + } + } + + inner class SharedMediaItemsObserver : Observer { + + var newSharedItems: SharedMediaItems? = null + + override fun onSubscribe(d: Disposable) = Unit + + override fun onNext(response: SharedMediaItems) { + newSharedItems = response + } + + override fun onError(e: Throwable) { + Log.d(TAG, "An error occurred: $e") + } + + override fun onComplete() { + val items = newSharedItems!! + val state = this@SharedItemsViewModel._viewState.value + if (state is LoadedState) { + val oldItems = state.items.items + val newItems = + SharedMediaItems( + oldItems + newSharedItems!!.items, + newSharedItems!!.lastSeenId, + newSharedItems!!.moreItemsExisting + ) + setCurrentState(newItems) + } else { + setCurrentState(items) + } + } + + private fun setCurrentState(items: SharedMediaItems) { + when (val state = this@SharedItemsViewModel._viewState.value) { + is TypesLoadedState -> { + this@SharedItemsViewModel._viewState.value = LoadedState( + state.types, + state.selectedType, + items + ) + } + else -> return + } + } } companion object { From 1c9730f90937b23175dfd81a1d355f2ddc925dc3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=81lvaro=20Brey?= Date: Mon, 23 May 2022 11:06:57 +0200 Subject: [PATCH 16/16] Fix state handling in SharedItemsActivity MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Álvaro Brey --- .../activities/SharedItemsActivity.kt | 38 ++++++++++--------- 1 file changed, 21 insertions(+), 17 deletions(-) diff --git a/app/src/main/java/com/nextcloud/talk/shareditems/activities/SharedItemsActivity.kt b/app/src/main/java/com/nextcloud/talk/shareditems/activities/SharedItemsActivity.kt index 984b76e55..a24a3d864 100644 --- a/app/src/main/java/com/nextcloud/talk/shareditems/activities/SharedItemsActivity.kt +++ b/app/src/main/java/com/nextcloud/talk/shareditems/activities/SharedItemsActivity.kt @@ -85,8 +85,14 @@ class SharedItemsActivity : AppCompatActivity() { viewModel = ViewModelProvider(this, viewModelFactory)[SharedItemsViewModel::class.java] viewModel.viewState.observe(this) { state -> - handleEmptyLoadingView(state) + clearEmptyLoading() when (state) { + is SharedItemsViewModel.LoadingItemsState, SharedItemsViewModel.InitialState -> { + showLoading() + } + is SharedItemsViewModel.NoSharedItemsState -> { + showEmpty() + } is SharedItemsViewModel.LoadedState -> { val sharedMediaItems = state.items Log.d(TAG, "Items received: $sharedMediaItems") @@ -107,9 +113,6 @@ class SharedItemsActivity : AppCompatActivity() { is SharedItemsViewModel.TypesLoadedState -> { initTabs(state.types) } - else -> { - // noop - } } } @@ -125,19 +128,20 @@ class SharedItemsActivity : AppCompatActivity() { viewModel.initialize(userEntity, roomToken) } - private fun handleEmptyLoadingView(state: SharedItemsViewModel.ViewState?) { - binding.emptyContainer.emptyListViewHeadline.text = when (state) { - SharedItemsViewModel.NoSharedItemsState -> getString(R.string.nc_shared_items_description) - else -> getString(R.string.file_list_loading) - } - binding.emptyContainer.emptyListView.visibility = when (state) { - SharedItemsViewModel.NoSharedItemsState, is SharedItemsViewModel.LoadingItemsState -> View.VISIBLE - else -> View.GONE - } - binding.sharedItemsTabs.visibility = when (state) { - SharedItemsViewModel.NoSharedItemsState -> View.GONE - else -> View.VISIBLE - } + private fun clearEmptyLoading() { + binding.sharedItemsTabs.visibility = View.VISIBLE + binding.emptyContainer.emptyListView.visibility = View.GONE + } + + private fun showLoading() { + binding.emptyContainer.emptyListViewHeadline.text = getString(R.string.file_list_loading) + binding.emptyContainer.emptyListView.visibility = View.VISIBLE + } + + private fun showEmpty() { + binding.emptyContainer.emptyListViewHeadline.text = getString(R.string.nc_shared_items_empty) + binding.emptyContainer.emptyListView.visibility = View.VISIBLE + binding.sharedItemsTabs.visibility = View.GONE } private fun initTabs(sharedItemTypes: Set) {