Super excited about interactive widgets in iOS 17! Starting & stopping time entries in @timery widgets *without having to open the app* will be such a great improvement, and I can’t wait to bring this to Timery later this year!

I’ve had this working for like 20 minutes and I immediately want to install the beta on all my devices just for this.

A big thank you to everyone involved in bringing us interactive widgets this year! 🥳

More @timery experiments! I wanted some visual feedback that the widget is starting or stopping a time entry when a button is pressed since the action could take a couple seconds.

Widget interactions are through Buttons or Toggles, and Toggles update their state immediately while the action happens and then again when it’s finished.

So I changed what were Buttons to Toggles. And now while the widget performs the action, the start or stop icon swaps to a loading icon and then back. Much better!

iOS 17 beta 2 enabled another fun thing for interactive widgets: starting Live Activities! So starting a time entry from a @timery widget will also start a Live Activity!

And speaking of Live Activities, since they’re part of WidgetKit, they gain interactivity too. So the stop button can stop the time entry without having to open the app!

Had another idea for interactive @timery widgets! In the app, you can select a report item to filter the report and see time tracked for that project, tag, day, etc.

Can that work in widgets too? Yes, yes it can!

So it’s like changing the widget configuration without actually changing it to get a quick look at time tracked details. Hooray interactive widgets!

Another bit of @timery widget interactivity!

Have you ever wanted to show more timers in a widget than can actually fit? Currently you’d have to make a stack of multiple widgets each with a set of timers.

But what about having *multiple pages of timers* in a single widget? Now that’s possible!

With this additional interactivity, the @timery Dashboard widget now has *four* bits of interactivity:
• Stop the current time entry
• Page through saved timers or recent timers
• Start a new current time entry
• Show time-tracked details

All without having to open the app!

I’m super excited about interactive widgets and am really looking forward to bringing all this to the app soon!

Some more @timery widget interactivity!

In the app, you can start time entries minutes ago or at the last stop time with context menus, swipe actions, and keyboard shortcuts. How about in a widget too‽

The same options are available including the option to specify the number of minutes each time.

Also, @timery widgets that show time tracked can switch the time period right in the widget!

Depending on the number of graphs in the widget, the button can either cycle through today, this week, and this week by day or toggle between two.

And, of course, selecting a report item to show time-tracked details works too while switching time periods.

Hooray interactive widgets!

@joehribar @timery so pumped for this! You are really pushing the interactive widget front so well. Thank you for sharing so I can ride the hype train of Timery 🚂🎉
@joehribar i was not aware that you can start timers from the last stop time 😍
@flohgro Yeah! It’s available in a few places inside the app, and now in widgets!
@joehribar That’s exceptional work, I love it!
@_Davidsmith Thank you! I really appreciate that. Working on these widgets has been a lot of fun!
@joehribar @timery man, and here I was thinking I was excited last year about the new Timery-for-iOS16 features, but iOS 17 Timery looks like an absolute game changer!
@joehribar @timery This is amazing, Joe! 🎆 If you need another tester who already uses Timery daily and runs the iOS beta, please HMU.
@joehribar I wrote „you rock!” before seeing this. I guess you rock even more than I thought ;)
@joehribar That. Is. Slick!
@simonbs Thanks! I’m really having fun with the interactivity!
@joehribar @timery wow! Just a tip: I’d try to hide the empty timer slot. Maybe you can set the same background color of the widget!
@joehribar @simonbs @timery Damn, that’s amazing. A pretty much perfect use of interactive widgets.

@joehribar This looks amazing, Joe!

I have a very similar need in Mango Baby, so I'm curious how do you store the current page index? If the user adds the same widget twice, is it possible to distinguish the two widget instances so they have different currently selected pages?

@y2mango Thanks! I’m storing the current page in UserDefaults. The widgets must have unique IDs, but I wasn’t able to find something that persists across widget refreshes, so I’m making my own using the widget kind, size, and any configuration options to make a unique-enough ID.

If two widgets of the same size widget with the same configuration options are added, they will indeed show the same page. But I think for my use case it should work. Would love a better solution though!

@joehribar Thanks for sharing, keying on the widget configurations is a great idea!
@y2mango Sure thing! It’s not foolproof as I mentioned, but I figured most people aren’t going to have multiple instances of the same sized widget configured the exact same way, so it’s good enough.
@joehribar @timery looks amazing. Any TestFlight spots available?
@joehribar @timery Ok, now that’s crazy!
And. I. Love. It! 👏
@joehribar @timery this is fantastic! Removes the need for a stack / additional widget showing a summary report. Awesome!
@joehribar @timery wow, man I’m looking forward to these widgets!
@joehribar @timery very cool! this is perfect for Timery
@ryanashcraft @timery Thanks! Indeed, interactive widgets are going to be a great addition to Timery!
@joehribar @timery wow this is great. gonna need that testflight ;)
@joehribar @timery @imyke it's hard to believe we didn't have this already.
@joehribar @timery Any chance joining the TestFlight?
@joehribar @timery Will you happen to be looking for beta testers? Finally decided to go the time tracking route and subscribed in anticipation of interactive widgets. 🙌🏻
@joehribar @timery How did you exactly achieve this? Using LiveActivityStartingIntent? Can't get it to work yet ...
@Reutter Yeah! It’s using LiveActivityStartingIntent (or if you’re supporting iOS 17 and up LiveActivityIntent). https://developer.apple.com/documentation/appintents/liveactivitystartingintent
LiveActivityStartingIntent | Apple Developer Documentation

The protocol represents types which are expected to start, pause or otherwise modify a Live Activity in their method.

Apple Developer Documentation
@joehribar Doesn‘t seem to work for me (at least in beta 3). Is there any special implementation I need to know about ? Just call the code to open a Live Activity in perform()