hi i am new in android and kotlin and i have a chat app that will work with sms and want save state of all chat for next run
i did use recyclerView and GroupieViewHolder for show chats , i see some post here but all was with java but i am using kotlin for this app so if you can please help me and If possible, state the easiest way in the simplest possible way
my smsActivity.kt:
class smsActivity : AppCompatActivity() {
private val messageAdapter = GroupAdapter<GroupieViewHolder>()
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_sms)
val recyclerView = findViewById<RecyclerView>(R.id.listmessage)
val button = findViewById<Button>(R.id.button)
val editmessage = findViewById<EditText>(R.id.editText)
val sharedPeref = getSharedPreferences("setNumber", MODE_PRIVATE)
val number = sharedPeref.getString("number", null)
recyclerView.adapter = messageAdapter
populateData()
receiveAutoResponse()
button.setOnClickListener {
val message = Message(text = editmessage.text.toString(), sendBy = "me")
val smssend = editmessage.text.toString()
val sendMessageItem = SendMessageItem(message)
messageAdapter.add(sendMessageItem)
editmessage.text.clear()
receiveAutoResponse()
recyclerView.scrollToPosition(messageAdapter.getItemCount() - 1);
try {
val smsManager: SmsManager = SmsManager.getDefault()
smsManager.sendTextMessage(number, null, smssend, null, null)
Toast.makeText(
applicationContext,
"بخاری 3 =دریافت گزارش ✅ دریافت گزارش چندین ثانیه زمان می برد ، لطفا برای ارسال دستور بعدی کمی صبر کنید",
Toast.LENGTH_LONG
).show()
} catch (e: Exception) {
Toast.makeText(
applicationContext,
"لطفا ابتدا شماره سیستم را وارد کنید !",
Toast.LENGTH_SHORT
).show()
val intent = Intent(this, setnumberActivity::class.java)
this.startActivity(intent)
}
}
}
fun ScrollView.scrollToBottom() {
val lastChild = getChildAt(childCount - 1)
val bottom = lastChild.bottom + paddingBottom
val delta = bottom - (scrollY + height)
smoothScrollBy(0, delta)
}
private fun populateData() {
val data = listOf<Message>()
data.forEach {
if (it.sendBy == "me") {
messageAdapter.add(SendMessageItem(it))
} else {
messageAdapter.add(ReceiveMessageItem(it))
}
}
}
private fun receiveAutoResponse() {
GlobalScope.launch(Dispatchers.Main) {
delay(1000)
val sharedPeref = getSharedPreferences("setNumber", MODE_PRIVATE)
val nums = "+98" + sharedPeref.getString("number", null)
val cursor: Cursor? = getContentResolver().query(
Uri.parse("content://sms"),
null,
"address='$nums'",
null,
null
)
cursor?.moveToFirst()
val messageSend = cursor?.getString(12)
val receive = Message(text = "$messageSend", sendBy = "me")
val receiveItem = ReceiveMessageItem(receive)
messageAdapter.add(receiveItem)
val recyclerView = findViewById<RecyclerView>(R.id.listmessage)
recyclerView.scrollToPosition(messageAdapter.getItemCount() - 1);
}
}
}
class SendMessageItem(private val message: Message) : BindableItem<ItemMessageSendBinding>() {
override fun getLayout(): Int {
return R.layout.item_message_send
}
override fun bind(viewBinding: ItemMessageSendBinding, position: Int) {
viewBinding.message = message
}
}
class ReceiveMessageItem(private val message: Message) : BindableItem<ItemMessageReceiveBinding>() {
override fun getLayout(): Int {
return R.layout.item_message_receive
}
override fun bind(viewBinding: ItemMessageReceiveBinding, position: Int) {
viewBinding.message = message
}
}