Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 4 additions & 0 deletions android/gradle.properties
Original file line number Diff line number Diff line change
@@ -1,2 +1,6 @@
org.gradle.jvmargs=-Xmx8G -XX:MaxMetaspaceSize=4G -XX:ReservedCodeCacheSize=512m -XX:+HeapDumpOnOutOfMemoryError
android.useAndroidX=true
# This builtInKotlin flag was added automatically by Flutter migrator
android.builtInKotlin=false
# This newDsl flag was added automatically by Flutter migrator
android.newDsl=false
Binary file removed assets/Snapshot_20260722234539.jpg
Binary file not shown.
Binary file added assets/Snapshot_202608072226134.jpg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file modified assets/logo.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
43 changes: 43 additions & 0 deletions lib/controllers/lg_controller.dart
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@ import '../data/rice_states.dart';
import '../data/irrigation_data.dart';
import '../models/state_data.dart';
import '../data/crop_cycles.dart';
import '../data/narration_scripts.dart';

class LGController {
LGController({
Expand Down Expand Up @@ -495,6 +496,42 @@ class LGController {
/// no ScreenOverlay sizing, no aspect-ratio stretching.
/// Sends a pre-built dashboard balloon KML to the right slave screen.
int _stateYield(StateData s) => s.yield.toInt();

String? _irrigationNarrationFor(StateData s) {
final irr = IrrigationData.stateWise[s.name];
if (irr == null) return null;
return '${s.name} receives ${s.rainfall.toInt()} mm of annual rainfall, '
'with ${s.irrigatedPercent}% of rice area irrigated. '
'Main sources: tubewells ${irr['tubewell']}%, canals ${irr['canal']}%.';
}

String? _narrationFor(String stateName) {
switch (stateName) {
case 'West Bengal':
return NarrationScripts.westBengal;
case 'Uttar Pradesh':
return NarrationScripts.uttarPradesh;
case 'Punjab':
return NarrationScripts.punjab;
case 'Andhra Pradesh':
return NarrationScripts.andhraPradesh;
case 'Tamil Nadu':
return NarrationScripts.tamilNadu;
case 'Odisha':
return NarrationScripts.odisha;
case 'Bihar':
return NarrationScripts.bihar;
case 'Chhattisgarh':
return NarrationScripts.chhattisgarh;
case 'Assam':
return NarrationScripts.assam;
case 'Jharkhand':
return NarrationScripts.jharkhand;
default:
return null;
}
}

Future<void> showDashboardBalloon(String balloonKml) async {
if (!isConnected) return;
await sendKMLToSlave(lastScreen, balloonKml);
Expand All @@ -510,6 +547,7 @@ class LGController {
totalProduction: RiceStates.totalProduction,
totalArea: RiceStates.totalArea,
avgYield: RiceStates.averageYield,
narration: NarrationScripts.indiaOverview,
);

String balloon = national;
Expand Down Expand Up @@ -545,6 +583,7 @@ class LGController {
other: (irr['other'] as num).toDouble(),
lat: s.latitude,
lon: s.longitude,
narration: _irrigationNarrationFor(s),
);
} else {
balloon = kml.buildStateDashboard(
Expand All @@ -556,6 +595,7 @@ class LGController {
irrigatedPercent: s.irrigatedPercent,
lat: s.latitude,
lon: s.longitude,
narration: _narrationFor(s.name),
);
}
}
Expand Down Expand Up @@ -611,6 +651,7 @@ class LGController {
irrigatedPercent: s.irrigatedPercent,
lat: s.latitude,
lon: s.longitude,
narration: _narrationFor(s.name),
);
await sendKMLToSlave(lastScreen, balloon);
}
Expand All @@ -629,6 +670,7 @@ class LGController {
other: (irr['other'] as num).toDouble(),
lat: s.latitude,
lon: s.longitude,
narration: _irrigationNarrationFor(s),
);
await sendKMLToSlave(lastScreen, balloon);
}
Expand All @@ -641,6 +683,7 @@ class LGController {
totalProduction: RiceStates.totalProduction,
totalArea: RiceStates.totalArea,
avgYield: RiceStates.averageYield,
narration: NarrationScripts.indiaOverview,
);
await sendKMLToSlave(lastScreen, balloon);
}
Expand Down
69 changes: 62 additions & 7 deletions lib/main.dart
Original file line number Diff line number Diff line change
Expand Up @@ -8,10 +8,11 @@ import 'controllers/lg_controller.dart';
import 'screens/home_screen.dart';
import 'theme/app_theme.dart';
import 'screens/splash_screen.dart';
import 'screens/onboarding_screen.dart';

void main() async {
debugPrint(
'=== RICE FARM BUILD v6: lg1 + absolute-3D + compound-SSH + connect-purge ===',
'=== RICE FARM BUILD v9: voice toggle + irrigation orbit + dashboard narration + onboarding ===',
);
WidgetsFlutterBinding.ensureInitialized();

Expand Down Expand Up @@ -53,13 +54,67 @@ class MyApp extends StatelessWidget {
debugShowCheckedModeBanner: false,
title: 'LG Controller',
theme: AppTheme.theme,
home: SplashScreen(
nextScreen: HomeScreen(
sshController: sshController,
settingsController: settingsController,
lgController: lgController,
),
home: _StartupGate(
sshController: sshController,
settingsController: settingsController,
lgController: lgController,
),
);
}
}

class _StartupGate extends StatefulWidget {
final SSHController sshController;
final SettingsController settingsController;
final LGController lgController;

const _StartupGate({
required this.sshController,
required this.settingsController,
required this.lgController,
});

@override
State<_StartupGate> createState() => _StartupGateState();
}

class _StartupGateState extends State<_StartupGate> {
bool? _seenOnboarding;

@override
void initState() {
super.initState();
_check();
}

Future<void> _check() async {
// Always show onboarding on every launch (demo mode)
setState(() => _seenOnboarding = false);
}

@override
Widget build(BuildContext context) {
Widget home = SplashScreen(
nextScreen: HomeScreen(
sshController: widget.sshController,
settingsController: widget.settingsController,
lgController: widget.lgController,
),
);

if (_seenOnboarding == null) {
return const Scaffold(
backgroundColor: AppTheme.bgLight,
body: Center(child: CircularProgressIndicator()),
);
}

if (_seenOnboarding == false) {
return OnboardingScreen(
onDone: () => setState(() => _seenOnboarding = true),
);
}

return home;
}
}
39 changes: 39 additions & 0 deletions lib/screens/about_screen.dart
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
import 'package:flutter/material.dart';
import '../theme/app_theme.dart';
import 'onboarding_screen.dart';

class AboutScreen extends StatelessWidget {
const AboutScreen({super.key});
Expand Down Expand Up @@ -29,6 +30,8 @@ class AboutScreen extends StatelessWidget {
_buildDataSources(),
const SizedBox(height: 16),
_buildTechStack(),
const SizedBox(height: 16),
_buildReplayTourButton(context),
const SizedBox(height: 24),
_buildFooter(),
],
Expand Down Expand Up @@ -338,6 +341,42 @@ class AboutScreen extends StatelessWidget {
);
}

Widget _buildReplayTourButton(BuildContext context) {
return GestureDetector(
onTap: () => Navigator.push(
context,
MaterialPageRoute(
builder: (_) =>
OnboardingScreen(onDone: () => Navigator.pop(context)),
),
),
child: Container(
width: double.infinity,
padding: const EdgeInsets.symmetric(vertical: 14),
decoration: BoxDecoration(
color: AppTheme.purple.withOpacity(0.1),
borderRadius: BorderRadius.circular(14),
border: Border.all(color: AppTheme.purple.withOpacity(0.3)),
),
child: const Row(
mainAxisAlignment: MainAxisAlignment.center,
children: [
Icon(Icons.replay, color: AppTheme.purple, size: 20),
SizedBox(width: 8),
Text(
'Replay App Tour',
style: TextStyle(
color: AppTheme.purple,
fontSize: 15,
fontWeight: FontWeight.w600,
),
),
],
),
),
);
}

Widget _buildFooter() {
return const Column(
children: [
Expand Down
1 change: 1 addition & 0 deletions lib/screens/home_screen.dart
Original file line number Diff line number Diff line change
Expand Up @@ -259,6 +259,7 @@ class _HomeScreenState extends ConsumerState<HomeScreen> {
bgColor: AppTheme.blue,
onTap: () => _navigateTo(MapsScreen(lgController: widget.lgController)),
),

_MenuItem(
icon: Icons.info_outline,
title: 'About Project',
Expand Down
Loading