So anyway, I'm making a shopping list app for Android. As I understand, "shopping list" is something of a hello-world exercise of Android development, which may explain why there are so many rudimentary ones in Google Play. Only in my case I actually need one, and I know exactly what I want from it.
See, for the past 10 years or so I've been in charge of food supply in our family, which includes everything from grocery shopping logistics, to cooking, to arranging dishes in the dishwasher. And the app is an essential part of the first stage of that chain.
Up until recently I used Out of Milk, which someone suggested me a long time ago, and at that time it was probably the best choice. I remember being quite happy to pay for a full version. Over time though it got a little bloated in ways I didn't need and a little neglected in places I cared about. The UI got very "traditional", requiring fiddly unnecessary motions for core functionality.
Here's the short list of its wrongs I still remember:
Start-up time of several seconds, sometimes overflowing into dozens. I believe my 4-year old phone should be perfectly able to load a shopping list in sub-second time.
Adding an item when it's already on the list results in two identical items on the list. (Yes, really.)
Auto suggest when adding an item has whatever ordering and limits the amount of displayed results. This meant I could never get "Tomatoes" in there, as they were buried under "Roma tomatoes", "Cherry tomatoes", and a few others with no way to scroll to it.
Tiny click target to check an item off the list. I was constantly fat-fingering around those and getting into a different screen.
Checking an item off the list puts it into another list below the main one, which you either have to empty all the time, or end up with a huge scroll height. As I understand, the idea was that you could uncheck the items from there to put them back on the list, but that's unrealistic with my catalog of ~ 150 items.
"Smart" categorization kept inventing excessively detailed categories leading to several one-item categories clogging up the list.
Sometimes unsuccessful synchronization would "forget" added items on the list. Which is funny because I didn't have anything to synchronize with!
I probably could spend some time on searching for an app that'd suit me better, but… Look, I'm a programmer. Writing code is what I do! And I wanted to play with Android development since forever, and the recent exposure to Kotlin gave me all the reasons I didn't really need in the first place :-)
Here's a laundry list of what I want from a shopping list:
Automatic ordering based on the order in which I buy things. I've had this idea ever since I was using Out Of Milk, because ordering manually sucks, and it feels like something computers should be able to do well, right? However it's really not trivial to implement, if you think of it. So it was my main challenge and a trigger to actually start the project.
Fuzzy search for suggested items. I'm used to typing 3-4 characters in my Sublime Text to go to every file or identifier in a project. I want the same service here.
Smart sorting of suggested items. It could take into account closeness of matching, frequency and recency of buying.
Multiple lists with separate histories. Different stores have different order of aisles, and I buy different things in them. A single list won't cut it.
Renaming and annotating items. I get annoyed by typos and spelling errors, I want to correct them. And sometimes I want to add a short note to an item (like a particular brand of cheese, or a reminder that I need two cartons of milk this time).
Color-coded categories, to give visual aid in scanning what otherwise would be a plain list of strings. They don't have to be terribly detailed.
Less of buttons, check boxes and dialogs. I want to interact with the content itself as much as possible. Swiping items off the list instead of clicking a checkbox. Having lists themselves in a carousel, instead of choosing their names from a
<select>, etc. Oh, and no settings, if I can get away with it!
Undo. It's really annoying to accidentally swipe off something covered by your thumb only to realize it's not what you intended, and now you have no clue what it was.
GPS pinning. This is one aspirational feature I'll probably tackle last, if ever. I want to pin a list to a particular geo location, so the app would automatically select it when I'm at this store again.
Also, no tracking, ads or other such bullshit. Should be self-explanatory :-) Not having some ugly API SDK making network calls at startup should really help with performance.
I actually first started working on it at the end of 2019 and made good progress into 2020… but then something got in the way.
Author: Ivan Sagalaev <firstname.lastname@example.org>
Date: Fri Dec 4 20:43:11 2020 -0800
Remove .idea/* from under git
Author: Ivan Sagalaev <email@example.com>
Date: Sun Jan 26 22:21:46 2020 -0800
Rename `actualRecency` -> `recencyScore`
Yeah… Anyway, after making an effort to restart the project I'm making good progress again and actually feel really happy about it all!
About a month ago I started dogfooding the app and was able to deleted Out Of Milk from my phone (So long and thanks for all the fish!) I've got the first five features mostly done, but there's nothing like actually using it that keeps showing me various edge cases I could never think about. I love this process :-)
Crucially, I can now add "Tomatoes" by just typing "t", "m" — and have them as the first suggestion.
The app looks pretty rudimentary, as you'd expect at this stage. But really, this time I want to not just fool around and dump the code somewhere in the open, I actually want to make a finished, sellable product out of it. Going to be a fun adventure! (Technically, me and my wife already tried selling my shareware tools at some time in the previous century, but we managed to only sell about two copies, so it doesn't count.)
Wish me luck :-)