The Secret Diary of a Xamarin Android Developer, Aged 48 1/3

WallpaperColors

I have been trying to update Catfood Earth for Android to support Material You in Android 12. This sets a color palette from your wallpaper and other than making notifications harder to manage seems to be the main thing that Google has been working on for the past year. Live wallpaper isn't automatically supported, it's up to you to tell the system about your colors.

Happily there is an overridable OnComputeColors in WallpaperService.Engine, and you can create a WallpaperColors object from a bitmap so this looked like a five minute update. Hahahahahahhahahahah.

I spent a few weeks waiting for the Android 12 SDK to be available in Xamarin. I found some pointers to their GitHub and assumed it would show up there and so waited a few weeks. It still isn't there. I found some article about forcing it to install in Visual Studio 2019 that didn't work for me, and then realized that Visual Studio 2019 update checks were crashing. While trying to fix that I found that Visual Studio 2022 has been released and this installs with the Android 12 SDK!

These days I work on side projects when I get the occasional free hour. Almost inevitably that hour is consumed with updating two or three things and then hoping that the next time I get some time at least I'll be ready to go. But when that hour arrives I'm back to updating again.

So finally I have the right SDK and drop in an OnComputeColors and a call to NotifyColorsChanged when my wallpaper is updated. Time to start testing. The good news is that Material You is now working with Catfood Earth selected as the current wallpaper. The bad news is that every time I call NotifyColorsChanged the launcher disappears and I'm just left with the wallpaper and no icons or search box. Probably not a good experience. I try moving the NotifyColorsChanged call around to different points in code and it makes no difference. This simple update is rapidly spiraling from minutes to days to weeks.

Maybe it's some Xamarin bug, or something in Android 12 or maybe a change in the solemn contract between live wallpaper services and the rest of the system. Can't find any hint of any of this on the Internet.

It's also possible that the bitmap I'm passing is too large or too complex or too something else. So let's try just sending back a simple WallpaperColors in OnComputeColors and see if that helps.

The Android documentation for WallpaperColors suggests that you can construct it from three colors which seems sensible. The Xamarin implementation takes ColorObject instead of Color. What is a ColorObject? The sparse Xamarin documentation suggests that it has an empty constructor that creates an opaque black color and then properties like Red that are read only. So an immutable black? That can't be right? When constructing a color the constructor would seem like a great place to tell the class what color it is. Failing that, a FromColor or FromArgb would seem to follow the right sort of convention. But no. You need to find ValueOf. To create a color that is a class and not a value. Sigh. Maybe that is some kind of deep Android convention that I would just know if I did this more often than once a year or so.

Although, maybe most Google Developers can't figure out how to make a non-black color and that's the origin of Material Design 2. Everything else is just marketing rationalization on top of a terrible API.

Finally I have a simple WallpaperColors to test with but my build has broken. At some point while figuring out how to get a ColorObject that isn't black I thought a NuGet package would help. My project is now completely broken. My experience with touching NuGet is that you can either spend several days unpicking the carnage or just start over. Git reset --hard  HEAD it is then.

After quickly reimplementing the changes so far, returning a vanilla WallpaperColors object works... and so does the FromBitmap version. So 90% chance that I bodged something subtle the first time and didn't make the mistake on the second pass. 10% chance it was something strange in Visual Studio.

Add your comment...

Related Posts

You Might Also Like

(All Code Posts)

Winter Solstice 2021

Winter Solstice 2021

Winter Solstice 2021 rendered in Catfood Earth (15:59 UTC, December 21, 2021). Winter begins in the northern hemisphere, summer if you happen to be south of the equator.

(Previously: Winter Solstice 2020)

Add your comment...

Related Posts

You Might Also Like

(All Code Posts)

Creekside Trail to Big Leaf Trail Loop

Updated on Saturday, February 19, 2022

Awesome trees along Creekside Trial in Shiloh Ranch Regional Park.

Pond as seen from Pond Trail in Shiloh Ranch Regional Park.

Missing tile in Google Earth reveals the stars below Sonomoa.

3.8 mile loop with 600 foot elevation gain in Shiloh Ranch Regional Park near Santa Rosa in Sonoma County.

This is the first time my Pixel 4 XL GPS has failed me. Sometimes it wanders a little off trail, but this time it took a completely unauthorized trip to a Home Depot before eventually snapping back to reality. I've included it here but unlike any other track I've uploaded you might not want to use this one (see the route on AllTrails instead, distance incorrect below). The really strange thing is that when I look at the trail in Google Earth there is a missing tile around where the GPS freaks out and Google Earth sends the route plunging down into outer space (because it's clamping to its elevation model but the stars under Sonoma are not as far away as they look?) See the screenshot above. Something is odd at Shiloh Ranch...

Hike starts at: 38.525412, -122.762561. View in Google Earth.

Add your comment...

Related Posts

You Might Also Like

(Hike Map)

Barker Dam and Wall Street Mill

Barker Dam and Wall Street Mill

Barker Dam and Wall Street Mill

Double feature in Joshua Tree National Park. Barker Dam is just over a mile, a short loop that takes in rock art, the dam, and a nice mix of boulders and desert. Wall Street Mill is two miles out and back and the mill extracted gold to send to the US Mint in San Francisco.

Hike starts at: 34.025005, -116.142098. View in Google Earth.

Add your comment...

Related Posts

You Might Also Like

(Hike Map)

Ladder Canyon and Painted Canyon

Ladder Canyon and Painted Canyon

Ladder Canyon and Painted Canyon

Amazing 4.5 mile hike in the Mecca Hills Wilderness in Riverside County, California. You ascend a slot canyon with ladders of various difficulty helping you up and down along the way. There is a sunny section on a ridge at the top with views back to the Salton Sea and then you return along the wash at the bottom of Painted Canyon. A must do hike if you can handle a few ladders and are in the area.

Hike starts at: 33.618781, -115.99902. View in Google Earth.

Add your comment...

Related Posts

You Might Also Like

(Hike Map)

Teddybear Cholla

Teddybear Cholla

SONY ILCE-7C 40mm f22.0 1/40s ISO125

Photo of the Teddybear Cholla garden in Joshua Tree National Park.

Add your comment...

Related Posts

You Might Also Like

(Recent Photos)

Sawmill Flats

Updated on Saturday, February 19, 2022

Large boulders in Mount San Jacinto State Park

Bobcat seen at Mount San Jacinto State Park

Four and a half mile hike from Stone Creek Campground in Mount San Jacinto State Park to the ruins of a sawmill and back again. The mill is hidden but watch out for a yellow sign off the trail.

The campground was closed for the season when we arrived and a permit is required. We phoned the ranger station who said the trail was off limits and to come get a permit and discuss other hikes. After much discussion it turned out the concern was illegal parking near the campground and after promising to find legal parking and walk in we were allowed to complete the hike.

I don't have a GPS track for this one. Usually I download a GPX to Gaia GPS on my phone and use this to follow the trail. Traveling without a laptop I tried to do this from the AllTrails mobile app which wanted a paid upgrade. I have used AllTrails a fair bit so was happy to pay, but even after upgrading you can only download locally to AllTrails, the mobile app won't allow you to generate a GPX. I understand the commercial desire to lock people into their app, but I have used Gaia GPS for years an trust it to not drain my battery or otherwise cause problems when off the beaten track. AllTrails also won't let you copy and paste from hike descriptions (even ones with a long URL to check for road closures in them), and you can't export the route you took either (which I do from Gaia GPS to generate maps and elevation profiles for this blog). So I'll be cancelling that AllTrails subscription and have learned to get an export from a laptop and ignore the mobile app.

Saw a bobcat which is a first. Probably due to the trail being closed and quiet.

Add your comment...

Related Posts

You Might Also Like

(Hike Map)

Book reviews for November 2021

The Dark Hours (Renée Ballard, #4; Harry Bosch Universe, #35) by Michael Connelly

The Dark Hours (Renée Ballard, #4; Harry Bosch Universe, #35) by Michael Connelly

4/5

 

Invisible Sun (Empire Games #3) by Charles Stross

Invisible Sun (Empire Games #3) by Charles Stross

4/5

 

Better off Dead (Jack Reacher, #26) by Lee Child

Better off Dead (Jack Reacher, #26) by Lee Child

3/5

 

First Person Singular: Stories by Haruki Murakami

First Person Singular: Stories by Haruki Murakami

4/5

 

Homeland Elegies by Ayad Akhtar

Homeland Elegies by Ayad Akhtar

5/5

 

Add your comment...

Related Posts

You Might Also Like

(All Reviews)

Links for November 2021

San Francisco Crime 2003 to 2021

Updated on Saturday, February 12, 2022

San Francisco Crime 2003 to 2021

San Francisco is apparently going to hell with criminals free to do as they please with no fear of consequences. I decided to take a look at the data.

The video above shows a timelapse of SFPD incidents from 2003 through yesterday. Each frame is a day and shows incidents from the previous seven days. The top left corner of the video shows the date and the seven day count of incidents.

I grouped the reported categories into a few colors. Red is used for murder and rape. Orange for arson and kidnapping. Yellow for thefts and assaults. Purple for sex and drugs. Grey for anything else. I excluded some categories from the data (recovered vehicle, traffic collision, case closure and non-criminal).

SFPD reports the location of incidents as the closest intersection. To keep everything visible I move the location randomly within a tenth of a mile where there is a specific location reported. For crimes without a location I use a random spot within half a mile of the center of the police district (or the center of San Francisco if the district is missing - this is unusual).

The volume of incidents changes a bit during the ~18 years shown in the video, but the only real outlier is the dip following the start of the coronavirus pandemic in March 2000. Crime picks back up after this but so far hasn't returned to the level it was at before the pandemic.

Police incidents come from two datasets: Police Department Incident Reports: 2018 to Present and Police Department Incident Reports: Historical 2003 to May 2018. San Francisco is plotted using Elevation Contours. The pre and post 2018 data sets use different categories but I coded both to the set of colors outlined above. There is a drop in incidents right at the end of the video which I expect is caused by incomplete data rather than any change in crime rate.

Add your comment...

Related Posts

You Might Also Like

(More Timelapses)