diff --git a/app/src/main/java/com/example/bandung_bondowoso/MainActivity.kt b/app/src/main/java/com/example/bandung_bondowoso/MainActivity.kt index feaa155b36e460d935e1ede78445f3299912ec45..d28853329b08cc55e280b39976c46dba4ba4fea4 100644 --- a/app/src/main/java/com/example/bandung_bondowoso/MainActivity.kt +++ b/app/src/main/java/com/example/bandung_bondowoso/MainActivity.kt @@ -16,10 +16,12 @@ import androidx.navigation.ui.setupWithNavController import com.example.bandung_bondowoso.broadcast.connection.ConnectionChangeListener import com.example.bandung_bondowoso.broadcast.jwt_expired.JwtExpiredReceiver import com.example.bandung_bondowoso.broadcast.jwt_valid.JwtValidReceiver +import com.example.bandung_bondowoso.broadcast.randomize_transaction.RandomizeTransactionReceiver import com.example.bandung_bondowoso.databinding.ActivityMainBinding import com.example.bandung_bondowoso.service.JwtCheckerService import com.example.bandung_bondowoso.util.ConnectionStateMonitor import com.example.bandung_bondowoso.viewmodel.AuthViewModel +import com.example.bandung_bondowoso.viewmodel.transaction.RandomizeTransactionViewModel import com.google.android.material.bottomnavigation.BottomNavigationView class MainActivity : AppCompatActivity(), ConnectionChangeListener { @@ -36,6 +38,8 @@ class MainActivity : AppCompatActivity(), ConnectionChangeListener { private lateinit var navController : NavController + private lateinit var randomizeTransactionViewModel: RandomizeTransactionViewModel + override fun onCreate(savedInstanceState: Bundle?) { Log.d("MainActivity", "onCreate") super.onCreate(savedInstanceState) @@ -44,65 +48,22 @@ class MainActivity : AppCompatActivity(), ConnectionChangeListener { setContentView(binding.root) authViewModel = ViewModelProvider(this).get(AuthViewModel::class.java) + randomizeTransactionViewModel = ViewModelProvider(this).get(RandomizeTransactionViewModel::class.java) + + /* Navigation Related Configuration */ + configureNavigation() + /* Auth Related Configuration */ jwtExpiredReceiver = JwtExpiredReceiver(authViewModel) LocalBroadcastManager.getInstance(this).registerReceiver( jwtExpiredReceiver, IntentFilter(JwtExpiredReceiver.ACTION) ) - jwtValidReceiver = JwtValidReceiver(authViewModel) LocalBroadcastManager.getInstance(this).registerReceiver( jwtValidReceiver, IntentFilter(JwtValidReceiver.ACTION) ) - - navView = binding.navView - navView.visibility = View.GONE - - navController = findNavController(R.id.nav_host_fragment_activity_main) - navView.setupWithNavController(navController) - navView.setOnItemSelectedListener { - when (it.itemId) { - R.id.navigation_transaction -> { - if (navController.currentDestination != null && navController.currentDestination?.id != R.id.navigation_transaction) { - navController.navigate(R.id.navigation_transaction) - } - } - R.id.navigation_scan -> { - if (navController.currentDestination != null && navController.currentDestination?.id != R.id.navigation_scan) { - navController.navigate(R.id.navigation_scan) - } - } - R.id.navigation_graph -> { - if (navController.currentDestination != null && navController.currentDestination?.id != R.id.navigation_graph) { - navController.navigate(R.id.navigation_graph) - } - } - R.id.navigation_twibbon -> { - if (navController.currentDestination != null && navController.currentDestination?.id != R.id.navigation_twibbon) { - navController.navigate(R.id.navigation_twibbon) - } - } - R.id.navigation_settings -> { - if (navController.currentDestination != null && navController.currentDestination?.id != R.id.navigation_settings) { - navController.navigate(R.id.navigation_settings) - } - } - } - true - } - - navController.addOnDestinationChangedListener(NavController.OnDestinationChangedListener { controller, destination, arguments -> - if (destination.id == R.id.fragment_login) { - Log.d("MainActivity", "onCreate: fragment_login") - navView.visibility = View.GONE - } else { - Log.d("MainActivity", "onCreate: not fragment_login") - navView.visibility = View.VISIBLE - } - }) - authViewModel.isLoggedIn.observe(this) { Log.d("MainActivity", "isLoggedIn: $it") if (it == false) { @@ -114,11 +75,23 @@ class MainActivity : AppCompatActivity(), ConnectionChangeListener { } else if (it != null) { Log.d("MainActivity", "onValid") if (navController.currentDestination?.id == R.id.fragment_login) { - navController.navigate(R.id.action_loginFragment_to_navigation_transaction) + navController.navigate(R.id.action_fragment_login_to_navigation_transaction) } } } + /* Randomize Transaction Configuration */ + val randomizeTransactionReceiver = RandomizeTransactionReceiver(randomizeTransactionViewModel) + LocalBroadcastManager.getInstance(this).registerReceiver( + randomizeTransactionReceiver, + IntentFilter(RandomizeTransactionReceiver.ACTION) + ) + randomizeTransactionViewModel.isRandomized.observe(this){ + Log.d("MainActivity", "isRandomized: $it") + findNavController(R.id.nav_host_fragment_activity_main).navigate(R.id.newTransactionFragment) + } + + /* Connection State Related Configuration */ val connectionStateMonitor = ConnectionStateMonitor(this) connectionStateMonitor.enable(this) } @@ -176,4 +149,50 @@ class MainActivity : AppCompatActivity(), ConnectionChangeListener { dialog.show() } } + + private fun configureNavigation() { + navView = binding.navView + navController = findNavController(R.id.nav_host_fragment_activity_main) + navView.setupWithNavController(navController) + navView.setOnItemSelectedListener { + when (it.itemId) { + R.id.navigation_transaction -> { + if (navController.currentDestination != null && navController.currentDestination?.id != R.id.navigation_transaction) { + navController.navigate(R.id.navigation_transaction) + } + } + R.id.navigation_scan -> { + if (navController.currentDestination != null && navController.currentDestination?.id != R.id.navigation_scan) { + navController.navigate(R.id.navigation_scan) + } + } + R.id.navigation_graph -> { + if (navController.currentDestination != null && navController.currentDestination?.id != R.id.navigation_graph) { + navController.navigate(R.id.navigation_graph) + } + } + R.id.navigation_twibbon -> { + if (navController.currentDestination != null && navController.currentDestination?.id != R.id.navigation_twibbon) { + navController.navigate(R.id.navigation_twibbon) + } + } + R.id.navigation_settings -> { + if (navController.currentDestination != null && navController.currentDestination?.id != R.id.navigation_settings) { + navController.navigate(R.id.navigation_settings) + } + } + } + true + } + + navController.addOnDestinationChangedListener(NavController.OnDestinationChangedListener { controller, destination, arguments -> + if (destination.id == R.id.fragment_login) { + Log.d("MainActivity", "onCreate: fragment_login") + navView.visibility = View.GONE + } else { + Log.d("MainActivity", "onCreate: not fragment_login") + navView.visibility = View.VISIBLE + } + }) + } } \ No newline at end of file diff --git a/app/src/main/java/com/example/bandung_bondowoso/broadcast/randomize_transaction/RandomizeTransactionListener.kt b/app/src/main/java/com/example/bandung_bondowoso/broadcast/randomize_transaction/RandomizeTransactionListener.kt new file mode 100644 index 0000000000000000000000000000000000000000..79b7b0bd09600518ac3804aef9be176c6f08097f --- /dev/null +++ b/app/src/main/java/com/example/bandung_bondowoso/broadcast/randomize_transaction/RandomizeTransactionListener.kt @@ -0,0 +1,6 @@ +package com.example.bandung_bondowoso.broadcast.randomize_transaction + +interface RandomizeTransactionListener { + fun onRandomized() + fun onReceivedRandomTransaction(transactionName: String, transactionAmount: Int) +} \ No newline at end of file diff --git a/app/src/main/java/com/example/bandung_bondowoso/broadcast/randomize_transaction/RandomizeTransactionReceiver.kt b/app/src/main/java/com/example/bandung_bondowoso/broadcast/randomize_transaction/RandomizeTransactionReceiver.kt new file mode 100644 index 0000000000000000000000000000000000000000..bf70dd985664fd67735214429996bfd33591fb07 --- /dev/null +++ b/app/src/main/java/com/example/bandung_bondowoso/broadcast/randomize_transaction/RandomizeTransactionReceiver.kt @@ -0,0 +1,28 @@ +package com.example.bandung_bondowoso.broadcast.randomize_transaction + + +import android.content.BroadcastReceiver +import android.content.Context +import android.content.Intent +import android.util.Log +import android.widget.Toast + +class RandomizeTransactionReceiver(private val listener: RandomizeTransactionListener) : BroadcastReceiver() { + override fun onReceive(context: Context?, intent: Intent?) { + if (intent?.action == ACTION) { + Log.d("RandomizeTransactionReceiver", "onReceive") + Toast.makeText(context, "Randomize Transaction", Toast.LENGTH_SHORT).show() + val transactionName = intent.getStringExtra("name") + val transactionAmount = intent.getIntExtra("amount", 0) + listener.onRandomized() + if (transactionName != null) { + Log.d("RandomizeTransactionReceiver", "onReceive: $transactionName $transactionAmount") + listener.onReceivedRandomTransaction(transactionName, transactionAmount) + } + } + } + + companion object { + const val ACTION = "com.example.bandung_bondowoso.ACTION_SEND_RANDOMIZE_TRANSACTION" + } +} diff --git a/app/src/main/java/com/example/bandung_bondowoso/local/AppDatabase.kt b/app/src/main/java/com/example/bandung_bondowoso/local/AppDatabase.kt index 88e4c77a7bb082f1d26d60c71e8283b75dacae13..a0984856f8b5e4a279576780ea04d1f18204afde 100644 --- a/app/src/main/java/com/example/bandung_bondowoso/local/AppDatabase.kt +++ b/app/src/main/java/com/example/bandung_bondowoso/local/AppDatabase.kt @@ -5,37 +5,46 @@ import androidx.room.Database import androidx.room.Room import androidx.room.RoomDatabase import androidx.room.TypeConverters +import androidx.room.migration.Migration +import androidx.sqlite.db.SupportSQLiteDatabase import com.example.bandung_bondowoso.local.dao.TransactionDao import com.example.bandung_bondowoso.model.Transaction -@Database(entities = [Transaction::class], version = 1) +@Database(entities = [Transaction::class], version = 2) @TypeConverters(Converters::class) abstract class AppDatabase : RoomDatabase() { abstract fun transactionDao(): TransactionDao - // Singleton companion object { private const val DATABASE_NAME = "app_database" - // Safe thread + val MIGRATION_1_2 = object : Migration(1, 2) { + override fun migrate(db: SupportSQLiteDatabase) { + db.execSQL("ALTER TABLE `transaction` ADD COLUMN email TEXT NOT NULL DEFAULT ''") + } + } + + // Singleton @Volatile private var INSTANCE: AppDatabase? = null fun getInstance(context: Context): AppDatabase { - synchronized(this) { - var instance = INSTANCE - if (instance == null) { - instance = Room.databaseBuilder( - context.applicationContext, - AppDatabase::class.java, - DATABASE_NAME - ).build() - - INSTANCE = instance - } - - return instance - } + synchronized(this) { + var instance = INSTANCE + if (instance == null) { + instance = Room.databaseBuilder( + context.applicationContext, + AppDatabase::class.java, + DATABASE_NAME + ) + .addMigrations(MIGRATION_1_2) + .build() + + INSTANCE = instance + } + + return instance + } } } -} \ No newline at end of file +} diff --git a/app/src/main/java/com/example/bandung_bondowoso/local/dao/TransactionDao.kt b/app/src/main/java/com/example/bandung_bondowoso/local/dao/TransactionDao.kt index 795578439396f1759d36e98f706687dba9473d86..0207dc49753624cacf170119fbab858a0a9ff418 100644 --- a/app/src/main/java/com/example/bandung_bondowoso/local/dao/TransactionDao.kt +++ b/app/src/main/java/com/example/bandung_bondowoso/local/dao/TransactionDao.kt @@ -1,6 +1,5 @@ package com.example.bandung_bondowoso.local.dao -import androidx.lifecycle.LiveData import androidx.room.Dao import androidx.room.Delete import androidx.room.Query @@ -12,10 +11,12 @@ import kotlinx.coroutines.flow.Flow interface TransactionDao { @Query("SELECT * FROM `transaction` ORDER BY created_at DESC") fun getAll(): Flow<List<Transaction>> - @Query("SELECT SUM(amount) FROM `transaction` WHERE category = 0") - suspend fun getIncome(): Int - @Query("SELECT SUM(amount) FROM `transaction` WHERE category = 1") - suspend fun getExpense(): Int + @Query("SELECT * FROM `transaction` WHERE email = :email ORDER BY created_at DESC") + fun getAllByEmail(email: String): List<Transaction> + @Query("SELECT SUM(amount) FROM `transaction` WHERE category = 0 AND email= :email") + suspend fun getIncome(email:String): Int + @Query("SELECT SUM(amount) FROM `transaction` WHERE category = 1 AND email= :email") + suspend fun getExpense(email:String): Int @Query("SELECT * FROM `transaction` WHERE id = :id") suspend fun getTransaction(id: Int): Transaction @Query("SELECT COUNT(*) FROM `transaction`") diff --git a/app/src/main/java/com/example/bandung_bondowoso/model/Transaction.kt b/app/src/main/java/com/example/bandung_bondowoso/model/Transaction.kt index 9bee418afdc790eb50ef3e6a179acce520560925..0a1faf4cdfe4a15af3af1dbd1334d05125a58303 100644 --- a/app/src/main/java/com/example/bandung_bondowoso/model/Transaction.kt +++ b/app/src/main/java/com/example/bandung_bondowoso/model/Transaction.kt @@ -8,6 +8,7 @@ import java.util.Date @Entity(tableName = "transaction") data class Transaction ( @PrimaryKey(autoGenerate = true) val id: Int = 0, + @ColumnInfo(name = "email") val email:String, @ColumnInfo(name = "name") val name: String, @ColumnInfo(name = "amount") val amount: Int, @ColumnInfo(name = "category") val type: TransactionCategory, diff --git a/app/src/main/java/com/example/bandung_bondowoso/repository/TransactionRepository.kt b/app/src/main/java/com/example/bandung_bondowoso/repository/TransactionRepository.kt index f5394a52d8c330dae8d92086af2c0cad006d825a..f8ed7a38ab0243de2d6351b95d998cb813d3032f 100644 --- a/app/src/main/java/com/example/bandung_bondowoso/repository/TransactionRepository.kt +++ b/app/src/main/java/com/example/bandung_bondowoso/repository/TransactionRepository.kt @@ -13,14 +13,14 @@ class TransactionRepository(private val transactionDao: TransactionDao, ) { private val defaultDispatcher: CoroutineDispatcher = Dispatchers.Default private val TAG:String = "TransactionRepository" - suspend fun getIncome() = withContext(defaultDispatcher){ + suspend fun getIncome(email:String) = withContext(defaultDispatcher){ Log.d(TAG, "getIncome") - transactionDao.getIncome() + transactionDao.getIncome(email) } - suspend fun getExpense() = withContext(defaultDispatcher){ + suspend fun getExpense(email:String) = withContext(defaultDispatcher){ Log.d(TAG, "getExpense") - transactionDao.getExpense() + transactionDao.getExpense(email) } suspend fun getTransaction(id:Int) = withContext(defaultDispatcher){ @@ -42,6 +42,10 @@ class TransactionRepository(private val transactionDao: TransactionDao, } .flowOn(defaultDispatcher) + suspend fun getAllByEmail(email:String) = withContext(defaultDispatcher){ + Log.d(TAG, "getAllbyEmail") + transactionDao.getAllByEmail(email) + } suspend fun delete(transaction: Transaction) = withContext(defaultDispatcher) { Log.d(TAG, "delete: $transaction") transactionDao.delete(transaction) diff --git a/app/src/main/java/com/example/bandung_bondowoso/view/dashboard/DashboardFragment.kt b/app/src/main/java/com/example/bandung_bondowoso/view/dashboard/DashboardFragment.kt index 8eeed8bdb72743e4904ff6ee4bc89a79040d24df..aa4c00b7b46e03246809c319325c03680e88c093 100644 --- a/app/src/main/java/com/example/bandung_bondowoso/view/dashboard/DashboardFragment.kt +++ b/app/src/main/java/com/example/bandung_bondowoso/view/dashboard/DashboardFragment.kt @@ -5,18 +5,26 @@ import android.util.Log import android.view.LayoutInflater import android.view.View import android.view.ViewGroup +import android.widget.Button import android.widget.TextView import androidx.fragment.app.Fragment +import androidx.fragment.app.viewModels import androidx.lifecycle.ViewModelProvider +import com.example.bandung_bondowoso.BandungBondowosoApp import com.example.bandung_bondowoso.broadcast.connection.ConnectionChangeListener import com.example.bandung_bondowoso.databinding.FragmentDashboardBinding import com.example.bandung_bondowoso.util.ConnectionStateMonitor import com.example.bandung_bondowoso.view.network.NoNetworkFragment import com.example.bandung_bondowoso.viewmodel.AuthViewModel +import com.example.bandung_bondowoso.viewmodel.transaction.TransactionViewModel +import com.example.bandung_bondowoso.viewmodel.transaction.TransactionViewModelFactory class DashboardFragment : Fragment(), ConnectionChangeListener { private var _binding: FragmentDashboardBinding? = null + private val transactionViewModel: TransactionViewModel by viewModels { + TransactionViewModelFactory((activity?.application as BandungBondowosoApp).transactionRepository) + } // This property is only valid between onCreateView and // onDestroyView. diff --git a/app/src/main/java/com/example/bandung_bondowoso/view/graph/GraphFragment.kt b/app/src/main/java/com/example/bandung_bondowoso/view/graph/GraphFragment.kt index 184ac44e8fac5d3602655d07cc134fd66d50dd06..19b8bea1e1bd7b453213b1bdcacdb1ebb37db8ad 100644 --- a/app/src/main/java/com/example/bandung_bondowoso/view/graph/GraphFragment.kt +++ b/app/src/main/java/com/example/bandung_bondowoso/view/graph/GraphFragment.kt @@ -12,8 +12,10 @@ import androidx.lifecycle.lifecycleScope import com.example.bandung_bondowoso.BandungBondowosoApp import com.example.bandung_bondowoso.R import com.example.bandung_bondowoso.databinding.FragmentGraphBinding -import com.example.bandung_bondowoso.viewmodel.TransactionViewModel -import com.example.bandung_bondowoso.viewmodel.TransactionViewModelFactory +import com.example.bandung_bondowoso.viewmodel.transaction.TransactionViewModel +import com.example.bandung_bondowoso.viewmodel.transaction.TransactionViewModelFactory +import com.example.bandung_bondowoso.viewmodel.login.LoginViewModel +import com.example.bandung_bondowoso.viewmodel.login.LoginViewModelFactory import com.github.mikephil.charting.animation.Easing import com.github.mikephil.charting.charts.PieChart import com.github.mikephil.charting.data.PieEntry @@ -22,62 +24,102 @@ import kotlinx.coroutines.launch class GraphFragment : Fragment() { private var _binding: FragmentGraphBinding? = null - - // This property is only valid between onCreateView and - // onDestroyView. private val binding get() = _binding!! private val tag = "graphFragment" private val transactionViewModel: TransactionViewModel by viewModels { TransactionViewModelFactory((activity?.application as BandungBondowosoApp).transactionRepository) } - private lateinit var chart:PieChart - override fun onCreate(savedInstanceState: Bundle?) { - Log.d(tag, "onCreate") - super.onCreate(savedInstanceState) + private val loginViewModel: LoginViewModel by viewModels { + LoginViewModelFactory((activity?.application as BandungBondowosoApp).userRepository) } + private lateinit var chart:PieChart + private lateinit var emailUser:String + private var income:Int = 0 + private var expense:Int = 0 override fun onCreateView( inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle? ): View { - _binding = FragmentGraphBinding.inflate(inflater, container, false) - val root: View = binding.root - - chart = binding.chart1!! - chart.setBackgroundColor(ContextCompat.getColor(requireContext(), R.color.md_theme_surface)) - chart.animateY(1400, Easing.EaseInOutQuad) - chart.setUsePercentValues(true) - - + Log.d(tag, "onCreateView") + if (_binding == null) { + _binding = FragmentGraphBinding.inflate(inflater, container, false) + } + return binding.root + } + override fun onViewCreated(view: View, savedInstanceState: Bundle?) { + Log.d(tag, "onViewCreated") + super.onViewCreated(view, savedInstanceState) - val l: com.github.mikephil.charting.components.Legend? = chart.legend - l?.verticalAlignment = com.github.mikephil.charting.components.Legend.LegendVerticalAlignment.TOP - l?.horizontalAlignment = com.github.mikephil.charting.components.Legend.LegendHorizontalAlignment.RIGHT - l?.orientation = com.github.mikephil.charting.components.Legend.LegendOrientation.VERTICAL - l?.setDrawInside(false) - l?.xEntrySpace = 7f - l?.yEntrySpace = 0f - l?.yOffset = 0f - chart.setEntryLabelColor(ContextCompat.getColor(requireContext(), R.color.md_theme_surface)) - chart.setEntryLabelTextSize(16f) + if (_binding != null) { + chart = binding.chart1 + chart.setBackgroundColor(ContextCompat.getColor(requireContext(), R.color.md_theme_surface)) + chart.animateY(1400, Easing.EaseInOutQuad) + chart.setUsePercentValues(true) + chart.isDrawHoleEnabled = false + chart.isDrawHoleEnabled = false + val l: com.github.mikephil.charting.components.Legend? = chart.legend + l?.verticalAlignment = com.github.mikephil.charting.components.Legend.LegendVerticalAlignment.TOP + l?.horizontalAlignment = com.github.mikephil.charting.components.Legend.LegendHorizontalAlignment.RIGHT + l?.orientation = com.github.mikephil.charting.components.Legend.LegendOrientation.VERTICAL + l?.setDrawInside(false) + l?.xEntrySpace = 7f + l?.yEntrySpace = 0f + l?.yOffset = 0f + chart.setEntryLabelColor(ContextCompat.getColor(requireContext(), R.color.md_theme_surface)) + chart.setEntryLabelTextSize(16f) + chart.setNoDataText("") + } val values = ArrayList<PieEntry>() - lifecycleScope.launch{ - values.add(PieEntry(transactionViewModel.getIncome().toFloat(), "Pemasukan")) - values.add(PieEntry(transactionViewModel.getExpense().toFloat(), "Pengeluaran")) - val dataSet = com.github.mikephil.charting.data.PieDataSet(values, "") - dataSet.setColors(ContextCompat.getColor(requireContext(), R.color.md_theme_primary), - ContextCompat.getColor(requireContext(), R.color.md_theme_tertiary)) - val data = com.github.mikephil.charting.data.PieData(dataSet) - chart.data = data - data.setValueFormatter(PercentFormatter(chart)) - data.setValueTextSize(16f) - data.setValueTextColor(ContextCompat.getColor(requireContext(), R.color.md_theme_surface)) - chart.invalidate() + loginViewModel.getEmail().observe(viewLifecycleOwner) { email -> + Log.d(tag, "User Email: $email") + this.emailUser = email.toString() + lifecycleScope.launch { + income = transactionViewModel.getIncome(emailUser) + expense = transactionViewModel.getExpense(emailUser) + values.clear() + values.add(PieEntry(income.toFloat(), "Pemasukan")) + values.add(PieEntry(expense.toFloat(), "Pengeluaran")) + val dataSet = com.github.mikephil.charting.data.PieDataSet(values, "") + dataSet.setColors( + ContextCompat.getColor(requireContext(), R.color.md_theme_primary), + ContextCompat.getColor(requireContext(), R.color.md_theme_peach) + ) + val data = com.github.mikephil.charting.data.PieData(dataSet) + chart.data = data + data.setValueFormatter(PercentFormatter(chart)) + data.setValueTextSize(16f) + data.setValueTextColor(ContextCompat.getColor(requireContext(), R.color.md_theme_surface)) + if (values.isEmpty()) { + chart.visibility = View.GONE + binding.clEmptyRv?.visibility = View.VISIBLE + } else { + chart.visibility = View.VISIBLE + binding.clEmptyRv?.visibility = View.GONE + } + chart.invalidate() + } } - return root } +// override fun onSaveInstanceState(outState: Bundle) { +// super.onSaveInstanceState(outState) +// val incomeState = income +// val expenseState = expense +// val chart = chart +// outState.putInt("income", incomeState) +// outState.putInt("expense", expenseState) +// } +// +// override fun onViewStateRestored(savedInstanceState: Bundle?) { +// super.onViewStateRestored(savedInstanceState) +// if(savedInstanceState != null){ +// income = savedInstanceState.getInt("income") +// expense = savedInstanceState.getInt("expense") +// } +// } + override fun onDestroyView() { super.onDestroyView() _binding = null diff --git a/app/src/main/java/com/example/bandung_bondowoso/view/home/HomeFragment.kt b/app/src/main/java/com/example/bandung_bondowoso/view/home/HomeFragment.kt deleted file mode 100644 index 35b52891b740c989b04ac2ec23586817e00f0b00..0000000000000000000000000000000000000000 --- a/app/src/main/java/com/example/bandung_bondowoso/view/home/HomeFragment.kt +++ /dev/null @@ -1,115 +0,0 @@ -package com.example.bandung_bondowoso.view.home - -import android.Manifest -import android.content.pm.PackageManager -import android.location.Location -import android.os.Bundle -import android.util.Log -import android.view.LayoutInflater -import android.view.View -import android.view.ViewGroup -import android.widget.TextView -import androidx.activity.result.contract.ActivityResultContracts -import androidx.core.app.ActivityCompat -import androidx.fragment.app.Fragment -import androidx.lifecycle.ViewModelProvider -import com.example.bandung_bondowoso.broadcast.connection.ConnectionChangeListener -import com.example.bandung_bondowoso.databinding.FragmentHomeBinding -import com.example.bandung_bondowoso.viewmodel.HomeViewModel -import com.google.android.gms.location.FusedLocationProviderClient -import com.google.android.gms.location.LocationServices - -class HomeFragment : Fragment() { - - private var _binding: FragmentHomeBinding? = null - - // This property is only valid between onCreateView and - // onDestroyView. - private val binding get() = _binding!! - private lateinit var fusedLocationClient: FusedLocationProviderClient - private lateinit var homeViewModel: HomeViewModel - - - override fun onCreateView( - inflater: LayoutInflater, - container: ViewGroup?, - savedInstanceState: Bundle? - ): View { - Log.d("HomeFragment", "onCreateView") - homeViewModel = - ViewModelProvider(this).get(HomeViewModel::class.java) - - _binding = FragmentHomeBinding.inflate(inflater, container, false) - val root: View = binding.root - - val textView: TextView = binding.textHome - homeViewModel.text.observe(viewLifecycleOwner) { - textView.text = it - } - - homeViewModel.transactions.observe(viewLifecycleOwner) { - Log.d("HomeFragment", "Transactions: $it") - } - - binding.buttonAddTransaction.setOnClickListener { - homeViewModel.upsertDummyTransaction() - } - - homeViewModel.locationName.observe(viewLifecycleOwner) { - Log.d("HomeFragment", "Location: $it") - binding.textLocation.text = it - } - - binding.buttonDeleteAllTransaction.setOnClickListener { - homeViewModel.deleteAll() - } - - return root - } - - override fun onViewCreated(view: View, savedInstanceState: Bundle?) { - super.onViewCreated(view, savedInstanceState) - - // Request location permission - val locationPermissionRequest = registerForActivityResult( - ActivityResultContracts.RequestMultiplePermissions() - ) { permissions -> - when { - permissions.getOrDefault(android.Manifest.permission.ACCESS_COARSE_LOCATION, false) -> { - Log.d("HomeFragment", "Approximate location access granted") - getLastLocation() - } else -> { - Log.d("HomeFragment", "No location access granted") - } - } - } - - locationPermissionRequest.launch(arrayOf( - android.Manifest.permission.ACCESS_FINE_LOCATION, - android.Manifest.permission.ACCESS_COARSE_LOCATION) - ) - } - - override fun onDestroyView() { - super.onDestroyView() - _binding = null - } - - private fun getLastLocation() { - fusedLocationClient = LocationServices.getFusedLocationProviderClient(requireActivity()) - if (ActivityCompat.checkSelfPermission( - requireContext(), - Manifest.permission.ACCESS_COARSE_LOCATION - ) != PackageManager.PERMISSION_GRANTED - ) { - return - } - fusedLocationClient.lastLocation - .addOnSuccessListener { location: Location? -> - if (location != null) { - Log.d("HomeFragment", "Location: ${location.latitude}, ${location.longitude}") - homeViewModel.setLocationByLatLong(location.latitude, location.longitude) - } - } - } -} \ No newline at end of file diff --git a/app/src/main/java/com/example/bandung_bondowoso/view/setting/SettingFragment.kt b/app/src/main/java/com/example/bandung_bondowoso/view/setting/SettingFragment.kt index 701d657012c7fe623658e6b1e30231f47b8ddc0d..5f53d7ad6d5d8250d7b727427473b43925c3d3f1 100644 --- a/app/src/main/java/com/example/bandung_bondowoso/view/setting/SettingFragment.kt +++ b/app/src/main/java/com/example/bandung_bondowoso/view/setting/SettingFragment.kt @@ -15,16 +15,18 @@ import android.widget.Toast import androidx.core.content.FileProvider import androidx.fragment.app.Fragment import androidx.fragment.app.viewModels +import androidx.lifecycle.ViewModelProvider import androidx.localbroadcastmanager.content.LocalBroadcastManager import com.example.bandung_bondowoso.BandungBondowosoApp import com.example.bandung_bondowoso.broadcast.connection.ConnectionChangeListener import com.example.bandung_bondowoso.broadcast.jwt_expired.JwtExpiredReceiver +import com.example.bandung_bondowoso.broadcast.randomize_transaction.RandomizeTransactionReceiver import com.example.bandung_bondowoso.databinding.FragmentSettingsBinding import com.example.bandung_bondowoso.model.Transaction +import com.example.bandung_bondowoso.viewmodel.transaction.TransactionViewModel +import com.example.bandung_bondowoso.viewmodel.transaction.TransactionViewModelFactory import com.example.bandung_bondowoso.util.ConnectionStateMonitor -import com.example.bandung_bondowoso.viewmodel.AuthViewModel -import com.example.bandung_bondowoso.viewmodel.TransactionViewModel -import com.example.bandung_bondowoso.viewmodel.TransactionViewModelFactory +import com.example.bandung_bondowoso.viewmodel.transaction.RandomizeTransactionViewModel import com.example.bandung_bondowoso.viewmodel.login.LoginViewModel import com.example.bandung_bondowoso.viewmodel.login.LoginViewModelFactory import com.example.bandung_bondowoso.viewmodel.setting.SettingViewModel @@ -40,6 +42,8 @@ class SettingFragment : Fragment(), ConnectionChangeListener { private var transactionList = listOf<Transaction>() private lateinit var settingViewModel: SettingViewModel + private lateinit var randomizeTransactionViewModel: RandomizeTransactionViewModel + fun createFile(): XSSFWorkbook { val workbook = XSSFWorkbook() @@ -138,6 +142,8 @@ class SettingFragment : Fragment(), ConnectionChangeListener { ((this.activity?.application as BandungBondowosoApp) as BandungBondowosoApp).userRepository, ).create(SettingViewModel::class.java) + randomizeTransactionViewModel = ViewModelProvider(this).get(RandomizeTransactionViewModel::class.java) + userEmail = binding.userEmail binding.buttonSendEmail.setOnClickListener { writingEmail(createFile(), "test", userEmail.text.toString()) @@ -152,9 +158,21 @@ class SettingFragment : Fragment(), ConnectionChangeListener { LocalBroadcastManager.getInstance(requireContext()).sendBroadcast(Intent(JwtExpiredReceiver.ACTION)) } + binding.buttonRandom.setOnClickListener { + randomizeTransactionViewModel.onRandomized() + val intent = Intent(RandomizeTransactionReceiver.ACTION) + val randomNumber = (0..100000).random() + val randomAmount = (1 .. 9999999).random() + intent.putExtra("name", "Random Transaction $randomNumber") + intent.putExtra("amount", randomAmount) + LocalBroadcastManager.getInstance(requireContext()).sendBroadcast(intent) + + } + val connectionStateMonitor = ConnectionStateMonitor(this) connectionStateMonitor.enable(requireContext()) + return root } private val loginViewModel: LoginViewModel by viewModels { @@ -175,9 +193,6 @@ class SettingFragment : Fragment(), ConnectionChangeListener { transactionList = it } } - fun randomizeTransaction(){ - - } override fun onDestroyView() { super.onDestroyView() diff --git a/app/src/main/java/com/example/bandung_bondowoso/view/transaction/CreateTransactionFragment.kt b/app/src/main/java/com/example/bandung_bondowoso/view/transaction/CreateTransactionFragment.kt index 1b4ce26d3f9d4c4ccc42831443c284a9e49ec0fa..06bc93dfbc3a5b61870c4e12fe23f5e7103924d0 100644 --- a/app/src/main/java/com/example/bandung_bondowoso/view/transaction/CreateTransactionFragment.kt +++ b/app/src/main/java/com/example/bandung_bondowoso/view/transaction/CreateTransactionFragment.kt @@ -24,6 +24,7 @@ import androidx.core.app.ActivityCompat import androidx.fragment.app.viewModels import androidx.lifecycle.LiveData import androidx.lifecycle.MutableLiveData +import androidx.lifecycle.ViewModelProvider import androidx.navigation.Navigation import com.example.bandung_bondowoso.BandungBondowosoApp import com.example.bandung_bondowoso.MainActivity @@ -33,8 +34,11 @@ import com.example.bandung_bondowoso.helper.LocationHelper import com.example.bandung_bondowoso.helper.TransactionHelper import com.example.bandung_bondowoso.model.Transaction import com.example.bandung_bondowoso.model.TransactionCategory -import com.example.bandung_bondowoso.viewmodel.TransactionViewModel -import com.example.bandung_bondowoso.viewmodel.TransactionViewModelFactory +import com.example.bandung_bondowoso.viewmodel.transaction.RandomizeTransactionViewModel +import com.example.bandung_bondowoso.viewmodel.transaction.TransactionViewModel +import com.example.bandung_bondowoso.viewmodel.transaction.TransactionViewModelFactory +import com.example.bandung_bondowoso.viewmodel.login.LoginViewModel +import com.example.bandung_bondowoso.viewmodel.login.LoginViewModelFactory import com.google.android.gms.location.FusedLocationProviderClient import com.google.android.gms.location.LocationServices import java.util.Date @@ -71,10 +75,19 @@ class CreateTransactionFragment : Fragment() { private lateinit var transactionHelper: TransactionHelper private lateinit var locationHelper: LocationHelper + private lateinit var emailUser:String + /** Initialize Transaction View Model */ private val transactionViewModel: TransactionViewModel by viewModels { TransactionViewModelFactory((activity?.application as BandungBondowosoApp).transactionRepository) } + + private val loginViewModel: LoginViewModel by viewModels { + LoginViewModelFactory((activity?.application as BandungBondowosoApp).userRepository) + } + + private lateinit var randomizeTransactionViewModel: RandomizeTransactionViewModel + override fun onCreate(savedInstanceState: Bundle?) { Log.d(tag, "onCreate") super.onCreate(savedInstanceState) @@ -84,10 +97,16 @@ class CreateTransactionFragment : Fragment() { savedInstanceState: Bundle? ): View { Log.d(tag, "onCreateView") - _binding = FragmentTransactionCreateBinding.inflate(inflater, container, false) - val root:View = binding.root + return binding.root + } + + override fun onViewCreated(view: View, savedInstanceState: Bundle?) { + Log.d(tag, "onViewCreated") + super.onViewCreated(view, savedInstanceState) (activity as MainActivity).binding.navView.visibility = View.GONE + randomizeTransactionViewModel = ViewModelProvider(requireActivity()).get( + RandomizeTransactionViewModel::class.java) transactionHelper = TransactionHelper(requireContext()) locationHelper = LocationHelper(requireContext()) transactionName = binding.etTransactionName @@ -112,7 +131,8 @@ class CreateTransactionFragment : Fragment() { submitButton.setOnClickListener { if(createNewTransaction()){ clearField() - Navigation.findNavController(root).navigate(R.id.action_newTransactionFragment_to_navigation_transaction) + Navigation.findNavController(view).navigate(R.id.action_newTransactionFragment_to_navigation_transaction) + (activity as MainActivity).binding.navView.selectedItemId = R.id.navigation_transaction Toast.makeText(requireContext(), "Create ETransaction Success", Toast.LENGTH_SHORT).show() } else { Toast.makeText(requireContext(), "Create ETransaction Failed", Toast.LENGTH_SHORT).show() @@ -123,7 +143,8 @@ class CreateTransactionFragment : Fragment() { dialog.show() btnDialogSubmit.setOnClickListener { clearField() - Navigation.findNavController(root).navigate(R.id.action_newTransactionFragment_to_navigation_transaction) + Navigation.findNavController(view).navigate(R.id.action_newTransactionFragment_to_navigation_transaction) + (activity as MainActivity).binding.navView.selectedItemId = R.id.navigation_transaction dialog.dismiss() } btnDialogCancel.setOnClickListener { @@ -138,23 +159,28 @@ class CreateTransactionFragment : Fragment() { val intent = Intent(Settings.ACTION_LOCATION_SOURCE_SETTINGS) startActivity(intent) } - return root - } + loginViewModel.getEmail().observe(viewLifecycleOwner) { email -> + emailUser = email.toString() + } - override fun onViewCreated(view: View, savedInstanceState: Bundle?) { - super.onViewCreated(view, savedInstanceState) locationName.observe(viewLifecycleOwner) { location -> if(location != null){ transactionLocation.setText(location) } } + randomizeTransactionViewModel.transactionName.observe(viewLifecycleOwner) { name -> + transactionName.setText(name) + } + randomizeTransactionViewModel.transactionAmount.observe(viewLifecycleOwner) { amount -> + transactionAmount.setText(amount.toString()) + } + if (ActivityCompat.checkSelfPermission( requireContext(), Manifest.permission.ACCESS_COARSE_LOCATION ) != PackageManager.PERMISSION_GRANTED ) { -// setLatLongFromAddress(transactionLocation.text.toString()) locationHelper.setLatLongFromAddress(transactionLocation.text.toString()) } } @@ -182,6 +208,7 @@ class CreateTransactionFragment : Fragment() { val newTransaction = Transaction( name = name, + email = emailUser, amount = amount, type = category, locationLat = coordinates!!.first, @@ -213,6 +240,7 @@ class CreateTransactionFragment : Fragment() { ) { return } + fusedLocationClient.lastLocation .addOnSuccessListener { location: Location? -> if (location != null) { @@ -224,15 +252,14 @@ class CreateTransactionFragment : Fragment() { } } - fun askLocation(): Boolean { + private fun askLocation(): Boolean { val service: LocationManager = requireContext().getSystemService(Context.LOCATION_SERVICE) as LocationManager return service.isProviderEnabled(LocationManager.GPS_PROVIDER) } - - override fun onDestroyView() { + Log.d(tag, "onDestroy") super.onDestroyView() (activity as MainActivity).binding.navView.visibility = View.VISIBLE } diff --git a/app/src/main/java/com/example/bandung_bondowoso/view/transaction/EditTransactionFragment.kt b/app/src/main/java/com/example/bandung_bondowoso/view/transaction/EditTransactionFragment.kt index 6a6bf7e3fbf598b1176036b6a9c437a555bc206c..06e91bf1fd9a83ef69e5fd5e525410f8f939f96e 100644 --- a/app/src/main/java/com/example/bandung_bondowoso/view/transaction/EditTransactionFragment.kt +++ b/app/src/main/java/com/example/bandung_bondowoso/view/transaction/EditTransactionFragment.kt @@ -23,8 +23,10 @@ import com.example.bandung_bondowoso.helper.LocationHelper import com.example.bandung_bondowoso.helper.TransactionHelper import com.example.bandung_bondowoso.model.Transaction import com.example.bandung_bondowoso.model.TransactionCategory -import com.example.bandung_bondowoso.viewmodel.TransactionViewModel -import com.example.bandung_bondowoso.viewmodel.TransactionViewModelFactory +import com.example.bandung_bondowoso.viewmodel.transaction.TransactionViewModel +import com.example.bandung_bondowoso.viewmodel.transaction.TransactionViewModelFactory +import com.example.bandung_bondowoso.viewmodel.login.LoginViewModel +import com.example.bandung_bondowoso.viewmodel.login.LoginViewModelFactory import kotlinx.coroutines.launch import java.util.Date import kotlin.properties.Delegates @@ -42,6 +44,9 @@ class EditTransactionFragment : Fragment() { private val transactionViewModel: TransactionViewModel by viewModels { TransactionViewModelFactory((activity?.application as BandungBondowosoApp).transactionRepository) } + private val loginViewModel: LoginViewModel by viewModels { + LoginViewModelFactory((activity?.application as BandungBondowosoApp).userRepository) + } private lateinit var transactionName: EditText private lateinit var transactionAmount: EditText private lateinit var transactionLocation: EditText @@ -60,6 +65,7 @@ class EditTransactionFragment : Fragment() { private lateinit var transactionDate:Date private var locationLat by Delegates.notNull<Double>() private var locationLong by Delegates.notNull<Double>() + private lateinit var emailUser:String override fun onCreate(savedInstanceState: Bundle?) { Log.d(tag, "onCreate") @@ -71,7 +77,12 @@ class EditTransactionFragment : Fragment() { ): View { // Inflate the layout for this fragment _binding = FragmentTransactionCreateBinding.inflate(inflater, container, false) - val root:View = binding.root + return binding.root + } + + override fun onViewCreated(view: View, savedInstanceState: Bundle?) { + Log.d(tag, "onViewCreated") + super.onViewCreated(view, savedInstanceState) title = binding.tvTransactionNew transactionHelper = TransactionHelper(requireContext()) locationHelper = LocationHelper(requireContext()) @@ -95,6 +106,10 @@ class EditTransactionFragment : Fragment() { btnDialogSubmit.text = getString(R.string.button_ok) submitButton = binding.btnSubmit + loginViewModel.getEmail().observe(viewLifecycleOwner) { email -> + emailUser = email.toString() + } + lifecycleScope.launch{ transaction = transactionViewModel.getTransaction(transactionId) title.text = transaction.name @@ -115,7 +130,7 @@ class EditTransactionFragment : Fragment() { submitButton.setOnClickListener { if(editTransaction()){ - Navigation.findNavController(root).navigate(R.id.action_editTransactionFragment_to_navigation_transaction) + Navigation.findNavController(view).navigate(R.id.action_editTransactionFragment_to_navigation_transaction) Toast.makeText(requireContext(), "Edit Transaction Success", Toast.LENGTH_SHORT).show() } else { Toast.makeText(requireContext(), "Edit Transaction Failed", Toast.LENGTH_SHORT).show() @@ -124,14 +139,13 @@ class EditTransactionFragment : Fragment() { cancelButton.setOnClickListener { dialog.show() btnDialogSubmit.setOnClickListener { - Navigation.findNavController(root).navigate(R.id.action_editTransactionFragment_to_navigation_transaction) + Navigation.findNavController(view).navigate(R.id.action_editTransactionFragment_to_navigation_transaction) dialog.dismiss() } btnDialogCancel.setOnClickListener { dialog.dismiss() } } - return root } private fun editTransaction(): Boolean{ diff --git a/app/src/main/java/com/example/bandung_bondowoso/view/transaction/TransactionAdapter.kt b/app/src/main/java/com/example/bandung_bondowoso/view/transaction/TransactionAdapter.kt index 4d598de26425ff78942fc53dae30306e88c19fca..79e73f39e66bbbf6d1b9b8be7fda47b46e3362ee 100644 --- a/app/src/main/java/com/example/bandung_bondowoso/view/transaction/TransactionAdapter.kt +++ b/app/src/main/java/com/example/bandung_bondowoso/view/transaction/TransactionAdapter.kt @@ -13,14 +13,15 @@ import androidx.core.content.ContextCompat import androidx.recyclerview.widget.RecyclerView import com.bumptech.glide.Glide import com.example.bandung_bondowoso.R -import com.example.bandung_bondowoso.`interface`.TransactionItemClickListener import com.example.bandung_bondowoso.model.Transaction import com.example.bandung_bondowoso.model.TransactionCategory import java.text.SimpleDateFormat import java.util.Locale -class TransactionAdapter (var transactionList: List<Transaction>, - private val itemClickListener: TransactionItemClickListener): +class TransactionAdapter( + var transactionList: List<Transaction>, + private val itemClickListener: TransactionFragment +): RecyclerView.Adapter<TransactionAdapter.TransactionViewHolder>(){ inner class TransactionViewHolder(view: View): RecyclerView.ViewHolder(view){ val tvTransactionName:TextView = view.findViewById(R.id.tv_transaction_name) diff --git a/app/src/main/java/com/example/bandung_bondowoso/view/transaction/TransactionFragment.kt b/app/src/main/java/com/example/bandung_bondowoso/view/transaction/TransactionFragment.kt index 4ff8de22b8eeb4bff8e5fb2552fa9e772fce91a2..00c713a8788781019fb41cff4513045d3d8e0a4b 100644 --- a/app/src/main/java/com/example/bandung_bondowoso/view/transaction/TransactionFragment.kt +++ b/app/src/main/java/com/example/bandung_bondowoso/view/transaction/TransactionFragment.kt @@ -1,5 +1,6 @@ package com.example.bandung_bondowoso.view.transaction +import android.annotation.SuppressLint import android.content.Intent import android.net.Uri import android.os.Bundle @@ -20,8 +21,8 @@ import com.example.bandung_bondowoso.databinding.FragmentTransactionBinding import com.example.bandung_bondowoso.helper.LocationHelper import com.example.bandung_bondowoso.`interface`.TransactionItemClickListener import com.example.bandung_bondowoso.model.Transaction -import com.example.bandung_bondowoso.viewmodel.TransactionViewModel -import com.example.bandung_bondowoso.viewmodel.TransactionViewModelFactory +import com.example.bandung_bondowoso.viewmodel.transaction.TransactionViewModel +import com.example.bandung_bondowoso.viewmodel.transaction.TransactionViewModelFactory import com.example.bandung_bondowoso.viewmodel.login.LoginViewModel import com.example.bandung_bondowoso.viewmodel.login.LoginViewModelFactory import com.google.android.material.bottomsheet.BottomSheetDialog @@ -30,6 +31,7 @@ import com.google.android.material.floatingactionbutton.FloatingActionButton class TransactionFragment : Fragment(), TransactionItemClickListener { private var _binding: FragmentTransactionBinding? = null private val tag = "transactionFragment" + private lateinit var userEmailValue:String private val binding get() = _binding!! private var transactionList = listOf<Transaction>() private lateinit var adapter: TransactionAdapter @@ -37,6 +39,7 @@ class TransactionFragment : Fragment(), TransactionItemClickListener { private lateinit var balance: TextView private lateinit var locationHelper: LocationHelper private lateinit var bottomSheetDialog: BottomSheetDialog + private lateinit var email:String private val transactionViewModel: TransactionViewModel by viewModels { TransactionViewModelFactory((activity?.application as BandungBondowosoApp).transactionRepository) @@ -46,14 +49,18 @@ class TransactionFragment : Fragment(), TransactionItemClickListener { LoginViewModelFactory((activity?.application as BandungBondowosoApp).userRepository) } - override fun onCreateView( inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle? ): View { Log.d(tag, "onCreateView") _binding = FragmentTransactionBinding.inflate(inflater, container, false) - val root:View = binding.root + return binding.root + } + + override fun onViewCreated(view: View, savedInstanceState: Bundle?) { + Log.d(tag, "onViewCreated") + super.onViewCreated(view, savedInstanceState) locationHelper = LocationHelper(requireContext()) bottomSheetDialog = BottomSheetDialog(requireContext()) @@ -64,38 +71,43 @@ class TransactionFragment : Fragment(), TransactionItemClickListener { balance = binding.tvBalanceNominal - transactionViewModel.transactions.observe(viewLifecycleOwner) { - Log.d(tag, "Transactions: $it") - transactionList = it - if(transactionList.isNotEmpty()){ - adapter = TransactionAdapter(transactionList, itemClickListener = this) - binding.rvTransaction.adapter = adapter - } else { - Log.d(tag, "Transaction list is empty") - binding.clEmptyRv.visibility = View.VISIBLE - binding.rvTransaction.visibility = View.GONE - } + loginViewModel.getEmail().observe(viewLifecycleOwner) { email -> + Log.d(tag, "User Email: $email") + userEmail.text = email.toString() + userEmailValue = email.toString() + this.email = userEmailValue + transactionViewModel.fetchTransactionsByEmail(email.toString()) + transactionViewModel.updateBalance(email.toString()) } - transactionViewModel.balance.observe(viewLifecycleOwner) { amount -> - Log.d(tag, "Balance: $amount") - balance.text = getString(R.string.balance_value, amount.toString()) + transactionViewModel.balance.observe(viewLifecycleOwner) { balanceValue -> + balance.text = getString(R.string.balance_value, balanceValue.toString()) } - loginViewModel.getEmail().observe(viewLifecycleOwner) { email -> - Log.d(tag, "User Email: $email") - userEmail.text = email.toString() + transactionViewModel.transactions.observe(viewLifecycleOwner) { transactions -> + transactionList = transactions + if(transactionList.isEmpty()){ + binding.clEmptyRv.visibility = View.VISIBLE + binding.rvTransaction.visibility = View.GONE + } else { + adapter = TransactionAdapter(transactionList, itemClickListener = this) + binding.rvTransaction.adapter = adapter + } } + val createTransactionButton:FloatingActionButton = binding.fabCreateTransaction createTransactionButton.setOnClickListener { - Navigation.findNavController(root).navigate(R.id.action_navigation_transaction_to_newTransactionFragment) + Navigation.findNavController(view).navigate(R.id.action_navigation_transaction_to_newTransactionFragment) } - return root } + @SuppressLint("NotifyDataSetChanged") override fun onDeleteTransaction(transaction: Transaction) { - transactionViewModel.delete(transaction) + val position = transactionList.indexOf(transaction) + transactionViewModel.delete(transaction, email) + adapter.notifyItemRemoved(position) + adapter.notifyDataSetChanged() } override fun onEditTransaction(root:View, id:Int) { @@ -109,8 +121,6 @@ class TransactionFragment : Fragment(), TransactionItemClickListener { val addressTextView = bottomSheetView.findViewById<TextView>(R.id.tv_address) val buttonOpenMap = bottomSheetView.findViewById<Button>(R.id.btn_open_map) - - val coordinates = locationHelper.setLatLongFromAddress(location) addressTextView.text = location nameTextView.text = name diff --git a/app/src/main/java/com/example/bandung_bondowoso/viewmodel/GraphViewModel.kt b/app/src/main/java/com/example/bandung_bondowoso/viewmodel/GraphViewModel.kt deleted file mode 100644 index e5fdfca5f49f2ee7beb3f0d70b14e2674ff7050d..0000000000000000000000000000000000000000 --- a/app/src/main/java/com/example/bandung_bondowoso/viewmodel/GraphViewModel.kt +++ /dev/null @@ -1,6 +0,0 @@ -package com.example.bandung_bondowoso.viewmodel - -import androidx.lifecycle.ViewModel - -class GraphViewModel : ViewModel() { -} \ No newline at end of file diff --git a/app/src/main/java/com/example/bandung_bondowoso/viewmodel/HomeViewModel.kt b/app/src/main/java/com/example/bandung_bondowoso/viewmodel/HomeViewModel.kt deleted file mode 100644 index 9dcb246df278c465915859ea75afbf3237c166ca..0000000000000000000000000000000000000000 --- a/app/src/main/java/com/example/bandung_bondowoso/viewmodel/HomeViewModel.kt +++ /dev/null @@ -1,106 +0,0 @@ -package com.example.bandung_bondowoso.viewmodel - -import android.app.Application -import android.location.Geocoder -import android.os.Build -import android.util.Log -import androidx.lifecycle.AndroidViewModel -import androidx.lifecycle.LiveData -import androidx.lifecycle.MutableLiveData -import androidx.lifecycle.viewModelScope -import com.example.bandung_bondowoso.local.AppDatabase -import com.example.bandung_bondowoso.model.Transaction -import com.example.bandung_bondowoso.repository.TransactionRepository -import kotlinx.coroutines.flow.Flow -import kotlinx.coroutines.flow.collect -import kotlinx.coroutines.launch - -class HomeViewModel(application: Application) : AndroidViewModel(application) { - private val _text = MutableLiveData<String>().apply { - value = "This is home Fragment" - } - - val text: LiveData<String> = _text - - private val transactionDao = AppDatabase.getInstance(application).transactionDao() - private val repository = TransactionRepository(transactionDao) - - private val _transactions = MutableLiveData<List<Transaction>>() - val transactions = _transactions - - init { - viewModelScope.launch { - repository.getAll.collect() { - _transactions.value = it - } - } - } - fun getTransactionCount(){ - viewModelScope.launch { - repository.getCount() - } - } - fun upsert(transaction: Transaction) = viewModelScope.launch { - repository.upsert(transaction) - } - - // Experimenting with location - fun upsertDummyTransaction() { - val transaction = Transaction(0, "Test", 100, - com.example.bandung_bondowoso.model.TransactionCategory.INCOME, _locationLat.value ?: 0.0, _locationLong.value ?: 0.0, _locationName.value?:"", - java.util.Date() - ) - upsert(transaction) - } - - private val _locationName = MutableLiveData<String?>() - val locationName: LiveData<String?> = _locationName - - private val _locationLat = MutableLiveData<Double>() - val locationLat: LiveData<Double> = _locationLat - - private val _locationLong = MutableLiveData<Double>() - val locationLong: LiveData<Double> = _locationLong - - fun setLocation(location: String?) { - _locationName.value = location - } - - @Suppress("DEPRECATION") - fun setLocationByLatLong( - lat: Double, - long: Double, - ) { - _locationLat.value = lat - _locationLong.value = long - - val geocoder = Geocoder(getApplication()) - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) { - geocoder.getFromLocation(lat, long, 1) { - address -> - setLocation(address.firstOrNull()?.getAddressLine(0)) - } - return - } - - try { - val address = geocoder.getFromLocation(lat, long, 1) - if (address != null) { - setLocation(address.firstOrNull()?.getAddressLine(0)) - } else { - setLocation(null) - } - } catch(e: Exception) { - //will catch if there is an internet problem - Log.e("HomeViewModel", "Error getting location", e) - setLocation(null) - } - } - - // Development function - fun deleteAll() { - viewModelScope.launch { - repository.deleteAll() - } - } -} \ No newline at end of file diff --git a/app/src/main/java/com/example/bandung_bondowoso/viewmodel/setting/SettingViewModel.kt b/app/src/main/java/com/example/bandung_bondowoso/viewmodel/setting/SettingViewModel.kt index 379ca4554a087816a00f6aeb68d5d2dbd608f7d7..c40b0afe8c51dccfeec1f33c86550a0873db5e3e 100644 --- a/app/src/main/java/com/example/bandung_bondowoso/viewmodel/setting/SettingViewModel.kt +++ b/app/src/main/java/com/example/bandung_bondowoso/viewmodel/setting/SettingViewModel.kt @@ -1,12 +1,18 @@ package com.example.bandung_bondowoso.viewmodel.setting +import android.content.Intent +import android.util.Log +import androidx.core.content.ContentProviderCompat.requireContext import androidx.lifecycle.ViewModel import androidx.lifecycle.ViewModelProvider import androidx.lifecycle.viewModelScope +import androidx.localbroadcastmanager.content.LocalBroadcastManager +import com.example.bandung_bondowoso.broadcast.randomize_transaction.RandomizeTransactionListener +import com.example.bandung_bondowoso.model.TransactionCategory import com.example.bandung_bondowoso.repository.UserRepository import kotlinx.coroutines.launch -class SettingViewModel(private val userRepository: UserRepository): ViewModel() { +class SettingViewModel(private val userRepository: UserRepository): ViewModel(){ fun logout() { viewModelScope.launch { userRepository.logout() diff --git a/app/src/main/java/com/example/bandung_bondowoso/viewmodel/transaction/RandomizeTransactionViewModel.kt b/app/src/main/java/com/example/bandung_bondowoso/viewmodel/transaction/RandomizeTransactionViewModel.kt new file mode 100644 index 0000000000000000000000000000000000000000..0312e531ae6a6885f629c11d29bd56bac94af369 --- /dev/null +++ b/app/src/main/java/com/example/bandung_bondowoso/viewmodel/transaction/RandomizeTransactionViewModel.kt @@ -0,0 +1,43 @@ +package com.example.bandung_bondowoso.viewmodel.transaction + +import android.content.Intent +import android.util.Log +import androidx.lifecycle.LiveData +import androidx.lifecycle.MutableLiveData +import androidx.lifecycle.ViewModel +import androidx.localbroadcastmanager.content.LocalBroadcastManager +import com.example.bandung_bondowoso.broadcast.randomize_transaction.RandomizeTransactionListener +import com.example.bandung_bondowoso.broadcast.randomize_transaction.RandomizeTransactionReceiver +import com.example.bandung_bondowoso.model.TransactionCategory + +class RandomizeTransactionViewModel: ViewModel(), RandomizeTransactionListener { + private val _isRandomized = MutableLiveData<Boolean>() + val isRandomized = _isRandomized + + private val _transactionName = MutableLiveData<String>() + val transactionName: LiveData<String> = _transactionName + + private val _transactionAmount = MutableLiveData<Int>() + val transactionAmount:LiveData<Int> = _transactionAmount + + override fun onRandomized() { + Log.d("RandomizeTransactionViewModel", "onRandomized") + _isRandomized.value = true + } + + override fun onReceivedRandomTransaction( + transactionName: String, + transactionAmount: Int, + ) { + Log.d("RandomizeTransactionViewModel", "onReceivedRandomTransaction") + _transactionName.value = transactionName + _transactionAmount.value = transactionAmount + } + + fun getTransactionName(): String? { + return _transactionName.value + } + + + +} diff --git a/app/src/main/java/com/example/bandung_bondowoso/viewmodel/TransactionViewModel.kt b/app/src/main/java/com/example/bandung_bondowoso/viewmodel/transaction/TransactionViewModel.kt similarity index 68% rename from app/src/main/java/com/example/bandung_bondowoso/viewmodel/TransactionViewModel.kt rename to app/src/main/java/com/example/bandung_bondowoso/viewmodel/transaction/TransactionViewModel.kt index 9aa4db76782a9eda0f285044cb2aaaf187d2b25c..3d01c05e0683df301361ed1055b5ae87ad3f348b 100644 --- a/app/src/main/java/com/example/bandung_bondowoso/viewmodel/TransactionViewModel.kt +++ b/app/src/main/java/com/example/bandung_bondowoso/viewmodel/transaction/TransactionViewModel.kt @@ -1,32 +1,35 @@ -package com.example.bandung_bondowoso.viewmodel +package com.example.bandung_bondowoso.viewmodel.transaction +import android.content.Intent import androidx.lifecycle.LiveData import androidx.lifecycle.MutableLiveData import androidx.lifecycle.ViewModel import androidx.lifecycle.ViewModelProvider import androidx.lifecycle.viewModelScope +import com.example.bandung_bondowoso.broadcast.randomize_transaction.RandomizeTransactionListener import com.example.bandung_bondowoso.model.Transaction import com.example.bandung_bondowoso.model.TransactionCategory import com.example.bandung_bondowoso.repository.TransactionRepository import kotlinx.coroutines.launch -class TransactionViewModel(private val repository:TransactionRepository) : ViewModel() { +class TransactionViewModel(private val repository:TransactionRepository) : ViewModel(){ private val _transactions = MutableLiveData<List<Transaction>>() - val transactions = _transactions + val transactions:LiveData<List<Transaction>> = _transactions private val _balance = MutableLiveData<Int>() val balance: LiveData<Int> = _balance - private val TAG = "TransactionViewModel" + private val tag = "TransactionViewModel" - init { + + suspend fun fetchTransactions(email: String): List<Transaction> { + return repository.getAllByEmail(email) + } + fun fetchTransactionsByEmail(email: String) { viewModelScope.launch { - repository.getAll.collect { - _transactions.value = it - _balance.value = getBalance() - } + val transactions = repository.getAllByEmail(email) + _transactions.value = transactions } } - suspend fun getTransaction(id: Int): Transaction { return repository.getTransaction(id) } @@ -39,32 +42,34 @@ class TransactionViewModel(private val repository:TransactionRepository) : ViewM fun upsert(transaction: Transaction) { viewModelScope.launch { repository.upsert(transaction) + updateBalance(transaction.email) } } - - suspend fun getIncome(): Int { - return repository.getIncome() + fun updateBalance(email: String) { + viewModelScope.launch { + val newBalance = (getIncome(email) - getExpense(email)) + _balance.postValue(newBalance) + } } - - suspend fun getExpense(): Int { - return repository.getExpense() + suspend fun getIncome(email:String): Int { + return repository.getIncome(email) } - private suspend fun getBalance(): Int { - return -1 * (getExpense() - getIncome()) + + suspend fun getExpense(email:String): Int { + return repository.getExpense(email) } - fun edit(transaction: Transaction) { + fun delete(transaction: Transaction, email:String) { viewModelScope.launch { - repository.upsert(transaction) + repository.delete(transaction) + updateBalance(transaction.email) + fetchTransactionsByEmail(email) } } - - fun validateAndUpdateTransaction(prevTransaction:Transaction, newTransaction: Transaction, field:String):Boolean{ - TODO() - } - fun delete(transaction: Transaction) { + // Development function + fun deleteAll() { viewModelScope.launch { - repository.delete(transaction) + repository.deleteAll() } } fun randomizeTransaction():Transaction{ @@ -76,39 +81,34 @@ class TransactionViewModel(private val repository:TransactionRepository) : ViewM val randomLat = (-90..90).random().toDouble() val randomLong = (-180..180).random().toDouble() val randomLocationName = if(randomLocation == 0) "Bandung" else "Bondowoso" - return Transaction( name = "Random Transaction $randomName", amount = randomAmount, + return Transaction( name = "Random Transaction $randomName", email = "13521132@std.stei.itb.ac.id", + amount = randomAmount, type = randomType, locationLat = randomLat, locationLong = randomLong, locationName = randomLocationName, createdAt = java.util.Date()) } - // Development function - fun deleteAll() { - viewModelScope.launch { - repository.deleteAll() - } - } fun seedData(){ val transactionList = mutableListOf<Transaction>( - Transaction( name = "Test 1", amount = 100, + Transaction( email = "13521132@std.stei.itb.ac.id", name = "Test 1", amount = 100, type = TransactionCategory.INCOME, locationLat = 6.1944, locationLong = 106.8229, locationName = "Jakarta", createdAt = java.util.Date()), - Transaction( name = "Test 2", amount = 100, + Transaction( email = "13521132@std.stei.itb.ac.id", name = "Test 2", amount = 100, type = TransactionCategory.INCOME, locationLat = 6.1944, locationLong = 106.8229, locationName = "Jakarta", createdAt = java.util.Date()), - Transaction( name = "Test 3", amount = 100, + Transaction( email = "13521132@std.stei.itb.ac.id", name = "Test 3", amount = 100, type = TransactionCategory.INCOME, locationLat = 6.1944, locationLong = 106.8229, locationName = "Jakarta", createdAt = java.util.Date()), - Transaction( name = "Test 4 ", amount = 100, + Transaction(email = "13521132@std.stei.itb.ac.id", name = "Test 4 ", amount = 100, type = TransactionCategory.INCOME, locationLat = 6.1944, locationLong = 106.8229, locationName = "Jakarta", createdAt = java.util.Date()), - Transaction( name = "Test 5", amount = 100, + Transaction(email = "13521132@std.stei.itb.ac.id", name = "Test 5", amount = 100, type = TransactionCategory.INCOME, locationLat = 6.1944, locationLong = 106.8229, locationName = "Jakarta", createdAt = java.util.Date()), - Transaction( name = "Test 6", amount = 100, + Transaction(email = "13521132@std.stei.itb.ac.id", name = "Test 6", amount = 100, type = TransactionCategory.INCOME, locationLat = 6.1944, locationLong = 106.8229, locationName = "Jakarta", createdAt = java.util.Date()) @@ -118,6 +118,7 @@ class TransactionViewModel(private val repository:TransactionRepository) : ViewM upsert(it) } } + } /** Provides repository to transaction view model */ diff --git a/app/src/main/res/drawable/bg_settings_card_email.xml b/app/src/main/res/drawable/bg_settings_card_email.xml deleted file mode 100644 index 211758aeefd78f338544978746ff5f3704ae3fcc..0000000000000000000000000000000000000000 --- a/app/src/main/res/drawable/bg_settings_card_email.xml +++ /dev/null @@ -1,5 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<shape xmlns:android="http://schemas.android.com/apk/res/android"> - <solid android:color="@color/md_theme_peach" /> - <corners android:radius="10dp" /> -</shape> \ No newline at end of file diff --git a/app/src/main/res/drawable/bg_settings_card_excel.xml b/app/src/main/res/drawable/bg_settings_card_excel.xml deleted file mode 100644 index 99e0d60361eea5facc82cf339d4d19e14d91d3f0..0000000000000000000000000000000000000000 --- a/app/src/main/res/drawable/bg_settings_card_excel.xml +++ /dev/null @@ -1,5 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<shape xmlns:android="http://schemas.android.com/apk/res/android"> - <solid android:color="@color/md_theme_light_green" /> - <corners android:radius="10dp" /> -</shape> \ No newline at end of file diff --git a/app/src/main/res/layout-land/fragment_graph.xml b/app/src/main/res/layout-land/fragment_graph.xml index 3fd26d23f8421a621c611d9737584aa6190b4d0b..dc83539a7fc87b91cb263af91d96389c02dbdd68 100644 --- a/app/src/main/res/layout-land/fragment_graph.xml +++ b/app/src/main/res/layout-land/fragment_graph.xml @@ -5,24 +5,71 @@ android:layout_width="match_parent" android:layout_height="match_parent" tools:context=".view.graph.GraphFragment" + android:background="@color/md_theme_surface" > - <TextView android:id="@+id/textView" style="@style/TextAppearance.HeadlineLarge" android:layout_width="wrap_content" android:layout_height="wrap_content" - android:layout_marginTop="20dp" + android:layout_marginStart="20dp" + android:layout_marginTop="10dp" android:padding="10dp" - android:text="Graph" + android:text="@string/title_chart" android:textColor="@color/md_theme_primary" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toTopOf="parent" /> - <com.anychart.AnyChartView - android:id="@+id/anyChartView" + <androidx.constraintlayout.widget.ConstraintLayout + android:id="@+id/cl_empty_rv" android:layout_width="match_parent" - android:layout_height="match_parent" + android:layout_height="wrap_content" + android:visibility="gone" app:layout_constraintBottom_toBottomOf="parent" - /> + app:layout_constraintEnd_toEndOf="parent" + app:layout_constraintStart_toStartOf="parent" + app:layout_constraintTop_toBottomOf="@id/textView"> + + <ImageView + android:id="@+id/iv_no_data" + android:layout_width="300dp" + android:layout_height="300dp" + android:layout_marginTop="20dp" + android:contentDescription="@string/cd_transaction_empty" + android:src="@drawable/no_data_cuate" + app:layout_constraintEnd_toEndOf="parent" + app:layout_constraintStart_toStartOf="parent" + app:layout_constraintTop_toTopOf="parent" /> + + <TextView + style="@style/TextAppearance.LabelLarge" + android:layout_width="wrap_content" + android:layout_height="match_parent" + android:text="@string/msg_empty_transaction" + android:textColor="@color/md_theme_tertiary" + app:layout_constraintEnd_toEndOf="parent" + app:layout_constraintStart_toStartOf="parent" + app:layout_constraintTop_toBottomOf="@id/iv_no_data" + + /> + + </androidx.constraintlayout.widget.ConstraintLayout> + + <RelativeLayout + android:id="@+id/relativeLayout" + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:orientation="vertical" + app:layout_constraintEnd_toEndOf="parent" + app:layout_constraintStart_toStartOf="parent" + app:layout_constraintTop_toBottomOf="@id/textView" + app:layout_goneMarginTop="@dimen/title_top_margin"> + + <com.github.mikephil.charting.charts.PieChart + android:id="@+id/chart1" + android:layout_width="match_parent" + android:layout_height="200dp" + /> + + </RelativeLayout> </androidx.constraintlayout.widget.ConstraintLayout> \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_dashboard.xml b/app/src/main/res/layout/fragment_dashboard.xml index 61536b7d44c4f5cab0550befbd98719f34307d93..9b360e21e81cb94a2129baf0187188982e428fc3 100644 --- a/app/src/main/res/layout/fragment_dashboard.xml +++ b/app/src/main/res/layout/fragment_dashboard.xml @@ -21,6 +21,7 @@ android:text="Logout" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintEnd_toEndOf="parent" + app:layout_constraintHorizontal_bias="0.0" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toBottomOf="@id/dashboard_child_fragment" /> diff --git a/app/src/main/res/layout/fragment_graph.xml b/app/src/main/res/layout/fragment_graph.xml index ed95a4c4451ee6a0cf528c307cc4f9c8892614ee..c5026257ae8494c365d336c436fe2de0e09db831 100644 --- a/app/src/main/res/layout/fragment_graph.xml +++ b/app/src/main/res/layout/fragment_graph.xml @@ -20,21 +20,55 @@ app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toTopOf="parent" /> + <androidx.constraintlayout.widget.ConstraintLayout + android:id="@+id/cl_empty_rv" + android:layout_width="match_parent" + android:layout_height="wrap_content" + app:layout_constraintBottom_toBottomOf="parent" + app:layout_constraintEnd_toEndOf="parent" + app:layout_constraintStart_toStartOf="parent" + android:visibility="gone" + app:layout_constraintTop_toBottomOf="@id/textView"> + + <ImageView + android:id="@+id/iv_no_data" + android:layout_width="300dp" + android:layout_height="300dp" + android:layout_marginTop="20dp" + android:contentDescription="@string/cd_transaction_empty" + android:src="@drawable/no_data_cuate" + app:layout_constraintEnd_toEndOf="parent" + app:layout_constraintStart_toStartOf="parent" + app:layout_constraintTop_toTopOf="parent" /> + + <TextView + style="@style/TextAppearance.LabelLarge" + android:layout_width="wrap_content" + android:layout_height="match_parent" + android:text="@string/msg_empty_transaction" + android:textColor="@color/md_theme_tertiary" + app:layout_constraintEnd_toEndOf="parent" + app:layout_constraintStart_toStartOf="parent" + app:layout_constraintTop_toBottomOf="@id/iv_no_data" + + /> + + </androidx.constraintlayout.widget.ConstraintLayout> + <RelativeLayout + android:id="@+id/relativeLayout" android:layout_width="match_parent" android:layout_height="wrap_content" - android:layout_marginTop="0dp" android:orientation="vertical" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" - app:layout_goneMarginTop="@dimen/title_top_margin" - app:layout_constraintTop_toBottomOf="@id/textView"> + app:layout_constraintTop_toBottomOf="@id/textView" + app:layout_goneMarginTop="@dimen/title_top_margin"> <com.github.mikephil.charting.charts.PieChart android:id="@+id/chart1" android:layout_width="match_parent" android:layout_height="match_parent" - /> </RelativeLayout> diff --git a/app/src/main/res/layout/fragment_home.xml b/app/src/main/res/layout/fragment_home.xml deleted file mode 100644 index 4f7bcc61551a3497aa93cad4760226bbe92db78e..0000000000000000000000000000000000000000 --- a/app/src/main/res/layout/fragment_home.xml +++ /dev/null @@ -1,54 +0,0 @@ -<?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:background="@color/md_theme_onPrimary" - tools:context=".view.home.HomeFragment"> - - <TextView - android:id="@+id/text_home" - android:layout_width="match_parent" - android:layout_height="wrap_content" - android:layout_marginStart="8dp" - android:layout_marginTop="8dp" - android:layout_marginEnd="8dp" - android:textAlignment="center" - style="@style/TextAppearance.HeadlineLarge" - android:text="@string/app_name" - android:textColor="@color/black" - app:layout_constraintBottom_toBottomOf="parent" - app:layout_constraintEnd_toEndOf="parent" - app:layout_constraintStart_toStartOf="parent" - app:layout_constraintTop_toTopOf="parent" /> - - <TextView - android:id="@+id/text_location" - android:layout_width="match_parent" - android:layout_height="wrap_content" - android:text="@{viewModel.location}" - app:layout_constraintTop_toBottomOf="@id/text_home" - app:layout_constraintStart_toStartOf="parent" - app:layout_constraintEnd_toEndOf="parent" - /> - - <Button - android:id="@+id/button_add_transaction" - android:layout_width="wrap_content" - android:layout_height="wrap_content" - android:text="Add Transaction" - app:layout_constraintEnd_toEndOf="parent" - app:layout_constraintStart_toStartOf="parent" - app:layout_constraintTop_toBottomOf="@+id/text_location" /> - - <Button - android:id="@+id/button_delete_all_transaction" - android:layout_width="wrap_content" - android:layout_height="wrap_content" - android:text="Delete All Transaction" - app:layout_constraintTop_toBottomOf="@+id/button_add_transaction" - app:layout_constraintStart_toStartOf="parent" - app:layout_constraintEnd_toEndOf="parent" - /> -</androidx.constraintlayout.widget.ConstraintLayout> \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_settings.xml b/app/src/main/res/layout/fragment_settings.xml index bb5d17bd4e80a410f281c0667110b824ea89941b..9c3ad01122706a5c29044565dc17c9725213d12f 100644 --- a/app/src/main/res/layout/fragment_settings.xml +++ b/app/src/main/res/layout/fragment_settings.xml @@ -51,7 +51,7 @@ android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginStart="@dimen/title_start_margin" - android:textColor="@color/md_theme_primary" + android:textColor="@color/textColor" app:layout_constraintStart_toEndOf="@id/avatar" app:layout_constraintTop_toTopOf="parent" app:layout_constraintBottom_toBottomOf="parent" @@ -65,7 +65,7 @@ android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginTop="24dp" - android:background="@drawable/bg_settings_card_excel" + android:background="@drawable/bg_settings_card_user" android:padding="10dp" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" @@ -82,7 +82,7 @@ app:layout_constraintStart_toStartOf="parent" app:layout_constraintEnd_toStartOf="@id/tv_title_settings_card_excel" app:layout_constraintTop_toTopOf="parent" - app:tint="@color/md_theme_primary" /> + app:tint="@color/textColor" /> <TextView android:id="@+id/tv_title_settings_card_excel" @@ -90,7 +90,7 @@ android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@string/save_transaction" - android:textColor="@color/md_theme_primary" + android:textColor="@color/textColor" android:textStyle="bold" android:layout_marginStart="@dimen/title_start_margin" app:layout_constraintStart_toEndOf="@id/icon_settings_card_excel" @@ -102,7 +102,7 @@ android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@string/file_type" - android:textColor="@color/md_theme_primary" + android:textColor="@color/textColor" android:layout_marginStart="@dimen/title_start_margin" app:layout_constraintStart_toEndOf="@id/icon_settings_card_excel" app:layout_constraintTop_toBottomOf="@id/tv_title_settings_card_excel" @@ -125,7 +125,7 @@ android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginTop="16dp" - android:background="@drawable/bg_settings_card_email" + android:background="@drawable/bg_settings_card_user" android:padding="10dp" app:layout_constraintTop_toBottomOf="@+id/constraintLayout3" tools:layout_editor_absoluteX="-16dp"> @@ -142,7 +142,7 @@ app:layout_constraintStart_toStartOf="parent" app:layout_constraintEnd_toStartOf="@id/tv_title_settings_card_email" app:layout_constraintTop_toTopOf="parent" - app:tint="@color/md_theme_primary" /> + app:tint="@color/textColor" /> <TextView android:id="@+id/tv_title_settings_card_email" @@ -150,7 +150,7 @@ android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@string/kirim_daftar_transaksi" - android:textColor="@color/md_theme_primary" + android:textColor="@color/textColor" android:textStyle="bold" android:layout_marginStart="@dimen/title_start_margin" app:layout_constraintStart_toEndOf="@id/icon_email" @@ -164,7 +164,7 @@ android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@string/gmail" - android:textColor="@color/md_theme_primary" + android:textColor="@color/textColor" android:layout_marginStart="@dimen/title_start_margin" app:layout_constraintStart_toEndOf="@id/icon_email" app:layout_constraintTop_toBottomOf="@id/tv_title_settings_card_email" @@ -239,7 +239,7 @@ android:layout_height="wrap_content" android:layout_marginStart="@dimen/title_start_margin" android:text="@string/random_transaksi" - android:textColor="@color/md_theme_primary" + android:textColor="@color/textColor" android:textStyle="bold" app:layout_constraintStart_toEndOf="@+id/icon_random_transaction" app:layout_constraintTop_toTopOf="parent" /> @@ -253,10 +253,10 @@ app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toTopOf="parent" app:srcCompat="@drawable/ic_transaction" - app:tint="@color/md_theme_primary" /> + app:tint="@color/textColor" /> <Button - android:id="@+id/button" + android:id="@+id/buttonRandom" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginTop="@dimen/title_top_margin" diff --git a/app/src/main/res/navigation/mobile_navigation.xml b/app/src/main/res/navigation/mobile_navigation.xml index f4c1c834ed5a714f7a2977447b41e029a31149bc..d1f85e9422bc5710f1accea6ba584031704251c0 100644 --- a/app/src/main/res/navigation/mobile_navigation.xml +++ b/app/src/main/res/navigation/mobile_navigation.xml @@ -36,24 +36,29 @@ android:id = "@+id/navigation_settings" android:name= "com.example.bandung_bondowoso.view.setting.SettingFragment" android:label="Settings" - tools:layout="@layout/fragment_settings" /> + tools:layout="@layout/fragment_settings" > + <action + android:id="@+id/action_navigation_settings_to_newTransactionFragment" + app:destination="@id/newTransactionFragment" /> + </fragment> <fragment android:id="@+id/fragment_login" android:name="com.example.bandung_bondowoso.view.login.LoginFragment" android:label="fragment_login" tools:layout="@layout/fragment_login" > - <action - android:id="@+id/action_loginFragment_to_navigation_transaction" - app:destination="@id/navigation_transaction" - app:popUpTo="@id/mobile_navigation" - app:popUpToInclusive="true" /> <action android:id="@+id/action_fragment_login_to_noNetworkFragment" app:destination="@id/noNetworkFragment" app:popUpTo="@id/mobile_navigation" app:popUpToInclusive="true" /> + <action + android:id="@+id/action_fragment_login_to_navigation_transaction" + app:destination="@id/navigation_transaction" + app:popUpTo="@id/mobile_navigation" + app:popUpToInclusive="true" + /> </fragment> <fragment android:id="@+id/newTransactionFragment" diff --git a/app/src/main/res/values-night/colors.xml b/app/src/main/res/values-night/colors.xml index 11eeb49d770da6630a3fd8f99833fc3b89631cb8..993be82593165eab34c4d40d0f784b060ac47f0b 100644 --- a/app/src/main/res/values-night/colors.xml +++ b/app/src/main/res/values-night/colors.xml @@ -1,12 +1,12 @@ <?xml version="1.0" encoding="utf-8"?> <resources> - <color name="md_theme_primary">#DFE0FF</color> + <color name="md_theme_primary">#2E8CFF</color> <color name="md_theme_onPrimary">#242B61</color> - <color name="md_theme_primaryContainer">#3B4279</color> + <color name="md_theme_primaryContainer">#0819B6</color> <color name="md_theme_onPrimaryContainer">#DFE0FF</color> <color name="md_theme_red">#BE0707</color> <color name="md_theme_green">#44C34A</color> - <color name="md_theme_peach">#3B4279</color> + <color name="md_theme_peach">#F12BFF</color> <color name="md_theme_light_green">#3B4279</color> <color name="md_theme_blue">#ADC7FF</color> <color name="md_theme_secondary">#BCC3FF</color> @@ -23,7 +23,7 @@ <color name="md_theme_onErrorContainer">#FFDAD6</color> <color name="md_theme_background">#131318</color> <color name="md_theme_onBackground">#E4E1E9</color> - <color name="md_theme_surface">#131318</color> + <color name="md_theme_surface">#0D1931</color> <color name="md_theme_onSurface">#E4E1E9</color> <color name="md_theme_surfaceVariant">#46464F</color> <color name="md_theme_onSurfaceVariant">#C7C5D0</color> @@ -146,4 +146,5 @@ <color name="md_theme_surfaceContainer_highContrast">#1F1F25</color> <color name="md_theme_surfaceContainerHigh_highContrast">#29292F</color> <color name="md_theme_surfaceContainerHighest_highContrast">#34343A</color> + <color name="textColor">#ffffff</color> </resources> \ No newline at end of file diff --git a/app/src/main/res/values/colors.xml b/app/src/main/res/values/colors.xml index 3753890d8dc3b6770bfb3c94275ec9bb9b4a9f03..14cfa7e8d4d9b1d1306de6b0b3f8195fef03b594 100644 --- a/app/src/main/res/values/colors.xml +++ b/app/src/main/res/values/colors.xml @@ -6,7 +6,7 @@ <color name="md_theme_onPrimary">#FFFFFF</color> <color name="md_theme_red">#BE0707</color> <color name="md_theme_green">#44C34A</color> - <color name="md_theme_peach">#FFDAD6</color> + <color name="md_theme_peach">#FF639A</color> <color name="md_theme_light_green">#C7ECC1</color> <color name="md_theme_blue">#ADC7FF</color> <color name="md_theme_primaryContainer">#DFE0FF</color> @@ -150,4 +150,5 @@ <color name="md_theme_surfaceContainerHighest_highContrast">#E4E1E9</color> <color name="black">#000000</color> <color name="white">#FFFFFF</color> + <color name="textColor">#000E8E</color> </resources> \ No newline at end of file