Android-Flutter Hybrid App Development
Budget: ₹12,500 – ₹37,500 INR
an Android app that lets users view and edit a “device identity” profile (IMEIs, SIM operator, build/device fields, etc.). We want to move the UI to Flutter while keeping Android-specific logic in Kotlin via Platform Channels (preferably Pigeon).
You’ll own the Flutter UI for the App Detail screen and the Android hooks that power it.
Core deliverables
App Detail Screen (Flutter)
IMEI card
Shows IMEI 1 and IMEI 2
Actions: Change (dialog with validation: 15 digits) and Refresh
Toggle enable/disable (state only; no system writes)
SIM Operator card
Shows: Country, Operator, MCC/MNC
Actions: Change (modal)
Lock Country toggle
Two dropdowns: Country, then Operator (filtered by country)
MCC/MNC auto-fills from selected operator
Refresh respects “Lock Country”
Device card
Shows: Manufacturer, Model, Product, Android, Fingerprint
Action: Change opens a full-height sheet with:
Search bar
Virtualized list sourced from a local assets/devices.txt
Selecting a row fills the 5 fields
Bottom bar: only “Import profile” and “+ Create profile” buttons (remove any Home/Apps/Profile/Settings nav in this screen)
Data source: devices.txt (asset)
Text file (UTF-8), one device per line, fields separated by ~~:
<Title>~~<BrandLabel>~~<brand>~~<model>~~<product>~~<device:android>~~<buildId>~~<buildNumber>~~<securityPatch?>
Example:
Asus ROG Phone 3 ZS661KS~~Asus~~asus~~ZS661KS~~WW_I003D~~ASUS_I003_1:10~~QKQ1.200419.002~~17.0823.2012.122-0~~2020-12-01
You’ll parse this in Dart, build filterable models, and bind to the Device picker.
Android native hooks (Kotlin)
Create a small Kotlin plugin (prefer Pigeon over raw MethodChannel) exposing:
generateImeis() → returns (imei1, imei2) (simple pseudo-random)
randomSim(lockCountry: bool) → returns { country, operator, mcc, mnc }
androidFingerprint() → returns Build.FINGERPRINT
(Optional) saveSim() to persist chosen SIM profile (SharedPreferences/DataStore)
Wire plugin to Flutter, provide DI-friendly wrapper on the Dart side.
State management & UX polish
Reasonable state management (Riverpod or Bloc—your choice, justify in README)
Input validation (IMEI 15 digits, safe defaults)
Smooth search in Device picker (debounce, case-insensitive)
Material 3 look & feel
Tech stack
Flutter (stable channel), Dart null-safe
Kotlin (Android), Pigeon or MethodChannel (Pigeon preferred)
Min Android SDK 24+ (configurable)
Build system: Gradle / AGP (current stable)
What we provide
The current Android project context and UI references
The initial devices.txt list (you’ll add it to Flutter assets/)
Field definitions and expected behavior
You’ll own the Flutter UI for the App Detail screen and the Android hooks that power it.
Core deliverables
App Detail Screen (Flutter)
IMEI card
Shows IMEI 1 and IMEI 2
Actions: Change (dialog with validation: 15 digits) and Refresh
Toggle enable/disable (state only; no system writes)
SIM Operator card
Shows: Country, Operator, MCC/MNC
Actions: Change (modal)
Lock Country toggle
Two dropdowns: Country, then Operator (filtered by country)
MCC/MNC auto-fills from selected operator
Refresh respects “Lock Country”
Device card
Shows: Manufacturer, Model, Product, Android, Fingerprint
Action: Change opens a full-height sheet with:
Search bar
Virtualized list sourced from a local assets/devices.txt
Selecting a row fills the 5 fields
Bottom bar: only “Import profile” and “+ Create profile” buttons (remove any Home/Apps/Profile/Settings nav in this screen)
Data source: devices.txt (asset)
Text file (UTF-8), one device per line, fields separated by ~~:
<Title>~~<BrandLabel>~~<brand>~~<model>~~<product>~~<device:android>~~<buildId>~~<buildNumber>~~<securityPatch?>
Example:
Asus ROG Phone 3 ZS661KS~~Asus~~asus~~ZS661KS~~WW_I003D~~ASUS_I003_1:10~~QKQ1.200419.002~~17.0823.2012.122-0~~2020-12-01
You’ll parse this in Dart, build filterable models, and bind to the Device picker.
Android native hooks (Kotlin)
Create a small Kotlin plugin (prefer Pigeon over raw MethodChannel) exposing:
generateImeis() → returns (imei1, imei2) (simple pseudo-random)
randomSim(lockCountry: bool) → returns { country, operator, mcc, mnc }
androidFingerprint() → returns Build.FINGERPRINT
(Optional) saveSim() to persist chosen SIM profile (SharedPreferences/DataStore)
Wire plugin to Flutter, provide DI-friendly wrapper on the Dart side.
State management & UX polish
Reasonable state management (Riverpod or Bloc—your choice, justify in README)
Input validation (IMEI 15 digits, safe defaults)
Smooth search in Device picker (debounce, case-insensitive)
Material 3 look & feel
Tech stack
Flutter (stable channel), Dart null-safe
Kotlin (Android), Pigeon or MethodChannel (Pigeon preferred)
Min Android SDK 24+ (configurable)
Build system: Gradle / AGP (current stable)
What we provide
The current Android project context and UI references
The initial devices.txt list (you’ll add it to Flutter assets/)
Field definitions and expected behavior