Commit 68ee33b2 authored by Ricki Hirner's avatar Ricki Hirner 🐑

Resource detection, bug fixes

* resource detection is subject to change yet
* don't use UID_2445 for Android <= 4.1
* more useful sync error notification messages
* handle 401 Unauthorized and show account info when notification is tapped
parent fa766906
......@@ -126,8 +126,9 @@ public class HttpClient extends OkHttpClient {
// add User-Agent to every request
networkInterceptors().add(userAgentInterceptor);
// enable logs
enableLogs();
// enable verbose logs, if requested
if (Constants.log.isTraceEnabled())
enableLogs();
}
protected void enableLogs() {
......
......@@ -10,6 +10,7 @@ package at.bitfire.davdroid.resource;
import android.content.ContentProviderOperation;
import android.content.ContentValues;
import android.os.Build;
import android.os.RemoteException;
import android.provider.CalendarContract;
import android.provider.CalendarContract.Events;
......@@ -32,8 +33,8 @@ public class LocalEvent extends AndroidEvent implements LocalResource {
}
static final String COLUMN_ETAG = CalendarContract.Events.SYNC_DATA1,
COLUMN_UID = CalendarContract.Events.UID_2445,
COLUMN_SEQUENCE = CalendarContract.Events.SYNC_DATA2;
COLUMN_UID = Build.VERSION.SDK_INT >= 17 ? Events.UID_2445 : Events.SYNC_DATA2,
COLUMN_SEQUENCE = CalendarContract.Events.SYNC_DATA3;
@Getter protected String fileName;
@Getter @Setter protected String eTag;
......
......@@ -36,8 +36,8 @@ public class LocalTask extends AndroidTask implements LocalResource {
}
static final String COLUMN_ETAG = Tasks.SYNC1,
COLUMN_UID = Tasks._UID,
COLUMN_SEQUENCE = Tasks.SYNC2;
COLUMN_UID = Tasks.SYNC2,
COLUMN_SEQUENCE = Tasks.SYNC3;
@Getter protected String fileName;
@Getter @Setter protected String eTag;
......
......@@ -33,6 +33,7 @@ import java.util.UUID;
import at.bitfire.dav4android.DavResource;
import at.bitfire.dav4android.exception.DavException;
import at.bitfire.dav4android.exception.HttpException;
import at.bitfire.dav4android.exception.UnauthorizedException;
import at.bitfire.dav4android.exception.PreconditionFailedException;
import at.bitfire.dav4android.exception.ServiceUnavailableException;
import at.bitfire.dav4android.property.GetCTag;
......@@ -43,6 +44,7 @@ import at.bitfire.davdroid.R;
import at.bitfire.davdroid.resource.LocalCollection;
import at.bitfire.davdroid.resource.LocalResource;
import at.bitfire.davdroid.ui.DebugInfoActivity;
import at.bitfire.davdroid.ui.settings.AccountActivity;
import at.bitfire.ical4android.CalendarStorageException;
import at.bitfire.vcard4android.ContactsStorageException;
......@@ -165,18 +167,36 @@ abstract public class SyncManager {
}
} catch(Exception e) {
if (e instanceof HttpException || e instanceof DavException) {
final int messageString;
if (e instanceof UnauthorizedException) {
Constants.log.error("Not authorized anymore", e);
messageString = R.string.sync_error_unauthorized;
syncResult.stats.numAuthExceptions++;
} else if (e instanceof HttpException || e instanceof DavException) {
Constants.log.error("HTTP/DAV Exception during sync", e);
messageString = R.string.sync_error_http_dav;
syncResult.stats.numParseExceptions++;
} else if (e instanceof CalendarStorageException || e instanceof ContactsStorageException) {
Constants.log.error("Couldn't access local storage", e);
messageString = R.string.sync_error_local_storage;
syncResult.databaseError = true;
} else {
Constants.log.error("Unknown sync error", e);
messageString = R.string.sync_error;
syncResult.stats.numParseExceptions++;
}
Intent detailsIntent = new Intent(context, DebugInfoActivity.class);
detailsIntent.putExtra(DebugInfoActivity.KEY_EXCEPTION, e);
detailsIntent.putExtra(DebugInfoActivity.KEY_ACCOUNT, account);
detailsIntent.putExtra(DebugInfoActivity.KEY_PHASE, syncPhase);
final Intent detailsIntent;
if (e instanceof UnauthorizedException) {
detailsIntent = new Intent(context, AccountActivity.class);
detailsIntent.putExtra(AccountActivity.EXTRA_ACCOUNT, account);
} else {
detailsIntent = new Intent(context, DebugInfoActivity.class);
detailsIntent.putExtra(DebugInfoActivity.KEY_EXCEPTION, e);
detailsIntent.putExtra(DebugInfoActivity.KEY_ACCOUNT, account);
detailsIntent.putExtra(DebugInfoActivity.KEY_PHASE, syncPhase);
}
Notification.Builder builder = new Notification.Builder(context);
Notification notification;
......@@ -184,9 +204,13 @@ abstract public class SyncManager {
.setContentTitle(context.getString(R.string.sync_error_title, account.name))
.setContentIntent(PendingIntent.getActivity(context, 0, detailsIntent, PendingIntent.FLAG_UPDATE_CURRENT));
String[] phases = context.getResources().getStringArray(R.array.sync_error_phases);
if (phases.length > syncPhase)
builder.setContentText(context.getString(R.string.sync_error_http, phases[syncPhase]));
try {
String[] phases = context.getResources().getStringArray(R.array.sync_error_phases);
String message = context.getString(messageString, phases[syncPhase]);
builder.setContentText(message);
} catch (IndexOutOfBoundsException ex) {
// should never happen
}
if (Build.VERSION.SDK_INT >= 16) {
if (Build.VERSION.SDK_INT >= 21)
......
......@@ -182,7 +182,7 @@ public class TasksSyncManager extends SyncManager {
try {
tasks = Task.fromStream(stream, charset);
} catch (InvalidCalendarException e) {
Constants.log.error("Received invalid iCalendar, ignoring");
Constants.log.error("Received invalid iCalendar, ignoring", e);
return;
}
......@@ -203,7 +203,7 @@ public class TasksSyncManager extends SyncManager {
syncResult.stats.numInserts++;
}
} else
Constants.log.error("Received VCALENDAR with not exactly one VEVENT with UID, but without RECURRENCE-ID; ignoring " + fileName);
Constants.log.error("Received VCALENDAR with not exactly one VTODO; ignoring " + fileName);
}
}
......@@ -23,6 +23,10 @@ import android.view.Menu;
import android.view.MenuItem;
import android.widget.TextView;
import com.google.common.base.Throwables;
import org.apache.commons.lang3.exception.ExceptionUtils;
import java.io.PrintWriter;
import java.io.StringWriter;
......@@ -137,10 +141,7 @@ public class DebugInfoActivity extends Activity {
if (exception != null) {
report.append("STACK TRACE\n");
StringWriter writer = new StringWriter();
@Cleanup PrintWriter printWriter = new PrintWriter(writer);
exception.printStackTrace(printWriter);
report.append(writer.toString());
report.append(Throwables.getStackTraceAsString(exception));
}
return report.toString();
......
......@@ -178,7 +178,9 @@
<string name="setup_read_only">schreibgeschützt</string>
<string name="sync_error_title">Synchronisierung von %s fehlgeschlagen</string>
<string name="sync_error_http">HTTP-Fehler beim %1$s</string>
<string name="sync_error">Fehler beim %1$s</string>
<string name="sync_error_http_dav">Serverfehler</string>
<string name="sync_error_local_storage">Datenbank-Fehler</string>
<string-array name="sync_error_phases">
<item>Vorbereiten der Synchronisierung</item>
<item>Abfragen der Server-Fähigkeiten</item>
......@@ -188,8 +190,10 @@
<item>Abfragen des Synchronisierungs-Zustands</item>
<item>Auflisten lokaler Einträge</item>
<item>Auflisten der Server-Einträge</item>
<item>Vergleichen tw. Datenbank/Server</item>
<item>Herunterladen von Server-Einträgen</item>
<item>Speichern des Synchronisierungs-Zustands</item>
</string-array>
<string name="sync_error_unauthorized">Benutzername/Passwort falsch</string>
</resources>
\ No newline at end of file
......@@ -193,7 +193,9 @@
<!-- sync errors and DebugInfoActivity -->
<string name="debug_info_title">Debug info</string>
<string name="sync_error_title">Synchronization of %s failed</string>
<string name="sync_error_http">HTTP error while %1$s</string>
<string name="sync_error">Error while %1$s</string>
<string name="sync_error_http_dav">Server error</string>
<string name="sync_error_local_storage">Database error</string>
<string-array name="sync_error_phases">
<item>preparing synchronization</item>
<item>querying capabilities</item>
......@@ -203,8 +205,10 @@
<item>checking sync state</item>
<item>listing local entries</item>
<item>listing remote entries</item>
<item>comparing local/remote entries</item>
<item>downloading remote entries</item>
<item>saving sync state</item>
</string-array>
<string name="sync_error_unauthorized">User name/password wrong</string>
</resources>
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment