Skip to content
Snippets Groups Projects
Commit e7a61dbd authored by ditramadia's avatar ditramadia
Browse files

feat: add edit profile page

parent 9479b7f3
1 merge request!16feat/profile
Showing
with 184 additions and 6 deletions
......@@ -3,6 +3,7 @@ plugins {
id("org.jetbrains.kotlin.android")
id("com.google.devtools.ksp")
id("dagger.hilt.android.plugin")
id("androidx.navigation.safeargs")
}
android {
......
package com.example.transactionapp.ui.screen.mainmenu.fragment
import android.os.Bundle
import android.util.Log
import androidx.fragment.app.Fragment
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import androidx.databinding.DataBindingUtil
import androidx.lifecycle.ViewModelProvider
import com.example.transactionapp.R
import com.example.transactionapp.databinding.FragmentProfileBinding
import com.example.transactionapp.databinding.FragmentEditProfileBinding
import com.example.transactionapp.ui.viewmodel.profile.ProfileViewModel
class Profile : Fragment() {
class EditProfile : Fragment() {
override fun onCreateView(
inflater: LayoutInflater, container: ViewGroup?,
savedInstanceState: Bundle?
): View {
// Inflate layout using layout binding
val binding = FragmentProfileBinding.inflate(layoutInflater)
// Inflate the layout using binding
val binding = FragmentEditProfileBinding.inflate(layoutInflater)
// Get the view model
val profileViewModel = ViewModelProvider(this)[ProfileViewModel::class.java]
// Get view model
val editProfileViewModel = ViewModelProvider(this)[ProfileViewModel::class.java]
// Observe
profileViewModel.name.observe(requireActivity()) {
binding.tvName.text = it
Log.d("Name", it)
// Toggle twibbon handler
binding.btnToggleTwibbon.setOnClickListener {
editProfileViewModel.toggleTwibbon()
}
// Shutter button handler
binding.btnCameraButton.setOnClickListener {
editProfileViewModel.onTakePicture()
}
// Twibbon state observer
editProfileViewModel.isTwibbonActive.observe(requireActivity()) {
if (it) {
binding.btnToggleTwibbon.setText(R.string.btn_enable_twibbon)
binding.ivTwibbon.visibility = View.VISIBLE
} else {
binding.btnToggleTwibbon.setText(R.string.btn_disable_twibbon)
binding.ivTwibbon.visibility = View.INVISIBLE
}
}
return binding.root
......
......@@ -9,7 +9,11 @@ import android.view.View
import android.view.ViewGroup
import android.widget.Toast
import androidx.fragment.app.activityViewModels
import androidx.lifecycle.ViewModelProvider
import androidx.navigation.fragment.R
import androidx.navigation.fragment.findNavController
import com.example.transactionapp.databinding.FragmentSettingsBinding
import com.example.transactionapp.ui.viewmodel.settings.SettingsViewModel
import com.example.transactionapp.ui.viewmodel.transaction.TransactionViewModel
class Settings : Fragment() {
......@@ -19,24 +23,41 @@ class Settings : Fragment() {
inflater: LayoutInflater, container: ViewGroup?,
savedInstanceState: Bundle?
): View {
// Inflate the layout with binding
val binding = FragmentSettingsBinding.inflate(layoutInflater)
val bottomSheetExport = BottomSheetExport()
val bottomSheetEmail = BottomSheetEmail()
// Get view model
val settingsViewModel = ViewModelProvider(this)[SettingsViewModel::class.java]
// Profile handler
binding.sivProfilePicture.setOnClickListener {
this.findNavController().navigate(SettingsDirections.actionSettingsToEditProfile())
}
// Save handler
binding.saveLayout.setOnClickListener {
bottomSheetExport.show(parentFragmentManager, "bottomSheet")
}
// Share handler
binding.shareLayout.setOnClickListener {
bottomSheetEmail.show(parentFragmentManager, "bottomSheet")
}
// Randomize handler
binding.switchRandomize.setOnCheckedChangeListener { compoundButton, b ->
val intent = Intent("IsRandom")
intent.putExtra("isRandom", b)
requireActivity().sendBroadcast(intent)
}
// Observer
settingsViewModel.name.observe(requireActivity()) {
binding.tvName.text = it
}
db.isRandom.observe(requireActivity()){
binding.switchRandomize.isChecked = it
}
......
......@@ -12,6 +12,7 @@ import androidx.fragment.app.Fragment
import androidx.fragment.app.activityViewModels
import androidx.navigation.NavController
import androidx.navigation.Navigation
import androidx.navigation.fragment.findNavController
import androidx.recyclerview.widget.LinearLayoutManager
import androidx.recyclerview.widget.RecyclerView
import com.example.transactionapp.R
......
......@@ -5,11 +5,26 @@ import androidx.lifecycle.MutableLiveData
import androidx.lifecycle.ViewModel
class ProfileViewModel : ViewModel() {
private val _name = MutableLiveData<String>()
val name : LiveData<String>
get() = _name
// Toggle button state
private val _isTwibbonActive = MutableLiveData<Boolean>()
val isTwibbonActive : LiveData<Boolean>
get() = _isTwibbonActive
// TODO: Create a Live Data for the picture src (Aing g ngerti camera bew, klo perlu buat variable, buat aja. Tapi buatnya klo bisa di sini)
// Initialize data value
init {
_name.value = "John Pukul"
_isTwibbonActive.value = true
}
// Toggle twibbon handler
fun toggleTwibbon() {
_isTwibbonActive.value = !_isTwibbonActive.value!!
}
// Take picture handler
fun onTakePicture() {
// TODO: Implement take picture
}
}
\ No newline at end of file
package com.example.transactionapp.ui.viewmodel.settings
import androidx.lifecycle.LiveData
import androidx.lifecycle.MutableLiveData
import androidx.lifecycle.ViewModel
class SettingsViewModel: ViewModel() {
// Name
private val _name = MutableLiveData<String>()
val name : LiveData<String>
get() = _name
// Initialize variables
init {
_name.value = "John Pukul"
}
}
\ No newline at end of file
app/src/main/res/drawable/liverpool_twibbon.png

763 KiB

<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
xmlns:app="http://schemas.android.com/apk/res-auto"
tools:context=".ui.screen.mainmenu.fragment.EditProfile">
<androidx.constraintlayout.widget.ConstraintLayout
android:layout_width="match_parent"
android:layout_height="match_parent">
<!-- TODO: Replace ImageView with teuing naon, help Bew -->
<ImageView
android:id="@+id/cpCameraPreview"
android:layout_width="350dp"
android:layout_height="350dp"
app:layout_constraintTop_toTopOf="@id/ivTwibbon"
app:layout_constraintBottom_toBottomOf="@id/ivTwibbon"
app:layout_constraintStart_toStartOf="@id/ivTwibbon"
app:layout_constraintEnd_toEndOf="@id/ivTwibbon"
android:src="@drawable/default_profile" />
<ImageView
android:id="@+id/ivTwibbon"
android:layout_width="350dp"
android:layout_height="350dp"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintVertical_bias="0.35"
android:src="@drawable/liverpool_twibbon"
android:contentDescription="@string/alt_twibbon"/>
<Button
android:id="@+id/btnToggleTwibbon"
android:layout_width="150dp"
android:layout_height="40dp"
app:layout_constraintBottom_toTopOf="@id/ivTwibbon"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
android:layout_marginBottom="12dp"
android:text="@string/btn_disable_twibbon"
android:textColor="?attr/colorSecondary"
android:background="@drawable/rounded_outline_button"
android:textAllCaps="false"
android:backgroundTint="?attr/colorSecondary"
style="@style/Body2" />
<Button
android:id="@+id/btnCameraButton"
android:layout_width="70dp"
android:layout_height="70dp"
android:background="@drawable/camera_button"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
android:layout_marginBottom="50dp"
android:backgroundTint="?attr/colorSecondary"/>
</androidx.constraintlayout.widget.ConstraintLayout>
</layout>
\ No newline at end of file
......@@ -59,6 +59,11 @@
<action
android:id="@+id/action_settings_to_statistics"
app:destination="@id/statistics" />
<action
android:id="@+id/action_settings_to_editProfile"
app:destination="@id/editProfile"
app:enterAnim="@anim/slide_in"
app:exitAnim="@anim/fade_out" />
</fragment>
<fragment
android:id="@+id/transactionForm"
......@@ -80,4 +85,9 @@
android:id="@+id/action_transactionDetails_to_transaction"
app:destination="@id/transaction" />
</fragment>
<fragment
android:id="@+id/editProfile"
android:name="com.example.transactionapp.ui.screen.mainmenu.fragment.EditProfile"
android:label="fragment_edit_profile"
tools:layout="@layout/fragment_edit_profile" />
</navigation>
\ No newline at end of file
......@@ -25,6 +25,8 @@
<string name="btn_edit">Edit</string>
<string name="btn_login">Login</string>
<string name="btn_delete">Delete</string>
<string name="btn_enable_twibbon">Enable Twibbon</string>
<string name="btn_disable_twibbon">Disable Twibbon</string>
<!-- Placeholder -->
<string name="empty_amount">Rp 0</string>
......@@ -63,8 +65,7 @@
<string name="alt_download_icon">Download icon</string>
<string name="alt_share_icon">Share icon</string>
<string name="alt_logout_icon">Logout icon</string>
<!-- TODO: Remove or change this placeholder text -->
<string name="hello_blank_fragment">Hello blank fragment</string>
<string name="alt_profile_picture">Profile picture</string>
<string name="alt_twibbon">Twibbon</string>
</resources>
\ No newline at end of file
......@@ -2,6 +2,7 @@ buildscript {
dependencies {
classpath("com.google.dagger:hilt-android-gradle-plugin:2.48")
classpath("org.apache.logging.log4j:log4j-core:2.23.1")
classpath("androidx.navigation:navigation-safe-args-gradle-plugin:2.7.7")
}
}
......
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment