From 9a164b497af32c1d207baee4a5df6298cf1651ca Mon Sep 17 00:00:00 2001 From: Quinn Purdy Date: Tue, 5 Nov 2024 09:37:27 -0500 Subject: [PATCH 01/15] Initial commit - adding AndroidKeyBridge and AndroidKeychainStorage to project --- Packages/Sequence-Unity/Plugins/Android.meta | 8 ++ .../Plugins/Android/AndroidKeyBridge.java | 84 +++++++++++++++++++ .../Android/AndroidKeyBridge.java.meta | 32 +++++++ .../SecureStorage/AndroidKeychainStorage.cs | 61 ++++++++++++++ .../AndroidKeychainStorage.cs.meta | 3 + .../SecureStorage/SecureStorageFactory.cs | 2 + Packages/Sequence-Unity/package.json | 2 +- 7 files changed, 191 insertions(+), 1 deletion(-) create mode 100644 Packages/Sequence-Unity/Plugins/Android.meta create mode 100644 Packages/Sequence-Unity/Plugins/Android/AndroidKeyBridge.java create mode 100644 Packages/Sequence-Unity/Plugins/Android/AndroidKeyBridge.java.meta create mode 100644 Packages/Sequence-Unity/Sequence/SequenceSDK/Utils/SecureStorage/AndroidKeychainStorage.cs create mode 100644 Packages/Sequence-Unity/Sequence/SequenceSDK/Utils/SecureStorage/AndroidKeychainStorage.cs.meta diff --git a/Packages/Sequence-Unity/Plugins/Android.meta b/Packages/Sequence-Unity/Plugins/Android.meta new file mode 100644 index 000000000..273257609 --- /dev/null +++ b/Packages/Sequence-Unity/Plugins/Android.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: d6320c7ac81bb42128567b31e7c3f048 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Packages/Sequence-Unity/Plugins/Android/AndroidKeyBridge.java b/Packages/Sequence-Unity/Plugins/Android/AndroidKeyBridge.java new file mode 100644 index 000000000..7409a8ccd --- /dev/null +++ b/Packages/Sequence-Unity/Plugins/Android/AndroidKeyBridge.java @@ -0,0 +1,84 @@ +package xyz.sequence; + +import android.content.SharedPreferences; +import android.util.Log; +import android.content.Context; +import android.widget.Toast; +import androidx.security.crypto.EncryptedSharedPreferences; +import androidx.security.crypto.MasterKey; + +import java.io.IOException; +import java.security.GeneralSecurityException; + + +public class AndroidKeyBridge { + + private static AndroidKeyBridge instance = null; + private Context context = null; + private MasterKey masterKey = null; + private SharedPreferences sharedPreferences; + + private AndroidKeyBridge() + { + + } + + public void init(Context context) + { + this.context = context; + + if (masterKey == null) { + + try { + masterKey = new MasterKey.Builder(context) + .setKeyScheme(MasterKey.KeyScheme.AES256_GCM) + .build(); + + sharedPreferences = EncryptedSharedPreferences.create( + context, + "secret_shared_prefs", + masterKey, + EncryptedSharedPreferences.PrefKeyEncryptionScheme.AES256_SIV, + EncryptedSharedPreferences.PrefValueEncryptionScheme.AES256_GCM + ); + } catch (GeneralSecurityException e){ + Log.d("Exception", e.getMessage()); + } catch (IOException e){ + Log.d("Exception", e.getMessage()); + } + } + } + + public void destroy() + { + this.context = null; + } + + public static AndroidKeyBridge getInstance() + { + if (instance == null) + instance = new AndroidKeyBridge(); + + return instance; + } + + public static void SaveKeychainValue(String key, String value) + { + getInstance().RunSaveKeychainValue(key, value); + } + + public static String GetKeychainValue(String key) + { + return getInstance().RunGetKeychainValue(key); + } + + private void RunSaveKeychainValue(String key, String value) + { + sharedPreferences.edit().putString(key, value).apply(); + } + + private String RunGetKeychainValue(String key) + { + return sharedPreferences.getString(key, ""); + } +} diff --git a/Packages/Sequence-Unity/Plugins/Android/AndroidKeyBridge.java.meta b/Packages/Sequence-Unity/Plugins/Android/AndroidKeyBridge.java.meta new file mode 100644 index 000000000..c249085f9 --- /dev/null +++ b/Packages/Sequence-Unity/Plugins/Android/AndroidKeyBridge.java.meta @@ -0,0 +1,32 @@ +fileFormatVersion: 2 +guid: 244ef116dbb604697abf6460b848cb47 +PluginImporter: + externalObjects: {} + serializedVersion: 2 + iconMap: {} + executionOrder: {} + defineConstraints: [] + isPreloaded: 0 + isOverridable: 0 + isExplicitlyReferenced: 0 + validateReferences: 1 + platformData: + - first: + Android: Android + second: + enabled: 1 + settings: {} + - first: + Any: + second: + enabled: 0 + settings: {} + - first: + Editor: Editor + second: + enabled: 0 + settings: + DefaultValueInitialized: true + userData: + assetBundleName: + assetBundleVariant: diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/Utils/SecureStorage/AndroidKeychainStorage.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/Utils/SecureStorage/AndroidKeychainStorage.cs new file mode 100644 index 000000000..76ec1b713 --- /dev/null +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/Utils/SecureStorage/AndroidKeychainStorage.cs @@ -0,0 +1,61 @@ +using System; +using System.Runtime.InteropServices; +using UnityEngine; + +namespace Sequence.Utils.SecureStorage +{ + public class AndroidKeychainStorage : ISecureStorage + { + private bool _isInitialized = false; + + public AndroidKeychainStorage() + { +#if !UNITY_ANDROID || UNITY_EDITOR + throw new System.NotSupportedException("AndroidKeychainStorage is only supported on Android platform."); +#else + InitializeAndroidKeyBridge(); // This method (and any methods it calls) is something I've added to Zemind's work - it may or may not be useful +#endif + } + +#if UNITY_ANDROID + private void InitializeAndroidKeyBridge() + { + if (!_isInitialized) + { + using (AndroidJavaClass bridgeClass = new AndroidJavaClass("xyz.sequence.AndroidKeyBridge")) + { + AndroidJavaObject unityContext = GetUnityActivity(); + bridgeClass.Call("init", unityContext); + _isInitialized = true; + } + } + } + + private AndroidJavaObject GetUnityActivity() + { + using (AndroidJavaClass unityPlayer = new AndroidJavaClass("com.unity3d.player.UnityPlayer")) + { + return unityPlayer.GetStatic("currentActivity"); + } + } +#endif + + public void StoreString(string key, string value) + { + #if UNITY_ANDROID && !UNITY_EDITOR + AndroidJavaClass androidBridge = new AndroidJavaClass("xyz.sequence.AndroidKeyBridge"); + androidBridge.CallStatic("SaveKeychainValue", key, value); + #endif + } + + public string RetrieveString(string key) + { + #if UNITY_ANDROID && !UNITY_EDITOR + AndroidJavaClass androidBridge = new AndroidJavaClass("xyz.sequence.AndroidKeyBridge"); + return androidBridge.CallStatic("GetKeychainValue", key); + #else + return null; + #endif + } + } +} \ No newline at end of file diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/Utils/SecureStorage/AndroidKeychainStorage.cs.meta b/Packages/Sequence-Unity/Sequence/SequenceSDK/Utils/SecureStorage/AndroidKeychainStorage.cs.meta new file mode 100644 index 000000000..2ea3d1a2b --- /dev/null +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/Utils/SecureStorage/AndroidKeychainStorage.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 467814aed5674f448b9e264577e8840c +timeCreated: 1717763229 \ No newline at end of file diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/Utils/SecureStorage/SecureStorageFactory.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/Utils/SecureStorage/SecureStorageFactory.cs index 919105530..b49607bfc 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/Utils/SecureStorage/SecureStorageFactory.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/Utils/SecureStorage/SecureStorageFactory.cs @@ -9,6 +9,8 @@ public static ISecureStorage CreateSecureStorage() { #if UNITY_IOS && !UNITY_EDITOR return new iOSKeychainStorage(); +#elif UNITY_ANDROID && !UNITY_EDITOR + return new AndroidKeychainStorage(); #elif UNITY_STANDALONE_OSX || UNITY_EDITOR_OSX return new MacOSKeychainStorage(); #elif UNITY_WEBGL && !UNITY_EDITOR diff --git a/Packages/Sequence-Unity/package.json b/Packages/Sequence-Unity/package.json index a6d020927..d2bf3a925 100644 --- a/Packages/Sequence-Unity/package.json +++ b/Packages/Sequence-Unity/package.json @@ -1,6 +1,6 @@ { "name": "xyz.0xsequence.waas-unity", - "version": "3.11.1", + "version": "3.11.2", "displayName": "Sequence Embedded Wallet SDK", "description": "A Unity SDK for the Sequence WaaS API", "unity": "2021.3", From 7ff00793139f0cac55dbee7e4477ab7c8a83ac3f Mon Sep 17 00:00:00 2001 From: caballoninja Date: Wed, 11 Dec 2024 16:01:00 -0300 Subject: [PATCH 02/15] Gradle templates update Included missing dependencies into the gradle templates and players settings --- .../Android/LauncherManifest.xml.DISABLED | 16 ++++++++ .../LauncherManifest.xml.DISABLED.meta | 7 ++++ .../Plugins/Android/gradleTemplate.properties | 8 ++++ .../Android/gradleTemplate.properties.backup | 6 +++ .../gradleTemplate.properties.backup.meta} | 2 +- .../Android/gradleTemplate.properties.meta | 7 ++++ Assets/Plugins/Android/mainTemplate.gradle | 41 +++++++++++++++++++ .../Plugins/Android/mainTemplate.gradle.meta | 7 ++++ ProjectSettings/EditorBuildSettings.asset | 4 +- ProjectSettings/ProjectSettings.asset | 12 +++--- 10 files changed, 101 insertions(+), 9 deletions(-) create mode 100644 Assets/Plugins/Android/LauncherManifest.xml.DISABLED create mode 100644 Assets/Plugins/Android/LauncherManifest.xml.DISABLED.meta create mode 100644 Assets/Plugins/Android/gradleTemplate.properties create mode 100644 Assets/Plugins/Android/gradleTemplate.properties.backup rename Assets/{PlayFab/PlayFabEditorExtensions/Editor/Resources/MostRecentPackage.unitypackage.meta => Plugins/Android/gradleTemplate.properties.backup.meta} (74%) create mode 100644 Assets/Plugins/Android/gradleTemplate.properties.meta create mode 100644 Assets/Plugins/Android/mainTemplate.gradle create mode 100644 Assets/Plugins/Android/mainTemplate.gradle.meta diff --git a/Assets/Plugins/Android/LauncherManifest.xml.DISABLED b/Assets/Plugins/Android/LauncherManifest.xml.DISABLED new file mode 100644 index 000000000..b498c9f12 --- /dev/null +++ b/Assets/Plugins/Android/LauncherManifest.xml.DISABLED @@ -0,0 +1,16 @@ + + + + + + diff --git a/Assets/Plugins/Android/LauncherManifest.xml.DISABLED.meta b/Assets/Plugins/Android/LauncherManifest.xml.DISABLED.meta new file mode 100644 index 000000000..4f1afeccd --- /dev/null +++ b/Assets/Plugins/Android/LauncherManifest.xml.DISABLED.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: 8a1bf9adb102e67439efcad78dd75c46 +TextScriptImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Plugins/Android/gradleTemplate.properties b/Assets/Plugins/Android/gradleTemplate.properties new file mode 100644 index 000000000..4092513ed --- /dev/null +++ b/Assets/Plugins/Android/gradleTemplate.properties @@ -0,0 +1,8 @@ +org.gradle.jvmargs=-Xmx**JVM_HEAP_SIZE**M +org.gradle.parallel=true +android.enableJetifier=true +android.useAndroidX=true +unityStreamingAssets=**STREAMING_ASSETS** +**ADDITIONAL_PROPERTIES** + +android.enableR8=**MINIFY_WITH_R_EIGHT** \ No newline at end of file diff --git a/Assets/Plugins/Android/gradleTemplate.properties.backup b/Assets/Plugins/Android/gradleTemplate.properties.backup new file mode 100644 index 000000000..d6dae39e7 --- /dev/null +++ b/Assets/Plugins/Android/gradleTemplate.properties.backup @@ -0,0 +1,6 @@ +org.gradle.jvmargs=-Xmx**JVM_HEAP_SIZE**M +org.gradle.parallel=true +android.enableJetifier=true +android.useAndroidX=true +unityStreamingAssets=**STREAMING_ASSETS** +**ADDITIONAL_PROPERTIES** diff --git a/Assets/PlayFab/PlayFabEditorExtensions/Editor/Resources/MostRecentPackage.unitypackage.meta b/Assets/Plugins/Android/gradleTemplate.properties.backup.meta similarity index 74% rename from Assets/PlayFab/PlayFabEditorExtensions/Editor/Resources/MostRecentPackage.unitypackage.meta rename to Assets/Plugins/Android/gradleTemplate.properties.backup.meta index c0cdc5250..77b43a0ab 100644 --- a/Assets/PlayFab/PlayFabEditorExtensions/Editor/Resources/MostRecentPackage.unitypackage.meta +++ b/Assets/Plugins/Android/gradleTemplate.properties.backup.meta @@ -1,5 +1,5 @@ fileFormatVersion: 2 -guid: aa66cce13570c4036afe2e85742962d9 +guid: 0d710393fabdd9f498123a4bed7ca3cb DefaultImporter: externalObjects: {} userData: diff --git a/Assets/Plugins/Android/gradleTemplate.properties.meta b/Assets/Plugins/Android/gradleTemplate.properties.meta new file mode 100644 index 000000000..30f01a2a1 --- /dev/null +++ b/Assets/Plugins/Android/gradleTemplate.properties.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: 8ff2f2a662c2a25499a268faa21d909a +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Plugins/Android/mainTemplate.gradle b/Assets/Plugins/Android/mainTemplate.gradle new file mode 100644 index 000000000..388db62c1 --- /dev/null +++ b/Assets/Plugins/Android/mainTemplate.gradle @@ -0,0 +1,41 @@ +apply plugin: 'com.android.library' +**APPLY_PLUGINS** + +dependencies { + implementation fileTree(dir: 'libs', include: ['*.jar']) + implementation 'androidx.security:security-crypto:1.1.0-alpha03' + +**DEPS**} + +android { + compileSdkVersion **APIVERSION** + buildToolsVersion '**BUILDTOOLS**' + + compileOptions { + sourceCompatibility JavaVersion.VERSION_1_8 + targetCompatibility JavaVersion.VERSION_1_8 + } + + defaultConfig { + minSdkVersion **MINSDKVERSION** + targetSdkVersion **TARGETSDKVERSION** + ndk { + abiFilters **ABIFILTERS** + } + versionCode **VERSIONCODE** + versionName '**VERSIONNAME**' + consumerProguardFiles 'proguard-unity.txt'**USER_PROGUARD** + } + + lintOptions { + abortOnError false + } + + aaptOptions { + noCompress = **BUILTIN_NOCOMPRESS** + unityStreamingAssets.tokenize(', ') + ignoreAssetsPattern = "!.svn:!.git:!.ds_store:!*.scc:.*:!CVS:!thumbs.db:!picasa.ini:!*~" + }**PACKAGING_OPTIONS** +}**REPOSITORIES** +**IL_CPP_BUILD_SETUP** +**SOURCE_BUILD_SETUP** +**EXTERNAL_SOURCES** diff --git a/Assets/Plugins/Android/mainTemplate.gradle.meta b/Assets/Plugins/Android/mainTemplate.gradle.meta new file mode 100644 index 000000000..c86d0fa1b --- /dev/null +++ b/Assets/Plugins/Android/mainTemplate.gradle.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: 415e8bf44b652f64abe1751afe7e319a +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/ProjectSettings/EditorBuildSettings.asset b/ProjectSettings/EditorBuildSettings.asset index bb00ff5ce..c5f9104d8 100644 --- a/ProjectSettings/EditorBuildSettings.asset +++ b/ProjectSettings/EditorBuildSettings.asset @@ -5,8 +5,8 @@ EditorBuildSettings: m_ObjectHideFlags: 0 serializedVersion: 2 m_Scenes: - - enabled: 1 - path: Packages/xyz.0xsequence.waas-unity/Sequence/Samples/DemoScene/Demo.unity + - enabled: 0 + path: Assets/Samples/Sequence Embedded Wallet SDK/3.11.9/Demo Scene/Demo.unity guid: d87896574aa4f42aab6b98685b555474 - enabled: 0 path: Assets/SequenceSDK/WaaS/Tests/EndToEnd/WaaSEndToEndTests.unity diff --git a/ProjectSettings/ProjectSettings.asset b/ProjectSettings/ProjectSettings.asset index b470ce870..0e2edea19 100644 --- a/ProjectSettings/ProjectSettings.asset +++ b/ProjectSettings/ProjectSettings.asset @@ -167,7 +167,7 @@ PlayerSettings: overrideDefaultApplicationIdentifier: 0 AndroidBundleVersionCode: 1 AndroidMinSdkVersion: 22 - AndroidTargetSdkVersion: 0 + AndroidTargetSdkVersion: 30 AndroidPreferredInstallLocation: 1 aotOptions: stripEngineCode: 1 @@ -245,10 +245,10 @@ PlayerSettings: templateDefaultScene: Assets/Scenes/SampleScene.unity useCustomMainManifest: 1 useCustomLauncherManifest: 0 - useCustomMainGradleTemplate: 0 + useCustomMainGradleTemplate: 1 useCustomLauncherGradleManifest: 0 useCustomBaseGradleTemplate: 0 - useCustomGradlePropertiesTemplate: 0 + useCustomGradlePropertiesTemplate: 1 useCustomProguardFile: 0 AndroidTargetArchitectures: 3 AndroidTargetDevices: 0 @@ -840,8 +840,8 @@ PlayerSettings: WebGL: 3 m_RenderingPath: 1 m_MobileRenderingPath: 1 - metroPackageName: Template_3D - metroPackageVersion: + metroPackageName: Template3D + metroPackageVersion: 1.0.0.0 metroCertificatePath: metroCertificatePassword: metroCertificateSubject: @@ -849,7 +849,7 @@ PlayerSettings: metroCertificateNotAfter: 0000000000000000 metroApplicationDescription: Template_3D wsaImages: {} - metroTileShortName: + metroTileShortName: demo-unity-game metroTileShowName: 0 metroMediumTileShowName: 0 metroLargeTileShowName: 0 From 8287c60963af647f4555766aa7dfbdb534cf9059 Mon Sep 17 00:00:00 2001 From: caballoninja Date: Thu, 9 Jan 2025 15:55:20 -0300 Subject: [PATCH 03/15] Get android keybridge instance --- .../Android/AndroidKeyBridge.java.meta | 53 ++++++++++++++++++- .../SecureStorage/AndroidKeychainStorage.cs | 12 +++-- 2 files changed, 59 insertions(+), 6 deletions(-) diff --git a/Packages/Sequence-Unity/Plugins/Android/AndroidKeyBridge.java.meta b/Packages/Sequence-Unity/Plugins/Android/AndroidKeyBridge.java.meta index c249085f9..b8f0a456a 100644 --- a/Packages/Sequence-Unity/Plugins/Android/AndroidKeyBridge.java.meta +++ b/Packages/Sequence-Unity/Plugins/Android/AndroidKeyBridge.java.meta @@ -6,16 +6,29 @@ PluginImporter: iconMap: {} executionOrder: {} defineConstraints: [] - isPreloaded: 0 + isPreloaded: 1 isOverridable: 0 isExplicitlyReferenced: 0 validateReferences: 1 platformData: + - first: + : Any + second: + enabled: 0 + settings: + Exclude Android: 0 + Exclude Editor: 1 + Exclude Linux64: 1 + Exclude OSXUniversal: 1 + Exclude Win: 1 + Exclude Win64: 1 + Exclude WindowsStoreApps: 1 - first: Android: Android second: enabled: 1 - settings: {} + settings: + CPU: ARMv7 - first: Any: second: @@ -26,7 +39,43 @@ PluginImporter: second: enabled: 0 settings: + CPU: AnyCPU DefaultValueInitialized: true + OS: AnyOS + - first: + Standalone: Linux64 + second: + enabled: 0 + settings: + CPU: AnyCPU + - first: + Standalone: OSXUniversal + second: + enabled: 0 + settings: + CPU: None + - first: + Standalone: Win + second: + enabled: 0 + settings: + CPU: x86 + - first: + Standalone: Win64 + second: + enabled: 0 + settings: + CPU: x86_64 + - first: + Windows Store Apps: WindowsStoreApps + second: + enabled: 0 + settings: + CPU: AnyCPU + DontProcess: false + PlaceholderPath: + SDK: AnySDK + ScriptingBackend: AnyScriptingBackend userData: assetBundleName: assetBundleVariant: diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/Utils/SecureStorage/AndroidKeychainStorage.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/Utils/SecureStorage/AndroidKeychainStorage.cs index 76ec1b713..40f7b8628 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/Utils/SecureStorage/AndroidKeychainStorage.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/Utils/SecureStorage/AndroidKeychainStorage.cs @@ -22,11 +22,15 @@ private void InitializeAndroidKeyBridge() { if (!_isInitialized) { - using (AndroidJavaClass bridgeClass = new AndroidJavaClass("xyz.sequence.AndroidKeyBridge")) + using (AndroidJavaClass javaClass = new AndroidJavaClass("xyz.sequence.AndroidKeyBridge")) { - AndroidJavaObject unityContext = GetUnityActivity(); - bridgeClass.Call("init", unityContext); - _isInitialized = true; + AndroidJavaObject bridgeObject = javaClass.CallStatic("getInstance"); + { + AndroidJavaObject unityContext = GetUnityActivity(); + bridgeObject.Call("init", unityContext); + _isInitialized = true; + + } } } } From c69c4fb5e83573d4e2b31a7b2753df75c9d74161 Mon Sep 17 00:00:00 2001 From: caballoninja Date: Thu, 9 Jan 2025 15:56:40 -0300 Subject: [PATCH 04/15] Settings update --- ProjectSettings/EditorBuildSettings.asset | 6 +++++- ProjectSettings/ProjectSettings.asset | 8 ++++++-- 2 files changed, 11 insertions(+), 3 deletions(-) diff --git a/ProjectSettings/EditorBuildSettings.asset b/ProjectSettings/EditorBuildSettings.asset index c5f9104d8..f72ae260a 100644 --- a/ProjectSettings/EditorBuildSettings.asset +++ b/ProjectSettings/EditorBuildSettings.asset @@ -5,13 +5,17 @@ EditorBuildSettings: m_ObjectHideFlags: 0 serializedVersion: 2 m_Scenes: +<<<<<<< Updated upstream - enabled: 0 +======= + - enabled: 1 +>>>>>>> Stashed changes path: Assets/Samples/Sequence Embedded Wallet SDK/3.11.9/Demo Scene/Demo.unity guid: d87896574aa4f42aab6b98685b555474 - enabled: 0 path: Assets/SequenceSDK/WaaS/Tests/EndToEnd/WaaSEndToEndTests.unity guid: 6a48e95d2401d41339a9d99c129ae1f9 - - enabled: 1 + - enabled: 0 path: Assets/SequenceFrontend/Scenes/Tests.unity guid: 4dfb06a7c845a4513907bd9b1a335575 m_configObjects: diff --git a/ProjectSettings/ProjectSettings.asset b/ProjectSettings/ProjectSettings.asset index 0e2edea19..644559617 100644 --- a/ProjectSettings/ProjectSettings.asset +++ b/ProjectSettings/ProjectSettings.asset @@ -166,7 +166,11 @@ PlayerSettings: tvOS: 0 overrideDefaultApplicationIdentifier: 0 AndroidBundleVersionCode: 1 +<<<<<<< Updated upstream AndroidMinSdkVersion: 22 +======= + AndroidMinSdkVersion: 23 +>>>>>>> Stashed changes AndroidTargetSdkVersion: 30 AndroidPreferredInstallLocation: 1 aotOptions: @@ -522,8 +526,8 @@ PlayerSettings: m_GraphicsJobMode: 0 m_BuildTargetGraphicsAPIs: - m_BuildTarget: AndroidPlayer - m_APIs: 150000000b000000 - m_Automatic: 1 + m_APIs: 0b000000 + m_Automatic: 0 - m_BuildTarget: iOSSupport m_APIs: 10000000 m_Automatic: 1 From fbefc0ecb42cd5f3a72c4ba352e26d2a1c44d183 Mon Sep 17 00:00:00 2001 From: Quinn Purdy Date: Fri, 10 Jan 2025 13:41:00 -0500 Subject: [PATCH 05/15] Some cleanup - removing unecessary files and changes --- .../Android/LauncherManifest.xml.DISABLED | 16 --------------- .../LauncherManifest.xml.DISABLED.meta | 7 ------- .../Android/gradleTemplate.properties.backup | 6 ------ .../gradleTemplate.properties.backup.meta | 7 ------- .../SecureStorage/AndroidKeychainStorage.cs | 3 +-- ProjectSettings/EditorBuildSettings.asset | 12 ++--------- ProjectSettings/ProjectSettings.asset | 20 ++++++++----------- 7 files changed, 11 insertions(+), 60 deletions(-) delete mode 100644 Assets/Plugins/Android/LauncherManifest.xml.DISABLED delete mode 100644 Assets/Plugins/Android/LauncherManifest.xml.DISABLED.meta delete mode 100644 Assets/Plugins/Android/gradleTemplate.properties.backup delete mode 100644 Assets/Plugins/Android/gradleTemplate.properties.backup.meta diff --git a/Assets/Plugins/Android/LauncherManifest.xml.DISABLED b/Assets/Plugins/Android/LauncherManifest.xml.DISABLED deleted file mode 100644 index b498c9f12..000000000 --- a/Assets/Plugins/Android/LauncherManifest.xml.DISABLED +++ /dev/null @@ -1,16 +0,0 @@ - - - - - - diff --git a/Assets/Plugins/Android/LauncherManifest.xml.DISABLED.meta b/Assets/Plugins/Android/LauncherManifest.xml.DISABLED.meta deleted file mode 100644 index 4f1afeccd..000000000 --- a/Assets/Plugins/Android/LauncherManifest.xml.DISABLED.meta +++ /dev/null @@ -1,7 +0,0 @@ -fileFormatVersion: 2 -guid: 8a1bf9adb102e67439efcad78dd75c46 -TextScriptImporter: - externalObjects: {} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/Plugins/Android/gradleTemplate.properties.backup b/Assets/Plugins/Android/gradleTemplate.properties.backup deleted file mode 100644 index d6dae39e7..000000000 --- a/Assets/Plugins/Android/gradleTemplate.properties.backup +++ /dev/null @@ -1,6 +0,0 @@ -org.gradle.jvmargs=-Xmx**JVM_HEAP_SIZE**M -org.gradle.parallel=true -android.enableJetifier=true -android.useAndroidX=true -unityStreamingAssets=**STREAMING_ASSETS** -**ADDITIONAL_PROPERTIES** diff --git a/Assets/Plugins/Android/gradleTemplate.properties.backup.meta b/Assets/Plugins/Android/gradleTemplate.properties.backup.meta deleted file mode 100644 index 77b43a0ab..000000000 --- a/Assets/Plugins/Android/gradleTemplate.properties.backup.meta +++ /dev/null @@ -1,7 +0,0 @@ -fileFormatVersion: 2 -guid: 0d710393fabdd9f498123a4bed7ca3cb -DefaultImporter: - externalObjects: {} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/Utils/SecureStorage/AndroidKeychainStorage.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/Utils/SecureStorage/AndroidKeychainStorage.cs index 40f7b8628..8867d54c0 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/Utils/SecureStorage/AndroidKeychainStorage.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/Utils/SecureStorage/AndroidKeychainStorage.cs @@ -13,7 +13,7 @@ public AndroidKeychainStorage() #if !UNITY_ANDROID || UNITY_EDITOR throw new System.NotSupportedException("AndroidKeychainStorage is only supported on Android platform."); #else - InitializeAndroidKeyBridge(); // This method (and any methods it calls) is something I've added to Zemind's work - it may or may not be useful + InitializeAndroidKeyBridge(); #endif } @@ -29,7 +29,6 @@ private void InitializeAndroidKeyBridge() AndroidJavaObject unityContext = GetUnityActivity(); bridgeObject.Call("init", unityContext); _isInitialized = true; - } } } diff --git a/ProjectSettings/EditorBuildSettings.asset b/ProjectSettings/EditorBuildSettings.asset index f72ae260a..f947b0d97 100644 --- a/ProjectSettings/EditorBuildSettings.asset +++ b/ProjectSettings/EditorBuildSettings.asset @@ -5,18 +5,10 @@ EditorBuildSettings: m_ObjectHideFlags: 0 serializedVersion: 2 m_Scenes: -<<<<<<< Updated upstream - - enabled: 0 -======= - enabled: 1 ->>>>>>> Stashed changes - path: Assets/Samples/Sequence Embedded Wallet SDK/3.11.9/Demo Scene/Demo.unity + path: Packages/xyz.0xsequence.waas-unity/Sequence/Samples/DemoScene/Demo.unity guid: d87896574aa4f42aab6b98685b555474 - - enabled: 0 - path: Assets/SequenceSDK/WaaS/Tests/EndToEnd/WaaSEndToEndTests.unity - guid: 6a48e95d2401d41339a9d99c129ae1f9 - enabled: 0 path: Assets/SequenceFrontend/Scenes/Tests.unity guid: 4dfb06a7c845a4513907bd9b1a335575 - m_configObjects: - com.unity.addressableassets: {fileID: 11400000, guid: 05a489a8ff904294fbd5aaeffa1a14d3, type: 2} + m_configObjects: {} diff --git a/ProjectSettings/ProjectSettings.asset b/ProjectSettings/ProjectSettings.asset index 644559617..5e3b04606 100644 --- a/ProjectSettings/ProjectSettings.asset +++ b/ProjectSettings/ProjectSettings.asset @@ -166,12 +166,8 @@ PlayerSettings: tvOS: 0 overrideDefaultApplicationIdentifier: 0 AndroidBundleVersionCode: 1 -<<<<<<< Updated upstream AndroidMinSdkVersion: 22 -======= - AndroidMinSdkVersion: 23 ->>>>>>> Stashed changes - AndroidTargetSdkVersion: 30 + AndroidTargetSdkVersion: 34 AndroidPreferredInstallLocation: 1 aotOptions: stripEngineCode: 1 @@ -249,10 +245,10 @@ PlayerSettings: templateDefaultScene: Assets/Scenes/SampleScene.unity useCustomMainManifest: 1 useCustomLauncherManifest: 0 - useCustomMainGradleTemplate: 1 + useCustomMainGradleTemplate: 0 useCustomLauncherGradleManifest: 0 useCustomBaseGradleTemplate: 0 - useCustomGradlePropertiesTemplate: 1 + useCustomGradlePropertiesTemplate: 0 useCustomProguardFile: 0 AndroidTargetArchitectures: 3 AndroidTargetDevices: 0 @@ -526,8 +522,8 @@ PlayerSettings: m_GraphicsJobMode: 0 m_BuildTargetGraphicsAPIs: - m_BuildTarget: AndroidPlayer - m_APIs: 0b000000 - m_Automatic: 0 + m_APIs: 150000000b000000 + m_Automatic: 1 - m_BuildTarget: iOSSupport m_APIs: 10000000 m_Automatic: 1 @@ -844,8 +840,8 @@ PlayerSettings: WebGL: 3 m_RenderingPath: 1 m_MobileRenderingPath: 1 - metroPackageName: Template3D - metroPackageVersion: 1.0.0.0 + metroPackageName: Template_3D + metroPackageVersion: metroCertificatePath: metroCertificatePassword: metroCertificateSubject: @@ -853,7 +849,7 @@ PlayerSettings: metroCertificateNotAfter: 0000000000000000 metroApplicationDescription: Template_3D wsaImages: {} - metroTileShortName: demo-unity-game + metroTileShortName: metroTileShowName: 0 metroMediumTileShowName: 0 metroLargeTileShowName: 0 From 7337b33d7be24a8ee9709a36d798df6f90a37269 Mon Sep 17 00:00:00 2001 From: Quinn Purdy Date: Fri, 10 Jan 2025 13:41:44 -0500 Subject: [PATCH 06/15] Increment package version --- Packages/Sequence-Unity/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Packages/Sequence-Unity/package.json b/Packages/Sequence-Unity/package.json index d2bf3a925..333d1bdbc 100644 --- a/Packages/Sequence-Unity/package.json +++ b/Packages/Sequence-Unity/package.json @@ -1,6 +1,6 @@ { "name": "xyz.0xsequence.waas-unity", - "version": "3.11.2", + "version": "3.15.0", "displayName": "Sequence Embedded Wallet SDK", "description": "A Unity SDK for the Sequence WaaS API", "unity": "2021.3", From a8d84da507c500aefaef6952052dbfba2c7d1ad6 Mon Sep 17 00:00:00 2001 From: Quinn Purdy Date: Fri, 10 Jan 2025 14:58:36 -0500 Subject: [PATCH 07/15] Rename AndroidKeychainStorage to AndroidKeystoreStorage as that is thecorrect name of the library it uses for storage --- ...{AndroidKeychainStorage.cs => AndroidKeystoreStorage.cs} | 6 +++--- ...ychainStorage.cs.meta => AndroidKeystoreStorage.cs.meta} | 0 .../SequenceSDK/Utils/SecureStorage/SecureStorageFactory.cs | 2 +- ProjectSettings/ProjectSettings.asset | 4 ++-- 4 files changed, 6 insertions(+), 6 deletions(-) rename Packages/Sequence-Unity/Sequence/SequenceSDK/Utils/SecureStorage/{AndroidKeychainStorage.cs => AndroidKeystoreStorage.cs} (90%) rename Packages/Sequence-Unity/Sequence/SequenceSDK/Utils/SecureStorage/{AndroidKeychainStorage.cs.meta => AndroidKeystoreStorage.cs.meta} (100%) diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/Utils/SecureStorage/AndroidKeychainStorage.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/Utils/SecureStorage/AndroidKeystoreStorage.cs similarity index 90% rename from Packages/Sequence-Unity/Sequence/SequenceSDK/Utils/SecureStorage/AndroidKeychainStorage.cs rename to Packages/Sequence-Unity/Sequence/SequenceSDK/Utils/SecureStorage/AndroidKeystoreStorage.cs index 8867d54c0..a5703ee68 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/Utils/SecureStorage/AndroidKeychainStorage.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/Utils/SecureStorage/AndroidKeystoreStorage.cs @@ -4,14 +4,14 @@ namespace Sequence.Utils.SecureStorage { - public class AndroidKeychainStorage : ISecureStorage + public class AndroidKeystoreStorage : ISecureStorage { private bool _isInitialized = false; - public AndroidKeychainStorage() + public AndroidKeystoreStorage() { #if !UNITY_ANDROID || UNITY_EDITOR - throw new System.NotSupportedException("AndroidKeychainStorage is only supported on Android platform."); + throw new System.NotSupportedException("AndroidKeystoreStorage is only supported on Android platform."); #else InitializeAndroidKeyBridge(); #endif diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/Utils/SecureStorage/AndroidKeychainStorage.cs.meta b/Packages/Sequence-Unity/Sequence/SequenceSDK/Utils/SecureStorage/AndroidKeystoreStorage.cs.meta similarity index 100% rename from Packages/Sequence-Unity/Sequence/SequenceSDK/Utils/SecureStorage/AndroidKeychainStorage.cs.meta rename to Packages/Sequence-Unity/Sequence/SequenceSDK/Utils/SecureStorage/AndroidKeystoreStorage.cs.meta diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/Utils/SecureStorage/SecureStorageFactory.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/Utils/SecureStorage/SecureStorageFactory.cs index 69125df1b..5e8b2e02d 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/Utils/SecureStorage/SecureStorageFactory.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/Utils/SecureStorage/SecureStorageFactory.cs @@ -12,7 +12,7 @@ public static ISecureStorage CreateSecureStorage() #elif UNITY_IOS && !UNITY_EDITOR return new iOSKeychainStorage(); #elif UNITY_ANDROID && !UNITY_EDITOR - return new AndroidKeychainStorage(); + return new AndroidKeystoreStorage(); #elif UNITY_STANDALONE_OSX || UNITY_EDITOR_OSX return new MacOSKeychainStorage(); #elif UNITY_WEBGL && !UNITY_EDITOR diff --git a/ProjectSettings/ProjectSettings.asset b/ProjectSettings/ProjectSettings.asset index 5e3b04606..be373b1bf 100644 --- a/ProjectSettings/ProjectSettings.asset +++ b/ProjectSettings/ProjectSettings.asset @@ -245,10 +245,10 @@ PlayerSettings: templateDefaultScene: Assets/Scenes/SampleScene.unity useCustomMainManifest: 1 useCustomLauncherManifest: 0 - useCustomMainGradleTemplate: 0 + useCustomMainGradleTemplate: 1 useCustomLauncherGradleManifest: 0 useCustomBaseGradleTemplate: 0 - useCustomGradlePropertiesTemplate: 0 + useCustomGradlePropertiesTemplate: 1 useCustomProguardFile: 0 AndroidTargetArchitectures: 3 AndroidTargetDevices: 0 From 0b8b7183e39c95db3a183eee55edf29697cdb440 Mon Sep 17 00:00:00 2001 From: Quinn Purdy Date: Fri, 10 Jan 2025 15:34:18 -0500 Subject: [PATCH 08/15] Wrap secure storage logic for Android in a script define. This is done so that if an integrator doesn't want to use secure storage, then they won't need to add a bunch of unnecessary android specific build files (manifests, gradle templates, etc.) in their publishing settings and can just use the Unity defaults. Without the script define, failure to include these will either cause a build failure or an exception on startup when Unity runtime is unable to locate the Java class, whether or not we use the code that tries to access the Java dependancy (if it is in the build, it will throw). Before building, either enable or disable the scripting define based on whether or not we have enabled the secure storage in SequenceConfig. --- .../Editor/AndroidScriptDefineSetup.cs | 57 +++++++++++++++++++ .../Editor/AndroidScriptDefineSetup.cs.meta | 3 + .../SecureStorage/AndroidKeystoreStorage.cs | 10 ++-- .../AndroidKeystoreStorage.cs.meta | 12 +++- 4 files changed, 76 insertions(+), 6 deletions(-) create mode 100644 Packages/Sequence-Unity/Editor/AndroidScriptDefineSetup.cs create mode 100644 Packages/Sequence-Unity/Editor/AndroidScriptDefineSetup.cs.meta diff --git a/Packages/Sequence-Unity/Editor/AndroidScriptDefineSetup.cs b/Packages/Sequence-Unity/Editor/AndroidScriptDefineSetup.cs new file mode 100644 index 000000000..098509ca8 --- /dev/null +++ b/Packages/Sequence-Unity/Editor/AndroidScriptDefineSetup.cs @@ -0,0 +1,57 @@ +using System.Collections.Generic; +using Sequence.Config; +using UnityEditor; +using UnityEditor.Build; +using UnityEditor.Build.Reporting; +using UnityEngine; + +namespace Sequence.Utils.SecureStorage.Editor +{ + /// + /// This class will set the script define ENABLE_SEQUENCE_ANDROID_SECURE_STORAGE based on the configuration in SequenceConfig. + /// We wrap our Android secure storage logic in a script define in order to avoid an exception; + /// if code is present in the build that attempts to access a Java class, Unity Runtime will throw an exception at startup whether that code is reached or not. + /// + public class AndroidScriptDefineSetup : IPreprocessBuildWithReport + { + private const string EnableAndroidSecureStorage = "ENABLE_SEQUENCE_ANDROID_SECURE_STORAGE"; + + public int callbackOrder => 0; + + public void OnPreprocessBuild(BuildReport report) + { + if (report.summary.platform == BuildTarget.Android) + { + BuildTargetGroup targetGroup = BuildPipeline.GetBuildTargetGroup(report.summary.platform); + List defineList; + string defines = PlayerSettings.GetScriptingDefineSymbols(NamedBuildTarget.FromBuildTargetGroup(targetGroup)); + if (string.IsNullOrWhiteSpace(defines)) + { + defineList = new List(); + } + else + { + defineList = new List(defines.Split(';')); + } + + SequenceConfig config = SequenceConfig.GetConfig(); + if (config.StoreSessionPrivateKeyInSecureStorage) + { + if (!defineList.Contains(EnableAndroidSecureStorage)) + { + defineList.Add(EnableAndroidSecureStorage); + } + } + else + { + if (defineList.Contains(EnableAndroidSecureStorage)) + { + defineList.Remove(EnableAndroidSecureStorage); + } + } + + PlayerSettings.SetScriptingDefineSymbols(NamedBuildTarget.FromBuildTargetGroup(targetGroup), string.Join(";", defineList)); + } + } + } +} diff --git a/Packages/Sequence-Unity/Editor/AndroidScriptDefineSetup.cs.meta b/Packages/Sequence-Unity/Editor/AndroidScriptDefineSetup.cs.meta new file mode 100644 index 000000000..4df92346f --- /dev/null +++ b/Packages/Sequence-Unity/Editor/AndroidScriptDefineSetup.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 320e8e73794b4ea383525309db8dbb7e +timeCreated: 1736539215 \ No newline at end of file diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/Utils/SecureStorage/AndroidKeystoreStorage.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/Utils/SecureStorage/AndroidKeystoreStorage.cs index a5703ee68..8ca70e483 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/Utils/SecureStorage/AndroidKeystoreStorage.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/Utils/SecureStorage/AndroidKeystoreStorage.cs @@ -12,12 +12,14 @@ public AndroidKeystoreStorage() { #if !UNITY_ANDROID || UNITY_EDITOR throw new System.NotSupportedException("AndroidKeystoreStorage is only supported on Android platform."); +#elif UNITY_ANDROID && ENABLE_SEQUENCE_ANDROID_SECURE_STORAGE + InitializeAndroidKeyBridge(); #else - InitializeAndroidKeyBridge(); + throw new System.NotSupportedException("Invalid use. Secure storage is not enabled. Please enable in SequenceConfig and/or set the script define above"); #endif } -#if UNITY_ANDROID +#if UNITY_ANDROID && ENABLE_SEQUENCE_ANDROID_SECURE_STORAGE private void InitializeAndroidKeyBridge() { if (!_isInitialized) @@ -45,7 +47,7 @@ private AndroidJavaObject GetUnityActivity() public void StoreString(string key, string value) { - #if UNITY_ANDROID && !UNITY_EDITOR + #if UNITY_ANDROID && !UNITY_EDITOR && ENABLE_SEQUENCE_ANDROID_SECURE_STORAGE AndroidJavaClass androidBridge = new AndroidJavaClass("xyz.sequence.AndroidKeyBridge"); androidBridge.CallStatic("SaveKeychainValue", key, value); #endif @@ -53,7 +55,7 @@ public void StoreString(string key, string value) public string RetrieveString(string key) { - #if UNITY_ANDROID && !UNITY_EDITOR + #if UNITY_ANDROID && !UNITY_EDITOR && ENABLE_SEQUENCE_ANDROID_SECURE_STORAGE AndroidJavaClass androidBridge = new AndroidJavaClass("xyz.sequence.AndroidKeyBridge"); return androidBridge.CallStatic("GetKeychainValue", key); #else diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/Utils/SecureStorage/AndroidKeystoreStorage.cs.meta b/Packages/Sequence-Unity/Sequence/SequenceSDK/Utils/SecureStorage/AndroidKeystoreStorage.cs.meta index 2ea3d1a2b..f0f0bee4a 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/Utils/SecureStorage/AndroidKeystoreStorage.cs.meta +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/Utils/SecureStorage/AndroidKeystoreStorage.cs.meta @@ -1,3 +1,11 @@ fileFormatVersion: 2 -guid: 467814aed5674f448b9e264577e8840c -timeCreated: 1717763229 \ No newline at end of file +guid: 03dc91e20a78d45c4af73f18a4eca18f +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: From b23959c3b51bcf7cb0c702f6292d1db43489ccb6 Mon Sep 17 00:00:00 2001 From: Quinn Purdy Date: Mon, 13 Jan 2025 11:15:02 -0500 Subject: [PATCH 09/15] Enable android key bridge plugin when building to android with secure storage enabled in sequence config --- .../Editor/AndroidDependencyManager.cs | 40 +++++++++++++++++++ .../Editor/AndroidDependencyManager.cs.meta | 3 ++ .../Editor/AndroidScriptDefineSetup.cs | 2 +- .../Android/AndroidKeyBridge.java.meta | 11 +++++ .../SequenceFrontend/Scripts/UI/LoginPanel.cs | 10 ++--- 5 files changed, 59 insertions(+), 7 deletions(-) create mode 100644 Packages/Sequence-Unity/Editor/AndroidDependencyManager.cs create mode 100644 Packages/Sequence-Unity/Editor/AndroidDependencyManager.cs.meta diff --git a/Packages/Sequence-Unity/Editor/AndroidDependencyManager.cs b/Packages/Sequence-Unity/Editor/AndroidDependencyManager.cs new file mode 100644 index 000000000..e86919f44 --- /dev/null +++ b/Packages/Sequence-Unity/Editor/AndroidDependencyManager.cs @@ -0,0 +1,40 @@ +using Sequence.Config; +using UnityEditor; +using UnityEditor.Build; +using UnityEditor.Build.Reporting; +using UnityEditor.Callbacks; +using UnityEngine; + +namespace Sequence.Editor +{ + /// + /// When building for Android, some plugins, like our Secure Storage system, require custom gradle files in order to build successfully + /// If an integrator isn't using the features of one of these plugins, they shouldn't need to use the custom gradle files + /// This class will exclude any unused plugins from the build (using config from SequenceConfig) so that integrators can build without custom gradle files + /// + public class AndroidDependencyManager : IPreprocessBuildWithReport + { + private const string _secureStoragePluginPath = "Packages/xyz.0xsequence.waas-unity/Plugins/Android/AndroidKeyBridge.java"; + + public int callbackOrder => 0; + + public void OnPreprocessBuild(BuildReport report) + { +#if UNITY_ANDROID + BuildTarget target = report.summary.platform; + SequenceConfig config = SequenceConfig.GetConfig(); + + PluginImporter pluginImporter = AssetImporter.GetAtPath(_secureStoragePluginPath) as PluginImporter; + + if (pluginImporter == null) + { + Debug.LogWarning($"Plugin not found at path: {_secureStoragePluginPath}"); + return; + } + + pluginImporter.SetCompatibleWithPlatform(target, config.StoreSessionPrivateKeyInSecureStorage); + pluginImporter.SaveAndReimport(); +#endif + } + } +} \ No newline at end of file diff --git a/Packages/Sequence-Unity/Editor/AndroidDependencyManager.cs.meta b/Packages/Sequence-Unity/Editor/AndroidDependencyManager.cs.meta new file mode 100644 index 000000000..196eeeb81 --- /dev/null +++ b/Packages/Sequence-Unity/Editor/AndroidDependencyManager.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: f1ca6f2afaf84b888012fe900f097407 +timeCreated: 1736777093 \ No newline at end of file diff --git a/Packages/Sequence-Unity/Editor/AndroidScriptDefineSetup.cs b/Packages/Sequence-Unity/Editor/AndroidScriptDefineSetup.cs index 098509ca8..d72ec0fde 100644 --- a/Packages/Sequence-Unity/Editor/AndroidScriptDefineSetup.cs +++ b/Packages/Sequence-Unity/Editor/AndroidScriptDefineSetup.cs @@ -5,7 +5,7 @@ using UnityEditor.Build.Reporting; using UnityEngine; -namespace Sequence.Utils.SecureStorage.Editor +namespace Sequence.Editor { /// /// This class will set the script define ENABLE_SEQUENCE_ANDROID_SECURE_STORAGE based on the configuration in SequenceConfig. diff --git a/Packages/Sequence-Unity/Plugins/Android/AndroidKeyBridge.java.meta b/Packages/Sequence-Unity/Plugins/Android/AndroidKeyBridge.java.meta index b8f0a456a..cd96be83f 100644 --- a/Packages/Sequence-Unity/Plugins/Android/AndroidKeyBridge.java.meta +++ b/Packages/Sequence-Unity/Plugins/Android/AndroidKeyBridge.java.meta @@ -20,9 +20,11 @@ PluginImporter: Exclude Editor: 1 Exclude Linux64: 1 Exclude OSXUniversal: 1 + Exclude WebGL: 1 Exclude Win: 1 Exclude Win64: 1 Exclude WindowsStoreApps: 1 + Exclude iOS: 1 - first: Android: Android second: @@ -76,6 +78,15 @@ PluginImporter: PlaceholderPath: SDK: AnySDK ScriptingBackend: AnyScriptingBackend + - first: + iPhone: iOS + second: + enabled: 0 + settings: + AddToEmbeddedBinaries: false + CPU: AnyCPU + CompileFlags: + FrameworkDependencies: userData: assetBundleName: assetBundleVariant: diff --git a/Packages/Sequence-Unity/Sequence/SequenceFrontend/Scripts/UI/LoginPanel.cs b/Packages/Sequence-Unity/Sequence/SequenceFrontend/Scripts/UI/LoginPanel.cs index 6ec4a3420..cecb566b2 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceFrontend/Scripts/UI/LoginPanel.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceFrontend/Scripts/UI/LoginPanel.cs @@ -67,19 +67,17 @@ public override void Open(params object[] args) _alreadyAttemptedToRestoreSession = args.GetObjectOfTypeIfExists(); } - if (SecureStorageFactory.IsSupportedPlatform()) + if (SecureStorageFactory.IsSupportedPlatform() && _storeSessionInfoAndSkipLoginWhenPossible) { - if (_storeSessionInfoAndSkipLoginWhenPossible && !_alreadyAttemptedToRestoreSession) + if (!_alreadyAttemptedToRestoreSession) { _alreadyAttemptedToRestoreSession = true; LoginHandler.TryToRestoreSession(); return; } - if (_storeSessionInfoAndSkipLoginWhenPossible) - { - LoginHandler.SetupAuthenticator(); - } + + LoginHandler.SetupAuthenticator(); } base.Open(args); From eac1f706b8c10bce22f99e553039baa01d4e8506 Mon Sep 17 00:00:00 2001 From: Quinn Purdy Date: Wed, 6 Nov 2024 17:17:23 -0500 Subject: [PATCH 10/15] Added a platform compile test and instructions on how to use it and what's for the the README.md --- .gitignore | 2 + Assets/SequenceSDK/Editor.meta | 3 + .../Editor/SequencePlatformCompileTest.cs | 123 ++++++++++++++++++ .../SequencePlatformCompileTest.cs.meta | 3 + README.md | 3 + 5 files changed, 134 insertions(+) create mode 100644 Assets/SequenceSDK/Editor.meta create mode 100644 Assets/SequenceSDK/Editor/SequencePlatformCompileTest.cs create mode 100644 Assets/SequenceSDK/Editor/SequencePlatformCompileTest.cs.meta diff --git a/.gitignore b/.gitignore index 7043d58b0..3f287e6c9 100644 --- a/.gitignore +++ b/.gitignore @@ -101,6 +101,8 @@ crashlytics-build.properties chaintest.out TestResults_Edit.xml TestResults_Play.xml +Builds/ +PlatformCompileTestErrors/ # Temporary test files Assets/InitTestScene*.unity* diff --git a/Assets/SequenceSDK/Editor.meta b/Assets/SequenceSDK/Editor.meta new file mode 100644 index 000000000..7ec767b56 --- /dev/null +++ b/Assets/SequenceSDK/Editor.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: c69089558d4b414195f1a76d05e6f863 +timeCreated: 1730928057 \ No newline at end of file diff --git a/Assets/SequenceSDK/Editor/SequencePlatformCompileTest.cs b/Assets/SequenceSDK/Editor/SequencePlatformCompileTest.cs new file mode 100644 index 000000000..8ac86eac5 --- /dev/null +++ b/Assets/SequenceSDK/Editor/SequencePlatformCompileTest.cs @@ -0,0 +1,123 @@ +using System; +using System.Collections.Generic; +using System.IO; +using System.Linq; +using UnityEditor; +using UnityEditor.Build.Reporting; +using UnityEngine; + +namespace Sequence.Editor +{ + /// + /// This test will build the project for all platforms and check if the build is compiled successfully + /// + public static class SequencePlatformCompileTest + { + private const string BuildDirectory = "Builds"; + private static List _failedBuilds; + + [MenuItem("Sequence Dev/Platform Compile Test")] + public static void RunBuildTest() + { + ClearPreviousErrors(); + + string[] scenes = GetEnabledScenes(); + +#if UNITY_EDITOR_WIN + BuildPlatform(BuildTarget.StandaloneWindows64, $"{BuildDirectory}/WindowsBuild", scenes); +#endif +#if UNITY_EDITOR_OSX + BuildPlatform(BuildTarget.StandaloneOSX, $"{BuildDirectory}/MacOSBuild", scenes); + BuildPlatform(BuildTarget.iOS, $"{BuildDirectory}/iOSBuild", scenes); +#endif + BuildPlatform(BuildTarget.WebGL, $"{BuildDirectory}/WebGLBuild", scenes); + BuildPlatform(BuildTarget.Android, $"{BuildDirectory}/AndroidBuild", scenes); + + Debug.Log("Platform Compile Test Completed. Check the console for errors."); + foreach (var failedBuild in _failedBuilds) + { + Debug.LogError(failedBuild); + } + } + + private static void ClearPreviousErrors() + { + _failedBuilds = new List(); + + string errorDirectory = "PlatformCompileTestErrors"; + if (Directory.Exists(errorDirectory)) + { + var txtFiles = Directory.GetFiles(errorDirectory, "*.txt"); + foreach (var file in txtFiles) + { + File.Delete(file); + } + } + else + { + Directory.CreateDirectory(errorDirectory); + } + } + + private static string[] GetEnabledScenes() + { + return EditorBuildSettings.scenes + .Where(scene => scene.enabled) + .Select(scene => scene.path) + .ToArray(); + } + + private static void BuildPlatform(BuildTarget target, string path, string[] scenes) + { + try + { + BuildReport report = BuildPipeline.BuildPlayer(scenes, path, target, BuildOptions.None); + + if (report.summary.result != BuildResult.Succeeded) + { + _failedBuilds.Add($"{target} build failed with {report.summary.totalErrors} errors. Please see {BuildDirectory}/{target}.txt for details."); + LogErrorsToFile(report, target); + } + } + finally + { + if (Directory.Exists(BuildDirectory)) + { + Directory.Delete(BuildDirectory, true); + } + } + } + + private static void LogErrorsToFile(BuildReport report, BuildTarget target) + { + string errorDirectory = "PlatformCompileTestErrors"; + if (!Directory.Exists(errorDirectory)) + { + Directory.CreateDirectory(errorDirectory); + } + + string errorFilePath = Path.Combine(errorDirectory, $"{target}.txt"); + + using (StreamWriter writer = new StreamWriter(errorFilePath, false)) + { + writer.WriteLine($"Build Time: {DateTime.Now:yyyy-MM-dd HH:mm:ss}"); + writer.WriteLine($"Platform: {target}"); + writer.WriteLine($"Build Errors Summary:"); + writer.WriteLine($"Total Errors: {report.summary.totalErrors}"); + writer.WriteLine(); + writer.WriteLine("Detailed Errors:"); + + foreach (var step in report.steps) + { + foreach (var message in step.messages) + { + if (message.type == LogType.Error) + { + writer.WriteLine($"[{message.type}] {message.content}"); + } + } + } + } + } + } +} \ No newline at end of file diff --git a/Assets/SequenceSDK/Editor/SequencePlatformCompileTest.cs.meta b/Assets/SequenceSDK/Editor/SequencePlatformCompileTest.cs.meta new file mode 100644 index 000000000..989f0194d --- /dev/null +++ b/Assets/SequenceSDK/Editor/SequencePlatformCompileTest.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 2179ce729f5144d897df0065aad79ff1 +timeCreated: 1730927874 \ No newline at end of file diff --git a/README.md b/README.md index 8c1c48eeb..7610b94dd 100644 --- a/README.md +++ b/README.md @@ -31,6 +31,9 @@ Many of the tests, specifically those for our custom Ethereum client, make use o Before running tests, boot up the test chain with `make start-testchain`. You may find that you need to stop (control + c) the testchain and restart it when running the test suite again. +### Platform Compile Test +When making large amounts of changes or any changes that may impact builds (assemblies, dependencies, etc.), it is useful to confirm that the SDK still compiles on the [targeted platforms](#supported-platforms). To do this navigate to the top menu and click `Sequence Dev > Platform Compile Test`. This will build the project, and the currently selected scenes in the build settings, on all targeted platforms. All build errors encountered will be recorded in `PlatformCompileTestErrors/.txt`. The builds will be cleaned up once completed. This test doesn't run any tests against the individual builds; it only confirms that the project builds on a given platform. As you might imagine, this test takes a long time to run and sometimes causes Unity to crash (as building does sometimes) so it is best to run this test when you won't be needing the editor for some time + ### Testing via command line It can sometimes be useful to quickly test the project via command line. This can be done without opening Unity or starting the testchain. #### One-Time Setup From 7808ab3bd1158260dccc987a3e443846440a5608 Mon Sep 17 00:00:00 2001 From: Quinn Purdy Date: Wed, 6 Nov 2024 17:22:00 -0500 Subject: [PATCH 11/15] Log out the total test time. It actually isn't that slow with Android running at the end (as you must click to confirm and continue if a build fails --- Assets/SequenceSDK/Editor/SequencePlatformCompileTest.cs | 5 +++++ README.md | 2 +- 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/Assets/SequenceSDK/Editor/SequencePlatformCompileTest.cs b/Assets/SequenceSDK/Editor/SequencePlatformCompileTest.cs index 8ac86eac5..d9539cead 100644 --- a/Assets/SequenceSDK/Editor/SequencePlatformCompileTest.cs +++ b/Assets/SequenceSDK/Editor/SequencePlatformCompileTest.cs @@ -2,6 +2,7 @@ using System.Collections.Generic; using System.IO; using System.Linq; +using System.Numerics; using UnityEditor; using UnityEditor.Build.Reporting; using UnityEngine; @@ -19,6 +20,7 @@ public static class SequencePlatformCompileTest [MenuItem("Sequence Dev/Platform Compile Test")] public static void RunBuildTest() { + BigInteger startEpochTime = new BigInteger(DateTimeOffset.Now.ToUnixTimeSeconds()); ClearPreviousErrors(); string[] scenes = GetEnabledScenes(); @@ -38,6 +40,9 @@ public static void RunBuildTest() { Debug.LogError(failedBuild); } + + BigInteger endEpochTime = new BigInteger(DateTimeOffset.Now.ToUnixTimeSeconds()); + Debug.Log($"Total Test Time: {endEpochTime - startEpochTime} seconds"); } private static void ClearPreviousErrors() diff --git a/README.md b/README.md index 7610b94dd..d554eb0f5 100644 --- a/README.md +++ b/README.md @@ -32,7 +32,7 @@ Many of the tests, specifically those for our custom Ethereum client, make use o Before running tests, boot up the test chain with `make start-testchain`. You may find that you need to stop (control + c) the testchain and restart it when running the test suite again. ### Platform Compile Test -When making large amounts of changes or any changes that may impact builds (assemblies, dependencies, etc.), it is useful to confirm that the SDK still compiles on the [targeted platforms](#supported-platforms). To do this navigate to the top menu and click `Sequence Dev > Platform Compile Test`. This will build the project, and the currently selected scenes in the build settings, on all targeted platforms. All build errors encountered will be recorded in `PlatformCompileTestErrors/.txt`. The builds will be cleaned up once completed. This test doesn't run any tests against the individual builds; it only confirms that the project builds on a given platform. As you might imagine, this test takes a long time to run and sometimes causes Unity to crash (as building does sometimes) so it is best to run this test when you won't be needing the editor for some time +When making large amounts of changes or any changes that may impact builds (assemblies, dependencies, etc.), it is useful to confirm that the SDK still compiles on the [targeted platforms](#supported-platforms). To do this navigate to the top menu and click `Sequence Dev > Platform Compile Test`. This will build the project, and the currently selected scenes in the build settings, on all targeted platforms. All build errors encountered will be recorded in `PlatformCompileTestErrors/.txt`. The builds will be cleaned up once completed. This test doesn't run any tests against the individual builds; it only confirms that the project builds on a given platform. ### Testing via command line It can sometimes be useful to quickly test the project via command line. This can be done without opening Unity or starting the testchain. From 9b12f991dd800a5fbbba9b5ffc350683398b4517 Mon Sep 17 00:00:00 2001 From: Quinn Purdy Date: Mon, 13 Jan 2025 11:44:50 -0500 Subject: [PATCH 12/15] Modify SequencePlatformCompileTest such that it also tests that the pre-processor define script is being added/removed and that the android key bridge plugin is being enabled/disabled accordingly. --- .../Editor/SequencePlatformCompileTest.cs | 78 ++++++++++++++++--- .../Editor/AndroidDependencyManager.cs | 6 +- .../Editor/AndroidScriptDefineSetup.cs | 2 +- ProjectSettings/ProjectSettings.asset | 2 +- 4 files changed, 71 insertions(+), 17 deletions(-) diff --git a/Assets/SequenceSDK/Editor/SequencePlatformCompileTest.cs b/Assets/SequenceSDK/Editor/SequencePlatformCompileTest.cs index d9539cead..c048ddfc7 100644 --- a/Assets/SequenceSDK/Editor/SequencePlatformCompileTest.cs +++ b/Assets/SequenceSDK/Editor/SequencePlatformCompileTest.cs @@ -3,7 +3,10 @@ using System.IO; using System.Linq; using System.Numerics; +using NUnit.Framework; +using Sequence.Config; using UnityEditor; +using UnityEditor.Build; using UnityEditor.Build.Reporting; using UnityEngine; @@ -33,7 +36,7 @@ public static void RunBuildTest() BuildPlatform(BuildTarget.iOS, $"{BuildDirectory}/iOSBuild", scenes); #endif BuildPlatform(BuildTarget.WebGL, $"{BuildDirectory}/WebGLBuild", scenes); - BuildPlatform(BuildTarget.Android, $"{BuildDirectory}/AndroidBuild", scenes); + AndroidBuildTest($"{BuildDirectory}/AndroidBuild", scenes); Debug.Log("Platform Compile Test Completed. Check the console for errors."); foreach (var failedBuild in _failedBuilds) @@ -76,20 +79,30 @@ private static void BuildPlatform(BuildTarget target, string path, string[] scen { try { - BuildReport report = BuildPipeline.BuildPlayer(scenes, path, target, BuildOptions.None); - - if (report.summary.result != BuildResult.Succeeded) - { - _failedBuilds.Add($"{target} build failed with {report.summary.totalErrors} errors. Please see {BuildDirectory}/{target}.txt for details."); - LogErrorsToFile(report, target); - } + BuildToPlatformAndCheckForSuccess(target, path, scenes); } finally { - if (Directory.Exists(BuildDirectory)) - { - Directory.Delete(BuildDirectory, true); - } + CleanupBuildDirectory(); + } + } + + private static void BuildToPlatformAndCheckForSuccess(BuildTarget target, string path, string[] scenes) + { + BuildReport report = BuildPipeline.BuildPlayer(scenes, path, target, BuildOptions.None); + + if (report.summary.result != BuildResult.Succeeded) + { + _failedBuilds.Add($"{target} build failed with {report.summary.totalErrors} errors. Please see {BuildDirectory}/{target}.txt for details."); + LogErrorsToFile(report, target); + } + } + + private static void CleanupBuildDirectory() + { + if (Directory.Exists(BuildDirectory)) + { + Directory.Delete(BuildDirectory, true); } } @@ -124,5 +137,46 @@ private static void LogErrorsToFile(BuildReport report, BuildTarget target) } } } + + private static void AndroidBuildTest(string path, string[] scenes) + { + SequenceConfig config = SequenceConfig.GetConfig(); + bool isSecureStorageEnabled = config.StoreSessionPrivateKeyInSecureStorage; + BuildTarget target = BuildTarget.Android; + + try + { + BuildToPlatformAndCheckForSuccess(target, path, scenes); + + AssertPluginCompatibility(config, target); + AssertAppropriateScriptingDefines(config, target); + + config.StoreSessionPrivateKeyInSecureStorage = !config.StoreSessionPrivateKeyInSecureStorage; + + BuildToPlatformAndCheckForSuccess(target, path, scenes); + + AssertPluginCompatibility(config, target); + AssertAppropriateScriptingDefines(config, target); + } + finally + { + config.StoreSessionPrivateKeyInSecureStorage = isSecureStorageEnabled; + + CleanupBuildDirectory(); + } + } + + private static void AssertPluginCompatibility(SequenceConfig config, BuildTarget target) + { + PluginImporter pluginImporter = AssetImporter.GetAtPath(AndroidDependencyManager.SecureStoragePluginPath) as PluginImporter; + Assert.IsNotNull(pluginImporter, "Plugin not found at path: " + AndroidDependencyManager.SecureStoragePluginPath); + Assert.AreEqual(config.StoreSessionPrivateKeyInSecureStorage, pluginImporter.GetCompatibleWithPlatform(target)); + } + + private static void AssertAppropriateScriptingDefines(SequenceConfig config, BuildTarget target) + { + string defines = PlayerSettings.GetScriptingDefineSymbols(NamedBuildTarget.FromBuildTargetGroup(BuildPipeline.GetBuildTargetGroup(target))); + Assert.AreEqual(config.StoreSessionPrivateKeyInSecureStorage, defines.Contains(AndroidScriptDefineSetup.EnableAndroidSecureStorage)); + } } } \ No newline at end of file diff --git a/Packages/Sequence-Unity/Editor/AndroidDependencyManager.cs b/Packages/Sequence-Unity/Editor/AndroidDependencyManager.cs index e86919f44..728f47906 100644 --- a/Packages/Sequence-Unity/Editor/AndroidDependencyManager.cs +++ b/Packages/Sequence-Unity/Editor/AndroidDependencyManager.cs @@ -14,7 +14,7 @@ namespace Sequence.Editor /// public class AndroidDependencyManager : IPreprocessBuildWithReport { - private const string _secureStoragePluginPath = "Packages/xyz.0xsequence.waas-unity/Plugins/Android/AndroidKeyBridge.java"; + public const string SecureStoragePluginPath = "Packages/xyz.0xsequence.waas-unity/Plugins/Android/AndroidKeyBridge.java"; public int callbackOrder => 0; @@ -24,11 +24,11 @@ public void OnPreprocessBuild(BuildReport report) BuildTarget target = report.summary.platform; SequenceConfig config = SequenceConfig.GetConfig(); - PluginImporter pluginImporter = AssetImporter.GetAtPath(_secureStoragePluginPath) as PluginImporter; + PluginImporter pluginImporter = AssetImporter.GetAtPath(SecureStoragePluginPath) as PluginImporter; if (pluginImporter == null) { - Debug.LogWarning($"Plugin not found at path: {_secureStoragePluginPath}"); + Debug.LogWarning($"Plugin not found at path: {SecureStoragePluginPath}"); return; } diff --git a/Packages/Sequence-Unity/Editor/AndroidScriptDefineSetup.cs b/Packages/Sequence-Unity/Editor/AndroidScriptDefineSetup.cs index d72ec0fde..86e99c1f0 100644 --- a/Packages/Sequence-Unity/Editor/AndroidScriptDefineSetup.cs +++ b/Packages/Sequence-Unity/Editor/AndroidScriptDefineSetup.cs @@ -14,7 +14,7 @@ namespace Sequence.Editor /// public class AndroidScriptDefineSetup : IPreprocessBuildWithReport { - private const string EnableAndroidSecureStorage = "ENABLE_SEQUENCE_ANDROID_SECURE_STORAGE"; + public const string EnableAndroidSecureStorage = "ENABLE_SEQUENCE_ANDROID_SECURE_STORAGE"; public int callbackOrder => 0; diff --git a/ProjectSettings/ProjectSettings.asset b/ProjectSettings/ProjectSettings.asset index be373b1bf..ad42d3430 100644 --- a/ProjectSettings/ProjectSettings.asset +++ b/ProjectSettings/ProjectSettings.asset @@ -813,7 +813,7 @@ PlayerSettings: webGLThreadsSupport: 0 webGLDecompressionFallback: 0 scriptingDefineSymbols: - Android: + Android: ENABLE_SEQUENCE_ANDROID_SECURE_STORAGE Server: Standalone: UNITY_ASTOOLS_EXPERIMENTAL WebGL: VUPLEX_CCU;VUPLEX_STANDALONE From ea851cc28590934dd41088b546a0d13d8367bd6f Mon Sep 17 00:00:00 2001 From: Quinn Purdy Date: Mon, 13 Jan 2025 16:02:53 -0500 Subject: [PATCH 13/15] Check that they are using custom gradle files - without these secure storage will not work - if not present log a warning and re-direct integrator to our docs. One of these two files are required in order to build, without it, the build will fail - in this case, the warning logs will not appear, so we display a popup to make sure the user sees the warning. --- .../Editor/AndroidCustomGradleCheck.cs | 90 +++++++++++++++++++ .../Editor/AndroidCustomGradleCheck.cs.meta | 3 + .../SecureStorage/AndroidKeystoreStorage.cs | 2 - 3 files changed, 93 insertions(+), 2 deletions(-) create mode 100644 Packages/Sequence-Unity/Editor/AndroidCustomGradleCheck.cs create mode 100644 Packages/Sequence-Unity/Editor/AndroidCustomGradleCheck.cs.meta diff --git a/Packages/Sequence-Unity/Editor/AndroidCustomGradleCheck.cs b/Packages/Sequence-Unity/Editor/AndroidCustomGradleCheck.cs new file mode 100644 index 000000000..2e451a6d4 --- /dev/null +++ b/Packages/Sequence-Unity/Editor/AndroidCustomGradleCheck.cs @@ -0,0 +1,90 @@ +using System.Collections.Generic; +using System.Linq; +using Sequence.Config; +using UnityEditor.Build; +using UnityEditor.Build.Reporting; +using UnityEditor; +using UnityEngine; + +namespace Sequence.Editor +{ + public class AndroidCustomGradleCheck : IPreprocessBuildWithReport + { + public int callbackOrder => 0; + + private static List _cachedWarnings; + + private const string _docsUrl = "https://docs.sequence.xyz/sdk/unity/recovering-sessions#android"; + + public void OnPreprocessBuild(BuildReport report) + { + _cachedWarnings = new List(); + if (report.summary.platform == BuildTarget.Android) + { + SequenceConfig config = SequenceConfig.GetConfig(); + if (config.StoreSessionPrivateKeyInSecureStorage) + { + bool isCustomGradlePropertiesEnabled = + EditorPrefs.GetBool("CustomPropertiesGradleTemplateEnabled", false); + if (!isCustomGradlePropertiesEnabled) + { + _cachedWarnings.Add( + "Sequence - Custom Gradle Properties Template is not enabled. This may cause issues with secure storage on Android. Refer to: " + _docsUrl); + } + + bool isCustomMainGradleEnabled = EditorPrefs.GetBool("CustomMainGradleTemplateEnabled", false); + if (!isCustomMainGradleEnabled) + { + _cachedWarnings.Add( + "Sequence - Custom Main Gradle Template is not enabled. This may cause issues with secure storage on Android. Refer to: " + _docsUrl); + } + + foreach (string warning in _cachedWarnings) + { + Debug.LogWarning(warning); + } + + if (_cachedWarnings.Count > 0) + { + WarningPopup.ShowWindow(_cachedWarnings); + } + } + } + } + + private class WarningPopup : EditorWindow + { + private static List warnings; + + public static void ShowWindow(List warningsToShow) + { + warnings = warningsToShow; + var window = GetWindow("Sequence Build Warnings"); + window.position = new Rect(Screen.width / 2, Screen.height / 2, 400, 200); + window.Show(); + } + + private void OnGUI() + { + GUILayout.Label("Warnings Detected", EditorStyles.boldLabel); + + foreach (string warning in warnings) + { + EditorGUILayout.HelpBox(warning, MessageType.Warning); + + if (GUILayout.Button("Learn More", GUILayout.Width(100))) + { + Application.OpenURL(_docsUrl); + } + } + + GUILayout.FlexibleSpace(); + + if (GUILayout.Button("Dismiss", GUILayout.Height(30))) + { + Close(); + } + } + } + } +} diff --git a/Packages/Sequence-Unity/Editor/AndroidCustomGradleCheck.cs.meta b/Packages/Sequence-Unity/Editor/AndroidCustomGradleCheck.cs.meta new file mode 100644 index 000000000..7a26e5e93 --- /dev/null +++ b/Packages/Sequence-Unity/Editor/AndroidCustomGradleCheck.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: ab166bc75c424f65a56922cb657e042e +timeCreated: 1736786751 \ No newline at end of file diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/Utils/SecureStorage/AndroidKeystoreStorage.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/Utils/SecureStorage/AndroidKeystoreStorage.cs index 8ca70e483..f067c0884 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/Utils/SecureStorage/AndroidKeystoreStorage.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/Utils/SecureStorage/AndroidKeystoreStorage.cs @@ -14,8 +14,6 @@ public AndroidKeystoreStorage() throw new System.NotSupportedException("AndroidKeystoreStorage is only supported on Android platform."); #elif UNITY_ANDROID && ENABLE_SEQUENCE_ANDROID_SECURE_STORAGE InitializeAndroidKeyBridge(); -#else - throw new System.NotSupportedException("Invalid use. Secure storage is not enabled. Please enable in SequenceConfig and/or set the script define above"); #endif } From 2323734b54e81f8430385a3167505632d4f01651 Mon Sep 17 00:00:00 2001 From: Quinn Purdy Date: Mon, 13 Jan 2025 16:13:42 -0500 Subject: [PATCH 14/15] Fix how we check project settings --- .../Editor/AndroidCustomGradleCheck.cs | 81 +++++++++++++------ 1 file changed, 56 insertions(+), 25 deletions(-) diff --git a/Packages/Sequence-Unity/Editor/AndroidCustomGradleCheck.cs b/Packages/Sequence-Unity/Editor/AndroidCustomGradleCheck.cs index 2e451a6d4..ee4901298 100644 --- a/Packages/Sequence-Unity/Editor/AndroidCustomGradleCheck.cs +++ b/Packages/Sequence-Unity/Editor/AndroidCustomGradleCheck.cs @@ -1,4 +1,5 @@ using System.Collections.Generic; +using System.IO; using System.Linq; using Sequence.Config; using UnityEditor.Build; @@ -18,38 +19,64 @@ public class AndroidCustomGradleCheck : IPreprocessBuildWithReport public void OnPreprocessBuild(BuildReport report) { - _cachedWarnings = new List(); if (report.summary.platform == BuildTarget.Android) { - SequenceConfig config = SequenceConfig.GetConfig(); - if (config.StoreSessionPrivateKeyInSecureStorage) + List warnings = new List(); + + if (!IsCustomGradlePropertiesTemplateEnabled()) { - bool isCustomGradlePropertiesEnabled = - EditorPrefs.GetBool("CustomPropertiesGradleTemplateEnabled", false); - if (!isCustomGradlePropertiesEnabled) - { - _cachedWarnings.Add( - "Sequence - Custom Gradle Properties Template is not enabled. This may cause issues with secure storage on Android. Refer to: " + _docsUrl); - } + warnings.Add( + "Sequence - Custom Gradle Properties Template is not enabled. This may cause issues with secure storage on Android. Refer to: " + _docsUrl); + } - bool isCustomMainGradleEnabled = EditorPrefs.GetBool("CustomMainGradleTemplateEnabled", false); - if (!isCustomMainGradleEnabled) - { - _cachedWarnings.Add( - "Sequence - Custom Main Gradle Template is not enabled. This may cause issues with secure storage on Android. Refer to: " + _docsUrl); - } - - foreach (string warning in _cachedWarnings) - { - Debug.LogWarning(warning); - } + if (!IsCustomMainGradleTemplateEnabled()) + { + warnings.Add( + "Sequence - Custom Main Gradle Template is not enabled. This may cause issues with secure storage on Android. Refer to: " + _docsUrl); + } - if (_cachedWarnings.Count > 0) - { - WarningPopup.ShowWindow(_cachedWarnings); - } + foreach (var warning in warnings) + { + Debug.LogWarning(warning); + } + + if (warnings.Count > 0) + { + WarningPopup.ShowWindow(warnings); + } + } + } + + private bool IsCustomGradlePropertiesTemplateEnabled() + { + return GetProjectSettingsFlag("useCustomGradlePropertiesTemplate"); + } + + private bool IsCustomMainGradleTemplateEnabled() + { + return GetProjectSettingsFlag("useCustomMainGradleTemplate"); + } + + private bool GetProjectSettingsFlag(string key) + { + string projectSettingsPath = Path.Combine(Application.dataPath, "../ProjectSettings/ProjectSettings.asset"); + + if (!File.Exists(projectSettingsPath)) + { + Debug.LogError("ProjectSettings.asset file not found."); + return false; + } + + var lines = File.ReadAllLines(projectSettingsPath); + foreach (var line in lines) + { + if (line.Trim().StartsWith(key + ":")) + { + return line.Trim().EndsWith("1"); } } + + return false; } private class WarningPopup : EditorWindow @@ -58,6 +85,10 @@ private class WarningPopup : EditorWindow public static void ShowWindow(List warningsToShow) { + if (warningsToShow == null || warningsToShow.Count == 0) + { + return; + } warnings = warningsToShow; var window = GetWindow("Sequence Build Warnings"); window.position = new Rect(Screen.width / 2, Screen.height / 2, 400, 200); From 61ebcd0f70e8b85e44344a8fca5c473dcde95861 Mon Sep 17 00:00:00 2001 From: Quinn Purdy Date: Mon, 13 Jan 2025 16:53:36 -0500 Subject: [PATCH 15/15] Don't check for custom gradle files if we are not using secure storage --- Packages/Sequence-Unity/Editor/AndroidCustomGradleCheck.cs | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/Packages/Sequence-Unity/Editor/AndroidCustomGradleCheck.cs b/Packages/Sequence-Unity/Editor/AndroidCustomGradleCheck.cs index ee4901298..c79be2837 100644 --- a/Packages/Sequence-Unity/Editor/AndroidCustomGradleCheck.cs +++ b/Packages/Sequence-Unity/Editor/AndroidCustomGradleCheck.cs @@ -21,6 +21,12 @@ public void OnPreprocessBuild(BuildReport report) { if (report.summary.platform == BuildTarget.Android) { + SequenceConfig config = SequenceConfig.GetConfig(); + if (!config.StoreSessionPrivateKeyInSecureStorage) + { + return; + } + List warnings = new List(); if (!IsCustomGradlePropertiesTemplateEnabled())