diff --git a/.idea/misc.xml b/.idea/misc.xml index 8978d23db569daa721cb26dde7923f4c673d1fc9..f1044879e31aa73a3e757a2f81a68e7c26bd222a 100644 --- a/.idea/misc.xml +++ b/.idea/misc.xml @@ -1,6 +1,7 @@ +<?xml version="1.0" encoding="UTF-8"?> <project version="4"> <component name="ExternalStorageConfigurationManager" enabled="true" /> - <component name="ProjectRootManager" version="2" languageLevel="JDK_17" default="true" project-jdk-name="jbr-17" project-jdk-type="JavaSDK"> + <component name="ProjectRootManager" version="2" languageLevel="JDK_17" default="true" project-jdk-name="17" project-jdk-type="JavaSDK"> <output url="file://$PROJECT_DIR$/build/classes" /> </component> <component name="ProjectType"> diff --git a/app/build.gradle.kts b/app/build.gradle.kts index c10d88c9eea0c196636a610e5db54b854efdd1ee..7e447f7285ac75ffb47735eb62bed5feb7f63d8d 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -3,7 +3,6 @@ plugins { id("org.jetbrains.kotlin.android") id("kotlin-android") id("kotlin-kapt") - id("kotlin-parcelize") } android { @@ -44,12 +43,11 @@ android { dependencies { val navVersion = "2.7.7" - implementation("androidx.lifecycle:lifecycle-viewmodel-compose:2.7.0") implementation("androidx.core:core-ktx:1.12.0") implementation("androidx.appcompat:appcompat:1.6.1") implementation("androidx.navigation:navigation-fragment-ktx:$navVersion") implementation("androidx.navigation:navigation-ui-ktx:$navVersion") - implementation("com.google.android.material:material:1.11.0") + implementation("com.google.android.material:material:1.9.0") implementation("com.squareup.retrofit2:retrofit:2.9.0") implementation("com.squareup.retrofit2:converter-gson:2.9.0") testImplementation("junit:junit:4.13.2") @@ -57,13 +55,29 @@ dependencies { androidTestImplementation("androidx.test.espresso:espresso-core:3.5.1") implementation("androidx.room:room-runtime:2.6.1") - kapt("androidx.room:room-compiler:2.6.1") + annotationProcessor("androidx.room:room-compiler:2.6.1") kapt("androidx.room:room-compiler:2.6.1") implementation("org.apache.poi:poi:5.2.2") implementation("org.apache.poi:poi-ooxml:5.2.2") - // Graph - implementation("com.github.PhilJay:MPAndroidChart:v3.1.0") + //QR COde + implementation ("com.github.yuriy-budiyev:code-scanner:2.3.0") + + + + + + + + + + + + + + + + } \ No newline at end of file diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 41dd1419ca90126d6785ab09ea5927afe8b7fa40..c26a7a5bd9cf623643f135c7910e14511b0cf123 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -7,7 +7,18 @@ <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" /> <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" android:maxSdkVersion="32" /> - <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> + <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" + android:maxSdkVersion="32" /> + <uses-permission android:name="android.permission.READ_MEDIA_AUDIO" /> + <uses-permission android:name="android.permission.READ_MEDIA_IMAGES" /> + <uses-permission android:name="android.permission.READ_MEDIA_VIDEO" /> + + <uses-permission android:name="android.permission.CAMERA"/> + + <uses-feature + android:name="android.hardware.camera" + android:required="false"/> + <application android:name=".BondowowoApp" diff --git a/app/src/main/java/com/atm/bondowowo/ui/scan/ScanFragment.kt b/app/src/main/java/com/atm/bondowowo/ui/scan/ScanFragment.kt index 6dab1a1b91d5d7d714d164a033826cdff2b3a136..13d2dbb861c9d51b5a496376f8c0f56cb6277be3 100644 --- a/app/src/main/java/com/atm/bondowowo/ui/scan/ScanFragment.kt +++ b/app/src/main/java/com/atm/bondowowo/ui/scan/ScanFragment.kt @@ -1,6 +1,61 @@ package com.atm.bondowowo.ui.scan +import android.Manifest +import android.content.pm.PackageManager +import android.os.Bundle +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import android.widget.Toast +import androidx.core.app.ActivityCompat +import androidx.core.content.ContextCompat import androidx.fragment.app.Fragment +import com.atm.bondowowo.R +import com.budiyev.android.codescanner.CodeScanner +import com.budiyev.android.codescanner.CodeScannerView +import com.budiyev.android.codescanner.DecodeCallback +class ScanFragment : Fragment() { + private val CAMERA_PERMISSION_REQUEST_CODE = 100 + private lateinit var codeScanner: CodeScanner -class ScanFragment : Fragment() + override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? { + return inflater.inflate(R.layout.fragment_scan, container, false) + } + + override fun onViewCreated(view: View, savedInstanceState: Bundle?) { + super.onViewCreated(view, savedInstanceState) + val scannerView = view.findViewById<CodeScannerView>(R.id.scanner) + + // Check camera permission + if (ContextCompat.checkSelfPermission(requireContext(), Manifest.permission.CAMERA) != PackageManager.PERMISSION_GRANTED) { + ActivityCompat.requestPermissions(requireActivity(), arrayOf(Manifest.permission.CAMERA), CAMERA_PERMISSION_REQUEST_CODE) + } else { + initializeCodeScanner(scannerView) + } + } + + private fun initializeCodeScanner(scannerView: CodeScannerView) { + codeScanner = CodeScanner(requireActivity(), scannerView) + codeScanner.decodeCallback = DecodeCallback { + requireActivity().runOnUiThread { + Toast.makeText(requireContext(), "Scanned: ${it.text}", Toast.LENGTH_LONG).show() + } + } + scannerView.setOnClickListener { + codeScanner.startPreview() + } + } + + override fun onRequestPermissionsResult(requestCode: Int, permissions: Array<out String>, grantResults: IntArray) { + super.onRequestPermissionsResult(requestCode, permissions, grantResults) + if (requestCode == CAMERA_PERMISSION_REQUEST_CODE) { + if (grantResults.isNotEmpty() && grantResults[0] == PackageManager.PERMISSION_GRANTED) { + val scannerView = requireView().findViewById<CodeScannerView>(R.id.scanner) + initializeCodeScanner(scannerView) + } else { + Toast.makeText(requireContext(), "Camera permission denied", Toast.LENGTH_SHORT).show() + } + } + } +} diff --git a/app/src/main/java/com/atm/bondowowo/ui/settings/SendEmailActivity.kt b/app/src/main/java/com/atm/bondowowo/ui/settings/SendEmailActivity.kt index 913bb23b4bddcfaa1a579c4c325b7012b4b14e66..7ef6c707decbb56ad0661c490cd639a98a4be4c8 100644 --- a/app/src/main/java/com/atm/bondowowo/ui/settings/SendEmailActivity.kt +++ b/app/src/main/java/com/atm/bondowowo/ui/settings/SendEmailActivity.kt @@ -1,14 +1,16 @@ package com.atm.bondowowo.ui.settings -import android.content.Context import android.content.Intent -import android.net.Uri import androidx.appcompat.app.AppCompatActivity import android.os.Bundle import android.widget.Toast import androidx.core.content.FileProvider import com.atm.bondowowo.R import java.io.File +import android.content.pm.PackageManager + + + class SendEmailActivity : AppCompatActivity() { @@ -25,23 +27,24 @@ class SendEmailActivity : AppCompatActivity() { if (file != null && file.exists()) { val uri = FileProvider.getUriForFile(this, "${packageName}.fileprovider", file) -// val uri = FileProvider.getUriForFile(this, "${packageName}.fileprovider", File("/storage/emulated/0/Android/data/com.atm.bondowowo/files/transaction_data.xlsx")) -// val uri = Uri.fromFile(file) + + val resInfoList = packageManager.queryIntentActivities(Intent(Intent.ACTION_SEND).apply { + type = "application/vnd.ms-excel" + putExtra(Intent.EXTRA_STREAM, uri) + }, PackageManager.MATCH_DEFAULT_ONLY) + + for (resolveInfo in resInfoList) { + val packageName = resolveInfo.activityInfo.packageName + grantUriPermission(packageName, uri, Intent.FLAG_GRANT_WRITE_URI_PERMISSION or Intent.FLAG_GRANT_READ_URI_PERMISSION) + } val emailIntent = Intent(Intent.ACTION_SEND) emailIntent.type = "application/vnd.ms-excel" -// emailIntent.type = "message/rfc822" - emailIntent.putExtra(Intent.EXTRA_EMAIL, arrayOf("shidqizh@gmail.com")) -// emailIntent.putExtra(Intent.EXTRA_SUBJECT, file.toString()) + emailIntent.putExtra(Intent.EXTRA_EMAIL, arrayOf("shidqizh@gmail.com")) // tar benerin ini kirim ke user yang lagi login emailIntent.putExtra(Intent.EXTRA_SUBJECT, "Export File") - emailIntent.putExtra(Intent.EXTRA_TEXT, "Berikut terlampir file transaksi dalam format spreadsheet.") -// emailIntent.putExtra(Intent.EXTRA_TEXT, uri.toString()) - emailIntent.putExtra(Intent.EXTRA_STREAM, uri) - emailIntent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION) - try { startActivity(Intent.createChooser(emailIntent, "Send mail...")) } catch (ex: android.content.ActivityNotFoundException) { @@ -52,7 +55,6 @@ class SendEmailActivity : AppCompatActivity() { } } - private fun getLatestFileFromStorage(): File? { val directoryPath = "/storage/emulated/0/Android/data/com.atm.bondowowo/files" val directory = File(directoryPath) diff --git a/app/src/main/res/layout/fragment_scan.xml b/app/src/main/res/layout/fragment_scan.xml index 94e66ceffcca01ce964fcb6cbee53c0819c792cc..36b25531628c364f13e92516cd573573bdeaba13 100644 --- a/app/src/main/res/layout/fragment_scan.xml +++ b/app/src/main/res/layout/fragment_scan.xml @@ -24,28 +24,34 @@ android:textStyle="bold" /> </com.google.android.material.appbar.AppBarLayout> - <TextureView - android:id="@+id/camera_preview" - android:layout_width="300dp" - android:layout_height="400dp" - android:background="@color/black" - app:layout_constraintBottom_toTopOf="@id/capture_button" - app:layout_constraintEnd_toEndOf="parent" - app:layout_constraintHorizontal_bias="0.495" - app:layout_constraintStart_toStartOf="parent" - app:layout_constraintTop_toBottomOf="@id/header" - app:layout_constraintVertical_bias="0.508" /> - - <Button - android:id="@+id/capture_button" - android:layout_width="wrap_content" - android:layout_height="wrap_content" - android:layout_marginBottom="124dp" - android:text="@string/capture" - app:cornerRadius="999dp" - app:layout_constraintBottom_toBottomOf="parent" - app:layout_constraintEnd_toEndOf="parent" - app:layout_constraintHorizontal_bias="0.498" - app:layout_constraintStart_toStartOf="parent" /> + <LinearLayout + xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:app="http://schemas.android.com/apk/res-auto" + xmlns:tools="http://schemas.android.com/tools" + android:layout_width="match_parent" + android:layout_marginTop="40dp" + android:layout_height="match_parent" + android:orientation="vertical" + tools:contex="com.atm.bondowowo.ui.scan.ScanFragment"> + + <com.budiyev.android.codescanner.CodeScannerView + android:id="@+id/scanner" + android:layout_width="match_parent" + android:layout_height="600dp" + app:autoFocusButtonVisible="true"/> + + <TextView + android:id="@+id/tv_output" + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:layout_marginTop="20dp" + android:text="The result is here" + android:textAlignment="center" + android:textSize="20sp" + android:textColor="#A92B"/> + + </LinearLayout> + + </androidx.constraintlayout.widget.ConstraintLayout>