Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Option to run all Tasks with only one Trigger + option to run a group of tasks starting with a specific character #183

Open
wants to merge 2 commits into
base: master
Choose a base branch
from
Open
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Prev Previous commit
Automatically group tasks by their titles' first character in Trigger…
…s' Task-dropdown to provide an option to run all Tasks starting with the specific character. (First character can be any unicode character.)

This allows simply grouping Tasks in order to be executed with only one Trigger.
  • Loading branch information
nabemono committed Nov 18, 2023

Verified

This commit was created on GitHub.com and signed with GitHub’s verified signature.
commit e0c252f1f5956361537d96350cbe754e6a904b2a
Original file line number Diff line number Diff line change
@@ -30,11 +30,13 @@ class TriggerActivity : AppCompatActivity() {
companion object {
const val ID_EXTRA = "TRIGGER_EDIT_ID"
const val ID_ALL_TASKS = -1000L
const val UNICODE_CHAR_RANGE = -10_000_000L
}

private lateinit var mTrigger: Trigger
private lateinit var dbHandler: DatabaseHandler
private var mTaskList: List<Task> = ArrayList()
private var firstCharOfTasksUnique: List<Char> = ArrayList<Char>()

private lateinit var mCardInterval: CardView
private lateinit var mCardWeekday: CardView
@@ -88,6 +90,14 @@ class TriggerActivity : AppCompatActivity() {
dbHandler = DatabaseHandler(this)
mTaskList = dbHandler.allTasks

if (this.mTaskList.isNotEmpty()) {
val firstCharsOfTaskTitles : HashSet<Char> = HashSet<Char>()
for (i in this.mTaskList.indices) {
firstCharsOfTaskTitles.add(this.mTaskList[i].title.trim().uppercase().first())
}
firstCharOfTasksUnique = firstCharsOfTaskTitles.toList().sortedBy { it.toString() }
}

val extras = intent.extras
val triggerId: Long
if (extras != null) {
@@ -198,6 +208,9 @@ class TriggerActivity : AppCompatActivity() {
override fun onItemSelected(parent: AdapterView<*>?, view: View, pos: Int, id: Long) {
if (pos == (mTaskList.size)) {
mTrigger.triggerTarget = ID_ALL_TASKS
} else if (pos > (mTaskList.size)) {
val charForGrouping = firstCharOfTasksUnique[pos - mTaskList.size - 1]
mTrigger.triggerTarget = UNICODE_CHAR_RANGE - charForGrouping.code.toLong()
} else {
mTrigger.triggerTarget = mTaskList[pos].id
}
@@ -218,11 +231,14 @@ class TriggerActivity : AppCompatActivity() {
* Set up Task-Target Dropdown
*/
private fun setUpTargetsDropdown() {
val items = arrayOfNulls<String>(if (this.mTaskList.size == 0) 0 else (this.mTaskList.size + 1))
val items = arrayOfNulls<String>(if (this.mTaskList.size == 0) 0 else (this.mTaskList.size + firstCharOfTasksUnique.size + 1))
for (i in this.mTaskList.indices) {
items[i] = this.mTaskList[i].title
}
if (this.mTaskList.size > 0) items[this.mTaskList.size] = this.resources.getString(R.string.sync_option_all_tasks_asc)
for (i in firstCharOfTasksUnique.indices) {
items[i + this.mTaskList.size + 1] = this.resources.getString(R.string.sync_option_all) + " " + firstCharOfTasksUnique[i] + this.resources.getString(R.string.sync_option_all_tasks_prefixed_asc)
}
val adapter = ArrayAdapter(this, android.R.layout.simple_spinner_dropdown_item, items)
mTargetDropdown.adapter = adapter
}
@@ -268,6 +284,11 @@ class TriggerActivity : AppCompatActivity() {
mTargetDropdown.setSelection(mTaskList.size)
} else if (task.id == mTrigger.triggerTarget) {
mTargetDropdown.setSelection(mTaskList.indexOf(task))
} else if (UNICODE_CHAR_RANGE - mTrigger.triggerTarget >= 0) {
val firstChar = (UNICODE_CHAR_RANGE - mTrigger.triggerTarget).toInt().toChar()
if (firstCharOfTasksUnique.contains(firstChar)) {
mTargetDropdown.setSelection(mTaskList.size + firstCharOfTasksUnique.indexOf(firstChar) + 1)
}
}
}
}
Original file line number Diff line number Diff line change
@@ -2,6 +2,7 @@


import static ca.pkay.rcloneexplorer.Activities.TriggerActivity.ID_ALL_TASKS;
import static ca.pkay.rcloneexplorer.Activities.TriggerActivity.UNICODE_CHAR_RANGE;
import static ca.pkay.rcloneexplorer.Items.Trigger.TRIGGER_DAY_FRI;
import static ca.pkay.rcloneexplorer.Items.Trigger.TRIGGER_DAY_MON;
import static ca.pkay.rcloneexplorer.Items.Trigger.TRIGGER_DAY_SAT;
@@ -86,6 +87,9 @@ public void onBindViewHolder(@NonNull final RecyclerView.ViewHolder holder, fina
String targetTaskTitle = "ERR: NOTFOUND";
if (selectedTrigger.getTriggerTarget() == ID_ALL_TASKS) {
targetTaskTitle = context.getResources().getString(R.string.sync_title_all_tasks_asc);
} else if (UNICODE_CHAR_RANGE - selectedTrigger.getTriggerTarget() >= 0) {
String firstCharOfTaskName = new String(Character.toChars((int) (UNICODE_CHAR_RANGE - selectedTrigger.getTriggerTarget())));
targetTaskTitle = firstCharOfTaskName + context.getResources().getString(R.string.sync_title_all_tasks_prefixed_asc);
} else {
Task task = (new DatabaseHandler(context)).getTask(selectedTrigger.getTriggerTarget());
if (task != null) { targetTaskTitle = task.getTitle(); }
Original file line number Diff line number Diff line change
@@ -8,6 +8,7 @@ import androidx.work.OneTimeWorkRequest
import androidx.work.OneTimeWorkRequestBuilder
import androidx.work.WorkManager
import androidx.work.WorkRequest
import ca.pkay.rcloneexplorer.Activities.TriggerActivity
import ca.pkay.rcloneexplorer.Activities.TriggerActivity.Companion.ID_ALL_TASKS
import ca.pkay.rcloneexplorer.Database.DatabaseHandler
import ca.pkay.rcloneexplorer.Items.Task
@@ -20,8 +21,10 @@ class SyncManager(private var mContext: Context) {

fun queue(trigger: Trigger) {
if (trigger.triggerTarget == ID_ALL_TASKS) {
queueAllTasks()
} else {
queueAllTasks(null)
} else if (TriggerActivity.UNICODE_CHAR_RANGE - trigger.triggerTarget >= 0) {
queueAllTasks((TriggerActivity.UNICODE_CHAR_RANGE - trigger.triggerTarget).toInt().toChar().toString())
} else{
queue(trigger.triggerTarget)
}
}
@@ -34,11 +37,17 @@ class SyncManager(private var mContext: Context) {
work(getOneTimeWorkRequest(taskID))
}

private fun queueAllTasks() {
private fun queueAllTasks(prefixFilter: String?) {
val mTaskList = mDatabase.allTasks
mTaskList.sortedBy { it.title }
for (i in mTaskList.indices) {
workOneByOne(getOneTimeWorkRequest(mTaskList[i].id))
if (prefixFilter == null) {
workOneByOne(getOneTimeWorkRequest(mTaskList[i].id))
} else {
if (mTaskList[i].title.trim().uppercase().startsWith(prefixFilter)) {
workOneByOne(getOneTimeWorkRequest(mTaskList[i].id))
}
}
}
}

3 changes: 3 additions & 0 deletions app/src/main/res/values/strings.xml
Original file line number Diff line number Diff line change
@@ -486,6 +486,9 @@
<string name="description_sync_direction_sync_bidirectional">Make sure local and remote storage have the same files by transferring, downloading, and deleting files as needed to maintain an identical folder structure.</string>
<string name="sync_option_all_tasks_asc">All tasks (in alphabetical order)</string>
<string name="sync_title_all_tasks_asc">All tasks</string>
<string name="sync_option_all">All</string>
<string name="sync_option_all_tasks_prefixed_asc">… named tasks</string>
<string name="sync_title_all_tasks_prefixed_asc">… tasks</string>
<string name="intro_success">Success!</string>
<string name="intro_successful_setup">You are now ready to start!</string>
<string name="intro_write_external_storage_denied">File access permission not granted</string>