0

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

app screenshot: app

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
    }
}
Ali Damiri
  • 25
  • 3

1 Answers1

0

If you want ensure that Activity re-creation doesn't destroy your content, you can refer to this answer

If you want to connect the data to your local Storage, I suggest you using Room

SeanCheey
  • 143
  • 1
  • 4