From df93322d974019bf0536ce453e9c69ea7bf896a5 Mon Sep 17 00:00:00 2001 From: Alex Baker Date: Tue, 19 Jan 2021 16:05:09 -0600 Subject: [PATCH] Move subscription buttons to main preferences --- .../preferences/fragments/HelpAndFeedback.kt | 75 ------------------- .../fragments/MainSettingsFragment.kt | 56 ++++++++++++-- .../preferences/fragments/TasksAccount.kt | 74 +++++------------- app/src/main/res/values/strings.xml | 1 + app/src/main/res/xml/help_and_feedback.xml | 15 ---- app/src/main/res/xml/preferences.xml | 24 +++++- app/src/main/res/xml/preferences_tasks.xml | 16 ---- 7 files changed, 92 insertions(+), 169 deletions(-) diff --git a/app/src/main/java/org/tasks/preferences/fragments/HelpAndFeedback.kt b/app/src/main/java/org/tasks/preferences/fragments/HelpAndFeedback.kt index 9fb8dbb80..1b575f0c3 100644 --- a/app/src/main/java/org/tasks/preferences/fragments/HelpAndFeedback.kt +++ b/app/src/main/java/org/tasks/preferences/fragments/HelpAndFeedback.kt @@ -1,38 +1,20 @@ package org.tasks.preferences.fragments -import android.content.BroadcastReceiver -import android.content.Context import android.content.Intent import android.net.Uri import android.os.Bundle import androidx.fragment.app.FragmentManager import dagger.hilt.android.AndroidEntryPoint import org.tasks.BuildConfig -import org.tasks.LocalBroadcastManager import org.tasks.R -import org.tasks.billing.BillingClient -import org.tasks.billing.Inventory -import org.tasks.billing.PurchaseDialog.Companion.FRAG_TAG_PURCHASE_DIALOG -import org.tasks.billing.PurchaseDialog.Companion.newPurchaseDialog import org.tasks.dialogs.WhatsNewDialog import org.tasks.injection.InjectingPreferenceFragment -import javax.inject.Inject private const val FRAG_TAG_WHATS_NEW = "frag_tag_whats_new" @AndroidEntryPoint class HelpAndFeedback : InjectingPreferenceFragment() { - @Inject lateinit var billingClient: BillingClient - @Inject lateinit var inventory: Inventory - @Inject lateinit var localBroadcastManager: LocalBroadcastManager - - private val purchaseReceiver = object : BroadcastReceiver() { - override fun onReceive(context: Context, intent: Intent) { - refreshSubscription() - } - } - override fun getPreferenceXml() = R.xml.help_and_feedback override suspend fun setupPreferences(savedInstanceState: Bundle?) { @@ -60,77 +42,20 @@ class HelpAndFeedback : InjectingPreferenceFragment() { false } - findPreference(R.string.refresh_purchases).setOnPreferenceClickListener { - billingClient.queryPurchases() - false - } - findPreference(R.string.p_collect_statistics) .setOnPreferenceClickListener { showRestartDialog() true } - findPreference(R.string.button_unsubscribe).setOnPreferenceClickListener { - inventory.unsubscribe(requireActivity()) - } - - findPreference(R.string.upgrade_to_pro).setOnPreferenceClickListener { - newPurchaseDialog().show(parentFragmentManager, FRAG_TAG_PURCHASE_DIALOG) - false - } - @Suppress("ConstantConditionIf") if (BuildConfig.FLAVOR == "generic") { remove( R.string.p_collect_statistics, R.string.rate_tasks, - R.string.upgrade_to_pro, - R.string.button_unsubscribe, - R.string.refresh_purchases ) } } - override fun onResume() { - super.onResume() - - localBroadcastManager.registerPurchaseReceiver(purchaseReceiver) - - refreshSubscription() - } - - override fun onPause() { - super.onPause() - - localBroadcastManager.unregisterReceiver(purchaseReceiver) - } - - private fun refreshSubscription() { - if (BuildConfig.FLAVOR == "generic") { - return - } - - val subscription = inventory.subscription.value - findPreference(R.string.upgrade_to_pro).apply { - title = getString( - if (subscription == null) { - R.string.upgrade_to_pro - } else { - R.string.manage_subscription - }) - summary = if (subscription == null) { - null - } else { - val price = getString( - if (subscription.isMonthly) R.string.price_per_month else R.string.price_per_year, - (subscription.subscriptionPrice!! - .01).toString() - ) - getString(R.string.current_subscription, price) - } - } - findPreference(R.string.button_unsubscribe).isEnabled = inventory.subscription.value != null - } - override fun getMenu() = 0 } \ 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 96629f7b2..4ec93a28d 100644 --- a/app/src/main/java/org/tasks/preferences/fragments/MainSettingsFragment.kt +++ b/app/src/main/java/org/tasks/preferences/fragments/MainSettingsFragment.kt @@ -4,16 +4,16 @@ import android.content.Intent 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.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.billing.BillingClient +import org.tasks.billing.Inventory +import org.tasks.billing.Purchase +import org.tasks.billing.PurchaseDialog import org.tasks.caldav.BaseCaldavAccountSettingsActivity import org.tasks.data.CaldavAccount import org.tasks.data.GoogleTaskAccount @@ -34,6 +34,8 @@ class MainSettingsFragment : InjectingPreferenceFragment() { @Inject lateinit var appWidgetManager: AppWidgetManager @Inject lateinit var preferences: Preferences @Inject lateinit var taskDeleter: TaskDeleter + @Inject lateinit var inventory: Inventory + @Inject lateinit var billingClient: BillingClient private val viewModel: PreferencesViewModel by activityViewModels() @@ -44,11 +46,32 @@ class MainSettingsFragment : InjectingPreferenceFragment() { findPreference(R.string.add_account).setOnPreferenceClickListener { addAccount() } + findPreference(R.string.name_your_price).setOnPreferenceClickListener { + PurchaseDialog + .newPurchaseDialog() + .show(parentFragmentManager, PurchaseDialog.FRAG_TAG_PURCHASE_DIALOG) + false + } + + findPreference(R.string.button_unsubscribe).setOnPreferenceClickListener { + inventory.unsubscribe(requireActivity()) + } + + findPreference(R.string.refresh_purchases).setOnPreferenceClickListener { + billingClient.queryPurchases() + false + } + 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() } + if (BuildConfig.FLAVOR == "generic") { + remove(R.string.upgrade_to_pro) + } else { + inventory.subscription.observe(this) { refreshSubscription(it) } + } } override fun onResume() { @@ -167,7 +190,6 @@ class MainSettingsFragment : InjectingPreferenceFragment() { } } - private fun setupErrorIcon(pref: IconPreference, error: String?) { val hasError = !error.isNullOrBlank() pref.drawable = ContextCompat @@ -184,6 +206,30 @@ class MainSettingsFragment : InjectingPreferenceFragment() { }) } + private fun refreshSubscription(subscription: Purchase?) { + findPreference(R.string.upgrade_to_pro).setTitle(if (subscription == null) { + R.string.upgrade_to_pro + } else { + R.string.subscription + }) + findPreference(R.string.name_your_price).apply { + if (subscription == null) { + title = getString(R.string.name_your_price) + summary = null + } else { + val interval = if (subscription.isMonthly) { + R.string.price_per_month + } else { + R.string.price_per_year + } + val price = (subscription.subscriptionPrice!! - .01).toString() + title = getString(R.string.manage_subscription) + summary = getString(R.string.current_subscription, getString(interval, price)) + } + } + findPreference(R.string.button_unsubscribe).isVisible = subscription != null + } + companion object { private const val REQUEST_ADD_ACCOUNT = 10015 private const val FRAG_TAG_ADD_ACCOUNT = "frag_tag_add_account" 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 b68266847..3a6ed3a77 100644 --- a/app/src/main/java/org/tasks/preferences/fragments/TasksAccount.kt +++ b/app/src/main/java/org/tasks/preferences/fragments/TasksAccount.kt @@ -22,7 +22,9 @@ import org.tasks.LocalBroadcastManager import org.tasks.R import org.tasks.auth.SignInActivity import org.tasks.billing.Inventory +import org.tasks.billing.Purchase import org.tasks.data.CaldavAccount +import org.tasks.data.CaldavAccount.Companion.isPaymentRequired import org.tasks.data.CaldavDao import org.tasks.jobs.WorkManager import org.tasks.locale.Locale @@ -50,26 +52,28 @@ class TasksAccount : BaseAccountPreference() { val caldavAccount: CaldavAccount get() = caldavAccountLiveData.value ?: requireArguments().getParcelable(EXTRA_ACCOUNT)!! - private val purchaseReceiver = object : BroadcastReceiver() { + private val refreshReceiver = object : BroadcastReceiver() { override fun onReceive(context: Context, intent: Intent) { - lifecycleScope.launch { - caldavAccount.let { - if (inventory.subscription.value?.isTasksSubscription == true - && it.isPaymentRequired()) { - it.error = null - caldavDao.update(it) - } - refreshUi(it) - } - } + refreshUi(caldavAccount) } } override fun getPreferenceXml() = R.xml.preferences_tasks + private fun clearPurchaseError(purchase: Purchase?) { + if (purchase?.isTasksSubscription == true && caldavAccount.error.isPaymentRequired()) { + caldavAccount.error = null + lifecycleScope.launch { + caldavDao.update(caldavAccount) + } + } + } + override suspend fun setupPreferences(savedInstanceState: Bundle?) { super.setupPreferences(savedInstanceState) + inventory.subscription.observe(this) { clearPurchaseError(it) } + caldavAccountLiveData = caldavDao.watchAccount( requireArguments().getParcelable(EXTRA_ACCOUNT)!!.id ) @@ -77,31 +81,12 @@ class TasksAccount : BaseAccountPreference() { viewModel.refreshPasswords(caldavAccount) } - findPreference(R.string.upgrade_to_pro).setOnPreferenceClickListener { - showPurchaseDialog(tasksPayment = true) - } - - findPreference(R.string.button_unsubscribe).setOnPreferenceClickListener { - inventory.unsubscribe(requireActivity()) - } - - findPreference(R.string.refresh_purchases).setOnPreferenceClickListener { - billingClient.queryPurchases() - false - } - findPreference(R.string.local_lists).setOnPreferenceClickListener { workManager.migrateLocalTasks(caldavAccount) toaster.longToast(R.string.migrating_tasks) false } - if (isGitHubAccount) { - findPreference(R.string.upgrade_to_pro).isVisible = false - findPreference(R.string.button_unsubscribe).isVisible = false - findPreference(R.string.refresh_purchases).isVisible = false - } - findPreference(R.string.generate_new_password).setOnPreferenceChangeListener { _, description -> viewModel.requestNewPassword(caldavAccount, description as String) false @@ -144,8 +129,7 @@ class TasksAccount : BaseAccountPreference() { .show() } } - localBroadcastManager.registerPurchaseReceiver(purchaseReceiver) - localBroadcastManager.registerRefreshListReceiver(purchaseReceiver) + localBroadcastManager.registerRefreshListReceiver(refreshReceiver) } private fun setupTextField(v: View, layout: Int, labelRes: Int, value: String?) { @@ -163,7 +147,7 @@ class TasksAccount : BaseAccountPreference() { override fun onPause() { super.onPause() - localBroadcastManager.unregisterReceiver(purchaseReceiver) + localBroadcastManager.unregisterReceiver(refreshReceiver) } private val isGitHubAccount: Boolean @@ -237,30 +221,6 @@ class TasksAccount : BaseAccountPreference() { findPreference(R.string.local_lists).summary = getString(R.string.migrate_count, quantityString) } - - if (BuildConfig.FLAVOR == "generic") { - return - } - val subscription = inventory.subscription.value - findPreference(R.string.upgrade_to_pro).apply { - title = getString( - if (subscription == null) { - R.string.button_subscribe - } else { - R.string.manage_subscription - } - ) - summary = if (subscription == null) { - null - } else { - val price = getString( - if (subscription.isMonthly) R.string.price_per_month else R.string.price_per_year, - (subscription.subscriptionPrice!! - .01).toString() - ) - getString(R.string.current_subscription, price) - } - } - findPreference(R.string.button_unsubscribe).isEnabled = inventory.subscription.value != null } private fun refreshPasswords(passwords: List) { diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 1cb7c6255..ac8abfe72 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -491,6 +491,7 @@ File %1$s contained %2$s.\n\n Home set not found Could not connect Upgrade to pro + Subscription Modify subscription Refresh purchases Subscribe diff --git a/app/src/main/res/xml/help_and_feedback.xml b/app/src/main/res/xml/help_and_feedback.xml index 176ff4298..a11984dbc 100644 --- a/app/src/main/res/xml/help_and_feedback.xml +++ b/app/src/main/res/xml/help_and_feedback.xml @@ -56,21 +56,6 @@ android:targetPackage="@string/app_package" /> - - - - - - + xmlns:app="http://schemas.android.com/apk/res-auto" + xmlns:tools="http://schemas.android.com/tools"> + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/xml/preferences_tasks.xml b/app/src/main/res/xml/preferences_tasks.xml index a149ea097..8280419bb 100644 --- a/app/src/main/res/xml/preferences_tasks.xml +++ b/app/src/main/res/xml/preferences_tasks.xml @@ -12,22 +12,6 @@ app:isPreferenceVisible="false" tools:isPreferenceVisible="true"/> - - - - - -