diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 70da6e001c2da30dc34f8a24ca2da1945d4bf4b2..326df95d756d958680c6f6a32c15173983dfc900 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 91be4a2ef472d0eab7bbc3ae712c9e281adbafdd..fd29788ef94324c0c0e10664486759862c27caa5 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 492e3db8ecc9786c346010f0c46e6c3cd34a269a..e655fbbbbf01bae91f47e5619bab7ff976b9b939 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 0000000000000000000000000000000000000000..15594d98b42e7458206c874fe3397963b65198ad --- /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 9ba2001fdf45705d6a60b7a008a5cff421454e11..e200e4d5e56b28cc177a6fb4b9a35de6a7c3e43b 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 c8524cd961d27b6695e755c6ef2d4d58cf38431e..7a4c95b2fb7a917498376463c34ea6eedc5a3303 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 a6711ae4bb2aa2ece2ee114e6a81933141669b25..31ed43cc99341f5b95f5b15fd54f84d14a585002 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 02904965b35e9ae3b165ce4a37be9137ffdf1893..a8c69a358c4d7579f04295edb8927a99450052d2 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