Cordova calendar plugin for Windows Phone 8

If you worked with Cordova/Phonegap and came across calendar plugin for Windows Phone 8 you must be knowing that Windows Phone 8 does not support calendar plugin officially and there is no plugin in Cordova plugin registry. As a workaround I wrote native plugin to add appointments to device calendar and thought to share it with my readers in quickie blog. 🙂

Create a new cs file in plugins directory named AddCalendarEvents.cs and add following code-

using Microsoft.Phone.Tasks;
using Microsoft.Phone.UserData;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using WPCordovaClassLib.Cordova;
using WPCordovaClassLib.Cordova.Commands;
using WPCordovaClassLib.Cordova.JSON;

namespace Cordova.Extension.Commands {
	public class AddCalendarEvents: BaseCommand {
		public void addCalendarEvents(String str) {
			string[] calendarValues = str.Split('|');

			SaveAppointmentTask saveAppointmentTask = new SaveAppointmentTask();

			int appointmentYear = Int32.Parse(calendarValues[3]);
			int appointmentMonth = Int32.Parse(calendarValues[4]);
			int appointmentDate = Int32.Parse(calendarValues[5]);
			float appointmentTime = float.Parse(calendarValues[6]);

			DateTime scheduleApptDateStart = (new DateTime(appointmentYear, appointmentMonth, appointmentDate, 7, 0, 0)).AddHours(appointmentTime);
			DateTime scheduleApptDateEnd = (new DateTime(appointmentYear, appointmentMonth, appointmentDate, 7, 30, 0)).AddHours(appointmentTime);
			saveAppointmentTask.StartTime = scheduleApptDateStart;
			saveAppointmentTask.EndTime = scheduleApptDateEnd;
			saveAppointmentTask.Subject = calendarValues[1];
			saveAppointmentTask.Location = calendarValues[2];
			saveAppointmentTask.Details = "";
			saveAppointmentTask.IsAllDayEvent = false;
			saveAppointmentTask.Reminder = Reminder.FifteenMinutes;
			saveAppointmentTask.AppointmentStatus = Microsoft.Phone.UserData.AppointmentStatus.Busy;
			saveAppointmentTask.Show();
		}

		public void getCalendarEventData(String str) {
			ButtonAppointments_Click();
		}

		private void ButtonAppointments_Click() {
			Appointments appts = new Appointments();

			//Identify the method that runs after the asynchronous search completes.
			appts.SearchCompleted += new EventHandler < AppointmentsSearchEventArgs > (Appointments_SearchCompleted);

			DateTime start = DateTime.Now;
			DateTime end = start.AddDays(7);
			int max = 20;

			//Start the asynchronous search.
			appts.SearchAsync(start, end, max, "Appointments Test #1");
		}

		void Appointments_SearchCompleted(object sender, AppointmentsSearchEventArgs e) {
			//Do something with the results.
			//MessageBox.Show(e.Results.Count().ToString());
			try {
				e.Results.ToList();
				MessageBox.Show("Success");
			} catch (System.Exception) {}

		}
	}
}

Refer plugin in config.xml-

<feature name="AddCalendarEvents">
        <param name="wp-package" value="AddCalendarEvents" />
        <param name="onload" value="true" />
    </feature>

 

If you have basic knowledge of Cordova it should not be tough.

You can call it using

var inputCalendarString = notes + '|' + title + '|' + location + '|' + appointmentDate.getFullYear() + '|' + (appointmentDate.getMonth() + 1) + '|' + appointmentDate.getDate() + '|' + '1.0' + '|' + ' ';
cordova.exec(null, null, "AddCalendarEvents", "addCalendarEvents", inputCalendarString);

It works for one event but if you have loop of events it will not work. To support multiple events, you can maintain Localstorage flag & data with current index of events data. Use resume callback to add rest of the events using custom appointment plugin that you wrote. Each time your app resumes you increment index and add events data from next index.

document.addEventListener('resume', this.resumeApp, false)
resumeApp: function () {
if (localStorage.getItem('updatecalendar') == 'false') {
syncUpdatedCalendarWP8();
      }
}

Happy Coding!

Advertisements