diff --git a/app/build.gradle.kts b/app/build.gradle.kts index 817f3b3237a623d53cded35747879863f5d77727..2ee2962cb09d26470512fe163883f2bd43f8a553 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -56,6 +56,9 @@ dependencies { implementation(libs.poi.ooxml) implementation(libs.androidx.activity) implementation(libs.play.services.location) + implementation(libs.camera.core) + implementation(libs.camera.lifecycle) + implementation(libs.camera.view) annotationProcessor(libs.androidx.room.compiler) kapt(libs.androidx.room.compiler) implementation(libs.androidx.legacy.support.v4) diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 76e4f616973a0c16f369658a8e06df83c26a14d9..c3af3ac6c9e52e8c623da9d2cdec450a3779b2a9 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -3,6 +3,9 @@ xmlns:tools="http://schemas.android.com/tools"> <uses-permission android:name="android.permission.INTERNET" /> + <uses-permission android:name="android.permission.CAMERA" /> + <uses-feature android:name="android.hardware.camera.any" /> + <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" /> <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" /> diff --git a/app/src/main/java/com/example/abe/MainActivity.kt b/app/src/main/java/com/example/abe/MainActivity.kt index f3174b2c3f3b49fd0c8f869149c50ae1b83590ef..e0b9c7d5de845c43a164e52fde42fb089d274afb 100644 --- a/app/src/main/java/com/example/abe/MainActivity.kt +++ b/app/src/main/java/com/example/abe/MainActivity.kt @@ -7,8 +7,8 @@ import android.content.Context import android.content.Intent import android.content.IntentFilter import android.os.Bundle -import android.util.Log import android.view.View +import android.widget.Toast import androidx.activity.result.contract.ActivityResultContracts import androidx.activity.viewModels import androidx.appcompat.app.AppCompatActivity @@ -47,7 +47,7 @@ class MainActivity : AppCompatActivity(), ExportAlertDialogFragment.ExportAlertD } private lateinit var connectivityObserver: ConnectivityObserver - private lateinit var networkState:ConnectivityObserver.NetworkState + private lateinit var networkState: ConnectivityObserver.NetworkState private lateinit var user: String @@ -63,6 +63,9 @@ class MainActivity : AppCompatActivity(), ExportAlertDialogFragment.ExportAlertD val bundle = Bundle().apply { putInt("random_amount", randomAmount) } + navController.navigate( + R.id.action_navigation_settings_to_navigation_transactions + ) navController.navigate( R.id.action_navigation_transactions_to_navigation_form_transaction, bundle @@ -91,6 +94,7 @@ class MainActivity : AppCompatActivity(), ExportAlertDialogFragment.ExportAlertD appBarConfiguration = AppBarConfiguration( setOf( R.id.navigation_transactions, + R.id.navigation_settings, R.id.navigation_graph ) ) @@ -105,7 +109,7 @@ class MainActivity : AppCompatActivity(), ExportAlertDialogFragment.ExportAlertD LocalBroadcastManager.getInstance(this).registerReceiver(br, filter) val serviceIntent = Intent(this, AuthService::class.java) - startService(serviceIntent); + startService(serviceIntent) connectivityObserver = NetworkConnectivityObserver(applicationContext) connectivityObserver.observe().onEach { @@ -210,6 +214,11 @@ class MainActivity : AppCompatActivity(), ExportAlertDialogFragment.ExportAlertD viewModel.exportTransactionsToExcel( applicationContext.contentResolver, uri, user ) + Toast.makeText( + applicationContext, + "Successfully saved transaction to storage", + Toast.LENGTH_LONG + ).show() } } } @@ -219,7 +228,7 @@ class MainActivity : AppCompatActivity(), ExportAlertDialogFragment.ExportAlertD super.onDestroy() LocalBroadcastManager.getInstance(this).registerReceiver(br, filter) val serviceIntent = Intent(this, AuthService::class.java) - stopService(serviceIntent); + stopService(serviceIntent) } override fun onSupportNavigateUp(): Boolean { diff --git a/app/src/main/java/com/example/abe/MainActivityViewModel.kt b/app/src/main/java/com/example/abe/MainActivityViewModel.kt index f57c4241e06e3787055308f09038ee868bb3cd43..632c54d5072e132ea639b69d5aeb28e15a541b63 100644 --- a/app/src/main/java/com/example/abe/MainActivityViewModel.kt +++ b/app/src/main/java/com/example/abe/MainActivityViewModel.kt @@ -19,28 +19,27 @@ class MainActivityViewModel(private val transactionRepository: TransactionReposi var newExcelFormat: Boolean = false fun getExportFileName(): String { - val date = SimpleDateFormat("yyyy-MM-dd_hh:mm:ss" , Locale.ENGLISH).format(Date()) + val date = SimpleDateFormat("yyyy-MM-dd_hh-mm-ss" , Locale.ENGLISH).format(Date()) return "Daftar-Transaksi_$date" } suspend fun exportTransactionsToExcel(contentResolver: ContentResolver, uri: Uri, user: String) { val headerList = listOf("ID Transaksi", "Email", "Judul", "Nominal", "Pengeluaran", "Waktu Transasksi") - val transactions = transactionRepository.getAll(user).value + val transactions = transactionRepository.getAll(user) + val dataList = mutableListOf<List<String>>() val currencyFormatter = FormatCurrencyUseCase() - if (transactions != null) { - for (trx in transactions) { - val rowData = listOf<String>( - trx.id.toString(), - trx.email, - trx.title, - currencyFormatter(trx.amount), - if (trx.isExpense) "Ya" else "Tidak", - SimpleDateFormat("d MMM yyyy" , Locale.ENGLISH).format(trx.timestamp) - ) - dataList.add(rowData) - } + for (trx in transactions) { + val rowData = listOf<String>( + trx.id.toString(), + trx.email, + trx.title, + currencyFormatter(trx.amount), + if (trx.isExpense) "Ya" else "Tidak", + SimpleDateFormat("d MMM yyyy" , Locale.ENGLISH).format(trx.timestamp) + ) + dataList.add(rowData) } val generateExcel = GenerateExcelUseCase(newExcelFormat, contentResolver, uri, "Transaksi", headerList, dataList) diff --git a/app/src/main/java/com/example/abe/data/TransactionDAO.kt b/app/src/main/java/com/example/abe/data/TransactionDAO.kt index 64be7b656a7feb231d8dde067791772a1ec493d4..3dda96965e6c03661ab3d23607972eefa1c26989 100644 --- a/app/src/main/java/com/example/abe/data/TransactionDAO.kt +++ b/app/src/main/java/com/example/abe/data/TransactionDAO.kt @@ -23,7 +23,10 @@ interface TransactionDAO { suspend fun deleteAll() @Query("SELECT * FROM transactions WHERE email = :email") - fun getAll(vararg email: String): LiveData<List<Transaction>> + fun getAllObservable(vararg email: String): LiveData<List<Transaction>> + + @Query("SELECT * FROM transactions WHERE email = :email") + suspend fun getAll(vararg email: String): List<Transaction> @Query("SELECT * FROM transactions WHERE id = :id") suspend fun getById(id: Int): Transaction diff --git a/app/src/main/java/com/example/abe/data/TransactionRepository.kt b/app/src/main/java/com/example/abe/data/TransactionRepository.kt index 487f2c2082aafa5e5fed68d231d9e884ba3c1a38..be06b77be5b9af340837eee3bdbcf74f37297898 100644 --- a/app/src/main/java/com/example/abe/data/TransactionRepository.kt +++ b/app/src/main/java/com/example/abe/data/TransactionRepository.kt @@ -5,7 +5,12 @@ import androidx.lifecycle.LiveData class TransactionRepository(private val transactionDAO: TransactionDAO) { - fun getAll(email: String): LiveData<List<Transaction>> { + fun getAllObservable(email: String): LiveData<List<Transaction>> { + return transactionDAO.getAllObservable(email) + } + + @WorkerThread + suspend fun getAll(email: String): List<Transaction> { return transactionDAO.getAll(email) } diff --git a/app/src/main/java/com/example/abe/services/AuthService.kt b/app/src/main/java/com/example/abe/services/AuthService.kt index 02cf0054244801fb834833dd008b9603de898942..131e986a73fc3a1690fd9ff8573b84af43215a7a 100644 --- a/app/src/main/java/com/example/abe/services/AuthService.kt +++ b/app/src/main/java/com/example/abe/services/AuthService.kt @@ -22,7 +22,6 @@ class AuthService : Service(), CheckAuthResultCallback { isRunning = true Thread { while (isRunning) { - Log.d("ABE-SRV", "Service still running") val retrofit = Retrofit() val sharedPref = getSharedPreferences( getString(R.string.preference_file_key), @@ -31,7 +30,7 @@ class AuthService : Service(), CheckAuthResultCallback { val token = sharedPref.getString("login_token", "").toString() retrofit.checkAuth(token, this) try { - Thread.sleep(10000) + Thread.sleep(30000) } catch (e: InterruptedException) { e.printStackTrace() } diff --git a/app/src/main/java/com/example/abe/ui/settings/settingsFragment.kt b/app/src/main/java/com/example/abe/ui/settings/settingsFragment.kt new file mode 100644 index 0000000000000000000000000000000000000000..7acd7f6a7f30a521c256f9427f380e7de1cf53fa --- /dev/null +++ b/app/src/main/java/com/example/abe/ui/settings/settingsFragment.kt @@ -0,0 +1,58 @@ +package com.example.abe.ui.settings + +import android.content.Intent +import android.os.Bundle +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import androidx.fragment.app.Fragment +import androidx.localbroadcastmanager.content.LocalBroadcastManager +import com.example.abe.databinding.FragmentSettingsBinding +import com.example.abe.ui.transactions.ExportAlertDialogFragment +import com.example.abe.ui.transactions.ExportAlertDialogTypeEnum + +class SettingsFragment : Fragment() { + + private var _binding: FragmentSettingsBinding? = null + private val binding get() = _binding!! + + override fun onCreateView( + inflater: LayoutInflater, + container: ViewGroup?, + savedInstanceState: Bundle? + ): View { + _binding = FragmentSettingsBinding.inflate(inflater, container, false) + + binding.clSave.setOnClickListener { + ExportAlertDialogFragment.newInstance(ExportAlertDialogTypeEnum.EXPORT) + .show(requireActivity().supportFragmentManager, "EXPORT_DIALOG") + } + + binding.clSend.setOnClickListener { + ExportAlertDialogFragment.newInstance(ExportAlertDialogTypeEnum.SEND_EMAIL) + .show(requireActivity().supportFragmentManager, "EXPORT_DIALOG") + } + + binding.clRandomize.setOnClickListener { + Intent().also { intent -> + intent.setAction("RANDOMIZE_TRANSACTION") + intent.putExtra("random_amount", (10000..100000).random()) + LocalBroadcastManager.getInstance(requireContext()).sendBroadcast(intent) + } + } + + binding.clLogout.setOnClickListener { + Intent().also { intent -> + intent.setAction("EXPIRED_TOKEN") + LocalBroadcastManager.getInstance(requireActivity().applicationContext).sendBroadcast(intent) + } + } + + return binding.root + } + + override fun onDestroyView() { + super.onDestroyView() + _binding = null + } +} \ No newline at end of file diff --git a/app/src/main/java/com/example/abe/ui/transactions/TransactionFragment.kt b/app/src/main/java/com/example/abe/ui/transactions/TransactionFragment.kt index 6acd1f46e1f5b0fec0d8d746bfc80676d0fdb3cb..a9604587b5fc95659f41aae0fff8b89acb75c140 100644 --- a/app/src/main/java/com/example/abe/ui/transactions/TransactionFragment.kt +++ b/app/src/main/java/com/example/abe/ui/transactions/TransactionFragment.kt @@ -1,14 +1,12 @@ package com.example.abe.ui.transactions import android.content.Context -import android.content.Intent import android.os.Bundle import android.view.LayoutInflater import android.view.View import android.view.ViewGroup import androidx.fragment.app.Fragment import androidx.fragment.app.viewModels -import androidx.localbroadcastmanager.content.LocalBroadcastManager import androidx.recyclerview.widget.LinearLayoutManager import com.example.abe.ABEApplication import com.example.abe.R @@ -56,24 +54,6 @@ class TransactionFragment : Fragment() { } } - binding.fabExport.setOnClickListener { - ExportAlertDialogFragment.newInstance(ExportAlertDialogTypeEnum.EXPORT) - .show(requireActivity().supportFragmentManager, "EXPORT_DIALOG") - } - - binding.fabEmail.setOnClickListener { - ExportAlertDialogFragment.newInstance(ExportAlertDialogTypeEnum.SEND_EMAIL) - .show(requireActivity().supportFragmentManager, "EXPORT_DIALOG") - } - - binding.fabRandom.setOnClickListener { - Intent().also { intent -> - intent.setAction("RANDOMIZE_TRANSACTION") - intent.putExtra("random_amount", (10000..100000).random()) - LocalBroadcastManager.getInstance(requireContext()).sendBroadcast(intent) - } - } - binding.addTransactionBtn.setOnClickListener { (activity as FragmentListener).onIntentReceived("OPEN_FORM", "") } diff --git a/app/src/main/java/com/example/abe/ui/transactions/TransactionViewModel.kt b/app/src/main/java/com/example/abe/ui/transactions/TransactionViewModel.kt index 76bcd3688e4213aaa490462f81161ae52e8f0569..0439e20100b49ae6e598e593a6a9fbc42d42ccf4 100644 --- a/app/src/main/java/com/example/abe/ui/transactions/TransactionViewModel.kt +++ b/app/src/main/java/com/example/abe/ui/transactions/TransactionViewModel.kt @@ -10,7 +10,7 @@ import com.example.abe.data.TransactionRepository class TransactionViewModel(private val transactionRepository: TransactionRepository) : ViewModel() { fun getAllTransactions(user: String): LiveData<List<Transaction>> { - return transactionRepository.getAll(user) + return transactionRepository.getAllObservable(user) } } diff --git a/app/src/main/res/drawable/baseline_add_24.xml b/app/src/main/res/drawable/baseline_add_24.xml index 067a32546e29187c14e397455c7f5f1772238b2f..622c544ab8b7359d1e3e2a955239cf3eb0eb9fef 100644 --- a/app/src/main/res/drawable/baseline_add_24.xml +++ b/app/src/main/res/drawable/baseline_add_24.xml @@ -1,5 +1,5 @@ <vector xmlns:android="http://schemas.android.com/apk/res/android" android:height="20dp" android:tint="#FFFFFF" android:viewportHeight="24" android:viewportWidth="24" android:width="20dp"> - <path android:fillColor="@android:color/white" android:pathData="M19,13h-6v6h-2v-6H5v-2h6V5h2v6h6v2z"/> + <path android:fillColor="@android:color/black" android:pathData="M19,13h-6v6h-2v-6H5v-2h6V5h2v6h6v2z"/> </vector> diff --git a/app/src/main/res/drawable/ic_dices.xml b/app/src/main/res/drawable/ic_dices.xml new file mode 100644 index 0000000000000000000000000000000000000000..571d22488f353137eddbcc5030d4998c9b6d1873 --- /dev/null +++ b/app/src/main/res/drawable/ic_dices.xml @@ -0,0 +1,52 @@ +<vector xmlns:android="http://schemas.android.com/apk/res/android" + android:width="20dp" + android:height="20dp" + android:viewportWidth="20" + android:viewportHeight="20"> + <group> + <clip-path + android:pathData="M0,0h20v20h-20z"/> + <path + android:pathData="M10,8.333H3.333C2.413,8.333 1.667,9.08 1.667,10V16.667C1.667,17.587 2.413,18.333 3.333,18.333H10C10.92,18.333 11.667,17.587 11.667,16.667V10C11.667,9.08 10.92,8.333 10,8.333Z" + android:strokeLineJoin="round" + android:strokeWidth="2" + android:fillColor="#00000000" + android:strokeColor="#9759C4" + android:strokeLineCap="round"/> + <path + android:pathData="M14.933,11.667L17.85,8.75C18.159,8.407 18.33,7.962 18.33,7.5C18.33,7.038 18.159,6.593 17.85,6.25L13.683,2.15C13.34,1.841 12.895,1.67 12.433,1.67C11.972,1.67 11.526,1.841 11.183,2.15L8.333,5" + android:strokeLineJoin="round" + android:strokeWidth="2" + android:fillColor="#00000000" + android:strokeColor="#9759C4" + android:strokeLineCap="round"/> + <path + android:pathData="M5,15H5.008" + android:strokeLineJoin="round" + android:strokeWidth="2" + android:fillColor="#00000000" + android:strokeColor="#9759C4" + android:strokeLineCap="round"/> + <path + android:pathData="M8.333,11.667H8.342" + android:strokeLineJoin="round" + android:strokeWidth="2" + android:fillColor="#00000000" + android:strokeColor="#9759C4" + android:strokeLineCap="round"/> + <path + android:pathData="M12.5,5H12.508" + android:strokeLineJoin="round" + android:strokeWidth="2" + android:fillColor="#00000000" + android:strokeColor="#9759C4" + android:strokeLineCap="round"/> + <path + android:pathData="M15,7.5H15.008" + android:strokeLineJoin="round" + android:strokeWidth="2" + android:fillColor="#00000000" + android:strokeColor="#9759C4" + android:strokeLineCap="round"/> + </group> +</vector> diff --git a/app/src/main/res/drawable/ic_log_out.xml b/app/src/main/res/drawable/ic_log_out.xml new file mode 100644 index 0000000000000000000000000000000000000000..35da1c9282581a31d676cd75c0b221a72ce6e211 --- /dev/null +++ b/app/src/main/res/drawable/ic_log_out.xml @@ -0,0 +1,27 @@ +<vector xmlns:android="http://schemas.android.com/apk/res/android" + android:width="20dp" + android:height="20dp" + android:viewportWidth="20" + android:viewportHeight="20"> + <path + android:pathData="M7.5,17.5H4.167C3.725,17.5 3.301,17.324 2.988,17.012C2.676,16.699 2.5,16.275 2.5,15.833V4.167C2.5,3.725 2.676,3.301 2.988,2.988C3.301,2.675 3.725,2.5 4.167,2.5H7.5" + android:strokeLineJoin="round" + android:strokeWidth="1.66667" + android:fillColor="#00000000" + android:strokeColor="#C81823" + android:strokeLineCap="round"/> + <path + android:pathData="M13.333,14.167L17.5,10L13.333,5.833" + android:strokeLineJoin="round" + android:strokeWidth="1.66667" + android:fillColor="#00000000" + android:strokeColor="#C81823" + android:strokeLineCap="round"/> + <path + android:pathData="M17.5,10H7.5" + android:strokeLineJoin="round" + android:strokeWidth="1.66667" + android:fillColor="#00000000" + android:strokeColor="#C81823" + android:strokeLineCap="round"/> +</vector> diff --git a/app/src/main/res/drawable/ic_save.xml b/app/src/main/res/drawable/ic_save.xml new file mode 100644 index 0000000000000000000000000000000000000000..da9e167a4392fdc782d8b933a3d4e37556e29505 --- /dev/null +++ b/app/src/main/res/drawable/ic_save.xml @@ -0,0 +1,27 @@ +<vector xmlns:android="http://schemas.android.com/apk/res/android" + android:width="20dp" + android:height="20dp" + android:viewportWidth="20" + android:viewportHeight="20"> + <path + android:pathData="M15.833,17.5H4.167C3.725,17.5 3.301,17.324 2.988,17.012C2.676,16.699 2.5,16.275 2.5,15.833V4.167C2.5,3.725 2.676,3.301 2.988,2.988C3.301,2.675 3.725,2.5 4.167,2.5H13.333L17.5,6.667V15.833C17.5,16.275 17.324,16.699 17.012,17.012C16.699,17.324 16.275,17.5 15.833,17.5Z" + android:strokeLineJoin="round" + android:strokeWidth="1.66667" + android:fillColor="#00000000" + android:strokeColor="#8346AA" + android:strokeLineCap="round"/> + <path + android:pathData="M14.167,17.5V10.833H5.833V17.5" + android:strokeLineJoin="round" + android:strokeWidth="1.66667" + android:fillColor="#00000000" + android:strokeColor="#8346AA" + android:strokeLineCap="round"/> + <path + android:pathData="M5.833,2.5V6.667H12.5" + android:strokeLineJoin="round" + android:strokeWidth="1.66667" + android:fillColor="#00000000" + android:strokeColor="#8346AA" + android:strokeLineCap="round"/> +</vector> diff --git a/app/src/main/res/drawable/ic_send.xml b/app/src/main/res/drawable/ic_send.xml new file mode 100644 index 0000000000000000000000000000000000000000..0ded3dad0d9e37ea0c5770e79f2a4423cfb4833a --- /dev/null +++ b/app/src/main/res/drawable/ic_send.xml @@ -0,0 +1,24 @@ +<vector xmlns:android="http://schemas.android.com/apk/res/android" + android:width="20dp" + android:height="20dp" + android:viewportWidth="20" + android:viewportHeight="20"> + <group> + <clip-path + android:pathData="M0,0h20v20h-20z"/> + <path + android:pathData="M18.333,1.667L12.5,18.333L9.167,10.833L1.667,7.5L18.333,1.667Z" + android:strokeLineJoin="round" + android:strokeWidth="1.66667" + android:fillColor="#00000000" + android:strokeColor="#8346AA" + android:strokeLineCap="round"/> + <path + android:pathData="M18.333,1.667L9.167,10.833" + android:strokeLineJoin="round" + android:strokeWidth="1.66667" + android:fillColor="#00000000" + android:strokeColor="#8346AA" + android:strokeLineCap="round"/> + </group> +</vector> diff --git a/app/src/main/res/layout/fragment_settings.xml b/app/src/main/res/layout/fragment_settings.xml new file mode 100644 index 0000000000000000000000000000000000000000..a18339ec9adcd61f0f47b001a69842e65ba52213 --- /dev/null +++ b/app/src/main/res/layout/fragment_settings.xml @@ -0,0 +1,149 @@ +<?xml version="1.0" encoding="utf-8"?> +<androidx.constraintlayout.widget.ConstraintLayout 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_height="match_parent" + android:paddingTop="16dp" + tools:context=".ui.settings.SettingsFragment"> + + <androidx.constraintlayout.widget.ConstraintLayout + android:id="@+id/clSave" + android:layout_width="0dp" + android:layout_height="48dp" + android:clickable="true" + android:focusable="true" + android:background="@drawable/bg_graph_detail_item" + app:layout_constraintEnd_toEndOf="parent" + app:layout_constraintHorizontal_bias="0.0" + app:layout_constraintStart_toStartOf="parent" + app:layout_constraintTop_toTopOf="parent" + app:layout_constraintVertical_chainStyle="packed"> + + <ImageView + android:id="@+id/Save" + android:layout_width="26dp" + android:layout_height="26dp" + android:layout_marginStart="24dp" + android:src="@drawable/ic_save" + app:layout_constraintBottom_toBottomOf="parent" + app:layout_constraintStart_toStartOf="parent" + app:layout_constraintTop_toTopOf="parent" /> + + <TextView + android:id="@+id/textSave" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:layout_marginStart="16dp" + android:textStyle="bold" + android:textColor="@android:color/black" + android:text="Save transaction" + app:layout_constraintBottom_toBottomOf="@+id/Save" + app:layout_constraintStart_toEndOf="@+id/Save" + app:layout_constraintTop_toTopOf="@+id/Save" /> + + </androidx.constraintlayout.widget.ConstraintLayout> + + <androidx.constraintlayout.widget.ConstraintLayout + android:id="@+id/clSend" + android:layout_width="0dp" + android:layout_height="48dp" + android:clickable="true" + android:focusable="true" + android:background="@drawable/bg_graph_detail_item" + app:layout_constraintEnd_toEndOf="parent" + app:layout_constraintStart_toStartOf="@+id/clSave" + app:layout_constraintTop_toBottomOf="@+id/clSave"> + + <ImageView + android:id="@+id/Send" + android:layout_width="26dp" + android:layout_height="26dp" + android:layout_marginStart="24dp" + android:src="@drawable/ic_send" + app:layout_constraintBottom_toBottomOf="parent" + app:layout_constraintStart_toStartOf="parent" + app:layout_constraintTop_toTopOf="parent" /> + + <TextView + android:id="@+id/textSend" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:layout_marginStart="16dp" + android:text="Send transaction" + android:textStyle="bold" + android:textColor="@android:color/black" + app:layout_constraintBottom_toBottomOf="@+id/Send" + app:layout_constraintStart_toEndOf="@+id/Send" + app:layout_constraintTop_toTopOf="@+id/Send" /> + </androidx.constraintlayout.widget.ConstraintLayout> + + <androidx.constraintlayout.widget.ConstraintLayout + android:id="@+id/clRandomize" + android:layout_width="0dp" + android:layout_height="48dp" + android:clickable="true" + android:focusable="true" + android:background="@drawable/bg_graph_detail_item" + app:layout_constraintEnd_toEndOf="parent" + app:layout_constraintStart_toStartOf="@+id/clSend" + app:layout_constraintTop_toBottomOf="@+id/clSend"> + + <ImageView + android:id="@+id/Randomize" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:layout_marginStart="24dp" + android:src="@drawable/ic_dices" + app:layout_constraintBottom_toBottomOf="parent" + app:layout_constraintStart_toStartOf="parent" + app:layout_constraintTop_toTopOf="parent" /> + + <TextView + android:id="@+id/textRandomize" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:layout_marginStart="16dp" + android:text="Randomize transaction" + android:textStyle="bold" + android:textColor="@android:color/black" + app:layout_constraintBottom_toBottomOf="@+id/Randomize" + app:layout_constraintStart_toEndOf="@+id/Randomize" + app:layout_constraintTop_toTopOf="@+id/Randomize" /> + </androidx.constraintlayout.widget.ConstraintLayout> + + <androidx.constraintlayout.widget.ConstraintLayout + android:id="@+id/clLogout" + android:layout_width="0dp" + android:layout_height="48dp" + android:clickable="true" + android:focusable="true" + android:background="@drawable/bg_graph_detail_item" + app:layout_constraintEnd_toEndOf="parent" + app:layout_constraintStart_toStartOf="@+id/clRandomize" + app:layout_constraintTop_toBottomOf="@+id/clRandomize"> + + <ImageView + android:id="@+id/Logout" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:layout_marginStart="24dp" + android:src="@drawable/ic_log_out" + app:layout_constraintBottom_toBottomOf="parent" + app:layout_constraintStart_toStartOf="parent" + app:layout_constraintTop_toTopOf="parent" /> + + <TextView + android:id="@+id/textLogout" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:layout_marginStart="16dp" + android:text="Logout" + android:textStyle="bold" + android:textColor="@color/destructive" + app:layout_constraintBottom_toBottomOf="@+id/Logout" + app:layout_constraintStart_toEndOf="@+id/Logout" + app:layout_constraintTop_toTopOf="@+id/Logout" /> + </androidx.constraintlayout.widget.ConstraintLayout> + +</androidx.constraintlayout.widget.ConstraintLayout> \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_transactions.xml b/app/src/main/res/layout/fragment_transactions.xml index ed123034afaa7d6e5684acfaa00b959d5d42d63c..ffe0477ff9ab5319191c89ff94b0195cc7d1bffe 100644 --- a/app/src/main/res/layout/fragment_transactions.xml +++ b/app/src/main/res/layout/fragment_transactions.xml @@ -17,39 +17,6 @@ app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toTopOf="parent" /> - <com.google.android.material.floatingactionbutton.FloatingActionButton - android:id="@+id/fabExport" - android:layout_width="wrap_content" - android:layout_height="wrap_content" - android:layout_marginEnd="68dp" - android:layout_marginBottom="100dp" - android:backgroundTint="@android:color/holo_purple" - android:src="@drawable/ic_transactions" - app:layout_constraintBottom_toBottomOf="parent" - app:layout_constraintEnd_toEndOf="parent" /> - - <com.google.android.material.floatingactionbutton.FloatingActionButton - android:id="@+id/fabEmail" - android:layout_width="wrap_content" - android:layout_height="wrap_content" - android:layout_marginStart="68dp" - android:layout_marginBottom="100dp" - android:backgroundTint="@android:color/holo_purple" - android:src="@drawable/ic_scan" - app:layout_constraintBottom_toBottomOf="@+id/rvTransactions" - app:layout_constraintStart_toStartOf="parent" /> - - <com.google.android.material.floatingactionbutton.FloatingActionButton - android:id="@+id/fabRandom" - android:layout_width="wrap_content" - android:layout_height="wrap_content" - android:layout_marginStart="150dp" - android:layout_marginBottom="100dp" - android:backgroundTint="@android:color/holo_purple" - android:src="@drawable/ic_scan" - app:layout_constraintBottom_toBottomOf="@+id/rvTransactions" - app:layout_constraintStart_toStartOf="parent" /> - <com.google.android.material.floatingactionbutton.FloatingActionButton android:id="@+id/addTransactionBtn" android:layout_width="wrap_content" diff --git a/app/src/main/res/menu/bottom_nav_menu.xml b/app/src/main/res/menu/bottom_nav_menu.xml index c40a103cc357df8767810402a46823636cfc5c3c..cd5cb7f7c224557b131277efbce9121f5c666bb1 100644 --- a/app/src/main/res/menu/bottom_nav_menu.xml +++ b/app/src/main/res/menu/bottom_nav_menu.xml @@ -16,10 +16,10 @@ android:icon="@drawable/ic_graph" android:title="Graph" /> -<!-- <item--> -<!-- android:id="@+id/navigation_settings"--> -<!-- android:icon="@drawable/ic_settings"--> -<!-- android:title="Settings"--> -<!-- />--> + <item + android:id="@+id/navigation_settings" + android:icon="@drawable/ic_settings" + android:title="Settings" + /> </menu> \ No newline at end of file diff --git a/app/src/main/res/navigation/mobile_navigation.xml b/app/src/main/res/navigation/mobile_navigation.xml index 275ccb7100f64bb1854dd940b78cbb977b904dc0..6b817e8f061acda53c67e1547f0709d95b6e4fce 100644 --- a/app/src/main/res/navigation/mobile_navigation.xml +++ b/app/src/main/res/navigation/mobile_navigation.xml @@ -26,6 +26,12 @@ tools:layout="@layout/fragment_form_transaction" /> +<!-- <fragment--> +<!-- android:id="@+id/navigation_scan"--> +<!-- android:name="com.example.abe.ui.scanner.ScannerFragment"--> +<!-- android:label="Scan"--> +<!-- tools:layout="@layout/fragment_scan" />--> + <fragment android:id="@+id/navigation_graph" android:label="Graph" @@ -33,17 +39,19 @@ tools:layout="@layout/fragment_graph" /> -<!-- <fragment--> -<!-- android:id="@+id/navigation_scan"--> -<!-- android:label="Scan" />--> - <!-- <fragment--> <!-- android:id="@+id/navigation_graph"--> <!-- android:label="Graph" />--> -<!-- <fragment--> -<!-- android:id="@+id/navigation_settings"--> -<!-- android:label="Settings" />--> + <fragment + android:id="@+id/navigation_settings" + android:name="com.example.abe.ui.settings.SettingsFragment" + android:label="Settings" + tools:layout="@layout/fragment_settings" > + <action + android:id="@+id/action_navigation_settings_to_navigation_transactions" + app:destination="@id/navigation_transactions" /> + </fragment> <!-- Example when fragment & layout is done--> <!-- <fragment--> diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index c6e8a71a185c517d0b44728ebe9c653685ffae5e..0016c8555aad7b0adf46b96f07a24acfc83d5bb0 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -24,6 +24,7 @@ poi = "5.2.5" poiOoxml = "5.2.5" activity = "1.8.0" playServicesLocation = "21.2.0" +camerax = "1.4.0-alpha04" [libraries] androidx-core-ktx = { group = "androidx.core", name = "core-ktx", version.ref = "coreKtx" } @@ -49,6 +50,9 @@ poi = { group = "org.apache.poi", name = "poi", version.ref = "poi" } poi-ooxml = { group = "org.apache.poi", name = "poi-ooxml", version.ref = "poiOoxml" } androidx-activity = { group = "androidx.activity", name = "activity", version.ref = "activity" } play-services-location = { group = "com.google.android.gms", name = "play-services-location", version.ref = "playServicesLocation" } +camera-core = { module = "androidx.camera:camera-camera2", version.ref = "camerax" } +camera-lifecycle = { module = "androidx.camera:camera-lifecycle", version.ref = "camerax" } +camera-view = { module = "androidx.camera:camera-view", version.ref = "camerax" } [plugins] androidApplication = { id = "com.android.application", version.ref = "agp" }