UNPKG

nativescript-calendar

Version:

Interact with the native calendar. Add, Update, Read, you name it.

538 lines (537 loc) 27.2 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.deleteCalendar = exports.createEvent = exports.deleteEvents = exports.findEvents = exports.listCalendars = exports.requestPermission = exports.hasPermission = void 0; var core_1 = require("@nativescript/core"); var calendar_common_1 = require("./calendar-common"); var PERMISSION_REQUEST_CODE = 2222; var ActivityCompatPackageName = useAndroidX() ? global.androidx.core.app : android.support.v4.app; var ContextCompatPackageName = useAndroidX() ? global.androidx.core.content : android.support.v4.content; function useAndroidX() { return global.androidx && global.androidx.appcompat; } calendar_common_1.Calendar._fields = { EVENT_ID: android.provider.CalendarContract.Instances.EVENT_ID, CALENDAR: { ID: "calendar_id", NAME: "calendar_displayName", TYPE: "calendar_type" }, TITLE: "title", MESSAGE: "description", LOCATION: "eventLocation", STARTDATE: "dtstart", ENDDATE: "dtend", BEGIN: "begin", END: "end", ALLDAY: "allDay", TIMEZONE: "eventTimezone", HAS_ALARM: "hasAlarm", RRULE: "rrule" }; calendar_common_1.Calendar._remindersFields = { ID: android.provider.CalendarContract.Reminders._ID, EVENT_ID: android.provider.CalendarContract.Reminders.EVENT_ID, MINUTES: "minutes", METHOD: "method" }; calendar_common_1.Calendar._attendeesFields = { EVENT_ID: android.provider.CalendarContract.AttendeesColumns.EVENT_ID, ATTENDEE_NAME: android.provider.CalendarContract.AttendeesColumns.ATTENDEE_NAME, ATTENDEE_EMAIL: android.provider.CalendarContract.AttendeesColumns.ATTENDEE_EMAIL, ATTENDEE_TYPE: android.provider.CalendarContract.AttendeesColumns.ATTENDEE_TYPE, ATTENDEE_STATUS: android.provider.CalendarContract.AttendeesColumns.ATTENDEE_STATUS }; (function () { core_1.Application.android.on(core_1.AndroidApplication.activityRequestPermissionsEvent, function (args) { if (args.requestCode !== PERMISSION_REQUEST_CODE) { return; } for (var i = 0; i < args.permissions.length; i++) { if (args.grantResults[i] === android.content.pm.PackageManager.PERMISSION_DENIED) { calendar_common_1.Calendar._reject("Please allow access to the Calendar and try again."); return; } } if (calendar_common_1.Calendar._onPermissionGranted) { calendar_common_1.Calendar._onPermissionGranted(); } else { console.log("No after-permission callback function specified for requestCode " + args.requestCode + ". That's a bug in the nativescript-calendar plugin, please report it!"); } }); })(); calendar_common_1.Calendar._hasPermission = function (perms) { if (android.os.Build.VERSION.SDK_INT < 23) { return true; } for (var _i = 0, perms_1 = perms; _i < perms_1.length; _i++) { var permission = perms_1[_i]; if (android.content.pm.PackageManager.PERMISSION_GRANTED !== ContextCompatPackageName.ContextCompat.checkSelfPermission(core_1.Utils.ad.getApplicationContext(), permission)) { return false; } } return true; }; calendar_common_1.Calendar._hasReadPermission = function () { return calendar_common_1.Calendar._hasPermission([android.Manifest.permission.READ_CALENDAR]); }; calendar_common_1.Calendar._hasWritePermission = function () { return calendar_common_1.Calendar._hasPermission([android.Manifest.permission.WRITE_CALENDAR]); }; calendar_common_1.Calendar._hasReadWritePermission = function () { return calendar_common_1.Calendar._hasPermission([android.Manifest.permission.READ_CALENDAR, android.Manifest.permission.WRITE_CALENDAR]); }; calendar_common_1.Calendar._requestPermission = function (permissions, onPermissionGranted, reject) { calendar_common_1.Calendar._onPermissionGranted = onPermissionGranted; calendar_common_1.Calendar._reject = reject; ActivityCompatPackageName.ActivityCompat.requestPermissions(core_1.Application.android.foregroundActivity, permissions, PERMISSION_REQUEST_CODE); }; calendar_common_1.Calendar._requestReadPermission = function (onPermissionGranted, reject) { calendar_common_1.Calendar._requestPermission([android.Manifest.permission.READ_CALENDAR], onPermissionGranted, reject); }; calendar_common_1.Calendar._requestWritePermission = function (onPermissionGranted, reject) { calendar_common_1.Calendar._requestPermission([android.Manifest.permission.WRITE_CALENDAR], onPermissionGranted, reject); }; calendar_common_1.Calendar._requestReadWritePermission = function (onPermissionGranted, reject) { calendar_common_1.Calendar._requestPermission([android.Manifest.permission.READ_CALENDAR, android.Manifest.permission.WRITE_CALENDAR], onPermissionGranted, reject); }; function hasPermission(arg) { return new Promise(function (resolve, reject) { try { resolve(calendar_common_1.Calendar._hasPermission([android.Manifest.permission.READ_CALENDAR, android.Manifest.permission.WRITE_CALENDAR])); } catch (ex) { console.log("Error in Calendar.hasPermission: " + ex); reject(ex); } }); } exports.hasPermission = hasPermission; function requestPermission() { return new Promise(function (resolve, reject) { try { calendar_common_1.Calendar._requestPermission([android.Manifest.permission.READ_CALENDAR, android.Manifest.permission.WRITE_CALENDAR], resolve, reject); } catch (ex) { console.log("Error in Calendar.requestPermission: " + ex); reject(ex); } }); } exports.requestPermission = requestPermission; calendar_common_1.Calendar._findCalendars = function (filterByName) { var projection = [ "_id", "name", "calendar_displayName" ]; var sortOrder = null; var selections = null; var selection = "visible=1"; var contentResolver = core_1.Utils.ad.getApplicationContext().getContentResolver(); var uriBuilder = android.provider.CalendarContract.Calendars.CONTENT_URI.buildUpon(); var uri = uriBuilder.build(); var cursor = contentResolver.query(uri, projection, selection, selections, sortOrder); var calendars = []; if (cursor.moveToFirst()) { do { var name_1 = cursor.getString(1); var calendar_display_name = cursor.getString(cursor.getColumnIndex(calendar_common_1.Calendar._fields.CALENDAR.NAME)); if (!filterByName || filterByName === name_1 || filterByName === calendar_display_name) { calendars.push({ id: cursor.getString(0), name: name_1 ? name_1 : calendar_display_name, displayName: calendar_display_name }); } } while (cursor.moveToNext()); } return calendars; }; calendar_common_1.Calendar._findEvents = function (arg) { var settings = calendar_common_1.Calendar.merge(arg, calendar_common_1.Calendar.defaults); var projection = [ calendar_common_1.Calendar._fields.EVENT_ID, calendar_common_1.Calendar._fields.CALENDAR.ID, calendar_common_1.Calendar._fields.CALENDAR.NAME, calendar_common_1.Calendar._fields.TITLE, calendar_common_1.Calendar._fields.MESSAGE, calendar_common_1.Calendar._fields.LOCATION, calendar_common_1.Calendar._fields.STARTDATE, calendar_common_1.Calendar._fields.ENDDATE, calendar_common_1.Calendar._fields.ALLDAY, calendar_common_1.Calendar._fields.RRULE, calendar_common_1.Calendar._fields.BEGIN, calendar_common_1.Calendar._fields.END ]; var sortOrder = android.provider.CalendarContract.Instances.BEGIN + " ASC, " + android.provider.CalendarContract.Instances.END + " ASC"; var selection = ""; var selections = []; if (settings.id !== undefined) { selection += calendar_common_1.Calendar._fields.EVENT_ID + " = ?"; selections.push(settings.id); } else { if (settings.title !== undefined) { selection += calendar_common_1.Calendar._fields.TITLE + " LIKE ?"; selections.push("%" + settings.title + "%"); } if (settings.location !== undefined) { if ("" !== selection) { selection += " AND "; } selection += calendar_common_1.Calendar._fields.LOCATION + " LIKE ?"; selections.push("%" + settings.location + "%"); } } var uriBuilder = android.provider.CalendarContract.Instances.CONTENT_URI.buildUpon(); android.content.ContentUris.appendId(uriBuilder, settings.startDate.getTime()); android.content.ContentUris.appendId(uriBuilder, settings.endDate.getTime()); var contentResolver = core_1.Utils.ad.getApplicationContext().getContentResolver(); var uri = uriBuilder.build(); var cursor = contentResolver.query(uri, projection, selection, selections, sortOrder); var events = []; if (cursor.moveToFirst()) { var _loop_1 = function () { var recurrence = void 0; var recurrenceRule = cursor.getString(cursor.getColumnIndex(calendar_common_1.Calendar._fields.RRULE)); if (recurrenceRule) { var frequency_1; var interval_1; var count_1; var endDate_1 = null; var rules = recurrenceRule.split(";"); rules.forEach(function (rule) { var ruleType = rule.split("=")[0]; var ruleValue = rule.split("=")[1]; if (ruleType === "FREQ") { frequency_1 = ruleValue.toLowerCase(); } else if (ruleType === "INTERVAL") { interval_1 = +ruleValue; } else if (ruleType === "UNTIL" && ruleValue.length === 8) { endDate_1 = new Date(+ruleValue.substring(0, 4), +ruleValue.substring(4, 6) - 1, +ruleValue.substring(6, 8)); } else if (ruleType === "COUNT") { count_1 = +ruleValue; } }); recurrence = { frequency: frequency_1, interval: interval_1, endDate: endDate_1, count: count_1 }; } var event_1 = { id: cursor.getString(cursor.getColumnIndex(calendar_common_1.Calendar._fields.EVENT_ID)), title: cursor.getString(cursor.getColumnIndex(calendar_common_1.Calendar._fields.TITLE)), notes: cursor.getString(cursor.getColumnIndex(calendar_common_1.Calendar._fields.MESSAGE)), location: cursor.getString(cursor.getColumnIndex(calendar_common_1.Calendar._fields.LOCATION)), startDate: recurrence ? new Date(cursor.getLong(cursor.getColumnIndex(calendar_common_1.Calendar._fields.BEGIN))) : new Date(cursor.getLong(cursor.getColumnIndex(calendar_common_1.Calendar._fields.STARTDATE))), endDate: recurrence ? new Date(cursor.getLong(cursor.getColumnIndex(calendar_common_1.Calendar._fields.END))) : new Date(cursor.getLong(cursor.getColumnIndex(calendar_common_1.Calendar._fields.ENDDATE))), allDay: cursor.getInt(cursor.getColumnIndex(calendar_common_1.Calendar._fields.ALLDAY)) === 1, calendar: { id: cursor.getString(cursor.getColumnIndex(calendar_common_1.Calendar._fields.CALENDAR.ID)), name: cursor.getString(cursor.getColumnIndex(calendar_common_1.Calendar._fields.CALENDAR.NAME)), displayName: cursor.getString(cursor.getColumnIndex(calendar_common_1.Calendar._fields.CALENDAR.NAME)) }, recurrence: recurrence, }; event_1.reminders = calendar_common_1.Calendar._findReminders(event_1.id); event_1.attendees = calendar_common_1.Calendar._findAttendees(event_1.id); events.push(event_1); }; do { _loop_1(); } while (cursor.moveToNext()); } return events; }; calendar_common_1.Calendar._findReminders = function (eventId) { var projection = [ calendar_common_1.Calendar._remindersFields.MINUTES ]; var selection = ""; var selectionArgs = []; selection += calendar_common_1.Calendar._remindersFields.EVENT_ID + " = ?"; selectionArgs.push(eventId); var uriBuilder = android.provider.CalendarContract.Reminders.CONTENT_URI.buildUpon(); var contentResolver = core_1.Utils.ad.getApplicationContext().getContentResolver(); var uri = uriBuilder.build(); var cursor = contentResolver.query(uri, projection, selection, selectionArgs, null); var reminders = []; if (cursor.moveToFirst()) { do { var reminder = { minutes: cursor.getLong(cursor.getColumnIndex(calendar_common_1.Calendar._remindersFields.MINUTES)) }; reminders.push(reminder); } while (cursor.moveToNext()); } return reminders; }; calendar_common_1.Calendar._findAttendees = function (eventId) { var projection = []; var selection = ""; var selectionArgs = []; selection += calendar_common_1.Calendar._attendeesFields.EVENT_ID + " = ?"; selectionArgs.push(eventId); var uriBuilder = android.provider.CalendarContract.Attendees.CONTENT_URI.buildUpon(); var contentResolver = core_1.Utils.ad.getApplicationContext().getContentResolver(); var uri = uriBuilder.build(); var cursor = contentResolver.query(uri, projection, selection, selectionArgs, null); var attendees = []; if (cursor.moveToFirst()) { do { var attendeeTypes = ["Unknown", "Optional", "Required", "Room"]; var attendeeStatuses = ["Unknown", "Accepted", "Declined", "Invited", "Tentative"]; var attendee_type = cursor.getShort(cursor.getColumnIndex(calendar_common_1.Calendar._attendeesFields.ATTENDEE_TYPE)) ? attendeeTypes[cursor.getShort(cursor.getColumnIndex(calendar_common_1.Calendar._attendeesFields.ATTENDEE_TYPE))] : attendeeTypes[0]; var attendee_status = cursor.getShort(cursor.getColumnIndex(calendar_common_1.Calendar._attendeesFields.ATTENDEE_STATUS)) ? attendeeStatuses[cursor.getShort(cursor.getColumnIndex(calendar_common_1.Calendar._attendeesFields.ATTENDEE_STATUS))] : attendeeStatuses[0]; var attendee = { name: cursor.getString(cursor.getColumnIndex(calendar_common_1.Calendar._attendeesFields.ATTENDEE_NAME)), email: cursor.getString(cursor.getColumnIndex(calendar_common_1.Calendar._attendeesFields.ATTENDEE_EMAIL)), url: '', status: attendee_status, role: "Unknown", type: attendee_type }; attendees.push(attendee); } while (cursor.moveToNext()); } return attendees; }; function listCalendars(arg) { return new Promise(function (resolve, reject) { try { var onPermissionGranted = function () { resolve(calendar_common_1.Calendar._findCalendars()); }; if (!calendar_common_1.Calendar._hasReadPermission()) { calendar_common_1.Calendar._requestReadPermission(onPermissionGranted, reject); return; } onPermissionGranted(); } catch (ex) { console.log("Error in Calendar.listCalendars: " + ex); reject(ex); } }); } exports.listCalendars = listCalendars; function findEvents(arg) { return new Promise(function (resolve, reject) { try { if (!arg.startDate || !arg.endDate) { reject("startDate and endDate are mandatory"); return; } var onPermissionGranted = function () { resolve(calendar_common_1.Calendar._findEvents(arg)); }; if (!calendar_common_1.Calendar._hasReadPermission()) { calendar_common_1.Calendar._requestReadPermission(onPermissionGranted, reject); return; } onPermissionGranted(); } catch (ex) { console.log("Error in Calendar.findEvents: " + ex); reject(ex); } }); } exports.findEvents = findEvents; function deleteEvents(arg) { return new Promise(function (resolve, reject) { try { if (!arg.startDate || !arg.endDate) { reject("startDate and endDate are mandatory"); return; } var onPermissionGranted = function () { var events = calendar_common_1.Calendar._findEvents(arg); var ContentResolver = core_1.Utils.ad.getApplicationContext().getContentResolver(); var deletedEventIds = []; for (var e in events) { var event_2 = events[e]; try { ContentResolver.delete(android.provider.CalendarContract.Events.CONTENT_URI, "_id = ?", [event_2.id]); deletedEventIds.push(event_2.id); } catch (e) { console.log("Failed to delete event " + event_2.id + ": " + event_2.title + ", error: " + e); } } resolve(deletedEventIds); }; if (!calendar_common_1.Calendar._hasReadWritePermission()) { calendar_common_1.Calendar._requestReadWritePermission(onPermissionGranted, reject); return; } onPermissionGranted(); } catch (ex) { console.log("Error in Calendar.deleteEvents: " + ex); reject(ex); } }); } exports.deleteEvents = deleteEvents; function createEvent(arg) { return new Promise(function (resolve, reject) { try { var settings_1 = calendar_common_1.Calendar.merge(arg, calendar_common_1.Calendar.defaults); if (!settings_1.startDate || !settings_1.endDate) { reject("startDate and endDate are mandatory"); return; } if (!arg || !arg.reminders) { settings_1.reminders = null; } var onPermissionGranted = function () { var ContentValues = new android.content.ContentValues(); var Events = android.provider.CalendarContract.Events; ContentValues.put(calendar_common_1.Calendar._fields.TIMEZONE, java.util.TimeZone.getDefault().getID()); ContentValues.put(calendar_common_1.Calendar._fields.STARTDATE, new java.lang.Long(settings_1.startDate.getTime())); ContentValues.put(calendar_common_1.Calendar._fields.ENDDATE, new java.lang.Long(settings_1.endDate.getTime())); ContentValues.put(calendar_common_1.Calendar._fields.TITLE, settings_1.title); ContentValues.put(calendar_common_1.Calendar._fields.LOCATION, settings_1.location); var description = settings_1.notes; if (settings_1.url) { if (settings_1.notes) { description += " " + settings_1.url; } else { description = settings_1.url; } } ContentValues.put(calendar_common_1.Calendar._fields.MESSAGE, description); var ContentResolver = core_1.Utils.ad.getApplicationContext().getContentResolver(); ContentValues.put(calendar_common_1.Calendar._fields.HAS_ALARM, new java.lang.Integer(settings_1.reminders && (settings_1.reminders.first || settings_1.reminders.second) ? 1 : 0)); var calendarId = null; if (settings_1.calendar.name !== null) { var calendars = calendar_common_1.Calendar._findCalendars(settings_1.calendar.name); if (calendars.length > 0) { calendarId = calendars[0].id; } else { var calUri = android.provider.CalendarContract.Calendars.CONTENT_URI; var calendarContentValues = new android.content.ContentValues(); var accountName = settings_1.calendar.accountName || settings_1.calendar.name || "AccountName"; calendarContentValues.put("account_name", accountName); calendarContentValues.put("account_type", "LOCAL"); calendarContentValues.put("name", settings_1.calendar.name); calendarContentValues.put("calendar_displayName", settings_1.calendar.name); calendarContentValues.put("calendar_access_level", new java.lang.Integer(700)); calendarContentValues.put("ownerAccount", accountName); if (settings_1.calendar.color && core_1.Color.isValid(settings_1.calendar.color)) { var androidColor = new core_1.Color(settings_1.calendar.color).android; calendarContentValues.put("calendar_color", new java.lang.Integer(androidColor)); } calendarContentValues.put("visible", new java.lang.Integer(1)); calendarContentValues.put("sync_events", new java.lang.Integer(1)); calUri = calUri.buildUpon() .appendQueryParameter("caller_is_syncadapter", "true") .appendQueryParameter("account_name", accountName) .appendQueryParameter("account_type", "LOCAL") .build(); ContentResolver.insert(calUri, calendarContentValues); var cals = calendar_common_1.Calendar._findCalendars(settings_1.calendar.name); if (cals.length > 0) { calendarId = cals[0].id; } } } if (calendarId === null) { calendarId = settings_1.calendar.id; } ContentValues.put(calendar_common_1.Calendar._fields.CALENDAR.ID, new java.lang.Integer(calendarId)); if (settings_1.recurrence.frequency !== null) { if (settings_1.recurrence.endDate === null) { ContentValues.put(calendar_common_1.Calendar._fields.RRULE, "FREQ=" + settings_1.recurrence.frequency.toUpperCase() + ";INTERVAL=" + settings_1.recurrence.interval); } else { var endDate = arg.recurrence.endDate; var yyyy = endDate.getFullYear().toString(); var mm = (endDate.getMonth() + 1).toString(); var dd = endDate.getDate().toString(); var yyyymmdd = yyyy + (mm[1] ? mm : "0" + mm[0]) + (dd[1] ? dd : "0" + dd[0]); ContentValues.put(calendar_common_1.Calendar._fields.RRULE, "FREQ=" + settings_1.recurrence.frequency.toUpperCase() + ";INTERVAL=" + settings_1.recurrence.interval + ";UNTIL=" + yyyymmdd); } } var eventsUri = android.net.Uri.parse("content://com.android.calendar/events"); var uri = ContentResolver.insert(eventsUri, ContentValues); var createdEventID = uri.getLastPathSegment(); if (settings_1.reminders && settings_1.reminders.first) { var firstReminderContentValues = new android.content.ContentValues(); firstReminderContentValues.put("event_id", createdEventID); firstReminderContentValues.put("minutes", new java.lang.Long(settings_1.reminders.first)); firstReminderContentValues.put("method", new java.lang.Integer(1)); ContentResolver.insert(android.net.Uri.parse("content://com.android.calendar/reminders"), firstReminderContentValues); } if (settings_1.reminders && settings_1.reminders.second) { var secondReminderContentValues = new android.content.ContentValues(); secondReminderContentValues.put("event_id", createdEventID); secondReminderContentValues.put("minutes", new java.lang.Long(settings_1.reminders.second)); secondReminderContentValues.put("method", new java.lang.Integer(1)); ContentResolver.insert(android.net.Uri.parse("content://com.android.calendar/reminders"), secondReminderContentValues); } resolve(createdEventID); }; if (!calendar_common_1.Calendar._hasReadWritePermission()) { calendar_common_1.Calendar._requestReadWritePermission(onPermissionGranted, reject); return; } onPermissionGranted(); } catch (ex) { console.log("Error in Calendar.createEvent: " + ex); reject(ex); } }); } exports.createEvent = createEvent; function deleteCalendar(arg) { return new Promise(function (resolve, reject) { try { if (!arg.name) { reject("name is mandatory"); return; } var onPermissionGranted = function () { var calendars = calendar_common_1.Calendar._findCalendars(arg.name); var deletedCalId = null; if (calendars.length > 0) { var calUri = android.provider.CalendarContract.Calendars.CONTENT_URI; var ContentResolver = core_1.Utils.ad.getApplicationContext().getContentResolver(); for (var c in calendars) { var calendar = calendars[c]; try { ContentResolver.delete(calUri, "_id = ?", ["" + calendar.id]); deletedCalId = calendar.id; } catch (e) { reject(e); } } } resolve(deletedCalId); }; if (!calendar_common_1.Calendar._hasReadWritePermission()) { calendar_common_1.Calendar._requestReadWritePermission(onPermissionGranted, reject); return; } onPermissionGranted(); } catch (ex) { console.log("Error in Calendar.deleteCalendar: " + ex); reject(ex); } }); } exports.deleteCalendar = deleteCalendar;