Weathrman Version History
Version 4.0 (Only The Lonely)
So much going on that I can barely keep track.
- A massive change at Flickr resulted in all of our searches breaking;
- Persistent problems with memcached are resulting in frequent 500 errors;
- We saw a 24-hour load spike due to an error I pushed into prod;
- Had a sudden discovery of Xoom incompatibility due to the sheer size of the virtual space.
So I thought now was a good time to go in and do some housekeeping, addressing long-wanted features.
- Preferences!
- Network requests not connected directly to a user action now obey the global background data setting.
- Enable/disable background data over 2G/3G networks
- Enable/disable background data over WiMAX networks
- Change the refresh rate from hourly up through every 8 hours
- Lots of changes to error handling to streamline
- Support for exponential fallback when attempting to refresh to deal with connectivity, client, and server errors more gracefully.
- Preview now shows a preview
- Lots of Xoom and Android 3.0 love
- About dialogs with usage instructions that walk through the install process
- A launcher that goes to settings so people who don’t know how to get to live wallpaper can
- Progress updates overlaid on wallpaper
- Lots of prep work for internationalization of text strings
Now that we’re allowed a lot fewer search terms, we’re doing a lot more fan-out of requests to flickr; a single user can now result in about 5,000 flickr requests, fired off in under 30 seconds. The pressure is on to find better search terms and filter terms, and so our next steps will be to take advantage of the prediction API and start using machine learning to make better decisions.
Version 3.5.1 (The Best Intentions)
I had a report that I was using lots of cache; to my surprise, it was also true on my own device. It’s a fairly killer bug, and I’m surprised nobody sent me any mail on the subject.
- Deguiced.
- Rewrote as an Engine and a group of IntentServices that respond to intents.
- Tweaked daytime searches to get Bono and U2 off of my lock screen. Don’t ask.
- Fixed issues with caching that caused leaking of previous backdrops.
- Performance, performance, performance.
Future versions will be focusing on customizability of the local client, and on ensuring compatibility with various tablet releases.
Version 3.01 (Amsterdamn, I broke the build)
Latitude and longitude are sent in decimal form - specifically, with four significant digits of floating point. That format string was locale-specific, but wasn’t intended to be; as such, I’ve been encoding requests badly for any non-English locale.
I really, really ought to have tested in French. I can speak/read more than enough French to get by, and it would have found the problem immediately.
Mea culpa.
Version 3.0 (Cloud Ruler Temple)
This shifts almost all of the app’s behaviour, searches, and the rest, to an application I’m running in AppEngine. I’m out-of-pocket if it’s popular, so I’ve added some pretty aggressive caching mechanisms in the hopes of improving its performance and decreasing the cost of running this thing.
It is, however, much prettier. I’ve been able to test across more timezones, improve the search quality both here in London and elsewhere, add more breadth and depth to performed searches, and lots of little improvements along the way.
Image quality is better because we’ll accept larger originals, and the images get reformatted for your screen in the cloud to restrict the amount of data downloaded over mobile networks. If I could downsample to 16-bit in the server, I would - but that’s the one transform I can’t apply. I’m afraid device dithering is here to stay, for now.
The only negative is going to be the out-of-pocket cost of running the appengine service for this thing. Hopefully it won’t eat me alive.
- Cloudy != Smoky. Most of california looks like it’s on fire, from Weathrman’s point of view. Fixed.
- Push searches to the cloud.
- Push weather conditions lookup to the cloud, caching both the reverse geocode and the current conditions for that geocoded location.
- Cache individual Flickr queries.
- Cache aggregated flickr queries for an entire location. (5 years * 15 result pages = a lot of individual queries)
- Add a filter to filter out photos which aren’t associated with a place. (we asked for geocoded, we meant geocoded)
- Remove the cap on image resolution, but cache the image.
- When processing minimum acceptable resolution, treat x and y independently, rather than just testing megapixels.
- Add negative keywords for popular modes of transport (random photos of the insides of buses and the underground are especially unwelcome)
- Add more negative keywords for nakedness, building interiors, rooms, offices, cats, dogs, various sporting events, self portraits, and police. (Don’t ask me, I don’t know.)
- Make fewer requests (!) to flickr’s APIs. Drop down to 5 result pages per year for the query window; in return, move to interestingness-desc to pack what results we do get with interesting content.
- Drop foreign language queries from the search; they’re making the calls more expensive, but not returning lots of valuable content. Flickr seems to be very english-centric, in terms of depth/breadth of content.
- Give each weather condition its own set of negative keywords, so that I can restrict the set of negative keywords to the searches that are returning bad results, rather than continuing to grow the global list.
- Redefine “clear” weather. Defining it by what it *is not* is easier than describing it as what it is. From now on, clear skies should get “sky”, but not mention rain, clouds, or storms.
- Add negative keywords for clear nights to remove “hen” and “stag” nights. Also remove pubs, bars, and nightclubs. And beer.
- Increase the minimum number of results to consider a tier OK to 5. If you haven’t got more than 5 results at a given level, step up - there just isn’t enough randomness to ensure variety.
- Strip out any photos for which the developer either didn’t set a proper title, or didn’t provide one at all.
If you’re not getting good results, tell me what time of day it was and where you were (down to street level is best, but I’ll settle for a city) and I’ll attempt to improve them.
Version 2.5 (Baby Got Back)
This is another minor change, designed to increase the diversity of selected images.
- Don’t look lower than neighborhood; street is too narrow, city too broad.
- Perform all queries at a given location accuracy and collate results.
- Choose randomly from the set of potential matches.
- If network is down or there’s no location fix, reschedule an update. Should reduce black-on-first-boot.
Version 2.4 (Spotless Minds)
This is a minor change, designed to address a handful of small issues.
- Drop “sunny” as its own set of search terms; lump it with clear, and broaden clear.
- Add more to the list of negative keywords to remove more unwanted images.
- Tweak some search terms in all of our search languages to improve search quality.
- Introduce sunrise and sunset as unique search patterns during the three hours around sunrise and sunset.
Version 2.3 (Volcanic Disruption)
Today, my weather was a volcano, which can only mean one thing: an unrecognized weather condition. My reaction has been to say goodbye to Google’s easy-to-use-but-badly-designed weather API, and hello to Yahoo’s, which is an order of magnitude better.
Version 2.2 (Indigestion)
Tweaks to ensure that views are brought to the front, and the addition of an error display. Underneath the hood, I’ve also implemented separate delegates for preview and live wallpapers, and preview has been implemented as a rendering of a packaged layout.
Version 2.1 (Revenge of the Hoagie)
Well, that was fast. Went to work to the din of outrage emanating from pretty much every Weathrman user I know.
- Remove permanent notification.
- Add a notification which only appears while an update is in progress.
- Update a progress bar.
- Android’s bitmap processing in 565 leads to lots of banding if I don’t turn on dithering. :(
Doubletap will still get you the ‘more info’ screen.
Version 2.0 (Passamaquoddy)
Lots and lots of changes in here, adding UI elements so that we can expose more complex behaviour later, and improving the quality of backdrops in every way I can think of.
- Restrict Flickr API searches to three month windows, performing one restricted search query per year.
- Fetch up to 1000 results per search by performing paged requests.
- Ignore image results that are too low a resolution.
- Ignore image results that are too high a resolution.
- Support both large and original images on flickr, instead of originals only.
- Translate all search terms into French, German, Italian, and Spanish to pick up images tagged by users who natively use those languages.
- Add support for “drizzle” as a synonym for rain.
- Merge fog, smog, haze, and mist search terms.
- Merge snow and ice.
- Remove nighttime search terms, they just don’t work the way you’d want them to.
- Remove a Flickr API call to get image sizes, preferring the URLs provided during search.
- Add a notification to the backdrop to expose UI behaviour, as doubletap isn’t discoverable.
- Add an action to display more information about the currently active desktop
- Add a reload button to the more information screen
- Add a “view in Flickr” button to the more information screen
Version 1.9 (Purple Haze)
Primarily, this is an SDK update; but as it’s hazy in London at the moment, and we’ve seen some strange pictures, I’m going to go ahead and improve the search terms associated with this weather condition.
- Increase the number of search results we’re willing to look at for any given query.
- Widen the scope of the first flickr search to more than neighborhood, but less than city.
- Make haze equivalent to fog; add synonyms for smog to those already present for haze and fog.
Version 1.8 (Butterfly Effect)
This is a mostly inconsequential fix, primarily involving extracting some code into more common locations, further testing.
- When waking up after the timer would otherwise have been fired, schedule for immediate execution.
Version 1.7 (Sleeping Satellite)
- Track surfaceHolder as a local var, clearing it when the surface is disabled.
- Keep a local variable holding the surface, and maintain it through onSurfaceCreated(), onSurfaceDestroyed(), and onSurfaceChanged(). It’s hard to tell if it’s necessary, but the documentation says they will throttle you should you ever do so at the wrong time, and I won’t risk it. Just another case where the Android documentation just doesn’t help you do the right thing; I should be able to trust getSurfaceHolder() will never lead me astray, but I can’t, it seems. Too many fucking callbacks.
- Disable the background timer on loss of visibility; reenable it when we become visible again. The timer will continue as usual - if making it visible means it should fire immediately, it will.
- Improve network checking, and use it in both doubletap and scheduled fire cases.
- Move to RGB_565. This one makes me want to cry. Loading and tracking ARGB_8888 is a massive, massive performance hit over RGB_565, and quite frankly, in this day and age, it ought not to be. This is an N1, for heaven’s sake, it ought to *fly*. But the difference between c.drawImage() to the wallpaper surface from RGB_565 is an order of magnitude cheaper than RGB_8888. Technically, this probably isn’t a sacrifice in quality… on the device I own. But I can’t imagine that 565 is the native format on all devices everywhere, and quite frankly I think it sucks that 8888 isn’t the optimized path.
Version 1.5 (Stewarts Anonymous)
- Adding a network check on the scheduling process.
- Adding a list of banned terms (“nude”, “naked”) to avoid seeing naked base jumper arse in Hyde Park.
- Splitting search terms used for “clear” by day/night cycle.
- Re-adding night-specific search terms.
Version 1.4 (The Niemann Hypothesis)
- Removing background data use and AlertManager wake-from-sleep-to-update. Though it sounded cool to me, everyone else thought it was overkill.
- Moving to AsyncTask for update task.
- Tracking when the last update took place was; when the device wakes, if it’s been longer than the update deadline, it’ll try a refresh.
- Added progress output. It’s not pretty, but it’s there.
- Removed some of the text we overlay in the top left corner, as someone commented there was just too much text there.
- Added the date the photo was taken on, as some said they’d like to know.
Version 1.3 (About an hour after 1.2)
- Basic, brute-force cache management (delete cached content on exit). I’d like a lot more finesse, here, but that requires I start tracking which files are currently ‘active’; I’ve isolated the impl behind an interface so that later on, when I start doing resource tracking, it’s there.
Version 1.2 (Release)
- Icon and thumbnail have been added.
- Updates performed on a background service that lives only as long as its request.
- Largeish reduction in memory usage; we peak a bit when we load a fresh image, but our only real use now is the backing buffer we use to ensure fast redraws. 15M now, and that’s good enough for me. For now, at least.
- “Overcast” wasn’t in our list of recognizable weather conditions. Evidently there’s a football player named Volcano. Who knew?
- Logging exceptions to Analytics. Flurry, your API is pants; don’t use static methods as your primary API, and make it more friendly to multi-serviced logging.
- As there’s no control for users over the behaviour yet, setting the fetch time to two hours.
Version 1.0 (Beta)
- Initial release for beta testers.