# aircall

Published articles for aircall.

This is one page of public article previews, not the complete archive. Follow Next page to continue. Summaries are not the original full articles.

## Monitoring Android Vitals with the Play Developer Reporting API

DevFeed: [Monitoring Android Vitals with the Play Developer Reporting API](<https://devfeed.tech/articles/monitoring-android-vitals-with-the-play-developer-reporting-api-25945.md>)

Original publisher: [Read original article](<https://medium.com/google-developer-experts/monitoring-android-vitals-with-the-play-developer-reporting-api-85edabb772a9?source=rss-cbfc736ddcd3------2>)

Author: Julien Salvi

Published: 2026-03-19T12:41:51Z

Content type: tutorial

Language: en

Sources: [Stories by Julien Salvi on Medium](<https://devfeed.tech/sources/stories-by-julien-salvi-on-medium.md>)

Topics: [Android](<https://devfeed.tech/topics/android.md>), [API](<https://devfeed.tech/topics/api.md>), [Google Play](<https://devfeed.tech/topics/google-play.md>), [Gradle](<https://devfeed.tech/topics/gradle.md>), [CI/CD Pipeline](<https://devfeed.tech/topics/ci-cd-pipeline.md>), [Google Cloud Platform (GCP)](<https://devfeed.tech/topics/google-cloud.md>), [Slack](<https://devfeed.tech/topics/slack.md>)

Tags: [aircall](<https://devfeed.tech/tags/aircall.md>), [android](<https://devfeed.tech/tags/android.md>), [android-app-development](<https://devfeed.tech/tags/android-app-development.md>), [anr](<https://devfeed.tech/tags/anr.md>), [api](<https://devfeed.tech/tags/api.md>), [ci-cd-pipeline](<https://devfeed.tech/tags/ci-cd-pipeline.md>), [crash](<https://devfeed.tech/tags/crash.md>), [google-play-developer](<https://devfeed.tech/tags/google-play-developer.md>), [gradle](<https://devfeed.tech/tags/gradle.md>), [reporting](<https://devfeed.tech/tags/reporting.md>), [slack](<https://devfeed.tech/tags/slack.md>)

### AI overview

This tutorial explains how Aircall uses the Google Play Developer Reporting API in a Gradle task to retrieve Android Vitals, including ANR and crash metrics, and deliver daily health reporting to Slack. It covers metric-set queries, timeline aggregations, service-account authentication, data modeling, and health thresholds.

### Source excerpt

At Aircall, we built an automated reporting tool that fetches our Android Vitals metrics thanks to the Play Developer Reporting API and delivers a daily health dashboard straight to Slack. All of this powered by a simple Gradle task. Discovering the API The Google Play Developer Reporting API gives programmatic access to the same quality metrics you see in the Google Play Console. It covers the core Android Vitals: ANR rate, crash rate, slow start rate, and stuck background wakelocks, the signals Google uses to determine whether your app meets the bad behavior thresholds. The API is organized around metric sets that you query with a timeline specification. Each metric set returns daily, 7-day, and 28-day user-weighted aggregates, giving you the full picture from short-term regressions to long-term trends. The key advantage over scraping the Console UI is that you can automate the entire flow and integrate it into your existing CI/CD pipeline. You will find the complete API reference in the official documentation. Build with Play VitalsSetting up the dependency We chose to implement this as a Gradle task inside our build-logic module. This keeps the reporting logic close to the project without polluting the app code. First, let's add the dependency: # libs.versions.toml googleApiReporting = "v1beta1-rev20230803-2.0.0" buildLogic-plugin-google-play-developer-reporting = { module = "com.google.apis:google-api-services-playdeveloperreporting", version.ref = "googleApiReporting" } Which can then be added to the build.gradle.kts of your build-logic module: dependencies { // API to get Google Play store vitals metrics implementation(libs.buildLogic.plugin.google.play.developer.reporting) }Authenticating with a Service Account To access the API, you need a Google Cloud Service Account with the Play Developer Reporting scope. We pass the credentials as an environment variable to keep secrets out of the repository. The Reporting client initializes the API with these credentia

## Hands on Jetpack Compose VisualTransformation to create a phone number formatter

DevFeed: [Hands on Jetpack Compose VisualTransformation to create a phone number formatter](<https://devfeed.tech/articles/hands-on-jetpack-compose-visualtransformation-to-create-a-phone-number-formatter-25943.md>)

Original publisher: [Read original article](<https://medium.com/google-developer-experts/hands-on-jetpack-compose-visualtransformation-to-create-a-phone-number-formatter-99b0347fc4f6?source=rss-cbfc736ddcd3------2>)

Author: Julien Salvi

Published: 2021-12-21T15:05:42Z

Content type: tutorial

Language: en

Sources: [Stories by Julien Salvi on Medium](<https://devfeed.tech/sources/stories-by-julien-salvi-on-medium.md>)

Topics: [Jetpack Compose](<https://devfeed.tech/topics/jetpack-compose.md>), [Compose](<https://devfeed.tech/topics/compose.md>), [Design system](<https://devfeed.tech/topics/design-system.md>), [ui](<https://devfeed.tech/topics/ui.md>), [Google](<https://devfeed.tech/topics/google.md>)

Tags: [aircall](<https://devfeed.tech/tags/aircall.md>), [android](<https://devfeed.tech/tags/android.md>), [android-app-development](<https://devfeed.tech/tags/android-app-development.md>), [androiddev](<https://devfeed.tech/tags/androiddev.md>), [component](<https://devfeed.tech/tags/component.md>), [compose](<https://devfeed.tech/tags/compose.md>), [constructor](<https://devfeed.tech/tags/constructor.md>), [design-system](<https://devfeed.tech/tags/design-system.md>), [filter](<https://devfeed.tech/tags/filter.md>), [function](<https://devfeed.tech/tags/function.md>), [google](<https://devfeed.tech/tags/google.md>), [jetpack-compose](<https://devfeed.tech/tags/jetpack-compose.md>), [mapping](<https://devfeed.tech/tags/mapping.md>), [parameter](<https://devfeed.tech/tags/parameter.md>), [transformation](<https://devfeed.tech/tags/transformation.md>), [ui](<https://devfeed.tech/tags/ui.md>)

### AI overview

This tutorial explains how to use Jetpack Compose's VisualTransformation to format phone-number input for international display. It covers the filter() function, TransformedText, and OffsetMapping for mapping positions between original and transformed text.

### Source excerpt

At Aircall, we are currently rewriting our design system with Jetpack Compose, the new UI framework made by Google. One of our UI component is a text input that formats a phone number to its international format according to its origin country. With the View UI toolkit, we can use a PhoneNumberFormattingTextWatcher, which is available since API 1, to format the input text. But no equivalent has been implemented with Jetpack Compose so far. In this article we are going to cover how we managed to create a reliable alternative for Compose with VisualTransformation. VisualTransformation explained First, let's have a look at the VisualTransformation interface to understand how it works under the hood and how you can use it to format the input text of a TextField as you wish. https://medium.com/media/bb42609ef6212c4b0f63f06f83c0534c/href In order to filter the text, you will need to implement the filter() function which takes the original text to transform as a parameter and returns a TransformedText where all the magic happens! If we take a look at the constructor it takes a text (which will be transformed) and an OffsetMapping which provides a bidirectional mapping between the original text and the new one. Which means that we'll need to implement the transformation from and to the original. Let's have a look at the password transformation that the framework provides to see the OffsetMapping in action: https://medium.com/media/5e50cd5af8fd0d3acd9300d03665735b/href Here, the implementation is pretty straightforward as we just need to transform the input text where every character will be replaced by a mask, so the text will have the same length. The transformed text will contain the mapped text and the offsetMapping will handle the transformation. Here, as we don't have any extra character to be displayed in the returned text, the two functions will return the original offset. The two transformations can become a bit more complex if we need to display additional characte