Add GoogleTasksAccount preference fragment

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

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

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

@ -8,6 +8,9 @@ import org.tasks.time.DateTimeUtils.currentTimeMillis
@Dao @Dao
interface GoogleTaskListDao { 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") @Query("SELECT COUNT(*) FROM google_task_accounts")
suspend fun accountCount(): Int suspend fun accountCount(): Int

@ -64,7 +64,7 @@ class GoogleTaskSynchronizer @Inject constructor(
if (i == 0 || inventory.hasPro) { if (i == 0 || inventory.hasPro) {
synchronize(account) synchronize(account)
} else { } else {
account.error = context.getString(R.string.requires_pro_subscription) account.error = CaldavAccount.ERROR_PAYMENT_REQUIRED
} }
} catch (e: SocketTimeoutException) { } catch (e: SocketTimeoutException) {
Timber.e(e) 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.lifecycle.lifecycleScope
import androidx.preference.Preference import androidx.preference.Preference
import androidx.preference.PreferenceScreen import androidx.preference.PreferenceScreen
import com.todoroo.astrid.gtasks.auth.GtasksLoginActivity
import com.todoroo.astrid.service.TaskDeleter import com.todoroo.astrid.service.TaskDeleter
import dagger.hilt.android.AndroidEntryPoint import dagger.hilt.android.AndroidEntryPoint
import kotlinx.coroutines.NonCancellable import kotlinx.coroutines.NonCancellable
@ -23,6 +22,7 @@ import org.tasks.preferences.IconPreference
import org.tasks.preferences.MainPreferences import org.tasks.preferences.MainPreferences
import org.tasks.preferences.Preferences import org.tasks.preferences.Preferences
import org.tasks.preferences.PreferencesViewModel import org.tasks.preferences.PreferencesViewModel
import org.tasks.preferences.fragments.GoogleTasksAccount.Companion.newGoogleTasksAccountPreference
import org.tasks.preferences.fragments.TasksAccount.Companion.newTasksAccountPreference import org.tasks.preferences.fragments.TasksAccount.Companion.newTasksAccountPreference
import org.tasks.sync.AddAccountDialog.Companion.newAccountDialog import org.tasks.sync.AddAccountDialog.Companion.newAccountDialog
import org.tasks.widget.AppWidgetManager import org.tasks.widget.AppWidgetManager
@ -158,47 +158,15 @@ class MainSettingsFragment : InjectingPreferenceFragment() {
pref.summary = account.account pref.summary = account.account
setupErrorIcon(pref, account.error) setupErrorIcon(pref, account.error)
pref.setOnPreferenceClickListener { pref.setOnPreferenceClickListener {
dialogBuilder (activity as MainPreferences).startPreference(
.newDialog(account.account) this,
.setItems( newGoogleTasksAccountPreference(account),
listOf( account.account!!
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()
false 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?) { private fun setupErrorIcon(pref: IconPreference, error: String?) {
val hasError = !error.isNullOrBlank() val hasError = !error.isNullOrBlank()

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

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

@ -449,7 +449,7 @@
<string name="repeat_minutely">OPAKOVAT PO MINUTĚ</string> <string name="repeat_minutely">OPAKOVAT PO MINUTĚ</string>
<string name="repeat_number_of_times">Opakovat několikrát</string> <string name="repeat_number_of_times">Opakovat několikrát</string>
<string name="when_overdue">Po termínu</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="cannot_access_account">Nepodařilo se připojit k účtu</string>
<string name="action_create_new_task">Vytvořit nový úkol</string> <string name="action_create_new_task">Vytvořit nový úkol</string>
<string name="show_description">Zobrazit poznámky</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="action_create_new_task">Opret ny opgave</string>
<string name="reinitialize_account">Geninitialisér</string> <string name="reinitialize_account">Geninitialisér</string>
<string name="cannot_access_account">Kunne ikke tilgå kontoen</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="logout">Log ud</string>
<string name="this_feature_requires_a_subscription">Denne funktion kræver et abonnement</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> <string name="requires_pro_subscription">Kræver pro-abonnement</string>

@ -418,7 +418,7 @@
<string name="pro_dashclock_extension">Dashclock-Erweiterung</string> <string name="pro_dashclock_extension">Dashclock-Erweiterung</string>
<string name="requires_pro_subscription">Pro-Freischaltung benötigt</string> <string name="requires_pro_subscription">Pro-Freischaltung benötigt</string>
<string name="logout">Abmelden</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="cannot_access_account">Zugriff auf Konto fehlgeschlagen</string>
<string name="reinitialize_account">Neu initialisieren</string> <string name="reinitialize_account">Neu initialisieren</string>
<string name="action_create_new_task">Neue Aufgabe erstellen</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="pro_dashclock_extension">Extensión Dashclock</string>
<string name="requires_pro_subscription">Requiere suscripción profesional</string> <string name="requires_pro_subscription">Requiere suscripción profesional</string>
<string name="logout">Cerrar sesión</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="cannot_access_account">No se puede acceder a la cuenta</string>
<string name="reinitialize_account">Reinicializar</string> <string name="reinitialize_account">Reinicializar</string>
<string name="action_create_new_task">Crear nueva tarea</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="pro_dashclock_extension">Dashclock luzapena</string>
<string name="requires_pro_subscription">Pro harpidetza eskatzen du</string> <string name="requires_pro_subscription">Pro harpidetza eskatzen du</string>
<string name="logout">Amaitu saioa</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="cannot_access_account">Ezin izan da kontua atzitu</string>
<string name="reinitialize_account">Berrhasi</string> <string name="reinitialize_account">Berrhasi</string>
<string name="action_create_new_task">Sortu zeregin berria</string> <string name="action_create_new_task">Sortu zeregin berria</string>

@ -569,7 +569,7 @@
<string name="whats_new">Päivitykset</string> <string name="whats_new">Päivitykset</string>
<string name="location_departed">Lähdit paikasta %s</string> <string name="location_departed">Lähdit paikasta %s</string>
<string name="location_arrived">Saavuit paikkaan %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="refresh_purchases">Päivitä ostoksesi</string>
<string name="widget_due_date_hidden">Piilotettu</string> <string name="widget_due_date_hidden">Piilotettu</string>
<string name="widget_due_date_below_title">Otsikon alle</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="pro_dashclock_extension">Extension Dashclock</string>
<string name="requires_pro_subscription">Abonnement professionnel requis</string> <string name="requires_pro_subscription">Abonnement professionnel requis</string>
<string name="logout">Se déconnecter</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="cannot_access_account">Impossible d\'accéder au compte</string>
<string name="reinitialize_account">Réinitialiser</string> <string name="reinitialize_account">Réinitialiser</string>
<string name="action_create_new_task">Créer une nouvelle tâche</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="show_description">Prikaži opis</string>
<string name="action_create_new_task">Stvori novi zadatak</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="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="logout">Odjavi</string>
<string name="license_summary">Tasks je libre aplikacija otvorenog koda, licencirano pod GNU General Public License v3.0</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> <string name="about">O aplikaciju</string>

@ -422,7 +422,7 @@
<string name="pro_dashclock_extension">Dashclock kiterjesztés</string> <string name="pro_dashclock_extension">Dashclock kiterjesztés</string>
<string name="requires_pro_subscription">Pro előfizetést igényel</string> <string name="requires_pro_subscription">Pro előfizetést igényel</string>
<string name="logout">Kijelentkezés</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="cannot_access_account">Fiók nem elérhető</string>
<string name="reinitialize_account">Újrainicializálás</string> <string name="reinitialize_account">Újrainicializálás</string>
<string name="action_create_new_task">Új feladat létrehozása</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="pro_dashclock_extension">Ekstensi Dashclock</string>
<string name="requires_pro_subscription">Membutuhkan langganan versi pro</string> <string name="requires_pro_subscription">Membutuhkan langganan versi pro</string>
<string name="logout">Keluar</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="cannot_access_account">Tidak bisa mengakses akun</string>
<string name="reinitialize_account">Inisialisasi ulang</string> <string name="reinitialize_account">Inisialisasi ulang</string>
<string name="action_create_new_task">Buat tugas baru</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="pro_dashclock_extension">Estensione Dashclock</string>
<string name="requires_pro_subscription">Richiede versione premium</string> <string name="requires_pro_subscription">Richiede versione premium</string>
<string name="logout">Esci</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="cannot_access_account">Impossibile accedere all\'account</string>
<string name="reinitialize_account">Reinizializza</string> <string name="reinitialize_account">Reinizializza</string>
<string name="action_create_new_task">Crea nuova attività</string> <string name="action_create_new_task">Crea nuova attività</string>

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

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

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

@ -418,7 +418,7 @@
<string name="pro_dashclock_extension">Dashclock plėtinys</string> <string name="pro_dashclock_extension">Dashclock plėtinys</string>
<string name="requires_pro_subscription">Reikalinga \"pro\" prenumerata</string> <string name="requires_pro_subscription">Reikalinga \"pro\" prenumerata</string>
<string name="logout">Atsijungti</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="cannot_access_account">Paskyra nepasiekiama.</string>
<string name="reinitialize_account">Inicijuoti iš naujo</string> <string name="reinitialize_account">Inicijuoti iš naujo</string>
<string name="action_create_new_task">Sukurti naują užduotį</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="pro_dashclock_extension">Dashclock-utvidelse</string>
<string name="requires_pro_subscription">Krever pro-abonnement</string> <string name="requires_pro_subscription">Krever pro-abonnement</string>
<string name="logout">Logg ut</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="cannot_access_account">Får ikke tilgang til konto</string>
<string name="reinitialize_account">Last inn på ny</string> <string name="reinitialize_account">Last inn på ny</string>
<string name="action_create_new_task">Opprett nytt gjøremål</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="pro_dashclock_extension">Dashclock extentie</string>
<string name="requires_pro_subscription">Pro abonnement vereist</string> <string name="requires_pro_subscription">Pro abonnement vereist</string>
<string name="logout">Uitloggen</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="cannot_access_account">Geen toegang tot account</string>
<string name="reinitialize_account">Herinitialiseren</string> <string name="reinitialize_account">Herinitialiseren</string>
<string name="action_create_new_task">Nieuwe taak maken</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="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="requires_pro_subscription">Wymaga subskrypcji pro</string>
<string name="logout">Wyloguj</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="cannot_access_account">Brak dostępu do konta</string>
<string name="reinitialize_account">Powiąż ponownie</string> <string name="reinitialize_account">Powiąż ponownie</string>
<string name="action_create_new_task">Stwórz nowe zadanie</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="pro_dashclock_extension">Extensão Dashclock</string>
<string name="requires_pro_subscription">Requer subscrição Pro</string> <string name="requires_pro_subscription">Requer subscrição Pro</string>
<string name="logout">Sair</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="cannot_access_account">Não é possível acessar a conta</string>
<string name="reinitialize_account">Reinicializar</string> <string name="reinitialize_account">Reinicializar</string>
<string name="action_create_new_task">Criar nova tarefa</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="action_create_new_task">Criar nova tarefa</string>
<string name="reinitialize_account">Reinicializar</string> <string name="reinitialize_account">Reinicializar</string>
<string name="cannot_access_account">Não é possível acessar a conta</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="logout">Sair</string>
<string name="requires_pro_subscription">Requer assinatura pro</string> <string name="requires_pro_subscription">Requer assinatura pro</string>
<string name="pro_dashclock_extension">Extensão Dashclock</string> <string name="pro_dashclock_extension">Extensão Dashclock</string>

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

@ -418,7 +418,7 @@
<string name="pro_dashclock_extension">Rozšírenie Dashclock</string> <string name="pro_dashclock_extension">Rozšírenie Dashclock</string>
<string name="requires_pro_subscription">Vyžaduje platenú verziu pro</string> <string name="requires_pro_subscription">Vyžaduje platenú verziu pro</string>
<string name="logout">Odhlásiť sa</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="cannot_access_account">Chyba v prístupe k účtu</string>
<string name="reinitialize_account">Znovu aktivovať</string> <string name="reinitialize_account">Znovu aktivovať</string>
<string name="action_create_new_task">Vytvoriť novú úlohu</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="pro_dashclock_extension">DashClock extension</string>
<string name="requires_pro_subscription">Kräver Pro-prenumeration</string> <string name="requires_pro_subscription">Kräver Pro-prenumeration</string>
<string name="logout">Logga ut</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="cannot_access_account">Kan inte komma åt kontot</string>
<string name="reinitialize_account">Initiera</string> <string name="reinitialize_account">Initiera</string>
<string name="action_create_new_task">Skapa ny uppgift</string> <string name="action_create_new_task">Skapa ny uppgift</string>

@ -291,7 +291,7 @@
<string name="action_create_new_task">புதிய பணியை உருவாக்கவும்</string> <string name="action_create_new_task">புதிய பணியை உருவாக்கவும்</string>
<string name="reinitialize_account">மீண்டும் துவக்கு</string> <string name="reinitialize_account">மீண்டும் துவக்கு</string>
<string name="cannot_access_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="logout">வெளியேறு</string>
<string name="this_feature_requires_a_subscription">இந்த அம்சத்திற்கு சந்தா தேவை</string> <string name="this_feature_requires_a_subscription">இந்த அம்சத்திற்கு சந்தா தேவை</string>
<string name="requires_pro_subscription">சார்பு சந்தா தேவை</string> <string name="requires_pro_subscription">சார்பு சந்தா தேவை</string>

@ -424,7 +424,7 @@
<string name="pro_dashclock_extension">Dashclock eklentisi</string> <string name="pro_dashclock_extension">Dashclock eklentisi</string>
<string name="requires_pro_subscription">Pro aboneliği gerektirir</string> <string name="requires_pro_subscription">Pro aboneliği gerektirir</string>
<string name="logout">Oturumu kapat</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="cannot_access_account">Hesaba erişilemedi</string>
<string name="reinitialize_account">Yeniden başlat</string> <string name="reinitialize_account">Yeniden başlat</string>
<string name="action_create_new_task">Yeni görev oluştur</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="pro_dashclock_extension">Розширення Dashclock</string>
<string name="requires_pro_subscription">Потребує преміум підписки</string> <string name="requires_pro_subscription">Потребує преміум підписки</string>
<string name="logout">Вийти</string> <string name="logout">Вийти</string>
<string name="logout_warning">Вийти з %s? Всі дані цього облікового запису будуть видалені з пристрою</string> <string name="logout_warning">Всі дані цього облікового запису будуть видалені з пристрою</string>
<string name="cannot_access_account">Немає доступу до облікового запису</string> <string name="cannot_access_account">Немає доступу до облікового запису</string>
<string name="reinitialize_account">Ініціалізувати ще раз</string> <string name="reinitialize_account">Ініціалізувати ще раз</string>
<string name="action_create_new_task">Створити нове завдання</string> <string name="action_create_new_task">Створити нове завдання</string>

@ -404,7 +404,7 @@
<string name="pro_dashclock_extension">Dashclock扩展</string> <string name="pro_dashclock_extension">Dashclock扩展</string>
<string name="requires_pro_subscription">需要订阅专业版</string> <string name="requires_pro_subscription">需要订阅专业版</string>
<string name="logout">登出</string> <string name="logout">登出</string>
<string name="logout_warning">登出 %s? 此帐户的所有数据都将从您的设备中删除</string> <string name="logout_warning">此帐户的所有数据都将从您的设备中删除</string>
<string name="cannot_access_account">无法访问帐户</string> <string name="cannot_access_account">无法访问帐户</string>
<string name="reinitialize_account">重新初始化</string> <string name="reinitialize_account">重新初始化</string>
<string name="action_create_new_task">新建任务</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="requires_pro_subscription">Requires pro subscription</string>
<string name="this_feature_requires_a_subscription">This feature requires a subscription</string> <string name="this_feature_requires_a_subscription">This feature requires a subscription</string>
<string name="logout">Log out</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="cannot_access_account">Cannot access account</string>
<string name="reinitialize_account">Reinitialize</string> <string name="reinitialize_account">Reinitialize</string>
<string name="action_create_new_task">Create new task</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