yayan 1 年之前
父节点
当前提交
69856eb7f7

+ 14 - 8
app/src/main/java/io/nexilis/alpha/ui/main/Chats.kt

@@ -26,6 +26,8 @@ import coil.request.ImageRequest
 import io.nexilis.alpha.ui.screen.Screen
 import io.nexilis.alpha.ui.viewmodel.MainViewModel
 import io.nexilis.service.data.viewmodels.BuddyViewModel
+import io.nexilis.service.data.viewmodels.MessageSummaryViewModel
+import io.nexilis.service.data.viewmodels.MessageViewModel
 
 @OptIn(ExperimentalMaterial3Api::class)
 @Composable
@@ -37,23 +39,27 @@ fun Chats(
     LaunchedEffect(Unit) {
         mainViewModel.setTitle("Chats")
     }
-    val viewModel: BuddyViewModel = hiltViewModel()
-    val all by viewModel.all.observeAsState()
+    val messageSummaryViewModel: MessageSummaryViewModel = hiltViewModel()
+    val chats by messageSummaryViewModel.all.observeAsState()
+    val messageViewModel: MessageViewModel = hiltViewModel()
+    val buddyViewModel: BuddyViewModel = hiltViewModel()
     var selectedItem by remember { mutableStateOf(0) }
     LazyColumn(
         contentPadding = contentPadding,
     ) {
         items(
-            count = all?.size ?: 0,
+            count = chats?.size ?: 0,
             key = {
-                all?.get(it)?.f_pin ?: 0
+                chats?.get(it)?.l_pin ?: 0
             }
         ) { item ->
-            val buddy = all?.get(item)
+            val chat = chats?.get(item)
+            val message by messageViewModel.get(chat?.message_id ?: "").observeAsState()
+            val buddy by buddyViewModel.getBuddy(chat?.l_pin ?: "").observeAsState()
             ListItem(
                 modifier = Modifier.selectable(selected = selectedItem == item, onClick = {
                     selectedItem = item
-                    navController.navigate(Screen.Chat.route + "/${buddy?.f_pin}") {
+                    navController.navigate(Screen.Chat.route + "/${chat?.l_pin}") {
                         launchSingleTop = true
                         restoreState = true
                     }
@@ -66,7 +72,7 @@ fun Chats(
                 },
                 supportingText = {
                     Text(
-                        buddy?.image_id ?: "Secondary text",
+                        message?.message_text ?: "Secondary text",
                         style = MaterialTheme.typography.bodySmall
                     )
                 },
@@ -74,7 +80,7 @@ fun Chats(
                     AsyncImage(
                         model = ImageRequest.Builder(LocalContext.current)
                             .data("https://digixplatform.com/filepalio/image/${buddy?.image_id}")
-                            .addHeader("Cookie" , "PHPSESSID=123;MOBILE=123")
+                            .addHeader("Cookie", "PHPSESSID=123;MOBILE=123")
                             .crossfade(true)
                             .build(),
                         placeholder = rememberVectorPainter(image = Icons.Default.Person),

+ 1 - 16
cpaas-lite/src/main/AndroidManifest.xml

@@ -1,28 +1,13 @@
 <?xml version="1.0" encoding="utf-8"?>
 <manifest xmlns:android="http://schemas.android.com/apk/res/android">
 
+    <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
     <uses-permission android:name="android.permission.INTERNET" />
     <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
     <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
 
     <application
         android:enabled="true">
-        <receiver
-            android:name="io.newuniverse.SDK.nuSDKReceiver"
-            android:enabled="true"
-            android:exported="false">
-            <intent-filter>
-                <action android:name="android.intent.action.BOOT_COMPLETED" />
-                <action android:name="android.net.conn.CONNECTIVITY_CHANGE" />
-                <action android:name="android.net.wifi.WIFI_STATE_CHANGED" />
-                <action android:name="android.net.wifi.STATE_CHANGE" />
-                <action android:name="android.location.PROVIDERS_CHANGED" />
-                <action android:name="android.intent.action.SCREEN_ON" />
-                <action android:name="android.intent.action.SCREEN_OFF" />
-                <action android:name="io.newuniverse.SDK.nuSDKReceiver.KEEP_ALIVE" />
-                <action android:name="android.intent.action.ACTION_SHUTDOWN" />
-            </intent-filter>
-        </receiver>
         <service
             android:name="io.newuniverse.SDK.nuSDKService"
             android:enabled="true"

+ 4 - 2
cpaas-lite/src/main/java/io/nexilis/service/SdkCallback.kt

@@ -8,6 +8,8 @@ import kotlin.concurrent.withLock
 
 class SdkCallback : nuSDKCallBack {
 
+    private val tag = "SdkCallback"
+
     override fun connectionStateChanged(
         p0: String?,
         p1: String?,
@@ -29,7 +31,7 @@ class SdkCallback : nuSDKCallBack {
     }
 
     override fun gpsStateChanged(p0: Int) {
-
+        Log.d(tag, "gpsStateChanged:$p0")
     }
 
     override fun sleepStateChanged(p0: Boolean) {
@@ -84,7 +86,7 @@ class SdkCallback : nuSDKCallBack {
     }
 
     override fun locationUpdated(p0: Long, p1: String?) {
-
+        Log.d(tag, "locationUpdated:$p0:$p1")
     }
 
     override fun imageData(p0: ByteArray?) {

+ 4 - 5
cpaas-lite/src/main/java/io/nexilis/service/core/Incoming.kt

@@ -16,7 +16,8 @@ import java.util.zip.ZipInputStream
 
 class Incoming private constructor() {
 
-    val context: Context by lazy { nuSDKService.getInstance(pass) as Context }
+    private val context: Context by lazy { nuSDKService.getInstance(pass) as Context }
+
     companion object {
 
         @Volatile
@@ -276,10 +277,8 @@ class Incoming private constructor() {
             if (messageId.isEmpty()) return
             val me = context.getSharedPreferences().getString("pin", "")
             ApiRoomDatabase.getDatabase(context).messageDao().get(messageId).value?.let {
-                if (it.isNotEmpty()) {
-                    Service.sendAck(me, data.status)
-                    return
-                }
+                Service.sendAck(me, data.status)
+                return
             }
             val fPin = data.bodies["A00"] ?: ""
             val lPin = data.bodies["A01"] ?: ""

+ 14 - 6
cpaas-lite/src/main/java/io/nexilis/service/data/daos/MessageDao.kt

@@ -8,21 +8,29 @@ import androidx.room.Query
 import io.nexilis.service.data.entities.*
 
 @Dao
-interface MessageDao {
+abstract class MessageDao {
 
     @Query("select * from Message")
-    fun getAll(): LiveData<List<Message>>
+    abstract fun getAll(): LiveData<List<Message>>
 
     @Query("select * from Message where message_id = :id")
-    fun get(id: String): LiveData<List<Message>>
+    abstract fun get(id: String): LiveData<Message>
 
     @Query("select * from Message where opposite_pin = :pin order by server_date desc")
-    fun getOpposite(pin: String): LiveData<List<Message>>
+    abstract fun getOpposite(pin: String): LiveData<List<Message>>
 
     @Insert(onConflict = OnConflictStrategy.REPLACE)
-    suspend fun insert(entity: Message)
+    abstract suspend fun _insert(entity: Message)
+
+    @Insert(onConflict = OnConflictStrategy.REPLACE)
+    abstract suspend fun _insertSummary(entity: MessageSummary)
 
     @Query("delete from Message")
-    suspend fun deleteAll()
+    abstract suspend fun deleteAll()
+
+    suspend fun insert(entity: Message) {
+        _insert(entity)
+        _insertSummary(MessageSummary(entity.opposite_pin, entity.message_id))
+    }
 
 }

+ 3 - 3
cpaas-lite/src/main/java/io/nexilis/service/data/repositories/MessageRepository.kt

@@ -3,8 +3,6 @@ package io.nexilis.service.data.repositories
 import androidx.lifecycle.LiveData
 import io.nexilis.service.Service
 import io.nexilis.service.core.Data
-import io.nexilis.service.core.toMD5
-import io.nexilis.service.core.toNormalString
 import io.nexilis.service.core.toStupidString
 import io.nexilis.service.data.daos.MessageDao
 import io.nexilis.service.data.entities.MainEntity
@@ -15,7 +13,9 @@ class MessageRepository @Inject constructor(private val dao: MessageDao) : Repos
 
     val all: LiveData<List<Message>> = dao.getAll()
 
-//    val opposite: LiveData<List<Message>> =
+    fun get(id: String) : LiveData<Message> {
+        return dao.get(id)
+    }
 
     fun getOpposite(pin: String) : LiveData<List<Message>> {
         return dao.getOpposite(pin)

+ 14 - 0
cpaas-lite/src/main/java/io/nexilis/service/data/viewmodels/MessageSummaryViewModel.kt

@@ -0,0 +1,14 @@
+package io.nexilis.service.data.viewmodels
+
+import androidx.lifecycle.LiveData
+import androidx.lifecycle.ViewModel
+import dagger.hilt.android.lifecycle.HiltViewModel
+import io.nexilis.service.data.entities.MessageSummary
+import io.nexilis.service.data.repositories.MessageSummaryRepository
+import javax.inject.Inject
+
+@HiltViewModel
+class MessageSummaryViewModel @Inject constructor(private val repository: MessageSummaryRepository) :
+    ViewModel() {
+    val all: LiveData<List<MessageSummary>> = repository.all
+}

+ 4 - 1
cpaas-lite/src/main/java/io/nexilis/service/data/viewmodels/MessageViewModel.kt

@@ -4,7 +4,6 @@ import androidx.lifecycle.LiveData
 import androidx.lifecycle.ViewModel
 import androidx.lifecycle.viewModelScope
 import dagger.hilt.android.lifecycle.HiltViewModel
-import io.nexilis.service.Service
 import io.nexilis.service.data.entities.Message
 import io.nexilis.service.data.repositories.MessageRepository
 import kotlinx.coroutines.launch
@@ -16,6 +15,10 @@ class MessageViewModel @Inject constructor(private val repository: MessageReposi
 
     val all: LiveData<List<Message>> = repository.all
 
+    fun get(id: String) : LiveData<Message> {
+        return repository.get(id)
+    }
+
     fun getOpposite(pin: String) : LiveData<List<Message>> {
         return repository.getOpposite(pin)
     }