Search in sources :

Example 1 with VCalendar

use of com.android.calendar.icalendar.VCalendar in project Etar-Calendar by Etar-Group.

the class EventInfoFragment method shareEvent.

/**
     * Generates an .ics formatted file with the event info and launches intent chooser to
     * share said file
     */
private void shareEvent(ShareType type) {
    // Create the respective ICalendar objects from the event info
    VCalendar calendar = new VCalendar();
    calendar.addProperty(VCalendar.VERSION, "2.0");
    calendar.addProperty(VCalendar.PRODID, VCalendar.PRODUCT_IDENTIFIER);
    calendar.addProperty(VCalendar.CALSCALE, "GREGORIAN");
    calendar.addProperty(VCalendar.METHOD, "REQUEST");
    VEvent event = new VEvent();
    mEventCursor.moveToFirst();
    // Add event start and end datetime
    if (!mAllDay) {
        String eventTimeZone = mEventCursor.getString(EVENT_INDEX_EVENT_TIMEZONE);
        event.addEventStart(mStartMillis, eventTimeZone);
        event.addEventEnd(mEndMillis, eventTimeZone);
    } else {
        // All-day events' start and end time are stored as UTC.
        // Treat the event start and end time as being in the local time zone and convert them
        // to the corresponding UTC datetime. If the UTC time is used as is, the ical recipients
        // will report the wrong start and end time (+/- 1 day) for the event as they will
        // convert the UTC time to their respective local time-zones
        String localTimeZone = Utils.getTimeZone(mActivity, mTZUpdater);
        long eventStart = IcalendarUtils.convertTimeToUtc(mStartMillis, localTimeZone);
        long eventEnd = IcalendarUtils.convertTimeToUtc(mEndMillis, localTimeZone);
        event.addEventStart(eventStart, "UTC");
        event.addEventEnd(eventEnd, "UTC");
    }
    event.addProperty(VEvent.LOCATION, mEventCursor.getString(EVENT_INDEX_EVENT_LOCATION));
    event.addProperty(VEvent.DESCRIPTION, mEventCursor.getString(EVENT_INDEX_DESCRIPTION));
    event.addProperty(VEvent.SUMMARY, mEventCursor.getString(EVENT_INDEX_TITLE));
    event.addOrganizer(new Organizer(mEventOrganizerDisplayName, mEventOrganizerEmail));
    // Add Attendees to event
    for (Attendee attendee : mAcceptedAttendees) {
        IcalendarUtils.addAttendeeToEvent(attendee, event);
    }
    for (Attendee attendee : mDeclinedAttendees) {
        IcalendarUtils.addAttendeeToEvent(attendee, event);
    }
    for (Attendee attendee : mTentativeAttendees) {
        IcalendarUtils.addAttendeeToEvent(attendee, event);
    }
    for (Attendee attendee : mNoResponseAttendees) {
        IcalendarUtils.addAttendeeToEvent(attendee, event);
    }
    // Compose all of the ICalendar objects
    calendar.addEvent(event);
    // Create and share ics file
    boolean isShareSuccessful = false;
    try {
        // Event title serves as the file name prefix
        String filePrefix = event.getProperty(VEvent.SUMMARY);
        if (filePrefix == null || filePrefix.length() < 3) {
            // Default to a generic filename if event title doesn't qualify
            // Prefix length constraint is imposed by File#createTempFile
            filePrefix = "invite";
        }
        filePrefix = filePrefix.replaceAll("\\W+", " ");
        if (!filePrefix.endsWith(" ")) {
            filePrefix += " ";
        }
        File dir;
        if (type == ShareType.SDCARD) {
            dir = EXPORT_SDCARD_DIRECTORY;
            if (!dir.exists()) {
                dir.mkdir();
            }
        } else {
            dir = mActivity.getExternalCacheDir();
        }
        File inviteFile = IcalendarUtils.createTempFile(filePrefix, ".ics", dir);
        if (IcalendarUtils.writeCalendarToFile(calendar, inviteFile)) {
            if (type == ShareType.INTENT) {
                // Set world-readable
                inviteFile.setReadable(true, false);
                Intent shareIntent = new Intent();
                shareIntent.setAction(Intent.ACTION_SEND);
                shareIntent.putExtra(Intent.EXTRA_STREAM, Uri.fromFile(inviteFile));
                // The ics file is sent as an extra, the receiving application decides whether
                // to parse the file to extract calendar events or treat it as a regular file
                shareIntent.setType("application/octet-stream");
                Intent chooserIntent = Intent.createChooser(shareIntent, getResources().getString(R.string.cal_share_intent_title));
                // The MMS app only responds to "text/x-vcalendar" so we create a chooser intent
                // that includes the targeted mms intent + any that respond to the above general
                // purpose "application/octet-stream" intent.
                File vcsInviteFile = File.createTempFile(filePrefix, ".vcs", mActivity.getExternalCacheDir());
                // TODO: revisit above
                if (IcalendarUtils.copyFile(inviteFile, vcsInviteFile)) {
                    Intent mmsShareIntent = new Intent();
                    mmsShareIntent.setAction(Intent.ACTION_SEND);
                    mmsShareIntent.setPackage("com.android.mms");
                    mmsShareIntent.putExtra(Intent.EXTRA_STREAM, Uri.fromFile(vcsInviteFile));
                    mmsShareIntent.setType("text/x-vcalendar");
                    chooserIntent.putExtra(Intent.EXTRA_INITIAL_INTENTS, new Intent[] { mmsShareIntent });
                }
                startActivity(chooserIntent);
            } else {
                String msg = getString(R.string.cal_export_succ_msg);
                Toast.makeText(mActivity, String.format(msg, inviteFile), Toast.LENGTH_SHORT).show();
            }
            isShareSuccessful = true;
        } else {
            // Error writing event info to file
            isShareSuccessful = false;
        }
    } catch (IOException e) {
        e.printStackTrace();
        isShareSuccessful = false;
    }
    if (!isShareSuccessful) {
        Log.e(TAG, "Couldn't generate ics file");
        Toast.makeText(mActivity, R.string.error_generating_ics, Toast.LENGTH_SHORT).show();
    }
}
Also used : VEvent(com.android.calendar.icalendar.VEvent) VCalendar(com.android.calendar.icalendar.VCalendar) Organizer(com.android.calendar.icalendar.Organizer) Intent(android.content.Intent) IOException(java.io.IOException) File(java.io.File) Attendee(com.android.calendar.CalendarEventModel.Attendee)

Example 2 with VCalendar

use of com.android.calendar.icalendar.VCalendar in project Etar-Calendar by Etar-Group.

the class ImportActivity method parseCalFile.

private void parseCalFile() {
    Uri uri = getIntent().getData();
    VCalendar calendar = IcalendarUtils.readCalendarFromFile(this, uri);
    if (calendar == null) {
        showErrorToast();
        return;
    }
    Intent calIntent = new Intent(Intent.ACTION_INSERT);
    calIntent.setType("vnd.android.cursor.item/event");
    LinkedList<VEvent> events = calendar.getAllEvents();
    if (events == null) {
        showErrorToast();
        return;
    }
    VEvent firstEvent = calendar.getAllEvents().getFirst();
    calIntent.putExtra(CalendarContract.Events.TITLE, IcalendarUtils.uncleanseString(firstEvent.getProperty(VEvent.SUMMARY)));
    calIntent.putExtra(CalendarContract.Events.EVENT_LOCATION, IcalendarUtils.uncleanseString(firstEvent.getProperty(VEvent.LOCATION)));
    calIntent.putExtra(CalendarContract.Events.DESCRIPTION, IcalendarUtils.uncleanseString(firstEvent.getProperty(VEvent.DESCRIPTION)));
    calIntent.putExtra(CalendarContract.Events.ORGANIZER, IcalendarUtils.uncleanseString(firstEvent.getProperty(VEvent.ORGANIZER)));
    if (firstEvent.mAttendees.size() > 0) {
        StringBuilder builder = new StringBuilder();
        for (Attendee attendee : firstEvent.mAttendees) {
            builder.append(attendee.mEmail);
            builder.append(",");
        }
        calIntent.putExtra(Intent.EXTRA_EMAIL, builder.toString());
    }
    String dtStart = firstEvent.getProperty(VEvent.DTSTART);
    if (!TextUtils.isEmpty(dtStart)) {
        calIntent.putExtra(CalendarContract.EXTRA_EVENT_BEGIN_TIME, getLocalTimeFromString(dtStart));
    }
    String dtEnd = firstEvent.getProperty(VEvent.DTEND);
    if (!TextUtils.isEmpty(dtEnd)) {
        calIntent.putExtra(CalendarContract.EXTRA_EVENT_END_TIME, getLocalTimeFromString(dtEnd));
    }
    calIntent.putExtra(EditEventActivity.EXTRA_READ_ONLY, true);
    try {
        startActivity(calIntent);
    } catch (ActivityNotFoundException e) {
    // Oh well...
    } finally {
        finish();
    }
}
Also used : VEvent(com.android.calendar.icalendar.VEvent) VCalendar(com.android.calendar.icalendar.VCalendar) ActivityNotFoundException(android.content.ActivityNotFoundException) Intent(android.content.Intent) Uri(android.net.Uri) Attendee(com.android.calendar.icalendar.Attendee)

Aggregations

Intent (android.content.Intent)2 VCalendar (com.android.calendar.icalendar.VCalendar)2 VEvent (com.android.calendar.icalendar.VEvent)2 ActivityNotFoundException (android.content.ActivityNotFoundException)1 Uri (android.net.Uri)1 Attendee (com.android.calendar.CalendarEventModel.Attendee)1 Attendee (com.android.calendar.icalendar.Attendee)1 Organizer (com.android.calendar.icalendar.Organizer)1 File (java.io.File)1 IOException (java.io.IOException)1