Skip to content

Commit aed708b

Browse files
committed
Merge branch 'feature/exclude_patterns2'
2 parents 0275673 + 0f0fe43 commit aed708b

6 files changed

Lines changed: 181 additions & 7 deletions

File tree

app/src/main/java/ca/pkay/rcloneexplorer/Activities/TaskActivity.kt

Lines changed: 83 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -57,6 +57,10 @@ class TaskActivity : AppCompatActivity(), FolderSelectorCallback{
5757
private lateinit var switchDeleteExcluded: Switch
5858

5959

60+
private lateinit var onFailDropdown: Spinner
61+
private lateinit var onSuccessDropdown: Spinner
62+
63+
6064
private lateinit var filterOptionsButton: ImageButton
6165

6266

@@ -125,6 +129,8 @@ class TaskActivity : AppCompatActivity(), FolderSelectorCallback{
125129
syncDescription = findViewById(R.id.descriptionSyncDirection)
126130
filterDropdown = findViewById(R.id.task_filter_spinner)
127131
switchDeleteExcluded = findViewById(R.id.task_exclude_delete_toggle)
132+
onFailDropdown = findViewById(R.id.task_onFail_spinner)
133+
onSuccessDropdown = findViewById(R.id.task_onSuccess_spinner)
128134
fab = findViewById(R.id.saveButton)
129135
switchWifi = findViewById(R.id.task_wifionly)
130136
switchMD5sum = findViewById(R.id.task_md5sum)
@@ -161,7 +167,7 @@ class TaskActivity : AppCompatActivity(), FolderSelectorCallback{
161167
val filter = if(filterDropdown.selectedItemPosition > 0 && filterDropdown.selectedItemPosition < filterDropdown.count) filterItems[filterDropdown.selectedItemPosition - 1] else null
162168
showFilterMenu(filterOptionsButton, filter)
163169
}
164-
createNewFilterButton = findViewById<Button>(R.id.task_edit_filter_add_button)
170+
createNewFilterButton = findViewById(R.id.task_edit_filter_add_button)
165171
createNewFilterButton.setOnClickListener {
166172
openFilterActivity()
167173
}
@@ -174,16 +180,32 @@ class TaskActivity : AppCompatActivity(), FolderSelectorCallback{
174180
prepareLocal()
175181
prepareRemote()
176182
prepareFilterDropdown()
183+
prepareOnFailDropdown()
184+
prepareOnSuccessDropdown()
177185
}
178186

179187
private val remoteItems: Array<String?>
180-
private get() {
188+
get() {
181189
val remotes = arrayOfNulls<String>(rcloneInstance.remotes.size)
182190
for (i in rcloneInstance.remotes.indices) {
183191
remotes[i] = rcloneInstance.remotes[i].name
184192
}
185193
return remotes
186194
}
195+
196+
private val taskListWithNone: ArrayList<TaskNameIdPair>
197+
get() {
198+
val tasks = dbHandler.allTasks
199+
val list = ArrayList<TaskNameIdPair>()
200+
list.add(TaskNameIdPair(-1, "None"))
201+
tasks.forEach{
202+
list.add(TaskNameIdPair(it.id, it.title))
203+
}
204+
return list
205+
}
206+
207+
208+
187209
private val filterItems: List<Filter>
188210
get() {
189211
return dbHandler.allFilters
@@ -229,7 +251,9 @@ class TaskActivity : AppCompatActivity(), FolderSelectorCallback{
229251
taskToPopulate.wifionly = switchWifi.isChecked
230252
taskToPopulate.md5sum = switchMD5sum.isChecked
231253
taskToPopulate.deleteExcluded = switchDeleteExcluded.isChecked
232-
taskToPopulate.filterId = if(filterDropdown.selectedItemPosition == 0) null else filterItems[filterDropdown.selectedItemPosition - 1].id
254+
taskToPopulate.filterId = if(filterDropdown.selectedItemPosition == 0 || filterDropdown.selectedItemPosition == -1) null else filterItems[filterDropdown.selectedItemPosition - 1].id
255+
taskToPopulate.onFailFollowup = (onFailDropdown.selectedItem as TaskNameIdPair).id
256+
taskToPopulate.onSuccessFollowup = (onSuccessDropdown.selectedItem as TaskNameIdPair).id
233257

234258
// Verify if data is completed
235259
if (localPath.text.toString() == "") {
@@ -267,6 +291,7 @@ class TaskActivity : AppCompatActivity(), FolderSelectorCallback{
267291
remotePath.setText(remotePathHolder)
268292
fab.visibility = View.VISIBLE
269293
}
294+
270295
private fun selectFilter(filterId: Long) {
271296
prepareFilterDropdown()
272297

@@ -290,6 +315,7 @@ class TaskActivity : AppCompatActivity(), FolderSelectorCallback{
290315
}
291316
}
292317
}
318+
293319
private fun prepareRemote() {
294320

295321
remotePathHolder = existingTask?.remotePath.toString()
@@ -327,6 +353,54 @@ class TaskActivity : AppCompatActivity(), FolderSelectorCallback{
327353
}
328354
}
329355
}
356+
357+
private fun prepareOnFailDropdown() {
358+
onFailDropdown.adapter = ArrayAdapter(this, android.R.layout.simple_spinner_dropdown_item, taskListWithNone)
359+
var i = 0
360+
var found = 0
361+
taskListWithNone.forEach{
362+
if(it.id == (existingTask?.onFailFollowup ?: -1)) {
363+
found = i
364+
}
365+
i++
366+
}
367+
onFailDropdown.setSelection(found)
368+
369+
onFailDropdown.onItemSelectedListener = object : AdapterView.OnItemSelectedListener {
370+
override fun onItemSelected(parentView: AdapterView<*>?, selectedItemView: View, position: Int, id: Long) {
371+
val pair = parentView?.selectedItem as TaskNameIdPair
372+
existingTask?.onFailFollowup = pair.id
373+
}
374+
375+
override fun onNothingSelected(parentView: AdapterView<*>?) {}
376+
}
377+
}
378+
379+
private fun prepareOnSuccessDropdown() {
380+
onSuccessDropdown.adapter = ArrayAdapter(this, android.R.layout.simple_spinner_dropdown_item, taskListWithNone)
381+
var i = 0
382+
var found = 0
383+
taskListWithNone.forEach{
384+
if(it.id == (existingTask?.onSuccessFollowup ?: -1)) {
385+
found = i
386+
}
387+
i++
388+
}
389+
onSuccessDropdown.setSelection(found)
390+
391+
392+
onSuccessDropdown.onItemSelectedListener = object : AdapterView.OnItemSelectedListener {
393+
override fun onItemSelected(parentView: AdapterView<*>?, selectedItemView: View, position: Int, id: Long) {
394+
val pair = parentView?.selectedItem as TaskNameIdPair
395+
existingTask?.onSuccessFollowup = pair.id
396+
}
397+
398+
override fun onNothingSelected(parentView: AdapterView<*>?) {}
399+
}
400+
}
401+
402+
403+
330404
private fun prepareFilterDropdown() {
331405
val filterList = filterItems.toMutableList()
332406

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

446520
}
521+
522+
inner class TaskNameIdPair(var id: Long, private var name: String) {
523+
override fun toString(): String {
524+
return name
525+
}
526+
}
447527
}

app/src/main/java/ca/pkay/rcloneexplorer/Database/DatabaseHandler.kt

Lines changed: 17 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ import android.content.Context
55
import android.database.Cursor
66
import android.database.sqlite.SQLiteDatabase
77
import android.database.sqlite.SQLiteOpenHelper
8+
import android.util.Log
89
import ca.pkay.rcloneexplorer.Database.DatabaseInfo.Companion.DATABASE_NAME
910
import ca.pkay.rcloneexplorer.Database.DatabaseInfo.Companion.DATABASE_VERSION
1011
import ca.pkay.rcloneexplorer.Database.DatabaseInfo.Companion.SQL_CREATE_TABLES_TASKS
@@ -14,6 +15,8 @@ import ca.pkay.rcloneexplorer.Database.DatabaseInfo.Companion.SQL_UPDATE_TASK_AD
1415
import ca.pkay.rcloneexplorer.Database.DatabaseInfo.Companion.SQL_UPDATE_TASK_ADD_MD5
1516
import ca.pkay.rcloneexplorer.Database.DatabaseInfo.Companion.SQL_UPDATE_TASK_ADD_WIFI
1617
import ca.pkay.rcloneexplorer.Database.DatabaseInfo.Companion.SQL_UPDATE_TASK_ADD_FILTER_ID
18+
import ca.pkay.rcloneexplorer.Database.DatabaseInfo.Companion.SQL_UPDATE_TASK_ADD_FOLLOWUPS_FAIL
19+
import ca.pkay.rcloneexplorer.Database.DatabaseInfo.Companion.SQL_UPDATE_TASK_ADD_FOLLOWUPS_SUCCESS
1720
import ca.pkay.rcloneexplorer.Database.DatabaseInfo.Companion.SQL_UPDATE_TRIGGER_ADD_TYPE
1821
import ca.pkay.rcloneexplorer.Items.Filter
1922
import ca.pkay.rcloneexplorer.Items.Task
@@ -32,6 +35,8 @@ class DatabaseHandler(context: Context?) :
3235
sqLiteDatabase.execSQL(SQL_UPDATE_TRIGGER_ADD_TYPE)
3336
sqLiteDatabase.execSQL(SQL_UPDATE_TASK_ADD_FILTER_ID)
3437
sqLiteDatabase.execSQL(SQL_UPDATE_TASK_ADD_DELETE_EXCLUDED)
38+
sqLiteDatabase.execSQL(SQL_UPDATE_TASK_ADD_FOLLOWUPS_FAIL)
39+
sqLiteDatabase.execSQL(SQL_UPDATE_TASK_ADD_FOLLOWUPS_SUCCESS)
3540
}
3641

3742
override fun onUpgrade(sqLiteDatabase: SQLiteDatabase, oldVersion: Int, newVersion: Int) {
@@ -50,6 +55,10 @@ class DatabaseHandler(context: Context?) :
5055
sqLiteDatabase.execSQL(SQL_UPDATE_TASK_ADD_FILTER_ID)
5156
sqLiteDatabase.execSQL(SQL_UPDATE_TASK_ADD_DELETE_EXCLUDED)
5257
}
58+
if (oldVersion < 6) {
59+
sqLiteDatabase.execSQL(SQL_UPDATE_TASK_ADD_FOLLOWUPS_FAIL)
60+
sqLiteDatabase.execSQL(SQL_UPDATE_TASK_ADD_FOLLOWUPS_SUCCESS)
61+
}
5362
}
5463

5564
val allTasks: List<Task>
@@ -121,7 +130,7 @@ class DatabaseHandler(context: Context?) :
121130
}
122131

123132
private val taskProjection: Array<String>
124-
private get() = arrayOf(
133+
get() = arrayOf(
125134
Task.COLUMN_NAME_ID,
126135
Task.COLUMN_NAME_TITLE,
127136
Task.COLUMN_NAME_REMOTE_ID,
@@ -132,7 +141,9 @@ class DatabaseHandler(context: Context?) :
132141
Task.COLUMN_NAME_MD5SUM,
133142
Task.COLUMN_NAME_WIFI_ONLY,
134143
Task.COLUMN_NAME_FILTER_ID,
135-
Task.COLUMN_NAME_DELETE_EXCLUDED
144+
Task.COLUMN_NAME_DELETE_EXCLUDED,
145+
Task.COLUMN_NAME_ONFAIL_FOLLOWUP,
146+
Task.COLUMN_NAME_ONSUCCESS_FOLLOWUP
136147
)
137148

138149
private fun taskFromCursor(cursor: Cursor): Task {
@@ -147,6 +158,8 @@ class DatabaseHandler(context: Context?) :
147158
task.wifionly = getBoolean(cursor, 8)
148159
task.filterId = cursor.getLong(9)
149160
task.deleteExcluded = getBoolean(cursor, 10)
161+
task.onFailFollowup = cursor.getLong(11)
162+
task.onSuccessFollowup = cursor.getLong(12)
150163
return task
151164
}
152165

@@ -177,6 +190,8 @@ class DatabaseHandler(context: Context?) :
177190
values.put(Task.COLUMN_NAME_WIFI_ONLY, task.wifionly)
178191
values.put(Task.COLUMN_NAME_FILTER_ID, task.filterId)
179192
values.put(Task.COLUMN_NAME_DELETE_EXCLUDED, task.deleteExcluded)
193+
values.put(Task.COLUMN_NAME_ONFAIL_FOLLOWUP, task.onFailFollowup)
194+
values.put(Task.COLUMN_NAME_ONSUCCESS_FOLLOWUP, task.onSuccessFollowup)
180195
return values
181196
}
182197

app/src/main/java/ca/pkay/rcloneexplorer/Database/DatabaseInfo.kt

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ class DatabaseInfo {
99
companion object {
1010

1111
// If you change the database schema, you must increment the database version.
12-
const val DATABASE_VERSION = 5
12+
const val DATABASE_VERSION = 6
1313
const val DATABASE_NAME = "rcloneExplorer.db"
1414

1515

@@ -41,6 +41,8 @@ class DatabaseInfo {
4141
val SQL_UPDATE_TRIGGER_ADD_TYPE = "ALTER TABLE ${Trigger.TABLE_NAME} ADD COLUMN ${Trigger.COLUMN_NAME_TYPE} INTEGER DEFAULT ${Trigger.TRIGGER_TYPE_SCHEDULE}"
4242
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"
4343
val SQL_UPDATE_TASK_ADD_DELETE_EXCLUDED = "ALTER TABLE ${Task.TABLE_NAME} ADD COLUMN ${Task.COLUMN_NAME_DELETE_EXCLUDED} INTEGER"
44+
val SQL_UPDATE_TASK_ADD_FOLLOWUPS_FAIL = "ALTER TABLE ${Task.TABLE_NAME} ADD COLUMN ${Task.COLUMN_NAME_ONFAIL_FOLLOWUP} INTEGER"
45+
val SQL_UPDATE_TASK_ADD_FOLLOWUPS_SUCCESS = "ALTER TABLE ${Task.TABLE_NAME} ADD COLUMN ${Task.COLUMN_NAME_ONSUCCESS_FOLLOWUP} INTEGER"
4446

4547
}
4648
}

app/src/main/java/ca/pkay/rcloneexplorer/Items/Task.kt

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,9 @@ data class Task(var id: Long) {
1818
var md5sum = TASK_MD5SUM_DEFAULT
1919
var wifionly = TASK_WIFIONLY_DEFAULT
2020
var filterId: Long? = null
21-
var deleteExcluded = false;
21+
var deleteExcluded = false
22+
var onFailFollowup: Long? = null
23+
var onSuccessFollowup: Long? = null
2224

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

4145
const val TASK_MD5SUM_DEFAULT = false
4246
const val TASK_WIFIONLY_DEFAULT = false

app/src/main/java/ca/pkay/rcloneexplorer/workmanager/SyncWorker.kt

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -235,6 +235,7 @@ class SyncWorker (private var mContext: Context, workerParams: WorkerParameters)
235235
when (failureReason) {
236236
FAILURE_REASON.NO_FAILURE -> {
237237
showSuccessNotification(notificationId)
238+
followupTask(mTask.onSuccessFollowup)
238239
return
239240
}
240241
FAILURE_REASON.CANCELLED -> {
@@ -258,6 +259,7 @@ class SyncWorker (private var mContext: Context, workerParams: WorkerParameters)
258259
content = mContext.getString(R.string.operation_failed_unknown_rclone_error, mTitle)
259260
}
260261
}
262+
followupTask(mTask.onFailFollowup)
261263
showFailNotification(notificationId, content)
262264
endNotificationAlreadyPosted = true
263265
finishWork()
@@ -432,4 +434,11 @@ class SyncWorker (private var mContext: Context, workerParams: WorkerParameters)
432434
}
433435
}
434436

437+
private fun followupTask(followUpTaskID: Long?) {
438+
if (followUpTaskID == null || followUpTaskID == -1L) {
439+
return
440+
}
441+
Thread.sleep(1000)
442+
SyncManager(mContext).queue(followUpTaskID)
443+
}
435444
}

app/src/main/res/layout/content_task.xml

Lines changed: 64 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -286,6 +286,70 @@
286286

287287
</androidx.cardview.widget.CardView>
288288

289+
<androidx.cardview.widget.CardView
290+
android:layout_width="match_parent"
291+
android:layout_height="match_parent"
292+
android:layout_margin="8dp"
293+
style="@style/SecondaryCardStyle"
294+
app:cardCornerRadius="@dimen/cardCornerRadius"
295+
app:contentPadding="@dimen/cardPadding">
296+
297+
<LinearLayout
298+
android:layout_width="match_parent"
299+
android:layout_height="match_parent"
300+
android:orientation="vertical">
301+
302+
<TextView
303+
android:id="@+id/label_onFail"
304+
android:layout_width="match_parent"
305+
android:layout_height="wrap_content"
306+
android:layout_margin="8dp"
307+
android:text="Run on Failure"
308+
android:textAppearance="@style/TextAppearance.AppCompat.Display1"
309+
android:textSize="24sp" />
310+
311+
<Spinner
312+
android:id="@+id/task_onFail_spinner"
313+
android:layout_width="match_parent"
314+
android:layout_height="wrap_content"
315+
android:layout_margin="8dp"
316+
android:minHeight="48dp" />
317+
318+
</LinearLayout>
319+
</androidx.cardview.widget.CardView>
320+
321+
<androidx.cardview.widget.CardView
322+
android:layout_width="match_parent"
323+
android:layout_height="match_parent"
324+
android:layout_margin="8dp"
325+
style="@style/SecondaryCardStyle"
326+
app:cardCornerRadius="@dimen/cardCornerRadius"
327+
app:contentPadding="@dimen/cardPadding">
328+
329+
<LinearLayout
330+
android:layout_width="match_parent"
331+
android:layout_height="match_parent"
332+
android:orientation="vertical">
333+
334+
<TextView
335+
android:id="@+id/label_onSuccess"
336+
android:layout_width="match_parent"
337+
android:layout_height="wrap_content"
338+
android:layout_margin="8dp"
339+
android:text="Run on Success"
340+
android:textAppearance="@style/TextAppearance.AppCompat.Display1"
341+
android:textSize="24sp" />
342+
343+
<Spinner
344+
android:id="@+id/task_onSuccess_spinner"
345+
android:layout_width="match_parent"
346+
android:layout_height="wrap_content"
347+
android:layout_margin="8dp"
348+
android:minHeight="48dp" />
349+
350+
</LinearLayout>
351+
</androidx.cardview.widget.CardView>
352+
289353
<Space
290354
android:layout_width="wrap_content"
291355
android:minHeight="48dp"

0 commit comments

Comments
 (0)