From 9a7c1078a24d2b37aac706b77fa95f8d18618076 Mon Sep 17 00:00:00 2001 From: Bryce Covert Date: Mon, 25 Sep 2017 11:28:29 -0700 Subject: [PATCH] IAPing. --- android/project.clj | 5 +- android/src/clojure/advent/android.clj | 18 +++---- .../src/java/advent/core/MainActivity.java | 10 ++++ desktop/last-release | 2 +- desktop/project.clj | 12 ++--- desktop/src-common/advent/core.clj | 6 ++- .../src-common/advent/screens/rooms/dream.clj | 15 +++--- .../advent/screens/rooms/outside_house.clj | 49 +++++++++++------- desktop/src-common/advent/utils.clj | 11 ++++ ios/Info.plist.xml | 18 ++----- ios/project.clj | 8 +-- ios/resources/Icon-83.5@2x.png | Bin 13015 -> 26601 bytes ios/robovm.xml | 3 ++ ios/src/java/advent/core/IOSLauncher.java | 27 +++++++++- 14 files changed, 116 insertions(+), 68 deletions(-) diff --git a/android/project.clj b/android/project.clj index 634d8c10..6d20945e 100644 --- a/android/project.clj +++ b/android/project.clj @@ -1,5 +1,7 @@ -(defproject advent "1.3.16-SNAPSHOT" +(def version (str "2.0." (clojure.string/trim-newline (slurp "../desktop/last-release")) "-snapshot")) +(defproject advent version :description "FIXME: write description" + :manifest {"Implementation-Version" version} :dependencies [[com.badlogicgames.gdx/gdx "1.9.3" :use-resources true] [com.badlogicgames.gdx/gdx-backend-lwjgl "1.9.3"] @@ -38,6 +40,7 @@ ;; key you want to sign APKs with. ;; :keystore-path "ticks-talkes-release.jks" ;; :key-alias "ticks-tales-release" + :jvm-opts ["-Dplatform=android"] :build-type :release :aot :all-with-unused :aot-exclude-ns [cljs.core.async.macros cljs.core.impl-ioc-macros cljs.core.impl.ioc_macros]}}} diff --git a/android/src/clojure/advent/android.clj b/android/src/clojure/advent/android.clj index bdd27e1e..03d2cfa7 100644 --- a/android/src/clojure/advent/android.clj +++ b/android/src/clojure/advent/android.clj @@ -1,22 +1,22 @@ (ns advent.android - (:import [com.android.billingclient.api PurchasesUpdatedListener PurchaseHistoryResponseListener Purchase$PurchasesResult]) - (:require [clojure.core.async :as a])) - -(def purchase-chan (a/chan)) + (:import [com.android.billingclient.api PurchasesUpdatedListener PurchaseHistoryResponseListener Purchase$PurchasesResult] + [com.badlogic.gdx Gdx Application]) + (:require [clojure.core.async :as a] + [advent.iap :as iap])) (def listener (reify PurchasesUpdatedListener (onPurchasesUpdated [this response-code purchases] (println response-code purchases) (let [result (and purchases (> (.size purchases) 0))] - (reset! @(resolve 'advent.core/has-purchased?) (if result true false)) - (a/go (a/>! purchase-chan (if result true false)))))) ) + (println "purchase response" result) + (iap/set-purchase-pref (if result true false))))) ) (def history-listener (reify PurchaseHistoryResponseListener (onPurchaseHistoryResponse [this purchases-result] - (println "got history") + (reset! iap/can-purchase? true) (let [result (and purchases-result (.getPurchasesList purchases-result) (> (.size (.getPurchasesList purchases-result)) 0))] - (reset! @(resolve 'advent.core/has-purchased?) (if result true false)) - (a/go (a/>! purchase-chan (if result true false)))))) ) + (println "purchase history" result) + (iap/set-purchase-pref (if result true false))))) ) diff --git a/android/src/java/advent/core/MainActivity.java b/android/src/java/advent/core/MainActivity.java index 0f95830d..1756951c 100644 --- a/android/src/java/advent/core/MainActivity.java +++ b/android/src/java/advent/core/MainActivity.java @@ -13,6 +13,7 @@ import com.android.billingclient.api.BillingClient.SkuType; import com.android.billingclient.api.SkuDetails.SkuDetailsResult; import com.android.billingclient.api.BillingFlowParams; import com.android.billingclient.api.BillingFlowParams.Builder; +import android.content.pm.*; public class MainActivity extends AndroidApplication { public boolean triggerPurchase() { @@ -26,10 +27,19 @@ public class MainActivity extends AndroidApplication { public void onCreate (android.os.Bundle savedInstanceState) { super.onCreate(savedInstanceState); + try { RT.var("clojure.core", "require").invoke(Symbol.intern("clojure.core.async")); RT.var("clojure.core", "require").invoke(Symbol.intern("advent.core")); RT.var("clojure.core", "require").invoke(Symbol.intern("advent.android")); + + try { + PackageInfo pInfo = this.getPackageManager().getPackageInfo(this.getPackageName(), 0); + String version = pInfo.versionName; + RT.var("advent.version", "version-override").bindRoot(version); + } catch (Exception e) { + e.printStackTrace(); + } } catch (Exception e) { System.out.println("Importing failed"); e.printStackTrace(); diff --git a/desktop/last-release b/desktop/last-release index b8626c4c..1e8b3149 100644 --- a/desktop/last-release +++ b/desktop/last-release @@ -1 +1 @@ -4 +6 diff --git a/desktop/project.clj b/desktop/project.clj index 645f2f0d..eba9df10 100644 --- a/desktop/project.clj +++ b/desktop/project.clj @@ -37,12 +37,12 @@ "script" ["run" "-m" "advent.analyze/dump-speech"]} :profiles { :uberjar { - :jvm-opts ["-Duse-repl=false" "-Dui_scale=1.0" "-Dno-steam=true" "-Dclojure.compiler.direct-linking=true" "-Dis-desktop=true"] + :jvm-opts ["-Duse-repl=false" "-Dui_scale=1.0" "-Dno-steam=true" "-Dclojure.compiler.direct-linking=true" "-Dis-desktop=true" "-Dplatform=desktop"] :aot :all } :dev { :source-paths ["src" "src-common" "src-dev"] - :jvm-opts ["-Duse-repl=true" "-Dui_scale=1.0" "-Dno-steam=true" "-Dclojure.compiler.direct-linking=true" "-Dis-desktop=true"] + :jvm-opts ["-Duse-repl=true" "-Dui_scale=1.0" "-Dno-steam=true" "-Dclojure.compiler.direct-linking=true" "-Dis-desktop=true" "-Dplatform=desktop"] :dependencies [[com.badlogicgames.gdx/gdx-tools "1.5.3"] [org.clojure/tools.nrepl "0.2.12"] [play-clj-nrepl "0.1.0" :exclusions [play-clj]] @@ -52,7 +52,7 @@ :warn-on-reflection true} :mobile-dev { :source-paths ["src" "src-common" "src-dev"] - :jvm-opts ["-Duse-repl=true" "-Dui_scale=1.5" "-Dno-steam=true" "-Dclojure.compiler.direct-linking=true" "-Dis-desktop=true"] + :jvm-opts ["-Duse-repl=true" "-Dui_scale=1.5" "-Dno-steam=true" "-Dclojure.compiler.direct-linking=true" "-Dis-desktop=true" "-Dplatform=desktop"] :dependencies [[com.badlogicgames.gdx/gdx-tools "1.5.3"] [org.clojure/tools.nrepl "0.2.12"] [play-clj-nrepl "0.1.0" :exclusions [play-clj]] @@ -62,16 +62,16 @@ #_#_:warn-on-reflection true} :app-store { :source-paths ["src" "src-common" "src-dev"] - :jvm-opts ["-Dapp-store=true" "-Dui_scale=1.0" "-Dno-steam=true" "-Dis-desktop=true"] + :jvm-opts ["-Dapp-store=true" "-Dui_scale=1.0" "-Dno-steam=true" "-Dis-desktop=true" "-Dplatform=desktop"] :aot :all :warn-on-reflection true} :steam {:dependencies [[com.code-disaster.steamworks4j/steamworks4j "1.2.2"]] - :jvm-opts ["-Dis-desktop=true" "-Dui_scale=1.0" ]} + :jvm-opts ["-Dis-desktop=true" "-Dui_scale=1.0" "-Dplatform=desktop"]} :steam-dev { :source-paths ["src" "src-common" "src-dev"] - :jvm-opts ["-Duse-repl=true" "-Dui_scale=1.0" "-Dis-desktop=true"] + :jvm-opts ["-Duse-repl=true" "-Dui_scale=1.0" "-Dis-desktop=true" "-Dplatform=desktop"] :dependencies [[com.badlogicgames.gdx/gdx-tools "1.5.3"] [org.clojure/tools.nrepl "0.2.7"] [play-clj-nrepl "0.1.0" :exclusions [play-clj]] diff --git a/desktop/src-common/advent/core.clj b/desktop/src-common/advent/core.clj index f8920298..40ecbd21 100644 --- a/desktop/src-common/advent/core.clj +++ b/desktop/src-common/advent/core.clj @@ -14,6 +14,7 @@ [advent.screens.safe :as safe] [advent.screens.fade :as fade] [advent.steam :as steam] + [advent.iap :as iap] [advent.pathfind]) (:import [com.badlogic.gdx.graphics Pixmap Pixmap$Filter Texture Texture$TextureFilter] @@ -21,12 +22,13 @@ [com.badlogic.gdx Gdx Application] [java.io FileOutputStream File PrintStream])) -(def has-purchased? (atom false)) - (defonce am (asset-manager)) + (set-asset-manager! am) (defn create-game [advent] + (iap/use-pref) + (set-screen-wrapper! (fn [screen screen-fn] (try (screen-fn) (catch Exception e diff --git a/desktop/src-common/advent/screens/rooms/dream.clj b/desktop/src-common/advent/screens/rooms/dream.clj index 8879a92d..d355da2f 100644 --- a/desktop/src-common/advent/screens/rooms/dream.clj +++ b/desktop/src-common/advent/screens/rooms/dream.clj @@ -16,7 +16,9 @@ [play-clj.math :refer :all] [play-clj.ui :refer :all] [play-clj.utils :refer :all] - [play-clj.g2d :refer :all]) + [play-clj.g2d :refer :all] + [advent.iap :as iap] + [advent.ios :as ios]) (:import [com.badlogic.gdx.graphics Color] [com.badlogic.gdx Application Gdx])) @@ -378,15 +380,10 @@ :label "Pit of destiny" :cursor :look :script (actions/get-script entities - (println "billing purchased before" @@(resolve 'advent.core/has-purchased?)) - (when-not @@(resolve 'advent.core/has-purchased?) - (.triggerPurchase (Gdx/app)) - (a/CFBundleSignature ???? CFBundleVersion - 126 + 135 + CFBundleIconName + AppIcon MinimumOSVersion 8.0 LSRequiresIPhoneOS @@ -56,20 +58,6 @@ UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight - CFBundleIcons - - CFBundlePrimaryIcon - - CFBundleIconFiles - - iTunesArtwork - Icon - Icon-60 - Icon-76 - Icon-83.5 - - - ITSAppUsesNonExemptEncryption diff --git a/ios/project.clj b/ios/project.clj index 92c61bef..8936b674 100644 --- a/ios/project.clj +++ b/ios/project.clj @@ -1,4 +1,5 @@ -(defproject advent "advent-2.0.4" +(def version (str "2.0." (clojure.string/trim-newline (slurp "../desktop/last-release")) "-snapshot")) +(defproject advent version :description "FIXME: write description" :dependencies [[com.badlogicgames.gdx/gdx "1.9.4"] [com.badlogicgames.gdx/gdx-backend-robovm "1.9.4"] @@ -10,12 +11,13 @@ [com.mobidevelop.robovm/robovm-rt "2.3.0"] [play-clj "0.4.6-BRYCE" :exclusions [com.badlogicgames.gdx/gdx-box2d com.badlogicgames.gdx/gdx-bullet]]] :source-paths ["src/clojure" "../desktop/src-common"] + :java-source-paths ["src/java"] :plugins [[lein-fruit "0.2.4-SNAPSHOT"] - [org.skummet/lein-skummet "0.2.2"] ] :javac-options ["-target" "1.7" "-source" "1.7" "-Xlint:-options"] - :jvm-opts ["-Dno-steam=true" "-Dclojure.compiler.direct-linking=true" "-Dclojure.compiler.elide-meta=[:doc :file :line :added]"] + :jvm-opts ["-Dno-steam=true" "-Dclojure.compiler.direct-linking=true" "-Dclojure.compiler.elide-meta=[:doc :file :line :added]" + "-Dplatform=ios"] :ios {:robovm-opts ["-config" "robovm.xml"] :robovm-path "/Users/brycecovert/.robovm-sdks/robovm-2.3.0" :version 2.1} diff --git a/ios/resources/Icon-83.5@2x.png b/ios/resources/Icon-83.5@2x.png index c973b9e208b3fabf4bd4607de1f8eb5713bf6b16..9860c6097fc73f5dc4d225285cc030e7245f5c18 100644 GIT binary patch literal 26601 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 + + org.robovm.apple.storekit.** advent.** clojure.genclass* clojure.gvec* @@ -98,5 +100,6 @@ OpenAL AudioToolbox AVFoundation + StoreKit diff --git a/ios/src/java/advent/core/IOSLauncher.java b/ios/src/java/advent/core/IOSLauncher.java index 525bdeca..7368892f 100644 --- a/ios/src/java/advent/core/IOSLauncher.java +++ b/ios/src/java/advent/core/IOSLauncher.java @@ -1,18 +1,35 @@ package advent.core; +import java.util.*; import clojure.lang.RT; import clojure.lang.Symbol; +// import advent.ios.*; import com.badlogic.gdx.*; import com.badlogic.gdx.backends.iosrobovm.*; import org.robovm.apple.foundation.*; -import org.robovm.apple.uikit.UIApplication; +import org.robovm.apple.uikit.*; import org.robovm.apple.glkit.GLKViewDrawableColorFormat; import org.robovm.apple.glkit.GLKViewDrawableDepthFormat; +import org.robovm.apple.storekit.*; public class IOSLauncher extends IOSApplication.Delegate { - protected IOSApplication createApplication() { + TransactionObserver transactionObserver; + @Override + public boolean didFinishLaunching (UIApplication application, UIApplicationLaunchOptions launchOptions) { + transactionObserver = new TransactionObserver(); + SKPaymentQueue.getDefaultQueue().addTransactionObserver(transactionObserver); + return super.didFinishLaunching(application, launchOptions); + } + + @Override + public void willTerminate(UIApplication application) { + SKPaymentQueue.getDefaultQueue().removeTransactionObserver(transactionObserver); + super.willTerminate(application); + } + + protected IOSApplication createApplication() { IOSApplicationConfiguration config = new IOSApplicationConfiguration(); // config.colorFormat = GLKViewDrawableColorFormat.SRGBA8888; // config.depthFormat = GLKViewDrawableDepthFormat._24; @@ -22,8 +39,14 @@ public class IOSLauncher extends IOSApplication.Delegate { config.useAccelerometer=false; config.useCompass=false; System.out.println("application created."); + HashSet products = new HashSet(); + products.add("fullgame"); + SKProductsRequest request = new SKProductsRequest(products); + request.setDelegate(new ProductDelegate()); + request.start(); RT.var("clojure.core", "require").invoke(Symbol.intern("advent.core")); + RT.var("clojure.core", "require").invoke(Symbol.intern("advent.ios")); System.out.println("clojure loaded"); try { NSDictionary infoDictionary = NSBundle.getMainBundle().getInfoDictionary();