Author Archives:

How FotMob leveraged cross-device discovery to score record Wear OS adoption

Posted by Garan Jenkin, Wear OS Developer Relations Engineer


FotMob recently experienced its largest single-day increase on Wear OS among its installed audience in 5 years, at 2-3x the daily average. The secret? A simple cross-device installation flow that helps users discover their Wear OS app directly from their phone.

FotMob is one of the world’s most popular football (some call it soccer!) platforms, known for its mobile app that provides real-time scores, statistical analysis, and news.



FotMob is available on mobile and Wear OS

In addition to the mobile app, FotMob is available on Wear OS, allowing users to keep on top of the latest scores and results directly from their wrist.

“Many FotMob users follow matches live, and that often happens when they’re not actively using their phone,” says Roy Solberg, Android Tech Lead at FotMob. “Wear OS gives fans a quick way to glance at scores, match events, and updates directly from their wrist, so we saw it as a natural extension of the FotMob experience.”

By providing a smooth experience across different form factors, FotMob ensures that their users can continue to get the most from their platform, in the most convenient form. This includes ensuring that settings and preferences–such as favorite teams–are synced across devices.

The Discovery Gap

Despite many FotMob users having a Wear OS device, FotMob realized that some users might not be aware of the Wear OS app. This led the team to consider technical options for how to educate users about and ultimately install the Wear OS app directly from within the core phone app.

Fortunately, the Wearable library on Android and Wear OS provides exactly the building blocks that FotMob needed to create an in-app experience that would allow their users to do just that.

Detecting Eligible Wear OS Devices

Within the FotMob phone app, the team used the NodeClient to identify connected Wear OS devices - candidates for the Wear OS app:

val connectedNodes = nodeClient.connectedNodes.await()

Additionally, the team defined a capability within the Wear OS app, indicating that FotMob was installed on the device. This is defined as an XML resource in the Wear OS package, and then queried within the phone app:

val nodesWithApp = capabilityClient
    .getCapability(CAPABILITY_WEAR_APP, CapabilityClient.FILTER_REACHABLE)
    .await()
    .nodes
  

By looking for only nodes without the capability, the team ensured the FotMob phone app only lists Wear OS devices without the app.

Initiating the install flow

The FotMob team designed an educational half-page prompt that quickly makes the user aware of the opportunity, allowing them either to kick off the install flow, or dismiss it. This featured a prominent screenshot of the Wear OS experience, allowing the user to immediately see how the app might look on their watch.


To start the installation, the app uses the RemoteActivityHelper API, to launch the Play Store on the watch:

val remoteActivityHelper = RemoteActivityHelper(context)

remoteActivityHelper.startRemoteActivity(
    Intent(Intent.ACTION_VIEW)
        .setData("market://details?id=${context.packageName}".toUri())
        .addCategory(Intent.CATEGORY_BROWSABLE),
    nodeId
).await()
  

Results

“The Wearable APIs made the implementation straightforward,” says Roy. “Being able to detect connected devices and query capabilities meant we could quickly determine whether the watch app was already installed. From there it was mostly about designing a prompt that felt helpful to users rather than intrusive.”

The rollout of the cross-device installation feature saw the largest single-day increase in FotMob’s installed audience on Wear OS in 5 years, 2-3x higher than the normal install rate. Within 48 hours of the rollout reaching 100%, the watch app gained over 1,500 new installs¹.

“Within the first 10 days we saw a significant jump in new Wear OS installs,” says Roy. “The watch app has been around for years, but this confirmed that many users with compatible devices simply weren’t aware it existed.”

Evolving cross-device installs

In addition to the solution employed by FotMob, we’ve now launched a library to make it even easier to implement these cross-device installation journeys through the In-App Install Prompts library.

The following is an example of adding an installation prompt at the appropriate point in your app:

val crossDevicePromptManager = CrossDevicePromptManagerFactory.create(activity)
val request = CrossDevicePromptInstallationRequest.create()

try {
    val info = crossDevicePromptManager.requestInstallationPromptFlow(request).await()
    crossDevicePromptManager.launchPromptFlow(activity, info).await()
} catch (e: CrossDevicePromptException) {
    Log.e(TAG, "Cross-device prompt failed with error: ${e.errorCode}", e)
}
  

Next steps: Start building your own cross-device journey today

Dive into the DataLayer sample to learn more about how to add cross-device functionality to your app, and explore the new In-App Install Prompts library, providing you with options for how you help your users achieve cross-device installation.

[1]. Install data from Play Developer Console

This entry was posted in Uncategorized on by .

Announcing Genkit Middleware: Intercept, extend, and harden your agentic apps

Genkit is an open-source framework designed to help developers build production-ready, agentic AI applications using TypeScript, Go, Dart, and Python. The framework utilizes a powerful middleware system that intercepts generation calls to inject custom behaviors like retries, model fallbacks, and human-in-the-loop tool approvals. By attaching hooks at the generate, model, and tool layers, developers can ensure high reliability and deterministic control over model outputs. Furthermore, Genkit allows for the creation and stacking of custom middleware, all of which can be inspected and debugged through a dedicated Developer UI.
This entry was posted in Uncategorized on by .

Bring Native Visibility to Your VoIP App Experience with Telecom’s Latest Alpha

Posted by Nataraj KR, Android Developer Relations Engineer


The initial launch of the Jetpack Telecom library introduced CallsManager, replacing the legacy ConnectionService API to simplify VoIP integration. CallsManager streamlines call lifecycle management and audio routing while enabling interactions with remote surfaces like smartwatches, Bluetooth devices, and Android Auto. Additionally, it supports call extensions for richer features—such as participant handling, custom icons, call silencing and meeting summary on remote surfaces—all while maintaining backward compatibility down to Android O (API Level 26).

Building on this foundation, Jetpack Telecom v1.1.0 brings native-level visibility and convenience to third-party VoIP apps. This latest release introduces powerful new capabilities, including unified call history, call log exclusion, and native callback functionality, making call management more seamless than ever for users.

Here is a closer look at what’s new and how you can implement these features in your applications.

Bridging the Dialer Gap: Unified Call History and Callbacks

Historically, users have had to open individual third-party apps to view their VoIP call history or return a missed call. With the new integrated call logging feature, system dialer apps can now surface call logs directly from third-party VoIP apps.

Even better, users can now initiate a callback to a VoIP contact straight from their native system dialer, streamlining the communication experience.

How it works:

To opt-in to this feature, do the following:

  • Register for Callbacks: Your VoIP app must register a new system-protected intent: TelecomManager.ACTION_CALL_BACK.
  • Log the Call: Use TelecomManager.addCall (or related Jetpack APIs) to ensure the system automatically logs the call.
  • Manage Call IDs: When a call is registered, CallControlScope.getCallId provides a unique UUID. The system dialer uses this exact TelecomManager.EXTRA_UUID when creating the callback intent.
  • Initiate the Callback: Your application must store and manage the call details associated with this UUID. When the system dialer fires the callback intent with the EXTRA_UUID, your app can seamlessly resolve the ID and initiate the call with the correct details.


Fine-Grained Control: Call Log Exclusion

We recognize that not every VoIP call should be visible in the system's native dialer history. Whether for privacy reasons, ephemeral communication, or app-specific behavior, you need control over what gets surfaced.

To address this, we are introducing Call Log Exclusion. You can now prevent specific calls from being logged into the system call logs by setting the isLogExcluded boolean to true within CallAttributesCompat. By configuring this flag, the call remains completely hidden from the system logs, and the native dialer will not display it.

Important Note on Compatibility
These integrated logging and callback features are available for devices running Android 16.1 (SDK 36.1) and higher. Refer here to compile your app with Android SDK 36.1.

Get Started

We encourage developers to test these integrations and explore how unified call history and callbacks can improve the daily user experience of your VoIP applications.

To help you get started and see these APIs in action, we have put together a sample application demonstrating the new integrations.

View the sample app here: https://github.com/android/platform-samples/tree/main/samples/connectivity/telecom

Check out the release notes and documentation to start implementing these features today!

Note: Although Jetpack Telecom v1.1.0 APIs are accessible for integration, the system dialer's ability to render native call logs is being introduced in phases, beginning with Google Meet. To safeguard against spam, native dialers utilize secure package allowlists to control VoIP display. For local testing of your callback and logging implementations, we recommend using the open-source Telecom Sample Dialer app as your emulator environment.

This entry was posted in Uncategorized on by .

Expanding language support for refining messages with Gemini in Google Chat

We are expanding the capabilities of Gemini in Google Chat by adding support for several new languages when refining message drafts. In addition to English, users can now use Gemini to polish their messages in French, German, Italian, Japanese, Korean, Portuguese, and Spanish. This update allows a broader range of global users to improve the clarity and professional tone of their communications within Chat.

By leveraging Gemini to adjust wording, grammar, and spelling, users can communicate more effectively across different languages and regions. This is particularly helpful for teams working in multilingual environments or for individuals composing messages in a second language, ensuring that the intended meaning is conveyed accurately and confidently.

Getting started

Rollout pace

Availability

  • Business: Business Standard and Plus
  • Enterprise: Enterprise Standard and Plus
  • Consumer: Google AI Pro and Ultra
  • Other Editions: Frontline Plus
  • Education Add-ons: Google AI Pro for Education

Resources

This entry was posted in Uncategorized on by .

Accelerating on-device AI: A look at Arm and Google AI Edge optimization

Integration of Arm Scalable Matrix Extension 2 (SME2) and the Google AI Edge software stack enables high-performance, on-device generative AI by turning the CPU into a powerful matrix-compute accelerator. Using Stability AI’s "stable-audio-open-small" model as a case study, it outlines a streamlined "Convert, Optimize, and Deploy" pipeline that utilizes LiteRT, XNNPACK, and KleidiAI to automate hardware acceleration. The resulting implementation achieves over a 2x speedup in audio generation and a 4x reduction in memory usage while maintaining high audio quality on Arm-powered mobile devices and laptops.
This entry was posted in Uncategorized on by .

Expanded options for header images in Google Forms

Form creators now have more options for header images in Google Forms. Previously, creators could only use a pre-selected theme, upload an image, or choose an image from Google Photos. In addition to these options, they can now choose an image from Google Drive or Google Images or use a URL. This makes it easier to add an appropriate and compelling header image to your form.



User chooses a Google Drive image as the header image for a Google Form

Getting started

Rollout pace

Availability

  • Available to all Google Workspace customers, Workspace Individual subscribers, and users with personal Google accounts

Resources

This entry was posted in Uncategorized on by .

Improving security posture with default context-aware access for all SAML applications

Administrators can now apply a global context-aware access (CAA) policy to all SAML applications within their organization. This update introduces a default assignment that serves as a universal security baseline, automatically protecting any SAML-based app that does not have a specific policy already assigned. By establishing this "secure-by-default" posture, IT teams can help protect internal data and third-party SaaS tools as new applications are integrated into their ecosystem.

This global control significantly reduces the administrative burden of managing security for applications at scale. Instead of manually configuring rules for every individual SAML app, administrators can set a single policy to cover their entire environment. Specific application-level policies will still take precedence, allowing for granular control where needed while the global policy acts as a reliable safety net.

These default policies support both Monitor and Active modes, providing flexibility in how security requirements are phased in. Detailed audit logs will capture these enforcement events, and remediation messages help end users understand how to resolve access issues independently.

Admins can configure CAA policies for all SAML apps in the Admin console under Security > Context-aware Access > General settings

Admins can configure CAA policies for all SAML apps in the Admin console under Security > Context-aware Access > General settings.

Getting started

Rollout pace

Availability

  • Enterprise: Enterprise Standard and Plus
  • Education: Education Standard and Plus
  • Other Editions: Frontline Standard and Plus; Enterprise Essentials Plus; Cloud Identity Premium

Resources

This entry was posted in Uncategorized on by .