From 64e845a6fe3e4a441d0c58f521e6bd324b829564 Mon Sep 17 00:00:00 2001 From: Alex Baker Date: Mon, 18 Jan 2021 18:44:05 -0600 Subject: [PATCH] Move sync accounts to top level prefs menu Remove synchronization submenu --- .../astrid/adapter/SubheaderViewHolder.kt | 8 +- .../main/java/org/tasks/data/CaldavAccount.kt | 38 ++++ app/src/main/java/org/tasks/data/CaldavDao.kt | 11 + .../java/org/tasks/data/GoogleTaskListDao.kt | 3 + .../org/tasks/preferences/MainPreferences.kt | 6 +- .../java/org/tasks/preferences/Preferences.kt | 1 - .../tasks/preferences/PreferencesViewModel.kt | 11 +- .../org/tasks/preferences/SyncPreferences.kt | 13 -- .../fragments/MainSettingsFragment.kt | 212 ++++++++++++++---- .../preferences/fragments/Synchronization.kt | 190 ---------------- .../preferences/fragments/TasksAccount.kt | 3 +- .../java/org/tasks/sync/AddAccountDialog.kt | 6 +- .../res/drawable/ic_davx5_icon_green_bg.xml | 4 +- app/src/main/res/drawable/ic_decsync.xml | 4 +- app/src/main/res/drawable/ic_etesync.xml | 4 +- app/src/main/res/drawable/ic_google.xml | 4 +- app/src/main/res/drawable/ic_round_icon.xml | 4 +- .../main/res/drawable/ic_round_icon_36dp.xml | 14 -- app/src/main/res/values-ar/strings.xml | 1 - app/src/main/res/values-bg-rBG/strings.xml | 1 - app/src/main/res/values-cs/strings.xml | 1 - app/src/main/res/values-da/strings.xml | 1 - app/src/main/res/values-de/strings.xml | 1 - app/src/main/res/values-es/strings.xml | 1 - app/src/main/res/values-et/strings.xml | 1 - app/src/main/res/values-eu/strings.xml | 1 - app/src/main/res/values-fi/strings.xml | 1 - app/src/main/res/values-fr/strings.xml | 1 - app/src/main/res/values-gl/strings.xml | 1 - app/src/main/res/values-hu/strings.xml | 1 - app/src/main/res/values-id/strings.xml | 1 - app/src/main/res/values-it/strings.xml | 1 - app/src/main/res/values-iw/strings.xml | 1 - app/src/main/res/values-ja/strings.xml | 1 - app/src/main/res/values-ko/strings.xml | 1 - app/src/main/res/values-lt/strings.xml | 1 - app/src/main/res/values-nb/strings.xml | 1 - app/src/main/res/values-nl/strings.xml | 1 - app/src/main/res/values-pl/strings.xml | 1 - app/src/main/res/values-pt-rBR/strings.xml | 1 - app/src/main/res/values-pt/strings.xml | 1 - app/src/main/res/values-ru/strings.xml | 1 - app/src/main/res/values-sk/strings.xml | 1 - app/src/main/res/values-sv/strings.xml | 1 - app/src/main/res/values-ta/strings.xml | 1 - app/src/main/res/values-tr/strings.xml | 1 - app/src/main/res/values-uk/strings.xml | 1 - app/src/main/res/values-zh-rCN/strings.xml | 1 - app/src/main/res/values-zh-rTW/strings.xml | 1 - app/src/main/res/values/strings.xml | 1 - app/src/main/res/xml/preferences.xml | 18 +- .../res/xml/preferences_synchronization.xml | 16 -- 52 files changed, 252 insertions(+), 350 deletions(-) delete mode 100644 app/src/main/java/org/tasks/preferences/SyncPreferences.kt delete mode 100644 app/src/main/java/org/tasks/preferences/fragments/Synchronization.kt delete mode 100644 app/src/main/res/drawable/ic_round_icon_36dp.xml delete mode 100644 app/src/main/res/xml/preferences_synchronization.xml diff --git a/app/src/main/java/com/todoroo/astrid/adapter/SubheaderViewHolder.kt b/app/src/main/java/com/todoroo/astrid/adapter/SubheaderViewHolder.kt index c2684ffce..871e1c933 100644 --- a/app/src/main/java/com/todoroo/astrid/adapter/SubheaderViewHolder.kt +++ b/app/src/main/java/com/todoroo/astrid/adapter/SubheaderViewHolder.kt @@ -19,7 +19,6 @@ import org.tasks.filters.NavigationDrawerSubheader import org.tasks.filters.NavigationDrawerSubheader.SubheaderType import org.tasks.preferences.MainPreferences import org.tasks.preferences.Preferences -import org.tasks.preferences.SyncPreferences import org.tasks.themes.DrawableUtil internal class SubheaderViewHolder( @@ -66,12 +65,7 @@ internal class SubheaderViewHolder( init { ButterKnife.bind(this, itemView) errorIcon.setOnClickListener { - val preferenceClass = if (subheader.subheaderType == SubheaderType.TASKS) { - MainPreferences::class.java - } else { - SyncPreferences::class.java - } - activity.startActivity(Intent(activity, preferenceClass)) + activity.startActivity(Intent(activity, MainPreferences::class.java)) } } } \ No newline at end of file diff --git a/app/src/main/java/org/tasks/data/CaldavAccount.kt b/app/src/main/java/org/tasks/data/CaldavAccount.kt index ae466429f..2bd25dce7 100644 --- a/app/src/main/java/org/tasks/data/CaldavAccount.kt +++ b/app/src/main/java/org/tasks/data/CaldavAccount.kt @@ -12,10 +12,18 @@ import com.todoroo.andlib.data.Table import com.todoroo.astrid.data.Task import org.tasks.R import org.tasks.activities.BaseListSettingsActivity +import org.tasks.caldav.BaseCaldavAccountSettingsActivity +import org.tasks.caldav.CaldavAccountSettingsActivity import org.tasks.caldav.CaldavCalendarSettingsActivity import org.tasks.caldav.LocalListSettingsActivity +import org.tasks.data.OpenTaskDao.Companion.isDavx5 +import org.tasks.data.OpenTaskDao.Companion.isDecSync +import org.tasks.data.OpenTaskDao.Companion.isEteSync +import org.tasks.etebase.EtebaseAccountSettingsActivity import org.tasks.etebase.EtebaseCalendarSettingsActivity +import org.tasks.etesync.EteSyncAccountSettingsActivity import org.tasks.etesync.EteSyncCalendarSettingsActivity +import org.tasks.opentasks.OpenTaskAccountSettingsActivity import org.tasks.opentasks.OpenTasksListSettingsActivity import org.tasks.security.KeyStoreEncryption import java.net.HttpURLConnection @@ -111,6 +119,15 @@ class CaldavAccount : Parcelable { else -> CaldavCalendarSettingsActivity::class.java } + val accountSettingsClass: Class + get() = when { + isCaldavAccount -> CaldavAccountSettingsActivity::class.java + isEteSyncAccount -> EteSyncAccountSettingsActivity::class.java + isEtebaseAccount -> EtebaseAccountSettingsActivity::class.java + isOpenTasks -> OpenTaskAccountSettingsActivity::class.java + else -> throw IllegalArgumentException("Unexpected account type: $this") + } + override fun describeContents() = 0 override fun writeToParcel(dest: Parcel, flags: Int) { @@ -178,6 +195,27 @@ class CaldavAccount : Parcelable { fun isPaymentRequired() = error?.startsWith(EROR_PAYMENT_REQUIRED) == true + val prefTitle: Int + get() = when { + isTasksOrg -> R.string.tasks_org + isCaldavAccount -> R.string.caldav + isEtebaseAccount || uuid.isEteSync() -> R.string.etesync + isEteSyncAccount -> R.string.etesync_v1 + uuid.isDavx5() -> R.string.davx5 + uuid.isDecSync() -> R.string.decsync + else -> 0 + } + + val prefIcon: Int + get() = when { + isTasksOrg -> R.drawable.ic_round_icon + isCaldavAccount -> R.drawable.ic_webdav_logo + isEtebaseAccount || isEteSyncAccount || uuid.isEteSync() -> R.drawable.ic_etesync + uuid.isDavx5() -> R.drawable.ic_davx5_icon_green_bg + uuid.isDecSync() -> R.drawable.ic_decsync + else -> 0 + } + companion object { val TABLE = Table("caldav_accounts") val UUID = TABLE.column("cda_uuid") diff --git a/app/src/main/java/org/tasks/data/CaldavDao.kt b/app/src/main/java/org/tasks/data/CaldavDao.kt index 0afb26c71..ed5c68540 100644 --- a/app/src/main/java/org/tasks/data/CaldavDao.kt +++ b/app/src/main/java/org/tasks/data/CaldavDao.kt @@ -51,6 +51,17 @@ abstract class CaldavDao { @Query(""" SELECT * FROM caldav_accounts +WHERE cda_account_type != $TYPE_LOCAL +ORDER BY CASE cda_account_type + WHEN $TYPE_TASKS THEN 0 + ELSE 1 + END, UPPER(cda_name) + """) + abstract fun watchAccounts(): LiveData> + + @Query(""" +SELECT * +FROM caldav_accounts ORDER BY CASE cda_account_type WHEN $TYPE_TASKS THEN 0 WHEN $TYPE_LOCAL THEN 2 diff --git a/app/src/main/java/org/tasks/data/GoogleTaskListDao.kt b/app/src/main/java/org/tasks/data/GoogleTaskListDao.kt index 5344a5579..dc3191841 100644 --- a/app/src/main/java/org/tasks/data/GoogleTaskListDao.kt +++ b/app/src/main/java/org/tasks/data/GoogleTaskListDao.kt @@ -14,6 +14,9 @@ interface GoogleTaskListDao { @Query("SELECT * FROM google_task_accounts") suspend fun getAccounts(): List + @Query("SELECT * FROM google_task_accounts") + fun watchAccounts(): LiveData> + @Query("SELECT * FROM google_task_accounts WHERE gta_account = :account COLLATE NOCASE LIMIT 1") suspend fun getAccount(account: String): GoogleTaskAccount? diff --git a/app/src/main/java/org/tasks/preferences/MainPreferences.kt b/app/src/main/java/org/tasks/preferences/MainPreferences.kt index a1fa8cec4..862cb986c 100644 --- a/app/src/main/java/org/tasks/preferences/MainPreferences.kt +++ b/app/src/main/java/org/tasks/preferences/MainPreferences.kt @@ -15,9 +15,9 @@ import org.tasks.R import org.tasks.auth.SignInActivity import org.tasks.jobs.WorkManager import org.tasks.preferences.fragments.MainSettingsFragment -import org.tasks.preferences.fragments.Synchronization.Companion.REQUEST_CALDAV_SETTINGS -import org.tasks.preferences.fragments.Synchronization.Companion.REQUEST_GOOGLE_TASKS -import org.tasks.preferences.fragments.Synchronization.Companion.REQUEST_TASKS_ORG +import org.tasks.preferences.fragments.MainSettingsFragment.Companion.REQUEST_CALDAV_SETTINGS +import org.tasks.preferences.fragments.MainSettingsFragment.Companion.REQUEST_GOOGLE_TASKS +import org.tasks.preferences.fragments.MainSettingsFragment.Companion.REQUEST_TASKS_ORG import org.tasks.preferences.fragments.TasksAccount import org.tasks.sync.SyncAdapters import org.tasks.ui.Toaster diff --git a/app/src/main/java/org/tasks/preferences/Preferences.kt b/app/src/main/java/org/tasks/preferences/Preferences.kt index 00b9ddf32..b2d4ee1b6 100644 --- a/app/src/main/java/org/tasks/preferences/Preferences.kt +++ b/app/src/main/java/org/tasks/preferences/Preferences.kt @@ -171,7 +171,6 @@ class Preferences @JvmOverloads constructor( PreferenceManager.setDefaultValues(context, R.xml.preferences, true) PreferenceManager.setDefaultValues(context, R.xml.preferences_look_and_feel, true) PreferenceManager.setDefaultValues(context, R.xml.preferences_notifications, true) - PreferenceManager.setDefaultValues(context, R.xml.preferences_synchronization, true) PreferenceManager.setDefaultValues(context, R.xml.preferences_task_defaults, true) PreferenceManager.setDefaultValues(context, R.xml.preferences_date_and_time, true) PreferenceManager.setDefaultValues(context, R.xml.preferences_navigation_drawer, true) diff --git a/app/src/main/java/org/tasks/preferences/PreferencesViewModel.kt b/app/src/main/java/org/tasks/preferences/PreferencesViewModel.kt index d38226933..6f0ad01af 100644 --- a/app/src/main/java/org/tasks/preferences/PreferencesViewModel.kt +++ b/app/src/main/java/org/tasks/preferences/PreferencesViewModel.kt @@ -14,8 +14,7 @@ import kotlinx.coroutines.launch import kotlinx.coroutines.withContext import org.tasks.R import org.tasks.backup.BackupConstants -import org.tasks.data.CaldavAccount -import org.tasks.data.CaldavDao +import org.tasks.data.* import org.tasks.date.DateTimeUtils.newDateTime import org.tasks.googleapis.InvokerFactory import org.tasks.gtasks.GoogleAccountManager @@ -27,12 +26,15 @@ class PreferencesViewModel @ViewModelInject constructor( private val preferences: Preferences, invokers: InvokerFactory, private val googleAccountManager: GoogleAccountManager, - private val caldavDao: CaldavDao, + caldavDao: CaldavDao, + googleTaskListDao: GoogleTaskListDao, ) : ViewModel() { private val driveInvoker = invokers.getDriveInvoker() val lastBackup = MutableLiveData() val lastDriveBackup = MutableLiveData() val lastAndroidBackup = MutableLiveData() + var googleTaskAccounts = googleTaskListDao.watchAccounts() + var caldavAccounts = caldavDao.watchAccounts() private fun isStale(timestamp: Long?) = timestamp != null @@ -60,8 +62,7 @@ class PreferencesViewModel @ViewModelInject constructor( return if (enabled) account else null } - suspend fun tasksAccount(): CaldavAccount? = - caldavDao.getAccounts(CaldavAccount.TYPE_TASKS).firstOrNull() + fun tasksAccount(): CaldavAccount? = caldavAccounts.value?.firstOrNull { it.isTasksOrg } fun updateDriveBackup() = viewModelScope.launch { if (driveAccount.isNullOrBlank()) { diff --git a/app/src/main/java/org/tasks/preferences/SyncPreferences.kt b/app/src/main/java/org/tasks/preferences/SyncPreferences.kt deleted file mode 100644 index 40b7a21b5..000000000 --- a/app/src/main/java/org/tasks/preferences/SyncPreferences.kt +++ /dev/null @@ -1,13 +0,0 @@ -package org.tasks.preferences - -import dagger.hilt.android.AndroidEntryPoint -import org.tasks.R -import org.tasks.preferences.fragments.Synchronization - -@AndroidEntryPoint -class SyncPreferences : BasePreferences() { - - override fun getRootTitle() = R.string.synchronization - - override fun getRootPreference() = Synchronization() -} \ No newline at end of file diff --git a/app/src/main/java/org/tasks/preferences/fragments/MainSettingsFragment.kt b/app/src/main/java/org/tasks/preferences/fragments/MainSettingsFragment.kt index 506be5f2e..94ca5e650 100644 --- a/app/src/main/java/org/tasks/preferences/fragments/MainSettingsFragment.kt +++ b/app/src/main/java/org/tasks/preferences/fragments/MainSettingsFragment.kt @@ -5,17 +5,26 @@ import android.os.Bundle import androidx.core.content.ContextCompat 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 import kotlinx.coroutines.launch +import kotlinx.coroutines.withContext import org.tasks.BuildConfig import org.tasks.R -import org.tasks.auth.SignInActivity +import org.tasks.caldav.BaseCaldavAccountSettingsActivity +import org.tasks.data.CaldavAccount +import org.tasks.data.GoogleTaskAccount import org.tasks.injection.InjectingPreferenceFragment 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.TasksAccount.Companion.newTasksAccountPreference +import org.tasks.sync.AddAccountDialog.Companion.newAccountDialog import org.tasks.widget.AppWidgetManager import javax.inject.Inject @@ -24,6 +33,7 @@ class MainSettingsFragment : InjectingPreferenceFragment() { @Inject lateinit var appWidgetManager: AppWidgetManager @Inject lateinit var preferences: Preferences + @Inject lateinit var taskDeleter: TaskDeleter private val viewModel: PreferencesViewModel by activityViewModels() @@ -32,64 +42,59 @@ class MainSettingsFragment : InjectingPreferenceFragment() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) - val pref = findPreference(R.string.tasks_org) as IconPreference - pref.setIcon(R.drawable.ic_round_icon_36dp) - pref.iconVisible = true - - findPreference(R.string.synchronization).summary = - resources - .getStringArray(R.array.synchronization_services) - .joinToString(getString(R.string.list_separator_with_space)) + findPreference(R.string.add_account).setOnPreferenceClickListener { addAccount() } viewModel.lastBackup.observe(this) { updateBackupWarning() } viewModel.lastAndroidBackup.observe(this) { updateBackupWarning() } viewModel.lastDriveBackup.observe(this) { updateBackupWarning() } + viewModel.googleTaskAccounts.observe(this) { refreshAccounts() } + viewModel.caldavAccounts.observe(this) { refreshAccounts() } } override fun onResume() { super.onResume() - lifecycleScope.launch { - updateAccount() - } updateBackupWarning() updateWidgetVisibility() } - private suspend fun updateAccount() { - val pref = findPreference(R.string.tasks_org) as IconPreference - pref.drawable = ContextCompat - .getDrawable(requireContext(), R.drawable.ic_keyboard_arrow_right_24px) - ?.mutate() - pref.tint = context?.getColor(R.color.icon_tint_with_alpha) - val account = viewModel.tasksAccount() - if (account == null) { - pref.setOnPreferenceClickListener { signIn() } - pref.summary = getString(R.string.not_signed_in) - return + private fun refreshAccounts() { + val caldavAccounts = viewModel.caldavAccounts.value ?: emptyList() + val googleTaskAccounts = viewModel.googleTaskAccounts.value ?: emptyList() + val addAccount = findPreference(R.string.add_account) + val index = preferenceScreen.indexOf(addAccount) + var current = 0 + caldavAccounts.forEach { + setup(it, if (current < index) { + preferenceScreen.getPreference(current++) as IconPreference + } else { + preferenceScreen.insertAt(current++) + }) } - pref.summary = account.name - - if (!account.error.isNullOrBlank()) { - pref.drawable = ContextCompat - .getDrawable(requireContext(), R.drawable.ic_outline_error_outline_24px) - ?.mutate() - pref.tint = context?.getColor(R.color.overdue) + googleTaskAccounts.forEach { + setup(it, if (current < index) { + preferenceScreen.getPreference(current++) as IconPreference + } else { + preferenceScreen.insertAt(current++) + }) } - pref.setOnPreferenceClickListener { - (activity as MainPreferences).startPreference( - this, - newTasksAccountPreference(account), - getString(R.string.tasks_org) - ) - false + repeat(current.until(index).count()) { + preferenceScreen.removePreference(preferenceScreen.getPreference(current)) } + if (caldavAccounts.isEmpty() && googleTaskAccounts.isEmpty()) { + addAccount.setTitle(R.string.not_signed_in) + addAccount.setIcon(R.drawable.ic_outline_cloud_24px) + } else { + addAccount.setTitle(R.string.add_account) + addAccount.setIcon(R.drawable.ic_outline_add_24px) + } + tintIcons(addAccount, requireContext().getColor(R.color.icon_tint_with_alpha)) } - private fun signIn(): Boolean { - activity?.startActivityForResult( - Intent(activity, SignInActivity::class.java), - Synchronization.REQUEST_TASKS_ORG) + private fun addAccount(): Boolean { + val hasTasksAccount = viewModel.tasksAccount() != null + newAccountDialog(this@MainSettingsFragment, REQUEST_ADD_ACCOUNT, hasTasksAccount) + .show(parentFragmentManager, FRAG_TAG_ADD_ACCOUNT) return false } @@ -111,4 +116,129 @@ class MainSettingsFragment : InjectingPreferenceFragment() { || viewModel.staleRemoteBackup) (findPreference(R.string.backup_BPr_header) as IconPreference).iconVisible = backupWarning } + + private fun setup(account: CaldavAccount, pref: IconPreference) { + pref.setTitle(account.prefTitle) + pref.summary = account.name + pref.setIcon(account.prefIcon) + if (account.isCaldavAccount) { + tintIcons(pref, requireContext().getColor(R.color.icon_tint_with_alpha)) + } + pref.setOnPreferenceClickListener { + if (account.isTasksOrg) { + (activity as MainPreferences).startPreference( + this, + newTasksAccountPreference(account), + getString(R.string.tasks_org) + ) + } else { + val intent = Intent(context, account.accountSettingsClass).apply { + putExtra(BaseCaldavAccountSettingsActivity.EXTRA_CALDAV_DATA, account) + } + startActivityForResult(intent, REQUEST_CALDAV_SETTINGS) + } + false + } + when { + account.isTasksOrg -> { + pref.setOnPreferenceClickListener { + (activity as MainPreferences).startPreference( + this, + newTasksAccountPreference(account), + getString(R.string.tasks_org) + ) + false + } + } + } + setupErrorIcon(pref, account.error) + } + + private fun setup(account: GoogleTaskAccount, pref: IconPreference) { + pref.setTitle(R.string.gtasks_GPr_header) + pref.setIcon(R.drawable.ic_google) + 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() + 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() + pref.drawable = ContextCompat + .getDrawable(requireContext(), if (hasError) { + R.drawable.ic_outline_error_outline_24px + } else { + R.drawable.ic_keyboard_arrow_right_24px + }) + ?.mutate() + pref.tint = context?.getColor(if (hasError) { + R.color.overdue + } else { + R.color.icon_tint_with_alpha + }) + } + + companion object { + private const val REQUEST_ADD_ACCOUNT = 10015 + private const val FRAG_TAG_ADD_ACCOUNT = "frag_tag_add_account" + const val REQUEST_CALDAV_SETTINGS = 10013 + const val REQUEST_GOOGLE_TASKS = 10014 + const val REQUEST_TASKS_ORG = 10016 + + + fun PreferenceScreen.indexOf(pref: Preference): Int = + 0.until(preferenceCount).first { pref == getPreference(it) } + + fun PreferenceScreen.insertAt(index: Int): IconPreference { + index.until(preferenceCount).forEach { + getPreference(it).apply { order += 1 } + } + return IconPreference(context).apply { + layoutResource = R.layout.preference_icon + order = index + iconVisible = true + addPreference(this) + } + } + } } diff --git a/app/src/main/java/org/tasks/preferences/fragments/Synchronization.kt b/app/src/main/java/org/tasks/preferences/fragments/Synchronization.kt deleted file mode 100644 index 29e8222eb..000000000 --- a/app/src/main/java/org/tasks/preferences/fragments/Synchronization.kt +++ /dev/null @@ -1,190 +0,0 @@ -package org.tasks.preferences.fragments - -import android.content.Intent -import android.os.Bundle -import androidx.fragment.app.activityViewModels -import androidx.lifecycle.lifecycleScope -import androidx.preference.Preference -import androidx.preference.PreferenceCategory -import com.todoroo.astrid.gtasks.auth.GtasksLoginActivity -import com.todoroo.astrid.service.TaskDeleter -import dagger.hilt.android.AndroidEntryPoint -import kotlinx.coroutines.NonCancellable -import kotlinx.coroutines.launch -import kotlinx.coroutines.withContext -import org.tasks.R -import org.tasks.Strings.isNullOrEmpty -import org.tasks.caldav.BaseCaldavAccountSettingsActivity -import org.tasks.caldav.CaldavAccountSettingsActivity -import org.tasks.data.CaldavAccount.Companion.TYPE_LOCAL -import org.tasks.data.CaldavAccount.Companion.TYPE_TASKS -import org.tasks.data.CaldavDao -import org.tasks.data.GoogleTaskAccount -import org.tasks.data.GoogleTaskListDao -import org.tasks.data.OpenTaskDao.Companion.isDavx5 -import org.tasks.data.OpenTaskDao.Companion.isDecSync -import org.tasks.data.OpenTaskDao.Companion.isEteSync -import org.tasks.etebase.EtebaseAccountSettingsActivity -import org.tasks.etesync.EteSyncAccountSettingsActivity -import org.tasks.injection.InjectingPreferenceFragment -import org.tasks.opentasks.OpenTaskAccountSettingsActivity -import org.tasks.preferences.Preferences -import org.tasks.preferences.PreferencesViewModel -import org.tasks.sync.AddAccountDialog.Companion.newAccountDialog -import org.tasks.sync.SyncAdapters -import javax.inject.Inject - -@AndroidEntryPoint -class Synchronization : InjectingPreferenceFragment() { - - @Inject lateinit var preferences: Preferences - @Inject lateinit var caldavDao: CaldavDao - @Inject lateinit var googleTaskListDao: GoogleTaskListDao - @Inject lateinit var taskDeleter: TaskDeleter - @Inject lateinit var syncAdapters: SyncAdapters - - private val viewModel: PreferencesViewModel by activityViewModels() - - override fun getPreferenceXml() = R.xml.preferences_synchronization - - override suspend fun setupPreferences(savedInstanceState: Bundle?) { - findPreference(R.string.add_account) - .setOnPreferenceClickListener { - lifecycleScope.launch { - val hasTasksAccount = viewModel.tasksAccount() != null - newAccountDialog(this@Synchronization, REQUEST_ADD_ACCOUNT, hasTasksAccount) - .show(parentFragmentManager, FRAG_TAG_ADD_ACCOUNT) - } - false - } - } - - override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) { - if (requestCode == REQUEST_ADD_ACCOUNT) { - refresh() - } else { - super.onActivityResult(requestCode, resultCode, data) - } - } - - override fun onResume() { - super.onResume() - - refresh() - } - - private suspend fun addGoogleTasksAccounts(category: PreferenceCategory): Boolean { - val accounts: List = googleTaskListDao.getAccounts() - for (googleTaskAccount in accounts) { - val account = googleTaskAccount.account - val preference = Preference(context) - preference.title = account - val error = googleTaskAccount.error - if (isNullOrEmpty(error)) { - preference.setSummary(R.string.gtasks_GPr_header) - } else { - preference.summary = error - } - preference.setOnPreferenceClickListener { - dialogBuilder - .newDialog(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(googleTaskAccount) - } - } - .setNegativeButton(R.string.cancel, null) - .show() - false - } - category.addPreference(preference) - } - return accounts.isNotEmpty() - } - - private suspend fun addCaldavAccounts(category: PreferenceCategory): Boolean { - val accounts = caldavDao.getAccounts().filter { - it.accountType != TYPE_LOCAL && it.accountType != TYPE_TASKS - } - for (account in accounts) { - val preference = Preference(context) - preference.title = account.name - val error = account.error - if (isNullOrEmpty(error)) { - preference.setSummary(when { - account.isCaldavAccount -> R.string.caldav - account.isEteSyncAccount -> R.string.etesync_v1 - account.isEtebaseAccount -> R.string.etesync - account.isOpenTasks && account.uuid.isEteSync() -> R.string.etesync - account.isOpenTasks && account.uuid.isDavx5() -> R.string.davx5 - account.isOpenTasks && account.uuid.isDecSync() -> R.string.decsync - else -> 0 - }) - } else { - preference.summary = error - } - preference.onPreferenceClickListener = Preference.OnPreferenceClickListener { - val intent = Intent(context, when { - account.isCaldavAccount -> CaldavAccountSettingsActivity::class.java - account.isEteSyncAccount -> EteSyncAccountSettingsActivity::class.java - account.isEtebaseAccount -> EtebaseAccountSettingsActivity::class.java - account.isOpenTasks -> OpenTaskAccountSettingsActivity::class.java - else -> throw IllegalArgumentException("Unexpected account type: $account") - }) - intent.putExtra(BaseCaldavAccountSettingsActivity.EXTRA_CALDAV_DATA, account) - startActivityForResult(intent, REQUEST_CALDAV_SETTINGS) - false - } - category.addPreference(preference) - } - return accounts.isNotEmpty() - } - - 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) - } - refresh() - } - } - .setNegativeButton(R.string.cancel, null) - .create() - alertDialog.setCanceledOnTouchOutside(false) - alertDialog.setCancelable(false) - alertDialog.show() - } - - private fun refresh() { - lifecycleScope.launch { - val synchronizationPreferences = findPreference(R.string.accounts) as PreferenceCategory - synchronizationPreferences.removeAll() - val hasGoogleAccounts: Boolean = addGoogleTasksAccounts(synchronizationPreferences) - val hasCaldavAccounts = addCaldavAccounts(synchronizationPreferences) - findPreference(R.string.accounts).isVisible = hasGoogleAccounts || hasCaldavAccounts - } - } - - companion object { - const val REQUEST_CALDAV_SETTINGS = 10013 - const val REQUEST_GOOGLE_TASKS = 10014 - private const val REQUEST_ADD_ACCOUNT = 10015 - const val REQUEST_TASKS_ORG = 10016 - private const val FRAG_TAG_ADD_ACCOUNT = "frag_tag_add_account" - } -} \ No newline at end of file diff --git a/app/src/main/java/org/tasks/preferences/fragments/TasksAccount.kt b/app/src/main/java/org/tasks/preferences/fragments/TasksAccount.kt index e744558fd..85b8cca4c 100644 --- a/app/src/main/java/org/tasks/preferences/fragments/TasksAccount.kt +++ b/app/src/main/java/org/tasks/preferences/fragments/TasksAccount.kt @@ -31,6 +31,7 @@ import org.tasks.injection.InjectingPreferenceFragment import org.tasks.jobs.WorkManager import org.tasks.locale.Locale import org.tasks.preferences.IconPreference +import org.tasks.preferences.fragments.MainSettingsFragment.Companion.REQUEST_TASKS_ORG import org.tasks.ui.Toaster import java.time.format.FormatStyle import javax.inject.Inject @@ -237,7 +238,7 @@ class TasksAccount : InjectingPreferenceFragment() { SignInActivity.EXTRA_SELECT_SERVICE, if (isGitHubAccount) 1 else 0 ), - Synchronization.REQUEST_TASKS_ORG) + REQUEST_TASKS_ORG) false } } diff --git a/app/src/main/java/org/tasks/sync/AddAccountDialog.kt b/app/src/main/java/org/tasks/sync/AddAccountDialog.kt index 55d1ece7d..37628dfa4 100644 --- a/app/src/main/java/org/tasks/sync/AddAccountDialog.kt +++ b/app/src/main/java/org/tasks/sync/AddAccountDialog.kt @@ -21,9 +21,9 @@ import org.tasks.dialogs.DialogBuilder import org.tasks.etebase.EtebaseAccountSettingsActivity import org.tasks.extensions.getMutableIntList import org.tasks.extensions.getMutableStringList -import org.tasks.preferences.fragments.Synchronization.Companion.REQUEST_CALDAV_SETTINGS -import org.tasks.preferences.fragments.Synchronization.Companion.REQUEST_GOOGLE_TASKS -import org.tasks.preferences.fragments.Synchronization.Companion.REQUEST_TASKS_ORG +import org.tasks.preferences.fragments.MainSettingsFragment.Companion.REQUEST_CALDAV_SETTINGS +import org.tasks.preferences.fragments.MainSettingsFragment.Companion.REQUEST_GOOGLE_TASKS +import org.tasks.preferences.fragments.MainSettingsFragment.Companion.REQUEST_TASKS_ORG import org.tasks.themes.DrawableUtil import javax.inject.Inject diff --git a/app/src/main/res/drawable/ic_davx5_icon_green_bg.xml b/app/src/main/res/drawable/ic_davx5_icon_green_bg.xml index 32f27b815..1331c6b75 100644 --- a/app/src/main/res/drawable/ic_davx5_icon_green_bg.xml +++ b/app/src/main/res/drawable/ic_davx5_icon_green_bg.xml @@ -1,5 +1,5 @@ - diff --git a/app/src/main/res/drawable/ic_decsync.xml b/app/src/main/res/drawable/ic_decsync.xml index 51e0c19f3..42769a9a8 100644 --- a/app/src/main/res/drawable/ic_decsync.xml +++ b/app/src/main/res/drawable/ic_decsync.xml @@ -1,6 +1,6 @@ - + android:width="36dp" xmlns:android="http://schemas.android.com/apk/res/android"> diff --git a/app/src/main/res/drawable/ic_etesync.xml b/app/src/main/res/drawable/ic_etesync.xml index a85697ad5..ec84e95b3 100644 --- a/app/src/main/res/drawable/ic_etesync.xml +++ b/app/src/main/res/drawable/ic_etesync.xml @@ -1,6 +1,6 @@ - + android:width="36dp" xmlns:android="http://schemas.android.com/apk/res/android"> + android:width="35.285688dp" xmlns:android="http://schemas.android.com/apk/res/android"> diff --git a/app/src/main/res/drawable/ic_round_icon.xml b/app/src/main/res/drawable/ic_round_icon.xml index 21e9a9807..b3f40694c 100644 --- a/app/src/main/res/drawable/ic_round_icon.xml +++ b/app/src/main/res/drawable/ic_round_icon.xml @@ -1,6 +1,6 @@ diff --git a/app/src/main/res/drawable/ic_round_icon_36dp.xml b/app/src/main/res/drawable/ic_round_icon_36dp.xml deleted file mode 100644 index 751ad0bcb..000000000 --- a/app/src/main/res/drawable/ic_round_icon_36dp.xml +++ /dev/null @@ -1,14 +0,0 @@ - - - - - - - - - - - diff --git a/app/src/main/res/values-ar/strings.xml b/app/src/main/res/values-ar/strings.xml index 873b8c827..c2ccb23e1 100644 --- a/app/src/main/res/values-ar/strings.xml +++ b/app/src/main/res/values-ar/strings.xml @@ -120,7 +120,6 @@ صوت إهتزازات الساعات الهادئة - التزامن تفعيل حجم الخط تعديل الشاشه diff --git a/app/src/main/res/values-bg-rBG/strings.xml b/app/src/main/res/values-bg-rBG/strings.xml index 379aae8f6..62be84c64 100644 --- a/app/src/main/res/values-bg-rBG/strings.xml +++ b/app/src/main/res/values-bg-rBG/strings.xml @@ -280,7 +280,6 @@ Директория за резервни копия Копирай в Google Drive Разни - Синхронизация Активирано Размер на шрифта Разстояние между редовете diff --git a/app/src/main/res/values-cs/strings.xml b/app/src/main/res/values-cs/strings.xml index 21f6b5ae5..07c8c6127 100644 --- a/app/src/main/res/values-cs/strings.xml +++ b/app/src/main/res/values-cs/strings.xml @@ -177,7 +177,6 @@ Nerušit od Složka pro zálohy Jiné - Synchronizace Povoleno Velikost písma Zdrojový kód diff --git a/app/src/main/res/values-da/strings.xml b/app/src/main/res/values-da/strings.xml index b02f8a270..ad6636003 100644 --- a/app/src/main/res/values-da/strings.xml +++ b/app/src/main/res/values-da/strings.xml @@ -373,7 +373,6 @@ Skriftstørrelse Aktiveret Underopgaver - Synkronisering Diverse Kopiér til Google Drive Mappe til sikkerhedskopi diff --git a/app/src/main/res/values-de/strings.xml b/app/src/main/res/values-de/strings.xml index 64994b48e..a1d2e77ee 100644 --- a/app/src/main/res/values-de/strings.xml +++ b/app/src/main/res/values-de/strings.xml @@ -280,7 +280,6 @@ Sicherungsordner Google Drive-Sicherung Verschiedenes - Synchronisierung Aktiviert Schriftgröße Zeilenabstand diff --git a/app/src/main/res/values-es/strings.xml b/app/src/main/res/values-es/strings.xml index 1c420adef..b39a98bd5 100644 --- a/app/src/main/res/values-es/strings.xml +++ b/app/src/main/res/values-es/strings.xml @@ -281,7 +281,6 @@ Carpeta de copia de seguridad Copia de seguridad de Google Drive Miscelánea - Sincronización Habilitado Tamaño de la fuente Espaciado de fila diff --git a/app/src/main/res/values-et/strings.xml b/app/src/main/res/values-et/strings.xml index 8cdcf0d80..7fd01e47b 100644 --- a/app/src/main/res/values-et/strings.xml +++ b/app/src/main/res/values-et/strings.xml @@ -159,7 +159,6 @@ Varukoopia kaust Kopeeri Google Drive-i Varia - Sünkroonimine Sisse lülitatud Teksti suurus Reavahed diff --git a/app/src/main/res/values-eu/strings.xml b/app/src/main/res/values-eu/strings.xml index 66c8a7a13..c77034752 100644 --- a/app/src/main/res/values-eu/strings.xml +++ b/app/src/main/res/values-eu/strings.xml @@ -283,7 +283,6 @@ Babes-kopien karpeta Google Drive babeskopia Denetarik - Sinkronizazioa Gaituta Letraren tamaina Errenkaden banatze espazioa diff --git a/app/src/main/res/values-fi/strings.xml b/app/src/main/res/values-fi/strings.xml index 2a4ca5a52..fd820025b 100644 --- a/app/src/main/res/values-fi/strings.xml +++ b/app/src/main/res/values-fi/strings.xml @@ -271,7 +271,6 @@ Liitehakemisto Varmuuskopioiden hakemisto Sekalaista - Synkronointi Sallittu Kirjasimen koko Rivinväli diff --git a/app/src/main/res/values-fr/strings.xml b/app/src/main/res/values-fr/strings.xml index 9f1d7224c..f6a878a27 100644 --- a/app/src/main/res/values-fr/strings.xml +++ b/app/src/main/res/values-fr/strings.xml @@ -264,7 +264,6 @@ Dossier de sauvegarde Sauvegarde de Google Drive Divers - Synchronisation Activé Taille de police Écartement de la ligne diff --git a/app/src/main/res/values-gl/strings.xml b/app/src/main/res/values-gl/strings.xml index 16d915b73..ddcc65360 100644 --- a/app/src/main/res/values-gl/strings.xml +++ b/app/src/main/res/values-gl/strings.xml @@ -193,7 +193,6 @@ Directorio de archivos adjuntos Directorio de copia de seguridad Miscelánea - Sincronización Habilitado Tamaño de la fuente Espaciado de fila diff --git a/app/src/main/res/values-hu/strings.xml b/app/src/main/res/values-hu/strings.xml index 8fc85512d..660ccb75d 100644 --- a/app/src/main/res/values-hu/strings.xml +++ b/app/src/main/res/values-hu/strings.xml @@ -280,7 +280,6 @@ Mentési mappa Mentés Google Drive-ba Egyéb - Szinkronizáció Engedélyezve Karakter méret Sorköz diff --git a/app/src/main/res/values-id/strings.xml b/app/src/main/res/values-id/strings.xml index 4fcd32725..e00796a17 100644 --- a/app/src/main/res/values-id/strings.xml +++ b/app/src/main/res/values-id/strings.xml @@ -203,7 +203,6 @@ Direktori cadangan Salin ke Google Drive Lain-lain - Sinkronisasi Subtugas Aktif Ukuran fon diff --git a/app/src/main/res/values-it/strings.xml b/app/src/main/res/values-it/strings.xml index 4f6599273..fc0761521 100644 --- a/app/src/main/res/values-it/strings.xml +++ b/app/src/main/res/values-it/strings.xml @@ -282,7 +282,6 @@ Cartella di backup Backup su Google Drive Varie - Sincronizzazione Attiva Dimensione carattere Interlinea diff --git a/app/src/main/res/values-iw/strings.xml b/app/src/main/res/values-iw/strings.xml index c9540e023..98f1265c3 100644 --- a/app/src/main/res/values-iw/strings.xml +++ b/app/src/main/res/values-iw/strings.xml @@ -313,7 +313,6 @@ תיקיית גיבוי גיבוי Google Drive שונות - סינכרון אפשר גודל גופן מרווח שורה diff --git a/app/src/main/res/values-ja/strings.xml b/app/src/main/res/values-ja/strings.xml index f12046b94..77298523f 100644 --- a/app/src/main/res/values-ja/strings.xml +++ b/app/src/main/res/values-ja/strings.xml @@ -278,7 +278,6 @@ ディレクトリをバックアップ Google ドライブにコピー その他 - 同期 有効 フォントサイズ 行間隔 diff --git a/app/src/main/res/values-ko/strings.xml b/app/src/main/res/values-ko/strings.xml index 79a31d4c6..5eadbfc8e 100644 --- a/app/src/main/res/values-ko/strings.xml +++ b/app/src/main/res/values-ko/strings.xml @@ -279,7 +279,6 @@ 첨부파일 위치 백업 위치 기타 - 동기화 활성화됨 글자 크기 줄 간격 diff --git a/app/src/main/res/values-lt/strings.xml b/app/src/main/res/values-lt/strings.xml index 6c2e60907..0c2c27f4c 100644 --- a/app/src/main/res/values-lt/strings.xml +++ b/app/src/main/res/values-lt/strings.xml @@ -277,7 +277,6 @@ Atsarginių kopijų direktorija Kopijuoti į Google Drive Įvairūs - Sinchronizacija Įjungta Šrifto dydis Eilutės plotis diff --git a/app/src/main/res/values-nb/strings.xml b/app/src/main/res/values-nb/strings.xml index 6ab01af0d..dfbcd6814 100644 --- a/app/src/main/res/values-nb/strings.xml +++ b/app/src/main/res/values-nb/strings.xml @@ -317,7 +317,6 @@ Sikkerhetskopimappe Google Drive-sikkerhetskopi Ymse - Synkronisering Påskrudd Skriftstørrelse Tilpass redigeringsskjerm diff --git a/app/src/main/res/values-nl/strings.xml b/app/src/main/res/values-nl/strings.xml index 13540785c..909131cdf 100644 --- a/app/src/main/res/values-nl/strings.xml +++ b/app/src/main/res/values-nl/strings.xml @@ -275,7 +275,6 @@ Bijlage map Back-up naar Google Drive Diversen - Synchronisatie Actief Font grootte Regelruimte diff --git a/app/src/main/res/values-pl/strings.xml b/app/src/main/res/values-pl/strings.xml index a1de6a151..6fd9f41a0 100644 --- a/app/src/main/res/values-pl/strings.xml +++ b/app/src/main/res/values-pl/strings.xml @@ -292,7 +292,6 @@ Katalog kopii zapasowych Kopia zapasowa na Dysku Google Różne - Synchronizacja Włączone Rozmiar czcionki Odstęp wierszy diff --git a/app/src/main/res/values-pt-rBR/strings.xml b/app/src/main/res/values-pt-rBR/strings.xml index 0676f5213..150cb420e 100644 --- a/app/src/main/res/values-pt-rBR/strings.xml +++ b/app/src/main/res/values-pt-rBR/strings.xml @@ -278,7 +278,6 @@ Pasta de backup Copiar para o Google Drive Miscelânea - Sincronização Ativado Tamanho do texto Espaçamento da linha diff --git a/app/src/main/res/values-pt/strings.xml b/app/src/main/res/values-pt/strings.xml index e0a21774b..a79f3cfb6 100644 --- a/app/src/main/res/values-pt/strings.xml +++ b/app/src/main/res/values-pt/strings.xml @@ -268,7 +268,6 @@ Diretório do anexo Diretório de cópia de segurança Outras - Sincronização Ativo Tamanho da letra Espaçamento entre linhas diff --git a/app/src/main/res/values-ru/strings.xml b/app/src/main/res/values-ru/strings.xml index 9e543a162..b80e813af 100644 --- a/app/src/main/res/values-ru/strings.xml +++ b/app/src/main/res/values-ru/strings.xml @@ -297,7 +297,6 @@ Папка резервных копий Резервное копирование в Google Drive Прочие настройки - Синхронизация Включить режим Размер шрифта Межстрочный интервал diff --git a/app/src/main/res/values-sk/strings.xml b/app/src/main/res/values-sk/strings.xml index f76ae98b9..62b91fed2 100644 --- a/app/src/main/res/values-sk/strings.xml +++ b/app/src/main/res/values-sk/strings.xml @@ -278,7 +278,6 @@ Zalóhovať adresár Kopírovať na Disk Google Rôzne - Synchronizácia Povolené Veľkosť písma Šírka riadkov diff --git a/app/src/main/res/values-sv/strings.xml b/app/src/main/res/values-sv/strings.xml index 817ce82d1..7d80a266f 100644 --- a/app/src/main/res/values-sv/strings.xml +++ b/app/src/main/res/values-sv/strings.xml @@ -193,7 +193,6 @@ Lagringsplats för bilagor Lagringsplats för säkerhetskopior Övrigt - Synkronisering Aktiverad Teckenstorlek Anpassa redigeringsvyn diff --git a/app/src/main/res/values-ta/strings.xml b/app/src/main/res/values-ta/strings.xml index 999716f5b..6332abef5 100644 --- a/app/src/main/res/values-ta/strings.xml +++ b/app/src/main/res/values-ta/strings.xml @@ -451,7 +451,6 @@ எழுத்துரு அளவு இயக்கப்பட்டது துணை பணிகள் - ஒத்திசைவு இதர Google இயக்கத்தில் நகலெடுக்கவும் காப்பு கோப்புறை diff --git a/app/src/main/res/values-tr/strings.xml b/app/src/main/res/values-tr/strings.xml index a7226eac6..272c32b10 100644 --- a/app/src/main/res/values-tr/strings.xml +++ b/app/src/main/res/values-tr/strings.xml @@ -283,7 +283,6 @@ Yedekleme klasörü Google Drive yedeği Türlü - Eşzamanlama Etkin Yazı tipi boyutu Satır aralığı diff --git a/app/src/main/res/values-uk/strings.xml b/app/src/main/res/values-uk/strings.xml index 76fe6c4ad..f2b1f3ac2 100644 --- a/app/src/main/res/values-uk/strings.xml +++ b/app/src/main/res/values-uk/strings.xml @@ -298,7 +298,6 @@ Папка з резервними копіями Резервне копіювання до Google Drive Різне - Синхронізація Увімкнено Розмір шрифту Відстань між рядками diff --git a/app/src/main/res/values-zh-rCN/strings.xml b/app/src/main/res/values-zh-rCN/strings.xml index a49ccd0dc..50f7cb7e9 100644 --- a/app/src/main/res/values-zh-rCN/strings.xml +++ b/app/src/main/res/values-zh-rCN/strings.xml @@ -265,7 +265,6 @@ 附件文件夹 备份文件夹 杂项 - 同步 启用 字体大小 行间距 diff --git a/app/src/main/res/values-zh-rTW/strings.xml b/app/src/main/res/values-zh-rTW/strings.xml index 83e1965f3..143bd20e1 100644 --- a/app/src/main/res/values-zh-rTW/strings.xml +++ b/app/src/main/res/values-zh-rTW/strings.xml @@ -167,7 +167,6 @@ 震動 備份資料夾 雜項設定 - 同步 啟用 行距 貢獻翻譯 diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index e4922996f..e45f8220b 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -323,7 +323,6 @@ File %1$s contained %2$s.\n\n Backup folder Google Drive backup Miscellaneous - Synchronization Subtasks Enabled Font size diff --git a/app/src/main/res/xml/preferences.xml b/app/src/main/res/xml/preferences.xml index a884afed9..6c41bb4f7 100644 --- a/app/src/main/res/xml/preferences.xml +++ b/app/src/main/res/xml/preferences.xml @@ -1,14 +1,10 @@ + xmlns:app="http://schemas.android.com/apk/res-auto"> - + - - - - - - - - - \ No newline at end of file