From 3a49815220c9d3f166a5be407d2462f51a3824a0 Mon Sep 17 00:00:00 2001 From: Ricki Hirner Date: Wed, 23 Mar 2016 22:01:52 +0100 Subject: [PATCH] Show notifications on refresh errors * show notifications on DAV service refresh errors * add Twitter to navigation drawer --- .../java/at/bitfire/davdroid/Constants.java | 1 + .../java/at/bitfire/davdroid/DavService.java | 45 ++++++++++++++----- .../bitfire/davdroid/ui/AccountsActivity.java | 11 +++-- app/src/main/res/drawable/ic_error_light.xml | 17 +++++++ app/src/main/res/drawable/twitter.xml | 33 ++++++++++++++ .../res/menu/activity_accounts_drawer.xml | 13 +++++- app/src/main/res/values/strings.xml | 5 +++ 7 files changed, 111 insertions(+), 14 deletions(-) create mode 100644 app/src/main/res/drawable/ic_error_light.xml create mode 100644 app/src/main/res/drawable/twitter.xml diff --git a/app/src/main/java/at/bitfire/davdroid/Constants.java b/app/src/main/java/at/bitfire/davdroid/Constants.java index 8e36efbf..70dbabbc 100644 --- a/app/src/main/java/at/bitfire/davdroid/Constants.java +++ b/app/src/main/java/at/bitfire/davdroid/Constants.java @@ -18,6 +18,7 @@ public class Constants { public final static int NOTIFICATION_ACCOUNT_SETTINGS_UPDATED = 0, NOTIFICATION_EXTERNAL_FILE_LOGGING = 1, + NOTIFICATION_REFRESH_COLLECTIONS = 2, NOTIFICATION_CONTACTS_SYNC = 10, NOTIFICATION_CALENDAR_SYNC = 11, NOTIFICATION_TASK_SYNC = 12; diff --git a/app/src/main/java/at/bitfire/davdroid/DavService.java b/app/src/main/java/at/bitfire/davdroid/DavService.java index 5dd36599..47bff126 100644 --- a/app/src/main/java/at/bitfire/davdroid/DavService.java +++ b/app/src/main/java/at/bitfire/davdroid/DavService.java @@ -10,14 +10,19 @@ package at.bitfire.davdroid; import android.accounts.Account; import android.accounts.AccountManager; +import android.app.Notification; +import android.app.NotificationManager; +import android.app.PendingIntent; import android.app.Service; import android.content.ContentValues; import android.content.Intent; import android.database.Cursor; import android.database.DatabaseUtils; import android.database.sqlite.SQLiteDatabase; +import android.graphics.drawable.BitmapDrawable; import android.os.Binder; import android.os.IBinder; +import android.support.v7.app.NotificationCompat; import android.text.TextUtils; import java.io.IOException; @@ -45,6 +50,7 @@ import at.bitfire.davdroid.model.ServiceDB.Collections; import at.bitfire.davdroid.model.ServiceDB.HomeSets; import at.bitfire.davdroid.model.ServiceDB.OpenHelper; import at.bitfire.davdroid.model.ServiceDB.Services; +import at.bitfire.davdroid.ui.DebugInfoActivity; import lombok.Cleanup; import okhttp3.HttpUrl; import okhttp3.OkHttpClient; @@ -152,14 +158,19 @@ public class DavService extends Service { @Override public void run() { + Account account = null; + try { db = dbHelper.getWritableDatabase(); String serviceType = serviceType(); App.log.info("Refreshing " + serviceType + " collections of service #" + service); + // get account + account = account(); + // create authenticating OkHttpClient (credentials taken from account settings) - OkHttpClient httpClient = httpClient(); + OkHttpClient httpClient = HttpClient.create(DavService.this, account); // refresh home sets: principal Set homeSets = readHomeSets(); @@ -180,7 +191,7 @@ public class DavService extends Service { if (proxyWrite != null) for (String href : proxyWrite.principals) { App.log.fine("Principal is a read-write proxy for " + href + ", checking for home sets"); - queryHomeSets(serviceType, new DavResource(httpClient, dav.location.resolve(href)), homeSets); + queryHomeSets(serviceType, new DavResource(httpClient, dav.location.resolve(href)), homeSets); } // refresh home sets: direct group memberships @@ -273,6 +284,21 @@ public class DavService extends Service { } catch (IOException|HttpException|DavException e) { App.log.log(Level.SEVERE, "Couldn't refresh collection list", e); + + Intent debugIntent = new Intent(DavService.this, DebugInfoActivity.class); + debugIntent.putExtra(DebugInfoActivity.KEY_EXCEPTION, e); + if (account != null) + debugIntent.putExtra(DebugInfoActivity.KEY_ACCOUNT, account); + + NotificationManager nm = (NotificationManager)getSystemService(NOTIFICATION_SERVICE); + Notification notify = new NotificationCompat.Builder(DavService.this) + .setSmallIcon(R.drawable.ic_error_light) + .setLargeIcon(((BitmapDrawable)getResources().getDrawable(R.drawable.ic_launcher)).getBitmap()) + .setContentTitle(getString(R.string.dav_service_refresh_failed)) + .setContentText(getString(R.string.dav_service_refresh_couldnt_refresh)) + .setContentIntent(PendingIntent.getActivity(DavService.this, 0, debugIntent, 0)) + .build(); + nm.notify(Constants.NOTIFICATION_REFRESH_COLLECTIONS, notify); } finally { dbHelper.close(); @@ -305,17 +331,16 @@ public class DavService extends Service { } - private OkHttpClient httpClient() { - @Cleanup Cursor cursor = db.query(Services._TABLE, new String[]{Services.ACCOUNT_NAME}, Services.ID + "=?", new String[] { String.valueOf(service) }, null, null, null); + private Account account() { + @Cleanup Cursor cursor = db.query(Services._TABLE, new String[] { Services.ACCOUNT_NAME }, Services.ID + "=?", new String[] { String.valueOf(service) }, null, null, null); if (cursor.moveToNext()) { - Account account = new Account(cursor.getString(0), Constants.ACCOUNT_TYPE); - return HttpClient.create(DavService.this, account); + return new Account(cursor.getString(0), Constants.ACCOUNT_TYPE); } else throw new IllegalArgumentException("Service not found"); } private String serviceType() { - @Cleanup Cursor cursor = db.query(Services._TABLE, new String[]{Services.SERVICE}, Services.ID + "=?", new String[] { String.valueOf(service) }, null, null, null); + @Cleanup Cursor cursor = db.query(Services._TABLE, new String[] { Services.SERVICE }, Services.ID + "=?", new String[] { String.valueOf(service) }, null, null, null); if (cursor.moveToNext()) return cursor.getString(0); else @@ -323,7 +348,7 @@ public class DavService extends Service { } private HttpUrl readPrincipal() { - @Cleanup Cursor cursor = db.query(Services._TABLE, new String[]{Services.PRINCIPAL}, Services.ID + "=?", new String[]{String.valueOf(service)}, null, null, null); + @Cleanup Cursor cursor = db.query(Services._TABLE, new String[] { Services.PRINCIPAL }, Services.ID + "=?", new String[] { String.valueOf(service) }, null, null, null); if (cursor.moveToNext()) { String principal = cursor.getString(0); if (principal != null) @@ -334,14 +359,14 @@ public class DavService extends Service { private Set readHomeSets() { Set homeSets = new LinkedHashSet<>(); - @Cleanup Cursor cursor = db.query(HomeSets._TABLE, new String[]{HomeSets.URL}, HomeSets.SERVICE_ID + "=?", new String[]{String.valueOf(service)}, null, null, null); + @Cleanup Cursor cursor = db.query(HomeSets._TABLE, new String[] { HomeSets.URL }, HomeSets.SERVICE_ID + "=?", new String[] { String.valueOf(service) }, null, null, null); while (cursor.moveToNext()) homeSets.add(HttpUrl.parse(cursor.getString(0))); return homeSets; } private void saveHomeSets(Set homeSets) { - db.delete(HomeSets._TABLE, HomeSets.SERVICE_ID + "=?", new String[]{String.valueOf(service)}); + db.delete(HomeSets._TABLE, HomeSets.SERVICE_ID + "=?", new String[] { String.valueOf(service) }); for (HttpUrl homeSet : homeSets) { ContentValues values = new ContentValues(1); values.put(HomeSets.SERVICE_ID, service); diff --git a/app/src/main/java/at/bitfire/davdroid/ui/AccountsActivity.java b/app/src/main/java/at/bitfire/davdroid/ui/AccountsActivity.java index 0b8ab344..2cd1643c 100644 --- a/app/src/main/java/at/bitfire/davdroid/ui/AccountsActivity.java +++ b/app/src/main/java/at/bitfire/davdroid/ui/AccountsActivity.java @@ -9,6 +9,7 @@ package at.bitfire.davdroid.ui; import android.content.Intent; +import android.net.Uri; import android.os.Bundle; import android.support.design.widget.FloatingActionButton; import android.support.design.widget.NavigationView; @@ -51,6 +52,7 @@ public class AccountsActivity extends AppCompatActivity implements NavigationVie NavigationView navigationView = (NavigationView)findViewById(R.id.nav_view); navigationView.setNavigationItemSelectedListener(this); + navigationView.setItemIconTintList(null); if (savedInstanceState == null && !getPackageName().equals(getCallingPackage())) { FragmentTransaction ft = getSupportFragmentManager().beginTransaction(); @@ -72,6 +74,12 @@ public class AccountsActivity extends AppCompatActivity implements NavigationVie @Override public boolean onNavigationItemSelected(MenuItem item) { switch (item.getItemId()) { + case R.id.nav_app_settings: + startActivity(new Intent(this, AppSettingsActivity.class)); + break; + case R.id.nav_twitter: + startActivity(new Intent(Intent.ACTION_VIEW, Uri.parse("https://twitter.com/davdroidapp"))); + break; case R.id.nav_about: startActivity(new Intent(Intent.ACTION_VIEW, Constants.webUri.buildUpon().appendEncodedPath("source/").build())); break; @@ -87,9 +95,6 @@ public class AccountsActivity extends AppCompatActivity implements NavigationVie case R.id.nav_donate: startActivity(new Intent(Intent.ACTION_VIEW, Constants.webUri.buildUpon().appendEncodedPath("donate/").build())); break; - case R.id.nav_app_settings: - startActivity(new Intent(this, AppSettingsActivity.class)); - break; } DrawerLayout drawer = (DrawerLayout)findViewById(R.id.drawer_layout); diff --git a/app/src/main/res/drawable/ic_error_light.xml b/app/src/main/res/drawable/ic_error_light.xml new file mode 100644 index 00000000..1b02058a --- /dev/null +++ b/app/src/main/res/drawable/ic_error_light.xml @@ -0,0 +1,17 @@ + + + + + diff --git a/app/src/main/res/drawable/twitter.xml b/app/src/main/res/drawable/twitter.xml new file mode 100644 index 00000000..4605ad00 --- /dev/null +++ b/app/src/main/res/drawable/twitter.xml @@ -0,0 +1,33 @@ + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/menu/activity_accounts_drawer.xml b/app/src/main/res/menu/activity_accounts_drawer.xml index c841b5e7..73da9420 100644 --- a/app/src/main/res/menu/activity_accounts_drawer.xml +++ b/app/src/main/res/menu/activity_accounts_drawer.xml @@ -7,13 +7,24 @@ ~ http://www.gnu.org/licenses/gpl.html --> - + + + + + + + CalDAV/CardDAV Sync Adapter About / License Settings + News & updates External links Web site FAQ @@ -54,6 +55,10 @@ Welcome to DAVdroid!\n\nYou can add a CalDAV/CardDAV account now. + + Service detection failed + Couldn\'t refresh collection list + Settings User interface