What I want to do is to delete only the content that is saved by me in the calendar instead of all the content which is already present in the calendar. For that, I use the following code. But it will delete all the content of the calendar. So can anyone tell me how that can be prevented?
Uri CALENDAR_URI = Uri.parse("content://calendar/events");
ContentResolver cr = getContentResolver();
cr.delete(CALENDAR_URI, null, null); // Delete all
ContentValues values = new ContentValues();
values.put("calendar_id", 1);
values.put("title", this.title);
values.put("allDay", this.allDay);
values.put("dtstart", this.dtstart.toMillis(false));
values.put("dtend", this.dtend.toMillis(false));
values.put("description", this.description);
values.put("eventLocation", this.eventLocation);
values.put("visibility", this.visibility);
values.put("hasAlarm", this.hasAlarm);
cr.insert(CALENDAR_URI, values);
So what I want is to delete only that entry that is put by me.
Deleting the event
Uri EVENTS_URI = Uri.parse("content://com.android.calendar/" + "events");
ContentResolver cr = c.getContentResolver();
deleteEvent(cr, EVENTS_URI, 1);
private void deleteEvent(ContentResolver resolver, Uri eventsUri, int calendarId) {
Cursor cursor;
cursor = resolver.query(eventsUri, new String[]{ "_id" }, "calendar_id=" + calendarId, null, null);
while(cursor.moveToNext()) {
long eventId = cursor.getLong(cursor.getColumnIndex("_id"));
resolver.delete(ContentUris.withAppendedId(eventsUri, eventId), null, null);
}
cursor.close();
}
After reading the data from the Calendar just try this out..
Adding a Single-Occurrence Event to a Calendar
To add an entry to a specific calendar, we need to configure a calendar entry to insert using the ContentValues as follows:
ContentValues event = new ContentValues();
Each event needs to be tied to a specific Calendar, so the first thing you're going to want to set is the identifier of the Calendar to insert this event into:
event.put("calendar_id", calId);
We then set some of the basic information about the event, including String fields such as the event title, description and location.
event.put("title", "Event Title");
event.put("description", "Event Desc");
event.put("eventLocation", "Event Location");
There are a number of different options for configuring the time and date of an event.
We can set the event start and end information as follows:
long startTime = START_TIME_MS;
long endTime = END_TIME_MS;
event.put("dtstart", startTime);
event.put("dtend", endTime);
If we are adding a birthday or holiday, we would set the entry to be an all day event:
event.put("allDay", 1); // 0 for false, 1 for true
This information is sufficient for most entries. However, there are a number of other useful calendar entry attributes.
For example, you can set the event status to tentative (0), confirmed (1) or canceled (2):
event.put("eventStatus", 1);
You can control who can see this event by setting its visibility to default (0), confidential (1), private (2), or public (3):
event.put("visibility", 0);
You can control whether an event consumes time (can have schedule conflicts) on the calendar by setting its transparency to opaque (0) or transparent (1).
event.put("transparency", 0);
You can control whether an event triggers a reminder alarm as follows:
event.put("hasAlarm", 1); // 0 for false, 1 for true
Once the calendar event is configured correctly, we're ready to use the ContentResolver to insert the new calendar entry into the appropriate Uri for calendar events:
Uri eventsUri = Uri.parse("content://calendar/events");
Uri url = getContentResolver().insert(eventsUri, event);
The call to the insert() method contacts the Calendar content provider and attempts to insert the entry into the appropriate user Calendar. If you navigate to the Calendar application and launch it, you should see your calendar entry in the appropriate Calendar. Since the Calendar syncs, you will also see the Calendar entry online, if you're using the Google Calendar on the web.
Delete the event
private int DeleteCalendarEntry(int entryID) {
int iNumRowsDeleted = 0;
Uri eventsUri = Uri.parse(getCalendarUriBase()+"events");
Uri eventUri = ContentUris.withAppendedId(eventsUri, entryID);
iNumRowsDeleted = getContentResolver().delete(eventUri, null, null);
Log.i(DEBUG_TAG, "Deleted " + iNumRowsDeleted + " calendar entry.");
return iNumRowsDeleted;
}
Also go through this link for deleting
Related
So I encountered an issue on an Android 10 phone where deleted events are still present when I query the user's calendar. The problem persisted across several hours (3 at the time of writing this)
I've looked through the following posts already in an attempt to find solutions, but none of them seemed to have worked for me, and I'm not sure if I'm just implementing their solutions incorrectly, if something's wrong with the phone, or whatever else.
Here's the posts I mentioned above:
Calendar deleted event exists in cursor
Deleting events from Calendar not being deleted
Android CalendarContract, deleting a recurring event causes all events to disappear on calendar?
Querying android calendar retrieves even deleted events
I know that when a user deletes something off their calendar, there's a possibility of it hanging around in whatever DB or structure Android stores the events in with a dirty or deleted flag set. My problem is that the events are both still present, and have neither of the previously mentioned flags set.
Additionally, I know that it could be a sync issue between Google's calendar and whatever local datastore the events are being stored in, but this issue persisted on the phone I'm testing on even after pulling in newly created events from the user's calendar, which makes it seem to me that the local datastore and the calendar should be in sync.
Here's the full code for the file where this problem is occurring for me - some things may not be related to the issue but I'm including everything just in case.
package com.example.plumbingreportgenerator.util.calendar;
import android.content.ContentResolver;
import android.content.Context;
import android.database.Cursor;
import android.net.Uri;
import android.provider.CalendarContract;
import android.provider.CalendarContract.*;
import android.util.Log;
import java.util.ArrayList;
import java.util.List;
public class EventReader {
// the context of the application this is being used in
private Context applicationContext;
public static final String[] EVENT_PROJECTION = new String[] {
Events.CALENDAR_ID, // 0
Events.TITLE, // 1
Events.DTSTART, // 2
Events.DELETED,
Events.DIRTY
};
// The indices for the projection array above.
private static final int PROJECTION_CALENDAR_ID_INDEX = 0;
private static final int PROJECTION_TITLE_INDEX = 1;
private static final int PROJECTION_DTSTART_INDEX = 2;
private static final int PROJECTION_DELETED_INDEX = 3;
private static final int PROJECTION_DIRTY_INDEX = 4;
public EventReader(Context context){
applicationContext = context;
}
// use android and java date libraries to determine the start of the month given by year and month
private static long getStartOfMonth(int year, int month){
java.util.Calendar cal = java.util.Calendar.getInstance();
cal.set(java.util.Calendar.YEAR, year);
cal.set(java.util.Calendar.MONTH, month);
cal.set(java.util.Calendar.DAY_OF_MONTH, 1);
cal.set(java.util.Calendar.HOUR_OF_DAY, 0);
cal.set(java.util.Calendar.MINUTE, 0);
cal.set(java.util.Calendar.SECOND, 0);
cal.set(java.util.Calendar.MILLISECOND, 0);
return cal.getTimeInMillis();
}
private static long getEndOfMonth(int year, int month){
java.util.Calendar cal = java.util.Calendar.getInstance();
cal.set(java.util.Calendar.YEAR, year);
cal.set(java.util.Calendar.MONTH, month);
cal.set(java.util.Calendar.DAY_OF_MONTH, cal.getActualMaximum(java.util.Calendar.DAY_OF_MONTH));
cal.set(java.util.Calendar.HOUR_OF_DAY, 23);
cal.set(java.util.Calendar.MINUTE, 59);
cal.set(java.util.Calendar.SECOND, 59);
cal.set(java.util.Calendar.MILLISECOND, 999);
return cal.getTimeInMillis();
}
// gets event titles for the given calendar from the given month
public ArrayList<EventTitleDateTuple> getEventDetailsForMonth(long calendarId, int year, int month){
// get the millisecond values for the start and end of the month given by year and month
long startOfMonth = getStartOfMonth(year, month);
long endOfMonth = getEndOfMonth(year, month);
// Create cursor and query for the events table
Cursor cur = null;
ContentResolver cr = applicationContext.getContentResolver();
Uri uri = Events.CONTENT_URI;
String selection = "((" + Events.CALENDAR_ID + " = ?) AND (" + Events.DELETED + " != 1) AND (" + Events.DIRTY + " != 1 ))";
String[] selectionArgs = new String[] {Long.toString(calendarId)};
// Submit the query and get a Cursor object back.
cur = cr.query(uri, EVENT_PROJECTION, selection, selectionArgs, null);
ArrayList<EventTitleDateTuple> eventDetails = new ArrayList<EventTitleDateTuple>();
while (cur.moveToNext()) {
long calID = 0;
String title = null;
long dtStart = 0;
// Get the field values
calID = cur.getLong(PROJECTION_CALENDAR_ID_INDEX);
title = cur.getString(PROJECTION_TITLE_INDEX);
int deleted = cur.getInt(PROJECTION_DELETED_INDEX);
int dirty = cur.getInt(PROJECTION_DIRTY_INDEX);
dtStart = cur.getLong(PROJECTION_DTSTART_INDEX);
// if the start date of the event is after this month and before the end of this month
if(dtStart >= startOfMonth && dtStart <= endOfMonth && title != null && title.length() > 0 && deleted != 1 && dirty != 1 && !title.contains("testy mates face")){
// the deleted events still make it through to here
eventDetails.add(new EventTitleDateTuple(title, dtStart));
}
}
cur.close();
return eventDetails;
}
}
This is not a problem with deleting events, it is problem with syncing. Sometimes in 2020/2021 Google added a "feature" (or a bug) in form of some kind of annoying cache.
In reality it means, from now on (unlike before) you simply never know if you have a fresh data or outdated data from their cache. The only way to somewhat force their cache to update regularly is to have constantly turned on auto-syncing of ALL CALENDARS, all the time.
This way changes take only seconds and Google Calendar cache is always being updated. If the auto-syncing of just 1 calendar is turned off, from unknown reasons cache is not updated on time and often it takes hours to reflect changes...
Similar problems can be find on these links:
Android CalendarContract.Instances table returns old values
Android Calendar Provider does not return latest data
Or even here on Google Support page:
https://support.google.com/calendar/thread/47536340?hl=en
I would love to know who in Google had this genius idea...Argh
I want to add the event in the calendar programmatically, and I have successfully done it. But when I call and calendar intent, It will open the calendar with event details on it. Users can modify that event before saving it.
So I want the event to be like noneditable. It will be good if it's getting added automatically. I have looked for so many solutions but nothing worked for me.
Thanks.
long calID = 3;
ContentResolver cr = getContentResolver();
ContentValues values = new ContentValues();
values.put(CalendarContract.Events.DTSTART, beginTime.getTimeInMillis());
values.put(CalendarContract.Events.ALL_DAY,false);
values.put(CalendarContract.Events.TITLE, projectName);
values.put(CalendarContract.Events.EVENT_LOCATION,projectAddress);
values.put(CalendarContract.Events.DESCRIPTION, eventDetail);
values.put(CalendarContract.Events.CALENDAR_ID, calID);
values.put(CalendarContract.Events.EVENT_TIMEZONE,"America/Los_Angeles");
values.put(CalendarContract.Events.DURATION,"+P1H");
cr.insert(CalendarContract.Events.CONTENT_URI, values);
Utility.getInstance().showSnackBar(rl_main, "Event addded to calendar
successfully!");
I have managed to pass through the "main" information into a calendar intent...
however when I try to add attendees to the intent, they are not inserted. Here is the code
startCalIntent = new Intent(Intent.ACTION_EDIT);
startCalIntent.setType("vnd.android.cursor.item/event");
startCalIntent.putExtra(Events.TITLE, title);
startCalIntent.putExtra(Events.EVENT_LOCATION, location);
startCalIntent.putExtra(Events.DESCRIPTION, details);
startCalIntent.putExtra(Events.ORGANIZER, organiser);
startCalIntent.putExtra(CalendarContract.EXTRA_EVENT_BEGIN_TIME, splitDateTime(date, startTime));
startCalIntent.putExtra(CalendarContract.EXTRA_EVENT_END_TIME, splitDateTime(date, endTime));
startCalIntent.putExtra(Events.EVENT_TIMEZONE, "Europe/London");
startCalIntent.putExtra(Attendees.HAS_ATTENDEE_DATA, "1");
startCalIntent.putExtra(Attendees.ATTENDEE_NAME, "DAVE");//<---NOT WORKING
startActivity(startCalIntent);
You cannot add attendee during creating event. You need Event_ID to proceed another update on event like adding remainders, or attendees.
Note: See how this example captures the event ID after the event is
created. This is the easiest way to get an event ID. You often need
the event ID to perform other calendar operations—for example, to add
attendees or reminders to an event.
source: Android developer
you can use this code as provided in Android developer:
long eventID = 202;
...
ContentResolver cr = getContentResolver();
ContentValues values = new ContentValues();
values.put(Attendees.ATTENDEE_NAME, "Trevor");
values.put(Attendees.ATTENDEE_EMAIL, "trevor#example.com");
values.put(Attendees.ATTENDEE_RELATIONSHIP, Attendees.RELATIONSHIP_ATTENDEE);
values.put(Attendees.ATTENDEE_TYPE, Attendees.TYPE_OPTIONAL);
values.put(Attendees.ATTENDEE_STATUS, Attendees.ATTENDEE_STATUS_INVITED);
values.put(Attendees.EVENT_ID, eventID);
Uri uri = cr.insert(Attendees.CONTENT_URI, values);
Hope that may help;
Try this ..
ContentValues values = new ContentValues();
values.put("calendar_id", 1);
values.put("title", "event Name");
values.put("allDay", 0);
values.put("dtstart", cal.getTimeInMillis() + diffInhrs*60*1000); // event starts at date specified in datepicker
values.put("dtend", cal.getTimeInMillis()+ end_diff *60*1000); // ends 60 minutes from selected date
values.put("description", "event desc");
values.put("visibility", 0);
values.put("hasAlarm", 1);
Uri event = cr.insert(EVENTS_URI, values);
For more explaination plz go through this CLICK HERE
I've a program which includes service. This program has settings which allows user to set up, disable and enable time. Between these two times (if option is enabled of course), the program should not work.
I'm actually having hard time to do this. I've already sucessfully converted "disabled" and "enabled" time in milliseconds. I have following code but it doesn't work as expected. I want to detect if current time is between two set up times, so i can disable service at that time.
public boolean isCurrentTimeBetween_enableDisable() {
long sysTime = System.currentTimeMillis();
if((sysTime > disableTime && sysTime < enableTime)) {
return true;
}
return false;
}
Anyone can give me better hint?
UPDATE:
If user selects lets say
Disable hour: 15:00
Enable hour: 22:00
Then code work as expected.
But if user selects lets say:
Disable hour: 22:00
Enable hour: 06:00
Then its obviously that Enable hour is the NEXT day. So i wrote the following code:
if(todaysDisableDate(context).getTime() > enableAt.getTime()) {
enableCal.add(Calendar.DAY_OF_MONTH, 1);
enableAt = formatEnableDate.parse(enableCal.get(Calendar.DAY_OF_MONTH) + "-" +(enableCal.get(Calendar.MONTH)+1) + "-" + enableCal.get(Calendar.YEAR) + " " + endHours_string + ":" + endMinutes_string);
}
Code below is getting the actual date.
public Date todaysDisableDate(Context context) {
Calendar disableCal = Calendar.getInstance();
getTimeValues_preferences((ContextWrapper) context, true, false); // this only gets a string for hour and minute (which is set up in preferences )
Date disableAt = null;
try {
disableAt = formatDisableDate.parse(disableCal.get(Calendar.DAY_OF_MONTH)+"-"+(disableCal.get(Calendar.MONTH)+1)+"-"+disableCal.get(Calendar.YEAR)+" "+startHours_string+":"+startMinutes_string); // današnji datum z današnjo uro
} catch (ParseException e) {
e.printStackTrace();
}
return disableAt;
}
public Date todaysEnableDate(Context context) {
Calendar enableCal = Calendar.getInstance();
getTimeValues_preferences((ContextWrapper) context, false, true);
Date enableAt = null;
try {
enableAt = formatEnableDate.parse(enableCal.get(Calendar.DAY_OF_MONTH)+"-"+(enableCal.get(Calendar.MONTH)+1)+"-"+enableCal.get(Calendar.YEAR)+" "+endHours_string+":"+endMinutes_string); // današnji datum z današnjo uro
if(todaysDisableDate(context).getTime() > enableAt.getTime()) {
enableCal.add(Calendar.DAY_OF_MONTH, 1);
enableAt = formatEnableDate.parse(enableCal.get(Calendar.DAY_OF_MONTH)+"-"+(enableCal.get(Calendar.MONTH)+1)+"-"+enableCal.get(Calendar.YEAR)+" "+endHours_string+":"+endMinutes_string);
}
} catch (ParseException e) {
}
return enableAt;
}
Code is working fine if service starts before 00:00. But if the service starts after midnight (of next day), then i'm getting false from method isCurrentTimeBetween_enableDisable(), because methods todaysDisableDate(Context context) and todaysEnableDate(Context context) are pulling out the next day (the same day as system hour is in)
Do you have to compare dates in your code? If that's a project requirement then you can ignore the following.
Otherwise, I think you can use AlarmManager to create the feature without actually comparing the date. You can create a "Enable" intent and a "Disable" intent for the AlarmManager to fire at the scheduled time. Something like this:
Register your alarms when the user confirmed the time schedule.
Intent intent = new Intent(context, yourAlarmReceiver.class); //or implicit with action
PendingIntent pIntent = PendingIntent.getBroadcast(
context, requestCode, intent, PendingIntent.FLAG_UPDATE_CURRENT);
AlarmManager am = (AlarmManager) getSystemService(ALARM_SERVICE);
am.setRepeating (typeConstant, triggerAtMillis, intervalMillis, pIntent);
You just need to figure out what triggerAtMillis is to determine the first shot of that broadcast, and intervalMillis will be a full day, which is a constant in the AlarmManager class.
Setup your custom receiver class (which I wrote as yourAlarmReceiver) which should extend BroadcastReceiver, and register the receiver in your service. In the onReceive() you should perform the corresponding actions based on intent.getAction(). Don't forget to register your receiver with an intent filter if you want more customization.
#Override
public void onReceive(Context context, Intent intent) {
switch(intent.getAction()){
case "enable": //enable if not enabled
case "disable": //disable if not disabled
default: break;
}
}
In this way it may save you some time from struggling with comparing today and tomorrow. You can determine the time of the very first shot by getting the current system time, probably in 24-hour format, and determine if your intended time has already passed. Whether it's been passed, you just need to set the initial firing time to currentTime + difference.
Hope it will shed some light.
I would recommend you to use the start date and end date itself...and not convert them to miliseconds. But this is only if you're not sure.
private String compareStringOne = "9:45";
private String compareStringTwo = "1:45";
SimpleDateFormat inputParser = new SimpleDateFormat(inputFormat, Locale.US);
private void compareDates(){
Calendar now = Calendar.getInstance();
int hour = now.get(Calendar.HOUR);
int minute = now.get(Calendar.MINUTE);
date = parseDate(hour + ":" + minute);
dateCompareOne = parseDate(compareStringOne);
dateCompareTwo = parseDate(compareStringTwo);
if ( dateCompareOne.before( date ) && dateCompareTwo.after(date)) {
//This is where you determine if the date is inbetween
}
}
private Date parseDate(String date) {
try {
return inputParser.parse(date);
} catch (java.text.ParseException e) {
return new Date(0);
}
}
I would like to check in internal Android calendar for event which is currently in progress (started before current time, and ends after current time). I'm using Android 2.2
I was playing around with this piece of code - I was trying to set start time to now but this doesn't work, it returns events that started after this moment.
//building query uri
Uri.Builder builder = Uri.parse("content://com.android.calendar/instances/when").buildUpon();
long now = new Date().getTime();
ContentUris.appendId(builder, now - DateUtils.MINUTE_IN_MILLIS * 80);
ContentUris.appendId(builder, now + DateUtils.MINUTE_IN_MILLIS * 80);
Log.d("AlarmReciever", "querying for calendar with id:" + calendarId);
//interating over events
Cursor eventCursor = contentResolver.query(builder.build(), new String[] { "title" }, "Calendars._id=" + calendarId, null, null);
while (eventCursor.moveToNext()) {
final String title = eventCursor.getString(0);
Toast.makeText(context, "title: " + title, Toast.LENGTH_LONG).show();
}
I would appreciate if someone could show me how to do this correctly. Thanks!