diff --git a/app/build.gradle.kts b/app/build.gradle.kts index c265dae017fc2e0b8ad4eaf6f4ce63165813901c..1b1d8fddaad947d1868d4d1e8d0c37b298cdf242 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -1,75 +1,78 @@ plugins { - alias(libs.plugins.androidApplication) - alias(libs.plugins.jetbrainsKotlinAndroid) - id("com.google.devtools.ksp") + alias(libs.plugins.androidApplication) + alias(libs.plugins.jetbrainsKotlinAndroid) + id("kotlin-parcelize") + id("com.google.devtools.ksp") + id("androidx.navigation.safeargs.kotlin") } + android { - namespace = "com.example.bondoman" - compileSdk = 34 + namespace = "com.example.bondoman" + compileSdk = 34 - defaultConfig { - applicationId = "com.example.bondoman" - minSdk = 29 - targetSdk = 34 - versionCode = 1 - versionName = "1.0" + defaultConfig { + applicationId = "com.example.bondoman" + minSdk = 29 + targetSdk = 34 + versionCode = 1 + versionName = "1.0" - testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner" - } + testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner" + } - buildTypes { - release { - isMinifyEnabled = false - proguardFiles( - getDefaultProguardFile("proguard-android-optimize.txt"), - "proguard-rules.pro" - ) - } - } - compileOptions { - sourceCompatibility = JavaVersion.VERSION_1_8 - targetCompatibility = JavaVersion.VERSION_1_8 - } - kotlinOptions { - jvmTarget = "1.8" - } - buildFeatures { - viewBinding = true - } + buildTypes { + release { + isMinifyEnabled = false + proguardFiles( + getDefaultProguardFile("proguard-android-optimize.txt"), + "proguard-rules.pro" + ) + } + } + compileOptions { + sourceCompatibility = JavaVersion.VERSION_1_8 + targetCompatibility = JavaVersion.VERSION_1_8 + } + kotlinOptions { + jvmTarget = "1.8" + } + buildFeatures { + viewBinding = true + } } dependencies { - implementation(libs.androidx.core.ktx) - implementation(libs.androidx.appcompat) - implementation(libs.material) - implementation(libs.androidx.activity) - implementation(libs.androidx.constraintlayout) - implementation(libs.androidx.navigation.fragment.ktx) + implementation(libs.androidx.core.ktx) + implementation(libs.androidx.appcompat) + implementation(libs.material) + implementation(libs.androidx.activity) + implementation(libs.androidx.constraintlayout) + implementation(libs.androidx.navigation.fragment.ktx) implementation(libs.androidx.navigation.ui.ktx) testImplementation(libs.junit) - androidTestImplementation(libs.androidx.junit) - androidTestImplementation(libs.androidx.espresso.core) + androidTestImplementation(libs.androidx.junit) + androidTestImplementation(libs.androidx.espresso.core) - // Room - implementation(libs.androidx.room.runtime) - ksp(libs.androidx.room.compiler) + // Room + implementation(libs.androidx.room.runtime) + ksp(libs.androidx.room.compiler) - // Room Coroutine Support - implementation(libs.androidx.room.ktx) + // Room Coroutine Support + implementation(libs.androidx.room.ktx) - // Room Test Helper - implementation(libs.androidx.room.testing) + // Room Test Helper + implementation(libs.androidx.room.testing) - // Camera X - implementation(libs.camera.core) - implementation(libs.camera.camera2) - implementation(libs.camera.lifecycle) - implementation(libs.camera.view) - implementation(libs.camera.extensions) + // Camera X + implementation(libs.camera.core) + implementation(libs.camera.camera2) + implementation(libs.camera.lifecycle) + implementation(libs.camera.view) + implementation(libs.camera.extensions) - // Blur view - implementation("com.github.Dimezis:BlurView:version-2.0.3") + // Blur view + implementation("com.github.Dimezis:BlurView:version-2.0.3") //MPChart implementation(libs.mpchart) diff --git a/app/src/main/java/com/example/bondoman/fragments/TwibbonFragment.kt b/app/src/main/java/com/example/bondoman/fragments/TwibbonFragment.kt index 479aae2f4e91beeb0057245de4122cbc47327e8e..80278c33ddb4a34a380bb35d25d6191e73edc8e5 100644 --- a/app/src/main/java/com/example/bondoman/fragments/TwibbonFragment.kt +++ b/app/src/main/java/com/example/bondoman/fragments/TwibbonFragment.kt @@ -24,9 +24,9 @@ import androidx.camera.core.Preview import androidx.camera.lifecycle.ProcessCameraProvider import androidx.core.content.ContextCompat import androidx.fragment.app.Fragment -import androidx.navigation.Navigation -import com.example.bondoman.R +import androidx.navigation.fragment.findNavController import com.example.bondoman.databinding.FragmentTwibbonBinding +import com.example.bondoman.models.ParcelableBitmap import java.io.OutputStream import java.util.concurrent.ExecutorService import java.util.concurrent.Executors @@ -77,13 +77,12 @@ class TwibbonFragment : Fragment() { // Set up the listeners for capture button viewBinding.selfieCaptureButton.setOnClickListener { takePhoto() + } cameraExecutor = Executors.newSingleThreadExecutor() // Camera rotate viewBinding.cameraRotateButton.setOnClickListener { - Navigation.findNavController(viewBinding.root) - .navigate(R.id.action_twibbonFragment_to_twibbonPreviewFragment) cameraSelector = if (cameraSelector == CameraSelector.DEFAULT_FRONT_CAMERA) { CameraSelector.DEFAULT_BACK_CAMERA } else { @@ -130,7 +129,13 @@ class TwibbonFragment : Fragment() { Handler(Looper.getMainLooper()).postDelayed({ captureView(viewBinding.selfie, requireActivity().window) { viewBinding.selfie.visibility = View.GONE - saveMediaToStorage(it) + + val action = + TwibbonFragmentDirections.actionTwibbonFragmentToTwibbonPreviewFragment( + ParcelableBitmap(it) + ) + findNavController() + .navigate(action) } }, 500) diff --git a/app/src/main/java/com/example/bondoman/fragments/TwibbonPreviewFragment.kt b/app/src/main/java/com/example/bondoman/fragments/TwibbonPreviewFragment.kt index 69507d6d079b0ec04ffa55dd5144bfd57933d261..6a9e474819ff8da5b9d1e017493c16db17983da4 100644 --- a/app/src/main/java/com/example/bondoman/fragments/TwibbonPreviewFragment.kt +++ b/app/src/main/java/com/example/bondoman/fragments/TwibbonPreviewFragment.kt @@ -5,9 +5,13 @@ import android.view.LayoutInflater import android.view.View import android.view.ViewGroup import androidx.fragment.app.Fragment +import androidx.navigation.Navigation +import androidx.navigation.fragment.navArgs import com.example.bondoman.R +import com.example.bondoman.databinding.FragmentTwibbonPreviewBinding class TwibbonPreviewFragment : Fragment() { + private val args by navArgs<TwibbonPreviewFragmentArgs>() override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) } @@ -15,9 +19,14 @@ class TwibbonPreviewFragment : Fragment() { override fun onCreateView( inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle? - ): View? { - val view = inflater.inflate(R.layout.fragment_twibbon_preview, container, false) - return view + ): View { + val view = FragmentTwibbonPreviewBinding.inflate(inflater, container, false) + view.twibbonResult.setImageBitmap(args.twibbonResult.bitmap) + view.retakeTwibbon.setOnClickListener { + Navigation.findNavController(view.root) + .navigate(R.id.action_twibbonPreviewFragment_to_twibbonFragment) + } + return view.root } companion object { diff --git a/app/src/main/java/com/example/bondoman/models/ParcelableBitmap.kt b/app/src/main/java/com/example/bondoman/models/ParcelableBitmap.kt new file mode 100644 index 0000000000000000000000000000000000000000..06460ffabfac8e436fdd1e2c459b5b72e0a4aaf8 --- /dev/null +++ b/app/src/main/java/com/example/bondoman/models/ParcelableBitmap.kt @@ -0,0 +1,9 @@ +package com.example.bondoman.models + +import android.graphics.Bitmap +import android.os.Parcelable +import kotlinx.parcelize.Parcelize + + +@Parcelize +data class ParcelableBitmap(val bitmap: Bitmap?) : Parcelable diff --git a/app/src/main/res/layout/fragment_twibbon_preview.xml b/app/src/main/res/layout/fragment_twibbon_preview.xml index 53ca5a24e33a9fa5649e7b11b0740d7388634223..b2c343ff7ef05e738aa8a07b5dfe3337dd3d6365 100644 --- a/app/src/main/res/layout/fragment_twibbon_preview.xml +++ b/app/src/main/res/layout/fragment_twibbon_preview.xml @@ -1,14 +1,44 @@ <?xml version="1.0" encoding="utf-8"?> -<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" +<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:padding="15dp" tools:context=".fragments.TwibbonPreviewFragment"> - <!-- TODO: Update blank fragment layout --> - <TextView + <com.google.android.material.imageview.ShapeableImageView + android:id="@+id/twibbon_result" android:layout_width="match_parent" - android:layout_height="match_parent" - android:text="@string/hello_blank_fragment" /> + android:layout_height="0dp" + android:adjustViewBounds="true" + android:contentDescription="@string/twibbon_image_overlay" + android:scaleType="centerCrop" + app:layout_constraintDimensionRatio="1:1" + app:layout_constraintEnd_toEndOf="parent" + app:layout_constraintStart_toStartOf="parent" + app:layout_constraintTop_toTopOf="parent" + app:shapeAppearanceOverlay="@style/imageRoundedCorner" /> -</FrameLayout> \ No newline at end of file + <com.google.android.material.button.MaterialButton + android:id="@+id/retake_twibbon" + android:layout_width="match_parent" + android:layout_height="44dp" + android:layout_marginTop="20dp" + android:backgroundTint="@color/teal_200" + android:gravity="center" + android:insetTop="0dp" + android:insetBottom="0dp" + android:outlineSpotShadowColor="@android:color/transparent" + android:text="@string/text_retake_button" + android:textAppearance="@style/TextAppearance.TransactionDetail.EditButton" + android:textColor="@color/zinc_900" + app:cornerRadius="5dp" + app:icon="@drawable/ic_rotate_clockwise" + app:iconGravity="textStart" + app:iconTint="@color/zinc_900" + app:layout_constraintLeft_toRightOf="parent" + app:layout_constraintRight_toLeftOf="parent" + app:layout_constraintTop_toBottomOf="@id/twibbon_result" /> + +</androidx.constraintlayout.widget.ConstraintLayout> diff --git a/app/src/main/res/navigation/nav_graph.xml b/app/src/main/res/navigation/nav_graph.xml index 3da9218865c11e73d04d8dcf75fdbbae0954a28d..059ae7a60451a3b747aa6e616ea021b1fe75386c 100644 --- a/app/src/main/res/navigation/nav_graph.xml +++ b/app/src/main/res/navigation/nav_graph.xml @@ -3,7 +3,7 @@ xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" android:id="@+id/bondoman_nav" - app:startDestination="@id/twibbonFragment"> + app:startDestination="@id/settingsFragment"> <fragment android:id="@+id/twibbonPreviewFragment" @@ -13,6 +13,9 @@ <action android:id="@+id/action_twibbonPreviewFragment_to_twibbonFragment" app:destination="@id/twibbonFragment" /> + <argument + android:name="twibbonResult" + app:argType="com.example.bondoman.models.ParcelableBitmap" /> </fragment> <fragment android:id="@+id/transactionListFragment" diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index ed1e4af04746af84bc4093157d1baf5e4cb809c8..4e25dba638a07884b61758d768ed22151ca54998 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -55,5 +55,6 @@ <string name="text_second_button_delete_transaction_dialog">Delete</string> <string name="dummy_setting_button_title">Title</string> <string name="dummy_setting_button_subtitle">Subtitle</string> + <string name="text_retake_button">Retake</string> </resources> diff --git a/app/src/main/res/values/themes.xml b/app/src/main/res/values/themes.xml index 3e6364d310026ccf3d8bd490f5e7d7f3cf232acd..9770699f2b393167fe80e086b56c048c7ffb07cb 100644 --- a/app/src/main/res/values/themes.xml +++ b/app/src/main/res/values/themes.xml @@ -1,4 +1,5 @@ <resources xmlns:tools="http://schemas.android.com/tools"> + <style name="Base.Theme.BondoMan" parent="Theme.MaterialComponents.DayNight.NoActionBar"> <item name="android:statusBarColor" tools:targetApi="l">@color/bg_main</item> <item name="android:datePickerDialogTheme">@style/DatePickerDialogTheme</item> @@ -17,7 +18,9 @@ <item name="android:headerBackground">@color/bg_main</item> <!-- header background color --> </style> + <style name="Theme.BondoMan" parent="Base.Theme.BondoMan" /> + <style name="TextAppearance.Header" parent="@android:style/TextAppearance"> <item name="android:textSize">20sp</item> <item name="android:fontFamily">@font/inter_bold</item> @@ -27,6 +30,7 @@ <item name="android:textColorHint">@color/zinc_50</item> <item name="android:textColorLink">@color/zinc_50</item> </style> + <style name="TextAppearance.TransactionDetail.Category" parent="@android:style/TextAppearance"> <item name="android:textSize">12sp</item> <item name="android:fontFamily">@font/inter_bold</item> @@ -36,6 +40,7 @@ <item name="android:textColorHint">@color/zinc_900</item> <item name="android:textColorLink">@color/zinc_900</item> </style> + <style name="TextAppearance.Transaction.Date" parent="@android:style/TextAppearance"> <item name="android:textSize">12sp</item> <item name="android:fontFamily">@font/inter</item> @@ -45,6 +50,7 @@ <item name="android:textColorHint">@color/zinc_500</item> <item name="android:textColorLink">@color/zinc_500</item> </style> + <style name="TextAppearance.Transaction.Amount" parent="@android:style/TextAppearance"> <item name="android:textSize">16sp</item> <item name="android:fontFamily">@font/inter_bold</item> @@ -54,6 +60,7 @@ <item name="android:textColorHint">@color/zinc_300</item> <item name="android:textColorLink">@color/zinc_300</item> </style> + <style name="TextAppearance.Transaction.Title" parent="@android:style/TextAppearance"> <item name="android:textSize">16sp</item> <item name="android:fontFamily">@font/inter</item> @@ -63,6 +70,7 @@ <item name="android:textColorHint">@color/zinc_300</item> <item name="android:textColorLink">@color/zinc_300</item> </style> + <style name="TextAppearance.Transaction.Location" parent="@android:style/TextAppearance"> <item name="android:textSize">12sp</item> <item name="android:fontFamily">@font/inter</item> @@ -72,6 +80,7 @@ <item name="android:textColorHint">@color/zinc_400</item> <item name="android:textColorLink">@color/zinc_400</item> </style> + <style name="TextAppearance.TransactionDetail.EditButton" parent="@android:style/TextAppearance"> <item name="android:textSize">16sp</item> <item name="android:fontFamily">@font/inter</item> @@ -81,6 +90,7 @@ <item name="android:textColorHint">@color/zinc_900</item> <item name="android:textColorLink">@color/zinc_900</item> </style> + <style name="TextAppearance.TransactionForm.Input" parent="@android:style/TextAppearance"> <item name="android:textSize">16sp</item> <item name="android:fontFamily">@font/inter</item> @@ -90,6 +100,7 @@ <item name="android:textColorHint">@color/zinc_300</item> <item name="android:textColorLink">@color/zinc_300</item> </style> + <style name="TextAppearance.TransactionForm.ChangeLocationText" parent="@android:style/TextAppearance"> <item name="android:textSize">14sp</item> <item name="android:fontFamily">@font/inter</item> @@ -99,6 +110,7 @@ <item name="android:textColorHint">@color/teal_200</item> <item name="android:textColorLink">@color/teal_200</item> </style> + <style name="TextAppearance.Graph.Amount" parent="@android:style/TextAppearance"> <item name="android:textSize">16sp</item> <item name="android:fontFamily">@font/inter</item> @@ -108,11 +120,13 @@ <item name="android:textColorHint">@color/zinc_300</item> <item name="android:textColorLink">@color/zinc_300</item> </style> + <style name="TextAppearance.Dialog" parent="@android:style/TextAppearance"> <item name="android:textSize">16sp</item> <item name="android:fontFamily">@font/inter</item> <item name="android:typeface">normal</item> </style> + <style name="TextAppearance.SettingButton.Title" parent="@android:style/TextAppearance"> <item name="android:textSize">16sp</item> <item name="android:fontFamily">@font/inter</item> @@ -122,6 +136,7 @@ <item name="android:textColorHint">@color/zinc_300</item> <item name="android:textColorLink">@color/zinc_300</item> </style> + <style name="TextAppearance.SettingButton.Subtitle" parent="@android:style/TextAppearance"> <item name="android:textSize">12sp</item> <item name="android:fontFamily">@font/inter</item> @@ -131,29 +146,34 @@ <item name="android:textColorHint">@color/zinc_500</item> <item name="android:textColorLink">@color/zinc_500</item> </style> + <style name="transactionDetailSwipeButtonBackground"> <item name="backgroundColor">@color/zinc_200</item> <item name="borderRadius">100dp</item> <item name="borderTopRightRadius">100dp</item> <item name="borderTopLeftRadius">100dp</item> </style> + <style name="deleteTransactionButtonBackground"> <item name="backgroundColor">@color/rose_200_11_percent</item> <item name="borderRadius">5dp</item> <item name="borderTopRightRadius">5dp</item> <item name="borderTopLeftRadius">5dp</item> </style> + <style name="editTransactionButtonBackground"> <item name="backgroundColor">@color/teal_200</item> <item name="borderRadius">5dp</item> <item name="borderTopRightRadius">5dp</item> <item name="borderTopLeftRadius">5dp</item> </style> + <style name="zinc700TopBorderBackground"> <item name="borderColor">@color/zinc_700</item> <item name="backgroundColor">@color/bg_main</item> <item name="borderTopWidth">1dp</item> </style> + <style name="transactionDetailTopBorderBackground"> <item name="borderColor">@color/zinc_700</item> <item name="backgroundColor">@color/bg_main</item> @@ -161,6 +181,7 @@ <item name="borderTopLeftRadius">20dp</item> <item name="borderTopRightRadius">20dp</item> </style> + <style name="transactionFormFieldBackground"> <item name="backgroundColor">@color/zinc_700</item> <item name="borderTopLeftRadius">5dp</item> @@ -168,29 +189,35 @@ <item name="borderBottomLeftRadius">5dp</item> <item name="borderBottomRightRadius">5dp</item> </style> + <style name="teal200RoundBackground"> <item name="borderColor">@android:color/transparent</item> <item name="backgroundColor">@color/teal_200</item> <item name="borderRadius">100dp</item> </style> + <style name="transparentRoundBackground"> <item name="borderColor">@android:color/transparent</item> <item name="backgroundColor">@android:color/transparent</item> <item name="borderRadius">100dp</item> </style> + <style name="swipeButtonBackground"> <item name="borderColor">@android:color/transparent</item> <item name="backgroundColor">@color/zinc_200</item> <item name="borderRadius">5dp</item> </style> + <style name="incomeCategoryBackground"> <item name="backgroundColor">@color/teal_200</item> <item name="borderRadius">4dp</item> </style> + <style name="outcomeCategoryBackground"> <item name="backgroundColor">@color/rose_200</item> <item name="borderRadius">4dp</item> </style> + <style name="dialogBackground"> <item name="backgroundColor">@color/bg_main</item> <item name="borderRadius">5dp</item> @@ -200,4 +227,9 @@ <item name="borderRightWidth">1dp</item> <item name="borderColor">@color/zinc_700</item> </style> + + <style name="imageRoundedCorner"> + <item name="cornerFamily">rounded</item> + <item name="cornerSize">5dp</item> + </style> </resources> diff --git a/build.gradle.kts b/build.gradle.kts index 19768843ab31bfe1f5b76b291864d8c4f076bb67..aeb38aed6d0f9ebb9a32f1427931f8aa5d961393 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -1,11 +1,21 @@ // Top-level build file where you can add configuration options common to all sub-projects/modules. plugins { - alias(libs.plugins.androidApplication) apply false - alias(libs.plugins.jetbrainsKotlinAndroid) apply false - id("com.google.devtools.ksp") version "1.9.23-1.0.19" apply false + alias(libs.plugins.androidApplication) apply false + alias(libs.plugins.jetbrainsKotlinAndroid) apply false + id("com.google.devtools.ksp") version "1.9.23-1.0.19" apply false id("com.diffplug.spotless") version "6.25.0" apply false } +buildscript { + repositories { + google() + } + dependencies { + val nav_version = "2.7.7" + classpath("androidx.navigation:navigation-safe-args-gradle-plugin:$nav_version") + } +} + subprojects { afterEvaluate { project.apply("../spotless.gradle") diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 280014f4bac6b17b39805fdffa6f8019de3505ff..8ac8530f86c3ffdb9788556039460ac71e4fd51f 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -28,12 +28,12 @@ androidx-appcompat = { group = "androidx.appcompat", name = "appcompat", version material = { group = "com.google.android.material", name = "material", version.ref = "material" } androidx-activity = { group = "androidx.activity", name = "activity", version.ref = "activity" } androidx-constraintlayout = { group = "androidx.constraintlayout", name = "constraintlayout", version.ref = "constraintlayout" } -camera-core = { module = "androidx.camera:camera-core", version.ref = "camera"} -camera-camera2 = { module = "androidx.camera:camera-camera2", version.ref = "camera"} -camera-lifecycle = { module = "androidx.camera:camera-lifecycle", version.ref = "camera"} +camera-core = { module = "androidx.camera:camera-core", version.ref = "camera" } +camera-camera2 = { module = "androidx.camera:camera-camera2", version.ref = "camera" } +camera-lifecycle = { module = "androidx.camera:camera-lifecycle", version.ref = "camera" } camera-view = { module = "androidx.camera:camera-view", version.ref = "camera" } camera-extensions = { module = "androidx.camera:camera-extensions", version.ref = "camera" } -mpchart = {module = "com.github.PhilJay:MPAndroidChart", version.ref = "mpChart"} +mpchart = { module = "com.github.PhilJay:MPAndroidChart", version.ref = "mpChart" } androidx-navigation-fragment-ktx = { group = "androidx.navigation", name = "navigation-fragment-ktx", version.ref = "navigationFragmentKtx" } androidx-navigation-ui-ktx = { group = "androidx.navigation", name = "navigation-ui-ktx", version.ref = "navigationUiKtx" }