Add account selection dialog

pull/324/merge
Alex Baker 9 years ago
parent 2969214b37
commit 37ea42b356

@ -358,10 +358,6 @@
</receiver>
<!-- actfm -->
<activity
android:name="com.todoroo.astrid.actfm.ActFmGoogleAuthActivity"
android:theme="@style/Tasks"
android:configChanges="orientation|keyboardHidden" />
<activity
android:name="com.todoroo.astrid.actfm.TagSettingsActivity"
@ -374,8 +370,7 @@
<!-- gtasks -->
<activity
android:name="com.todoroo.astrid.gtasks.auth.GtasksLoginActivity"
android:theme="@style/Tasks"
android:configChanges="orientation|keyboardHidden" />
android:theme="@style/TranslucentDialog" />
<activity
android:name="com.todoroo.astrid.gtasks.GtasksPreferences"

@ -1,183 +0,0 @@
/**
* Copyright (c) 2012 Todoroo Inc
*
* See the file "LICENSE" for the full license governing this code.
*/
package com.todoroo.astrid.actfm;
import android.accounts.Account;
import android.accounts.AccountManager;
import android.accounts.AccountManagerCallback;
import android.accounts.AccountManagerFuture;
import android.app.ListActivity;
import android.app.ProgressDialog;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.Window;
import android.widget.ArrayAdapter;
import android.widget.ListView;
import android.widget.TextView;
import android.widget.Toast;
import com.google.api.client.googleapis.extensions.android.accounts.GoogleAccountManager;
import com.todoroo.andlib.utility.DialogUtilities;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.tasks.R;
import org.tasks.dialogs.DialogBuilder;
import org.tasks.injection.InjectingListActivity;
import java.io.IOException;
import java.util.ArrayList;
import java.util.concurrent.TimeUnit;
import javax.inject.Inject;
/**
* This activity allows users to sign in or log in to Google Tasks
* through the Android account manager
*
* @author Sam Bosley
*
*/
public class ActFmGoogleAuthActivity extends InjectingListActivity {
private static final Logger log = LoggerFactory.getLogger(ActFmGoogleAuthActivity.class);
public static final String AUTH_TOKEN_TYPE = "oauth2:https://www.googleapis.com/auth/userinfo.profile"; //$NON-NLS-1$
public static final String RESULT_EMAIL = "email"; //$NON-NLS-1$
public static final String RESULT_TOKEN = "token"; //$NON-NLS-1$
// --- ui initialization
private GoogleAccountManager accountManager;
private String[] nameArray;
private String authToken;
private String accountName;
private boolean onSuccess = false;
private boolean dismissDialog = false;
@Inject DialogBuilder dialogBuilder;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
requestWindowFeature(Window.FEATURE_NO_TITLE);
setContentView(R.layout.gtasks_login_activity);
TextView header = new TextView(this);
header.setText(R.string.actfm_GAA_title);
header.setTextAppearance(this, R.style.TextAppearance_Medium);
header.setPadding(10, 0, 10, 50);
getListView().addHeaderView(header);
accountManager = new GoogleAccountManager(this);
Account[] accounts = accountManager.getAccounts();
ArrayList<String> accountNames = new ArrayList<>();
for (Account a : accounts) {
accountNames.add(a.name);
}
nameArray = accountNames.toArray(new String[accountNames.size()]);
setListAdapter(new ArrayAdapter<>(this, android.R.layout.simple_list_item_1, nameArray));
findViewById(R.id.empty_button).setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
onAuthCancel();
}
});
}
@Override
protected void onListItemClick(ListView l, View v, int position, long id) {
super.onListItemClick(l, v, position, id);
int offsetPosition = position - 1; // Subtract 1 because apparently android counts the header view as part of the adapter.
if (offsetPosition >= 0 && offsetPosition < nameArray.length) {
final ProgressDialog pd = dialogBuilder.newProgressDialog(R.string.gtasks_GLA_authenticating);
pd.show();
final Account a = accountManager.getAccountByName(nameArray[position - 1]);
accountName = a.name;
getAuthToken(a, pd);
}
}
private void getAuthToken(final Account a, final ProgressDialog pd) {
AccountManagerCallback<Bundle> callback = 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(AccountManager.KEY_AUTHTOKEN)) {
authToken = bundle.getString(AccountManager.KEY_AUTHTOKEN);
if (!onSuccess) {
accountManager.getAccountManager().invalidateAuthToken(AUTH_TOKEN_TYPE, authToken);
getAuthToken(a, pd);
onSuccess = true;
} else {
onAuthTokenSuccess();
dismissDialog = true;
}
} else {
dismissDialog = true;
}
} catch (final Exception e) {
log.error(e.getMessage(), e);
runOnUiThread(new Runnable() {
@Override
public void run() {
int error = e instanceof IOException ? R.string.gtasks_GLA_errorIOAuth :
R.string.gtasks_GLA_errorAuth;
Toast.makeText(ActFmGoogleAuthActivity.this,
error,
Toast.LENGTH_LONG).show();
}
});
} finally {
if (dismissDialog) {
DialogUtilities.dismissDialog(ActFmGoogleAuthActivity.this, pd);
}
}
}
}.start();
}
};
accountManager.getAccountManager().getAuthToken(a, AUTH_TOKEN_TYPE, null, this, callback, null);
}
private void onAuthCancel() {
setResult(RESULT_CANCELED);
finish();
}
private void onAuthTokenSuccess() {
Intent data = new Intent();
data.putExtra(RESULT_EMAIL, accountName);
data.putExtra(RESULT_TOKEN, authToken);
setResult(RESULT_OK, data);
finish();
}
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){
final ProgressDialog pd = dialogBuilder.newProgressDialog(R.string.gtasks_GLA_authenticating);
pd.show();
final Account a = accountManager.getAccountByName(accountName);
getAuthToken(a, pd);
} else {
onAuthCancel();
}
}
}

@ -5,42 +5,23 @@
*/
package com.todoroo.astrid.gtasks.auth;
import android.accounts.Account;
import android.accounts.AccountManager;
import android.accounts.AccountManagerCallback;
import android.accounts.AccountManagerFuture;
import android.app.ProgressDialog;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.Window;
import android.widget.ArrayAdapter;
import android.widget.ListView;
import android.widget.TextView;
import android.support.v4.app.FragmentManager;
import android.widget.Toast;
import com.google.api.client.googleapis.extensions.android.accounts.GoogleAccountManager;
import com.google.common.base.Predicate;
import com.todoroo.andlib.utility.DialogUtilities;
import com.todoroo.astrid.gtasks.GtasksPreferenceService;
import com.todoroo.astrid.gtasks.api.GtasksInvoker;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.tasks.AccountManager;
import org.tasks.R;
import org.tasks.dialogs.AccountSelectionDialog;
import org.tasks.dialogs.DialogBuilder;
import org.tasks.injection.InjectingListActivity;
import java.io.IOException;
import java.util.ArrayList;
import java.util.concurrent.TimeUnit;
import org.tasks.injection.InjectingAppCompatActivity;
import javax.inject.Inject;
import static com.google.common.collect.Iterables.tryFind;
import static com.google.common.collect.Lists.newArrayList;
/**
* This activity allows users to sign in or log in to Google Tasks
* through the Android account manager
@ -48,125 +29,66 @@ import static com.google.common.collect.Lists.newArrayList;
* @author Sam Bosley
*
*/
public class GtasksLoginActivity extends InjectingListActivity {
public class GtasksLoginActivity extends InjectingAppCompatActivity implements AccountSelectionDialog.AccountSelectionHandler {
private static final Logger log = LoggerFactory.getLogger(GtasksLoginActivity.class);
private static final String FRAG_TAG_ACCOUNT_SELECTION_DIALOG = "frag_tag_account_selection_dialog";
@Inject GtasksPreferenceService gtasksPreferenceService;
@Inject DialogBuilder dialogBuilder;
@Inject AccountManager accountManager;
private GoogleAccountManager accountManager;
private String[] nameArray;
private String authToken;
private String accountName;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
accountManager = new GoogleAccountManager(this);
Account[] accounts = accountManager.getAccounts();
final String existingUsername = gtasksPreferenceService.getUserName();
if (existingUsername != null) {
Account account = tryFind(newArrayList(accounts), new Predicate<Account>() {
@Override
public boolean apply(Account account) {
return existingUsername.equals(account.name);
}
}).orNull();
if (account != null) {
getAuthToken(account);
return;
}
}
requestWindowFeature(Window.FEATURE_NO_TITLE);
setContentView(R.layout.gtasks_login_activity);
TextView header = new TextView(this);
header.setText(R.string.actfm_GAA_title);
header.setTextAppearance(this, R.style.TextAppearance_Medium);
header.setPadding(10, 0, 10, 50);
getListView().addHeaderView(header);
ArrayList<String> accountNames = new ArrayList<>();
for (Account a : accounts) {
accountNames.add(a.name);
}
nameArray = accountNames.toArray(new String[accountNames.size()]);
setListAdapter(new ArrayAdapter<>(this, android.R.layout.simple_list_item_1, nameArray));
findViewById(R.id.empty_button).setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
onAuthCancel();
if (existingUsername != null && accountManager.hasAccount(existingUsername)) {
getAuthToken(existingUsername);
} else if (accountManager.isEmpty()) {
Toast.makeText(this, R.string.gtasks_GLA_noaccounts, Toast.LENGTH_LONG).show();
finish();
} else {
FragmentManager supportFragmentManager = getSupportFragmentManager();
AccountSelectionDialog fragmentByTag = (AccountSelectionDialog) supportFragmentManager.findFragmentByTag(FRAG_TAG_ACCOUNT_SELECTION_DIALOG);
if (fragmentByTag == null) {
fragmentByTag = new AccountSelectionDialog();
fragmentByTag.show(supportFragmentManager, FRAG_TAG_ACCOUNT_SELECTION_DIALOG);
}
});
}
@Override
protected void onListItemClick(ListView l, View v, int position, long id) {
super.onListItemClick(l, v, position, id);
int offsetPosition = position - 1; // Subtract 1 because apparently android counts the header view as part of the adapter.
if (offsetPosition >= 0 && offsetPosition < nameArray.length) {
getAuthToken(accountManager.getAccountByName(nameArray[offsetPosition]));
fragmentByTag.setAccountSelectionHandler(this);
}
}
private void getAuthToken(Account account) {
private void getAuthToken(String account) {
final ProgressDialog pd = dialogBuilder.newProgressDialog(R.string.gtasks_GLA_authenticating);
pd.show();
accountName = account.name;
accountName = account;
getAuthToken(account, pd);
}
private void getAuthToken(Account a, final ProgressDialog pd) {
AccountManagerCallback<Bundle> callback = new AccountManagerCallback<Bundle>() {
private void getAuthToken(String a, final ProgressDialog pd) {
accountManager.getAuthToken(a, new AccountManager.AuthResultHandler() {
@Override
public void run(final AccountManagerFuture<Bundle> future) {
new Thread() {
public void authenticationSuccessful(String accountName, String authToken) {
gtasksPreferenceService.setToken(authToken);
gtasksPreferenceService.setUserName(accountName);
setResult(RESULT_OK);
finish();
DialogUtilities.dismissDialog(GtasksLoginActivity.this, pd);
}
@Override
public void authenticationFailed(final String message) {
runOnUiThread(new Runnable() {
@Override
public void run() {
try {
Bundle bundle = future.getResult(30, TimeUnit.SECONDS);
if (bundle.containsKey(AccountManager.KEY_AUTHTOKEN)) {
authToken = bundle.getString(AccountManager.KEY_AUTHTOKEN);
onAuthTokenSuccess();
}
} catch (final Exception e) {
log.error(e.getMessage(), e);
runOnUiThread(new Runnable() {
@Override
public void run() {
int error = e instanceof IOException ? R.string.gtasks_GLA_errorIOAuth :
R.string.gtasks_GLA_errorAuth;
Toast.makeText(GtasksLoginActivity.this,
error,
Toast.LENGTH_LONG).show();
}
});
} finally {
DialogUtilities.dismissDialog(GtasksLoginActivity.this, pd);
}
Toast.makeText(GtasksLoginActivity.this, message, Toast.LENGTH_LONG).show();
}
}.start();
});
DialogUtilities.dismissDialog(GtasksLoginActivity.this, pd);
}
};
accountManager.getAccountManager().getAuthToken(a, GtasksInvoker.AUTH_TOKEN_TYPE, null, this, callback, null);
}
private void onAuthCancel() {
setResult(RESULT_CANCELED);
finish();
}
private void onAuthTokenSuccess() {
gtasksPreferenceService.setToken(authToken);
gtasksPreferenceService.setUserName(accountName);
setResult(RESULT_OK);
finish();
});
}
private static final int REQUEST_AUTHENTICATE = 0;
@ -177,12 +99,20 @@ public class GtasksLoginActivity extends InjectingListActivity {
if(requestCode == REQUEST_AUTHENTICATE && resultCode == RESULT_OK){
final ProgressDialog pd = dialogBuilder.newProgressDialog(R.string.gtasks_GLA_authenticating);
pd.show();
final Account a = accountManager.getAccountByName(accountName);
getAuthToken(a, pd);
getAuthToken(accountName, pd);
} else {
//User didn't give permission--cancel
onAuthCancel();
onCancel();
}
}
@Override
public void accountSelected(String account) {
getAuthToken(account);
}
@Override
public void onCancel() {
finish();
}
}

@ -0,0 +1,110 @@
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();
}
}

@ -0,0 +1,66 @@
package org.tasks.dialogs;
import android.app.Dialog;
import android.content.DialogInterface;
import android.os.Bundle;
import android.support.annotation.NonNull;
import org.tasks.AccountManager;
import org.tasks.R;
import org.tasks.injection.InjectingDialogFragment;
import java.util.List;
import javax.inject.Inject;
public class AccountSelectionDialog extends InjectingDialogFragment {
private AccountSelectionHandler handler;
public interface AccountSelectionHandler {
void accountSelected(String account);
void onCancel();
}
@Inject DialogBuilder dialogBuilder;
@Inject AccountManager accountManager;
@NonNull
@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
final List<String> accounts = accountManager.getAccounts();
return dialogBuilder.newDialog()
.setTitle(R.string.choose_google_account)
.setItems(accounts.toArray(new String[accounts.size()]), new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
handler.accountSelected(accounts.get(which));
dialog.dismiss();
}
})
.setNegativeButton(android.R.string.cancel, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
if (handler != null) {
handler.onCancel();
}
}
})
.show();
}
public void setAccountSelectionHandler(AccountSelectionHandler handler) {
this.handler = handler;
}
@Override
public void onCancel(DialogInterface dialog) {
super.onCancel(dialog);
if (handler != null) {
handler.onCancel();
}
}
}

@ -2,7 +2,6 @@ package org.tasks.injection;
import android.app.Activity;
import com.todoroo.astrid.actfm.ActFmGoogleAuthActivity;
import com.todoroo.astrid.actfm.FilterSettingsActivity;
import com.todoroo.astrid.actfm.TagSettingsActivity;
import com.todoroo.astrid.activity.BeastModePreferences;
@ -24,7 +23,6 @@ import com.todoroo.astrid.service.UpgradeService;
import com.todoroo.astrid.widget.WidgetConfigActivity;
import org.tasks.activities.CalendarSelectionActivity;
import org.tasks.activities.CalendarSelectionDialog;
import org.tasks.activities.ClearAllDataActivity;
import org.tasks.activities.ClearGtaskDataActivity;
import org.tasks.activities.DeleteAllCalendarEventsActivity;
@ -97,7 +95,6 @@ import dagger.Provides;
FilterSelectionActivity.class,
FileExplore.class,
DonationActivity.class,
ActFmGoogleAuthActivity.class,
UpgradeService.UpgradeActivity.class,
CalendarSelectionActivity.class
})

@ -5,6 +5,7 @@ import android.support.v4.app.DialogFragment;
import android.support.v4.app.FragmentActivity;
import org.tasks.activities.CalendarSelectionDialog;
import org.tasks.dialogs.AccountSelectionDialog;
import org.tasks.dialogs.LocationPickerDialog;
import org.tasks.reminders.MissedCallDialog;
import org.tasks.reminders.NotificationDialog;
@ -19,7 +20,8 @@ import dagger.Provides;
NotificationDialog.class,
SnoozeDialog.class,
MissedCallDialog.class,
CalendarSelectionDialog.class
CalendarSelectionDialog.class,
AccountSelectionDialog.class
},
library = true)
public class DialogFragmentModule {

@ -1,39 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<!--
** Copyright (c) 2012 Todoroo Inc
**
** See the file "LICENSE" for the full license governing this code.
-->
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:background="?attr/asContentBackground">
<ListView android:id="@android:id/list"
android:layout_width="fill_parent"
android:layout_height="fill_parent"/>
<LinearLayout android:id="@android:id/empty"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:paddingLeft="20dip"
android:paddingRight="20dip"
android:gravity="center"
android:orientation="vertical">
<TextView
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="@string/gtasks_GLA_noaccounts"
android:textSize="20sp"
android:gravity="center" />
<Button android:id="@+id/empty_button"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_marginTop="50dip"
android:text="@android:string/ok" />
</LinearLayout>
</FrameLayout>

@ -9,7 +9,6 @@
<string name="actfm_picture_gallery">اختار من المعرض</string>
<string name="actfm_picture_clear">مسح الصورة</string>
<string name="TVA_add_comment">إضافة تعليق ...</string>
<string name="actfm_GAA_title">اختر حساب قوقل المراد استخدامة</string>
<string name="backup_BPr_header">النسخ الإحتياطي</string>
<string name="backup_BAc_import">إستيراد مهام</string>
<string name="export_toast_no_tasks">لا يوجد مهام للتصدير.</string>

@ -12,7 +12,6 @@
<string name="name">Име</string>
<string name="enter_tag_name">Въведете име на тага</string>
<string name="enter_filter_name">Въведете име на филтъра</string>
<string name="actfm_GAA_title">Изберете Google акаунт, който искате да използвате:</string>
<string name="backup_BPr_header">Резервни копия</string>
<string name="backup_BAc_import">Импортиране на задачи</string>
<string name="backup_BAc_export">Експортиране на задачи</string>

@ -9,7 +9,6 @@
<string name="actfm_picture_gallery">Tria una imatge de la galeria</string>
<string name="actfm_picture_clear">Neteja la selecció d\'imatge</string>
<string name="TVA_add_comment">Afegiu un comentari...</string>
<string name="actfm_GAA_title">Trieu el compte de Google que vulgueu utilitzar:</string>
<string name="backup_BPr_header">Còpies de seguretat</string>
<string name="backup_BAc_import">Importa tasques</string>
<string name="backup_BAc_export">Exporta tasques</string>

@ -9,7 +9,6 @@
<string name="actfm_picture_gallery">Vybrat obrázek z galerie</string>
<string name="actfm_picture_clear">Odebrat obrázek</string>
<string name="TVA_add_comment">Přidej comment...</string>
<string name="actfm_GAA_title">Vyberte, který účet Google chcete použít:</string>
<string name="backup_BPr_header">Zálohy</string>
<string name="backup_BAc_import">Importovat úkoly</string>
<string name="backup_BAc_export">Exportovat úkoly</string>

@ -9,7 +9,6 @@
<string name="actfm_picture_gallery">Vælg fra galleri</string>
<string name="actfm_picture_clear">Ryd markering</string>
<string name="TVA_add_comment">Tilføj en kommentar</string>
<string name="actfm_GAA_title">Vælg den Google-konto du vil anvende:</string>
<string name="backup_BPr_header">Backup</string>
<string name="backup_BAc_import">Importér opgaver</string>
<string name="backup_BAc_export">Eksportér opgaver</string>

@ -10,7 +10,6 @@
<string name="actfm_picture_clear">Bild entfernen</string>
<string name="TVA_add_comment">Kommentar hinzufügen …</string>
<string name="enter_tag_name">Schlagwort eingeben</string>
<string name="actfm_GAA_title">Wählen Sie den zu verwendenden Google-Account aus:</string>
<string name="backup_BAc_import">Aufgaben importieren</string>
<string name="backup_BAc_export">Aufgaben exportieren</string>
<string name="export_toast">Gesichert von %1$s bis %2$s.</string>

@ -8,7 +8,6 @@
<string name="actfm_picture_camera">Τράβα φωτογραφία</string>
<string name="actfm_picture_clear">Καθαρή εικόνα</string>
<string name="TVA_add_comment">Προσθήκη σχόλιου...</string>
<string name="actfm_GAA_title">Επιλέξτε τον λογαριασμό Google που θέλετε να χρησιμοποιήσετε:</string>
<string name="backup_BPr_header">Αντίγραφα ασφαλείας</string>
<string name="backup_BAc_import">Εισαγωγή εργασιών</string>
<string name="backup_BAc_export">Εξαγωγή εργασιών</string>

@ -11,7 +11,6 @@
<string name="TVA_add_comment">Añadir un comentario...</string>
<string name="name">Nombre</string>
<string name="enter_tag_name">Ingrese nombre de etiqueta</string>
<string name="actfm_GAA_title">Seleccione la cuenta de Google que desea usar:</string>
<string name="backup_BPr_header">Copias de seguridad</string>
<string name="backup_BAc_import">Importar tareas</string>
<string name="backup_BAc_export">Exportar tareas</string>

@ -12,7 +12,6 @@
<string name="name">نام</string>
<string name="enter_tag_name">نام تگ را وارد کنید</string>
<string name="enter_filter_name">نام فیلتر را وارد نمایید</string>
<string name="actfm_GAA_title">انتخاب اکانت گوگلی که میخواهید استفاده کنید</string>
<string name="backup_BPr_header">پشتیبان ها</string>
<string name="backup_BAc_export">خرجی از وظایف</string>
<string name="export_toast_no_tasks">خروجی از وظایف</string>

@ -5,7 +5,6 @@
<!-- ******************* DO NOT MODIFY MANUALLY ******************* -->
<!-- ************************************************************** -->
<resources>
<string name="actfm_GAA_title">Valitse mitä Google tiliä haluat käyttää:</string>
<string name="SSD_deleted">Näytä poistetut tehtävät</string>
<string name="SSD_sort_drag">Manuaalinen järjestys osatehtäviin</string>
<string name="SSD_sort_auto">Älykäs sorttaus</string>

@ -12,7 +12,6 @@
<string name="name">Nom</string>
<string name="enter_tag_name">Entrer le nom du tag</string>
<string name="enter_filter_name">Entrer le nom du filtre</string>
<string name="actfm_GAA_title">Sélectionnez le compte Google que vous voulez utiliser :</string>
<string name="backup_BPr_header">Sauvegardes</string>
<string name="backup_BAc_import">Importer des tâches</string>
<string name="backup_BAc_export">Exporter des tâches</string>

@ -6,7 +6,6 @@
<!-- ************************************************************** -->
<resources>
<string name="TVA_add_comment">Hozzászólás írása...</string>
<string name="actfm_GAA_title">Válaszd ki a Google fiókot, amit használni szeretnél:</string>
<string name="DLG_undo">Visszavonás</string>
<string name="WID_dateButtonUnset">Érintsd meg a beállításhoz</string>
<string name="TLA_no_items">Nincsenek feladataid! Szeretnél valamit hozzáadni?</string>

@ -11,7 +11,6 @@
<string name="TVA_add_comment">Aggiungi un commento...</string>
<string name="name">Nome</string>
<string name="enter_tag_name">Digita nome etichetta </string>
<string name="actfm_GAA_title">Seleziona l\'account Google che vuoi utilizzare:</string>
<string name="backup_BPr_header">Salvataggi</string>
<string name="backup_BAc_import">Importa attività</string>
<string name="backup_BAc_export">Esporta attività</string>

@ -9,7 +9,6 @@
<string name="actfm_picture_gallery">בחר מגלריה</string>
<string name="actfm_picture_clear">הסר תמונה</string>
<string name="TVA_add_comment">הוסף הערה</string>
<string name="actfm_GAA_title">בחר חשבון גוגל</string>
<string name="backup_BPr_header">גיבויים</string>
<string name="backup_BAc_import">ייבוא משימות</string>
<string name="backup_BAc_export">ייצוא משימות</string>

@ -12,7 +12,6 @@
<string name="name">名前</string>
<string name="enter_tag_name">タグ名を入力してください</string>
<string name="enter_filter_name">フィルター名を入力</string>
<string name="actfm_GAA_title">使用したいGoogleアカウントを選択してください:</string>
<string name="backup_BPr_header">バックアップ</string>
<string name="backup_BAc_import">タスクのインポート</string>
<string name="backup_BAc_export">タスクのエクスポート</string>

@ -9,7 +9,6 @@
<string name="actfm_picture_gallery">갤러리에서 가져오기</string>
<string name="actfm_picture_clear">사진 제거하기</string>
<string name="TVA_add_comment">댓글 쓰기...</string>
<string name="actfm_GAA_title">사용하려는 구글 계정을 선택해 주십시오:</string>
<string name="backup_BPr_header">백업</string>
<string name="backup_BAc_import">일정 가져오기</string>
<string name="backup_BAc_export">일정 내보내기</string>

@ -12,7 +12,6 @@
<string name="name">Naam</string>
<string name="enter_tag_name">Noteer label naam</string>
<string name="enter_filter_name">Vul een filter naam in</string>
<string name="actfm_GAA_title">Selecteer de Google account die je wil gebruiken:</string>
<string name="backup_BPr_header">Back-ups</string>
<string name="backup_BAc_import">Taken importeren</string>
<string name="backup_BAc_export">Taken exporteren</string>

@ -9,7 +9,6 @@
<string name="actfm_picture_gallery">Wybierz z galerii</string>
<string name="actfm_picture_clear">Usuń obrazek</string>
<string name="TVA_add_comment">Dodaj komentarz...</string>
<string name="actfm_GAA_title">Wybierz konto Google, którego chcesz użyć:</string>
<string name="backup_BPr_header">Kopie zapasowe</string>
<string name="backup_BAc_import">Importuj zadania</string>
<string name="backup_BAc_export">Eksportuj zadania</string>

@ -9,7 +9,6 @@
<string name="actfm_picture_gallery">Selecionar da galeria</string>
<string name="actfm_picture_clear">Limpar imagem</string>
<string name="TVA_add_comment">Comentar...</string>
<string name="actfm_GAA_title">Selecione a conta do Google que deseja usar:</string>
<string name="backup_BAc_import">Importar tarefas</string>
<string name="backup_BAc_export">Exportar tarefas</string>
<string name="export_toast">Backups feitos: de %1$s para %2$s.</string>

@ -12,7 +12,6 @@
<string name="name">Nome</string>
<string name="enter_tag_name">Digite o nome da etiqueta</string>
<string name="enter_filter_name">Introduza o nome do fitro</string>
<string name="actfm_GAA_title">Escolha a conta Google a utilizar:</string>
<string name="backup_BAc_import">Importar tarefas</string>
<string name="backup_BAc_export">Exportar tarefas</string>
<string name="export_toast">Backup de %1$s para %2$s.</string>

@ -12,7 +12,6 @@
<string name="name">Тег:</string>
<string name="enter_tag_name">Введите название тега</string>
<string name="enter_filter_name">Введите имя фильтра</string>
<string name="actfm_GAA_title">Выберите аккаунт Google, который вы хотите использовать:</string>
<string name="backup_BPr_header">Резервные копии</string>
<string name="backup_BAc_import">Импортировать задачи</string>
<string name="backup_BAc_export">Экспортировать задачи</string>

@ -11,7 +11,6 @@
<string name="TVA_add_comment">Komentovať...</string>
<string name="name">Názov</string>
<string name="enter_tag_name">Potvrdiť názov tagu</string>
<string name="actfm_GAA_title">Vyber si Google účet, ktorý chceš použiť:</string>
<string name="backup_BPr_header">Zálohy</string>
<string name="backup_BAc_import">Importovať úlohy</string>
<string name="backup_BAc_export">Exportovať úlohy</string>

@ -9,7 +9,6 @@
<string name="actfm_picture_gallery">Izberi iz Galerije</string>
<string name="actfm_picture_clear">Zbriši fotografijo</string>
<string name="TVA_add_comment">Dodaj komentar...</string>
<string name="actfm_GAA_title">Izberite želeni Google račun:</string>
<string name="backup_BPr_header">Varnostne kopije</string>
<string name="backup_BAc_import">Uvozi opravke</string>
<string name="backup_BAc_export">Izvozi opravke</string>

@ -9,7 +9,6 @@
<string name="actfm_picture_gallery">Välj från galleri</string>
<string name="actfm_picture_clear">Rensa bild</string>
<string name="TVA_add_comment">Lägg till en kommentar...</string>
<string name="actfm_GAA_title">Välj vilket Googlekonto du vill använda:</string>
<string name="backup_BPr_header">Säkerhetskopior</string>
<string name="backup_BAc_import">Importera uppgifter</string>
<string name="backup_BAc_export">Exportera uppgifter</string>

@ -9,7 +9,6 @@
<string name="actfm_picture_gallery">Galeriden Seç</string>
<string name="actfm_picture_clear">Resmi sil</string>
<string name="TVA_add_comment">Yorum Gir</string>
<string name="actfm_GAA_title">Kullanmak istediğiniz Google hesabını seçin:</string>
<string name="backup_BPr_header">Yedekler</string>
<string name="backup_BAc_import">Görevleri İçe Aktar</string>
<string name="backup_BAc_export">Görevleri Dışa Aktar</string>

@ -9,7 +9,6 @@
<string name="actfm_picture_gallery">Завантажити з Галереї</string>
<string name="actfm_picture_clear">Очистити</string>
<string name="TVA_add_comment">Додати коментар</string>
<string name="actfm_GAA_title">Виберіть обліковий запис Google для використання:</string>
<string name="backup_BPr_header">Резервні копії</string>
<string name="backup_BAc_import">Імпортувати завдання</string>
<string name="backup_BAc_export">Експорт завдань</string>

@ -9,7 +9,6 @@
<string name="actfm_picture_gallery">从相册中选取</string>
<string name="actfm_picture_clear">取消选择</string>
<string name="TVA_add_comment">添加注释...</string>
<string name="actfm_GAA_title">选择你要使用的Google账户</string>
<string name="backup_BPr_header">备份</string>
<string name="backup_BAc_import">导入任务</string>
<string name="backup_BAc_export">导出任务</string>

@ -9,7 +9,6 @@
<string name="actfm_picture_gallery">從圖庫選擇</string>
<string name="actfm_picture_clear">清除圖片</string>
<string name="TVA_add_comment">添加評論</string>
<string name="actfm_GAA_title">選擇您要使用的Google帳戶</string>
<string name="backup_BPr_header">備份</string>
<string name="backup_BAc_import">匯入工作</string>
<string name="backup_BAc_export">匯出工作</string>

@ -24,8 +24,7 @@
<!-- ========================================= sharing login activity == -->
<!-- share login: Google Auth title -->
<string name="actfm_GAA_title">Select the Google account you want to use:</string>
<string name="choose_google_account">Choose Google Account</string>
</resources>

Loading…
Cancel
Save