<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Aristide Bienvenu EMCTHEU</title>
    <description>The latest articles on DEV Community by Aristide Bienvenu EMCTHEU (@arispacco).</description>
    <link>https://dev.to/arispacco</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F4212545%2F0344dbf7-dcee-44e8-914d-97a3a74af3da.png</url>
      <title>DEV Community: Aristide Bienvenu EMCTHEU</title>
      <link>https://dev.to/arispacco</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/arispacco"/>
    <language>en</language>
    <item>
      <title>Building Pixel Control Center: High-Performance Android Mirroring on Desktop with Flutter &amp; Scrcpy</title>
      <dc:creator>Aristide Bienvenu EMCTHEU</dc:creator>
      <pubDate>Wed, 04 Nov 2026 18:43:30 +0000</pubDate>
      <link>https://dev.to/arispacco/building-pixel-control-center-high-performance-android-mirroring-on-desktop-with-flutter-scrcpy-355i</link>
      <guid>https://dev.to/arispacco/building-pixel-control-center-high-performance-android-mirroring-on-desktop-with-flutter-scrcpy-355i</guid>
      <description>&lt;p&gt;If you have ever mirrored an Android handset to your PC or Linux workstation using &lt;a href="https://github.com/Genymobile/scrcpy" rel="noopener noreferrer"&gt;scrcpy&lt;/a&gt;, you know it is the gold standard for low-latency screen casting and remote control.&lt;/p&gt;

&lt;p&gt;Yet, running scrcpy on a modern flagship device like the &lt;strong&gt;Google Pixel 7 Pro (Tensor G2 SoC, Android 17)&lt;/strong&gt; inside a real-world multi-network desktop setup quickly reveals four frustrating failure modes:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;The "Black Screen with Working Controls" Bug:&lt;/strong&gt; Invoking &lt;code&gt;--turn-screen-off&lt;/code&gt; calls &lt;code&gt;SurfaceControl.setDisplayPowerMode(POWER_MODE_OFF)&lt;/code&gt;. On Google Tensor hardware, the video encoder buffer blanks out completely—your mouse clicks still work on the phone, but the desktop window renders pure pitch black.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The Ghost Virtual Display Bug:&lt;/strong&gt; Previous sessions or headless services spawn lingering &lt;code&gt;app_process&lt;/code&gt; instances (&lt;code&gt;Display 73&lt;/code&gt;, &lt;code&gt;Display 105&lt;/code&gt;). Without explicit display binding, scrcpy attaches to an invisible virtual display instead of your active phone screen.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The Dynamic IP / AP Hopping Nightmare:&lt;/strong&gt; Moving between your home Wi-Fi, office router, or phone hotspot changes your handset's DHCP IP address. Static wireless ADB scripts fail every single time.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The Disappearing Soft Keyboard:&lt;/strong&gt; Forwarding hardware keyboard inputs via &lt;code&gt;--keyboard=uhid&lt;/code&gt; signals Android to hide the on-screen virtual IME, making it impossible to type emojis, passwords in secure fields, or use the dialer.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;To solve all four issues with zero configuration, we built and open-sourced &lt;strong&gt;Pixel Control Center&lt;/strong&gt;—migrating from an initial Python prototype to a high-performance &lt;strong&gt;Flutter Desktop (Windows &amp;amp; Linux)&lt;/strong&gt; application.&lt;/p&gt;

&lt;p&gt;Here is what we learned, the hardware workarounds that worked, and how we structured the architecture.&lt;/p&gt;




&lt;h2&gt;
  
  
  1. Taming the Hardware Quirks: Google Tensor &amp;amp; Android 17
&lt;/h2&gt;

&lt;p&gt;Echoing insights from the community on managing ADB wrappers—such as &lt;a href="https://dev.to/adb_devicemanager_20c75c/thoughts-on-building-a-gui-workflow-around-scrcpy-adb-device-manager-experiment-2nog"&gt;Thoughts on Building a GUI Workflow Around scrcpy&lt;/a&gt; and &lt;a href="https://dev.to/galagent/giving-an-ai-agent-a-real-phone-what-adb-automation-actually-looks-like-1cl1"&gt;Giving an AI Agent a Real Phone: What ADB Automation Actually Looks Like&lt;/a&gt;—handling ADB in production requires accounting for device-specific hardware behavior:&lt;/p&gt;

&lt;h3&gt;
  
  
  A. The OLED Dimming Workaround (Instead of &lt;code&gt;POWER_MODE_OFF&lt;/code&gt;)
&lt;/h3&gt;

&lt;p&gt;Rather than cutting display power via &lt;code&gt;--turn-screen-off&lt;/code&gt; (which shuts down the hardware encoder pipeline on Tensor G2), our supervisor dynamically reduces backlight brightness to &lt;code&gt;0&lt;/code&gt; via Android system settings before starting the stream:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight dart"&gt;&lt;code&gt;&lt;span class="c1"&gt;// Dim display to 0 to preserve OLED longevity without breaking the encoder buffer:&lt;/span&gt;
&lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="n"&gt;adbService&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;execute&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;
  &lt;span class="p"&gt;..&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;deviceTargetFlags&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="s"&gt;'shell'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="s"&gt;'settings'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="s"&gt;'put'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="s"&gt;'system'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="s"&gt;'screen_brightness'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="s"&gt;'0'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;]);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;When the user closes scrcpy, the supervisor catches the process termination and automatically restores normal brightness (&lt;code&gt;100&lt;/code&gt;).&lt;/p&gt;

&lt;h3&gt;
  
  
  B. Forcing Physical Display Binding &amp;amp; Purging Zombie Daemons
&lt;/h3&gt;

&lt;p&gt;To prevent scrcpy from accidentally latching onto ghost virtual displays spawned by Android background processes, our configuration builder always enforces &lt;code&gt;--display-id=0&lt;/code&gt; and kills lingering &lt;code&gt;app_process&lt;/code&gt; daemons:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight dart"&gt;&lt;code&gt;&lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="n"&gt;adbService&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;execute&lt;/span&gt;&lt;span class="p"&gt;([..&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;deviceTargetFlags&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;'shell'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;'pkill'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;'-9'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;'-f'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;'app_process'&lt;/span&gt;&lt;span class="p"&gt;]);&lt;/span&gt;
&lt;span class="n"&gt;args&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;add&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;'--display-id=0'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  C. Keeping the On-Screen Keyboard Active &amp;amp; Dismissing Keyguard
&lt;/h3&gt;

&lt;p&gt;To ensure the touch keyboard stays visible even when physical keystrokes are forwarded via Linux UHID, while automatically waking up and unlocking the screen:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight dart"&gt;&lt;code&gt;&lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="n"&gt;adbService&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;execute&lt;/span&gt;&lt;span class="p"&gt;([..&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;deviceTargetFlags&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;'shell'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;'input'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;'keyevent'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;'224'&lt;/span&gt;&lt;span class="p"&gt;]);&lt;/span&gt;
&lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="n"&gt;adbService&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;execute&lt;/span&gt;&lt;span class="p"&gt;([..&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;deviceTargetFlags&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;'shell'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;'wm'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;'dismiss-keyguard'&lt;/span&gt;&lt;span class="p"&gt;]);&lt;/span&gt;
&lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="n"&gt;adbService&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;execute&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;
  &lt;span class="p"&gt;..&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;deviceTargetFlags&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="s"&gt;'shell'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="s"&gt;'settings'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="s"&gt;'put'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="s"&gt;'secure'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="s"&gt;'show_ime_with_hard_keyboard'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="s"&gt;'1'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;]);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  2. Zero-Config Dynamic Wi-Fi Discovery (4 Tiers)
&lt;/h2&gt;

&lt;p&gt;Instead of forcing users to check their Android settings or type IPs into a terminal, our &lt;code&gt;NetworkDiscoveryService&lt;/code&gt; executes a multi-tiered heuristic search:&lt;br&gt;
&lt;/p&gt;

&lt;pre data-lang="mermaid"&gt;&lt;code&gt;graph TD
    T1[Tier 1: Check Active Wireless ADB Connections] --&amp;gt;|Not Found| T2[Tier 2: Query USB Device IP via wlan0 / ip route]
    T2 --&amp;gt;|No USB Device| T3[Tier 3: Query ADB mDNS Services Daemon]
    T3 --&amp;gt;|mDNS Unreachable| T4[Tier 4: Multithreaded Subnet Socket Probe Port 5555]
    T4 --&amp;gt; Connected[Auto-Connect TCP/IP Session]&lt;/code&gt;&lt;/pre&gt;



&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Tier 1 (Active ADB):&lt;/strong&gt; Checks &lt;code&gt;adb devices -l&lt;/code&gt; for existing wireless TCP endpoints, filtering out phantom emulators (like BlueStacks on &lt;code&gt;127.0.0.1:5555&lt;/code&gt;).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Tier 2 (USB Query):&lt;/strong&gt; If connected by USB, queries &lt;code&gt;ip addr show wlan0&lt;/code&gt; directly.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Tier 3 (mDNS Discovery):&lt;/strong&gt; Queries Android's native wireless debugging mDNS service (&lt;code&gt;adb mdns services&lt;/code&gt;).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Tier 4 (Subnet Socket Probe):&lt;/strong&gt; Inspects the host machine's local network interfaces (&lt;code&gt;NetworkInterface.list&lt;/code&gt;), isolates the &lt;code&gt;/24&lt;/code&gt; subnet prefix (e.g. &lt;code&gt;192.168.100.x&lt;/code&gt;), and asynchronously probes port 5555 across candidate IPs in concurrent batches of 60 with a fast 200 ms socket timeout.&lt;/li&gt;
&lt;/ol&gt;




&lt;h2&gt;
  
  
  3. High-FPS Performance Optimization &amp;amp; Thermal Protection
&lt;/h2&gt;

&lt;p&gt;On a high-DPI device (1440 × 3120 pixels on the Pixel 7 Pro), raw unconstrained mirroring over Wi-Fi generates massive encoder load, battery heat, and eventual thermal throttling. &lt;/p&gt;

&lt;p&gt;By default, &lt;strong&gt;Pixel Control Center&lt;/strong&gt; caps video resolution to &lt;strong&gt;1080p / 1200 px&lt;/strong&gt; (&lt;code&gt;--max-size=1200&lt;/code&gt;) at 8 Mbps:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Drops Tensor G2 video encoder strain by &lt;strong&gt;&amp;gt;60%&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Slashes stream latency to sub-30ms.&lt;/li&gt;
&lt;li&gt;Prevents extreme thermal throttling on low battery levels.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  4. Flutter Desktop Architecture &amp;amp; Atomic Commits
&lt;/h2&gt;

&lt;p&gt;We ported the core logic into clean, layered Dart modules:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;AdbService&lt;/code&gt;:&lt;/strong&gt; Process management, device listing parser, and hardware adjustments.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;ScrcpyService&lt;/code&gt;:&lt;/strong&gt; Process supervision, stream piping to real-time log consoles, and lifecycle cleanup.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;NetworkDiscoveryService&lt;/code&gt;:&lt;/strong&gt; Cross-platform network socket and interface probing.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Material 3 Desktop UI:&lt;/strong&gt; Responsive dark dashboard with live battery telemetry, quick actions, remote navigation controls, and terminal drawer.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Following atomic git commit discipline ("AND / ET" principle where every commit represents exactly one logical unit of work), the entire history was built across clean, bisectable Conventional Commits:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;cb00a85 docs: add initial project readme and hardware notes
cc7620b chore(flutter): scaffold flutter desktop application
7490a10 feat(models): implement device and connection configuration models
d92f8b2 feat(services): implement adb interaction service with pixel quirks support
56f42e7 feat(services): implement scrcpy process supervisor
bb289cd feat(services): implement dynamic local network wifi discovery
dca7037 feat(ui): implement modern material 3 desktop dashboard
9d4ba53 test: add unit tests for adb parsing and device models
045105f fix(launcher): disambiguate adb targets and dismiss keyguard to prevent black screen
d97b61a fix(app): target device flags for adb shell and unlock keyguard
faf8282 fix(services): filter emulators and dismiss keyguard to prevent black screen
2c679e6 perf(app): optimize discovery timeout and target telemetry to prevent lag
b51c1cf perf(launcher): cap stream resolution to 1200 to prevent thermal throttling
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  5. Open-Source &amp;amp; What's Next
&lt;/h2&gt;

&lt;p&gt;The complete code is open-source and available on GitHub:&lt;br&gt;
👉 &lt;strong&gt;&lt;a href="https://github.com/arispacco/pixel-control-center" rel="noopener noreferrer"&gt;github.com/arispacco/pixel-control-center&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;We are preparing &lt;strong&gt;Pixel Control Center&lt;/strong&gt; for &lt;strong&gt;MLH Global Hack Week: Builders Week (November 6–12, 2026)&lt;/strong&gt;, expanding support for automated MSIX packaging for the Windows Store and native Linux AppImage/Flatpak distribution.&lt;/p&gt;

&lt;p&gt;If you have encountered black screen issues or thermal throttling on Tensor or Exynos devices when using scrcpy, try these workarounds—and let us know what you think in the comments below!&lt;/p&gt;

</description>
      <category>flutter</category>
      <category>android</category>
      <category>opensource</category>
      <category>showdev</category>
    </item>
    <item>
      <title>Why We Rewrote Our Telecom Data Auditor in 100% Native Kotlin (0.99 MB APK, 120 Hz Canvas &amp; Real-Time 4G Telemetry)</title>
      <dc:creator>Aristide Bienvenu EMCTHEU</dc:creator>
      <pubDate>Wed, 04 Nov 2026 17:09:41 +0000</pubDate>
      <link>https://dev.to/arispacco/why-we-rewrote-our-telecom-data-auditor-in-100-native-kotlin-099-mb-apk-120-hz-canvas--4ebn</link>
      <guid>https://dev.to/arispacco/why-we-rewrote-our-telecom-data-auditor-in-100-native-kotlin-099-mb-apk-120-hz-canvas--4ebn</guid>
      <description>&lt;p&gt;When mobile internet users in Cameroon buy a data bundle (&lt;code&gt;Camtel Blue&lt;/code&gt;, &lt;code&gt;MTN Mobile Surf&lt;/code&gt;, or &lt;code&gt;Orange Good Deal&lt;/code&gt;), two questions come up every single day:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Did my phone actually receive the megabytes I paid for&lt;/strong&gt;, or did the bundle vanish early?&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Where in my house does the 4G LTE signal (&lt;code&gt;RSRP&lt;/code&gt; / &lt;code&gt;SINR&lt;/code&gt;) actually pass through the walls&lt;/strong&gt;, so I can leave my phone there as a Wi-Fi Hotspot while downloading?&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;To answer both questions with hardware-level proof, we built &lt;strong&gt;CheckMyMega CM&lt;/strong&gt; — and along the way, we made a radical architectural decision: &lt;strong&gt;dropping our 85 MB Flutter shell in favor of a 0.99 MB 100% Native Kotlin APK&lt;/strong&gt; talking directly to the Android baseband modem, &lt;code&gt;NetworkStatsManager&lt;/code&gt;, 120 Hz MEMS sensors, and an on-device/cloud &lt;strong&gt;Gemma 4&lt;/strong&gt; AI auditor.&lt;/p&gt;

&lt;p&gt;Here is the full engineering breakdown of how we built it, why cross-platform bridges failed on real radio hardware, and how we solved it.&lt;/p&gt;




&lt;h2&gt;
  
  
  1. Why Our Cross-Platform Prototype Failed on Real Hardware
&lt;/h2&gt;

&lt;p&gt;In our initial hybrid build, two critical hardware limitations broke the user experience on a real &lt;strong&gt;Google Pixel 7 Pro&lt;/strong&gt; connected to &lt;strong&gt;CAMTEL / Blue (Band 3 FDD 1800 MHz)&lt;/strong&gt;:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Android's 30-second CellInfo Cache:&lt;/strong&gt; Calling &lt;code&gt;TelephonyManager.getAllCellInfo()&lt;/code&gt; across a bridge returned cached &lt;code&gt;RSRP&lt;/code&gt; values that stayed frozen at &lt;code&gt;-81 dBm&lt;/code&gt; while walking across the living room.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Compass Gimbal Lock &amp;amp; 120 Hz Frame Jitter:&lt;/strong&gt; Holding the phone upright (&lt;code&gt;pitch &amp;gt; 38°&lt;/code&gt;) caused standard Euler angles from &lt;code&gt;SensorManager.getOrientation()&lt;/code&gt; to flip wildly. Furthermore, serializing 120 Hz sensor events across inter-process bridges introduced noticeable jitter on smooth OLED screens.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Wi-Fi Socket Pollution:&lt;/strong&gt; During speed tests, Android routes all traffic through Wi-Fi if available. To measure real SIM throughput without forcing the user to toggle airplane mode or disable Wi-Fi, the socket must bind directly to &lt;code&gt;NetworkCapabilities.TRANSPORT_CELLULAR&lt;/code&gt;.&lt;/li&gt;
&lt;/ol&gt;




&lt;h2&gt;
  
  
  2. Architecture of the 100% Native Kotlin Engine (&lt;code&gt;0.99 MB&lt;/code&gt; APK)
&lt;/h2&gt;



&lt;pre data-lang="mermaid"&gt;&lt;code&gt;flowchart LR
    A["4G/5G Baseband Modem\n(TelephonyCallback + requestCellInfoUpdate 750ms)"] --&amp;gt; D["NativeHardwareEngine.kt"]
    B["120 Hz 3D MEMS Sensors\n(RotationVector + Barometer + ZUPT Filter)"] --&amp;gt; D
    C["Linux Kernel Telemetry\n(NetworkStatsManager + content://sms/inbox)"] --&amp;gt; D
    D --&amp;gt; E["120 Hz Hardware Canvas\n(WayfinderCompassRadarView)"]
    D --&amp;gt; F["Per-App UID Auditor\n(WhatsApp, ChatGPT, Hotspot)"]
    D --&amp;gt; G["Gemma 4 AI Engine\n(Google AI Studio / Local Ollama)"]&lt;/code&gt;&lt;/pre&gt;



&lt;h3&gt;
  
  
  Bypassing the Modem Cache (&lt;code&gt;TelephonyCallback&lt;/code&gt; + &lt;code&gt;requestCellInfoUpdate&lt;/code&gt;)
&lt;/h3&gt;

&lt;p&gt;Starting with Android 10 (API 29) and Android 12 (API 31), getting sub-second &lt;code&gt;RSRP (dBm)&lt;/code&gt;, &lt;code&gt;SINR (dB)&lt;/code&gt;, &lt;code&gt;RSRQ (dB)&lt;/code&gt;, &lt;code&gt;CQI&lt;/code&gt;, and &lt;code&gt;Timing Advance&lt;/code&gt; updates requires combining &lt;code&gt;TelephonyCallback.SignalStrengthsListener&lt;/code&gt; with active &lt;code&gt;requestCellInfoUpdate()&lt;/code&gt; calls on a dedicated background executor:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight kotlin"&gt;&lt;code&gt;&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;Build&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;VERSION&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;SDK_INT&lt;/span&gt; &lt;span class="p"&gt;&amp;gt;=&lt;/span&gt; &lt;span class="nc"&gt;Build&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;VERSION_CODES&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;Q&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;tm&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;requestCellInfoUpdate&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;bgExecutor&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kd"&gt;object&lt;/span&gt; &lt;span class="err"&gt;: &lt;/span&gt;&lt;span class="nc"&gt;TelephonyManager&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;CellInfoCallback&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;override&lt;/span&gt; &lt;span class="k"&gt;fun&lt;/span&gt; &lt;span class="nf"&gt;onCellInfo&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;cellInfo&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nc"&gt;MutableList&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;CellInfo&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="nf"&gt;parseCellInfoList&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;cellInfo&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
            &lt;span class="nf"&gt;notifyUi&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="p"&gt;})&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Even when a SIM card has &lt;strong&gt;0 FCFA / no active data bundle&lt;/strong&gt;, the 4G LTE physical layer stays attached to the cell tower (&lt;code&gt;Reference Signals&lt;/code&gt;). This allows our &lt;strong&gt;RF Oscilloscope&lt;/strong&gt; to map indoor wall attenuation room by room (&lt;code&gt;Salon&lt;/code&gt;, &lt;code&gt;Près Fenêtre&lt;/code&gt;, &lt;code&gt;Chambre&lt;/code&gt;, &lt;code&gt;Balcon&lt;/code&gt;) with zero synthetic data.&lt;/p&gt;

&lt;h3&gt;
  
  
  Forced 4G Cellular Sockets (&lt;code&gt;TRANSPORT_CELLULAR&lt;/code&gt;)
&lt;/h3&gt;

&lt;p&gt;To prevent home Wi-Fi from polluting the SIM measurement, we acquire a dedicated cellular network handle:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight kotlin"&gt;&lt;code&gt;&lt;span class="kd"&gt;val&lt;/span&gt; &lt;span class="py"&gt;req&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;NetworkRequest&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;Builder&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;addTransportType&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;NetworkCapabilities&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;TRANSPORT_CELLULAR&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;addCapability&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;NetworkCapabilities&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;NET_CAPABILITY_INTERNET&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;build&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

&lt;span class="n"&gt;cm&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;requestNetwork&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;req&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kd"&gt;object&lt;/span&gt; &lt;span class="err"&gt;: &lt;/span&gt;&lt;span class="nc"&gt;ConnectivityManager&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;NetworkCallback&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;override&lt;/span&gt; &lt;span class="k"&gt;fun&lt;/span&gt; &lt;span class="nf"&gt;onAvailable&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;network&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nc"&gt;Network&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="kd"&gt;val&lt;/span&gt; &lt;span class="py"&gt;conn&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;network&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;openConnection&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;URL&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"https://speed.cloudflare.com/..."&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="nc"&gt;HttpURLConnection&lt;/span&gt;
        &lt;span class="c1"&gt;// Real cellular throughput test executed strictly over SIM 4G!&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;})&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  3D Tilt-Compensated Wayfinder Compass + Zero-Velocity Update (ZUPT)
&lt;/h3&gt;

&lt;p&gt;Drawing inspiration from Android sensor engineering articles on DEV — such as &lt;a href="https://dev.to/elsamet/master-android-sensors-with-jetpack-compose-41ck"&gt;Master Android Sensors with Jetpack Compose&lt;/a&gt; and &lt;a href="https://dev.to/shriram_singh_20329643b0a/-title-how-i-solved-phantom-pocket-touches-on-android-a-deep-dive-into-sensor-fusion--4mmh"&gt;How I Solved Phantom Pocket Touches on Android&lt;/a&gt; — we implemented quaternion coordinate remapping when tilted past &lt;code&gt;38°&lt;/code&gt;, combined with a &lt;strong&gt;ZUPT (Zero-Velocity Update)&lt;/strong&gt; filter that freezes linear acceleration drift whenever the phone is stationary.&lt;/p&gt;




&lt;h2&gt;
  
  
  3. Real Telecom Auditing via &lt;code&gt;NetworkStatsManager&lt;/code&gt; &amp;amp; Gemma 4 AI
&lt;/h2&gt;

&lt;p&gt;Instead of synthetic guesswork, &lt;strong&gt;CheckMyMega CM&lt;/strong&gt; audits real usage by cross-referencing:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Carrier SMS messages (&lt;code&gt;content://sms/inbox&lt;/code&gt;) for activations and expirations.&lt;/li&gt;
&lt;li&gt;Kernel byte counters via &lt;code&gt;NetworkStatsManager.querySummary(ConnectivityManager.TYPE_MOBILE, ...)&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Per-app UID consumption (&lt;code&gt;WhatsApp&lt;/code&gt;, &lt;code&gt;ChatGPT&lt;/code&gt;, &lt;code&gt;YouTube&lt;/code&gt;, &lt;code&gt;Wi-Fi Hotspot Tethering&lt;/code&gt;) paired with authentic system icons via &lt;code&gt;PackageManager.getApplicationIcon()&lt;/code&gt;.&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  Gemma 4 Telemetry Synthesis
&lt;/h3&gt;

&lt;p&gt;The structured telemetry is synthesized by &lt;strong&gt;Gemma 4&lt;/strong&gt; (supporting &lt;code&gt;gemma-4-27b-it&lt;/code&gt; on Google AI Studio, OpenRouter, or local on-device &lt;code&gt;gemma4:e4b&lt;/code&gt; via Ollama). The model produces an unvarnished audit comparing the operator's promised megabytes against bytes delivered by the baseband layer:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"isp"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Camtel / Blue"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"planName"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Surveillance SIM Directe (24h)"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"osMeasuredDecimalMb"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mf"&gt;7.7&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"topApps"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"Partage de Connexion (4.7 Mo)"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"WhatsApp (0.5 Mo)"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"bestSpot"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Près Fenêtre (-79 dBm, SINR 8 dB, ~24.5 Mbps)"&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  4. Atomic Git Commits &amp;amp; Single-Responsibility Protocol
&lt;/h2&gt;

&lt;p&gt;We enforced strict atomic commit discipline under the &lt;strong&gt;"AND / ET" principle&lt;/strong&gt; (every commit encapsulates exactly one logical intention). The migration was recorded across 10 clean commits:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;c898220 chore(deps): add google_fonts package for UI typography
9e0b4f5 feat(domain): add 4G signal radar models with real SIM telemetry
d0b7655 feat(ui): add signal compass view to Flutter audit dashboard
2de18a5 test(audit): update widget tests for real SIM audit workflow
83a802b chore(android): configure standalone native Kotlin Gradle build
389f95f feat(android-res): replace launcher assets with vector radar icon
debde39 feat(native-models): add multi-SIM, SMS, 4G RF telemetry models
7b89f10 feat(native-engine): add 120Hz sensor engine with Gemma 4 client
2113780 feat(native-views): add 120Hz Canvas compass with vector icon views
fde7920 feat(native-ui): implement native FinTech UI with Gemma 4 settings
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  5. MLH Global Hack Week: Builders Week &amp;amp; What's Next
&lt;/h2&gt;

&lt;p&gt;We registered &lt;strong&gt;CheckMyMega CM&lt;/strong&gt; as an official project for &lt;strong&gt;MLH Global Hack Week: Builders Week (November 6–12, 2026)&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;The project is now completely independent of heavy frameworks, compiling into a featherweight &lt;strong&gt;0.99 MB&lt;/strong&gt; native APK with zero external runtime dependencies.&lt;/p&gt;

&lt;p&gt;What are your go-to strategies for accurate radio telemetry and sensor fusion on Android? Let us know in the comments below!&lt;/p&gt;

</description>
      <category>android</category>
      <category>kotlin</category>
      <category>mlhacks</category>
      <category>opensource</category>
    </item>
  </channel>
</rss>
