aboutsummaryrefslogtreecommitdiff
path: root/app/src/main/kotlin/com/pitchedapps/frost/utils/iab/IABBinder.kt
diff options
context:
space:
mode:
Diffstat (limited to 'app/src/main/kotlin/com/pitchedapps/frost/utils/iab/IABBinder.kt')
-rw-r--r--app/src/main/kotlin/com/pitchedapps/frost/utils/iab/IABBinder.kt139
1 files changed, 139 insertions, 0 deletions
diff --git a/app/src/main/kotlin/com/pitchedapps/frost/utils/iab/IABBinder.kt b/app/src/main/kotlin/com/pitchedapps/frost/utils/iab/IABBinder.kt
new file mode 100644
index 00000000..53d3e058
--- /dev/null
+++ b/app/src/main/kotlin/com/pitchedapps/frost/utils/iab/IABBinder.kt
@@ -0,0 +1,139 @@
+package com.pitchedapps.frost.utils.iab
+
+import android.app.Activity
+import android.content.Intent
+import com.anjlab.android.iab.v3.BillingProcessor
+import com.anjlab.android.iab.v3.TransactionDetails
+import com.crashlytics.android.answers.PurchaseEvent
+import com.pitchedapps.frost.BuildConfig
+import com.pitchedapps.frost.utils.L
+import com.pitchedapps.frost.utils.Prefs
+import com.pitchedapps.frost.utils.frostAnswers
+import org.jetbrains.anko.doAsync
+import org.jetbrains.anko.uiThread
+
+/**
+ * Created by Allan Wang on 2017-07-22.
+ */
+private const val FROST_PRO = "frost_pro"
+
+val IS_FROST_PRO: Boolean
+ get() = (BuildConfig.DEBUG && Prefs.debugPro) || Prefs.pro
+
+interface FrostBilling : BillingProcessor.IBillingHandler {
+ fun Activity.onCreateBilling()
+ fun onDestroyBilling()
+ fun purchasePro()
+ fun restorePurchases(once: Boolean)
+ fun onActivityResultBilling(requestCode: Int, resultCode: Int, data: Intent?): Boolean
+}
+
+open class IABBinder : FrostBilling {
+
+ var bp: BillingProcessor? = null
+ var activity: Activity? = null
+
+ override fun Activity.onCreateBilling() {
+ bp = BillingProcessor.newBillingProcessor(this, PUBLIC_BILLING_KEY, this@IABBinder)
+ activity = this
+ bp!!.initialize()
+ }
+
+ override fun onDestroyBilling() {
+ bp?.release()
+ bp = null
+ activity = null
+ }
+
+ override fun onBillingInitialized() {
+ L.d("IAB initialized")
+ }
+
+ override fun onPurchaseHistoryRestored() {
+ L.d("IAB restored")
+ }
+
+ override fun onProductPurchased(productId: String, details: TransactionDetails) {
+ L.d("IAB $productId purchased")
+ frostAnswers {
+ logPurchase(PurchaseEvent()
+ .putItemId(productId)
+ .putSuccess(true)
+ )
+ }
+ }
+
+ override fun onBillingError(errorCode: Int, error: Throwable) {
+ frostAnswers {
+ logPurchase(PurchaseEvent()
+ .putCustomAttribute("result", errorCode.toString())
+ .putSuccess(false))
+ }
+ L.e(error, "IAB error $errorCode")
+ }
+
+ override fun onActivityResultBilling(requestCode: Int, resultCode: Int, data: Intent?): Boolean
+ = bp?.handleActivityResult(requestCode, resultCode, data) ?: false
+
+ override fun purchasePro() {
+ if (bp == null) return
+ if (!bp!!.isOneTimePurchaseSupported)
+ activity!!.playStorePurchaseUnsupported()
+ else
+ bp!!.purchase(activity, FROST_PRO)
+ }
+
+ override fun restorePurchases(once: Boolean) {
+ if (bp == null) return
+ doAsync {
+ bp?.loadOwnedPurchasesFromGoogle()
+ if (bp?.isPurchased(FROST_PRO) ?: false) {
+ uiThread {
+ if (Prefs.pro) activity!!.playStoreNoLongerPro()
+ else if (!once) purchasePro()
+ if (once) onDestroyBilling()
+ }
+ } else {
+ uiThread {
+ if (!Prefs.pro) activity!!.playStoreFoundPro()
+ else if (!once) activity!!.purchaseRestored()
+ if (once) onDestroyBilling()
+ }
+ }
+ }
+ }
+}
+
+class IABSettings : IABBinder() {
+
+ override fun onBillingInitialized() {
+ super.onBillingInitialized()
+
+ }
+
+ override fun onPurchaseHistoryRestored() {
+ super.onPurchaseHistoryRestored()
+ }
+
+ override fun onProductPurchased(productId: String, details: TransactionDetails) {
+ super.onProductPurchased(productId, details)
+ }
+
+ override fun onBillingError(errorCode: Int, error: Throwable) {
+ super.onBillingError(errorCode, error)
+ activity?.playStoreGenericError(null)
+ }
+}
+
+class IABMain : IABBinder() {
+
+ override fun onBillingInitialized() {
+ super.onBillingInitialized()
+ restorePurchases(true)
+ }
+
+ override fun onPurchaseHistoryRestored() {
+ super.onPurchaseHistoryRestored()
+ restorePurchases(true)
+ }
+} \ No newline at end of file