yayan 11 달 전
부모
커밋
923b1efb58

+ 2 - 5
app/src/main/java/io/nexilis/alpha/MainActivity.kt

@@ -20,13 +20,10 @@ class MainActivity : ComponentActivity() {
                 Root()
             }
         }
-    }
-
-    override fun onResume() {
-        super.onResume()
         Api.connect(
-            "D99B0EAC2EED64194BB17FF6ED42069C882410A0AD7BAAE391792EB4A40A67BE",
+            "38747683290F62E9667A018F490396EAE47BC16ADECD85B7E865C733E6DBD6A2",
             this@MainActivity
         )
     }
+
 }

+ 1 - 1
app/src/main/java/io/nexilis/alpha/ui/components/ContentChat.kt

@@ -144,7 +144,7 @@ fun ContentChat(modifier: Modifier = Modifier, message: Message) {
                                 ).addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION)
                             )
                         } else {
-                            progressViewModel.download(context, message)
+                            progressViewModel.download(message)
                         }
                     }
                 }),

+ 3 - 1
app/src/main/java/io/nexilis/alpha/ui/components/Person.kt

@@ -21,7 +21,9 @@ import androidx.compose.ui.platform.LocalContext
 import androidx.compose.ui.unit.dp
 import coil.compose.AsyncImage
 import coil.request.ImageRequest
+import io.nexilis.service.core.domain
 import io.nexilis.service.core.getUnsafeImageLoader
+import io.nexilis.service.core.pref
 import io.nexilis.service.data.entities.Buddy
 
 @Composable
@@ -33,7 +35,7 @@ fun Person(buddy: Buddy) {
         ) {
             AsyncImage(
                 model = ImageRequest.Builder(LocalContext.current)
-                    .data("https://202.158.33.27/filepalio/image/${buddy.image_id}")
+                    .data("${LocalContext.current.pref().domain}/filepalio/image/${buddy.image_id}")
                     .addHeader("Cookie", "PHPSESSID=123;MOBILE=123")
                     .crossfade(true)
                     .build(),

+ 3 - 1
app/src/main/java/io/nexilis/alpha/ui/main/Contact.kt

@@ -25,7 +25,9 @@ import coil.compose.AsyncImage
 import coil.request.ImageRequest
 import io.nexilis.alpha.ui.components.Person
 import io.nexilis.alpha.ui.screen.Screen
+import io.nexilis.service.core.domain
 import io.nexilis.service.core.getUnsafeImageLoader
+import io.nexilis.service.core.pref
 import io.nexilis.service.data.viewmodels.BuddyViewModel
 import io.nexilis.service.data.viewmodels.GroupViewModel
 
@@ -129,7 +131,7 @@ fun GroupContact(navController: NavHostController) {
                     leadingContent = {
                         AsyncImage(
                             model = ImageRequest.Builder(LocalContext.current)
-                                .data("https://202.158.33.27/filepalio/image/${it.image_id}")
+                                .data("${LocalContext.current.pref().domain}/filepalio/image/${it.image_id}")
                                 .addHeader("Cookie", "PHPSESSID=123;MOBILE=123")
                                 .crossfade(true)
                                 .build(),

+ 3 - 1
app/src/main/java/io/nexilis/alpha/ui/main/Home.kt

@@ -16,7 +16,9 @@ import androidx.hilt.navigation.compose.hiltViewModel
 import coil.compose.AsyncImage
 import coil.request.ImageRequest
 import io.nexilis.alpha.R
+import io.nexilis.service.core.domain
 import io.nexilis.service.core.getUnsafeImageLoader
+import io.nexilis.service.core.pref
 import io.nexilis.service.data.viewmodels.BuddyViewModel
 
 @OptIn(ExperimentalFoundationApi::class)
@@ -48,7 +50,7 @@ fun Home(
                 .fillMaxWidth()
             AsyncImage(
                 model = ImageRequest.Builder(LocalContext.current)
-                    .data("https://202.158.33.27/filepalio/image/${buddy?.image_id}")
+                    .data("${LocalContext.current.pref().domain}/filepalio/image/${buddy?.image_id}")
                     .addHeader("Cookie", "PHPSESSID=123;MOBILE=123")
                     .crossfade(true)
                     .build(),

+ 3 - 1
app/src/main/java/io/nexilis/alpha/ui/main/Profile.kt

@@ -33,7 +33,9 @@ import coil.compose.rememberAsyncImagePainter
 import coil.request.ImageRequest
 import io.nexilis.service.Api
 import io.nexilis.service.core.createFile
+import io.nexilis.service.core.domain
 import io.nexilis.service.core.getUnsafeImageLoader
+import io.nexilis.service.core.pref
 import io.nexilis.service.data.entities.Buddy
 import io.nexilis.service.data.viewmodels.BuddyViewModel
 
@@ -94,7 +96,7 @@ fun Profile(contentPadding: PaddingValues = PaddingValues(0.dp), me: Buddy) {
                     rememberAsyncImagePainter(imageUri)
                 else rememberAsyncImagePainter(
                     model = ImageRequest.Builder(LocalContext.current)
-                        .data("https://202.158.33.27/filepalio/image/${me.image_id}")
+                        .data("${LocalContext.current.pref().domain}/filepalio/image/${me.image_id}")
                         .addHeader("Cookie", "PHPSESSID=123;MOBILE=123")
                         .crossfade(true)
                         .build(),

+ 3 - 4
app/src/main/java/io/nexilis/alpha/ui/main/Sign.kt

@@ -20,7 +20,7 @@ import androidx.compose.ui.text.input.VisualTransformation
 import androidx.compose.ui.unit.dp
 import androidx.hilt.navigation.compose.hiltViewModel
 import androidx.navigation.NavHostController
-import io.nexilis.service.core.getSharedPreferences
+import io.nexilis.service.core.pref
 import io.nexilis.service.core.optString
 import io.nexilis.service.data.viewmodels.BuddyViewModel
 
@@ -112,7 +112,6 @@ fun SignUp(
         Spacer(modifier = Modifier.size(8.dp))
         Button(onClick = {
             viewModel.signUp(
-                context,
                 textUsername.text,
                 textConfirmPassword.text
             ) { r, pin ->
@@ -179,8 +178,8 @@ fun SignIn(navController: NavHostController, completion: (Boolean) -> Unit) {
         )
         Spacer(modifier = Modifier.size(8.dp))
         Button(onClick = {
-            val api = context.getSharedPreferences().optString("api", "")
-            viewModel.signIn(context, api, textUsername.text, textPassword.text) { r, pin ->
+            val api = context.pref().optString("api", "")
+            viewModel.signIn(api, textUsername.text, textPassword.text) { r, pin ->
                 completion(r)
             }
         }) {

+ 22 - 10
cpaas-lite/src/main/java/io/nexilis/service/Api.kt

@@ -4,6 +4,7 @@ import android.app.Activity
 import android.content.Context
 import android.content.Intent
 import android.os.Build
+import android.util.Base64
 import android.util.Log
 import android.widget.Toast
 import com.google.firebase.Firebase
@@ -15,10 +16,12 @@ import io.newuniverse.SDK.nuSDKService
 import io.nexilis.service.core.Data
 import io.nexilis.service.core.Network
 import io.nexilis.service.core.decrypt
-import io.nexilis.service.core.getSharedPreferences
+import io.nexilis.service.core.domain
+import io.nexilis.service.core.pref
 import io.nexilis.service.core.optString
 import io.nexilis.service.core.put
 import kotlinx.coroutines.launch
+import org.json.JSONObject
 import java.security.SecureRandom
 import java.util.Locale
 import java.util.concurrent.TimeUnit
@@ -35,10 +38,20 @@ class Api {
 
         fun connect(account: String, activity: Activity) {
             Log.d(tag, "connect:$account")
+            activity.startService(Intent(activity, nuSDKService::class.java))
             Thread {
                 try {
-                    val domain = Network().getSync("https://nexilis.io/dipp/NuN1v3rs3/Qm3r4i0/get_ip_domain?account=$account")
-                    Log.d(tag, "domain:${domain?.decrypt()}")
+                    val urlData = Network().getSync("https://nexilis.io/dipp/NuN1v3rs3/Qm3r4i0/get_ip_domain?account=$account") ?: return@Thread
+                    Log.d(tag, "urlData:${urlData}")
+                    val decode = Base64.decode(urlData, Base64.DEFAULT).toString(Charsets.UTF_8)
+                    val json = JSONObject(decode.decrypt())
+                    val arrayAddress = json.getJSONArray("address")
+                    val domain = json.getString("domain")
+                    val address = arrayAddress.getJSONObject(0)
+                    val ip = address.getString("ip")
+                    val port = address.getString("portA").toInt()
+                    activity.pref().domain = domain
+                    Log.d(tag, "domain:${activity.pref().domain}")
                     val options = FirebaseOptions.Builder()
                         .setProjectId("push-kit-de2e3")
                         .setApplicationId("1:36827599888:android:29e65c0ec8a560c5916695")
@@ -50,11 +63,10 @@ class Api {
                     } catch (e: Exception) {
                         Firebase.initialize(activity.applicationContext, options, FirebaseApp.DEFAULT_APP_NAME)
                     }
-                    activity.startService(Intent(activity, nuSDKService::class.java))
                     while (!nuSDKService.bServiceStarted()) {
                         Thread.sleep(100)
                     }
-                    val preferences = activity.getSharedPreferences()
+                    val preferences = activity.pref()
                     preferences.put(key = "api", value = account)
                     val random =
                         String.format(Locale.getDefault(), "%010d", SecureRandom().nextInt(Int.MAX_VALUE))
@@ -68,12 +80,12 @@ class Api {
                         activity,
                         SdkCallback::class.java,
                         SdkCallback(),
-                        "202.158.33.26",
-                        62823,
+                        ip,
+                        port,
                         session,
                         "09:00",
                         false,
-                        "202.158.33.26:62823"
+                        "$ip:$port"
                     )
                     val signature: String = nuSDKService.getInstance(pass).sGetSignature()
                     if ("1,1,1,1,1,1,1,1,1,1,1,1" != signature) nuSDKService.getInstance(pass)
@@ -128,8 +140,8 @@ class Api {
         }
 
         internal fun sendToken(context: Context, token: String) {
-            if (context.getSharedPreferences().getBoolean("is_login", false)) {
-                context.getSharedPreferences().getString("pin", null)?.let {
+            if (context.pref().getBoolean("is_login", false)) {
+                context.pref().getString("pin", null)?.let {
                     apiScope.launch {
                         Service.sendAsync(
                             Data(

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

@@ -7,7 +7,8 @@ import dagger.hilt.android.EntryPointAccessors
 import io.nexilis.service.core.Data
 import io.nexilis.service.core.IncomingInterface
 import io.nexilis.service.core.Network
-import io.nexilis.service.core.getSharedPreferences
+import io.nexilis.service.core.domain
+import io.nexilis.service.core.pref
 import org.json.JSONObject
 
 class FirebaseService : FirebaseMessagingService() {
@@ -25,7 +26,7 @@ class FirebaseService : FirebaseMessagingService() {
             val json = JSONObject(message.data.toMap())
             if (json.has("message_id")) {
                 json.optString("message_id").let { messageId ->
-                    applicationContext.getSharedPreferences().getString("pin", null)?.let { me ->
+                    applicationContext.pref().getString("pin", null)?.let { me ->
                         pullMessage(messageId, me)
                     }
                 }
@@ -37,7 +38,7 @@ class FirebaseService : FirebaseMessagingService() {
 
     private fun pullMessage(messageId: String, me: String) {
         Network().post(
-            "https://202.158.33.27/pull_notification",
+            "${applicationContext.pref().domain}/pull_notification",
             "message_id=$messageId&pin=$me"
         ) { r, body ->
             if (r && !body.isNullOrEmpty()) {
@@ -52,7 +53,7 @@ class FirebaseService : FirebaseMessagingService() {
                         entryPoint.incoming().process(d) {
                             if (it) {
                                 Network().post(
-                                    "https://202.158.33.27/ack_message",
+                                    "${applicationContext.pref().domain}/ack_message",
                                     "message_id=$messageId&pin=$me"
                                 ) { _, _ ->
                                 }

+ 5 - 1
cpaas-lite/src/main/java/io/nexilis/service/core/Extension.kt

@@ -113,7 +113,7 @@ fun String.toStupidString(): String {
     return URLEncoder.encode(this, "UTF-8").replace("\n", "<NL>").replace("\n", "<CR>")
 }
 
-fun Context.getSharedPreferences(): SharedPreferences {
+fun Context.pref(): SharedPreferences {
     return getSharedPreferences(
         namePreference,
         Context.MODE_PRIVATE
@@ -126,6 +126,10 @@ fun Context.getUnsafeImageLoader(): ImageLoader {
     ).build()
 }
 
+var SharedPreferences.domain
+    get() = this.optString("domain", "")
+    set(value) = this.put("domain", value)
+
 fun InputStream.toFile(context: Context, name: String? = null): File {
     val file = this.use { input ->
         var fileName = name

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

@@ -130,7 +130,7 @@ class Incoming @Inject constructor(
 
     private suspend fun pushMySelf(data: Data) {
         try {
-            val me = context.getSharedPreferences().getString("pin", null)
+            val me = context.pref().getString("pin", null)
             buddyDao.deleteMe()
             buddyDao.insert(
                 Buddy(
@@ -213,7 +213,7 @@ class Incoming @Inject constructor(
 
     private suspend fun pushBuddies(data: Data) {
         try {
-            val me = context.getSharedPreferences().getString("pin", null)
+            val me = context.pref().getString("pin", null)
             val d = data.bodies["A112"] ?: ""
             val jsonArray = JSONArray(d)
             Log.d(tag, "pushBuddies:$jsonArray")
@@ -301,7 +301,7 @@ class Incoming @Inject constructor(
 
     private suspend fun pushGroupBatch(data: Data) {
         try {
-            val me = context.getSharedPreferences().getString("pin", null)
+            val me = context.pref().getString("pin", null)
             val d = data.bodies["A112"] ?: ""
             val jsonArray = JSONArray(d)
             for (i in 0 until jsonArray.length()) {
@@ -360,7 +360,7 @@ class Incoming @Inject constructor(
 
     private suspend fun pushMember(data: Data) {
         try {
-            val me = context.getSharedPreferences().getString("pin", null)
+            val me = context.pref().getString("pin", null)
             groupMemberDao.insert(
                 GroupMember(
                     group_id = data.bodies["A04"] ?: "",
@@ -386,7 +386,7 @@ class Incoming @Inject constructor(
         try {
             val messageId = data.bodies["A18"] ?: ""
             if (messageId.isEmpty()) return
-            val me = context.getSharedPreferences().getString("pin", null)
+            val me = context.pref().getString("pin", null)
             messageDao.getSync(messageId)?.let {
                 Service.sendAck(me, data.status)
                 return
@@ -400,7 +400,7 @@ class Incoming @Inject constructor(
             var uri: Uri? = null
             imageId?.let { fileName ->
                 uri = Network().download(
-                    context, "https://202.158.33.27/filepalio/image/$fileName"
+                    context, "${context.pref().domain}/filepalio/image/$fileName"
                 )
             }
             messageDao.insert(
@@ -504,7 +504,7 @@ class Incoming @Inject constructor(
                 Log.d(tag, "getBuddy:${buddy}")
                 val request = ImageRequest.Builder(context).addHeader("User-Agent", "Mozilla/5.0")
                     .addHeader("Cookie", "PHPSESSID=123;MOBILE=123")
-                    .data("https://202.158.33.27/filepalio/image/${buddy.image_id}")
+                    .data("${context.pref().domain}/filepalio/image/${buddy.image_id}")
                     .transformations(CircleCropTransformation()).build()
                 val drawable =
                     context.getUnsafeImageLoader().execute(request).drawable as BitmapDrawable
@@ -541,7 +541,7 @@ class Incoming @Inject constructor(
 
     private suspend fun statusMessage(data: Data) {
         try {
-            val me = context.getSharedPreferences().getString("pin", null)
+            val me = context.pref().getString("pin", null)
             val messageIds = data.bodies["A18"] ?: ""
             if (messageIds.isEmpty()) return
             val status = data.bodies["A15"]?.toInt() ?: 0

+ 12 - 5
cpaas-lite/src/main/java/io/nexilis/service/core/Network.kt

@@ -7,6 +7,8 @@ import android.os.Build
 import android.util.Log
 import androidx.core.content.FileProvider
 import io.nexilis.service.tag
+import kotlinx.coroutines.CoroutineScope
+import kotlinx.coroutines.launch
 import okhttp3.Call
 import okhttp3.Callback
 import okhttp3.MediaType
@@ -38,6 +40,7 @@ import javax.net.ssl.SSLSocketFactory
 import javax.net.ssl.TrustManager
 import javax.net.ssl.X509TrustManager
 import javax.security.cert.CertificateException
+import kotlin.coroutines.coroutineContext
 
 fun getUnsafeOkHttpClientBuilder(): OkHttpClient.Builder {
     return try {
@@ -187,20 +190,24 @@ class Network {
         return client.newCall(request).execute().body?.string()
     }
 
-    fun download(
+    suspend fun download(
         context: Context,
         url: String,
-        onProgress: ((Long, Long) -> Unit) = { _, _ -> }
+        onProgress: suspend CoroutineScope.(Long, Long) -> Unit = { _, _ -> }
     ): Uri? {
+        val scope = CoroutineScope(coroutineContext)
         val client = getUnsafeOkHttpClientBuilder()
             .addNetworkInterceptor {
                 val originalResponse = it.proceed(it.request())
                 val interceptor = originalResponse.newBuilder()
                     .body(originalResponse.body?.let { it1 ->
                         ProgressResponseBody(
-                            responseBody = it1,
-                            onProgress = onProgress
-                        )
+                            responseBody = it1
+                        ) { byte, length ->
+                            scope.launch {
+                                onProgress.invoke(this, byte, length)
+                            }
+                        }
                     })
                     .build()
                 interceptor

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

@@ -92,7 +92,7 @@ class Outgoing(private val context: Context, parameters: WorkerParameters) :
                     if (fileName.isNotEmpty()) {
                         val file = File(context.filesDir, fileName)
                         val upload = Network().uploadSync(
-                            "https://202.158.33.27/uploader",
+                            "${context.pref().domain}/uploader",
                             file
                         ) { progress, length ->
                             setProgressAsync(

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

@@ -9,7 +9,8 @@ import io.nexilis.service.Api
 import io.nexilis.service.Service
 import io.nexilis.service.core.Data
 import io.nexilis.service.core.Network
-import io.nexilis.service.core.getSharedPreferences
+import io.nexilis.service.core.domain
+import io.nexilis.service.core.pref
 import io.nexilis.service.core.put
 import io.nexilis.service.core.toMD5
 import io.nexilis.service.data.daos.BuddyDao
@@ -21,7 +22,8 @@ import kotlinx.coroutines.withContext
 import java.io.File
 import javax.inject.Inject
 
-class BuddyRepository @Inject constructor(private val dao: BuddyDao) : Repository {
+class BuddyRepository @Inject constructor(private val context: Context, private val dao: BuddyDao) :
+    Repository {
 
     val all: LiveData<List<Buddy>> = dao.getAll()
 
@@ -36,7 +38,6 @@ class BuddyRepository @Inject constructor(private val dao: BuddyDao) : Repositor
     }
 
     suspend fun signUp(
-        context: Context,
         username: String,
         password: String,
         completion: (Boolean, String) -> Unit
@@ -57,7 +58,7 @@ class BuddyRepository @Inject constructor(private val dao: BuddyDao) : Repositor
             val pin = data.bodies["A00real"] ?: ""
             if (data.isOk() && pin.isNotEmpty()) {
                 dao.insert(Buddy(f_pin = pin, first_name = username, image_id = "", type = "1"))
-                context.getSharedPreferences().put(key = "pin", value = pin)
+                context.pref().put(key = "pin", value = pin)
             }
             withContext(Dispatchers.Main) {
                 completion(data.isOk(), pin)
@@ -66,7 +67,6 @@ class BuddyRepository @Inject constructor(private val dao: BuddyDao) : Repositor
     }
 
     suspend fun signIn(
-        context: Context,
         api: String,
         username: String,
         password: String,
@@ -95,8 +95,8 @@ class BuddyRepository @Inject constructor(private val dao: BuddyDao) : Repositor
                 )
             }
             if (pin.isNotEmpty()) {
-                context.getSharedPreferences().put(key = "pin", value = pin)
-                context.getSharedPreferences().put(key = "is_login", value = true)
+                context.pref().put(key = "pin", value = pin)
+                context.pref().put(key = "is_login", value = true)
             }
             FirebaseMessaging.getInstance().token.addOnCompleteListener(OnCompleteListener { task ->
                 if (!task.isSuccessful) {
@@ -159,7 +159,7 @@ class BuddyRepository @Inject constructor(private val dao: BuddyDao) : Repositor
     }
 
     fun changeProfile(me: String, file: File, completion: (Boolean) -> Unit) {
-        Network().upload("https://202.158.33.27/uploader", file) {
+        Network().upload("${context.pref().domain}/uploader", file) {
             if (it) {
                 Service.sendAsync(
                     Data(

+ 19 - 2
cpaas-lite/src/main/java/io/nexilis/service/data/repositories/ProgressRepository.kt

@@ -1,14 +1,22 @@
 package io.nexilis.service.data.repositories
 
+import android.content.Context
 import androidx.lifecycle.LiveData
+import io.nexilis.service.core.Network
+import io.nexilis.service.core.domain
+import io.nexilis.service.core.pref
 import io.nexilis.service.data.daos.ProgressDao
 import io.nexilis.service.data.entities.MainEntity
+import io.nexilis.service.data.entities.Message
 import io.nexilis.service.data.entities.Progress
 import javax.inject.Inject
 
-class ProgressRepository @Inject constructor(private val dao: ProgressDao) : Repository {
+class ProgressRepository @Inject constructor(
+    private val context: Context,
+    private val dao: ProgressDao
+) : Repository {
 
-    fun get(id: String) : LiveData<Progress?> {
+    fun get(id: String): LiveData<Progress?> {
         return dao.get(id)
     }
 
@@ -19,4 +27,13 @@ class ProgressRepository @Inject constructor(private val dao: ProgressDao) : Rep
     override suspend fun insert(entity: MainEntity) {
 
     }
+
+    suspend fun download(message: Message) {
+        Network().download(
+            context,
+            "${context.pref().domain}/filepalio/image/${message.file_id}"
+        ) { value, length ->
+            upsert(Progress(message.message_id, value.toFloat() / length.toFloat()))
+        }
+    }
 }

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

@@ -1,6 +1,5 @@
 package io.nexilis.service.data.viewmodels
 
-import android.content.Context
 import androidx.lifecycle.LiveData
 import androidx.lifecycle.ViewModel
 import androidx.lifecycle.viewModelScope
@@ -27,20 +26,19 @@ class BuddyViewModel @Inject constructor(private val repository: BuddyRepository
         repository.insert(buddy)
     }
 
-    fun signUp(context: Context, username: String, password: String, completion: (Boolean, String) -> Unit) =
+    fun signUp(username: String, password: String, completion: (Boolean, String) -> Unit) =
         viewModelScope.launch(Dispatchers.IO) {
-            repository.signUp(context, username, password, completion)
+            repository.signUp(username, password, completion)
         }
 
     fun signIn(
-        context: Context,
         api: String,
         username: String,
         password: String,
         completion: (Boolean, String) -> Unit
     ) =
         viewModelScope.launch(Dispatchers.IO) {
-            repository.signIn(context, api, username, password, completion)
+            repository.signIn(api, username, password, completion)
         }
 
     fun addFriend(pin: String) = viewModelScope.launch(Dispatchers.IO) {

+ 5 - 13
cpaas-lite/src/main/java/io/nexilis/service/data/viewmodels/ProgressViewModel.kt

@@ -1,12 +1,9 @@
 package io.nexilis.service.data.viewmodels
 
-import android.content.Context
 import androidx.lifecycle.LiveData
 import androidx.lifecycle.ViewModel
 import androidx.lifecycle.viewModelScope
 import dagger.hilt.android.lifecycle.HiltViewModel
-import io.nexilis.service.apiScope
-import io.nexilis.service.core.Network
 import io.nexilis.service.data.entities.Message
 import io.nexilis.service.data.entities.Progress
 import io.nexilis.service.data.repositories.ProgressRepository
@@ -15,21 +12,16 @@ import kotlinx.coroutines.launch
 import javax.inject.Inject
 
 @HiltViewModel
-class ProgressViewModel @Inject constructor(private val repository: ProgressRepository) :
+class ProgressViewModel @Inject constructor(
+    private val repository: ProgressRepository
+) :
     ViewModel() {
 
     fun get(id: String): LiveData<Progress?> {
         return repository.get(id)
     }
 
-    fun download(context: Context, message: Message) = apiScope.launch(Dispatchers.IO) {
-        Network().download(
-            context,
-            "https://202.158.33.27/filepalio/image/${message.file_id}"
-        ) { value, length ->
-            viewModelScope.launch(Dispatchers.IO) {
-                repository.upsert(Progress(message.message_id, value.toFloat() / length.toFloat()))
-            }
-        }
+    fun download(message: Message) = viewModelScope.launch(Dispatchers.IO) {
+        repository.download(message)
     }
 }