Comme vous le savez sûrement , mango ou « windows phone 7.1″ apporte énormément de nouvelles api pour les développeurs, et notamment la possibilité d’accéder aux données de l’utilisateur, que ce soit ses contacts ou ses évènements.
Nous allons nous donc nous concentrer sur les évènements et la façon de les récupérer sous mango.
Autoriser l’application à accéder aux évènements
Avant de commencer, il faut vérifier que votre application est autorisées à accéder à cette partie de la l’api. Pour cela, ouvrez le WMAppManifest.xml et vérifiez que vous avez :
<Capacities>
...
<Capability Name="ID_CAP_APPOINTMENTS" />
...
</Capacities>
Si ce n’est pas le cas, ajoutez le
Accéder aux évènements
Nous ne disposons pas d’un accès direct au données, il faut en réalité passer par une recherche, cela évite de récupérer toutes les données pour ensuite les filtrer.
Pour réaliser une recherche, il faut utiliser la classe : Microsoft.Phone.UserData.Appointments et notamment sa méthode SearchAsync. Voici un exemple d’utilisation :
using Microsoft.Phone.UserData;
var app = new Microsoft.Phone.UserData.Appointments();
app.SearchCompleted += new EventHandler<Microsoft.Phone.UserData.AppointmentsSearchEventArgs>(app_SearchCompleted);
app.SearchAsync(DateTime.Now.AddDays(-1), DateTime.Now.AddDays(4), this);
Premier détail : la recherche se fait de façon asynchrone, toujours dans une logique de ne pas bloquer l’UI pendant la recherche. Si vous n’êtes pas à l’aise avec l’asynchronisme, vous pouvez essayer le framework Async pour windows phone qui vous facilitera la tâche.
Détaillons les différents paramètres de la fonction SearchAsync :
- DateTime startTimeInclusive
- DateTime endTimeInclusive
- Object state
Les deux premiers paramètres permettent de sélectionner un intervalle de recherche, uniquement les évènements entre ces deux dates (incluses) seront retournés.
La troisième paramètres « state », est une variable d’état, elle n’influe pas la recherche mais est retournée dans la fonction completed.
Deux autres paramètres sont optionnels :
- int maximumItems : le nombre maximum de résultat à retourner, par défaut : infini
- Account account : le compte utilisateur où effectué la recherche, par défaut : tous les comptes
Comme vous pouvez le voir, il n’est possible d’effectuer une recherche uniquement sur tous les comptes ou sur un compte spécifique, si vous ne voulez faire votre recherche uniquement sur 2 comptes, vous devrez faire deux recherches (ou une recherche globale + un filtrage des données)
Le résultat de la recherche
Le prototype de la fonction callback est assez classique :
void app_SearchCompleted
(object sender,
Microsoft.Phone.UserData.AppointmentsSearchEventArgs e)
L’objet AppointmentsSearchEventArgs retourné dispose de 4 propriétés :
- BeginTimeInclusive
- EndTimeInclusive
- State
- Results
Attention, les propriétés BeginTimeInclusive et EndTimeInclusive représente le début et la fin de la recherche que vous avez préalablement spécifié, ils ne sont pas lié aux résultats (ils ne correspondent donc pas à la date du premier et du dernier évènement trouvé)
La propriété State contient l’objet que vous avez passé durant la recherche.
Enfin Results est une énumération des évènements (de type Appointment) trouvés correspondant aux critères de recherches.
Le détail sur les évènements
L’objet Appointment dispose de toutes les propriétés dont vous aurez besoin :
- Account : le compte utilisateur (gmail, outlook, téléphone, etc…) propriétaire de l’évènement
- Attendees : la liste des personnes invités
- Details : une string contenant le détail de l’évènement
- EndTime : le début de l’évènement
- IsAllDayEvent : un booléen indiquant si l’évènement s’il est ponctuel (false) ou la journée entière (true)
- IsPrivate : indique si l’évènement est privé (true) ou publique (false)
- Location : le nom du lieu (string)
- Organizer : les informations (mail et nom) de l’organisateur
- StartTime : le début de l’évènement
- Status : indique votre disponibilité pendant l’évènement (occupé, absent, disponible)
- Subject : l’intitulé de l’évènement
Comment récupérer la liste des comptes
En effet, si l’on souhaite demandé les résultats d’un compte spécifique, il faut au préalablement pouvoir avoir la capacité de lister les comptes du téléphone.
Encore une fois, Microsoft nous a facilité la vie en fournissant directement la liste des comptes utilisateurs pouvant synchroniser des évènements (si vous avez un email qui ne gère pas les évènements, il ne sera pas listé)
Microsoft.Phone.UserData.Appointments app = new Microsoft.Phone.UserData.Appointments();
foreach (var account in app.Accounts)
System.Diagnostics.Debug.WriteLine(account.Name);
Inclusion des évènements
Un évènement est caractérisé par un début et une fin et la recherche se fait sur un intervalle, on peut donc s’interroger sur la disponibilité des évènements à cheval sur l’intervalle de recherche (ceux commençant avant mais terminant après le début de l’intervalle ou ceux commençant avant la fin mais terminant après l’intervalle). L’api retourne en fait tous les évènements ayant sur durant l’intervalle, même si la fin de l’évènement est après l’intervalle ou si l’évènement à commencé avant, ce qui est un bon choix à mon goût.
Comment différencier les évènements spécifique à l’utilisateur des évènements « publiques »

Une des nouveautés de mango, est qu’il ajoute aux évènements calendrier les a
nniversaires de vos contacts facebook ou windows live, mais aussi les évènements nationaux comme le 14 juillet ou noël. Ces évènements ne concerne pas directement l’utilisateur, il peut donc être utile de les différencier des évènements comme les réunions, les rendez vous, etc…
L’application calendrier de windows phone fait bien cette distinction entre les deux types, un évènement de l’utilisateur disposant d’un rectangle plein, alors qu’un évènement « publique » dispose d’un rectangle vide dans la vue « agenda ».
Il n’existe pas de propriété spécifique pour cela, IsPrivate est plutôt un indicateur sur la confidentialité de l’évènement. Toutefois, il est possible de « deviner » cette distinction en regardant la propriété Organizer, un évènement « publiques » ne disposant pas d’organisateur (donc null) contrairement à un évènement spécifique à l’utilisateur (ce dernier n’étant pas forcément l’organisateur)
Ce qu’il manque
Certain vous diront qu’il manque la possibilité d’ajouter des évènements, je ne pense pas que c’est une bonne idée, ou alors uniquement via un launcher, afin de laisser l’utilisateur maitre de son calendrier et qu’il puisse valider ou non l’ajout.
Par rapport à l’application native, il manque juste une information : le nom du sous-calendrier. Par exemple, avec un compte windows live, vous avez à disposition 3 calendriers par défaut : vos évènements, les anniversaires et les fêtes nationales. Lorsque vous regardez le détail d’une fête nationale par exemple, il est bien indiqué :
calendrier : Vacances en France (read only) – Windows Live
Or l’api actuelle nous donne uniquement l’information « Windows Live », nous n’avons donc aucune info sur le sous-calendrier utilisé. L’information n’est pas indispensable, mais puisqu’elle est disponible, autant la fournir. Pour finir il ne faut pas oublier que mango est en beta actuellement et les choses risquent de changer d’ici la version finale.