📝 Today’s highlights
- FitGuru keeps video on-device, using CameraX and MediaPipe Pose for live posture analysis.
- Several posts warn that logs, Crashlytics, and incomplete sources can hide privacy risks or block reliable summaries.
🏗 Architecture
- Existing XML Android apps can adopt Compose gradually through single-Fragment, module-by-module rollout.
- Custom geofencing, AI-agent verification, and adaptive UI all emphasize event pairing, offline resilience, and multi-device growth.
✅ Testing & quality
- CinematiQ’s sideways landscape playback exposed missing release coverage for real-world cases.
- WorkManager, background limits, and log hygiene show production apps must handle Doze, OEM kills, and privacy risks.
🚀 Language evolution
- Kotlin keeps evolving around class features, when-pattern matching, and the limits of companion object usage.
- Companion blocks, MVI, and Multiplatform examples show the focus is on compatibility and clearer state modeling.
01
FitGuru: A Phone That Coaches Your Squat - and Never Uploads the Video
Dev.to Kotlin作者:Atharva Chaudhari發布:10-11 08:03
FitGuru: A Phone That Coached Your Squat Without Uploading Video
The coach is split into two brains: a cheap Reflex Engine that runs on every frame, and a Cognitive Engine that only wakes up after the set and only sees numbers.
重點摘要
On-device pose tracking and rep counting keep video and landmarks on the phone.
A Reflex Engine handles real-time cues, while Gemini generates the post-set debrief from numbers only.
Gym Shield, voice commands, local Room history, and optional watch heart rate support hands-free coaching.
展開詳細摘要
FitGuru is an Android-first workout coach built for a strict privacy rule: camera video never leaves the device. The app uses CameraX and MediaPipe Pose to track 33 landmarks, then a joint-angle Reflex Engine counts reps and gives live form cues for 18 exercises. After the set, a Cognitive Engine sends only structured numbers to Gemini 2.5 Flash for a biomechanics debrief and recovery protocol. The system also includes Gym Shield to ignore passersby, hands-free voice commands, Room-based local history, optional Wear OS heart rate input, and voice output through ElevenLabs or Android TTS fallback.
How to Log a Banking App Without Leaking PII Into Crash Reports
Medium Kotlin作者:Alim Reshitov發布:10-11 08:56
How to Log a Banking App Without Leaking PII Into Crash Reports
A quiet production bug can expose a card number in plain text through Crashlytics.
重點摘要
Crash logs can unintentionally expose sensitive banking data.
A harmless-looking log line may become a security issue.
PII leakage in crash reports is a production risk to avoid.
展開詳細摘要
The article highlights a quiet production bug in which a card number appears in plain text inside Crashlytics because of a log line that was not treated as a security concern. It frames the problem as a logging and privacy risk for banking apps, where sensitive PII can end up in crash reports if developers do not handle log output carefully. The piece centers on the danger of treating logs as harmless operational data when they may actually expose customer information.
How to Add Jetpack Compose Screens to an Existing Android App Without Rewriting Everything
Medium Kotlin作者:REVANTH KUMAR JILAKARA發布:10-11 11:13
How to Add Jetpack Compose Screens to an Existing Android App Without Rewriting Everything
You don’t have to rewrite your XML app to ship Compose.
重點摘要
Add Compose one feature at a time.
Keep each feature in its own module.
Use a single Fragment as the entry point.
展開詳細摘要
The article explains that an existing XML-based Android app does not need a full rewrite to adopt Jetpack Compose. Instead, teams can introduce Compose gradually by adding one feature at a time, packaging it as its own module, and placing it behind a single Fragment. This approach lets developers ship Compose incrementally while preserving the existing app structure and avoiding a big-bang migration.
Daily Kotlin: Classes, Constructors, and Properties
Medium Kotlin作者:Jason Kwon發布:10-11 11:49
Daily Kotlin: Classes, Constructors, and Properties
Mastering primary constructors, init blocks, custom getters, and backing fields across Kotlin Multiplatform
重點摘要
Covers primary constructors in Kotlin classes.
Explains init blocks, custom getters, and backing fields.
Focuses on Kotlin Multiplatform usage.
展開詳細摘要
This article introduces core Kotlin class features, centered on primary constructors, init blocks, custom getters, and backing fields. It frames these topics for Kotlin Multiplatform readers, suggesting a practical guide to how classes and properties are structured and initialized across platforms. The piece appears to be part of a daily Kotlin series and focuses on mastering these language features rather than on broader platform-specific behavior.
Daily Kotlin:类、构造函数与属性
掌握 Kotlin Multiplatform 中的主构造函数、init 块、自定义 getter 与 backing field
The provided content contains only a redirect prompt.
No article body is included in the source text.
There are no substantive technical claims to summarize.
展開詳細摘要
The source text does not include the article itself; it only shows a redirect message inviting readers to continue on MobileByteSensei. Because no substantive body content is provided, there are no technical points, examples, or conclusions available to summarize faithfully.
No factual summary can be drawn from the supplied text
展開詳細摘要
The provided input contains only the article title, author, link, and a short continuation prompt, but no substantive article content. As a result, there is no basis to summarize the export engine’s behavior, implementation, limitations, or outcome beyond the title itself. The safest faithful description is that the source text is incomplete and does not include the article’s actual discussion.
A retry queue with nothing to run it is a graveyard
Medium Kotlin作者:Rajan Maurya發布:10-11 12:28
A retry queue with nothing to run it is a graveyard
Continue reading on MobileByteSensei »
重點摘要
The provided content contains only a link prompt, not the article body.
No technical claims or implementation details are available in the supplied text.
The title suggests a retry queue needs an executor to be useful, but the article text is not present.
展開詳細摘要
The supplied content does not include the article body, only a prompt to continue reading on MobileByteSensei. As a result, there are no verifiable technical details, arguments, or implementation notes to summarize from the provided text. The title indicates a theme about a retry queue being useless without something to execute it, but that inference comes only from the title, not from the missing article content.
没有执行器的重试队列如同墓地
Continue reading on MobileByteSensei »
重點摘要
提供的内容只有跳转提示,没有文章正文。
正文里没有可验证的技术主张或实现细节。
仅从标题可推测,重试队列若没有执行机制就难以发挥作用。
展開詳細摘要
这次提供的内容只有“Continue reading on MobileByteSensei”的跳转提示,没有文章正文,因此无法从原文提取可验证的技术细节、论点或实现说明。标题显示主题可能在讨论:如果没有执行它的机制,重试队列就形同虚设;但这只能视为标题传达的含义,不能当作正文中的具体事实。
沒有執行者的重試佇列猶如墳場
Continue reading on MobileByteSensei »
重點摘要
提供的內容只有跳轉提示,沒有文章正文。
內文未包含可驗證的技術主張或實作細節。
僅從標題可推測重試佇列若沒有執行機制就難以發揮作用。
展開詳細摘要
這次提供的內容只有「Continue reading on MobileByteSensei」的跳轉提示,沒有文章正文,因此無法從原文萃取可驗證的技術細節、論點或實作說明。標題顯示主題可能在談重試佇列若沒有執行它的機制就形同虛設,但這僅能視為標題所傳達的意涵,不能當成文章內文的具體內容。
CinematiQ’s landscape videos came out sideways. The shader trusted the MP4 rotation hint alone
Medium Kotlin作者:Muhammad Azhar發布:10-11 12:43
CinematiQ’s landscape videos came out sideways because the shader trusted the MP4 rotation hint alone
The hint is only right in portrait, and the release pass on the phone had never tried landscape.
重點摘要
The shader relied only on the MP4 rotation hint.
That hint was correct only in portrait mode.
The phone release path had never been tested with landscape video.
展開詳細摘要
CinematiQ’s landscape videos were displayed sideways because its shader depended solely on the MP4 rotation hint. The article explains that this hint was only correct for portrait video, while the phone’s release path had never been exercised with landscape content. As a result, the orientation issue appeared only when landscape playback entered the real release flow.
WorkManager in Production: Scheduling Work That Survives Doze, Reboots and OEM Killers
Medium Kotlin作者:Ramadan Sayed發布:10-11 13:01
WorkManager in Production: Scheduling Work That Survives Doze, Reboots, and OEM Killers
Android has spent a decade taking away your ability to run code in the background, one release at a time.
重點摘要
Background execution on Android has become increasingly restricted over time.
The article frames WorkManager as a production option for resilient scheduling.
The source text is only a teaser and does not provide further details.
展開詳細摘要
The article’s teaser says Android has steadily reduced the ability to run background code across releases, leaving developers with a much narrower set of options. Its title points to WorkManager as a production-oriented way to schedule work that can survive Doze, device reboots, and aggressive OEM process killing. However, the provided excerpt contains only the intro teaser and does not include the article’s full technical discussion or implementation details.
Android now runs on tablets, foldables, desktop windowing, and ChromeOS.
Apps need to adapt to different form factors and screen sizes.
The article opens by framing Android as a multi-device platform.
展開詳細摘要
Android is no longer just a phone platform; the same app may now run on tablets, foldables, desktop windowing environments, and ChromeOS. This piece introduces the need for adaptive UI in a world where screen sizes and form factors vary widely. It frames Android development as increasingly multi-device, and sets up the broader discussion around building interfaces that can respond to large screens and folding devices.
Static, Finally: Moving Android Code from Companion Objects to Companion Blocks
Medium Kotlin作者:Android Expert發布:10-11 14:38
Static, Finally: Moving Android Code from Companion Objects to Companion Blocks
Companion blocks compile to static members, but migrating can break Java callers, R8 rules, reflection, and library releases.
重點摘要
Companion blocks compile to static members.
Migration can break Java callers and reflection-based code.
R8 rules and library releases may be affected.
展開詳細摘要
The article explains that Kotlin companion blocks compile to static members, but moving Android code from companion objects to companion blocks is not always a drop-in change. Such a migration can affect Java callers, reflection, R8 rules, and library releases. The key takeaway is that even if the generated bytecode looks convenient, teams need to consider compatibility and tooling impacts before making the switch.
Building a Custom Geofencing Engine Without Google Play Services
Dev.to Kotlin作者:Haseeb發布:10-11 01:42
Building a Custom Geofencing Engine Without Google Play Services
I wanted an offline, privacy-first, and battery-conscious solution that didn't ship the user's location data to external servers or rely on a massive, opaque library.
重點摘要
Uses LocationManager with a hybrid polling and proximity strategy
Calculates distance with the Haversine equation inside a ForegroundService
Adds debouncing, AlarmManager, and Doze-aware checks to reduce false triggers
展開詳細摘要
This article describes how the author built Muffle’s custom geofencing engine without relying on Google Play Services. To keep the solution offline, privacy-first, and battery-conscious, it combines passive location updates, coarse proximity checks, and the Haversine formula to decide when sound settings should change. The implementation runs in a ForegroundService, uses a BroadcastReceiver for significant movement, and adds debouncing to avoid false exits caused by volatile network-based location changes. It also accounts for Android power limits by using AlarmManager with setExactAndAllowWhileIdle, while acknowledging edge cases such as signal loss in tunnels or basements. The main lesson is to treat location as noisy and failure-prone, and to design automation that works invisibly without burdening the user.
The Accounting Pattern That Makes AI Agent Failures Impossible to Hide
Dev.to Kotlin作者:StareBrain發布:10-11 03:16
The Accounting Pattern That Makes AI Agent Failures Impossible to Hide
Double-entry bookkeeping solves one of the hardest problems in AI agent design: actions that complete but leave the system inconsistent.
重點摘要
Double-entry bookkeeping exposes imbalance without a separate auditor.
Pair critical agent actions with opposing state events.
Missing confirmations make failures visible in the event log.
展開詳細摘要
The article argues that double-entry bookkeeping offers a useful model for AI agent verification. In a multi-step agent workflow, each step may succeed individually while the overall system ends up inconsistent, such as when a payment succeeds but the order is never created. To prevent silent failures, each critical action should produce two opposing events, such as Reserved and Committed, so the state machine can automatically detect mismatches. This makes rollback, replay, and audit easier because the event log preserves the full transition history. The same idea is applied to StareBrain’s on-device Android agent, where an ActionConfirmed event must match an ActionDispatched event or the action remains unresolved. The core idea is that imbalance itself becomes the proof of failure.
让 AI Agent 失败无法隐藏的会计模式
复式记账解决了 AI agent 设计中最棘手的问题之一:动作已完成,但系统却留下不一致状态。
重點摘要
复式记账可在无需独立审计的情况下自动发现失衡。
关键 agent 动作应产生成对的相反状态事件。
缺少确认事件时,事件日志就能暴露失败。
展開詳細摘要
文章认为,复式记账可以作为 AI agent 验证的设计模型。对于多步骤的 agent 动作,单个步骤可能都成功,但整体系统仍可能因“付款成功、订单未创建”之类的情况而变得不一致。为避免这种静默失败,关键动作应产生两条相互对应的事件,例如 Reserved 和 Committed,让状态机自动检查是否配对。这样就不需要额外审计器,也能借由不可变事件日志支持回放、审计与回滚。文章还以 StareBrain 的 Android 端 AI agent 为例:ActionConfirmed 必须对应 ActionDispatched,否则动作会保持在未解析状态。核心观点是,失衡本身就是失败的证据。
讓 AI Agent 失敗無所遁形的會計模式
複式記帳可解決 AI agent 設計中最棘手的問題之一:動作已完成,系統卻留下不一致狀態。
重點摘要
複式記帳能在不靠人工稽核下自動發現不平衡。
關鍵 agent 動作應搭配成對的相反狀態事件。
缺少確認事件時,事件紀錄即可揭露失敗。
展開詳細摘要
本文主張,複式記帳可作為 AI agent 驗證的設計模式。當 agent 執行多步驟動作時,單一步驟可能都成功,整體系統卻因付款完成但訂單未建立而出現不一致。為避免這類沉默失敗,關鍵動作應產生兩個相互對應的事件,例如 Reserved 與 Committed,讓狀態機自動檢查是否配對。如此一來,不需要額外稽核器,也能透過事件日誌支援回復、重播與稽核。文章也以 StareBrain 的 Android 裝置端 AI agent 為例:ActionConfirmed 必須對應 ActionDispatched,否則動作會維持在未解析狀態。重點是,失衡本身就是失敗證明。
Daily Kotlin: when Expression and Pattern Matching
Medium Kotlin作者:Jason Kwon發布:10-10 23:06
Daily Kotlin: when Expression and Pattern Matching
Master exhaustive conditional logic and smart casting for bulletproof MVI state architectures in Kotlin Multiplatform.
重點摘要
Covers exhaustive conditional logic with when expressions.
Discusses smart casting in Kotlin state handling.
Focuses on MVI state architecture in Kotlin Multiplatform.
展開詳細摘要
This piece points readers toward mastering Kotlin’s when expression and pattern matching techniques, with an emphasis on exhaustive conditional logic and smart casting. The goal is to support more robust MVI state architectures in Kotlin Multiplatform. The provided excerpt is brief and frames the topic as a practical guide for engineers working with state-driven application design, without introducing additional implementation details or claims.
The Evolution of Statics: Say Goodbye to Kotlin Companion Objects?
Medium Kotlin作者:Nav Singh發布:10-11 02:28
The Evolution of Statics: Say Goodbye to Kotlin Companion Objects?
For years, we used companion object to group class-level members, such as constants and factory methods.
重點摘要
Discusses the role of companion object in Kotlin.
Focuses on class-level members like constants and factory methods.
Raises the question of whether companion objects may be replaced.
展開詳細摘要
The article reflects on how Kotlin developers have long used companion object to organize class-level members such as constants and factory methods. Framed as a discussion of the evolution of statics, it questions whether companion objects are still the best default pattern or whether newer approaches may reduce the need for them. Based on the excerpt, the piece is about rethinking a familiar Kotlin construct rather than announcing a confirmed replacement.
REST APIs vs. GraphQL: The Smarter Way to Fetch Data
Medium Kotlin作者:Abdul Qadir發布:10-11 04:59
REST APIs vs. GraphQL: A Smarter Way to Fetch Data
Discover how REST and GraphQL shape the way applications communicate.
重點摘要
Compares REST APIs with GraphQL
Focuses on how applications fetch data
Frames the topic around application communication
展開詳細摘要
This article introduces a comparison between REST APIs and GraphQL, framing them as two different approaches to how applications communicate and fetch data. The piece positions the discussion around choosing a smarter way to retrieve information, but the provided excerpt does not include technical details, implementation guidance, or a conclusion. It mainly sets up the topic and invites readers to continue on Medium.
REST API 与 GraphQL:更聪明的数据获取方式
了解 REST 和 GraphQL 如何塑造应用程序之间的通信方式。
重點摘要
对比 REST API 与 GraphQL
聚焦应用程序如何获取数据
以应用程序通信方式为主题核心
展開詳細摘要
本文以 REST API 和 GraphQL 的对比为主线,说明两者如何影响应用程序之间的通信和数据获取方式。标题强调“更聪明”的数据获取方法,但当前提供的内容只有开头引言,并未包含技术细节、实现建议或结论。整体来看,这篇文章主要用于引出主题,并邀请读者前往 Medium 继续阅读。
REST API 與 GraphQL:更聰明的資料擷取方式
了解 REST 與 GraphQL 如何形塑應用程式之間的溝通方式。
重點摘要
比較 REST API 與 GraphQL
聚焦應用程式如何擷取資料
以應用程式溝通方式為主題核心
展開詳細摘要
本文以 REST API 與 GraphQL 的對比為主軸,說明兩者如何影響應用程式之間的溝通與資料擷取方式。標題強調「更聰明的」資料取得方法,但目前提供的內容只有開頭引言,未包含技術細節、實作建議或結論。整體而言,這是一篇用來引出主題並邀請讀者前往 Medium 繼續閱讀的文章。