1- using System ;
1+ using Internal . Windows . Calls ;
2+ using Microsoft . QueryStringDotNET ;
3+ using Microsoft . Toolkit . Uwp . Notifications ;
4+ using System ;
25using System . Collections . Generic ;
36using System . IO ;
47using System . Linq ;
58using System . Runtime . InteropServices . WindowsRuntime ;
9+ using System . Threading ;
10+ using System . Threading . Tasks ;
611using Windows . ApplicationModel ;
712using Windows . ApplicationModel . Activation ;
813using Windows . ApplicationModel . Background ;
914using Windows . ApplicationModel . Calls ;
15+ using Windows . ApplicationModel . Calls . Background ;
1016using Windows . Foundation ;
1117using Windows . Foundation . Collections ;
18+ using Windows . UI . Notifications ;
1219using Windows . UI . Xaml ;
1320using Windows . UI . Xaml . Controls ;
1421using Windows . UI . Xaml . Controls . Primitives ;
@@ -25,12 +32,18 @@ namespace WoADialer
2532{
2633 sealed partial class App : Application
2734 {
35+ private NotificationShredder Shredder ;
36+ private CallWaiter Waiter ;
37+ private ManualResetEvent Event ;
38+ private Call Incoming ;
39+
2840 public App ( )
2941 {
3042 this . InitializeComponent ( ) ;
3143 this . Suspending += OnSuspending ;
3244
33- if ( SettingsManager . isFirstTimeRun ( ) ) SettingsManager . setDefaultSettings ( ) ;
45+ if ( SettingsManager . isFirstTimeRun ( ) ) SettingsManager . setDefaultSettings ( ) ;
46+ MainEntities . Initialize ( ) ;
3447 }
3548
3649 protected override void OnActivated ( IActivatedEventArgs args )
@@ -56,6 +69,23 @@ protected override void OnActivated(IActivatedEventArgs args)
5669
5770 case ActivationKind . LockScreenCall :
5871
72+ break ;
73+ case ActivationKind . ToastNotification :
74+ var toastActivationArgs = args as ToastNotificationActivatedEventArgs ;
75+
76+ QueryString str = QueryString . Parse ( toastActivationArgs . Argument ) ;
77+
78+ switch ( str [ "action" ] )
79+ {
80+ case "answer" :
81+ uint callID = uint . Parse ( str [ "callId" ] ) ;
82+ MainEntities . CallManager . CurrentCalls . FirstOrDefault ( x => x . ID == callID ) ? . AcceptIncomingEx ( ) ;
83+ break ;
84+ }
85+ if ( rootFrame . BackStack . Count == 0 )
86+ {
87+ rootFrame . BackStack . Add ( new PageStackEntry ( typeof ( MainPage ) , null , null ) ) ;
88+ }
5989 break ;
6090 default :
6191 rootFrame . Navigate ( typeof ( InCallUI ) ) ;
@@ -95,20 +125,74 @@ protected override void OnLaunched(LaunchActivatedEventArgs e)
95125 }
96126 }
97127
98- protected override void OnBackgroundActivated ( BackgroundActivatedEventArgs args )
128+ protected override async void OnBackgroundActivated ( BackgroundActivatedEventArgs args )
99129 {
100130 base . OnBackgroundActivated ( args ) ;
101131 BackgroundTaskDeferral deferral = args . TaskInstance . GetDeferral ( ) ;
102132 switch ( args . TaskInstance . Task . Name )
103133 {
104- case TaskManager . USER_NOTIFICATION_CHANGED :
105- NotificationHelper . RemoveSystemCallNotification ( ) ;
134+ default :
135+ deferral . Complete ( ) ;
106136 break ;
107137 case TaskManager . LINE_STATE_CHANGED :
108-
138+ PhoneLineChangedTriggerDetails details = args . TaskInstance . TriggerDetails as PhoneLineChangedTriggerDetails ;
139+ if ( Shredder == null && Waiter == null && Incoming == null )
140+ {
141+ Event = new ManualResetEvent ( false ) ;
142+ Shredder = new NotificationShredder ( ) ;
143+ Waiter = new CallWaiter ( ) ;
144+ Shredder . NotificationRemoved += Shredder_NotificationRemoved ;
145+ Waiter . CallAppeared += Waiter_CallAppeared ;
146+ Shredder . RegisterListener ( ) ;
147+ Waiter . RegisterListener ( ) ;
148+ await Task . Run ( ( ) => Event . WaitOne ( 5000 ) ) ;
149+ //TaskManager.ShowToast("Registered");
150+ Event = null ;
151+ Incoming = null ;
152+ Waiter = null ;
153+ Shredder = null ;
154+ goto default ;
155+ }
156+ else
157+ {
158+ //TaskManager.ShowToast("Not registered");
159+ goto default ;
160+ }
109161 break ;
110162 }
111- deferral . Complete ( ) ;
163+ }
164+
165+ private void Waiter_CallAppeared ( object sender , Call e )
166+ {
167+ Incoming = e ;
168+ Waiter . UnregisterListener ( ) ;
169+ Waiter . CallAppeared -= Waiter_CallAppeared ;
170+ ToastNotification notification = TaskManager . ShowCallToast ( e ) ;
171+ e . StateChanged += E_StateChanged ;
172+ notification . Activated += Notification_Activated ;
173+ }
174+
175+ private void E_StateChanged ( Call sender , CallState args )
176+ {
177+ sender . StateChanged -= E_StateChanged ;
178+ if ( args == CallState . Disconnected )
179+ {
180+ TaskManager . ShowToast ( $ "Missed call: { sender . Number } ") ;
181+ }
182+ Event . Set ( ) ;
183+ }
184+
185+ private void Notification_Activated ( ToastNotification sender , object args )
186+ {
187+ Incoming . StateChanged -= E_StateChanged ;
188+ Event . Set ( ) ;
189+ }
190+
191+ private void Shredder_NotificationRemoved ( object sender , EventArgs e )
192+ {
193+ Shredder . UnregisterListener ( ) ;
194+ Shredder . NotificationRemoved -= Shredder_NotificationRemoved ;
195+ //TaskManager.ShowToast($"{MainEntities.CallManager.CurrentCalls.FirstOrDefault(x => x.State == CallState.Incoming)?.Number}");
112196 }
113197
114198 void OnNavigationFailed ( object sender , NavigationFailedEventArgs e )
0 commit comments