vault backup: 2025-11-22 08:14:07

This commit is contained in:
2025-11-22 08:14:07 +01:00
parent fd37421245
commit abc0e1ffbf
222 changed files with 13799 additions and 310 deletions

View 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

File diff suppressed because it is too large Load Diff

View 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>&lt;StringArray sr=""&gt;&lt;_array_net.dinglisch.android.tasker.RELEVANT_VARIABLES0&gt;%ancomm
Everything to the right of =:=
Everything to the right of =:=&lt;/_array_net.dinglisch.android.tasker.RELEVANT_VARIABLES0&gt;&lt;_array_net.dinglisch.android.tasker.RELEVANT_VARIABLES1&gt;%anmessage
Whole AutoNotification Message
Whole AutoNotification Message&lt;/_array_net.dinglisch.android.tasker.RELEVANT_VARIABLES1&gt;&lt;_array_net.dinglisch.android.tasker.RELEVANT_VARIABLES2&gt;%anpar()
Array of single words to the left of =:=
Array of single words to the left of =:=&lt;/_array_net.dinglisch.android.tasker.RELEVANT_VARIABLES2&gt;&lt;/StringArray&gt;</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>&lt;StringArray sr=""&gt;&lt;_array_net.dinglisch.android.tasker.RELEVANT_VARIABLES0&gt;%ancomm
Everything to the right of =:=
Everything to the right of =:=&lt;/_array_net.dinglisch.android.tasker.RELEVANT_VARIABLES0&gt;&lt;_array_net.dinglisch.android.tasker.RELEVANT_VARIABLES1&gt;%anmessage
Whole AutoNotification Message
Whole AutoNotification Message&lt;/_array_net.dinglisch.android.tasker.RELEVANT_VARIABLES1&gt;&lt;_array_net.dinglisch.android.tasker.RELEVANT_VARIABLES2&gt;%anpar()
Array of single words to the left of =:=
Array of single words to the left of =:=&lt;/_array_net.dinglisch.android.tasker.RELEVANT_VARIABLES2&gt;&lt;/StringArray&gt;</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>&lt;null&gt;</ActionIconString1>
<ActionIconString1-type>java.lang.String</ActionIconString1-type>
<ActionIconString2>&lt;null&gt;</ActionIconString2>
<ActionIconString2-type>java.lang.String</ActionIconString2-type>
<ActionIconString3>&lt;null&gt;</ActionIconString3>
<ActionIconString3-type>java.lang.String</ActionIconString3-type>
<ActionIconString4>&lt;null&gt;</ActionIconString4>
<ActionIconString4-type>java.lang.String</ActionIconString4-type>
<ActionIconString5>&lt;null&gt;</ActionIconString5>
<ActionIconString5-type>java.lang.String</ActionIconString5-type>
<AppendTexts>false</AppendTexts>
<AppendTexts-type>java.lang.Boolean</AppendTexts-type>
<BackgroundColor>&lt;null&gt;</BackgroundColor>
<BackgroundColor-type>java.lang.String</BackgroundColor-type>
<BadgeType>&lt;null&gt;</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>&lt;null&gt;</DismissOnTouchVariable>
<DismissOnTouchVariable-type>java.lang.String</DismissOnTouchVariable-type>
<ExtraInfo>&lt;null&gt;</ExtraInfo>
<ExtraInfo-type>java.lang.String</ExtraInfo-type>
<GroupAlertBehaviour>&lt;null&gt;</GroupAlertBehaviour>
<GroupAlertBehaviour-type>java.lang.String</GroupAlertBehaviour-type>
<GroupKey>&lt;null&gt;</GroupKey>
<GroupKey-type>java.lang.String</GroupKey-type>
<IconExpanded>&lt;null&gt;</IconExpanded>
<IconExpanded-type>java.lang.String</IconExpanded-type>
<IsGroupSummary>false</IsGroupSummary>
<IsGroupSummary-type>java.lang.Boolean</IsGroupSummary-type>
<IsGroupVariable>&lt;null&gt;</IsGroupVariable>
<IsGroupVariable-type>java.lang.String</IsGroupVariable-type>
<MediaAlbum>&lt;null&gt;</MediaAlbum>
<MediaAlbum-type>java.lang.String</MediaAlbum-type>
<MediaArtist>&lt;null&gt;</MediaArtist>
<MediaArtist-type>java.lang.String</MediaArtist-type>
<MediaDuration>&lt;null&gt;</MediaDuration>
<MediaDuration-type>java.lang.String</MediaDuration-type>
<MediaIcon>&lt;null&gt;</MediaIcon>
<MediaIcon-type>java.lang.String</MediaIcon-type>
<MediaLayout>false</MediaLayout>
<MediaLayout-type>java.lang.Boolean</MediaLayout-type>
<MediaNextCommand>&lt;null&gt;</MediaNextCommand>
<MediaNextCommand-type>java.lang.String</MediaNextCommand-type>
<MediaPauseCommand>&lt;null&gt;</MediaPauseCommand>
<MediaPauseCommand-type>java.lang.String</MediaPauseCommand-type>
<MediaPlayCommand>&lt;null&gt;</MediaPlayCommand>
<MediaPlayCommand-type>java.lang.String</MediaPlayCommand-type>
<MediaPlaybackState>&lt;null&gt;</MediaPlaybackState>
<MediaPlaybackState-type>java.lang.String</MediaPlaybackState-type>
<MediaPosition>&lt;null&gt;</MediaPosition>
<MediaPosition-type>java.lang.String</MediaPosition-type>
<MediaPreviousCommand>&lt;null&gt;</MediaPreviousCommand>
<MediaPreviousCommand-type>java.lang.String</MediaPreviousCommand-type>
<MediaTrack>&lt;null&gt;</MediaTrack>
<MediaTrack-type>java.lang.String</MediaTrack-type>
<MessagingImages>&lt;null&gt;</MessagingImages>
<MessagingImages-type>java.lang.String</MessagingImages-type>
<MessagingOwnIcon>&lt;null&gt;</MessagingOwnIcon>
<MessagingOwnIcon-type>java.lang.String</MessagingOwnIcon-type>
<MessagingOwnName>&lt;null&gt;</MessagingOwnName>
<MessagingOwnName-type>java.lang.String</MessagingOwnName-type>
<MessagingPersonBot>&lt;null&gt;</MessagingPersonBot>
<MessagingPersonBot-type>java.lang.String</MessagingPersonBot-type>
<MessagingPersonIcons>&lt;null&gt;</MessagingPersonIcons>
<MessagingPersonIcons-type>java.lang.String</MessagingPersonIcons-type>
<MessagingPersonImportant>&lt;null&gt;</MessagingPersonImportant>
<MessagingPersonImportant-type>java.lang.String</MessagingPersonImportant-type>
<MessagingPersonNames>&lt;null&gt;</MessagingPersonNames>
<MessagingPersonNames-type>java.lang.String</MessagingPersonNames-type>
<MessagingPersonUri>&lt;null&gt;</MessagingPersonUri>
<MessagingPersonUri-type>java.lang.String</MessagingPersonUri-type>
<MessagingSeparator>&lt;null&gt;</MessagingSeparator>
<MessagingSeparator-type>java.lang.String</MessagingSeparator-type>
<MessagingTexts>&lt;null&gt;</MessagingTexts>
<MessagingTexts-type>java.lang.String</MessagingTexts-type>
<NotificationChannelBypassDnd>false</NotificationChannelBypassDnd>
<NotificationChannelBypassDnd-type>java.lang.Boolean</NotificationChannelBypassDnd-type>
<NotificationChannelDescription>&lt;null&gt;</NotificationChannelDescription>
<NotificationChannelDescription-type>java.lang.String</NotificationChannelDescription-type>
<NotificationChannelId>&lt;null&gt;</NotificationChannelId>
<NotificationChannelId-type>java.lang.String</NotificationChannelId-type>
<NotificationChannelImportance>&lt;null&gt;</NotificationChannelImportance>
<NotificationChannelImportance-type>java.lang.String</NotificationChannelImportance-type>
<NotificationChannelName>&lt;null&gt;</NotificationChannelName>
<NotificationChannelName-type>java.lang.String</NotificationChannelName-type>
<NotificationChannelShowBadge>false</NotificationChannelShowBadge>
<NotificationChannelShowBadge-type>java.lang.Boolean</NotificationChannelShowBadge-type>
<PersistentVariable>&lt;null&gt;</PersistentVariable>
<PersistentVariable-type>java.lang.String</PersistentVariable-type>
<PhoneOnly>false</PhoneOnly>
<PhoneOnly-type>java.lang.Boolean</PhoneOnly-type>
<PriorityVariable>&lt;null&gt;</PriorityVariable>
<PriorityVariable-type>java.lang.String</PriorityVariable-type>
<PublicVersion>&lt;null&gt;</PublicVersion>
<PublicVersion-type>java.lang.String</PublicVersion-type>
<ReplyAction>&lt;null&gt;</ReplyAction>
<ReplyAction-type>java.lang.String</ReplyAction-type>
<ReplyChoices>&lt;null&gt;</ReplyChoices>
<ReplyChoices-type>java.lang.String</ReplyChoices-type>
<ReplyLabel>&lt;null&gt;</ReplyLabel>
<ReplyLabel-type>java.lang.String</ReplyLabel-type>
<ShareButtonsVariable>&lt;null&gt;</ShareButtonsVariable>
<ShareButtonsVariable-type>java.lang.String</ShareButtonsVariable-type>
<SkipPictureCache>false</SkipPictureCache>
<SkipPictureCache-type>java.lang.Boolean</SkipPictureCache-type>
<SoundPath>&lt;null&gt;</SoundPath>
<SoundPath-type>java.lang.String</SoundPath-type>
<StatusBarIconString>&lt;null&gt;</StatusBarIconString>
<StatusBarIconString-type>java.lang.String</StatusBarIconString-type>
<StatusBarTextSize>16</StatusBarTextSize>
<StatusBarTextSize-type>java.lang.String</StatusBarTextSize-type>
<TextExpanded>&lt;null&gt;</TextExpanded>
<TextExpanded-type>java.lang.String</TextExpanded-type>
<Time>&lt;null&gt;</Time>
<Time-type>java.lang.String</Time-type>
<TimeFormat>&lt;null&gt;</TimeFormat>
<TimeFormat-type>java.lang.String</TimeFormat-type>
<Timeout>&lt;null&gt;</Timeout>
<Timeout-type>java.lang.String</Timeout-type>
<TitleExpanded>&lt;null&gt;</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>&lt;null&gt;</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>&lt;null&gt;</config_action_1_icon>
<config_action_1_icon-type>java.lang.String</config_action_1_icon-type>
<config_action_2_icon>&lt;null&gt;</config_action_2_icon>
<config_action_2_icon-type>java.lang.String</config_action_2_icon-type>
<config_action_3_icon>&lt;null&gt;</config_action_3_icon>
<config_action_3_icon-type>java.lang.String</config_action_3_icon-type>
<config_action_4_icon>&lt;null&gt;</config_action_4_icon>
<config_action_4_icon-type>java.lang.String</config_action_4_icon-type>
<config_action_5_icon>&lt;null&gt;</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>&lt;null&gt;</config_notification_action_button3>
<config_notification_action_button3-type>java.lang.String</config_notification_action_button3-type>
<config_notification_action_button4>&lt;null&gt;</config_notification_action_button4>
<config_notification_action_button4-type>java.lang.String</config_notification_action_button4-type>
<config_notification_action_button5>&lt;null&gt;</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>&lt;null&gt;</config_notification_action_label3>
<config_notification_action_label3-type>java.lang.String</config_notification_action_label3-type>
<config_notification_action_on_dismiss>&lt;null&gt;</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>&lt;null&gt;</config_notification_command>
<config_notification_command-type>java.lang.String</config_notification_command-type>
<config_notification_content_info>&lt;null&gt;</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>&lt;null&gt;</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>&lt;null&gt;</config_notification_led_color>
<config_notification_led_color-type>java.lang.String</config_notification_led_color-type>
<config_notification_led_off>&lt;null&gt;</config_notification_led_off>
<config_notification_led_off-type>java.lang.String</config_notification_led_off-type>
<config_notification_led_on>&lt;null&gt;</config_notification_led_on>
<config_notification_led_on-type>java.lang.String</config_notification_led_on-type>
<config_notification_max_progress>&lt;null&gt;</config_notification_max_progress>
<config_notification_max_progress-type>java.lang.String</config_notification_max_progress-type>
<config_notification_number>&lt;null&gt;</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>&lt;null&gt;</config_notification_picture>
<config_notification_picture-type>java.lang.String</config_notification_picture-type>
<config_notification_priority>&lt;null&gt;</config_notification_priority>
<config_notification_priority-type>java.lang.String</config_notification_priority-type>
<config_notification_progress>&lt;null&gt;</config_notification_progress>
<config_notification_progress-type>java.lang.String</config_notification_progress-type>
<config_notification_subtext>&lt;null&gt;</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>&lt;null&gt;</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>&lt;null&gt;</config_notification_url>
<config_notification_url-type>java.lang.String</config_notification_url-type>
<config_notification_vibration>&lt;null&gt;</config_notification_vibration>
<config_notification_vibration-type>java.lang.String</config_notification_vibration-type>
<net.dinglisch.android.tasker.RELEVANT_VARIABLES>&lt;StringArray sr=""&gt;&lt;_array_net.dinglisch.android.tasker.RELEVANT_VARIABLES0&gt;%err
Error Code
Only available if you select &amp;lt;b&amp;gt;Continue Task After Error&amp;lt;/b&amp;gt; and the action ends in error&lt;/_array_net.dinglisch.android.tasker.RELEVANT_VARIABLES0&gt;&lt;_array_net.dinglisch.android.tasker.RELEVANT_VARIABLES1&gt;%errmsg
Error Message
Only available if you select &amp;lt;b&amp;gt;Continue Task After Error&amp;lt;/b&amp;gt; and the action ends in error&lt;/_array_net.dinglisch.android.tasker.RELEVANT_VARIABLES1&gt;&lt;/StringArray&gt;</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>&lt;null&gt;</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>&lt;null&gt;</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>&lt;null&gt;</ActionIconString1>
<ActionIconString1-type>java.lang.String</ActionIconString1-type>
<ActionIconString2>&lt;null&gt;</ActionIconString2>
<ActionIconString2-type>java.lang.String</ActionIconString2-type>
<ActionIconString3>&lt;null&gt;</ActionIconString3>
<ActionIconString3-type>java.lang.String</ActionIconString3-type>
<ActionIconString4>&lt;null&gt;</ActionIconString4>
<ActionIconString4-type>java.lang.String</ActionIconString4-type>
<ActionIconString5>&lt;null&gt;</ActionIconString5>
<ActionIconString5-type>java.lang.String</ActionIconString5-type>
<AppendTexts>false</AppendTexts>
<AppendTexts-type>java.lang.Boolean</AppendTexts-type>
<BackgroundColor>&lt;null&gt;</BackgroundColor>
<BackgroundColor-type>java.lang.String</BackgroundColor-type>
<BadgeType>&lt;null&gt;</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>&lt;null&gt;</DismissOnTouchVariable>
<DismissOnTouchVariable-type>java.lang.String</DismissOnTouchVariable-type>
<ExtraInfo>&lt;null&gt;</ExtraInfo>
<ExtraInfo-type>java.lang.String</ExtraInfo-type>
<GroupAlertBehaviour>&lt;null&gt;</GroupAlertBehaviour>
<GroupAlertBehaviour-type>java.lang.String</GroupAlertBehaviour-type>
<GroupKey>&lt;null&gt;</GroupKey>
<GroupKey-type>java.lang.String</GroupKey-type>
<IconExpanded>&lt;null&gt;</IconExpanded>
<IconExpanded-type>java.lang.String</IconExpanded-type>
<IsGroupSummary>false</IsGroupSummary>
<IsGroupSummary-type>java.lang.Boolean</IsGroupSummary-type>
<IsGroupVariable>&lt;null&gt;</IsGroupVariable>
<IsGroupVariable-type>java.lang.String</IsGroupVariable-type>
<MediaAlbum>&lt;null&gt;</MediaAlbum>
<MediaAlbum-type>java.lang.String</MediaAlbum-type>
<MediaArtist>&lt;null&gt;</MediaArtist>
<MediaArtist-type>java.lang.String</MediaArtist-type>
<MediaDuration>&lt;null&gt;</MediaDuration>
<MediaDuration-type>java.lang.String</MediaDuration-type>
<MediaIcon>&lt;null&gt;</MediaIcon>
<MediaIcon-type>java.lang.String</MediaIcon-type>
<MediaLayout>false</MediaLayout>
<MediaLayout-type>java.lang.Boolean</MediaLayout-type>
<MediaNextCommand>&lt;null&gt;</MediaNextCommand>
<MediaNextCommand-type>java.lang.String</MediaNextCommand-type>
<MediaPauseCommand>&lt;null&gt;</MediaPauseCommand>
<MediaPauseCommand-type>java.lang.String</MediaPauseCommand-type>
<MediaPlayCommand>&lt;null&gt;</MediaPlayCommand>
<MediaPlayCommand-type>java.lang.String</MediaPlayCommand-type>
<MediaPlaybackState>&lt;null&gt;</MediaPlaybackState>
<MediaPlaybackState-type>java.lang.String</MediaPlaybackState-type>
<MediaPosition>&lt;null&gt;</MediaPosition>
<MediaPosition-type>java.lang.String</MediaPosition-type>
<MediaPreviousCommand>&lt;null&gt;</MediaPreviousCommand>
<MediaPreviousCommand-type>java.lang.String</MediaPreviousCommand-type>
<MediaTrack>&lt;null&gt;</MediaTrack>
<MediaTrack-type>java.lang.String</MediaTrack-type>
<MessagingImages>&lt;null&gt;</MessagingImages>
<MessagingImages-type>java.lang.String</MessagingImages-type>
<MessagingOwnIcon>&lt;null&gt;</MessagingOwnIcon>
<MessagingOwnIcon-type>java.lang.String</MessagingOwnIcon-type>
<MessagingOwnName>&lt;null&gt;</MessagingOwnName>
<MessagingOwnName-type>java.lang.String</MessagingOwnName-type>
<MessagingPersonBot>&lt;null&gt;</MessagingPersonBot>
<MessagingPersonBot-type>java.lang.String</MessagingPersonBot-type>
<MessagingPersonIcons>&lt;null&gt;</MessagingPersonIcons>
<MessagingPersonIcons-type>java.lang.String</MessagingPersonIcons-type>
<MessagingPersonImportant>&lt;null&gt;</MessagingPersonImportant>
<MessagingPersonImportant-type>java.lang.String</MessagingPersonImportant-type>
<MessagingPersonNames>&lt;null&gt;</MessagingPersonNames>
<MessagingPersonNames-type>java.lang.String</MessagingPersonNames-type>
<MessagingPersonUri>&lt;null&gt;</MessagingPersonUri>
<MessagingPersonUri-type>java.lang.String</MessagingPersonUri-type>
<MessagingSeparator>&lt;null&gt;</MessagingSeparator>
<MessagingSeparator-type>java.lang.String</MessagingSeparator-type>
<MessagingTexts>&lt;null&gt;</MessagingTexts>
<MessagingTexts-type>java.lang.String</MessagingTexts-type>
<NotificationChannelBypassDnd>false</NotificationChannelBypassDnd>
<NotificationChannelBypassDnd-type>java.lang.Boolean</NotificationChannelBypassDnd-type>
<NotificationChannelDescription>&lt;null&gt;</NotificationChannelDescription>
<NotificationChannelDescription-type>java.lang.String</NotificationChannelDescription-type>
<NotificationChannelId>&lt;null&gt;</NotificationChannelId>
<NotificationChannelId-type>java.lang.String</NotificationChannelId-type>
<NotificationChannelImportance>&lt;null&gt;</NotificationChannelImportance>
<NotificationChannelImportance-type>java.lang.String</NotificationChannelImportance-type>
<NotificationChannelName>&lt;null&gt;</NotificationChannelName>
<NotificationChannelName-type>java.lang.String</NotificationChannelName-type>
<NotificationChannelShowBadge>false</NotificationChannelShowBadge>
<NotificationChannelShowBadge-type>java.lang.Boolean</NotificationChannelShowBadge-type>
<PersistentVariable>&lt;null&gt;</PersistentVariable>
<PersistentVariable-type>java.lang.String</PersistentVariable-type>
<PhoneOnly>false</PhoneOnly>
<PhoneOnly-type>java.lang.Boolean</PhoneOnly-type>
<PriorityVariable>&lt;null&gt;</PriorityVariable>
<PriorityVariable-type>java.lang.String</PriorityVariable-type>
<PublicVersion>&lt;null&gt;</PublicVersion>
<PublicVersion-type>java.lang.String</PublicVersion-type>
<ReplyAction>&lt;null&gt;</ReplyAction>
<ReplyAction-type>java.lang.String</ReplyAction-type>
<ReplyChoices>&lt;null&gt;</ReplyChoices>
<ReplyChoices-type>java.lang.String</ReplyChoices-type>
<ReplyLabel>&lt;null&gt;</ReplyLabel>
<ReplyLabel-type>java.lang.String</ReplyLabel-type>
<ShareButtonsVariable>&lt;null&gt;</ShareButtonsVariable>
<ShareButtonsVariable-type>java.lang.String</ShareButtonsVariable-type>
<SkipPictureCache>false</SkipPictureCache>
<SkipPictureCache-type>java.lang.Boolean</SkipPictureCache-type>
<SoundPath>&lt;null&gt;</SoundPath>
<SoundPath-type>java.lang.String</SoundPath-type>
<StatusBarIconString>&lt;null&gt;</StatusBarIconString>
<StatusBarIconString-type>java.lang.String</StatusBarIconString-type>
<StatusBarTextSize>16</StatusBarTextSize>
<StatusBarTextSize-type>java.lang.String</StatusBarTextSize-type>
<TextExpanded>&lt;null&gt;</TextExpanded>
<TextExpanded-type>java.lang.String</TextExpanded-type>
<Time>&lt;null&gt;</Time>
<Time-type>java.lang.String</Time-type>
<TimeFormat>&lt;null&gt;</TimeFormat>
<TimeFormat-type>java.lang.String</TimeFormat-type>
<Timeout>&lt;null&gt;</Timeout>
<Timeout-type>java.lang.String</Timeout-type>
<TitleExpanded>&lt;null&gt;</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>&lt;null&gt;</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>&lt;null&gt;</config_action_1_icon>
<config_action_1_icon-type>java.lang.String</config_action_1_icon-type>
<config_action_2_icon>&lt;null&gt;</config_action_2_icon>
<config_action_2_icon-type>java.lang.String</config_action_2_icon-type>
<config_action_3_icon>&lt;null&gt;</config_action_3_icon>
<config_action_3_icon-type>java.lang.String</config_action_3_icon-type>
<config_action_4_icon>&lt;null&gt;</config_action_4_icon>
<config_action_4_icon-type>java.lang.String</config_action_4_icon-type>
<config_action_5_icon>&lt;null&gt;</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>&lt;null&gt;</config_notification_action_button3>
<config_notification_action_button3-type>java.lang.String</config_notification_action_button3-type>
<config_notification_action_button4>&lt;null&gt;</config_notification_action_button4>
<config_notification_action_button4-type>java.lang.String</config_notification_action_button4-type>
<config_notification_action_button5>&lt;null&gt;</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>&lt;null&gt;</config_notification_action_label3>
<config_notification_action_label3-type>java.lang.String</config_notification_action_label3-type>
<config_notification_action_on_dismiss>&lt;null&gt;</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>&lt;null&gt;</config_notification_command>
<config_notification_command-type>java.lang.String</config_notification_command-type>
<config_notification_content_info>&lt;null&gt;</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>&lt;null&gt;</config_notification_led_color>
<config_notification_led_color-type>java.lang.String</config_notification_led_color-type>
<config_notification_led_off>&lt;null&gt;</config_notification_led_off>
<config_notification_led_off-type>java.lang.String</config_notification_led_off-type>
<config_notification_led_on>&lt;null&gt;</config_notification_led_on>
<config_notification_led_on-type>java.lang.String</config_notification_led_on-type>
<config_notification_max_progress>&lt;null&gt;</config_notification_max_progress>
<config_notification_max_progress-type>java.lang.String</config_notification_max_progress-type>
<config_notification_number>&lt;null&gt;</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>&lt;null&gt;</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>&lt;null&gt;</config_notification_progress>
<config_notification_progress-type>java.lang.String</config_notification_progress-type>
<config_notification_subtext>&lt;null&gt;</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>&lt;null&gt;</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>&lt;null&gt;</config_notification_url>
<config_notification_url-type>java.lang.String</config_notification_url-type>
<config_notification_vibration>&lt;null&gt;</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>&lt;null&gt;</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>&lt;null&gt;</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>&lt;StringArray sr=""/&gt;</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>&lt;null&gt;</OtherId>
<OtherId-type>java.lang.String</OtherId-type>
<OtherPackage>&lt;null&gt;</OtherPackage>
<OtherPackage-type>java.lang.String</OtherPackage-type>
<OtherTag>&lt;null&gt;</OtherTag>
<OtherTag-type>java.lang.String</OtherTag-type>
<PackageName>&lt;null&gt;</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>&lt;null&gt;</Text>
<Text-type>java.lang.String</Text-type>
<Title>&lt;null&gt;</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>&lt;StringArray sr=""&gt;&lt;_array_net.dinglisch.android.tasker.RELEVANT_VARIABLES0&gt;%err
Error Code
Only available if you select &amp;lt;b&amp;gt;Continue Task After Error&amp;lt;/b&amp;gt; and the action ends in error&lt;/_array_net.dinglisch.android.tasker.RELEVANT_VARIABLES0&gt;&lt;_array_net.dinglisch.android.tasker.RELEVANT_VARIABLES1&gt;%errmsg
Error Message
Only available if you select &amp;lt;b&amp;gt;Continue Task After Error&amp;lt;/b&amp;gt; and the action ends in error&lt;/_array_net.dinglisch.android.tasker.RELEVANT_VARIABLES1&gt;&lt;/StringArray&gt;</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&amp;file=Personal%2FProjects%2FSkincare%2FSkincare%20Morning</Str>
<App sr="arg1"/>
<Int sr="arg2" val="0"/>
<Str sr="arg3" ve="3"/>
</Action>
</Task>
</TaskerData>

File diff suppressed because it is too large Load Diff

View 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]]

View 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>&lt;StringArray sr=""&gt;&lt;_array_net.dinglisch.android.tasker.RELEVANT_VARIABLES0&gt;%ancomm
Everything to the right of =:=
Everything to the right of =:=&lt;/_array_net.dinglisch.android.tasker.RELEVANT_VARIABLES0&gt;&lt;_array_net.dinglisch.android.tasker.RELEVANT_VARIABLES1&gt;%anmessage
Whole AutoNotification Message
Whole AutoNotification Message&lt;/_array_net.dinglisch.android.tasker.RELEVANT_VARIABLES1&gt;&lt;_array_net.dinglisch.android.tasker.RELEVANT_VARIABLES2&gt;%anpar()
Array of single words to the left of =:=
Array of single words to the left of =:=&lt;/_array_net.dinglisch.android.tasker.RELEVANT_VARIABLES2&gt;&lt;/StringArray&gt;</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>&lt;StringArray sr=""&gt;&lt;_array_net.dinglisch.android.tasker.RELEVANT_VARIABLES0&gt;%ancomm
Everything to the right of =:=
Everything to the right of =:=&lt;/_array_net.dinglisch.android.tasker.RELEVANT_VARIABLES0&gt;&lt;_array_net.dinglisch.android.tasker.RELEVANT_VARIABLES1&gt;%anmessage
Whole AutoNotification Message
Whole AutoNotification Message&lt;/_array_net.dinglisch.android.tasker.RELEVANT_VARIABLES1&gt;&lt;_array_net.dinglisch.android.tasker.RELEVANT_VARIABLES2&gt;%anpar()
Array of single words to the left of =:=
Array of single words to the left of =:=&lt;/_array_net.dinglisch.android.tasker.RELEVANT_VARIABLES2&gt;&lt;/StringArray&gt;</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>&lt;null&gt;</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)

View 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)

View 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>&lt;StringArray sr=""&gt;&lt;_array_net.dinglisch.android.tasker.RELEVANT_VARIABLES0&gt;%ancomm
Everything to the right of =:=
Everything to the right of =:=&lt;/_array_net.dinglisch.android.tasker.RELEVANT_VARIABLES0&gt;&lt;_array_net.dinglisch.android.tasker.RELEVANT_VARIABLES1&gt;%anmessage
Whole AutoNotification Message
Whole AutoNotification Message&lt;/_array_net.dinglisch.android.tasker.RELEVANT_VARIABLES1&gt;&lt;_array_net.dinglisch.android.tasker.RELEVANT_VARIABLES2&gt;%anpar()
Array of single words to the left of =:=
Array of single words to the left of =:=&lt;/_array_net.dinglisch.android.tasker.RELEVANT_VARIABLES2&gt;&lt;/StringArray&gt;</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>&lt;StringArray sr=""&gt;&lt;_array_net.dinglisch.android.tasker.RELEVANT_VARIABLES0&gt;%ancomm
Everything to the right of =:=
Everything to the right of =:=&lt;/_array_net.dinglisch.android.tasker.RELEVANT_VARIABLES0&gt;&lt;_array_net.dinglisch.android.tasker.RELEVANT_VARIABLES1&gt;%anmessage
Whole AutoNotification Message
Whole AutoNotification Message&lt;/_array_net.dinglisch.android.tasker.RELEVANT_VARIABLES1&gt;&lt;_array_net.dinglisch.android.tasker.RELEVANT_VARIABLES2&gt;%anpar()
Array of single words to the left of =:=
Array of single words to the left of =:=&lt;/_array_net.dinglisch.android.tasker.RELEVANT_VARIABLES2&gt;&lt;/StringArray&gt;</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)