yayan 1 tahun lalu
induk
melakukan
2f6d66de1e

+ 4 - 2
app/src/main/java/io/nexilis/alpha/ui/main/Friend.kt

@@ -9,6 +9,7 @@ import androidx.compose.material3.OutlinedTextField
 import androidx.compose.material3.Text
 import androidx.compose.runtime.Composable
 import androidx.compose.runtime.getValue
+import androidx.compose.runtime.livedata.observeAsState
 import androidx.compose.runtime.mutableStateOf
 import androidx.compose.runtime.saveable.rememberSaveable
 import androidx.compose.runtime.setValue
@@ -24,7 +25,8 @@ import io.nexilis.service.data.viewmodels.BuddyViewModel
 @OptIn(ExperimentalMaterial3Api::class)
 @Composable
 fun Friend(navController: NavHostController) {
-    val buddyViewModel: BuddyViewModel = hiltViewModel()
+    val viewModel: BuddyViewModel = hiltViewModel()
+    val me by viewModel.me.observeAsState()
     var textUsername by rememberSaveable(stateSaver = TextFieldValue.Saver) {
         mutableStateOf(TextFieldValue("", TextRange(0, 7)))
     }
@@ -46,7 +48,7 @@ fun Friend(navController: NavHostController) {
         )
         Spacer(modifier = Modifier.size(8.dp))
         Button(onClick = {
-            buddyViewModel.addFriend(textUsername.text)
+            me?.let { viewModel.addFriend(it.f_pin, textUsername.text) }
         }) {
             Text(text = "Add")
         }

+ 27 - 2
app/src/main/java/io/nexilis/alpha/ui/main/Sign.kt

@@ -12,6 +12,7 @@ import androidx.compose.runtime.livedata.observeAsState
 import androidx.compose.runtime.saveable.rememberSaveable
 import androidx.compose.ui.Alignment
 import androidx.compose.ui.Modifier
+import androidx.compose.ui.platform.LocalContext
 import androidx.compose.ui.text.TextRange
 import androidx.compose.ui.text.input.KeyboardType
 import androidx.compose.ui.text.input.PasswordVisualTransformation
@@ -21,6 +22,8 @@ import androidx.compose.ui.unit.dp
 import androidx.hilt.navigation.compose.hiltViewModel
 import androidx.navigation.NavHostController
 import io.nexilis.alpha.ui.viewmodel.MainViewModel
+import io.nexilis.service.core.getSharedPreferences
+import io.nexilis.service.core.put
 import io.nexilis.service.data.viewmodels.BuddyViewModel
 
 @OptIn(ExperimentalMaterial3Api::class)
@@ -49,6 +52,8 @@ fun SignUp(
         mutableStateOf(false)
     }
     val viewModel: BuddyViewModel = hiltViewModel()
+    val me by viewModel.me.observeAsState()
+    val context = LocalContext.current
     Column(
         modifier = Modifier
             .fillMaxSize()
@@ -117,7 +122,18 @@ fun SignUp(
         )
         Spacer(modifier = Modifier.size(8.dp))
         Button(onClick = {
-            viewModel.signUp(textUsername.text, textConfirmPassword.text, completion)
+            me?.let {
+                viewModel.signUp(
+                    it.f_pin,
+                    textUsername.text,
+                    textConfirmPassword.text
+                ) { r ->
+                    completion(r)
+                    if (r) {
+                        context.getSharedPreferences().put(key = "pin", value = it.f_pin)
+                    }
+                }
+            }
         }) {
             Text(text = "Submit")
         }
@@ -128,6 +144,7 @@ fun SignUp(
 @Composable
 fun SignIn(navController: NavHostController, completion: (Boolean) -> Unit) {
     val viewModel: BuddyViewModel = hiltViewModel()
+    val me by viewModel.me.observeAsState()
     var textUsername by rememberSaveable(stateSaver = TextFieldValue.Saver) {
         mutableStateOf(TextFieldValue("", TextRange(0, 7)))
     }
@@ -137,6 +154,7 @@ fun SignIn(navController: NavHostController, completion: (Boolean) -> Unit) {
     var isVisiblePassword by remember {
         mutableStateOf(false)
     }
+    val context = LocalContext.current
     Column(
         modifier = Modifier
             .fillMaxSize()
@@ -180,7 +198,14 @@ fun SignIn(navController: NavHostController, completion: (Boolean) -> Unit) {
         )
         Spacer(modifier = Modifier.size(8.dp))
         Button(onClick = {
-            viewModel.signIn(textUsername.text, textPassword.text, completion)
+            me?.let {
+                viewModel.signIn(it.f_pin, textUsername.text, textPassword.text) { r ->
+                    completion(r)
+                    if (r) {
+                        context.getSharedPreferences().put(key = "pin", value = it.f_pin)
+                    }
+                }
+            }
         }) {
             Text(text = "Submit")
         }

+ 5 - 6
cpaas-lite/src/main/java/io/nexilis/service/Api.kt

@@ -9,7 +9,6 @@ import io.nexilis.service.core.Data
 import io.nexilis.service.core.optString
 import io.nexilis.service.core.put
 import java.security.SecureRandom
-import java.util.UUID
 import java.util.concurrent.TimeUnit
 import java.util.concurrent.locks.Condition
 import java.util.concurrent.locks.ReentrantLock
@@ -37,10 +36,10 @@ class Api {
                         Context.MODE_PRIVATE
                     )
                     val random = SecureRandom().nextInt(9 + 1 - 1) + 1
-                    val user = preferences.optString(
+                    val userTmp = preferences.optString(
                         key = "pin", default = random.toString()
                     )
-                    Log.d(tag, "initConnection:$pass,$account,$activity,$user")
+                    Log.d(tag, "initConnection:$pass,$account,$activity,$userTmp")
                     nuSDKService.getInstance(pass).initConnection(
                         pass,
                         account,
@@ -49,7 +48,7 @@ class Api {
                         SdkCallback(),
                         "108.136.37.34",
                         42823,
-                        user,
+                        userTmp,
                         "09:00",
                         false,
                         "108.136.37.34:42823"
@@ -66,7 +65,7 @@ class Api {
                                     Data(
                                         code = "SUA01",
                                         status = System.nanoTime().toString(),
-                                        f_pin = user,
+                                        f_pin = userTmp,
                                         bodies = mutableMapOf("Api" to account, "A92" to "yayandw")
                                     )
                                 )
@@ -84,7 +83,7 @@ class Api {
                                             Data(
                                                 code = "A050",
                                                 status = System.nanoTime().toString(),
-                                                f_pin = user
+                                                f_pin = userTmp
                                             )
                                         )
                                     }

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

@@ -68,7 +68,7 @@ class SdkCallback : nuSDKCallBack {
                 p0?.let { s ->
                     data.packetId = s
                 }
-                Incoming().process(data)
+                Incoming.getInstance().process(data)
             }
         } catch (e: Exception) {
             Log.e(tag, e.message, e)

+ 16 - 1
cpaas-lite/src/main/java/io/nexilis/service/core/Incoming.kt

@@ -14,7 +14,22 @@ import kotlinx.coroutines.launch
 import org.json.JSONArray
 import java.util.zip.ZipInputStream
 
-class Incoming(private val context: Context = nuSDKService.getInstance(pass) as Context) {
+class Incoming private constructor() {
+
+    val context: Context by lazy { nuSDKService.getInstance(pass) as Context }
+    companion object {
+
+        @Volatile
+        private var INSTANCE: Incoming? = null
+
+        fun getInstance(): Incoming {
+            return INSTANCE ?: synchronized(this) {
+                val instance = Incoming()
+                INSTANCE = instance
+                instance
+            }
+        }
+    }
 
     fun process(data: Data) {
         Log.d(tag, "process(${data.code}):$data")

+ 18 - 32
cpaas-lite/src/main/java/io/nexilis/service/data/repositories/BuddyRepository.kt

@@ -1,23 +1,19 @@
 package io.nexilis.service.data.repositories
 
-import android.content.Context
 import android.util.Log
 import androidx.lifecycle.LiveData
 import io.nexilis.service.Service
 import io.nexilis.service.core.Data
-import io.nexilis.service.core.optString
-import io.nexilis.service.core.put
 import io.nexilis.service.core.toMD5
 import io.nexilis.service.data.daos.BuddyDao
 import io.nexilis.service.data.entities.Buddy
 import io.nexilis.service.data.entities.MainEntity
-import io.nexilis.service.namePreference
 import io.nexilis.service.tag
 import kotlinx.coroutines.Dispatchers
 import kotlinx.coroutines.withContext
 import javax.inject.Inject
 
-class BuddyRepository @Inject constructor(private val context: Context, private val dao: BuddyDao) : Repository {
+class BuddyRepository @Inject constructor(private val dao: BuddyDao) : Repository {
 
     val all: LiveData<List<Buddy>> = dao.getAll()
 
@@ -31,18 +27,17 @@ class BuddyRepository @Inject constructor(private val context: Context, private
         dao.insert(entity as Buddy)
     }
 
-    suspend fun signUp(username: String, password: String, completion: (Boolean) -> Unit) {
-        val preferences = context.getSharedPreferences(
-            namePreference,
-            Context.MODE_PRIVATE
-        )
-        val pin = preferences.optString(key = "pin", default = "")
-        if (pin.isEmpty()) return
+    suspend fun signUp(
+        me: String,
+        username: String,
+        password: String,
+        completion: (Boolean) -> Unit
+    ) {
         Service.sendAsync(
             Data(
                 code = "A003",
                 status = System.nanoTime().toString(),
-                f_pin = pin,
+                f_pin = me,
                 bodies = mutableMapOf(
                     "A02" to username,
                     "A03" to "",
@@ -53,8 +48,7 @@ class BuddyRepository @Inject constructor(private val context: Context, private
         ) { data ->
             Log.d(tag, "insert >>>> $data")
             if (data.isOk()) {
-                dao.insert(Buddy(f_pin = pin, first_name = username, image_id = "", type = "1"))
-                preferences.put("pin", pin)
+                dao.insert(Buddy(f_pin = me, first_name = username, image_id = "", type = "1"))
             }
             withContext(Dispatchers.Main) {
                 completion(data.isOk())
@@ -62,18 +56,17 @@ class BuddyRepository @Inject constructor(private val context: Context, private
         }
     }
 
-    suspend fun signIn(username: String, password: String, completion: (Boolean) -> Unit) {
-        val preferences = context.getSharedPreferences(
-            namePreference,
-            Context.MODE_PRIVATE
-        )
-        val pin = preferences.optString(key = "pin", default = "")
-        if (pin.isEmpty()) return
+    suspend fun signIn(
+        me: String,
+        username: String,
+        password: String,
+        completion: (Boolean) -> Unit
+    ) {
         Service.sendSync(
             Data(
                 code = "SSI01",
                 status = System.nanoTime().toString(),
-                f_pin = pin,
+                f_pin = me,
                 bodies = mutableMapOf(
                     "A92" to username,
                     "Bm" to password.toMD5()
@@ -82,8 +75,7 @@ class BuddyRepository @Inject constructor(private val context: Context, private
         )?.let { data ->
             Log.d(tag, "insert >>>> $data")
             if (data.isOk()) {
-                dao.insert(Buddy(f_pin = pin, first_name = username, image_id = "", type = "1"))
-                preferences.put("pin", pin)
+                dao.insert(Buddy(f_pin = me, first_name = username, image_id = "", type = "1"))
             }
             withContext(Dispatchers.Main) {
                 completion(data.isOk())
@@ -91,13 +83,7 @@ class BuddyRepository @Inject constructor(private val context: Context, private
         }
     }
 
-    fun addFriend(pin: String) {
-        val preferences = context.getSharedPreferences(
-            namePreference,
-            Context.MODE_PRIVATE
-        )
-        val me = preferences.optString(key = "pin", default = "")
-        if (pin.isEmpty() || me.isEmpty()) return
+    fun addFriend(me: String, pin: String) {
         Service.sendAsync(
             Data(
                 code = "A100",

+ 11 - 9
cpaas-lite/src/main/java/io/nexilis/service/data/viewmodels/BuddyViewModel.kt

@@ -16,7 +16,7 @@ class BuddyViewModel @Inject constructor(private val repository: BuddyRepository
 
     val me: LiveData<Buddy> = repository.me
 
-    fun getBuddy(pin: String) : LiveData<Buddy> {
+    fun getBuddy(pin: String): LiveData<Buddy> {
         return repository.getBuddy(pin)
     }
 
@@ -24,16 +24,18 @@ class BuddyViewModel @Inject constructor(private val repository: BuddyRepository
         repository.insert(buddy)
     }
 
-    fun signUp(username: String, password: String, completion: (Boolean) -> Unit) = viewModelScope.launch {
-        repository.signUp(username, password, completion)
-    }
+    fun signUp(me: String, username: String, password: String, completion: (Boolean) -> Unit) =
+        viewModelScope.launch {
+            repository.signUp(me, username, password, completion)
+        }
 
-    fun signIn(username: String, password: String, completion: (Boolean) -> Unit) = viewModelScope.launch {
-        repository.signIn(username, password, completion)
-    }
+    fun signIn(me: String, username: String, password: String, completion: (Boolean) -> Unit) =
+        viewModelScope.launch {
+            repository.signIn(me, username, password, completion)
+        }
 
-    fun addFriend(pin: String) = viewModelScope.launch {
-        repository.addFriend(pin)
+    fun addFriend(me: String, pin: String) = viewModelScope.launch {
+        repository.addFriend(me, pin)
     }
 
 }