Move subscription buttons to main preferences

pull/1305/head
Alex Baker 3 years ago
parent 56ff44e163
commit df93322d97

@ -1,38 +1,20 @@
package org.tasks.preferences.fragments package org.tasks.preferences.fragments
import android.content.BroadcastReceiver
import android.content.Context
import android.content.Intent import android.content.Intent
import android.net.Uri import android.net.Uri
import android.os.Bundle import android.os.Bundle
import androidx.fragment.app.FragmentManager import androidx.fragment.app.FragmentManager
import dagger.hilt.android.AndroidEntryPoint import dagger.hilt.android.AndroidEntryPoint
import org.tasks.BuildConfig import org.tasks.BuildConfig
import org.tasks.LocalBroadcastManager
import org.tasks.R 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.dialogs.WhatsNewDialog
import org.tasks.injection.InjectingPreferenceFragment import org.tasks.injection.InjectingPreferenceFragment
import javax.inject.Inject
private const val FRAG_TAG_WHATS_NEW = "frag_tag_whats_new" private const val FRAG_TAG_WHATS_NEW = "frag_tag_whats_new"
@AndroidEntryPoint @AndroidEntryPoint
class HelpAndFeedback : InjectingPreferenceFragment() { 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 fun getPreferenceXml() = R.xml.help_and_feedback
override suspend fun setupPreferences(savedInstanceState: Bundle?) { override suspend fun setupPreferences(savedInstanceState: Bundle?) {
@ -60,77 +42,20 @@ class HelpAndFeedback : InjectingPreferenceFragment() {
false false
} }
findPreference(R.string.refresh_purchases).setOnPreferenceClickListener {
billingClient.queryPurchases()
false
}
findPreference(R.string.p_collect_statistics) findPreference(R.string.p_collect_statistics)
.setOnPreferenceClickListener { .setOnPreferenceClickListener {
showRestartDialog() showRestartDialog()
true 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") @Suppress("ConstantConditionIf")
if (BuildConfig.FLAVOR == "generic") { if (BuildConfig.FLAVOR == "generic") {
remove( remove(
R.string.p_collect_statistics, R.string.p_collect_statistics,
R.string.rate_tasks, 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 override fun getMenu() = 0
} }

@ -4,16 +4,16 @@ import android.content.Intent
import android.os.Bundle import android.os.Bundle
import androidx.core.content.ContextCompat import androidx.core.content.ContextCompat
import androidx.fragment.app.activityViewModels import androidx.fragment.app.activityViewModels
import androidx.lifecycle.lifecycleScope
import androidx.preference.Preference import androidx.preference.Preference
import androidx.preference.PreferenceScreen import androidx.preference.PreferenceScreen
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.launch
import kotlinx.coroutines.withContext
import org.tasks.BuildConfig import org.tasks.BuildConfig
import org.tasks.R 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.caldav.BaseCaldavAccountSettingsActivity
import org.tasks.data.CaldavAccount import org.tasks.data.CaldavAccount
import org.tasks.data.GoogleTaskAccount import org.tasks.data.GoogleTaskAccount
@ -34,6 +34,8 @@ class MainSettingsFragment : InjectingPreferenceFragment() {
@Inject lateinit var appWidgetManager: AppWidgetManager @Inject lateinit var appWidgetManager: AppWidgetManager
@Inject lateinit var preferences: Preferences @Inject lateinit var preferences: Preferences
@Inject lateinit var taskDeleter: TaskDeleter @Inject lateinit var taskDeleter: TaskDeleter
@Inject lateinit var inventory: Inventory
@Inject lateinit var billingClient: BillingClient
private val viewModel: PreferencesViewModel by activityViewModels() private val viewModel: PreferencesViewModel by activityViewModels()
@ -44,11 +46,32 @@ class MainSettingsFragment : InjectingPreferenceFragment() {
findPreference(R.string.add_account).setOnPreferenceClickListener { addAccount() } 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.lastBackup.observe(this) { updateBackupWarning() }
viewModel.lastAndroidBackup.observe(this) { updateBackupWarning() } viewModel.lastAndroidBackup.observe(this) { updateBackupWarning() }
viewModel.lastDriveBackup.observe(this) { updateBackupWarning() } viewModel.lastDriveBackup.observe(this) { updateBackupWarning() }
viewModel.googleTaskAccounts.observe(this) { refreshAccounts() } viewModel.googleTaskAccounts.observe(this) { refreshAccounts() }
viewModel.caldavAccounts.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() { override fun onResume() {
@ -167,7 +190,6 @@ class MainSettingsFragment : InjectingPreferenceFragment() {
} }
} }
private fun setupErrorIcon(pref: IconPreference, error: String?) { private fun setupErrorIcon(pref: IconPreference, error: String?) {
val hasError = !error.isNullOrBlank() val hasError = !error.isNullOrBlank()
pref.drawable = ContextCompat 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 { companion object {
private const val REQUEST_ADD_ACCOUNT = 10015 private const val REQUEST_ADD_ACCOUNT = 10015
private const val FRAG_TAG_ADD_ACCOUNT = "frag_tag_add_account" private const val FRAG_TAG_ADD_ACCOUNT = "frag_tag_add_account"

@ -22,7 +22,9 @@ 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.Inventory import org.tasks.billing.Inventory
import org.tasks.billing.Purchase
import org.tasks.data.CaldavAccount import org.tasks.data.CaldavAccount
import org.tasks.data.CaldavAccount.Companion.isPaymentRequired
import org.tasks.data.CaldavDao import org.tasks.data.CaldavDao
import org.tasks.jobs.WorkManager import org.tasks.jobs.WorkManager
import org.tasks.locale.Locale import org.tasks.locale.Locale
@ -50,26 +52,28 @@ class TasksAccount : BaseAccountPreference() {
val caldavAccount: CaldavAccount val caldavAccount: CaldavAccount
get() = caldavAccountLiveData.value ?: requireArguments().getParcelable(EXTRA_ACCOUNT)!! get() = caldavAccountLiveData.value ?: requireArguments().getParcelable(EXTRA_ACCOUNT)!!
private val purchaseReceiver = object : BroadcastReceiver() { private val refreshReceiver = object : BroadcastReceiver() {
override fun onReceive(context: Context, intent: Intent) { override fun onReceive(context: Context, intent: Intent) {
lifecycleScope.launch { refreshUi(caldavAccount)
caldavAccount.let {
if (inventory.subscription.value?.isTasksSubscription == true
&& it.isPaymentRequired()) {
it.error = null
caldavDao.update(it)
}
refreshUi(it)
}
}
} }
} }
override fun getPreferenceXml() = R.xml.preferences_tasks 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?) { override suspend fun setupPreferences(savedInstanceState: Bundle?) {
super.setupPreferences(savedInstanceState) super.setupPreferences(savedInstanceState)
inventory.subscription.observe(this) { clearPurchaseError(it) }
caldavAccountLiveData = caldavDao.watchAccount( caldavAccountLiveData = caldavDao.watchAccount(
requireArguments().getParcelable<CaldavAccount>(EXTRA_ACCOUNT)!!.id requireArguments().getParcelable<CaldavAccount>(EXTRA_ACCOUNT)!!.id
) )
@ -77,31 +81,12 @@ class TasksAccount : BaseAccountPreference() {
viewModel.refreshPasswords(caldavAccount) 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 { findPreference(R.string.local_lists).setOnPreferenceClickListener {
workManager.migrateLocalTasks(caldavAccount) workManager.migrateLocalTasks(caldavAccount)
toaster.longToast(R.string.migrating_tasks) toaster.longToast(R.string.migrating_tasks)
false 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 -> findPreference(R.string.generate_new_password).setOnPreferenceChangeListener { _, description ->
viewModel.requestNewPassword(caldavAccount, description as String) viewModel.requestNewPassword(caldavAccount, description as String)
false false
@ -144,8 +129,7 @@ class TasksAccount : BaseAccountPreference() {
.show() .show()
} }
} }
localBroadcastManager.registerPurchaseReceiver(purchaseReceiver) localBroadcastManager.registerRefreshListReceiver(refreshReceiver)
localBroadcastManager.registerRefreshListReceiver(purchaseReceiver)
} }
private fun setupTextField(v: View, layout: Int, labelRes: Int, value: String?) { private fun setupTextField(v: View, layout: Int, labelRes: Int, value: String?) {
@ -163,7 +147,7 @@ class TasksAccount : BaseAccountPreference() {
override fun onPause() { override fun onPause() {
super.onPause() super.onPause()
localBroadcastManager.unregisterReceiver(purchaseReceiver) localBroadcastManager.unregisterReceiver(refreshReceiver)
} }
private val isGitHubAccount: Boolean private val isGitHubAccount: Boolean
@ -237,30 +221,6 @@ class TasksAccount : BaseAccountPreference() {
findPreference(R.string.local_lists).summary = findPreference(R.string.local_lists).summary =
getString(R.string.migrate_count, quantityString) 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<TasksAccountViewModel.AppPassword>) { private fun refreshPasswords(passwords: List<TasksAccountViewModel.AppPassword>) {

@ -491,6 +491,7 @@ File %1$s contained %2$s.\n\n
<string name="caldav_home_set_not_found">Home set not found</string> <string name="caldav_home_set_not_found">Home set not found</string>
<string name="network_error">Could not connect</string> <string name="network_error">Could not connect</string>
<string name="upgrade_to_pro">Upgrade to pro</string> <string name="upgrade_to_pro">Upgrade to pro</string>
<string name="subscription">Subscription</string>
<string name="manage_subscription">Modify subscription</string> <string name="manage_subscription">Modify subscription</string>
<string name="refresh_purchases">Refresh purchases</string> <string name="refresh_purchases">Refresh purchases</string>
<string name="button_subscribe">Subscribe</string> <string name="button_subscribe">Subscribe</string>

@ -56,21 +56,6 @@
android:targetPackage="@string/app_package" /> android:targetPackage="@string/app_package" />
</Preference> </Preference>
<Preference
android:key="@string/upgrade_to_pro"
android:title="@string/upgrade_to_pro"
app:allowDividerAbove="true"
app:icon="@drawable/ic_outline_attach_money_24px" />
<Preference
android:key="@string/button_unsubscribe"
android:title="@string/button_unsubscribe"/>
<Preference
android:key="@string/refresh_purchases"
android:title="@string/refresh_purchases"
app:icon="@drawable/ic_cached_24px" />
<Preference <Preference
android:title="@string/privacy_policy" android:title="@string/privacy_policy"
app:allowDividerAbove="true" app:allowDividerAbove="true"

@ -1,6 +1,7 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android" <PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"> xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools">
<Preference <Preference
android:key="@string/add_account" android:key="@string/add_account"
@ -61,4 +62,25 @@
app:icon="@drawable/ic_outline_bug_report_24px" app:icon="@drawable/ic_outline_bug_report_24px"
app:title="@string/debug" /> app:title="@string/debug" />
<PreferenceCategory
android:key="@string/upgrade_to_pro"
tools:title="@string/upgrade_to_pro">
<Preference
android:key="@string/name_your_price"
android:summary=" "
app:icon="@drawable/ic_outline_attach_money_24px"
tools:title="@string/name_your_price"/>
<Preference
android:key="@string/button_unsubscribe"
android:title="@string/button_unsubscribe"/>
<Preference
android:key="@string/refresh_purchases"
android:title="@string/refresh_purchases"
app:icon="@drawable/ic_cached_24px" />
</PreferenceCategory>
</PreferenceScreen> </PreferenceScreen>

@ -12,22 +12,6 @@
app:isPreferenceVisible="false" app:isPreferenceVisible="false"
tools:isPreferenceVisible="true"/> tools:isPreferenceVisible="true"/>
<Preference
android:key="@string/upgrade_to_pro"
android:title="@string/upgrade_to_pro"
android:summary=" "
app:allowDividerAbove="true"
app:icon="@drawable/ic_outline_attach_money_24px" />
<Preference
android:key="@string/button_unsubscribe"
android:title="@string/button_unsubscribe"/>
<Preference
android:key="@string/refresh_purchases"
android:title="@string/refresh_purchases"
app:icon="@drawable/ic_cached_24px" />
<PreferenceCategory <PreferenceCategory
android:key="@string/migrate" android:key="@string/migrate"
android:title="@string/migrate" android:title="@string/migrate"

Loading…
Cancel
Save