Skip to content

Commit 60bcb04

Browse files
committed
Task sheet
Signed-off-by: koenidv <[email protected]>
1 parent e832daa commit 60bcb04

File tree

8 files changed

+118
-17
lines changed

8 files changed

+118
-17
lines changed

app/src/main/java/de/koenidv/sph/adapters/CompactTasksAdapter.kt

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ import de.koenidv.sph.objects.Task
2020
// Created by koenidv on 20.12.2020.
2121
class CompactTasksAdapter(private val tasks: List<Task>,
2222
private var maxSize: Int? = null,
23-
private val onClick: (postId: String) -> Unit,
23+
private val onClick: (task: Task) -> Unit,
2424
private val onTaskCheckedChanged: (task: Task, isDone: Boolean) -> Unit) :
2525
RecyclerView.Adapter<CompactTasksAdapter.ViewHolder>() {
2626

@@ -29,7 +29,7 @@ class CompactTasksAdapter(private val tasks: List<Task>,
2929
* (custom ViewHolder).
3030
*/
3131
class ViewHolder(view: View,
32-
onClick: (postId: String) -> Unit,
32+
onClick: (task: Task) -> Unit,
3333
onTaskCheckedChanged: (task: Task, isDone: Boolean) -> Unit) : RecyclerView.ViewHolder(view) {
3434
private val layout = view.findViewById<ConstraintLayout>(R.id.taskLayout)
3535
private val checkbox = view.findViewById<CheckBox>(R.id.taskCheckBox)
@@ -52,7 +52,7 @@ class CompactTasksAdapter(private val tasks: List<Task>,
5252
}
5353
}
5454
layout.setOnClickListener {
55-
currentTask?.id_post?.let {
55+
currentTask?.let {
5656
onClick(it)
5757
}
5858
}
@@ -94,6 +94,6 @@ class CompactTasksAdapter(private val tasks: List<Task>,
9494

9595
// Return the size of your dataset (invoked by the layout manager)
9696
override fun getItemCount() =
97-
if (maxSize != null && maxSize!! <= tasks.size)
97+
if (maxSize != null && maxSize!! < tasks.size)
9898
maxSize!! else tasks.size
9999
}

app/src/main/java/de/koenidv/sph/adapters/PostsAdapter.kt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -77,6 +77,7 @@ class PostsAdapter(private val posts: List<Post>,
7777
val uiBroadcast = Intent("uichange")
7878
uiBroadcast.putExtra("content", "taskDone")
7979
uiBroadcast.putExtra("taskId", it.taskId)
80+
uiBroadcast.putExtra("postId", it.id_post)
8081
uiBroadcast.putExtra("isDone", isChecked)
8182
LocalBroadcastManager.getInstance(SphPlanner.applicationContext()).sendBroadcast(uiBroadcast)
8283
}

app/src/main/java/de/koenidv/sph/adapters/TasksAdapter.kt

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ import android.widget.LinearLayout
1010
import android.widget.TextView
1111
import androidx.appcompat.app.AppCompatActivity
1212
import androidx.constraintlayout.widget.ConstraintLayout
13+
import androidx.localbroadcastmanager.content.LocalBroadcastManager
1314
import androidx.recyclerview.widget.RecyclerView
1415
import com.afollestad.materialdialogs.MaterialDialog
1516
import com.afollestad.materialdialogs.bottomsheets.BottomSheet
@@ -140,6 +141,14 @@ class TasksAdapter(private val tasks: MutableList<Task>,
140141
if (checkboxset)
141142
currentTask?.let {
142143
onTaskCheckedChanged(it, isChecked)
144+
145+
// Send broadcast to update ui
146+
val uiBroadcast = Intent("uichange")
147+
uiBroadcast.putExtra("content", "taskDone")
148+
uiBroadcast.putExtra("taskId", it.taskId)
149+
uiBroadcast.putExtra("postId", it.id_post)
150+
uiBroadcast.putExtra("isDone", isChecked)
151+
LocalBroadcastManager.getInstance(SphPlanner.applicationContext()).sendBroadcast(uiBroadcast)
143152
}
144153
}
145154
layout.setOnLongClickListener {

app/src/main/java/de/koenidv/sph/ui/HomeFragment.kt

Lines changed: 17 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -86,22 +86,28 @@ class HomeFragment : Fragment() {
8686
// Update tasks and posts list when a task is done
8787
if (intent.getStringExtra("content") == "taskDone"
8888
&& ::tasks.isInitialized) {
89+
val taskId = intent.getStringExtra("taskId")
8990
val postId = intent.getStringExtra("postId")
9091

9192
// If tasks list contains this, notify tasks aapter
92-
val taskIndex = tasks.indexOfFirst { it.id_post == postId }
93+
val taskIndex = tasks.indexOfFirst { it.taskId == taskId }
9394
if (taskIndex != -1) {
9495
tasksRecycler.adapter?.notifyItemChanged(taskIndex)
9596
} else if (!intent.getBooleanExtra("isDone", true)) {
96-
// Add task to the top of the list if it is not done and wasn't there before
97-
tasks.add(0, TasksDb.getInstance().getByPostId(postId).first())
98-
tasksRecycler.adapter?.notifyItemInserted(0)
99-
tasksRecycler.adapter?.notifyItemRemoved(5)
97+
val taskToAdd = TasksDb.getInstance().getByTaskId(taskId).firstOrNull()
98+
if (taskToAdd != null) {
99+
// Add task to the top of the list if it is not done and wasn't there before
100+
tasks.add(0, taskToAdd)
101+
tasksRecycler.adapter?.notifyItemInserted(0)
102+
tasksRecycler.adapter?.notifyItemRemoved(5)
103+
}
100104
}
101105

102-
// If posts list contains this, notify it
103-
val postIndex = posts.indexOfFirst { it.postId == postId }
104-
if (postIndex != -1) unreadPostsRecycler.adapter?.notifyItemChanged(postIndex)
106+
if (postId != null) {
107+
// If posts list contains this, notify it
108+
val postIndex = posts.indexOfFirst { it.postId == postId }
109+
if (postIndex != -1) unreadPostsRecycler.adapter?.notifyItemChanged(postIndex)
110+
}
105111
}
106112
}
107113
}
@@ -207,17 +213,16 @@ class HomeFragment : Fragment() {
207213
tasks,
208214
6,
209215
onClick = {
210-
// Show single post bottom sheet
211-
PostSheet(
212-
PostsDb.getInstance().getByPostId(it)
213-
).show(parentFragmentManager, "post")
216+
// Show single task bottom sheet
217+
TaskSheet(it).show(parentFragmentManager, "task")
214218
},
215219
onTaskCheckedChanged = AttachmentManager().onTaskCheckedChanged(requireActivity()) { task, isDone ->
216220
if (isDone) {
217221
// Update tasks dataset
218222
val index = tasks.indexOfFirst { it.taskId == task.taskId }
219223
tasks.removeAt(index)
220224
tasksRecycler.adapter?.notifyItemRemoved(index)
225+
if (tasks.size < 6) (tasksRecycler.adapter as CompactTasksAdapter)
221226
// Update overflow counter
222227
if (tasksOverflow > 0) {
223228
tasksOverflow--
Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,50 @@
1+
package de.koenidv.sph.ui
2+
3+
import android.os.Bundle
4+
import android.view.LayoutInflater
5+
import android.view.View
6+
import android.view.ViewGroup
7+
import android.widget.Button
8+
import androidx.core.os.bundleOf
9+
import androidx.navigation.Navigation
10+
import androidx.recyclerview.widget.RecyclerView
11+
import com.google.android.material.bottomsheet.BottomSheetDialogFragment
12+
import de.koenidv.sph.R
13+
import de.koenidv.sph.adapters.TasksAdapter
14+
import de.koenidv.sph.database.PostsDb
15+
import de.koenidv.sph.networking.AttachmentManager
16+
import de.koenidv.sph.objects.Task
17+
18+
// Created by koenidv on 29.12.2020.
19+
class TaskSheet internal constructor(private val task: Task) : BottomSheetDialogFragment() {
20+
21+
override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View {
22+
val view: View = inflater.inflate(R.layout.sheet_task, container, false)
23+
24+
val taskRecycler = view.findViewById<RecyclerView>(R.id.taskRecycler)
25+
val doneButton = view.findViewById<Button>(R.id.doneButton)
26+
27+
// Set up recycler view with just one item
28+
taskRecycler.adapter = TasksAdapter(
29+
mutableListOf(task),
30+
requireActivity(),
31+
onDateClick = {
32+
// Show single post bottom sheet
33+
dismiss()
34+
PostSheet(
35+
PostsDb.getInstance().getByPostId(it)
36+
).show(parentFragmentManager, "post")
37+
},
38+
onCourseClick = {
39+
dismiss()
40+
Navigation.findNavController(requireActivity(), R.id.nav_host_fragment)
41+
.navigate(R.id.overviewAction, bundleOf("courseId" to it))
42+
},
43+
onTaskCheckedChanged = AttachmentManager().onTaskCheckedChanged(requireActivity())
44+
)
45+
46+
doneButton.setOnClickListener { dismiss() }
47+
48+
return view
49+
}
50+
}

app/src/main/java/de/koenidv/sph/ui/TimetableViewFragment.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -59,7 +59,7 @@ class TimetableViewFragment : Fragment() {
5959
val onClick: (List<TimetableEntry>) -> Unit = {
6060
if (openOnClick) {
6161
Navigation.findNavController(requireActivity(), R.id.nav_host_fragment)
62-
.navigate(R.id.frag_course_overview, bundleOf("courseId" to it[0].lesson.idCourse))
62+
.navigate(R.id.overviewAction, bundleOf("courseId" to it[0].lesson.idCourse))
6363
}
6464
}
6565

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
<?xml version="1.0" encoding="utf-8"?>
2+
<androidx.core.widget.NestedScrollView xmlns:android="http://schemas.android.com/apk/res/android"
3+
xmlns:app="http://schemas.android.com/apk/res-auto"
4+
xmlns:tools="http://schemas.android.com/tools"
5+
android:layout_width="match_parent"
6+
android:layout_height="wrap_content"
7+
android:paddingTop="8dp">
8+
9+
<LinearLayout
10+
android:layout_width="match_parent"
11+
android:layout_height="match_parent"
12+
android:orientation="vertical">
13+
14+
<androidx.recyclerview.widget.RecyclerView
15+
android:id="@+id/taskRecycler"
16+
android:layout_width="match_parent"
17+
android:layout_height="wrap_content"
18+
android:nestedScrollingEnabled="false"
19+
app:layoutManager="androidx.recyclerview.widget.LinearLayoutManager"
20+
tools:itemCount="1"
21+
tools:listitem="@layout/item_task" />
22+
23+
<com.google.android.material.button.MaterialButton
24+
android:id="@+id/doneButton"
25+
style="@style/Widget.MaterialComponents.Button.TextButton"
26+
android:layout_width="match_parent"
27+
android:layout_height="wrap_content"
28+
android:text="@string/done" />
29+
30+
</LinearLayout>
31+
</androidx.core.widget.NestedScrollView>

app/src/main/res/navigation/mobile_navigation.xml

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -212,5 +212,10 @@
212212
android:name="undone"
213213
app:argType="boolean" />
214214
</fragment>
215+
<action
216+
android:id="@+id/overviewAction"
217+
app:destination="@id/frag_course_overview"
218+
app:enterAnim="@anim/popup_enter"
219+
app:exitAnim="@anim/popup_exit" />
215220

216221
</navigation>

0 commit comments

Comments
 (0)