Skip to content

Commit 022823d

Browse files
committedDec 21, 2021
added attendance manager feature
1 parent 19de4a3 commit 022823d

24 files changed

+827
-3
lines changed
 

‎.idea/gradle.xml

+1-1
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

‎.idea/misc.xml

+4
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

‎app/build.gradle

+11
Original file line numberDiff line numberDiff line change
@@ -49,4 +49,15 @@ dependencies {
4949
//navigation
5050
implementation 'androidx.navigation:navigation-fragment-ktx:2.3.5'
5151
implementation 'androidx.navigation:navigation-ui-ktx:2.3.5'
52+
//recyclerview
53+
implementation 'androidx.recyclerview:recyclerview:1.2.1'
54+
implementation "androidx.recyclerview:recyclerview-selection:1.2.0-alpha01"
55+
//room
56+
def room_version = "2.2.6"
57+
implementation "androidx.room:room-runtime:$room_version"
58+
kapt "androidx.room:room-compiler:$room_version"
59+
// optional - Kotlin Extensions and Coroutines support for Room
60+
implementation "androidx.room:room-ktx:$room_version"
61+
implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-core:1.3.2'
62+
implementation 'androidx.lifecycle:lifecycle-extensions:2.1.0'
5263
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,88 @@
1+
package net.code.gdsc_app.Attendance.Adapter
2+
3+
import android.view.LayoutInflater
4+
import android.view.View
5+
import android.view.ViewGroup
6+
import androidx.fragment.app.FragmentActivity
7+
import androidx.recyclerview.widget.DiffUtil
8+
import androidx.recyclerview.widget.ListAdapter
9+
import androidx.recyclerview.widget.RecyclerView
10+
import net.code.gdsc_app.Attendance.Database.Attendance
11+
import net.code.gdsc_app.Attendance.Database.AttendanceViewmodel
12+
import net.code.gdsc_app.databinding.ItemAttendanceBinding
13+
14+
class AttendanceAdapter(
15+
val attendanceViewmodel: AttendanceViewmodel,
16+
val parentView: View,
17+
val activity: FragmentActivity?
18+
) :
19+
ListAdapter<Attendance, AttendanceAdapter.ViewHolder>(
20+
ListDiffCallbacks()
21+
) {
22+
23+
var attendanceList = ArrayList<Attendance>()
24+
25+
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder {
26+
val layoutInflater = LayoutInflater.from(parent.context)
27+
val binding = ItemAttendanceBinding.inflate(layoutInflater, parent, false)
28+
return ViewHolder(binding)
29+
}
30+
31+
override fun onBindViewHolder(holder: ViewHolder, position: Int) {
32+
val item = getItem(position)
33+
holder.bind(item, attendanceViewmodel)
34+
// if (position == 0) {
35+
// introDelete(holder.binding.itemText)
36+
// }
37+
}
38+
39+
class ViewHolder(val binding: ItemAttendanceBinding) :
40+
RecyclerView.ViewHolder(binding.root) {
41+
42+
fun bind(item: Attendance, attendanceViewmodel: AttendanceViewmodel) {
43+
binding.subName.text = item.subject
44+
binding.went.text = item.attended.toString()
45+
binding.total.text = item.total.toString()
46+
binding.per.text = item.percentage.toString()+"%"
47+
binding.increment.setOnClickListener {
48+
item.attended += 1
49+
item.total += 1
50+
item.percentage = (item.attended * 100) / item.total
51+
attendanceViewmodel.update(item)
52+
binding.went.text = item.attended.toString()
53+
binding.total.text = item.total.toString()
54+
binding.per.text = item.percentage.toString()+"%"
55+
}
56+
binding.decrement.setOnClickListener {
57+
item.total += 1
58+
item.percentage = (item.attended * 100) / item.total
59+
attendanceViewmodel.update(item)
60+
binding.total.text = item.total.toString()
61+
binding.per.text = item.percentage.toString()+"%"
62+
}
63+
}
64+
}
65+
66+
class ListDiffCallbacks : DiffUtil.ItemCallback<Attendance>() {
67+
override fun areItemsTheSame(oldItem: Attendance, newItem: Attendance): Boolean {
68+
return oldItem.id == newItem.id
69+
}
70+
71+
override fun areContentsTheSame(oldItem: Attendance, newItem: Attendance): Boolean {
72+
return oldItem == newItem
73+
}
74+
}
75+
76+
fun getList() = attendanceList
77+
78+
fun removeitem(position: Int) {
79+
attendanceViewmodel.delete(attendanceList[position])
80+
notifyItemRemoved(position)
81+
}
82+
83+
fun restoreItem(attendance: Attendance, position: Int) {
84+
attendanceList.add(position, attendance)
85+
notifyItemChanged(position)
86+
attendanceViewmodel.insert(attendance)
87+
}
88+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
package net.code.gdsc_app.Attendance.Database
2+
3+
import androidx.room.Entity
4+
import androidx.room.PrimaryKey
5+
6+
@Entity(tableName = "attendance_manager_table")
7+
data class Attendance(
8+
@PrimaryKey(autoGenerate = true) var id: Long = 0L,
9+
var attended: Long = 0L,
10+
var total: Long = 0L,
11+
var percentage: Long = 0L,
12+
var subject: String = ""
13+
)
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
package net.code.gdsc_app.Attendance.Database
2+
3+
import androidx.lifecycle.LiveData
4+
import androidx.room.*
5+
6+
@Dao
7+
interface AttendanceDao {
8+
@Query("SELECT * FROM attendance_manager_table")
9+
fun getAllProfile(): LiveData<List<Attendance>>
10+
11+
@Insert
12+
fun insert(vararg attendance: Attendance)
13+
14+
@Delete
15+
fun delete(vararg attendance: Attendance)
16+
17+
@Update
18+
fun update(vararg attendance: Attendance)
19+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
package net.code.gdsc_app.Attendance.Database
2+
3+
import androidx.annotation.WorkerThread
4+
import androidx.lifecycle.LiveData
5+
6+
class AttendanceRepository(private val attendanceDao: AttendanceDao) {
7+
8+
val allLists: LiveData<List<Attendance>> = attendanceDao.getAllProfile()
9+
10+
@WorkerThread
11+
fun insert(attendance: Attendance) {
12+
attendanceDao.insert(attendance)
13+
}
14+
15+
@WorkerThread
16+
fun delete(attendance: Attendance) {
17+
attendanceDao.delete(attendance)
18+
}
19+
20+
@WorkerThread
21+
fun update(attendance: Attendance) {
22+
attendanceDao.update(attendance)
23+
}
24+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
package net.code.gdsc_app.Attendance.Database
2+
3+
import android.content.Context
4+
import androidx.room.Database
5+
import androidx.room.Room
6+
import androidx.room.RoomDatabase
7+
8+
@Database(entities = [Attendance::class], version = 1)
9+
abstract class AttendanceRoomDatabase : RoomDatabase() {
10+
11+
abstract fun attendanceDao(): AttendanceDao
12+
13+
companion object {
14+
@Volatile
15+
private var INSTANCE: AttendanceRoomDatabase? = null
16+
17+
fun getDatabase(context: Context): AttendanceRoomDatabase {
18+
val tempInstance = INSTANCE
19+
if (tempInstance != null) {
20+
return tempInstance
21+
}
22+
synchronized(this) {
23+
val instance = Room.databaseBuilder(
24+
context.applicationContext,
25+
AttendanceRoomDatabase::class.java,
26+
"Attendance_Database"
27+
).build()
28+
INSTANCE = instance
29+
return instance
30+
}
31+
}
32+
}
33+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
package net.code.gdsc_app.Attendance.Database
2+
3+
import android.app.Application
4+
import androidx.lifecycle.AndroidViewModel
5+
import androidx.lifecycle.LiveData
6+
import kotlinx.coroutines.CoroutineScope
7+
import kotlinx.coroutines.Dispatchers
8+
import kotlinx.coroutines.Job
9+
import kotlinx.coroutines.launch
10+
11+
class AttendanceViewmodel(application: Application) : AndroidViewModel(Application()) {
12+
13+
private var parentJob = Job()
14+
private val scope = CoroutineScope(parentJob + Dispatchers.Main)
15+
16+
private val repository: AttendanceRepository
17+
val allLists: LiveData<List<Attendance>>
18+
19+
init {
20+
val attendanceDao = AttendanceRoomDatabase.getDatabase(application).attendanceDao()
21+
repository = AttendanceRepository(attendanceDao)
22+
allLists = repository.allLists
23+
}
24+
25+
fun insert(attendance: Attendance) = scope.launch(Dispatchers.IO) {
26+
repository.insert(attendance)
27+
}
28+
29+
fun delete(attendance: Attendance) = scope.launch(Dispatchers.IO) {
30+
repository.delete(attendance)
31+
}
32+
33+
fun update(attendance: Attendance) = scope.launch(Dispatchers.IO) {
34+
repository.update(attendance)
35+
}
36+
37+
override fun onCleared() {
38+
super.onCleared()
39+
parentJob.cancel()
40+
}
41+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,48 @@
1+
package net.code.gdsc_app.ui
2+
3+
import android.os.Bundle
4+
import androidx.fragment.app.Fragment
5+
import android.view.LayoutInflater
6+
import android.view.View
7+
import android.view.ViewGroup
8+
import androidx.lifecycle.ViewModelProviders
9+
import androidx.navigation.fragment.findNavController
10+
import net.code.gdsc_app.Attendance.Database.Attendance
11+
import net.code.gdsc_app.Attendance.Database.AttendanceViewmodel
12+
import net.code.gdsc_app.R
13+
import net.code.gdsc_app.databinding.FragmentAddSubjectBinding
14+
import net.code.gdsc_app.utils.Snacker
15+
16+
@Suppress("DEPRECATION")
17+
class AddSubjectFragment : Fragment() {
18+
private lateinit var attendanceViewmodel: AttendanceViewmodel
19+
private var _binding: FragmentAddSubjectBinding? = null
20+
private val binding
21+
get() = _binding!!
22+
23+
override fun onCreateView(
24+
inflater: LayoutInflater, container: ViewGroup?,
25+
savedInstanceState: Bundle?
26+
): View? {
27+
// Inflate the layout for this fragment
28+
_binding = FragmentAddSubjectBinding.inflate(inflater, container, false)
29+
binding.addSub.setOnClickListener {
30+
attendanceViewmodel = ViewModelProviders.of(this).get(AttendanceViewmodel::class.java)
31+
if(binding.userToDoEditText.text.toString() == ""){
32+
Snacker(it,"This Field can't be empty").error()
33+
}
34+
else {
35+
val attendance = Attendance(
36+
subject = binding.userToDoEditText.text.toString(),
37+
attended = 0,
38+
total = 0,
39+
percentage = 100
40+
)
41+
attendance.id = System.currentTimeMillis()
42+
attendanceViewmodel.insert(attendance)
43+
findNavController().navigate(R.id.action_addSubjectFragment_to_attendanceManagerFragment)
44+
}
45+
}
46+
return binding.root
47+
}
48+
}

0 commit comments

Comments
 (0)
Please sign in to comment.