From 03b921936d092c49b46e5a1ddf2ac4b8deedce4b Mon Sep 17 00:00:00 2001 From: Rifqi222 <mrifki193@gmail.com> Date: Sun, 31 Mar 2024 23:56:22 +0700 Subject: [PATCH] feat: finishing scan --- app/build.gradle.kts | 1 + app/src/main/java/com/pbd/psi/MainActivity.kt | 9 --- .../main/java/com/pbd/psi/api/ApiConfig.kt | 4 ++ .../main/java/com/pbd/psi/api/ApiService.kt | 15 +++-- .../main/java/com/pbd/psi/models/UploadReq.kt | 5 ++ .../main/java/com/pbd/psi/models/UploadRes.kt | 7 +++ .../java/com/pbd/psi/ui/scan/ScanFragment.kt | 60 +++++++++++++++++++ 7 files changed, 87 insertions(+), 14 deletions(-) create mode 100644 app/src/main/java/com/pbd/psi/models/UploadReq.kt create mode 100644 app/src/main/java/com/pbd/psi/models/UploadRes.kt diff --git a/app/build.gradle.kts b/app/build.gradle.kts index 2b493d6..13ac181 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -64,6 +64,7 @@ dependencies { implementation ("androidx.camera:camera-video:1.1.0") implementation ("androidx.camera:camera-view:1.1.0") implementation ("androidx.camera:camera-extensions:1.1.0") + implementation("androidx.room:room-common:2.6.1") testImplementation("junit:junit:4.13.2") androidTestImplementation("androidx.test.ext:junit:1.1.5") androidTestImplementation("androidx.test.espresso:espresso-core:3.5.1") diff --git a/app/src/main/java/com/pbd/psi/MainActivity.kt b/app/src/main/java/com/pbd/psi/MainActivity.kt index 9271038..b2d54b2 100644 --- a/app/src/main/java/com/pbd/psi/MainActivity.kt +++ b/app/src/main/java/com/pbd/psi/MainActivity.kt @@ -4,20 +4,13 @@ import android.content.Intent import android.content.SharedPreferences import android.os.Bundle import android.view.Menu -import android.view.MenuItem -import android.view.View import androidx.appcompat.app.AppCompatActivity import androidx.navigation.fragment.NavHostFragment -import androidx.navigation.ui.AppBarConfiguration -import androidx.navigation.ui.setupActionBarWithNavController import androidx.navigation.ui.setupWithNavController import com.google.android.material.bottomnavigation.BottomNavigationView import com.pbd.psi.databinding.ActivityMainBinding import com.pbd.psi.databinding.FragmentSettingsBinding import com.pbd.psi.services.BackgroundService -import android.content.res.ColorStateList - -import android.graphics.Color class MainActivity : AppCompatActivity() { companion object { @@ -63,6 +56,4 @@ class MainActivity : AppCompatActivity() { menuInflater.inflate(R.menu.bottom_nav_menu, menu) return true } - - } diff --git a/app/src/main/java/com/pbd/psi/api/ApiConfig.kt b/app/src/main/java/com/pbd/psi/api/ApiConfig.kt index 05479fc..2a5d76a 100644 --- a/app/src/main/java/com/pbd/psi/api/ApiConfig.kt +++ b/app/src/main/java/com/pbd/psi/api/ApiConfig.kt @@ -15,4 +15,8 @@ object ApiConfig { val api: ApiService by lazy { retrofit.create(ApiService::class.java) } + + fun getApiService(): ApiService { + return retrofit.create(ApiService::class.java) + } } diff --git a/app/src/main/java/com/pbd/psi/api/ApiService.kt b/app/src/main/java/com/pbd/psi/api/ApiService.kt index 4654bbf..340ef5d 100644 --- a/app/src/main/java/com/pbd/psi/api/ApiService.kt +++ b/app/src/main/java/com/pbd/psi/api/ApiService.kt @@ -3,12 +3,10 @@ package com.pbd.psi.api import com.pbd.psi.models.AuthRes import com.pbd.psi.models.LoginReq import com.pbd.psi.models.LoginRes +import com.pbd.psi.models.UploadRes +import okhttp3.MultipartBody import retrofit2.Call -import retrofit2.Response -import retrofit2.http.Body -import retrofit2.http.Header -import retrofit2.http.POST - +import retrofit2.http.* interface ApiService { @@ -21,4 +19,11 @@ interface ApiService { fun auth( @Header("Authorization") authHeader: String ): Call<AuthRes> + + @Multipart + @POST("/api/bill/upload") + fun uploadImage( + @Header("Authorization") token: String, + @Part image: MultipartBody.Part + ): Call<UploadRes> } \ No newline at end of file diff --git a/app/src/main/java/com/pbd/psi/models/UploadReq.kt b/app/src/main/java/com/pbd/psi/models/UploadReq.kt new file mode 100644 index 0000000..285492d --- /dev/null +++ b/app/src/main/java/com/pbd/psi/models/UploadReq.kt @@ -0,0 +1,5 @@ +package com.pbd.psi.models + +import okhttp3.RequestBody + +data class UploadReq(val file: RequestBody) diff --git a/app/src/main/java/com/pbd/psi/models/UploadRes.kt b/app/src/main/java/com/pbd/psi/models/UploadRes.kt new file mode 100644 index 0000000..ed10035 --- /dev/null +++ b/app/src/main/java/com/pbd/psi/models/UploadRes.kt @@ -0,0 +1,7 @@ +package com.pbd.psi.models + +data class UploadRes(val items: Items) + +data class Items(val items: List<Item>) + +data class Item(val name: String, val qty: Int, val price: Double) diff --git a/app/src/main/java/com/pbd/psi/ui/scan/ScanFragment.kt b/app/src/main/java/com/pbd/psi/ui/scan/ScanFragment.kt index b190738..f06cbf8 100644 --- a/app/src/main/java/com/pbd/psi/ui/scan/ScanFragment.kt +++ b/app/src/main/java/com/pbd/psi/ui/scan/ScanFragment.kt @@ -2,7 +2,9 @@ package com.pbd.psi.ui.scan import android.Manifest import android.app.Activity +import android.content.Context import android.content.Intent +import android.graphics.Bitmap import android.graphics.BitmapFactory import android.graphics.drawable.BitmapDrawable import android.net.Uri @@ -21,7 +23,17 @@ import androidx.camera.lifecycle.ProcessCameraProvider import androidx.core.content.ContextCompat import androidx.core.view.isVisible import androidx.fragment.app.Fragment +import com.pbd.psi.LoginActivity +import com.pbd.psi.api.ApiConfig import com.pbd.psi.databinding.FragmentScanBinding +import com.pbd.psi.models.UploadRes +import okhttp3.MediaType.Companion.toMediaTypeOrNull +import okhttp3.MultipartBody +import okhttp3.RequestBody.Companion.toRequestBody +import retrofit2.Call +import retrofit2.Callback +import retrofit2.Response +import java.io.ByteArrayOutputStream class ScanFragment : Fragment() { @@ -78,6 +90,10 @@ class ScanFragment : Fragment() { previewMask() } + binding.sendButton?.setOnClickListener{ + uploadImage() + } + return root } @@ -150,6 +166,50 @@ class ScanFragment : Fragment() { } } + private fun uploadImage() { + var bitmap = (binding.scanView?.foreground as? BitmapDrawable)?.bitmap + if (bitmap == null) { + bitmap = (binding.scanView?.surfaceProvider as? BitmapDrawable)?.bitmap + } + val stream = ByteArrayOutputStream() + bitmap?.compress(Bitmap.CompressFormat.JPEG, 100, stream) + val byteArray = stream.toByteArray() + val requestBody = byteArray.toRequestBody("image/jpeg".toMediaTypeOrNull()) + + val token = requireActivity().getSharedPreferences(LoginActivity.SHARED_PREFS, Context.MODE_PRIVATE) + .getString(LoginActivity.TOKEN, "") + + if (token.isNullOrEmpty()) { + Toast.makeText(requireContext(), "Token not found. Please log in again.", Toast.LENGTH_SHORT).show() + return + } + + val imagePart = MultipartBody.Part.createFormData("file", "image.jpg", requestBody) + + val call = ApiConfig.api.uploadImage("Bearer $token", imagePart) + + call.enqueue(object : Callback<UploadRes> { + override fun onResponse(call: Call<UploadRes>, response: Response<UploadRes>) { + if (response.isSuccessful) { + val responseBody = response.body() + if (responseBody != null) { + val responseString = responseBody.toString() + Toast.makeText(requireContext(), "Image uploaded successfully! Response: $responseString", Toast.LENGTH_LONG).show() + } else { + Toast.makeText(requireContext(), "Image uploaded successfully!", Toast.LENGTH_SHORT).show() + } + previewMask() + } else { + Toast.makeText(requireContext(), "Failed to upload image. Error code: ${response.code()}", Toast.LENGTH_SHORT).show() + } + } + + override fun onFailure(call: Call<UploadRes>, t: Throwable) { + Log.e("UploadError", "Failed to upload image", t) + Toast.makeText(requireContext(), "Network error occurred. Please try again later.", Toast.LENGTH_SHORT).show() + } + }) + } override fun onDestroyView() { super.onDestroyView() -- GitLab