GEMINI LABJP
SUNSET — gemini-robotics-er-1.6-preview shuts down on August 31. Thirteen days out, which makes this the week to actually start the migrationMIGRATION — The replacements are gemini-robotics-er-2-preview and gemini-robotics-er-2-streaming-preview, both in public preview since July 30 and both accepting text, image, video, and audio inputPRICING — Gemini 3.7 Flash went GA on August 13 at an introductory price that runs through December 31, 2026, so anything spanning the new year needs a two-stage cost estimateDEPRECATION — The temperature, top_p, and top_k sampling parameters are now deprecated. If your code sets them explicitly, measure the output difference without them while there is still timeVIDEO — Gemini Omni Flash, a model for generating and editing video, is available in Google AI Studio and through the Gemini APILOGS — The Interactions API now supports developer logs, viewable for supported calls from the AI Studio dashboardSUNSET — gemini-robotics-er-1.6-preview shuts down on August 31. Thirteen days out, which makes this the week to actually start the migrationMIGRATION — The replacements are gemini-robotics-er-2-preview and gemini-robotics-er-2-streaming-preview, both in public preview since July 30 and both accepting text, image, video, and audio inputPRICING — Gemini 3.7 Flash went GA on August 13 at an introductory price that runs through December 31, 2026, so anything spanning the new year needs a two-stage cost estimateDEPRECATION — The temperature, top_p, and top_k sampling parameters are now deprecated. If your code sets them explicitly, measure the output difference without them while there is still timeVIDEO — Gemini Omni Flash, a model for generating and editing video, is available in Google AI Studio and through the Gemini APILOGS — The Interactions API now supports developer logs, viewable for supported calls from the AI Studio dashboard
Articles/Updates
Updates/2026-08-18Advanced

The Assistant Switch Is One-Way, So the Baseline Has to Be Captured Now

From September 4, Google Assistant is replaced by Gemini, and a device that has switched cannot go back. Here is how I started recording voice-originated launches inside my own apps, and the assumption about splitting before and after by date that turned out to be wrong.

Gemini78Google AssistantAndroid11operations14indie development14

Premium Article

On the morning I turn a staged rollout from 5% to 25%, I look at the same two numbers every time. Has crash-free users dropped below 99.7%, and has ANR crossed 0.20%. If both are flat, I go to the next step.

Staring at those two in the Google Play Console last week, I got a little uneasy. From September 4, Google Assistant is being replaced by Gemini on Android and Wear OS. The rollout is progressive, expected to take several weeks, and once a device has switched, it cannot be moved back.

If the path by which people open my app by voice changes across that line, the change will not appear in crash-free users or in ANR. Nothing crashes. No exception is thrown. The traffic simply stops arriving.

Traffic that stops arriving is invisible unless you were already counting it. I run six apps as an indie developer, and I had never once measured what share of launches came from voice.

A one-way switch leaves you no control group afterwards

For most platform changes, "fix it after it breaks" is good enough. You can observe the break, and you can go back. Neither holds here.

The switch is irreversible per device. There is no control to restore the previous assistant. Reporting suggests routines and third-party integrations either carry over into Gemini's framework or are lost during migration, but I have no way to check, device by device, which way any given one will fall.

What I do have is the ability to move a device over early, from the Google app or from device settings. Which means the window for observing the "before" state has a fixed end date and no extension.

SurfaceFrom September 4
Android phones and tabletsProgressively replaced by Gemini
Wear OS smartwatchesProgressively replaced by Gemini
Assistant-enabled headphonesProgressively replaced by Gemini
Phone-projected Android AutoProgressively replaced by Gemini
Cars with Google built-inContinues

I wrote about designing across a cutoff date, for the settings frozen inside binaries already shipped, in rollback design across a retirement date. This piece is about the layer below that — the one where neither your server nor your client is the thing that changed.

How to recognise a voice-originated launch from inside the app

One caveat first. I do not have a reliable way to determine that a launch came from voice. What I have are the hints that arrive at launch time.

What is available when the Activity starts

Roughly three things are readable at the moment your Activity comes up.

  1. The Intent action and data — a deep link via ACTION_VIEW, something search-shaped, or an ordinary launcher start
  2. Whatever Activity.getReferrer() returns for the calling package or scheme
  3. Strings riding in the Intent extras, such as a search query or deep link parameters

Which of these are populated depends entirely on the caller. That is exactly why hard-coding a check against one of them today leaves you with nothing if the caller's implementation changes after the switch.

Record first, classify later

What I settled on is a thin capture that puts the raw values into a single event. Classification can happen later, against data I already hold.

// MainActivity.kt — record where the launch came from, verbatim
// Policy: do not decide "was this voice?" here. That decision belongs downstream.
class MainActivity : ComponentActivity() {
 
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        recordLaunchOrigin(intent)
        // normal initialisation follows
    }
 
    private fun recordLaunchOrigin(launchIntent: Intent) {
        // referrer is API 22+, usually android-app://<package>
        val referrerHost = referrer?.host ?: "none"
        val action = launchIntent.action ?: "none"
 
        // Sometimes present on search-shaped launches. More often absent.
        val rawQuery = launchIntent.getStringExtra(SearchManager.QUERY)
 
        // Keep deep link parameter names, not their values
        val extraKeys = launchIntent.extras?.keySet()
            ?.filterNot { it.startsWith("android.") }   // drop platform-internal keys
            ?.sorted()
            ?.joinToString(",")
            ?: ""
 
        Firebase.analytics.logEvent("launch_origin") {
            param("action", action.takeLast(40))
            param("referrer_host", referrerHost.takeLast(40))
            param("has_query", if (rawQuery.isNullOrBlank()) 0L else 1L)
            param("extra_keys", extraKeys.takeLast(90))   // stay under the 100-char limit
            param("app_version", BuildConfig.VERSION_NAME)
        }
 
        // The utterance itself stays out of Analytics and goes to my own sink,
        // and only from devices that have granted consent.
        if (rawQuery != null && consentManager.analyticsGranted) {
            utteranceCollector.enqueue(rawQuery.trim())
        }
    }
}

Two things bit me here. Firebase Analytics caps the length of event parameter values, so a naive join of extras keys gets silently truncated. And putting the raw utterance into Analytics leaves room for personal data to end up somewhere I did not intend. I split the utterance body out of Analytics entirely and routed it separately, consent-gated.

What I refuse to assume

I am not assuming that a voice launch means a particular package name lands in referrer_host. The calling package may change after the switch, and on some paths the field is never populated at all. Instead of a verdict, I keep the distribution of action and referrer_host pairs. A distribution survives a wrong assumption, because you can re-read it later.

Thank you for reading this far.

Continue Reading

What follows includes implementation code, benchmarks, and practical content we hope you'll find useful. This site runs without ads — server and development costs are supported entirely by members like you. If it's been helpful, we'd be truly grateful for your support.

WHAT YOU'LL LEARN
You will be able to tell voice-originated launches apart inside your own app, so the change after the switch becomes a measured delta instead of a hunch
You will be able to add, before September 4, the one class of regression that never surfaces in your crash-free rate or your ANR numbers
You will be able to cluster the captured utterances with Gemini and separate a shift in phrasing from an actual drop in usage
Secure payment via Stripe · Cancel anytime

Unlock This Article

Get full access to the rest of this article. Buy once, read anytime. This site is ad-free — your support goes directly toward keeping it running.

or
Unlock all articles with Membership →
Share

Thank You for Reading

Gemini Lab is ad-free, supported entirely by members like you. We publish practical guides daily with implementation code, benchmarks, and production-ready patterns. If you've found it useful, we'd love to have you on board.

  • Copy-paste ready implementation code
  • New advanced guides published daily
  • $5/mo or $10 for lifetime access
View Membership →

Related Articles

Updates2026-07-17
The Model Didn't Ship on Its Rumored Date — Read Your Context Limit From the API, Not the Headlines
July 17 came and went with no official word on Gemini 3.5 Pro. Instead of baking rumored numbers into constants, here's a context budget layer that reads the real limit from models.get and degrades quietly when input overflows.
Updates2026-07-04
Before the August 17 Gemini Image Model Shutdown: Inventory Where You Actually Call Them First
Some Gemini image generation models retire on August 17. Before choosing a replacement, here is how to inventory which models are actually being called, and from where, using your request logs.
Updates2026-06-13
Before Gemini in Chrome Reaches Android: Getting Your Blog Ready
Gemini in Chrome starts rolling out to Android in late June with auto browse. Here are the practical, hands-on adjustments worth making to a personal blog before mobile agent browsing arrives.
📚RECOMMENDED BOOKS
Build a Large Language Model (From Scratch)
Sebastian Raschka
LLM Dev
Prompt Engineering for LLMs
Berryman & Ziegler
Prompting
AI Engineering
Chip Huyen
AI Eng
* Contains affiliate links
See all →