Skip to content
This repository has been archived by the owner on May 29, 2024. It is now read-only.

Commit

Permalink
Now shows new messages in FragmentHomePage.kt. Also fixed some cachin…
Browse files Browse the repository at this point in the history
…g issues
  • Loading branch information
zexee24 committed Feb 17, 2023
1 parent b18d496 commit ebb2910
Show file tree
Hide file tree
Showing 7 changed files with 71 additions and 12 deletions.
1 change: 1 addition & 0 deletions app/src/main/java/com/otawilma/mobileclient/Globals.kt
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@ val JUMP_LESSON_THRESHOLD: Duration = Duration.ofMinutes(30)
val client = OkHttpClient()
var tokenGlobal : String? = null
val jackSonMapper = jacksonObjectMapper()
const val NEW_MESSAGE_BATCH_SIZE : Int = 10

fun initAppData(){
jackSonMapper.findAndRegisterModules()
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,32 +3,36 @@ package com.otawilma.mobileclient.fragments
import android.content.Context
import android.os.Bundle
import android.view.View
import android.widget.Toast
import androidx.fragment.app.Fragment
import androidx.recyclerview.widget.LinearLayoutManager
import androidx.recyclerview.widget.RecyclerView
import com.otawilma.mobileclient.OtawilmaNetworking
import com.otawilma.mobileclient.R
import com.otawilma.mobileclient.TimeTableDayAdapter
import com.otawilma.mobileclient.dataClasses.MessageItem
import com.otawilma.mobileclient.messaging.MessageAdapter
import com.otawilma.mobileclient.messaging.MessageClickListener
import com.otawilma.mobileclient.storage.DayRepository
import com.otawilma.mobileclient.storage.MessageRepository
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.cancel
import kotlinx.coroutines.launch

class FragmentHomePage:Fragment(R.layout.fragment_home_page), OtawilmaNetworking {
class FragmentHomePage:Fragment(R.layout.fragment_home_page), OtawilmaNetworking, MessageClickListener {


private lateinit var timeTableDayAdapter: TimeTableDayAdapter
private val timeTableDayAdapter: TimeTableDayAdapter = TimeTableDayAdapter()
private val messageAdapter : MessageAdapter = MessageAdapter(this@FragmentHomePage)

private val coroutineScope = CoroutineScope(Dispatchers.IO)
private val coroutineScopeMain = CoroutineScope(Dispatchers.Main )

override fun onCreate(savedInstanceState: Bundle?) {
val dayRepository = DayRepository(requireContext())
val messageRepository = MessageRepository(requireContext())
super.onCreate(savedInstanceState)
timeTableDayAdapter = TimeTableDayAdapter()



coroutineScope.launch {
val schoolDayFlow = dayRepository.schoolDayFlow
Expand All @@ -38,6 +42,13 @@ class FragmentHomePage:Fragment(R.layout.fragment_home_page), OtawilmaNetworking
}
}
}
coroutineScope.launch {
messageRepository.newMessageFlow.collect{
coroutineScopeMain.launch {
messageAdapter.submitItems(it)
}
}
}
}

override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
Expand All @@ -53,6 +64,12 @@ class FragmentHomePage:Fragment(R.layout.fragment_home_page), OtawilmaNetworking

}

view.findViewById<RecyclerView>(R.id.recyclerViewHomeMessages)?.apply {
layoutManager = LinearLayoutManager(context)
isNestedScrollingEnabled = false
adapter = messageAdapter
}

}

class DayRecyclerLinearLayoutManager(context: Context?) : LinearLayoutManager(context){
Expand All @@ -71,4 +88,8 @@ class FragmentHomePage:Fragment(R.layout.fragment_home_page), OtawilmaNetworking
coroutineScopeMain.cancel()
super.onDestroy()
}

override fun onClick(messageItem: MessageItem) {
Toast.makeText(context, messageItem.subject,Toast.LENGTH_SHORT).show()
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -27,12 +27,11 @@ import kotlinx.coroutines.launch

class FragmentMessages : Fragment(R.layout.fragment_messages), OtawilmaNetworking, MessageClickListener {

private lateinit var messageAdapter : MessageAdapter
private val messageAdapter : MessageAdapter = MessageAdapter(this@FragmentMessages)

override fun onCreate(savedInstanceState: Bundle?) {
val messageRepository = MessageRepository(requireContext())
super.onCreate(savedInstanceState)
messageAdapter = MessageAdapter(this@FragmentMessages)

CoroutineScope(Dispatchers.IO).launch {
val messageFlow = messageRepository.messageFlow(100)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,8 @@ class MessageAdapter(private val onClickListener : MessageClickListener) : Recyc

messageSubject.text = messageItem.subject
messageSender.text = messageItem.senders!!.joinToString(separator = " / ") { it.name }
messageTimestamp.text = messageItem.timestamp.toString()
val ts = messageItem.timestamp
messageTimestamp.text = "${ts?.dayOfMonth}.${ts?.monthValue}.${ts?.year} | ${ts?.hour}:${ts?.minute}"

if (messageItem is Message && messageItem.new){
messageSubject.setTextColor(ContextCompat.getColor(itemView.context,R.color.black))
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,9 @@ interface MessageCache {
val item = jackSonMapper.readValue(i, Message::class.java)
messageItemList.add(item)
}
messageItemList
messageItemList.sortedBy {
it.timestamp
}.reversed().take(until)
} catch (e : FileNotFoundException){
null
}
Expand Down
Original file line number Diff line number Diff line change
@@ -1,10 +1,12 @@
package com.otawilma.mobileclient.storage

import android.content.Context
import com.otawilma.mobileclient.NEW_MESSAGE_BATCH_SIZE
import com.otawilma.mobileclient.OtawilmaNetworking
import com.otawilma.mobileclient.dataClasses.Message
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.delay
import kotlinx.coroutines.flow.Flow
import kotlinx.coroutines.flow.flow
import kotlinx.coroutines.launch
Expand All @@ -13,6 +15,38 @@ class MessageRepository (private val context: Context) : OtawilmaNetworking, Mes

private var messageMem : List<Message> = listOf()

val newMessageFlow : Flow<List<Message>> = flow {
// Emit cache
emit(doWhileNewMessages { getCachedList(it) })

// Loop the networkRequest
while (true){
repeatUntilSuccess(context, waitUntilToken(context)) { t ->
val newMessages = doWhileNewMessages {
getMessagesFromServer(t, it)
}
CoroutineScope(Dispatchers.IO).launch {
for (message in newMessages){storeMessage(context, message)}
}
emit(newMessages)
}

// Wait for 5 minutes
delay(300000)
}
}

private suspend fun doWhileNewMessages(getMessageMethod : suspend (Int) -> List<Message>?) : List<Message>{
var i = 1
while (true) {
val cachedMessages = getMessageMethod(NEW_MESSAGE_BATCH_SIZE * i)?: listOf()
val cachedNewMessages = cachedMessages.filter { it.new }
if (cachedNewMessages.size != cachedMessages.size) return cachedNewMessages
i++
}

}

fun messageFlow(until : Int) : Flow<List<Message>> = flow {
emit(getCachedList(until)?: listOf())

Expand All @@ -22,10 +56,10 @@ class MessageRepository (private val context: Context) : OtawilmaNetworking, Mes
}

private fun getCachedList(until: Int) : List<Message>?{
if (until <= messageMem.size) return messageMem.subList(0,until - 1)
if (until <= messageMem.size) return messageMem.take(until)

messageMem = getStoredMessages(context, until) ?: listOf()
if (until <= messageMem.size) return messageMem.subList(0,until - 1)
if (until <= messageMem.size) return messageMem.take(until)

return null
}
Expand Down
3 changes: 2 additions & 1 deletion app/src/main/res/layout/fragment_home_page.xml
Original file line number Diff line number Diff line change
Expand Up @@ -48,12 +48,13 @@
app:layout_constraintTop_toBottomOf="@+id/recyclerViewHomeSchedule" />

<androidx.recyclerview.widget.RecyclerView
android:id="@+id/recyclerViewHomeMessages"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginStart="8dp"
android:layout_marginTop="16dp"
android:layout_marginEnd="8dp"
android:layout_marginBottom="100dp"
android:layout_marginBottom="16dp"
android:orientation="horizontal"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
Expand Down

0 comments on commit ebb2910

Please sign in to comment.