feat: can't use return button and exit callpage during call
All checks were successful
/ mirror (push) Successful in 4s
/ build (push) Successful in 9m59s
/ build-stealth (push) Successful in 9m59s

This commit is contained in:
Florian Griffon 2025-04-30 00:16:31 +03:00
parent ce7a5b10b0
commit a80b6da426

View File

@ -226,285 +226,299 @@ class _CallPageState extends State<CallPage> {
print( print(
'CallPage: Building UI, _callStatus: $_callStatus, route: ${ModalRoute.of(context)?.settings.name ?? "unknown"}'); 'CallPage: Building UI, _callStatus: $_callStatus, route: ${ModalRoute.of(context)?.settings.name ?? "unknown"}');
return Scaffold( return PopScope(
body: Container( canPop:
color: Colors.black, _callStatus == "Call Ended", // Allow navigation only if call ended
child: SafeArea( child: Scaffold(
child: Column( body: Container(
children: [ color: Colors.black,
Container( child: SafeArea(
padding: const EdgeInsets.symmetric(vertical: 8.0), child: Column(
child: Column( children: [
mainAxisSize: MainAxisSize.min, Container(
children: [ padding: const EdgeInsets.symmetric(vertical: 8.0),
const SizedBox(height: 35), child: Column(
ObfuscatedAvatar( mainAxisSize: MainAxisSize.min,
imageBytes: widget.thumbnail,
radius: avatarRadius,
backgroundColor:
generateColorFromName(widget.displayName),
fallbackInitial: widget.displayName,
),
const SizedBox(height: 4),
Row(
mainAxisAlignment: MainAxisAlignment.center,
children: [ children: [
Icon( const SizedBox(height: 35),
icingProtocolOk ? Icons.lock : Icons.lock_open, ObfuscatedAvatar(
color: icingProtocolOk ? Colors.green : Colors.red, imageBytes: widget.thumbnail,
size: 16, radius: avatarRadius,
backgroundColor:
generateColorFromName(widget.displayName),
fallbackInitial: widget.displayName,
), ),
const SizedBox(width: 4), const SizedBox(height: 4),
Row(
mainAxisAlignment: MainAxisAlignment.center,
children: [
Icon(
icingProtocolOk ? Icons.lock : Icons.lock_open,
color:
icingProtocolOk ? Colors.green : Colors.red,
size: 16,
),
const SizedBox(width: 4),
Text(
'Icing protocol: ${icingProtocolOk ? "ok" : "ko"}',
style: TextStyle(
color:
icingProtocolOk ? Colors.green : Colors.red,
fontSize: 12,
fontWeight: FontWeight.bold,
),
),
],
),
const SizedBox(height: 4),
Text( Text(
'Icing protocol: ${icingProtocolOk ? "ok" : "ko"}', _obfuscateService.obfuscateData(widget.displayName),
style: TextStyle( style: TextStyle(
color: icingProtocolOk ? Colors.green : Colors.red, fontSize: nameFontSize,
fontSize: 12, color: Colors.white,
fontWeight: FontWeight.bold, fontWeight: FontWeight.bold,
), ),
), ),
Text(
widget.phoneNumber,
style: TextStyle(
fontSize: statusFontSize, color: Colors.white70),
),
Text(
_callStatus,
style: TextStyle(
fontSize: statusFontSize, color: Colors.white70),
),
], ],
), ),
const SizedBox(height: 4), ),
Text( Expanded(
_obfuscateService.obfuscateData(widget.displayName), child: Column(
style: TextStyle( children: [
fontSize: nameFontSize, if (isKeypadVisible) ...[
color: Colors.white, const Spacer(flex: 2),
fontWeight: FontWeight.bold, Padding(
), padding:
), const EdgeInsets.symmetric(horizontal: 20.0),
Text( child: Row(
widget.phoneNumber, mainAxisAlignment: MainAxisAlignment.spaceBetween,
style: TextStyle( children: [
fontSize: statusFontSize, color: Colors.white70), Expanded(
),
Text(
_callStatus,
style: TextStyle(
fontSize: statusFontSize, color: Colors.white70),
),
],
),
),
Expanded(
child: Column(
children: [
if (isKeypadVisible) ...[
const Spacer(flex: 2),
Padding(
padding: const EdgeInsets.symmetric(horizontal: 20.0),
child: Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
Expanded(
child: Text(
_typedDigits,
maxLines: 1,
textAlign: TextAlign.right,
overflow: TextOverflow.ellipsis,
style: const TextStyle(
fontSize: 24,
color: Colors.white,
fontWeight: FontWeight.bold,
),
),
),
IconButton(
padding: EdgeInsets.zero,
onPressed: _toggleKeypad,
icon:
const Icon(Icons.close, color: Colors.white),
),
],
),
),
Container(
height: MediaQuery.of(context).size.height * 0.35,
margin: const EdgeInsets.symmetric(horizontal: 20),
child: GridView.count(
shrinkWrap: true,
physics: const NeverScrollableScrollPhysics(),
crossAxisCount: 3,
childAspectRatio: 1.3,
mainAxisSpacing: 8,
crossAxisSpacing: 8,
children: List.generate(12, (index) {
String label;
if (index < 9) {
label = '${index + 1}';
} else if (index == 9) {
label = '*';
} else if (index == 10) {
label = '0';
} else {
label = '#';
}
return GestureDetector(
onTap: () => _addDigit(label),
child: Container(
decoration: const BoxDecoration(
shape: BoxShape.circle,
color: Colors.transparent,
),
child: Center(
child: Text( child: Text(
label, _typedDigits,
maxLines: 1,
textAlign: TextAlign.right,
overflow: TextOverflow.ellipsis,
style: const TextStyle( style: const TextStyle(
fontSize: 32, color: Colors.white), fontSize: 24,
color: Colors.white,
fontWeight: FontWeight.bold,
),
), ),
), ),
), IconButton(
); padding: EdgeInsets.zero,
}), onPressed: _toggleKeypad,
), icon: const Icon(Icons.close,
), color: Colors.white),
const Spacer(flex: 1),
] else ...[
const Spacer(),
Padding(
padding: const EdgeInsets.symmetric(horizontal: 32.0),
child: Column(
mainAxisSize: MainAxisSize.min,
children: [
Row(
mainAxisAlignment: MainAxisAlignment.spaceEvenly,
children: [
Column(
mainAxisSize: MainAxisSize.min,
children: [
IconButton(
onPressed: _toggleMute,
icon: Icon(
isMuted ? Icons.mic_off : Icons.mic,
color: isMuted
? Colors.amber
: Colors.white,
size: 32,
),
),
Text(
isMuted ? 'Unmute' : 'Mute',
style: const TextStyle(
color: Colors.white, fontSize: 14),
),
],
),
Column(
mainAxisSize: MainAxisSize.min,
children: [
IconButton(
onPressed: _toggleKeypad,
icon: const Icon(
Icons.dialpad,
color: Colors.white,
size: 32,
),
),
const Text(
'Keypad',
style: TextStyle(
color: Colors.white, fontSize: 14),
),
],
),
Column(
mainAxisSize: MainAxisSize.min,
children: [
IconButton(
onPressed: _toggleSpeaker,
icon: Icon(
isSpeaker
? Icons.volume_up
: Icons.volume_off,
color: isSpeaker
? Colors.amber
: Colors.white,
size: 32,
),
),
const Text(
'Speaker',
style: TextStyle(
color: Colors.white, fontSize: 14),
),
],
), ),
], ],
), ),
const SizedBox(height: 20), ),
Row( Container(
mainAxisAlignment: MainAxisAlignment.spaceEvenly, height: MediaQuery.of(context).size.height * 0.35,
margin: const EdgeInsets.symmetric(horizontal: 20),
child: GridView.count(
shrinkWrap: true,
physics: const NeverScrollableScrollPhysics(),
crossAxisCount: 3,
childAspectRatio: 1.3,
mainAxisSpacing: 8,
crossAxisSpacing: 8,
children: List.generate(12, (index) {
String label;
if (index < 9) {
label = '${index + 1}';
} else if (index == 9) {
label = '*';
} else if (index == 10) {
label = '0';
} else {
label = '#';
}
return GestureDetector(
onTap: () => _addDigit(label),
child: Container(
decoration: const BoxDecoration(
shape: BoxShape.circle,
color: Colors.transparent,
),
child: Center(
child: Text(
label,
style: const TextStyle(
fontSize: 32, color: Colors.white),
),
),
),
);
}),
),
),
const Spacer(flex: 1),
] else ...[
const Spacer(),
Padding(
padding:
const EdgeInsets.symmetric(horizontal: 32.0),
child: Column(
mainAxisSize: MainAxisSize.min,
children: [ children: [
if (isNumberUnknown) Row(
Column( mainAxisAlignment:
mainAxisSize: MainAxisSize.min, MainAxisAlignment.spaceEvenly,
children: [ children: [
IconButton( Column(
onPressed: _addContact, mainAxisSize: MainAxisSize.min,
icon: const Icon( children: [
Icons.person_add, IconButton(
color: Colors.white, onPressed: _toggleMute,
size: 32, icon: Icon(
isMuted ? Icons.mic_off : Icons.mic,
color: isMuted
? Colors.amber
: Colors.white,
size: 32,
),
), ),
), Text(
const Text( isMuted ? 'Unmute' : 'Mute',
'Add Contact', style: const TextStyle(
style: TextStyle( color: Colors.white,
color: Colors.white, fontSize: 14), fontSize: 14),
), ),
], ],
),
Column(
mainAxisSize: MainAxisSize.min,
children: [
IconButton(
onPressed: () {},
icon: const Icon(
Icons.sim_card,
color: Colors.white,
size: 32,
),
), ),
const Text( Column(
'Change SIM', mainAxisSize: MainAxisSize.min,
style: TextStyle( children: [
color: Colors.white, fontSize: 14), IconButton(
onPressed: _toggleKeypad,
icon: const Icon(
Icons.dialpad,
color: Colors.white,
size: 32,
),
),
const Text(
'Keypad',
style: TextStyle(
color: Colors.white,
fontSize: 14),
),
],
),
Column(
mainAxisSize: MainAxisSize.min,
children: [
IconButton(
onPressed: _toggleSpeaker,
icon: Icon(
isSpeaker
? Icons.volume_up
: Icons.volume_off,
color: isSpeaker
? Colors.amber
: Colors.white,
size: 32,
),
),
const Text(
'Speaker',
style: TextStyle(
color: Colors.white,
fontSize: 14),
),
],
),
],
),
const SizedBox(height: 20),
Row(
mainAxisAlignment:
MainAxisAlignment.spaceEvenly,
children: [
if (isNumberUnknown)
Column(
mainAxisSize: MainAxisSize.min,
children: [
IconButton(
onPressed: _addContact,
icon: const Icon(
Icons.person_add,
color: Colors.white,
size: 32,
),
),
const Text(
'Add Contact',
style: TextStyle(
color: Colors.white,
fontSize: 14),
),
],
),
Column(
mainAxisSize: MainAxisSize.min,
children: [
IconButton(
onPressed: () {},
icon: const Icon(
Icons.sim_card,
color: Colors.white,
size: 32,
),
),
const Text(
'Change SIM',
style: TextStyle(
color: Colors.white,
fontSize: 14),
),
],
), ),
], ],
), ),
], ],
), ),
], ),
), const Spacer(flex: 3),
), ],
const Spacer(flex: 3), ],
],
],
),
),
Padding(
padding: const EdgeInsets.only(bottom: 16.0),
child: GestureDetector(
onTap: _hangUp,
child: Container(
padding: const EdgeInsets.all(12),
decoration: const BoxDecoration(
color: Colors.red,
shape: BoxShape.circle,
),
child: const Icon(
Icons.call_end,
color: Colors.white,
size: 32,
), ),
), ),
), Padding(
padding: const EdgeInsets.only(bottom: 16.0),
child: GestureDetector(
onTap: _hangUp,
child: Container(
padding: const EdgeInsets.all(12),
decoration: const BoxDecoration(
color: Colors.red,
shape: BoxShape.circle,
),
child: const Icon(
Icons.call_end,
color: Colors.white,
size: 32,
),
),
),
),
],
), ),
], ),
), ),
), ));
),
);
} }
} }