Loading app/src/main/java/at/bitfire/icsdroid/AppAccount.java +36 −2 Original line number Diff line number Diff line Loading @@ -4,19 +4,53 @@ import android.accounts.Account; import android.accounts.AccountManager; import android.content.ContentResolver; import android.content.Context; import android.content.PeriodicSync; import android.os.Bundle; import android.provider.CalendarContract; import android.util.Log; import net.fortuna.ical4j.model.Content; public class AppAccount { private static final String TAG = "ICSdroid.AppAccount"; public static final long SYNC_INTERVAL_MANUALLY = -1; public static final Account account = new Account("ICSdroid", "at.bitfire.icsdroid"); public static boolean isAvailable(Context context) { public static void makeAvailable(Context context) { AccountManager am = AccountManager.get(context); return am.getAccountsByType(account.type).length > 0; if (am.getAccountsByType(account.type).length == 0) { Log.i(TAG, "Account not found, creating"); am.addAccountExplicitly(AppAccount.account, null, null); ContentResolver.setIsSyncable(account, CalendarContract.AUTHORITY, 1); ContentResolver.setSyncAutomatically(account, CalendarContract.AUTHORITY, true); } } public static boolean isSyncActive(Context context) { return ContentResolver.isSyncActive(AppAccount.account, CalendarContract.AUTHORITY); } public static long getSyncInterval(Context context) { makeAvailable(context); long syncInterval = SYNC_INTERVAL_MANUALLY; if (ContentResolver.getSyncAutomatically(account, CalendarContract.AUTHORITY)) for (PeriodicSync sync : ContentResolver.getPeriodicSyncs(account, CalendarContract.AUTHORITY)) syncInterval = sync.period; return syncInterval; } public static void setSyncInterval(long syncInterval) { if (syncInterval == -1) { Log.i(TAG, "Disabling automatic synchronization"); ContentResolver.setSyncAutomatically(account, CalendarContract.AUTHORITY, false); } else { Log.i(TAG, "Setting automatic synchronization with interval of " + syncInterval + " seconds"); ContentResolver.setSyncAutomatically(account, CalendarContract.AUTHORITY, true); ContentResolver.addPeriodicSync(account, CalendarContract.AUTHORITY, new Bundle(), syncInterval); } } } app/src/main/java/at/bitfire/icsdroid/Constants.java +1 −1 Original line number Diff line number Diff line Loading @@ -2,6 +2,6 @@ package at.bitfire.icsdroid; public class Constants { public static final String version = "0.9"; public static final String VERSION = "0.9"; } app/src/main/java/at/bitfire/icsdroid/SyncAdapter.java +24 −2 Original line number Diff line number Diff line package at.bitfire.icsdroid; import android.accounts.Account; import android.app.Notification; import android.app.NotificationManager; import android.app.PendingIntent; import android.content.AbstractThreadedSyncAdapter; import android.content.ContentProviderClient; import android.content.Context; import android.content.Intent; import android.content.SyncResult; import android.os.Bundle; import android.support.v7.app.NotificationCompat; import android.util.Log; import org.apache.commons.codec.Charsets; Loading @@ -26,6 +31,7 @@ import at.bitfire.ical4android.Event; import at.bitfire.ical4android.InvalidCalendarException; import at.bitfire.icsdroid.db.LocalCalendar; import at.bitfire.icsdroid.db.LocalEvent; import at.bitfire.icsdroid.ui.CalendarListActivity; import lombok.Cleanup; public class SyncAdapter extends AbstractThreadedSyncAdapter { Loading Loading @@ -62,7 +68,7 @@ public class SyncAdapter extends AbstractThreadedSyncAdapter { try { Log.i(TAG, "Fetching remote calendar " + calendar.getUrl()); @Cleanup("disconnect") HttpURLConnection conn = (HttpURLConnection)new URL(calendar.getUrl()).openConnection(); conn.setRequestProperty("User-Agent", "ICSdroid/" + Constants.version + " (Android)"); conn.setRequestProperty("User-Agent", "ICSdroid/" + Constants.VERSION + " (Android)"); if (calendar.getETag()!= null) conn.setRequestProperty("If-None-Match", calendar.getETag()); Loading Loading @@ -99,9 +105,25 @@ public class SyncAdapter extends AbstractThreadedSyncAdapter { syncResult.stats.numParseExceptions++; } if (errorMessage != null) if (errorMessage != null) { NotificationManager nm = (NotificationManager)getContext().getSystemService(Context.NOTIFICATION_SERVICE); Notification notification = new NotificationCompat.Builder(getContext()) .setSmallIcon(R.drawable.ic_launcher) .setCategory(Notification.CATEGORY_ERROR) .setColor(calendar.getColor()) .setGroup("ICSdroid") .setContentTitle(getContext().getString(R.string.sync_error_title)) .setContentText(calendar.getDisplayName()) .setSubText(errorMessage) .setContentIntent(PendingIntent.getActivity(getContext(), 0, new Intent(getContext(), CalendarListActivity.class), 0)) .setAutoCancel(true) .setWhen(System.currentTimeMillis()) .setOnlyAlertOnce(true) .build(); nm.notify(0, notification); calendar.updateStatusError(errorMessage); } } private Charset charsetFromContentType(String contentType) { // assume UTF-8 by default [RFC 5445 3.1.4] Loading app/src/main/java/at/bitfire/icsdroid/db/LocalCalendar.java +4 −4 Original line number Diff line number Diff line Loading @@ -37,8 +37,8 @@ public class LocalCalendar extends AndroidCalendar { super(account, providerClient, eventFactory, id); } public static LocalCalendar findById(Account account, ContentProviderClient provider) throws FileNotFoundException, CalendarStorageException { return (LocalCalendar)AndroidCalendar.findByID(account, provider, Factory.FACTORY); public static LocalCalendar findById(Account account, ContentProviderClient provider, long id) throws FileNotFoundException, CalendarStorageException { return (LocalCalendar)AndroidCalendar.findByID(account, provider, Factory.FACTORY, id); } public static LocalCalendar[] findAll(Account account, ContentProviderClient provider) throws CalendarStorageException { Loading Loading @@ -67,7 +67,7 @@ public class LocalCalendar extends AndroidCalendar { else values.putNull(COLUMN_ETAG); values.put(COLUMN_LAST_MODIFIED, this.lastModified = lastModified); values.put(COLUMN_LAST_SYNC, new Date().getTime()); values.put(COLUMN_LAST_SYNC, System.currentTimeMillis()); values.putNull(COLUMN_ERROR_MESSAGE); update(values); } Loading @@ -82,7 +82,7 @@ public class LocalCalendar extends AndroidCalendar { ContentValues values = new ContentValues(4); values.putNull(COLUMN_ETAG); values.putNull(COLUMN_LAST_MODIFIED); values.put(COLUMN_LAST_SYNC, new Date().getTime()); values.put(COLUMN_LAST_SYNC, System.currentTimeMillis()); values.put(COLUMN_ERROR_MESSAGE, message); update(values); } Loading app/src/main/java/at/bitfire/icsdroid/ui/AddCalendarDetailsFragment.java +1 −2 Original line number Diff line number Diff line Loading @@ -134,8 +134,7 @@ public class AddCalendarDetailsFragment extends Fragment implements TextWatcher /* actions */ private boolean createCalendar() { AccountManager am = AccountManager.get(activity); am.addAccountExplicitly(AppAccount.account, null, null); AppAccount.makeAvailable(getContext()); ContentValues calInfo = new ContentValues(); calInfo.put(Calendars.ACCOUNT_NAME, AppAccount.account.name); Loading Loading
app/src/main/java/at/bitfire/icsdroid/AppAccount.java +36 −2 Original line number Diff line number Diff line Loading @@ -4,19 +4,53 @@ import android.accounts.Account; import android.accounts.AccountManager; import android.content.ContentResolver; import android.content.Context; import android.content.PeriodicSync; import android.os.Bundle; import android.provider.CalendarContract; import android.util.Log; import net.fortuna.ical4j.model.Content; public class AppAccount { private static final String TAG = "ICSdroid.AppAccount"; public static final long SYNC_INTERVAL_MANUALLY = -1; public static final Account account = new Account("ICSdroid", "at.bitfire.icsdroid"); public static boolean isAvailable(Context context) { public static void makeAvailable(Context context) { AccountManager am = AccountManager.get(context); return am.getAccountsByType(account.type).length > 0; if (am.getAccountsByType(account.type).length == 0) { Log.i(TAG, "Account not found, creating"); am.addAccountExplicitly(AppAccount.account, null, null); ContentResolver.setIsSyncable(account, CalendarContract.AUTHORITY, 1); ContentResolver.setSyncAutomatically(account, CalendarContract.AUTHORITY, true); } } public static boolean isSyncActive(Context context) { return ContentResolver.isSyncActive(AppAccount.account, CalendarContract.AUTHORITY); } public static long getSyncInterval(Context context) { makeAvailable(context); long syncInterval = SYNC_INTERVAL_MANUALLY; if (ContentResolver.getSyncAutomatically(account, CalendarContract.AUTHORITY)) for (PeriodicSync sync : ContentResolver.getPeriodicSyncs(account, CalendarContract.AUTHORITY)) syncInterval = sync.period; return syncInterval; } public static void setSyncInterval(long syncInterval) { if (syncInterval == -1) { Log.i(TAG, "Disabling automatic synchronization"); ContentResolver.setSyncAutomatically(account, CalendarContract.AUTHORITY, false); } else { Log.i(TAG, "Setting automatic synchronization with interval of " + syncInterval + " seconds"); ContentResolver.setSyncAutomatically(account, CalendarContract.AUTHORITY, true); ContentResolver.addPeriodicSync(account, CalendarContract.AUTHORITY, new Bundle(), syncInterval); } } }
app/src/main/java/at/bitfire/icsdroid/Constants.java +1 −1 Original line number Diff line number Diff line Loading @@ -2,6 +2,6 @@ package at.bitfire.icsdroid; public class Constants { public static final String version = "0.9"; public static final String VERSION = "0.9"; }
app/src/main/java/at/bitfire/icsdroid/SyncAdapter.java +24 −2 Original line number Diff line number Diff line package at.bitfire.icsdroid; import android.accounts.Account; import android.app.Notification; import android.app.NotificationManager; import android.app.PendingIntent; import android.content.AbstractThreadedSyncAdapter; import android.content.ContentProviderClient; import android.content.Context; import android.content.Intent; import android.content.SyncResult; import android.os.Bundle; import android.support.v7.app.NotificationCompat; import android.util.Log; import org.apache.commons.codec.Charsets; Loading @@ -26,6 +31,7 @@ import at.bitfire.ical4android.Event; import at.bitfire.ical4android.InvalidCalendarException; import at.bitfire.icsdroid.db.LocalCalendar; import at.bitfire.icsdroid.db.LocalEvent; import at.bitfire.icsdroid.ui.CalendarListActivity; import lombok.Cleanup; public class SyncAdapter extends AbstractThreadedSyncAdapter { Loading Loading @@ -62,7 +68,7 @@ public class SyncAdapter extends AbstractThreadedSyncAdapter { try { Log.i(TAG, "Fetching remote calendar " + calendar.getUrl()); @Cleanup("disconnect") HttpURLConnection conn = (HttpURLConnection)new URL(calendar.getUrl()).openConnection(); conn.setRequestProperty("User-Agent", "ICSdroid/" + Constants.version + " (Android)"); conn.setRequestProperty("User-Agent", "ICSdroid/" + Constants.VERSION + " (Android)"); if (calendar.getETag()!= null) conn.setRequestProperty("If-None-Match", calendar.getETag()); Loading Loading @@ -99,9 +105,25 @@ public class SyncAdapter extends AbstractThreadedSyncAdapter { syncResult.stats.numParseExceptions++; } if (errorMessage != null) if (errorMessage != null) { NotificationManager nm = (NotificationManager)getContext().getSystemService(Context.NOTIFICATION_SERVICE); Notification notification = new NotificationCompat.Builder(getContext()) .setSmallIcon(R.drawable.ic_launcher) .setCategory(Notification.CATEGORY_ERROR) .setColor(calendar.getColor()) .setGroup("ICSdroid") .setContentTitle(getContext().getString(R.string.sync_error_title)) .setContentText(calendar.getDisplayName()) .setSubText(errorMessage) .setContentIntent(PendingIntent.getActivity(getContext(), 0, new Intent(getContext(), CalendarListActivity.class), 0)) .setAutoCancel(true) .setWhen(System.currentTimeMillis()) .setOnlyAlertOnce(true) .build(); nm.notify(0, notification); calendar.updateStatusError(errorMessage); } } private Charset charsetFromContentType(String contentType) { // assume UTF-8 by default [RFC 5445 3.1.4] Loading
app/src/main/java/at/bitfire/icsdroid/db/LocalCalendar.java +4 −4 Original line number Diff line number Diff line Loading @@ -37,8 +37,8 @@ public class LocalCalendar extends AndroidCalendar { super(account, providerClient, eventFactory, id); } public static LocalCalendar findById(Account account, ContentProviderClient provider) throws FileNotFoundException, CalendarStorageException { return (LocalCalendar)AndroidCalendar.findByID(account, provider, Factory.FACTORY); public static LocalCalendar findById(Account account, ContentProviderClient provider, long id) throws FileNotFoundException, CalendarStorageException { return (LocalCalendar)AndroidCalendar.findByID(account, provider, Factory.FACTORY, id); } public static LocalCalendar[] findAll(Account account, ContentProviderClient provider) throws CalendarStorageException { Loading Loading @@ -67,7 +67,7 @@ public class LocalCalendar extends AndroidCalendar { else values.putNull(COLUMN_ETAG); values.put(COLUMN_LAST_MODIFIED, this.lastModified = lastModified); values.put(COLUMN_LAST_SYNC, new Date().getTime()); values.put(COLUMN_LAST_SYNC, System.currentTimeMillis()); values.putNull(COLUMN_ERROR_MESSAGE); update(values); } Loading @@ -82,7 +82,7 @@ public class LocalCalendar extends AndroidCalendar { ContentValues values = new ContentValues(4); values.putNull(COLUMN_ETAG); values.putNull(COLUMN_LAST_MODIFIED); values.put(COLUMN_LAST_SYNC, new Date().getTime()); values.put(COLUMN_LAST_SYNC, System.currentTimeMillis()); values.put(COLUMN_ERROR_MESSAGE, message); update(values); } Loading
app/src/main/java/at/bitfire/icsdroid/ui/AddCalendarDetailsFragment.java +1 −2 Original line number Diff line number Diff line Loading @@ -134,8 +134,7 @@ public class AddCalendarDetailsFragment extends Fragment implements TextWatcher /* actions */ private boolean createCalendar() { AccountManager am = AccountManager.get(activity); am.addAccountExplicitly(AppAccount.account, null, null); AppAccount.makeAvailable(getContext()); ContentValues calInfo = new ContentValues(); calInfo.put(Calendars.ACCOUNT_NAME, AppAccount.account.name); Loading