device management features, settings module and contact sync

Device management:
  - Activity meter with steps charts and history
  - Apps usage with daily breakdown and top apps
  - Health monitoring (heart rate, oxygen, blood pressure)
  - Scheduled activities with timeline and CRUD
  - Contacts sync to device via contact-lists
  - Locate device, rewards refactor

  Settings (new module):
  - Block phone
  - SOS contacts
  - WiFi networks
  - Alarm refactor with full CRUD
  - Settings menu with feature stubs

  Account:
  - Personal data and account settings refactor

  Shared:
  - 100+ i18n keys in 6 languages
  - New routes in app_router
  - WeekDayChips, TimeRangeSelector shared widgets
  - Legacy dashboard shell simplified
This commit is contained in:
2026-03-16 08:37:52 +01:00
parent ec4e42b408
commit 440bbcac66
352 changed files with 27012 additions and 3898 deletions

View File

@@ -4,6 +4,7 @@
<uses-permission android:name="android.permission.CAMERA" />
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
<uses-permission android:name="android.permission.USE_BIOMETRIC" />
<uses-permission android:name="android.permission.READ_CONTACTS" />
<application
android:label="@string/app_name"

View File

@@ -1,3 +1,6 @@
org.gradle.jvmargs=-Xmx8G -XX:MaxMetaspaceSize=4G -XX:ReservedCodeCacheSize=512m -XX:+HeapDumpOnOutOfMemoryError
android.useAndroidX=true
android.enableJetifier=true
# permission_handler: enable contacts permission
PERMISSION_CONTACTS=1

View File

@@ -47,6 +47,8 @@
<true/>
<key>UIStatusBarHidden</key>
<true/>
<key>NSContactsUsageDescription</key>
<string>Necesitamos acceso a tus contactos para seleccionar números de teléfono.</string>
<key>NSCameraUsageDescription</key>
<string>Necesitamos la cámara para escanear códigos QR</string>
<key>NSLocationWhenInUseUsageDescription</key>

View File

@@ -26,7 +26,7 @@ late final GoRouter appRouter;
void configureAppRouter() {
appRouter = GoRouter(
navigatorKey: rootNavigatorKey,
initialLocation: AppRoutes.controlPanel,
initialLocation: AppRoutes.onboarding,
debugLogDiagnostics: true,
routes: [
GoRoute(
@@ -94,10 +94,27 @@ void configureAppRouter() {
name: 'device_management',
pageBuilder: DeviceManagementBuilder().buildPage,
routes: [
GoRoute(
path: 'scheduled_activities',
name: 'scheduled_activities',
pageBuilder: const ScheduledActivitiesBuilder().buildPage,
),
GoRoute(
path: 'contacts',
name: 'contacts',
pageBuilder: ContactsBuilder().buildPage,
pageBuilder: const ContactsBuilder().buildPage,
routes: [
GoRoute(
path: 'edit/:contactId',
name: 'edit_contact',
pageBuilder: const EditContactBuilder().buildPage,
),
],
),
GoRoute(
path: 'health',
name: 'health',
pageBuilder: const HealthBuilder().buildPage,
),
GoRoute(
path: 'remote_connection',
@@ -114,6 +131,16 @@ void configureAppRouter() {
name: 'rewards',
pageBuilder: RewardsBuilder().buildPage,
),
GoRoute(
path: 'activity_meter',
name: 'activity_meter',
pageBuilder: const ActivityMeterBuilder().buildPage,
),
GoRoute(
path: 'apps_use',
name: 'apps_use',
pageBuilder: const AppsUseBuilder().buildPage,
),
],
),
],
@@ -131,7 +158,7 @@ void configureAppRouter() {
StatefulShellBranch(
routes: [
GoRoute(
path: '${ AppRoutes.legacyDashboard}/chat',
path: '${AppRoutes.legacyDashboard}/chat',
name: 'legacy_chat',
pageBuilder: (context, state) => MaterialPage<void>(
key: state.pageKey,
@@ -150,80 +177,80 @@ void configureAppRouter() {
pageBuilder: SettingsBuilder().buildPage,
routes: [
GoRoute(
path: AppRoutes.alarm,
path: 'alarm',
name: 'alarm',
pageBuilder: AlarmBuilder().buildPage,
),
/*GoRoute (
path: AppRoutes.appStore,
name: 'app_store',
// pageBuilder: AppStoreBuilder().buildPage,
),
GoRoute (
path: AppRoutes.battery,
name: 'battery',
// pageBuilder: BatteryBuilder().buildPage,
),
GoRoute (
path: AppRoutes.blockPhone,
name: 'block_phone',
// pageBuilder: BlockPhoneBuilder().buildPage,
),
GoRoute (
path: AppRoutes.disableFunctions,
name: 'disable_functions',
// pageBuilder: DisableFunctionsBuilder().buildPage,
),
GoRoute (
path: AppRoutes.language,
name: 'language',
// pageBuilder: LanguageBuilder().buildPage,
),
GoRoute (
path: AppRoutes.legacyNotifications,
name: 'legacy_notifications',
// pageBuilder: LegacyNotificationsBuilder().buildPage,
),*/
GoRoute (
path: AppRoutes.remoteManagement,
GoRoute(
path: 'remote_management',
name: 'remote_management',
pageBuilder: RemoteManagementBuilder().buildPage,
),
/*GoRoute (
path: AppRoutes.remoteOnOff,
name: 'remote_on_off',
// pageBuilder: RemoteOnOffBuilder().buildPage,
),
GoRoute (
path: AppRoutes.smsAlert,
name: 'sms_alert',
// pageBuilder: SmsAlertBuilder().buildPage,
),*/
GoRoute (
path: AppRoutes.sosContacts,
GoRoute(
path: 'sos_agenda',
name: 'sos_agenda',
pageBuilder: SosContactsBuilder().buildPage,
),
GoRoute (
path: AppRoutes.sound,
GoRoute(
path: 'sound',
name: 'sound',
pageBuilder: SoundBuilder().buildPage,
),
/*GoRoute (
path: AppRoutes.syncClock,
GoRoute(
path: 'sync_clock',
name: 'sync_clock',
// pageBuilder: SyncClockBuilder().buildPage,
pageBuilder: SyncClockBuilder().buildPage,
),
GoRoute (
path: AppRoutes.timezone,
GoRoute(
path: 'app_store',
name: 'app_store',
pageBuilder: AppStoreBuilder().buildPage,
),
GoRoute(
path: 'battery',
name: 'battery',
pageBuilder: BatteryBuilder().buildPage,
),
GoRoute(
path: 'block_phone',
name: 'block_phone',
pageBuilder: BlockPhoneBuilder().buildPage,
),
GoRoute(
path: 'disable_functions',
name: 'disable_functions',
pageBuilder: DisableFunctionsBuilder().buildPage,
),
GoRoute(
path: 'language',
name: 'language',
pageBuilder: LanguageBuilder().buildPage,
),
GoRoute(
path: 'legacy_notifications',
name: 'legacy_notifications',
pageBuilder: LegacyNotificationsBuilder().buildPage,
),
GoRoute(
path: 'remote_on_off',
name: 'remote_on_off',
pageBuilder: RemoteOnOffBuilder().buildPage,
),
GoRoute(
path: 'sms_alert',
name: 'sms_alert',
pageBuilder: SmsAlertBuilder().buildPage,
),
GoRoute(
path: 'timezone',
name: 'timezone',
// pageBuilder: TimezoneBuilder().buildPage,
pageBuilder: TimezoneBuilder().buildPage,
),
GoRoute (
path: AppRoutes.wifiSettings,
GoRoute(
path: 'wifi_settings',
name: 'wifi_settings',
// pageBuilder: WifiSettingsBuilder().buildPage,
),*/
pageBuilder: WifiSettingsBuilder().buildPage,
),
],
),
],

View File

@@ -406,6 +406,14 @@ packages:
description: flutter
source: sdk
version: "0.0.0"
flutter_contacts:
dependency: transitive
description:
name: flutter_contacts
sha256: "388d32cd33f16640ee169570128c933b45f3259bddbfae7a100bb49e5ffea9ae"
url: "https://pub.dev"
source: hosted
version: "1.1.9+2"
flutter_launcher_icons:
dependency: "direct dev"
description:

View File

@@ -43,7 +43,7 @@ dependency_overrides:
sca_treezor:
path: ../../packages/sca_treezor
settings:
path: ..\\..\\modules\\legacy\\modules\\settings
path: ../../modules/legacy/modules/settings
sf_infrastructure:
path: ../../packages/sf_infrastructure
sf_localizations: