Skip to content

Commit

Permalink
implement followup-tasks
Browse files Browse the repository at this point in the history
  • Loading branch information
newhinton committed Feb 9, 2025
1 parent b6f66e1 commit 1cfa7b5
Show file tree
Hide file tree
Showing 6 changed files with 180 additions and 6 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -57,6 +57,10 @@ class TaskActivity : AppCompatActivity(), FolderSelectorCallback{
private lateinit var switchDeleteExcluded: Switch


private lateinit var onFailDropdown: Spinner
private lateinit var onSuccessDropdown: Spinner


private lateinit var filterOptionsButton: ImageButton


Expand Down Expand Up @@ -125,6 +129,8 @@ class TaskActivity : AppCompatActivity(), FolderSelectorCallback{
syncDescription = findViewById(R.id.descriptionSyncDirection)
filterDropdown = findViewById(R.id.task_filter_spinner)
switchDeleteExcluded = findViewById(R.id.task_exclude_delete_toggle)
onFailDropdown = findViewById(R.id.task_onFail_spinner)
onSuccessDropdown = findViewById(R.id.task_onSuccess_spinner)
fab = findViewById(R.id.saveButton)
switchWifi = findViewById(R.id.task_wifionly)
switchMD5sum = findViewById(R.id.task_md5sum)
Expand Down Expand Up @@ -161,7 +167,7 @@ class TaskActivity : AppCompatActivity(), FolderSelectorCallback{
val filter = if(filterDropdown.selectedItemPosition > 0 && filterDropdown.selectedItemPosition < filterDropdown.count) filterItems[filterDropdown.selectedItemPosition - 1] else null
showFilterMenu(filterOptionsButton, filter)
}
createNewFilterButton = findViewById<Button>(R.id.task_edit_filter_add_button)
createNewFilterButton = findViewById(R.id.task_edit_filter_add_button)
createNewFilterButton.setOnClickListener {
openFilterActivity()
}
Expand All @@ -174,16 +180,32 @@ class TaskActivity : AppCompatActivity(), FolderSelectorCallback{
prepareLocal()
prepareRemote()
prepareFilterDropdown()
prepareOnFailDropdown()
prepareOnSuccessDropdown()
}

private val remoteItems: Array<String?>
private get() {
get() {
val remotes = arrayOfNulls<String>(rcloneInstance.remotes.size)
for (i in rcloneInstance.remotes.indices) {
remotes[i] = rcloneInstance.remotes[i].name
}
return remotes
}

private val taskListWithNone: ArrayList<TaskNameIdPair>
get() {
val tasks = dbHandler.allTasks
val list = ArrayList<TaskNameIdPair>()
list.add(TaskNameIdPair(-1, "None"))
tasks.forEach{
list.add(TaskNameIdPair(it.id, it.title))
}
return list
}



private val filterItems: List<Filter>
get() {
return dbHandler.allFilters
Expand Down Expand Up @@ -230,6 +252,8 @@ class TaskActivity : AppCompatActivity(), FolderSelectorCallback{
taskToPopulate.md5sum = switchMD5sum.isChecked
taskToPopulate.deleteExcluded = switchDeleteExcluded.isChecked
taskToPopulate.filterId = if(filterDropdown.selectedItemPosition == 0) null else filterItems[filterDropdown.selectedItemPosition - 1].id
taskToPopulate.onFailFollowup = (onFailDropdown.selectedItem as TaskNameIdPair).id
taskToPopulate.onSuccessFollowup = (onSuccessDropdown.selectedItem as TaskNameIdPair).id

// Verify if data is completed
if (localPath.text.toString() == "") {
Expand Down Expand Up @@ -267,6 +291,7 @@ class TaskActivity : AppCompatActivity(), FolderSelectorCallback{
remotePath.setText(remotePathHolder)
fab.visibility = View.VISIBLE
}

private fun selectFilter(filterId: Long) {
prepareFilterDropdown()

Expand All @@ -290,6 +315,7 @@ class TaskActivity : AppCompatActivity(), FolderSelectorCallback{
}
}
}

private fun prepareRemote() {

remotePathHolder = existingTask?.remotePath.toString()
Expand Down Expand Up @@ -327,6 +353,54 @@ class TaskActivity : AppCompatActivity(), FolderSelectorCallback{
}
}
}

private fun prepareOnFailDropdown() {
onFailDropdown.adapter = ArrayAdapter(this, android.R.layout.simple_spinner_dropdown_item, taskListWithNone)
var i = 0
var found = 0
taskListWithNone.forEach{
if(it.id == (existingTask?.onFailFollowup ?: -1)) {
found = i
}
i++
}
onFailDropdown.setSelection(found)

onFailDropdown.onItemSelectedListener = object : AdapterView.OnItemSelectedListener {
override fun onItemSelected(parentView: AdapterView<*>?, selectedItemView: View, position: Int, id: Long) {
val pair = parentView?.selectedItem as TaskNameIdPair
existingTask?.onFailFollowup = pair.id
}

override fun onNothingSelected(parentView: AdapterView<*>?) {}
}
}

private fun prepareOnSuccessDropdown() {
onSuccessDropdown.adapter = ArrayAdapter(this, android.R.layout.simple_spinner_dropdown_item, taskListWithNone)
var i = 0
var found = 0
taskListWithNone.forEach{
if(it.id == (existingTask?.onSuccessFollowup ?: -1)) {
found = i
}
i++
}
onSuccessDropdown.setSelection(found)


onSuccessDropdown.onItemSelectedListener = object : AdapterView.OnItemSelectedListener {
override fun onItemSelected(parentView: AdapterView<*>?, selectedItemView: View, position: Int, id: Long) {
val pair = parentView?.selectedItem as TaskNameIdPair
existingTask?.onSuccessFollowup = pair.id
}

override fun onNothingSelected(parentView: AdapterView<*>?) {}
}
}



private fun prepareFilterDropdown() {
val filterList = filterItems.toMutableList()

Expand Down Expand Up @@ -444,4 +518,10 @@ class TaskActivity : AppCompatActivity(), FolderSelectorCallback{
const val REQUEST_CODE_FILTER = 333

}

inner class TaskNameIdPair(var id: Long, private var name: String) {
override fun toString(): String {
return name
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@ import android.content.Context
import android.database.Cursor
import android.database.sqlite.SQLiteDatabase
import android.database.sqlite.SQLiteOpenHelper
import android.util.Log
import ca.pkay.rcloneexplorer.Database.DatabaseInfo.Companion.DATABASE_NAME
import ca.pkay.rcloneexplorer.Database.DatabaseInfo.Companion.DATABASE_VERSION
import ca.pkay.rcloneexplorer.Database.DatabaseInfo.Companion.SQL_CREATE_TABLES_TASKS
Expand All @@ -14,6 +15,8 @@ import ca.pkay.rcloneexplorer.Database.DatabaseInfo.Companion.SQL_UPDATE_TASK_AD
import ca.pkay.rcloneexplorer.Database.DatabaseInfo.Companion.SQL_UPDATE_TASK_ADD_MD5
import ca.pkay.rcloneexplorer.Database.DatabaseInfo.Companion.SQL_UPDATE_TASK_ADD_WIFI
import ca.pkay.rcloneexplorer.Database.DatabaseInfo.Companion.SQL_UPDATE_TASK_ADD_FILTER_ID
import ca.pkay.rcloneexplorer.Database.DatabaseInfo.Companion.SQL_UPDATE_TASK_ADD_FOLLOWUPS_FAIL
import ca.pkay.rcloneexplorer.Database.DatabaseInfo.Companion.SQL_UPDATE_TASK_ADD_FOLLOWUPS_SUCCESS
import ca.pkay.rcloneexplorer.Database.DatabaseInfo.Companion.SQL_UPDATE_TRIGGER_ADD_TYPE
import ca.pkay.rcloneexplorer.Items.Filter
import ca.pkay.rcloneexplorer.Items.Task
Expand All @@ -32,6 +35,8 @@ class DatabaseHandler(context: Context?) :
sqLiteDatabase.execSQL(SQL_UPDATE_TRIGGER_ADD_TYPE)
sqLiteDatabase.execSQL(SQL_UPDATE_TASK_ADD_FILTER_ID)
sqLiteDatabase.execSQL(SQL_UPDATE_TASK_ADD_DELETE_EXCLUDED)
sqLiteDatabase.execSQL(SQL_UPDATE_TASK_ADD_FOLLOWUPS_FAIL)
sqLiteDatabase.execSQL(SQL_UPDATE_TASK_ADD_FOLLOWUPS_SUCCESS)
}

override fun onUpgrade(sqLiteDatabase: SQLiteDatabase, oldVersion: Int, newVersion: Int) {
Expand All @@ -50,6 +55,10 @@ class DatabaseHandler(context: Context?) :
sqLiteDatabase.execSQL(SQL_UPDATE_TASK_ADD_FILTER_ID)
sqLiteDatabase.execSQL(SQL_UPDATE_TASK_ADD_DELETE_EXCLUDED)
}
if (oldVersion < 6) {
sqLiteDatabase.execSQL(SQL_UPDATE_TASK_ADD_FOLLOWUPS_FAIL)
sqLiteDatabase.execSQL(SQL_UPDATE_TASK_ADD_FOLLOWUPS_SUCCESS)
}
}

val allTasks: List<Task>
Expand Down Expand Up @@ -121,7 +130,7 @@ class DatabaseHandler(context: Context?) :
}

private val taskProjection: Array<String>
private get() = arrayOf(
get() = arrayOf(
Task.COLUMN_NAME_ID,
Task.COLUMN_NAME_TITLE,
Task.COLUMN_NAME_REMOTE_ID,
Expand All @@ -132,7 +141,9 @@ class DatabaseHandler(context: Context?) :
Task.COLUMN_NAME_MD5SUM,
Task.COLUMN_NAME_WIFI_ONLY,
Task.COLUMN_NAME_FILTER_ID,
Task.COLUMN_NAME_DELETE_EXCLUDED
Task.COLUMN_NAME_DELETE_EXCLUDED,
Task.COLUMN_NAME_ONFAIL_FOLLOWUP,
Task.COLUMN_NAME_ONSUCCESS_FOLLOWUP
)

private fun taskFromCursor(cursor: Cursor): Task {
Expand All @@ -147,6 +158,8 @@ class DatabaseHandler(context: Context?) :
task.wifionly = getBoolean(cursor, 8)
task.filterId = cursor.getLong(9)
task.deleteExcluded = getBoolean(cursor, 10)
task.onFailFollowup = cursor.getLong(11)
task.onSuccessFollowup = cursor.getLong(12)
return task
}

Expand Down Expand Up @@ -177,6 +190,8 @@ class DatabaseHandler(context: Context?) :
values.put(Task.COLUMN_NAME_WIFI_ONLY, task.wifionly)
values.put(Task.COLUMN_NAME_FILTER_ID, task.filterId)
values.put(Task.COLUMN_NAME_DELETE_EXCLUDED, task.deleteExcluded)
values.put(Task.COLUMN_NAME_ONFAIL_FOLLOWUP, task.onFailFollowup)
values.put(Task.COLUMN_NAME_ONSUCCESS_FOLLOWUP, task.onSuccessFollowup)
return values
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@ class DatabaseInfo {
companion object {

// If you change the database schema, you must increment the database version.
const val DATABASE_VERSION = 5
const val DATABASE_VERSION = 6
const val DATABASE_NAME = "rcloneExplorer.db"


Expand Down Expand Up @@ -41,6 +41,8 @@ class DatabaseInfo {
val SQL_UPDATE_TRIGGER_ADD_TYPE = "ALTER TABLE ${Trigger.TABLE_NAME} ADD COLUMN ${Trigger.COLUMN_NAME_TYPE} INTEGER DEFAULT ${Trigger.TRIGGER_TYPE_SCHEDULE}"
val SQL_UPDATE_TASK_ADD_FILTER_ID = "ALTER TABLE ${Task.TABLE_NAME} ADD COLUMN ${Task.COLUMN_NAME_FILTER_ID} INTEGER REFERENCES ${Filter.TABLE_NAME}(${Filter.COLUMN_NAME_ID}) ON DELETE SET NULL"
val SQL_UPDATE_TASK_ADD_DELETE_EXCLUDED = "ALTER TABLE ${Task.TABLE_NAME} ADD COLUMN ${Task.COLUMN_NAME_DELETE_EXCLUDED} INTEGER"
val SQL_UPDATE_TASK_ADD_FOLLOWUPS_FAIL = "ALTER TABLE ${Task.TABLE_NAME} ADD COLUMN ${Task.COLUMN_NAME_ONFAIL_FOLLOWUP} INTEGER"
val SQL_UPDATE_TASK_ADD_FOLLOWUPS_SUCCESS = "ALTER TABLE ${Task.TABLE_NAME} ADD COLUMN ${Task.COLUMN_NAME_ONSUCCESS_FOLLOWUP} INTEGER"

}
}
6 changes: 5 additions & 1 deletion app/src/main/java/ca/pkay/rcloneexplorer/Items/Task.kt
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,9 @@ data class Task(var id: Long) {
var md5sum = TASK_MD5SUM_DEFAULT
var wifionly = TASK_WIFIONLY_DEFAULT
var filterId: Long? = null
var deleteExcluded = false;
var deleteExcluded = false
var onFailFollowup: Long? = null
var onSuccessFollowup: Long? = null

override fun toString(): String {
return "$title: $remoteId: $remoteType: $remotePath: $localPath: $direction"
Expand All @@ -37,6 +39,8 @@ data class Task(var id: Long) {
var COLUMN_NAME_WIFI_ONLY = "task_use_only_wifi"
var COLUMN_NAME_FILTER_ID = "task_filter_id"
var COLUMN_NAME_DELETE_EXCLUDED = "task_delete_excluded"
var COLUMN_NAME_ONFAIL_FOLLOWUP = "task_onFailFollowupTask"
var COLUMN_NAME_ONSUCCESS_FOLLOWUP = "task_onSuccessFollowupTask"

const val TASK_MD5SUM_DEFAULT = false
const val TASK_WIFIONLY_DEFAULT = false
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -235,6 +235,7 @@ class SyncWorker (private var mContext: Context, workerParams: WorkerParameters)
when (failureReason) {
FAILURE_REASON.NO_FAILURE -> {
showSuccessNotification(notificationId)
followupTask(mTask.onSuccessFollowup)
return
}
FAILURE_REASON.CANCELLED -> {
Expand All @@ -258,6 +259,7 @@ class SyncWorker (private var mContext: Context, workerParams: WorkerParameters)
content = mContext.getString(R.string.operation_failed_unknown_rclone_error, mTitle)
}
}
followupTask(mTask.onFailFollowup)
showFailNotification(notificationId, content)
endNotificationAlreadyPosted = true
finishWork()
Expand Down Expand Up @@ -432,4 +434,11 @@ class SyncWorker (private var mContext: Context, workerParams: WorkerParameters)
}
}

private fun followupTask(followUpTaskID: Long?) {
if (followUpTaskID == null || followUpTaskID == -1L) {
return
}
Thread.sleep(1000)
SyncManager(mContext).queue(followUpTaskID)
}
}
64 changes: 64 additions & 0 deletions app/src/main/res/layout/content_task.xml
Original file line number Diff line number Diff line change
Expand Up @@ -286,6 +286,70 @@

</androidx.cardview.widget.CardView>

<androidx.cardview.widget.CardView
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_margin="8dp"
style="@style/SecondaryCardStyle"
app:cardCornerRadius="@dimen/cardCornerRadius"
app:contentPadding="@dimen/cardPadding">

<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">

<TextView
android:id="@+id/label_onFail"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_margin="8dp"
android:text="Run on Failure"
android:textAppearance="@style/TextAppearance.AppCompat.Display1"
android:textSize="24sp" />

<Spinner
android:id="@+id/task_onFail_spinner"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_margin="8dp"
android:minHeight="48dp" />

</LinearLayout>
</androidx.cardview.widget.CardView>

<androidx.cardview.widget.CardView
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_margin="8dp"
style="@style/SecondaryCardStyle"
app:cardCornerRadius="@dimen/cardCornerRadius"
app:contentPadding="@dimen/cardPadding">

<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">

<TextView
android:id="@+id/label_onSuccess"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_margin="8dp"
android:text="Run on Success"
android:textAppearance="@style/TextAppearance.AppCompat.Display1"
android:textSize="24sp" />

<Spinner
android:id="@+id/task_onSuccess_spinner"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_margin="8dp"
android:minHeight="48dp" />

</LinearLayout>
</androidx.cardview.widget.CardView>

<Space
android:layout_width="wrap_content"
android:minHeight="48dp"
Expand Down

0 comments on commit 1cfa7b5

Please sign in to comment.