Skip to content

Commit cb15f3e

Browse files
author
DjArt
committed
improved notification system, also need HUGE refactoring
1 parent 3470a38 commit cb15f3e

13 files changed

+336
-174
lines changed

WoADialer/App.xaml.cs

Lines changed: 91 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,21 @@
1-
using System;
1+
using Internal.Windows.Calls;
2+
using Microsoft.QueryStringDotNET;
3+
using Microsoft.Toolkit.Uwp.Notifications;
4+
using System;
25
using System.Collections.Generic;
36
using System.IO;
47
using System.Linq;
58
using System.Runtime.InteropServices.WindowsRuntime;
9+
using System.Threading;
10+
using System.Threading.Tasks;
611
using Windows.ApplicationModel;
712
using Windows.ApplicationModel.Activation;
813
using Windows.ApplicationModel.Background;
914
using Windows.ApplicationModel.Calls;
15+
using Windows.ApplicationModel.Calls.Background;
1016
using Windows.Foundation;
1117
using Windows.Foundation.Collections;
18+
using Windows.UI.Notifications;
1219
using Windows.UI.Xaml;
1320
using Windows.UI.Xaml.Controls;
1421
using 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)

WoADialer/Background/BackgroungCallMonitor.cs

Lines changed: 0 additions & 56 deletions
This file was deleted.

WoADialer/Background/CallWaiter.cs

Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,49 @@
1+
using Internal.Windows.Calls;
2+
using System;
3+
using System.Collections.Generic;
4+
using System.Linq;
5+
using System.Text;
6+
using System.Threading;
7+
using System.Threading.Tasks;
8+
using Windows.ApplicationModel.Background;
9+
using Windows.ApplicationModel.LockScreen;
10+
11+
using Microsoft.Toolkit.Uwp.Notifications;
12+
using Windows.UI.Notifications;
13+
using Windows.ApplicationModel.Calls.Background;
14+
15+
namespace WoADialer.Model
16+
{
17+
public sealed class CallWaiter
18+
{
19+
public event EventHandler<Call> CallAppeared;
20+
21+
public CallWaiter()
22+
{
23+
24+
}
25+
26+
private void CallManager_CallAppeared(CallManager sender, Call args)
27+
{
28+
if (args.State == CallState.Incoming)
29+
{
30+
CallAppeared?.Invoke(this, args);
31+
}
32+
}
33+
34+
public void RegisterListener()
35+
{
36+
MainEntities.CallManager.CallAppeared += CallManager_CallAppeared;
37+
Call call = MainEntities.CallManager.CurrentCalls.FirstOrDefault(x => x.State == CallState.Incoming);
38+
if (call?.State == CallState.Incoming)
39+
{
40+
CallAppeared?.Invoke(this, call);
41+
}
42+
}
43+
44+
public void UnregisterListener()
45+
{
46+
MainEntities.CallManager.CallAppeared -= CallManager_CallAppeared;
47+
}
48+
}
49+
}

WoADialer/Background/NotificationHelper.cs

Lines changed: 0 additions & 50 deletions
This file was deleted.
Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,54 @@
1+
using Microsoft.Toolkit.Uwp.Notifications;
2+
using System;
3+
using System.Collections.Generic;
4+
using System.Linq;
5+
using System.Text;
6+
using System.Threading.Tasks;
7+
using Windows.ApplicationModel.Background;
8+
using Windows.UI.Notifications;
9+
using Windows.UI.Notifications.Management;
10+
11+
namespace WoADialer.Background
12+
{
13+
public sealed class NotificationShredder
14+
{
15+
private const string WINDOWS_SYSTEM_TOAST_CALLING = "Windows.SystemToast.Calling";
16+
17+
public event EventHandler NotificationRemoved;
18+
19+
public NotificationShredder()
20+
{
21+
22+
}
23+
24+
public async void RegisterListener()
25+
{
26+
UserNotificationListener.Current.NotificationChanged += Listener_NotificationChanged;
27+
IReadOnlyList<UserNotification> notifications = await UserNotificationListener.Current.GetNotificationsAsync(NotificationKinds.Toast);
28+
UserNotification callToast = notifications.FirstOrDefault(x => x.AppInfo.AppUserModelId == WINDOWS_SYSTEM_TOAST_CALLING);
29+
if (callToast != null)
30+
{
31+
UserNotificationListener.Current.RemoveNotification(callToast.Id);
32+
NotificationRemoved?.Invoke(this, null);
33+
}
34+
}
35+
36+
public void UnregisterListener()
37+
{
38+
UserNotificationListener.Current.NotificationChanged -= Listener_NotificationChanged;
39+
}
40+
41+
private void Listener_NotificationChanged(UserNotificationListener sender, UserNotificationChangedEventArgs args)
42+
{
43+
if (args.ChangeKind == UserNotificationChangedKind.Added)
44+
{
45+
UserNotification notification = sender.GetNotification(args.UserNotificationId);
46+
if (notification.AppInfo.AppUserModelId == WINDOWS_SYSTEM_TOAST_CALLING)
47+
{
48+
sender.RemoveNotification(notification.Id);
49+
NotificationRemoved?.Invoke(this, null);
50+
}
51+
}
52+
}
53+
}
54+
}

0 commit comments

Comments
 (0)