Thank you for buying DAVdroid via Google Play and thus supporting the project. Unfortunately, there are two issues with Google Play:
@@ -63,20 +66,15 @@
or purchasing it.
License
- Copyright (c) 2013 – 2014 Ricki Hirner (bitfire web engineering). All rights reserved.
+
Copyright (c) 2013 – 2014 Ricki Hirner, Bernhard Stockmann (bitfire web engineering). All rights reserved.
This program and the accompanying materials are made available under the terms of the GNU Public License v3.0 which
accompanies this distribution, and is available at http://www.gnu.org/licenses/gpl.html. As far as Google Play, Samsung
Store, AndroidPit App Center or Amazon Appstore require other terms, the respective terms apply for versions
that are downloaded via these services.
- Translations.
- Catalanian: @pokoli,
- Chinese (simplified): @phy25,
- Czech: Jaroslav Lichtblau,
- Serbian: @pejakm,
- Spanish: @xphnx
-
+ Translation for German is provided by the authors. Translations to other languages have been contributed by
+ various people which are mentioned in their respective language version.
Used third-party libraries
@@ -93,8 +91,6 @@
Login with URL and user name
Service details will be auto-detected by initial URL and user name. Mostly used for self-hosted services.
- Password:
-
Please enter your email address. Its domain name will be used to auto-detect service settings.
Email:
@@ -105,40 +101,37 @@
"If you don't use encryption (HTTPS), other people may easily intercept your login details, contacts and events."
User name:
Base URL (collections will be auto-detected):
- Invalid base URL:
+ Preemptive authentication (recommended, but incompatible with Digest auth)
+
+ Password:
- DAVdroid: Select collections
- No CalDAV-/CardDAV service is available at this location.
- Add account
- Querying server. Please wait…
- Which collections shall be synchronized?
- Address books
- Calendars
- Select up to one address book (tap again to unselect):
- Select your calendars:
- Preemptive authentication (recommended, but incompatible with Digest auth)
+ DAVdroid: Select collections
+ No CalDAV-/CardDAV service is available at this location.
+ Add account
+ Querying server. Please wait…
+ Which collections shall be synchronized?
+ Address books
+ Calendars
+ Select up to one address book (tap again to unselect):
+ Select your calendars:
- DAVdroid Help
- Manage sync accounts
- DAVdroid Web site
-
- Account details
- Account name:
- My CalDAV/CardDAV Account
- Email address:
- "ORGANIZER of your events; required if you use attendee info"
- "Use your email address as account name because Android will use the account name as ORGANIZER field for events you create. You can't have two accounts with the same name.
- read-only
-
- Settings
- General settings
- Debug settings
- Disable HTTP compression
- HTTP compression is disabled (debug mode)
- HTTP compression is used whenever possible
- Log network traffic
- All network traffic is being logged verbosely (debug mode)
- Network traffic is not being logged
- Report an issue
+ Account details
+ Account name:
+ My CalDAV/CardDAV Account
+ Email address:
+ "ORGANIZER of your events; required if you use attendee info"
+ "Use your email address as account name because Android will use the account name as ORGANIZER field for events you create. You can't have two accounts with the same name.
+ read-only
+
+
+ General settings
+ Debug settings
+ Disable HTTP compression
+ HTTP compression is disabled (debug mode)
+ HTTP compression is used whenever possible
+ Log network traffic
+ All network traffic is being logged verbosely (debug mode)
+ Network traffic is not being logged
+ Report an issue
diff --git a/res/xml/account_prefs.xml b/res/xml/account_prefs.xml
index 33295623..101de536 100644
--- a/res/xml/account_prefs.xml
+++ b/res/xml/account_prefs.xml
@@ -1,7 +1,7 @@
-
+
-
+
-
+
-
+ android:summaryOff="@string/settings_http_compression_enabled"
+ android:summaryOn="@string/settings_http_compression_disabled"
+ android:title="@string/settings_disable_http_compression" />
+
\ No newline at end of file
diff --git a/src/at/bitfire/davdroid/Constants.java b/src/at/bitfire/davdroid/Constants.java
index 2411bc40..9349e433 100644
--- a/src/at/bitfire/davdroid/Constants.java
+++ b/src/at/bitfire/davdroid/Constants.java
@@ -9,7 +9,7 @@ package at.bitfire.davdroid;
public class Constants {
public static final String
- APP_VERSION = "0.6.6",
+ APP_VERSION = "0.6.7",
ACCOUNT_TYPE = "bitfire.at.davdroid",
WEB_URL_HELP = "http://davdroid.bitfire.at/configuration?pk_campaign=davdroid-app",
diff --git a/src/at/bitfire/davdroid/resource/DavResourceFinder.java b/src/at/bitfire/davdroid/resource/DavResourceFinder.java
index 5fcb9e9f..cd7163ce 100644
--- a/src/at/bitfire/davdroid/resource/DavResourceFinder.java
+++ b/src/at/bitfire/davdroid/resource/DavResourceFinder.java
@@ -137,7 +137,7 @@ public class DavResourceFinder implements Closeable {
}
if (!serverInfo.isCalDAV() && !serverInfo.isCardDAV())
- throw new DavIncapableException(context.getString(R.string.neither_caldav_nor_carddav));
+ throw new DavIncapableException(context.getString(R.string.setup_neither_caldav_nor_carddav));
}
@@ -149,7 +149,6 @@ public class DavResourceFinder implements Closeable {
* @return Initial service URL (HTTP/HTTPS), without user credentials
* @throws URISyntaxException when the user-given URI is invalid
* @throws MalformedURLException when the user-given URI is invalid
- * @throws UnknownServiceURLException when no intial service URL could be determined
*/
public URL getInitialContextURL(ServerInfo serverInfo, String serviceName) throws URISyntaxException, MalformedURLException {
String scheme = null,
@@ -165,8 +164,12 @@ public class DavResourceFinder implements Closeable {
// determine service FQDN
int pos = mailbox.lastIndexOf("@");
if (pos == -1)
- throw new URISyntaxException(mailbox, "Email address doesn't contain @");
+ throw new URISyntaxException(mailbox, "Missing @ sign");
+
+ scheme = "https";
domain = mailbox.substring(pos + 1);
+ if (domain.isEmpty())
+ throw new URISyntaxException(mailbox, "Missing domain name");
} else {
// HTTP(S) URLs
scheme = baseURI.getScheme();
@@ -221,44 +224,45 @@ public class DavResourceFinder implements Closeable {
*/
WebDavResource getCurrentUserPrincipal(ServerInfo serverInfo, String serviceName) throws URISyntaxException, IOException, NotAuthorizedException {
URL initialURL = getInitialContextURL(serverInfo, serviceName);
-
- // determine base URL (host name and initial context path)
- WebDavResource base = new WebDavResource(httpClient,
- //new URI(URIUtils.ensureTrailingSlash(serverInfo.getBaseURI())),
- initialURL,
- serverInfo.getUserName(), serverInfo.getPassword(), serverInfo.isAuthPreemptive());
-
- // look for well-known service (RFC 5785)
- try {
- WebDavResource wellKnown = new WebDavResource(base, "/.well-known/" + serviceName);
- wellKnown.propfind(Mode.CURRENT_USER_PRINCIPAL);
- if (wellKnown.getCurrentUserPrincipal() != null)
- return new WebDavResource(wellKnown, wellKnown.getCurrentUserPrincipal());
- } catch (NotAuthorizedException e) {
- Log.w(TAG, "Not authorized for well-known " + serviceName + " service detection", e);
- throw e;
- } catch (URISyntaxException e) {
- Log.w(TAG, "Well-known" + serviceName + " service detection failed because of invalid URIs", e);
- } catch (HttpException e) {
- Log.d(TAG, "Well-known " + serviceName + " service detection failed with HTTP error", e);
- } catch (DavException e) {
- Log.w(TAG, "Well-known " + serviceName + " service detection failed with unexpected DAV response", e);
+ if (initialURL != null) {
+ // determine base URL (host name and initial context path)
+ WebDavResource base = new WebDavResource(httpClient,
+ //new URI(URIUtils.ensureTrailingSlash(serverInfo.getBaseURI())),
+ initialURL,
+ serverInfo.getUserName(), serverInfo.getPassword(), serverInfo.isAuthPreemptive());
+
+ // look for well-known service (RFC 5785)
+ try {
+ WebDavResource wellKnown = new WebDavResource(base, "/.well-known/" + serviceName);
+ wellKnown.propfind(Mode.CURRENT_USER_PRINCIPAL);
+ if (wellKnown.getCurrentUserPrincipal() != null)
+ return new WebDavResource(wellKnown, wellKnown.getCurrentUserPrincipal());
+ } catch (NotAuthorizedException e) {
+ Log.w(TAG, "Not authorized for well-known " + serviceName + " service detection", e);
+ throw e;
+ } catch (URISyntaxException e) {
+ Log.w(TAG, "Well-known" + serviceName + " service detection failed because of invalid URIs", e);
+ } catch (HttpException e) {
+ Log.d(TAG, "Well-known " + serviceName + " service detection failed with HTTP error", e);
+ } catch (DavException e) {
+ Log.w(TAG, "Well-known " + serviceName + " service detection failed with unexpected DAV response", e);
+ }
+
+ // fall back to user-given initial context path
+ try {
+ base.propfind(Mode.CURRENT_USER_PRINCIPAL);
+ if (base.getCurrentUserPrincipal() != null)
+ return new WebDavResource(base, base.getCurrentUserPrincipal());
+ } catch (NotAuthorizedException e) {
+ Log.e(TAG, "Not authorized for querying principal", e);
+ throw e;
+ } catch (HttpException e) {
+ Log.e(TAG, "HTTP error when querying principal", e);
+ } catch (DavException e) {
+ Log.e(TAG, "DAV error when querying principal", e);
+ }
+ Log.i(TAG, "Couldn't find current-user-principal for service " + serviceName);
}
-
- // fall back to user-given initial context path
- try {
- base.propfind(Mode.CURRENT_USER_PRINCIPAL);
- if (base.getCurrentUserPrincipal() != null)
- return new WebDavResource(base, base.getCurrentUserPrincipal());
- } catch (NotAuthorizedException e) {
- Log.e(TAG, "Not authorized for querying principal", e);
- throw e;
- } catch (HttpException e) {
- Log.e(TAG, "HTTP error when querying principal", e);
- } catch (DavException e) {
- Log.e(TAG, "DAV error when querying principal", e);
- }
- Log.i(TAG, "Couldn't find current-user-principal for service " + serviceName);
return null;
}
diff --git a/src/at/bitfire/davdroid/syncadapter/LoginEmailFragment.java b/src/at/bitfire/davdroid/syncadapter/LoginEmailFragment.java
index 2bf70b6b..72fb1d8b 100644
--- a/src/at/bitfire/davdroid/syncadapter/LoginEmailFragment.java
+++ b/src/at/bitfire/davdroid/syncadapter/LoginEmailFragment.java
@@ -77,7 +77,8 @@ public class LoginEmailFragment extends Fragment implements TextWatcher {
URI uri = new URI("mailto:" + email);
if (uri.isOpaque()) {
int pos = email.lastIndexOf("@");
- emailOk = pos != -1;
+ if (pos != -1)
+ emailOk = !email.substring(pos+1).isEmpty();
}
} catch (URISyntaxException e) {
// invalid mailto: URI
diff --git a/src/at/bitfire/davdroid/syncadapter/SelectCollectionsAdapter.java b/src/at/bitfire/davdroid/syncadapter/SelectCollectionsAdapter.java
index 121ea308..f2945a50 100644
--- a/src/at/bitfire/davdroid/syncadapter/SelectCollectionsAdapter.java
+++ b/src/at/bitfire/davdroid/syncadapter/SelectCollectionsAdapter.java
@@ -128,7 +128,7 @@ public class SelectCollectionsAdapter extends BaseAdapter implements ListAdapter
// set text
String title = "" + info.getTitle() + "";
if (info.isReadOnly())
- title = title + " (" + context.getString(R.string.read_only) + ")";
+ title = title + " (" + context.getString(R.string.setup_read_only) + ")";
String description = info.getDescription();
if (description == null)