Random Musings on the Android 13 Developer Preview 2

Dhanisa Mashilfa

Random Musings on the Android 13 Developer Preview 2

Each time Google releases a new developer preview, I rummage through
the API differences report
the high-level overviews,
and even the release blog post,
to see if there are things that warrant more attention from
developers. I try to emphasize mainstream features that any developer
might reasonably use, along with things that may not
get quite as much attention, because they are buried in the JavaDocs.

What Got Clarified From Last Time

About five weeks ago, I wrote about DP1.

This time around, the “13 DP1 while 12L is in beta?” answer is “12L is now folded
into DP2”.

Also, they are now
documenting the POST_NOTIFICATIONS permission.
Of particular note is that this permission affects all apps, regardless of
targetSdkVersion. If your targetSdkVersion is below Android 13’s presumed
value of 33, the system will prompt the user to grant permission when you create
your first notification channel, for a newly-installed app on 13.
If you create that channel at an inopportune time… you will
need to modify your app.

They are also documenting the new option for controlling whether a dynamically-registered receiver is exported.
And, they mentioned in the blog post the option for revoking already-granted
permissions, though the method name changed.
Plus, they talk a bit about BODY_SENSORS_BACKGROUND.

But beyond that, the mysteries from DP1 remain mysteries.

What Else Got Announced Of Note?

The biggest thing is the Foreground Services (FGS) Task Manager. This allows
users to stop your app’s process easily from the notification shade, if your
app has a foreground service running. Of particular note is that the OS will
nag users periodically about your app, if your service runs most of the time
(20 hours out of the preceding 24, with a maximum of one nag per month).
Developers may wind up adding flags
to avoid users getting bothered by those messages, which in turn will cause
Google to remove the impacts of those flags in some future Android release.

(if you spend enough time in Android development, predicting developer-and-Google
actions in advance becomes simply a matter of pattern matching…)

The War on Background Processing
continues, beyond the FGS Task Manager.

In a tweak to JobScheduler, “In Android 13, the system now tries to determine the next time an app will be launched”,
which is not at all creepy. Nope, not one bit.

The official blog post mentions a few things that might impact a small
percentage of developers.

And, that’s pretty much it for official stuff.

What’s Up With All the New Permissions?

DP2 adds 15 new permissions over DP1,
let alone prior versions of Android.

Some of these, like MANAGE_WIFI_AUTO_JOIN and MANAEG_WIFI_INTERFACES, are
documented as “Not for use by third-party applications”, which makes you wonder
why they bothered to put them in an Android SDK that is explicitly for third-party applications.

They have added three content-specific permissions: READ_MEDIA_AUDIO,
READ_MEDIA_IMAGE, and READ_MEDIA_VIDEO. The JavaDocs indicate that these
are replacements for READ_EXTERNAL_STORAGE, but only for those app that target
Android 13 or higher. Presumably, holding one of these permissions, and not READ_EXTERNAL_STORAGE,
only gives you read access to that media type and not other content.

The other permission that may generate widespread interest is USE_EXACT_ALARM.
Android 12 added SCHEDULE_EXACT_ALARM to be able to use exact alarms, but this
is an “app ops” permission, one that users have to grant directly in Settings.
USE_EXACT_ALARM appears to be a normal permission, but the JavaDocs make it
plain that the Play Store (and perhaps elsewhere) will require you to fill out a form
to be able to ship an app that requests it. As many developers are discovering
with MANAGE_EXTERNAL_STORAGE, you need a really good reason to request one of these
sorts of permissions.

What Is Up In the Clouds

Last time, I mentioned ACTION_PICK_IMAGES and how it may be backed by CloudMediaProvider objects.
It appears that this might extend beyond images someday, as there are
new interfaces tied to CloudMediaProvider rendering previews on a supplied Surface
It’s possible that this is just for animated images, but my guess is that there
may be more coming in this area, if not in Android 13 then in future versions
of Android.

What Makes Me Want to Change the Channel

There are a ton of new and changed classes
in android.media.tv,
which pertains to actual TV channel playback on an Android TV device.

And, there are
changes to the new android.media.tv.interactive package,
including a new TvInteractiveAppService.
That is described as “a service that provides runtime environment and runs TV interactive applications”.
It is not completely clear what “TV interactive applications” are that are somehow
different from “applications that run on Android TV”.

What Brings to Mind a Beatles Song

Activities, fragments, and dialogs all now implement OnBackInvokedDispatcherOwner.
From these, you can get an OnBackInvokedDispatcher
and use that to register an OnBackInvokedCallback,
allowing you to get back.

What Makes Me Wonder If These Supplements Are FDA-Approved

A process can be supplemental.
It is unclear what this means.

There is also a new supplementalapi package,
containing an AdServicesVersion. Because of course an operating system
should be in the business of managing ads.

Oddly, given these changes, SUPPLEMENTAL_PROCESS_SERVICE was removed in DP2 after
having been added in DP1.

What Fulfills Some Developer Fantasies

I see a fair number of developers wanting to block or the screenshots shown in the overview
screen. FLAG_SECURE blocks them nicely, but also blocks all other types of screenshots.
Some developers have been trying to play games with replacing the activity content
at just the right time, like that’s ever going to be reliable. Now, we finally can
opt out of those screenshots.

What Helps Me Stay Awake At Night

You can now call setStateListener() on a WakeLock
and register a WakeLockStateListener,
letting you know if the WakeLock is enabled or disabled.

Mostly, this appears to be for cases where you want the wakelock to be enabled,
but the system decided to disable it.

What Else Caught My Eye

There are a bunch of new feature identifiers,
including ones that seem tied to the 12L merger (e.g., FEATURE_EXPANDED_PICTURE_IN_PICTURE).

Android 12L added activity embedding, as one way to take advantage of larger
screen sizes. 13 DP2 appears to let you control which apps can embed your
activities, via android:knownActivityEmbeddingCerts
attributes on <application> and <activity>. And, it appears that you can
allow arbitrary apps to embed your activity via android:allowUntrustedActivityEmbedding.

There is now an EthernetNetworkSpecifier,
suggesting a continued push into less-mobile devices, like perhaps TVs.

There is now a Dumpable and DumpableContainer pair of interfaces,
for dumping stuff to a PrintWriter.

showNext() and showPrevious() on RemoteViews are now deprecated
in favor of setDisplayedChild().

There is a new LocaleConfig class,
with a broken explanation.

There is a new isLowPowerStandbyEnabled()
method on PowerManager, continuing the War on Background Processing. Because
when you have 18 power modes, adding a 19th will help. On the other end of the
power spectrum, you can now find out if you are plugged into a dock,
though I now really want BATTERY_PLUGGED_WHARF and BATTERY_PLUGGED_PIER as well.

And it still seems as though changes are afoot for android:sharedUserId, as
the new EXTRA_NEW_UID
will tell you about changes to uids.