diff --git a/.gitignore b/.gitignore
index 7f8da81..523286f 100644
--- a/.gitignore
+++ b/.gitignore
@@ -62,6 +62,7 @@ swarm_total.json
# ── Internal docs (not for public repo) ────────────────────────────────────
AGENTS.md
+FRONTEND_POLISH_REVIEW.md
RUNNING.md
SERVER_DEPLOYMENT.md
SERVER_NOTES.md
diff --git a/android/app/src/main/res/drawable-hdpi/launch_image.png b/android/app/src/main/res/drawable-hdpi/launch_image.png
index e9c791c..f4fa23c 100644
Binary files a/android/app/src/main/res/drawable-hdpi/launch_image.png and b/android/app/src/main/res/drawable-hdpi/launch_image.png differ
diff --git a/android/app/src/main/res/drawable-mdpi/launch_image.png b/android/app/src/main/res/drawable-mdpi/launch_image.png
index 99dcaf0..15701c6 100644
Binary files a/android/app/src/main/res/drawable-mdpi/launch_image.png and b/android/app/src/main/res/drawable-mdpi/launch_image.png differ
diff --git a/android/app/src/main/res/drawable-xhdpi/launch_image.png b/android/app/src/main/res/drawable-xhdpi/launch_image.png
index 1ab5109..67dcd13 100644
Binary files a/android/app/src/main/res/drawable-xhdpi/launch_image.png and b/android/app/src/main/res/drawable-xhdpi/launch_image.png differ
diff --git a/android/app/src/main/res/drawable-xxhdpi/launch_image.png b/android/app/src/main/res/drawable-xxhdpi/launch_image.png
index 587e12c..04695c5 100644
Binary files a/android/app/src/main/res/drawable-xxhdpi/launch_image.png and b/android/app/src/main/res/drawable-xxhdpi/launch_image.png differ
diff --git a/android/app/src/main/res/drawable-xxxhdpi/launch_image.png b/android/app/src/main/res/drawable-xxxhdpi/launch_image.png
index 5a9c569..ca85ba4 100644
Binary files a/android/app/src/main/res/drawable-xxxhdpi/launch_image.png and b/android/app/src/main/res/drawable-xxxhdpi/launch_image.png differ
diff --git a/android/app/src/main/res/values/colors.xml b/android/app/src/main/res/values/colors.xml
index 94a8db0..5d7ae5c 100644
--- a/android/app/src/main/res/values/colors.xml
+++ b/android/app/src/main/res/values/colors.xml
@@ -1,4 +1,4 @@
- #0d1017
+ #0D1117
diff --git a/lib/components/sidebar_drawer.dart b/lib/components/sidebar_drawer.dart
index 0923315..9c7da76 100644
--- a/lib/components/sidebar_drawer.dart
+++ b/lib/components/sidebar_drawer.dart
@@ -1,4 +1,5 @@
import 'package:flutter/material.dart';
+import 'package:package_info_plus/package_info_plus.dart';
import 'package:revoltvpn/logic/app_colors.dart';
import 'package:revoltvpn/components/sidebar_contents/gdpr_button.dart';
import 'package:revoltvpn/components/sidebar_contents/privacy_policy_button.dart';
@@ -6,11 +7,35 @@ import 'package:revoltvpn/components/sidebar_contents/info_button.dart';
import 'package:revoltvpn/components/sidebar_contents/discord_link_button.dart';
import 'package:revoltvpn/components/sidebar_contents/website_button.dart';
import 'package:revoltvpn/logic/updater.dart';
-import 'package:revoltvpn/main.dart';
-class SidebarDrawer extends StatelessWidget {
+class SidebarDrawer extends StatefulWidget {
const SidebarDrawer({super.key});
+ @override
+ State createState() => _SidebarDrawerState();
+}
+
+class _SidebarDrawerState extends State {
+ String _version = '';
+
+ @override
+ void initState() {
+ super.initState();
+ _loadVersion();
+ }
+
+ Future _loadVersion() async {
+ try {
+ final info = await PackageInfo.fromPlatform();
+ debugPrint('[Sidebar] PackageInfo version: ${info.version} '
+ '(build: ${info.buildNumber})');
+ if (mounted) setState(() => _version = info.version);
+ } catch (e) {
+ debugPrint('[Sidebar] PackageInfo failed: $e');
+ if (mounted) setState(() => _version = '?.?.?');
+ }
+ }
+
@override
Widget build(BuildContext context) {
return Drawer(
@@ -109,7 +134,7 @@ class SidebarDrawer extends StatelessWidget {
Padding(
padding: const EdgeInsets.all(20),
- child: Text('ReVoltVPN · v${ReVoltApp.appVersion}', textAlign: TextAlign.center,
+ child: Text('ReVoltVPN · v$_version', textAlign: TextAlign.center,
style: const TextStyle(color: AppColors.slate, fontSize: 11, letterSpacing: 1),
),
),
diff --git a/lib/components/status_bar.dart b/lib/components/status_bar.dart
index 990b65c..4acce4d 100644
--- a/lib/components/status_bar.dart
+++ b/lib/components/status_bar.dart
@@ -26,14 +26,18 @@ class StatusBar extends StatelessWidget {
),
child: Row(
children: [
- // Connection status
+ // Connection status — wrapped in Flexible to prevent overflow
+ // on narrow screens (the Row must fit both the status text
+ // and the online dot without RenderFlex errors).
if (isConnected) ...[
Image.asset('assets/finland_flag_256.png', width: 20, height: 20),
const SizedBox(width: 8),
- const Text('Helsinki, Finland', style: TextStyle(
- color: AppColors.accent, fontWeight: FontWeight.w600,
- fontSize: 13, letterSpacing: 0.5,
- )),
+ const Flexible(
+ child: Text('Helsinki, Finland', style: TextStyle(
+ color: AppColors.accent, fontWeight: FontWeight.w600,
+ fontSize: 13, letterSpacing: 0.5,
+ ), overflow: TextOverflow.ellipsis),
+ ),
] else ...[
Icon(
isConnecting ? Icons.sync : Icons.shield_outlined,
@@ -41,11 +45,14 @@ class StatusBar extends StatelessWidget {
color: isConnecting ? AppColors.accent : AppColors.slate70,
),
const SizedBox(width: 8),
- Text(
- vpn.statusMessage.toUpperCase(),
- style: TextStyle(
- color: isConnecting ? AppColors.accent : AppColors.slate70,
- fontWeight: FontWeight.w600, fontSize: 13, letterSpacing: 1,
+ Flexible(
+ child: Text(
+ vpn.statusMessage.toUpperCase(),
+ style: TextStyle(
+ color: isConnecting ? AppColors.accent : AppColors.slate70,
+ fontWeight: FontWeight.w600, fontSize: 13, letterSpacing: 1,
+ ),
+ overflow: TextOverflow.ellipsis,
),
),
],
diff --git a/lib/logic/updater.dart b/lib/logic/updater.dart
index 233c8ee..7d711db 100644
--- a/lib/logic/updater.dart
+++ b/lib/logic/updater.dart
@@ -2,6 +2,7 @@ import 'dart:convert';
import 'dart:io';
import 'package:flutter/foundation.dart';
import 'package:flutter/material.dart';
+import 'package:flutter/services.dart';
import 'package:http/http.dart' as http;
import 'package:package_info_plus/package_info_plus.dart';
import 'package:url_launcher/url_launcher.dart';
@@ -115,7 +116,8 @@ class Updater {
}
static Future check(BuildContext context) async {
- final localVersion = ReVoltApp.appVersion;
+ final info = await PackageInfo.fromPlatform();
+ final localVersion = info.version;
if (localVersion.isEmpty) {
_showSnackBar(context, 'Could not determine app version',
isError: true);
@@ -176,7 +178,7 @@ class Updater {
content: Row(
children: [
Icon(isError ? Icons.error_outline : Icons.check_circle,
- color: isError ? AppColors.red400 : AppColors.green400,
+ color: isError ? AppColors.red : AppColors.green,
size: 18),
const SizedBox(width: 8),
Text(message),