diff --git a/app/src/main/java/com/nextcloud/talk/polls/adapters/PollCreateOptionViewHolder.kt b/app/src/main/java/com/nextcloud/talk/polls/adapters/PollCreateOptionViewHolder.kt index e8ca339ef..6d7966d90 100644 --- a/app/src/main/java/com/nextcloud/talk/polls/adapters/PollCreateOptionViewHolder.kt +++ b/app/src/main/java/com/nextcloud/talk/polls/adapters/PollCreateOptionViewHolder.kt @@ -12,7 +12,7 @@ class PollCreateOptionViewHolder( ) : RecyclerView.ViewHolder(binding.root) { lateinit var optionText: EmojiTextInputEditText - var textListener: TextWatcher? = null + private var textListener: TextWatcher? = null @SuppressLint("SetTextI18n") fun bind( diff --git a/app/src/main/java/com/nextcloud/talk/polls/adapters/PollResultHeaderItem.kt b/app/src/main/java/com/nextcloud/talk/polls/adapters/PollResultHeaderItem.kt index a0dd6bfd3..3960e2824 100644 --- a/app/src/main/java/com/nextcloud/talk/polls/adapters/PollResultHeaderItem.kt +++ b/app/src/main/java/com/nextcloud/talk/polls/adapters/PollResultHeaderItem.kt @@ -14,6 +14,6 @@ data class PollResultHeaderItem( companion object { // layout is used as view type for uniqueness - public val VIEW_TYPE: Int = R.layout.poll_result_header_item + const val VIEW_TYPE: Int = R.layout.poll_result_header_item } } diff --git a/app/src/main/java/com/nextcloud/talk/polls/adapters/PollResultHeaderViewHolder.kt b/app/src/main/java/com/nextcloud/talk/polls/adapters/PollResultHeaderViewHolder.kt index 0c73ac55e..a1ae4d9e4 100644 --- a/app/src/main/java/com/nextcloud/talk/polls/adapters/PollResultHeaderViewHolder.kt +++ b/app/src/main/java/com/nextcloud/talk/polls/adapters/PollResultHeaderViewHolder.kt @@ -3,10 +3,8 @@ package com.nextcloud.talk.polls.adapters import android.annotation.SuppressLint import android.graphics.Typeface import com.nextcloud.talk.databinding.PollResultHeaderItemBinding -import com.nextcloud.talk.models.database.UserEntity class PollResultHeaderViewHolder( - private val user: UserEntity, override val binding: PollResultHeaderItemBinding ) : PollResultViewHolder(binding) { diff --git a/app/src/main/java/com/nextcloud/talk/polls/adapters/PollResultItem.kt b/app/src/main/java/com/nextcloud/talk/polls/adapters/PollResultItem.kt index 8349c2886..932d11028 100644 --- a/app/src/main/java/com/nextcloud/talk/polls/adapters/PollResultItem.kt +++ b/app/src/main/java/com/nextcloud/talk/polls/adapters/PollResultItem.kt @@ -1,7 +1,5 @@ package com.nextcloud.talk.polls.adapters interface PollResultItem { - fun getViewType(): Int - // fun getView(inflater: LayoutInflater?, convertView: View?): View? -} \ No newline at end of file +} diff --git a/app/src/main/java/com/nextcloud/talk/polls/adapters/PollResultVoterItem.kt b/app/src/main/java/com/nextcloud/talk/polls/adapters/PollResultVoterItem.kt index e05943f09..d00dda861 100644 --- a/app/src/main/java/com/nextcloud/talk/polls/adapters/PollResultVoterItem.kt +++ b/app/src/main/java/com/nextcloud/talk/polls/adapters/PollResultVoterItem.kt @@ -13,6 +13,6 @@ data class PollResultVoterItem( companion object { // layout is used as view type for uniqueness - public val VIEW_TYPE: Int = R.layout.poll_result_voter_item + const val VIEW_TYPE: Int = R.layout.poll_result_voter_item } } diff --git a/app/src/main/java/com/nextcloud/talk/polls/adapters/PollResultVoterViewHolder.kt b/app/src/main/java/com/nextcloud/talk/polls/adapters/PollResultVoterViewHolder.kt index 1e105e216..174951174 100644 --- a/app/src/main/java/com/nextcloud/talk/polls/adapters/PollResultVoterViewHolder.kt +++ b/app/src/main/java/com/nextcloud/talk/polls/adapters/PollResultVoterViewHolder.kt @@ -20,24 +20,7 @@ class PollResultVoterViewHolder( @SuppressLint("SetTextI18n") override fun bind(pollResultItem: PollResultItem, clickListener: PollResultItemClickListener) { val item = pollResultItem as PollResultVoterItem - - // binding.root.setOnClickListener { clickListener.onClick(pollResultVoterItem) } - - // binding.pollVoterAvatar = pollResultHeaderItem.name binding.pollVoterName.text = item.details.actorDisplayName - - // val lp = LinearLayout.LayoutParams( - // 60, - // 50 - // ) - // - // val avatar = SimpleDraweeView(binding.root.context) - // avatar.layoutParams = lp - - // val roundingParams = RoundingParams.fromCornersRadius(5f) - // roundingParams.roundAsCircle = true - // - // binding.pollVoterAvatar.hierarchy.roundingParams = roundingParams binding.pollVoterAvatar.controller = getAvatarDraweeController(item.details) } @@ -47,8 +30,7 @@ class PollResultVoterViewHolder( if (!TextUtils.isEmpty(pollDetail.actorDisplayName)) { displayName = pollDetail.actorDisplayName!! } - val draweeController: DraweeController = Fresco.newDraweeControllerBuilder() - // .setOldController(binding.avatar.controller) + return Fresco.newDraweeControllerBuilder() .setAutoPlayAnimations(true) .setImageRequest( DisplayUtils.getImageRequestForUrl( @@ -61,10 +43,8 @@ class PollResultVoterViewHolder( ) ) .build() - return draweeController } else if (pollDetail.actorType == "users") { - val draweeController: DraweeController = Fresco.newDraweeControllerBuilder() - // .setOldController(binding.avatar.controller) + return Fresco.newDraweeControllerBuilder() .setAutoPlayAnimations(true) .setImageRequest( DisplayUtils.getImageRequestForUrl( @@ -77,7 +57,6 @@ class PollResultVoterViewHolder( ) ) .build() - return draweeController } return null } diff --git a/app/src/main/java/com/nextcloud/talk/polls/adapters/PollResultsAdapter.kt b/app/src/main/java/com/nextcloud/talk/polls/adapters/PollResultsAdapter.kt index 153a198e5..a9753b596 100644 --- a/app/src/main/java/com/nextcloud/talk/polls/adapters/PollResultsAdapter.kt +++ b/app/src/main/java/com/nextcloud/talk/polls/adapters/PollResultsAdapter.kt @@ -20,7 +20,7 @@ class PollResultsAdapter( LayoutInflater.from(parent.context), parent, false ) - return PollResultHeaderViewHolder(user, itemBinding) + return PollResultHeaderViewHolder(itemBinding) } PollResultVoterItem.VIEW_TYPE -> { val itemBinding = PollResultVoterItemBinding.inflate( @@ -32,7 +32,7 @@ class PollResultsAdapter( } val itemBinding = PollResultHeaderItemBinding.inflate(LayoutInflater.from(parent.context), parent, false) - return PollResultHeaderViewHolder(user, itemBinding) + return PollResultHeaderViewHolder(itemBinding) } override fun onBindViewHolder(holder: PollResultViewHolder, position: Int) { 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 60939718c..873e57b63 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 @@ -119,7 +119,7 @@ class PollRepositoryImpl(private val ncApi: NcApi, private val currentUserProvid private fun mapToPoll(pollResponse: PollResponse): Poll { val pollDetails = pollResponse.details?.map { it -> mapToPollDetails(it) } - val poll = Poll( + return Poll( pollResponse.id, pollResponse.question, pollResponse.options, @@ -134,7 +134,6 @@ class PollRepositoryImpl(private val ncApi: NcApi, private val currentUserProvid pollResponse.numVoters, pollDetails, ) - return poll } private fun convertVotes(votes: Map<String, Int>?): Map<String, Int> { diff --git a/app/src/main/java/com/nextcloud/talk/polls/ui/PollCreateDialogFragment.kt b/app/src/main/java/com/nextcloud/talk/polls/ui/PollCreateDialogFragment.kt index 35bd6648f..1a39a35b3 100644 --- a/app/src/main/java/com/nextcloud/talk/polls/ui/PollCreateDialogFragment.kt +++ b/app/src/main/java/com/nextcloud/talk/polls/ui/PollCreateDialogFragment.kt @@ -48,14 +48,12 @@ class PollCreateDialogFragment( override fun onCreateDialog(savedInstanceState: Bundle?): Dialog { binding = DialogPollCreateBinding.inflate(LayoutInflater.from(context)) - val dialog = AlertDialog.Builder(requireContext()) + return AlertDialog.Builder(requireContext()) .setView(binding.root) .create() - - return dialog } - override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? { + override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View { return binding.root } @@ -81,7 +79,7 @@ class PollCreateDialogFragment( private fun setupListeners() { binding.pollAddOptionsItem.setOnClickListener { viewModel.addOption() - adapter?.itemCount?.minus(1)?.let { it -> binding.pollCreateOptionsList.scrollToPosition(it) } + adapter?.itemCount?.minus(1)?.let { binding.pollCreateOptionsList.scrollToPosition(it) } } binding.pollDismiss.setOnClickListener { @@ -135,8 +133,8 @@ class PollCreateDialogFragment( private fun showError() { dismiss() - Toast.makeText(context, R.string.nc_common_error_sorry, Toast.LENGTH_LONG).show() Log.e(TAG, "Failed to create poll") + Toast.makeText(context, R.string.nc_common_error_sorry, Toast.LENGTH_LONG).show() } override fun onRemoveOptionsItemClick(pollCreateOptionItem: PollCreateOptionItem, position: Int) { 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 88859b881..252764950 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 @@ -52,7 +52,7 @@ class PollMainDialogFragment( return dialog } - override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? { + override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View { return binding.root } @@ -64,7 +64,7 @@ class PollMainDialogFragment( PollMainViewModel.InitialState -> {} is PollMainViewModel.PollVoteHiddenState -> { binding.pollDetailsText.visibility = View.VISIBLE - binding.pollDetailsText.text = "You already voted for this private poll" + binding.pollDetailsText.text = context?.resources?.getString(R.string.polls_private_voted) showVoteScreen() } is PollMainViewModel.PollVoteState -> { @@ -94,9 +94,7 @@ class PollMainDialogFragment( val contentFragment = PollResultsFragment( user, - viewModel, - roomToken, - pollId + viewModel ) val transaction = childFragmentManager.beginTransaction() transaction.replace(binding.messagePollContentFragment.id, contentFragment) diff --git a/app/src/main/java/com/nextcloud/talk/polls/ui/PollResultsFragment.kt b/app/src/main/java/com/nextcloud/talk/polls/ui/PollResultsFragment.kt index fa97a6b25..3f8a657af 100644 --- a/app/src/main/java/com/nextcloud/talk/polls/ui/PollResultsFragment.kt +++ b/app/src/main/java/com/nextcloud/talk/polls/ui/PollResultsFragment.kt @@ -21,7 +21,6 @@ package com.nextcloud.talk.polls.ui -import android.content.DialogInterface import android.os.Bundle import android.view.LayoutInflater import android.view.View @@ -45,9 +44,7 @@ import javax.inject.Inject @AutoInjector(NextcloudTalkApplication::class) class PollResultsFragment( private val user: UserEntity, - private val parentViewModel: PollMainViewModel, - private val roomToken: String, - private val pollId: String + private val parentViewModel: PollMainViewModel ) : Fragment(), PollResultItemClickListener { @Inject @@ -55,9 +52,7 @@ class PollResultsFragment( lateinit var viewModel: PollResultsViewModel - var _binding: DialogPollResultsBinding? = null - val binding: DialogPollResultsBinding - get() = _binding!! + lateinit var binding: DialogPollResultsBinding private var adapter: PollResultsAdapter? = null @@ -72,7 +67,7 @@ class PollResultsFragment( container: ViewGroup?, savedInstanceState: Bundle? ): View { - _binding = DialogPollResultsBinding.inflate(inflater, container, false) + binding = DialogPollResultsBinding.inflate(inflater, container, false) return binding.root } @@ -98,49 +93,40 @@ class PollResultsFragment( private fun initAdapter() { adapter = PollResultsAdapter(user, this) - _binding?.pollResultsList?.adapter = adapter - _binding?.pollResultsList?.layoutManager = LinearLayoutManager(context) + binding.pollResultsList.adapter = adapter + binding.pollResultsList.layoutManager = LinearLayoutManager(context) } private fun initEditButton(showEditButton: Boolean) { if (showEditButton) { - _binding?.editVoteButton?.visibility = View.VISIBLE - _binding?.editVoteButton?.setOnClickListener { + binding.editVoteButton.visibility = View.VISIBLE + binding.editVoteButton.setOnClickListener { parentViewModel.edit() } } else { - _binding?.editVoteButton?.visibility = View.GONE + binding.editVoteButton.visibility = View.GONE } } private fun initEndPollButton(showEndPollButton: Boolean) { if (showEndPollButton) { - _binding?.pollResultsEndPollButton?.visibility = View.VISIBLE - _binding?.pollResultsEndPollButton?.setOnClickListener { + binding.pollResultsEndPollButton.visibility = View.VISIBLE + binding.pollResultsEndPollButton.setOnClickListener { AlertDialog.Builder(requireContext()) .setTitle(R.string.polls_end_poll) .setMessage(R.string.polls_end_poll_confirm) - .setPositiveButton(R.string.polls_end_poll, DialogInterface.OnClickListener { _, _ -> + .setPositiveButton(R.string.polls_end_poll) { _, _ -> parentViewModel.closePoll() - }) + } .setNegativeButton(R.string.nc_cancel, null) .show() } } else { - _binding?.pollResultsEndPollButton?.visibility = View.GONE + binding.pollResultsEndPollButton.visibility = View.GONE } } override fun onClick(pollResultHeaderItem: PollResultHeaderItem) { viewModel.filterItems() } - - override fun onDestroyView() { - super.onDestroyView() - _binding = null - } - - companion object { - private val TAG = PollResultsFragment::class.java.simpleName - } } 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 eb805889e..fba95b230 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 @@ -21,7 +21,6 @@ package com.nextcloud.talk.polls.ui -import android.content.DialogInterface import android.graphics.Typeface import android.os.Bundle import android.util.Log @@ -56,9 +55,7 @@ class PollVoteFragment( lateinit var viewModel: PollVoteViewModel - var _binding: DialogPollVoteBinding? = null - val binding: DialogPollVoteBinding - get() = _binding!! + private lateinit var binding: DialogPollVoteBinding override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) @@ -71,7 +68,7 @@ class PollVoteFragment( container: ViewGroup?, savedInstanceState: Bundle? ): View { - _binding = DialogPollVoteBinding.inflate(inflater, container, false) + binding = DialogPollVoteBinding.inflate(inflater, container, false) return binding.root } @@ -93,7 +90,8 @@ class PollVoteFragment( when (state) { PollVoteViewModel.InitialState -> {} is PollVoteViewModel.PollVoteFailedState -> { - Log.d(TAG, "fail") + Log.e(TAG, "Failed to vote on poll.") + Toast.makeText(context, R.string.nc_common_error_sorry, Toast.LENGTH_LONG).show() } is PollVoteViewModel.PollVoteSuccessState -> { parentViewModel.voted() @@ -101,7 +99,7 @@ class PollVoteFragment( } } - binding.pollVoteRadioGroup.setOnCheckedChangeListener { group, checkedId -> + binding.pollVoteRadioGroup.setOnCheckedChangeListener { _, checkedId -> viewModel.selectOption(checkedId, true) updateSubmitButton() } @@ -135,13 +133,13 @@ class PollVoteFragment( binding.voteOptionsCheckboxesWrapper.addView(checkBox) checkBox.isChecked = viewModel.selectedOptions.contains(index) == true - checkBox.setOnCheckedChangeListener { buttonView, isChecked -> + checkBox.setOnCheckedChangeListener { _, isChecked -> if (isChecked) { if (poll.maxVotes == UNLIMITED_VOTES || viewModel.selectedOptions.size < poll.maxVotes) { viewModel.selectOption(index, false) } else { checkBox.isChecked = false - Toast.makeText(context, "max votes reached", Toast.LENGTH_LONG).show() + Toast.makeText(context, R.string.polls_max_votes_reached, Toast.LENGTH_LONG).show() } } else { viewModel.deSelectOption(index) @@ -170,27 +168,22 @@ class PollVoteFragment( private fun initEndPollButton(showEndPollButton: Boolean) { if (showEndPollButton) { - _binding?.pollVoteEndPollButton?.visibility = View.VISIBLE - _binding?.pollVoteEndPollButton?.setOnClickListener { + binding.pollVoteEndPollButton.visibility = View.VISIBLE + binding.pollVoteEndPollButton.setOnClickListener { AlertDialog.Builder(requireContext()) .setTitle(R.string.polls_end_poll) .setMessage(R.string.polls_end_poll_confirm) - .setPositiveButton(R.string.polls_end_poll, DialogInterface.OnClickListener { _, _ -> + .setPositiveButton(R.string.polls_end_poll) { _, _ -> parentViewModel.closePoll() - }) + } .setNegativeButton(R.string.nc_cancel, null) .show() } } else { - _binding?.pollVoteEndPollButton?.visibility = View.GONE + binding.pollVoteEndPollButton.visibility = View.GONE } } - override fun onDestroyView() { - super.onDestroyView() - _binding = null - } - companion object { private val TAG = PollVoteFragment::class.java.simpleName private const val UNLIMITED_VOTES = 0 diff --git a/app/src/main/java/com/nextcloud/talk/polls/viewmodels/PollCreateViewModel.kt b/app/src/main/java/com/nextcloud/talk/polls/viewmodels/PollCreateViewModel.kt index 341618d93..08f6147ce 100644 --- a/app/src/main/java/com/nextcloud/talk/polls/viewmodels/PollCreateViewModel.kt +++ b/app/src/main/java/com/nextcloud/talk/polls/viewmodels/PollCreateViewModel.kt @@ -1,5 +1,6 @@ package com.nextcloud.talk.polls.viewmodels +import android.util.Log import androidx.lifecycle.LiveData import androidx.lifecycle.MutableLiveData import androidx.lifecycle.ViewModel @@ -21,7 +22,12 @@ class PollCreateViewModel @Inject constructor(private val repository: PollReposi object PollCreatedState : ViewState object PollCreationFailedState : ViewState - private val _viewState: MutableLiveData<ViewState> = MutableLiveData(PollCreationState(true, false)) + private val _viewState: MutableLiveData<ViewState> = MutableLiveData( + PollCreationState( + enableAddOptionButton = true, + enableCreatePollButton = false + ) + ) val viewState: LiveData<ViewState> get() = _viewState @@ -154,6 +160,7 @@ class PollCreateViewModel @Inject constructor(private val repository: PollReposi } override fun onError(e: Throwable) { + Log.e(TAG, "Failed to create poll", e) _viewState.value = PollCreationFailedState } diff --git a/app/src/main/java/com/nextcloud/talk/polls/viewmodels/PollResultsViewModel.kt b/app/src/main/java/com/nextcloud/talk/polls/viewmodels/PollResultsViewModel.kt index 869fdbbf3..688b89efa 100644 --- a/app/src/main/java/com/nextcloud/talk/polls/viewmodels/PollResultsViewModel.kt +++ b/app/src/main/java/com/nextcloud/talk/polls/viewmodels/PollResultsViewModel.kt @@ -21,6 +21,7 @@ package com.nextcloud.talk.polls.viewmodels +import android.util.Log import androidx.lifecycle.LiveData import androidx.lifecycle.MutableLiveData import androidx.lifecycle.ViewModel @@ -28,11 +29,10 @@ import com.nextcloud.talk.polls.adapters.PollResultHeaderItem import com.nextcloud.talk.polls.adapters.PollResultItem import com.nextcloud.talk.polls.adapters.PollResultVoterItem import com.nextcloud.talk.polls.model.Poll -import com.nextcloud.talk.polls.repositories.PollRepository import io.reactivex.disposables.Disposable import javax.inject.Inject -class PollResultsViewModel @Inject constructor(private val repository: PollRepository) : ViewModel() { +class PollResultsViewModel @Inject constructor() : ViewModel() { sealed interface ViewState object InitialState : ViewState @@ -103,6 +103,7 @@ class PollResultsViewModel @Inject constructor(private val repository: PollRepos } else if (poll.votes != null) { return poll.numVoters } + Log.e(TAG, "something went wrong while getting amount of voters.") return 0 } diff --git a/app/src/main/java/com/nextcloud/talk/polls/viewmodels/PollVoteViewModel.kt b/app/src/main/java/com/nextcloud/talk/polls/viewmodels/PollVoteViewModel.kt index 891db9515..f87c8c3f9 100644 --- a/app/src/main/java/com/nextcloud/talk/polls/viewmodels/PollVoteViewModel.kt +++ b/app/src/main/java/com/nextcloud/talk/polls/viewmodels/PollVoteViewModel.kt @@ -38,7 +38,7 @@ class PollVoteViewModel @Inject constructor(private val repository: PollReposito sealed interface ViewState object InitialState : ViewState open class PollVoteSuccessState(val poll: Poll) : ViewState - open class PollVoteFailedState() : ViewState + open class PollVoteFailedState : ViewState private val _viewState: MutableLiveData<ViewState> = MutableLiveData(InitialState) val viewState: LiveData<ViewState> @@ -60,10 +60,10 @@ class PollVoteViewModel @Inject constructor(private val repository: PollReposito } fun selectOption(option: Int, isRadioBox: Boolean) { - if (isRadioBox) { - _selectedOptions = listOf(option) + _selectedOptions = if (isRadioBox) { + listOf(option) } else { - _selectedOptions = _selectedOptions.plus(option) + _selectedOptions.plus(option) } } @@ -97,7 +97,7 @@ class PollVoteViewModel @Inject constructor(private val repository: PollReposito } override fun onError(e: Throwable) { - Log.d(TAG, "An error occurred: $e") + Log.e(TAG, "An error occurred: $e") _viewState.value = PollVoteFailedState() } diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 8c950648b..fc1cfc355 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -539,8 +539,10 @@ <!-- Polls --> <string name="polls_amount_voters">Poll results - %1$s votes</string> <string name="polls_add_option">Add Option</string> + <string name="polls_private_voted">You successfully voted for this private poll.</string> <string name="polls_end_poll">End Poll</string> <string name="polls_end_poll_confirm">Do you really want to end this poll? This can\'t be undone.</string> + <string name="polls_max_votes_reached">You can\'t vote with more options for this poll.</string> <string name="title_attachments">Attachments</string>