Files
BudgetApp/lib/services/sms_service.dart
T
Sanders d19f58d65e Adds user ID to SMS messages
Ensures SMS messages are associated with a specific user by adding a `userId` field to the `SmsMessage` model and passing the user ID when retrieving SMS messages.

This change ensures that SMS messages are correctly linked to the user they belong to, which is necessary for filtering and displaying the appropriate messages. It retrieves the user ID from the `UserCubit` state. Handles the case where the user state is not loaded, emitting an error state.
2025-07-09 22:06:28 +03:00

67 lines
3.3 KiB
Dart

import 'package:another_telephony/telephony.dart' as telephony_package;
import 'package:budget_app/models/sms_message.dart';
/// Сервис для работы с SMS сообщениями.
///
/// Использует пакет [telephony] для доступа к SMS на устройстве.
/// Предоставляет методы для запроса разрешений и получения
/// последних SMS сообщений.
class SmsService {
final telephony_package.Telephony _telephony = telephony_package.Telephony.instance;
/// Запрашивает разрешения на чтение и отправку SMS.
///
/// Возвращает [true], если разрешения были предоставлены,
/// иначе [false].
Future<bool> requestPermissions() async {
return await _telephony.requestPhoneAndSmsPermissions ?? false;
}
/// Возвращает список последних SMS сообщений.
///
/// [count] - количество сообщений для получения.
///
/// Возвращает список объектов [SmsMessage].
/// В случае ошибки или отсутствия разрешений, возвращает пустой список.
Future<List<SmsMessage>> getLastSmsMessages(int count, String userId) async {
final bool? permissionsGranted =
await _telephony.requestPhoneAndSmsPermissions;
if (permissionsGranted ?? false) {
final List<telephony_package.SmsMessage> messages = await _telephony.getInboxSms(
columns: [telephony_package.SmsColumn.BODY, telephony_package.SmsColumn.ADDRESS, telephony_package.SmsColumn.DATE],
sortOrder: [telephony_package.OrderBy(telephony_package.SmsColumn.DATE, sort: telephony_package.Sort.DESC)],
);
// Комментарий: Преобразуем сообщения из пакета telephony в нашу модель SmsMessage.
return messages.take(count).map((msg) => SmsMessage(
body: msg.body,
sender: msg.address,
date: DateTime.fromMillisecondsSinceEpoch(msg.date ?? 0),
userId: userId,
)).toList();
}
return [];
}
// Комментарий: Метод для получения SMS-сообщений с определенной даты.
Future<List<SmsMessage>> getSmsMessagesSince(DateTime sinceDate, String userId) async {
final bool? permissionsGranted = await _telephony.requestPhoneAndSmsPermissions;
if (permissionsGranted ?? false) {
final List<telephony_package.SmsMessage> messages = await _telephony.getInboxSms(
columns: [telephony_package.SmsColumn.BODY, telephony_package.SmsColumn.ADDRESS, telephony_package.SmsColumn.DATE],
sortOrder: [telephony_package.OrderBy(telephony_package.SmsColumn.DATE, sort: telephony_package.Sort.ASC)],
);
// Комментарий: Фильтруем сообщения по дате и преобразуем их в нашу модель.
return messages
.where((msg) => (msg.date ?? 0) >= sinceDate.millisecondsSinceEpoch)
.map((msg) => SmsMessage(
body: msg.body,
sender: msg.address,
date: DateTime.fromMillisecondsSinceEpoch(msg.date ?? 0),
userId: userId,
))
.toList();
}
return [];
}
}