Compare commits

...

7 Commits
v1.1 ... v1.2

Author SHA1 Message Date
Ricki Hirner
19b54748cd Version bump to 1.2
* move ETag requirement from vcard4android to davdroid
* more debug info
* vcard4android: support for custom labels (X-ABLabel)
2016-07-02 10:32:12 +02:00
Ricki Hirner
41ce609237 Support X-ABLabel for custom types
* vcard4android: support X-ABLabel for custom types
2016-07-01 22:10:20 +02:00
Ricki Hirner
aafcc36c4d Version bump to 1.1.1.2
* allow ProGuard optimization to remove non-relevant bytecode from flavors
* check flavors with direct comparison instead of .equals() to allwo optimizations
* store cookies per HttpClient, and not per DAVdroid instance (allows multiple sessions for parallel syncs)
* fetch translations from Transifex
2016-06-24 13:39:26 +02:00
Ricki Hirner
2496a3bf05 Add standard and gplay product flavor 2016-06-24 00:06:43 +02:00
Ricki Hirner
54e6426dc4 Version bump to 1.1.1.1
* add yield points to allow processing of groups with many contacts
* new script to generate contacts for testing
2016-06-23 11:42:12 +02:00
Ricki Hirner
4542da7d89 Version bump to 1.1.1
* fetch translations from Transifex
2016-06-21 21:05:18 +02:00
Ricki Hirner
977409511a Handle cookies correctly using a name/domain/path MultiKeyMap 2016-06-21 20:51:52 +02:00
31 changed files with 464 additions and 67 deletions

View File

@@ -17,12 +17,20 @@ android {
minSdkVersion 14
targetSdkVersion 23
versionCode 103
versionName "1.1"
versionCode 109
buildConfigField "long", "buildTime", System.currentTimeMillis() + "L"
}
productFlavors {
standard {
versionName "1.2"
}
gplay {
versionName "1.2-gplay"
}
}
buildTypes {
debug {
minifyEnabled false

View File

@@ -1,12 +1,17 @@
# ProGuard usage for DAVdroid:
# shrinking yes - main reason for using ProGuard
# optimization no - too risky
# obfuscation no - DAVdroid is open-source
# preverification no (Android default)
# shrinking yes (main reason for using ProGuard)
# optimization yes
# obfuscation no (DAVdroid is open-source)
# preverification no
-dontobfuscate
-optimizations !code/simplification/arithmetic,!code/simplification/cast,!field/*,!class/merging/*
-optimizationpasses 5
-allowaccessmodification
-dontpreverify
# ez-vcard
-dontwarn ezvcard.io.json.** # JSON serializer (for jCards) not used
-dontwarn freemarker.** # freemarker templating library (for creating hCards) not used

View File

@@ -0,0 +1,55 @@
<?xml version="1.0" encoding="utf-8"?>
<!--
~ Copyright © 2013 2016 Ricki Hirner (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
-->
<menu xmlns:tools="http://schemas.android.com/tools"
xmlns:android="http://schemas.android.com/apk/res/android">
<item
android:id="@+id/nav_about"
android:icon="@drawable/ic_info_dark"
android:title="@string/navigation_drawer_about"/>
<item
android:id="@+id/nav_app_settings"
android:icon="@drawable/ic_settings_dark"
android:title="@string/navigation_drawer_settings"/>
<item android:title="@string/navigation_drawer_news_updates">
<menu>
<item
android:id="@+id/nav_twitter"
android:icon="@drawable/twitter"
android:title="\@davdroidapp"
tools:ignore="HardcodedText"/>
</menu>
</item>
<item android:title="@string/navigation_drawer_external_links">
<menu>
<item
android:id="@+id/nav_website"
android:icon="@drawable/ic_home_dark"
android:title="@string/navigation_drawer_website"/>
<item
android:id="@+id/nav_faq"
android:icon="@drawable/ic_help_dark"
android:title="@string/navigation_drawer_faq"/>
<item
android:id="@+id/nav_forums"
android:icon="@drawable/ic_forum_dark"
android:title="@string/navigation_drawer_forums"/>
<item
android:id="@+id/nav_donate"
android:icon="@drawable/ic_attach_money_dark"
android:title="(entry disabled)"
android:visible="false"
tools:ignore="HardcodedText"/>
</menu>
</item>
</menu>

View File

@@ -39,11 +39,11 @@
tools:ignore="UnusedAttribute"/>
<!-- other permissions -->
<uses-permission android:name="android.permission.READ_CONTACTS"/>
<!-- android.permission-group.CONTACTS -->
<uses-permission android:name="android.permission.READ_CONTACTS"/>
<uses-permission android:name="android.permission.WRITE_CONTACTS"/>
<uses-permission android:name="android.permission.READ_CALENDAR"/>
<!-- android.permission-group.CALENDAR -->
<uses-permission android:name="android.permission.READ_CALENDAR"/>
<uses-permission android:name="android.permission.WRITE_CALENDAR"/>
<!-- ical4android declares task access permissions -->

View File

@@ -38,6 +38,8 @@ import lombok.Getter;
import okhttp3.internal.tls.OkHostnameVerifier;
public class App extends Application {
public static final String FLAVOR_GOOGLE_PLAY = "gplay";
public static final String LOG_TO_EXTERNAL_STORAGE = "logToExternalStorage";
@Getter

View File

@@ -90,7 +90,7 @@ public class HttpClient {
builder.addNetworkInterceptor(userAgentInterceptor);
// add cookie store for non-persistent cookies (some services like Horde use cookies for session tracking)
builder.cookieJar(MemoryCookieStore.INSTANCE);
builder.cookieJar(new MemoryCookieStore());
// add network logging, if requested
if (logger.isLoggable(Level.FINEST)) {

View File

@@ -8,10 +8,13 @@
package at.bitfire.davdroid;
import java.util.Collections;
import org.apache.commons.collections4.MapIterator;
import org.apache.commons.collections4.keyvalue.MultiKey;
import org.apache.commons.collections4.map.HashedMap;
import org.apache.commons.collections4.map.MultiKeyMap;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
import okhttp3.Cookie;
import okhttp3.CookieJar;
@@ -23,22 +26,42 @@ import okhttp3.HttpUrl;
*/
public class MemoryCookieStore implements CookieJar {
public static final MemoryCookieStore INSTANCE = new MemoryCookieStore();
protected final Map<HttpUrl, List<Cookie>> store = new ConcurrentHashMap<>();
/**
* Stored cookies. The multi-key consists of three parts: name, domain, and path.
* This ensures that cookies can be overwritten. [RFC 6265 5.3 Storage Model]
* Not thread-safe!
*/
protected final MultiKeyMap<String, Cookie> storage = MultiKeyMap.multiKeyMap(new HashedMap<MultiKey<? extends String>, Cookie>());
@Override
public void saveFromResponse(HttpUrl url, List<Cookie> cookies) {
store.put(url, cookies);
synchronized(storage) {
for (Cookie cookie : cookies)
storage.put(cookie.name(), cookie.domain(), cookie.path(), cookie);
}
}
@Override
public List<Cookie> loadForRequest(HttpUrl url) {
List<Cookie> cookies = store.get(url);
List<Cookie> cookies = new LinkedList<>();
if (cookies == null)
cookies = Collections.emptyList();
synchronized(storage) {
MapIterator<MultiKey<? extends String>, Cookie> iter = storage.mapIterator();
while (iter.hasNext()) {
iter.next();
Cookie cookie = iter.getValue();
// remove expired cookies
if (cookie.expiresAt() <= System.currentTimeMillis()) {
iter.remove();
continue;
}
// add applicable cookies
if (cookie.matches(url))
cookies.add(cookie);
}
}
return cookies;
}

View File

@@ -126,6 +126,7 @@ public class LocalContact extends AndroidContact implements LocalResource {
.withValue(CachedGroupMembership.MIMETYPE, CachedGroupMembership.CONTENT_ITEM_TYPE)
.withValue(CachedGroupMembership.RAW_CONTACT_ID, id)
.withValue(CachedGroupMembership.GROUP_ID, groupID)
.withYieldAllowed(true)
.build()
);
}
@@ -138,6 +139,7 @@ public class LocalContact extends AndroidContact implements LocalResource {
Data.RAW_CONTACT_ID + "=? AND " + Data.MIMETYPE + " IN (?,?)",
new String[] { String.valueOf(id), GroupMembership.CONTENT_ITEM_TYPE, CachedGroupMembership.CONTENT_ITEM_TYPE }
)
.withYieldAllowed(true)
.build()
);
}

View File

@@ -81,6 +81,7 @@ public class LocalGroup extends AndroidGroup implements LocalResource {
.withValue(CachedGroupMembership.MIMETYPE, CachedGroupMembership.CONTENT_ITEM_TYPE)
.withValue(CachedGroupMembership.RAW_CONTACT_ID, member)
.withValue(CachedGroupMembership.GROUP_ID, id)
.withYieldAllowed(true)
.build()
);
@@ -122,6 +123,7 @@ public class LocalGroup extends AndroidGroup implements LocalResource {
batch.enqueue(ContentProviderOperation
.newUpdate(addressBook.syncAdapterURI(ContentUris.withAppendedId(RawContacts.CONTENT_URI, member)))
.withValue(RawContacts.DIRTY, 1)
.withYieldAllowed(true)
.build()
);
@@ -155,6 +157,7 @@ public class LocalGroup extends AndroidGroup implements LocalResource {
"(" + GroupMembership.MIMETYPE + "=? AND " + GroupMembership.GROUP_ROW_ID + "=?) OR (" +
CachedGroupMembership.MIMETYPE + "=? AND " + CachedGroupMembership.GROUP_ID + "=?)",
new String[] { GroupMembership.CONTENT_ITEM_TYPE, String.valueOf(id), CachedGroupMembership.CONTENT_ITEM_TYPE, String.valueOf(id) })
.withYieldAllowed(true)
.build()
);
@@ -181,6 +184,7 @@ public class LocalGroup extends AndroidGroup implements LocalResource {
batch.enqueue(ContentProviderOperation
.newUpdate(addressBook.syncAdapterURI(ContentUris.withAppendedId(Groups.CONTENT_URI, id)))
.withValue(COLUMN_PENDING_MEMBERS, null)
.withYieldAllowed(true)
.build()
);

View File

@@ -148,7 +148,11 @@ public class CalendarSyncManager extends SyncManager {
DavResource remote = bunch[0];
ResponseBody body = remote.get("text/calendar");
String eTag = ((GetETag)remote.properties.get(GetETag.NAME)).eTag;
// CalDAV servers MUST return ETag on GET [https://tools.ietf.org/html/rfc4791#section-5.3.4]
GetETag eTag = (GetETag)remote.properties.get(GetETag.NAME);
if (eTag == null || StringUtils.isEmpty(eTag.eTag))
throw new DavException("Received CalDAV GET response without ETag for " + remote.location);
Charset charset = Charsets.UTF_8;
MediaType contentType = body.contentType();
@@ -156,7 +160,7 @@ public class CalendarSyncManager extends SyncManager {
charset = contentType.charset(Charsets.UTF_8);
@Cleanup InputStream stream = body.byteStream();
processVEvent(remote.fileName(), eTag, stream, charset);
processVEvent(remote.fileName(), eTag.eTag, stream, charset);
} else {
// multiple contacts, use multi-get

View File

@@ -214,6 +214,7 @@ public class ContactsSyncManager extends SyncManager {
batch.enqueue(ContentProviderOperation
.newUpdate(addressBook.syncAdapterURI(ContentUris.withAppendedId(Groups.CONTENT_URI, groupID)))
.withValue(Groups.DIRTY, 1)
.withYieldAllowed(true)
.build()
);
}
@@ -314,7 +315,11 @@ public class ContactsSyncManager extends SyncManager {
DavResource remote = bunch[0];
ResponseBody body = remote.get("text/vcard;version=4.0, text/vcard;charset=utf-8;q=0.8, text/vcard;q=0.5");
String eTag = ((GetETag) remote.properties.get(GetETag.NAME)).eTag;
// CardDAV servers MUST return ETag on GET [https://tools.ietf.org/html/rfc6352#section-6.3.2.3]
GetETag eTag = (GetETag)remote.properties.get(GetETag.NAME);
if (eTag == null || StringUtils.isEmpty(eTag.eTag))
throw new DavException("Received CardDAV GET response without ETag for " + remote.location);
Charset charset = Charsets.UTF_8;
MediaType contentType = body.contentType();
@@ -322,7 +327,7 @@ public class ContactsSyncManager extends SyncManager {
charset = contentType.charset(Charsets.UTF_8);
@Cleanup InputStream stream = body.byteStream();
processVCard(remote.fileName(), eTag, stream, charset, downloader);
processVCard(remote.fileName(), eTag.eTag, stream, charset, downloader);
} else {
// multiple contacts, use multi-get

View File

@@ -130,7 +130,11 @@ public class TasksSyncManager extends SyncManager {
DavResource remote = bunch[0];
ResponseBody body = remote.get("text/calendar");
String eTag = ((GetETag)remote.properties.get(GetETag.NAME)).eTag;
// CalDAV servers MUST return ETag on GET [https://tools.ietf.org/html/rfc4791#section-5.3.4]
GetETag eTag = (GetETag)remote.properties.get(GetETag.NAME);
if (eTag == null || StringUtils.isEmpty(eTag.eTag))
throw new DavException("Received CalDAV GET response without ETag for " + remote.location);
Charset charset = Charsets.UTF_8;
MediaType contentType = body.contentType();
@@ -138,7 +142,7 @@ public class TasksSyncManager extends SyncManager {
charset = contentType.charset(Charsets.UTF_8);
@Cleanup InputStream stream = body.byteStream();
processVTodo(remote.fileName(), eTag, stream, charset);
processVTodo(remote.fileName(), eTag.eTag, stream, charset);
} else {
// multiple contacts, use multi-get

View File

@@ -10,6 +10,7 @@ package at.bitfire.davdroid.ui;
import android.content.Intent;
import android.net.Uri;
import android.os.Build;
import android.os.Bundle;
import android.support.design.widget.FloatingActionButton;
import android.support.design.widget.NavigationView;
@@ -22,6 +23,8 @@ import android.support.v7.widget.Toolbar;
import android.view.MenuItem;
import android.view.View;
import at.bitfire.davdroid.App;
import at.bitfire.davdroid.BuildConfig;
import at.bitfire.davdroid.Constants;
import at.bitfire.davdroid.R;
import at.bitfire.davdroid.ui.setup.LoginActivity;
@@ -93,7 +96,8 @@ public class AccountsActivity extends AppCompatActivity implements NavigationVie
startActivity(new Intent(Intent.ACTION_VIEW, Constants.webUri.buildUpon().appendEncodedPath("forums/").build()));
break;
case R.id.nav_donate:
startActivity(new Intent(Intent.ACTION_VIEW, Constants.webUri.buildUpon().appendEncodedPath("donate/").build()));
if (BuildConfig.FLAVOR != App.FLAVOR_GOOGLE_PLAY)
startActivity(new Intent(Intent.ACTION_VIEW, Constants.webUri.buildUpon().appendEncodedPath("donate/").build()));
break;
}

View File

@@ -209,11 +209,19 @@ public class DebugInfoActivity extends AppCompatActivity implements LoaderManage
for (Account acct : accountManager.getAccountsByType(Constants.ACCOUNT_TYPE))
try {
AccountSettings settings = new AccountSettings(getContext(), acct);
report.append(
"Account: ").append(acct.name).append("\n" +
" Address book sync. interval: ").append(syncStatus(settings, ContactsContract.AUTHORITY)).append("\n" +
" Calendar sync. interval: ").append(syncStatus(settings, CalendarContract.AUTHORITY)).append("\n" +
" OpenTasks sync. interval: ").append(syncStatus(settings, "org.dmfs.tasks")).append("\n");
report.append("Account: ").append(acct.name).append("\n" +
" Address book sync. interval: ").append(syncStatus(settings, ContactsContract.AUTHORITY)).append("\n" +
" Calendar sync. interval: ").append(syncStatus(settings, CalendarContract.AUTHORITY)).append("\n" +
" OpenTasks sync. interval: ").append(syncStatus(settings, "org.dmfs.tasks")).append("\n" +
" Preemptive auth: ").append(settings.preemptiveAuth()).append("\n" +
" WiFi only: ").append(settings.getSyncWifiOnly());
if (settings.getSyncWifiOnlySSID() != null)
report.append(", SSID: ").append(settings.getSyncWifiOnlySSID());
report.append("\n [CardDAV] Contact group method: ").append(settings.getGroupMethod())
.append("\n RFC 6868 encoding: ").append(settings.getVCardRFC6868())
.append("\n [CalDAV] Time range (past days): ").append(settings.getTimeRangePastDays())
.append("\n Manage calendar colors: ").append(settings.getManageCalendarColors())
.append("\n");
} catch(InvalidAccountException e) {
report.append(acct).append(" is invalid (unsupported settings version) or does not exist\n");
}
@@ -230,7 +238,7 @@ public class DebugInfoActivity extends AppCompatActivity implements LoaderManage
"Android version: ").append(Build.VERSION.RELEASE).append(" (").append(Build.DISPLAY).append(")\n" +
"Device: ").append(WordUtils.capitalize(Build.MANUFACTURER)).append(" ").append(Build.MODEL).append(" (").append(Build.DEVICE).append(")\n\n"
);
} catch (Exception ex) {
} catch(Exception ex) {
App.log.log(Level.SEVERE, "Couldn't get system details", ex);
}

View File

@@ -59,14 +59,17 @@ public class StartupDialogFragment extends DialogFragment {
dialogs.add(StartupDialogFragment.instantiate(Mode.DEVELOPMENT_VERSION));
else {
// store-specific information
final String installedFrom = installedFrom(context);
if (installedFrom == null || installedFrom.startsWith("org.fdroid"))
dialogs.add(StartupDialogFragment.instantiate(Mode.FDROID_DONATE));
else if (Build.VERSION.SDK_INT < Build.VERSION_CODES.LOLLIPOP && // only on Android <5
"com.android.vending".equals(installedFrom) && // only when installed from Play Store
if (BuildConfig.FLAVOR == App.FLAVOR_GOOGLE_PLAY) {
// Play store
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.LOLLIPOP && // only on Android <5
settings.getBoolean(HINT_GOOGLE_PLAY_ACCOUNTS_REMOVED, true)) // and only when "Don't show again" hasn't been clicked yet
dialogs.add(StartupDialogFragment.instantiate(Mode.GOOGLE_PLAY_ACCOUNTS_REMOVED));
dialogs.add(StartupDialogFragment.instantiate(Mode.GOOGLE_PLAY_ACCOUNTS_REMOVED));
} else {
// other stores
final String installedFrom = installedFrom(context);
if (installedFrom == null || installedFrom.startsWith("org.fdroid"))
dialogs.add(StartupDialogFragment.instantiate(Mode.FDROID_DONATE));
}
}
// OpenTasks information
@@ -108,28 +111,31 @@ public class StartupDialogFragment extends DialogFragment {
.setNeutralButton(R.string.startup_development_version_give_feedback, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
startActivity(new Intent(Intent.ACTION_VIEW, Constants.webUri.buildUpon().appendEncodedPath("forums/beta/").build()));
startActivity(new Intent(Intent.ACTION_VIEW, Constants.webUri.buildUpon().appendEncodedPath("forums/").build()));
}
})
.create();
case FDROID_DONATE:
return new AlertDialog.Builder(getActivity())
.setIcon(R.drawable.ic_launcher)
.setTitle(R.string.startup_donate)
.setMessage(R.string.startup_donate_message)
.setPositiveButton(R.string.startup_donate_now, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
startActivity(new Intent(Intent.ACTION_VIEW, Constants.webUri.buildUpon().appendEncodedPath("donate/").build()));
}
})
.setNegativeButton(R.string.startup_donate_later, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
}
})
.create();
if (BuildConfig.FLAVOR != App.FLAVOR_GOOGLE_PLAY)
return new AlertDialog.Builder(getActivity())
.setIcon(R.drawable.ic_launcher)
.setTitle(R.string.startup_donate)
.setMessage(R.string.startup_donate_message)
.setPositiveButton(R.string.startup_donate_now, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
startActivity(new Intent(Intent.ACTION_VIEW, Constants.webUri.buildUpon().appendEncodedPath("donate/").build()));
}
})
.setNegativeButton(R.string.startup_donate_later, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
}
})
.create();
else
throw new IllegalArgumentException();
case GOOGLE_PLAY_ACCOUNTS_REMOVED:
Drawable icon = null;

View File

@@ -108,6 +108,7 @@
<string name="login_create_account">Vytvořit účet</string>
<string name="login_account_name">Jméno účtu</string>
<string name="login_account_name_info">Pro jméno účtu použijte svou emailovou adresu, protože Android bude brát jméno účtu jako údaj pro ORGANIZÁTORA vytvořených událostí. Nelze mít dva účty stejného jména.</string>
<string name="login_account_contact_group_method">Metoda seskupování kontaktů:</string>
<string name="login_account_name_required">Vyžadováno jméno účtu</string>
<string name="login_account_not_created">Účet nelze vytvořit</string>
<string name="login_configuration_detection">Vyhledání konfigurace</string>
@@ -160,6 +161,15 @@
<string name="settings_sync_wifi_only_ssid_off">Použít všechna WiFi připojení</string>
<string name="settings_sync_wifi_only_ssid_message">Zadejte jméno WiFi sítě (SSID) pro omezení synchronizace na tutu síť, nebo ponechte prázdné pro použití všech WiFi připojení.</string>
<string name="settings_carddav">CardDAV</string>
<string name="settings_contact_group_method">Metoda seskupování kontaktů</string>
<string-array name="settings_contact_group_method_values">
<item>GROUP_VCARDS</item>
<item>CATEGORIES</item>
</string-array>
<string-array name="settings_contact_group_method_entries">
<item>Skupiny jsou oddělené soubory VCard</item>
<item>Skupiny jsou kategorie na kontakt</item>
</string-array>
<string name="settings_rfc6868_for_vcards">Použít RFC6868 pro VCard</string>
<string name="settings_rfc6868_for_vcards_on">Uvozovky lze použít v hodnotách parametrů</string>
<string name="settings_rfc6868_for_vcards_off">Uvozovky nelze použít v hodnotách parametrů</string>
@@ -214,5 +224,19 @@
<string name="sync_error">Chyba při %s</string>
<string name="sync_error_http_dav">Chyba serveru při %s</string>
<string name="sync_error_local_storage">Chyba databáze při %s</string>
<string-array name="sync_error_phases">
<item>příprava synchronizace</item>
<item>dotazování možností</item>
<item>zpracovávání místně smazaných záznamů</item>
<item>příprava vytvořených/upravených záznamů</item>
<item>nahrávání vytvořených/upravených záznamů</item>
<item>kontrola stavu synchronizace</item>
<item>výpis místních záznamů</item>
<item>výpis vzdálených záznamů</item>
<item>porovnání místních/vzdálených záznamů</item>
<item>stahování vzdálených záznamů</item>
<item>uzavírání procesu</item>
<item>ukládání stavu synchronizace</item>
</string-array>
<string name="sync_error_unauthorized">Chybné uživatelské jméno/heslo</string>
</resources>

View File

@@ -83,8 +83,11 @@
<string name="permissions_calendar_details">For at synkronisere CalDAV-begivenheder med dine lokale kalendere, skal DAVdroid have adgang til dine kalendere.</string>
<string name="permissions_calendar_request">Anmod om kalenderadgang</string>
<string name="permissions_contacts">Kontakter: Adgangsrettigheder</string>
<string name="permissions_contacts_details">DAVdroid er nødt til at have adgang til dine kontakter, hvis CardDAV-adressebøger skal kunne synkronisere med dine kontakter.</string>
<string name="permissions_contacts_request">Anmod om adgang til kontakter</string>
<string name="permissions_opentasks">OpenTasks: Adgangsrettigheder</string>
<string name="permissions_opentasks_details">DAVdroid er nødt til at have adgang til OpenTasks, hvis CalDAV-opgaver skal kunne synkronisere med dine lokale opgavelister.</string>
<string name="permissions_opentasks_request">Anmod om adgang til OpenTasks</string>
<!--AddAccountActivity-->
<string name="login_title">Tilføj konto</string>
<string name="login_type_email">Log ind med emailadresse</string>
@@ -104,6 +107,7 @@
<string name="login_create_account">Opret konto</string>
<string name="login_account_name">Kontonavn</string>
<string name="login_account_name_info">Brug emailadressen som kontonavn, for Android vil bruge kontonavnet til ORGANIZER-feltet for aktiviteter, som du opretter. Du kan ikke have to konti med samme navn.</string>
<string name="login_account_contact_group_method">Gruppering af kontakter:</string>
<string name="login_account_name_required">Kontonavn påkrævet</string>
<string name="login_account_not_created">Konto kunne ikke oprettes</string>
<string name="login_configuration_detection">Check konfiguration</string>
@@ -150,9 +154,24 @@
</string-array>
<string name="settings_sync_wifi_only">Synkroniser kun over WiFi</string>
<string name="settings_sync_wifi_only_on">Synkronisering er begrænset til WiFi-forbindelser</string>
<string name="settings_sync_wifi_only_off">Forbindelsestypen har ingen betydning</string>
<string name="settings_sync_wifi_only_ssid">Begræsning til WiFi-SSID</string>
<string name="settings_sync_wifi_only_ssid_on">Vil kun blive synkroniseret over %s</string>
<string name="settings_sync_wifi_only_ssid_off">Alle WiFi-forbindelse vil kunne bruges</string>
<string name="settings_sync_wifi_only_ssid_message">Indtast navnet på et WiFi-netværk (SSID) for at begrænse synkronisering til dette netværk, eller efterlad feltet blank for at acceptere alle WiFi-forbindelser.</string>
<string name="settings_carddav">CardDAV</string>
<string name="settings_contact_group_method">Gruppering af kontakter</string>
<string-array name="settings_contact_group_method_values">
<item>GROUP_VCARDS</item>
<item>CATEGORIES</item>
</string-array>
<string-array name="settings_contact_group_method_entries">
<item>Grupper er særskilte VCards</item>
<item>Grupper er kategorier pr. kontakt</item>
</string-array>
<string name="settings_rfc6868_for_vcards">Anvend RFC6868 for VCards</string>
<string name="settings_rfc6868_for_vcards_on">Dobbelte citationstegn kan bruges til at sætte parametre</string>
<string name="settings_rfc6868_for_vcards_off">Dobbelte citationstegn kan ikke bruges til at sætte parametre</string>
<string name="settings_caldav">CalDAV</string>
<string name="settings_sync_time_range_past">Tidsafgrænsning for tidligere begivenheder</string>
<string name="settings_sync_time_range_past_none">Alle begivenheder vil blive synkroniseret</string>
@@ -162,6 +181,8 @@
</plurals>
<string name="settings_sync_time_range_past_message">Begivenheder, som er mere end dette antal dage gamle vil blive ignoreret (kan også være 0). Hvis feltet ikke er udfyldt, vil alle begivenheder blive synkroniseret.</string>
<string name="settings_manage_calendar_colors">Administrer farver for kalender</string>
<string name="settings_manage_calendar_colors_on">Kalenderfarver administreres af DAVdroid</string>
<string name="settings_manage_calendar_colors_off">Kalenderfarver sættes ikke fra DAVdroid</string>
<string name="settings_version_update">Versionsopdatering af DAVdroid</string>
<string name="settings_version_update_settings_updated">Interne indstillinger er blevet opdateret.</string>
<string name="settings_version_update_install_hint">Problemer? Afinstaller DAVdroid og geninstaller.</string>
@@ -193,11 +214,27 @@
<string name="exception_show_details">Vis detaljer</string>
<!--sync errors and DebugInfoActivity-->
<string name="debug_info_title">Debug-info</string>
<string name="sync_error_permissions">DAVdroid-rettigheder</string>
<string name="sync_error_permissions_text">Yderligere adgang påkrævet</string>
<string name="sync_error_calendar">Synkronisering af kalenderen lykkedes ikke (%s)</string>
<string name="sync_error_contacts">Synkronisering af adressebogen lykkedes ikke (%s)</string>
<string name="sync_error_tasks">Synkronisering af opgaver lykkedes ikke (%s)</string>
<string name="sync_error">Fejl under %s</string>
<string name="sync_error_http_dav">Serverfejl under %s</string>
<string name="sync_error_local_storage">Databasefejl under %s</string>
<string-array name="sync_error_phases">
<item>forbereder synkronisering</item>
<item>checker understøttelse</item>
<item>behandler poster, der er slettet lokalt</item>
<item>behandler poster, der er blevet oprettet/redigeret</item>
<item>uploader poster, der er blevet oprettet/redigeret</item>
<item>checker synkroniseringsstatus</item>
<item>laver liste af lokale poster</item>
<item>laver lister af poster på server</item>
<item>sammenligner poster lokalt og på server</item>
<item>downloader poster på server</item>
<item>efterbehandler</item>
<item>gemmer synkroniseringsstatus</item>
</string-array>
<string name="sync_error_unauthorized">Fejl i brugernavn/adgangskode</string>
</resources>

View File

@@ -8,6 +8,7 @@
<string name="send">Enviar</string>
<!--startup dialogs-->
<string name="startup_dont_show_again">No mostrar de nuevo</string>
<string name="startup_development_version">Versión candidata final de DAVdroid</string>
<string name="startup_development_version_message">Esta es una versión de desarrollo de DAVdroid. Tenga presente que puede que no todo funcione como espera. Por favor, denos una retroalimentación constructiva para mejorar DAVdroid.</string>
<string name="startup_development_version_give_feedback">Dar retroalimentación</string>
<string name="startup_donate">Información de código abierto</string>

View File

@@ -157,6 +157,14 @@
<string name="settings_sync_wifi_only_ssid_on">Sera seulement synchroniser avec %s</string>
<string name="settings_sync_wifi_only_ssid_off">Toutes les connexions WiFi peuvent être utilisées</string>
<string name="settings_sync_wifi_only_ssid_message">Entrez le nom d\'un réseau WiFi (SSID) pour restreindre la synchronisation à ce réseau, ou laisser vide pour autoriser toutes les connexions WiFi.</string>
<string name="settings_carddav">CardDAV</string>
<string-array name="settings_contact_group_method_values">
<item>GROUP_VCARDS</item>
<item>CATEGORIES</item>
</string-array>
<string name="settings_rfc6868_for_vcards">Utiliser RFC6868 pour VCards</string>
<string name="settings_rfc6868_for_vcards_on">Les guillemets doubles peuvent être utilisés dans les valeurs de paramètre</string>
<string name="settings_rfc6868_for_vcards_off">Les guillemets doubles ne peuvent pas être utilisés dans les valeurs de paramètre</string>
<string name="settings_caldav">CalDAV</string>
<string name="settings_sync_time_range_past">Limite des événements passés</string>
<string name="settings_sync_time_range_past_none">Tous les événements seront synchronisés</string>

View File

@@ -107,6 +107,7 @@
<string name="login_create_account">Fiók létrehozása</string>
<string name="login_account_name">A fiók neve</string>
<string name="login_account_name_info">Használja az email címet fióknévként, mert később a létrehozandó események szervezőjeként (ORGANIZER mező) az Android ezt fogja használni. Két fiókot nem lehet azonos néven létrehozni.</string>
<string name="login_account_contact_group_method">A csoportok kezelésének módja:</string>
<string name="login_account_name_required">A fióknév megadása feltétlenül szükséges</string>
<string name="login_account_not_created">A fiók létrehozása nem sikerült</string>
<string name="login_configuration_detection">A konfiguráció felderítése</string>
@@ -159,6 +160,11 @@
<string name="settings_sync_wifi_only_ssid_off">Szinkronizálás bármely WIFI hálózaton</string>
<string name="settings_sync_wifi_only_ssid_message">Adja meg a WIFI hálózat nevét (SSID) a szinkronizálás egy hálózatra való korlátozához, vagy hagyja üresen, ha nem akar ilyen szűkítést.</string>
<string name="settings_carddav">CardDAV</string>
<string name="settings_contact_group_method">A csoportok kezelésének módja</string>
<string-array name="settings_contact_group_method_entries">
<item>Minden csoport egy különálló VCard</item>
<item>A csoportok a kapcsolatonkéni kategóriák</item>
</string-array>
<string name="settings_rfc6868_for_vcards">RFC6868 szabványnak megfelelő VCards használata</string>
<string name="settings_rfc6868_for_vcards_on">A paraméterértékek tartalmazhatnak idézőjelet</string>
<string name="settings_rfc6868_for_vcards_off">A paraméterértékek nem tartalmazhatnak idézőjelet</string>
@@ -212,5 +218,19 @@
<string name="sync_error">Hiba az alábbi művelet közben: %s</string>
<string name="sync_error_http_dav">Szerver oldali hiba az alábbi művelet közben: %s</string>
<string name="sync_error_local_storage">Adatbázishiba az alábbi művelet közben: %s</string>
<string-array name="sync_error_phases">
<item>szinkronizáció előkészítése </item>
<item>szerver képességeinek lekérdezése</item>
<item>a helyben törölt bejegyzések feldolgozása</item>
<item>az új vagy módosított bejegyzések gyűjtése </item>
<item>az új vagy módosított bejegyzések feltöltése</item>
<item>szinkronizációs állapot ellenőrzése</item>
<item>helyi bejegyzések listázása</item>
<item>távoli bejegyzések listázása</item>
<item>helyi és távoli bejegyzések összehasonlítása</item>
<item>távoli bejegyzések letöltése</item>
<item>utófeldolgozás</item>
<item>szinkronizációs állapot mentése</item>
</string-array>
<string name="sync_error_unauthorized">A felhasználónév vagy jelszó hibás</string>
</resources>

View File

@@ -106,6 +106,7 @@
<string name="login_create_account">アカウントを作成</string>
<string name="login_account_name">アカウント名</string>
<string name="login_account_name_info">Android はあなたが作成した予定の ORGANIZER フィールドとしてアカウント名を使用するので、アカウント名としてメールアドレスを使用してください。同じ名前のアカウントを 2 つ持つことはできません。</string>
<string name="login_account_contact_group_method">連絡先グループ方法:</string>
<string name="login_account_name_required">アカウント名が必要です</string>
<string name="login_account_not_created">アカウントを作成できません</string>
<string name="login_configuration_detection">設定の検出</string>
@@ -158,6 +159,15 @@
<string name="settings_sync_wifi_only_ssid_off">すべての WiFi 接続を使用することができます</string>
<string name="settings_sync_wifi_only_ssid_message">このネットワークで同期を制限する WiFi ネットワーク (SSID) の名前を入力してください。すべての WiFi 接続は空白のままにします。</string>
<string name="settings_carddav">CardDAV</string>
<string name="settings_contact_group_method">連絡先グループ方法</string>
<string-array name="settings_contact_group_method_values">
<item>GROUP_VCARDS</item>
<item>CATEGORIES</item>
</string-array>
<string-array name="settings_contact_group_method_entries">
<item>グループは個別の VCards</item>
<item>グループは連絡先カテゴリーごと</item>
</string-array>
<string name="settings_rfc6868_for_vcards">RFC6868 の VCards を使用する</string>
<string name="settings_rfc6868_for_vcards_on">二重引用符を、パラメーター値に使用することができます</string>
<string name="settings_rfc6868_for_vcards_off">二重引用符を、パラメーター値に使用することができません</string>
@@ -210,5 +220,19 @@
<string name="sync_error">%s 時にエラー</string>
<string name="sync_error_http_dav">%s 時にサーバーエラー</string>
<string name="sync_error_local_storage">%s 時にデータベースエラー</string>
<string-array name="sync_error_phases">
<item>同期の準備中</item>
<item>機能の問い合わせ中</item>
<item>ローカルで削除されたエントリーの処理中</item>
<item>作成済/更新済エントリーの準備中</item>
<item>作成済/更新済エントリーのアップロード中</item>
<item>同期の状態を確認中</item>
<item>ローカルのエントリーをリスト中</item>
<item>リモートのエントリーをリスト中</item>
<item>ローカル/リモートのエントリーを比較中</item>
<item>リモートのエントリーをダウンロード中</item>
<item>後処理中</item>
<item>同期の状態を保存中</item>
</string-array>
<string name="sync_error_unauthorized">ユーザー名/パスワードが間違っています</string>
</resources>

View File

@@ -31,6 +31,7 @@
<string name="navigation_drawer_open">Otwórz menu nawigacji</string>
<string name="navigation_drawer_close">Zamknij menu nawigacji</string>
<string name="navigation_drawer_subtitle">Adapter synchronizacji CalDAV/CardDAV</string>
<string name="navigation_drawer_about">O DAVdroid / Licencja</string>
<string name="navigation_drawer_settings">Ustawienia</string>
<string name="navigation_drawer_news_updates">Nowości &amp; aktualizacje
</string>
@@ -40,6 +41,8 @@
<string name="navigation_drawer_forums">Społeczność</string>
<string name="navigation_drawer_donate">Dotacja</string>
<!--DavService-->
<string name="dav_service_refresh_failed">Wykrycie serwisu nie powiodło się</string>
<string name="dav_service_refresh_couldnt_refresh">Nie można odświeżyć listy kolekcji</string>
<!--AppSettingsActivity-->
<string name="app_settings">Ustawienia</string>
<string name="app_settings_user_interface">
@@ -55,25 +58,40 @@ Interfejs użytkownika</string>
<string name="account_settings">Ustawienia konta</string>
<string name="account_delete">Usuń konto</string>
<string name="account_delete_confirmation_title">Naprawdę chcesz usunąć konto?</string>
<string name="account_refresh_address_book_list">Odśwież list książek adresowych</string>
<string name="account_create_new_address_book">Stwórz nową książkę adresową</string>
<string name="account_refresh_calendar_list">Odśwież liste kalendarzy</string>
<string name="account_create_new_calendar">Stwórz nowy kalendarz</string>
<!--PermissionsActivity-->
<string name="permissions_title">Uprawnienia DAVdroid</string>
<string name="permissions_calendar">Uprawnienia kalendarza</string>
<string name="permissions_calendar_request">Zezwól na uprawnienia kalendarza</string>
<string name="permissions_contacts">Uprawnienia kontaktów</string>
<string name="permissions_contacts_request">Zezwól na uprawnienia kontaktów</string>
<string name="permissions_opentasks">Uprawnienia OpenTasks</string>
<string name="permissions_opentasks_request">Zezwól na uprawnienia OpenTasks</string>
<!--AddAccountActivity-->
<string name="login_title">Dodaj konto</string>
<string name="login_type_email">Logowanie za pomocą adresu e-mail</string>
<string name="login_email_address">Adres e-mail</string>
<string name="login_email_address_error">Wymanagny poprawny adres e-mail</string>
<string name="login_password">Hasło</string>
<string name="login_password_required">Wymagane hasło</string>
<string name="login_type_url">Logowanie za pomocą adresu URL i nazwy użytkownika</string>
<string name="login_url_host_name_required">Wymagana nazwa hosta</string>
<string name="login_user_name">Nazwa użytkownika</string>
<string name="login_user_name_required">Wymagana nazwa użtkonika</string>
<string name="login_base_url">Podstawowy URL</string>
<string name="login_auth_preemptive">Autoryzacja prewencyjna (zalecana, ale niezgodna z autoryzacją Digest)</string>
<string name="login_login">Zaloguj</string>
<string name="login_back">Wróć</string>
<string name="login_create_account">Stwórz konto</string>
<string name="login_account_name">Nazwa konta</string>
<string name="login_account_name_info">Użyj swojego adresu e-mail jako nazwy konta, ponieważ Android będzie używał nazwy konta jako pola ORGANIZATOR dla wydarzeń, które stworzysz. Nie możesz posiadać dwóch kont o takiej samej nazwie.</string>
<string name="login_account_name_required">Wymagana nazwa konta</string>
<string name="login_account_not_created">Konto nie mogło zostać stworzone</string>
<string name="login_configuration_detection">Wykrywanie konfiguracji</string>
<string name="login_querying_server">Proszę czekać, odpytywanie serwera...</string>
<string name="login_view_logs">Pokaż logi</string>
<!--AccountSettingsActivity-->
<string name="settings_title">Ustawienia: %s</string>
@@ -114,11 +132,48 @@ Interfejs użytkownika</string>
<item>Raz dziennie</item>
</string-array>
<string name="settings_carddav">CardDAV</string>
<string name="settings_contact_group_method">Metoda grupowania kontaktów</string>
<string-array name="settings_contact_group_method_values">
<item>GROUP_VCARDS</item>
<item>CATEGORIES</item>
</string-array>
<string name="settings_rfc6868_for_vcards">Użyj RFC6868 dla VCards</string>
<string name="settings_caldav">CalDAV</string>
<string name="settings_manage_calendar_colors">Zarządzaj kolorami kalendarza</string>
<string name="settings_manage_calendar_colors_on">Kolory kalendarza są zarządzane przez DAVdroid</string>
<string name="settings_manage_calendar_colors_off">Kolory kalendarze nie są ustawiane przez DAVdroid</string>
<string name="settings_version_update">Aktualizacji wersji DAVdroid</string>
<string name="settings_version_update_install_hint">Problemy? Odinstaluj DAVdroid i zainstaluj ponownie.</string>
<!--collection management-->
<string name="create_addressbook">Stwórz książkę adresową</string>
<string name="create_addressbook_display_name_hint">Moja książka adresowa</string>
<string name="create_calendar">Stwórz kolekcje CalDAV</string>
<string name="create_calendar_display_name_hint">Mój kalendarz</string>
<string name="create_calendar_time_zone">Strefa czasowa:</string>
<string name="create_calendar_type">Typ kolekcji:</string>
<string name="create_calendar_type_only_events">Kalendarz (tylko wydarzenia)</string>
<string name="create_calendar_type_only_tasks">Lista zadań (tylko zadań)</string>
<string name="create_calendar_type_events_and_tasks">Połączone (wydarzenia i zadania)</string>
<string name="create_collection_color">Ustaw kolor kolekcji</string>
<string name="create_collection_creating">Tworzenie kolekcji</string>
<string name="create_collection_display_name">Nazwa wyświetlana (tytuł) kolekcji:</string>
<string name="create_collection_display_name_required">Tytuł jest wymagany</string>
<string name="create_collection_description">Opis (opcjoalnie)</string>
<string name="create_collection_home_set">Ustaw początek:</string>
<string name="create_collection_create">Stwórz</string>
<string name="delete_collection">Usuń kolekcje</string>
<string name="delete_collection_confirm_title">Jesteś pewien?</string>
<string name="delete_collection_confirm_warning">Kolekcja (%s) i jej wszystkie dane zostaną usunięte z serwera.</string>
<string name="delete_collection_deleting_collection">Usuwanie kolekcji</string>
<!--ExceptionInfoFragment-->
<string name="exception">Wystąpił błąd.</string>
<string name="exception_httpexception">Wystąpił błąd HTTP.</string>
<string name="exception_ioexception">Wystąpił błąd I/O.</string>
<string name="exception_show_details">Pokaż szczegóły</string>
<!--sync errors and DebugInfoActivity-->
<string name="debug_info_title">Informacje debugowe</string>
<string name="sync_error_permissions">Uprawnienia DAVdroid</string>
<string name="sync_error_permissions_text">Wymagane dodatkowe uprawnienia</string>
<string name="sync_error_calendar">Synchronizacja kalendarza nie powiodała się (%s)</string>
<string name="sync_error_contacts">Synchronizacja książki adresowej nie powiodała się (%s)</string>
<string name="sync_error_tasks">Synchronizacja zadań nie powiodała się (%s)</string>

View File

@@ -107,6 +107,7 @@
<string name="login_create_account">Criar conta</string>
<string name="login_account_name">Nome da conta</string>
<string name="login_account_name_info">Use seu endereço de e-mail como nome da conta porque o Android irá usar esse nome como campo AGENDA nos eventos que você criar. Não é possível ter duas contas com o mesmo nome.</string>
<string name="login_account_contact_group_method">Método do grupo Contato:</string>
<string name="login_account_name_required">É necessário um nome de conta</string>
<string name="login_account_not_created">A conta não pôde ser criada</string>
<string name="login_configuration_detection">Detecção de configuração</string>
@@ -159,6 +160,15 @@
<string name="settings_sync_wifi_only_ssid_off">Qualquer conexão Wi-Fi pode ser utilizada</string>
<string name="settings_sync_wifi_only_ssid_message">Informe o nome da rede Wi-Fi (SSID) que será usada para sincronização ou deixe em branco para usar qualquer conexão Wi-Fi.</string>
<string name="settings_carddav">CardDAV</string>
<string name="settings_contact_group_method">Método do grupo Contato</string>
<string-array name="settings_contact_group_method_values">
<item>GROUP_VCARDS</item>
<item>CATEGORIES</item>
</string-array>
<string-array name="settings_contact_group_method_entries">
<item>Grupos são VCards separados</item>
<item>Grupos são categorias por contato</item>
</string-array>
<string name="settings_rfc6868_for_vcards">Usar RFC6868 para VCards</string>
<string name="settings_rfc6868_for_vcards_on">Aspas podem ser utilizadas nos valores dos parâmetros</string>
<string name="settings_rfc6868_for_vcards_off">Aspas não podem ser utilizadas nos valores dos parâmetros</string>
@@ -212,5 +222,19 @@
<string name="sync_error">Erro ao %s</string>
<string name="sync_error_http_dav">Erro do servidor ao %s</string>
<string name="sync_error_local_storage">Erro do banco de dados ao %s</string>
<string-array name="sync_error_phases">
<item>preparando sincronização</item>
<item>procurando habilidades</item>
<item>processando os itens excluídos localmente</item>
<item>preparando os itens criados/modificados</item>
<item>enviando os itens criados/modificados</item>
<item>verificando o estado da sincronização</item>
<item>listando os itens locais</item>
<item>listando os itens remotos</item>
<item>comparando os itens locais/remotos</item>
<item>baixando os itens remotos</item>
<item>pós-processamento</item>
<item>salvando o estado da sincronização</item>
</string-array>
<string name="sync_error_unauthorized">Usuário/senha incorreto</string>
</resources>

View File

@@ -108,6 +108,7 @@
<string name="login_create_account">Направи налог</string>
<string name="login_account_name">Назив налога</string>
<string name="login_account_name_info">Користите вашу е-адресу за назив налога јер Андроид користи назив налога за поље ОРГАНИЗАТОР за догађаје које направите. Не можете имати два налога истог назива.</string>
<string name="login_account_contact_group_method">Режим група контаката:</string>
<string name="login_account_name_required">Назив налога је обавезан</string>
<string name="login_account_not_created">Не могох направити налог</string>
<string name="login_configuration_detection">Откривање конфигурације</string>
@@ -160,6 +161,15 @@
<string name="settings_sync_wifi_only_ssid_off">Коришћење свих бежичних мрежа</string>
<string name="settings_sync_wifi_only_ssid_message">Унесите назив бежичне мреже (њен ССИД) да бисте ограничили синхронизацију само на ту мрежу, или оставите празно за синхронизовање преко било које бежичне мреже.</string>
<string name="settings_carddav">КардДАВ</string>
<string name="settings_contact_group_method">Режим група контаката</string>
<string-array name="settings_contact_group_method_values">
<item>GROUP_VCARDS</item>
<item>CATEGORIES</item>
</string-array>
<string-array name="settings_contact_group_method_entries">
<item>Групе су одвојене В-карте</item>
<item>Групе су категорије по контакту</item>
</string-array>
<string name="settings_rfc6868_for_vcards">Користи РФЦ6868 за В-карте</string>
<string name="settings_rfc6868_for_vcards_on">Двоструки наводници могу да се користе у вредностима параметара</string>
<string name="settings_rfc6868_for_vcards_off">Двоструки наводници не могу да се користе у вредностима параметара</string>
@@ -214,5 +224,19 @@
<string name="sync_error">Грешка током %s</string>
<string name="sync_error_http_dav">Грешка сервера током %s</string>
<string name="sync_error_local_storage">Грешка базе података током %s</string>
<string-array name="sync_error_phases">
<item>припремам синхронизацију</item>
<item>проверавам могућности</item>
<item>обрађујем локално обрисане уносе</item>
<item>припремам направљене/измењене уносе</item>
<item>отпремам направљене/измењене уносе</item>
<item>проверавам стање синхронизације</item>
<item>излиставам локалне уносе</item>
<item>излиставам удаљене уносе</item>
<item>упоређујем локалне/удаљене уносе</item>
<item>преузимам удаљене уносе</item>
<item>додатна обрада</item>
<item>уписујем стање синхронизације</item>
</string-array>
<string name="sync_error_unauthorized">Корисничко име или лозинка погрешни</string>
</resources>

View File

@@ -106,6 +106,7 @@
<string name="login_create_account">创建账户</string>
<string name="login_account_name">账户显示名</string>
<string name="login_account_name_info">请使用你的邮箱地址作为帐户名,因为 Android 会将你创建的日历事件的创建者项设置为帐户名。你不能拥有多个帐户名相同的账户。</string>
<string name="login_account_contact_group_method">联系人分组方式</string>
<string name="login_account_name_required">请输入账户名</string>
<string name="login_account_not_created">账户无法创建</string>
<string name="login_configuration_detection">正在配置</string>
@@ -157,6 +158,19 @@
<string name="settings_sync_wifi_only_ssid_on">同步只在 %s 网络下进行</string>
<string name="settings_sync_wifi_only_ssid_off">任何 WiFi 网络下均会同步</string>
<string name="settings_sync_wifi_only_ssid_message">输入 WiFi 网络的名称 (SSID) ,即可限制同步只在此网络下进行。留空则不限制。</string>
<string name="settings_carddav">CardDAV</string>
<string name="settings_contact_group_method">联系人分组方式</string>
<string-array name="settings_contact_group_method_values">
<item>GROUP_VCARDS</item>
<item>CATEGORIES</item>
</string-array>
<string-array name="settings_contact_group_method_entries">
<item>分为不同的 VCards</item>
<item>每个联系人的分类</item>
</string-array>
<string name="settings_rfc6868_for_vcards">为 VCards 启用 RFC6868</string>
<string name="settings_rfc6868_for_vcards_on">属性值中可使用双引号</string>
<string name="settings_rfc6868_for_vcards_off">属性值中不可使用双引号</string>
<string name="settings_caldav">CalDAV</string>
<string name="settings_sync_time_range_past">旧日程时间限制</string>
<string name="settings_sync_time_range_past_none">同步所有日程</string>
@@ -206,5 +220,19 @@
<string name="sync_error">%s时错误</string>
<string name="sync_error_http_dav">%s时服务器错误</string>
<string name="sync_error_local_storage">%s时数据库错误</string>
<string-array name="sync_error_phases">
<item>准备同步</item>
<item>请求功能列表</item>
<item>处理本地删除项目</item>
<item>准备创建/修改项目</item>
<item>上传创建/修改项目</item>
<item>检查同步状态</item>
<item>检查本地数据</item>
<item>检查远程数据</item>
<item>比较本地和远程数据</item>
<item>下载远程数据</item>
<item>预处理</item>
<item>保存同步状态</item>
</string-array>
<string name="sync_error_unauthorized">用户名或密码错误</string>
</resources>

View File

@@ -38,12 +38,13 @@ public class HttpClientTest extends TestCase {
}
public void testCookies() throws IOException, InterruptedException, URISyntaxException {
HttpUrl url = server.url("/");
HttpUrl url = server.url("/test");
// set cookie in first response
// set cookie for root path (/) and /test path in first response
server.enqueue(new MockResponse()
.setResponseCode(200)
.setHeader("Set-Cookie", "theme=light; path=/")
.addHeader("Set-Cookie", "cookie1=1; path=/")
.addHeader("Set-Cookie", "cookie2=2")
.setBody("Cookie set"));
httpClient.newCall(new Request.Builder()
.get().url(url)
@@ -51,14 +52,22 @@ public class HttpClientTest extends TestCase {
assertNull(server.takeRequest().getHeader("Cookie"));
// cookie should be sent with second request
// second response lets first cookie expire and overwrites second cookie
server.enqueue(new MockResponse()
.addHeader("Set-Cookie", "cookie1=1a; path=/; Max-Age=0")
.addHeader("Set-Cookie", "cookie2=2a")
.setResponseCode(200));
httpClient.newCall(new Request.Builder()
.get().url(url)
.build()).execute();
assertEquals("cookie2=2; cookie1=1", server.takeRequest().getHeader("Cookie"));
server.enqueue(new MockResponse()
.setResponseCode(200));
httpClient.newCall(new Request.Builder()
.get().url(url)
.build()).execute();
//assertEquals("theme=light", server.takeRequest().getHeader("Cookie"));
// doesn't work for URLs with ports, see https://code.google.com/p/android/issues/detail?id=193475
assertEquals("cookie2=2a", server.takeRequest().getHeader("Cookie"));
}
}

1
gradle.properties Normal file
View File

@@ -0,0 +1 @@
org.gradle.jvmargs=-Xmx2048M

View File

@@ -1,3 +1,2 @@
#!/bin/bash
./gradlew -i testDebug && \
./gradlew -i deviceCheck mergeAndroidReports --continue
./gradlew -i check mergeAndroidReports --continue

13
scripts/gen-contacts.rb Executable file
View File

@@ -0,0 +1,13 @@
#!/usr/bin/ruby
File.open("contacts.vcf", "w") do |f|
for i in 1..600 do
f.puts "BEGIN:VCARD"
f.puts "VERSION:3.0"
f.puts "FN:Kontakt Nr. #{i}"
f.puts "N:Kontakt Nr. #{i}"
f.puts "EMAIL:#{i}@google-god.com"
f.puts "PHONE:#{i}#{i}#{i}"
f.puts "END:VCARD"
end
end