From 5609f5cb2ace657be339c1fb8edc44fd27d6f5d1 Mon Sep 17 00:00:00 2001 From: Aleksandr Soloshenko Date: Sun, 17 Dec 2023 15:28:16 +0700 Subject: [PATCH 1/4] Added: message details info --- .../java/me/capcom/smsgateway/MainActivity.kt | 18 ++++- .../smsgateway/modules/messages/Module.kt | 2 + .../repositories/MessagesRepository.kt | 4 ++ .../messages/vm/MessageDetailsViewModel.kt | 11 +++ .../me/capcom/smsgateway/ui/HolderFragment.kt | 42 ++++++++++++ .../smsgateway/ui/MessageDetailsFragment.kt | 67 +++++++++++++++++++ .../smsgateway/ui/MessagesListFragment.kt | 14 +++- .../ui/adapters/MessageRecipientsAdapter.kt | 63 +++++++++++++++++ .../smsgateway/ui/adapters/MessagesAdapter.kt | 15 ++++- app/src/main/res/layout/fragment_holder.xml | 9 +++ .../res/layout/fragment_message_details.xml | 63 +++++++++++++++++ app/src/main/res/layout/item_message.xml | 1 + 12 files changed, 302 insertions(+), 7 deletions(-) create mode 100644 app/src/main/java/me/capcom/smsgateway/modules/messages/vm/MessageDetailsViewModel.kt create mode 100644 app/src/main/java/me/capcom/smsgateway/ui/HolderFragment.kt create mode 100644 app/src/main/java/me/capcom/smsgateway/ui/MessageDetailsFragment.kt create mode 100644 app/src/main/java/me/capcom/smsgateway/ui/adapters/MessageRecipientsAdapter.kt create mode 100644 app/src/main/res/layout/fragment_holder.xml create mode 100644 app/src/main/res/layout/fragment_message_details.xml diff --git a/app/src/main/java/me/capcom/smsgateway/MainActivity.kt b/app/src/main/java/me/capcom/smsgateway/MainActivity.kt index ecf17ba..a550d26 100644 --- a/app/src/main/java/me/capcom/smsgateway/MainActivity.kt +++ b/app/src/main/java/me/capcom/smsgateway/MainActivity.kt @@ -1,11 +1,12 @@ package me.capcom.smsgateway import android.os.Bundle +import androidx.activity.addCallback import androidx.appcompat.app.AppCompatActivity import androidx.fragment.app.Fragment import com.google.android.material.tabs.TabLayoutMediator import me.capcom.smsgateway.databinding.ActivityMainBinding -import me.capcom.smsgateway.ui.MessagesListFragment +import me.capcom.smsgateway.ui.HolderFragment import me.capcom.smsgateway.ui.SettingsFragment class MainActivity : AppCompatActivity() { @@ -18,7 +19,8 @@ class MainActivity : AppCompatActivity() { binding = ActivityMainBinding.inflate(layoutInflater) setContentView(binding.root) - binding.viewPager.adapter = FragmentsAdapter(this) + val adapter = FragmentsAdapter(this) + binding.viewPager.adapter = adapter TabLayoutMediator(binding.tabLayout, binding.viewPager) { tab, position -> when (position) { @@ -33,16 +35,26 @@ class MainActivity : AppCompatActivity() { } } }.attach() + + onBackPressedDispatcher.addCallback { + if (binding.viewPager.currentItem == 1) { + adapter.holderFragment.onBackPressed() + return@addCallback + } + this.handleOnBackPressed() + } } class FragmentsAdapter(activity: AppCompatActivity) : androidx.viewpager2.adapter.FragmentStateAdapter(activity) { + val holderFragment = HolderFragment.newInstance() + override fun getItemCount(): Int = 2 override fun createFragment(position: Int): Fragment { return when (position) { 0 -> SettingsFragment.newInstance() - else -> MessagesListFragment.newInstance() + else -> holderFragment } } diff --git a/app/src/main/java/me/capcom/smsgateway/modules/messages/Module.kt b/app/src/main/java/me/capcom/smsgateway/modules/messages/Module.kt index 6427b18..eb8261c 100644 --- a/app/src/main/java/me/capcom/smsgateway/modules/messages/Module.kt +++ b/app/src/main/java/me/capcom/smsgateway/modules/messages/Module.kt @@ -1,6 +1,7 @@ package me.capcom.smsgateway.modules.messages import me.capcom.smsgateway.modules.messages.repositories.MessagesRepository +import me.capcom.smsgateway.modules.messages.vm.MessageDetailsViewModel import me.capcom.smsgateway.modules.messages.vm.MessagesListViewModel import org.koin.androidx.viewmodel.dsl.viewModel import org.koin.dsl.module @@ -9,4 +10,5 @@ val messagesModule = module { single { MessagesRepository(get()) } single { MessagesService(get(), get()) } viewModel { MessagesListViewModel(get()) } + viewModel { MessageDetailsViewModel(get()) } } \ No newline at end of file diff --git a/app/src/main/java/me/capcom/smsgateway/modules/messages/repositories/MessagesRepository.kt b/app/src/main/java/me/capcom/smsgateway/modules/messages/repositories/MessagesRepository.kt index 2a878ad..aebbff8 100644 --- a/app/src/main/java/me/capcom/smsgateway/modules/messages/repositories/MessagesRepository.kt +++ b/app/src/main/java/me/capcom/smsgateway/modules/messages/repositories/MessagesRepository.kt @@ -1,7 +1,11 @@ package me.capcom.smsgateway.modules.messages.repositories +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.withContext import me.capcom.smsgateway.data.dao.MessageDao class MessagesRepository(private val dao: MessageDao) { val lastMessages = dao.selectLast() + + suspend fun get(id: String) = withContext(Dispatchers.IO) { dao.get(id) } } \ No newline at end of file diff --git a/app/src/main/java/me/capcom/smsgateway/modules/messages/vm/MessageDetailsViewModel.kt b/app/src/main/java/me/capcom/smsgateway/modules/messages/vm/MessageDetailsViewModel.kt new file mode 100644 index 0000000..3d1bb2a --- /dev/null +++ b/app/src/main/java/me/capcom/smsgateway/modules/messages/vm/MessageDetailsViewModel.kt @@ -0,0 +1,11 @@ +package me.capcom.smsgateway.modules.messages.vm + +import androidx.lifecycle.ViewModel +import androidx.lifecycle.liveData +import me.capcom.smsgateway.modules.messages.repositories.MessagesRepository + +class MessageDetailsViewModel( + private val messagesRepo: MessagesRepository +) : ViewModel() { + fun get(id: String) = liveData { emit(messagesRepo.get(id)) } +} \ No newline at end of file diff --git a/app/src/main/java/me/capcom/smsgateway/ui/HolderFragment.kt b/app/src/main/java/me/capcom/smsgateway/ui/HolderFragment.kt new file mode 100644 index 0000000..9b12551 --- /dev/null +++ b/app/src/main/java/me/capcom/smsgateway/ui/HolderFragment.kt @@ -0,0 +1,42 @@ +package me.capcom.smsgateway.ui + +import android.os.Bundle +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import androidx.fragment.app.Fragment +import androidx.fragment.app.commit +import me.capcom.smsgateway.R + +class HolderFragment : Fragment() { + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + } + + override fun onCreateView( + inflater: LayoutInflater, container: ViewGroup?, + savedInstanceState: Bundle? + ): View? { + // Inflate the layout for this fragment + return inflater.inflate(R.layout.fragment_holder, container, false) + } + + override fun onViewCreated(view: View, savedInstanceState: Bundle?) { + super.onViewCreated(view, savedInstanceState) + + childFragmentManager.commit { + add(R.id.rootLayout, MessagesListFragment.newInstance()) + } + } + + fun onBackPressed(): Unit { + childFragmentManager.popBackStack() + } + + companion object { + fun newInstance() = + HolderFragment().apply { + + } + } +} \ No newline at end of file diff --git a/app/src/main/java/me/capcom/smsgateway/ui/MessageDetailsFragment.kt b/app/src/main/java/me/capcom/smsgateway/ui/MessageDetailsFragment.kt new file mode 100644 index 0000000..bb5060f --- /dev/null +++ b/app/src/main/java/me/capcom/smsgateway/ui/MessageDetailsFragment.kt @@ -0,0 +1,67 @@ +package me.capcom.smsgateway.ui + +import android.os.Bundle +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import androidx.fragment.app.Fragment +import me.capcom.smsgateway.databinding.FragmentMessageDetailsBinding +import me.capcom.smsgateway.modules.messages.vm.MessageDetailsViewModel +import me.capcom.smsgateway.ui.adapters.MessageRecipientsAdapter +import org.koin.androidx.viewmodel.ext.android.viewModel + +class MessageDetailsFragment : Fragment() { + private val viewModel: MessageDetailsViewModel by viewModel() + private var _binding: FragmentMessageDetailsBinding? = null + private val binding get() = _binding!! + + private val id: String + get() = requireNotNull(requireArguments().getString(ARG_ID)) { "id is null" } + + private val recipientsAdapter by lazy { MessageRecipientsAdapter() } + + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + } + + override fun onCreateView( + inflater: LayoutInflater, container: ViewGroup?, + savedInstanceState: Bundle? + ): View? { + // Inflate the layout for this fragment + _binding = FragmentMessageDetailsBinding.inflate(inflater, container, false) + return binding.root + } + + override fun onViewCreated(view: View, savedInstanceState: Bundle?) { + super.onViewCreated(view, savedInstanceState) + + binding.recyclerViewRecipients.adapter = recipientsAdapter + + viewModel.get(id).observe(viewLifecycleOwner) { + if (it == null) { + return@observe + } + + binding.textMessageId.text = it.message.id + binding.textMessage.text = it.message.text + binding.textMessageState.text = it.state.name + recipientsAdapter.submitList(it.recipients) + } + } + + override fun onDestroyView() { + super.onDestroyView() + _binding = null + } + + companion object { + private const val ARG_ID = "id" + fun newInstance(id: String) = + MessageDetailsFragment().apply { + arguments = Bundle().apply { + putString(ARG_ID, id) + } + } + } +} \ No newline at end of file diff --git a/app/src/main/java/me/capcom/smsgateway/ui/MessagesListFragment.kt b/app/src/main/java/me/capcom/smsgateway/ui/MessagesListFragment.kt index bf57de3..231fb79 100644 --- a/app/src/main/java/me/capcom/smsgateway/ui/MessagesListFragment.kt +++ b/app/src/main/java/me/capcom/smsgateway/ui/MessagesListFragment.kt @@ -5,16 +5,19 @@ import android.view.LayoutInflater import android.view.View import android.view.ViewGroup import androidx.fragment.app.Fragment +import androidx.fragment.app.commit import androidx.recyclerview.widget.DividerItemDecoration +import me.capcom.smsgateway.R +import me.capcom.smsgateway.data.entities.Message import me.capcom.smsgateway.databinding.FragmentMessagesListBinding import me.capcom.smsgateway.modules.messages.vm.MessagesListViewModel import me.capcom.smsgateway.ui.adapters.MessagesAdapter import org.koin.androidx.viewmodel.ext.android.viewModel -class MessagesListFragment : Fragment() { +class MessagesListFragment : Fragment(), MessagesAdapter.OnItemClickListener { private val viewModel: MessagesListViewModel by viewModel() - private val messagesAdapter = MessagesAdapter() + private val messagesAdapter = MessagesAdapter(this) private var _binding: FragmentMessagesListBinding? = null private val binding get() = _binding!! @@ -55,4 +58,11 @@ class MessagesListFragment : Fragment() { fun newInstance() = MessagesListFragment() } + + override fun onItemClick(item: Message) { + parentFragmentManager.commit { + replace(R.id.rootLayout, MessageDetailsFragment.newInstance(item.id)) + addToBackStack(null) + } + } } \ No newline at end of file diff --git a/app/src/main/java/me/capcom/smsgateway/ui/adapters/MessageRecipientsAdapter.kt b/app/src/main/java/me/capcom/smsgateway/ui/adapters/MessageRecipientsAdapter.kt new file mode 100644 index 0000000..88bc18b --- /dev/null +++ b/app/src/main/java/me/capcom/smsgateway/ui/adapters/MessageRecipientsAdapter.kt @@ -0,0 +1,63 @@ +package me.capcom.smsgateway.ui.adapters + +import android.view.LayoutInflater +import android.view.ViewGroup +import androidx.recyclerview.widget.ListAdapter +import androidx.recyclerview.widget.RecyclerView +import me.capcom.smsgateway.data.entities.MessageRecipient +import me.capcom.smsgateway.databinding.ItemMessageBinding + +class MessageRecipientsAdapter : + ListAdapter( + RecipientsDiffCallback() + ) { + + override fun onCreateViewHolder( + parent: ViewGroup, + viewType: Int + ): RecipientViewHolder { + return RecipientViewHolder.create(parent) + } + + override fun onBindViewHolder(holder: RecipientViewHolder, position: Int) { + val message = getItem(position) + + holder.bind(message) + } + + class RecipientViewHolder(private val binding: ItemMessageBinding) : + RecyclerView.ViewHolder(binding.root) { + fun bind(recipient: MessageRecipient) { + binding.textViewId.text = recipient.phoneNumber + binding.textViewState.text = recipient.state.name + binding.textViewDate.text = recipient.error + } + + companion object { + fun create(parent: ViewGroup): RecipientViewHolder { + return RecipientViewHolder( + ItemMessageBinding.inflate( + LayoutInflater.from(parent.context), parent, false + ) + ) + } + } + } + + class RecipientsDiffCallback : + androidx.recyclerview.widget.DiffUtil.ItemCallback() { + override fun areItemsTheSame( + oldItem: MessageRecipient, + newItem: MessageRecipient + ): Boolean { + return oldItem.phoneNumber == newItem.phoneNumber + } + + override fun areContentsTheSame( + oldItem: MessageRecipient, + newItem: MessageRecipient + ): Boolean { + return oldItem == newItem + } + } +} \ No newline at end of file diff --git a/app/src/main/java/me/capcom/smsgateway/ui/adapters/MessagesAdapter.kt b/app/src/main/java/me/capcom/smsgateway/ui/adapters/MessagesAdapter.kt index e8a9881..4a4e2d3 100644 --- a/app/src/main/java/me/capcom/smsgateway/ui/adapters/MessagesAdapter.kt +++ b/app/src/main/java/me/capcom/smsgateway/ui/adapters/MessagesAdapter.kt @@ -10,11 +10,18 @@ import me.capcom.smsgateway.databinding.ItemMessageBinding import java.text.DateFormat import java.util.Date -class MessagesAdapter : +class MessagesAdapter( + private val onItemClickListener: OnItemClickListener +) : ListAdapter(MessageDiffCallback()) { override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): MessageViewHolder { - return MessageViewHolder.create(parent) + return MessageViewHolder.create(parent).also { holder -> + holder.itemView.setOnClickListener { + val message = getItem(holder.adapterPosition) + onItemClickListener.onItemClick(message) + } + } } override fun onBindViewHolder(holder: MessageViewHolder, position: Int) { @@ -61,4 +68,8 @@ class MessagesAdapter : return oldItem == newItem } } + + interface OnItemClickListener { + fun onItemClick(item: T) + } } \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_holder.xml b/app/src/main/res/layout/fragment_holder.xml new file mode 100644 index 0000000..96e6bbc --- /dev/null +++ b/app/src/main/res/layout/fragment_holder.xml @@ -0,0 +1,9 @@ + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_message_details.xml b/app/src/main/res/layout/fragment_message_details.xml new file mode 100644 index 0000000..038c2d1 --- /dev/null +++ b/app/src/main/res/layout/fragment_message_details.xml @@ -0,0 +1,63 @@ + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/item_message.xml b/app/src/main/res/layout/item_message.xml index cc2ecfb..e2e54f9 100644 --- a/app/src/main/res/layout/item_message.xml +++ b/app/src/main/res/layout/item_message.xml @@ -4,6 +4,7 @@ xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="wrap_content" + android:background="?android:attr/selectableItemBackground" android:minHeight="?android:attr/listPreferredItemHeight"> Date: Mon, 18 Dec 2023 23:28:27 +0700 Subject: [PATCH 2/4] Fixed: back navigation and some styles --- .../java/me/capcom/smsgateway/MainActivity.kt | 12 +----------- .../messages/vm/MessageDetailsViewModel.kt | 15 +++++++++++++-- .../me/capcom/smsgateway/ui/HolderFragment.kt | 12 ++++++------ .../smsgateway/ui/MessageDetailsFragment.kt | 15 ++++++--------- .../ui/adapters/MessageRecipientsAdapter.kt | 2 ++ .../smsgateway/ui/adapters/MessagesAdapter.kt | 12 ++---------- .../java/me/capcom/smsgateway/ui/styles/Colors.kt | 13 +++++++++++++ .../main/res/layout/fragment_message_details.xml | 6 +++--- 8 files changed, 46 insertions(+), 41 deletions(-) create mode 100644 app/src/main/java/me/capcom/smsgateway/ui/styles/Colors.kt diff --git a/app/src/main/java/me/capcom/smsgateway/MainActivity.kt b/app/src/main/java/me/capcom/smsgateway/MainActivity.kt index a550d26..d4661b4 100644 --- a/app/src/main/java/me/capcom/smsgateway/MainActivity.kt +++ b/app/src/main/java/me/capcom/smsgateway/MainActivity.kt @@ -1,7 +1,6 @@ package me.capcom.smsgateway import android.os.Bundle -import androidx.activity.addCallback import androidx.appcompat.app.AppCompatActivity import androidx.fragment.app.Fragment import com.google.android.material.tabs.TabLayoutMediator @@ -35,26 +34,17 @@ class MainActivity : AppCompatActivity() { } } }.attach() - - onBackPressedDispatcher.addCallback { - if (binding.viewPager.currentItem == 1) { - adapter.holderFragment.onBackPressed() - return@addCallback - } - this.handleOnBackPressed() - } } class FragmentsAdapter(activity: AppCompatActivity) : androidx.viewpager2.adapter.FragmentStateAdapter(activity) { - val holderFragment = HolderFragment.newInstance() override fun getItemCount(): Int = 2 override fun createFragment(position: Int): Fragment { return when (position) { 0 -> SettingsFragment.newInstance() - else -> holderFragment + else -> HolderFragment.newInstance() } } diff --git a/app/src/main/java/me/capcom/smsgateway/modules/messages/vm/MessageDetailsViewModel.kt b/app/src/main/java/me/capcom/smsgateway/modules/messages/vm/MessageDetailsViewModel.kt index 3d1bb2a..26f1e22 100644 --- a/app/src/main/java/me/capcom/smsgateway/modules/messages/vm/MessageDetailsViewModel.kt +++ b/app/src/main/java/me/capcom/smsgateway/modules/messages/vm/MessageDetailsViewModel.kt @@ -1,11 +1,22 @@ package me.capcom.smsgateway.modules.messages.vm +import androidx.lifecycle.LiveData +import androidx.lifecycle.MutableLiveData import androidx.lifecycle.ViewModel -import androidx.lifecycle.liveData +import androidx.lifecycle.viewModelScope +import kotlinx.coroutines.launch +import me.capcom.smsgateway.data.entities.MessageWithRecipients import me.capcom.smsgateway.modules.messages.repositories.MessagesRepository class MessageDetailsViewModel( private val messagesRepo: MessagesRepository ) : ViewModel() { - fun get(id: String) = liveData { emit(messagesRepo.get(id)) } + private val _message = MutableLiveData() + val message: LiveData = _message + + fun get(id: String) { + viewModelScope.launch { + _message.value = messagesRepo.get(id) + } + } } \ No newline at end of file diff --git a/app/src/main/java/me/capcom/smsgateway/ui/HolderFragment.kt b/app/src/main/java/me/capcom/smsgateway/ui/HolderFragment.kt index 9b12551..2728948 100644 --- a/app/src/main/java/me/capcom/smsgateway/ui/HolderFragment.kt +++ b/app/src/main/java/me/capcom/smsgateway/ui/HolderFragment.kt @@ -1,5 +1,6 @@ package me.capcom.smsgateway.ui +import android.content.Context import android.os.Bundle import android.view.LayoutInflater import android.view.View @@ -9,8 +10,11 @@ import androidx.fragment.app.commit import me.capcom.smsgateway.R class HolderFragment : Fragment() { - override fun onCreate(savedInstanceState: Bundle?) { - super.onCreate(savedInstanceState) + override fun onAttach(context: Context) { + super.onAttach(context) + parentFragmentManager.commit { + setPrimaryNavigationFragment(this@HolderFragment) + } } override fun onCreateView( @@ -29,10 +33,6 @@ class HolderFragment : Fragment() { } } - fun onBackPressed(): Unit { - childFragmentManager.popBackStack() - } - companion object { fun newInstance() = HolderFragment().apply { diff --git a/app/src/main/java/me/capcom/smsgateway/ui/MessageDetailsFragment.kt b/app/src/main/java/me/capcom/smsgateway/ui/MessageDetailsFragment.kt index bb5060f..3229d4f 100644 --- a/app/src/main/java/me/capcom/smsgateway/ui/MessageDetailsFragment.kt +++ b/app/src/main/java/me/capcom/smsgateway/ui/MessageDetailsFragment.kt @@ -5,6 +5,7 @@ import android.view.LayoutInflater import android.view.View import android.view.ViewGroup import androidx.fragment.app.Fragment +import androidx.recyclerview.widget.DividerItemDecoration import me.capcom.smsgateway.databinding.FragmentMessageDetailsBinding import me.capcom.smsgateway.modules.messages.vm.MessageDetailsViewModel import me.capcom.smsgateway.ui.adapters.MessageRecipientsAdapter @@ -20,10 +21,6 @@ class MessageDetailsFragment : Fragment() { private val recipientsAdapter by lazy { MessageRecipientsAdapter() } - override fun onCreate(savedInstanceState: Bundle?) { - super.onCreate(savedInstanceState) - } - override fun onCreateView( inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle? @@ -37,17 +34,17 @@ class MessageDetailsFragment : Fragment() { super.onViewCreated(view, savedInstanceState) binding.recyclerViewRecipients.adapter = recipientsAdapter + binding.recyclerViewRecipients.addItemDecoration( + DividerItemDecoration(requireContext(), DividerItemDecoration.VERTICAL) + ) - viewModel.get(id).observe(viewLifecycleOwner) { - if (it == null) { - return@observe - } - + viewModel.message.observe(viewLifecycleOwner) { binding.textMessageId.text = it.message.id binding.textMessage.text = it.message.text binding.textMessageState.text = it.state.name recipientsAdapter.submitList(it.recipients) } + viewModel.get(id) } override fun onDestroyView() { diff --git a/app/src/main/java/me/capcom/smsgateway/ui/adapters/MessageRecipientsAdapter.kt b/app/src/main/java/me/capcom/smsgateway/ui/adapters/MessageRecipientsAdapter.kt index 88bc18b..4e6247c 100644 --- a/app/src/main/java/me/capcom/smsgateway/ui/adapters/MessageRecipientsAdapter.kt +++ b/app/src/main/java/me/capcom/smsgateway/ui/adapters/MessageRecipientsAdapter.kt @@ -6,6 +6,7 @@ import androidx.recyclerview.widget.ListAdapter import androidx.recyclerview.widget.RecyclerView import me.capcom.smsgateway.data.entities.MessageRecipient import me.capcom.smsgateway.databinding.ItemMessageBinding +import me.capcom.smsgateway.ui.styles.color class MessageRecipientsAdapter : ListAdapter( @@ -31,6 +32,7 @@ class MessageRecipientsAdapter : binding.textViewId.text = recipient.phoneNumber binding.textViewState.text = recipient.state.name binding.textViewDate.text = recipient.error + binding.imageViewState.setColorFilter(recipient.state.color) } companion object { diff --git a/app/src/main/java/me/capcom/smsgateway/ui/adapters/MessagesAdapter.kt b/app/src/main/java/me/capcom/smsgateway/ui/adapters/MessagesAdapter.kt index 4a4e2d3..8745e7f 100644 --- a/app/src/main/java/me/capcom/smsgateway/ui/adapters/MessagesAdapter.kt +++ b/app/src/main/java/me/capcom/smsgateway/ui/adapters/MessagesAdapter.kt @@ -1,12 +1,12 @@ package me.capcom.smsgateway.ui.adapters -import android.graphics.Color import android.view.LayoutInflater import android.view.ViewGroup import androidx.recyclerview.widget.ListAdapter import androidx.recyclerview.widget.RecyclerView import me.capcom.smsgateway.data.entities.Message import me.capcom.smsgateway.databinding.ItemMessageBinding +import me.capcom.smsgateway.ui.styles.color import java.text.DateFormat import java.util.Date @@ -37,15 +37,7 @@ class MessagesAdapter( binding.textViewDate.text = DateFormat.getDateTimeInstance().format(Date(message.createdAt)) binding.textViewState.text = message.state.name - val tintColor = when (message.state) { - Message.State.Pending -> Color.parseColor("#FFBB86FC") - Message.State.Processed -> Color.parseColor("#FF6200EE") - Message.State.Sent -> Color.parseColor("#FF3700B3") - Message.State.Delivered -> Color.parseColor("#FF03DAC5") - Message.State.Failed -> Color.parseColor("#FF018786") - } - - binding.imageViewState.setColorFilter(tintColor) + binding.imageViewState.setColorFilter(message.state.color) } companion object { diff --git a/app/src/main/java/me/capcom/smsgateway/ui/styles/Colors.kt b/app/src/main/java/me/capcom/smsgateway/ui/styles/Colors.kt new file mode 100644 index 0000000..d8edd62 --- /dev/null +++ b/app/src/main/java/me/capcom/smsgateway/ui/styles/Colors.kt @@ -0,0 +1,13 @@ +package me.capcom.smsgateway.ui.styles + +import android.graphics.Color +import me.capcom.smsgateway.data.entities.Message + +val Message.State.color: Int + get() = when (this) { + Message.State.Pending -> Color.parseColor("#FFBB86FC") + Message.State.Processed -> Color.parseColor("#FF6200EE") + Message.State.Sent -> Color.parseColor("#FF3700B3") + Message.State.Delivered -> Color.parseColor("#FF03DAC5") + Message.State.Failed -> Color.parseColor("#FF018786") + } \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_message_details.xml b/app/src/main/res/layout/fragment_message_details.xml index 038c2d1..2758f01 100644 --- a/app/src/main/res/layout/fragment_message_details.xml +++ b/app/src/main/res/layout/fragment_message_details.xml @@ -20,7 +20,7 @@ android:layout_width="0dp" android:layout_height="wrap_content" android:layout_weight="1" - android:text="Message ID" + tools:text="Message ID" android:textSize="18sp" android:textStyle="bold" /> @@ -30,7 +30,7 @@ android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginStart="16dp" - android:text="Message State" + tools:text="Message State" android:textSize="16sp" /> @@ -43,7 +43,7 @@ android:layout_marginStart="16dp" android:layout_marginTop="8dp" android:layout_marginEnd="16dp" - android:text="Message Text" + tools:text="Message Text" android:textSize="18sp" android:textStyle="bold" /> From ca0cc7511607d7069805cace4a09b2658bdb2df0 Mon Sep 17 00:00:00 2001 From: Aleksandr Soloshenko Date: Tue, 19 Dec 2023 22:57:02 +0700 Subject: [PATCH 3/4] Improved: use of IO context for DB operations from UI --- .../modules/messages/repositories/MessagesRepository.kt | 4 +--- .../modules/messages/vm/MessageDetailsViewModel.kt | 5 +++-- .../smsgateway/modules/messages/vm/MessagesListViewModel.kt | 3 ++- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/app/src/main/java/me/capcom/smsgateway/modules/messages/repositories/MessagesRepository.kt b/app/src/main/java/me/capcom/smsgateway/modules/messages/repositories/MessagesRepository.kt index aebbff8..16bb7e7 100644 --- a/app/src/main/java/me/capcom/smsgateway/modules/messages/repositories/MessagesRepository.kt +++ b/app/src/main/java/me/capcom/smsgateway/modules/messages/repositories/MessagesRepository.kt @@ -1,11 +1,9 @@ package me.capcom.smsgateway.modules.messages.repositories -import kotlinx.coroutines.Dispatchers -import kotlinx.coroutines.withContext import me.capcom.smsgateway.data.dao.MessageDao class MessagesRepository(private val dao: MessageDao) { val lastMessages = dao.selectLast() - suspend fun get(id: String) = withContext(Dispatchers.IO) { dao.get(id) } + fun get(id: String) = dao.get(id) } \ No newline at end of file diff --git a/app/src/main/java/me/capcom/smsgateway/modules/messages/vm/MessageDetailsViewModel.kt b/app/src/main/java/me/capcom/smsgateway/modules/messages/vm/MessageDetailsViewModel.kt index 26f1e22..d9d1e02 100644 --- a/app/src/main/java/me/capcom/smsgateway/modules/messages/vm/MessageDetailsViewModel.kt +++ b/app/src/main/java/me/capcom/smsgateway/modules/messages/vm/MessageDetailsViewModel.kt @@ -4,6 +4,7 @@ import androidx.lifecycle.LiveData import androidx.lifecycle.MutableLiveData import androidx.lifecycle.ViewModel import androidx.lifecycle.viewModelScope +import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.launch import me.capcom.smsgateway.data.entities.MessageWithRecipients import me.capcom.smsgateway.modules.messages.repositories.MessagesRepository @@ -15,8 +16,8 @@ class MessageDetailsViewModel( val message: LiveData = _message fun get(id: String) { - viewModelScope.launch { - _message.value = messagesRepo.get(id) + viewModelScope.launch(Dispatchers.IO) { + _message.postValue(messagesRepo.get(id)) } } } \ No newline at end of file diff --git a/app/src/main/java/me/capcom/smsgateway/modules/messages/vm/MessagesListViewModel.kt b/app/src/main/java/me/capcom/smsgateway/modules/messages/vm/MessagesListViewModel.kt index 54a4fee..da2e5da 100644 --- a/app/src/main/java/me/capcom/smsgateway/modules/messages/vm/MessagesListViewModel.kt +++ b/app/src/main/java/me/capcom/smsgateway/modules/messages/vm/MessagesListViewModel.kt @@ -3,6 +3,7 @@ package me.capcom.smsgateway.modules.messages.vm import androidx.lifecycle.LiveData import androidx.lifecycle.ViewModel import androidx.lifecycle.asLiveData +import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.flow.distinctUntilChanged import me.capcom.smsgateway.data.entities.Message import me.capcom.smsgateway.modules.messages.repositories.MessagesRepository @@ -11,5 +12,5 @@ class MessagesListViewModel( messagesRepo: MessagesRepository ) : ViewModel() { val messages: LiveData> = - messagesRepo.lastMessages.distinctUntilChanged().asLiveData() + messagesRepo.lastMessages.distinctUntilChanged().asLiveData(Dispatchers.IO) } \ No newline at end of file From c55525b830e9ee5604863f203344786478b23048 Mon Sep 17 00:00:00 2001 From: Aleksandr Soloshenko Date: Tue, 19 Dec 2023 23:12:53 +0700 Subject: [PATCH 4/4] Fixed: use of `LiveData` instead of `Flow` --- .../main/java/me/capcom/smsgateway/data/dao/MessageDao.kt | 4 ++-- .../modules/messages/repositories/MessagesRepository.kt | 3 ++- .../smsgateway/modules/messages/vm/MessagesListViewModel.kt | 5 +---- 3 files changed, 5 insertions(+), 7 deletions(-) diff --git a/app/src/main/java/me/capcom/smsgateway/data/dao/MessageDao.kt b/app/src/main/java/me/capcom/smsgateway/data/dao/MessageDao.kt index f3abbb5..4d0de97 100644 --- a/app/src/main/java/me/capcom/smsgateway/data/dao/MessageDao.kt +++ b/app/src/main/java/me/capcom/smsgateway/data/dao/MessageDao.kt @@ -1,10 +1,10 @@ package me.capcom.smsgateway.data.dao +import androidx.lifecycle.LiveData import androidx.room.Dao import androidx.room.Insert import androidx.room.Query import androidx.room.Transaction -import kotlinx.coroutines.flow.Flow import me.capcom.smsgateway.data.entities.Message import me.capcom.smsgateway.data.entities.MessageRecipient import me.capcom.smsgateway.data.entities.MessageWithRecipients @@ -12,7 +12,7 @@ import me.capcom.smsgateway.data.entities.MessageWithRecipients @Dao interface MessageDao { @Query("SELECT * FROM message ORDER BY createdAt DESC LIMIT 50") - fun selectLast(): Flow> + fun selectLast(): LiveData> @Transaction @Query("SELECT * FROM message WHERE id = :id") diff --git a/app/src/main/java/me/capcom/smsgateway/modules/messages/repositories/MessagesRepository.kt b/app/src/main/java/me/capcom/smsgateway/modules/messages/repositories/MessagesRepository.kt index 16bb7e7..518f126 100644 --- a/app/src/main/java/me/capcom/smsgateway/modules/messages/repositories/MessagesRepository.kt +++ b/app/src/main/java/me/capcom/smsgateway/modules/messages/repositories/MessagesRepository.kt @@ -1,9 +1,10 @@ package me.capcom.smsgateway.modules.messages.repositories +import androidx.lifecycle.distinctUntilChanged import me.capcom.smsgateway.data.dao.MessageDao class MessagesRepository(private val dao: MessageDao) { - val lastMessages = dao.selectLast() + val lastMessages = dao.selectLast().distinctUntilChanged() fun get(id: String) = dao.get(id) } \ No newline at end of file diff --git a/app/src/main/java/me/capcom/smsgateway/modules/messages/vm/MessagesListViewModel.kt b/app/src/main/java/me/capcom/smsgateway/modules/messages/vm/MessagesListViewModel.kt index da2e5da..a3d0358 100644 --- a/app/src/main/java/me/capcom/smsgateway/modules/messages/vm/MessagesListViewModel.kt +++ b/app/src/main/java/me/capcom/smsgateway/modules/messages/vm/MessagesListViewModel.kt @@ -2,9 +2,6 @@ package me.capcom.smsgateway.modules.messages.vm import androidx.lifecycle.LiveData import androidx.lifecycle.ViewModel -import androidx.lifecycle.asLiveData -import kotlinx.coroutines.Dispatchers -import kotlinx.coroutines.flow.distinctUntilChanged import me.capcom.smsgateway.data.entities.Message import me.capcom.smsgateway.modules.messages.repositories.MessagesRepository @@ -12,5 +9,5 @@ class MessagesListViewModel( messagesRepo: MessagesRepository ) : ViewModel() { val messages: LiveData> = - messagesRepo.lastMessages.distinctUntilChanged().asLiveData(Dispatchers.IO) + messagesRepo.lastMessages } \ No newline at end of file