Windows’ AppointmentManager Bug

Windows has a bug when it comes to the AppointmentStore API. Somehow the AppointmentManager gets into a bad state which fails to acknowledge new appointments, and fails to provide updated appointment information. This means when adding an appointment Ink Calendar has no way of getting that new appointment data back from Windows 10.

How does this affect you?

When adding appointments to Ink Calendar they will not refresh or show up even when restarting the app. Ideally this is the worst case, but in some cases this bug results in Ink Calendar crashing.

What is being done about this?

I have made a separate app to demonstrate the several bugs within the AppointmentManger API but Microsoft has failed to acknowledge these bugs. When submitting a crash report through the Feedback Hub when this issues was being demonstrated Microsoft dismissed the feedback and did not provide guidance or any updates.

A post has been made to the Microsoft Q&A website on how to best “refresh” the AppointmentManager to stop getting stale data, but no progress has been made there.

What will happen?

It is unclear if this bug will ever get the attention required to be fixed. In the mean time Ink Calendar should work and not crash, but will occasionally have old calendar data. I have experienced this bug on Windows 11 as well, so the fix is not on the horizon as far as I can tell. I will continue working to find a solution, but in the mean time feel free to reach out to Microsoft, file feedback, and let the company know how this bug is affecting you.

Thanks for sticking with Ink Calendar through this pain. And if you have a fix for this bug please reach out, support at inkcalendar dot com, comment below, or tweet at me TheJoeFin.

Joe

Is Google Ads a scam for indie developers?

It sure feels like it.

Ink Calendar is a hobby project for me. I work as a mechanical engineer for my primary income. I would love to be an indie Windows app developer full time, but it doesn’t seem like that is in my near future. I am frequently trying out new ways to get Ink Calendar in front of potential users. An easy way this can be done is use online advertising.

In early May of 2021 I launched a Google Ads campaign for Ink Calendar. The ad directed people to this blog InkCalendar.com where the “Get From Microsoft” button is right at the top eager to be clicked. I ran the campaign for 3 weeks and spent $179 for around 883 clicks and 55k impressions.

To judge the ads performance I used the stats from WordPress, and initially I was impressed… then I dug a little deeper. Here are the WordPress stats around the time of the ad campaign:

Week ofViewsVisitors
3/1/20217444
3/8/202110374
3/15/202110258
3/22/20219765
3/29/20218660
4/5/20219461
4/12/2021180103
4/19/20219453
4/26/20218048
5/3/20217750
5/10/2021 (campaign begins)308350
5/17/2021477388
5/24/2021 (campaign ends)495390
5/31/20219358
6/7/202111658

At first look these stats are impressive! The weeks during the ad campaign had on average 6x more traffic! Exactly what I wanted! However I did notice there was not a similar increase in app downloads, so I checked to see if these new visitors were clicking on the link to get the app. Here are those numbers:

Week ofViewsVisitorsStore Clicks% of visitors click
3/1/202174441023%
3/8/2021103742128%
3/15/2021102581729%
3/22/202197651218%
3/29/202186601118%
4/5/202194611525%
4/12/20211801031717%
4/19/202194531325%
4/26/202180481123%
5/3/20217750714%
5/10/2021 (campaign begins)308350216%
5/17/2021477388195%
5/24/2021 (campaign ends)495390154%
5/31/20219358712%
6/7/2021116581424%

These numbers were pretty shocking to me. The weeks during the ad campaign had no significant change in store link clicks. In fact when looking at what percentage of visitors clicked the store links the ad campaign had terrible performance.

I am aware advertising for Ink Calendar is not the same as general business advertising. Plumbers or restaurants in an area use ads to win customers from their very similar looking competition. I’m still not completely sure what is going on with this or what to make of these numbers. But here are the things I know for sure:

  • I am no closer to being a full time indie dev
  • I will never use Google Ads to promote Ink Calendar again

A side anecdote, I would wake up around 6:00am Central Time and by that time there were already a large number of views to Ink Calendar for that day. The ad only ran in the US and the new traffic to this blog was also only from the US. I cannot understand why I’d have a couple hundred of view before the day had even begun. Very suspicious in my opinion.

Let me know what you think, either in the comments below or on twitter @theJoeFin

Joe

The Custom Pen Gallery: part 3

Adding a new pen

Saving the pen gallery was not very complicated, but there were some unfortunate complexities. The major complexity was how to initiate a change to the pen gallery. The standard UWP InkToolbar does not provide any events relevant to if or when the user changes any of the tool’s drawing attributes.

When to save

Obviously Ink Calendar should save the Pen Gallery when the users adds a new pen, deletes a pen, or moves the location of a pen. However it is also important that changes to the pen’s properties get saved when they are changed.

The way I decided to trigger this save was on ink saving. This means when the user navigates or inks the SaveInk method runs and that would trigger the SaveCustomPens method to fire.

To keep Ink Calendar from saving the custom pen file every time ink was saved the beginning of the SaveCustomPens method checks to make sure there are changes to save. If there are changes then the current InkToolbar is converted into an array and saved to a .XML file.

Convert the InkToolbar into an array

Before the pen gallery can be saved to a file it is converted to a simple List<string[]>. This is done by iterating through each button and saving an entry in a new string array for the type of pen (ballpoint, highlighter, or pencil), the selected brush index, and the stroke width, and a Pen ID.

There is another method which takes the data from this type of array and adds InkToolbarCustomPen to the InkToolbar.

Saving the List to .XML

The next step was simple, pass the List<string[]> to a method which saves it to the app’s directory. DotNET has some very easy APIs for serializing data and saving it to a file.

public static async Task SaveCustomButtons(List<string[]> listToSave)
{
    StorageFile file = await ApplicationData.Current.LocalFolder.CreateFileAsync("CustomToolButtons.xml", CreationCollisionOption.ReplaceExisting);
    XmlSerializer serializer = new XmlSerializer(typeof(List<string[]>));
    using (Stream fs = await file.OpenStreamForWriteAsync())
    {
        TextWriter textWriter = new StreamWriter(fs);
        serializer.Serialize(textWriter, listToSave);
    }
}

This is a sample method of how I save data throughout Ink Calendar. Right now the data generated by the app is fairly simple and low volume. Eventually Ink Calendar could grow to a point where it needs a SQLite database but for now .XML does the trick.

Thanks for reading and let me know if you have any questions or comments. Next I’ll talk about how I enabled the pen gallery to be edited on all form factors.

 

Joe

The Custom Pen Gallery: part 2

Adding a pen gallery was simple at first but I decided to add some more to the custom tool button. In my initial attempt I would initialize a new InktoolbarCustomPenButton and set its properties in code then add it to the Inktoolbar.

While this did work it left the issue of having two pens of the same type and color but different size and not being able to differentiate between them. So I decided to make a custom XAML control for custom pens, custom highlighters, and custom pens.

I started with a user control, but then just made a custom control of type InkToolbarCustomPenButton. I could customize the content of each of these controls to match the default inktoolbar buttons. To find these symbols I used the awesome app Character Map UWP by Edi Wang (Store Link HERE). I needed the tool outline, the tip and top color, and the background fill.

I bound the fill of the tip and top color to the SelectedBrush property of the InkToolbarCustomPenButton. Then I bound the background fill to the background of the InkToolbarCustomPenButton. This is so when the size shape is big enough it won’t make the tool icon look transparent.

17 Resize Pens

For the size representation, pen and pencil use an ellipse and highlighter uses a rectangle which the fill is bound to the SelectedBrush property and the height and width both bound to SelectedStrokeWidth. With oneway binding the shape would change color and size as the user adjusted the pen options.

Now when the users clicks “New Pen” an instance of my custom control is created and added to the inktoolbar. Simple. Users could add as many pens as they wish. They are in a scrollviewer so they can all be seen with a quick flick.

Next is the challenge of saving and loading this custom gallery each time the app loads.

Joe

The Custom Pen Gallery: Part 1

In UWP there is a control called the InkToolbar. This is a control which binds to an InkCanvas and is an easy way for users to change the type, size, and color of their inking. Ink Calendar has used this control from day one but now it is getting some attention.

The UWP version of OneNote has a pen gallery instead of the standard InkToolbar control. This enables users to set several pens and easily switch between them, without tediously changing each attribute every time. I wanted to bring the same experience to Ink Calendar because I found myself using a only few different pens while planning my time. One was a medium thickness gray pen for crossing out days. One was a thin blue pen for writing down appointments. And finally one was a highlighter for blocking out chunks of days.

There where four key elements to making my custom pen gallery in the InkToolbar.

  1. Custom Pens
  2. Custom Pen Button
  3. Saving the gallery
  4. Editing the gallery

To make this control I had to create custom pens for the Ballpoint Pen, Highlighter, and Pencil. You cannot add more than one standard tool to the InkToolbar, you must make them InkToolbarCustomToolButtons. Each type of InkToolbarCustomToolButton requires its own InkToolbarCustomPen to define how the ink will display when that tool is active.

protected override InkDrawingAttributes CreateInkDrawingAttributesCore(Brush brush, double strokeWidth)
{
      InkDrawingAttributes inkDrawingAttributes = new InkDrawingAttributes
      {
          PenTip = PenTipShape.Circle
      };
      SolidColorBrush solidColorBrush = brush as SolidColorBrush;
      inkDrawingAttributes.Color = solidColorBrush?.Color ?? Colors.Red;
      inkDrawingAttributes.DrawAsHighlighter = false;
      inkDrawingAttributes.Size = new Windows.Foundation.Size(strokeWidth * 0.5, strokeWidth * 0.5);
      return inkDrawingAttributes;
}

I made three custom pens: ballpoint pen, highlighter, and pencil. I could have chosen to make the highlighter tip shape round instead of rectangular like the standard InkToolbar highlighter, but I decided to keep it consistent to how it has been. I could still add a new pen like a highlighter but more of a marker with a round tip.

Once I had all the custom pens I needed I started working on the InkToolbarCustomToolButtons. These controls inherit from InkToolbarCustomPenButton which enables them to be added into an InkToolbar. These buttons started simple but I made them a little more complex than the standard.

Up next… the InkToolbarCustomPenButton XAML.

Joe

Summer ’18 Update

Summer has been a busy time. I have been working on big changes to Ink Calendar. Mostly these changes have been in the way new calendars are generated. I moved a lot of the code around and have been working on getting it functioning the way it should.

The reason I’m making these big changes to Ink Calendar are to enable swiping between views. I’ve been breaking all the different UI elements into their own User Controls and abstracting the code which generates a view for the given date range.

So far it has been very successful but I still need to do a lot of work to optimize the experience. I don’t want to push an update which slows down the app while delivering no new functionality.

In addition to these architecture changes I’m working on little fit and finish elements like scaling the print out to fit, more keyboard shortcuts, and other suggestions from users.

Thanks for using Ink Calendar and if you have any questions or suggestions please let me know.

 

-Joe

Progress report on 1.11

I am making good progress on version 1.11 of Ink Calendar. This update will bring a few key new features I’ve been eager to release.

  1. Better Mobile UX
  2. Jumplists
  3. Calendar Events on Week View

Jump Lists
Jump Lists

New Mobile View
New Mobile View

So far all of these features are working. None of them are perfect but the majority of the feature is working well. I’ll keep refining the update and hopefully release soon.

Thanks again for using Ink Calendar!

 

Joe

Progress with 1.7

Update 1.7 is coming along nicely. I have added lots of changes under the hood and I have discovered the source of the crashing when sharing, saving, and printing on mobile.

The changes that I have made under the hood are not tied in so they won’t affect normal app usage. I am still experimenting with how to arrange and organize ink data with relation to the days. It is very simple to associate a month with an ink file, but when you start to move to weeks, or work weeks, or arbitrary date spans it becomes much more tricky.

The source of the crashing of share, print, and save was a result of low ram devices. I tested saving an ink file on device with 512MB, 1GB, 2GB, and 3GB. I’d been doing all of my mobile testing on my Lumia 830 which only has 1GB of RAM and I was experiencing the crashing. When I downloaded a few more mobile emulators I discovered it was related to the available RAM to Ink Calendar.

To remedy this for now I have added a line which checks for the available amount of RAM and enables or disables the buttons accordingly. Long term I would like to find a way to share, print, and save more efficiently and enable those features on more devices, but for now this will have to work.

Thanks again for using Ink Calendar! If you haven’t rated/reviewed Ink Calendar in the app store I would really appreciate it!

-Joe

What’s next for 1.7

In the next release I plan to focus under the hood. This means improving the way I organize, save, and load data. With more organized data I’ll be able to manage more of it!

For example adding a week view is in the plan. Things that makes that strange. Weeks are not as organized as Months are. Their method of being organized is not as clean and consistent.

This means I’ll need to come up with a system of organizing weeks, their days, and their data. This should not be hard, but it is work that takes time.

In addition to hidden improvements I plan on going after some bugs which prevented some features from being available on mobile. Specifically the share, save, and print capabilities. When I was testing these on mobile without fail they would crash the app every time with no error. This makes debugging harder. I’ll be looking for new ways to tackle and fix this/these bugs in this update.

Thanks for using Ink Calendar! Feel free to contact me on twitter (@TheJoeFin) or email (support@Inkcalendar.com),

-Joe

Version 1.6.3 is on the way!

This week I’ve been working on adding some intelligence to Ink Calendar. After selecting some ink you can add an appointment to the calendar. Using the Windows Ink APIs the ink will be converted into text and used to build the event.

The simplest implementation of this involves adding the text as the subject of the event on the day the ink is centered. More advanced implementation involves looking for time and using that to set the start time of the event. Furthermore if the ink spans several days the even should span those days as well.

LunchAt1230PMForWeb

This is a first implementation of this technique. Let me know what you think, how well does it work for you? Does it read your ink or not?

As always, thanks for using Ink calendar!

-Joe