feat(do-not-disturb): add DND schedule feature with capabilities-driven UI

This commit is contained in:
2026-04-16 13:54:13 +02:00
parent 51a3979c03
commit 514daf9c7c
38 changed files with 5433 additions and 176 deletions

View File

@@ -70,6 +70,7 @@ class AppRoutes {
static const activityMeter = '$deviceManagement/activity_meter';
static const appsUse = '$deviceManagement/apps_use';
static const volumeControl = '$deviceManagement/volume_control';
static const doNotDisturb = '$deviceManagement/do_not_disturb';
static const callHistory = '$deviceManagement/call_history';
static const backgroundImage = '$deviceManagement/background_image';

View File

@@ -668,7 +668,8 @@
"errorActivityData": "Aktivitätsdaten konnten nicht geladen werden",
"errorPedometer": "Der Schrittzähler konnte nicht aktualisiert werden",
"errorContactsMin": "Das Gerät muss mindestens einen Kontakt haben",
"errorContactsMax": "Das Gerät kann nicht mehr als 10 Kontakte haben",
"errorContactsMax": "Maximale Kontaktanzahl für dieses Gerät erreicht",
"errorSosContactsMax": "Maximale SOS-Kontaktanzahl für dieses Gerät erreicht",
"customBackground": "Benutzerdefiniertes Hintergrundbild",
"backgroundImageDescription": "Legen Sie ein Foto als benutzerdefinierten Bildschirmschoner für das Gerät fest",
"backgroundImageTapToSelect": "Tippen Sie, um ein Foto auszuwählen",
@@ -773,6 +774,29 @@
"deviceSettings": "Einstellungen",
"disableFunctions": "Funktionen deaktivieren",
"doNotDisturb": "Nicht stören",
"doNotDisturbDescription": "Wenn aktiviert, werden alle Benachrichtigungen, Anrufe und Alarme auf der Uhr stummgeschaltet. Nur Anrufe von SOS-Kontakten werden zugelassen.",
"doNotDisturbStatusOn": "Aktiviert",
"doNotDisturbStatusOff": "Deaktiviert",
"doNotDisturbEnabled": "Nicht stören aktiviert",
"doNotDisturbDisabled": "Nicht stören deaktiviert",
"doNotDisturbError": "Fehler beim Ändern des Nicht-stören-Modus",
"doNotDisturbEmpty": "Keine Zeiträume konfiguriert",
"doNotDisturbAddPeriod": "Zeitraum hinzufügen",
"doNotDisturbEditPeriod": "Zeitraum bearbeiten",
"doNotDisturbMaxPeriods": "Maximal {max} Zeiträume erlaubt",
"doNotDisturbSave": "Änderungen speichern",
"doNotDisturbSaved": "Zeiträume gespeichert",
"doNotDisturbConfirm": "Bestätigen",
"doNotDisturbStart": "Beginn",
"doNotDisturbEnd": "Ende",
"doNotDisturbDays": "Wochentage",
"weekdayMonShort": "M",
"weekdayTueShort": "D",
"weekdayWedShort": "M",
"weekdayThuShort": "D",
"weekdayFriShort": "F",
"weekdaySatShort": "S",
"weekdaySunShort": "S",
"editDeviceTitle": "Gerät bearbeiten",
"enterEmail": "Geben Sie Ihre E-Mail ein",
"enterMessage": "Ihre Nachricht",

View File

@@ -531,6 +531,29 @@
"activityScheduleTitle": "Calendar",
"contactsAgendaTitle": "Contacts",
"doNotDisturb": "Do not disturb",
"doNotDisturbDescription": "When enabled, the watch will silence all notifications, calls, and alerts. Only SOS contacts calls will be allowed.",
"doNotDisturbStatusOn": "Enabled",
"doNotDisturbStatusOff": "Disabled",
"doNotDisturbEnabled": "Do not disturb enabled",
"doNotDisturbDisabled": "Do not disturb disabled",
"doNotDisturbError": "Error changing do not disturb mode",
"doNotDisturbEmpty": "No periods configured",
"doNotDisturbAddPeriod": "Add period",
"doNotDisturbEditPeriod": "Edit period",
"doNotDisturbMaxPeriods": "Maximum {max} periods allowed",
"doNotDisturbSave": "Save changes",
"doNotDisturbSaved": "Periods saved successfully",
"doNotDisturbConfirm": "Confirm",
"doNotDisturbStart": "Start",
"doNotDisturbEnd": "End",
"doNotDisturbDays": "Days of the week",
"weekdayMonShort": "M",
"weekdayTueShort": "T",
"weekdayWedShort": "W",
"weekdayThuShort": "T",
"weekdayFriShort": "F",
"weekdaySatShort": "S",
"weekdaySunShort": "S",
"videoCall": "Video call",
"healthTitle": "Health",
"healthEmpty": "No health data",
@@ -797,7 +820,8 @@
"errorActivityData": "Could not load activity data",
"errorPedometer": "Could not update pedometer",
"errorContactsMin": "The device must have at least one contact",
"errorContactsMax": "The device cannot have more than 10 contacts",
"errorContactsMax": "Maximum contacts reached for this device",
"errorSosContactsMax": "Maximum SOS contacts reached for this device",
"customBackground": "Custom background image",
"backgroundImageDescription": "Set a photo as a custom screensaver for the device",
"backgroundImageTapToSelect": "Tap to select a photo",

View File

@@ -532,6 +532,29 @@
"activityScheduleTitle": "Horario de actividades",
"contactsAgendaTitle": "Agenda",
"doNotDisturb": "No molestar",
"doNotDisturbDescription": "Cuando está activado, el reloj silenciará todas las notificaciones, llamadas y alertas. Solo se permitirán llamadas de contactos SOS.",
"doNotDisturbStatusOn": "Activado",
"doNotDisturbStatusOff": "Desactivado",
"doNotDisturbEnabled": "No molestar activado",
"doNotDisturbDisabled": "No molestar desactivado",
"doNotDisturbError": "Error al cambiar modo no molestar",
"doNotDisturbEmpty": "Sin periodos configurados",
"doNotDisturbAddPeriod": "Añadir periodo",
"doNotDisturbEditPeriod": "Editar periodo",
"doNotDisturbMaxPeriods": "Máximo {max} periodos permitidos",
"doNotDisturbSave": "Guardar cambios",
"doNotDisturbSaved": "Periodos guardados correctamente",
"doNotDisturbConfirm": "Confirmar",
"doNotDisturbStart": "Inicio",
"doNotDisturbEnd": "Fin",
"doNotDisturbDays": "Días de la semana",
"weekdayMonShort": "L",
"weekdayTueShort": "M",
"weekdayWedShort": "X",
"weekdayThuShort": "J",
"weekdayFriShort": "V",
"weekdaySatShort": "S",
"weekdaySunShort": "D",
"videoCall": "Video llamada",
"healthTitle": "Salud",
"healthEmpty": "Sin datos de salud",
@@ -798,7 +821,8 @@
"errorActivityData": "No se pudieron cargar los datos de actividad",
"errorPedometer": "No se pudo actualizar el podómetro",
"errorContactsMin": "El dispositivo debe tener al menos un contacto",
"errorContactsMax": "El dispositivo no puede tener más de 10 contactos",
"errorContactsMax": "Se ha alcanzado el máximo de contactos para este dispositivo",
"errorSosContactsMax": "Se ha alcanzado el máximo de contactos SOS para este dispositivo",
"customBackground": "Fondo de pantalla personalizado",
"backgroundImageDescription": "Configura una foto como protector de pantalla exclusivo para el dispositivo",
"backgroundImageTapToSelect": "Pulsa para seleccionar una foto",

View File

@@ -668,7 +668,8 @@
"errorActivityData": "Impossible de charger les données d'activité",
"errorPedometer": "Impossible de mettre à jour le podomètre",
"errorContactsMin": "L'appareil doit avoir au moins un contact",
"errorContactsMax": "L'appareil ne peut pas avoir plus de 10 contacts",
"errorContactsMax": "Nombre maximum de contacts atteint pour cet appareil",
"errorSosContactsMax": "Nombre maximum de contacts SOS atteint pour cet appareil",
"customBackground": "Image de fond personnalisée",
"backgroundImageDescription": "Définissez une photo comme écran de veille personnalisé pour l'appareil",
"backgroundImageTapToSelect": "Appuyez pour sélectionner une photo",
@@ -773,6 +774,29 @@
"deviceSettings": "Paramètres",
"disableFunctions": "Désactiver les fonctions",
"doNotDisturb": "Ne pas déranger",
"doNotDisturbDescription": "Lorsqu'il est activé, la montre désactivera toutes les notifications, appels et alertes. Seuls les appels des contacts SOS seront autorisés.",
"doNotDisturbStatusOn": "Activé",
"doNotDisturbStatusOff": "Désactivé",
"doNotDisturbEnabled": "Ne pas déranger activé",
"doNotDisturbDisabled": "Ne pas déranger désactivé",
"doNotDisturbError": "Erreur lors du changement du mode ne pas déranger",
"doNotDisturbEmpty": "Aucune période configurée",
"doNotDisturbAddPeriod": "Ajouter une période",
"doNotDisturbEditPeriod": "Modifier la période",
"doNotDisturbMaxPeriods": "Maximum {max} périodes autorisées",
"doNotDisturbSave": "Enregistrer",
"doNotDisturbSaved": "Périodes enregistrées",
"doNotDisturbConfirm": "Confirmer",
"doNotDisturbStart": "Début",
"doNotDisturbEnd": "Fin",
"doNotDisturbDays": "Jours de la semaine",
"weekdayMonShort": "L",
"weekdayTueShort": "M",
"weekdayWedShort": "M",
"weekdayThuShort": "J",
"weekdayFriShort": "V",
"weekdaySatShort": "S",
"weekdaySunShort": "D",
"editDeviceTitle": "Modifier l'appareil",
"enterEmail": "Entrez votre e-mail",
"enterMessage": "Votre message",

View File

@@ -668,7 +668,8 @@
"errorActivityData": "Impossibile caricare i dati di attività",
"errorPedometer": "Impossibile aggiornare il contapassi",
"errorContactsMin": "Il dispositivo deve avere almeno un contatto",
"errorContactsMax": "Il dispositivo non può avere più di 10 contatti",
"errorContactsMax": "Numero massimo di contatti raggiunto per questo dispositivo",
"errorSosContactsMax": "Numero massimo di contatti SOS raggiunto per questo dispositivo",
"customBackground": "Immagine di sfondo personalizzata",
"backgroundImageDescription": "Imposta una foto come screensaver personalizzato per il dispositivo",
"backgroundImageTapToSelect": "Tocca per selezionare una foto",
@@ -773,6 +774,29 @@
"deviceSettings": "Impostazioni",
"disableFunctions": "Disattiva funzioni",
"doNotDisturb": "Non disturbare",
"doNotDisturbDescription": "Quando attivato, l'orologio disattiverà tutte le notifiche, chiamate e avvisi. Saranno consentite solo le chiamate dai contatti SOS.",
"doNotDisturbStatusOn": "Attivato",
"doNotDisturbStatusOff": "Disattivato",
"doNotDisturbEnabled": "Non disturbare attivato",
"doNotDisturbDisabled": "Non disturbare disattivato",
"doNotDisturbError": "Errore nel cambiare la modalità non disturbare",
"doNotDisturbEmpty": "Nessun periodo configurato",
"doNotDisturbAddPeriod": "Aggiungi periodo",
"doNotDisturbEditPeriod": "Modifica periodo",
"doNotDisturbMaxPeriods": "Massimo {max} periodi consentiti",
"doNotDisturbSave": "Salva modifiche",
"doNotDisturbSaved": "Periodi salvati",
"doNotDisturbConfirm": "Conferma",
"doNotDisturbStart": "Inizio",
"doNotDisturbEnd": "Fine",
"doNotDisturbDays": "Giorni della settimana",
"weekdayMonShort": "L",
"weekdayTueShort": "M",
"weekdayWedShort": "M",
"weekdayThuShort": "G",
"weekdayFriShort": "V",
"weekdaySatShort": "S",
"weekdaySunShort": "D",
"editDeviceTitle": "Modifica dispositivo",
"enterEmail": "Inserisci la tua email",
"enterMessage": "Il tuo messaggio",

View File

@@ -668,7 +668,8 @@
"errorActivityData": "Não foi possível carregar os dados de atividade",
"errorPedometer": "Não foi possível atualizar o pedómetro",
"errorContactsMin": "O dispositivo deve ter pelo menos um contacto",
"errorContactsMax": "O dispositivo não pode ter mais de 10 contactos",
"errorContactsMax": "Número máximo de contactos atingido para este dispositivo",
"errorSosContactsMax": "Número máximo de contactos SOS atingido para este dispositivo",
"customBackground": "Imagem de fundo personalizada",
"backgroundImageDescription": "Defina uma foto como protetor de ecrã personalizado para o dispositivo",
"backgroundImageTapToSelect": "Toque para selecionar uma foto",
@@ -773,6 +774,29 @@
"deviceSettings": "Configurações",
"disableFunctions": "Desativar funções",
"doNotDisturb": "Não perturbe",
"doNotDisturbDescription": "Quando ativado, o relógio silenciará todas as notificações, chamadas e alertas. Apenas chamadas de contactos SOS serão permitidas.",
"doNotDisturbStatusOn": "Ativado",
"doNotDisturbStatusOff": "Desativado",
"doNotDisturbEnabled": "Não perturbe ativado",
"doNotDisturbDisabled": "Não perturbe desativado",
"doNotDisturbError": "Erro ao alterar o modo não perturbe",
"doNotDisturbEmpty": "Sem períodos configurados",
"doNotDisturbAddPeriod": "Adicionar período",
"doNotDisturbEditPeriod": "Editar período",
"doNotDisturbMaxPeriods": "Máximo {max} períodos permitidos",
"doNotDisturbSave": "Guardar alterações",
"doNotDisturbSaved": "Períodos guardados",
"doNotDisturbConfirm": "Confirmar",
"doNotDisturbStart": "Início",
"doNotDisturbEnd": "Fim",
"doNotDisturbDays": "Dias da semana",
"weekdayMonShort": "S",
"weekdayTueShort": "T",
"weekdayWedShort": "Q",
"weekdayThuShort": "Q",
"weekdayFriShort": "S",
"weekdaySatShort": "S",
"weekdaySunShort": "D",
"editDeviceTitle": "Editar dispositivo",
"enterEmail": "Insira seu e-mail",
"enterMessage": "Sua mensagem",

View File

@@ -317,6 +317,29 @@ class I18n {
static const String documentTypeNie = 'documentTypeNie';
static const String documentTypePassport = 'documentTypePassport';
static const String doNotDisturb = 'doNotDisturb';
static const String doNotDisturbDescription = 'doNotDisturbDescription';
static const String doNotDisturbStatusOn = 'doNotDisturbStatusOn';
static const String doNotDisturbStatusOff = 'doNotDisturbStatusOff';
static const String doNotDisturbEnabled = 'doNotDisturbEnabled';
static const String doNotDisturbDisabled = 'doNotDisturbDisabled';
static const String doNotDisturbError = 'doNotDisturbError';
static const String doNotDisturbEmpty = 'doNotDisturbEmpty';
static const String doNotDisturbAddPeriod = 'doNotDisturbAddPeriod';
static const String doNotDisturbEditPeriod = 'doNotDisturbEditPeriod';
static const String doNotDisturbMaxPeriods = 'doNotDisturbMaxPeriods';
static const String doNotDisturbSave = 'doNotDisturbSave';
static const String doNotDisturbSaved = 'doNotDisturbSaved';
static const String doNotDisturbConfirm = 'doNotDisturbConfirm';
static const String doNotDisturbStart = 'doNotDisturbStart';
static const String doNotDisturbEnd = 'doNotDisturbEnd';
static const String doNotDisturbDays = 'doNotDisturbDays';
static const String weekdayMonShort = 'weekdayMonShort';
static const String weekdayTueShort = 'weekdayTueShort';
static const String weekdayWedShort = 'weekdayWedShort';
static const String weekdayThuShort = 'weekdayThuShort';
static const String weekdayFriShort = 'weekdayFriShort';
static const String weekdaySatShort = 'weekdaySatShort';
static const String weekdaySunShort = 'weekdaySunShort';
static const String dontHaveAccount = 'dontHaveAccount';
static const String download = 'download';
static const String editAlarm = 'editAlarm';
@@ -350,6 +373,7 @@ class I18n {
static const String errorBirthDateRequired = 'errorBirthDateRequired';
static const String errorCall = 'errorCall';
static const String errorContactsMax = 'errorContactsMax';
static const String errorSosContactsMax = 'errorSosContactsMax';
static const String errorContactsMin = 'errorContactsMin';
static const String errorDisableFunctions = 'errorDisableFunctions';
static const String errorDocumentNumberRequired =

View File

@@ -18,6 +18,13 @@ abstract class DeviceCapabilitiesModel with _$DeviceCapabilitiesModel {
DeviceCapabilityTakepillsModel? takepills,
DeviceCapabilityOptionModel? location,
DeviceCapabilityCameraModel? camera,
DeviceCapabilityDoNotDisturbModel? doNotDisturbs,
DeviceCapabilityAlarmsModel? alarms,
DeviceCapabilityAppUsageModel? appUsageSchedules,
DeviceCapabilityEnabledModel? keyboard,
DeviceCapabilityEnabledModel? nightMode,
DeviceCapabilityEnabledModel? wifi,
DeviceCapabilityEnabledModel? deviceBackground,
}) = _DeviceCapabilitiesModel;
factory DeviceCapabilitiesModel.fromJson(Map<String, dynamic> json) =>
@@ -131,6 +138,39 @@ abstract class DeviceCapabilityCameraModel with _$DeviceCapabilityCameraModel {
_$DeviceCapabilityCameraModelFromJson(json);
}
@freezed
abstract class DeviceCapabilityDoNotDisturbModel with _$DeviceCapabilityDoNotDisturbModel {
const factory DeviceCapabilityDoNotDisturbModel({
@Default(4) int maxPeriods,
}) = _DeviceCapabilityDoNotDisturbModel;
factory DeviceCapabilityDoNotDisturbModel.fromJson(Map<String, dynamic> json) =>
_$DeviceCapabilityDoNotDisturbModelFromJson(json);
}
@freezed
abstract class DeviceCapabilityAlarmsModel
with _$DeviceCapabilityAlarmsModel {
const factory DeviceCapabilityAlarmsModel({
@Default(false) bool enabled,
@Default(3) int maxAlarms,
}) = _DeviceCapabilityAlarmsModel;
factory DeviceCapabilityAlarmsModel.fromJson(Map<String, dynamic> json) =>
_$DeviceCapabilityAlarmsModelFromJson(json);
}
@freezed
abstract class DeviceCapabilityAppUsageModel
with _$DeviceCapabilityAppUsageModel {
const factory DeviceCapabilityAppUsageModel({
@Default(3) int maxPeriods,
}) = _DeviceCapabilityAppUsageModel;
factory DeviceCapabilityAppUsageModel.fromJson(Map<String, dynamic> json) =>
_$DeviceCapabilityAppUsageModelFromJson(json);
}
extension DeviceCapabilitiesModelMapper on DeviceCapabilitiesModel {
DeviceCapabilitiesEntity toEntity() => DeviceCapabilitiesEntity(
heartbeats: heartbeats != null
@@ -198,5 +238,31 @@ extension DeviceCapabilitiesModelMapper on DeviceCapabilitiesModel {
enabled: camera!.enabled,
)
: null,
doNotDisturbs: doNotDisturbs != null
? DeviceCapabilityDoNotDisturbEntity(maxPeriods: doNotDisturbs!.maxPeriods)
: null,
alarms: alarms != null
? DeviceCapabilityAlarmsEntity(
enabled: alarms!.enabled,
maxAlarms: alarms!.maxAlarms,
)
: null,
appUsageSchedules: appUsageSchedules != null
? DeviceCapabilityAppUsageEntity(
maxPeriods: appUsageSchedules!.maxPeriods,
)
: null,
keyboard: keyboard != null
? DeviceCapabilityEnabledEntity(enabled: keyboard!.enabled)
: null,
nightMode: nightMode != null
? DeviceCapabilityEnabledEntity(enabled: nightMode!.enabled)
: null,
wifi: wifi != null
? DeviceCapabilityEnabledEntity(enabled: wifi!.enabled)
: null,
deviceBackground: deviceBackground != null
? DeviceCapabilityEnabledEntity(enabled: deviceBackground!.enabled)
: null,
);
}

View File

@@ -59,6 +59,41 @@ _DeviceCapabilitiesModel _$DeviceCapabilitiesModelFromJson(
: DeviceCapabilityCameraModel.fromJson(
json['camera'] as Map<String, dynamic>,
),
doNotDisturbs: json['doNotDisturbs'] == null
? null
: DeviceCapabilityDoNotDisturbModel.fromJson(
json['doNotDisturbs'] as Map<String, dynamic>,
),
alarms: json['alarms'] == null
? null
: DeviceCapabilityAlarmsModel.fromJson(
json['alarms'] as Map<String, dynamic>,
),
appUsageSchedules: json['appUsageSchedules'] == null
? null
: DeviceCapabilityAppUsageModel.fromJson(
json['appUsageSchedules'] as Map<String, dynamic>,
),
keyboard: json['keyboard'] == null
? null
: DeviceCapabilityEnabledModel.fromJson(
json['keyboard'] as Map<String, dynamic>,
),
nightMode: json['nightMode'] == null
? null
: DeviceCapabilityEnabledModel.fromJson(
json['nightMode'] as Map<String, dynamic>,
),
wifi: json['wifi'] == null
? null
: DeviceCapabilityEnabledModel.fromJson(
json['wifi'] as Map<String, dynamic>,
),
deviceBackground: json['deviceBackground'] == null
? null
: DeviceCapabilityEnabledModel.fromJson(
json['deviceBackground'] as Map<String, dynamic>,
),
);
Map<String, dynamic> _$DeviceCapabilitiesModelToJson(
@@ -74,6 +109,13 @@ Map<String, dynamic> _$DeviceCapabilitiesModelToJson(
'takepills': instance.takepills,
'location': instance.location,
'camera': instance.camera,
'doNotDisturbs': instance.doNotDisturbs,
'alarms': instance.alarms,
'appUsageSchedules': instance.appUsageSchedules,
'keyboard': instance.keyboard,
'nightMode': instance.nightMode,
'wifi': instance.wifi,
'deviceBackground': instance.deviceBackground,
};
_DeviceCapabilityEnabledModel _$DeviceCapabilityEnabledModelFromJson(
@@ -209,3 +251,37 @@ _DeviceCapabilityCameraModel _$DeviceCapabilityCameraModelFromJson(
Map<String, dynamic> _$DeviceCapabilityCameraModelToJson(
_DeviceCapabilityCameraModel instance,
) => <String, dynamic>{'format': instance.format, 'enabled': instance.enabled};
_DeviceCapabilityDoNotDisturbModel _$DeviceCapabilityDoNotDisturbModelFromJson(
Map<String, dynamic> json,
) => _DeviceCapabilityDoNotDisturbModel(
maxPeriods: (json['maxPeriods'] as num?)?.toInt() ?? 4,
);
Map<String, dynamic> _$DeviceCapabilityDoNotDisturbModelToJson(
_DeviceCapabilityDoNotDisturbModel instance,
) => <String, dynamic>{'maxPeriods': instance.maxPeriods};
_DeviceCapabilityAlarmsModel _$DeviceCapabilityAlarmsModelFromJson(
Map<String, dynamic> json,
) => _DeviceCapabilityAlarmsModel(
enabled: json['enabled'] as bool? ?? false,
maxAlarms: (json['maxAlarms'] as num?)?.toInt() ?? 3,
);
Map<String, dynamic> _$DeviceCapabilityAlarmsModelToJson(
_DeviceCapabilityAlarmsModel instance,
) => <String, dynamic>{
'enabled': instance.enabled,
'maxAlarms': instance.maxAlarms,
};
_DeviceCapabilityAppUsageModel _$DeviceCapabilityAppUsageModelFromJson(
Map<String, dynamic> json,
) => _DeviceCapabilityAppUsageModel(
maxPeriods: (json['maxPeriods'] as num?)?.toInt() ?? 3,
);
Map<String, dynamic> _$DeviceCapabilityAppUsageModelToJson(
_DeviceCapabilityAppUsageModel instance,
) => <String, dynamic>{'maxPeriods': instance.maxPeriods};

View File

@@ -15,6 +15,13 @@ abstract class DeviceCapabilitiesEntity with _$DeviceCapabilitiesEntity {
DeviceCapabilityTakepillsEntity? takepills,
DeviceCapabilityOptionEntity? location,
DeviceCapabilityCameraEntity? camera,
DeviceCapabilityDoNotDisturbEntity? doNotDisturbs,
DeviceCapabilityAlarmsEntity? alarms,
DeviceCapabilityAppUsageEntity? appUsageSchedules,
DeviceCapabilityEnabledEntity? keyboard,
DeviceCapabilityEnabledEntity? nightMode,
DeviceCapabilityEnabledEntity? wifi,
DeviceCapabilityEnabledEntity? deviceBackground,
}) = _DeviceCapabilitiesEntity;
}
@@ -63,6 +70,11 @@ abstract class DeviceCapabilityContactTypeEntity
}) = _DeviceCapabilityContactTypeEntity;
}
extension DeviceCapabilityContactsX on DeviceCapabilityContactsEntity {
int maxForType(String type, {int fallback = 10}) =>
types.where((t) => t.type == type).firstOrNull?.amount ?? fallback;
}
@freezed
abstract class DeviceCapabilitySettingsEntity
with _$DeviceCapabilitySettingsEntity {
@@ -99,3 +111,27 @@ abstract class DeviceCapabilityCameraEntity
@Default(false) bool enabled,
}) = _DeviceCapabilityCameraEntity;
}
@freezed
abstract class DeviceCapabilityDoNotDisturbEntity with _$DeviceCapabilityDoNotDisturbEntity {
const factory DeviceCapabilityDoNotDisturbEntity({
@Default(4) int maxPeriods,
}) = _DeviceCapabilityDoNotDisturbEntity;
}
@freezed
abstract class DeviceCapabilityAlarmsEntity
with _$DeviceCapabilityAlarmsEntity {
const factory DeviceCapabilityAlarmsEntity({
@Default(false) bool enabled,
@Default(3) int maxAlarms,
}) = _DeviceCapabilityAlarmsEntity;
}
@freezed
abstract class DeviceCapabilityAppUsageEntity
with _$DeviceCapabilityAppUsageEntity {
const factory DeviceCapabilityAppUsageEntity({
@Default(3) int maxPeriods,
}) = _DeviceCapabilityAppUsageEntity;
}

View File

@@ -34,6 +34,11 @@ mixin DeviceTracking on Tracking {
'level': level,
});
Future<void> legacyDeviceDoNotDisturbScheduleSaved(int periodsCount) =>
trackEvent('${_prefix}_do_not_disturb_schedule_saved', {
'periods_count': periodsCount,
});
Future<void> legacyDeviceBackgroundImageChanged() =>
trackEvent('${_prefix}_background_image_changed');

View File

@@ -0,0 +1,5 @@
String formatSecondsCompact(int seconds) {
if (seconds >= 3600) return '${seconds ~/ 3600}h';
if (seconds >= 60) return '${seconds ~/ 60}m';
return '${seconds}s';
}

View File

@@ -1,3 +1,4 @@
export 'src/date_utils.dart';
export 'src/duration_format.dart';
export 'src/size_utils.dart';
export 'src/test.dart';