Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
22 commits
Select commit Hold shift + click to select a range
d4ca513
Изменила часть кнопок
olyaapg May 16, 2023
98fb9f2
Merge remote-tracking branch 'origin/draft' into draft
olyaapg May 16, 2023
abdb5b2
Обработка ошибок при регистрации, копирование id пользователя по долг…
May 22, 2023
7d1c01f
Продление access токена. Исправил нижнюю панель навигации
May 22, 2023
382d52c
Продление токена, фильтрация групп
May 22, 2023
07e918f
Удаление и архивирование группы
May 22, 2023
efcbaa1
Добавил вывод трат по страницам
May 22, 2023
80b301c
Добавила дизайн архивных/активных групп в списке всех групп
olyaapg May 23, 2023
8987163
Разные ячейки для трат, удаление траты, пользователя, исправил баг с …
May 23, 2023
0096978
Переход на Material 3, кнопки удаления и архивирования группы, кнопка…
olyaapg May 23, 2023
15de504
Починил уведомления. Сделал обновления списка трат после выбора даты
May 24, 2023
e68d994
Удалила лишнее
olyaapg May 24, 2023
e900c27
Починка багов, немного нового функционала
May 25, 2023
4ea5cd5
Добавил шаблон для ввода id пользователя
May 25, 2023
46d5875
Поменяла иконку у Notifications в bottom_menu,в группах подправила ди…
olyaapg May 25, 2023
3e52f00
Merge remote-tracking branch 'origin/draft' into draft
olyaapg May 25, 2023
7eafc6f
Подправила дизайн
olyaapg May 25, 2023
66c3111
Добавила иконку для уведов,поправила notifications страницу, поменяла…
olyaapg May 27, 2023
830fce8
Убрал много недочётов и багов
May 27, 2023
680b10b
Подправил время при фильтрации, переход к удалённой трате
May 29, 2023
af7d767
Пофиксил небольшие недочёты
May 29, 2023
1e212f2
Убрал лишний запрос
May 30, 2023
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 7 additions & 1 deletion app/build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -33,6 +33,7 @@ android {
}
}
compileOptions {
coreLibraryDesugaringEnabled true
sourceCompatibility JavaVersion.VERSION_11
targetCompatibility JavaVersion.VERSION_11
}
Expand Down Expand Up @@ -77,7 +78,7 @@ dependencies {
implementation 'androidx.lifecycle:lifecycle-viewmodel-ktx:2.5.1'

//security
implementation "androidx.security:security-crypto:1.1.0-alpha05"
implementation "androidx.security:security-crypto:1.1.0-alpha06"

// Import the Firebase BoM
implementation platform('com.google.firebase:firebase-bom:31.3.0')
Expand All @@ -89,6 +90,11 @@ dependencies {
//Hilt
implementation "com.google.dagger:hilt-android:2.44"
kapt "com.google.dagger:hilt-compiler:2.44"

//Time
coreLibraryDesugaring 'com.android.tools:desugar_jdk_libs:2.0.3'

implementation "ru.tinkoff.decoro:decoro:1.1.1"
}
kapt {
correctErrorTypes true
Expand Down
2 changes: 1 addition & 1 deletion app/src/main/AndroidManifest.xml
Original file line number Diff line number Diff line change
Expand Up @@ -41,7 +41,7 @@
</service>
<meta-data
android:name="com.google.firebase.messaging.default_notification_icon"
android:resource="@drawable/ic_launcher_foreground" />
android:resource="@drawable/ic_logo" />
<meta-data
android:name="preloaded_fonts"
android:resource="@array/preloaded_fonts" />
Expand Down
1 change: 1 addition & 0 deletions app/src/main/java/ru/nsu/fit/modao/MasterActivity.kt
Original file line number Diff line number Diff line change
Expand Up @@ -30,4 +30,5 @@ class MasterActivity: AppCompatActivity() {
return@setOnItemSelectedListener true
}
}

}
142 changes: 115 additions & 27 deletions app/src/main/java/ru/nsu/fit/modao/adapter/ExpensesAdapter.kt
Original file line number Diff line number Diff line change
Expand Up @@ -6,33 +6,89 @@ import android.view.View
import android.view.ViewGroup
import androidx.recyclerview.widget.RecyclerView
import ru.nsu.fit.modao.R
import ru.nsu.fit.modao.databinding.CounterEventItemBinding
import ru.nsu.fit.modao.databinding.DeletedEventItemBinding
import ru.nsu.fit.modao.databinding.ExpenseItemBinding
import ru.nsu.fit.modao.databinding.TransferItemBinding
import ru.nsu.fit.modao.models.Currency
import ru.nsu.fit.modao.models.Expense
import ru.nsu.fit.modao.models.ExpenseListItem
import ru.nsu.fit.modao.models.LoadItems

class ExpensesAdapter: RecyclerView.Adapter<RecyclerView.ViewHolder>() {
private var expensesList: Array<ExpenseListItem> = arrayOf()
private var expensesList: MutableList<ExpenseListItem> = mutableListOf()
private lateinit var listener: AdapterListener<ExpenseListItem>
companion object {
const val EXPENSE = 0
const val LOAD = 1
const val TRANSFER = 1
const val DELETED = 2
const val DELETING = 3
const val LOAD = 4
}
fun attachListener(listener: AdapterListener<ExpenseListItem>){
this.listener = listener
}
fun setList(list: Array<ExpenseListItem>){
expensesList = list
expensesList = list.toMutableList()
notifyDataSetChanged()
}
fun addItems(list: Array<ExpenseListItem>) {
val size = expensesList.size
expensesList.addAll(list)
notifyItemRangeChanged(size, list.size)
}

override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): RecyclerView.ViewHolder {
val inflater = LayoutInflater.from(parent.context)

return when (viewType) {
EXPENSE -> ExpensesHolder(inflater.inflate(R.layout.expense_item, parent, false))
TRANSFER -> TransferHolder(inflater.inflate(R.layout.transfer_item, parent, false))
DELETED -> DeletedEventHolder(inflater.inflate(R.layout.deleted_event_item, parent, false))
DELETING -> CounterEventHolder(inflater.inflate(R.layout.counter_event_item, parent, false))
LOAD -> LoadHolder(inflater.inflate(R.layout.empty_item, parent, false))
else -> throw IllegalArgumentException("Illegal view type: $viewType")
}
}

override fun onBindViewHolder(holder: RecyclerView.ViewHolder, position: Int) {
when (holder) {
is ExpensesHolder -> holder.bind(expensesList[position] as Expense, listener)
is TransferHolder -> holder.bind(expensesList[position] as Expense, listener)
is DeletedEventHolder -> holder.bind(expensesList[position] as Expense, listener)
is CounterEventHolder -> holder.bind(expensesList[position] as Expense, listener)
is LoadHolder -> holder.bind(expensesList[position] as LoadItems, listener)
}

}

override fun getItemViewType(position: Int): Int {
return when (expensesList[position]) {
is Expense -> {
val expense = expensesList[position] as Expense

when (expense.status) {
0 -> if (expense.type == 0) EXPENSE else TRANSFER
1 -> if (expense.type == 0) EXPENSE else TRANSFER
-2 -> DELETING
-1 -> DELETED
else -> throw IllegalArgumentException("status ${expense.status}")
}
}
is LoadItems -> LOAD
}
}

override fun getItemCount(): Int {
return expensesList.size
}
class LoadHolder(item: View): RecyclerView.ViewHolder(item) {
fun bind(load: LoadItems, listener: AdapterListener<ExpenseListItem>) {
listener.onClickItem(load)
}
}
class ExpensesHolder(item: View): RecyclerView.ViewHolder(item){
val binding = ExpenseItemBinding.bind(item)
class DeletedEventHolder(item: View): RecyclerView.ViewHolder(item) {
val binding = DeletedEventItemBinding.bind(item)
fun bind(expense: Expense, listener: AdapterListener<ExpenseListItem>) = with(binding){
shortInfo.text = expense.name
amountExpense.text = expense.price.toString()
Expand All @@ -51,33 +107,65 @@ class ExpensesAdapter: RecyclerView.Adapter<RecyclerView.ViewHolder>() {
}
}
}

override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): RecyclerView.ViewHolder {
val inflater = LayoutInflater.from(parent.context)
return when (viewType) {
EXPENSE -> ExpensesHolder(inflater.inflate(R.layout.expense_item, parent, false))
LOAD -> LoadHolder(inflater.inflate(R.layout.empty_item, parent, false))
else -> throw IllegalArgumentException("Illegal view type: $viewType")
class CounterEventHolder(item: View): RecyclerView.ViewHolder(item) {
val binding = CounterEventItemBinding.bind(item)
fun bind(expense: Expense, listener: AdapterListener<ExpenseListItem>) = with(binding){
shortInfo.text = expense.name
amountExpense.text = expense.price.toString()
if (expense.price!! > 0){
if (expense.currency == Currency.RUB){
currencyImage.setImageResource(R.drawable.ic_profit_rub)
}
} else {
if (expense.currency == Currency.RUB) {
currencyImage.setImageResource(R.drawable.ic_loss_rub)
amountExpense.setTextColor(Color.parseColor("#D46E6E"))
}
}
root.setOnClickListener {
listener.onClickItem(expense)
}
}
}

override fun onBindViewHolder(holder: RecyclerView.ViewHolder, position: Int) {
when (holder) {
is ExpensesHolder -> holder.bind(expensesList[position] as Expense, listener)
is LoadHolder -> holder.bind(expensesList[position] as LoadItems, listener)
class TransferHolder(item: View): RecyclerView.ViewHolder(item) {
val binding = TransferItemBinding.bind(item)
fun bind(expense: Expense, listener: AdapterListener<ExpenseListItem>) = with(binding){
shortInfo.text = expense.name
amountExpense.text = expense.price.toString()
if (expense.price!! > 0){
if (expense.currency == Currency.RUB){
currencyImage.setImageResource(R.drawable.ic_profit_rub)
}
} else {
if (expense.currency == Currency.RUB) {
currencyImage.setImageResource(R.drawable.ic_loss_rub)
amountExpense.setTextColor(Color.parseColor("#D46E6E"))
}
}
root.setOnClickListener {
listener.onClickItem(expense)
}
}

}

override fun getItemViewType(position: Int): Int {
return when (expensesList[position]) {
is Expense -> EXPENSE
is LoadItems -> LOAD
class ExpensesHolder(item: View): RecyclerView.ViewHolder(item){
val binding = ExpenseItemBinding.bind(item)
fun bind(expense: Expense, listener: AdapterListener<ExpenseListItem>) = with(binding){
shortInfo.text = expense.name
amountExpense.text = expense.price.toString()
if (expense.price!! > 0){
if (expense.currency == Currency.RUB){
currencyImage.setImageResource(R.drawable.ic_profit_rub)
}
} else {
if (expense.currency == Currency.RUB) {
currencyImage.setImageResource(R.drawable.ic_loss_rub)
amountExpense.setTextColor(Color.parseColor("#D46E6E"))
}
}
root.setOnClickListener {
listener.onClickItem(expense)
}
}
}

override fun getItemCount(): Int {
return expensesList.size
}

}
11 changes: 5 additions & 6 deletions app/src/main/java/ru/nsu/fit/modao/adapter/FriendsAdapter.java
Original file line number Diff line number Diff line change
Expand Up @@ -3,12 +3,12 @@
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.TextView;

import androidx.annotation.NonNull;
import androidx.recyclerview.widget.RecyclerView;

import com.google.android.material.button.MaterialButton;

import ru.nsu.fit.modao.R;
import ru.nsu.fit.modao.models.User;

Expand Down Expand Up @@ -46,10 +46,9 @@ public static final class FriendsHolder extends RecyclerView.ViewHolder {
View itemView;

public void bind(User friend, AdapterListener<User> listener) {
ImageView imageView = itemView.findViewById(R.id.friendItem);
imageView.setOnClickListener(v -> listener.onClickItem(friend));
TextView textView = itemView.findViewById(R.id.nameFriends);
textView.setText(friend.getUsername());
MaterialButton cell = itemView.findViewById(R.id.friendItem);
cell.setOnClickListener(v -> listener.onClickItem(friend));
cell.setText(friend.getUsername());
}

public FriendsHolder(@NonNull View itemView) {
Expand Down
62 changes: 47 additions & 15 deletions app/src/main/java/ru/nsu/fit/modao/adapter/GroupAdapter.kt
Original file line number Diff line number Diff line change
@@ -1,46 +1,78 @@
package ru.nsu.fit.modao.adapter

import android.util.Log
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import androidx.recyclerview.widget.RecyclerView
import ru.nsu.fit.modao.R
import ru.nsu.fit.modao.databinding.GroupItemArchiveBinding
import ru.nsu.fit.modao.databinding.GroupItemBinding
import ru.nsu.fit.modao.models.Group

class GroupAdapter: RecyclerView.Adapter<GroupAdapter.GroupHolder>() {
class GroupAdapter: RecyclerView.Adapter<RecyclerView.ViewHolder>() {
private var listener: AdapterListener<Group>? = null
private var groupsList: Array<Group> = arrayOf()

companion object {
const val ACTIVE = 0
const val ARCHIVE = 1
}
fun attachListener(listener: AdapterListener<Group>){
this.listener = listener
}
fun setGroups(groupsList: Array<Group>){
this.groupsList = groupsList
notifyDataSetChanged()
}


override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): RecyclerView.ViewHolder {
val inflater = LayoutInflater.from(parent.context)
return when (viewType) {
ACTIVE -> GroupHolder(inflater.inflate(R.layout.group_item, parent, false))
ARCHIVE -> ArchiveGroupHolder(inflater.inflate(R.layout.group_item_archive, parent, false))
else -> throw IllegalArgumentException("Unknown type $viewType")
}
}

override fun onBindViewHolder(holder: RecyclerView.ViewHolder, position: Int) {
when (holder) {
is GroupHolder -> holder.bind(groupsList[position], listener!!)
is ArchiveGroupHolder -> holder.bind(groupsList[position], listener!!)
}

}

override fun getItemCount(): Int {
return groupsList.size
}

override fun getItemViewType(position: Int): Int {
return when (groupsList[position].typeGroup) {
0 -> ACTIVE
1 -> ARCHIVE
else -> throw IllegalArgumentException("Unknown type ${groupsList[position].typeGroup}")
}
}

class GroupHolder(item: View): RecyclerView.ViewHolder(item){
val binding = GroupItemBinding.bind(item)
val view = item
fun bind(group: Group, listener: AdapterListener<Group>){
binding.nameGroup.text = group.groupName
view.setOnClickListener(){
binding.nameGroup.setOnClickListener {
listener.onClickItem(group)
}
}
}

override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): GroupHolder {
val view = LayoutInflater.from(parent.context).inflate(R.layout.group_item, parent, false)
return GroupHolder(view)
}

override fun onBindViewHolder(holder: GroupHolder, position: Int) {
holder.bind(groupsList[position], listener!!)
}

override fun getItemCount(): Int {
return groupsList.size
class ArchiveGroupHolder(item: View): RecyclerView.ViewHolder(item) {
val binding = GroupItemArchiveBinding.bind(item)
val view = item
fun bind(group: Group, listener: AdapterListener<Group>){
binding.nameGroup.text = group.groupName
binding.nameGroup.setOnClickListener {
listener.onClickItem(group)
}
}
}
}
Original file line number Diff line number Diff line change
@@ -1,6 +1,5 @@
package ru.nsu.fit.modao.adapter

import android.util.Log
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
Expand Down Expand Up @@ -39,20 +38,17 @@ class NotificationFriendsAdapter: RecyclerView.Adapter<NotificationFriendsAdapte
fun bind(elem: Notification, listenerFriend: AdapterListener<Notification>,
listenerGroup: AdapterListener<Notification>){
if (elem.nameGroup != null){
binding.frameNewGroup.visibility = View.VISIBLE
binding.nameNewGroup.visibility = View.VISIBLE
binding.nameNewGroup.text = elem.nameGroup
binding.newGroup.visibility = View.VISIBLE
binding.root.setOnClickListener {
Log.d("MyTag", "Notification adapter group")
binding.nameNewGroup.setOnClickListener {
listenerGroup.onClickItem(elem)
}
} else {
binding.frameNewFriend.visibility = View.VISIBLE
binding.nameNewFriend.visibility = View.VISIBLE
binding.newFriend.visibility = View.VISIBLE
binding.nameNewFriend.text = elem.username
binding.root.setOnClickListener {
binding.nameNewFriend.setOnClickListener {
listenerFriend.onClickItem(elem)
}
}
Expand Down
Loading