From e9b993195389aff3b1fb1bca54233bc34e8ca395 Mon Sep 17 00:00:00 2001 From: arieljovananda88 <jovanandaa@gmail.com> Date: Mon, 1 Apr 2024 13:40:00 +0700 Subject: [PATCH] feat: upload image from local storage --- app/src/main/AndroidManifest.xml | 2 ++ .../example/bondoman/ui/scan/ScanFragment.kt | 33 ++++++++++++++++++- app/src/main/res/drawable/rounded_div.xml | 2 +- .../main/res/drawable/take_photo_button.xml | 4 +++ app/src/main/res/layout/fragment_scan.xml | 26 +++++++++++---- app/src/main/res/values/colors.xml | 1 + build.gradle.kts | 2 +- gradle/wrapper/gradle-wrapper.properties | 2 +- 8 files changed, 62 insertions(+), 10 deletions(-) create mode 100644 app/src/main/res/drawable/take_photo_button.xml diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 70da6e0..326df95 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -7,6 +7,8 @@ <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> <uses-permission android:name="android.permission.INTERNET" /> <uses-permission android:name="android.permission.CAMERA"/> + <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" /> + <application diff --git a/app/src/main/java/com/example/bondoman/ui/scan/ScanFragment.kt b/app/src/main/java/com/example/bondoman/ui/scan/ScanFragment.kt index 91be4a2..fd29788 100644 --- a/app/src/main/java/com/example/bondoman/ui/scan/ScanFragment.kt +++ b/app/src/main/java/com/example/bondoman/ui/scan/ScanFragment.kt @@ -2,6 +2,7 @@ package com.example.bondoman.ui.scan import android.Manifest import android.annotation.SuppressLint +import android.app.Activity import android.app.AlertDialog import android.content.pm.PackageManager import android.os.Bundle @@ -16,7 +17,9 @@ import com.example.bondoman.databinding.FragmentScanBinding import java.util.concurrent.ExecutorService import java.util.concurrent.Executors import android.content.Context +import android.content.Intent import android.graphics.BitmapFactory +import android.provider.MediaStore import android.widget.Toast import androidx.activity.result.contract.ActivityResultContracts import androidx.camera.lifecycle.ProcessCameraProvider @@ -48,6 +51,10 @@ class ScanFragment : Fragment() { private lateinit var cameraExecutor: ExecutorService + private lateinit var imageView: ImageView + + private val PICK_IMAGE_REQUEST = 1 + private val activityResultLauncher = registerForActivityResult( ActivityResultContracts.RequestMultiplePermissions()) @@ -91,6 +98,8 @@ class ScanFragment : Fragment() { viewBinding.imageCaptureButton.setOnClickListener { takePhoto() } + viewBinding.imagePickerButton.setOnClickListener { pickImageFromGallery() } + cameraExecutor = Executors.newSingleThreadExecutor() } @@ -188,6 +197,27 @@ class ScanFragment : Fragment() { } } + private fun pickImageFromGallery() { + val intent = Intent(Intent.ACTION_PICK) + intent.type = "image/*" + startActivityForResult(intent, PICK_IMAGE_REQUEST) + } + + @Deprecated("Deprecated in Java") + override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) { + super.onActivityResult(requestCode, resultCode, data) + + if (requestCode == PICK_IMAGE_REQUEST && resultCode == Activity.RESULT_OK && data != null) { + val imageUri = data.data + imageUri?.let { uri -> + val imageStream = requireActivity().contentResolver.openInputStream(uri) + val imageData = imageStream?.readBytes() + imageData?.let { bytes -> + uploadImage(bytes, requireActivity()) + } + } + } + } private fun showResultDialog(context: Context, imageData: ByteArray, items: List<Item>?) { // Inflate the layout for the dialog @@ -226,7 +256,8 @@ class ScanFragment : Fragment() { private const val TAG = "BondoMan" private val REQUIRED_PERMISSIONS = mutableListOf( - Manifest.permission.CAMERA + Manifest.permission.CAMERA, + Manifest.permission.READ_EXTERNAL_STORAGE ).toTypedArray() } } \ No newline at end of file diff --git a/app/src/main/res/drawable/rounded_div.xml b/app/src/main/res/drawable/rounded_div.xml index 492e3db..e655fbb 100644 --- a/app/src/main/res/drawable/rounded_div.xml +++ b/app/src/main/res/drawable/rounded_div.xml @@ -2,5 +2,5 @@ <shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape="rectangle"> <corners android:radius="8dp" /> <!-- Adjust the radius to your preference --> - <solid android:color="@android:color/white" /> <!-- Set the background color --> + <solid android:color="@color/white" /> <!-- Set the background color --> </shape> diff --git a/app/src/main/res/drawable/take_photo_button.xml b/app/src/main/res/drawable/take_photo_button.xml new file mode 100644 index 0000000..15594d9 --- /dev/null +++ b/app/src/main/res/drawable/take_photo_button.xml @@ -0,0 +1,4 @@ +<shape xmlns:android="http://schemas.android.com/apk/res/android" + android:shape="oval"> + <solid android:color="@color/red" /> +</shape> \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_scan.xml b/app/src/main/res/layout/fragment_scan.xml index 9ba2001..e200e4d 100644 --- a/app/src/main/res/layout/fragment_scan.xml +++ b/app/src/main/res/layout/fragment_scan.xml @@ -10,20 +10,34 @@ <androidx.camera.view.PreviewView android:id="@+id/viewFinder" android:layout_width="match_parent" - android:layout_height="match_parent" > - </androidx.camera.view.PreviewView> + android:layout_height="match_parent" + tools:layout_editor_absoluteX="16dp" + tools:layout_editor_absoluteY="0dp"/> <Button android:id="@+id/imageCaptureButton" - android:layout_width="wrap_content" - android:layout_height="wrap_content" - android:text="Button" + android:layout_width="60dp" + android:layout_height="60dp" + android:background="@drawable/take_photo_button" + app:layout_constraintBottom_toBottomOf="parent" + app:layout_constraintEnd_toEndOf="parent" + app:layout_constraintHorizontal_bias="0.498" + app:layout_constraintStart_toStartOf="parent" + app:layout_constraintTop_toTopOf="parent" + app:layout_constraintVertical_bias="0.831" /> + + <ImageView + android:id="@+id/imagePickerButton" + android:layout_width="60dp" + android:layout_height="59dp" + android:src="@android:drawable/ic_menu_gallery" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintEnd_toEndOf="parent" + app:layout_constraintHorizontal_bias="0.17" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toTopOf="parent" - app:layout_constraintVertical_bias="0.796" /> + app:layout_constraintVertical_bias="0.831" /> <androidx.constraintlayout.widget.Guideline android:id="@+id/vertical_centerline" diff --git a/app/src/main/res/values/colors.xml b/app/src/main/res/values/colors.xml index c8524cd..7a4c95b 100644 --- a/app/src/main/res/values/colors.xml +++ b/app/src/main/res/values/colors.xml @@ -2,4 +2,5 @@ <resources> <color name="black">#FF000000</color> <color name="white">#FFFFFFFF</color> + <color name="red">#FFED1515</color> </resources> \ No newline at end of file diff --git a/build.gradle.kts b/build.gradle.kts index a6711ae..31ed43c 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -1,5 +1,5 @@ // Top-level build file where you can add configuration options common to all sub-projects/modules. plugins { - id("com.android.application") version "8.2.1" apply false + id("com.android.application") version "8.3.0" apply false id("org.jetbrains.kotlin.android") version "1.9.22" apply false } \ No newline at end of file diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index 0290496..a8c69a3 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,6 +1,6 @@ #Mon Mar 11 18:56:50 WIB 2024 distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-8.2-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-8.4-bin.zip zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists -- GitLab