diff --git a/app/src/main/java/com/nextcloud/talk/adapters/messages/IncomingPollMessageViewHolder.kt b/app/src/main/java/com/nextcloud/talk/adapters/messages/IncomingPollMessageViewHolder.kt index 5bcd9ed83..c79c8dc8b 100644 --- a/app/src/main/java/com/nextcloud/talk/adapters/messages/IncomingPollMessageViewHolder.kt +++ b/app/src/main/java/com/nextcloud/talk/adapters/messages/IncomingPollMessageViewHolder.kt @@ -117,11 +117,13 @@ class IncomingPollMessageViewHolder(incomingView: View, payload: Any) : MessageH binding.messagePollTitle.text = pollName // TODO: how to get room token here? - val roomToken = "???????????????????????????" + // val roomToken = "???????????????????????????" + val roomToken = "i7ht5k9n" binding.bubble.setOnClickListener { val pollVoteDialog = PollMainDialogFragment.newInstance( - message.activeUser!!, roomToken, pollId, + roomToken, + pollId, pollName ) pollVoteDialog.show( diff --git a/app/src/main/java/com/nextcloud/talk/polls/model/Poll.kt b/app/src/main/java/com/nextcloud/talk/polls/model/Poll.kt index ddad6a7ad..1646618d7 100644 --- a/app/src/main/java/com/nextcloud/talk/polls/model/Poll.kt +++ b/app/src/main/java/com/nextcloud/talk/polls/model/Poll.kt @@ -1,7 +1,5 @@ package com.nextcloud.talk.polls.model -import com.nextcloud.talk.polls.repositories.model.PollDetails - data class Poll( val id: String, val question: String?, @@ -15,6 +13,5 @@ data class Poll( val maxVotes: Int, val votedSelf: List?, val numVoters: Int, - // TODO PollDetails needs own model class val details: List? ) diff --git a/app/src/main/java/com/nextcloud/talk/polls/model/PollDetails.kt b/app/src/main/java/com/nextcloud/talk/polls/model/PollDetails.kt new file mode 100644 index 000000000..d4df031ae --- /dev/null +++ b/app/src/main/java/com/nextcloud/talk/polls/model/PollDetails.kt @@ -0,0 +1,8 @@ +package com.nextcloud.talk.polls.model + +data class PollDetails( + val actorType: String?, + val actorId: String?, + val actorDisplayName: String?, + val optionId: Int +) diff --git a/app/src/main/java/com/nextcloud/talk/polls/repositories/PollRepository.kt b/app/src/main/java/com/nextcloud/talk/polls/repositories/PollRepository.kt index 45d1acfbe..37e3d3d4d 100644 --- a/app/src/main/java/com/nextcloud/talk/polls/repositories/PollRepository.kt +++ b/app/src/main/java/com/nextcloud/talk/polls/repositories/PollRepository.kt @@ -5,5 +5,5 @@ import io.reactivex.Observable interface PollRepository { - fun getPoll(roomToken: String, pollId: String): Observable + fun getPoll(roomToken: String, pollId: String): Observable? } diff --git a/app/src/main/java/com/nextcloud/talk/polls/repositories/PollRepositoryImpl.kt b/app/src/main/java/com/nextcloud/talk/polls/repositories/PollRepositoryImpl.kt index 348f7d767..42142e436 100644 --- a/app/src/main/java/com/nextcloud/talk/polls/repositories/PollRepositoryImpl.kt +++ b/app/src/main/java/com/nextcloud/talk/polls/repositories/PollRepositoryImpl.kt @@ -23,30 +23,82 @@ package com.nextcloud.talk.polls.repositories import com.nextcloud.talk.api.NcApi import com.nextcloud.talk.polls.model.Poll +import com.nextcloud.talk.polls.model.PollDetails +import com.nextcloud.talk.polls.repositories.model.PollDetailsResponse +import com.nextcloud.talk.polls.repositories.model.PollResponse +import com.nextcloud.talk.utils.ApiUtils import com.nextcloud.talk.utils.database.user.CurrentUserProvider import io.reactivex.Observable -class PollRepositoryImpl(private val api: NcApi, private val currentUserProvider: CurrentUserProvider) : +class PollRepositoryImpl(private val ncApi: NcApi, private val currentUserProvider: CurrentUserProvider) : PollRepository { override fun getPoll(roomToken: String, pollId: String): Observable { - // TODO actual api call - return Observable.just( - Poll( - id = "aaa", - question = "what if?", - options = listOf("yes", "no", "maybe", "I don't know"), - votes = listOf(0, 0, 0, 0), - actorType = "", - actorId = "", - actorDisplayName = "", - status = 0, - resultMode = 0, - maxVotes = 1, - votedSelf = listOf(0, 0, 0, 0), - numVoters = 0, - details = emptyList() - ) + + val credentials = ApiUtils.getCredentials( + currentUserProvider.currentUser?.username, + currentUserProvider.currentUser?.token ) + + return ncApi.getPoll( + credentials, + ApiUtils.getUrlForPoll( + currentUserProvider.currentUser?.baseUrl, + roomToken, + pollId + ), + ).map { mapToPoll(it.ocs?.data!!) } + + // // // TODO actual api call + // return Observable.just( + // Poll( + // id = "aaa", + // question = "what if?", + // options = listOf("yes", "no", "maybe", "I don't know"), + // votes = listOf(0, 0, 0, 0), + // actorType = "", + // actorId = "", + // actorDisplayName = "", + // status = 0, + // resultMode = 0, + // maxVotes = 1, + // votedSelf = listOf(0, 0, 0, 0), + // numVoters = 0, + // details = emptyList() + // ) + // ) + } + + companion object { + + private fun mapToPoll(pollResponse: PollResponse): Poll { + val pollDetails = pollResponse.details?.map { it -> mapToPollDetails(it) } + + val poll = Poll( + pollResponse.id, + pollResponse.question, + pollResponse.options, + pollResponse.votes, + pollResponse.actorType, + pollResponse.actorId, + pollResponse.actorDisplayName, + pollResponse.status, + pollResponse.resultMode, + pollResponse.maxVotes, + pollResponse.votedSelf, + pollResponse.numVoters, + pollDetails, + ) + return poll + } + + private fun mapToPollDetails(pollDetailsResponse: PollDetailsResponse): PollDetails { + return PollDetails( + pollDetailsResponse.actorType, + pollDetailsResponse.actorId, + pollDetailsResponse.actorDisplayName, + pollDetailsResponse.optionId, + ) + } } } diff --git a/app/src/main/java/com/nextcloud/talk/polls/repositories/model/PollDetails.kt b/app/src/main/java/com/nextcloud/talk/polls/repositories/model/PollDetailsResponse.kt similarity index 74% rename from app/src/main/java/com/nextcloud/talk/polls/repositories/model/PollDetails.kt rename to app/src/main/java/com/nextcloud/talk/polls/repositories/model/PollDetailsResponse.kt index 73f8fd21e..b5051eac4 100644 --- a/app/src/main/java/com/nextcloud/talk/polls/repositories/model/PollDetails.kt +++ b/app/src/main/java/com/nextcloud/talk/polls/repositories/model/PollDetailsResponse.kt @@ -7,20 +7,20 @@ import kotlinx.android.parcel.Parcelize @Parcelize @JsonObject -data class PollDetails( +data class PollDetailsResponse( @JsonField(name = ["actorType"]) var actorType: String? = null, @JsonField(name = ["actorId"]) - var actorId: String? = null, + var actorId: String, @JsonField(name = ["actorDisplayName"]) - var actorDisplayName: String? = null, + var actorDisplayName: String, @JsonField(name = ["optionId"]) - var optionId: Int? = 0, + var optionId: Int, -) : Parcelable { + ) : Parcelable { // This constructor is added to work with the 'com.bluelinelabs.logansquare.annotation.JsonObject' - constructor() : this(null, null, null, 0) + constructor() : this(null, "", "", 0) } diff --git a/app/src/main/java/com/nextcloud/talk/polls/repositories/model/PollResponse.kt b/app/src/main/java/com/nextcloud/talk/polls/repositories/model/PollResponse.kt index 7aabfe12a..0bd86c56f 100644 --- a/app/src/main/java/com/nextcloud/talk/polls/repositories/model/PollResponse.kt +++ b/app/src/main/java/com/nextcloud/talk/polls/repositories/model/PollResponse.kt @@ -28,7 +28,7 @@ import kotlinx.android.parcel.Parcelize @JsonObject data class PollResponse( @JsonField(name = ["id"]) - var id: Int = 0, + var id: String, @JsonField(name = ["question"]) var question: String? = null, @@ -64,9 +64,9 @@ data class PollResponse( var numVoters: Int = 0, @JsonField(name = ["details"]) - var details: ArrayList? = null, + var details: ArrayList? = null, -) : Parcelable { + ) : Parcelable { // This constructor is added to work with the 'com.bluelinelabs.logansquare.annotation.JsonObject' - constructor() : this(0, null, null, null, null, null, null, 0, 0, 0, null) + constructor() : this("id", null, null, null, null, null, null, 0, 0, 0, null, 0, null) } diff --git a/app/src/main/java/com/nextcloud/talk/polls/ui/PollMainDialogFragment.kt b/app/src/main/java/com/nextcloud/talk/polls/ui/PollMainDialogFragment.kt index e2c6a9191..3997618c2 100644 --- a/app/src/main/java/com/nextcloud/talk/polls/ui/PollMainDialogFragment.kt +++ b/app/src/main/java/com/nextcloud/talk/polls/ui/PollMainDialogFragment.kt @@ -12,7 +12,6 @@ import androidx.lifecycle.ViewModelProvider import autodagger.AutoInjector import com.nextcloud.talk.application.NextcloudTalkApplication import com.nextcloud.talk.databinding.DialogPollMainBinding -import com.nextcloud.talk.models.database.UserEntity import com.nextcloud.talk.polls.viewmodels.PollViewModel import javax.inject.Inject @@ -78,7 +77,6 @@ class PollMainDialogFragment( companion object { @JvmStatic fun newInstance( - userEntity: UserEntity, roomTokenParam: String, pollId: String, name: String diff --git a/app/src/main/java/com/nextcloud/talk/polls/ui/PollVoteFragment.kt b/app/src/main/java/com/nextcloud/talk/polls/ui/PollVoteFragment.kt index fec941504..6e733172b 100644 --- a/app/src/main/java/com/nextcloud/talk/polls/ui/PollVoteFragment.kt +++ b/app/src/main/java/com/nextcloud/talk/polls/ui/PollVoteFragment.kt @@ -22,6 +22,7 @@ package com.nextcloud.talk.polls.ui import android.os.Bundle +import android.util.Log import android.view.LayoutInflater import android.view.View import android.view.ViewGroup @@ -74,6 +75,7 @@ class PollVoteFragment(private val parentViewModel: PollViewModel) : Fragment() .also { it.setOnClickListener { // todo + Log.d("bb", "click1") } } }?.forEach { @@ -83,6 +85,7 @@ class PollVoteFragment(private val parentViewModel: PollViewModel) : Fragment() } binding.radioGroup.setOnCheckedChangeListener { group, checkedId -> // todo set selected in viewmodel + Log.d("bb", "click") } // todo observe viewmodel checked, set view checked with it // todo listen to button click, submit diff --git a/app/src/main/java/com/nextcloud/talk/polls/viewmodels/PollViewModel.kt b/app/src/main/java/com/nextcloud/talk/polls/viewmodels/PollViewModel.kt index 4ed59ab42..751d96f5c 100644 --- a/app/src/main/java/com/nextcloud/talk/polls/viewmodels/PollViewModel.kt +++ b/app/src/main/java/com/nextcloud/talk/polls/viewmodels/PollViewModel.kt @@ -1,10 +1,12 @@ package com.nextcloud.talk.polls.viewmodels +import android.util.Log import androidx.lifecycle.LiveData import androidx.lifecycle.MutableLiveData import androidx.lifecycle.ViewModel import com.nextcloud.talk.polls.model.Poll import com.nextcloud.talk.polls.repositories.PollRepository +import io.reactivex.Observer import io.reactivex.android.schedulers.AndroidSchedulers import io.reactivex.disposables.Disposable import io.reactivex.schedulers.Schedulers @@ -44,17 +46,48 @@ class PollViewModel @Inject constructor(private val repository: PollRepository) loadPoll() } + // private fun loadPoll() { + // disposable = repository.getPoll(roomToken, pollId) + // ?.subscribeOn(Schedulers.io()) + // ?.observeOn(AndroidSchedulers.mainThread()) + // ?.subscribe { poll -> + // _viewState.value = PollOpenState(poll) + // } + // } + private fun loadPoll() { - disposable = repository.getPoll(roomToken, pollId) - .subscribeOn(Schedulers.io()) - .observeOn(AndroidSchedulers.mainThread()) - .subscribe { poll -> - _viewState.value = PollOpenState(poll) - } + repository.getPoll(roomToken, pollId) + ?.doOnSubscribe { disposable = it } + ?.subscribeOn(Schedulers.io()) + ?.observeOn(AndroidSchedulers.mainThread()) + ?.subscribe(PollObserver()) } override fun onCleared() { super.onCleared() disposable?.dispose() } + + inner class PollObserver : Observer { + + lateinit var poll: Poll + + override fun onSubscribe(d: Disposable) = Unit + + override fun onNext(response: Poll) { + poll = response + } + + override fun onError(e: Throwable) { + Log.d(TAG, "An error occurred: $e") + } + + override fun onComplete() { + _viewState.value = PollOpenState(poll) + } + } + + companion object { + private val TAG = PollViewModel::class.java.simpleName + } } 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 a668d672d..62f69beee 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 @@ -28,7 +28,10 @@ import io.reactivex.Observable interface SharedItemsRepository { - fun media(parameters: Parameters, type: SharedItemType): Observable? + fun media( + parameters: Parameters, + type: SharedItemType + ): Observable? fun media( parameters: Parameters, diff --git a/app/src/main/res/layout/dialog_poll_main.xml b/app/src/main/res/layout/dialog_poll_main.xml index f4c5e2b62..ec88db28f 100644 --- a/app/src/main/res/layout/dialog_poll_main.xml +++ b/app/src/main/res/layout/dialog_poll_main.xml @@ -46,7 +46,6 @@ app:layout_constraintTop_toTopOf="@+id/message_poll_icon" tools:text="This is the poll title?" /> - -