Unlock pro for tasks.org subscribers

pull/1244/head
Alex Baker 5 years ago
parent 612ffca6c3
commit 71a5a67e52

@ -75,6 +75,7 @@ class Tasks : Application(), Configuration.Provider {
} }
private fun backgroundWork() = CoroutineScope(Dispatchers.Default).launch { private fun backgroundWork() = CoroutineScope(Dispatchers.Default).launch {
inventory.updateTasksSubscription()
NotificationSchedulerIntentService.enqueueWork(context, false) NotificationSchedulerIntentService.enqueueWork(context, false)
CalendarNotificationIntentService.enqueueWork(context) CalendarNotificationIntentService.enqueueWork(context)
refreshScheduler.get().scheduleAll() refreshScheduler.get().scheduleAll()

@ -306,7 +306,7 @@ class SignInActivity : InjectingAppCompatActivity(), PurchaseDialog.PurchaseHand
} }
override fun onPurchaseDialogDismissed() { override fun onPurchaseDialogDismissed() {
if (inventory.hasTasksSubscription) { if (inventory.subscription?.isTasksSubscription == true) {
lifecycleScope.launch { lifecycleScope.launch {
val account = viewModel.setupAccount(authStateManager.current) val account = viewModel.setupAccount(authStateManager.current)
if (account != null) { if (account != null) {

@ -3,9 +3,12 @@ package org.tasks.billing
import android.content.Context import android.content.Context
import android.content.Intent import android.content.Intent
import android.net.Uri import android.net.Uri
import dagger.hilt.android.qualifiers.ApplicationContext
import org.tasks.BuildConfig import org.tasks.BuildConfig
import org.tasks.LocalBroadcastManager import org.tasks.LocalBroadcastManager
import org.tasks.R import org.tasks.R
import org.tasks.data.CaldavAccount.Companion.TYPE_TASKS
import org.tasks.data.CaldavDao
import org.tasks.preferences.Preferences import org.tasks.preferences.Preferences
import timber.log.Timber import timber.log.Timber
import java.util.* import java.util.*
@ -14,11 +17,15 @@ import javax.inject.Singleton
@Singleton @Singleton
class Inventory @Inject constructor( class Inventory @Inject constructor(
@ApplicationContext private val context: Context,
private val preferences: Preferences, private val preferences: Preferences,
private val signatureVerifier: SignatureVerifier, private val signatureVerifier: SignatureVerifier,
private val localBroadcastManager: LocalBroadcastManager private val localBroadcastManager: LocalBroadcastManager,
private val caldavDao: CaldavDao
) { ) {
private val purchases: MutableMap<String, Purchase> = HashMap() private val purchases: MutableMap<String, Purchase> = HashMap()
var hasTasksSubscription = false
private set
fun clear() { fun clear() {
Timber.d("clear()") Timber.d("clear()")
@ -49,10 +56,17 @@ class Inventory @Inject constructor(
get() { get() {
return BuildConfig.FLAVOR == "generic" return BuildConfig.FLAVOR == "generic"
|| (BuildConfig.DEBUG && preferences.getBoolean(R.string.p_debug_pro, false)) || (BuildConfig.DEBUG && preferences.getBoolean(R.string.p_debug_pro, false))
|| hasTasksSubscription
|| field || field
} }
private set private set
suspend fun updateTasksSubscription() {
hasTasksSubscription = caldavDao.getAccounts(TYPE_TASKS).any {
it.isTasksSubscription(context)
}
}
fun purchased(sku: String) = purchases.containsKey(sku) fun purchased(sku: String) = purchases.containsKey(sku)
fun getPurchase(sku: String) = purchases[sku] fun getPurchase(sku: String) = purchases[sku]
@ -70,9 +84,6 @@ class Inventory @Inject constructor(
} }
.firstOrNull() .firstOrNull()
val hasTasksSubscription: Boolean
get() = subscription?.isTasksSubscription ?: false
fun unsubscribe(context: Context): Boolean { fun unsubscribe(context: Context): Boolean {
subscription?.let { subscription?.let {
context.startActivity( context.startActivity(

@ -1,5 +1,6 @@
package org.tasks.data package org.tasks.data
import android.content.Context
import android.os.Parcel import android.os.Parcel
import android.os.Parcelable import android.os.Parcelable
import androidx.core.os.ParcelCompat import androidx.core.os.ParcelCompat
@ -8,6 +9,7 @@ import androidx.room.Entity
import androidx.room.Ignore import androidx.room.Ignore
import androidx.room.PrimaryKey import androidx.room.PrimaryKey
import com.todoroo.astrid.data.Task import com.todoroo.astrid.data.Task
import org.tasks.R
import org.tasks.activities.BaseListSettingsActivity import org.tasks.activities.BaseListSettingsActivity
import org.tasks.caldav.CaldavCalendarSettingsActivity import org.tasks.caldav.CaldavCalendarSettingsActivity
import org.tasks.caldav.LocalListSettingsActivity import org.tasks.caldav.LocalListSettingsActivity
@ -16,6 +18,7 @@ import org.tasks.etebase.EtebaseCalendarSettingsActivity
import org.tasks.etesync.EteSyncCalendarSettingsActivity import org.tasks.etesync.EteSyncCalendarSettingsActivity
import org.tasks.opentasks.OpenTasksListSettingsActivity import org.tasks.opentasks.OpenTasksListSettingsActivity
import org.tasks.security.KeyStoreEncryption import org.tasks.security.KeyStoreEncryption
import java.net.HttpURLConnection
@Entity(tableName = "caldav_accounts") @Entity(tableName = "caldav_accounts")
class CaldavAccount : Parcelable { class CaldavAccount : Parcelable {
@ -165,6 +168,19 @@ class CaldavAccount : Parcelable {
return "CaldavAccount(id=$id, uuid=$uuid, name=$name, url=$url, username=$username, password=$password, error=$error, isSuppressRepeatingTasks=$isSuppressRepeatingTasks, encryptionKey=$encryptionKey, accountType=$accountType, isCollapsed=$isCollapsed)" return "CaldavAccount(id=$id, uuid=$uuid, name=$name, url=$url, username=$username, password=$password, error=$error, isSuppressRepeatingTasks=$isSuppressRepeatingTasks, encryptionKey=$encryptionKey, accountType=$accountType, isCollapsed=$isCollapsed)"
} }
fun isTasksSubscription(context: Context): Boolean {
val caldavUrl = context.getString(R.string.tasks_caldav_url)
return url?.startsWith("https://${caldavUrl}/calendars/") == true &&
!isPaymentRequired() &&
!isLoggedOut()
}
fun isLoggedOut(): Boolean =
error?.startsWith("HTTP ${HttpURLConnection.HTTP_UNAUTHORIZED}") == true
fun isPaymentRequired(): Boolean =
error?.startsWith("HTTP ${HttpURLConnection.HTTP_PAYMENT_REQUIRED}") == true
companion object { companion object {
const val TYPE_CALDAV = 0 const val TYPE_CALDAV = 0
@Deprecated("use etebase") const val TYPE_ETESYNC = 1 @Deprecated("use etebase") const val TYPE_ETESYNC = 1

@ -169,7 +169,7 @@ class FilterProvider @Inject constructor(
private val navDrawerFooter: List<FilterListItem> private val navDrawerFooter: List<FilterListItem>
get() = listOf(NavigationDrawerSeparator()) get() = listOf(NavigationDrawerSeparator())
.plusIf(BuildConfig.FLAVOR == "generic") { .plusIf(BuildConfig.FLAVOR == "generic" && !inventory.hasTasksSubscription) {
NavigationDrawerAction( NavigationDrawerAction(
context.getString(R.string.TLA_menu_donate), context.getString(R.string.TLA_menu_donate),
R.drawable.ic_outline_attach_money_24px, R.drawable.ic_outline_attach_money_24px,

@ -8,6 +8,7 @@ import kotlinx.coroutines.*
import org.tasks.LocalBroadcastManager import org.tasks.LocalBroadcastManager
import org.tasks.R import org.tasks.R
import org.tasks.analytics.Firebase import org.tasks.analytics.Firebase
import org.tasks.billing.Inventory
import org.tasks.caldav.CaldavSynchronizer import org.tasks.caldav.CaldavSynchronizer
import org.tasks.data.CaldavAccount.Companion.TYPE_CALDAV import org.tasks.data.CaldavAccount.Companion.TYPE_CALDAV
import org.tasks.data.CaldavAccount.Companion.TYPE_TASKS import org.tasks.data.CaldavAccount.Companion.TYPE_TASKS
@ -21,7 +22,8 @@ class SyncCaldavWork @WorkerInject constructor(
localBroadcastManager: LocalBroadcastManager, localBroadcastManager: LocalBroadcastManager,
preferences: Preferences, preferences: Preferences,
private val caldavDao: CaldavDao, private val caldavDao: CaldavDao,
private val caldavSynchronizer: CaldavSynchronizer private val caldavSynchronizer: CaldavSynchronizer,
private val inventory: Inventory
) : SyncWork(context, workerParams, firebase, localBroadcastManager, preferences) { ) : SyncWork(context, workerParams, firebase, localBroadcastManager, preferences) {
override suspend fun enabled() = getAccounts().isNotEmpty() override suspend fun enabled() = getAccounts().isNotEmpty()
@ -30,6 +32,7 @@ class SyncCaldavWork @WorkerInject constructor(
override suspend fun doSync() { override suspend fun doSync() {
caldavJobs().awaitAll() caldavJobs().awaitAll()
inventory.updateTasksSubscription()
} }
private suspend fun caldavJobs(): List<Deferred<Unit>> = coroutineScope { private suspend fun caldavJobs(): List<Deferred<Unit>> = coroutineScope {

@ -24,8 +24,6 @@ import org.tasks.injection.InjectingPreferenceFragment
import org.tasks.jobs.WorkManager import org.tasks.jobs.WorkManager
import org.tasks.preferences.IconPreference import org.tasks.preferences.IconPreference
import org.tasks.ui.Toaster import org.tasks.ui.Toaster
import java.net.HttpURLConnection.HTTP_PAYMENT_REQUIRED
import java.net.HttpURLConnection.HTTP_UNAUTHORIZED
import javax.inject.Inject import javax.inject.Inject
@AndroidEntryPoint @AndroidEntryPoint
@ -46,7 +44,7 @@ class TasksAccount : InjectingPreferenceFragment() {
override fun onReceive(context: Context, intent: Intent) { override fun onReceive(context: Context, intent: Intent) {
lifecycleScope.launch { lifecycleScope.launch {
if (inventory.subscription?.isTasksSubscription == true if (inventory.subscription?.isTasksSubscription == true
&& caldavAccount.error.isPaymentRequired()) { && caldavAccount.isPaymentRequired()) {
caldavAccount.error = null caldavAccount.error = null
caldavDao.update(caldavAccount) caldavDao.update(caldavAccount)
} }
@ -125,7 +123,7 @@ class TasksAccount : InjectingPreferenceFragment() {
private fun refreshUi() { private fun refreshUi() {
(findPreference(R.string.sign_in_with_google) as IconPreference).apply { (findPreference(R.string.sign_in_with_google) as IconPreference).apply {
isVisible = caldavAccount.error.isLoggedOut() isVisible = caldavAccount.isLoggedOut()
iconVisible = true iconVisible = true
} }
@ -142,7 +140,7 @@ class TasksAccount : InjectingPreferenceFragment() {
} }
val subscription = inventory.subscription val subscription = inventory.subscription
findPreference(R.string.upgrade_to_pro).apply { findPreference(R.string.upgrade_to_pro).apply {
if (caldavAccount.error.isPaymentRequired()) { if (caldavAccount.isPaymentRequired()) {
if (subscription == null) { if (subscription == null) {
setTitle(R.string.upgrade_to_pro) setTitle(R.string.upgrade_to_pro)
setSummary(R.string.your_subscription_expired) setSummary(R.string.your_subscription_expired)
@ -192,11 +190,5 @@ class TasksAccount : InjectingPreferenceFragment() {
} }
return fragment return fragment
} }
private fun String?.isLoggedOut(): Boolean =
this?.startsWith("HTTP $HTTP_UNAUTHORIZED") == true
private fun String?.isPaymentRequired(): Boolean =
this?.startsWith("HTTP $HTTP_PAYMENT_REQUIRED") == true
} }
} }
Loading…
Cancel
Save