Move google task sync to googleplay flavor

Closes #323
pull/384/head
Alex Baker 10 years ago
parent 2b68b887b5
commit 29afa0d804

@ -8,7 +8,7 @@ android:
components:
- android-22
- platform-tools-23.0.1
- build-tools-23.0.2
- build-tools-22.0.1
- extra-android-m2repository
- extra-google-m2repository
licenses:

@ -25,7 +25,7 @@ android {
}
compileSdkVersion 22
buildToolsVersion "23.0.2"
buildToolsVersion "22.0.1"
defaultConfig {
versionCode 379
@ -102,15 +102,12 @@ dependencies {
exclude group: 'com.android.support', module: 'support-v4'
}
googleplayCompile group: 'com.google.android.gms', name: 'play-services-location', version: '7.5.0'
googleplayCompile group: 'com.google.android.gms', name: 'play-services-location', version: '8.3.0'
compile(group: 'com.google.apis', name: 'google-api-services-tasks', version: 'v1-rev33-1.18.0-rc') {
googleplayCompile(group: 'com.google.apis', name: 'google-api-services-tasks', version: 'v1-rev41-1.21.0') {
exclude group: 'org.apache.httpcomponents', module: 'httpclient'
}
compile(group: 'com.google.api-client', name: 'google-api-client-android', version: '1.18.0-rc') {
exclude group: 'org.apache.httpcomponents', module: 'httpclient'
}
compile(group: 'com.google.http-client', name: 'google-http-client-gson', version: '1.18.0-rc') {
googleplayCompile(group: 'com.google.api-client', name: 'google-api-client-android', version: '1.21.0') {
exclude group: 'org.apache.httpcomponents', module: 'httpclient'
}
compile group: 'com.google.guava', name: 'guava-jdk5', version: '13.0'

@ -0,0 +1,12 @@
package com.todoroo.astrid.gtasks;
import android.test.AndroidTestCase;
import javax.inject.Inject;
public class GtasksIndentActionTest extends AndroidTestCase {
@Inject
public GtasksIndentActionTest() {
}
}

@ -0,0 +1,12 @@
package com.todoroo.astrid.gtasks;
import android.test.AndroidTestCase;
import javax.inject.Inject;
public class GtasksListServiceTest extends AndroidTestCase {
@Inject
public GtasksListServiceTest() {
}
}

@ -0,0 +1,12 @@
package com.todoroo.astrid.gtasks;
import android.test.AndroidTestCase;
import javax.inject.Inject;
public class GtasksTaskListUpdaterTest extends AndroidTestCase {
@Inject
public GtasksTaskListUpdaterTest() {
}
}

@ -0,0 +1,12 @@
package com.todoroo.astrid.gtasks;
import android.test.AndroidTestCase;
import javax.inject.Inject;
public class GtasksTaskMovingTest extends AndroidTestCase {
@Inject
public GtasksTaskMovingTest() {
}
}

@ -29,7 +29,7 @@ public class GtasksMetadataServiceTest extends DatabaseTestCase {
private final GtasksTestPreferenceService service;
public GtasksMetadataServiceTestModule(Context context) {
service = new GtasksTestPreferenceService(new Preferences(context, null));
service = new GtasksTestPreferenceService(context, new Preferences(context, null));
}
@Provides

@ -5,12 +5,14 @@
*/
package com.todoroo.astrid.gtasks;
import android.content.Context;
import org.tasks.preferences.Preferences;
public class GtasksTestPreferenceService extends GtasksPreferenceService {
public GtasksTestPreferenceService(Preferences preferences) {
super(preferences);
public GtasksTestPreferenceService(Context context, Preferences preferences) {
super(context, preferences);
}
@Override

@ -0,0 +1,19 @@
package com.todoroo.astrid.gtasks;
import com.todoroo.astrid.api.Filter;
import java.util.Collections;
import java.util.List;
import javax.inject.Inject;
public class GtasksFilterExposer {
@Inject
public GtasksFilterExposer() {
}
public List<Filter> getFilters() {
return Collections.emptyList();
}
}

@ -0,0 +1,6 @@
package com.todoroo.astrid.gtasks;
import com.todoroo.astrid.activity.TaskListFragment;
public class GtasksListFragment extends TaskListFragment {
}

@ -0,0 +1,18 @@
package com.todoroo.astrid.gtasks;
import java.util.Collections;
import java.util.List;
import javax.inject.Inject;
public class GtasksListService {
@Inject
public GtasksListService() {
}
public List<GtasksList> getLists() {
return Collections.emptyList();
}
}

@ -0,0 +1,10 @@
package com.todoroo.astrid.gtasks;
import javax.inject.Inject;
public class GtasksMetadataService {
@Inject
public GtasksMetadataService() {
}
}

@ -0,0 +1,10 @@
package com.todoroo.astrid.gtasks;
import javax.inject.Inject;
public class GtasksPreferences {
@Inject
public GtasksPreferences() {
}
}

@ -0,0 +1,10 @@
package com.todoroo.astrid.gtasks;
import javax.inject.Inject;
public class GtasksTaskListUpdater {
@Inject
public GtasksTaskListUpdater() {
}
}

@ -0,0 +1,10 @@
package com.todoroo.astrid.gtasks.auth;
import javax.inject.Inject;
public class GtasksLoginActivity {
@Inject
public GtasksLoginActivity() {
}
}

@ -0,0 +1,14 @@
package com.todoroo.astrid.gtasks.sync;
import javax.inject.Inject;
public class GtasksSyncService {
@Inject
public GtasksSyncService() {
}
public void initialize() {
}
}

@ -0,0 +1,26 @@
package com.todoroo.astrid.gtasks.sync;
import com.todoroo.astrid.gtasks.GtasksList;
import com.todoroo.astrid.sync.SyncResultCallback;
import javax.inject.Inject;
public class GtasksSyncV2Provider {
@Inject
public GtasksSyncV2Provider() {
}
public boolean isActive() {
return false;
}
public void synchronizeActiveTasks(SyncResultCallback callback) {
}
public void synchronizeList(GtasksList list, SyncResultCallback callback) {
}
}

@ -0,0 +1,10 @@
package org.tasks.activities;
import javax.inject.Inject;
public class ClearGtaskDataActivity {
@Inject
public ClearGtaskDataActivity() {
}
}

@ -0,0 +1,10 @@
package org.tasks.dialogs;
import javax.inject.Inject;
public class AccountSelectionDialog {
@Inject
public AccountSelectionDialog() {
}
}

@ -0,0 +1,10 @@
package org.tasks.scheduling;
import javax.inject.Inject;
public class GtasksBackgroundService {
@Inject
public GtasksBackgroundService() {
}
}

@ -13,6 +13,16 @@
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="com.google.android.providers.gsf.permission.READ_GSERVICES"/>
<!-- **************** -->
<!-- google task sync -->
<!-- **************** -->
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.GET_ACCOUNTS" />
<uses-permission android:name="android.permission.USE_CREDENTIALS" />
<uses-permission android:name="android.permission.MANAGE_ACCOUNTS" />
<uses-permission android:name="com.google.android.googleapps.permission.GOOGLE_AUTH" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
<application>
<meta-data android:name="com.google.android.gms.version"
@ -28,6 +38,23 @@
<service android:name=".location.GeofenceTransitionsIntentService"/>
<activity
android:name="com.todoroo.astrid.gtasks.auth.GtasksLoginActivity"
android:theme="@style/TranslucentDialog" />
<activity
android:name="com.todoroo.astrid.gtasks.GtasksPreferences"
android:label="@string/synchronization"
android:theme="@style/Tasks" />
<activity
android:name=".activities.ClearGtaskDataActivity"
android:theme="@style/TranslucentDialog" />
<service
android:name=".scheduling.GtasksBackgroundService"
android:exported="false" />
</application>
</manifest>

@ -20,8 +20,6 @@ import org.tasks.scheduling.BackgroundScheduler;
import javax.inject.Inject;
import static org.tasks.date.DateTimeUtils.newDate;
public class GtasksPreferences extends InjectingPreferenceActivity {
private static final int REQUEST_LOGIN = 0;
@ -45,7 +43,6 @@ public class GtasksPreferences extends InjectingPreferenceActivity {
startActivityForResult(new Intent(GtasksPreferences.this, GtasksLoginActivity.class), REQUEST_LOGIN);
} else {
gtasksPreferenceService.stopOngoing();
gtasksPreferenceService.setToken(null);
}
return true;
}

@ -2,25 +2,29 @@ package com.todoroo.astrid.gtasks.api;
import android.content.Context;
import com.google.api.client.extensions.android.http.AndroidHttp;
import com.google.api.client.googleapis.auth.oauth2.GoogleCredential;
import com.google.api.client.http.HttpRequest;
import com.google.api.client.http.HttpRequestInitializer;
import com.google.api.client.googleapis.extensions.android.gms.auth.GoogleAccountCredential;
import com.google.api.client.http.HttpResponseException;
import com.google.api.client.http.javanet.NetHttpTransport;
import com.google.api.client.json.GenericJson;
import com.google.api.client.json.gson.GsonFactory;
import com.google.api.client.json.jackson2.JacksonFactory;
import com.google.api.services.tasks.Tasks;
import com.google.api.services.tasks.TasksRequest;
import com.google.api.services.tasks.TasksScopes;
import com.google.api.services.tasks.model.Task;
import com.google.api.services.tasks.model.TaskList;
import com.google.api.services.tasks.model.TaskLists;
import com.todoroo.astrid.gtasks.auth.GtasksTokenValidator;
import com.todoroo.astrid.gtasks.GtasksPreferenceService;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.tasks.R;
import org.tasks.AccountManager;
import org.tasks.BuildConfig;
import org.tasks.injection.ForApplication;
import java.io.IOException;
import java.util.Collections;
import javax.inject.Inject;
/**
* Wrapper around the official Google Tasks API to simplify common operations. In the case
@ -32,45 +36,28 @@ public class GtasksInvoker {
private static final Logger log = LoggerFactory.getLogger(GtasksInvoker.class);
private final Context context;
private final GtasksTokenValidator gtasksTokenValidator;
private AccountManager accountManager;
private final GoogleAccountCredential credential;
private Tasks service;
private GoogleCredential credential = new GoogleCredential();
private String token;
private final String key;
public static final String AUTH_TOKEN_TYPE = "Manage your tasks"; //"oauth2:https://www.googleapis.com/auth/tasks";
public GtasksInvoker(Context context, GtasksTokenValidator gtasksTokenValidator, String authToken) {
this.context = context;
this.gtasksTokenValidator = gtasksTokenValidator;
this.token = authToken;
key = context.getString(R.string.gapi_key);
credential.setAccessToken(authToken);
HttpRequestInitializer httpRequestInitializer = new HttpRequestInitializer() {
@Override
public void initialize(HttpRequest request) throws IOException {
credential.initialize(request);
request.setReadTimeout(0); // infinite
}
};
service = new Tasks.Builder(AndroidHttp.newCompatibleTransport(), new GsonFactory(), httpRequestInitializer)
.setApplicationName("Tasks")
@Inject
public GtasksInvoker(@ForApplication Context context, GtasksPreferenceService preferenceService, AccountManager accountManager) {
this.accountManager = accountManager;
credential = GoogleAccountCredential.usingOAuth2(context, Collections.singletonList(TasksScopes.TASKS))
.setSelectedAccountName(preferenceService.getUserName());
service = new Tasks.Builder(new NetHttpTransport(), new JacksonFactory(), credential)
.setApplicationName(String.format("Tasks/%s", BuildConfig.VERSION_NAME))
.build();
}
//If we get a 401 or 403, try revalidating the auth token before bailing
private synchronized void handleException(IOException e) throws IOException {
log.error(e.getMessage(), e);
if (e instanceof HttpResponseException) {
HttpResponseException h = (HttpResponseException) e;
int statusCode = h.getStatusCode();
if (statusCode == 401 || statusCode == 403) {
token = gtasksTokenValidator.validateAuthToken(context, token);
if (token != null) {
credential.setAccessToken(token);
}
accountManager.clearToken(credential);
} else if (statusCode == 400 || statusCode == 500) {
throw h;
} else if (statusCode == 404) {
@ -79,25 +66,9 @@ public class GtasksInvoker {
log.error(statusCode + ": " + h.getStatusMessage(), e);
}
// 503 errors are generally either 1) quota limit reached or 2) problems on Google's end
} else {
log.error(e.getMessage(), e);
}
}
/**
* A simple service query that will throw an exception if anything goes wrong.
* Useful for checking if token needs revalidating or if there are network problems--
* no exception means all is well
*
* @throws IOException
*/
public void ping() throws IOException {
service.tasklists()
.get("@default")
.setKey(key)
.execute();
}
public TaskLists allGtaskLists() throws IOException {
return execute(service
.tasklists()
@ -152,14 +123,10 @@ public class GtasksInvoker {
log.debug("{} request: {}", caller, request);
T response;
try {
response = request
.setKey(key)
.execute();
response = request.execute();
} catch (IOException e) {
handleException(e);
response = request
.setKey(key)
.execute();
response = request.execute();
}
log.debug("{} response: {}", caller, prettyPrint(response));
return response;

@ -68,10 +68,9 @@ public class GtasksLoginActivity extends InjectingAppCompatActivity implements A
}
private void getAuthToken(String a, final ProgressDialog pd) {
accountManager.getAuthToken(a, new AccountManager.AuthResultHandler() {
accountManager.getAuthToken(this, a, new AccountManager.AuthResultHandler() {
@Override
public void authenticationSuccessful(String accountName, String authToken) {
gtasksPreferenceService.setToken(authToken);
gtasksPreferenceService.setUserName(accountName);
setResult(RESULT_OK);
finish();
@ -91,12 +90,10 @@ public class GtasksLoginActivity extends InjectingAppCompatActivity implements A
});
}
private static final int REQUEST_AUTHENTICATE = 0;
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if(requestCode == REQUEST_AUTHENTICATE && resultCode == RESULT_OK){
if(requestCode == AccountManager.REQUEST_AUTHORIZATION && resultCode == RESULT_OK){
final ProgressDialog pd = dialogBuilder.newProgressDialog(R.string.gtasks_GLA_authenticating);
pd.show();
getAuthToken(accountName, pd);

@ -6,7 +6,6 @@
package com.todoroo.astrid.gtasks.sync;
import android.content.ContentValues;
import android.content.Context;
import android.text.TextUtils;
import com.todoroo.andlib.data.DatabaseDao.ModelUpdateListener;
@ -25,12 +24,10 @@ import com.todoroo.astrid.gtasks.api.GtasksApiUtilities;
import com.todoroo.astrid.gtasks.api.GtasksInvoker;
import com.todoroo.astrid.gtasks.api.HttpNotFoundException;
import com.todoroo.astrid.gtasks.api.MoveRequest;
import com.todoroo.astrid.gtasks.auth.GtasksTokenValidator;
import com.todoroo.astrid.service.TaskService;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.tasks.injection.ForApplication;
import java.io.IOException;
import java.util.concurrent.LinkedBlockingQueue;
@ -46,26 +43,24 @@ public class GtasksSyncService {
private static final String DEFAULT_LIST = "@default"; //$NON-NLS-1$
private Context context;
private final MetadataDao metadataDao;
private final GtasksMetadataService gtasksMetadataService;
private final TaskDao taskDao;
private final GtasksPreferenceService gtasksPreferenceService;
private final GtasksTokenValidator gtasksTokenValidator;
private final GtasksMetadata gtasksMetadataFactory;
private GtasksInvoker gtasksInvoker;
private final LinkedBlockingQueue<SyncOnSaveOperation> operationQueue = new LinkedBlockingQueue<>();
@Inject
public GtasksSyncService(@ForApplication Context context, MetadataDao metadataDao, GtasksMetadataService gtasksMetadataService,
public GtasksSyncService(MetadataDao metadataDao, GtasksMetadataService gtasksMetadataService,
TaskDao taskDao, GtasksPreferenceService gtasksPreferenceService,
GtasksTokenValidator gtasksTokenValidator, GtasksMetadata gtasksMetadataFactory) {
this.context = context;
GtasksMetadata gtasksMetadataFactory, GtasksInvoker gtasksInvoker) {
this.metadataDao = metadataDao;
this.gtasksMetadataService = gtasksMetadataService;
this.taskDao = taskDao;
this.gtasksPreferenceService = gtasksPreferenceService;
this.gtasksTokenValidator = gtasksTokenValidator;
this.gtasksMetadataFactory = gtasksMetadataFactory;
this.gtasksInvoker = gtasksInvoker;
}
private abstract class SyncOnSaveOperation {
@ -159,8 +154,7 @@ public class GtasksSyncService {
continue;
}
try {
GtasksInvoker invoker = new GtasksInvoker(context, gtasksTokenValidator, gtasksPreferenceService.getToken());
op.op(invoker);
op.op(gtasksInvoker);
} catch (IOException e) {
log.error(e.getMessage(), e);
}

@ -28,9 +28,7 @@ import com.todoroo.astrid.gtasks.GtasksMetadata;
import com.todoroo.astrid.gtasks.GtasksMetadataService;
import com.todoroo.astrid.gtasks.GtasksPreferenceService;
import com.todoroo.astrid.gtasks.GtasksTaskListUpdater;
import com.todoroo.astrid.gtasks.api.GoogleTasksException;
import com.todoroo.astrid.gtasks.api.GtasksInvoker;
import com.todoroo.astrid.gtasks.auth.GtasksTokenValidator;
import com.todoroo.astrid.service.TaskService;
import com.todoroo.astrid.sync.SyncResultCallback;
@ -55,8 +53,8 @@ import static org.tasks.date.DateTimeUtils.newDateTime;
public class GtasksSyncV2Provider {
public class SyncExceptionHandler {
public void handleException(String tag, Exception e) {
log.error("{}: {}", tag, e.getMessage(), e);
public void handleException(Exception e) {
log.error(e.getMessage(), e);
}
}
@ -83,15 +81,15 @@ public class GtasksSyncV2Provider {
private final GtasksTaskListUpdater gtasksTaskListUpdater;
private final Context context;
private final Preferences preferences;
private final GtasksTokenValidator gtasksTokenValidator;
private final GtasksMetadata gtasksMetadataFactory;
private final SyncExecutor executor;
private final GtasksInvoker gtasksInvoker;
@Inject
public GtasksSyncV2Provider(TaskService taskService, StoreObjectDao storeObjectDao, GtasksPreferenceService gtasksPreferenceService,
GtasksSyncService gtasksSyncService, GtasksListService gtasksListService, GtasksMetadataService gtasksMetadataService,
GtasksTaskListUpdater gtasksTaskListUpdater, @ForApplication Context context, Preferences preferences,
GtasksTokenValidator gtasksTokenValidator, GtasksMetadata gtasksMetadata, SyncExecutor executor) {
GtasksMetadata gtasksMetadata, SyncExecutor executor, GtasksInvoker gtasksInvoker) {
this.taskService = taskService;
this.storeObjectDao = storeObjectDao;
this.gtasksPreferenceService = gtasksPreferenceService;
@ -101,9 +99,9 @@ public class GtasksSyncV2Provider {
this.gtasksTaskListUpdater = gtasksTaskListUpdater;
this.context = context;
this.preferences = preferences;
this.gtasksTokenValidator = gtasksTokenValidator;
this.gtasksMetadataFactory = gtasksMetadata;
this.executor = executor;
this.gtasksInvoker = gtasksInvoker;
}
private String getName() {
@ -112,7 +110,6 @@ public class GtasksSyncV2Provider {
public void signOut() {
gtasksPreferenceService.clearLastSyncDate();
gtasksPreferenceService.setToken(null);
gtasksPreferenceService.setUserName(null);
gtasksMetadataService.clearMetadata();
}
@ -128,14 +125,12 @@ public class GtasksSyncV2Provider {
callback.started();
try {
String authToken = getValidatedAuthToken();
final GtasksInvoker invoker = new GtasksInvoker(context, gtasksTokenValidator, authToken);
TaskLists remoteLists = null;
try {
remoteLists = invoker.allGtaskLists();
remoteLists = gtasksInvoker.allGtaskLists();
gtasksListService.updateLists(remoteLists);
} catch (IOException e) {
handler.handleException("gtasks-sync=io", e); //$NON-NLS-1$
handler.handleException(e);
}
if (remoteLists == null) {
@ -156,16 +151,16 @@ public class GtasksSyncV2Provider {
executor.execute(callback, new Runnable() {
@Override
public void run() {
synchronizeListHelper(list, invoker, handler);
synchronizeListHelper(list, gtasksInvoker, handler);
if (finisher.decrementAndGet() == 0) {
pushUpdated(invoker);
pushUpdated(gtasksInvoker);
finishSync(callback);
}
}
});
}
} catch(Exception e) {
handler.handleException("gtasks-sync=io", e); //$NON-NLS-1$
} catch (Exception e) {
handler.handleException(e);
callback.finished();
}
}
@ -186,7 +181,7 @@ public class GtasksSyncV2Provider {
try {
gtasksSyncService.pushTaskOnSave(task, task.getMergedValues(), invoker);
} catch (IOException e) {
handler.handleException("gtasks-sync-io", e); //$NON-NLS-1$
handler.handleException(e);
}
}
} finally {
@ -201,10 +196,8 @@ public class GtasksSyncV2Provider {
callback.started();
try {
String authToken = getValidatedAuthToken();
gtasksSyncService.waitUntilEmpty();
final GtasksInvoker service = new GtasksInvoker(context, gtasksTokenValidator, authToken);
synchronizeListHelper(gtasksList, service, null);
synchronizeListHelper(gtasksList, gtasksInvoker, null);
} finally {
callback.finished();
}
@ -212,20 +205,6 @@ public class GtasksSyncV2Provider {
});
}
private String getValidatedAuthToken() {
String authToken = gtasksPreferenceService.getToken();
try {
authToken = gtasksTokenValidator.validateAuthToken(context, authToken);
if (authToken != null) {
gtasksPreferenceService.setToken(authToken);
}
} catch (GoogleTasksException e) {
log.error(e.getMessage(), e);
authToken = null;
}
return authToken;
}
private synchronized void synchronizeListHelper(GtasksList list, GtasksInvoker invoker,
SyncExceptionHandler errorHandler) {
String listId = list.getRemoteId();
@ -266,7 +245,7 @@ public class GtasksSyncV2Provider {
}
} catch (IOException e) {
if (errorHandler != null) {
errorHandler.handleException("gtasks-sync-io", e); //$NON-NLS-1$
errorHandler.handleException(e);
} else {
log.error(e.getMessage(), e);
}

@ -0,0 +1,115 @@
package org.tasks;
import android.accounts.Account;
import android.app.Activity;
import android.content.Context;
import com.google.android.gms.auth.GoogleAuthException;
import com.google.android.gms.auth.GoogleAuthUtil;
import com.google.android.gms.auth.UserRecoverableAuthException;
import com.google.api.client.googleapis.extensions.android.accounts.GoogleAccountManager;
import com.google.api.client.googleapis.extensions.android.gms.auth.GoogleAccountCredential;
import com.google.api.services.tasks.TasksScopes;
import com.google.common.base.Function;
import com.google.common.base.Predicate;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.tasks.injection.ForApplication;
import java.io.IOException;
import java.util.List;
import javax.annotation.Nullable;
import javax.inject.Inject;
import static com.google.common.collect.Iterables.tryFind;
import static com.google.common.collect.Lists.transform;
import static java.util.Arrays.asList;
public class AccountManager {
public void clearToken(GoogleAccountCredential credential) throws IOException {
try {
String token = credential.getToken();
log.debug("Invalidating {}", token);
GoogleAuthUtil.clearToken(context, token);
GoogleAuthUtil.getTokenWithNotification(context, credential.getSelectedAccount(), "oauth2:" + TasksScopes.TASKS, null);
} catch (GoogleAuthException e) {
log.error(e.getMessage(), e);
throw new IOException(e);
}
}
public interface AuthResultHandler {
void authenticationSuccessful(String accountName, String authToken);
void authenticationFailed(String message);
}
private static final Logger log = LoggerFactory.getLogger(AccountManager.class);
public static final int REQUEST_AUTHORIZATION = 10987;
private final Context context;
private final GoogleAccountManager googleAccountManager;
@Inject
public AccountManager(@ForApplication Context context) {
this.context = context;
googleAccountManager = new GoogleAccountManager(context);
}
public List<String> getAccounts() {
return transform(getAccountList(), new Function<Account, String>() {
@Nullable
@Override
public String apply(Account account) {
return account.name;
}
});
}
public boolean hasAccount(final String name) {
return getAccount(name) != null;
}
public boolean isEmpty() {
return getAccounts().isEmpty();
}
public void getAuthToken(final Activity activity, final String accountName, final AuthResultHandler handler) {
final Account account = getAccount(accountName);
if (account == null) {
handler.authenticationFailed(activity.getString(R.string.gtasks_error_accountNotFound, accountName));
} else {
new Thread(new Runnable() {
@Override
public void run() {
try {
handler.authenticationSuccessful(accountName, GoogleAuthUtil.getToken(activity, account, "oauth2:" + TasksScopes.TASKS, null));
} catch(UserRecoverableAuthException e) {
log.error(e.getMessage(), e);
activity.startActivityForResult(e.getIntent(), REQUEST_AUTHORIZATION);
} catch(GoogleAuthException | IOException e) {
log.error(e.getMessage(), e);
handler.authenticationFailed(context.getString(R.string.gtasks_GLA_errorIOAuth));
}
}
}).start();
}
}
private List<Account> getAccountList() {
return asList(googleAccountManager.getAccounts());
}
public Account getAccount(final String name) {
return tryFind(getAccountList(), new Predicate<Account>() {
@Override
public boolean apply(Account account) {
return name.equalsIgnoreCase(account.name);
}
}).orNull();
}
}

@ -0,0 +1,4 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<bool name="sync_enabled">true</bool>
</resources>

@ -44,15 +44,6 @@
<!-- ********************* -->
<uses-permission android:name="android.permission.RECORD_AUDIO" />
<!-- **************** -->
<!-- google task sync -->
<!-- **************** -->
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.GET_ACCOUNTS" />
<uses-permission android:name="android.permission.USE_CREDENTIALS" />
<uses-permission android:name="android.permission.MANAGE_ACCOUNTS" />
<uses-permission android:name="com.google.android.googleapps.permission.GOOGLE_AUTH" />
<!-- ============================================== Exported Permissions = -->
<!-- for v2 tasks provider -->
@ -367,20 +358,6 @@
android:name="com.todoroo.astrid.actfm.FilterSettingsActivity"
android:windowSoftInputMode="stateHidden" />
<!-- gtasks -->
<activity
android:name="com.todoroo.astrid.gtasks.auth.GtasksLoginActivity"
android:theme="@style/TranslucentDialog" />
<activity
android:name="com.todoroo.astrid.gtasks.GtasksPreferences"
android:label="@string/synchronization"
android:theme="@style/Tasks" />
<activity
android:name=".activities.ClearGtaskDataActivity"
android:theme="@style/TranslucentDialog" />
<!-- repeats -->
<receiver android:name="com.todoroo.astrid.repeats.RepeatTaskCompleteListener">
@ -525,9 +502,6 @@
<service
android:name=".scheduling.BackupIntentService"
android:exported="false" />
<service
android:name=".scheduling.GtasksBackgroundService"
android:exported="false" />
<service
android:name=".scheduling.MidnightRefreshService"
android:exported="false" />

@ -5,8 +5,12 @@
*/
package com.todoroo.astrid.gtasks;
import android.content.Context;
import com.todoroo.andlib.utility.DateUtilities;
import org.tasks.R;
import org.tasks.injection.ForApplication;
import org.tasks.preferences.Preferences;
import javax.inject.Inject;
@ -21,6 +25,7 @@ import javax.inject.Singleton;
@Singleton
public class GtasksPreferenceService {
private Context context;
private final Preferences preferences;
public static final String IDENTIFIER = "gtasks"; //$NON-NLS-1$
@ -29,7 +34,8 @@ public class GtasksPreferenceService {
private static final String PREF_USER_NAME = IDENTIFIER + "_user"; //$NON-NLS-1$
@Inject
public GtasksPreferenceService(Preferences preferences) {
public GtasksPreferenceService(@ForApplication Context context, Preferences preferences) {
this.context = context;
this.preferences = preferences;
}
@ -59,17 +65,8 @@ public class GtasksPreferenceService {
* @return true if we have a token for this user, false otherwise
*/
public boolean isLoggedIn() {
return preferences.getStringValue(IDENTIFIER + PREF_TOKEN) != null;
}
/** authentication token, or null if doesn't exist */
public String getToken() {
return preferences.getStringValue(IDENTIFIER + PREF_TOKEN);
}
/** Sets the authentication token. Set to null to clear. */
public void setToken(String setting) {
preferences.setString(IDENTIFIER + PREF_TOKEN, setting);
return context.getResources().getBoolean(R.bool.sync_enabled) &&
preferences.getStringValue(IDENTIFIER + PREF_TOKEN) != null;
}
/** @return Last Successful Sync Date, or 0 */

@ -1,119 +0,0 @@
/**
* Copyright (c) 2012 Todoroo Inc
*
* See the file "LICENSE" for the full license governing this code.
*/
package com.todoroo.astrid.gtasks.auth;
import android.accounts.Account;
import android.accounts.AccountManager;
import android.accounts.AccountManagerFuture;
import android.app.Activity;
import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import com.google.api.client.googleapis.extensions.android.accounts.GoogleAccountManager;
import com.todoroo.astrid.gtasks.GtasksPreferenceService;
import com.todoroo.astrid.gtasks.api.GoogleTasksException;
import com.todoroo.astrid.gtasks.api.GtasksInvoker;
import org.tasks.R;
import org.tasks.injection.ForApplication;
import java.io.IOException;
import javax.inject.Inject;
import javax.inject.Singleton;
@Singleton
public class GtasksTokenValidator {
private static final String TOKEN_INTENT_RECEIVED = "intent!"; //$NON-NLS-1$
private static final int REVALIDATION_TRIES = 4;
private final Context context;
private final GtasksPreferenceService preferences;
@Inject
public GtasksTokenValidator(@ForApplication Context context, GtasksPreferenceService preferences) {
this.context = context;
this.preferences = preferences;
}
/**
* Invalidates and then revalidates the auth token for the currently logged in user
* Shouldn't be called from the main thread--will block on network calls
* @return valid token on success, null on failure
*/
public synchronized String validateAuthToken(Context c, String token) throws GoogleTasksException {
GoogleAccountManager accountManager = new GoogleAccountManager(context);
if(testToken(token)) {
return token;
}
// If fail, token may have expired -- get a new one and return that
String accountName = preferences.getUserName();
Account a = accountManager.getAccountByName(accountName);
if (a == null) {
throw new GoogleTasksException(c.getString(R.string.gtasks_error_accountNotFound, accountName));
}
for (int i = 0; i < REVALIDATION_TRIES; i++) {
accountManager.invalidateAuthToken(token);
// try with notify-auth-failure = false
AccountManagerFuture<Bundle> future = accountManager.getAccountManager().getAuthToken(a, GtasksInvoker.AUTH_TOKEN_TYPE, false, null, null);
token = getTokenFromFuture(c, future);
if(TOKEN_INTENT_RECEIVED.equals(token)) {
return null;
} else if(token != null && testToken(token)) {
return token;
}
}
throw new GoogleTasksException(c.getString(R.string.gtasks_error_authRefresh));
}
private boolean testToken(String token) {
GtasksInvoker testService = new GtasksInvoker(context, this, token);
try {
testService.ping();
return true;
} catch (IOException i) {
return false;
}
}
private String getTokenFromFuture(Context c, AccountManagerFuture<Bundle> future)
throws GoogleTasksException {
Bundle result;
try {
result = future.getResult();
if(result == null) {
throw new NullPointerException("Future result was null."); //$NON-NLS-1$
}
} catch (Exception e) {
throw new GoogleTasksException(e.getLocalizedMessage());
}
// check what kind of result was returned
String token;
if (result.containsKey(AccountManager.KEY_AUTHTOKEN)) {
token = result.getString(AccountManager.KEY_AUTHTOKEN);
} else if (result.containsKey(AccountManager.KEY_INTENT)) {
Intent intent = (Intent) result.get(AccountManager.KEY_INTENT);
if (c instanceof Activity) {
c.startActivity(intent);
} else {
throw new GoogleTasksException(c.getString(R.string.gtasks_error_background_sync_auth));
}
return TOKEN_INTENT_RECEIVED;
} else {
throw new GoogleTasksException(c.getString(R.string.gtasks_error_accountManager));
}
return token;
}
}

@ -1,110 +0,0 @@
package org.tasks;
import android.accounts.Account;
import android.accounts.AccountManagerCallback;
import android.accounts.AccountManagerFuture;
import android.app.Activity;
import android.os.Bundle;
import com.google.api.client.googleapis.extensions.android.accounts.GoogleAccountManager;
import com.google.common.base.Function;
import com.google.common.base.Predicate;
import com.todoroo.astrid.gtasks.api.GtasksInvoker;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.io.IOException;
import java.util.List;
import java.util.concurrent.TimeUnit;
import javax.annotation.Nullable;
import javax.inject.Inject;
import static com.google.common.collect.Iterables.tryFind;
import static com.google.common.collect.Lists.transform;
import static java.util.Arrays.asList;
public class AccountManager {
private static final Logger log = LoggerFactory.getLogger(AccountManager.class);
public interface AuthResultHandler {
void authenticationSuccessful(String accountName, String authToken);
void authenticationFailed(String message);
}
private GoogleAccountManager googleAccountManager;
private Activity activity;
@Inject
public AccountManager(Activity activity) {
this.activity = activity;
googleAccountManager = new GoogleAccountManager(activity);
}
public List<String> getAccounts() {
return transform(getAccountList(), new Function<Account, String>() {
@Nullable
@Override
public String apply(Account account) {
return account.name;
}
});
}
public boolean hasAccount(final String name) {
return getAccount(name) != null;
}
public boolean isEmpty() {
return getAccounts().isEmpty();
}
public void getAuthToken(final String accountName, final AuthResultHandler handler) {
Account account = getAccount(accountName);
if (account == null) {
handler.authenticationFailed(activity.getString(R.string.gtasks_error_accountNotFound, accountName));
} else {
googleAccountManager.getAccountManager().getAuthToken(account, GtasksInvoker.AUTH_TOKEN_TYPE, null, activity, new AccountManagerCallback<Bundle>() {
@Override
public void run(final AccountManagerFuture<Bundle> future) {
new Thread() {
@Override
public void run() {
try {
Bundle bundle = future.getResult(30, TimeUnit.SECONDS);
if (bundle.containsKey(android.accounts.AccountManager.KEY_AUTHTOKEN)) {
handler.authenticationSuccessful(accountName, bundle.getString(android.accounts.AccountManager.KEY_AUTHTOKEN));
} else {
log.error("No auth token found in response bundle");
handler.authenticationFailed(activity.getString(R.string.gtasks_error_accountNotFound, accountName));
}
} catch (final Exception e) {
log.error(e.getMessage(), e);
handler.authenticationFailed(activity.getString(e instanceof IOException
? R.string.gtasks_GLA_errorIOAuth
: R.string.gtasks_GLA_errorAuth));
}
}
}.start();
}
}, null);
}
}
private List<Account> getAccountList() {
return asList(googleAccountManager.getAccounts());
}
private Account getAccount(final String name) {
return tryFind(getAccountList(), new Predicate<Account>() {
@Override
public boolean apply(Account account) {
return name.equalsIgnoreCase(account.name);
}
}).orNull();
}
}

@ -17,7 +17,6 @@ import org.tasks.injection.InjectingDialogFragment;
import java.util.List;
import javax.annotation.Nullable;
import javax.inject.Inject;
import static com.google.common.collect.Lists.transform;
@ -43,7 +42,6 @@ public class CalendarSelectionDialog extends InjectingDialogFragment {
public Dialog onCreateDialog(Bundle savedInstanceState) {
final List<AndroidCalendar> calendars = gCalHelper.getCalendars();
List<String> calendarNames = transform(calendars, new Function<AndroidCalendar, String>() {
@Nullable
@Override
public String apply(AndroidCalendar androidCalendar) {
return androidCalendar.getName();

@ -31,7 +31,6 @@ import org.tasks.injection.ForApplication;
import java.util.List;
import javax.annotation.Nullable;
import javax.inject.Inject;
import static com.google.common.collect.Iterables.transform;
@ -83,7 +82,6 @@ public class FilterCriteriaProvider {
private CustomFilterCriterion getTagFilter() {
// TODO: adding to hash set because duplicate tag name bug hasn't been fixed yet
List<String> tags = newArrayList(newLinkedHashSet(transform(tagService.getTagList(), new Function<TagData, String>() {
@Nullable
@Override
public String apply(TagData tagData) {
return tagData.getName();

@ -7,7 +7,7 @@ import android.content.pm.PackageManager;
import android.os.Build;
import android.provider.MediaStore;
import com.google.api.client.repackaged.com.google.common.base.Joiner;
import com.google.common.base.Joiner;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

@ -3,6 +3,7 @@ package org.tasks.scheduling;
import android.content.Context;
import android.content.Intent;
import org.tasks.R;
import org.tasks.injection.ForApplication;
import javax.inject.Inject;
@ -21,7 +22,10 @@ public class BackgroundScheduler {
context.startService(new Intent(context, ReminderSchedulerIntentService.class));
scheduleBackupService();
scheduleMidnightRefresh();
scheduleGtaskSync();
if (context.getResources().getBoolean(R.bool.sync_enabled)) {
scheduleGtaskSync();
}
}
public void scheduleBackupService() {

@ -136,7 +136,6 @@
<string name="gtasks_GLA_noaccounts">لا يوجد حساب قوقل للتزامن مع.</string>
<string name="gtasks_GLA_errorIOAuth">عذرا، لم نتمكن من الاتصال مع خادم قوقل. أعد المحاولة مرة أخرى لاحقا.</string>
<string name="gtasks_GPr_header">مهام قوقل</string>
<string name="gtasks_error_accountManager">خطأ من اعدادات هاتفك. يرجى تسجيل الخروج ثم الدخول مره اخرى من اعدادات المهام لقوقل</string>
<string name="premium_record_audio">تسجيل ملاحظة</string>
<string name="premium_remove_file_confirm">هل أنت متأكد؟ لن تستطيع العودة</string>
<string name="audio_recording_title">تسجيل صوت</string>

@ -233,12 +233,8 @@
<string name="gtasks_GTA_clear_completed">Изчисти Завършени</string>
<string name="gtasks_GLA_noaccounts">Няма налични Google акаунти за синхронизация.</string>
<string name="gtasks_GLA_authenticating">Удостоверява се...</string>
<string name="gtasks_GLA_errorAuth">Грешка при удостоверяване! Моля, проверете потребителското си име и парола в акаунт мениджъра на телефона си</string>
<string name="gtasks_GLA_errorIOAuth">Съжаляваме, ние имахме проблем с комуникацията със сървърите на Google. Моля, опитайте отново по-късно.</string>
<string name="gtasks_error_accountNotFound">Акаунт %s не е намерен-моля да излезнете и да влязнете отново от настройките на Google Tasks.</string>
<string name="gtasks_error_authRefresh">Не може да се удостовери с Google Tasks. Моля, проверете паролата на профила си или опитате отново по-късно.</string>
<string name="gtasks_error_accountManager">Грешка в мениджъра на акаунти във вашия телефон. Моля за излезнете и да влезнете пак от настройките на Google Tasks.</string>
<string name="gtasks_error_background_sync_auth">Грешка при удостоверяване във фонов режим. Моля, опитайте се да започване синхронизация, докато Tasks се изпълнява.</string>
<string name="locale_notification">Вие имате $NUM съвпадения: $FILTER</string>
<string name="premium_record_audio">Запис на бележка</string>
<string name="premium_remove_file_confirm">Сигурни ли сте? Не може да бъде отменено</string>

@ -203,13 +203,9 @@
<string name="gtasks_GTA_clear_completed">Smazat hotové</string>
<string name="gtasks_GLA_noaccounts">Žádný dostupný účet Google pro synchronizaci</string>
<string name="gtasks_GLA_authenticating">Ověřuje se...</string>
<string name="gtasks_GLA_errorAuth">Chyba při autentifikaci! Zkontrolujte prosím uživatelské jméno/heslo ve správci hesel svého mobilu</string>
<string name="gtasks_GLA_errorIOAuth">Nastali problémy při komunikaci se servery Google. Zkuste to prosím později.</string>
<string name="gtasks_GPr_header">Google Úkoly (Beta!)</string>
<string name="gtasks_error_accountNotFound">Účet %s nebyl nalezen -- přes nastavení Google Tasks se odhlašte a znovu přihlaste.</string>
<string name="gtasks_error_authRefresh">Nelze se přihlásit ke Google Tasks. Zkontrolujte prosím heslo ke svému účtu, nebo se zkuste znovu přihlásit.</string>
<string name="gtasks_error_accountManager">Chyba nastavení účtu ve Vašem telefonu. Prosím odhlašte se a znovu přihlašte v nastavení úkolů Google.</string>
<string name="gtasks_error_background_sync_auth">Chyba ověření pravosti na pozadí. Prosím, zkuste znovu spustit synchronizaci úkolů.</string>
<string name="locale_notification">Máš $NUM se značkou $FILTER</string>
<string name="premium_record_audio">Nahrát poznámku</string>
<string name="premium_remove_file_confirm">Skutečně? Nebude cesty zpět</string>

@ -214,12 +214,8 @@
<string name="gtasks_GTA_clear_completed">Entferne erledigte Aufgaben</string>
<string name="gtasks_GLA_noaccounts">Keine Google-Accounts zum synchronisieren verfügbar.</string>
<string name="gtasks_GLA_authenticating">Authentifizierung ...</string>
<string name="gtasks_GLA_errorAuth">Anmeldefehler! Bitte Benutzername und Passwort in den Kontoeinstellungen des Telefons prüfen</string>
<string name="gtasks_GLA_errorIOAuth">Entschuldigung, während der Kommunikation mit den Google-Servern ist ein Problem aufgetreten. Bitte versuchen Sie es später noch einmal.</string>
<string name="gtasks_error_accountNotFound">Konto %s nicht gefunden. Bitte ausloggen und erneut einloggen über die Einstellungen von Google Tasks.</string>
<string name="gtasks_error_authRefresh">Anmeldung bei Google Tasks nicht möglich. Bitte Passwort prüfen oder später erneut versuchen.</string>
<string name="gtasks_error_accountManager">Fehler in den</string>
<string name="gtasks_error_background_sync_auth">Fehler bei der Hintergrundauthentifizierung. Starte eine Synchronisation in der App.</string>
<string name="locale_notification">Du hast $NUM Übereinstimmungen mit: $FILTER</string>
<string name="premium_record_audio">Notiz aufzeichnen</string>
<string name="premium_remove_file_confirm">Sind Sie sicher? Das kann nicht rückgängig gemacht werden</string>

@ -205,13 +205,9 @@
<string name="gtasks_GTA_clear_completed">Καθαρισμός ολοκληρωμένων</string>
<string name="gtasks_GLA_noaccounts">Δεν υπάρχουν λογαριασμοί Google για συγχρονισμο.</string>
<string name="gtasks_GLA_authenticating">Αυθεντικοποίηση...</string>
<string name="gtasks_GLA_errorAuth">Σφάλμα αυθεντικοποίησης! Παρακαλώ ελέγξτε το όνομα και τον κωδικό χρήστη στην διαχείρηση λογαριασμών του κινητού</string>
<string name="gtasks_GLA_errorIOAuth">Συγγνώμη, υπήρξε σφάλμα επικοινωνίας με τους διακομιστές της Google. Παρακαλουμε δοκιμάστε πάλι μετά</string>
<string name="gtasks_GPr_header">Εργασίες Google</string>
<string name="gtasks_error_accountNotFound">Λογαριασμός %s δεν βρέθηκε - παρακαλώ αποσυνδεθείτε και συνδεθείτε πάλι απο τις ρυθμίσεις του Google Tasks.</string>
<string name="gtasks_error_authRefresh">Ανέφικτη η αυθεντικοποίηση με το Google Tasks. Παρακαλώ ελέγξτε τον κωδικό του λογαριασμού σας και δοκιμάστε πάλι.</string>
<string name="gtasks_error_accountManager">Σφάλμα στον διαχειριστή επαφών της συσκευής σας. Παρακαλώ αποσυνδεθείτε και συνδεθείτε ξανά απο τις ρυθμίσεις του Google Tasks.</string>
<string name="gtasks_error_background_sync_auth">Σφάλμα αυθεντικοποίησης στο παρασκήνιο. Παρακαλώ δοκιμάστε να συγχρονίσετε όσο τρέχει η εφαρμογή.</string>
<string name="locale_notification">Έχεις $NUM να ταιριάζει: $FILTER</string>
<string name="premium_record_audio">Ηχογράφηση σημείωσης</string>
<string name="premium_remove_file_confirm">Είστε σίγουρος; Δεν μπορεί να ακυρωθεί</string>

@ -215,12 +215,8 @@
<string name="gtasks_GTA_clear_completed">Quitar finalizadas</string>
<string name="gtasks_GLA_noaccounts">No hay disponible una cuenta de Google con la cual sincronizarse.</string>
<string name="gtasks_GLA_authenticating">Autenticando...</string>
<string name="gtasks_GLA_errorAuth">¡Error de autenticación! ¡Por favor revisa tu nombre de usuario y contraseña en el administrador de cuentas de tu teléfono!</string>
<string name="gtasks_GLA_errorIOAuth">Perdón, hubo un problema al comunicarse con los servidores de Google. Por favor inténtalo mas tarde.</string>
<string name="gtasks_error_accountNotFound">No se ha encontrado la cuenta %s --por favor, cierra sesión y vuelve a iniciarla desde la configuración de Google Tasks</string>
<string name="gtasks_error_authRefresh">No se pudo autenticar con Google Tasks. Por favor revisa la contraseña de tu cuenta o intenta de nuevo mas tarde.</string>
<string name="gtasks_error_accountManager">Error en el administrador de cuentas de tu teléfono. Por favor reinicia sesión desde la configuración de Google Tasks.</string>
<string name="gtasks_error_background_sync_auth">Error al autenticarse en un segundo plano. Por favor, intente iniciar la sincronización mientras Tasks está ejecutándose.</string>
<string name="locale_notification">Tiene $NUM que coincide con: $FILTER</string>
<string name="premium_record_audio">Grabar una nota</string>
<string name="premium_remove_file_confirm">Está seguro? No se puede deshacer</string>

@ -158,7 +158,6 @@
<string name="gtasks_GTA_clear_completed">حذف انجام شد</string>
<string name="gtasks_GLA_noaccounts">اکانت گوگلی برای همگام سازی موجود نیست</string>
<string name="gtasks_GLA_authenticating">اعتبارسنجی...</string>
<string name="gtasks_GLA_errorAuth">خطای اعتبارسنجی! لطفا نام کاربری و رمزعبور خود را در تنظیمات گوشی تان بررسی نمایید</string>
<string name="gtasks_GLA_errorIOAuth">پوزش، ارتباط با سرورهای گوگل میسر نشد. لطفا دوباره تلاش نمایید.</string>
<string name="gtasks_GPr_header">وظایف گوگل</string>
<string name="premium_record_audio">ذخیره یادداشت</string>

@ -52,7 +52,6 @@
<string name="gtasks_GTA_clear_completed">Poista valmiit</string>
<string name="gtasks_GLA_noaccounts">Google tiliä ei ole saatavissa synkronointia varten.</string>
<string name="gtasks_GLA_authenticating">Todennetaan...</string>
<string name="gtasks_GLA_errorAuth">Todennus epäonnistui! Tarkista käyttjätunnus ja salasana puhelimesi tilinhallinata sovellukseta</string>
<string name="gtasks_GLA_errorIOAuth">Valitettavasti meillä on yhteysongelmia Google palvelimiin. Ole hyvä ja yritä myöhemmin uudestaa.</string>
<string name="gtasks_GPr_header">Google tehtävät</string>
<string name="rmd_EPr_defaultRemind_title">Satunnainen muistutus</string>

@ -217,13 +217,9 @@
<string name="gtasks_GTA_clear_completed">Effacer les tâches terminés</string>
<string name="gtasks_GLA_noaccounts">Aucun compte Google trouvé pour la synchronisation.</string>
<string name="gtasks_GLA_authenticating">Authentification en cours...</string>
<string name="gtasks_GLA_errorAuth">Erreur d\'authentification! Veuillez vérifier votre nom d\'utilisateur et votre mot de passe dans le gestionnaire de compte de votre téléphone</string>
<string name="gtasks_GLA_errorIOAuth">Erreur de communication avec les serveurs Google. Veuillez essayer plus tard.</string>
<string name="gtasks_GPr_header">Google Tasks (Bêta !)</string>
<string name="gtasks_error_accountNotFound">Le compte %s est introuvable--veuillez vous déconnecter puis vous reconnecter depuis les préférences Google Tasks.</string>
<string name="gtasks_error_authRefresh">Impossible de s\'authentifier avec Google Tasks. Veuillez vérifier votre mot de passe ou essayez plus tard.</string>
<string name="gtasks_error_accountManager">Une erreur est apparue dans le gestionnaire de comptes de votre téléphone. Veuillez vous deconnecter de votre compte Google Task puis vous reconnecter.</string>
<string name="gtasks_error_background_sync_auth">\"Erreur d\'authentification en arrière plan. Réessayez de vous synchroniser quand Tasks est lancé.\"</string>
<string name="locale_notification">Vous avez $NUM correspondant(s) : $FILTER</string>
<string name="premium_record_audio">Enregistrer un commentaire</string>
<string name="premium_remove_file_confirm">Êtes-vous certain(e)? Cette opération est irréversible</string>

@ -88,11 +88,8 @@
<string name="gtasks_GTA_clear_completed">Törlés befejezve</string>
<string name="gtasks_GLA_noaccounts">Nincs elérhető Google fiók a szinkronizáláshoz.</string>
<string name="gtasks_GLA_authenticating">Azonosítás...</string>
<string name="gtasks_GLA_errorAuth">Nem sikerült az azonosítás! Kérlek, ellenőrizd a felhasználóneved és a jelszavad a készüléked fiókkezelőjében</string>
<string name="gtasks_GLA_errorIOAuth">Sajnáljuk, de hiba történt a Google szervereival való kommunikálás során. Próbáld újra később.</string>
<string name="gtasks_error_accountNotFound">%s fiók nem található -- kérlek, jelentkezz ki, és vissza a Google Tasks beállításokban.</string>
<string name="gtasks_error_authRefresh">Nem sikerült a Google Tasks azonosítás. Kérlek, ellenőrizd a jelszavad vagy próbáld újra később.</string>
<string name="gtasks_error_accountManager">Hiba a készüléked fiókkezelőjében. Kérlek, jelentkezz ki és vissza a Google Tasks beállításokban.</string>
<string name="premium_record_audio">Jegyzet rögzítése</string>
<string name="audio_recording_title">Hang rögzítése</string>
<string-array name="TEA_reminder_random">

@ -227,13 +227,9 @@ Se visualizzi questo errore più volte, ti consigliamo di cancellare tutti i dat
<string name="gtasks_GTA_clear_completed">Elimina attività completate</string>
<string name="gtasks_GLA_noaccounts">Non è disponibile nessun Google account con cui sincronizzarsi.</string>
<string name="gtasks_GLA_authenticating">Autenticazione...</string>
<string name="gtasks_GLA_errorAuth">Errore di autenticazione! Per favore controlla i tuoi username e password nell\'account manager del tuo telefono.</string>
<string name="gtasks_GLA_errorIOAuth">Ci scusiamo per il disagio, abbiamo dei problemi a comunicare con i server di Google. Per favore riprovare più tardi.</string>
<string name="gtasks_GPr_header">Attività Google</string>
<string name="gtasks_error_accountNotFound">Account %s non trovato--per favore fai logout e di nuovo login dalla configurazione di Google Tasks.</string>
<string name="gtasks_error_authRefresh">Impossibile autenticarsi con Google Tasks. Per favore verifica la tua password o ritenta più tardi.</string>
<string name="gtasks_error_accountManager">Account non trovato--per favore fai logout e di nuovo login dalla configurazione di Google Tasks.</string>
<string name="gtasks_error_background_sync_auth">Errore di autenticazione in background. Per favore prova ad avviare una sincronizzazione durante l\'esecuzione di Tasks.</string>
<string name="locale_notification">Hai $NUM corrispondenti: $FILTER</string>
<string name="premium_record_audio">Registra una nota</string>
<string name="premium_remove_file_confirm">Se sicuro? Non può essere eseguito</string>

@ -206,13 +206,9 @@
<string name="gtasks_GTA_clear_completed">הסירי משימות שבוצעו</string>
<string name="gtasks_GLA_noaccounts">לא מצאתי חשבון גוגל לסנכרן איתו</string>
<string name="gtasks_GLA_authenticating">מאמתת...</string>
<string name="gtasks_GLA_errorAuth">האימות נכשל! אנא בדוק את שם המשתמש והסיסמא במנהל החשבונות של הטלפון שלך.</string>
<string name="gtasks_GLA_errorIOAuth">מצטערת, נתקלתי בבעיה בהתקשרות לשרתי גוגל. אנא נסה שוב מאוחר יותר.</string>
<string name="gtasks_GPr_header">״משימות גוגל״</string>
<string name="gtasks_error_accountNotFound">החשבון %s לא נמצא. אנא התנתק והתחבר שוב במסך הגדרות של ״משימות גוגל״.</string>
<string name="gtasks_error_authRefresh">איני מצליחה לאמת אותך מול ״משימות גוגל״. אנא בדוק את הסיסמא שהזנת, או נסה מאוחר יותר.</string>
<string name="gtasks_error_accountManager">מנהל החשבונות של הטלפון שלך נתקל בשגיאה. אנא התנתק והתחבר מתוך הגדרות ״משימות גוגל״.</string>
<string name="gtasks_error_background_sync_auth">האימות המתבצע ברקע נכשל. אנא נסה להתחיל את הסינכרון בזמן שאסטריד פועלת.</string>
<string name="locale_notification">יש לך $NUM המתאימים: $FILTER</string>
<string name="premium_record_audio">הקלד הערה</string>
<string name="premium_remove_file_confirm">בטוח? לא ניתן לבטל את הפעולה</string>

@ -231,13 +231,9 @@
<string name="gtasks_GTA_clear_completed">クリアが完了しました</string>
<string name="gtasks_GLA_noaccounts">同期するために有効な Google アカウントがありません.</string>
<string name="gtasks_GLA_authenticating">認証中...</string>
<string name="gtasks_GLA_errorAuth">認証エラー! 電話のアカウント管理でユーザー名とパスワードを確認してください</string>
<string name="gtasks_GLA_errorIOAuth">すみません、Googleのサーバとの通信で問題が発生しました。しばらくしてから再度やり直してください。</string>
<string name="gtasks_GPr_header">Google Tasks (ベータ版!)</string>
<string name="gtasks_error_accountNotFound">アカウント %s が見つかりません--ログアウトして再度 Google Tasks 設定にログインしてください.</string>
<string name="gtasks_error_authRefresh">Google Tasks で認証できません. アカウントのパスワードを確認するか後で再度実行してください.</string>
<string name="gtasks_error_accountManager">電話のアカウント管理にエラーがあります. ログアウトして再度 Google Tasks 設定にログインしてください.</string>
<string name="gtasks_error_background_sync_auth">バックグラウンドでの認証中にエラー. タスクの実行中に同期を開始してください.</string>
<string name="locale_notification">$FILTER の検索結果: $NUM 件</string>
<string name="premium_record_audio">注釈を記録</string>
<string name="premium_remove_file_confirm">よろしいですか? 取り消しできません</string>

@ -234,13 +234,9 @@ Tasks의 백업에서 당신의 일정을 복구하시기 바랍니다.
<string name="gtasks_GTA_clear_completed">삭제 완료</string>
<string name="gtasks_GLA_noaccounts">동기화 가능한 구글 계정이 없음</string>
<string name="gtasks_GLA_authenticating">인증 중...</string>
<string name="gtasks_GLA_errorAuth">인증 오류! 휴대폰 계정 관리자의 사용자명과 비밀번호를 확인해 주세요</string>
<string name="gtasks_GLA_errorIOAuth">죄송합니다, 구글 서버와 통신하는 데 문제가 있습니다. 잠시 후 다시 시도하세요.</string>
<string name="gtasks_GPr_header">구글 일정</string>
<string name="gtasks_error_accountNotFound">%s 계정을 찾을 수 없습니다 - 로그아웃하고 구글 일정 설정에서 다시 로그인해 보세요.</string>
<string name="gtasks_error_authRefresh">구글 일정으로 인증할 수 없습니다. 계정 비밀번호를 확인하거나 나중에 다시 시도해 보세요.</string>
<string name="gtasks_error_accountManager">휴대폰 계정 관리자에서 에러가 발생했습니다. 로그아웃 후 구글 일정 설정에서 다시 로그인 해 주세요.</string>
<string name="gtasks_error_background_sync_auth">백그라운드에서 인증 에러가 발생했습니다. Tasks가 실행중일 때 동기화를 시작해 보세요.</string>
<string name="locale_notification">$NUM 개의 일정이 일치합니다: $FILTER</string>
<string name="premium_record_audio">노트 기록</string>
<string name="premium_remove_file_confirm">정말입니까? 되돌릴 수 없습니다</string>

@ -228,13 +228,9 @@
<string name="gtasks_GTA_clear_completed">Verwijderen Voltooid</string>
<string name="gtasks_GLA_noaccounts">Geen Google account beschikbaar voor synchronisatie</string>
<string name="gtasks_GLA_authenticating">Verifiëren...</string>
<string name="gtasks_GLA_errorAuth">Authenticatiefout! Controleer je gebruikersnaam en wachtwoord in de accountinstellingen van je telefoon.</string>
<string name="gtasks_GLA_errorIOAuth">Sorry, we konden geen verbinding maken met de servers van Google. Probeer het later opnieuw.</string>
<string name="gtasks_GPr_header">Google Taken (Beta!)</string>
<string name="gtasks_error_accountNotFound">Account %s niet gevonden--probeer opnieuw in te loggen vanuit de instellingen van Google Taken.</string>
<string name="gtasks_error_authRefresh">Authenticatieprobleem bij Google Taken. Controleer je wachtwoord of probeer het later opnieuw.</string>
<string name="gtasks_error_accountManager">Error in uw telefoon account manager. Log uit en log opnieuw in vanuit de Google Task instellingen.</string>
<string name="gtasks_error_background_sync_auth">Error authenticatie op achtergrond bezig. Probeer alstublieft een synchronisatie te starten wanneer Tasks is gestart.</string>
<string name="locale_notification">Er zijn $NUM taken voor: $FILTER</string>
<string name="premium_record_audio">Een notitie opnemen</string>
<string name="premium_remove_file_confirm">Weet je het zeker? Dit kan niet ongedaan gemaakt worden</string>

@ -209,13 +209,9 @@ i odzyskanie zadań z kopi zapasowej (Settings-&gt;Sync and backup-&gt;Backup-&g
<string name="gtasks_GTA_clear_completed">Wyczyść zakończone</string>
<string name="gtasks_GLA_noaccounts">Brak dostępnych kont Google do synchronizacji.</string>
<string name="gtasks_GLA_authenticating">Uwierzytelnianie...</string>
<string name="gtasks_GLA_errorAuth">Błąd uwierzytelnienia! Proszę sprawdzić nazwę użytkownika i hasło w menadżerze kont swojego telefonu.</string>
<string name="gtasks_GLA_errorIOAuth">Przepraszamy, mieliśmy problem z porozumieniem się z serwerami Google. Prosimy spróbować ponownie.</string>
<string name="gtasks_GPr_header">Zadania Google</string>
<string name="gtasks_error_accountNotFound">Nie znaleziono konta %s --proszę wyloguj się i zaloguj ponownie w ustawieniach Google Zadań.</string>
<string name="gtasks_error_authRefresh">Uwierzytelnienie w Google Zadania nieudane. Proszę, sprawdź poprawność swego hasła lub spróbuj ponownie później.</string>
<string name="gtasks_error_accountManager">Błąd w menadżerze kont Twojego telefonu. Proszę, wyloguj się i zaloguj ponownie w ustawieniach Google Zadań.</string>
<string name="gtasks_error_background_sync_auth">Błąd uwierzytelniania w tle. Spróbuj zainicjalizować synchronizację, gdy aplikacja Tasks będzie włączone.</string>
<string name="locale_notification">Masz $NUM pasujących: $FILTER</string>
<string name="premium_record_audio">Nagraj notatkę</string>
<string name="premium_remove_file_confirm">Jesteś pewny? Tych zmian nie można odwrócić</string>

@ -205,13 +205,9 @@
<string name="gtasks_GTA_clear_completed">Limpeza concluída</string>
<string name="gtasks_GLA_noaccounts">Google não está disponível para sincronização com contas.</string>
<string name="gtasks_GLA_authenticating">Autenticando ...</string>
<string name="gtasks_GLA_errorAuth">Falha na autenticação! Verifique o usuário e senha no gerenciado de contas do dispositivo</string>
<string name="gtasks_GLA_errorIOAuth">Desculpe-nos, tivemos problemas de comunicação com os servidores do Google. Tente mais tarde.</string>
<string name="gtasks_GPr_header">Google Tarefas</string>
<string name="gtasks_error_accountNotFound">Conta %s não encontrada--Desconecte-se e conecte-se novamente pelo painel Google Tasks</string>
<string name="gtasks_error_authRefresh">Incapaz de autenticar no Google Tasks. Verifique seu usuário e senha ou tente novamente.</string>
<string name="gtasks_error_accountManager">Erro no gerenciado de contas do dispositivo. Desconecte-se e conecte-se novamente pelo painel Google Tasks</string>
<string name="gtasks_error_background_sync_auth">Erro ao autenticar em plano de fundo. Por favor tente iniciar a sincronização enquanto o Tasks estiver rodando.</string>
<string name="locale_notification">Você tem $NUM resultados: $FILTER</string>
<string name="premium_record_audio">Gravar uma nota</string>
<string name="premium_remove_file_confirm">Você tem certeza? Não pode ser desfeito</string>

@ -225,13 +225,9 @@ das tarefas através de um backup em Definições-&gt;Sincronização e backup-&
<string name="gtasks_GTA_clear_completed">Remoção terminada</string>
<string name="gtasks_GLA_noaccounts">Não possui qualquer conta Google para sincronização.</string>
<string name="gtasks_GLA_authenticating">Autenticação...</string>
<string name="gtasks_GLA_errorAuth">Erro ao autenticar! Verifique o seu nome de utilizador e senha no gestor de contas do seu dispositivo.</string>
<string name="gtasks_GLA_errorIOAuth">Ocorreu um erro ao comunicar com os servidores Google. Tente mais tarde.</string>
<string name="gtasks_GPr_header">Tarefas Google</string>
<string name="gtasks_error_accountNotFound">Conta %s não encontrada. Termine a sessão e inicie-a novamente nas definições das tarefas Google.</string>
<string name="gtasks_error_authRefresh">Não foi possível a autenticação nas tarefas Google. Verifique a senha da sua conta e tente novamente.</string>
<string name="gtasks_error_accountManager">Erro no gestor de contas do dispositivo. Termine a sessão e inicie-a novamente nas definições das tarefas Google.</string>
<string name="gtasks_error_background_sync_auth">Erro de autenticação em segundo plano. Tente efetuar a sincronização durante a execução do Tasks.</string>
<string name="locale_notification">Tem $NUM ocorrências para: $FILTER</string>
<string name="premium_record_audio">Gravar uma nota</string>
<string name="premium_remove_file_confirm">Tem a certeza? A ação não pode ser anulada!</string>

@ -231,12 +231,8 @@
<string name="gtasks_GTA_clear_completed">Очистить завершенные</string>
<string name="gtasks_GLA_noaccounts">Нет доступных аккаунтов Google для синхронизации</string>
<string name="gtasks_GLA_authenticating">Авторизация...</string>
<string name="gtasks_GLA_errorAuth">Ошибка аутентификации! Пожалуйста, проверьте имя пользователя и пароль в меню управления учетных записей телефона</string>
<string name="gtasks_GLA_errorIOAuth">При обращении к серверам Google возникли проблемы. Пожалуйста, попробуйте позже.</string>
<string name="gtasks_error_accountNotFound">Учетная запись %s не найдена--пожалуйста, выйдите и войдите снова через настройки Google Tasks.</string>
<string name="gtasks_error_authRefresh">Не удалось авторизоваться в Google Tasks. Пожалуйста, проверьте пароль к учетной записи или повторите вашу попытку позже.</string>
<string name="gtasks_error_accountManager">Ошибка в менеджере учетных записей вашего телефона. Пожалуйста, выйдите и войдите снова в настройках Google Tasks.</string>
<string name="gtasks_error_background_sync_auth">Ошибка фоновой авторизации. Пожалуйста, попробуйте синхронизироваться вручную.</string>
<string name="locale_notification">Число соответствий для $FILTER: $NUM</string>
<string name="premium_record_audio">Записать заметку</string>
<string name="premium_remove_file_confirm">Вы уверены? Это действия нельзя отменить.</string>

@ -217,13 +217,9 @@
<string name="gtasks_GTA_clear_completed">Vymazať dokončené</string>
<string name="gtasks_GLA_noaccounts">Nieje k dispozícii synchronizácia Google účtu.</string>
<string name="gtasks_GLA_authenticating">Overovanie...</string>
<string name="gtasks_GLA_errorAuth">Chyba pri overovaní! Prosím, skontroluj meno používateľa a heslo v tvojom mobilnom manažéri účtov.</string>
<string name="gtasks_GLA_errorIOAuth">Prepáč, nastal problém v komunikácii s Google serverom. Prosím, skús to znovu neskôr.</string>
<string name="gtasks_GPr_header">Úlohy Google</string>
<string name="gtasks_error_accountNotFound">Účet %s sa nenašiel--prosím, odhlás sa a znovu prihlás v nastaveniach Úlohy Google.</string>
<string name="gtasks_error_authRefresh">Nedajú sa overiť Úlohy Google. Prosím, skontroluj si heslo účtu, alebo to skús znovu neskôr.</string>
<string name="gtasks_error_accountManager">Chyba v tvojom mobilnom správcovi účtov. Prosím odhlás sa a znovu prihlás späť z Google Tasks nastavení.</string>
<string name="gtasks_error_background_sync_auth">Chyba pri overení pravosti na pozadí. Prosím, skús spustiť synchronizáciu kým je zapnutý Tasks.</string>
<string name="locale_notification">Máš $NUM so značkou $FILTER</string>
<string name="premium_record_audio">Nahrať poznámku</string>
<string name="premium_remove_file_confirm">Naozaj? Nedá sa vrátiť</string>

@ -209,13 +209,9 @@
<string name="gtasks_GTA_clear_completed">Zbriši dokončano</string>
<string name="gtasks_GLA_noaccounts">Ne morem se uskladiti z neobstoječimi Google računi.</string>
<string name="gtasks_GLA_authenticating">Avtentikacija v teku ...</string>
<string name="gtasks_GLA_errorAuth">Napaka pri avtentikaciji! Prosimo preverite svoje uporabniško ime in geslo</string>
<string name="gtasks_GLA_errorIOAuth">Žal smo imeli težave pri povezovanju z Google strežniki. Prosimo, poskusite ponovno kasneje.</string>
<string name="gtasks_GPr_header">Google Naloge</string>
<string name="gtasks_error_accountNotFound">Račun %s ni najden--prosimo odjavite se, nato pa ponovno prijavite skozi nastavitve Google Nalog.</string>
<string name="gtasks_error_authRefresh">Avtentikacija v Google Naloge ni uspela. Prosimo, preverite geslo svojega računa in poskusite ponovno kasneje.</string>
<string name="gtasks_error_accountManager">Napaka pri upravitelju računov na vašem telefonu. Prosimo, odjavite se, nato pa ponovno prijavite skozi nastavitve Google Nalog.</string>
<string name="gtasks_error_background_sync_auth">Napaka pri overjanju v ozadju. Prosimo, poskusite začeti z usklajevanjem med delovanjem aplikacije Opravki.</string>
<string name="locale_notification">$NUM jih ustreza: $FILTER</string>
<string name="premium_record_audio">Posnemi opombo</string>
<string name="premium_remove_file_confirm">Ste prepričani? Tega ni mogoče razveljaviti</string>

@ -203,13 +203,9 @@ och återställer dina aktuella uppgifter från en backup
<string name="gtasks_GTA_clear_completed">Rensa bort färdiga</string>
<string name="gtasks_GLA_noaccounts">Inga tillgängliga Googlekonton att synkronisera med.</string>
<string name="gtasks_GLA_authenticating">Autentiserar...</string>
<string name="gtasks_GLA_errorAuth">Autentisering misslyckad! Kontrollera ditt användarnamn och lösenord i kontoinställningarna i din telefon</string>
<string name="gtasks_GLA_errorIOAuth">Vi hade problem med förbindelsen till Googles servrar. Försök igen senare.</string>
<string name="gtasks_GPr_header">Google Uppgifter</string>
<string name="gtasks_error_accountNotFound">Kontot %s kunde inte hittas. Logga ut och in på nytt i inställningarna för Google Uppgifter.</string>
<string name="gtasks_error_authRefresh">Kunde inte autentisera med Google Uppgifter. Kontrollera ditt lösenord och försök igen.</string>
<string name="gtasks_error_accountManager">Fel i din telefons kontohantering. Logga ut och in på nytt i inställningarna för Google Uppgifter.</string>
<string name="gtasks_error_background_sync_auth">Autentisering i bakgrunden misslyckades. Vänligen försök starta en synkronisering medan Tasks körs.</string>
<string name="locale_notification">Du har $NUM som matchar: $FILTER</string>
<string name="premium_record_audio">Spela in en anteckning</string>
<string name="premium_remove_file_confirm">Är du säker? Detta kan inte ångras</string>

@ -184,13 +184,9 @@
<string name="gtasks_GTA_clear_completed">Tamamlanları Temizle</string>
<string name="gtasks_GLA_noaccounts">Eşleştirilecek Google hesabı mevcut değil.</string>
<string name="gtasks_GLA_authenticating">Kimlik doğrulanıyor...</string>
<string name="gtasks_GLA_errorAuth">Giriş başarısız! Lütfen kullanıcı ismi ve parolanızı telefondaki hesap yöneticisinden denetleyin</string>
<string name="gtasks_GLA_errorIOAuth">Üzgünüm, Google sunucuları ile bağlanmakta sıkıntı yaşıyoruz. Lütfen daha sonra yeniden deneyin.</string>
<string name="gtasks_GPr_header">Google Görevleri (Beta!)</string>
<string name="gtasks_error_accountNotFound">%s hesabı bulunamadı--lütfen çıkış yapıp Google Görev ayarlarından tekrar giriş yapın.</string>
<string name="gtasks_error_authRefresh">Google Görevlere giriş başarısız. Lütfen hesap parolanızı kontrol edip tekrar deneyin.</string>
<string name="gtasks_error_accountManager">Telefon hesap yöneticisinde hata oluştu. Lütfen çıkış yapıp Google Görevler Ayarlarından tekrar giriş yapın.</string>
<string name="gtasks_error_background_sync_auth">Artalanda kimlik doğrulama hatası. Lütfen Tasks çalışırken bir eşlemeyi sıfırlamayı deneyin.</string>
<string name="locale_notification">$FILTER konumunda $NUM var</string>
<string name="premium_record_audio">Bir not kaydet</string>
<string name="premium_remove_file_confirm">Emin misiniz? Geri döndürülemez</string>

@ -214,12 +214,8 @@
<string name="gtasks_GTA_clear_completed">Очистити завершені</string>
<string name="gtasks_GLA_noaccounts">Немає облікового запису Google для синхронізації.</string>
<string name="gtasks_GLA_authenticating">Автентифікація...</string>
<string name="gtasks_GLA_errorAuth">Помилка аутентифікації! Будь ласка, перевірте ім\'я користувача і пароль в меню управління акаунтами телефону</string>
<string name="gtasks_GLA_errorIOAuth">Вибачте, проблеми при зверненні до серверів Google. Будь ласка, спробуйте пізніше.</string>
<string name="gtasks_error_accountNotFound">Аккаунт %s не знайдено - будь ласка, вийдіть і увійдіть знову через налаштування Google Tasks.</string>
<string name="gtasks_error_authRefresh">Не вдалося пройти аутентифікацію в Google Tasks. Будь ласка, перевірте пароль до облікового запису або спробуйте ще раз пізніше.</string>
<string name="gtasks_error_accountManager">Помилка в менеджері акаунтів вашого телефону, ласка вийдіть і увійдіть знову в налаштуваннях Google Tasks</string>
<string name="gtasks_error_background_sync_auth">Не вдалося пройти аутентифікацію у фоні. Будь ласка, попробуйте при запущеному Tasks.</string>
<string name="locale_notification">Число відповідностей $FILTER: $NUM</string>
<string name="premium_record_audio">Записати замітку</string>
<string name="premium_remove_file_confirm">Ви впевнені? Це не може бути скасовано.</string>

@ -164,12 +164,8 @@
<string name="gtasks_GTA_clear_completed">清除已完成项</string>
<string name="gtasks_GLA_noaccounts">没有可用的Google帐户同步。</string>
<string name="gtasks_GLA_authenticating">正在认证...</string>
<string name="gtasks_GLA_errorAuth">验证出错!请在您手机的帐户管理器中检查您的用户名和密码</string>
<string name="gtasks_GLA_errorIOAuth">对不起,我们在与 Google 服务器通讯时遇到了问题。请稍后再尝试。</string>
<string name="gtasks_error_accountNotFound">找不到帐户 %s——请退出然后从 Google Tasks设置中重新登录。</string>
<string name="gtasks_error_authRefresh">无法用 Google Tasks验证。请检查您的帐户密码或者稍后再尝试。</string>
<string name="gtasks_error_accountManager">您手机的帐户管理器出错了。请退出,然后从 Google Tasks设置中重新登录。</string>
<string name="gtasks_error_background_sync_auth">后台验证出错了。请在清单小助理运行时尝试启动同步。</string>
<string name="locale_notification">您有 $NUM 符合: $FILTER</string>
<string name="premium_record_audio">录制一条便笺</string>
<string name="premium_remove_file_confirm">您确定吗?无法恢复的喔</string>

@ -194,13 +194,9 @@
<string name="gtasks_GTA_clear_completed">清除已完成項</string>
<string name="gtasks_GLA_noaccounts">沒有可用的Google帳戶同步。</string>
<string name="gtasks_GLA_authenticating">正在認證...</string>
<string name="gtasks_GLA_errorAuth">驗證出錯!請在您手機的帳戶管理器中檢查您的用戶名和密碼</string>
<string name="gtasks_GLA_errorIOAuth">對不起我們在與Google 服務器通訊時遇到了問題。請稍後再嘗試。</string>
<string name="gtasks_GPr_header">Google Tasks (測試中!)</string>
<string name="gtasks_error_accountNotFound">找不到帳戶%s——請退出然後從Google 工作表設置中重新登錄。</string>
<string name="gtasks_error_authRefresh">無法用Google 工作表驗證。請檢查您的帳戶密碼或者稍後再嘗試。</string>
<string name="gtasks_error_accountManager">您手機的帳戶管理器出錯了。請退出然後從Google 工作表設置中重新登陸。</string>
<string name="gtasks_error_background_sync_auth">後台驗證出錯了。請在Tasks 運行時嘗試啟動同步。</string>
<string name="locale_notification">您有 $NUM 符合: $FILTER</string>
<string name="premium_record_audio">錄製一條便箋</string>
<string name="premium_remove_file_confirm">您確定嗎?無法恢復的喔</string>

@ -4,7 +4,7 @@
<bool name="at_most_honeycomb">true</bool>
<bool name="at_least_honeycomb_mr1">false</bool>
<bool name="billing_enabled">false</bool>
<bool name="sync_enabled">true</bool>
<bool name="sync_enabled">false</bool>
<bool name="location_enabled">false</bool>
<bool name="tasker_available">false</bool>
</resources>

@ -34,10 +34,7 @@
<!-- Error Message when fields aren't filled out -->
<!-- Error Message when we receive a HTTP 401 Unauthorized -->
<string name="gtasks_GLA_errorAuth">Error authenticating! Please check your username and password in your phone\'s account manager</string>
<!-- Error Message when we receive an IO Exception -->
<!-- Error Message when we receive an IO Exception -->
<string name="gtasks_GLA_errorIOAuth">Sorry, we had trouble communicating with Google servers. Please try again later.</string>
<!-- ============================================== GtasksPreferences == -->
@ -50,13 +47,4 @@
<!-- Error for account not found -->
<string name="gtasks_error_accountNotFound">Account %s not found--please log out and log back in from the Google Tasks settings.</string>
<!-- Error when ping after refreshing token fails -->
<string name="gtasks_error_authRefresh">Unable to authenticate with Google Tasks. Please check your account password or try again later.</string>
<!-- Error when account manager returns no auth token or throws exception -->
<string name="gtasks_error_accountManager">Error in your phone\'s account manager. Please log out and log back in from the Google Tasks settings.</string>
<!-- Error when authorization error happens in background sync -->
<string name="gtasks_error_background_sync_auth">Error authenticating in background. Please try initiating a sync while Tasks is running.</string>
</resources>

Loading…
Cancel
Save