vault backup: 2025-11-22 08:14:07
This commit is contained in:
157
Personal/Areas/Tasker/README.md
Normal file
157
Personal/Areas/Tasker/README.md
Normal file
@@ -0,0 +1,157 @@
|
||||
---
|
||||
created: 2025-11-11 16:30
|
||||
updated: 2025-11-11 16:30
|
||||
---
|
||||
# Tasker Routine Reminders Project
|
||||
|
||||
Standardized Tasker automation project for daily routine reminders with notification buttons that trigger actions.
|
||||
|
||||
## Project: Routine_Reminders.prj.xml
|
||||
|
||||
### Naming Conventions
|
||||
|
||||
**Commands** (used in AutoNotification buttons/filters):
|
||||
- Format: `cmd_<action>_<target>`
|
||||
- Examples: `cmd_open_skincare_note`, `cmd_mark_skincare_done`
|
||||
|
||||
**Notification IDs**:
|
||||
- Format: `notif_<routine>_<time>`
|
||||
- Examples: `notif_skincare_morning`, `notif_exercise_prep`
|
||||
|
||||
**Profiles**:
|
||||
- Time triggers: `Trigger <Routine> Notification`
|
||||
- Event listeners: `Event: <Action> <Target>`
|
||||
|
||||
**Tasks**:
|
||||
- Notification display: `Show <Routine> Notification`
|
||||
- Actions: `<Action> <Target>` (e.g., `Open Skincare Note`, `Mark Exercise Done`)
|
||||
|
||||
### Project Structure
|
||||
|
||||
#### Time-Based Triggers (show notifications at specific times)
|
||||
- `Trigger Skincare Notification` → 7:30 AM → Shows skincare reminder
|
||||
- `Trigger Exercise Notification` → 11:30 AM → Shows exercise reminder
|
||||
|
||||
#### Event Listeners (respond to notification button taps)
|
||||
- `Event: Mark Skincare Done` → Listens for `cmd_mark_skincare_done` → Marks habit complete + dismisses notification
|
||||
- `Event: Mark Exercise Done` → Listens for `cmd_mark_exercise_done` → Dismisses notification
|
||||
- `Event: Open Skincare Note` → Listens for `cmd_open_skincare_done` → Opens Obsidian note
|
||||
- `Event: Open Exercise Note` → Listens for `cmd_open_exercise_note` → Opens Obsidian note
|
||||
|
||||
#### Notification Tasks (display the actual notifications)
|
||||
- `Show Skincare Notification` → Creates notification with buttons:
|
||||
- Button 1: "Open Note" → Sends `cmd_open_skincare_note`
|
||||
- Button 2: "Mark Done" → Sends `cmd_mark_skincare_done`
|
||||
- `Show Exercise Notification` → Creates notification with buttons:
|
||||
- Button 1: "Open Note" → Sends `cmd_open_exercise_note`
|
||||
- Button 2: "Mark Done" → Sends `cmd_mark_exercise_done`
|
||||
|
||||
#### Action Tasks (perform actual actions)
|
||||
- `Open Skincare Note` → Opens `Personal/Projects/Skincare/Skincare Morning` in Obsidian
|
||||
- `Open Exercise Note` → Opens exercise note in Obsidian
|
||||
- `Open Diet Note` → Opens diet note in Obsidian
|
||||
- `Mark Skincare Done` → Checks off habit in Loop Habit Tracker + dismisses notification
|
||||
- `Mark Exercise Done` → Dismisses notification
|
||||
|
||||
### How It Works
|
||||
|
||||
1. **At trigger time** (e.g., 7:30 AM):
|
||||
- Profile `Trigger Skincare Notification` activates
|
||||
- Runs task `Show Skincare Notification`
|
||||
- Notification appears with two buttons
|
||||
|
||||
2. **When button is tapped**:
|
||||
- AutoNotification sends command (e.g., `cmd_open_skincare_note`)
|
||||
- Event profile listens for that command (e.g., `Event: Open Skincare Note`)
|
||||
- Runs linked task (e.g., `Open Skincare Note`)
|
||||
- Opens Obsidian to the correct note
|
||||
|
||||
3. **When "Mark Done" is tapped**:
|
||||
- Sends `cmd_mark_skincare_done` command
|
||||
- `Event: Mark Skincare Done` profile catches it
|
||||
- Runs `Mark Skincare Done` task
|
||||
- Checks off habit in Loop Habit Tracker
|
||||
- Dismisses the notification
|
||||
|
||||
### Adding New Routines
|
||||
|
||||
To add a new routine (e.g., "Meditation"):
|
||||
|
||||
1. **Create time trigger profile**:
|
||||
- Name: `Trigger Meditation Notification`
|
||||
- Trigger: Time (e.g., 7:00 AM)
|
||||
- Task: `Show Meditation Notification`
|
||||
|
||||
2. **Create notification display task**:
|
||||
- Name: `Show Meditation Notification`
|
||||
- Action: AutoNotification
|
||||
- Notification ID: `notif_meditation_morning`
|
||||
- Button 1 command: `cmd_open_meditation_note`
|
||||
- Button 2 command: `cmd_mark_meditation_done`
|
||||
|
||||
3. **Create event listener profiles**:
|
||||
- `Event: Open Meditation Note` → Listens for `cmd_open_meditation_note`
|
||||
- `Event: Mark Meditation Done` → Listens for `cmd_mark_meditation_done`
|
||||
|
||||
4. **Create action tasks**:
|
||||
- `Open Meditation Note` → Opens Obsidian note
|
||||
- `Mark Meditation Done` → Marks habit complete + dismisses notification
|
||||
|
||||
### Dependencies
|
||||
|
||||
- **AutoNotification** (Joao Apps) - For creating interactive notifications and listening to button commands
|
||||
- **Loop Habit Tracker** - For checking off habits
|
||||
- **Obsidian** - For opening notes via obsidian:// URLs
|
||||
|
||||
### Files
|
||||
|
||||
- `Routine_Reminders.prj.xml` - Main project file (import into Tasker)
|
||||
- `Skincare_Demo_Standardized.prj.xml` - Original file before standardization
|
||||
- `standardize_tasker_v2.py` - Python script used for standardization
|
||||
|
||||
### Standardization Script
|
||||
|
||||
Run `standardize_tasker_v2.py` to:
|
||||
- Standardize all naming conventions
|
||||
- Link notification buttons to event profiles
|
||||
- Add missing event listeners
|
||||
- Remove trailing spaces and inconsistencies
|
||||
|
||||
```bash
|
||||
python3 standardize_tasker_v2.py
|
||||
```
|
||||
|
||||
### Import Instructions
|
||||
|
||||
1. Open Tasker
|
||||
2. Long-press Projects tab
|
||||
3. Select "Import Project"
|
||||
4. Navigate to `Routine_Reminders.prj.xml`
|
||||
5. Import
|
||||
6. Enable profiles
|
||||
|
||||
### Tips
|
||||
|
||||
- Use `cmd_` prefix for all AutoNotification commands (consistency + easy grep)
|
||||
- Use `notif_` prefix for all notification IDs (avoids conflicts)
|
||||
- Always create event listener profiles for button commands
|
||||
- Link event profiles to existing action tasks via `mid0` (task ID)
|
||||
|
||||
### Troubleshooting
|
||||
|
||||
**Button doesn't do anything when tapped:**
|
||||
- Check that event profile exists for that command
|
||||
- Verify command name matches exactly (case-sensitive)
|
||||
- Check that event profile is enabled
|
||||
- Verify `mid0` in profile points to correct task ID
|
||||
|
||||
**Notification doesn't appear:**
|
||||
- Check time trigger is correct and profile is enabled
|
||||
- Verify notification display task is working (run manually)
|
||||
- Check AutoNotification permissions
|
||||
|
||||
**Wrong note opens:**
|
||||
- Check Obsidian URL in action task
|
||||
- Verify vault name and file path are correct
|
||||
- Test URL in browser first
|
||||
|
||||
2099
Personal/Areas/Tasker/Routine_Reminders.prj.xml
Normal file
2099
Personal/Areas/Tasker/Routine_Reminders.prj.xml
Normal file
File diff suppressed because it is too large
Load Diff
800
Personal/Areas/Tasker/Skincare_Demo.prj.xml
Normal file
800
Personal/Areas/Tasker/Skincare_Demo.prj.xml
Normal file
@@ -0,0 +1,800 @@
|
||||
<TaskerData sr="" dvi="1" tv="6.5.11">
|
||||
<Profile sr="prof104" ve="2">
|
||||
<cdate>1762631944649</cdate>
|
||||
<clp>true</clp>
|
||||
<edate>1762935025169</edate>
|
||||
<flags>8</flags>
|
||||
<id>104</id>
|
||||
<mid0>105</mid0>
|
||||
<nme>Launch Skincare Notification</nme>
|
||||
<Time sr="con0">
|
||||
<fh>7</fh>
|
||||
<fm>30</fm>
|
||||
<th>7</th>
|
||||
<tm>30</tm>
|
||||
</Time>
|
||||
</Profile>
|
||||
<Profile sr="prof107" ve="2">
|
||||
<cdate>1762862939813</cdate>
|
||||
<clp>true</clp>
|
||||
<edate>1762935050872</edate>
|
||||
<flags>8</flags>
|
||||
<id>107</id>
|
||||
<mid0>108</mid0>
|
||||
<Event sr="con0" ve="2">
|
||||
<code>1825107102</code>
|
||||
<pri>0</pri>
|
||||
<Bundle sr="arg0">
|
||||
<Vals sr="val">
|
||||
<com.twofortyfouram.locale.intent.extra.BLURB>Event Behaviour
|
||||
Filter: mark skincare done </com.twofortyfouram.locale.intent.extra.BLURB>
|
||||
<com.twofortyfouram.locale.intent.extra.BLURB-type>java.lang.String</com.twofortyfouram.locale.intent.extra.BLURB-type>
|
||||
<command_params_var>anpar</command_params_var>
|
||||
<command_params_var-type>java.lang.String</command_params_var-type>
|
||||
<command_var>ancomm</command_var>
|
||||
<command_var-type>java.lang.String</command_var-type>
|
||||
<config_notification_command>mark skincare done </config_notification_command>
|
||||
<config_notification_command-type>java.lang.String</config_notification_command-type>
|
||||
<message_single_case_insensitive>false</message_single_case_insensitive>
|
||||
<message_single_case_insensitive-type>java.lang.Boolean</message_single_case_insensitive-type>
|
||||
<message_single_exact>false</message_single_exact>
|
||||
<message_single_exact-type>java.lang.Boolean</message_single_exact-type>
|
||||
<message_single_regex>false</message_single_regex>
|
||||
<message_single_regex-type>java.lang.Boolean</message_single_regex-type>
|
||||
<message_var>anmessage</message_var>
|
||||
<message_var-type>java.lang.String</message_var-type>
|
||||
<net.dinglisch.android.tasker.EXTRA_NSR_DEPRECATED>true</net.dinglisch.android.tasker.EXTRA_NSR_DEPRECATED>
|
||||
<net.dinglisch.android.tasker.EXTRA_NSR_DEPRECATED-type>java.lang.Boolean</net.dinglisch.android.tasker.EXTRA_NSR_DEPRECATED-type>
|
||||
<net.dinglisch.android.tasker.RELEVANT_VARIABLES><StringArray sr=""><_array_net.dinglisch.android.tasker.RELEVANT_VARIABLES0>%ancomm
|
||||
Everything to the right of =:=
|
||||
Everything to the right of =:=</_array_net.dinglisch.android.tasker.RELEVANT_VARIABLES0><_array_net.dinglisch.android.tasker.RELEVANT_VARIABLES1>%anmessage
|
||||
Whole AutoNotification Message
|
||||
Whole AutoNotification Message</_array_net.dinglisch.android.tasker.RELEVANT_VARIABLES1><_array_net.dinglisch.android.tasker.RELEVANT_VARIABLES2>%anpar()
|
||||
Array of single words to the left of =:=
|
||||
Array of single words to the left of =:=</_array_net.dinglisch.android.tasker.RELEVANT_VARIABLES2></StringArray></net.dinglisch.android.tasker.RELEVANT_VARIABLES>
|
||||
<net.dinglisch.android.tasker.RELEVANT_VARIABLES-type>[Ljava.lang.String;</net.dinglisch.android.tasker.RELEVANT_VARIABLES-type>
|
||||
<net.dinglisch.android.tasker.extras.REQUESTED_TIMEOUT>10000</net.dinglisch.android.tasker.extras.REQUESTED_TIMEOUT>
|
||||
<net.dinglisch.android.tasker.extras.REQUESTED_TIMEOUT-type>java.lang.Integer</net.dinglisch.android.tasker.extras.REQUESTED_TIMEOUT-type>
|
||||
<net.dinglisch.android.tasker.extras.VARIABLE_REPLACE_KEYS>message_var command_var command_params_var config_notification_command plugininstanceid plugintypeid </net.dinglisch.android.tasker.extras.VARIABLE_REPLACE_KEYS>
|
||||
<net.dinglisch.android.tasker.extras.VARIABLE_REPLACE_KEYS-type>java.lang.String</net.dinglisch.android.tasker.extras.VARIABLE_REPLACE_KEYS-type>
|
||||
<net.dinglisch.android.tasker.subbundled>true</net.dinglisch.android.tasker.subbundled>
|
||||
<net.dinglisch.android.tasker.subbundled-type>java.lang.Boolean</net.dinglisch.android.tasker.subbundled-type>
|
||||
<plugininstanceid>e1a87f0a-2e17-4b02-ab14-479198b7aea8</plugininstanceid>
|
||||
<plugininstanceid-type>java.lang.String</plugininstanceid-type>
|
||||
<plugintypeid>com.joaomgcd.autonotification.intent.IntentCommandEvent</plugintypeid>
|
||||
<plugintypeid-type>java.lang.String</plugintypeid-type>
|
||||
</Vals>
|
||||
</Bundle>
|
||||
<Str sr="arg1" ve="3">com.joaomgcd.autonotification</Str>
|
||||
<Str sr="arg2" ve="3">com.joaomgcd.autonotification.activity.ActivityConfigConditionTaskerEvent</Str>
|
||||
<Int sr="arg3" val="1"/>
|
||||
</Event>
|
||||
</Profile>
|
||||
<Profile sr="prof109" ve="2">
|
||||
<cdate>1762631944649</cdate>
|
||||
<clp>true</clp>
|
||||
<edate>1762935044697</edate>
|
||||
<flags>8</flags>
|
||||
<id>109</id>
|
||||
<mid0>110</mid0>
|
||||
<nme>Launch Prepare For Exercise Notification</nme>
|
||||
<Time sr="con0">
|
||||
<fh>11</fh>
|
||||
<fm>30</fm>
|
||||
<th>11</th>
|
||||
<tm>30</tm>
|
||||
</Time>
|
||||
</Profile>
|
||||
<Profile sr="prof111" ve="2">
|
||||
<cdate>1762934954023</cdate>
|
||||
<edate>1762935062373</edate>
|
||||
<flags>8</flags>
|
||||
<id>111</id>
|
||||
<mid0>112</mid0>
|
||||
<Event sr="con0" ve="2">
|
||||
<code>1825107102</code>
|
||||
<pri>0</pri>
|
||||
<Bundle sr="arg0">
|
||||
<Vals sr="val">
|
||||
<com.twofortyfouram.locale.intent.extra.BLURB>Event Behaviour
|
||||
Filter: mark exercise done</com.twofortyfouram.locale.intent.extra.BLURB>
|
||||
<com.twofortyfouram.locale.intent.extra.BLURB-type>java.lang.String</com.twofortyfouram.locale.intent.extra.BLURB-type>
|
||||
<command_params_var>anpar</command_params_var>
|
||||
<command_params_var-type>java.lang.String</command_params_var-type>
|
||||
<command_var>ancomm</command_var>
|
||||
<command_var-type>java.lang.String</command_var-type>
|
||||
<config_notification_command>mark exercise done</config_notification_command>
|
||||
<config_notification_command-type>java.lang.String</config_notification_command-type>
|
||||
<message_single_case_insensitive>false</message_single_case_insensitive>
|
||||
<message_single_case_insensitive-type>java.lang.Boolean</message_single_case_insensitive-type>
|
||||
<message_single_exact>false</message_single_exact>
|
||||
<message_single_exact-type>java.lang.Boolean</message_single_exact-type>
|
||||
<message_single_regex>false</message_single_regex>
|
||||
<message_single_regex-type>java.lang.Boolean</message_single_regex-type>
|
||||
<message_var>anmessage</message_var>
|
||||
<message_var-type>java.lang.String</message_var-type>
|
||||
<net.dinglisch.android.tasker.EXTRA_NSR_DEPRECATED>true</net.dinglisch.android.tasker.EXTRA_NSR_DEPRECATED>
|
||||
<net.dinglisch.android.tasker.EXTRA_NSR_DEPRECATED-type>java.lang.Boolean</net.dinglisch.android.tasker.EXTRA_NSR_DEPRECATED-type>
|
||||
<net.dinglisch.android.tasker.RELEVANT_VARIABLES><StringArray sr=""><_array_net.dinglisch.android.tasker.RELEVANT_VARIABLES0>%ancomm
|
||||
Everything to the right of =:=
|
||||
Everything to the right of =:=</_array_net.dinglisch.android.tasker.RELEVANT_VARIABLES0><_array_net.dinglisch.android.tasker.RELEVANT_VARIABLES1>%anmessage
|
||||
Whole AutoNotification Message
|
||||
Whole AutoNotification Message</_array_net.dinglisch.android.tasker.RELEVANT_VARIABLES1><_array_net.dinglisch.android.tasker.RELEVANT_VARIABLES2>%anpar()
|
||||
Array of single words to the left of =:=
|
||||
Array of single words to the left of =:=</_array_net.dinglisch.android.tasker.RELEVANT_VARIABLES2></StringArray></net.dinglisch.android.tasker.RELEVANT_VARIABLES>
|
||||
<net.dinglisch.android.tasker.RELEVANT_VARIABLES-type>[Ljava.lang.String;</net.dinglisch.android.tasker.RELEVANT_VARIABLES-type>
|
||||
<net.dinglisch.android.tasker.extras.REQUESTED_TIMEOUT>10000</net.dinglisch.android.tasker.extras.REQUESTED_TIMEOUT>
|
||||
<net.dinglisch.android.tasker.extras.REQUESTED_TIMEOUT-type>java.lang.Integer</net.dinglisch.android.tasker.extras.REQUESTED_TIMEOUT-type>
|
||||
<net.dinglisch.android.tasker.extras.VARIABLE_REPLACE_KEYS>message_var command_var command_params_var config_notification_command plugininstanceid plugintypeid </net.dinglisch.android.tasker.extras.VARIABLE_REPLACE_KEYS>
|
||||
<net.dinglisch.android.tasker.extras.VARIABLE_REPLACE_KEYS-type>java.lang.String</net.dinglisch.android.tasker.extras.VARIABLE_REPLACE_KEYS-type>
|
||||
<net.dinglisch.android.tasker.subbundled>true</net.dinglisch.android.tasker.subbundled>
|
||||
<net.dinglisch.android.tasker.subbundled-type>java.lang.Boolean</net.dinglisch.android.tasker.subbundled-type>
|
||||
<plugininstanceid>6cbbccc1-1242-4f6a-861e-cfe4b82309fc</plugininstanceid>
|
||||
<plugininstanceid-type>java.lang.String</plugininstanceid-type>
|
||||
<plugintypeid>com.joaomgcd.autonotification.intent.IntentCommandEvent</plugintypeid>
|
||||
<plugintypeid-type>java.lang.String</plugintypeid-type>
|
||||
</Vals>
|
||||
</Bundle>
|
||||
<Str sr="arg1" ve="3">com.joaomgcd.autonotification</Str>
|
||||
<Str sr="arg2" ve="3">com.joaomgcd.autonotification.activity.ActivityConfigConditionTaskerEvent</Str>
|
||||
<Int sr="arg3" val="1"/>
|
||||
</Event>
|
||||
</Profile>
|
||||
<Project sr="proj0" ve="2">
|
||||
<cdate>1762862634390</cdate>
|
||||
<name>Skincare Demo</name>
|
||||
<pids>111,107,109,104</pids>
|
||||
<psort>ActiveAlpha</psort>
|
||||
<tids>108,105,112,82,110</tids>
|
||||
</Project>
|
||||
<Task sr="task105">
|
||||
<cdate>1762631971435</cdate>
|
||||
<edate>1762934992403</edate>
|
||||
<id>105</id>
|
||||
<nme>Open Skincare Notification</nme>
|
||||
<pri>6</pri>
|
||||
<Action sr="act0" ve="7">
|
||||
<code>166160670</code>
|
||||
<Bundle sr="arg0">
|
||||
<Vals sr="val">
|
||||
<ActionIconString1><null></ActionIconString1>
|
||||
<ActionIconString1-type>java.lang.String</ActionIconString1-type>
|
||||
<ActionIconString2><null></ActionIconString2>
|
||||
<ActionIconString2-type>java.lang.String</ActionIconString2-type>
|
||||
<ActionIconString3><null></ActionIconString3>
|
||||
<ActionIconString3-type>java.lang.String</ActionIconString3-type>
|
||||
<ActionIconString4><null></ActionIconString4>
|
||||
<ActionIconString4-type>java.lang.String</ActionIconString4-type>
|
||||
<ActionIconString5><null></ActionIconString5>
|
||||
<ActionIconString5-type>java.lang.String</ActionIconString5-type>
|
||||
<AppendTexts>false</AppendTexts>
|
||||
<AppendTexts-type>java.lang.Boolean</AppendTexts-type>
|
||||
<BackgroundColor><null></BackgroundColor>
|
||||
<BackgroundColor-type>java.lang.String</BackgroundColor-type>
|
||||
<BadgeType><null></BadgeType>
|
||||
<BadgeType-type>java.lang.String</BadgeType-type>
|
||||
<Button1UnlockScreen>false</Button1UnlockScreen>
|
||||
<Button1UnlockScreen-type>java.lang.Boolean</Button1UnlockScreen-type>
|
||||
<Button2UnlockScreen>false</Button2UnlockScreen>
|
||||
<Button2UnlockScreen-type>java.lang.Boolean</Button2UnlockScreen-type>
|
||||
<Button3UnlockScreen>false</Button3UnlockScreen>
|
||||
<Button3UnlockScreen-type>java.lang.Boolean</Button3UnlockScreen-type>
|
||||
<Button4UnlockScreen>false</Button4UnlockScreen>
|
||||
<Button4UnlockScreen-type>java.lang.Boolean</Button4UnlockScreen-type>
|
||||
<Button5UnlockScreen>false</Button5UnlockScreen>
|
||||
<Button5UnlockScreen-type>java.lang.Boolean</Button5UnlockScreen-type>
|
||||
<ChronometerCountDown>false</ChronometerCountDown>
|
||||
<ChronometerCountDown-type>java.lang.Boolean</ChronometerCountDown-type>
|
||||
<Colorize>false</Colorize>
|
||||
<Colorize-type>java.lang.Boolean</Colorize-type>
|
||||
<DismissOnTouchVariable><null></DismissOnTouchVariable>
|
||||
<DismissOnTouchVariable-type>java.lang.String</DismissOnTouchVariable-type>
|
||||
<ExtraInfo><null></ExtraInfo>
|
||||
<ExtraInfo-type>java.lang.String</ExtraInfo-type>
|
||||
<GroupAlertBehaviour><null></GroupAlertBehaviour>
|
||||
<GroupAlertBehaviour-type>java.lang.String</GroupAlertBehaviour-type>
|
||||
<GroupKey><null></GroupKey>
|
||||
<GroupKey-type>java.lang.String</GroupKey-type>
|
||||
<IconExpanded><null></IconExpanded>
|
||||
<IconExpanded-type>java.lang.String</IconExpanded-type>
|
||||
<IsGroupSummary>false</IsGroupSummary>
|
||||
<IsGroupSummary-type>java.lang.Boolean</IsGroupSummary-type>
|
||||
<IsGroupVariable><null></IsGroupVariable>
|
||||
<IsGroupVariable-type>java.lang.String</IsGroupVariable-type>
|
||||
<MediaAlbum><null></MediaAlbum>
|
||||
<MediaAlbum-type>java.lang.String</MediaAlbum-type>
|
||||
<MediaArtist><null></MediaArtist>
|
||||
<MediaArtist-type>java.lang.String</MediaArtist-type>
|
||||
<MediaDuration><null></MediaDuration>
|
||||
<MediaDuration-type>java.lang.String</MediaDuration-type>
|
||||
<MediaIcon><null></MediaIcon>
|
||||
<MediaIcon-type>java.lang.String</MediaIcon-type>
|
||||
<MediaLayout>false</MediaLayout>
|
||||
<MediaLayout-type>java.lang.Boolean</MediaLayout-type>
|
||||
<MediaNextCommand><null></MediaNextCommand>
|
||||
<MediaNextCommand-type>java.lang.String</MediaNextCommand-type>
|
||||
<MediaPauseCommand><null></MediaPauseCommand>
|
||||
<MediaPauseCommand-type>java.lang.String</MediaPauseCommand-type>
|
||||
<MediaPlayCommand><null></MediaPlayCommand>
|
||||
<MediaPlayCommand-type>java.lang.String</MediaPlayCommand-type>
|
||||
<MediaPlaybackState><null></MediaPlaybackState>
|
||||
<MediaPlaybackState-type>java.lang.String</MediaPlaybackState-type>
|
||||
<MediaPosition><null></MediaPosition>
|
||||
<MediaPosition-type>java.lang.String</MediaPosition-type>
|
||||
<MediaPreviousCommand><null></MediaPreviousCommand>
|
||||
<MediaPreviousCommand-type>java.lang.String</MediaPreviousCommand-type>
|
||||
<MediaTrack><null></MediaTrack>
|
||||
<MediaTrack-type>java.lang.String</MediaTrack-type>
|
||||
<MessagingImages><null></MessagingImages>
|
||||
<MessagingImages-type>java.lang.String</MessagingImages-type>
|
||||
<MessagingOwnIcon><null></MessagingOwnIcon>
|
||||
<MessagingOwnIcon-type>java.lang.String</MessagingOwnIcon-type>
|
||||
<MessagingOwnName><null></MessagingOwnName>
|
||||
<MessagingOwnName-type>java.lang.String</MessagingOwnName-type>
|
||||
<MessagingPersonBot><null></MessagingPersonBot>
|
||||
<MessagingPersonBot-type>java.lang.String</MessagingPersonBot-type>
|
||||
<MessagingPersonIcons><null></MessagingPersonIcons>
|
||||
<MessagingPersonIcons-type>java.lang.String</MessagingPersonIcons-type>
|
||||
<MessagingPersonImportant><null></MessagingPersonImportant>
|
||||
<MessagingPersonImportant-type>java.lang.String</MessagingPersonImportant-type>
|
||||
<MessagingPersonNames><null></MessagingPersonNames>
|
||||
<MessagingPersonNames-type>java.lang.String</MessagingPersonNames-type>
|
||||
<MessagingPersonUri><null></MessagingPersonUri>
|
||||
<MessagingPersonUri-type>java.lang.String</MessagingPersonUri-type>
|
||||
<MessagingSeparator><null></MessagingSeparator>
|
||||
<MessagingSeparator-type>java.lang.String</MessagingSeparator-type>
|
||||
<MessagingTexts><null></MessagingTexts>
|
||||
<MessagingTexts-type>java.lang.String</MessagingTexts-type>
|
||||
<NotificationChannelBypassDnd>false</NotificationChannelBypassDnd>
|
||||
<NotificationChannelBypassDnd-type>java.lang.Boolean</NotificationChannelBypassDnd-type>
|
||||
<NotificationChannelDescription><null></NotificationChannelDescription>
|
||||
<NotificationChannelDescription-type>java.lang.String</NotificationChannelDescription-type>
|
||||
<NotificationChannelId><null></NotificationChannelId>
|
||||
<NotificationChannelId-type>java.lang.String</NotificationChannelId-type>
|
||||
<NotificationChannelImportance><null></NotificationChannelImportance>
|
||||
<NotificationChannelImportance-type>java.lang.String</NotificationChannelImportance-type>
|
||||
<NotificationChannelName><null></NotificationChannelName>
|
||||
<NotificationChannelName-type>java.lang.String</NotificationChannelName-type>
|
||||
<NotificationChannelShowBadge>false</NotificationChannelShowBadge>
|
||||
<NotificationChannelShowBadge-type>java.lang.Boolean</NotificationChannelShowBadge-type>
|
||||
<PersistentVariable><null></PersistentVariable>
|
||||
<PersistentVariable-type>java.lang.String</PersistentVariable-type>
|
||||
<PhoneOnly>false</PhoneOnly>
|
||||
<PhoneOnly-type>java.lang.Boolean</PhoneOnly-type>
|
||||
<PriorityVariable><null></PriorityVariable>
|
||||
<PriorityVariable-type>java.lang.String</PriorityVariable-type>
|
||||
<PublicVersion><null></PublicVersion>
|
||||
<PublicVersion-type>java.lang.String</PublicVersion-type>
|
||||
<ReplyAction><null></ReplyAction>
|
||||
<ReplyAction-type>java.lang.String</ReplyAction-type>
|
||||
<ReplyChoices><null></ReplyChoices>
|
||||
<ReplyChoices-type>java.lang.String</ReplyChoices-type>
|
||||
<ReplyLabel><null></ReplyLabel>
|
||||
<ReplyLabel-type>java.lang.String</ReplyLabel-type>
|
||||
<ShareButtonsVariable><null></ShareButtonsVariable>
|
||||
<ShareButtonsVariable-type>java.lang.String</ShareButtonsVariable-type>
|
||||
<SkipPictureCache>false</SkipPictureCache>
|
||||
<SkipPictureCache-type>java.lang.Boolean</SkipPictureCache-type>
|
||||
<SoundPath><null></SoundPath>
|
||||
<SoundPath-type>java.lang.String</SoundPath-type>
|
||||
<StatusBarIconString><null></StatusBarIconString>
|
||||
<StatusBarIconString-type>java.lang.String</StatusBarIconString-type>
|
||||
<StatusBarTextSize>16</StatusBarTextSize>
|
||||
<StatusBarTextSize-type>java.lang.String</StatusBarTextSize-type>
|
||||
<TextExpanded><null></TextExpanded>
|
||||
<TextExpanded-type>java.lang.String</TextExpanded-type>
|
||||
<Time><null></Time>
|
||||
<Time-type>java.lang.String</Time-type>
|
||||
<TimeFormat><null></TimeFormat>
|
||||
<TimeFormat-type>java.lang.String</TimeFormat-type>
|
||||
<Timeout><null></Timeout>
|
||||
<Timeout-type>java.lang.String</Timeout-type>
|
||||
<TitleExpanded><null></TitleExpanded>
|
||||
<TitleExpanded-type>java.lang.String</TitleExpanded-type>
|
||||
<UpdateNotification>false</UpdateNotification>
|
||||
<UpdateNotification-type>java.lang.Boolean</UpdateNotification-type>
|
||||
<UseChronometer>false</UseChronometer>
|
||||
<UseChronometer-type>java.lang.Boolean</UseChronometer-type>
|
||||
<UseHTML>false</UseHTML>
|
||||
<UseHTML-type>java.lang.Boolean</UseHTML-type>
|
||||
<Visibility><null></Visibility>
|
||||
<Visibility-type>java.lang.String</Visibility-type>
|
||||
<com.twofortyfouram.locale.intent.extra.BLURB>Title: Morning Skincare
|
||||
Text: Go and be pretty!
|
||||
Action on Touch: Open morning skincare
|
||||
Status Bar Text Size: 16
|
||||
Id: skincare morning
|
||||
Separator: ,
|
||||
Button 1: open skincare note
|
||||
Label 1: Open Note
|
||||
Button 2: mark skincare done
|
||||
Label 2: Mark done</com.twofortyfouram.locale.intent.extra.BLURB>
|
||||
<com.twofortyfouram.locale.intent.extra.BLURB-type>java.lang.String</com.twofortyfouram.locale.intent.extra.BLURB-type>
|
||||
<config_action_1_icon><null></config_action_1_icon>
|
||||
<config_action_1_icon-type>java.lang.String</config_action_1_icon-type>
|
||||
<config_action_2_icon><null></config_action_2_icon>
|
||||
<config_action_2_icon-type>java.lang.String</config_action_2_icon-type>
|
||||
<config_action_3_icon><null></config_action_3_icon>
|
||||
<config_action_3_icon-type>java.lang.String</config_action_3_icon-type>
|
||||
<config_action_4_icon><null></config_action_4_icon>
|
||||
<config_action_4_icon-type>java.lang.String</config_action_4_icon-type>
|
||||
<config_action_5_icon><null></config_action_5_icon>
|
||||
<config_action_5_icon-type>java.lang.String</config_action_5_icon-type>
|
||||
<config_notification_action>Open morning skincare </config_notification_action>
|
||||
<config_notification_action-type>java.lang.String</config_notification_action-type>
|
||||
<config_notification_action_button1>open skincare note</config_notification_action_button1>
|
||||
<config_notification_action_button1-type>java.lang.String</config_notification_action_button1-type>
|
||||
<config_notification_action_button2>mark skincare done</config_notification_action_button2>
|
||||
<config_notification_action_button2-type>java.lang.String</config_notification_action_button2-type>
|
||||
<config_notification_action_button3><null></config_notification_action_button3>
|
||||
<config_notification_action_button3-type>java.lang.String</config_notification_action_button3-type>
|
||||
<config_notification_action_button4><null></config_notification_action_button4>
|
||||
<config_notification_action_button4-type>java.lang.String</config_notification_action_button4-type>
|
||||
<config_notification_action_button5><null></config_notification_action_button5>
|
||||
<config_notification_action_button5-type>java.lang.String</config_notification_action_button5-type>
|
||||
<config_notification_action_label1>Open Note</config_notification_action_label1>
|
||||
<config_notification_action_label1-type>java.lang.String</config_notification_action_label1-type>
|
||||
<config_notification_action_label2>Mark done</config_notification_action_label2>
|
||||
<config_notification_action_label2-type>java.lang.String</config_notification_action_label2-type>
|
||||
<config_notification_action_label3><null></config_notification_action_label3>
|
||||
<config_notification_action_label3-type>java.lang.String</config_notification_action_label3-type>
|
||||
<config_notification_action_on_dismiss><null></config_notification_action_on_dismiss>
|
||||
<config_notification_action_on_dismiss-type>java.lang.String</config_notification_action_on_dismiss-type>
|
||||
<config_notification_action_share>false</config_notification_action_share>
|
||||
<config_notification_action_share-type>java.lang.Boolean</config_notification_action_share-type>
|
||||
<config_notification_command><null></config_notification_command>
|
||||
<config_notification_command-type>java.lang.String</config_notification_command-type>
|
||||
<config_notification_content_info><null></config_notification_content_info>
|
||||
<config_notification_content_info-type>java.lang.String</config_notification_content_info-type>
|
||||
<config_notification_dismiss_on_touch>false</config_notification_dismiss_on_touch>
|
||||
<config_notification_dismiss_on_touch-type>java.lang.Boolean</config_notification_dismiss_on_touch-type>
|
||||
<config_notification_icon><null></config_notification_icon>
|
||||
<config_notification_icon-type>java.lang.String</config_notification_icon-type>
|
||||
<config_notification_indeterminate_progress>false</config_notification_indeterminate_progress>
|
||||
<config_notification_indeterminate_progress-type>java.lang.Boolean</config_notification_indeterminate_progress-type>
|
||||
<config_notification_led_color><null></config_notification_led_color>
|
||||
<config_notification_led_color-type>java.lang.String</config_notification_led_color-type>
|
||||
<config_notification_led_off><null></config_notification_led_off>
|
||||
<config_notification_led_off-type>java.lang.String</config_notification_led_off-type>
|
||||
<config_notification_led_on><null></config_notification_led_on>
|
||||
<config_notification_led_on-type>java.lang.String</config_notification_led_on-type>
|
||||
<config_notification_max_progress><null></config_notification_max_progress>
|
||||
<config_notification_max_progress-type>java.lang.String</config_notification_max_progress-type>
|
||||
<config_notification_number><null></config_notification_number>
|
||||
<config_notification_number-type>java.lang.String</config_notification_number-type>
|
||||
<config_notification_persistent>false</config_notification_persistent>
|
||||
<config_notification_persistent-type>java.lang.Boolean</config_notification_persistent-type>
|
||||
<config_notification_picture><null></config_notification_picture>
|
||||
<config_notification_picture-type>java.lang.String</config_notification_picture-type>
|
||||
<config_notification_priority><null></config_notification_priority>
|
||||
<config_notification_priority-type>java.lang.String</config_notification_priority-type>
|
||||
<config_notification_progress><null></config_notification_progress>
|
||||
<config_notification_progress-type>java.lang.String</config_notification_progress-type>
|
||||
<config_notification_subtext><null></config_notification_subtext>
|
||||
<config_notification_subtext-type>java.lang.String</config_notification_subtext-type>
|
||||
<config_notification_text>Go and be pretty!</config_notification_text>
|
||||
<config_notification_text-type>java.lang.String</config_notification_text-type>
|
||||
<config_notification_ticker><null></config_notification_ticker>
|
||||
<config_notification_ticker-type>java.lang.String</config_notification_ticker-type>
|
||||
<config_notification_title>Morning Skincare </config_notification_title>
|
||||
<config_notification_title-type>java.lang.String</config_notification_title-type>
|
||||
<config_notification_url><null></config_notification_url>
|
||||
<config_notification_url-type>java.lang.String</config_notification_url-type>
|
||||
<config_notification_vibration><null></config_notification_vibration>
|
||||
<config_notification_vibration-type>java.lang.String</config_notification_vibration-type>
|
||||
<net.dinglisch.android.tasker.RELEVANT_VARIABLES><StringArray sr=""><_array_net.dinglisch.android.tasker.RELEVANT_VARIABLES0>%err
|
||||
Error Code
|
||||
Only available if you select &lt;b&gt;Continue Task After Error&lt;/b&gt; and the action ends in error</_array_net.dinglisch.android.tasker.RELEVANT_VARIABLES0><_array_net.dinglisch.android.tasker.RELEVANT_VARIABLES1>%errmsg
|
||||
Error Message
|
||||
Only available if you select &lt;b&gt;Continue Task After Error&lt;/b&gt; and the action ends in error</_array_net.dinglisch.android.tasker.RELEVANT_VARIABLES1></StringArray></net.dinglisch.android.tasker.RELEVANT_VARIABLES>
|
||||
<net.dinglisch.android.tasker.RELEVANT_VARIABLES-type>[Ljava.lang.String;</net.dinglisch.android.tasker.RELEVANT_VARIABLES-type>
|
||||
<net.dinglisch.android.tasker.extras.VARIABLE_REPLACE_KEYS>StatusBarTextSize config_notification_title config_notification_text config_notification_action config_notification_action_button1 config_notification_action_label1 config_notification_action_button2 config_notification_action_label2 notificaitionid plugininstanceid plugintypeid </net.dinglisch.android.tasker.extras.VARIABLE_REPLACE_KEYS>
|
||||
<net.dinglisch.android.tasker.extras.VARIABLE_REPLACE_KEYS-type>java.lang.String</net.dinglisch.android.tasker.extras.VARIABLE_REPLACE_KEYS-type>
|
||||
<net.dinglisch.android.tasker.subbundled>true</net.dinglisch.android.tasker.subbundled>
|
||||
<net.dinglisch.android.tasker.subbundled-type>java.lang.Boolean</net.dinglisch.android.tasker.subbundled-type>
|
||||
<notificaitionid>skincare morning </notificaitionid>
|
||||
<notificaitionid-type>java.lang.String</notificaitionid-type>
|
||||
<notificaitionsound><null></notificaitionsound>
|
||||
<notificaitionsound-type>java.lang.String</notificaitionsound-type>
|
||||
<plugininstanceid>2c3b7c1e-0ee9-4d73-bf77-2b1311cf1a25</plugininstanceid>
|
||||
<plugininstanceid-type>java.lang.String</plugininstanceid-type>
|
||||
<plugintypeid>com.joaomgcd.autonotification.intent.IntentNotification</plugintypeid>
|
||||
<plugintypeid-type>java.lang.String</plugintypeid-type>
|
||||
<preferenceScreen><null></preferenceScreen>
|
||||
<preferenceScreen-type>java.lang.String</preferenceScreen-type>
|
||||
</Vals>
|
||||
</Bundle>
|
||||
<Str sr="arg1" ve="3">com.joaomgcd.autonotification</Str>
|
||||
<Str sr="arg2" ve="3">com.joaomgcd.autonotification.activity.ActivityConfigNotify</Str>
|
||||
<Int sr="arg3" val="20"/>
|
||||
<Int sr="arg4" val="1"/>
|
||||
</Action>
|
||||
</Task>
|
||||
<Task sr="task108">
|
||||
<cdate>1762862950419</cdate>
|
||||
<edate>1762935050872</edate>
|
||||
<id>108</id>
|
||||
<nme>Mark Skincare Done</nme>
|
||||
<Action sr="act0" ve="7">
|
||||
<code>2112800467</code>
|
||||
<Bundle sr="arg0">
|
||||
<Vals sr="val">
|
||||
<action>0</action>
|
||||
<action-type>java.lang.Integer</action-type>
|
||||
<com.twofortyfouram.locale.intent.extra.BLURB>Check: Morning routine</com.twofortyfouram.locale.intent.extra.BLURB>
|
||||
<com.twofortyfouram.locale.intent.extra.BLURB-type>java.lang.String</com.twofortyfouram.locale.intent.extra.BLURB-type>
|
||||
<habit>11</habit>
|
||||
<habit-type>java.lang.Long</habit-type>
|
||||
<net.dinglisch.android.tasker.subbundled>true</net.dinglisch.android.tasker.subbundled>
|
||||
<net.dinglisch.android.tasker.subbundled-type>java.lang.Boolean</net.dinglisch.android.tasker.subbundled-type>
|
||||
</Vals>
|
||||
</Bundle>
|
||||
<Str sr="arg1" ve="3">org.isoron.uhabits</Str>
|
||||
<Str sr="arg2" ve="3">org.isoron.uhabits.automation.EditSettingActivity</Str>
|
||||
<Int sr="arg3" val="0"/>
|
||||
<Int sr="arg4" val="1"/>
|
||||
</Action>
|
||||
</Task>
|
||||
<Task sr="task110">
|
||||
<cdate>1762631971435</cdate>
|
||||
<edate>1762935044696</edate>
|
||||
<id>110</id>
|
||||
<nme>Open Prepare Exercise Notification</nme>
|
||||
<pri>100</pri>
|
||||
<Action sr="act0" ve="7">
|
||||
<code>166160670</code>
|
||||
<Bundle sr="arg0">
|
||||
<Vals sr="val">
|
||||
<ActionIconString1><null></ActionIconString1>
|
||||
<ActionIconString1-type>java.lang.String</ActionIconString1-type>
|
||||
<ActionIconString2><null></ActionIconString2>
|
||||
<ActionIconString2-type>java.lang.String</ActionIconString2-type>
|
||||
<ActionIconString3><null></ActionIconString3>
|
||||
<ActionIconString3-type>java.lang.String</ActionIconString3-type>
|
||||
<ActionIconString4><null></ActionIconString4>
|
||||
<ActionIconString4-type>java.lang.String</ActionIconString4-type>
|
||||
<ActionIconString5><null></ActionIconString5>
|
||||
<ActionIconString5-type>java.lang.String</ActionIconString5-type>
|
||||
<AppendTexts>false</AppendTexts>
|
||||
<AppendTexts-type>java.lang.Boolean</AppendTexts-type>
|
||||
<BackgroundColor><null></BackgroundColor>
|
||||
<BackgroundColor-type>java.lang.String</BackgroundColor-type>
|
||||
<BadgeType><null></BadgeType>
|
||||
<BadgeType-type>java.lang.String</BadgeType-type>
|
||||
<Button1UnlockScreen>false</Button1UnlockScreen>
|
||||
<Button1UnlockScreen-type>java.lang.Boolean</Button1UnlockScreen-type>
|
||||
<Button2UnlockScreen>false</Button2UnlockScreen>
|
||||
<Button2UnlockScreen-type>java.lang.Boolean</Button2UnlockScreen-type>
|
||||
<Button3UnlockScreen>false</Button3UnlockScreen>
|
||||
<Button3UnlockScreen-type>java.lang.Boolean</Button3UnlockScreen-type>
|
||||
<Button4UnlockScreen>false</Button4UnlockScreen>
|
||||
<Button4UnlockScreen-type>java.lang.Boolean</Button4UnlockScreen-type>
|
||||
<Button5UnlockScreen>false</Button5UnlockScreen>
|
||||
<Button5UnlockScreen-type>java.lang.Boolean</Button5UnlockScreen-type>
|
||||
<ChronometerCountDown>false</ChronometerCountDown>
|
||||
<ChronometerCountDown-type>java.lang.Boolean</ChronometerCountDown-type>
|
||||
<Colorize>false</Colorize>
|
||||
<Colorize-type>java.lang.Boolean</Colorize-type>
|
||||
<DismissOnTouchVariable><null></DismissOnTouchVariable>
|
||||
<DismissOnTouchVariable-type>java.lang.String</DismissOnTouchVariable-type>
|
||||
<ExtraInfo><null></ExtraInfo>
|
||||
<ExtraInfo-type>java.lang.String</ExtraInfo-type>
|
||||
<GroupAlertBehaviour><null></GroupAlertBehaviour>
|
||||
<GroupAlertBehaviour-type>java.lang.String</GroupAlertBehaviour-type>
|
||||
<GroupKey><null></GroupKey>
|
||||
<GroupKey-type>java.lang.String</GroupKey-type>
|
||||
<IconExpanded><null></IconExpanded>
|
||||
<IconExpanded-type>java.lang.String</IconExpanded-type>
|
||||
<IsGroupSummary>false</IsGroupSummary>
|
||||
<IsGroupSummary-type>java.lang.Boolean</IsGroupSummary-type>
|
||||
<IsGroupVariable><null></IsGroupVariable>
|
||||
<IsGroupVariable-type>java.lang.String</IsGroupVariable-type>
|
||||
<MediaAlbum><null></MediaAlbum>
|
||||
<MediaAlbum-type>java.lang.String</MediaAlbum-type>
|
||||
<MediaArtist><null></MediaArtist>
|
||||
<MediaArtist-type>java.lang.String</MediaArtist-type>
|
||||
<MediaDuration><null></MediaDuration>
|
||||
<MediaDuration-type>java.lang.String</MediaDuration-type>
|
||||
<MediaIcon><null></MediaIcon>
|
||||
<MediaIcon-type>java.lang.String</MediaIcon-type>
|
||||
<MediaLayout>false</MediaLayout>
|
||||
<MediaLayout-type>java.lang.Boolean</MediaLayout-type>
|
||||
<MediaNextCommand><null></MediaNextCommand>
|
||||
<MediaNextCommand-type>java.lang.String</MediaNextCommand-type>
|
||||
<MediaPauseCommand><null></MediaPauseCommand>
|
||||
<MediaPauseCommand-type>java.lang.String</MediaPauseCommand-type>
|
||||
<MediaPlayCommand><null></MediaPlayCommand>
|
||||
<MediaPlayCommand-type>java.lang.String</MediaPlayCommand-type>
|
||||
<MediaPlaybackState><null></MediaPlaybackState>
|
||||
<MediaPlaybackState-type>java.lang.String</MediaPlaybackState-type>
|
||||
<MediaPosition><null></MediaPosition>
|
||||
<MediaPosition-type>java.lang.String</MediaPosition-type>
|
||||
<MediaPreviousCommand><null></MediaPreviousCommand>
|
||||
<MediaPreviousCommand-type>java.lang.String</MediaPreviousCommand-type>
|
||||
<MediaTrack><null></MediaTrack>
|
||||
<MediaTrack-type>java.lang.String</MediaTrack-type>
|
||||
<MessagingImages><null></MessagingImages>
|
||||
<MessagingImages-type>java.lang.String</MessagingImages-type>
|
||||
<MessagingOwnIcon><null></MessagingOwnIcon>
|
||||
<MessagingOwnIcon-type>java.lang.String</MessagingOwnIcon-type>
|
||||
<MessagingOwnName><null></MessagingOwnName>
|
||||
<MessagingOwnName-type>java.lang.String</MessagingOwnName-type>
|
||||
<MessagingPersonBot><null></MessagingPersonBot>
|
||||
<MessagingPersonBot-type>java.lang.String</MessagingPersonBot-type>
|
||||
<MessagingPersonIcons><null></MessagingPersonIcons>
|
||||
<MessagingPersonIcons-type>java.lang.String</MessagingPersonIcons-type>
|
||||
<MessagingPersonImportant><null></MessagingPersonImportant>
|
||||
<MessagingPersonImportant-type>java.lang.String</MessagingPersonImportant-type>
|
||||
<MessagingPersonNames><null></MessagingPersonNames>
|
||||
<MessagingPersonNames-type>java.lang.String</MessagingPersonNames-type>
|
||||
<MessagingPersonUri><null></MessagingPersonUri>
|
||||
<MessagingPersonUri-type>java.lang.String</MessagingPersonUri-type>
|
||||
<MessagingSeparator><null></MessagingSeparator>
|
||||
<MessagingSeparator-type>java.lang.String</MessagingSeparator-type>
|
||||
<MessagingTexts><null></MessagingTexts>
|
||||
<MessagingTexts-type>java.lang.String</MessagingTexts-type>
|
||||
<NotificationChannelBypassDnd>false</NotificationChannelBypassDnd>
|
||||
<NotificationChannelBypassDnd-type>java.lang.Boolean</NotificationChannelBypassDnd-type>
|
||||
<NotificationChannelDescription><null></NotificationChannelDescription>
|
||||
<NotificationChannelDescription-type>java.lang.String</NotificationChannelDescription-type>
|
||||
<NotificationChannelId><null></NotificationChannelId>
|
||||
<NotificationChannelId-type>java.lang.String</NotificationChannelId-type>
|
||||
<NotificationChannelImportance><null></NotificationChannelImportance>
|
||||
<NotificationChannelImportance-type>java.lang.String</NotificationChannelImportance-type>
|
||||
<NotificationChannelName><null></NotificationChannelName>
|
||||
<NotificationChannelName-type>java.lang.String</NotificationChannelName-type>
|
||||
<NotificationChannelShowBadge>false</NotificationChannelShowBadge>
|
||||
<NotificationChannelShowBadge-type>java.lang.Boolean</NotificationChannelShowBadge-type>
|
||||
<PersistentVariable><null></PersistentVariable>
|
||||
<PersistentVariable-type>java.lang.String</PersistentVariable-type>
|
||||
<PhoneOnly>false</PhoneOnly>
|
||||
<PhoneOnly-type>java.lang.Boolean</PhoneOnly-type>
|
||||
<PriorityVariable><null></PriorityVariable>
|
||||
<PriorityVariable-type>java.lang.String</PriorityVariable-type>
|
||||
<PublicVersion><null></PublicVersion>
|
||||
<PublicVersion-type>java.lang.String</PublicVersion-type>
|
||||
<ReplyAction><null></ReplyAction>
|
||||
<ReplyAction-type>java.lang.String</ReplyAction-type>
|
||||
<ReplyChoices><null></ReplyChoices>
|
||||
<ReplyChoices-type>java.lang.String</ReplyChoices-type>
|
||||
<ReplyLabel><null></ReplyLabel>
|
||||
<ReplyLabel-type>java.lang.String</ReplyLabel-type>
|
||||
<ShareButtonsVariable><null></ShareButtonsVariable>
|
||||
<ShareButtonsVariable-type>java.lang.String</ShareButtonsVariable-type>
|
||||
<SkipPictureCache>false</SkipPictureCache>
|
||||
<SkipPictureCache-type>java.lang.Boolean</SkipPictureCache-type>
|
||||
<SoundPath><null></SoundPath>
|
||||
<SoundPath-type>java.lang.String</SoundPath-type>
|
||||
<StatusBarIconString><null></StatusBarIconString>
|
||||
<StatusBarIconString-type>java.lang.String</StatusBarIconString-type>
|
||||
<StatusBarTextSize>16</StatusBarTextSize>
|
||||
<StatusBarTextSize-type>java.lang.String</StatusBarTextSize-type>
|
||||
<TextExpanded><null></TextExpanded>
|
||||
<TextExpanded-type>java.lang.String</TextExpanded-type>
|
||||
<Time><null></Time>
|
||||
<Time-type>java.lang.String</Time-type>
|
||||
<TimeFormat><null></TimeFormat>
|
||||
<TimeFormat-type>java.lang.String</TimeFormat-type>
|
||||
<Timeout><null></Timeout>
|
||||
<Timeout-type>java.lang.String</Timeout-type>
|
||||
<TitleExpanded><null></TitleExpanded>
|
||||
<TitleExpanded-type>java.lang.String</TitleExpanded-type>
|
||||
<UpdateNotification>false</UpdateNotification>
|
||||
<UpdateNotification-type>java.lang.Boolean</UpdateNotification-type>
|
||||
<UseChronometer>false</UseChronometer>
|
||||
<UseChronometer-type>java.lang.Boolean</UseChronometer-type>
|
||||
<UseHTML>false</UseHTML>
|
||||
<UseHTML-type>java.lang.Boolean</UseHTML-type>
|
||||
<Visibility><null></Visibility>
|
||||
<Visibility-type>java.lang.String</Visibility-type>
|
||||
<com.twofortyfouram.locale.intent.extra.BLURB>Title: Prepare for your exercise!
|
||||
Text: Go and load up!
|
||||
Action on Touch: Open morning skincare
|
||||
Icon: android.resource://net.dinglisch.android.taskerm/hd_aaa_ext_ball
|
||||
Status Bar Icon: ic_launcher
|
||||
Status Bar Text Size: 16
|
||||
Id: prepare for exercise
|
||||
Priority: 2
|
||||
Separator: ,
|
||||
Button 1: open exercise note
|
||||
Label 1: Open Note
|
||||
Button 2: mark exercise done
|
||||
Label 2: Mark done</com.twofortyfouram.locale.intent.extra.BLURB>
|
||||
<com.twofortyfouram.locale.intent.extra.BLURB-type>java.lang.String</com.twofortyfouram.locale.intent.extra.BLURB-type>
|
||||
<config_action_1_icon><null></config_action_1_icon>
|
||||
<config_action_1_icon-type>java.lang.String</config_action_1_icon-type>
|
||||
<config_action_2_icon><null></config_action_2_icon>
|
||||
<config_action_2_icon-type>java.lang.String</config_action_2_icon-type>
|
||||
<config_action_3_icon><null></config_action_3_icon>
|
||||
<config_action_3_icon-type>java.lang.String</config_action_3_icon-type>
|
||||
<config_action_4_icon><null></config_action_4_icon>
|
||||
<config_action_4_icon-type>java.lang.String</config_action_4_icon-type>
|
||||
<config_action_5_icon><null></config_action_5_icon>
|
||||
<config_action_5_icon-type>java.lang.String</config_action_5_icon-type>
|
||||
<config_notification_action>Open morning skincare </config_notification_action>
|
||||
<config_notification_action-type>java.lang.String</config_notification_action-type>
|
||||
<config_notification_action_button1>open exercise note</config_notification_action_button1>
|
||||
<config_notification_action_button1-type>java.lang.String</config_notification_action_button1-type>
|
||||
<config_notification_action_button2>mark exercise done</config_notification_action_button2>
|
||||
<config_notification_action_button2-type>java.lang.String</config_notification_action_button2-type>
|
||||
<config_notification_action_button3><null></config_notification_action_button3>
|
||||
<config_notification_action_button3-type>java.lang.String</config_notification_action_button3-type>
|
||||
<config_notification_action_button4><null></config_notification_action_button4>
|
||||
<config_notification_action_button4-type>java.lang.String</config_notification_action_button4-type>
|
||||
<config_notification_action_button5><null></config_notification_action_button5>
|
||||
<config_notification_action_button5-type>java.lang.String</config_notification_action_button5-type>
|
||||
<config_notification_action_label1>Open Note</config_notification_action_label1>
|
||||
<config_notification_action_label1-type>java.lang.String</config_notification_action_label1-type>
|
||||
<config_notification_action_label2>Mark done</config_notification_action_label2>
|
||||
<config_notification_action_label2-type>java.lang.String</config_notification_action_label2-type>
|
||||
<config_notification_action_label3><null></config_notification_action_label3>
|
||||
<config_notification_action_label3-type>java.lang.String</config_notification_action_label3-type>
|
||||
<config_notification_action_on_dismiss><null></config_notification_action_on_dismiss>
|
||||
<config_notification_action_on_dismiss-type>java.lang.String</config_notification_action_on_dismiss-type>
|
||||
<config_notification_action_share>false</config_notification_action_share>
|
||||
<config_notification_action_share-type>java.lang.Boolean</config_notification_action_share-type>
|
||||
<config_notification_command><null></config_notification_command>
|
||||
<config_notification_command-type>java.lang.String</config_notification_command-type>
|
||||
<config_notification_content_info><null></config_notification_content_info>
|
||||
<config_notification_content_info-type>java.lang.String</config_notification_content_info-type>
|
||||
<config_notification_dismiss_on_touch>false</config_notification_dismiss_on_touch>
|
||||
<config_notification_dismiss_on_touch-type>java.lang.Boolean</config_notification_dismiss_on_touch-type>
|
||||
<config_notification_icon>android.resource://net.dinglisch.android.taskerm/hd_aaa_ext_ball</config_notification_icon>
|
||||
<config_notification_icon-type>java.lang.String</config_notification_icon-type>
|
||||
<config_notification_indeterminate_progress>false</config_notification_indeterminate_progress>
|
||||
<config_notification_indeterminate_progress-type>java.lang.Boolean</config_notification_indeterminate_progress-type>
|
||||
<config_notification_led_color><null></config_notification_led_color>
|
||||
<config_notification_led_color-type>java.lang.String</config_notification_led_color-type>
|
||||
<config_notification_led_off><null></config_notification_led_off>
|
||||
<config_notification_led_off-type>java.lang.String</config_notification_led_off-type>
|
||||
<config_notification_led_on><null></config_notification_led_on>
|
||||
<config_notification_led_on-type>java.lang.String</config_notification_led_on-type>
|
||||
<config_notification_max_progress><null></config_notification_max_progress>
|
||||
<config_notification_max_progress-type>java.lang.String</config_notification_max_progress-type>
|
||||
<config_notification_number><null></config_notification_number>
|
||||
<config_notification_number-type>java.lang.String</config_notification_number-type>
|
||||
<config_notification_persistent>true</config_notification_persistent>
|
||||
<config_notification_persistent-type>java.lang.Boolean</config_notification_persistent-type>
|
||||
<config_notification_picture><null></config_notification_picture>
|
||||
<config_notification_picture-type>java.lang.String</config_notification_picture-type>
|
||||
<config_notification_priority>2</config_notification_priority>
|
||||
<config_notification_priority-type>java.lang.String</config_notification_priority-type>
|
||||
<config_notification_progress><null></config_notification_progress>
|
||||
<config_notification_progress-type>java.lang.String</config_notification_progress-type>
|
||||
<config_notification_subtext><null></config_notification_subtext>
|
||||
<config_notification_subtext-type>java.lang.String</config_notification_subtext-type>
|
||||
<config_notification_text>Go and load up!</config_notification_text>
|
||||
<config_notification_text-type>java.lang.String</config_notification_text-type>
|
||||
<config_notification_ticker><null></config_notification_ticker>
|
||||
<config_notification_ticker-type>java.lang.String</config_notification_ticker-type>
|
||||
<config_notification_title>Prepare for your exercise!</config_notification_title>
|
||||
<config_notification_title-type>java.lang.String</config_notification_title-type>
|
||||
<config_notification_url><null></config_notification_url>
|
||||
<config_notification_url-type>java.lang.String</config_notification_url-type>
|
||||
<config_notification_vibration><null></config_notification_vibration>
|
||||
<config_notification_vibration-type>java.lang.String</config_notification_vibration-type>
|
||||
<net.dinglisch.android.tasker.extras.VARIABLE_REPLACE_KEYS>StatusBarTextSize config_notification_title config_notification_text config_notification_action config_notification_icon config_notification_action_button1 config_notification_action_label1 config_notification_action_button2 config_notification_action_label2 notificaitionid preferenceScreen config_notification_priority plugininstanceid plugintypeid </net.dinglisch.android.tasker.extras.VARIABLE_REPLACE_KEYS>
|
||||
<net.dinglisch.android.tasker.extras.VARIABLE_REPLACE_KEYS-type>java.lang.String</net.dinglisch.android.tasker.extras.VARIABLE_REPLACE_KEYS-type>
|
||||
<net.dinglisch.android.tasker.subbundled>true</net.dinglisch.android.tasker.subbundled>
|
||||
<net.dinglisch.android.tasker.subbundled-type>java.lang.Boolean</net.dinglisch.android.tasker.subbundled-type>
|
||||
<notificaitionid>prepare for exercise</notificaitionid>
|
||||
<notificaitionid-type>java.lang.String</notificaitionid-type>
|
||||
<notificaitionsound><null></notificaitionsound>
|
||||
<notificaitionsound-type>java.lang.String</notificaitionsound-type>
|
||||
<plugininstanceid>2c3b7c1e-0ee9-4d73-bf77-2b1311cf1a25</plugininstanceid>
|
||||
<plugininstanceid-type>java.lang.String</plugininstanceid-type>
|
||||
<plugintypeid>com.joaomgcd.autonotification.intent.IntentNotification</plugintypeid>
|
||||
<plugintypeid-type>java.lang.String</plugintypeid-type>
|
||||
<preferenceScreen>ic_launcher</preferenceScreen>
|
||||
<preferenceScreen-type>java.lang.String</preferenceScreen-type>
|
||||
</Vals>
|
||||
</Bundle>
|
||||
<Str sr="arg1" ve="3">com.joaomgcd.autonotification</Str>
|
||||
<Str sr="arg2" ve="3">com.joaomgcd.autonotification.activity.ActivityConfigNotify</Str>
|
||||
<Int sr="arg3" val="20"/>
|
||||
<Int sr="arg4" val="1"/>
|
||||
</Action>
|
||||
</Task>
|
||||
<Task sr="task112">
|
||||
<cdate>1762934967274</cdate>
|
||||
<edate>1762935062373</edate>
|
||||
<id>112</id>
|
||||
<nme>Dismiss Exercise Notification</nme>
|
||||
<pri>6</pri>
|
||||
<Action sr="act0" ve="7">
|
||||
<code>2046367074</code>
|
||||
<Bundle sr="arg0">
|
||||
<Vals sr="val">
|
||||
<App><null></App>
|
||||
<App-type>java.lang.String</App-type>
|
||||
<CancelAll>false</CancelAll>
|
||||
<CancelAll-type>java.lang.Boolean</CancelAll-type>
|
||||
<CancelPersistent>false</CancelPersistent>
|
||||
<CancelPersistent-type>java.lang.Boolean</CancelPersistent-type>
|
||||
<CaseinsensitiveApp>false</CaseinsensitiveApp>
|
||||
<CaseinsensitiveApp-type>java.lang.Boolean</CaseinsensitiveApp-type>
|
||||
<CaseinsensitivePackage>false</CaseinsensitivePackage>
|
||||
<CaseinsensitivePackage-type>java.lang.Boolean</CaseinsensitivePackage-type>
|
||||
<CaseinsensitiveText>false</CaseinsensitiveText>
|
||||
<CaseinsensitiveText-type>java.lang.Boolean</CaseinsensitiveText-type>
|
||||
<CaseinsensitiveTitle>false</CaseinsensitiveTitle>
|
||||
<CaseinsensitiveTitle-type>java.lang.Boolean</CaseinsensitiveTitle-type>
|
||||
<ExactApp>false</ExactApp>
|
||||
<ExactApp-type>java.lang.Boolean</ExactApp-type>
|
||||
<ExactPackage>false</ExactPackage>
|
||||
<ExactPackage-type>java.lang.Boolean</ExactPackage-type>
|
||||
<ExactText>false</ExactText>
|
||||
<ExactText-type>java.lang.Boolean</ExactText-type>
|
||||
<ExactTitle>false</ExactTitle>
|
||||
<ExactTitle-type>java.lang.Boolean</ExactTitle-type>
|
||||
<InterceptApps><StringArray sr=""/></InterceptApps>
|
||||
<InterceptApps-type>[Ljava.lang.String;</InterceptApps-type>
|
||||
<InvertApp>false</InvertApp>
|
||||
<InvertApp-type>java.lang.Boolean</InvertApp-type>
|
||||
<InvertPackage>false</InvertPackage>
|
||||
<InvertPackage-type>java.lang.Boolean</InvertPackage-type>
|
||||
<InvertText>false</InvertText>
|
||||
<InvertText-type>java.lang.Boolean</InvertText-type>
|
||||
<InvertTitle>false</InvertTitle>
|
||||
<InvertTitle-type>java.lang.Boolean</InvertTitle-type>
|
||||
<OtherId><null></OtherId>
|
||||
<OtherId-type>java.lang.String</OtherId-type>
|
||||
<OtherPackage><null></OtherPackage>
|
||||
<OtherPackage-type>java.lang.String</OtherPackage-type>
|
||||
<OtherTag><null></OtherTag>
|
||||
<OtherTag-type>java.lang.String</OtherTag-type>
|
||||
<PackageName><null></PackageName>
|
||||
<PackageName-type>java.lang.String</PackageName-type>
|
||||
<RegexApp>false</RegexApp>
|
||||
<RegexApp-type>java.lang.Boolean</RegexApp-type>
|
||||
<RegexPackage>false</RegexPackage>
|
||||
<RegexPackage-type>java.lang.Boolean</RegexPackage-type>
|
||||
<RegexText>false</RegexText>
|
||||
<RegexText-type>java.lang.Boolean</RegexText-type>
|
||||
<RegexTitle>false</RegexTitle>
|
||||
<RegexTitle-type>java.lang.Boolean</RegexTitle-type>
|
||||
<Text><null></Text>
|
||||
<Text-type>java.lang.String</Text-type>
|
||||
<Title><null></Title>
|
||||
<Title-type>java.lang.String</Title-type>
|
||||
<com.twofortyfouram.locale.intent.extra.BLURB>Id: prepare for exercise</com.twofortyfouram.locale.intent.extra.BLURB>
|
||||
<com.twofortyfouram.locale.intent.extra.BLURB-type>java.lang.String</com.twofortyfouram.locale.intent.extra.BLURB-type>
|
||||
<net.dinglisch.android.tasker.RELEVANT_VARIABLES><StringArray sr=""><_array_net.dinglisch.android.tasker.RELEVANT_VARIABLES0>%err
|
||||
Error Code
|
||||
Only available if you select &lt;b&gt;Continue Task After Error&lt;/b&gt; and the action ends in error</_array_net.dinglisch.android.tasker.RELEVANT_VARIABLES0><_array_net.dinglisch.android.tasker.RELEVANT_VARIABLES1>%errmsg
|
||||
Error Message
|
||||
Only available if you select &lt;b&gt;Continue Task After Error&lt;/b&gt; and the action ends in error</_array_net.dinglisch.android.tasker.RELEVANT_VARIABLES1></StringArray></net.dinglisch.android.tasker.RELEVANT_VARIABLES>
|
||||
<net.dinglisch.android.tasker.RELEVANT_VARIABLES-type>[Ljava.lang.String;</net.dinglisch.android.tasker.RELEVANT_VARIABLES-type>
|
||||
<net.dinglisch.android.tasker.extras.VARIABLE_REPLACE_KEYS>notificaitionid plugininstanceid plugintypeid </net.dinglisch.android.tasker.extras.VARIABLE_REPLACE_KEYS>
|
||||
<net.dinglisch.android.tasker.extras.VARIABLE_REPLACE_KEYS-type>java.lang.String</net.dinglisch.android.tasker.extras.VARIABLE_REPLACE_KEYS-type>
|
||||
<net.dinglisch.android.tasker.subbundled>true</net.dinglisch.android.tasker.subbundled>
|
||||
<net.dinglisch.android.tasker.subbundled-type>java.lang.Boolean</net.dinglisch.android.tasker.subbundled-type>
|
||||
<notificaitionid>prepare for exercise</notificaitionid>
|
||||
<notificaitionid-type>java.lang.String</notificaitionid-type>
|
||||
<plugininstanceid>2d6b7e1a-427b-442e-9f39-356480bf35d2</plugininstanceid>
|
||||
<plugininstanceid-type>java.lang.String</plugininstanceid-type>
|
||||
<plugintypeid>com.joaomgcd.autonotification.intent.IntentCancelNotification</plugintypeid>
|
||||
<plugintypeid-type>java.lang.String</plugintypeid-type>
|
||||
</Vals>
|
||||
</Bundle>
|
||||
<Str sr="arg1" ve="3">com.joaomgcd.autonotification</Str>
|
||||
<Str sr="arg2" ve="3">com.joaomgcd.autonotification.activity.ActivityConfigCancelNotification</Str>
|
||||
<Int sr="arg3" val="20"/>
|
||||
<Int sr="arg4" val="1"/>
|
||||
</Action>
|
||||
</Task>
|
||||
<Task sr="task82">
|
||||
<cdate>1762626933199</cdate>
|
||||
<edate>1762862747599</edate>
|
||||
<id>82</id>
|
||||
<nme>Open Skincare Note</nme>
|
||||
<pri>6</pri>
|
||||
<Action sr="act0" ve="7">
|
||||
<code>104</code>
|
||||
<Str sr="arg0" ve="3">obsidian://open?vault=Personal&file=Personal%2FProjects%2FSkincare%2FSkincare%20Morning</Str>
|
||||
<App sr="arg1"/>
|
||||
<Int sr="arg2" val="0"/>
|
||||
<Str sr="arg3" ve="3"/>
|
||||
</Action>
|
||||
</Task>
|
||||
</TaskerData>
|
||||
1763
Personal/Areas/Tasker/Skincare_Demo_Standardized.prj.xml
Normal file
1763
Personal/Areas/Tasker/Skincare_Demo_Standardized.prj.xml
Normal file
File diff suppressed because it is too large
Load Diff
5
Personal/Areas/Tasker/Tasker.md
Normal file
5
Personal/Areas/Tasker/Tasker.md
Normal file
@@ -0,0 +1,5 @@
|
||||
---
|
||||
created: 2025-11-12 09:21
|
||||
updated: 2025-11-12 09:25
|
||||
---
|
||||
![[Skincare_Demo_Standardized.prj.xml]]# Tasker![[Skincare_Demo.prj.xml]]
|
||||
312
Personal/Areas/Tasker/add_diet_routine.py
Normal file
312
Personal/Areas/Tasker/add_diet_routine.py
Normal file
@@ -0,0 +1,312 @@
|
||||
#!/usr/bin/env python3
|
||||
"""
|
||||
Add "Evaluate Diet" routine to Tasker project
|
||||
- 21:00 (9:00 PM) notification
|
||||
- Open Note button
|
||||
- Mark Done button
|
||||
"""
|
||||
|
||||
import re
|
||||
|
||||
def add_diet_routine(input_file, output_file):
|
||||
with open(input_file, 'r', encoding='utf-8') as f:
|
||||
content = f.read()
|
||||
|
||||
# Find the highest profile and task IDs
|
||||
profile_ids = re.findall(r'<Profile sr="prof(\d+)"', content)
|
||||
task_ids = re.findall(r'<Task sr="task(\d+)"', content)
|
||||
|
||||
max_profile_id = max([int(pid) for pid in profile_ids]) if profile_ids else 150
|
||||
max_task_id = max([int(tid) for tid in task_ids]) if task_ids else 150
|
||||
|
||||
# New IDs
|
||||
new_profile_trigger_id = max_profile_id + 1
|
||||
new_profile_event_open_id = max_profile_id + 2
|
||||
new_profile_event_done_id = max_profile_id + 3
|
||||
new_task_show_id = max_task_id + 1
|
||||
new_task_done_id = max_task_id + 2
|
||||
|
||||
# Check if already exists
|
||||
if 'Trigger Diet Notification' in content:
|
||||
print("⚠ Diet routine already exists. Skipping.")
|
||||
return
|
||||
|
||||
# Find insertion point (before </TaskerData>)
|
||||
insert_point = content.rfind('</TaskerData>')
|
||||
|
||||
# Profile 1: Time trigger (21:00)
|
||||
profile_trigger = f'''
|
||||
<!-- Diet Evaluation Routine -->
|
||||
<Profile sr="prof{new_profile_trigger_id}" ve="2">
|
||||
<cdate>1762631944649</cdate>
|
||||
<edate>1762935025169</edate>
|
||||
<flags>8</flags>
|
||||
<id>{new_profile_trigger_id}</id>
|
||||
<mid0>{new_task_show_id}</mid0>
|
||||
<nme>Trigger Diet Notification</nme>
|
||||
<Time sr="con0">
|
||||
<fh>21</fh>
|
||||
<fm>0</fm>
|
||||
<th>21</th>
|
||||
<tm>0</tm>
|
||||
</Time>
|
||||
</Profile>'''
|
||||
|
||||
# Profile 2: Event listener for "Open Diet Note" button
|
||||
profile_event_open = f'''
|
||||
<Profile sr="prof{new_profile_event_open_id}" ve="2">
|
||||
<cdate>1762862939813</cdate>
|
||||
<edate>1762935050872</edate>
|
||||
<flags>8</flags>
|
||||
<id>{new_profile_event_open_id}</id>
|
||||
<mid0>63</mid0>
|
||||
<nme>Event: Open Diet Note</nme>
|
||||
<Event sr="con0" ve="2">
|
||||
<code>1825107102</code>
|
||||
<pri>0</pri>
|
||||
<Bundle sr="arg0">
|
||||
<Vals sr="val">
|
||||
<com.twofortyfouram.locale.intent.extra.BLURB>Event Behaviour
|
||||
Filter: cmd_open_diet_note</com.twofortyfouram.locale.intent.extra.BLURB>
|
||||
<com.twofortyfouram.locale.intent.extra.BLURB-type>java.lang.String</com.twofortyfouram.locale.intent.extra.BLURB-type>
|
||||
<command_params_var>anpar</command_params_var>
|
||||
<command_params_var-type>java.lang.String</command_params_var-type>
|
||||
<command_var>ancomm</command_var>
|
||||
<command_var-type>java.lang.String</command_var-type>
|
||||
<config_notification_command>cmd_open_diet_note</config_notification_command>
|
||||
<config_notification_command-type>java.lang.String</config_notification_command-type>
|
||||
<message_single_case_insensitive>false</message_single_case_insensitive>
|
||||
<message_single_case_insensitive-type>java.lang.Boolean</message_single_case_insensitive-type>
|
||||
<message_single_exact>false</message_single_exact>
|
||||
<message_single_exact-type>java.lang.Boolean</message_single_exact-type>
|
||||
<message_single_regex>false</message_single_regex>
|
||||
<message_single_regex-type>java.lang.Boolean</message_single_regex-type>
|
||||
<message_var>anmessage</message_var>
|
||||
<message_var-type>java.lang.String</message_var-type>
|
||||
<net.dinglisch.android.tasker.EXTRA_NSR_DEPRECATED>true</net.dinglisch.android.tasker.EXTRA_NSR_DEPRECATED>
|
||||
<net.dinglisch.android.tasker.EXTRA_NSR_DEPRECATED-type>java.lang.Boolean</net.dinglisch.android.tasker.EXTRA_NSR_DEPRECATED-type>
|
||||
<net.dinglisch.android.tasker.RELEVANT_VARIABLES><StringArray sr=""><_array_net.dinglisch.android.tasker.RELEVANT_VARIABLES0>%ancomm
|
||||
Everything to the right of =:=
|
||||
Everything to the right of =:=</_array_net.dinglisch.android.tasker.RELEVANT_VARIABLES0><_array_net.dinglisch.android.tasker.RELEVANT_VARIABLES1>%anmessage
|
||||
Whole AutoNotification Message
|
||||
Whole AutoNotification Message</_array_net.dinglisch.android.tasker.RELEVANT_VARIABLES1><_array_net.dinglisch.android.tasker.RELEVANT_VARIABLES2>%anpar()
|
||||
Array of single words to the left of =:=
|
||||
Array of single words to the left of =:=</_array_net.dinglisch.android.tasker.RELEVANT_VARIABLES2></StringArray></net.dinglisch.android.tasker.RELEVANT_VARIABLES>
|
||||
<net.dinglisch.android.tasker.RELEVANT_VARIABLES-type>[Ljava.lang.String;</net.dinglisch.android.tasker.RELEVANT_VARIABLES-type>
|
||||
<net.dinglisch.android.tasker.extras.REQUESTED_TIMEOUT>10000</net.dinglisch.android.tasker.extras.REQUESTED_TIMEOUT>
|
||||
<net.dinglisch.android.tasker.extras.REQUESTED_TIMEOUT-type>java.lang.Integer</net.dinglisch.android.tasker.extras.REQUESTED_TIMEOUT-type>
|
||||
<net.dinglisch.android.tasker.extras.VARIABLE_REPLACE_KEYS>message_var command_var command_params_var config_notification_command plugininstanceid plugintypeid </net.dinglisch.android.tasker.extras.VARIABLE_REPLACE_KEYS>
|
||||
<net.dinglisch.android.tasker.extras.VARIABLE_REPLACE_KEYS-type>java.lang.String</net.dinglisch.android.tasker.extras.VARIABLE_REPLACE_KEYS-type>
|
||||
<net.dinglisch.android.tasker.subbundled>true</net.dinglisch.android.tasker.subbundled>
|
||||
<net.dinglisch.android.tasker.subbundled-type>java.lang.Boolean</net.dinglisch.android.tasker.subbundled-type>
|
||||
<plugininstanceid>e1a87f0a-2e17-4b02-ab14-479198b7aeb1</plugininstanceid>
|
||||
<plugininstanceid-type>java.lang.String</plugininstanceid-type>
|
||||
<plugintypeid>com.joaomgcd.autonotification.intent.IntentCommandEvent</plugintypeid>
|
||||
<plugintypeid-type>java.lang.String</plugintypeid-type>
|
||||
</Vals>
|
||||
</Bundle>
|
||||
<Str sr="arg1" ve="3">com.joaomgcd.autonotification</Str>
|
||||
<Str sr="arg2" ve="3">com.joaomgcd.autonotification.activity.ActivityConfigConditionTaskerEvent</Str>
|
||||
<Int sr="arg3" val="1"/>
|
||||
</Event>
|
||||
</Profile>'''
|
||||
|
||||
# Profile 3: Event listener for "Mark Done" button
|
||||
profile_event_done = f'''
|
||||
<Profile sr="prof{new_profile_event_done_id}" ve="2">
|
||||
<cdate>1762934954023</cdate>
|
||||
<edate>1762935062373</edate>
|
||||
<flags>8</flags>
|
||||
<id>{new_profile_event_done_id}</id>
|
||||
<mid0>{new_task_done_id}</mid0>
|
||||
<nme>Event: Mark Diet Done</nme>
|
||||
<Event sr="con0" ve="2">
|
||||
<code>1825107102</code>
|
||||
<pri>0</pri>
|
||||
<Bundle sr="arg0">
|
||||
<Vals sr="val">
|
||||
<com.twofortyfouram.locale.intent.extra.BLURB>Event Behaviour
|
||||
Filter: cmd_mark_diet_done</com.twofortyfouram.locale.intent.extra.BLURB>
|
||||
<com.twofortyfouram.locale.intent.extra.BLURB-type>java.lang.String</com.twofortyfouram.locale.intent.extra.BLURB-type>
|
||||
<command_params_var>anpar</command_params_var>
|
||||
<command_params_var-type>java.lang.String</command_params_var-type>
|
||||
<command_var>ancomm</command_var>
|
||||
<command_var-type>java.lang.String</command_var-type>
|
||||
<config_notification_command>cmd_mark_diet_done</config_notification_command>
|
||||
<config_notification_command-type>java.lang.String</config_notification_command-type>
|
||||
<message_single_case_insensitive>false</message_single_case_insensitive>
|
||||
<message_single_case_insensitive-type>java.lang.Boolean</message_single_case_insensitive-type>
|
||||
<message_single_exact>false</message_single_exact>
|
||||
<message_single_exact-type>java.lang.Boolean</message_single_exact-type>
|
||||
<message_single_regex>false</message_single_regex>
|
||||
<message_single_regex-type>java.lang.Boolean</message_single_regex-type>
|
||||
<message_var>anmessage</message_var>
|
||||
<message_var-type>java.lang.String</message_var-type>
|
||||
<net.dinglisch.android.tasker.EXTRA_NSR_DEPRECATED>true</net.dinglisch.android.tasker.EXTRA_NSR_DEPRECATED>
|
||||
<net.dinglisch.android.tasker.EXTRA_NSR_DEPRECATED-type>java.lang.Boolean</net.dinglisch.android.tasker.EXTRA_NSR_DEPRECATED-type>
|
||||
<net.dinglisch.android.tasker.RELEVANT_VARIABLES><StringArray sr=""><_array_net.dinglisch.android.tasker.RELEVANT_VARIABLES0>%ancomm
|
||||
Everything to the right of =:=
|
||||
Everything to the right of =:=</_array_net.dinglisch.android.tasker.RELEVANT_VARIABLES0><_array_net.dinglisch.android.tasker.RELEVANT_VARIABLES1>%anmessage
|
||||
Whole AutoNotification Message
|
||||
Whole AutoNotification Message</_array_net.dinglisch.android.tasker.RELEVANT_VARIABLES1><_array_net.dinglisch.android.tasker.RELEVANT_VARIABLES2>%anpar()
|
||||
Array of single words to the left of =:=
|
||||
Array of single words to the left of =:=</_array_net.dinglisch.android.tasker.RELEVANT_VARIABLES2></StringArray></net.dinglisch.android.tasker.RELEVANT_VARIABLES>
|
||||
<net.dinglisch.android.tasker.RELEVANT_VARIABLES-type>[Ljava.lang.String;</net.dinglisch.android.tasker.RELEVANT_VARIABLES-type>
|
||||
<net.dinglisch.android.tasker.extras.REQUESTED_TIMEOUT>10000</net.dinglisch.android.tasker.extras.REQUESTED_TIMEOUT>
|
||||
<net.dinglisch.android.tasker.extras.REQUESTED_TIMEOUT-type>java.lang.Integer</net.dinglisch.android.tasker.extras.REQUESTED_TIMEOUT-type>
|
||||
<net.dinglisch.android.tasker.extras.VARIABLE_REPLACE_KEYS>message_var command_var command_params_var config_notification_command plugininstanceid plugintypeid </net.dinglisch.android.tasker.extras.VARIABLE_REPLACE_KEYS>
|
||||
<net.dinglisch.android.tasker.extras.VARIABLE_REPLACE_KEYS-type>java.lang.String</net.dinglisch.android.tasker.extras.VARIABLE_REPLACE_KEYS-type>
|
||||
<net.dinglisch.android.tasker.subbundled>true</net.dinglisch.android.tasker.subbundled>
|
||||
<net.dinglisch.android.tasker.subbundled-type>java.lang.Boolean</net.dinglisch.android.tasker.subbundled-type>
|
||||
<plugininstanceid>6cbbccc1-1242-4f6a-861e-cfe4b82309fd</plugininstanceid>
|
||||
<plugininstanceid-type>java.lang.String</plugininstanceid-type>
|
||||
<plugintypeid>com.joaomgcd.autonotification.intent.IntentCommandEvent</plugintypeid>
|
||||
<plugintypeid-type>java.lang.String</plugintypeid-type>
|
||||
</Vals>
|
||||
</Bundle>
|
||||
<Str sr="arg1" ve="3">com.joaomgcd.autonotification</Str>
|
||||
<Str sr="arg2" ve="3">com.joaomgcd.autonotification.activity.ActivityConfigConditionTaskerEvent</Str>
|
||||
<Int sr="arg3" val="1"/>
|
||||
</Event>
|
||||
</Profile>'''
|
||||
|
||||
# Task 1: Show Diet Notification
|
||||
task_show = f'''
|
||||
<Task sr="task{new_task_show_id}">
|
||||
<cdate>1762631971435</cdate>
|
||||
<edate>1762935044696</edate>
|
||||
<id>{new_task_show_id}</id>
|
||||
<nme>Show Diet Notification</nme>
|
||||
<pri>100</pri>
|
||||
<Action sr="act0" ve="7">
|
||||
<code>166160670</code>
|
||||
<Bundle sr="arg0">
|
||||
<Vals sr="val">
|
||||
<StatusBarTextSize>16</StatusBarTextSize>
|
||||
<StatusBarTextSize-type>java.lang.String</StatusBarTextSize-type>
|
||||
<com.twofortyfouram.locale.intent.extra.BLURB>Title: Evaluate Your Diet
|
||||
Text: Time to review your eating today!
|
||||
Action on Touch: cmd_open_diet_note
|
||||
Status Bar Text Size: 16
|
||||
Id: notif_diet_evening
|
||||
Separator: ,
|
||||
Button 1: cmd_open_diet_note
|
||||
Label 1: Open Note
|
||||
Button 2: cmd_mark_diet_done
|
||||
Label 2: Mark Done</com.twofortyfouram.locale.intent.extra.BLURB>
|
||||
<com.twofortyfouram.locale.intent.extra.BLURB-type>java.lang.String</com.twofortyfouram.locale.intent.extra.BLURB-type>
|
||||
<config_notification_action>cmd_open_diet_note</config_notification_action>
|
||||
<config_notification_action-type>java.lang.String</config_notification_action-type>
|
||||
<config_notification_action_button1>cmd_open_diet_note</config_notification_action_button1>
|
||||
<config_notification_action_button1-type>java.lang.String</config_notification_action_button1-type>
|
||||
<config_notification_action_button2>cmd_mark_diet_done</config_notification_action_button2>
|
||||
<config_notification_action_button2-type>java.lang.String</config_notification_action_button2-type>
|
||||
<config_notification_action_label1>Open Note</config_notification_action_label1>
|
||||
<config_notification_action_label1-type>java.lang.String</config_notification_action_label1-type>
|
||||
<config_notification_action_label2>Mark Done</config_notification_action_label2>
|
||||
<config_notification_action_label2-type>java.lang.String</config_notification_action_label2-type>
|
||||
<config_notification_dismiss_on_touch>false</config_notification_dismiss_on_touch>
|
||||
<config_notification_dismiss_on_touch-type>java.lang.Boolean</config_notification_dismiss_on_touch-type>
|
||||
<config_notification_persistent>false</config_notification_persistent>
|
||||
<config_notification_persistent-type>java.lang.Boolean</config_notification_persistent-type>
|
||||
<config_notification_text>Time to review your eating today!</config_notification_text>
|
||||
<config_notification_text-type>java.lang.String</config_notification_text-type>
|
||||
<config_notification_title>Evaluate Your Diet</config_notification_title>
|
||||
<config_notification_title-type>java.lang.String</config_notification_title-type>
|
||||
<net.dinglisch.android.tasker.extras.VARIABLE_REPLACE_KEYS>StatusBarTextSize config_notification_title config_notification_text config_notification_action config_notification_action_button1 config_notification_action_label1 config_notification_action_button2 config_notification_action_label2 notificaitionid plugininstanceid plugintypeid </net.dinglisch.android.tasker.extras.VARIABLE_REPLACE_KEYS>
|
||||
<net.dinglisch.android.tasker.extras.VARIABLE_REPLACE_KEYS-type>java.lang.String</net.dinglisch.android.tasker.extras.VARIABLE_REPLACE_KEYS-type>
|
||||
<net.dinglisch.android.tasker.subbundled>true</net.dinglisch.android.tasker.subbundled>
|
||||
<net.dinglisch.android.tasker.subbundled-type>java.lang.Boolean</net.dinglisch.android.tasker.subbundled-type>
|
||||
<notificaitionid>notif_diet_evening</notificaitionid>
|
||||
<notificaitionid-type>java.lang.String</notificaitionid-type>
|
||||
<plugininstanceid>2c3b7c1e-0ee9-4d73-bf77-2b1311cf1a26</plugininstanceid>
|
||||
<plugininstanceid-type>java.lang.String</plugininstanceid-type>
|
||||
<plugintypeid>com.joaomgcd.autonotification.intent.IntentNotification</plugintypeid>
|
||||
<plugintypeid-type>java.lang.String</plugintypeid-type>
|
||||
</Vals>
|
||||
</Bundle>
|
||||
<Str sr="arg1" ve="3">com.joaomgcd.autonotification</Str>
|
||||
<Str sr="arg2" ve="3">com.joaomgcd.autonotification.activity.ActivityConfigNotify</Str>
|
||||
<Int sr="arg3" val="20"/>
|
||||
<Int sr="arg4" val="1"/>
|
||||
</Action>
|
||||
</Task>'''
|
||||
|
||||
# Task 2: Mark Diet Done (dismiss notification)
|
||||
task_done = f'''
|
||||
<Task sr="task{new_task_done_id}">
|
||||
<cdate>1762934967274</cdate>
|
||||
<edate>1762935062373</edate>
|
||||
<id>{new_task_done_id}</id>
|
||||
<nme>Mark Diet Done</nme>
|
||||
<pri>6</pri>
|
||||
<Action sr="act0" ve="7">
|
||||
<code>2046367074</code>
|
||||
<Bundle sr="arg0">
|
||||
<Vals sr="val">
|
||||
<App><null></App>
|
||||
<App-type>java.lang.String</App-type>
|
||||
<CancelAll>false</CancelAll>
|
||||
<CancelAll-type>java.lang.Boolean</CancelAll-type>
|
||||
<CancelPersistent>false</CancelPersistent>
|
||||
<CancelPersistent-type>java.lang.Boolean</CancelPersistent-type>
|
||||
<com.twofortyfouram.locale.intent.extra.BLURB>Id: notif_diet_evening</com.twofortyfouram.locale.intent.extra.BLURB>
|
||||
<com.twofortyfouram.locale.intent.extra.BLURB-type>java.lang.String</com.twofortyfouram.locale.intent.extra.BLURB-type>
|
||||
<net.dinglisch.android.tasker.extras.VARIABLE_REPLACE_KEYS>notificaitionid plugininstanceid plugintypeid </net.dinglisch.android.tasker.extras.VARIABLE_REPLACE_KEYS>
|
||||
<net.dinglisch.android.tasker.extras.VARIABLE_REPLACE_KEYS-type>java.lang.String</net.dinglisch.android.tasker.extras.VARIABLE_REPLACE_KEYS-type>
|
||||
<net.dinglisch.android.tasker.subbundled>true</net.dinglisch.android.tasker.subbundled>
|
||||
<net.dinglisch.android.tasker.subbundled-type>java.lang.Boolean</net.dinglisch.android.tasker.subbundled-type>
|
||||
<notificaitionid>notif_diet_evening</notificaitionid>
|
||||
<notificaitionid-type>java.lang.String</notificaitionid-type>
|
||||
<plugininstanceid>2d6b7e1a-427b-442e-9f39-356480bf35d3</plugininstanceid>
|
||||
<plugininstanceid-type>java.lang.String</plugininstanceid-type>
|
||||
<plugintypeid>com.joaomgcd.autonotification.intent.IntentCancelNotification</plugintypeid>
|
||||
<plugintypeid-type>java.lang.String</plugintypeid-type>
|
||||
</Vals>
|
||||
</Bundle>
|
||||
<Str sr="arg1" ve="3">com.joaomgcd.autonotification</Str>
|
||||
<Str sr="arg2" ve="3">com.joaomgcd.autonotification.activity.ActivityConfigCancelNotification</Str>
|
||||
<Int sr="arg3" val="20"/>
|
||||
<Int sr="arg4" val="1"/>
|
||||
</Action>
|
||||
</Task>'''
|
||||
|
||||
# Combine all new elements
|
||||
new_elements = profile_trigger + profile_event_open + profile_event_done + task_show + task_done
|
||||
|
||||
# Insert before </TaskerData>
|
||||
content = content[:insert_point] + new_elements + '\n' + content[insert_point:]
|
||||
|
||||
# Update project pids (profile IDs)
|
||||
content = re.sub(
|
||||
r'<pids>([^<]+)</pids>',
|
||||
lambda m: f'<pids>{m.group(1)},{new_profile_trigger_id},{new_profile_event_open_id},{new_profile_event_done_id}</pids>',
|
||||
content,
|
||||
count=1
|
||||
)
|
||||
|
||||
# Update project tids (task IDs)
|
||||
content = re.sub(
|
||||
r'<tids>([^<]+)</tids>',
|
||||
lambda m: f'<tids>{m.group(1)},{new_task_show_id},{new_task_done_id}</pids>',
|
||||
content,
|
||||
count=1
|
||||
)
|
||||
|
||||
# Write output
|
||||
with open(output_file, 'w', encoding='utf-8') as f:
|
||||
f.write(content)
|
||||
|
||||
print(f"✓ Added 'Evaluate Diet' routine")
|
||||
print(f" - Trigger time: 21:00 (9:00 PM)")
|
||||
print(f" - Profile IDs: {new_profile_trigger_id}, {new_profile_event_open_id}, {new_profile_event_done_id}")
|
||||
print(f" - Task IDs: {new_task_show_id}, {new_task_done_id}")
|
||||
print(f" - Commands: cmd_open_diet_note, cmd_mark_diet_done")
|
||||
print(f" - Notification ID: notif_diet_evening")
|
||||
print(f"✓ Output written to {output_file}")
|
||||
|
||||
if __name__ == '__main__':
|
||||
input_file = '/Users/vincentverbruggen/Personal/Personal/Areas/Tasker/Routine_Reminders.prj.xml'
|
||||
output_file = '/Users/vincentverbruggen/Personal/Personal/Areas/Tasker/Routine_Reminders.prj.xml'
|
||||
|
||||
add_diet_routine(input_file, output_file)
|
||||
151
Personal/Areas/Tasker/standardize_tasker.py
Normal file
151
Personal/Areas/Tasker/standardize_tasker.py
Normal file
@@ -0,0 +1,151 @@
|
||||
#!/usr/bin/env python3
|
||||
"""
|
||||
Standardize Tasker XML project file
|
||||
- Consistent naming conventions
|
||||
- Link notification buttons to correct tasks via AutoNotification commands
|
||||
- Remove trailing spaces and inconsistencies
|
||||
"""
|
||||
|
||||
import re
|
||||
import sys
|
||||
|
||||
def standardize_tasker_xml(input_file, output_file):
|
||||
with open(input_file, 'r', encoding='utf-8') as f:
|
||||
content = f.read()
|
||||
|
||||
# Standardize Profile names
|
||||
profile_replacements = {
|
||||
'Launch Skincare Notification': 'Trigger Skincare Notification',
|
||||
'Launch Prepare For Exercise Notification': 'Trigger Exercise Notification',
|
||||
'Open Skincare Notification': 'Show Skincare Notification',
|
||||
'Open Prepare Exercise Notification': 'Show Exercise Notification',
|
||||
'Dismiss Exercise Notification': 'Mark Exercise Done',
|
||||
}
|
||||
|
||||
for old, new in profile_replacements.items():
|
||||
content = content.replace(f'<nme>{old}</nme>', f'<nme>{new}</nme>')
|
||||
|
||||
# Standardize command names (used in AutoNotification event filters and button actions)
|
||||
command_replacements = {
|
||||
'Open morning skincare': 'cmd_open_skincare_note',
|
||||
'open skincare note': 'cmd_open_skincare_note',
|
||||
'mark skincare done': 'cmd_mark_skincare_done',
|
||||
'open exercise note': 'cmd_open_exercise_note',
|
||||
'mark exercise done': 'cmd_mark_exercise_done',
|
||||
'open diet note': 'cmd_open_diet_note',
|
||||
}
|
||||
|
||||
for old, new in command_replacements.items():
|
||||
# Remove trailing spaces from old commands
|
||||
old_variants = [old, old + ' ', old + ' ']
|
||||
for variant in old_variants:
|
||||
# Replace in command filters
|
||||
content = content.replace(
|
||||
f'<config_notification_command>{variant}</config_notification_command>',
|
||||
f'<config_notification_command>{new}</config_notification_command>'
|
||||
)
|
||||
# Replace in button actions
|
||||
content = content.replace(
|
||||
f'<config_notification_action_button1>{variant}</config_notification_action_button1>',
|
||||
f'<config_notification_action_button1>{new}</config_notification_action_button1>'
|
||||
)
|
||||
content = content.replace(
|
||||
f'<config_notification_action_button2>{variant}</config_notification_action_button2>',
|
||||
f'<config_notification_action_button2>{new}</config_notification_action_button2>'
|
||||
)
|
||||
content = content.replace(
|
||||
f'<config_notification_action>{variant}</config_notification_action>',
|
||||
f'<config_notification_action>{new}</config_notification_action>'
|
||||
)
|
||||
|
||||
# Standardize notification IDs
|
||||
notif_id_replacements = {
|
||||
'skincare morning': 'notif_skincare_morning',
|
||||
'skincare morning ': 'notif_skincare_morning',
|
||||
'prepare for exercise': 'notif_exercise_prep',
|
||||
}
|
||||
|
||||
for old, new in notif_id_replacements.items():
|
||||
content = content.replace(
|
||||
f'<notificaitionid>{old}</notificaitionid>',
|
||||
f'<notificaitionid>{new}</notificaitionid>'
|
||||
)
|
||||
# Also update in BLURB text
|
||||
content = re.sub(
|
||||
f'Id: {re.escape(old)}([\\n<])',
|
||||
f'Id: {new}\\1',
|
||||
content
|
||||
)
|
||||
|
||||
# Standardize notification titles and texts (remove trailing spaces)
|
||||
content = re.sub(
|
||||
r'<config_notification_title>([^<]+?) +</config_notification_title>',
|
||||
r'<config_notification_title>\1</config_notification_title>',
|
||||
content
|
||||
)
|
||||
content = re.sub(
|
||||
r'<config_notification_text>([^<]+?) +</config_notification_text>',
|
||||
r'<config_notification_text>\1</config_notification_text>',
|
||||
content
|
||||
)
|
||||
|
||||
# Update project name
|
||||
content = content.replace(
|
||||
'<name>Skincare Demo</name>',
|
||||
'<name>Routine Reminders</name>'
|
||||
)
|
||||
|
||||
# Fix BLURB descriptions to reflect standardized commands
|
||||
content = re.sub(
|
||||
r'Filter: mark skincare done[ ]*',
|
||||
'Filter: cmd_mark_skincare_done',
|
||||
content
|
||||
)
|
||||
content = re.sub(
|
||||
r'Filter: mark exercise done[ ]*',
|
||||
'Filter: cmd_mark_exercise_done',
|
||||
content
|
||||
)
|
||||
content = re.sub(
|
||||
r'Button 1: open skincare note',
|
||||
'Button 1: cmd_open_skincare_note',
|
||||
content
|
||||
)
|
||||
content = re.sub(
|
||||
r'Button 2: mark skincare done',
|
||||
'Button 2: cmd_mark_skincare_done',
|
||||
content
|
||||
)
|
||||
content = re.sub(
|
||||
r'Button 1: open exercise note',
|
||||
'Button 1: cmd_open_exercise_note',
|
||||
content
|
||||
)
|
||||
content = re.sub(
|
||||
r'Button 2: mark exercise done',
|
||||
'Button 2: cmd_mark_exercise_done',
|
||||
content
|
||||
)
|
||||
content = re.sub(
|
||||
r'Button 1: open diet note',
|
||||
'Button 1: cmd_open_diet_note',
|
||||
content
|
||||
)
|
||||
content = re.sub(
|
||||
r'Action on Touch: Open morning skincare[ ]*',
|
||||
'Action on Touch: cmd_open_skincare_note',
|
||||
content
|
||||
)
|
||||
|
||||
# Write output
|
||||
with open(output_file, 'w', encoding='utf-8') as f:
|
||||
f.write(content)
|
||||
|
||||
print(f"✓ Standardized {input_file}")
|
||||
print(f"✓ Output written to {output_file}")
|
||||
|
||||
if __name__ == '__main__':
|
||||
input_file = '/Users/vincentverbruggen/Personal/Personal/Areas/Tasker/Skincare_Demo_Standardized.prj.xml'
|
||||
output_file = '/Users/vincentverbruggen/Personal/Personal/Areas/Tasker/Routine_Reminders.prj.xml'
|
||||
|
||||
standardize_tasker_xml(input_file, output_file)
|
||||
303
Personal/Areas/Tasker/standardize_tasker_v2.py
Normal file
303
Personal/Areas/Tasker/standardize_tasker_v2.py
Normal file
@@ -0,0 +1,303 @@
|
||||
#!/usr/bin/env python3
|
||||
"""
|
||||
Standardize Tasker XML project file v2
|
||||
- Consistent naming conventions
|
||||
- Link notification buttons to correct tasks via AutoNotification commands
|
||||
- Add missing event profiles for button commands
|
||||
- Remove trailing spaces and inconsistencies
|
||||
"""
|
||||
|
||||
import re
|
||||
|
||||
def standardize_tasker_xml(input_file, output_file):
|
||||
with open(input_file, 'r', encoding='utf-8') as f:
|
||||
content = f.read()
|
||||
|
||||
# Standardize Profile names
|
||||
profile_replacements = {
|
||||
'Launch Skincare Notification': 'Trigger Skincare Notification',
|
||||
'Launch Prepare For Exercise Notification': 'Trigger Exercise Notification',
|
||||
'Open Skincare Notification': 'Show Skincare Notification',
|
||||
'Open Prepare Exercise Notification': 'Show Exercise Notification',
|
||||
'Dismiss Exercise Notification': 'Mark Exercise Done',
|
||||
}
|
||||
|
||||
for old, new in profile_replacements.items():
|
||||
content = content.replace(f'<nme>{old}</nme>', f'<nme>{new}</nme>')
|
||||
|
||||
# Standardize command names (used in AutoNotification event filters and button actions)
|
||||
command_replacements = {
|
||||
'Open morning skincare': 'cmd_open_skincare_note',
|
||||
'open skincare note': 'cmd_open_skincare_note',
|
||||
'mark skincare done': 'cmd_mark_skincare_done',
|
||||
'open exercise note': 'cmd_open_exercise_note',
|
||||
'mark exercise done': 'cmd_mark_exercise_done',
|
||||
'open diet note': 'cmd_open_diet_note',
|
||||
}
|
||||
|
||||
for old, new in command_replacements.items():
|
||||
# Remove trailing spaces from old commands
|
||||
old_variants = [old, old + ' ', old + ' ']
|
||||
for variant in old_variants:
|
||||
# Replace in command filters
|
||||
content = content.replace(
|
||||
f'<config_notification_command>{variant}</config_notification_command>',
|
||||
f'<config_notification_command>{new}</config_notification_command>'
|
||||
)
|
||||
# Replace in button actions
|
||||
content = content.replace(
|
||||
f'<config_notification_action_button1>{variant}</config_notification_action_button1>',
|
||||
f'<config_notification_action_button1>{new}</config_notification_action_button1>'
|
||||
)
|
||||
content = content.replace(
|
||||
f'<config_notification_action_button2>{variant}</config_notification_action_button2>',
|
||||
f'<config_notification_action_button2>{new}</config_notification_action_button2>'
|
||||
)
|
||||
content = content.replace(
|
||||
f'<config_notification_action>{variant}</config_notification_action>',
|
||||
f'<config_notification_action>{new}</config_notification_action>'
|
||||
)
|
||||
|
||||
# Standardize notification IDs
|
||||
notif_id_replacements = {
|
||||
'skincare morning': 'notif_skincare_morning',
|
||||
'skincare morning ': 'notif_skincare_morning',
|
||||
'prepare for exercise': 'notif_exercise_prep',
|
||||
}
|
||||
|
||||
for old, new in notif_id_replacements.items():
|
||||
content = content.replace(
|
||||
f'<notificaitionid>{old}</notificaitionid>',
|
||||
f'<notificaitionid>{new}</notificaitionid>'
|
||||
)
|
||||
# Also update in BLURB text
|
||||
content = re.sub(
|
||||
f'Id: {re.escape(old)}([\\n<])',
|
||||
f'Id: {new}\\1',
|
||||
content
|
||||
)
|
||||
|
||||
# Standardize notification titles and texts (remove trailing spaces)
|
||||
content = re.sub(
|
||||
r'<config_notification_title>([^<]+?) +</config_notification_title>',
|
||||
r'<config_notification_title>\1</config_notification_title>',
|
||||
content
|
||||
)
|
||||
content = re.sub(
|
||||
r'<config_notification_text>([^<]+?) +</config_notification_text>',
|
||||
r'<config_notification_text>\1</config_notification_text>',
|
||||
content
|
||||
)
|
||||
|
||||
# Update project name
|
||||
content = content.replace(
|
||||
'<name>Skincare Demo</name>',
|
||||
'<name>Routine Reminders</name>'
|
||||
)
|
||||
|
||||
# Fix BLURB descriptions to reflect standardized commands
|
||||
content = re.sub(
|
||||
r'Filter: mark skincare done[ ]*',
|
||||
'Filter: cmd_mark_skincare_done',
|
||||
content
|
||||
)
|
||||
content = re.sub(
|
||||
r'Filter: mark exercise done[ ]*',
|
||||
'Filter: cmd_mark_exercise_done',
|
||||
content
|
||||
)
|
||||
content = re.sub(
|
||||
r'Button 1: open skincare note',
|
||||
'Button 1: cmd_open_skincare_note',
|
||||
content
|
||||
)
|
||||
content = re.sub(
|
||||
r'Button 2: mark skincare done',
|
||||
'Button 2: cmd_mark_skincare_done',
|
||||
content
|
||||
)
|
||||
content = re.sub(
|
||||
r'Button 1: open exercise note',
|
||||
'Button 1: cmd_open_exercise_note',
|
||||
content
|
||||
)
|
||||
content = re.sub(
|
||||
r'Button 2: mark exercise done',
|
||||
'Button 2: cmd_mark_exercise_done',
|
||||
content
|
||||
)
|
||||
content = re.sub(
|
||||
r'Button 1: open diet note',
|
||||
'Button 1: cmd_open_diet_note',
|
||||
content
|
||||
)
|
||||
content = re.sub(
|
||||
r'Action on Touch: Open morning skincare[ ]*',
|
||||
'Action on Touch: cmd_open_skincare_note',
|
||||
content
|
||||
)
|
||||
|
||||
# Add missing event profiles for "open note" commands
|
||||
# Find where to insert (before </TaskerData>)
|
||||
insert_point = content.rfind('</TaskerData>')
|
||||
|
||||
# Check if profiles already exist
|
||||
missing_profiles = []
|
||||
if 'Event: Open Skincare Note' not in content:
|
||||
missing_profiles.append('''
|
||||
<Profile sr="prof150" ve="2">
|
||||
<cdate>1762862939813</cdate>
|
||||
<edate>1762935050872</edate>
|
||||
<flags>8</flags>
|
||||
<id>150</id>
|
||||
<mid0>82</mid0>
|
||||
<nme>Event: Open Skincare Note</nme>
|
||||
<Event sr="con0" ve="2">
|
||||
<code>1825107102</code>
|
||||
<pri>0</pri>
|
||||
<Bundle sr="arg0">
|
||||
<Vals sr="val">
|
||||
<com.twofortyfouram.locale.intent.extra.BLURB>Event Behaviour
|
||||
Filter: cmd_open_skincare_note</com.twofortyfouram.locale.intent.extra.BLURB>
|
||||
<com.twofortyfouram.locale.intent.extra.BLURB-type>java.lang.String</com.twofortyfouram.locale.intent.extra.BLURB-type>
|
||||
<command_params_var>anpar</command_params_var>
|
||||
<command_params_var-type>java.lang.String</command_params_var-type>
|
||||
<command_var>ancomm</command_var>
|
||||
<command_var-type>java.lang.String</command_var-type>
|
||||
<config_notification_command>cmd_open_skincare_note</config_notification_command>
|
||||
<config_notification_command-type>java.lang.String</config_notification_command-type>
|
||||
<message_single_case_insensitive>false</message_single_case_insensitive>
|
||||
<message_single_case_insensitive-type>java.lang.Boolean</message_single_case_insensitive-type>
|
||||
<message_single_exact>false</message_single_exact>
|
||||
<message_single_exact-type>java.lang.Boolean</message_single_exact-type>
|
||||
<message_single_regex>false</message_single_regex>
|
||||
<message_single_regex-type>java.lang.Boolean</message_single_regex-type>
|
||||
<message_var>anmessage</message_var>
|
||||
<message_var-type>java.lang.String</message_var-type>
|
||||
<net.dinglisch.android.tasker.EXTRA_NSR_DEPRECATED>true</net.dinglisch.android.tasker.EXTRA_NSR_DEPRECATED>
|
||||
<net.dinglisch.android.tasker.EXTRA_NSR_DEPRECATED-type>java.lang.Boolean</net.dinglisch.android.tasker.EXTRA_NSR_DEPRECATED-type>
|
||||
<net.dinglisch.android.tasker.RELEVANT_VARIABLES><StringArray sr=""><_array_net.dinglisch.android.tasker.RELEVANT_VARIABLES0>%ancomm
|
||||
Everything to the right of =:=
|
||||
Everything to the right of =:=</_array_net.dinglisch.android.tasker.RELEVANT_VARIABLES0><_array_net.dinglisch.android.tasker.RELEVANT_VARIABLES1>%anmessage
|
||||
Whole AutoNotification Message
|
||||
Whole AutoNotification Message</_array_net.dinglisch.android.tasker.RELEVANT_VARIABLES1><_array_net.dinglisch.android.tasker.RELEVANT_VARIABLES2>%anpar()
|
||||
Array of single words to the left of =:=
|
||||
Array of single words to the left of =:=</_array_net.dinglisch.android.tasker.RELEVANT_VARIABLES2></StringArray></net.dinglisch.android.tasker.RELEVANT_VARIABLES>
|
||||
<net.dinglisch.android.tasker.RELEVANT_VARIABLES-type>[Ljava.lang.String;</net.dinglisch.android.tasker.RELEVANT_VARIABLES-type>
|
||||
<net.dinglisch.android.tasker.extras.REQUESTED_TIMEOUT>10000</net.dinglisch.android.tasker.extras.REQUESTED_TIMEOUT>
|
||||
<net.dinglisch.android.tasker.extras.REQUESTED_TIMEOUT-type>java.lang.Integer</net.dinglisch.android.tasker.extras.REQUESTED_TIMEOUT-type>
|
||||
<net.dinglisch.android.tasker.extras.VARIABLE_REPLACE_KEYS>message_var command_var command_params_var config_notification_command plugininstanceid plugintypeid </net.dinglisch.android.tasker.extras.VARIABLE_REPLACE_KEYS>
|
||||
<net.dinglisch.android.tasker.extras.VARIABLE_REPLACE_KEYS-type>java.lang.String</net.dinglisch.android.tasker.extras.VARIABLE_REPLACE_KEYS-type>
|
||||
<net.dinglisch.android.tasker.subbundled>true</net.dinglisch.android.tasker.subbundled>
|
||||
<net.dinglisch.android.tasker.subbundled-type>java.lang.Boolean</net.dinglisch.android.tasker.subbundled-type>
|
||||
<plugininstanceid>e1a87f0a-2e17-4b02-ab14-479198b7aea9</plugininstanceid>
|
||||
<plugininstanceid-type>java.lang.String</plugininstanceid-type>
|
||||
<plugintypeid>com.joaomgcd.autonotification.intent.IntentCommandEvent</plugintypeid>
|
||||
<plugintypeid-type>java.lang.String</plugintypeid-type>
|
||||
</Vals>
|
||||
</Bundle>
|
||||
<Str sr="arg1" ve="3">com.joaomgcd.autonotification</Str>
|
||||
<Str sr="arg2" ve="3">com.joaomgcd.autonotification.activity.ActivityConfigConditionTaskerEvent</Str>
|
||||
<Int sr="arg3" val="1"/>
|
||||
</Event>
|
||||
</Profile>''')
|
||||
|
||||
if 'Event: Open Exercise Note' not in content:
|
||||
missing_profiles.append('''
|
||||
<Profile sr="prof151" ve="2">
|
||||
<cdate>1762862939813</cdate>
|
||||
<edate>1762935050872</edate>
|
||||
<flags>8</flags>
|
||||
<id>151</id>
|
||||
<mid0>141</mid0>
|
||||
<nme>Event: Open Exercise Note</nme>
|
||||
<Event sr="con0" ve="2">
|
||||
<code>1825107102</code>
|
||||
<pri>0</pri>
|
||||
<Bundle sr="arg0">
|
||||
<Vals sr="val">
|
||||
<com.twofortyfouram.locale.intent.extra.BLURB>Event Behaviour
|
||||
Filter: cmd_open_exercise_note</com.twofortyfouram.locale.intent.extra.BLURB>
|
||||
<com.twofortyfouram.locale.intent.extra.BLURB-type>java.lang.String</com.twofortyfouram.locale.intent.extra.BLURB-type>
|
||||
<command_params_var>anpar</command_params_var>
|
||||
<command_params_var-type>java.lang.String</command_params_var-type>
|
||||
<command_var>ancomm</command_var>
|
||||
<command_var-type>java.lang.String</command_var-type>
|
||||
<config_notification_command>cmd_open_exercise_note</config_notification_command>
|
||||
<config_notification_command-type>java.lang.String</config_notification_command-type>
|
||||
<message_single_case_insensitive>false</message_single_case_insensitive>
|
||||
<message_single_case_insensitive-type>java.lang.Boolean</message_single_case_insensitive-type>
|
||||
<message_single_exact>false</message_single_exact>
|
||||
<message_single_exact-type>java.lang.Boolean</message_single_exact-type>
|
||||
<message_single_regex>false</message_single_regex>
|
||||
<message_single_regex-type>java.lang.Boolean</message_single_regex-type>
|
||||
<message_var>anmessage</message_var>
|
||||
<message_var-type>java.lang.String</message_var-type>
|
||||
<net.dinglisch.android.tasker.EXTRA_NSR_DEPRECATED>true</net.dinglisch.android.tasker.EXTRA_NSR_DEPRECATED>
|
||||
<net.dinglisch.android.tasker.EXTRA_NSR_DEPRECATED-type>java.lang.Boolean</net.dinglisch.android.tasker.EXTRA_NSR_DEPRECATED-type>
|
||||
<net.dinglisch.android.tasker.RELEVANT_VARIABLES><StringArray sr=""><_array_net.dinglisch.android.tasker.RELEVANT_VARIABLES0>%ancomm
|
||||
Everything to the right of =:=
|
||||
Everything to the right of =:=</_array_net.dinglisch.android.tasker.RELEVANT_VARIABLES0><_array_net.dinglisch.android.tasker.RELEVANT_VARIABLES1>%anmessage
|
||||
Whole AutoNotification Message
|
||||
Whole AutoNotification Message</_array_net.dinglisch.android.tasker.RELEVANT_VARIABLES1><_array_net.dinglisch.android.tasker.RELEVANT_VARIABLES2>%anpar()
|
||||
Array of single words to the left of =:=
|
||||
Array of single words to the left of =:=</_array_net.dinglisch.android.tasker.RELEVANT_VARIABLES2></StringArray></net.dinglisch.android.tasker.RELEVANT_VARIABLES>
|
||||
<net.dinglisch.android.tasker.RELEVANT_VARIABLES-type>[Ljava.lang.String;</net.dinglisch.android.tasker.RELEVANT_VARIABLES-type>
|
||||
<net.dinglisch.android.tasker.extras.REQUESTED_TIMEOUT>10000</net.dinglisch.android.tasker.extras.REQUESTED_TIMEOUT>
|
||||
<net.dinglisch.android.tasker.extras.REQUESTED_TIMEOUT-type>java.lang.Integer</net.dinglisch.android.tasker.extras.REQUESTED_TIMEOUT-type>
|
||||
<net.dinglisch.android.tasker.extras.VARIABLE_REPLACE_KEYS>message_var command_var command_params_var config_notification_command plugininstanceid plugintypeid </net.dinglisch.android.tasker.extras.VARIABLE_REPLACE_KEYS>
|
||||
<net.dinglisch.android.tasker.extras.VARIABLE_REPLACE_KEYS-type>java.lang.String</net.dinglisch.android.tasker.extras.VARIABLE_REPLACE_KEYS-type>
|
||||
<net.dinglisch.android.tasker.subbundled>true</net.dinglisch.android.tasker.subbundled>
|
||||
<net.dinglisch.android.tasker.subbundled-type>java.lang.Boolean</net.dinglisch.android.tasker.subbundled-type>
|
||||
<plugininstanceid>e1a87f0a-2e17-4b02-ab14-479198b7aea0</plugininstanceid>
|
||||
<plugininstanceid-type>java.lang.String</plugininstanceid-type>
|
||||
<plugintypeid>com.joaomgcd.autonotification.intent.IntentCommandEvent</plugintypeid>
|
||||
<plugintypeid-type>java.lang.String</plugintypeid-type>
|
||||
</Vals>
|
||||
</Bundle>
|
||||
<Str sr="arg1" ve="3">com.joaomgcd.autonotification</Str>
|
||||
<Str sr="arg2" ve="3">com.joaomgcd.autonotification.activity.ActivityConfigConditionTaskerEvent</Str>
|
||||
<Int sr="arg3" val="1"/>
|
||||
</Event>
|
||||
</Profile>''')
|
||||
|
||||
# Insert missing profiles
|
||||
if missing_profiles:
|
||||
profiles_text = ''.join(missing_profiles)
|
||||
content = content[:insert_point] + profiles_text + '\n' + content[insert_point:]
|
||||
|
||||
# Update project profile IDs (pids) to include new profiles
|
||||
if 'prof150' in profiles_text:
|
||||
content = re.sub(
|
||||
r'<pids>([^<]+)</pids>',
|
||||
lambda m: f'<pids>{m.group(1)},150</pids>',
|
||||
content,
|
||||
count=1
|
||||
)
|
||||
if 'prof151' in profiles_text:
|
||||
content = re.sub(
|
||||
r'<pids>([^<]+)</pids>',
|
||||
lambda m: f'<pids>{m.group(1)},151</pids>',
|
||||
content,
|
||||
count=1
|
||||
)
|
||||
|
||||
# Write output
|
||||
with open(output_file, 'w', encoding='utf-8') as f:
|
||||
f.write(content)
|
||||
|
||||
print(f"✓ Standardized {input_file}")
|
||||
if missing_profiles:
|
||||
print(f"✓ Added {len(missing_profiles)} missing event profile(s) to link buttons to actions")
|
||||
print(f"✓ Output written to {output_file}")
|
||||
print("\nStandardization complete!")
|
||||
print("- All command names use 'cmd_' prefix")
|
||||
print("- All notification IDs use 'notif_' prefix")
|
||||
print("- Profile/task names are consistent")
|
||||
print("- Button actions are linked to event profiles")
|
||||
|
||||
if __name__ == '__main__':
|
||||
input_file = '/Users/vincentverbruggen/Personal/Personal/Areas/Tasker/Skincare_Demo_Standardized.prj.xml'
|
||||
output_file = '/Users/vincentverbruggen/Personal/Personal/Areas/Tasker/Routine_Reminders.prj.xml'
|
||||
|
||||
standardize_tasker_xml(input_file, output_file)
|
||||
Reference in New Issue
Block a user