You are on page 1of 5

Sure, I can give you an example of a Flutter app that allows you to control the

calling time on a smartphone.

First, let's define the basic features of our app:

1. Display the current call duration


2. Set a maximum call duration limit
3. Notify the user when the call duration limit is reached

To implement these features, we will need to use the following packages:

 flutter_duration_picker: a package that provides a customizable duration


picker widget
 flutter_local_notifications: a package that allows us to show local
notifications to the user
 flutter_phone_state: a package that allows us to listen to phone call state
changes

Here's the code for our app:

import 'package:flutter/material.dart';

import 'package:flutter_duration_picker/flutter_duration_picker.dart';

import 'package:flutter_local_notifications/flutter_local_notifications.dart';

import 'package:flutter_phone_state/flutter_phone_state.dart';

void main() => runApp(MyApp());

class MyApp extends StatelessWidget {

@override

Widget build(BuildContext context) {

return MaterialApp(

title: 'Call Timer',


home: CallTimer(),

);

class CallTimer extends StatefulWidget {

@override

_CallTimerState createState() => _CallTimerState();

class _CallTimerState extends State<CallTimer> {

Duration _callDuration = Duration.zero;

Duration _callDurationLimit = Duration(minutes: 5);

FlutterLocalNotificationsPlugin _notificationsPlugin;

PhoneState _phoneState;

@override

void initState() {

super.initState();

// Initialize the notifications plugin

_notificationsPlugin = FlutterLocalNotificationsPlugin();

var initializationSettingsAndroid = AndroidInitializationSettings('app_icon');

var initializationSettingsIOS = IOSInitializationSettings();

var initializationSettings = InitializationSettings(android: initializationSettingsAndroid, iOS:


initializationSettingsIOS);

_notificationsPlugin.initialize(initializationSettings);
// Initialize the phone state listener

_phoneState = PhoneState();

_phoneState.onCallStateChanged.listen(_onCallStateChanged);

void _onCallStateChanged(PhoneCallState callState) {

if (callState == PhoneCallState.ringing) {

_resetCallDuration();

} else if (callState == PhoneCallState.offhook) {

_startCallDurationTimer();

} else if (callState == PhoneCallState.idle) {

_stopCallDurationTimer();

void _resetCallDuration() {

setState(() {

_callDuration = Duration.zero;

});

void _startCallDurationTimer() {

Timer.periodic(Duration(seconds: 1), (timer) {

setState(() {

_callDuration += Duration(seconds: 1);

});

if (_callDuration >= _callDurationLimit) {

_showNotification();

_stopCallDurationTimer();
}

});

void _stopCallDurationTimer() {

setState(() {

_callDuration = Duration.zero;

});

void _showNotification() async {

var androidDetails = AndroidNotificationDetails(

'channelId',

'Call Timer',

'Notification for call duration limit reached',

importance: Importance.high,

priority: Priority.high,

playSound: true,

sound: RawResourceAndroidNotificationSound('notification_sound'),

);

var iOSDetails = IOSNotificationDetails();

var notificationDetails = NotificationDetails(android: androidDetails, iOS: iOSDetails);

await _notificationsPlugin.show(0, 'Call Timer', 'Call duration limit reached', notificationDetails);

@override

Widget build(BuildContext context) {

return Scaffold(

appBar: AppBar(
title: Text('Call Timer'),

),

You might also like