<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Coding | SUMAN</title><link>https://suman.netlify.app/tag/coding/</link><atom:link href="https://suman.netlify.app/tag/coding/index.xml" rel="self" type="application/rss+xml"/><description>Coding</description><generator>Hugo Blox Builder (https://hugoblox.com)</generator><language>en-us</language><lastBuildDate>Fri, 17 Apr 2026 00:00:00 +0000</lastBuildDate><image><url>https://suman.netlify.app/media/icon_hu_1f8f41e4ad59c1b5.png</url><title>Coding</title><link>https://suman.netlify.app/tag/coding/</link></image><item><title>Best LLMs for Coding in 2026: Ranked from Number 1 to Last</title><link>https://suman.netlify.app/post/best-model-2026/best-coding-llms-2026/</link><pubDate>Fri, 17 Apr 2026 00:00:00 +0000</pubDate><guid>https://suman.netlify.app/post/best-model-2026/best-coding-llms-2026/</guid><description>&lt;p&gt;Not all AI models are created equal, especially when it comes to writing, editing, and reasoning about code. With dozens of models now available across cloud APIs and local runtimes like Ollama, it is easy to get lost. This post ranks the best coding LLMs in 2026 based on real benchmarks: &lt;strong&gt;SWE-Bench&lt;/strong&gt; (real GitHub issue resolution), &lt;strong&gt;LiveCodeBench&lt;/strong&gt; (unseen competitive programming), and &lt;strong&gt;BFCL&lt;/strong&gt; (tool/function calling accuracy).&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="tier-1---cloud--api-models-best-overall"&gt;Tier 1 - Cloud / API Models (Best Overall)&lt;/h2&gt;
&lt;p&gt;These are the top-performing models available via API. If output quality is your priority and cost is secondary, start here.&lt;/p&gt;
&lt;h3 id="1-claude-opus-47---best-for-agentic-coding"&gt;1. Claude Opus 4.7 - Best for Agentic Coding&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;SWE-Bench:&lt;/strong&gt; 87.6% (1st in the world)&lt;/li&gt;
&lt;li&gt;Best model for multi-step, autonomous coding tasks (Claude Code, Cursor, agentic loops)&lt;/li&gt;
&lt;li&gt;Dominates real-world GitHub issue resolution, not just toy benchmarks&lt;/li&gt;
&lt;li&gt;Use when you need the model to think, plan, and execute across files&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="2-claude-sonnet-45---best-daily-driver"&gt;2. Claude Sonnet 4.5 - Best Daily Driver&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;SWE-Bench:&lt;/strong&gt; 82%&lt;/li&gt;
&lt;li&gt;Faster and cheaper than Opus 4.7, with nearly the same agentic performance&lt;/li&gt;
&lt;li&gt;The sweet spot for production coding workflows, great for CI/CD integration&lt;/li&gt;
&lt;li&gt;Ideal for developers who run dozens of tasks a day&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="3-gemini-3-pro---strong-all-rounder"&gt;3. Gemini 3 Pro - Strong All-Rounder&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;LiveCodeBench:&lt;/strong&gt; 79.7% | &lt;strong&gt;SWE-Bench:&lt;/strong&gt; 76.2%&lt;/li&gt;
&lt;li&gt;Google&amp;rsquo;s most capable coding model, competitive across all benchmark types&lt;/li&gt;
&lt;li&gt;Excellent context handling and multimodal support&lt;/li&gt;
&lt;li&gt;Good alternative if you are already in the Google ecosystem&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="4-gpt-51--gpt-5---reliable-openai-option"&gt;4. GPT-5.1 / GPT-5 - Reliable OpenAI Option&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;SWE-Bench:&lt;/strong&gt; 76.3% (GPT-5.1) / 74.9% (GPT-5)&lt;/li&gt;
&lt;li&gt;Solid across the board, well-integrated with GitHub Copilot and OpenAI&amp;rsquo;s ecosystem&lt;/li&gt;
&lt;li&gt;Strong instruction following and function calling&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="5-kimi-k2-thinking---best-raw-code-generation"&gt;5. Kimi K2 Thinking - Best Raw Code Generation&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;LiveCodeBench:&lt;/strong&gt; 83.1% (1st on this benchmark)&lt;/li&gt;
&lt;li&gt;Moonshot AI&amp;rsquo;s reasoning model, excels at algorithm writing and competitive programming&lt;/li&gt;
&lt;li&gt;Strong SWE-Bench score of 71.3%&lt;/li&gt;
&lt;li&gt;New contender worth watching closely&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="6-grok-3-beta---competitive-coding-beast"&gt;6. Grok 3 (Beta) - Competitive Coding Beast&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;LiveCodeBench:&lt;/strong&gt; 79.4%&lt;/li&gt;
&lt;li&gt;xAI&amp;rsquo;s flagship, particularly strong on pure code generation tasks&lt;/li&gt;
&lt;li&gt;Less proven on agentic/real-world benchmarks but improving fast&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="7-openai-o3-mini---best-budget-reasoning-model"&gt;7. OpenAI o3-mini - Best Budget Reasoning Model&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;LiveCodeBench:&lt;/strong&gt; 74.1% | &lt;strong&gt;SWE-Bench:&lt;/strong&gt; 61% | &lt;strong&gt;BFCL:&lt;/strong&gt; 65.1%&lt;/li&gt;
&lt;li&gt;The most cost-efficient reasoning model for coding&lt;/li&gt;
&lt;li&gt;Great for developers who need chain-of-thought reasoning without paying for full o3&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="8-deepseek-r1---best-for-logic-heavy-code"&gt;8. DeepSeek R1 - Best for Logic-Heavy Code&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;LiveCodeBench:&lt;/strong&gt; 64.3% | &lt;strong&gt;MATH-500:&lt;/strong&gt; 97.3%&lt;/li&gt;
&lt;li&gt;Open-source model with exceptional mathematical and logical reasoning&lt;/li&gt;
&lt;li&gt;Great for algorithmic problems, data structures, and ML code&lt;/li&gt;
&lt;li&gt;Available on free tier via DeepSeek API, accessible from Bangladesh&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2 id="tier-2---local--ollama-models-free-and-self-hosted"&gt;Tier 2 - Local / Ollama Models (Free and Self-Hosted)&lt;/h2&gt;
&lt;p&gt;These models run fully locally via Ollama, LM Studio, or similar. No API costs, no internet required after download.&lt;/p&gt;
&lt;h3 id="1-deepseek-v3-0324---best-open-source-overall"&gt;1. DeepSeek V3 0324 - Best Open Source Overall&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;LiveCodeBench:&lt;/strong&gt; 41% | &lt;strong&gt;SWE-Bench:&lt;/strong&gt; 38.8% | &lt;strong&gt;BFCL:&lt;/strong&gt; 58.5%&lt;/li&gt;
&lt;li&gt;The best locally runnable model for general coding tasks&lt;/li&gt;
&lt;li&gt;MIT-licensed, fast on consumer hardware with quantized versions&lt;/li&gt;
&lt;li&gt;Recommended first choice for Ollama users&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="2-qwen25-coder--qwen25-vl-32b---best-tool-use-locally"&gt;2. Qwen2.5-Coder / Qwen2.5-VL-32B - Best Tool Use Locally&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;BFCL Tool Use:&lt;/strong&gt; 62.8% (highest among open models)&lt;/li&gt;
&lt;li&gt;Alibaba&amp;rsquo;s Qwen series is purpose-built for code&lt;/li&gt;
&lt;li&gt;Excellent for function calling, structured output, and agentic tasks locally&lt;/li&gt;
&lt;li&gt;Available in 7B, 14B, 32B sizes, runs well on mid-range GPUs&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="3-llama-4-behemoth---best-for-reasoning-high-vram"&gt;3. Llama 4 Behemoth - Best for Reasoning (High VRAM)&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;LiveCodeBench:&lt;/strong&gt; 49.4% | &lt;strong&gt;MATH-500:&lt;/strong&gt; 95%&lt;/li&gt;
&lt;li&gt;Meta&amp;rsquo;s most capable open model, requires significant hardware&lt;/li&gt;
&lt;li&gt;Best choice if you have a high-end GPU setup (48GB+ VRAM)&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="4-llama-4-maverick---balanced-performance"&gt;4. Llama 4 Maverick - Balanced Performance&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;LiveCodeBench:&lt;/strong&gt; 41%&lt;/li&gt;
&lt;li&gt;Good balance between model size and coding performance&lt;/li&gt;
&lt;li&gt;Multimodal support and very long context window (up to 1M tokens)&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="5-gemma-3-27b---lightweight-and-capable"&gt;5. Gemma 3 27B - Lightweight and Capable&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;MATH-500:&lt;/strong&gt; 89% | &lt;strong&gt;BFCL:&lt;/strong&gt; 59.1%&lt;/li&gt;
&lt;li&gt;Google&amp;rsquo;s open model, surprisingly strong tool use for its size&lt;/li&gt;
&lt;li&gt;Runs comfortably on consumer hardware (16-24GB VRAM)&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="6-glm-4--glm-5-zhipuai---decent-but-outclassed"&gt;6. GLM-4 / GLM-5 (ZhipuAI) - Decent but Outclassed&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Usable for general coding, especially Chinese-language documentation&lt;/li&gt;
&lt;li&gt;Significantly behind DeepSeek V3 and Qwen2.5 on every major benchmark&lt;/li&gt;
&lt;li&gt;Consider only if you have specific GLM integration requirements&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2 id="best-by-use-case"&gt;Best by Use Case&lt;/h2&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Use Case&lt;/th&gt;
&lt;th&gt;Best Model&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Agentic coding (Claude Code, Cursor)&lt;/td&gt;
&lt;td&gt;Claude Opus 4.7&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Everyday coding assistant&lt;/td&gt;
&lt;td&gt;Claude Sonnet 4.5&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Raw algorithm / competitive coding&lt;/td&gt;
&lt;td&gt;Kimi K2 Thinking&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Tool and function calling (API)&lt;/td&gt;
&lt;td&gt;GPT-4.5 (69.9% BFCL)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Budget reasoning (API)&lt;/td&gt;
&lt;td&gt;OpenAI o3-mini&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Local - best overall&lt;/td&gt;
&lt;td&gt;DeepSeek V3 0324&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Local - tool/function calling&lt;/td&gt;
&lt;td&gt;Qwen2.5-Coder 32B&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Local - low VRAM (8GB)&lt;/td&gt;
&lt;td&gt;Qwen2.5-Coder 7B or Gemma 3&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Free API (accessible in Bangladesh)&lt;/td&gt;
&lt;td&gt;DeepSeek API or Groq (Llama/Qwen)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;hr&gt;
&lt;h2 id="key-takeaways"&gt;Key Takeaways&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Claude dominates agentic coding.&lt;/strong&gt; If you are using any coding agent (Claude Code, Cursor, Continue), Claude Opus 4.7 or Sonnet 4.5 will outperform everything else on real-world tasks.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;For local/Ollama, skip GLM and use DeepSeek V3 or Qwen2.5.&lt;/strong&gt; These are objectively stronger on every benchmark and have better English instruction-following.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;The agent matters as much as the model.&lt;/strong&gt; The same model produces meaningfully better outputs in a well-engineered agent vs. a naive one.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Free options exist.&lt;/strong&gt; DeepSeek&amp;rsquo;s free tier and Groq&amp;rsquo;s API (running Llama/Qwen) give you near-frontier model quality at zero cost, both accessible from Bangladesh without VPN.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;hr&gt;
&lt;p&gt;&lt;em&gt;Benchmark data sourced from Vellum AI Coding LLM Leaderboard, updated March 2026. Rankings reflect SWE-Bench Verified, LiveCodeBench, and BFCL scores where available.&lt;/em&gt;&lt;/p&gt;</description></item><item><title>Converting Your Web App to an Android App Using WebView</title><link>https://suman.netlify.app/post/android-app-dev/</link><pubDate>Fri, 27 Mar 2026 00:00:00 +0000</pubDate><guid>https://suman.netlify.app/post/android-app-dev/</guid><description>&lt;h1 id="converting-web-app-to-an-android-app-using-webview"&gt;Converting Web App to an Android App Using WebView&lt;/h1&gt;
&lt;h2 id="deploy-your-react-app-vercel"&gt;DEPLOY YOUR REACT APP (Vercel)&lt;/h2&gt;
&lt;p&gt;✅ Build your project (LOCAL)
📂 Open your React project folder
G:\lzproject\lzapp-v2
🔹 Open Terminal in this folder&lt;/p&gt;
&lt;p&gt;👉 In VS Code:&lt;/p&gt;
&lt;p&gt;Terminal → New Terminal
🔹 Run this command:
npm run build
✅ Expected result:&lt;/p&gt;
&lt;p&gt;You will see a new folder:&lt;/p&gt;
&lt;p&gt;dist/&lt;/p&gt;
&lt;p&gt;👉 This is your production build&lt;/p&gt;
&lt;p&gt;🌐 Deploy to Vercel
🔹 Step 1 — Open Vercel&lt;/p&gt;
&lt;p&gt;Go to:
👉 &lt;a href="https://vercel.com" target="_blank" rel="noopener"&gt;https://vercel.com&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;🔹 Step 2 — Login&lt;/p&gt;
&lt;p&gt;Use:&lt;/p&gt;
&lt;p&gt;GitHub (recommended)
OR
Google
🔹 Step 3 — Import Project&lt;/p&gt;
&lt;p&gt;Click:&lt;/p&gt;
&lt;p&gt;Add New → Project
🔹 Step 4 — Select your repo&lt;/p&gt;
&lt;p&gt;If your project is already on GitHub:&lt;/p&gt;
&lt;p&gt;👉 Select:&lt;/p&gt;
&lt;p&gt;lzapp-v2
🔹 Step 5 — Configure&lt;/p&gt;
&lt;p&gt;Vercel auto-detects Vite 👍&lt;/p&gt;
&lt;p&gt;Check:&lt;/p&gt;
&lt;p&gt;Framework: Vite
Build Command: npm run build
Output Directory: dist&lt;/p&gt;
&lt;p&gt;👉 Click:&lt;/p&gt;
&lt;p&gt;Deploy
⏳ Wait 1–2 minutes
✅ STEP 6 — Get your URL&lt;/p&gt;
&lt;p&gt;After deploy, you’ll get:&lt;/p&gt;
&lt;p&gt;&lt;a href="https://your-project-name.vercel.app" target="_blank" rel="noopener"&gt;https://your-project-name.vercel.app&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;✅ Any update- TEST BEFORE DEPLOY&lt;/p&gt;
&lt;p&gt;Run locally:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;npm run dev
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;👉 Open: http://localhost:5173&lt;/p&gt;
&lt;p&gt;THEN DEPLOY AGAIN&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;npm run build
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Every time you change UI:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;1. Edit React (App.jsx / CSS)
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;2. npm run build
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;3. Push or redeploy Vercel
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;4. Open Android app → updated automatically, See updated UI
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="-1-install-android-studio-setup"&gt;🚀 1. Install Android Studio (Setup)&lt;/h2&gt;
&lt;h3 id="-download--install"&gt;🔹 Download &amp;amp; Install&lt;/h3&gt;
&lt;p&gt;Head over to the official Android Developer website: &lt;a href="https://developer.android.com/studio" target="_blank" rel="noopener"&gt;https://developer.android.com/studio&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Download and install the latest version of Android Studio. The installation process is straightforward and includes everything you need to get started.&lt;/p&gt;
&lt;h3 id="-during-setup"&gt;🔹 During Setup&lt;/h3&gt;
&lt;p&gt;When prompted during installation, make sure to select:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;✅ Standard installation&lt;/li&gt;
&lt;li&gt;✅ Install Android SDK&lt;/li&gt;
&lt;li&gt;✅ Install Emulator (optional, but useful for testing)&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="-after-installation"&gt;🔹 After Installation&lt;/h3&gt;
&lt;p&gt;Launch Android Studio and click &amp;ldquo;New Project&amp;rdquo; to begin.&lt;/p&gt;
&lt;h2 id="-2-create-new-android-project"&gt;📱 2. Create New Android Project&lt;/h2&gt;
&lt;p&gt;In the New Project wizard, select:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Template:&lt;/strong&gt; Empty Views Activity&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Language:&lt;/strong&gt; Java (simpler for beginners)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Minimum SDK:&lt;/strong&gt; API 21 (Android 5.0) - this covers about 95% of active Android devices&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Fill in the project details:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Name:&lt;/strong&gt; LzApp&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Package:&lt;/strong&gt; com.yourname.lzapp&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Click &lt;strong&gt;Finish&lt;/strong&gt; and let Android Studio set up your project.&lt;/p&gt;
&lt;h2 id="-3-add-internet-permission"&gt;🌐 3. Add Internet Permission&lt;/h2&gt;
&lt;p&gt;Your web app will need internet access, so we need to add the necessary permission.&lt;/p&gt;
&lt;p&gt;Navigate to: &lt;code&gt;app &amp;gt; src &amp;gt; main &amp;gt; AndroidManifest.xml&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;Add this line just above the &lt;code&gt;&amp;lt;application&amp;gt;&lt;/code&gt; tag:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-xml" data-lang="xml"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;&amp;lt;uses-permission&lt;/span&gt; &lt;span class="na"&gt;android:name=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;android.permission.INTERNET&amp;#34;&lt;/span&gt; &lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="-4-add-webview-in-layout"&gt;🌍 4. Add WebView in Layout&lt;/h2&gt;
&lt;p&gt;Now let&amp;rsquo;s set up the user interface. Open: &lt;code&gt;res &amp;gt; layout &amp;gt; activity_main.xml&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;Replace the entire contents with:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-xml" data-lang="xml"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="cp"&gt;&amp;lt;?xml version=&amp;#34;1.0&amp;#34; encoding=&amp;#34;utf-8&amp;#34;?&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;&amp;lt;WebView&lt;/span&gt; &lt;span class="na"&gt;xmlns:android=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;http://schemas.android.com/apk/res/android&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="na"&gt;android:id=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;@+id/webView&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="na"&gt;android:layout_width=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;match_parent&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="na"&gt;android:layout_height=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;match_parent&amp;#34;&lt;/span&gt; &lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;This creates a full-screen WebView that will display your web app.&lt;/p&gt;
&lt;h2 id="-5-load-your-vercel-app-in-webview"&gt;⚙️ 5. Load Your Vercel App in WebView&lt;/h2&gt;
&lt;p&gt;Open: &lt;code&gt;MainActivity.java&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;Replace the entire file with:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-java" data-lang="java"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kn"&gt;package&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;com.yourname.landzoning&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="kn"&gt;import&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;android.os.Bundle&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="kn"&gt;import&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;android.webkit.WebView&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="kn"&gt;import&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;android.webkit.WebViewClient&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="kn"&gt;import&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;androidx.appcompat.app.AppCompatActivity&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="kd"&gt;public&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;MainActivity&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kd"&gt;extends&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;AppCompatActivity&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&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;WebView&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;webView&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nd"&gt;@Override&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kd"&gt;protected&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kt"&gt;void&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;onCreate&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Bundle&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;savedInstanceState&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&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kd"&gt;super&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;onCreate&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;savedInstanceState&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;webView&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;new&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;WebView&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="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;setContentView&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;webView&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;webView&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;setWebViewClient&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;new&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;WebViewClient&lt;/span&gt;&lt;span class="p"&gt;());&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;webView&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;getSettings&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="na"&gt;setJavaScriptEnabled&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;webView&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;getSettings&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="na"&gt;setDomStorageEnabled&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;webView&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;loadUrl&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;https://your-vercel-app.vercel.app&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&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&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&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&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;Important:&lt;/strong&gt; Replace &lt;code&gt;https://your-vercel-app.vercel.app&lt;/code&gt; with your actual deployed Vercel URL.&lt;/p&gt;
&lt;h2 id="-6-handle-back-button-important"&gt;🔙 6. Handle Back Button (IMPORTANT)&lt;/h2&gt;
&lt;p&gt;To provide a native app experience, we need to handle the back button properly. Add this method to your &lt;code&gt;MainActivity.java&lt;/code&gt;:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-java" data-lang="java"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nd"&gt;@Override&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="kd"&gt;public&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kt"&gt;void&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;onBackPressed&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&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;if&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;webView&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;canGoBack&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&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;webView&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;goBack&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&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="k"&gt;else&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&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kd"&gt;super&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;onBackPressed&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&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&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&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&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;This allows users to navigate back through your web app&amp;rsquo;s history before exiting the app.&lt;/p&gt;
&lt;h2 id="-7-improve-webview-production-ready-basics"&gt;⚡ 7. Improve WebView (Production Ready Basics)&lt;/h2&gt;
&lt;p&gt;Let&amp;rsquo;s enhance the WebView settings for better performance and user experience. Add these lines after the existing settings in &lt;code&gt;onCreate()&lt;/code&gt;:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-java" data-lang="java"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;webView&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;getSettings&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="na"&gt;setLoadWithOverviewMode&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="n"&gt;webView&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;getSettings&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="na"&gt;setUseWideViewPort&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="n"&gt;webView&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;getSettings&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="na"&gt;setBuiltInZoomControls&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="n"&gt;webView&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;getSettings&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="na"&gt;setDisplayZoomControls&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;These settings ensure your web app displays properly on different screen sizes and provides zoom controls.&lt;/p&gt;
&lt;h2 id="-8-add-splash-screen"&gt;🎬 8. Add Splash Screen&lt;/h2&gt;
&lt;p&gt;A splash screen provides a professional first impression. Let&amp;rsquo;s add one.&lt;/p&gt;
&lt;h3 id="step-1-create-splash-layout"&gt;Step 1: Create splash layout&lt;/h3&gt;
&lt;p&gt;Create a new file: &lt;code&gt;res &amp;gt; layout &amp;gt; splash.xml&lt;/code&gt;&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-xml" data-lang="xml"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="cp"&gt;&amp;lt;?xml version=&amp;#34;1.0&amp;#34; encoding=&amp;#34;utf-8&amp;#34;?&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;&amp;lt;LinearLayout&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="na"&gt;xmlns:android=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;http://schemas.android.com/apk/res/android&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="na"&gt;android:orientation=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;vertical&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="na"&gt;android:gravity=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;center&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="na"&gt;android:background=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;#ffffff&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="na"&gt;android:layout_width=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;match_parent&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="na"&gt;android:layout_height=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;match_parent&amp;#34;&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;lt;TextView&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="na"&gt;android:text=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;Land Zoning BD&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="na"&gt;android:textSize=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;24sp&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="na"&gt;android:textStyle=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;bold&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="na"&gt;android:textColor=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;#000&amp;#34;&lt;/span&gt;&lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;&amp;lt;/LinearLayout&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="step-2-create-splashactivity"&gt;Step 2: Create SplashActivity&lt;/h3&gt;
&lt;p&gt;Right-click on your package → New → Activity → Empty Activity
Name: &lt;code&gt;SplashActivity&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;Replace the code with:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-java" data-lang="java"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kn"&gt;package&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;com.yourname.landzoning&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="kn"&gt;import&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;android.content.Intent&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="kn"&gt;import&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;android.os.Bundle&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="kn"&gt;import&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;android.os.Handler&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="kn"&gt;import&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;androidx.appcompat.app.AppCompatActivity&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="kd"&gt;public&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;SplashActivity&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kd"&gt;extends&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;AppCompatActivity&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&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nd"&gt;@Override&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kd"&gt;protected&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kt"&gt;void&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;onCreate&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Bundle&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;savedInstanceState&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&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kd"&gt;super&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;onCreate&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;savedInstanceState&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;setContentView&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;R&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;layout&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;splash&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;new&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Handler&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="na"&gt;postDelayed&lt;/span&gt;&lt;span class="p"&gt;(()&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;-&amp;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&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;startActivity&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;new&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Intent&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;SplashActivity&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;this&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;MainActivity&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;class&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;finish&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&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="n"&gt;2000&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c1"&gt;// 2 seconds&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&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&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&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&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="step-3-make-splash-first-screen"&gt;Step 3: Make Splash First Screen&lt;/h3&gt;
&lt;p&gt;In &lt;code&gt;AndroidManifest.xml&lt;/code&gt;, modify the activity declarations:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-xml" data-lang="xml"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;&amp;lt;activity&lt;/span&gt; &lt;span class="na"&gt;android:name=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;.SplashActivity&amp;#34;&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;lt;intent-filter&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;lt;action&lt;/span&gt; &lt;span class="na"&gt;android:name=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;android.intent.action.MAIN&amp;#34;&lt;/span&gt; &lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;lt;category&lt;/span&gt; &lt;span class="na"&gt;android:name=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;android.intent.category.LAUNCHER&amp;#34;&lt;/span&gt; &lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;lt;/intent-filter&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;&amp;lt;/activity&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;&amp;lt;activity&lt;/span&gt; &lt;span class="na"&gt;android:name=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;.MainActivity&amp;#34;&lt;/span&gt; &lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="-9-build-apk-production"&gt;📦 9. Build APK (Production)&lt;/h2&gt;
&lt;h3 id="-build-debug-apk"&gt;🔹 Build Debug APK&lt;/h3&gt;
&lt;p&gt;From the top menu: &lt;strong&gt;Build → Build APK(s)&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;After the build completes, click &lt;strong&gt;Locate&lt;/strong&gt; to find your APK at:
&lt;code&gt;app/build/outputs/apk/debug/app-debug.apk&lt;/code&gt;&lt;/p&gt;
&lt;h2 id="-10-build-release-apk-important"&gt;🔐 10. Build Release APK (IMPORTANT)&lt;/h2&gt;
&lt;p&gt;For distribution, you need a signed release APK.&lt;/p&gt;
&lt;p&gt;Go to: &lt;strong&gt;Build → Generate Signed Bundle / APK&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Choose:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;APK&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Create new keystore&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Fill in:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Password&lt;/li&gt;
&lt;li&gt;Key alias&lt;/li&gt;
&lt;li&gt;Validity: 25 years&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Then:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Select release&lt;/li&gt;
&lt;li&gt;Finish&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Your signed APK will be at: &lt;code&gt;app-release.apk&lt;/code&gt;&lt;/p&gt;
&lt;h2 id="-11-install-on-phone"&gt;🚀 11. Install on Phone&lt;/h2&gt;
&lt;p&gt;You can install the APK in two ways:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;USB Method:&lt;/strong&gt; Copy the APK to your phone and install it directly.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;ADB Method:&lt;/strong&gt; Connect your phone via USB and run:
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;adb install app-release.apk
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id="-important-tips-for-your-gis-app"&gt;⚠️ Important Tips for Your GIS App&lt;/h2&gt;
&lt;p&gt;Since you&amp;rsquo;re working with Leaflet, Firebase, and Vercel:&lt;/p&gt;
&lt;h3 id="-security--performance"&gt;🔹 Security &amp;amp; Performance&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;✅ Ensure HTTPS (Vercel handles this automatically)&lt;/li&gt;
&lt;li&gt;❌ Avoid mixed content (no HTTP resources in HTTPS pages)&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="-map-performance-optimization"&gt;🔹 Map Performance Optimization&lt;/h3&gt;
&lt;p&gt;Add these settings for better map rendering:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-java" data-lang="java"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;webView&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;getSettings&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="na"&gt;setAllowFileAccess&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="n"&gt;webView&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;getSettings&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="na"&gt;setAllowContentAccess&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="-next-steps"&gt;🎯 Next Steps&lt;/h2&gt;
&lt;p&gt;Once you have the basic WebView wrapper working, consider these enhancements:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Offline Caching:&lt;/strong&gt; Implement PWA features for offline functionality&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Native Loading Indicators:&lt;/strong&gt; Add progress bars and loading states&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Pull-to-Refresh:&lt;/strong&gt; Implement swipe-to-refresh functionality&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Push Notifications:&lt;/strong&gt; Integrate Firebase Cloud Messaging&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Custom Toolbar:&lt;/strong&gt; Add navigation controls that feel native&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Play Store Release:&lt;/strong&gt; Prepare your app for Google Play Store distribution&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="-if-build-issues-occur"&gt;⚠️ If Build Issues Occur&lt;/h2&gt;
&lt;p&gt;Sometimes after moving, you may see errors like:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Gradle path issue&lt;/li&gt;
&lt;li&gt;SDK not found&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Fix:&lt;/p&gt;
&lt;p&gt;🔹 1. Re-sync Gradle&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;File → Sync Project with Gradle Files&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;🔹 2. Clean &amp;amp; Rebuild&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Build → Clean Project&lt;/li&gt;
&lt;li&gt;Build → Rebuild Project&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;🔹 3. Check SDK Path&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;File → Project Structure → SDK Location&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Make sure it points to something like:&lt;/p&gt;
&lt;p&gt;&lt;code&gt;C:\Users\Dell\AppData\Local\Android\Sdk&lt;/code&gt;&lt;/p&gt;
&lt;h2 id="-summary"&gt;👉 Summary&lt;/h2&gt;
&lt;p&gt;You&amp;rsquo;re essentially creating a native Android wrapper around your web application:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;React App (Vercel) → Android WebView Wrapper → APK App
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</description></item><item><title>web app development</title><link>https://suman.netlify.app/post/web-app-dev/</link><pubDate>Fri, 27 Mar 2026 00:00:00 +0000</pubDate><guid>https://suman.netlify.app/post/web-app-dev/</guid><description>&lt;h1 id="web-app"&gt;Web App&lt;/h1&gt;
&lt;h2 id="youve-already-built-a-solid-web--gis-dashboard-system-now-well-upgrade-it-into-a-full-ecosystem"&gt;You’ve already built a solid Web + GIS dashboard system. Now we’ll upgrade it into a full ecosystem:&lt;/h2&gt;
&lt;p&gt;✅ Android App (Data Control Panel)
✅ Realtime Database (replace Google Sheets)
✅ Web App (auto-sync updates)&lt;/p&gt;
&lt;p&gt;🧠 System Architecture (Upgraded)&lt;/p&gt;
&lt;p&gt;🔄 Current (Your Setup)
Google Sheet → Web App (Vercel) → Map UI&lt;/p&gt;
&lt;p&gt;🚀 New System (Recommended)
Android App → Firebase / Supabase DB → Web App (Vercel)&lt;/p&gt;
&lt;p&gt;✔ No more manual Google Sheet editing
✔ Real-time sync
✔ Mobile control panel
✔ Scalable + faster&lt;/p&gt;
&lt;p&gt;⚙️ STEP 1: Choose Backend (VERY IMPORTANT)&lt;/p&gt;
&lt;p&gt;🥇 Best Option: Firebase (Recommended)&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Realtime database&lt;/li&gt;
&lt;li&gt;Easy Android integration&lt;/li&gt;
&lt;li&gt;Free tier enough&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Alternative:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Supabase (PostgreSQL)&lt;/li&gt;
&lt;li&gt;Node.js API + MongoDB (more control)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;👉 I’ll proceed with Firebase Firestore (best for your case)&lt;/p&gt;
&lt;p&gt;🔥 STEP 2: Database Structure&lt;/p&gt;
&lt;p&gt;Replace your Excel with this structure:&lt;/p&gt;
&lt;p&gt;Collection: upazila_progress
{
&amp;ldquo;id&amp;rdquo;: &amp;ldquo;123&amp;rdquo;,
&amp;ldquo;division&amp;rdquo;: &amp;ldquo;Dhaka&amp;rdquo;,
&amp;ldquo;district&amp;rdquo;: &amp;ldquo;Gazipur&amp;rdquo;,
&amp;ldquo;upazila&amp;rdquo;: &amp;ldquo;Kaliganj&amp;rdquo;,
&amp;ldquo;status&amp;rdquo;: &amp;ldquo;done&amp;rdquo;, // done | ongoing | todo
&amp;ldquo;updated_at&amp;rdquo;: &amp;ldquo;2026-03-24T10:00:00&amp;rdquo;
}&lt;/p&gt;
&lt;p&gt;🌐 STEP 3: Update Your Web App (IMPORTANT)&lt;/p&gt;
&lt;p&gt;Replace Google Sheets API with Firebase fetch.&lt;/p&gt;
&lt;p&gt;Install Firebase in your web project
npm install firebase&lt;/p&gt;
&lt;p&gt;Firebase config (JS)
import { initializeApp } from &amp;ldquo;firebase/app&amp;rdquo;;
import { getFirestore, collection, getDocs } from &amp;ldquo;firebase/firestore&amp;rdquo;;&lt;/p&gt;
&lt;p&gt;const firebaseConfig = {
apiKey: &amp;ldquo;XXXX&amp;rdquo;,
authDomain: &amp;ldquo;XXXX&amp;rdquo;,
projectId: &amp;ldquo;XXXX&amp;rdquo;,
};&lt;/p&gt;
&lt;p&gt;const app = initializeApp(firebaseConfig);
const db = getFirestore(app);&lt;/p&gt;
&lt;p&gt;export async function fetchUpazilaData() {
const querySnapshot = await getDocs(collection(db, &amp;ldquo;upazila_progress&amp;rdquo;));
return querySnapshot.docs.map(doc =&amp;gt; doc.data());
}&lt;/p&gt;
&lt;p&gt;👉 Replace your Google Sheet logic with this.&lt;/p&gt;
&lt;p&gt;📱 STEP 4: Android App (Core Part)&lt;/p&gt;
&lt;p&gt;We build a Minimal Admin App&lt;/p&gt;
&lt;p&gt;Features:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Upazila list&lt;/li&gt;
&lt;li&gt;Status change (Done / Ongoing / ToDo)&lt;/li&gt;
&lt;li&gt;Search&lt;/li&gt;
&lt;li&gt;Dashboard summary&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;🏗 Tech Stack&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Kotlin&lt;/li&gt;
&lt;li&gt;Firebase Firestore&lt;/li&gt;
&lt;li&gt;Jetpack Compose (or XML if you prefer)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;📲 Android UI Structure
Screens:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Dashboard&lt;/li&gt;
&lt;li&gt;Upazila List&lt;/li&gt;
&lt;li&gt;Edit Status&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;🧩 Example Code&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;Firebase Setup (Android)
val db = FirebaseFirestore.getInstance()&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Fetch Data
fun getUpazilas(onResult: (List&lt;Upazila&gt;) -&amp;gt; Unit) {
db.collection(&amp;ldquo;upazila_progress&amp;rdquo;)
.get()
.addOnSuccessListener { result -&amp;gt;
val list = result.map { doc -&amp;gt;
Upazila(
id = doc.id,
name = doc.getString(&amp;ldquo;upazila&amp;rdquo;) ?: &amp;ldquo;&amp;rdquo;,
status = doc.getString(&amp;ldquo;status&amp;rdquo;) ?: &amp;ldquo;todo&amp;rdquo;
)
}
onResult(list)
}
}&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Update Status (🔥 KEY PART)
fun updateStatus(id: String, newStatus: String) {
db.collection(&amp;ldquo;upazila_progress&amp;rdquo;)
.document(id)
.update(&amp;ldquo;status&amp;rdquo;, newStatus)
}&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;👉 This is what replaces Google Sheets editing.&lt;/p&gt;
&lt;ol start="4"&gt;
&lt;li&gt;Simple UI (XML idea)
&lt;Button
android:text="Mark Done"
android:onClick="markDone"/&gt;
fun markDone() {
updateStatus(upazilaId, &amp;ldquo;done&amp;rdquo;)
}&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;🔄 STEP 5: Real-Time Sync (Important Upgrade)&lt;/p&gt;
&lt;p&gt;Instead of getDocs(), use listener:&lt;/p&gt;
&lt;p&gt;Web + Android both
onSnapshot(collection(db, &amp;ldquo;upazila_progress&amp;rdquo;), (snapshot) =&amp;gt; {
// auto update map
});&lt;/p&gt;
&lt;p&gt;👉 Now:
✔ Android change → instantly updates web map
✔ No refresh needed&lt;/p&gt;
&lt;p&gt;📊 STEP 6: Dashboard Logic (Same as Web)&lt;/p&gt;
&lt;p&gt;Count status:&lt;/p&gt;
&lt;p&gt;val done = list.count { it.status == &amp;ldquo;done&amp;rdquo; }
val ongoing = list.count { it.status == &amp;ldquo;ongoing&amp;rdquo; }
val todo = list.count { it.status == &amp;ldquo;todo&amp;rdquo; }&lt;/p&gt;
&lt;p&gt;🎯 FINAL RESULT
Android App&lt;/p&gt;
&lt;p&gt;✔ Change status
✔ View progress
✔ Control system&lt;/p&gt;
&lt;p&gt;Web App&lt;/p&gt;
&lt;p&gt;✔ Map auto-updates
✔ No Google Sheets
✔ Real-time sync&lt;/p&gt;
&lt;p&gt;🚀 OPTIONAL ADVANCED FEATURES&lt;/p&gt;
&lt;p&gt;If you want next-level:&lt;/p&gt;
&lt;p&gt;🔐 Login system (Admin only)
📍 GPS tagging per update
📸 Upload field images
📶 Offline sync (Firestore supports)
📊 Analytics dashboard&lt;/p&gt;
&lt;p&gt;⚠️ Important Advice&lt;/p&gt;
&lt;p&gt;👉 Do NOT keep Google Sheets now
👉 Firebase = faster + scalable
👉 Your current map code can stay mostly same&lt;/p&gt;
&lt;p&gt;🧱 STEP 1: Add Firebase to Your Project&lt;/p&gt;
&lt;p&gt;Go to: &lt;a href="https://console.firebase.google.com" target="_blank" rel="noopener"&gt;https://console.firebase.google.com&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;→ Create project: landzoning&lt;/p&gt;
&lt;p&gt;Then:&lt;/p&gt;
&lt;p&gt;Enable:
✅ Firestore Database
✅ (Optional) Authentication later&lt;/p&gt;
&lt;p&gt;🔑 Get Config&lt;/p&gt;
&lt;p&gt;You’ll get something like:&lt;/p&gt;
&lt;p&gt;const firebaseConfig = {
apiKey: &amp;ldquo;XXXX&amp;rdquo;,
authDomain: &amp;ldquo;XXXX&amp;rdquo;,
projectId: &amp;ldquo;XXXX&amp;rdquo;,
};&lt;/p&gt;
&lt;p&gt;📦 STEP 2: Modify Your GitHub Code&lt;/p&gt;
&lt;p&gt;In your repo
👉 Landzoning-main&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;Install Firebase
npm install firebase&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Create New File
📁 /src/firebase.js
import { initializeApp } from &amp;ldquo;firebase/app&amp;rdquo;;
import { getFirestore } from &amp;ldquo;firebase/firestore&amp;rdquo;;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;const firebaseConfig = {
apiKey: &amp;ldquo;YOUR_KEY&amp;rdquo;,
authDomain: &amp;ldquo;YOUR_DOMAIN&amp;rdquo;,
projectId: &amp;ldquo;YOUR_PROJECT_ID&amp;rdquo;,
};&lt;/p&gt;
&lt;p&gt;const app = initializeApp(firebaseConfig);
export const db = getFirestore(app);&lt;/p&gt;
&lt;p&gt;🔁 STEP 3: Replace Google Sheet Logic&lt;/p&gt;
&lt;p&gt;Find your current file where you load Excel/Sheet data
(Probably something like fetchData.js, App.js, or map.js)&lt;/p&gt;
&lt;p&gt;❌ REMOVE (Old)
// Google Sheet / XLSX loading
fetch(&amp;ldquo;bdupazila.xlsx&amp;rdquo;)&lt;/p&gt;
&lt;p&gt;✅ ADD (New Firebase Fetch)
import { collection, onSnapshot } from &amp;ldquo;firebase/firestore&amp;rdquo;;
import { db } from &amp;ldquo;./firebase&amp;rdquo;;&lt;/p&gt;
&lt;p&gt;export function listenToUpazilaData(callback) {
const unsub = onSnapshot(collection(db, &amp;ldquo;upazila_progress&amp;rdquo;), (snapshot) =&amp;gt; {
const data = snapshot.docs.map(doc =&amp;gt; ({
id: doc.id,
&amp;hellip;doc.data()
}));
callback(data);
});&lt;/p&gt;
&lt;p&gt;return unsub;
}&lt;/p&gt;
&lt;p&gt;🗺 STEP 4: Connect with Your Map&lt;/p&gt;
&lt;p&gt;Where you currently update map colors:&lt;/p&gt;
&lt;p&gt;Replace your data source with:&lt;/p&gt;
&lt;p&gt;listenToUpazilaData((data) =&amp;gt; {
updateMap(data); // your existing function
updateStats(data); // your dashboard logic
});&lt;/p&gt;
&lt;p&gt;🎨 STEP 5: Keep Your Map Styling (NO CHANGE)&lt;/p&gt;
&lt;p&gt;Your existing:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Leaflet map&lt;/li&gt;
&lt;li&gt;GeoJSON boundaries&lt;/li&gt;
&lt;li&gt;Color logic&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;👉 KEEP EVERYTHING SAME
👉 Only change data source&lt;/p&gt;
&lt;p&gt;📊 STEP 6: Status Color Mapping (Ensure This)&lt;/p&gt;
&lt;p&gt;function getColor(status) {
switch (status) {
case &amp;ldquo;done&amp;rdquo;:
return &amp;ldquo;#22c55e&amp;rdquo;; // green
case &amp;ldquo;ongoing&amp;rdquo;:
return &amp;ldquo;#facc15&amp;rdquo;; // yellow
default:
return &amp;ldquo;#9ca3af&amp;rdquo;; // gray
}
}&lt;/p&gt;
&lt;p&gt;🧪 STEP 7: Upload Initial Data to Firebase&lt;/p&gt;
&lt;p&gt;Go to Firestore → Collection: upazila_progress&lt;/p&gt;
&lt;p&gt;Add documents manually OR use script:&lt;/p&gt;
&lt;p&gt;import { collection, addDoc } from &amp;ldquo;firebase/firestore&amp;rdquo;;&lt;/p&gt;
&lt;p&gt;const data = [
{ upazila: &amp;ldquo;Kaliganj&amp;rdquo;, status: &amp;ldquo;done&amp;rdquo; },
];&lt;/p&gt;
&lt;p&gt;data.forEach(async (item) =&amp;gt; {
await addDoc(collection(db, &amp;ldquo;upazila_progress&amp;rdquo;), item);
});
🔄 RESULT
Now your system becomes:
Android App → Firebase → Web Map (Auto Update)&lt;/p&gt;
&lt;p&gt;✔ No refresh needed
✔ Real-time updates
✔ Centralized control&lt;/p&gt;
&lt;p&gt;📱 NEXT (Android Integration)&lt;/p&gt;
&lt;p&gt;Your Android app will:&lt;/p&gt;
&lt;p&gt;db.collection(&amp;ldquo;upazila_progress&amp;rdquo;)
.document(id)
.update(&amp;ldquo;status&amp;rdquo;, &amp;ldquo;done&amp;rdquo;)&lt;/p&gt;
&lt;p&gt;👉 Web updates instantly 🔥&lt;/p&gt;
&lt;p&gt;🚀 BONUS: Performance Upgrade&lt;/p&gt;
&lt;p&gt;Use indexing:&lt;/p&gt;
&lt;p&gt;Firestore → Indexes → Add:&lt;/p&gt;
&lt;p&gt;status ASC
district ASC
⚠️ Common Mistakes&lt;/p&gt;
&lt;p&gt;❌ Using getDocs() (not realtime)
✅ Use onSnapshot()&lt;/p&gt;
&lt;p&gt;❌ Keeping Excel logic
✅ Fully remove it&lt;/p&gt;</description></item></channel></rss>