fix: call correctly in history page (#41)
Reviewed-on: #41 Co-authored-by: Florian Griffon <florian.griffon@epitech.eu> Co-committed-by: Florian Griffon <florian.griffon@epitech.eu>
This commit is contained in:
parent
615fc9bd90
commit
3a7c9718dd
@ -11,6 +11,7 @@ import 'package:dialer/features/contacts/contact_state.dart';
|
|||||||
import 'package:dialer/widgets/username_color_generator.dart';
|
import 'package:dialer/widgets/username_color_generator.dart';
|
||||||
import '../../services/block_service.dart';
|
import '../../services/block_service.dart';
|
||||||
import '../contacts/widgets/contact_modal.dart';
|
import '../contacts/widgets/contact_modal.dart';
|
||||||
|
import '../../services/call_service.dart';
|
||||||
|
|
||||||
class History {
|
class History {
|
||||||
final Contact contact;
|
final Contact contact;
|
||||||
@ -20,12 +21,12 @@ class History {
|
|||||||
final int attempts;
|
final int attempts;
|
||||||
|
|
||||||
History(
|
History(
|
||||||
this.contact,
|
this.contact,
|
||||||
this.date,
|
this.date,
|
||||||
this.callType,
|
this.callType,
|
||||||
this.callStatus,
|
this.callStatus,
|
||||||
this.attempts,
|
this.attempts,
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
class HistoryPage extends StatefulWidget {
|
class HistoryPage extends StatefulWidget {
|
||||||
@ -41,6 +42,7 @@ class _HistoryPageState extends State<HistoryPage>
|
|||||||
bool loading = true;
|
bool loading = true;
|
||||||
int? _expandedIndex;
|
int? _expandedIndex;
|
||||||
final ObfuscateService _obfuscateService = ObfuscateService();
|
final ObfuscateService _obfuscateService = ObfuscateService();
|
||||||
|
final CallService _callService = CallService();
|
||||||
|
|
||||||
// Create a MethodChannel instance.
|
// Create a MethodChannel instance.
|
||||||
static const MethodChannel _channel = MethodChannel('com.example.calllog');
|
static const MethodChannel _channel = MethodChannel('com.example.calllog');
|
||||||
@ -83,8 +85,8 @@ class _HistoryPageState extends State<HistoryPage>
|
|||||||
}
|
}
|
||||||
} catch (e) {
|
} catch (e) {
|
||||||
print("Error updating favorite status: $e");
|
print("Error updating favorite status: $e");
|
||||||
ScaffoldMessenger.of(context)
|
ScaffoldMessenger.of(context).showSnackBar(
|
||||||
.showSnackBar(SnackBar(content: Text('Failed to update favorite status')));
|
SnackBar(content: Text('Failed to update favorite status')));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -155,7 +157,7 @@ class _HistoryPageState extends State<HistoryPage>
|
|||||||
|
|
||||||
// Convert timestamp to DateTime.
|
// Convert timestamp to DateTime.
|
||||||
DateTime callDate =
|
DateTime callDate =
|
||||||
DateTime.fromMillisecondsSinceEpoch(entry['date'] ?? 0);
|
DateTime.fromMillisecondsSinceEpoch(entry['date'] ?? 0);
|
||||||
|
|
||||||
int typeInt = entry['type'] ?? 0;
|
int typeInt = entry['type'] ?? 0;
|
||||||
int duration = entry['duration'] ?? 0;
|
int duration = entry['duration'] ?? 0;
|
||||||
@ -193,7 +195,8 @@ class _HistoryPageState extends State<HistoryPage>
|
|||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
callHistories.add(History(matchedContact, callDate, callType, callStatus, 1));
|
callHistories
|
||||||
|
.add(History(matchedContact, callDate, callType, callStatus, 1));
|
||||||
}
|
}
|
||||||
|
|
||||||
// Sort histories by most recent.
|
// Sort histories by most recent.
|
||||||
@ -218,7 +221,7 @@ class _HistoryPageState extends State<HistoryPage>
|
|||||||
|
|
||||||
for (var history in historyList) {
|
for (var history in historyList) {
|
||||||
final callDate =
|
final callDate =
|
||||||
DateTime(history.date.year, history.date.month, history.date.day);
|
DateTime(history.date.year, history.date.month, history.date.day);
|
||||||
if (callDate == today) {
|
if (callDate == today) {
|
||||||
todayHistories.add(history);
|
todayHistories.add(history);
|
||||||
} else if (callDate == yesterday) {
|
} else if (callDate == yesterday) {
|
||||||
@ -291,7 +294,7 @@ class _HistoryPageState extends State<HistoryPage>
|
|||||||
}
|
}
|
||||||
|
|
||||||
List<History> missedCalls =
|
List<History> missedCalls =
|
||||||
histories.where((h) => h.callStatus == 'missed').toList();
|
histories.where((h) => h.callStatus == 'missed').toList();
|
||||||
|
|
||||||
final allItems = _buildGroupedList(histories);
|
final allItems = _buildGroupedList(histories);
|
||||||
final missedItems = _buildGroupedList(missedCalls);
|
final missedItems = _buildGroupedList(missedCalls);
|
||||||
@ -360,7 +363,8 @@ class _HistoryPageState extends State<HistoryPage>
|
|||||||
onEdit: () async {
|
onEdit: () async {
|
||||||
if (await FlutterContacts.requestPermission()) {
|
if (await FlutterContacts.requestPermission()) {
|
||||||
final updatedContact =
|
final updatedContact =
|
||||||
await FlutterContacts.openExternalEdit(contact.id);
|
await FlutterContacts.openExternalEdit(
|
||||||
|
contact.id);
|
||||||
if (updatedContact != null) {
|
if (updatedContact != null) {
|
||||||
await _refreshContacts();
|
await _refreshContacts();
|
||||||
Navigator.of(context).pop();
|
Navigator.of(context).pop();
|
||||||
@ -415,18 +419,11 @@ class _HistoryPageState extends State<HistoryPage>
|
|||||||
icon: const Icon(Icons.phone, color: Colors.green),
|
icon: const Icon(Icons.phone, color: Colors.green),
|
||||||
onPressed: () async {
|
onPressed: () async {
|
||||||
if (contact.phones.isNotEmpty) {
|
if (contact.phones.isNotEmpty) {
|
||||||
final Uri callUri =
|
_callService.makeGsmCall(contact.phones.first.number);
|
||||||
Uri(scheme: 'tel', path: contact.phones.first.number);
|
|
||||||
if (await canLaunchUrl(callUri)) {
|
|
||||||
await launchUrl(callUri);
|
|
||||||
} else {
|
|
||||||
ScaffoldMessenger.of(context).showSnackBar(
|
|
||||||
const SnackBar(content: Text('Could not launch call')),
|
|
||||||
);
|
|
||||||
}
|
|
||||||
} else {
|
} else {
|
||||||
ScaffoldMessenger.of(context).showSnackBar(
|
ScaffoldMessenger.of(context).showSnackBar(
|
||||||
const SnackBar(content: Text('Contact has no phone number')),
|
const SnackBar(
|
||||||
|
content: Text('Contact has no phone number')),
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
@ -444,7 +441,9 @@ class _HistoryPageState extends State<HistoryPage>
|
|||||||
color: Colors.grey[850],
|
color: Colors.grey[850],
|
||||||
child: FutureBuilder<bool>(
|
child: FutureBuilder<bool>(
|
||||||
future: BlockService().isNumberBlocked(
|
future: BlockService().isNumberBlocked(
|
||||||
contact.phones.isNotEmpty ? contact.phones.first.number : ''),
|
contact.phones.isNotEmpty
|
||||||
|
? contact.phones.first.number
|
||||||
|
: ''),
|
||||||
builder: (context, snapshot) {
|
builder: (context, snapshot) {
|
||||||
final isBlocked = snapshot.data ?? false;
|
final isBlocked = snapshot.data ?? false;
|
||||||
return Row(
|
return Row(
|
||||||
@ -460,29 +459,37 @@ class _HistoryPageState extends State<HistoryPage>
|
|||||||
await launchUrl(smsUri);
|
await launchUrl(smsUri);
|
||||||
} else {
|
} else {
|
||||||
ScaffoldMessenger.of(context).showSnackBar(
|
ScaffoldMessenger.of(context).showSnackBar(
|
||||||
const SnackBar(content: Text('Could not send message')),
|
const SnackBar(
|
||||||
|
content:
|
||||||
|
Text('Could not send message')),
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
ScaffoldMessenger.of(context).showSnackBar(
|
ScaffoldMessenger.of(context).showSnackBar(
|
||||||
const SnackBar(content: Text('Contact has no phone number')),
|
const SnackBar(
|
||||||
|
content:
|
||||||
|
Text('Contact has no phone number')),
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
icon: const Icon(Icons.message, color: Colors.white),
|
icon:
|
||||||
label: const Text('Message', style: TextStyle(color: Colors.white)),
|
const Icon(Icons.message, color: Colors.white),
|
||||||
|
label: const Text('Message',
|
||||||
|
style: TextStyle(color: Colors.white)),
|
||||||
),
|
),
|
||||||
TextButton.icon(
|
TextButton.icon(
|
||||||
onPressed: () {
|
onPressed: () {
|
||||||
Navigator.push(
|
Navigator.push(
|
||||||
context,
|
context,
|
||||||
MaterialPageRoute(
|
MaterialPageRoute(
|
||||||
builder: (_) => CallDetailsPage(history: history),
|
builder: (_) =>
|
||||||
|
CallDetailsPage(history: history),
|
||||||
),
|
),
|
||||||
);
|
);
|
||||||
},
|
},
|
||||||
icon: const Icon(Icons.info, color: Colors.white),
|
icon: const Icon(Icons.info, color: Colors.white),
|
||||||
label: const Text('Details', style: TextStyle(color: Colors.white)),
|
label: const Text('Details',
|
||||||
|
style: TextStyle(color: Colors.white)),
|
||||||
),
|
),
|
||||||
TextButton.icon(
|
TextButton.icon(
|
||||||
onPressed: () async {
|
onPressed: () async {
|
||||||
@ -491,24 +498,29 @@ class _HistoryPageState extends State<HistoryPage>
|
|||||||
: null;
|
: null;
|
||||||
if (phoneNumber == null) {
|
if (phoneNumber == null) {
|
||||||
ScaffoldMessenger.of(context).showSnackBar(
|
ScaffoldMessenger.of(context).showSnackBar(
|
||||||
const SnackBar(content: Text('Contact has no phone number')),
|
const SnackBar(
|
||||||
|
content:
|
||||||
|
Text('Contact has no phone number')),
|
||||||
);
|
);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
if (isBlocked) {
|
if (isBlocked) {
|
||||||
await BlockService().unblockNumber(phoneNumber);
|
await BlockService().unblockNumber(phoneNumber);
|
||||||
ScaffoldMessenger.of(context).showSnackBar(
|
ScaffoldMessenger.of(context).showSnackBar(
|
||||||
SnackBar(content: Text('$phoneNumber unblocked')),
|
SnackBar(
|
||||||
|
content: Text('$phoneNumber unblocked')),
|
||||||
);
|
);
|
||||||
} else {
|
} else {
|
||||||
await BlockService().blockNumber(phoneNumber);
|
await BlockService().blockNumber(phoneNumber);
|
||||||
ScaffoldMessenger.of(context).showSnackBar(
|
ScaffoldMessenger.of(context).showSnackBar(
|
||||||
SnackBar(content: Text('$phoneNumber blocked')),
|
SnackBar(
|
||||||
|
content: Text('$phoneNumber blocked')),
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
setState(() {});
|
setState(() {});
|
||||||
},
|
},
|
||||||
icon: Icon(isBlocked ? Icons.lock_open : Icons.block,
|
icon: Icon(
|
||||||
|
isBlocked ? Icons.lock_open : Icons.block,
|
||||||
color: Colors.white),
|
color: Colors.white),
|
||||||
label: Text(isBlocked ? 'Unblock' : 'Block',
|
label: Text(isBlocked ? 'Unblock' : 'Block',
|
||||||
style: const TextStyle(color: Colors.white)),
|
style: const TextStyle(color: Colors.white)),
|
||||||
@ -554,21 +566,22 @@ class CallDetailsPage extends StatelessWidget {
|
|||||||
children: [
|
children: [
|
||||||
(contact.thumbnail != null && contact.thumbnail!.isNotEmpty)
|
(contact.thumbnail != null && contact.thumbnail!.isNotEmpty)
|
||||||
? ObfuscatedAvatar(
|
? ObfuscatedAvatar(
|
||||||
imageBytes: contact.thumbnail,
|
imageBytes: contact.thumbnail,
|
||||||
radius: 30,
|
radius: 30,
|
||||||
backgroundColor: contactBg,
|
backgroundColor: contactBg,
|
||||||
fallbackInitial: contact.displayName,
|
fallbackInitial: contact.displayName,
|
||||||
)
|
)
|
||||||
: CircleAvatar(
|
: CircleAvatar(
|
||||||
backgroundColor: generateColorFromName(contact.displayName),
|
backgroundColor:
|
||||||
radius: 30,
|
generateColorFromName(contact.displayName),
|
||||||
child: Text(
|
radius: 30,
|
||||||
contact.displayName.isNotEmpty
|
child: Text(
|
||||||
? contact.displayName[0].toUpperCase()
|
contact.displayName.isNotEmpty
|
||||||
: '?',
|
? contact.displayName[0].toUpperCase()
|
||||||
style: TextStyle(color: contactLetter),
|
: '?',
|
||||||
),
|
style: TextStyle(color: contactLetter),
|
||||||
),
|
),
|
||||||
|
),
|
||||||
const SizedBox(width: 16),
|
const SizedBox(width: 16),
|
||||||
Expanded(
|
Expanded(
|
||||||
child: Text(
|
child: Text(
|
||||||
@ -600,7 +613,8 @@ class CallDetailsPage extends StatelessWidget {
|
|||||||
if (contact.phones.isNotEmpty)
|
if (contact.phones.isNotEmpty)
|
||||||
DetailRow(
|
DetailRow(
|
||||||
label: 'Number:',
|
label: 'Number:',
|
||||||
value: _obfuscateService.obfuscateData(contact.phones.first.number),
|
value: _obfuscateService
|
||||||
|
.obfuscateData(contact.phones.first.number),
|
||||||
),
|
),
|
||||||
],
|
],
|
||||||
),
|
),
|
||||||
|
Loading…
Reference in New Issue
Block a user