diff --git a/.idea/deploymentTargetDropDown.xml b/.idea/deploymentTargetDropDown.xml deleted file mode 100644 index 1663a0c..0000000 --- a/.idea/deploymentTargetDropDown.xml +++ /dev/null @@ -1,17 +0,0 @@ - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/.idea/misc.xml b/.idea/misc.xml index 00c888d..8cc1080 100644 --- a/.idea/misc.xml +++ b/.idea/misc.xml @@ -3,34 +3,71 @@ diff --git a/app/build.gradle b/app/build.gradle index 1a7e79c..755b662 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -5,6 +5,7 @@ plugins { id 'androidx.navigation.safeargs' id 'kotlin-parcelize' + } android { @@ -74,9 +75,6 @@ dependencies { //bar chart implementation 'com.github.PhilJay:MPAndroidChart:v3.1.0' - //lotti - implementation "com.airbnb.android:lottie:3.7.1" - //retrofit implementation 'com.squareup.retrofit2:retrofit:2.9.0' diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 34e6a93..45d31fe 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -2,20 +2,22 @@ - - + + + + diff --git a/app/src/main/java/com/serdar/budges/MainActivity.kt b/app/src/main/java/com/serdar/budges/MainActivity.kt index 29ea52e..0b7030a 100644 --- a/app/src/main/java/com/serdar/budges/MainActivity.kt +++ b/app/src/main/java/com/serdar/budges/MainActivity.kt @@ -1,12 +1,7 @@ package com.serdar.budges import android.os.Bundle -import com.google.android.material.bottomnavigation.BottomNavigationView import androidx.appcompat.app.AppCompatActivity -import androidx.navigation.findNavController -import androidx.navigation.ui.AppBarConfiguration -import androidx.navigation.ui.setupActionBarWithNavController -import androidx.navigation.ui.setupWithNavController import com.serdar.budges.databinding.ActivityMainBinding class MainActivity : AppCompatActivity() { diff --git a/app/src/main/java/com/serdar/budges/adapter/BudgesAdapter.kt b/app/src/main/java/com/serdar/budges/adapter/BudgesAdapter.kt index fd40324..44f8c7d 100644 --- a/app/src/main/java/com/serdar/budges/adapter/BudgesAdapter.kt +++ b/app/src/main/java/com/serdar/budges/adapter/BudgesAdapter.kt @@ -5,6 +5,7 @@ import android.view.View import android.view.ViewGroup import android.widget.ImageView import android.widget.TextView +import androidx.cardview.widget.CardView import androidx.core.content.ContextCompat import androidx.navigation.findNavController import androidx.recyclerview.widget.RecyclerView @@ -21,11 +22,12 @@ class BudgesAdapter : val transactions = view.findViewById(R.id.transaction) val amount = view.findViewById(R.id.amount) val amountView = view.findViewById(R.id.amountView) + val card = view.findViewById(R.id.delete) fun bind(transaction: Transaction) { - transactions.setText(transaction.transaction.toString()) - amount.setText(transaction.amount.toString()) - desc.setText(transaction.description.toString()) + transactions.text = transaction.transaction.toString() + amount.text = transaction.amount.toString() + desc.text = transaction.description.toString() } } @@ -34,33 +36,43 @@ class BudgesAdapter : val view = LayoutInflater.from(parent.context).inflate(R.layout.transaction_item, parent, false) + return TransactionHolder(view) } override fun onBindViewHolder(holder: TransactionHolder, position: Int) { val transaction = transactionList[position] holder.bind(transaction) - holder.itemView.setOnClickListener { - val action = HomeFragmentDirections.actionNavigationHomeToUpdateFragment(transaction) - holder.itemView.findNavController().navigate(action) + + + holder.card.setOnClickListener { + val action = HomeFragmentDirections.actionNavigationHomeToBalanceDialog(transaction) + holder.card.findNavController().navigate(action) + + } + + val context = holder.amount.context - if (transaction.amount >= 0) { + if (transaction.incomeExpenseType == "INCOME") { holder.amount.text = "+$%.2f".format(transaction.amount) holder.amount.setTextColor(ContextCompat.getColor(context, R.color.green)) - holder.amountView.setImageResource(R.drawable.profits) + holder.amountView.setImageResource(R.drawable.incomeline) + holder.desc.setTextColor(ContextCompat.getColor(context, R.color.green)) } else { holder.amount.text = "-$%.2f".format(Math.abs(transaction.amount)) holder.amount.setTextColor(ContextCompat.getColor(context, R.color.red)) - holder.amountView.setImageResource(R.drawable.expansion) + holder.amountView.setImageResource(R.drawable.expensesline) + holder.desc.setTextColor(ContextCompat.getColor(context, R.color.red)) } holder.transactions.text = transaction.transaction + } diff --git a/app/src/main/java/com/serdar/budges/adapter/CryptoAdapter.kt b/app/src/main/java/com/serdar/budges/adapter/CryptoAdapter.kt index b525333..40107a4 100644 --- a/app/src/main/java/com/serdar/budges/adapter/CryptoAdapter.kt +++ b/app/src/main/java/com/serdar/budges/adapter/CryptoAdapter.kt @@ -1,54 +1,66 @@ package com.serdar.budges.adapter + +import android.graphics.Color import android.view.LayoutInflater import android.view.View import android.view.ViewGroup import android.widget.ImageView import android.widget.TextView +import androidx.cardview.widget.CardView import androidx.core.content.ContextCompat import androidx.recyclerview.widget.RecyclerView import com.serdar.budges.R import com.serdar.budges.data.crypto.Data import java.math.RoundingMode -class CryptoAdapter:RecyclerView.Adapter() { +class CryptoAdapter : RecyclerView.Adapter() { private var myList = emptyList() - inner class CryptoViewHolder(itemview: View):RecyclerView.ViewHolder(itemview){ + inner class CryptoViewHolder(itemview: View) : RecyclerView.ViewHolder(itemview) { val symbol = itemview.findViewById(R.id.symbol) val price = itemview.findViewById(R.id.price) val macap = itemview.findViewById(R.id.maCap) val name = itemview.findViewById(R.id.currency) val where = itemview.findViewById(R.id.where) + val graph = itemview.findViewById(R.id.graphic) } override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): CryptoViewHolder { - return CryptoViewHolder(LayoutInflater.from(parent.context).inflate(R.layout.crypto_layout,parent,false)) + return CryptoViewHolder( + LayoutInflater.from(parent.context).inflate(R.layout.crypto_layout, parent, false) + ) } override fun onBindViewHolder(holder: CryptoViewHolder, position: Int) { - holder.symbol.text=myList[position].symbol.toString() - holder.name.text=myList[position].name.toString() + holder.symbol.text = myList[position].symbol.toString() + holder.name.text = myList[position].name.toString() val context = holder.macap.context - holder.price.text=myList[position].priceUsd.toString() - holder.price.text=myList[position].priceUsd.toBigDecimal().setScale(1, RoundingMode.UP).toString() - holder.macap.text=myList[position].changePercent24Hr.toBigDecimal().setScale(1,RoundingMode.UP).toString() - if (myList[position].changePercent24Hr> 0.toString()){ + holder.price.text = myList[position].priceUsd.toString() + holder.price.text = + myList[position].priceUsd.toBigDecimal().setScale(1, RoundingMode.UP).toString() + holder.macap.text = + myList[position].changePercent24Hr.toBigDecimal().setScale(1, RoundingMode.UP).toString() + if (myList[position].changePercent24Hr > 0.toString()) { holder.macap.setTextColor(ContextCompat.getColor(context, R.color.green)) holder.where.setImageResource(R.drawable.up) - }else{ + holder.graph.setImageResource(R.drawable.ups) + + } else { holder.macap.setTextColor(ContextCompat.getColor(context, R.color.red)) holder.where.setImageResource(R.drawable.down) + holder.graph.setImageResource(R.drawable.downs) } } override fun getItemCount(): Int { return myList.size } - fun setData(newList: List){ - myList= newList + + fun setData(newList: List) { + myList = newList notifyDataSetChanged() } diff --git a/app/src/main/java/com/serdar/budges/adapter/ExpenseAdapter.kt b/app/src/main/java/com/serdar/budges/adapter/ExpenseAdapter.kt new file mode 100644 index 0000000..d32427d --- /dev/null +++ b/app/src/main/java/com/serdar/budges/adapter/ExpenseAdapter.kt @@ -0,0 +1,59 @@ +package com.serdar.budges.adapter + +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import android.widget.ImageView +import android.widget.TextView +import androidx.core.content.ContextCompat +import androidx.recyclerview.widget.RecyclerView +import com.serdar.budges.R +import com.serdar.budges.data.transaction.Transaction + +class ExpenseAdapter : RecyclerView.Adapter() { + private var transactionList = emptyList() + + class TransactionHolder(view: View) : RecyclerView.ViewHolder(view) { + val desc = view.findViewById(R.id.descExpanse) + val transactions = view.findViewById(R.id.transactionExpanse) + val amount = view.findViewById(R.id.amountExpanse) + val amountView = view.findViewById(R.id.amountViewExpanse) + + fun bind(transaction: Transaction) { + transactions.text = transaction.transaction.toString() + amount.text = transaction.amount.toString() + desc.text = transaction.description.toString() + + } + + } + + + override fun onCreateViewHolder( + parent: ViewGroup, + viewType: Int + ): ExpenseAdapter.TransactionHolder { + val view = + LayoutInflater.from(parent.context).inflate(R.layout.expanse_item, parent, false) + + return ExpenseAdapter.TransactionHolder(view) + } + + override fun onBindViewHolder(holder: ExpenseAdapter.TransactionHolder, position: Int) { + val transaction = transactionList[position] + holder.bind(transaction) + val context = holder.amount.context + holder.amount.text = "-$%.2f".format(transaction.amount) + holder.amount.setTextColor(ContextCompat.getColor(context, R.color.red)) + holder.amountView.setImageResource(R.drawable.expensesline) + } + + override fun getItemCount(): Int { + return transactionList.size + } + + fun setExpanse(transactionList: List) { + this.transactionList = transactionList + notifyDataSetChanged() + } +} \ No newline at end of file diff --git a/app/src/main/java/com/serdar/budges/adapter/HomeCryptoAdapter.kt b/app/src/main/java/com/serdar/budges/adapter/HomeCryptoAdapter.kt index 4b4b6ec..ca16371 100644 --- a/app/src/main/java/com/serdar/budges/adapter/HomeCryptoAdapter.kt +++ b/app/src/main/java/com/serdar/budges/adapter/HomeCryptoAdapter.kt @@ -32,6 +32,7 @@ class HomeCryptoAdapter : RecyclerView.Adapter holder.price.text = dataList[position].priceUsd.toString() holder.price.text = dataList[position].priceUsd.toBigDecimal().setScale(1, RoundingMode.UP).toString() + holder.price.text = "$%.2f".format(dataList[position].priceUsd.toDouble()) when (dataList[position].symbol) { diff --git a/app/src/main/java/com/serdar/budges/adapter/IncomeAdapter.kt b/app/src/main/java/com/serdar/budges/adapter/IncomeAdapter.kt new file mode 100644 index 0000000..0ad639b --- /dev/null +++ b/app/src/main/java/com/serdar/budges/adapter/IncomeAdapter.kt @@ -0,0 +1,60 @@ +package com.serdar.budges.adapter + +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import android.widget.ImageView +import android.widget.TextView +import androidx.core.content.ContextCompat +import androidx.recyclerview.widget.RecyclerView +import com.serdar.budges.R +import com.serdar.budges.data.transaction.Transaction + +class IncomeAdapter : RecyclerView.Adapter() { + private var transactionList = emptyList() + + class TransactionHolder(view: View) : RecyclerView.ViewHolder(view) { + val desc = view.findViewById(R.id.descIncome) + val transactions = view.findViewById(R.id.transactionIncome) + val amount = view.findViewById(R.id.amountIncome) + val amountView = view.findViewById(R.id.amountViewIncome) + + + fun bind(transaction: Transaction) { + transactions.text = transaction.transaction.toString() + amount.text = transaction.amount.toString() + desc.text = transaction.description.toString() + + } + + } + + + override fun onCreateViewHolder( + parent: ViewGroup, + viewType: Int + ): IncomeAdapter.TransactionHolder { + val view = + LayoutInflater.from(parent.context).inflate(R.layout.income_item, parent, false) + + return IncomeAdapter.TransactionHolder(view) + } + + override fun onBindViewHolder(holder: IncomeAdapter.TransactionHolder, position: Int) { + val transaction = transactionList[position] + holder.bind(transaction) + val context = holder.amount.context + holder.amount.text = "+$%.2f".format(Math.abs(transaction.amount)) + holder.amount.setTextColor(ContextCompat.getColor(context, R.color.green)) + holder.amountView.setImageResource(R.drawable.incomeline) + } + + override fun getItemCount(): Int { + return transactionList.size + } + + fun setIncome(transactionList: List) { + this.transactionList = transactionList + notifyDataSetChanged() + } +} \ No newline at end of file diff --git a/app/src/main/java/com/serdar/budges/adapter/OnBoardingAdapter.kt b/app/src/main/java/com/serdar/budges/adapter/OnBoardingAdapter.kt new file mode 100644 index 0000000..0d16a28 --- /dev/null +++ b/app/src/main/java/com/serdar/budges/adapter/OnBoardingAdapter.kt @@ -0,0 +1,26 @@ +package com.serdar.budges.adapter + +import androidx.fragment.app.Fragment +import androidx.fragment.app.FragmentManager +import androidx.lifecycle.Lifecycle +import androidx.viewpager2.adapter.FragmentStateAdapter + +class OnBoardingAdapter( + list: ArrayList, + fm: FragmentManager, + lifecycle: Lifecycle +) : FragmentStateAdapter(fm, lifecycle) { + + + private val fragmentList = list + + + override fun getItemCount(): Int { + + return fragmentList.size + } + + override fun createFragment(position: Int): Fragment { + return fragmentList[position] + } +} \ No newline at end of file diff --git a/app/src/main/java/com/serdar/budges/adapter/ViewPagerDash.kt b/app/src/main/java/com/serdar/budges/adapter/ViewPagerDash.kt new file mode 100644 index 0000000..caf99bc --- /dev/null +++ b/app/src/main/java/com/serdar/budges/adapter/ViewPagerDash.kt @@ -0,0 +1,30 @@ +package com.serdar.budges.adapter + +import androidx.fragment.app.Fragment +import androidx.fragment.app.FragmentManager +import androidx.lifecycle.Lifecycle +import androidx.viewpager2.adapter.FragmentStateAdapter +import com.serdar.budges.ui.fragments.dashboard.ExpenseDashFragment +import com.serdar.budges.ui.fragments.dashboard.IncomeDashFragment + +class ViewPagerDash(fragmentManager: FragmentManager, lifecycle: Lifecycle) : + FragmentStateAdapter(fragmentManager, lifecycle) { + override fun getItemCount(): Int { + return 2 + } + + override fun createFragment(position: Int): Fragment { + + return when (position) { + 0 -> { + IncomeDashFragment() + } + 1 -> { + ExpenseDashFragment() + } + else -> { + Fragment() + } + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/serdar/budges/data/transaction/Transaction.kt b/app/src/main/java/com/serdar/budges/data/transaction/Transaction.kt index 88ff935..a29daa3 100644 --- a/app/src/main/java/com/serdar/budges/data/transaction/Transaction.kt +++ b/app/src/main/java/com/serdar/budges/data/transaction/Transaction.kt @@ -7,7 +7,6 @@ import androidx.room.PrimaryKey import kotlinx.android.parcel.Parcelize - @Parcelize @Entity(tableName = "transactions") data class Transaction( @@ -17,5 +16,6 @@ data class Transaction( @ColumnInfo(name = "transaction") val transaction: String, @ColumnInfo(name = "amaount") val amount: Double = 0.0, @ColumnInfo(name = "desciption") val description: String, - ) : Parcelable + @ColumnInfo(name = "incomeExpenseType") val incomeExpenseType: String +) : Parcelable diff --git a/app/src/main/java/com/serdar/budges/di/repository/CryptoRepository.kt b/app/src/main/java/com/serdar/budges/di/repository/CryptoRepository.kt index 8e70216..b0a9f6a 100644 --- a/app/src/main/java/com/serdar/budges/di/repository/CryptoRepository.kt +++ b/app/src/main/java/com/serdar/budges/di/repository/CryptoRepository.kt @@ -1,12 +1,14 @@ package com.serdar.budges.di.repository -import com.serdar.budges.data.crypto.CryptoModel import com.serdar.budges.data.crypto.Data -import com.serdar.budges.service.api.RetrofitInctance -import retrofit2.Response +import com.serdar.budges.service.api.RetrofitInstance class CryptoRepository { - suspend fun getPost(): List{ - return RetrofitInctance.api.getData().data + suspend fun getPost(): List { + return try { + RetrofitInstance.api.getData().data + } catch (exception: Exception) { + listOf() + } } -} \ No newline at end of file +} diff --git a/app/src/main/java/com/serdar/budges/di/repository/TransactionRepository.kt b/app/src/main/java/com/serdar/budges/di/repository/TransactionRepository.kt index bd7a86a..3fa7fe5 100644 --- a/app/src/main/java/com/serdar/budges/di/repository/TransactionRepository.kt +++ b/app/src/main/java/com/serdar/budges/di/repository/TransactionRepository.kt @@ -4,21 +4,22 @@ import androidx.lifecycle.LiveData import com.serdar.budges.data.transaction.Transaction import com.serdar.budges.service.transaction.TransactionDao -class TransactionRepository (private val transactionDao: TransactionDao) { +class TransactionRepository(private val transactionDao: TransactionDao) { - val readAllDataTransaction : LiveData> = transactionDao.readAllData() + val readAllDataTransaction: LiveData> = transactionDao.readAllData() - suspend fun addTransaction(transaction: Transaction){ + suspend fun addTransaction(transaction: Transaction) { transactionDao.addTransaction(transaction) } - suspend fun updateTransaction(transaction: Transaction){ + + suspend fun updateTransaction(transaction: Transaction) { transactionDao.updateTransaction(transaction) } - suspend fun deleteTransaction(transaction: Transaction){ + + suspend fun deleteTransaction(transaction: Transaction) { transactionDao.deleteTransaction(transaction) } - } \ No newline at end of file diff --git a/app/src/main/java/com/serdar/budges/infrastructure/NotificationUtils.kt b/app/src/main/java/com/serdar/budges/infrastructure/NotificationUtils.kt new file mode 100644 index 0000000..d88a00b --- /dev/null +++ b/app/src/main/java/com/serdar/budges/infrastructure/NotificationUtils.kt @@ -0,0 +1,48 @@ +package com.serdar.budges.infrastructure + +import android.app.NotificationChannel +import android.app.NotificationManager +import android.content.Context +import android.content.Context.NOTIFICATION_SERVICE +import android.os.Build +import androidx.core.app.NotificationCompat +import com.serdar.budges.R +import com.serdar.budges.util.Constants.Companion.CHANNEL_ID +import com.serdar.budges.util.Constants.Companion.CHANNEL_NAME + +object NotificationUtils { + + fun budgesNotification(context: Context, title: String, description: String) { + val notificationManager = + context.getSystemService(NOTIFICATION_SERVICE) as NotificationManager + + createBudgesNotificationChannel(notificationManager) + + val builder = createBudgesNotificationCompat(context, title, description) + + notificationManager.notify(1, builder.build()) + } + + private fun createBudgesNotificationChannel(notificationManager: NotificationManager) { + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { + val channel = NotificationChannel( + CHANNEL_ID, + CHANNEL_NAME, + NotificationManager.IMPORTANCE_DEFAULT + ) + notificationManager.createNotificationChannel(channel) + } + } + + private fun createBudgesNotificationCompat( + context: Context, + title: String, + description: String + ): NotificationCompat.Builder { + return NotificationCompat.Builder(context, CHANNEL_ID) + .setContentTitle(title) + .setContentText(description) + .setSmallIcon(R.drawable.notification) + .setPriority(NotificationCompat.PRIORITY_HIGH) + } +} diff --git a/app/src/main/java/com/serdar/budges/model/ApiResponse.kt b/app/src/main/java/com/serdar/budges/model/ApiResponse.kt index 7c62106..ca7c589 100644 --- a/app/src/main/java/com/serdar/budges/model/ApiResponse.kt +++ b/app/src/main/java/com/serdar/budges/model/ApiResponse.kt @@ -2,6 +2,6 @@ package com.serdar.budges.model import com.serdar.budges.data.crypto.Data -data class ApiResponse ( - val data : List - ) \ No newline at end of file +data class ApiResponse( + val data: List +) \ No newline at end of file diff --git a/app/src/main/java/com/serdar/budges/service/api/RetrofitInctance.kt b/app/src/main/java/com/serdar/budges/service/api/RetrofitInstance.kt similarity index 90% rename from app/src/main/java/com/serdar/budges/service/api/RetrofitInctance.kt rename to app/src/main/java/com/serdar/budges/service/api/RetrofitInstance.kt index 6561e45..a517456 100644 --- a/app/src/main/java/com/serdar/budges/service/api/RetrofitInctance.kt +++ b/app/src/main/java/com/serdar/budges/service/api/RetrofitInstance.kt @@ -3,9 +3,8 @@ package com.serdar.budges.service.api import com.serdar.budges.util.Constants.Companion.BASE_URL import retrofit2.Retrofit import retrofit2.converter.gson.GsonConverterFactory -import retrofit2.create -object RetrofitInctance { +object RetrofitInstance { private val retrofit by lazy { Retrofit.Builder() diff --git a/app/src/main/java/com/serdar/budges/service/transaction/TransactionDao.kt b/app/src/main/java/com/serdar/budges/service/transaction/TransactionDao.kt index 92bed76..5479e76 100644 --- a/app/src/main/java/com/serdar/budges/service/transaction/TransactionDao.kt +++ b/app/src/main/java/com/serdar/budges/service/transaction/TransactionDao.kt @@ -11,7 +11,7 @@ interface TransactionDao { fun readAllData(): LiveData> @Insert(onConflict = OnConflictStrategy.IGNORE) - fun addTransaction(transaction: Transaction):Long + fun addTransaction(transaction: Transaction): Long @Update fun updateTransaction(transaction: Transaction) @@ -22,6 +22,11 @@ interface TransactionDao { @Query("DELETE FROM transactions ") fun deleteAllTransaction() + @Query("SELECT * FROM transactions WHERE incomeExpenseType = 'EXPENSE' ") + fun getExpenseList(): LiveData> + + @Query("SELECT * FROM transactions WHERE incomeExpenseType = 'INCOME' ") + fun getIncomeList(): LiveData> } diff --git a/app/src/main/java/com/serdar/budges/service/transaction/TransactionDatabase.kt b/app/src/main/java/com/serdar/budges/service/transaction/TransactionDatabase.kt index 6a7cef4..95e47d6 100644 --- a/app/src/main/java/com/serdar/budges/service/transaction/TransactionDatabase.kt +++ b/app/src/main/java/com/serdar/budges/service/transaction/TransactionDatabase.kt @@ -6,27 +6,31 @@ import androidx.room.Room import androidx.room.RoomDatabase import com.serdar.budges.data.transaction.Transaction -@Database(entities = [Transaction::class], version =2, exportSchema = false) +@Database(entities = [Transaction::class], version = 1, exportSchema = false) - abstract class TransactionDatabase: RoomDatabase() { +abstract class TransactionDatabase : RoomDatabase() { - abstract fun transactionDao(): TransactionDao + abstract fun transactionDao(): TransactionDao - companion object{ - @Volatile - private var INSTANCE: TransactionDatabase? = null + companion object { + @Volatile + private var INSTANCE: TransactionDatabase? = null - fun getDatabase(context: Context): TransactionDatabase { - val tempInstance= INSTANCE - if (tempInstance != null){ - return tempInstance - } - synchronized(this){ - val instance = Room.databaseBuilder(context, TransactionDatabase::class.java,"transaction_database").fallbackToDestructiveMigration().build() - INSTANCE =instance - return instance - } + fun getDatabase(context: Context): TransactionDatabase { + val tempInstance = INSTANCE + if (tempInstance != null) { + return tempInstance + } + synchronized(this) { + val instance = Room.databaseBuilder( + context, + TransactionDatabase::class.java, + "transaction_database" + ).fallbackToDestructiveMigration().build() + INSTANCE = instance + return instance } - } + } +} diff --git a/app/src/main/java/com/serdar/budges/ui/bottomsheet/BottomSheetFragment.kt b/app/src/main/java/com/serdar/budges/ui/bottomsheet/BottomSheetFragment.kt index 2498b42..5c1ff5b 100644 --- a/app/src/main/java/com/serdar/budges/ui/bottomsheet/BottomSheetFragment.kt +++ b/app/src/main/java/com/serdar/budges/ui/bottomsheet/BottomSheetFragment.kt @@ -6,18 +6,22 @@ import android.os.Bundle import android.view.LayoutInflater import android.view.View import android.view.ViewGroup +import android.widget.ArrayAdapter +import android.widget.Toast import androidx.core.widget.addTextChangedListener import androidx.navigation.fragment.findNavController import com.google.android.material.bottomsheet.BottomSheetDialog import com.google.android.material.bottomsheet.BottomSheetDialogFragment import com.serdar.budges.R -import com.serdar.budges.databinding.FragmentBottomSheetBinding import com.serdar.budges.data.transaction.Transaction -import com.serdar.budges.model.TransactionViewModel +import com.serdar.budges.databinding.FragmentBottomSheetBinding +import com.serdar.budges.ui.viewmodel.TransactionViewModel class BottomSheetFragment : BottomSheetDialogFragment() { private lateinit var binding: FragmentBottomSheetBinding + private val comes = arrayListOf() + private var comess = "" private val transactionViewModel by lazy { TransactionViewModel(requireActivity().application) } override fun onCreateView( @@ -31,13 +35,24 @@ class BottomSheetFragment : BottomSheetDialogFragment() { override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) + val facultiesAdapter = + ArrayAdapter(requireContext(), R.layout.dropdown, comes) + comes.add("INCOME") + comes.add("EXPENSE") + + binding.txtDrop.setOnItemClickListener { _, _, position, _ -> + comess = comes[position] + } + binding.txtDrop.setAdapter(facultiesAdapter) + + binding.transactionName.addTextChangedListener { - if (it!!.count() > 0) + if (it!!.isNotEmpty()) binding.productName.error = null } binding.transactionAmounts.addTextChangedListener { - if (it!!.count() > 0) + if (it!!.isNotEmpty()) binding.transactionAmounts.error = null } @@ -47,6 +62,7 @@ class BottomSheetFragment : BottomSheetDialogFragment() { } } + override fun onCreateDialog(savedInstanceState: Bundle?): Dialog { return BottomSheetDialog( requireContext(), @@ -60,15 +76,22 @@ class BottomSheetFragment : BottomSheetDialogFragment() { val description = binding.transactionDesc.text.toString() val amount = binding.transactionAmounts.text.toString().toDoubleOrNull() + + if (label.isEmpty()) binding.productName.error = "Please enter a valid label" else if (amount == null) binding.transactionAmount.error = "Please enter a valid amount" + else if (comes.isEmpty()) + Toast.makeText(requireContext(), "Please Chose Transaction Type", Toast.LENGTH_SHORT) + .show() else { - val transaction = Transaction(0, label, amount, description) + val transaction = Transaction(0, label, amount, description, comess) transactionViewModel.addTransaction(transaction) findNavController().navigate(R.id.action_bottomSheetFragment_to_navigation_home) + } + } } diff --git a/app/src/main/java/com/serdar/budges/ui/components/BalanceDialog.kt b/app/src/main/java/com/serdar/budges/ui/components/BalanceDialog.kt index 3ec1e99..d6cf4c5 100644 --- a/app/src/main/java/com/serdar/budges/ui/components/BalanceDialog.kt +++ b/app/src/main/java/com/serdar/budges/ui/components/BalanceDialog.kt @@ -5,22 +5,84 @@ import android.app.Dialog import android.graphics.Color import android.graphics.drawable.ColorDrawable import android.os.Bundle +import android.text.TextUtils +import android.view.View +import android.widget.Toast import androidx.fragment.app.DialogFragment +import androidx.navigation.fragment.findNavController +import androidx.navigation.fragment.navArgs +import com.serdar.budges.R +import com.serdar.budges.data.transaction.Transaction import com.serdar.budges.databinding.DialogBalanceBinding +import com.serdar.budges.ui.viewmodel.TransactionViewModel -class BalanceDialog( - -):DialogFragment() { - private lateinit var binding:DialogBalanceBinding +class BalanceDialog : DialogFragment() { + private lateinit var binding: DialogBalanceBinding + private val transactionViewModel by lazy { TransactionViewModel(requireActivity().application) } + private val args by navArgs() override fun onCreateDialog(savedInstanceState: Bundle?): Dialog { - binding=DialogBalanceBinding.inflate(layoutInflater) + binding = DialogBalanceBinding.inflate(layoutInflater) - val builder =AlertDialog.Builder(requireActivity()) + val builder = AlertDialog.Builder(requireActivity()) builder.setView(binding.root) - - val dialog=builder.create() + binding.transactionName.setText(args.currentItem.transaction) + binding.transactionAmounts.setText(args.currentItem.amount.toString()) + binding.transactionDesc.setText(args.currentItem.description) + binding.backButton.setOnClickListener { + findNavController().navigate(R.id.action_balanceDialog_to_navigation_home) + } + binding.updateButton.setOnClickListener { + updateItem() + } + binding.deleteData.setOnClickListener { + deleteTransactionData() + } + val dialog = builder.create() dialog.window!!.setBackgroundDrawable(ColorDrawable(Color.TRANSPARENT)) + + + return dialog } + + + private fun deleteTransactionData() { + + transactionViewModel.deleteTransaction(args.currentItem) + findNavController().navigate(R.id.action_balanceDialog_to_navigation_home) + + } + + private fun updateItem() { + val transactionName = binding.transactionName.text.toString() + val transactionAmount = binding.transactionAmounts.text.toString() + val transactionDesc = binding.transactionDesc.text.toString() + + val updateTransaction = Transaction( + args.currentItem.id, + transactionName, + transactionAmount.toDouble(), + transactionDesc, + args.currentItem.incomeExpenseType + ) + transactionViewModel.updateTransaction(updateTransaction) + findNavController().navigate(R.id.action_balanceDialog_to_navigation_home) + + if (inputCheck(transactionName, transactionAmount, transactionDesc)) { + Toast.makeText(requireContext(), "Updated ", Toast.LENGTH_SHORT).show() + } + } + + private fun inputCheck( + transactionName: String, + transactionAmount: String, + transactionDesc: String + ): Boolean { + return !(TextUtils.isEmpty(transactionName) && TextUtils.isEmpty(transactionAmount) && TextUtils.isEmpty( + transactionDesc + )) + } + + } \ No newline at end of file diff --git a/app/src/main/java/com/serdar/budges/ui/currency/CurrencyFragment.kt b/app/src/main/java/com/serdar/budges/ui/currency/CurrencyFragment.kt index 66469ad..960d44d 100644 --- a/app/src/main/java/com/serdar/budges/ui/currency/CurrencyFragment.kt +++ b/app/src/main/java/com/serdar/budges/ui/currency/CurrencyFragment.kt @@ -4,6 +4,7 @@ import android.os.Bundle import android.view.LayoutInflater import android.view.View import android.view.ViewGroup +import android.widget.Toast import androidx.fragment.app.Fragment import androidx.lifecycle.Observer import androidx.lifecycle.ViewModelProvider @@ -11,8 +12,8 @@ import androidx.recyclerview.widget.LinearLayoutManager import com.serdar.budges.adapter.CryptoAdapter import com.serdar.budges.databinding.FragmentCurrencyBinding import com.serdar.budges.di.repository.CryptoRepository -import com.serdar.budges.model.CryptoViewModel -import com.serdar.budges.model.CryptoViewModelFactory +import com.serdar.budges.ui.viewmodel.CryptoViewModel +import com.serdar.budges.ui.viewmodel.CryptoViewModelFactory class CurrencyFragment : Fragment() { @@ -26,13 +27,18 @@ class CurrencyFragment : Fragment() { setupAdapter() val repository = CryptoRepository() val cryptoViewModelFactory = CryptoViewModelFactory(repository) + try { + viewModel = + ViewModelProvider(this, cryptoViewModelFactory).get(CryptoViewModel::class.java) + viewModel.getData() + viewModel.myResponse.observe(requireActivity(), Observer { + adapter.setData(it) + + }) + } catch (exception: Exception) { + Toast.makeText(requireContext(), "No Internet", Toast.LENGTH_SHORT).show() + } - viewModel = ViewModelProvider(this, cryptoViewModelFactory).get(CryptoViewModel::class.java) - viewModel.getData() - viewModel.myResponse.observe(requireActivity(), Observer { - adapter.setData(it) - - }) return binding.root } diff --git a/app/src/main/java/com/serdar/budges/ui/currency/CurrencyViewModel.kt b/app/src/main/java/com/serdar/budges/ui/currency/CurrencyViewModel.kt index 3a03898..df0d82a 100644 --- a/app/src/main/java/com/serdar/budges/ui/currency/CurrencyViewModel.kt +++ b/app/src/main/java/com/serdar/budges/ui/currency/CurrencyViewModel.kt @@ -7,7 +7,7 @@ import androidx.lifecycle.ViewModel class CurrencyViewModel : ViewModel() { private val _text = MutableLiveData().apply { - value = "This is notifications Fragment" + value = "This is Currency Fragment" } val text: LiveData = _text } \ No newline at end of file diff --git a/app/src/main/java/com/serdar/budges/ui/dashboard/DashboardFragment.kt b/app/src/main/java/com/serdar/budges/ui/dashboard/DashboardFragment.kt index 83be6eb..421f7ba 100644 --- a/app/src/main/java/com/serdar/budges/ui/dashboard/DashboardFragment.kt +++ b/app/src/main/java/com/serdar/budges/ui/dashboard/DashboardFragment.kt @@ -1,5 +1,6 @@ package com.serdar.budges.ui.dashboard + import android.graphics.Color import android.os.Bundle import android.view.LayoutInflater @@ -8,11 +9,14 @@ import android.view.ViewGroup import androidx.fragment.app.Fragment import androidx.lifecycle.Observer import com.github.mikephil.charting.animation.Easing -import com.github.mikephil.charting.data.* -import com.serdar.budges.R +import com.github.mikephil.charting.data.PieData +import com.github.mikephil.charting.data.PieDataSet +import com.github.mikephil.charting.data.PieEntry +import com.google.android.material.tabs.TabLayoutMediator import com.serdar.budges.adapter.BudgesAdapter +import com.serdar.budges.adapter.ViewPagerDash import com.serdar.budges.databinding.FragmentDashboardBinding -import com.serdar.budges.model.TransactionViewModel +import com.serdar.budges.ui.viewmodel.TransactionViewModel class DashboardFragment : Fragment() { private val transactionViewModel by lazy { TransactionViewModel(requireActivity().application) } @@ -31,32 +35,34 @@ class DashboardFragment : Fragment() { override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) + pieChart() + tabLayout() + + } + private fun pieChart() { transactionViewModel.readAllData.observe(requireActivity(), Observer { transactionList -> budgesAdapter.setDataTransaction(transactionList) - //room içine kaydettiğim dataları burada hesaplatıp pasta diliminde gösteriyorum - val totalAmount = transactionList.sumOf { it.amount } - val budgetAmount = transactionList.filter { it.amount > 0 }.sumOf { it.amount } - val expanseAmount = totalAmount - budgetAmount - + val income =transactionList.filter { it.incomeExpenseType=="INCOME" }.sumOf { it.amount } + val expanse =transactionList.filter { it.incomeExpenseType=="EXPENSE" }.sumOf { it.amount } + val total = income - expanse - - // pieList.add(PieEntry(100f, "Total Amount")) + // pieList.add(PieEntry(100f, "Total Amount")) val pieList = ArrayList() - pieList.add(PieEntry(totalAmount.toFloat(), "Total Amount")) - pieList.add(PieEntry(budgetAmount.toFloat(), "Income")) - pieList.add(PieEntry(expanseAmount.toFloat(), "Expanse")) + pieList.add(PieEntry(total.toFloat(), "Total Amount")) + pieList.add(PieEntry(income.toFloat(), "Income")) + pieList.add(PieEntry(expanse.toFloat(), "Expense")) - val colors = ArrayList() - colors.add(Color.BLUE) - colors.add(Color.GREEN) - colors.add(Color.RED) + val colorSet = ArrayList() + colorSet.add(Color.rgb(255, 107, 107)) //red + colorSet.add(Color.rgb(173, 232, 244)) // blue + colorSet.add(Color.rgb(216, 243, 220)) // green val pieDataSet = PieDataSet(pieList, "") - pieDataSet.colors = colors + pieDataSet.colors = colorSet pieDataSet.sliceSpace = 0f @@ -64,19 +70,31 @@ class DashboardFragment : Fragment() { val pieData = PieData(pieDataSet) binding.pieChart.data = pieData - binding.pieChart.setUsePercentValues(true) binding.pieChart.isDrawHoleEnabled = true binding.pieChart.description.isEnabled = false - binding.pieChart.setEntryLabelColor(R.color.black) - binding.pieChart.setCenterTextColor(R.color.black) - binding.pieChart.setCenterTextSize(40f) - binding.pieChart.setUsePercentValues(true) + binding.pieChart.legend.isEnabled = true + binding.pieChart.setCenterTextColor(Color.BLACK) + binding.pieChart.setEntryLabelColor(Color.BLACK) + binding.pieChart.centerTextRadiusPercent = 0f binding.pieChart.animateY(1400, Easing.EaseInOutQuad) }) - - } + private fun tabLayout() { + val adapter = ViewPagerDash(requireActivity().supportFragmentManager, lifecycle) + + binding.dashView.adapter = adapter + TabLayoutMediator(binding.tabLayout, binding.dashView) { tab, position -> + when (position) { + 0 -> { + tab.text = "Income" + } + 1 -> { + tab.text = "Expense" + } + } + }.attach() + } } \ No newline at end of file diff --git a/app/src/main/java/com/serdar/budges/ui/fragments/ExpanseFragment.kt b/app/src/main/java/com/serdar/budges/ui/fragments/ExpanseFragment.kt deleted file mode 100644 index 8986654..0000000 --- a/app/src/main/java/com/serdar/budges/ui/fragments/ExpanseFragment.kt +++ /dev/null @@ -1,45 +0,0 @@ -package com.serdar.budges.ui.fragments - -import android.os.Bundle -import androidx.fragment.app.Fragment -import android.view.LayoutInflater -import android.view.View -import android.view.ViewGroup -import androidx.lifecycle.Observer -import com.serdar.budges.databinding.FragmentExpanseBinding -import com.serdar.budges.adapter.BudgesAdapter -import com.serdar.budges.model.TransactionViewModel - - -class ExpanseFragment : Fragment() { - private val transactionViewModel by lazy { TransactionViewModel(requireActivity().application) } - private lateinit var budgesAdapter: BudgesAdapter - private lateinit var binding:FragmentExpanseBinding - override fun onCreateView( - inflater: LayoutInflater, container: ViewGroup?, - savedInstanceState: Bundle? - ): View? { - binding=FragmentExpanseBinding.inflate(layoutInflater) - budgesAdapter = BudgesAdapter() - - return binding.root - } - - override fun onViewCreated(view: View, savedInstanceState: Bundle?) { - super.onViewCreated(view, savedInstanceState) - - - transactionViewModel.readAllData.observe(requireActivity(), Observer { transactionList -> - budgesAdapter.setDataTransaction(transactionList) - - val totalAmount = transactionList.sumOf { it.amount } - val budgetAmount = transactionList.filter { it.amount > 0 }.sumOf { it.amount } - val expanseAmount = totalAmount - budgetAmount - - binding.expanse.text = "$ %.2f".format(expanseAmount) - - - }) - - } -} \ No newline at end of file diff --git a/app/src/main/java/com/serdar/budges/ui/fragments/UpdateFragment.kt b/app/src/main/java/com/serdar/budges/ui/fragments/UpdateFragment.kt deleted file mode 100644 index bab7581..0000000 --- a/app/src/main/java/com/serdar/budges/ui/fragments/UpdateFragment.kt +++ /dev/null @@ -1,84 +0,0 @@ -package com.serdar.budges.ui.fragments - -import android.os.Bundle -import android.text.TextUtils -import androidx.fragment.app.Fragment -import android.view.LayoutInflater -import android.view.View -import android.view.ViewGroup -import android.widget.Toast -import androidx.navigation.fragment.findNavController -import androidx.navigation.fragment.navArgs -import com.serdar.budges.R -import com.serdar.budges.databinding.FragmentUpdateBinding -import com.serdar.budges.data.transaction.Transaction -import com.serdar.budges.model.TransactionViewModel - -class UpdateFragment : Fragment() { - private val transactionViewModel by lazy { TransactionViewModel(requireActivity().application) } - - private lateinit var binding: FragmentUpdateBinding - private val args by navArgs() - override fun onCreateView( - inflater: LayoutInflater, container: ViewGroup?, - savedInstanceState: Bundle? - ): View? { - binding = FragmentUpdateBinding.inflate(layoutInflater) - return binding.root - } - - override fun onViewCreated(view: View, savedInstanceState: Bundle?) { - super.onViewCreated(view, savedInstanceState) - - - binding.transactionName.setText(args.current.transaction) - binding.transactionAmounts.setText(args.current.amount.toString()) - binding.transactionDesc.setText(args.current.description) - - - binding.updateButton.setOnClickListener { - updateItem() - - } - binding.deleteData.setOnClickListener { - deleteShoppingData() - } - - } - - private fun updateItem() { - val transactionName = binding.transactionName.text.toString() - val transactionAmount = binding.transactionAmounts.text.toString() - val transactionDesc = binding.transactionDesc.text.toString() - - val updateShopping = Transaction( - args.current.id, - transactionName, - transactionAmount.toDouble(), - transactionDesc - ) - transactionViewModel.updateTransaction(updateShopping) - findNavController().navigate(R.id.action_updateFragment_to_navigation_home) - - if (inputCheck(transactionName, transactionAmount, transactionDesc)) { - Toast.makeText(requireContext(), "Updated ", Toast.LENGTH_SHORT).show() - } - } - - private fun inputCheck( - transactionName: String, - transactionAmount: String, - transactionDesc: String - ): Boolean { - return !(TextUtils.isEmpty(transactionName) && TextUtils.isEmpty(transactionAmount) && TextUtils.isEmpty( - transactionDesc - )) - } - - private fun deleteShoppingData() { - - transactionViewModel.deleteTransaction(args.current) - findNavController().navigate(R.id.action_updateFragment_to_navigation_home) - } - -} \ No newline at end of file diff --git a/app/src/main/java/com/serdar/budges/ui/fragments/dashboard/ExpenseDashFragment.kt b/app/src/main/java/com/serdar/budges/ui/fragments/dashboard/ExpenseDashFragment.kt new file mode 100644 index 0000000..8249432 --- /dev/null +++ b/app/src/main/java/com/serdar/budges/ui/fragments/dashboard/ExpenseDashFragment.kt @@ -0,0 +1,44 @@ +package com.serdar.budges.ui.fragments.dashboard + +import android.os.Bundle +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import androidx.fragment.app.Fragment +import androidx.lifecycle.Observer +import androidx.recyclerview.widget.LinearLayoutManager +import com.serdar.budges.adapter.ExpenseAdapter +import com.serdar.budges.databinding.FragmentExpenseDashBinding +import com.serdar.budges.ui.viewmodel.ExpenseDashViewModel + +class ExpenseDashFragment : Fragment() { + private lateinit var binding: FragmentExpenseDashBinding + private lateinit var expenseAdapter: ExpenseAdapter + private val expenseDashViewModel by lazy { ExpenseDashViewModel(requireActivity().application) } + override fun onCreateView( + inflater: LayoutInflater, container: ViewGroup?, + savedInstanceState: Bundle? + ): View? { + binding = FragmentExpenseDashBinding.inflate(layoutInflater) + expenseAdapter = ExpenseAdapter() + return binding.root + } + + override fun onViewCreated(view: View, savedInstanceState: Bundle?) { + super.onViewCreated(view, savedInstanceState) + expanseData() + } + + private fun expanseData() { + val expenseAdapter = ExpenseAdapter() + + binding.dashExpense.layoutManager = LinearLayoutManager(requireContext()) + binding.dashExpense.adapter = expenseAdapter + expenseDashViewModel.readExpenseData.observe( + requireActivity(), + Observer { transactionList -> + expenseAdapter.setExpanse(transactionList) + + }) + } +} \ No newline at end of file diff --git a/app/src/main/java/com/serdar/budges/ui/fragments/dashboard/IncomeDashFragment.kt b/app/src/main/java/com/serdar/budges/ui/fragments/dashboard/IncomeDashFragment.kt new file mode 100644 index 0000000..e9d54d6 --- /dev/null +++ b/app/src/main/java/com/serdar/budges/ui/fragments/dashboard/IncomeDashFragment.kt @@ -0,0 +1,45 @@ +package com.serdar.budges.ui.fragments.dashboard + +import android.os.Bundle +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import androidx.fragment.app.Fragment +import androidx.lifecycle.Observer +import androidx.recyclerview.widget.LinearLayoutManager +import com.serdar.budges.adapter.IncomeAdapter +import com.serdar.budges.databinding.FragmentIncomeDashBinding +import com.serdar.budges.ui.viewmodel.IncomeDashViewModel + + +class IncomeDashFragment : Fragment() { + private lateinit var binding: FragmentIncomeDashBinding + private lateinit var incomeAdapter: IncomeAdapter + private val incomeDashViewModel by lazy { IncomeDashViewModel(requireActivity().application) } + override fun onCreateView( + inflater: LayoutInflater, container: ViewGroup?, + savedInstanceState: Bundle? + ): View? { + binding = FragmentIncomeDashBinding.inflate(layoutInflater) + incomeAdapter = IncomeAdapter() + return binding.root + } + + override fun onViewCreated(view: View, savedInstanceState: Bundle?) { + super.onViewCreated(view, savedInstanceState) + incomeDash() + } + + private fun incomeDash() { + val incomeAdapter = IncomeAdapter() + + binding.dashIncome.layoutManager = LinearLayoutManager(requireContext()) + binding.dashIncome.adapter = incomeAdapter + incomeDashViewModel.readIncome.observe( + requireActivity(), + Observer { transactionList -> + incomeAdapter.setIncome(transactionList) + + }) + } +} \ No newline at end of file diff --git a/app/src/main/java/com/serdar/budges/ui/fragments/home/ExpenseFragment.kt b/app/src/main/java/com/serdar/budges/ui/fragments/home/ExpenseFragment.kt new file mode 100644 index 0000000..edaaf05 --- /dev/null +++ b/app/src/main/java/com/serdar/budges/ui/fragments/home/ExpenseFragment.kt @@ -0,0 +1,42 @@ +package com.serdar.budges.ui.fragments.home + +import android.os.Bundle +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import androidx.fragment.app.Fragment +import androidx.lifecycle.Observer +import com.serdar.budges.adapter.ExpenseAdapter +import com.serdar.budges.databinding.FragmentExpenseBinding +import com.serdar.budges.ui.viewmodel.ExpenseDashViewModel + + +class ExpenseFragment : Fragment() { + private val expenseDashViewModel by lazy { ExpenseDashViewModel(requireActivity().application) } + private lateinit var expenseAdapter: ExpenseAdapter + private lateinit var binding: FragmentExpenseBinding + override fun onCreateView( + inflater: LayoutInflater, container: ViewGroup?, + savedInstanceState: Bundle? + ): View? { + binding = FragmentExpenseBinding.inflate(layoutInflater) + expenseAdapter = ExpenseAdapter() + + return binding.root + } + + override fun onViewCreated(view: View, savedInstanceState: Bundle?) { + super.onViewCreated(view, savedInstanceState) + + + expenseDashViewModel.readExpenseData.observe( + requireActivity(), + Observer { transactionList -> + expenseAdapter.setExpanse(transactionList) + val expanseAmount = transactionList.sumOf { it.amount } + binding.expanse.text = "$ %.2f".format(expanseAmount) + }) + + } + +} \ No newline at end of file diff --git a/app/src/main/java/com/serdar/budges/ui/fragments/IncomeFragment.kt b/app/src/main/java/com/serdar/budges/ui/fragments/home/IncomeFragment.kt similarity index 58% rename from app/src/main/java/com/serdar/budges/ui/fragments/IncomeFragment.kt rename to app/src/main/java/com/serdar/budges/ui/fragments/home/IncomeFragment.kt index 9d94baa..9489c7f 100644 --- a/app/src/main/java/com/serdar/budges/ui/fragments/IncomeFragment.kt +++ b/app/src/main/java/com/serdar/budges/ui/fragments/home/IncomeFragment.kt @@ -1,21 +1,21 @@ -package com.serdar.budges.ui.fragments +package com.serdar.budges.ui.fragments.home import android.os.Bundle -import androidx.fragment.app.Fragment import android.view.LayoutInflater import android.view.View import android.view.ViewGroup +import androidx.fragment.app.Fragment import androidx.lifecycle.Observer import androidx.viewpager2.widget.ViewPager2 import com.serdar.budges.R +import com.serdar.budges.adapter.IncomeAdapter import com.serdar.budges.databinding.FragmentIncomeBinding -import com.serdar.budges.adapter.BudgesAdapter -import com.serdar.budges.model.TransactionViewModel +import com.serdar.budges.ui.viewmodel.IncomeDashViewModel class IncomeFragment : Fragment() { - private val transactionViewModel by lazy { TransactionViewModel(requireActivity().application) } - private lateinit var budgesAdapter: BudgesAdapter + private val incomeDashViewModel by lazy { IncomeDashViewModel(requireActivity().application) } + private lateinit var incomeAdapter: IncomeAdapter private lateinit var binding: FragmentIncomeBinding override fun onCreateView( inflater: LayoutInflater, container: ViewGroup?, @@ -24,7 +24,7 @@ class IncomeFragment : Fragment() { binding = FragmentIncomeBinding.inflate(layoutInflater) val viewPager = activity?.findViewById(R.id.viewPages) viewPager?.currentItem = 1 - budgesAdapter = BudgesAdapter() + incomeAdapter = IncomeAdapter() return binding.root } @@ -32,12 +32,11 @@ class IncomeFragment : Fragment() { override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) - transactionViewModel.readAllData.observe(requireActivity(), Observer { transactionList -> - budgesAdapter.setDataTransaction(transactionList) - - val budgetAmount = transactionList.filter { it.amount > 0 }.sumOf { it.amount } - binding.income.text = "$ %.2f".format(budgetAmount) + incomeDashViewModel.readIncome.observe(requireActivity(), Observer { transactionList -> + incomeAdapter.setIncome(transactionList) + val incomeAmount = transactionList.sumOf { it.amount } + binding.income.text = "$ %.2f".format(incomeAmount) }) diff --git a/app/src/main/java/com/serdar/budges/ui/fragments/TotalBalanceFragment.kt b/app/src/main/java/com/serdar/budges/ui/fragments/home/TotalBalanceFragment.kt similarity index 68% rename from app/src/main/java/com/serdar/budges/ui/fragments/TotalBalanceFragment.kt rename to app/src/main/java/com/serdar/budges/ui/fragments/home/TotalBalanceFragment.kt index e7672a5..36379cf 100644 --- a/app/src/main/java/com/serdar/budges/ui/fragments/TotalBalanceFragment.kt +++ b/app/src/main/java/com/serdar/budges/ui/fragments/home/TotalBalanceFragment.kt @@ -1,31 +1,32 @@ -package com.serdar.budges.ui.fragments +package com.serdar.budges.ui.fragments.home import android.os.Bundle -import androidx.fragment.app.Fragment import android.view.LayoutInflater import android.view.View import android.view.ViewGroup +import androidx.fragment.app.Fragment import androidx.lifecycle.Observer import androidx.viewpager2.widget.ViewPager2 import com.serdar.budges.R -import com.serdar.budges.databinding.FragmentTotalBalanceBinding import com.serdar.budges.adapter.BudgesAdapter -import com.serdar.budges.model.TransactionViewModel +import com.serdar.budges.databinding.FragmentTotalBalanceBinding +import com.serdar.budges.di.repository.TransactionRepository +import com.serdar.budges.ui.viewmodel.TransactionViewModel class TotalBalanceFragment : Fragment() { private val transactionViewModel by lazy { TransactionViewModel(requireActivity().application) } private lateinit var budgesAdapter: BudgesAdapter private lateinit var binding: FragmentTotalBalanceBinding + override fun onCreateView( inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle? ): View? { - binding=FragmentTotalBalanceBinding.inflate(layoutInflater) + binding = FragmentTotalBalanceBinding.inflate(layoutInflater) budgesAdapter = BudgesAdapter() - val viewPager = activity?.findViewById(R.id.viewPages) - viewPager?.currentItem =0 + viewPager?.currentItem = 0 return binding.root } @@ -35,10 +36,13 @@ class TotalBalanceFragment : Fragment() { transactionViewModel.readAllData.observe(requireActivity(), Observer { transactionList -> budgesAdapter.setDataTransaction(transactionList) - val totalAmount = transactionList.sumOf { it.amount } - binding.total.text = "$ %.2f".format(totalAmount) + val income =transactionList.filter { it.incomeExpenseType=="INCOME" }.sumOf { it.amount } + val expanse =transactionList.filter { it.incomeExpenseType=="EXPENSE" }.sumOf { it.amount } + val total=income-expanse + binding.total.text = "$ %.2f".format(total) }) + } } \ No newline at end of file diff --git a/app/src/main/java/com/serdar/budges/ui/home/HomeFragment.kt b/app/src/main/java/com/serdar/budges/ui/home/HomeFragment.kt index 21189d9..72424d4 100644 --- a/app/src/main/java/com/serdar/budges/ui/home/HomeFragment.kt +++ b/app/src/main/java/com/serdar/budges/ui/home/HomeFragment.kt @@ -1,13 +1,11 @@ package com.serdar.budges.ui.home - -import android.content.Context -import android.content.Context.MODE_PRIVATE import android.os.Bundle import android.os.Handler import android.os.Looper import android.view.LayoutInflater import android.view.View import android.view.ViewGroup +import android.widget.Toast import androidx.fragment.app.Fragment import androidx.lifecycle.Observer import androidx.lifecycle.ViewModelProvider @@ -16,19 +14,21 @@ import androidx.recyclerview.widget.ItemTouchHelper import androidx.recyclerview.widget.LinearLayoutManager import androidx.recyclerview.widget.RecyclerView import com.serdar.budges.R -import com.serdar.budges.databinding.FragmentHomeBinding import com.serdar.budges.adapter.BudgesAdapter import com.serdar.budges.adapter.HomeCryptoAdapter import com.serdar.budges.adapter.ViewPagerAdapter import com.serdar.budges.data.transaction.Transaction +import com.serdar.budges.databinding.FragmentHomeBinding import com.serdar.budges.di.repository.CryptoRepository -import com.serdar.budges.model.CryptoViewModel -import com.serdar.budges.model.CryptoViewModelFactory -import com.serdar.budges.model.TransactionViewModel -import com.serdar.budges.ui.components.BalanceDialog -import com.serdar.budges.ui.fragments.ExpanseFragment -import com.serdar.budges.ui.fragments.IncomeFragment -import com.serdar.budges.ui.fragments.TotalBalanceFragment +import com.serdar.budges.infrastructure.NotificationUtils +import com.serdar.budges.ui.fragments.home.ExpenseFragment +import com.serdar.budges.ui.fragments.home.IncomeFragment +import com.serdar.budges.ui.fragments.home.TotalBalanceFragment +import com.serdar.budges.ui.viewmodel.CryptoViewModel +import com.serdar.budges.ui.viewmodel.CryptoViewModelFactory +import com.serdar.budges.ui.viewmodel.TransactionViewModel +import com.serdar.budges.util.Constants.Companion.DESCRIPTION +import com.serdar.budges.util.Constants.Companion.TITLE class HomeFragment : Fragment() { private val transactionViewModel by lazy { TransactionViewModel(requireActivity().application) } @@ -44,16 +44,7 @@ class HomeFragment : Fragment() { transaction = arrayListOf() budgesAdapter = BudgesAdapter() adapterSetup() - val repository = CryptoRepository() - val cryptoViewModelFactory = CryptoViewModelFactory(repository) - - viewModel = ViewModelProvider(this, cryptoViewModelFactory).get(CryptoViewModel::class.java) - viewModel.getData() - viewModel.myResponse.observe(requireActivity(), Observer { - adapter.setDatas(it) - - }) - + cryptoData() return binding.root } @@ -62,53 +53,17 @@ class HomeFragment : Fragment() { super.onViewCreated(view, savedInstanceState) viewPager() Dots() - + swipeToDelete() binding.sheetDialog.setOnClickListener { findNavController().navigate(R.id.action_navigation_home_to_bottomSheetFragment) } - val budgesAdapter = BudgesAdapter() - - binding.rvView.layoutManager = LinearLayoutManager(requireContext()) - binding.rvView.adapter = budgesAdapter - - transactionViewModel.readAllData.observe(requireActivity(), Observer { transactionList -> - budgesAdapter.setDataTransaction(transactionList) - - val totalAmount = transactionList.sumOf { it.amount } - if(totalAmount>2500){ - dialog() - } - - - - val itemTouchHelper = - object : ItemTouchHelper.SimpleCallback(0, ItemTouchHelper.RIGHT) { - override fun onMove( - recyclerView: RecyclerView, - viewHolder: RecyclerView.ViewHolder, - target: RecyclerView.ViewHolder - ): Boolean { - return false - } - - override fun onSwiped(viewHolder: RecyclerView.ViewHolder, direction: Int) { - - val position = viewHolder.adapterPosition - transactionViewModel.deleteTransaction(transactionList[position]) - } - - } - val swipeHelper = ItemTouchHelper(itemTouchHelper) - swipeHelper.attachToRecyclerView(binding.rvView) - }) - } private fun viewPager() { val fragmentList = arrayListOf( TotalBalanceFragment(), IncomeFragment(), - ExpanseFragment() + ExpenseFragment() ) val adapter = ViewPagerAdapter( fragmentList, @@ -125,7 +80,7 @@ class HomeFragment : Fragment() { val fragmentList = arrayListOf( TotalBalanceFragment(), IncomeFragment(), - ExpanseFragment() + ExpenseFragment() ) val adapter = ViewPagerAdapter( fragmentList, @@ -144,21 +99,71 @@ class HomeFragment : Fragment() { binding.cryview.adapter = adapter } - private fun dialog(){ - val firstrun:Boolean = requireActivity().getSharedPreferences("PREFERENCE", MODE_PRIVATE).getBoolean("firstrun", true); - if (firstrun){ - - val dialog=BalanceDialog().show(parentFragmentManager,"dialog") - //... Display the dialog message here ... - // Save the state - requireActivity().getSharedPreferences("PREFERENCE", MODE_PRIVATE) - .edit() - .putBoolean("firstrun", false) - .commit(); - } + + + + private fun swipeToDelete() { + val budgesAdapter = BudgesAdapter() + + binding.rvView.layoutManager = LinearLayoutManager(requireContext()) + binding.rvView.adapter = budgesAdapter + + //reading data and setting data to recyclerview + transactionViewModel.readAllData.observe( + requireActivity(), + Observer { transactionList -> + budgesAdapter.setDataTransaction(transactionList) + + val totalAmount = transactionList.sumOf { it.amount } + if (totalAmount <= 0) { + NotificationUtils.budgesNotification( + requireContext(), + TITLE, + DESCRIPTION + ) + } + + + val itemTouchHelper = + object : ItemTouchHelper.SimpleCallback(0, ItemTouchHelper.RIGHT) { + override fun onMove( + recyclerView: RecyclerView, + viewHolder: RecyclerView.ViewHolder, + target: RecyclerView.ViewHolder + ): Boolean { + return false + } + + override fun onSwiped( + viewHolder: RecyclerView.ViewHolder, + direction: Int + ) { + + val position = viewHolder.adapterPosition + transactionViewModel.deleteTransaction(transactionList[position]) + } + + } + val swipeHelper = ItemTouchHelper(itemTouchHelper) + swipeHelper.attachToRecyclerView(binding.rvView) + }) } + private fun cryptoData() { + val repository = CryptoRepository() + val cryptoViewModelFactory = CryptoViewModelFactory(repository) + + viewModel = ViewModelProvider(this, cryptoViewModelFactory).get(CryptoViewModel::class.java) + viewModel.getData() + viewModel.myResponse.observe(requireActivity(), Observer { + if (it.isEmpty()) { + Toast.makeText(requireContext(), "No internet", Toast.LENGTH_SHORT).show() + } else { + adapter.setDatas(it) + } + }) + } +} -} \ No newline at end of file diff --git a/app/src/main/java/com/serdar/budges/ui/onboarding/FirstFragment.kt b/app/src/main/java/com/serdar/budges/ui/onboarding/FirstFragment.kt new file mode 100644 index 0000000..c5c1e5d --- /dev/null +++ b/app/src/main/java/com/serdar/budges/ui/onboarding/FirstFragment.kt @@ -0,0 +1,47 @@ +package com.serdar.budges.ui.onboarding + +import android.content.Context +import android.content.Intent +import android.os.Bundle +import androidx.fragment.app.Fragment +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import androidx.viewpager2.widget.ViewPager2 +import com.serdar.budges.R +import com.serdar.budges.databinding.FragmentFirstBinding +import com.serdar.budges.ui.splash.HomeActivity + +class FirstFragment : Fragment() { + + private lateinit var binding: FragmentFirstBinding + + override fun onCreateView( + inflater: LayoutInflater, container: ViewGroup?, + savedInstanceState: Bundle? + ): View? { + binding=FragmentFirstBinding.inflate(layoutInflater) + return binding.root + } + + override fun onViewCreated(view: View, savedInstanceState: Bundle?) { + super.onViewCreated(view, savedInstanceState) + binding.firstNext.setOnClickListener { + val viewPager = activity?.findViewById(R.id.viewPager) + viewPager?.currentItem = 1 + } + binding.skipFirst.setOnClickListener { + val intent = Intent (requireActivity(), HomeActivity::class.java) + startActivity(intent) + onBoardingFinished() + } + + } + private fun onBoardingFinished() { + + val sp = requireActivity().getSharedPreferences("onBoarding", Context.MODE_PRIVATE) + val editor = sp.edit() + editor.putBoolean("Finished", true) + editor.apply() + } +} \ No newline at end of file diff --git a/app/src/main/java/com/serdar/budges/ui/onboarding/SecondFragment.kt b/app/src/main/java/com/serdar/budges/ui/onboarding/SecondFragment.kt new file mode 100644 index 0000000..e5f35a9 --- /dev/null +++ b/app/src/main/java/com/serdar/budges/ui/onboarding/SecondFragment.kt @@ -0,0 +1,49 @@ +package com.serdar.budges.ui.onboarding + +import android.content.Context +import android.content.Intent +import android.os.Bundle +import androidx.fragment.app.Fragment +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import androidx.viewpager2.widget.ViewPager2 +import com.serdar.budges.R +import com.serdar.budges.databinding.FragmentSecondBinding +import com.serdar.budges.ui.splash.HomeActivity + +class SecondFragment : Fragment() { + + private lateinit var binding: FragmentSecondBinding + override fun onCreateView( + inflater: LayoutInflater, container: ViewGroup?, + savedInstanceState: Bundle? + ): View? { + binding=FragmentSecondBinding.inflate(layoutInflater) + return binding.root + } + + override fun onViewCreated(view: View, savedInstanceState: Bundle?) { + super.onViewCreated(view, savedInstanceState) + binding.secondNext.setOnClickListener { + val viewPager = activity?.findViewById(R.id.viewPager) + viewPager?.currentItem = 2 + } + binding.secondBack.setOnClickListener { + val viewPager = activity?.findViewById(R.id.viewPager) + viewPager?.currentItem = 0 + } + binding.skipSecond.setOnClickListener { + val intent = Intent (requireActivity(), HomeActivity::class.java) + startActivity(intent) + onBoardingFinished() + } + } + private fun onBoardingFinished() { + + val sp = requireActivity().getSharedPreferences("onBoarding", Context.MODE_PRIVATE) + val editor = sp.edit() + editor.putBoolean("Finished", true) + editor.apply() + } +} \ No newline at end of file diff --git a/app/src/main/java/com/serdar/budges/ui/onboarding/ThirdFragment.kt b/app/src/main/java/com/serdar/budges/ui/onboarding/ThirdFragment.kt new file mode 100644 index 0000000..032a1ac --- /dev/null +++ b/app/src/main/java/com/serdar/budges/ui/onboarding/ThirdFragment.kt @@ -0,0 +1,49 @@ +package com.serdar.budges.ui.onboarding + +import android.content.Context +import android.content.Intent +import android.os.Bundle +import androidx.fragment.app.Fragment +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import androidx.viewpager2.widget.ViewPager2 +import com.serdar.budges.R +import com.serdar.budges.databinding.FragmentThirdBinding +import com.serdar.budges.ui.splash.HomeActivity + + +class ThirdFragment : Fragment() { + +private lateinit var binding:FragmentThirdBinding + override fun onCreateView( + inflater: LayoutInflater, container: ViewGroup?, + savedInstanceState: Bundle? + ): View? { + binding = FragmentThirdBinding.inflate(layoutInflater) + return binding.root + } + + override fun onViewCreated(view: View, savedInstanceState: Bundle?) { + super.onViewCreated(view, savedInstanceState) + + binding.thirdNext.setOnClickListener { + onBoardingFinished() + val intent = Intent(requireActivity(), HomeActivity::class.java) + startActivity(intent) + requireActivity().finish() + } + binding.thirdBack.setOnClickListener { + val viewPager = activity?.findViewById(R.id.viewPager) + viewPager?.currentItem = 1 + } + + } + private fun onBoardingFinished() { + + val sp = requireActivity().getSharedPreferences("onBoarding", Context.MODE_PRIVATE) + val editor = sp.edit() + editor.putBoolean("Finished", true) + editor.apply() + } +} \ No newline at end of file diff --git a/app/src/main/java/com/serdar/budges/ui/onboarding/ViewPagerFragment.kt b/app/src/main/java/com/serdar/budges/ui/onboarding/ViewPagerFragment.kt new file mode 100644 index 0000000..f587e2b --- /dev/null +++ b/app/src/main/java/com/serdar/budges/ui/onboarding/ViewPagerFragment.kt @@ -0,0 +1,64 @@ +package com.serdar.budges.ui.onboarding + +import android.os.Bundle +import android.os.Handler +import android.os.Looper +import androidx.fragment.app.Fragment +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import com.serdar.budges.adapter.OnBoardingAdapter +import com.serdar.budges.databinding.FragmentViewPagerBinding + + +class ViewPagerFragment : Fragment() { + + private lateinit var binding:FragmentViewPagerBinding + override fun onCreateView( + inflater: LayoutInflater, container: ViewGroup?, + savedInstanceState: Bundle? + ): View? { + binding=FragmentViewPagerBinding.inflate(layoutInflater) + return binding.root + } + + override fun onViewCreated(view: View, savedInstanceState: Bundle?) { + super.onViewCreated(view, savedInstanceState) + setPages() + Dots() + } + private fun setPages(){ + val fragmentList = arrayListOf( + FirstFragment(), + SecondFragment(), + ThirdFragment() + + ) + val adapter = OnBoardingAdapter( + fragmentList, + requireActivity().supportFragmentManager, + lifecycle + ) + + Handler(Looper.getMainLooper()).post { + binding.viewPager.adapter = adapter + } + } + private fun Dots() { + val fragmentList = arrayListOf( + FirstFragment(), + SecondFragment(), + ThirdFragment() + ) + val adapter = OnBoardingAdapter( + fragmentList, + requireActivity().supportFragmentManager, + lifecycle + ) + val dotsIndicator = binding.dotsOnboarding + val viewPager = binding.viewPager + viewPager.adapter = adapter + dotsIndicator.setViewPager2(viewPager) + + } +} \ No newline at end of file diff --git a/app/src/main/java/com/serdar/budges/ui/splash/HomeActivity.kt b/app/src/main/java/com/serdar/budges/ui/splash/HomeActivity.kt index e1c63d7..987cff2 100644 --- a/app/src/main/java/com/serdar/budges/ui/splash/HomeActivity.kt +++ b/app/src/main/java/com/serdar/budges/ui/splash/HomeActivity.kt @@ -1,7 +1,7 @@ package com.serdar.budges.ui.splash -import androidx.appcompat.app.AppCompatActivity import android.os.Bundle +import androidx.appcompat.app.AppCompatActivity import androidx.navigation.findNavController import androidx.navigation.ui.setupWithNavController import com.google.android.material.bottomnavigation.BottomNavigationView @@ -15,7 +15,7 @@ class HomeActivity : AppCompatActivity() { super.onCreate(savedInstanceState) binding = ActivityHomeBinding.inflate(layoutInflater) - setContentView(binding.root) + setContentView(binding.root) val navView: BottomNavigationView = binding.navView diff --git a/app/src/main/java/com/serdar/budges/ui/splash/SplashFragment.kt b/app/src/main/java/com/serdar/budges/ui/splash/SplashFragment.kt index 5b966a0..9757b76 100644 --- a/app/src/main/java/com/serdar/budges/ui/splash/SplashFragment.kt +++ b/app/src/main/java/com/serdar/budges/ui/splash/SplashFragment.kt @@ -1,12 +1,13 @@ package com.serdar.budges.ui.splash +import android.content.Context import android.content.Intent import android.os.Bundle import android.os.Handler -import androidx.fragment.app.Fragment import android.view.LayoutInflater import android.view.View import android.view.ViewGroup +import androidx.fragment.app.Fragment import androidx.navigation.fragment.findNavController import com.serdar.budges.R import com.serdar.budges.databinding.FragmentSplashBinding @@ -18,7 +19,7 @@ class SplashFragment : Fragment() { inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle? ): View? { - binding=FragmentSplashBinding.inflate(layoutInflater) + binding = FragmentSplashBinding.inflate(layoutInflater) return binding.root } @@ -26,15 +27,24 @@ class SplashFragment : Fragment() { super.onViewCreated(view, savedInstanceState) Handler().postDelayed( { - + if (onBoardingFinished()) { val intent = Intent(requireActivity(), HomeActivity::class.java) startActivity(intent) requireActivity().finish() + } else { + findNavController().navigate(R.id.action_splashFragment_to_viewPagerFragment) + } }, - 2500 + 600 ) + } + private fun onBoardingFinished(): Boolean { + val sp = requireActivity().getSharedPreferences("onBoarding", Context.MODE_PRIVATE) + + return sp.getBoolean("Finished", false) + } } \ No newline at end of file diff --git a/app/src/main/java/com/serdar/budges/model/CryptoViewModel.kt b/app/src/main/java/com/serdar/budges/ui/viewmodel/CryptoViewModel.kt similarity index 55% rename from app/src/main/java/com/serdar/budges/model/CryptoViewModel.kt rename to app/src/main/java/com/serdar/budges/ui/viewmodel/CryptoViewModel.kt index a92e564..53d9cd1 100644 --- a/app/src/main/java/com/serdar/budges/model/CryptoViewModel.kt +++ b/app/src/main/java/com/serdar/budges/ui/viewmodel/CryptoViewModel.kt @@ -1,22 +1,20 @@ -package com.serdar.budges.model +package com.serdar.budges.ui.viewmodel import androidx.lifecycle.MutableLiveData import androidx.lifecycle.ViewModel import androidx.lifecycle.viewModelScope -import com.serdar.budges.data.crypto.CryptoModel import com.serdar.budges.data.crypto.Data import com.serdar.budges.di.repository.CryptoRepository import kotlinx.coroutines.launch -import retrofit2.Response -class CryptoViewModel(private val cryptoRepository: CryptoRepository):ViewModel() { +class CryptoViewModel(private val cryptoRepository: CryptoRepository) : ViewModel() { - val myResponse:MutableLiveData> = MutableLiveData() + val myResponse: MutableLiveData> = MutableLiveData() fun getData() { viewModelScope.launch { val response = cryptoRepository.getPost() - myResponse.value=response + myResponse.value = response } } } \ No newline at end of file diff --git a/app/src/main/java/com/serdar/budges/model/CryptoViewModelFactory.kt b/app/src/main/java/com/serdar/budges/ui/viewmodel/CryptoViewModelFactory.kt similarity index 71% rename from app/src/main/java/com/serdar/budges/model/CryptoViewModelFactory.kt rename to app/src/main/java/com/serdar/budges/ui/viewmodel/CryptoViewModelFactory.kt index 94d7bce..b7c9883 100644 --- a/app/src/main/java/com/serdar/budges/model/CryptoViewModelFactory.kt +++ b/app/src/main/java/com/serdar/budges/ui/viewmodel/CryptoViewModelFactory.kt @@ -1,14 +1,15 @@ -package com.serdar.budges.model +package com.serdar.budges.ui.viewmodel import androidx.lifecycle.ViewModel import androidx.lifecycle.ViewModelProvider import com.serdar.budges.di.repository.CryptoRepository class CryptoViewModelFactory( - private val repository: CryptoRepository): ViewModelProvider.Factory{ + private val repository: CryptoRepository +) : ViewModelProvider.Factory { override fun create(modelClass: Class): T { return CryptoViewModel(repository) as T } - } +} diff --git a/app/src/main/java/com/serdar/budges/ui/viewmodel/ExpenseDashViewModel.kt b/app/src/main/java/com/serdar/budges/ui/viewmodel/ExpenseDashViewModel.kt new file mode 100644 index 0000000..fa817fe --- /dev/null +++ b/app/src/main/java/com/serdar/budges/ui/viewmodel/ExpenseDashViewModel.kt @@ -0,0 +1,21 @@ +package com.serdar.budges.ui.viewmodel + +import android.app.Application +import androidx.lifecycle.AndroidViewModel +import androidx.lifecycle.LiveData +import com.serdar.budges.data.transaction.Transaction +import com.serdar.budges.di.repository.TransactionRepository +import com.serdar.budges.service.transaction.TransactionDatabase + +class ExpenseDashViewModel(application: Application) : AndroidViewModel(application) { + + val readExpenseData: LiveData> + + private val repository: TransactionRepository + + init { + val transactionDao = TransactionDatabase.getDatabase(application).transactionDao() + repository = TransactionRepository(transactionDao) + readExpenseData = transactionDao.getExpenseList() + } +} \ No newline at end of file diff --git a/app/src/main/java/com/serdar/budges/ui/viewmodel/IncomeDashViewModel.kt b/app/src/main/java/com/serdar/budges/ui/viewmodel/IncomeDashViewModel.kt new file mode 100644 index 0000000..e20fc78 --- /dev/null +++ b/app/src/main/java/com/serdar/budges/ui/viewmodel/IncomeDashViewModel.kt @@ -0,0 +1,21 @@ +package com.serdar.budges.ui.viewmodel + +import android.app.Application +import androidx.lifecycle.AndroidViewModel +import androidx.lifecycle.LiveData +import com.serdar.budges.data.transaction.Transaction +import com.serdar.budges.di.repository.TransactionRepository +import com.serdar.budges.service.transaction.TransactionDatabase + +class IncomeDashViewModel(application: Application) : AndroidViewModel(application) { + + val readIncome: LiveData> + + private val repository: TransactionRepository + + init { + val transactionDao = TransactionDatabase.getDatabase(application).transactionDao() + repository = TransactionRepository(transactionDao) + readIncome = transactionDao.getIncomeList() + } +} \ No newline at end of file diff --git a/app/src/main/java/com/serdar/budges/model/TransactionViewModel.kt b/app/src/main/java/com/serdar/budges/ui/viewmodel/TransactionViewModel.kt similarity index 83% rename from app/src/main/java/com/serdar/budges/model/TransactionViewModel.kt rename to app/src/main/java/com/serdar/budges/ui/viewmodel/TransactionViewModel.kt index 926e5bb..e283b03 100644 --- a/app/src/main/java/com/serdar/budges/model/TransactionViewModel.kt +++ b/app/src/main/java/com/serdar/budges/ui/viewmodel/TransactionViewModel.kt @@ -1,4 +1,4 @@ -package com.serdar.budges.model +package com.serdar.budges.ui.viewmodel import android.app.Application import androidx.lifecycle.AndroidViewModel @@ -14,6 +14,10 @@ class TransactionViewModel(application: Application) : AndroidViewModel(applicat val readAllData: LiveData> + val readExpenseData: LiveData> + val readIncomeData: LiveData> + + private val repository: TransactionRepository @@ -21,6 +25,8 @@ class TransactionViewModel(application: Application) : AndroidViewModel(applicat val transactionDao = TransactionDatabase.getDatabase(application).transactionDao() repository = TransactionRepository(transactionDao) readAllData = transactionDao.readAllData() + readExpenseData = transactionDao.getExpenseList() + readIncomeData = transactionDao.getIncomeList() } @@ -45,7 +51,4 @@ class TransactionViewModel(application: Application) : AndroidViewModel(applicat } - - - } \ No newline at end of file diff --git a/app/src/main/java/com/serdar/budges/util/Constants.kt b/app/src/main/java/com/serdar/budges/util/Constants.kt index d3bf7ac..6bd5c01 100644 --- a/app/src/main/java/com/serdar/budges/util/Constants.kt +++ b/app/src/main/java/com/serdar/budges/util/Constants.kt @@ -1,10 +1,14 @@ package com.serdar.budges.util -import com.github.mikephil.charting.data.BarDataSet - class Constants { - companion object{ + companion object { const val BASE_URL = "https://api.coincap.io/" + + const val CHANNEL_ID = "MyTask" + const val CHANNEL_NAME = "MyTaskChannel" + + const val TITLE = "BUDGES" + const val DESCRIPTION = "Don't forget to add your daily transaction" } } \ No newline at end of file diff --git a/app/src/main/res/drawable-v24/balance.png b/app/src/main/res/drawable-v24/balance.png deleted file mode 100644 index f5acece..0000000 Binary files a/app/src/main/res/drawable-v24/balance.png and /dev/null differ diff --git a/app/src/main/res/drawable-v24/expanses.png b/app/src/main/res/drawable-v24/expanses.png deleted file mode 100644 index c2c9111..0000000 Binary files a/app/src/main/res/drawable-v24/expanses.png and /dev/null differ diff --git a/app/src/main/res/drawable-v24/expansion.png b/app/src/main/res/drawable-v24/expansion.png deleted file mode 100644 index 738d316..0000000 Binary files a/app/src/main/res/drawable-v24/expansion.png and /dev/null differ diff --git a/app/src/main/res/drawable-v24/incomes.png b/app/src/main/res/drawable-v24/incomes.png deleted file mode 100644 index 5016d32..0000000 Binary files a/app/src/main/res/drawable-v24/incomes.png and /dev/null differ diff --git a/app/src/main/res/drawable-v24/profits.png b/app/src/main/res/drawable-v24/profits.png deleted file mode 100644 index 3f355e5..0000000 Binary files a/app/src/main/res/drawable-v24/profits.png and /dev/null differ diff --git a/app/src/main/res/drawable/add.xml b/app/src/main/res/drawable/add.xml new file mode 100644 index 0000000..70046c4 --- /dev/null +++ b/app/src/main/res/drawable/add.xml @@ -0,0 +1,5 @@ + + + diff --git a/app/src/main/res/drawable/back.xml b/app/src/main/res/drawable/back.xml new file mode 100644 index 0000000..31e7df2 --- /dev/null +++ b/app/src/main/res/drawable/back.xml @@ -0,0 +1,5 @@ + + + diff --git a/app/src/main/res/drawable/backarrow.xml b/app/src/main/res/drawable/backarrow.xml new file mode 100644 index 0000000..d05da6a --- /dev/null +++ b/app/src/main/res/drawable/backarrow.xml @@ -0,0 +1,5 @@ + + + diff --git a/app/src/main/res/drawable/backround.xml b/app/src/main/res/drawable/backround.xml new file mode 100644 index 0000000..51aeba2 --- /dev/null +++ b/app/src/main/res/drawable/backround.xml @@ -0,0 +1,12 @@ + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/bottom_bar.xml b/app/src/main/res/drawable/bottom_bar.xml new file mode 100644 index 0000000..260cfa1 --- /dev/null +++ b/app/src/main/res/drawable/bottom_bar.xml @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/bottom_sheet.xml b/app/src/main/res/drawable/bottom_sheet.xml index 190b6c5..363a5bd 100644 --- a/app/src/main/res/drawable/bottom_sheet.xml +++ b/app/src/main/res/drawable/bottom_sheet.xml @@ -5,8 +5,8 @@ - + diff --git a/app/src/main/res/drawable/close_sheet.xml b/app/src/main/res/drawable/close_sheet.xml index afbe22d..3dbfedb 100644 --- a/app/src/main/res/drawable/close_sheet.xml +++ b/app/src/main/res/drawable/close_sheet.xml @@ -1,5 +1,5 @@ - - + diff --git a/app/src/main/res/drawable/downs.png b/app/src/main/res/drawable/downs.png new file mode 100644 index 0000000..f9efc48 Binary files /dev/null and b/app/src/main/res/drawable/downs.png differ diff --git a/app/src/main/res/drawable/expenses.png b/app/src/main/res/drawable/expenses.png new file mode 100644 index 0000000..3f6b529 Binary files /dev/null and b/app/src/main/res/drawable/expenses.png differ diff --git a/app/src/main/res/drawable/expensesline.png b/app/src/main/res/drawable/expensesline.png new file mode 100644 index 0000000..35c5b2f Binary files /dev/null and b/app/src/main/res/drawable/expensesline.png differ diff --git a/app/src/main/res/drawable/first.png b/app/src/main/res/drawable/first.png new file mode 100644 index 0000000..170bd7f Binary files /dev/null and b/app/src/main/res/drawable/first.png differ diff --git a/app/src/main/res/drawable/home_background.xml b/app/src/main/res/drawable/home_background.xml deleted file mode 100644 index e7fe5f1..0000000 --- a/app/src/main/res/drawable/home_background.xml +++ /dev/null @@ -1,19 +0,0 @@ - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/app/src/main/res/drawable/income.png b/app/src/main/res/drawable/income.png new file mode 100644 index 0000000..c7f1610 Binary files /dev/null and b/app/src/main/res/drawable/income.png differ diff --git a/app/src/main/res/drawable/income.xml b/app/src/main/res/drawable/income.xml deleted file mode 100644 index 96e8e44..0000000 --- a/app/src/main/res/drawable/income.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - diff --git a/app/src/main/res/drawable/incomeline.png b/app/src/main/res/drawable/incomeline.png new file mode 100644 index 0000000..47dbdb0 Binary files /dev/null and b/app/src/main/res/drawable/incomeline.png differ diff --git a/app/src/main/res/drawable/lines.png b/app/src/main/res/drawable/lines.png deleted file mode 100644 index 52c84a0..0000000 Binary files a/app/src/main/res/drawable/lines.png and /dev/null differ diff --git a/app/src/main/res/drawable/logo.png b/app/src/main/res/drawable/logo.png new file mode 100644 index 0000000..730fe7d Binary files /dev/null and b/app/src/main/res/drawable/logo.png differ diff --git a/app/src/main/res/drawable/next.xml b/app/src/main/res/drawable/next.xml new file mode 100644 index 0000000..2307228 --- /dev/null +++ b/app/src/main/res/drawable/next.xml @@ -0,0 +1,5 @@ + + + diff --git a/app/src/main/res/drawable/notification.png b/app/src/main/res/drawable/notification.png new file mode 100644 index 0000000..898a2c9 Binary files /dev/null and b/app/src/main/res/drawable/notification.png differ diff --git a/app/src/main/res/drawable/onbording_button.xml b/app/src/main/res/drawable/onbording_button.xml new file mode 100644 index 0000000..aa86241 --- /dev/null +++ b/app/src/main/res/drawable/onbording_button.xml @@ -0,0 +1,11 @@ + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/playicon.png b/app/src/main/res/drawable/playicon.png new file mode 100644 index 0000000..7bc18c9 Binary files /dev/null and b/app/src/main/res/drawable/playicon.png differ diff --git a/app/src/main/res/drawable/raundicon.png b/app/src/main/res/drawable/raundicon.png new file mode 100644 index 0000000..c39341b Binary files /dev/null and b/app/src/main/res/drawable/raundicon.png differ diff --git a/app/src/main/res/drawable/sadas.png b/app/src/main/res/drawable/sadas.png new file mode 100644 index 0000000..1edc03a Binary files /dev/null and b/app/src/main/res/drawable/sadas.png differ diff --git a/app/src/main/res/drawable/second.png b/app/src/main/res/drawable/second.png new file mode 100644 index 0000000..7cd4325 Binary files /dev/null and b/app/src/main/res/drawable/second.png differ diff --git a/app/src/main/res/drawable/selected_tab.xml b/app/src/main/res/drawable/selected_tab.xml new file mode 100644 index 0000000..08fcfc7 --- /dev/null +++ b/app/src/main/res/drawable/selected_tab.xml @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/third.png b/app/src/main/res/drawable/third.png new file mode 100644 index 0000000..24feb76 Binary files /dev/null and b/app/src/main/res/drawable/third.png differ diff --git a/app/src/main/res/drawable/total.xml b/app/src/main/res/drawable/total.xml deleted file mode 100644 index 279e003..0000000 --- a/app/src/main/res/drawable/total.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - diff --git a/app/src/main/res/drawable/totalbalance.png b/app/src/main/res/drawable/totalbalance.png new file mode 100644 index 0000000..bfdbcf1 Binary files /dev/null and b/app/src/main/res/drawable/totalbalance.png differ diff --git a/app/src/main/res/drawable/update.xml b/app/src/main/res/drawable/update.xml new file mode 100644 index 0000000..8f28d70 --- /dev/null +++ b/app/src/main/res/drawable/update.xml @@ -0,0 +1,5 @@ + + + diff --git a/app/src/main/res/drawable/ups.png b/app/src/main/res/drawable/ups.png new file mode 100644 index 0000000..f6e077e Binary files /dev/null and b/app/src/main/res/drawable/ups.png differ diff --git a/app/src/main/res/layout/activity_home.xml b/app/src/main/res/layout/activity_home.xml index e94738d..e7a7e74 100644 --- a/app/src/main/res/layout/activity_home.xml +++ b/app/src/main/res/layout/activity_home.xml @@ -7,14 +7,15 @@ android:layout_height="match_parent" > - - + - + - + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/crypto_layout.xml b/app/src/main/res/layout/crypto_layout.xml index 5a34242..1908767 100644 --- a/app/src/main/res/layout/crypto_layout.xml +++ b/app/src/main/res/layout/crypto_layout.xml @@ -7,11 +7,14 @@ @@ -24,82 +27,88 @@ android:id="@+id/price" android:layout_width="wrap_content" android:layout_height="wrap_content" - android:layout_marginTop="32dp" - android:layout_marginEnd="160dp" - android:layout_marginBottom="32dp" - android:text="TextView" - android:textSize="12sp" + android:layout_marginEnd="40dp" + android:text="@string/cryptoPrice" android:textColor="@color/black" + android:textSize="12sp" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintEnd_toEndOf="parent" + app:layout_constraintHorizontal_bias="0.724" + app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toTopOf="parent" - app:layout_constraintVertical_bias="0.0" /> + app:layout_constraintVertical_bias="0.507" /> + app:layout_constraintVertical_bias="0.375" /> - - + app:layout_constraintVertical_bias="0.574" /> - + app:layout_constraintVertical_bias="0.504"> - + + + + + + app:layout_constraintTop_toTopOf="parent" + app:srcCompat="@drawable/downs" /> diff --git a/app/src/main/res/layout/dialog_balance.xml b/app/src/main/res/layout/dialog_balance.xml index 2d5e61f..1690c9d 100644 --- a/app/src/main/res/layout/dialog_balance.xml +++ b/app/src/main/res/layout/dialog_balance.xml @@ -2,15 +2,18 @@ + android:layout_height="wrap_content" + android:layout_marginTop="150dp"> + android:layout_height="380dp"> - - - + app:srcCompat="@drawable/back" + tools:ignore="SpeakableTextPresentCheck" /> + + + + + + - android:text="Congratulations, Your Wallet Balance is Very Hıgh" + + + + + + + + + + + + app:layout_constraintTop_toBottomOf="@+id/productdesc" /> + + \ No newline at end of file diff --git a/app/src/main/res/layout/dropdown.xml b/app/src/main/res/layout/dropdown.xml new file mode 100644 index 0000000..86aef06 --- /dev/null +++ b/app/src/main/res/layout/dropdown.xml @@ -0,0 +1,15 @@ + + + \ No newline at end of file diff --git a/app/src/main/res/layout/expanse_item.xml b/app/src/main/res/layout/expanse_item.xml new file mode 100644 index 0000000..1c9d079 --- /dev/null +++ b/app/src/main/res/layout/expanse_item.xml @@ -0,0 +1,107 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_bottom_bill.xml b/app/src/main/res/layout/fragment_bottom_bill.xml deleted file mode 100644 index cf7766d..0000000 --- a/app/src/main/res/layout/fragment_bottom_bill.xml +++ /dev/null @@ -1,55 +0,0 @@ - - - - - - - - - - \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_bottom_sheet.xml b/app/src/main/res/layout/fragment_bottom_sheet.xml index 8efcceb..7d6a325 100644 --- a/app/src/main/res/layout/fragment_bottom_sheet.xml +++ b/app/src/main/res/layout/fragment_bottom_sheet.xml @@ -1,5 +1,5 @@ - @@ -34,45 +32,83 @@ + /> + + + + + + + app:layout_constraintStart_toStartOf="parent"> @@ -82,18 +118,17 @@ android:id="@+id/productdesc" android:layout_width="match_parent" android:layout_height="wrap_content" - android:hint="Descripsion" - android:paddingLeft="10sp" - android:paddingRight="10sp" + android:hint="@string/descripsion_sheet" + android:layout_marginTop="8dp" + android:padding="5dp" android:textColorHint="@color/black" - app:boxCornerRadiusBottomEnd="10sp" + app:boxCornerRadiusBottomEnd="8sp" app:boxCornerRadiusBottomStart="8sp" app:boxCornerRadiusTopEnd="8sp" app:boxCornerRadiusTopStart="8sp" app:boxStrokeWidth="0sp" - app:counterEnabled="true" - app:counterMaxLength="20" - app:hintTextColor="#000000" + app:hintTextColor="@color/black" + app:boxStrokeColor="@color/blue" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toBottomOf="@+id/transactionAmount"> @@ -102,9 +137,9 @@ android:id="@+id/transactionDesc" android:layout_width="match_parent" android:layout_height="wrap_content" - android:layout_marginStart="20sp" - android:layout_marginEnd="20sp" - android:backgroundTint="#FFFFFF" + android:layout_marginStart="12sp" + android:layout_marginEnd="12sp" + android:backgroundTint="@color/white" android:textColor="@color/black" android:textSize="12sp" app:counterMaxLength="20" /> @@ -119,14 +154,20 @@ android:orientation="vertical" app:layout_constraintTop_toBottomOf="@+id/productdesc"> -