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 c973b9e2..9860c609 100644 Binary files a/ios/resources/Icon-83.5@2x.png and b/ios/resources/Icon-83.5@2x.png differ diff --git a/ios/robovm.xml b/ios/robovm.xml index a6dabfa0..4ba40e05 100644 --- a/ios/robovm.xml +++ b/ios/robovm.xml @@ -27,6 +27,8 @@ + + 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();