Add GoogleTasksAccount preference fragment

pull/1305/head
Alex Baker 3 years ago
parent 19bcd457e3
commit eb2c7420d6

@ -320,7 +320,7 @@ abstract class BaseCaldavAccountSettingsActivity : ThemedInjectingAppCompatActiv
}
dialogBuilder
.newDialog()
.setMessage(R.string.logout_warning, caldavAccount!!.name)
.setMessage(R.string.logout_warning)
.setPositiveButton(R.string.remove) { _, _ -> lifecycleScope.launch { removeAccount() } }
.setNegativeButton(R.string.cancel, null)
.show()

@ -193,7 +193,7 @@ class CaldavAccount : Parcelable {
fun isLoggedOut() = error?.startsWith(ERROR_UNAUTHORIZED) == true
fun isPaymentRequired() = error?.startsWith(EROR_PAYMENT_REQUIRED) == true
fun isPaymentRequired() = error.isPaymentRequired()
val prefTitle: Int
get() = when {
@ -228,10 +228,12 @@ class CaldavAccount : Parcelable {
const val TYPE_ETEBASE = 5
const val ERROR_UNAUTHORIZED = "HTTP ${HttpURLConnection.HTTP_UNAUTHORIZED}"
const val EROR_PAYMENT_REQUIRED = "HTTP ${HttpURLConnection.HTTP_PAYMENT_REQUIRED}"
const val ERROR_PAYMENT_REQUIRED = "HTTP ${HttpURLConnection.HTTP_PAYMENT_REQUIRED}"
fun String?.openTaskType(): String? = this?.split(":")?.get(0)
fun String?.isPaymentRequired(): Boolean = this?.startsWith(ERROR_PAYMENT_REQUIRED) == true
@JvmField val CREATOR: Parcelable.Creator<CaldavAccount> = object : Parcelable.Creator<CaldavAccount> {
override fun createFromParcel(source: Parcel): CaldavAccount = CaldavAccount(source)

@ -8,6 +8,9 @@ import org.tasks.time.DateTimeUtils.currentTimeMillis
@Dao
interface GoogleTaskListDao {
@Query("SELECT * FROM google_task_accounts WHERE gta_id = :id")
fun watchAccount(id: Long): LiveData<GoogleTaskAccount>
@Query("SELECT COUNT(*) FROM google_task_accounts")
suspend fun accountCount(): Int

@ -64,7 +64,7 @@ class GoogleTaskSynchronizer @Inject constructor(
if (i == 0 || inventory.hasPro) {
synchronize(account)
} else {
account.error = context.getString(R.string.requires_pro_subscription)
account.error = CaldavAccount.ERROR_PAYMENT_REQUIRED
}
} catch (e: SocketTimeoutException) {
Timber.e(e)

@ -0,0 +1,62 @@
package org.tasks.preferences.fragments
import android.app.Activity
import android.content.Intent
import android.os.Bundle
import androidx.lifecycle.lifecycleScope
import kotlinx.coroutines.NonCancellable
import kotlinx.coroutines.launch
import kotlinx.coroutines.withContext
import org.tasks.R
import org.tasks.billing.BillingClient
import org.tasks.billing.PurchaseDialog
import org.tasks.injection.InjectingPreferenceFragment
import javax.inject.Inject
abstract class BaseAccountPreference : InjectingPreferenceFragment() {
@Inject lateinit var billingClient: BillingClient
override suspend fun setupPreferences(savedInstanceState: Bundle?) {
findPreference(R.string.logout).setOnPreferenceClickListener {
dialogBuilder
.newDialog()
.setMessage(R.string.logout_warning)
.setPositiveButton(R.string.remove) { _, _ ->
lifecycleScope.launch {
withContext(NonCancellable) {
removeAccount()
}
activity?.onBackPressed()
}
}
.setNegativeButton(R.string.cancel, null)
.show()
false
}
}
protected abstract suspend fun removeAccount()
protected fun showPurchaseDialog(tasksPayment: Boolean = false): Boolean {
PurchaseDialog
.newPurchaseDialog(this, REQUEST_PURCHASE, tasksPayment)
.show(parentFragmentManager, PurchaseDialog.FRAG_TAG_PURCHASE_DIALOG)
return false
}
override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
if (requestCode == REQUEST_PURCHASE) {
if (resultCode == Activity.RESULT_OK) {
billingClient.queryPurchases()
}
} else {
super.onActivityResult(requestCode, resultCode, data)
}
}
companion object {
const val REQUEST_PURCHASE = 10201
}
}

@ -0,0 +1,129 @@
package org.tasks.preferences.fragments
import android.content.*
import android.os.Bundle
import androidx.lifecycle.LiveData
import androidx.lifecycle.lifecycleScope
import com.todoroo.astrid.gtasks.auth.GtasksLoginActivity
import com.todoroo.astrid.service.TaskDeleter
import dagger.hilt.android.AndroidEntryPoint
import kotlinx.coroutines.launch
import org.tasks.LocalBroadcastManager
import org.tasks.R
import org.tasks.billing.Inventory
import org.tasks.data.CaldavAccount.Companion.isPaymentRequired
import org.tasks.data.GoogleTaskAccount
import org.tasks.data.GoogleTaskListDao
import org.tasks.preferences.IconPreference
import javax.inject.Inject
@AndroidEntryPoint
class GoogleTasksAccount : BaseAccountPreference() {
@Inject lateinit var taskDeleter: TaskDeleter
@Inject lateinit var inventory: Inventory
@Inject lateinit var localBroadcastManager: LocalBroadcastManager
@Inject lateinit var googleTaskListDao: GoogleTaskListDao
private lateinit var googleTaskAccountLiveData: LiveData<GoogleTaskAccount>
val googleTaskAccount: GoogleTaskAccount
get() = googleTaskAccountLiveData.value ?: requireArguments().getParcelable(EXTRA_ACCOUNT)!!
private val purchaseReceiver = object : BroadcastReceiver() {
override fun onReceive(context: Context, intent: Intent) {
lifecycleScope.launch {
googleTaskAccount.let {
if (inventory.subscription != null && it.error.isPaymentRequired()) {
it.error = null
googleTaskListDao.update(it)
}
refreshUi(it)
}
}
}
}
override fun getPreferenceXml() = R.xml.preferences_google_tasks
override suspend fun setupPreferences(savedInstanceState: Bundle?) {
super.setupPreferences(savedInstanceState)
googleTaskAccountLiveData = googleTaskListDao.watchAccount(
arguments?.getParcelable<GoogleTaskAccount>(EXTRA_ACCOUNT)?.id ?: 0
)
googleTaskAccountLiveData.observe(this) { refreshUi(it) }
findPreference(R.string.reinitialize_account)
.setOnPreferenceClickListener { requestLogin() }
}
override suspend fun removeAccount() {
taskDeleter.delete(googleTaskAccount)
}
override fun onResume() {
super.onResume()
localBroadcastManager.registerPurchaseReceiver(purchaseReceiver)
localBroadcastManager.registerRefreshListReceiver(purchaseReceiver)
}
override fun onPause() {
super.onPause()
localBroadcastManager.unregisterReceiver(purchaseReceiver)
}
private fun refreshUi(account: GoogleTaskAccount?) {
if (account == null) {
return
}
(findPreference(R.string.sign_in_with_google) as IconPreference).apply {
if (account.error.isNullOrBlank()) {
isVisible = false
return@apply
}
isVisible = true
when {
account.error.isPaymentRequired() -> {
setOnPreferenceClickListener { showPurchaseDialog() }
setTitle(R.string.name_your_price)
setSummary(R.string.requires_pro_subscription)
}
account.error.isUnauthorized() -> {
setTitle(R.string.sign_in_with_google)
setSummary(R.string.authentication_required)
setOnPreferenceClickListener { requestLogin() }
}
else -> {
this.title = null
this.summary = account.error
this.onPreferenceClickListener = null
}
}
iconVisible = true
}
}
private fun requestLogin(): Boolean {
activity?.startActivityForResult(
Intent(activity, GtasksLoginActivity::class.java),
MainSettingsFragment.REQUEST_GOOGLE_TASKS
)
return false
}
companion object {
private const val EXTRA_ACCOUNT = "extra_account"
fun String?.isUnauthorized(): Boolean =
this?.startsWith("401 Unauthorized", ignoreCase = true) == true
fun newGoogleTasksAccountPreference(account: GoogleTaskAccount) =
GoogleTasksAccount().apply {
arguments = Bundle().apply {
putParcelable(EXTRA_ACCOUNT, account)
}
}
}
}

@ -7,7 +7,6 @@ import androidx.fragment.app.activityViewModels
import androidx.lifecycle.lifecycleScope
import androidx.preference.Preference
import androidx.preference.PreferenceScreen
import com.todoroo.astrid.gtasks.auth.GtasksLoginActivity
import com.todoroo.astrid.service.TaskDeleter
import dagger.hilt.android.AndroidEntryPoint
import kotlinx.coroutines.NonCancellable
@ -23,6 +22,7 @@ import org.tasks.preferences.IconPreference
import org.tasks.preferences.MainPreferences
import org.tasks.preferences.Preferences
import org.tasks.preferences.PreferencesViewModel
import org.tasks.preferences.fragments.GoogleTasksAccount.Companion.newGoogleTasksAccountPreference
import org.tasks.preferences.fragments.TasksAccount.Companion.newTasksAccountPreference
import org.tasks.sync.AddAccountDialog.Companion.newAccountDialog
import org.tasks.widget.AppWidgetManager
@ -158,47 +158,15 @@ class MainSettingsFragment : InjectingPreferenceFragment() {
pref.summary = account.account
setupErrorIcon(pref, account.error)
pref.setOnPreferenceClickListener {
dialogBuilder
.newDialog(account.account)
.setItems(
listOf(
getString(R.string.reinitialize_account),
getString(R.string.logout)
)
) { _, which ->
if (which == 0) {
startActivityForResult(
Intent(context, GtasksLoginActivity::class.java),
REQUEST_GOOGLE_TASKS
)
} else {
logoutConfirmation(account)
}
}
.setNegativeButton(R.string.cancel, null)
.show()
(activity as MainPreferences).startPreference(
this,
newGoogleTasksAccountPreference(account),
account.account!!
)
false
}
}
private fun logoutConfirmation(account: GoogleTaskAccount) {
val name = account.account
val alertDialog = dialogBuilder
.newDialog()
.setMessage(R.string.logout_warning, name)
.setPositiveButton(R.string.logout) { _, _ ->
lifecycleScope.launch {
withContext(NonCancellable) {
taskDeleter.delete(account)
}
}
}
.setNegativeButton(R.string.cancel, null)
.create()
alertDialog.setCanceledOnTouchOutside(false)
alertDialog.setCancelable(false)
alertDialog.show()
}
private fun setupErrorIcon(pref: IconPreference, error: String?) {
val hasError = !error.isNullOrBlank()

@ -1,6 +1,5 @@
package org.tasks.preferences.fragments
import android.app.Activity.RESULT_OK
import android.content.*
import android.net.Uri
import android.os.Bundle
@ -22,12 +21,9 @@ import org.tasks.BuildConfig
import org.tasks.LocalBroadcastManager
import org.tasks.R
import org.tasks.auth.SignInActivity
import org.tasks.billing.BillingClient
import org.tasks.billing.Inventory
import org.tasks.billing.PurchaseDialog
import org.tasks.data.CaldavAccount
import org.tasks.data.CaldavDao
import org.tasks.injection.InjectingPreferenceFragment
import org.tasks.jobs.WorkManager
import org.tasks.locale.Locale
import org.tasks.preferences.IconPreference
@ -37,10 +33,9 @@ import java.time.format.FormatStyle
import javax.inject.Inject
@AndroidEntryPoint
class TasksAccount : InjectingPreferenceFragment() {
class TasksAccount : BaseAccountPreference() {
@Inject lateinit var taskDeleter: TaskDeleter
@Inject lateinit var billingClient: BillingClient
@Inject lateinit var inventory: Inventory
@Inject lateinit var localBroadcastManager: LocalBroadcastManager
@Inject lateinit var caldavDao: CaldavDao
@ -73,6 +68,8 @@ class TasksAccount : InjectingPreferenceFragment() {
override fun getPreferenceXml() = R.xml.preferences_tasks
override suspend fun setupPreferences(savedInstanceState: Bundle?) {
super.setupPreferences(savedInstanceState)
caldavAccountLiveData = caldavDao.watchAccount(
requireArguments().getParcelable<CaldavAccount>(EXTRA_ACCOUNT)!!.id
)
@ -80,18 +77,8 @@ class TasksAccount : InjectingPreferenceFragment() {
viewModel.refreshPasswords(caldavAccount)
}
findPreference(R.string.logout).setOnPreferenceClickListener {
dialogBuilder
.newDialog()
.setMessage(R.string.logout_warning, getString(R.string.tasks_org))
.setPositiveButton(R.string.remove) { _, _ -> removeAccount() }
.setNegativeButton(R.string.cancel, null)
.show()
false
}
findPreference(R.string.upgrade_to_pro).setOnPreferenceClickListener {
showPurchaseDialog()
showPurchaseDialog(tasksPayment = true)
}
findPreference(R.string.button_unsubscribe).setOnPreferenceClickListener {
@ -121,18 +108,10 @@ class TasksAccount : InjectingPreferenceFragment() {
}
}
private fun showPurchaseDialog(): Boolean {
PurchaseDialog
.newPurchaseDialog(this, REQUEST_PURCHASE, tasksPayment = true)
.show(parentFragmentManager, PurchaseDialog.FRAG_TAG_PURCHASE_DIALOG)
return false
}
private fun removeAccount() = lifecycleScope.launch {
override suspend fun removeAccount() {
// try to delete session from caldav.tasks.org
taskDeleter.delete(caldavAccount)
inventory.updateTasksSubscription()
activity?.onBackPressed()
}
override fun onResume() {
@ -213,7 +192,7 @@ class TasksAccount : InjectingPreferenceFragment() {
}
} else {
setOnPreferenceClickListener {
showPurchaseDialog()
showPurchaseDialog(tasksPayment = true)
}
if (subscription == null || subscription.isTasksSubscription) {
setTitle(R.string.button_subscribe)
@ -326,18 +305,7 @@ class TasksAccount : InjectingPreferenceFragment() {
)
}
override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
if (requestCode == REQUEST_PURCHASE) {
if (resultCode == RESULT_OK) {
billingClient.queryPurchases()
}
} else {
super.onActivityResult(requestCode, resultCode, data)
}
}
companion object {
private const val REQUEST_PURCHASE = 10201
private const val EXTRA_ACCOUNT = "extra_account"
fun newTasksAccountPreference(account: CaldavAccount): Fragment {

@ -421,7 +421,7 @@
<string name="pro_dashclock_extension">Dashclock разширение</string>
<string name="requires_pro_subscription">Изисква pro абонамент</string>
<string name="logout">Излизане</string>
<string name="logout_warning">Разлогване от %s? Всички данни за този акаунт ще бъдат изтрити от Вашето устройство</string>
<string name="logout_warning">Всички данни за този акаунт ще бъдат изтрити от Вашето устройство</string>
<string name="cannot_access_account">Няма достъп до акаунт</string>
<string name="reinitialize_account">Реинициализиране</string>
<string name="action_create_new_task">Създай нова задача</string>

@ -449,7 +449,7 @@
<string name="repeat_minutely">OPAKOVAT PO MINUTĚ</string>
<string name="repeat_number_of_times">Opakovat několikrát</string>
<string name="when_overdue">Po termínu</string>
<string name="logout_warning">Odhlásit se z %s\? Všechna data daného účtu budou odstraněna z tohoto zařízení</string>
<string name="logout_warning">Všechna data daného účtu budou odstraněna z tohoto zařízení</string>
<string name="cannot_access_account">Nepodařilo se připojit k účtu</string>
<string name="action_create_new_task">Vytvořit nový úkol</string>
<string name="show_description">Zobrazit poznámky</string>

@ -224,7 +224,7 @@
<string name="action_create_new_task">Opret ny opgave</string>
<string name="reinitialize_account">Geninitialisér</string>
<string name="cannot_access_account">Kunne ikke tilgå kontoen</string>
<string name="logout_warning">Log ud af %s\? Al data for denne konto vil blive slettet fra enheden</string>
<string name="logout_warning">Al data for denne konto vil blive slettet fra enheden</string>
<string name="logout">Log ud</string>
<string name="this_feature_requires_a_subscription">Denne funktion kræver et abonnement</string>
<string name="requires_pro_subscription">Kræver pro-abonnement</string>

@ -418,7 +418,7 @@
<string name="pro_dashclock_extension">Dashclock-Erweiterung</string>
<string name="requires_pro_subscription">Pro-Freischaltung benötigt</string>
<string name="logout">Abmelden</string>
<string name="logout_warning">Von %s abmelden\? Das wird alle Daten dieses Kontos von Ihrem Gerät löschen</string>
<string name="logout_warning">Das wird alle Daten dieses Kontos von Ihrem Gerät löschen</string>
<string name="cannot_access_account">Zugriff auf Konto fehlgeschlagen</string>
<string name="reinitialize_account">Neu initialisieren</string>
<string name="action_create_new_task">Neue Aufgabe erstellen</string>

@ -421,7 +421,7 @@
<string name="pro_dashclock_extension">Extensión Dashclock</string>
<string name="requires_pro_subscription">Requiere suscripción profesional</string>
<string name="logout">Cerrar sesión</string>
<string name="logout_warning">¿Cerrar sesión %s? Todos los datos de esta cuenta se borrarán del dispositivo</string>
<string name="logout_warning">Todos los datos de esta cuenta se borrarán del dispositivo</string>
<string name="cannot_access_account">No se puede acceder a la cuenta</string>
<string name="reinitialize_account">Reinicializar</string>
<string name="action_create_new_task">Crear nueva tarea</string>

@ -427,7 +427,7 @@
<string name="pro_dashclock_extension">Dashclock luzapena</string>
<string name="requires_pro_subscription">Pro harpidetza eskatzen du</string>
<string name="logout">Amaitu saioa</string>
<string name="logout_warning">Amaitu %s saioa\? Kontu honetako datu guztiak zure gailutik kenduko dira</string>
<string name="logout_warning">Kontu honetako datu guztiak zure gailutik kenduko dira</string>
<string name="cannot_access_account">Ezin izan da kontua atzitu</string>
<string name="reinitialize_account">Berrhasi</string>
<string name="action_create_new_task">Sortu zeregin berria</string>

@ -569,7 +569,7 @@
<string name="whats_new">Päivitykset</string>
<string name="location_departed">Lähdit paikasta %s</string>
<string name="location_arrived">Saavuit paikkaan %s</string>
<string name="logout_warning">Kirjaudu ulos %s\? Kaikki tälle tilille tallennetut tiedot poistetaan laitteeltasi</string>
<string name="logout_warning">Kaikki tälle tilille tallennetut tiedot poistetaan laitteeltasi</string>
<string name="refresh_purchases">Päivitä ostoksesi</string>
<string name="widget_due_date_hidden">Piilotettu</string>
<string name="widget_due_date_below_title">Otsikon alle</string>

@ -403,7 +403,7 @@
<string name="pro_dashclock_extension">Extension Dashclock</string>
<string name="requires_pro_subscription">Abonnement professionnel requis</string>
<string name="logout">Se déconnecter</string>
<string name="logout_warning">Se déconnecter de %s ? Toutes les données liées à ce compte seront supprimées de votre appareil</string>
<string name="logout_warning">Toutes les données liées à ce compte seront supprimées de votre appareil</string>
<string name="cannot_access_account">Impossible d\'accéder au compte</string>
<string name="reinitialize_account">Réinitialiser</string>
<string name="action_create_new_task">Créer une nouvelle tâche</string>

@ -56,7 +56,7 @@
<string name="show_description">Prikaži opis</string>
<string name="action_create_new_task">Stvori novi zadatak</string>
<string name="cannot_access_account">Nije moguće učitati račun</string>
<string name="logout_warning">Odjava s računa \"%s\"\? Svi podaci za ovaj račun uklonit će se s uređaja</string>
<string name="logout_warning">Svi podaci za ovaj račun uklonit će se s uređaja</string>
<string name="logout">Odjavi</string>
<string name="license_summary">Tasks je libre aplikacija otvorenog koda, licencirano pod GNU General Public License v3.0</string>
<string name="about">O aplikaciju</string>

@ -422,7 +422,7 @@
<string name="pro_dashclock_extension">Dashclock kiterjesztés</string>
<string name="requires_pro_subscription">Pro előfizetést igényel</string>
<string name="logout">Kijelentkezés</string>
<string name="logout_warning">Kijelentkezés ebből: %s\? A fiókhoz tartozó összes adat törlésre kerül az eszközről</string>
<string name="logout_warning">A fiókhoz tartozó összes adat törlésre kerül az eszközről</string>
<string name="cannot_access_account">Fiók nem elérhető</string>
<string name="reinitialize_account">Újrainicializálás</string>
<string name="action_create_new_task">Új feladat létrehozása</string>

@ -356,7 +356,7 @@
<string name="pro_dashclock_extension">Ekstensi Dashclock</string>
<string name="requires_pro_subscription">Membutuhkan langganan versi pro</string>
<string name="logout">Keluar</string>
<string name="logout_warning">Keluar dari %s\? Semua data akun ini akan dihapus dari perangkat anda</string>
<string name="logout_warning">Semua data akun ini akan dihapus dari perangkat anda</string>
<string name="cannot_access_account">Tidak bisa mengakses akun</string>
<string name="reinitialize_account">Inisialisasi ulang</string>
<string name="action_create_new_task">Buat tugas baru</string>

@ -422,7 +422,7 @@
<string name="pro_dashclock_extension">Estensione Dashclock</string>
<string name="requires_pro_subscription">Richiede versione premium</string>
<string name="logout">Esci</string>
<string name="logout_warning">Uscire da %s\? Tutti i dati dell\'account saranno cancellati dal dispositivo</string>
<string name="logout_warning">Tutti i dati dell\'account saranno cancellati dal dispositivo</string>
<string name="cannot_access_account">Impossibile accedere all\'account</string>
<string name="reinitialize_account">Reinizializza</string>
<string name="action_create_new_task">Crea nuova attività</string>

@ -456,7 +456,7 @@
<string name="pro_dashclock_extension">הרחבת Dashclock</string>
<string name="requires_pro_subscription">לא דורש הרשמה</string>
<string name="logout">התנתקות מהחשבון</string>
<string name="logout_warning">להתנתק מ-%s? כל המידע של חשבון זה יימחק מהמכשיר שלך</string>
<string name="logout_warning">כל המידע של חשבון זה יימחק מהמכשיר שלך</string>
<string name="cannot_access_account">לא ניתן לגשת לחשבון</string>
<string name="reinitialize_account">איתחול מחדש</string>
<string name="action_create_new_task">יצירת משימה חדשה</string>

@ -419,7 +419,7 @@
<string name="pro_dashclock_extension">Dashclock 拡張</string>
<string name="requires_pro_subscription">プロ版のサブスクリプションが必要です</string>
<string name="logout">ログアウト</string>
<string name="logout_warning">%s をログアウトしますか? このアカウントのデータがお使いの端末からすべて削除されます</string>
<string name="logout_warning">このアカウントのデータがお使いの端末からすべて削除されます</string>
<string name="cannot_access_account">アカウントにアクセスできません</string>
<string name="reinitialize_account">再初期化</string>
<string name="action_create_new_task">新しいタスクを作成</string>

@ -419,7 +419,7 @@
<string name="pro_dashclock_extension">Dashclock 확장프로그램</string>
<string name="requires_pro_subscription">프로 서비스 구독이 필요합니다</string>
<string name="logout">로그아웃</string>
<string name="logout_warning">%s로부터 로그아웃할까요\? 이 계정의 모든 정보가 기기에서 삭제됩니다</string>
<string name="logout_warning">이 계정의 모든 정보가 기기에서 삭제됩니다</string>
<string name="cannot_access_account">계정에 접근할 수 없습니다</string>
<string name="reinitialize_account">다시 초기화하기</string>
<string name="action_create_new_task">새 할일 만들기</string>

@ -418,7 +418,7 @@
<string name="pro_dashclock_extension">Dashclock plėtinys</string>
<string name="requires_pro_subscription">Reikalinga \"pro\" prenumerata</string>
<string name="logout">Atsijungti</string>
<string name="logout_warning">Atsijungti nuo %s? Visi šios paskyros duomenys iš šio įrenginio bus pašalinti.</string>
<string name="logout_warning">Visi šios paskyros duomenys iš šio įrenginio bus pašalinti.</string>
<string name="cannot_access_account">Paskyra nepasiekiama.</string>
<string name="reinitialize_account">Inicijuoti iš naujo</string>
<string name="action_create_new_task">Sukurti naują užduotį</string>

@ -427,7 +427,7 @@
<string name="pro_dashclock_extension">Dashclock-utvidelse</string>
<string name="requires_pro_subscription">Krever pro-abonnement</string>
<string name="logout">Logg ut</string>
<string name="logout_warning">Logg ut av %s\? All data tilknyttet denne kontoen vil bli fjernet fra enheten din</string>
<string name="logout_warning">All data tilknyttet denne kontoen vil bli fjernet fra enheten din</string>
<string name="cannot_access_account">Får ikke tilgang til konto</string>
<string name="reinitialize_account">Last inn på ny</string>
<string name="action_create_new_task">Opprett nytt gjøremål</string>

@ -411,7 +411,7 @@
<string name="pro_dashclock_extension">Dashclock extentie</string>
<string name="requires_pro_subscription">Pro abonnement vereist</string>
<string name="logout">Uitloggen</string>
<string name="logout_warning">Uitloggen voor %s? Alle data voor dit account zal worden verwijderd van je toestel</string>
<string name="logout_warning">Alle data voor dit account zal worden verwijderd van je toestel</string>
<string name="cannot_access_account">Geen toegang tot account</string>
<string name="reinitialize_account">Herinitialiseren</string>
<string name="action_create_new_task">Nieuwe taak maken</string>

@ -431,7 +431,7 @@
<string name="license_summary">Tasks jest aplikacją darmową/libre z otwartym kodem źródłowym, na licencji GNU General Public License v3.0</string>
<string name="requires_pro_subscription">Wymaga subskrypcji pro</string>
<string name="logout">Wyloguj</string>
<string name="logout_warning">Wyloguj z %s? Wszystkie dane z tego konta zostaną usunięte z urządzenia</string>
<string name="logout_warning">Wszystkie dane z tego konta zostaną usunięte z urządzenia</string>
<string name="cannot_access_account">Brak dostępu do konta</string>
<string name="reinitialize_account">Powiąż ponownie</string>
<string name="action_create_new_task">Stwórz nowe zadanie</string>

@ -419,7 +419,7 @@
<string name="pro_dashclock_extension">Extensão Dashclock</string>
<string name="requires_pro_subscription">Requer subscrição Pro</string>
<string name="logout">Sair</string>
<string name="logout_warning">Sair de %s? Todos os dados dessa conta serão removidos do seu dispositivo</string>
<string name="logout_warning">Todos os dados dessa conta serão removidos do seu dispositivo</string>
<string name="cannot_access_account">Não é possível acessar a conta</string>
<string name="reinitialize_account">Reinicializar</string>
<string name="action_create_new_task">Criar nova tarefa</string>

@ -416,7 +416,7 @@
<string name="action_create_new_task">Criar nova tarefa</string>
<string name="reinitialize_account">Reinicializar</string>
<string name="cannot_access_account">Não é possível acessar a conta</string>
<string name="logout_warning">Sair de %s\? Todos os dados dessa conta serão removidos do seu aparelho</string>
<string name="logout_warning">Todos os dados dessa conta serão removidos do seu aparelho</string>
<string name="logout">Sair</string>
<string name="requires_pro_subscription">Requer assinatura pro</string>
<string name="pro_dashclock_extension">Extensão Dashclock</string>

@ -439,7 +439,7 @@
<string name="pro_dashclock_extension">Расширение для Dashclock</string>
<string name="requires_pro_subscription">Требуется версия Про</string>
<string name="logout">Отключиться</string>
<string name="logout_warning">Отключиться от %s? Все данные учётной записи на этом устройстве будут удалены</string>
<string name="logout_warning">Все данные учётной записи на этом устройстве будут удалены</string>
<string name="cannot_access_account">Учётная запись недоступна</string>
<string name="reinitialize_account">Инициализировать заново</string>
<string name="action_create_new_task">Создать новую задачу</string>

@ -418,7 +418,7 @@
<string name="pro_dashclock_extension">Rozšírenie Dashclock</string>
<string name="requires_pro_subscription">Vyžaduje platenú verziu pro</string>
<string name="logout">Odhlásiť sa</string>
<string name="logout_warning">Odhlásiť sa o %s? Všetky údaje tohto účtu budú odstránené z Vášho zariadenia</string>
<string name="logout_warning">Všetky údaje tohto účtu budú odstránené z Vášho zariadenia</string>
<string name="cannot_access_account">Chyba v prístupe k účtu</string>
<string name="reinitialize_account">Znovu aktivovať</string>
<string name="action_create_new_task">Vytvoriť novú úlohu</string>

@ -422,7 +422,7 @@
<string name="pro_dashclock_extension">DashClock extension</string>
<string name="requires_pro_subscription">Kräver Pro-prenumeration</string>
<string name="logout">Logga ut</string>
<string name="logout_warning">Logga ut från %s\? Alla data för det här kontot tas bort från enheten</string>
<string name="logout_warning">Alla data för det här kontot tas bort från enheten</string>
<string name="cannot_access_account">Kan inte komma åt kontot</string>
<string name="reinitialize_account">Initiera</string>
<string name="action_create_new_task">Skapa ny uppgift</string>

@ -291,7 +291,7 @@
<string name="action_create_new_task">புதிய பணியை உருவாக்கவும்</string>
<string name="reinitialize_account">மீண்டும் துவக்கு</string>
<string name="cannot_access_account">கணக்கை அணுக முடியாது</string>
<string name="logout_warning">%s இலிருந்து வெளியேற வேண்டுமா\? இந்தக் கணக்கிற்கான எல்லா தரவும் உங்கள் சாதனத்திலிருந்து அகற்றப்படும்</string>
<string name="logout_warning">இந்தக் கணக்கிற்கான எல்லா தரவும் உங்கள் சாதனத்திலிருந்து அகற்றப்படும்</string>
<string name="logout">வெளியேறு</string>
<string name="this_feature_requires_a_subscription">இந்த அம்சத்திற்கு சந்தா தேவை</string>
<string name="requires_pro_subscription">சார்பு சந்தா தேவை</string>

@ -424,7 +424,7 @@
<string name="pro_dashclock_extension">Dashclock eklentisi</string>
<string name="requires_pro_subscription">Pro aboneliği gerektirir</string>
<string name="logout">Oturumu kapat</string>
<string name="logout_warning">%s oturumunu kapat? Bu hesapla ilgili tüm veri aygıtınızdan kaldırılacak</string>
<string name="logout_warning">Bu hesapla ilgili tüm veri aygıtınızdan kaldırılacak</string>
<string name="cannot_access_account">Hesaba erişilemedi</string>
<string name="reinitialize_account">Yeniden başlat</string>
<string name="action_create_new_task">Yeni görev oluştur</string>

@ -440,7 +440,7 @@
<string name="pro_dashclock_extension">Розширення Dashclock</string>
<string name="requires_pro_subscription">Потребує преміум підписки</string>
<string name="logout">Вийти</string>
<string name="logout_warning">Вийти з %s? Всі дані цього облікового запису будуть видалені з пристрою</string>
<string name="logout_warning">Всі дані цього облікового запису будуть видалені з пристрою</string>
<string name="cannot_access_account">Немає доступу до облікового запису</string>
<string name="reinitialize_account">Ініціалізувати ще раз</string>
<string name="action_create_new_task">Створити нове завдання</string>

@ -404,7 +404,7 @@
<string name="pro_dashclock_extension">Dashclock扩展</string>
<string name="requires_pro_subscription">需要订阅专业版</string>
<string name="logout">登出</string>
<string name="logout_warning">登出 %s? 此帐户的所有数据都将从您的设备中删除</string>
<string name="logout_warning">此帐户的所有数据都将从您的设备中删除</string>
<string name="cannot_access_account">无法访问帐户</string>
<string name="reinitialize_account">重新初始化</string>
<string name="action_create_new_task">新建任务</string>

@ -502,7 +502,7 @@ File %1$s contained %2$s.\n\n
<string name="requires_pro_subscription">Requires pro subscription</string>
<string name="this_feature_requires_a_subscription">This feature requires a subscription</string>
<string name="logout">Log out</string>
<string name="logout_warning">Log out of %s? All data for this account will be removed from your device</string>
<string name="logout_warning">All data for this account will be removed from your device</string>
<string name="cannot_access_account">Cannot access account</string>
<string name="reinitialize_account">Reinitialize</string>
<string name="action_create_new_task">Create new task</string>

@ -0,0 +1,24 @@
<?xml version="1.0" encoding="utf-8"?>
<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:key="@string/preference_screen">
<org.tasks.preferences.IconPreference
android:key="@string/sign_in_with_google"
android:layout="@layout/preference_icon"
android:title="@string/sign_in_with_google"
android:summary="@string/authentication_required"
app:isPreferenceVisible="false"
tools:isPreferenceVisible="true"/>
<Preference
android:key="@string/reinitialize_account"
android:title="@string/reinitialize_account" />
<Preference
android:key="@string/logout"
android:title="@string/logout"
app:allowDividerAbove="true"/>
</PreferenceScreen>
Loading…
Cancel
Save