From a25cc92cfc7dbd717be875eb323bd7e04ed2960b Mon Sep 17 00:00:00 2001 From: Shahryar Khosravi <36692416+5hahryar@users.noreply.github.com> Date: Tue, 27 Oct 2020 12:40:43 +0330 Subject: [PATCH 1/7] Swipe to delete implementation --- .../com/sloupycom/shaper/database/LocalDao.kt | 8 +++--- .../model/adapter/SwipeToDeleteCallBack.kt | 23 +++++++++++++++ .../shaper/model/adapter/TaskAdapter.kt | 20 ++++++++++++- .../com/sloupycom/shaper/view/MainActivity.kt | 28 +++++++++++++++++-- .../shaper/viewmodel/MainActivityViewModel.kt | 14 ++++++++++ app/src/main/res/values/strings.xml | 2 ++ 6 files changed, 88 insertions(+), 7 deletions(-) create mode 100644 app/src/main/java/com/sloupycom/shaper/model/adapter/SwipeToDeleteCallBack.kt diff --git a/app/src/main/java/com/sloupycom/shaper/database/LocalDao.kt b/app/src/main/java/com/sloupycom/shaper/database/LocalDao.kt index fa85db5..e1b3840 100644 --- a/app/src/main/java/com/sloupycom/shaper/database/LocalDao.kt +++ b/app/src/main/java/com/sloupycom/shaper/database/LocalDao.kt @@ -1,10 +1,7 @@ package com.sloupycom.shaper.database import androidx.lifecycle.LiveData -import androidx.room.Dao -import androidx.room.Insert -import androidx.room.Query -import androidx.room.Update +import androidx.room.* import com.sloupycom.shaper.model.Task @Dao @@ -16,6 +13,9 @@ interface LocalDao { @Update suspend fun update(task: Task) + @Delete + suspend fun delete(task: Task) + @Query ("SELECT * FROM task_table") fun getAllTasks(): LiveData>? diff --git a/app/src/main/java/com/sloupycom/shaper/model/adapter/SwipeToDeleteCallBack.kt b/app/src/main/java/com/sloupycom/shaper/model/adapter/SwipeToDeleteCallBack.kt new file mode 100644 index 0000000..c0dd225 --- /dev/null +++ b/app/src/main/java/com/sloupycom/shaper/model/adapter/SwipeToDeleteCallBack.kt @@ -0,0 +1,23 @@ +package com.sloupycom.shaper.model.adapter + +import androidx.recyclerview.widget.ItemTouchHelper +import androidx.recyclerview.widget.RecyclerView + +class SwipeToDeleteCallBack(private val adapter: TaskAdapter): ItemTouchHelper.SimpleCallback( + 0, + ItemTouchHelper.LEFT or ItemTouchHelper.RIGHT +) { + + override fun onMove( + recyclerView: RecyclerView, + viewHolder: RecyclerView.ViewHolder, + target: RecyclerView.ViewHolder + ): Boolean { + return true + } + + override fun onSwiped(viewHolder: RecyclerView.ViewHolder, direction: Int) { + //Delete item on swipe + adapter.deleteItem(viewHolder.adapterPosition) + } +} \ No newline at end of file diff --git a/app/src/main/java/com/sloupycom/shaper/model/adapter/TaskAdapter.kt b/app/src/main/java/com/sloupycom/shaper/model/adapter/TaskAdapter.kt index fe34113..91a62fe 100644 --- a/app/src/main/java/com/sloupycom/shaper/model/adapter/TaskAdapter.kt +++ b/app/src/main/java/com/sloupycom/shaper/model/adapter/TaskAdapter.kt @@ -20,8 +20,10 @@ class TaskAdapter( private val mUtil: Util = Util() private var listener: TaskStateListener? = null + private var recentDeletedItemPostition: Int? = null + private var recentDeletedItem: Task? = null - var data: List = mutableListOf() + var data: MutableList = mutableListOf() set(value) { field = value notifyDataSetChanged() @@ -94,7 +96,23 @@ class TaskAdapter( this.listener = listener } + fun deleteItem(position: Int) { + recentDeletedItem = data[position] + recentDeletedItemPostition = position + listener?.onTaskItemDeleted(recentDeletedItem!!) + data.drop(recentDeletedItemPostition!!) + notifyItemRemoved(recentDeletedItemPostition!!) + } + + fun undoRemove() { + listener?.onTaskItemDeleteUndo(recentDeletedItem!!) + data.add(recentDeletedItemPostition!!, recentDeletedItem!!) + notifyItemInserted(recentDeletedItemPostition!!) + } + interface TaskStateListener { fun onTaskStateChanged(task: Task) + fun onTaskItemDeleted(task: Task) + fun onTaskItemDeleteUndo(task: Task) } } \ No newline at end of file diff --git a/app/src/main/java/com/sloupycom/shaper/view/MainActivity.kt b/app/src/main/java/com/sloupycom/shaper/view/MainActivity.kt index 4d04628..f3026fd 100644 --- a/app/src/main/java/com/sloupycom/shaper/view/MainActivity.kt +++ b/app/src/main/java/com/sloupycom/shaper/view/MainActivity.kt @@ -4,12 +4,15 @@ import android.os.Bundle import android.view.View import androidx.appcompat.app.AppCompatActivity import androidx.databinding.DataBindingUtil +import androidx.recyclerview.widget.ItemTouchHelper import androidx.recyclerview.widget.RecyclerView +import com.google.android.material.snackbar.Snackbar import com.shahryar.daybar.DayBar import com.shahryar.daybar.DayBarChip import com.sloupycom.shaper.R import com.sloupycom.shaper.databinding.ActivityMainBinding import com.sloupycom.shaper.model.Task +import com.sloupycom.shaper.model.adapter.SwipeToDeleteCallBack import com.sloupycom.shaper.model.adapter.TaskAdapter import com.sloupycom.shaper.utils.Util import com.sloupycom.shaper.viewmodel.MainActivityViewModel @@ -37,19 +40,30 @@ class MainActivity : AppCompatActivity(), DayBar.OnDayChangedListener { mBinding?.viewModel?.busyDays?.observe(this, { dayBar.setIndicationByDay(Util().getDayListFromDateIndex(it)) + //TODO: issue -> Indication is not removed when busyDay is removed }) } private fun setupRecyclerView() { - -// adapter.setHasStableIds(true) recyclerView_todayDue.adapter = adapter + //Setup on item swipe listener + ItemTouchHelper(SwipeToDeleteCallBack(adapter)).attachToRecyclerView(recyclerView_todayDue) + adapter.setOnTaskStateListener(object : TaskAdapter.TaskStateListener { override fun onTaskStateChanged(task: Task) { mBinding?.viewModel?.onTaskStateChanged(task) } + + override fun onTaskItemDeleted(task: Task) { + mBinding?.viewModel?.deleteTaskItem(task) + showItemDeletedSnackBar() + } + + override fun onTaskItemDeleteUndo(task: Task) { + mBinding?.viewModel?.undoDeleteTaskItem(task) + } }) //Observe liveData in order to update recyclerView @@ -92,6 +106,16 @@ class MainActivity : AppCompatActivity(), DayBar.OnDayChangedListener { } } + private fun showItemDeletedSnackBar() { + Snackbar.make(floatingActionButton, getText(R.string.delete_task), Snackbar.LENGTH_SHORT) + .setAnchorView(floatingActionButton) + .setBackgroundTint(getColor(R.color.colorSecondary)) + .setTextColor(getColor(R.color.colorOnSecondary)) + .setAction(getString(R.string.undo)) { adapter.undoRemove() } + .setActionTextColor(getColor(R.color.colorOnSecondary)) + .show() + } + /** * Called when selected day from DayBar changes */ diff --git a/app/src/main/java/com/sloupycom/shaper/viewmodel/MainActivityViewModel.kt b/app/src/main/java/com/sloupycom/shaper/viewmodel/MainActivityViewModel.kt index 4c48d28..15441d0 100644 --- a/app/src/main/java/com/sloupycom/shaper/viewmodel/MainActivityViewModel.kt +++ b/app/src/main/java/com/sloupycom/shaper/viewmodel/MainActivityViewModel.kt @@ -3,10 +3,12 @@ package com.sloupycom.shaper.viewmodel import android.app.Application import androidx.databinding.ObservableField import androidx.lifecycle.* +import com.google.android.material.snackbar.Snackbar import com.sloupycom.shaper.database.Local import com.sloupycom.shaper.model.Task import com.sloupycom.shaper.utils.Util import kotlinx.coroutines.launch +import kotlinx.coroutines.runBlocking import java.util.* @@ -60,4 +62,16 @@ class MainActivityViewModel(application: Application) : AndroidViewModel(applica } } + + fun deleteTaskItem(task: Task) { + viewModelScope.launch { + mLocal.localDao.delete(task) + } + } + + fun undoDeleteTaskItem(task: Task) { + viewModelScope.launch { + mLocal.localDao.insert(task) + } + } } \ No newline at end of file diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 8e11130..7bc3d60 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -34,4 +34,6 @@ New task added successfully. Separator Question mark + Task removed successfully. + Undo \ No newline at end of file From f3891527d68d410e543997b58887e5145fbd6ca3 Mon Sep 17 00:00:00 2001 From: Shahryar Khosravi <36692416+5hahryar@users.noreply.github.com> Date: Tue, 27 Oct 2020 12:51:51 +0330 Subject: [PATCH 2/7] Version in support dialog --- app/src/main/res/layout/dialog_support.xml | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/app/src/main/res/layout/dialog_support.xml b/app/src/main/res/layout/dialog_support.xml index ccdd29b..4c5f592 100644 --- a/app/src/main/res/layout/dialog_support.xml +++ b/app/src/main/res/layout/dialog_support.xml @@ -29,4 +29,14 @@ android:gravity="center" android:text="@string/support_repo"/> + + \ No newline at end of file From db11006ba0775d9ec95c529eab477b5ea8dd7aa8 Mon Sep 17 00:00:00 2001 From: Shahryar Khosravi <36692416+5hahryar@users.noreply.github.com> Date: Fri, 30 Oct 2020 21:27:58 +0330 Subject: [PATCH 3/7] DateIndex format changes --- .idea/gradle.xml | 1 + app/build.gradle | 4 ++-- .../java/com/sloupycom/shaper/database/LocalDao.kt | 4 ++-- .../main/java/com/sloupycom/shaper/utils/Util.kt | 9 ++++----- .../sloupycom/shaper/viewmodel/AddTaskViewModel.kt | 14 +++++++------- .../shaper/viewmodel/MainActivityViewModel.kt | 2 +- app/src/main/res/layout/dialog_support.xml | 2 +- 7 files changed, 18 insertions(+), 18 deletions(-) diff --git a/.idea/gradle.xml b/.idea/gradle.xml index 23a89bb..b617266 100644 --- a/.idea/gradle.xml +++ b/.idea/gradle.xml @@ -5,6 +5,7 @@