<?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>Forem: Prabhakar Thota</title>
    <description>The latest articles on Forem by Prabhakar Thota (@myinnos).</description>
    <link>https://forem.com/myinnos</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.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F640324%2F5c194cdb-04e9-454a-947c-00a909a8fff7.JPG</url>
      <title>Forem: Prabhakar Thota</title>
      <link>https://forem.com/myinnos</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/myinnos"/>
    <language>en</language>
    <item>
      <title>I Set Up My AI Coding Tool Properly for an Android Project - Here's What Changed</title>
      <dc:creator>Prabhakar Thota</dc:creator>
      <pubDate>Sat, 28 Feb 2026 15:18:07 +0000</pubDate>
      <link>https://forem.com/myinnos/i-set-up-my-ai-coding-tool-properly-for-an-android-project-heres-what-changed-55hf</link>
      <guid>https://forem.com/myinnos/i-set-up-my-ai-coding-tool-properly-for-an-android-project-heres-what-changed-55hf</guid>
      <description>&lt;h2&gt;
  
  
  Whether you use Claude Code, GitHub Copilot, Gemini, or Codex — most Android developers are burning tokens and getting inconsistent results. I fixed that with 28 files.
&lt;/h2&gt;




&lt;p&gt;I've been building &lt;a href="https://appsmanager.app" rel="noopener noreferrer"&gt;&lt;strong&gt;Apps Manager&lt;/strong&gt;&lt;/a&gt; — a production Play Store app with 163 Java files, Firebase, AdMob, Google Billing, WorkManager, widgets, and a gamification system. Yes, it's Java — not Kotlin, not Compose. A migration is on the roadmap, but if you've maintained a legacy app, you know that's a "when we have bandwidth" task. The codebase works, ships, and earns revenue.&lt;/p&gt;

&lt;p&gt;I use Claude Code, Codex, and Gemini in Android Studio daily. They've helped me fix data races, modernize deprecated APIs, and ship features faster. But here's the part nobody talks about: &lt;strong&gt;these tools don't actually know your project.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;You open a session, ask the AI to add a feature, and it suggests converting your Java to Kotlin. Or proposes Compose when your UI is XML. Or autocompletes a Hilt injection when you have zero DI. My project has 3 Retrofit clients — the AI picks the wrong one every time. I have a theme system where &lt;code&gt;ThemeUtil.applyTheme()&lt;/code&gt; must be called before &lt;code&gt;super.onCreate()&lt;/code&gt; — the AI puts it after.&lt;/p&gt;

&lt;p&gt;I was spending the first 3-4 messages of every session just correcting the AI. And when a teammate started using these tools? Same problem. Every developer having the same "no, this is Java" conversation independently. Claude Code, Copilot, Gemini — didn't matter. The problem was the same: &lt;strong&gt;no project-level context.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Then I discovered 5 features in Claude Code that most developers never set up — and the principles apply to every AI coding tool.&lt;/p&gt;




&lt;h2&gt;
  
  
  The 5 Features Nobody Talks About
&lt;/h2&gt;

&lt;p&gt;Claude Code isn't just a chat window. It has a proper configuration system:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1. CLAUDE.md&lt;/strong&gt; — A file at your project root that Claude reads automatically every session. Think of it as your project's identity card. Your architecture, conventions, tech stack, build commands, things to never do — all in one place.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2. Skills&lt;/strong&gt; — On-demand expertise files that Claude loads only when relevant. Unlike CLAUDE.md (always loaded), Skills activate contextually. A "Firebase patterns" skill loads when you're working with Firebase. An "AdMob patterns" skill loads when you touch ad code. This keeps your context window clean.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3. Sub-agents&lt;/strong&gt; — Isolated Claude instances for focused tasks. Need a code review? Spawn a sub-agent. It reviews the code, returns results, and doesn't pollute your main conversation.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;4. Hooks&lt;/strong&gt; — Automated guardrails that fire on specific events. Edit a file? Run lint automatically. Try to commit to main? Block it. Create a model class? Remind about ProGuard rules. No manual intervention needed.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;5. MCP Servers&lt;/strong&gt; — Connections to external services. Claude can create GitHub PRs, check Firebase data, and interact with your actual development tools — not just your codebase.&lt;/p&gt;

&lt;p&gt;When you combine all five, Claude Code transforms from a chatbot into a configured development partner.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;A note for Copilot/Gemini/Codex users:&lt;/strong&gt; While I'm demonstrating this with Claude Code (because it has the most mature configuration system right now), every AI coding tool is moving in this direction. GitHub Copilot has custom instructions and &lt;code&gt;.github/copilot-instructions.md&lt;/code&gt;. Gemini in Android Studio reads project context. Codex supports system prompts. The concept of giving your AI tool project-level memory is universal — the implementation details differ, but the mindset is the same. What you learn here applies everywhere.&lt;/p&gt;




&lt;h2&gt;
  
  
  What I Actually Built
&lt;/h2&gt;

&lt;p&gt;Here's the full setup I created for my Android project — every file tailored to my real codebase, not a demo project.&lt;/p&gt;

&lt;h3&gt;
  
  
  CLAUDE.md — The Foundation
&lt;/h3&gt;

&lt;p&gt;This is the single most impactful file. Here's what mine includes:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight markdown"&gt;&lt;code&gt;&lt;span class="gh"&gt;# Project: Apps Manager by MyInnos&lt;/span&gt;

&lt;span class="gu"&gt;## Architecture&lt;/span&gt;
&lt;span class="p"&gt;-&lt;/span&gt; Single-module Android app (app/ only)
&lt;span class="p"&gt;-&lt;/span&gt; Pattern: MVC (Activity-based)
&lt;span class="p"&gt;-&lt;/span&gt; Language: Java only (no Kotlin files in project)
&lt;span class="p"&gt;-&lt;/span&gt; UI: XML layouts with ViewBinding + DataBinding (no Jetpack Compose)
&lt;span class="p"&gt;-&lt;/span&gt; Gradle: Groovy DSL (build.gradle, not .kts)

&lt;span class="gu"&gt;## Important Rules&lt;/span&gt;
&lt;span class="p"&gt;-&lt;/span&gt; NEVER suggest Kotlin — this is a Java-only project
&lt;span class="p"&gt;-&lt;/span&gt; NEVER suggest Jetpack Compose — this uses XML layouts
&lt;span class="p"&gt;-&lt;/span&gt; NEVER suggest Hilt/Dagger — no DI framework in use
&lt;span class="p"&gt;-&lt;/span&gt; NEVER suggest Room — data is in SharedPreferences + Firebase
&lt;span class="p"&gt;-&lt;/span&gt; BaseActivity is 63.5KB — don't add more to it
&lt;span class="p"&gt;-&lt;/span&gt; Always handle ad-free state (isAdFree()) when touching ad code
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That last section is the game-changer. Without it, Claude would suggest Kotlin every other response. With it, Claude stays in Java mode and follows my actual patterns.&lt;/p&gt;

&lt;p&gt;My full CLAUDE.md includes the package structure, all 3 Retrofit client URLs, SharedPreferences key constants, build commands, git conventions, and testing notes. It's about 200 lines — comprehensive but not bloated.&lt;/p&gt;

&lt;h3&gt;
  
  
  8 Skills — Context-Aware Expertise
&lt;/h3&gt;

&lt;p&gt;Instead of generic skills, I built ones that match my exact codebase:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Skill&lt;/th&gt;
&lt;th&gt;What It Knows&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;retrofit-api-patterns&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;My 3 separate Retrofit clients, endpoint patterns, Gson model conventions&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;firebase-patterns&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;My Analytics events, RemoteConfig flags, Realtime DB write structure&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;activity-ui-patterns&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;ViewBinding setup, ThemeUtil.applyTheme() before super.onCreate(), edge-to-edge&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;admob-patterns&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Banner lifecycle, interstitial dual-frequency control, rewarded ads memory guard&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;billing-subscription&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;BillingClient singleton, purchase acknowledgement, points-based theme unlocking&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;leaderboard-gamification&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;7-day streak cycle, badge unlocks, referral system, coupon redemption&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;widget-receiver-patterns&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;goAsync(), AtomicInteger task tracking, PendingIntent flags&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;workmanager-patterns&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Weekly report worker, snapshot comparison, notification channels&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Each skill is a SKILL.md file inside &lt;code&gt;.claude/skills/{name}/&lt;/code&gt;. When I ask Claude to "add a new API endpoint," it auto-loads the retrofit-api-patterns skill and knows to use &lt;code&gt;@SerializedName&lt;/code&gt;, check which of my 3 Retrofit clients to use, null-check &lt;code&gt;response.body()&lt;/code&gt;, and log failures to Crashlytics.&lt;/p&gt;

&lt;p&gt;Here's a snippet from my AdMob skill:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight markdown"&gt;&lt;code&gt;&lt;span class="gu"&gt;## Interstitial Ad — Dual Frequency Control&lt;/span&gt;
Two gates must pass before showing:
&lt;span class="p"&gt;1.&lt;/span&gt; Time gap — ad_interstitial_timegap seconds since last show (from RemoteConfig)
&lt;span class="p"&gt;2.&lt;/span&gt; Interaction gap — ad_interstitial_interaction_gap interactions since last show

&lt;span class="gu"&gt;## Rules&lt;/span&gt;
&lt;span class="p"&gt;-&lt;/span&gt; NEVER show ads without checking isAdFree() first
&lt;span class="p"&gt;-&lt;/span&gt; NEVER show ads without consent (canRequestAds())
&lt;span class="p"&gt;-&lt;/span&gt; NEVER load rewarded ads on low-memory devices
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This means Claude will never accidentally break my ad logic. Every ad-related change respects the consent flow, subscription state, and memory constraints.&lt;/p&gt;

&lt;h3&gt;
  
  
  5 Sub-agents — Isolated Specialists
&lt;/h3&gt;

&lt;p&gt;These are my favorite. Each agent has a focused job:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Agent&lt;/th&gt;
&lt;th&gt;Role&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;code-reviewer&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Reviews Java/XML for memory leaks, lifecycle issues, thread safety, null safety&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;architecture-analyst&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Finds God classes, circular dependencies, code duplication&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;security-auditor&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Checks cleartext traffic, unencrypted storage, WebView risks, permission issues&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;performance-analyzer&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Spots main-thread blocking, RecyclerView inefficiency, widget refresh cost&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;api-contract-validator&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Verifies Retrofit endpoints match model classes, checks ProGuard coverage&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;When I ask "review the leaderboard package for security issues," Claude spawns the security-auditor in isolation. It scans the files, returns findings categorized as HIGH/MEDIUM/LOW severity, and doesn't clutter my main conversation.&lt;/p&gt;

&lt;p&gt;My code-reviewer agent is specifically tuned for Java (not Kotlin), checks for Android-specific issues like &lt;code&gt;isFinishing()&lt;/code&gt; guards, and knows about my ad system's &lt;code&gt;isAdFree()&lt;/code&gt; requirement.&lt;/p&gt;

&lt;h3&gt;
  
  
  6 Hooks — Automatic Guardrails
&lt;/h3&gt;

&lt;p&gt;These run without me doing anything:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Hook&lt;/th&gt;
&lt;th&gt;Trigger&lt;/th&gt;
&lt;th&gt;Action&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;prevent-main-commit&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;git commit&lt;/code&gt; on main/develop&lt;/td&gt;
&lt;td&gt;Blocks with error message&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;commit-message-format&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Any &lt;code&gt;git commit&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;Enforces &lt;code&gt;type(scope): description&lt;/code&gt; format&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;manifest-validation&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Edit AndroidManifest.xml&lt;/td&gt;
&lt;td&gt;Validates XML structure&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;proguard-reminder&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Edit any model class&lt;/td&gt;
&lt;td&gt;Checks if ProGuard rules cover it&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;post-edit-lint&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Edit any Java/XML file&lt;/td&gt;
&lt;td&gt;Runs lint check&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;test-reminder&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Claude stops working&lt;/td&gt;
&lt;td&gt;Reminds that zero tests exist&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The commit message hook is surprisingly useful. My project uses conventional commits (&lt;code&gt;feat(leaderboard): add streak badges&lt;/code&gt;), and now Claude can't commit with a lazy "updated files" message.&lt;/p&gt;

&lt;p&gt;The ProGuard reminder has already saved me. I added a new API model class, and the hook immediately flagged that it wasn't in &lt;code&gt;proguard-rules.pro&lt;/code&gt;. Without this, the release build would crash with Gson deserialization errors.&lt;/p&gt;

&lt;h3&gt;
  
  
  MCP Servers — External Connections
&lt;/h3&gt;

&lt;p&gt;I connected 3 external services:&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;"mcpServers"&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="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"github"&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="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"command"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"npx"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"args"&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;"-y"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"@modelcontextprotocol/server-github"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"env"&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="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"GITHUB_PERSONAL_ACCESS_TOKEN"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"${GITHUB_TOKEN}"&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;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"firebase"&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="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"command"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"npx"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"args"&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;"-y"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"firebase-tools@latest"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"mcp"&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="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"filesystem"&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="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"command"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"npx"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"args"&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;"-y"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"@modelcontextprotocol/server-filesystem"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"/path/to/project"&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="w"&gt;
  &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="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now I can say "create a GitHub issue for the streak reset bug" and Claude actually creates it on my real repo. No copy-pasting, no switching tabs.&lt;/p&gt;

&lt;h3&gt;
  
  
  6 Slash Commands — Repeatable Workflows
&lt;/h3&gt;

&lt;p&gt;For tasks I do often:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;/create-activity UserInsightsActivity&lt;/code&gt; — scaffolds Activity + XML + manifest entry&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;/create-model AppRatingModel&lt;/code&gt; — creates Gson model + ProGuard rules&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;/create-adapter WeeklyStatsAdapter&lt;/code&gt; — RecyclerView adapter with ClickerInterface&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;/create-api-endpoint get-user-stats&lt;/code&gt; — endpoint + model + error handling&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;/review-module leaderBoard&lt;/code&gt; — triggers code review sub-agent&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;/version-bump patch&lt;/code&gt; — increments versionCode/versionName&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Each command follows my exact project conventions. &lt;code&gt;/create-activity&lt;/code&gt; knows to call &lt;code&gt;ThemeUtil.applyTheme()&lt;/code&gt; before &lt;code&gt;super.onCreate()&lt;/code&gt;, use &lt;code&gt;CoordinatorLayout&lt;/code&gt; as root, and register in the manifest. Every time. Consistently.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Token Savings Are Real
&lt;/h2&gt;

&lt;p&gt;Before this setup, a typical session started with 3-4 messages just establishing context. "This is Java." "We use ViewBinding." "Don't suggest Kotlin." "Here's how our API clients work." Each message costs tokens — both in what you send and what Claude processes.&lt;/p&gt;

&lt;p&gt;Now? First message, first task. Claude already knows everything. For a team of developers, multiply that saving across every session, every day.&lt;/p&gt;

&lt;p&gt;But the bigger win is &lt;strong&gt;consistency&lt;/strong&gt;. When my teammate uses Claude Code on this project, they get the same conventions, same patterns, same guardrails. No more "Claude suggested Kotlin to me but Java to you." The CLAUDE.md is committed to git — it's shared across the team.&lt;/p&gt;




&lt;h2&gt;
  
  
  How to Set This Up for Your Project
&lt;/h2&gt;

&lt;p&gt;The complete folder structure:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;your-android-project/
├── CLAUDE.md                          # Always-loaded project rules
├── .mcp.json                          # MCP server connections
├── .claude/
│   ├── settings.json                  # Hooks configuration
│   ├── settings.local.json            # Personal overrides (gitignored)
│   ├── commands/                      # Slash commands
│   │   ├── create-activity.md
│   │   ├── create-adapter.md
│   │   └── ...
│   ├── skills/                        # On-demand expertise
│   │   ├── retrofit-api-patterns/
│   │   │   └── SKILL.md
│   │   ├── firebase-patterns/
│   │   │   └── SKILL.md
│   │   └── ...
│   ├── agents/                        # Sub-agents
│   │   ├── code-reviewer.md
│   │   ├── security-auditor.md
│   │   └── ...
│   └── hooks/                         # Automated guardrails
│       ├── prevent-main-commit.sh
│       ├── proguard-reminder.sh
│       └── ...
└── app/
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Start with &lt;strong&gt;CLAUDE.md&lt;/strong&gt; — it gives you the biggest immediate improvement. Write your actual project rules, not aspirational ones. If your project is Java, say Java. If it's a monolith, say monolith.&lt;/p&gt;

&lt;p&gt;Then add &lt;strong&gt;Skills&lt;/strong&gt; for the patterns you repeat most. Look at your last 10 Claude conversations — what did you explain more than once? That's a skill.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Hooks&lt;/strong&gt; come next — start with the commit protection ones. They prevent mistakes with zero effort.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Sub-agents&lt;/strong&gt; and &lt;strong&gt;MCP servers&lt;/strong&gt; are the advanced layer. Add them when you're comfortable with the basics.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Decision Matrix
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Situation&lt;/th&gt;
&lt;th&gt;Feature&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Always applies to every task?&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;CLAUDE.md&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Needed sometimes, context-specific?&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Skill&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Need isolated, focused work?&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Sub-agent&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Want automatic enforcement?&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Hook&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Need external data/services?&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;MCP Server&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Repeatable multi-step workflow?&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Slash Command&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  What This Means for Android Teams
&lt;/h2&gt;

&lt;p&gt;Most Android developers are using AI coding tools like a chat window — type a question, get an answer, repeat. Whether it's Claude Code, Copilot, Gemini, or Codex — they're leaving 80% of the tool's capability on the table.&lt;/p&gt;

&lt;p&gt;The problem isn't the AI. It's the setup. Or rather, the lack of it.&lt;/p&gt;

&lt;p&gt;Setting up project-level context takes about an hour. The payoff is immediate: fewer wasted tokens, consistent code patterns, automatic guardrails, and a shared knowledge base that every team member benefits from. Commit the configuration files to git, and every developer on the team gets the same AI experience from day one.&lt;/p&gt;

&lt;p&gt;My Apps Manager project went from "the AI sometimes suggests Kotlin on a Java project" to "it knows every convention, catches ProGuard mistakes automatically, and creates GitHub PRs without me switching tabs."&lt;/p&gt;

&lt;p&gt;28 files. One hour of setup. Every session after that is faster, cheaper, and more consistent.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Bigger Picture
&lt;/h2&gt;

&lt;p&gt;We're at an interesting moment in Android development. AI coding tools are becoming essential, but most developers treat them like Stack Overflow with autocomplete. They ask questions, get answers, and move on.&lt;/p&gt;

&lt;p&gt;The developers who will get ahead are the ones who &lt;strong&gt;configure&lt;/strong&gt; their AI tools — who invest an hour upfront to save hundreds of hours over the lifetime of a project. This isn't about which AI tool you use. Claude Code, Copilot, Gemini, Codex — they all benefit from project-level context. The specific features I showed (CLAUDE.md, Skills, Hooks, Sub-agents, MCP) are Claude Code's implementation, but every tool has its equivalent:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Concept&lt;/th&gt;
&lt;th&gt;Claude Code&lt;/th&gt;
&lt;th&gt;GitHub Copilot&lt;/th&gt;
&lt;th&gt;Gemini&lt;/th&gt;
&lt;th&gt;Codex&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Project context&lt;/td&gt;
&lt;td&gt;CLAUDE.md&lt;/td&gt;
&lt;td&gt;.github/copilot-instructions.md&lt;/td&gt;
&lt;td&gt;Project context&lt;/td&gt;
&lt;td&gt;System prompts&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;On-demand rules&lt;/td&gt;
&lt;td&gt;Skills&lt;/td&gt;
&lt;td&gt;—&lt;/td&gt;
&lt;td&gt;—&lt;/td&gt;
&lt;td&gt;—&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Automated checks&lt;/td&gt;
&lt;td&gt;Hooks&lt;/td&gt;
&lt;td&gt;Pre-commit hooks&lt;/td&gt;
&lt;td&gt;—&lt;/td&gt;
&lt;td&gt;—&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;External tools&lt;/td&gt;
&lt;td&gt;MCP Servers&lt;/td&gt;
&lt;td&gt;Extensions&lt;/td&gt;
&lt;td&gt;Extensions&lt;/td&gt;
&lt;td&gt;Plugins&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The tool-specific features will converge over time. The mindset of &lt;strong&gt;"configure your AI before you use it"&lt;/strong&gt; is what matters.&lt;/p&gt;

&lt;p&gt;If you're using any AI coding tool for Android development without project-level setup — you're doing it wrong. Start with one file. Write your project's rules. Watch everything change.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;The setup I showed is tailored for a Java/XML codebase, but the same approach works for any Android project — Kotlin, Compose, multi-module, whatever your stack is. Adapt the files to your project's conventions and you're good to go.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Check out Apps Manager: &lt;a href="https://appsmanager.app" rel="noopener noreferrer"&gt;appsmanager.app&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;If you found this useful, share it with your Android team. This is the kind of setup that saves everyone tokens and headaches.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Follow me for more Android development + AI tooling content.&lt;/em&gt;&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;Tags:&lt;/strong&gt; #AndroidDev #ClaudeCode #AI #Automation #AndroidStudio #GitHubCopilot #Gemini #Codex #Productivity #DeveloperTools&lt;/p&gt;

</description>
      <category>androiddev</category>
      <category>claudecode</category>
      <category>androidstudio</category>
      <category>ai</category>
    </item>
    <item>
      <title>Prompt Engineering Context Engineering: An Android Engineer's Perspective</title>
      <dc:creator>Prabhakar Thota</dc:creator>
      <pubDate>Sun, 22 Feb 2026 15:10:20 +0000</pubDate>
      <link>https://forem.com/myinnos/prompt-engineering-context-engineering-an-android-engineers-perspective-3hbd</link>
      <guid>https://forem.com/myinnos/prompt-engineering-context-engineering-an-android-engineers-perspective-3hbd</guid>
      <description>&lt;p&gt;As Android engineers, we understand one thing very clearly:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;Behavior is driven by state.&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Now apply that to AI.&lt;/p&gt;

&lt;p&gt;For a while, we treated LLMs like simple input-output functions:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;Input (Prompt) → Model → Output&lt;/code&gt;`&lt;/p&gt;

&lt;p&gt;So we optimized the input string.&lt;/p&gt;

&lt;p&gt;But if you think like an Android engineer, this approach feels… incomplete.&lt;/p&gt;

&lt;p&gt;Because we know:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Apps don’t work because of a single method call.They work because of architecture + state + data flow.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;That’s where context engineering comes in.&lt;/p&gt;

&lt;h3&gt;
  
  
  Prompt Engineering Is Like Writing a Better Function Call
&lt;/h3&gt;

&lt;p&gt;Imagine this:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;fun generateSummary(text: String): String&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;You can improve how you call it:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;generateSummary(    "Summarize this article in bullet points with a technical tone...")&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Sure - better instruction gives better output.&lt;/p&gt;

&lt;p&gt;But what if the function doesn’t know:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Who the user is&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;What reading level do they prefer&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Their past interactions&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;The domain context&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;App state&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Then you’re just polishing the argument.&lt;/p&gt;

&lt;p&gt;That’s prompt engineering.&lt;/p&gt;

&lt;h3&gt;
  
  
  Android Reality: State Is Everything
&lt;/h3&gt;

&lt;p&gt;In Android, we don’t design apps like this:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;Button Click → API Call → UI Update&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;We design systems like:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;UI → ViewModel → Repository → Local DB / Network → StateFlow → UI&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Why?&lt;/p&gt;

&lt;p&gt;Because:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;State survives configuration changes&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Data flows predictably&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Business logic is separated&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Context is preserved&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Now map this to AI.&lt;/p&gt;

&lt;h3&gt;
  
  
  LLM Without Context = Activity Without ViewModel
&lt;/h3&gt;

&lt;p&gt;Calling an LLM with only a prompt is like:&lt;/p&gt;

&lt;p&gt;Writing everything inside an Activity No ViewModel No Repository No SavedStateHandle No caching No offline support&lt;/p&gt;

&lt;p&gt;It works in the demo.&lt;/p&gt;

&lt;p&gt;It breaks in production.&lt;/p&gt;

&lt;h3&gt;
  
  
  Context Engineering in Android Terms
&lt;/h3&gt;

&lt;p&gt;Let’s say you’re building an AI-powered feature inside your Android app.&lt;/p&gt;

&lt;h3&gt;
  
  
  ❌ Prompt Engineering Approach
&lt;/h3&gt;

&lt;p&gt;User clicks:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;“Plan my Thailand trip”&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;You send:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;"Plan a 5-day Thailand trip."&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Model responds generically.&lt;/p&gt;

&lt;h3&gt;
  
  
  ✅ Context Engineering Approach
&lt;/h3&gt;

&lt;p&gt;Before calling the model, your app gathers:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;User budget (from Room DB)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Previous trips (from local history)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Preferred airlines (saved preference)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Current location (FusedLocationProvider)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Passport nationality (profile data)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Live flight prices (API response)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Cached hotel recommendations&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Then you assemble:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;TripContext(    budget = 80000,    preferredAirlines = listOf("Singapore Airlines"),    location = "Bangalore",    travelHistory = beachesOnly,    ...)   &lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Now your model call is powered by:&lt;/p&gt;

&lt;p&gt;State + memory + live data.&lt;/p&gt;

&lt;p&gt;That’s context engineering.&lt;/p&gt;

&lt;h3&gt;
  
  
  It’s Basically MVI for AI
&lt;/h3&gt;

&lt;p&gt;If you’re using MVI or Clean Architecture:&lt;/p&gt;

&lt;p&gt;You already understand context engineering.&lt;/p&gt;

&lt;p&gt;Instead of:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;Intent → Prompt → Response&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;It becomes:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;Intent → State Reduction→ Context Builder→ Model Call→ Validator→ State Update→ Render&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;The prompt is just one layer in the pipeline.&lt;/p&gt;

&lt;h3&gt;
  
  
  Real Android Parallel
&lt;/h3&gt;

&lt;p&gt;Think of it like Glide or Coil.&lt;/p&gt;

&lt;p&gt;You don’t just do:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;loadImage(url)&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;You configure:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Memory cache&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Disk cache&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Transformation&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Placeholder&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Lifecycle binding&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Why?&lt;/p&gt;

&lt;p&gt;Because the environment matters.LLMs are the same.The environment (context) determines output quality.&lt;/p&gt;

&lt;h3&gt;
  
  
  Why This Matters for Android Engineers
&lt;/h3&gt;

&lt;p&gt;As mobile engineers, we are naturally good at:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Managing lifecycle&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Handling state&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Caching data&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Orchestrating APIs&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Optimizing performance&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That skillset maps perfectly to context engineering.&lt;/p&gt;

&lt;p&gt;AI isn’t about writing better English.&lt;/p&gt;

&lt;p&gt;It’s about designing better data flow.&lt;/p&gt;

&lt;h3&gt;
  
  
  The Shift in Thinking
&lt;/h3&gt;

&lt;p&gt;Prompt Engineering mindset:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;“How do I phrase this better?”&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Context Engineering mindset:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;“What does my system already know that the model should know too?”&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;As Android engineers, we don’t build screens.&lt;/p&gt;

&lt;p&gt;We build state-driven systems.&lt;/p&gt;

&lt;p&gt;AI systems should be no different.&lt;/p&gt;

</description>
      <category>android</category>
      <category>promptengineering</category>
    </item>
    <item>
      <title>Designing a Scalable OTA Strategy in Android Applications</title>
      <dc:creator>Prabhakar Thota</dc:creator>
      <pubDate>Fri, 13 Feb 2026 05:52:56 +0000</pubDate>
      <link>https://forem.com/myinnos/designing-a-scalable-ota-strategy-in-android-applications-5fi9</link>
      <guid>https://forem.com/myinnos/designing-a-scalable-ota-strategy-in-android-applications-5fi9</guid>
      <description>&lt;p&gt;In Android development, OTA (Over-The-Air) updates are often misunderstood as simply “publishing a new build to the Play Store.”&lt;/p&gt;

&lt;p&gt;At scale, OTA is not a release action.&lt;br&gt;
It is an architectural control system.&lt;/p&gt;

&lt;p&gt;In production-grade applications - especially commerce, fintech, or high-traffic platforms - how you design OTA directly impacts release velocity, revenue stability, and operational risk.&lt;/p&gt;

&lt;p&gt;Let’s break it down.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1. Store-Based OTA: Binary Replacement Layer&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;When we:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Increment versionCode&lt;/li&gt;
&lt;li&gt;Upload AAB to Google Play Store&lt;/li&gt;
&lt;li&gt;Use staged rollout&lt;/li&gt;
&lt;li&gt;Monitor crash-free sessions&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;We are replacing the entire app binary.&lt;/p&gt;

&lt;p&gt;This is mandatory for:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Native code changes&lt;/li&gt;
&lt;li&gt;Dependency upgrades&lt;/li&gt;
&lt;li&gt;SDK updates&lt;/li&gt;
&lt;li&gt;Permission changes&lt;/li&gt;
&lt;li&gt;Architecture refactors&lt;/li&gt;
&lt;li&gt;Major UI changes (Compose/XML)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Limitations&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Users may delay updates&lt;/li&gt;
&lt;li&gt;Rollback is slow&lt;/li&gt;
&lt;li&gt;Review delay risk&lt;/li&gt;
&lt;li&gt;Emergency hotfix pressure&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Binary OTA alone is not sufficient for high-scale apps.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2. In-App Updates: Version Enforcement Layer&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Using the Play Core In-App Updates API, we can trigger:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Immediate Updates (blocking)&lt;/li&gt;
&lt;li&gt;Flexible Updates (background download)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;A clean architecture pattern:&lt;/p&gt;

&lt;p&gt;Backend:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;minSupportedVersion = 120
recommendedVersion = 125
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;App Launch:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;if currentVersion &amp;lt; minSupportedVersion:
    triggerImmediateUpdate()
else if currentVersion &amp;lt; recommendedVersion:
    showFlexibleUpdate()
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This avoids hardcoded force-update logic.&lt;/p&gt;

&lt;p&gt;It also gives product and backend teams controlled rollout authority.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3. Runtime OTA: Remote Config &amp;amp; Feature Flags&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The real maturity layer.&lt;/p&gt;

&lt;p&gt;Instead of shipping logic changes through Play Store:&lt;/p&gt;

&lt;p&gt;We separate:&lt;br&gt;
Binary Layer → Structural changes&lt;br&gt;
Config Layer → Business rules&lt;br&gt;
Experiment Layer → Feature flags&lt;/p&gt;

&lt;p&gt;Using runtime configuration, we can control:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Cashback calculation toggles&lt;/li&gt;
&lt;li&gt;Discount stacking logic&lt;/li&gt;
&lt;li&gt;Payment provider routing&lt;/li&gt;
&lt;li&gt;Checkout flow variants&lt;/li&gt;
&lt;li&gt;UI experiments&lt;/li&gt;
&lt;li&gt;Kill switches for risky modules&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This reduces emergency releases significantly.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;4. Production-Grade OTA Architecture&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;A scalable startup sequence:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;App Start
   ↓
Load Cached Config
   ↓
Fetch Remote Config (Async)
   ↓
Validate App Version
   ↓
Apply Feature Flags
   ↓
Render UI
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;With:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Safe defaults&lt;/li&gt;
&lt;li&gt;Config expiry control&lt;/li&gt;
&lt;li&gt;Kill switches&lt;/li&gt;
&lt;li&gt;Version-based flag targeting&lt;/li&gt;
&lt;li&gt;Rollback capability&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This transforms OTA into:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;A risk management layer&lt;/li&gt;
&lt;li&gt;A velocity enabler&lt;/li&gt;
&lt;li&gt;A runtime control system&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;5. Engineering Insight&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;In mature Android systems:&lt;/p&gt;

&lt;p&gt;Deployment ≠ Release&lt;br&gt;
Release ≠ Exposure&lt;/p&gt;

&lt;p&gt;You can:&lt;/p&gt;

&lt;p&gt;Deploy code → Keep feature OFF&lt;br&gt;
Enable feature → 5% users&lt;br&gt;
Scale to 100% → Monitor metrics&lt;br&gt;
Instantly disable → If anomaly detected&lt;/p&gt;

&lt;p&gt;This is how large-scale mobile systems operate safely.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Final Thought&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;If your OTA strategy is only “push a new build”, you are operating at a surface level.&lt;/p&gt;

&lt;p&gt;If your OTA strategy includes runtime control, version gating, and safe rollout architecture, you are building production-grade mobile systems.&lt;/p&gt;

&lt;p&gt;If you’re designing large-scale Android systems, OTA should be treated as architecture, not deployment.&lt;/p&gt;

</description>
      <category>androiddevelopment</category>
      <category>mobilearchitecture</category>
      <category>releaseengineering</category>
      <category>scalableapps</category>
    </item>
    <item>
      <title>Send WhatsApp Messages using the Android SDK</title>
      <dc:creator>Prabhakar Thota</dc:creator>
      <pubDate>Mon, 30 May 2022 05:35:24 +0000</pubDate>
      <link>https://forem.com/myinnos/send-whatsapp-messages-using-the-android-sdk-129j</link>
      <guid>https://forem.com/myinnos/send-whatsapp-messages-using-the-android-sdk-129j</guid>
      <description>&lt;p&gt;Before jumping into using the SDK, let's follow the below steps to create the project on &lt;a href="https://developers.facebook.com/" rel="noopener noreferrer"&gt;developers.facebook.com&lt;/a&gt; to claim the phone number id.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Step 1: Create a WhatsApp App&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fgmg3fqxxm855w87miz8r.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fgmg3fqxxm855w87miz8r.png" alt="Learn how to use this Android SDK to Send WhatsApp Messages using the WhatsApp API" width="800" height="400"&gt;&lt;/a&gt; &lt;/p&gt;

&lt;p&gt;Give your app a descriptive name (do not use any Facebook trademarks like WhatsApp or Facebook in the app name) and click the Create App button to create the app.&lt;/p&gt;

&lt;p&gt;On the next screen, you will be required to link your WhatsApp app to your Facebook business account. You will also have the option to create a new business account if you don’t have one yet.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fmt3ig7naj7unkxpgsjyw.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fmt3ig7naj7unkxpgsjyw.png" alt="Learn how to use this Android SDK to Send WhatsApp Messages using the WhatsApp API" width="800" height="496"&gt;&lt;/a&gt; &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Step 2: Add Recipient’s phone number&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Your WhatsApp app will provide you with a temporary access token that will be valid for 23 hours. Make a note of this token as we’ll need it in a later step.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fgvpluji0326j0hf5eyd9.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fgvpluji0326j0hf5eyd9.png" alt="Learn how to use this Android SDK to Send WhatsApp Messages using the WhatsApp API" width="687" height="462"&gt;&lt;/a&gt; &lt;/p&gt;

&lt;p&gt;Use below Android SDK to Send WhatsApp Messages using the WhatsApp API&lt;/p&gt;

&lt;h4&gt;
  
  
  Kindly use the following links to use this library:
&lt;/h4&gt;

&lt;p&gt;In settings.gradle (Project)&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="nf"&gt;dependencyResolutionManagement&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nf"&gt;repositories&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="err"&gt;……&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;
        &lt;span class="nf"&gt;maven&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="n"&gt;url&lt;/span&gt; &lt;span class="err"&gt;'&lt;/span&gt;&lt;span class="n"&gt;https&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="c1"&gt;//jitpack.io' }&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;And then in the other gradle file(maybe your app gradle or your own module library gradle, but never add in both of them to avoid conflict.)&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="nf"&gt;dependencies&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;implementation&lt;/span&gt; &lt;span class="err"&gt;'&lt;/span&gt;&lt;span class="n"&gt;com&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;github&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;myinnos&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="nc"&gt;WhatsApp-SDK&lt;/span&gt;&lt;span class="p"&gt;:&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;latest-version&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;&lt;span class="err"&gt;'&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  How to use
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Step 2:&lt;/strong&gt; implement App Icon Name Changer method : &lt;a href="https://github.com/myinnos/WhatsApp-Android-SDK/blob/main/app/src/main/java/in/myinnos/whatsappsdk/MainActivity.kt" rel="noopener noreferrer"&gt;#Example - MainActivity.kt&lt;/a&gt;&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="nc"&gt;WhatsAppInitialization&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;sendMessage&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
                &lt;span class="s"&gt;"token"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="c1"&gt;//token&lt;/span&gt;
                &lt;span class="s"&gt;"version"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="c1"&gt;//ex: v13.0&lt;/span&gt;
                &lt;span class="s"&gt;"phone_number_id"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="c1"&gt;//ex: 103075932423434&lt;/span&gt;
                &lt;span class="s"&gt;"customer_phone_number"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                &lt;span class="s"&gt;"template_name"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="c1"&gt;//ex: hello_world&lt;/span&gt;
                &lt;span class="s"&gt;"language_code"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="c1"&gt;//ex: en_US&lt;/span&gt;
            &lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="n"&gt;wResult&lt;/span&gt; &lt;span class="p"&gt;-&amp;gt;&lt;/span&gt;
                &lt;span class="nc"&gt;Handler&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;Looper&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;getMainLooper&lt;/span&gt;&lt;span class="p"&gt;()).&lt;/span&gt;&lt;span class="nf"&gt;post&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
                    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;wResult&lt;/span&gt;&lt;span class="o"&gt;?.&lt;/span&gt;&lt;span class="nf"&gt;getMessage&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;==&lt;/span&gt; &lt;span class="k"&gt;null&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
                        &lt;span class="c1"&gt;// failed results&lt;/span&gt;
                    &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
                        &lt;span class="c1"&gt;// success results&lt;/span&gt;
                        &lt;span class="nc"&gt;Log&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;d&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"RESULTS"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;wResult&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;getMessage&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;Any Queries? or Feedback, please let me know by opening a &lt;a href="https://github.com/myinnos/WhatsApp-Android-SDK/issues/new" rel="noopener noreferrer"&gt;new issue&lt;/a&gt;!&lt;/p&gt;

&lt;p&gt;PS: Images in the article are taken from &lt;a href="https://www.labnol.org/whatsapp-api-google-sheets-220520" rel="noopener noreferrer"&gt;labnol&lt;/a&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Let me know your thoughts on &lt;a href="https://twitter.com/MyInnos" rel="noopener noreferrer"&gt;Twitter&lt;/a&gt;.&lt;/p&gt;
&lt;/blockquote&gt;

</description>
      <category>whatsapp</category>
      <category>android</category>
      <category>api</category>
    </item>
    <item>
      <title>Google code scanner API -scanning codes without camera permission</title>
      <dc:creator>Prabhakar Thota</dc:creator>
      <pubDate>Thu, 19 May 2022 06:02:51 +0000</pubDate>
      <link>https://forem.com/myinnos/google-code-scanner-api-scanning-codes-without-camera-permission-2kn3</link>
      <guid>https://forem.com/myinnos/google-code-scanner-api-scanning-codes-without-camera-permission-2kn3</guid>
      <description>&lt;p&gt;The Google code scanner API provides a complete solution for scanning codes without requiring your app to request camera permission, while preserving user privacy. This is accomplished by delegating the task of scanning the code to Google Play services and returning only the scan results to your app. All image processing occurs on the device and Google doesn't store the results or image data.&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F098ciimokckk7815ogae.jpeg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F098ciimokckk7815ogae.jpeg" alt="Android-Google Code Scanner - Example" width="200" height="444"&gt;&lt;/a&gt;&lt;br&gt;
 &lt;/p&gt;
&lt;h4&gt;
  
  
  Kindly use the following links to use this library:
&lt;/h4&gt;

&lt;blockquote&gt;
&lt;p&gt;This API requires Android API level 21 or above. Make sure that your app's build file uses a minSdkVersion value of 21 or higher.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;In your top-level settings.gradle file, include Google's Maven repository and Maven central repository in under the dependencyResolutionManagement block:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="n"&gt;dependencyResolutionManagement&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
&lt;span class="err"&gt; &lt;/span&gt;&lt;span class="n"&gt;repositories&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
&lt;span class="err"&gt; &lt;/span&gt;&lt;span class="n"&gt;google&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt;
&lt;span class="err"&gt; &lt;/span&gt;&lt;span class="n"&gt;mavenCentral&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt;
&lt;span class="err"&gt; &lt;/span&gt;&lt;span class="o"&gt;}&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Add the Google Play services dependency for the play-services-code-scanner SDK to your module's Gradle build file, which is commonly app/build.gradle:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="n"&gt;dependencies&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
&lt;span class="err"&gt; &lt;/span&gt;&lt;span class="n"&gt;implementation&lt;/span&gt; &lt;span class="err"&gt;'&lt;/span&gt;&lt;span class="n"&gt;com&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;google&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;android&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;gms&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="n"&gt;play&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;services&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;code&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="nl"&gt;scanner:&lt;/span&gt;&lt;span class="mf"&gt;16.0&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="err"&gt;'&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;&lt;br&gt;
 &lt;br&gt;
You can configure your app to have Google Play services automatically download the scanner module to the device while your app is installed from the Play Store. If you skip this step, Google Play services will download the scanner module the first time it is used, if it has not already been installed for another use case.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;application&lt;/span&gt;&lt;span class="err"&gt; …&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="err"&gt; …&lt;/span&gt;
&lt;span class="err"&gt; &lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;meta&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;data&lt;/span&gt;
&lt;span class="err"&gt; &lt;/span&gt;&lt;span class="nl"&gt;android:&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"com.google.mlkit.vision.DEPENDENCIES"&lt;/span&gt;
&lt;span class="err"&gt; &lt;/span&gt;&lt;span class="nl"&gt;android:&lt;/span&gt;&lt;span class="n"&gt;value&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"barcode_ui"&lt;/span&gt;&lt;span class="o"&gt;/&amp;gt;&lt;/span&gt;
&lt;span class="err"&gt; …&lt;/span&gt;
&lt;span class="o"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="n"&gt;application&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;How to use&lt;br&gt;
 - - -&lt;br&gt;
&lt;strong&gt;(Optional) Configure the code scanner&lt;/strong&gt;&lt;br&gt;
If you know which barcode formats you expect to read, you can improve the speed of the barcode detector by configuring it to only detect those formats. For example, to detect only Aztec code and QR codes, build a GmsBarcodeScannerOptions object as in the following example:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="c1"&gt;//**** java ****&lt;/span&gt;
&lt;span class="nc"&gt;GmsBarcodeScannerOptions&lt;/span&gt; &lt;span class="n"&gt;options&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;GmsBarcodeScannerOptions&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;Builder&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt;
&lt;span class="err"&gt; &lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;setBarcodeFormats&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;
&lt;span class="err"&gt; &lt;/span&gt;&lt;span class="nc"&gt;Barcode&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;FORMAT_QR_CODE&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;
&lt;span class="err"&gt; &lt;/span&gt;&lt;span class="nc"&gt;Barcode&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;FORMAT_AZTEC&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
&lt;span class="err"&gt; &lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;build&lt;/span&gt;&lt;span class="o"&gt;();&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight kotlin"&gt;&lt;code&gt;&lt;span class="c1"&gt;//**** kotlin ****&lt;/span&gt;
&lt;span class="kd"&gt;val&lt;/span&gt; &lt;span class="py"&gt;options&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;GmsBarcodeScannerOptions&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="err"&gt; &lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;setBarcodeFormats&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
&lt;span class="err"&gt; &lt;/span&gt;&lt;span class="nc"&gt;Barcode&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;FORMAT_QR_CODE&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="err"&gt; &lt;/span&gt;&lt;span class="nc"&gt;Barcode&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;FORMAT_AZTEC&lt;/span&gt;
&lt;span class="err"&gt; &lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="err"&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;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;&lt;br&gt;
 &lt;br&gt;
&lt;strong&gt;Get an instance of GmsBarcodeScanner&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="c1"&gt;//**** java ****&lt;/span&gt;
&lt;span class="nc"&gt;GmsBarcodeScanner&lt;/span&gt; &lt;span class="n"&gt;scanner&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;GmsBarcodeScanning&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;getClient&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
&lt;span class="c1"&gt;// Or with a configured options&lt;/span&gt;
&lt;span class="c1"&gt;// GmsBarcodeScanner scanner = GmsBarcodeScanning.getClient(context, options);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight kotlin"&gt;&lt;code&gt;&lt;span class="c1"&gt;//**** kotlin ****&lt;/span&gt;
&lt;span class="kd"&gt;val&lt;/span&gt; &lt;span class="py"&gt;scanner&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;GmsBarcodeScanning&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;getClient&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="c1"&gt;// Or with a configured options&lt;/span&gt;
&lt;span class="c1"&gt;// val scanner = GmsBarcodeScanning.getClient(this, options)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Request a code scanning by calling startScan()&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="c1"&gt;//**** java ****&lt;/span&gt;
&lt;span class="n"&gt;scanner&lt;/span&gt;
    &lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;startScan&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt;
    &lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;addOnSuccessListener&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;
        &lt;span class="n"&gt;barcode&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
          &lt;span class="c1"&gt;// Task completed successfully&lt;/span&gt;
        &lt;span class="o"&gt;})&lt;/span&gt;
    &lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;addOnCanceledListener&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;
        &lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
          &lt;span class="c1"&gt;// Task canceled&lt;/span&gt;
        &lt;span class="o"&gt;})&lt;/span&gt;
    &lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;addOnFailureListener&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;
        &lt;span class="n"&gt;e&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
          &lt;span class="c1"&gt;// Task failed with an exception&lt;/span&gt;
        &lt;span class="o"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight kotlin"&gt;&lt;code&gt;&lt;span class="c1"&gt;//**** kotlin ****&lt;/span&gt;
&lt;span class="n"&gt;scanner&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;startScan&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;addOnSuccessListener&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="n"&gt;barcode&lt;/span&gt; &lt;span class="p"&gt;-&amp;gt;&lt;/span&gt;
        &lt;span class="c1"&gt;// Task completed successfully&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;addOnCanceledListener&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="c1"&gt;// Task canceled&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;addOnFailureListener&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="n"&gt;e&lt;/span&gt; &lt;span class="p"&gt;-&amp;gt;&lt;/span&gt;
        &lt;span class="c1"&gt;// Task failed with an exception&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Handle the resulting Barcode&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="c1"&gt;//**** java ****&lt;/span&gt;
&lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="n"&gt;rawValue&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;barcode&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;getRawValue&lt;/span&gt;&lt;span class="o"&gt;();&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight kotlin"&gt;&lt;code&gt;&lt;span class="c1"&gt;//**** kotlin ****&lt;/span&gt;
&lt;span class="kd"&gt;val&lt;/span&gt; &lt;span class="py"&gt;rawValue&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nc"&gt;String&lt;/span&gt;&lt;span class="p"&gt;?&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;barcode&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;rawValue&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h5&gt;
  
  
  Watch the code &lt;a href="https://github.com/myinnos/Android-Google-Code-Scanner/blob/main/app/src/main/java/in/myinnos/googlecodescanner/MainActivity.java" rel="noopener noreferrer"&gt;here (MainActivity.java)&lt;/a&gt; and ref &lt;a href="https://developers.google.com/ml-kit/code-scanner" rel="noopener noreferrer"&gt;Google code scanner (Beta)&lt;/a&gt;
&lt;/h5&gt;

&lt;p&gt;Let me know your thoughts on &lt;a href="https://twitter.com/MyInnos" rel="noopener noreferrer"&gt;Twitter&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>android</category>
      <category>programming</category>
      <category>github</category>
    </item>
    <item>
      <title>Android Dev Tools - Become a Master with these Tools, Collaborate Better</title>
      <dc:creator>Prabhakar Thota</dc:creator>
      <pubDate>Mon, 05 Jul 2021 04:22:33 +0000</pubDate>
      <link>https://forem.com/myinnos/android-dev-tools-become-a-master-with-these-tools-collaborate-better-28hd</link>
      <guid>https://forem.com/myinnos/android-dev-tools-become-a-master-with-these-tools-collaborate-better-28hd</guid>
      <description>&lt;p&gt;You'll be well on your way to developing Android apps like a pro.&lt;/p&gt;

&lt;p&gt;That’s why I’ve compiled this big list of Android development tools so you can find all you might need in one place.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://play.google.com/store/apps/details?id=com.google.android.apps.accessibility.auditor&amp;amp;hl=en_ZA" rel="noopener noreferrer"&gt;Accessibility Scanner&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Accessibility Scanner is an Android app that scans through your apps UI and makes accessibility recommendations based on the content of your screen. It lets you know what your app is missing in terms of content descriptions if your colours don’t contrast well enough or the tap targets are too small. It is a great tool for improving the accessibility of your app.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://play.google.com/store/apps/details?id=com.dziemia.w.window" rel="noopener noreferrer"&gt;Window VQA&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Window VQA (Visual Quality Assurance) is an app for measuring views on screen. It provides a useful overlay on top of your app which allows you to click on the views and get the measurements of them in px or dp.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.vysor.io/" rel="noopener noreferrer"&gt;vysor.io&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Vysor is an extension for the Google Chrome browser that connects to an app on your smartphone, enabling you to control your phone from your PC or Mac using the mouse/trackpad and keyboard. Everything happens via a USB cable, which you'll need to connect the phone to your computer's USB port.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/ChuckerTeam/chucker" rel="noopener noreferrer"&gt;Chucker&lt;/a&gt; &lt;/p&gt;

&lt;p&gt;Chucker simplifies the inspection of HTTP(S) requests/responses fired by your Android App. Chucker works as an OkHttp Interceptor persisting all those events inside your application and providing a UI for inspecting and sharing their content.&lt;/p&gt;

&lt;p&gt;Apps using Chucker will display a push notification showing a summary of ongoing HTTP activity. Tapping on the notification launches the full Chucker UI. Apps can optionally suppress the notification, and launch the Chucker UI directly from within their own interface.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/facebook/stetho" rel="noopener noreferrer"&gt;Stetho&lt;/a&gt; &lt;/p&gt;

&lt;p&gt;Stetho is a tool that connects to Chrome Developer Tools and gives access to a bunch of app information as if it were a webpage you were debugging. You can get access to on-device databases, update SharedPreferences and monitor network requests and responses.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/square/leakcanary" rel="noopener noreferrer"&gt;LeakCanary&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;LeakCanary helps you pick up any memory leaks that you may have in your applications. It does some pretty complex magic to analyse heaps and helps narrow down the cause of your memory leaks.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://shapeshifter.design/" rel="noopener noreferrer"&gt;Shape Shifter&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;ShapeShifter is my favourite tool for creating AnimatedVectorDrawable animations. It takes the guesswork away from creating cute animations, helps fix paths and generate all the required XML for creating an AVD. If you want to see a quick overview of how to use it, check out my talk on animations here.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.charlesproxy.com/" rel="noopener noreferrer"&gt;Charles Proxy&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Charles Proxy is a tool for network debugging. It allows you to intercept network requests and change the response or requests. Charles Proxy is a great tool for testing error conditions or just recording what your app is doing.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://play.google.com/store/apps/details?id=com.kimcy929.screenrecorder" rel="noopener noreferrer"&gt;Screen Recorder&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Say no more, every Android Developer needs a screen recording app. This one is my favourite because there are no ads and it is super easy to use.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://play.google.com/store/apps/details?id=xyz.mustafaali.devqstiles" rel="noopener noreferrer"&gt;DevTiles&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;DevTiles is an app that allows you to easily access some developer options right from your devices shortcuts/tiles. Options include a tile for showing touches, enabling/disabling demo mode, toggling animator durations etc.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://nimbledroid.com/" rel="noopener noreferrer"&gt;Nimble Droid&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;NimbleDroid is a testing platform that allows you to check your finished Android app for memory leaks, bugs, and other issues prior to publishing on Google Play. Using NimbleDroid helps to free up app developers’ time and speed up the overall QA process, helping to get the app to market faster.&lt;/p&gt;

&lt;p&gt;Companies such as Mozilla, Yahoo, and Pinterest have all used NimbleDroid to test their applications. Personalized pricing is available based on customers’ specific needs and the number of users.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://developers.google.com/ml-kit" rel="noopener noreferrer"&gt;ML Kit&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;ML Kit is an Android developer tool that allows you to add machine learning functionality to your app from Google. That means adding things like computer vision and OCR without needing a giant budget and heaps of big data. Start with this simple tutorial.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/aind-containers/aind" rel="noopener noreferrer"&gt;AinD: Android (Anbox) in Docker&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;AinD launches Android apps in Docker by nesting Anbox containers inside Docker.&lt;/p&gt;

&lt;p&gt;Unlike VM-based similar projects, AinD can be executed on IaaS instances without support for nested virtualisation.&lt;/p&gt;

&lt;p&gt;Let me know your thoughts on &lt;a href="https://twitter.com/MyInnos" rel="noopener noreferrer"&gt;Twitter&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>android</category>
      <category>tooling</category>
    </item>
    <item>
      <title>Review of your Twitter developer account application</title>
      <dc:creator>Prabhakar Thota</dc:creator>
      <pubDate>Fri, 18 Jun 2021 05:39:34 +0000</pubDate>
      <link>https://forem.com/myinnos/review-of-your-twitter-developer-account-application-kbl</link>
      <guid>https://forem.com/myinnos/review-of-your-twitter-developer-account-application-kbl</guid>
      <description>&lt;p&gt;As of July 2018, you must now apply for a Twitter developer account and be approved before you can create any new apps. All new developers must apply for a developer account to access Twitter APIs. Once approved, you can begin to use Twitters standard APIs and new premium APIs.&lt;/p&gt;

&lt;p&gt;For this article(which I found from various resources), am going to assume you have a great idea for Twitter automation and are just looking for a little bit of help with your proposal. Then we’re going to show you how we applied, and eventually became approved.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Steps to process the Twitter developer account&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Go to  &lt;a href="https://developer.twitter.com/" rel="noopener noreferrer"&gt;developer.twitter.com&lt;/a&gt; &lt;/li&gt;
&lt;li&gt;Click on &lt;strong&gt;Apply&lt;/strong&gt; in the navbar section&lt;/li&gt;
&lt;li&gt;Just fill in the details and submit (a very simple process)&lt;/li&gt;
&lt;li&gt;Once the application submitted you need to confirm the email to kickstart the process&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;*&lt;em&gt;Now you just need to wait for the replay from Twitter *&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;I received a replay from Twitter within 1hr&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fpyhv6rawi8i8o8xd6un9.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fpyhv6rawi8i8o8xd6un9.png" alt="Screenshot 2021-06-18 at 10.48.08 AM" width="800" height="342"&gt;&lt;/a&gt; &lt;/p&gt;

&lt;p&gt;I have no idea what to give replay since I applied without any plan, then I have just given replay like&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fqvokyvay2u9tgflf247z.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fqvokyvay2u9tgflf247z.png" alt="Screenshot 2021-06-18 at 10.49.28 AM" width="800" height="145"&gt;&lt;/a&gt; &lt;/p&gt;

&lt;p&gt;After 1hr again I got a replay from Twitter saying&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Flqtv8dnk4nhgv2whclbq.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Flqtv8dnk4nhgv2whclbq.png" alt="Screenshot 2021-06-18 at 10.50.50 AM" width="800" height="429"&gt;&lt;/a&gt; &lt;/p&gt;

&lt;p&gt;Googled and I found some useful info, Just written blindly (of course with some thoughts)&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fcpq8sfxqnv5rrx7b6f7x.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fcpq8sfxqnv5rrx7b6f7x.png" alt="Screenshot 2021-06-18 at 10.52.03 AM" width="800" height="178"&gt;&lt;/a&gt; &lt;/p&gt;

&lt;p&gt;Now I just waited for what is going to happen, post 2hrs I received a email saying &lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fnnieqvj5a5xxfzcy86nk.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fnnieqvj5a5xxfzcy86nk.png" alt="Screenshot 2021-06-18 at 10.53.00 AM" width="800" height="526"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;**Yes your reading correct, Application approved. As simple as it is. *&lt;/em&gt;*&lt;/p&gt;

&lt;p&gt;The approval took a day, which is too good considering Twitter’s moderation program is young and the spammers and social engineers are still out there in full testing this new gated system.&lt;/p&gt;

&lt;p&gt;Hope this info helped those who stuck with mail processing with Twitter.&lt;/p&gt;

&lt;p&gt;Have a nice day!&lt;/p&gt;

</description>
      <category>twitter</category>
    </item>
    <item>
      <title>Startup Hack</title>
      <dc:creator>Prabhakar Thota</dc:creator>
      <pubDate>Sat, 05 Jun 2021 03:53:19 +0000</pubDate>
      <link>https://forem.com/myinnos/startup-hack-26ia</link>
      <guid>https://forem.com/myinnos/startup-hack-26ia</guid>
      <description>&lt;p&gt;Be nice to people.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fsat4bvdqqln9kphp45rb.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fsat4bvdqqln9kphp45rb.jpg" alt="Alt Text" width="800" height="316"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
      <category>startup</category>
    </item>
  </channel>
</rss>
