|
1 /** |
|
2 * Copyright (c) 2012-2013, Gerald Garcia, Timo Berger |
|
3 * |
|
4 * This file is part of Andoid Caldav Sync Adapter Free. |
|
5 * |
|
6 * Andoid Caldav Sync Adapter Free is free software: you can redistribute |
|
7 * it and/or modify it under the terms of the GNU General Public License |
|
8 * as published by the Free Software Foundation, either version 3 of the |
|
9 * License, or at your option any later version. |
|
10 * |
|
11 * Andoid Caldav Sync Adapter Free is distributed in the hope that |
|
12 * it will be useful, but WITHOUT ANY WARRANTY; without even the implied |
|
13 * warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
|
14 * GNU General Public License for more details. |
|
15 * |
|
16 * You should have received a copy of the GNU General Public License |
|
17 * along with Andoid Caldav Sync Adapter Free. |
|
18 * If not, see <http://www.gnu.org/licenses/>. |
|
19 * |
|
20 */ |
|
21 |
|
22 package org.gege.caldavsyncadapter.caldav.entities; |
|
23 |
|
24 import java.io.IOException; |
|
25 import java.net.URI; |
|
26 import java.net.URISyntaxException; |
|
27 import java.util.ArrayList; |
|
28 |
|
29 import javax.xml.parsers.ParserConfigurationException; |
|
30 |
|
31 import org.apache.http.client.ClientProtocolException; |
|
32 import org.gege.caldavsyncadapter.CalendarColors; |
|
33 import org.gege.caldavsyncadapter.Event; |
|
34 import org.gege.caldavsyncadapter.android.entities.AndroidEvent; |
|
35 import org.gege.caldavsyncadapter.caldav.CaldavFacade; |
|
36 import org.gege.caldavsyncadapter.syncadapter.SyncAdapter; |
|
37 import org.gege.caldavsyncadapter.syncadapter.notifications.NotificationsHelper; |
|
38 import org.xml.sax.SAXException; |
|
39 |
|
40 import android.accounts.Account; |
|
41 import android.content.ContentProviderClient; |
|
42 import android.content.ContentUris; |
|
43 import android.content.ContentValues; |
|
44 import android.content.SyncStats; |
|
45 import android.database.Cursor; |
|
46 import android.net.Uri; |
|
47 import android.os.RemoteException; |
|
48 import android.provider.CalendarContract.Calendars; |
|
49 import android.provider.CalendarContract.Events; |
|
50 import android.util.Log; |
|
51 |
|
52 public class DavCalendar { |
|
53 public enum CalendarSource { |
|
54 undefined, Android, CalDAV |
|
55 } |
|
56 |
|
57 private static final String TAG = "Calendar"; |
|
58 |
|
59 /** |
|
60 * stores the CTAG of a calendar |
|
61 */ |
|
62 public static String CTAG = Calendars.CAL_SYNC1; |
|
63 |
|
64 /** |
|
65 * stores the URI of a calendar |
|
66 * example: http://caldav.example.com/calendarserver.php/calendars/username/calendarname |
|
67 */ |
|
68 public static String URI = Calendars._SYNC_ID; |
|
69 |
|
70 public static String SERVERURL = Calendars.CAL_SYNC2; |
|
71 |
|
72 private String strCalendarColor = ""; |
|
73 |
|
74 private ArrayList<Uri> mNotifyList = new ArrayList<Uri>(); |
|
75 |
|
76 /** |
|
77 * the event transformed into ContentValues |
|
78 */ |
|
79 public ContentValues ContentValues = new ContentValues(); |
|
80 |
|
81 private Account mAccount = null; |
|
82 private ContentProviderClient mProvider = null; |
|
83 |
|
84 public boolean foundServerSide = false; |
|
85 public boolean foundClientSide = false; |
|
86 public CalendarSource Source = CalendarSource.undefined; |
|
87 |
|
88 public String ServerUrl = ""; |
|
89 |
|
90 private ArrayList<CalendarEvent> mCalendarEvents = new ArrayList<CalendarEvent>(); |
|
91 |
|
92 private int mTagCounter = 1; |
|
93 |
|
94 /** |
|
95 * example: http://caldav.example.com/calendarserver.php/calendars/username/calendarname |
|
96 */ |
|
97 public URI getURI() { |
|
98 String strUri = this.getContentValueAsString(DavCalendar.URI); |
|
99 URI result = null; |
|
100 try { |
|
101 result = new URI(strUri); |
|
102 } catch (URISyntaxException e) { |
|
103 e.printStackTrace(); |
|
104 } |
|
105 return result; |
|
106 } |
|
107 |
|
108 /** |
|
109 * example: http://caldav.example.com/calendarserver.php/calendars/username/calendarname |
|
110 */ |
|
111 public void setURI(URI uri) { |
|
112 this.setContentValueAsString(DavCalendar.URI, uri.toString()); |
|
113 } |
|
114 |
|
115 /** |
|
116 * example: Cleartext Display Name |
|
117 */ |
|
118 public String getCalendarDisplayName() { |
|
119 return this.getContentValueAsString(Calendars.CALENDAR_DISPLAY_NAME); |
|
120 } |
|
121 |
|
122 /** |
|
123 * example: Cleartext Display Name |
|
124 */ |
|
125 public void setCalendarDisplayName(String displayName) { |
|
126 this.setContentValueAsString(Calendars.CALENDAR_DISPLAY_NAME, displayName); |
|
127 } |
|
128 |
|
129 |
|
130 /** |
|
131 * example: 1143 |
|
132 */ |
|
133 public void setCTag(String cTag, boolean Update) { |
|
134 this.setContentValueAsString(DavCalendar.CTAG, cTag); |
|
135 if (Update) { |
|
136 //serverCalendar.updateAndroidCalendar(androidCalendarUri, Calendar.CTAG, serverCalendar.getcTag()); |
|
137 try { |
|
138 this.updateAndroidCalendar(this.getAndroidCalendarUri(), CTAG, cTag); |
|
139 } catch (RemoteException e) { |
|
140 e.printStackTrace(); |
|
141 } |
|
142 } |
|
143 } |
|
144 |
|
145 /** |
|
146 * example: 1143 |
|
147 */ |
|
148 public String getcTag() { |
|
149 return this.getContentValueAsString(DavCalendar.CTAG); |
|
150 } |
|
151 |
|
152 /** |
|
153 * example: #FFCCAA |
|
154 */ |
|
155 public void setCalendarColorAsString(String color) { |
|
156 int maxlen = 6; |
|
157 |
|
158 this.strCalendarColor = color; |
|
159 if (!color.equals("")) { |
|
160 String strColor = color.replace("#", ""); |
|
161 if (strColor.length() > maxlen) |
|
162 strColor = strColor.substring(0, maxlen); |
|
163 int intColor = Integer.parseInt(strColor, 16); |
|
164 this.setContentValueAsInt(Calendars.CALENDAR_COLOR, intColor); |
|
165 } |
|
166 } |
|
167 |
|
168 /** |
|
169 * example: #FFCCAA |
|
170 */ |
|
171 public String getCalendarColorAsString() { |
|
172 return this.strCalendarColor; |
|
173 } |
|
174 |
|
175 /** |
|
176 * example 12345 |
|
177 */ |
|
178 public int getCalendarColor() { |
|
179 return this.getContentValueAsInt(Calendars.CALENDAR_COLOR); |
|
180 } |
|
181 |
|
182 /** |
|
183 * example 12345 |
|
184 */ |
|
185 public void setCalendarColor(int color) { |
|
186 this.setContentValueAsInt(Calendars.CALENDAR_COLOR, color); |
|
187 } |
|
188 |
|
189 /** |
|
190 * example: |
|
191 * should be: calendarname |
|
192 * but is: http://caldav.example.com/calendarserver.php/calendars/username/calendarname/ |
|
193 */ |
|
194 public String getCalendarName() { |
|
195 return this.getContentValueAsString(Calendars.NAME); |
|
196 } |
|
197 |
|
198 /** |
|
199 * example: |
|
200 * should be: calendarname |
|
201 * but is: http://caldav.example.com/calendarserver.php/calendars/username/calendarname/ |
|
202 */ |
|
203 public void setCalendarName(String calendarName) { |
|
204 this.setContentValueAsString(Calendars.NAME, calendarName); |
|
205 } |
|
206 |
|
207 /** |
|
208 * example: 8 |
|
209 */ |
|
210 public int getAndroidCalendarId() { |
|
211 return this.getContentValueAsInt(Calendars._ID); |
|
212 } |
|
213 |
|
214 /** |
|
215 * example: 8 |
|
216 */ |
|
217 public void setAndroidCalendarId(int androidCalendarId) { |
|
218 this.setContentValueAsInt(Calendars._ID, androidCalendarId); |
|
219 } |
|
220 |
|
221 /** |
|
222 * example: content://com.android.calendar/calendars/8 |
|
223 */ |
|
224 public Uri getAndroidCalendarUri() { |
|
225 return ContentUris.withAppendedId(Calendars.CONTENT_URI, this.getAndroidCalendarId()); |
|
226 } |
|
227 |
|
228 /** |
|
229 * empty constructor |
|
230 */ |
|
231 public DavCalendar(CalendarSource source) { |
|
232 this.Source = source; |
|
233 } |
|
234 |
|
235 /** |
|
236 * creates an new instance from a cursor |
|
237 * @param cur must be a cursor from "ContentProviderClient" with Uri Calendars.CONTENT_URI |
|
238 */ |
|
239 public DavCalendar(Account account, ContentProviderClient provider, Cursor cur, CalendarSource source, String serverUrl) { |
|
240 this.mAccount = account; |
|
241 this.mProvider = provider; |
|
242 this.foundClientSide = true; |
|
243 this.Source = source; |
|
244 this.ServerUrl = serverUrl; |
|
245 |
|
246 String strSyncID = cur.getString(cur.getColumnIndex(Calendars._SYNC_ID)); |
|
247 String strName = cur.getString(cur.getColumnIndex(Calendars.NAME)); |
|
248 String strDisplayName = cur.getString(cur.getColumnIndex(Calendars.CALENDAR_DISPLAY_NAME)); |
|
249 String strCTAG = cur.getString(cur.getColumnIndex(DavCalendar.CTAG)); |
|
250 String strServerUrl = cur.getString(cur.getColumnIndex(DavCalendar.SERVERURL)); |
|
251 int intAndroidCalendarId = cur.getInt(cur.getColumnIndex(Calendars._ID)); |
|
252 |
|
253 this.setCalendarName(strName); |
|
254 this.setCalendarDisplayName(strDisplayName); |
|
255 this.setCTag(strCTAG, false); |
|
256 this.setAndroidCalendarId(intAndroidCalendarId); |
|
257 |
|
258 if (strSyncID == null) { |
|
259 this.correctSyncID(strName); |
|
260 strSyncID = strName; |
|
261 } |
|
262 if (strServerUrl == null) { |
|
263 this.correctServerUrl(serverUrl); |
|
264 } |
|
265 URI uri = null; |
|
266 try { |
|
267 uri = new URI(strSyncID); |
|
268 } catch (URISyntaxException e) { |
|
269 e.printStackTrace(); |
|
270 } |
|
271 this.setURI(uri); |
|
272 } |
|
273 |
|
274 /** |
|
275 * checks a given list of android calendars for a specific android calendar. |
|
276 * this calendar should be a server calendar as it is searched for. |
|
277 * if the calendar is not found, it will be created. |
|
278 * @param androidCalList the list of android calendars |
|
279 * @param context |
|
280 * @return the found android calendar or null of fails |
|
281 * @throws RemoteException |
|
282 */ |
|
283 public Uri checkAndroidCalendarList(CalendarList androidCalList, android.content.Context context) throws RemoteException { |
|
284 Uri androidCalendarUri = null; |
|
285 boolean isCalendarExist = false; |
|
286 |
|
287 DavCalendar androidCalendar = androidCalList.getCalendarByURI(this.getURI()); |
|
288 if (androidCalendar != null) { |
|
289 isCalendarExist = true; |
|
290 androidCalendar.foundServerSide = true; |
|
291 } |
|
292 |
|
293 |
|
294 if (!isCalendarExist) { |
|
295 DavCalendar newCal = this.createNewAndroidCalendar(this, androidCalList.getCalendarList().size(), context); |
|
296 if (newCal != null) { |
|
297 androidCalList.addCalendar(newCal); |
|
298 androidCalendarUri = newCal.getAndroidCalendarUri(); |
|
299 } |
|
300 } else { |
|
301 androidCalendarUri = androidCalendar.getAndroidCalendarUri(); |
|
302 if (!this.getCalendarColorAsString().equals("")) { |
|
303 //serverCalendar.updateCalendarColor(returnedCalendarUri, serverCalendar); |
|
304 this.updateAndroidCalendar(androidCalendarUri, Calendars.CALENDAR_COLOR, this.getCalendarColor()); |
|
305 } |
|
306 if ((this.ContentValues.containsKey(Calendars.CALENDAR_DISPLAY_NAME)) && |
|
307 (androidCalendar.ContentValues.containsKey(Calendars.CALENDAR_DISPLAY_NAME))) { |
|
308 String serverDisplayName = this.ContentValues.getAsString(Calendars.CALENDAR_DISPLAY_NAME); |
|
309 String clientDisplayName = androidCalendar.ContentValues.getAsString(Calendars.CALENDAR_DISPLAY_NAME); |
|
310 if (!serverDisplayName.equals(clientDisplayName)) |
|
311 this.updateAndroidCalendar(androidCalendarUri, Calendars.CALENDAR_DISPLAY_NAME, serverDisplayName); |
|
312 } |
|
313 } |
|
314 |
|
315 return androidCalendarUri; |
|
316 } |
|
317 |
|
318 /** |
|
319 * COMPAT: the calendar Uri was stored as calendar Name. this function updates the URI (_SYNC_ID) |
|
320 * @param calendarUri the real calendarUri |
|
321 * @return success of this function |
|
322 */ |
|
323 private boolean correctSyncID(String calendarUri) { |
|
324 boolean Result = false; |
|
325 Log.v(TAG, "correcting SyncID for calendar:" + this.getContentValueAsString(Calendars.CALENDAR_DISPLAY_NAME)); |
|
326 |
|
327 ContentValues mUpdateValues = new ContentValues(); |
|
328 mUpdateValues.put(DavCalendar.URI, calendarUri); |
|
329 |
|
330 try { |
|
331 mProvider.update(this.SyncAdapterCalendar(), mUpdateValues, null, null); |
|
332 Result = true; |
|
333 } catch (RemoteException e) { |
|
334 e.printStackTrace(); |
|
335 } |
|
336 |
|
337 return Result; |
|
338 } |
|
339 |
|
340 /** |
|
341 * COMPAT: the serverurl (CAL_SYNC2) was not sored within a calendar. this fixes it. (see #98) |
|
342 * @param serverUrl the current serverurl |
|
343 * @return success of this function |
|
344 */ |
|
345 private boolean correctServerUrl(String serverUrl) { |
|
346 boolean Result = false; |
|
347 Log.v(TAG, "correcting ServerUrl for calendar:" + this.getContentValueAsString(Calendars.CALENDAR_DISPLAY_NAME)); |
|
348 |
|
349 ContentValues mUpdateValues = new ContentValues(); |
|
350 mUpdateValues.put(DavCalendar.SERVERURL, serverUrl); |
|
351 |
|
352 try { |
|
353 mProvider.update(this.SyncAdapterCalendar(), mUpdateValues, null, null); |
|
354 Result = true; |
|
355 } catch (RemoteException e) { |
|
356 e.printStackTrace(); |
|
357 } |
|
358 |
|
359 return Result; |
|
360 } |
|
361 |
|
362 /** |
|
363 * creates a new androidCalendar |
|
364 * @param serverCalendar |
|
365 * @param index |
|
366 * @param context |
|
367 * @return the new androidCalendar or null if fails |
|
368 */ |
|
369 private DavCalendar createNewAndroidCalendar(DavCalendar serverCalendar, int index, android.content.Context context) { |
|
370 Uri newUri = null; |
|
371 DavCalendar Result = null; |
|
372 |
|
373 final ContentValues contentValues = new ContentValues(); |
|
374 contentValues.put(DavCalendar.URI, serverCalendar.getURI().toString()); |
|
375 contentValues.put(DavCalendar.SERVERURL, this.ServerUrl); |
|
376 |
|
377 contentValues.put(Calendars.VISIBLE, 1); |
|
378 contentValues.put(Calendars.CALENDAR_DISPLAY_NAME, serverCalendar.getCalendarDisplayName()); |
|
379 contentValues.put(Calendars.ACCOUNT_NAME, mAccount.name); |
|
380 contentValues.put(Calendars.ACCOUNT_TYPE, mAccount.type); |
|
381 contentValues.put(Calendars.OWNER_ACCOUNT, mAccount.name); |
|
382 contentValues.put(Calendars.SYNC_EVENTS, 1); |
|
383 contentValues.put(Calendars.CALENDAR_ACCESS_LEVEL, Calendars.CAL_ACCESS_OWNER); |
|
384 |
|
385 if (!serverCalendar.getCalendarColorAsString().equals("")) { |
|
386 contentValues.put(Calendars.CALENDAR_COLOR, serverCalendar.getCalendarColor()); |
|
387 } else { |
|
388 // find a color |
|
389 //int index = mList.size(); |
|
390 index = index % CalendarColors.colors.length; |
|
391 contentValues.put(Calendars.CALENDAR_COLOR, CalendarColors.colors[index]); |
|
392 } |
|
393 |
|
394 try { |
|
395 newUri = mProvider.insert(asSyncAdapter(Calendars.CONTENT_URI, mAccount.name, mAccount.type), contentValues); |
|
396 } catch (RemoteException e) { |
|
397 e.printStackTrace(); |
|
398 } |
|
399 |
|
400 // it is possible that this calendar already exists but the provider failed to find it within isCalendarExist() |
|
401 // the adapter would try to create a new calendar but the provider fails again to create a new calendar. |
|
402 if (newUri != null) { |
|
403 long newCalendarId = ContentUris.parseId(newUri); |
|
404 |
|
405 Cursor cur = null; |
|
406 Uri uri = Calendars.CONTENT_URI; |
|
407 String selection = "(" + Calendars._ID + " = ?)"; |
|
408 String[] selectionArgs = new String[] {String.valueOf(newCalendarId)}; |
|
409 |
|
410 // Submit the query and get a Cursor object back. |
|
411 try { |
|
412 cur = mProvider.query(uri, null, selection, selectionArgs, null); |
|
413 } catch (RemoteException e) { |
|
414 e.printStackTrace(); |
|
415 } |
|
416 |
|
417 if (cur != null) { |
|
418 while (cur.moveToNext()) { |
|
419 Result = new DavCalendar(mAccount, mProvider, cur, this.Source, this.ServerUrl); |
|
420 Result.foundServerSide = true; |
|
421 } |
|
422 cur.close(); |
|
423 //if (Result != null) |
|
424 // this.mList.add(Result); |
|
425 } |
|
426 Log.i(TAG, "New calendar created : URI=" + Result.getAndroidCalendarUri()); |
|
427 NotificationsHelper.signalSyncErrors(context, "CalDAV Sync Adapter", "new calendar found: " + Result.getCalendarDisplayName()); |
|
428 mNotifyList.add(Result.getAndroidCalendarUri()); |
|
429 } |
|
430 |
|
431 return Result; |
|
432 } |
|
433 |
|
434 /** |
|
435 * there is no corresponding calendar on server side. time to delete this calendar on android side. |
|
436 * @return |
|
437 */ |
|
438 public boolean deleteAndroidCalendar() { |
|
439 boolean Result = false; |
|
440 |
|
441 String mSelectionClause = "(" + Calendars._ID + " = ?)"; |
|
442 int calendarId = this.getAndroidCalendarId(); |
|
443 String[] mSelectionArgs = {Long.toString(calendarId)}; |
|
444 |
|
445 int CountDeleted = 0; |
|
446 try { |
|
447 CountDeleted = mProvider.delete(this.SyncAdapter(), mSelectionClause, mSelectionArgs); |
|
448 Log.i(TAG,"Calendar deleted: " + String.valueOf(calendarId)); |
|
449 this.mNotifyList.add(this.getAndroidCalendarUri()); |
|
450 Result = true; |
|
451 } catch (RemoteException e) { |
|
452 e.printStackTrace(); |
|
453 } |
|
454 Log.d(TAG, "Android Calendars deleted: " + Integer.toString(CountDeleted)); |
|
455 |
|
456 return Result; |
|
457 } |
|
458 |
|
459 /** |
|
460 * updates the android calendar |
|
461 * @param calendarUri the uri of the androidCalendar |
|
462 * @param target must be from android.provider.CalendarContract.Calendars |
|
463 * @param value the new value for the target |
|
464 * @throws RemoteException |
|
465 */ |
|
466 private void updateAndroidCalendar(Uri calendarUri, String target, int value) throws RemoteException { |
|
467 ContentValues mUpdateValues = new ContentValues(); |
|
468 mUpdateValues.put(target, value); |
|
469 |
|
470 mProvider.update(asSyncAdapter(calendarUri, mAccount.name, mAccount.type), mUpdateValues, null, null); |
|
471 } |
|
472 |
|
473 /** |
|
474 * updates the android calendar |
|
475 * @param calendarUri the uri of the androidCalendar |
|
476 * @param target must be from android.provider.CalendarContract.Calendars |
|
477 * @param value the new value for the target |
|
478 * @throws RemoteException |
|
479 */ |
|
480 private void updateAndroidCalendar(Uri calendarUri, String target, String value) throws RemoteException { |
|
481 ContentValues mUpdateValues = new ContentValues(); |
|
482 mUpdateValues.put(target, value); |
|
483 |
|
484 mProvider.update(asSyncAdapter(calendarUri, mAccount.name, mAccount.type), mUpdateValues, null, null); |
|
485 } |
|
486 |
|
487 /** |
|
488 * marks the android event as already handled |
|
489 * @return |
|
490 * @see AndroidEvent#cInternalTag |
|
491 * @see SyncAdapter#synchroniseEvents(CaldavFacade, Account, ContentProviderClient, Uri, DavCalendar, SyncStats) |
|
492 * @throws RemoteException |
|
493 */ |
|
494 public boolean tagAndroidEvent(AndroidEvent androidEvent) throws RemoteException { |
|
495 boolean Result = false; |
|
496 |
|
497 ContentValues values = new ContentValues(); |
|
498 //values.put(Event.INTERNALTAG, 1); |
|
499 values.put(Event.INTERNALTAG, mTagCounter); |
|
500 //values.put(Event.INTERNALTAG, String.valueOf(mTagCounter)); |
|
501 |
|
502 int RowCount = this.mProvider.update(asSyncAdapter(androidEvent.getUri(), this.mAccount.name, this.mAccount.type), values, null, null); |
|
503 //Log.v(TAG,"event tag nr: " + String.valueOf(mTagCounter)); |
|
504 //Log.v(TAG,"Rows updated: " + String.valueOf(RowCount)); |
|
505 |
|
506 if (RowCount == 1) { |
|
507 Result = true; |
|
508 mTagCounter += 1; |
|
509 } else { |
|
510 Log.v(TAG,"EVENT NOT TAGGED!"); |
|
511 } |
|
512 |
|
513 return Result; |
|
514 } |
|
515 |
|
516 /** |
|
517 * removes the tag of all android events |
|
518 * @return |
|
519 * @see AndroidEvent#cInternalTag |
|
520 * @see SyncAdapter#synchroniseEvents(CaldavFacade, Account, ContentProviderClient, Uri, DavCalendar, SyncStats) |
|
521 * @throws RemoteException |
|
522 */ |
|
523 public int untagAndroidEvents() throws RemoteException { |
|
524 int RowCount = 0; |
|
525 int Steps = 100; |
|
526 ContentValues values = new ContentValues(); |
|
527 values.put(Event.INTERNALTAG, 0); |
|
528 |
|
529 for (int i=1; i < this.mTagCounter; i = i + Steps) { |
|
530 String mSelectionClause = "(CAST(" + Event.INTERNALTAG + " AS INT) >= ?) AND (CAST(" + Event.INTERNALTAG + " AS INT) < ?) AND (" + Events.CALENDAR_ID + " = ?)"; |
|
531 String[] mSelectionArgs = {String.valueOf(i), String.valueOf(i + Steps), Long.toString(ContentUris.parseId(this.getAndroidCalendarUri()))}; |
|
532 RowCount += this.mProvider.update(asSyncAdapter(Events.CONTENT_URI, this.mAccount.name, this.mAccount.type), values, mSelectionClause, mSelectionArgs); |
|
533 } |
|
534 /*String mSelectionClause = "(" + Event.INTERNALTAG + " > ?) AND (" + Events.CALENDAR_ID + " = ?)"; |
|
535 String[] mSelectionArgs = {"0", Long.toString(ContentUris.parseId(this.getAndroidCalendarUri()))}; |
|
536 RowCount += this.mProvider.update(asSyncAdapter(Events.CONTENT_URI, this.mAccount.name, this.mAccount.type), values, mSelectionClause, mSelectionArgs);*/ |
|
537 |
|
538 //Log.d(TAG, "Rows reseted: " + RowCount.toString()); |
|
539 return RowCount; |
|
540 } |
|
541 /** |
|
542 * Events not being tagged are for deletion |
|
543 * @return |
|
544 * @see AndroidEvent#cInternalTag |
|
545 * @see SyncAdapter#synchroniseEvents(CaldavFacade, Account, ContentProviderClient, Uri, DavCalendar, SyncStats) |
|
546 * @throws RemoteException |
|
547 */ |
|
548 public int deleteUntaggedEvents() throws RemoteException { |
|
549 String mSelectionClause = "(" + Event.INTERNALTAG + " < ?) AND (" + Events.CALENDAR_ID + " = ?)"; |
|
550 String[] mSelectionArgs = {"1", Long.toString(ContentUris.parseId(this.getAndroidCalendarUri()))}; |
|
551 |
|
552 int CountDeleted = this.mProvider.delete(asSyncAdapter(Events.CONTENT_URI, this.mAccount.name, this.mAccount.type), mSelectionClause, mSelectionArgs); |
|
553 //Log.d(TAG, "Rows deleted: " + CountDeleted.toString()); |
|
554 return CountDeleted; |
|
555 } |
|
556 |
|
557 private Uri SyncAdapterCalendar() { |
|
558 return asSyncAdapter(this.getAndroidCalendarUri(), mAccount.name, mAccount.type); |
|
559 } |
|
560 private Uri SyncAdapter() { |
|
561 return asSyncAdapter(Calendars.CONTENT_URI, mAccount.name, mAccount.type); |
|
562 } |
|
563 private static Uri asSyncAdapter(Uri uri, String account, String accountType) { |
|
564 return uri.buildUpon() |
|
565 .appendQueryParameter(android.provider.CalendarContract.CALLER_IS_SYNCADAPTER,"true") |
|
566 .appendQueryParameter(Calendars.ACCOUNT_NAME, account) |
|
567 .appendQueryParameter(Calendars.ACCOUNT_TYPE, accountType).build(); |
|
568 } |
|
569 |
|
570 public void setAccount(Account account) { |
|
571 this.mAccount = account; |
|
572 } |
|
573 public void setProvider(ContentProviderClient provider) { |
|
574 this.mProvider = provider; |
|
575 } |
|
576 |
|
577 /** |
|
578 * general access function to ContentValues |
|
579 * @param Item the item name from Calendars.* |
|
580 * @return the value for the item |
|
581 */ |
|
582 private String getContentValueAsString(String Item) { |
|
583 String Result = ""; |
|
584 if (this.ContentValues.containsKey(Item)) |
|
585 Result = this.ContentValues.getAsString(Item); |
|
586 return Result; |
|
587 } |
|
588 /** |
|
589 * general access function to ContentValues |
|
590 * @param Item the item name from Calendars.* |
|
591 * @return the value for the item |
|
592 */ |
|
593 private int getContentValueAsInt(String Item) { |
|
594 int Result = 0; |
|
595 if (this.ContentValues.containsKey(Item)) |
|
596 Result = this.ContentValues.getAsInteger(Item); |
|
597 return Result; |
|
598 } |
|
599 |
|
600 /** |
|
601 * general access function to ContentValues |
|
602 * @param Item the item name from Calendars.* |
|
603 * @param Value the value for the item |
|
604 * @return success of this function |
|
605 */ |
|
606 private boolean setContentValueAsString(String Item, String Value) { |
|
607 boolean Result = false; |
|
608 |
|
609 if (this.ContentValues.containsKey(Item)) |
|
610 this.ContentValues.remove(Item); |
|
611 this.ContentValues.put(Item, Value); |
|
612 |
|
613 return Result; |
|
614 } |
|
615 |
|
616 /** |
|
617 * general access function to ContentValues |
|
618 * @param Item the item name from Calendars.* |
|
619 * @param Value the value for the item |
|
620 * @return success of this function |
|
621 */ |
|
622 private boolean setContentValueAsInt(String Item, int Value) { |
|
623 boolean Result = false; |
|
624 |
|
625 if (this.ContentValues.containsKey(Item)) |
|
626 this.ContentValues.remove(Item); |
|
627 this.ContentValues.put(Item, Value); |
|
628 |
|
629 return Result; |
|
630 } |
|
631 |
|
632 public ArrayList<Uri> getNotifyList() { |
|
633 return this.mNotifyList; |
|
634 } |
|
635 |
|
636 public ArrayList<CalendarEvent> getCalendarEvents() { |
|
637 return this.mCalendarEvents; |
|
638 } |
|
639 |
|
640 public boolean readCalendarEvents(CaldavFacade facade) { |
|
641 boolean Result = false; |
|
642 |
|
643 try { |
|
644 this.mCalendarEvents = facade.getCalendarEvents(this); |
|
645 Result = true; |
|
646 } catch (ClientProtocolException e) { |
|
647 e.printStackTrace(); |
|
648 Result = false; |
|
649 } catch (URISyntaxException e) { |
|
650 e.printStackTrace(); |
|
651 Result = false; |
|
652 } catch (IOException e) { |
|
653 e.printStackTrace(); |
|
654 Result = false; |
|
655 } catch (ParserConfigurationException e) { |
|
656 e.printStackTrace(); |
|
657 Result = false; |
|
658 } catch (SAXException e) { |
|
659 e.printStackTrace(); |
|
660 Result = false; |
|
661 } |
|
662 |
|
663 return Result; |
|
664 } |
|
665 |
|
666 } |