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
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
}

@ -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"

@ -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<CaldavAccount>(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<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="network_error">Could not connect</string>
<string name="upgrade_to_pro">Upgrade to pro</string>
<string name="subscription">Subscription</string>
<string name="manage_subscription">Modify subscription</string>
<string name="refresh_purchases">Refresh purchases</string>
<string name="button_subscribe">Subscribe</string>

@ -56,21 +56,6 @@
android:targetPackage="@string/app_package" />
</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
android:title="@string/privacy_policy"
app:allowDividerAbove="true"

@ -1,6 +1,7 @@
<?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:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools">
<Preference
android:key="@string/add_account"
@ -61,4 +62,25 @@
app:icon="@drawable/ic_outline_bug_report_24px"
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>

@ -12,22 +12,6 @@
app:isPreferenceVisible="false"
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
android:key="@string/migrate"
android:title="@string/migrate"

Loading…
Cancel
Save