treezor packages and native configs adapted to main app

This commit is contained in:
2026-01-21 12:19:56 +01:00
parent 8fc6b5c70c
commit ddbfbc1ebf
238 changed files with 209048 additions and 19 deletions

Binary file not shown.

View File

@@ -0,0 +1,31 @@
Extension Discovery Cache
=========================
This folder is used by `package:extension_discovery` to cache lists of
packages that contains extensions for other packages.
DO NOT USE THIS FOLDER
----------------------
* Do not read (or rely) the contents of this folder.
* Do write to this folder.
If you're interested in the lists of extensions stored in this folder use the
API offered by package `extension_discovery` to get this information.
If this package doesn't work for your use-case, then don't try to read the
contents of this folder. It may change, and will not remain stable.
Use package `extension_discovery`
---------------------------------
If you want to access information from this folder.
Feel free to delete this folder
-------------------------------
Files in this folder act as a cache, and the cache is discarded if the files
are older than the modification time of `.dart_tool/package_config.json`.
Hence, it should never be necessary to clear this cache manually, if you find a
need to do please file a bug.

View File

@@ -0,0 +1 @@
{"version":2,"entries":[{"package":"flutter_treezor_entrust_sdk_bridge","rootUri":"../","packageUri":"lib/"}]}

View File

@@ -0,0 +1,178 @@
{
"configVersion": 2,
"packages": [
{
"name": "async",
"rootUri": "file:///Users/juliandalcalaf/.pub-cache/hosted/pub.dev/async-2.11.0",
"packageUri": "lib/",
"languageVersion": "2.18"
},
{
"name": "boolean_selector",
"rootUri": "file:///Users/juliandalcalaf/.pub-cache/hosted/pub.dev/boolean_selector-2.1.1",
"packageUri": "lib/",
"languageVersion": "2.17"
},
{
"name": "characters",
"rootUri": "file:///Users/juliandalcalaf/.pub-cache/hosted/pub.dev/characters-1.4.0",
"packageUri": "lib/",
"languageVersion": "3.4"
},
{
"name": "clock",
"rootUri": "file:///Users/juliandalcalaf/.pub-cache/hosted/pub.dev/clock-1.1.2",
"packageUri": "lib/",
"languageVersion": "3.4"
},
{
"name": "collection",
"rootUri": "file:///Users/juliandalcalaf/.pub-cache/hosted/pub.dev/collection-1.19.1",
"packageUri": "lib/",
"languageVersion": "3.4"
},
{
"name": "fake_async",
"rootUri": "file:///Users/juliandalcalaf/.pub-cache/hosted/pub.dev/fake_async-1.3.3",
"packageUri": "lib/",
"languageVersion": "3.3"
},
{
"name": "flutter",
"rootUri": "file:///Users/juliandalcalaf/Development/flutter/packages/flutter",
"packageUri": "lib/",
"languageVersion": "3.8"
},
{
"name": "flutter_lints",
"rootUri": "file:///Users/juliandalcalaf/.pub-cache/hosted/pub.dev/flutter_lints-4.0.0",
"packageUri": "lib/",
"languageVersion": "3.1"
},
{
"name": "flutter_test",
"rootUri": "file:///Users/juliandalcalaf/Development/flutter/packages/flutter_test",
"packageUri": "lib/",
"languageVersion": "3.8"
},
{
"name": "leak_tracker",
"rootUri": "file:///Users/juliandalcalaf/.pub-cache/hosted/pub.dev/leak_tracker-11.0.2",
"packageUri": "lib/",
"languageVersion": "3.2"
},
{
"name": "leak_tracker_flutter_testing",
"rootUri": "file:///Users/juliandalcalaf/.pub-cache/hosted/pub.dev/leak_tracker_flutter_testing-3.0.10",
"packageUri": "lib/",
"languageVersion": "3.2"
},
{
"name": "leak_tracker_testing",
"rootUri": "file:///Users/juliandalcalaf/.pub-cache/hosted/pub.dev/leak_tracker_testing-3.0.2",
"packageUri": "lib/",
"languageVersion": "3.2"
},
{
"name": "lints",
"rootUri": "file:///Users/juliandalcalaf/.pub-cache/hosted/pub.dev/lints-4.0.0",
"packageUri": "lib/",
"languageVersion": "3.1"
},
{
"name": "matcher",
"rootUri": "file:///Users/juliandalcalaf/.pub-cache/hosted/pub.dev/matcher-0.12.17",
"packageUri": "lib/",
"languageVersion": "3.4"
},
{
"name": "material_color_utilities",
"rootUri": "file:///Users/juliandalcalaf/.pub-cache/hosted/pub.dev/material_color_utilities-0.11.1",
"packageUri": "lib/",
"languageVersion": "2.17"
},
{
"name": "meta",
"rootUri": "file:///Users/juliandalcalaf/.pub-cache/hosted/pub.dev/meta-1.16.0",
"packageUri": "lib/",
"languageVersion": "2.12"
},
{
"name": "path",
"rootUri": "file:///Users/juliandalcalaf/.pub-cache/hosted/pub.dev/path-1.9.1",
"packageUri": "lib/",
"languageVersion": "3.4"
},
{
"name": "plugin_platform_interface",
"rootUri": "file:///Users/juliandalcalaf/.pub-cache/hosted/pub.dev/plugin_platform_interface-2.1.8",
"packageUri": "lib/",
"languageVersion": "3.0"
},
{
"name": "sky_engine",
"rootUri": "file:///Users/juliandalcalaf/Development/flutter/bin/cache/pkg/sky_engine",
"packageUri": "lib/",
"languageVersion": "3.8"
},
{
"name": "source_span",
"rootUri": "file:///Users/juliandalcalaf/.pub-cache/hosted/pub.dev/source_span-1.10.0",
"packageUri": "lib/",
"languageVersion": "2.18"
},
{
"name": "stack_trace",
"rootUri": "file:///Users/juliandalcalaf/.pub-cache/hosted/pub.dev/stack_trace-1.12.1",
"packageUri": "lib/",
"languageVersion": "3.4"
},
{
"name": "stream_channel",
"rootUri": "file:///Users/juliandalcalaf/.pub-cache/hosted/pub.dev/stream_channel-2.1.4",
"packageUri": "lib/",
"languageVersion": "3.3"
},
{
"name": "string_scanner",
"rootUri": "file:///Users/juliandalcalaf/.pub-cache/hosted/pub.dev/string_scanner-1.3.0",
"packageUri": "lib/",
"languageVersion": "3.1"
},
{
"name": "term_glyph",
"rootUri": "file:///Users/juliandalcalaf/.pub-cache/hosted/pub.dev/term_glyph-1.2.1",
"packageUri": "lib/",
"languageVersion": "2.12"
},
{
"name": "test_api",
"rootUri": "file:///Users/juliandalcalaf/.pub-cache/hosted/pub.dev/test_api-0.7.6",
"packageUri": "lib/",
"languageVersion": "3.5"
},
{
"name": "vector_math",
"rootUri": "file:///Users/juliandalcalaf/.pub-cache/hosted/pub.dev/vector_math-2.2.0",
"packageUri": "lib/",
"languageVersion": "3.1"
},
{
"name": "vm_service",
"rootUri": "file:///Users/juliandalcalaf/.pub-cache/hosted/pub.dev/vm_service-14.3.0",
"packageUri": "lib/",
"languageVersion": "3.3"
},
{
"name": "flutter_treezor_entrust_sdk_bridge",
"rootUri": "../",
"packageUri": "lib/",
"languageVersion": "3.5"
}
],
"generator": "pub",
"generatorVersion": "3.9.2",
"flutterRoot": "file:///Users/juliandalcalaf/Development/flutter",
"flutterVersion": "3.35.7",
"pubCache": "file:///Users/juliandalcalaf/.pub-cache"
}

View File

@@ -0,0 +1,232 @@
{
"roots": [
"flutter_treezor_entrust_sdk_bridge"
],
"packages": [
{
"name": "flutter_treezor_entrust_sdk_bridge",
"version": "1.0.2",
"dependencies": [
"flutter",
"plugin_platform_interface"
],
"devDependencies": [
"flutter_lints",
"flutter_test"
]
},
{
"name": "flutter_lints",
"version": "4.0.0",
"dependencies": [
"lints"
]
},
{
"name": "flutter_test",
"version": "0.0.0",
"dependencies": [
"clock",
"collection",
"fake_async",
"flutter",
"leak_tracker_flutter_testing",
"matcher",
"meta",
"path",
"stack_trace",
"stream_channel",
"test_api",
"vector_math"
]
},
{
"name": "plugin_platform_interface",
"version": "2.1.8",
"dependencies": [
"meta"
]
},
{
"name": "flutter",
"version": "0.0.0",
"dependencies": [
"characters",
"collection",
"material_color_utilities",
"meta",
"sky_engine",
"vector_math"
]
},
{
"name": "lints",
"version": "4.0.0",
"dependencies": []
},
{
"name": "stream_channel",
"version": "2.1.4",
"dependencies": [
"async"
]
},
{
"name": "meta",
"version": "1.16.0",
"dependencies": []
},
{
"name": "collection",
"version": "1.19.1",
"dependencies": []
},
{
"name": "leak_tracker_flutter_testing",
"version": "3.0.10",
"dependencies": [
"flutter",
"leak_tracker",
"leak_tracker_testing",
"matcher",
"meta"
]
},
{
"name": "vector_math",
"version": "2.2.0",
"dependencies": []
},
{
"name": "stack_trace",
"version": "1.12.1",
"dependencies": [
"path"
]
},
{
"name": "clock",
"version": "1.1.2",
"dependencies": []
},
{
"name": "fake_async",
"version": "1.3.3",
"dependencies": [
"clock",
"collection"
]
},
{
"name": "path",
"version": "1.9.1",
"dependencies": []
},
{
"name": "matcher",
"version": "0.12.17",
"dependencies": [
"async",
"meta",
"stack_trace",
"term_glyph",
"test_api"
]
},
{
"name": "test_api",
"version": "0.7.6",
"dependencies": [
"async",
"boolean_selector",
"collection",
"meta",
"source_span",
"stack_trace",
"stream_channel",
"string_scanner",
"term_glyph"
]
},
{
"name": "sky_engine",
"version": "0.0.0",
"dependencies": []
},
{
"name": "material_color_utilities",
"version": "0.11.1",
"dependencies": [
"collection"
]
},
{
"name": "characters",
"version": "1.4.0",
"dependencies": []
},
{
"name": "async",
"version": "2.11.0",
"dependencies": [
"collection",
"meta"
]
},
{
"name": "leak_tracker_testing",
"version": "3.0.2",
"dependencies": [
"leak_tracker",
"matcher",
"meta"
]
},
{
"name": "leak_tracker",
"version": "11.0.2",
"dependencies": [
"clock",
"collection",
"meta",
"path",
"vm_service"
]
},
{
"name": "term_glyph",
"version": "1.2.1",
"dependencies": []
},
{
"name": "string_scanner",
"version": "1.3.0",
"dependencies": [
"source_span"
]
},
{
"name": "source_span",
"version": "1.10.0",
"dependencies": [
"collection",
"path",
"term_glyph"
]
},
{
"name": "boolean_selector",
"version": "2.1.1",
"dependencies": [
"source_span",
"string_scanner"
]
},
{
"name": "vm_service",
"version": "14.3.0",
"dependencies": []
}
],
"configVersion": 1
}

View File

@@ -0,0 +1 @@
3.35.7

View File

@@ -0,0 +1,3 @@
## 0.0.1
* TODO: Describe initial release.

View File

@@ -0,0 +1 @@
TODO: Add your license here.

View File

@@ -0,0 +1,184 @@
# flutter_treezor_entrust_sdk_bridge
## Requirement
### For Android :
- Minimum android sdk version : 22
- Maximum android sdk version : 34
### For IOS :
- Xcode 13.0.0 or later
## Install
### On main project
```
dependencies:
....
flutter:
sdk: flutter
flutter_treezor_entrust_sdk_bridge:
path: [pathToPluginFolder]/
```
#### launch the exemple app
```
flutter run
```
## Main app integration requirement
### Android
Follow Android Entrust Documentation https://doc.antelop-solutions.com/latest/wallet/sdk/android_integration.html
### Ios
Follow Ios Entrust Documentation https://doc.antelop-solutions.com/latest/wallet/sdk/ios_integration.html
You can check the example app for some ios configuration
## How to use the SDK
### register
```
Future<void> connectSDK() async {
WalletManagerModule walletManagerModule = _flutterTreezorEntrustSdkBridgePlugin.getWalletManagerModule();
WalletManagerCallbacks walletManagerCallbacks = WalletManagerCallbacks(
onProvisioningRequired:() => {
onWalletManagerProvisioningRequired(walletManagerModule)
},
onCredentialsRequired:(reason, error) => {
onWalletManageronCredentialsRequired(reason, error, walletManagerModule)
},
onConnectionError:(error) => {
debugPrint("onConnectionError error: $error")
},
onConnectionSuccess:() => {
onWalletManagerOnConnectionSuccess()
}
);
await walletManagerModule.initialize(walletManagerCallbacks);
walletManagerModule.connect(null, null);
}
void onWalletManagerProvisioningRequired(WalletManagerModule walletManagerModule) async {
debugPrint("onProvisioningRequired");
String activationCode = await getWalletActivationCode();
debugPrint("onWalletManagerProvisioningRequired activationCode: $activationCode");
WalletProvisioningModule walletProvisioningModule = _flutterTreezorEntrustSdkBridgePlugin.getWalletProvisioningModule();
WalletProvisioningCallbacks walletProvisioningCallbacks = WalletProvisioningCallbacks(
onInitializationSuccess:() => {
debugPrint("onInitializationSuccess"),
walletProvisioningModule.checkEligibility(false)
},
onInitializationError:(error) => {
debugPrint("onInitializationError")
},
onPermissionNotGranted:(permissions) => {
debugPrint("onPermissionNotGranted")
},
onDeviceEligible:(fingerprintAllowed) => {
debugPrint("onDeviceEligible"),
walletProvisioningModule.launch(activationCode.substring(2))
},
onDeviceNotEligible:(reason, denialReference) => {
debugPrint("onDeviceNotEligible")
},
onCheckEligibilityError:(error) => {
debugPrint("onCheckEligibilityError")
},
onProvisioningPending:() => {
debugPrint("onProvisioningPending")
},
onProvisioningSuccess:() => {
debugPrint("onProvisioningSuccess"),
walletManagerModule.connect(null, null)
},
onProvisioningError:(error) => {
debugPrint("onProvisioningError")
}
);
await walletProvisioningModule.initialize(walletProvisioningCallbacks);
}
void onWalletManageronCredentialsRequired(String reason, AntelopError? error, WalletManagerModule walletManagerModule) async {
debugPrint("onCredentialsRequired reason : $reason error: $error");
switch (reason.toLowerCase()) {
case "notset":
walletManagerModule.connect(null, newPasscode);
break;
case "tobechanged":
walletManagerModule.connect(passcode, null);
break;
case "validationneeded":
walletManagerModule.connect(passcode, newPasscode);
break;
}
}
```
### generate siganture
Auth
```
void _startSignatureProcess(String patternAuth) async {
debugPrint("Starting signature process with $patternAuth");
CustomerAuthenticatedSignatureModule customerAuthenticatedSignatureModule =
_flutterTreezorEntrustSdkBridgePlugin.getCustomerAuthenticatedSignatureModule(patternAuth, "", [payloadString]);
CustomCustomerAuthenticatedProcessCallback customCustomerAuthenticatedProcessCallback =
CustomCustomerAuthenticatedProcessCallback(
onCustomerCredentialsRequired: () => {
_signatureOnCustomerCredentialsRequired(patternAuth, customerAuthenticatedSignatureModule)
},
onCustomerCredentialsInvalid: (reason) => {
debugPrint("onCustomerCredentialsInvalid")
},
onProcessStart: () => {
debugPrint("onProcessStart")
},
onProcessSuccess: () => {
_signatureOnProcessSuccess(customerAuthenticatedSignatureModule)
},
onError: (error) => {
debugPrint("onError: $error")
},
onAuthenticationDeclined: () => {
debugPrint("onAuthenticationDeclined")
},
);
customerAuthenticatedSignatureModule.signWithCustomAuthentication(customCustomerAuthenticatedProcessCallback);
}
// Handle onCustomerCredentialsRequired based on patternAuth
void _signatureOnCustomerCredentialsRequired(String patternAuth, CustomerAuthenticatedSignatureModule customerAuthenticatedSignatureModule) {
debugPrint("onCustomerCredentialsRequired");
switch (patternAuth) {
case "PIN":
customerAuthenticatedSignatureModule.setPinCustomerCredentials(newPasscode);
break;
case "BIO":
customerAuthenticatedSignatureModule.setBioCustomerCredentials("Title", "SubTitle");
break;
case "NONE":
default:
customerAuthenticatedSignatureModule.setPinCustomerCredentials(newPasscode);
break;
}
}
// Handle onProcessSuccess
void _signatureOnProcessSuccess(CustomerAuthenticatedSignatureModule customerAuthenticatedSignatureModule) async {
debugPrint("onProcessSuccess");
String? scaResult = await customerAuthenticatedSignatureModule.getResult();
}
```

View File

@@ -0,0 +1,4 @@
include: package:flutter_lints/flutter.yaml
# Additional information about this file can be found at
# https://dart.dev/guides/language/analysis-options

Binary file not shown.

View File

@@ -0,0 +1,223 @@
import java.security.MessageDigest
import java.security.NoSuchAlgorithmException
group = "com.treezor.flutter_treezor_entrust_sdk_bridge"
version = "1.0"
buildscript {
repositories {
google()
mavenCentral()
}
dependencies {
classpath("com.android.tools.build:gradle:8.1.0")
}
}
String localMavenPath = project.mkdir("build").absolutePath
rootProject.allprojects {
repositories {
maven { url "file://$localMavenPath" }
google()
mavenCentral()
}
}
apply plugin: "com.android.library"
android {
if (project.android.hasProperty("namespace")) {
namespace = "com.treezor.flutter_treezor_entrust_sdk_bridge"
}
compileSdk = 34
compileOptions {
sourceCompatibility = JavaVersion.VERSION_1_8
targetCompatibility = JavaVersion.VERSION_1_8
}
defaultConfig {
minSdk = 21
}
packagingOptions{
jniLibs {
keepDebugSymbols += "*/*/libscm.so"
useLegacyPackaging = true
}
}
dependencies {
implementation 'androidx.work:work-runtime:2.7.1'
implementation 'com.google.firebase:firebase-messaging:23.0.0'
implementation 'com.google.android.gms:play-services-auth:17.0.0'
implementation "androidx.appcompat:appcompat:1.4.0"
implementation "com.google.android.material:material:1.5.0"
implementation "androidx.biometric:biometric:1.1.0"
testImplementation 'org.jetbrains.kotlin:kotlin-test'
testImplementation 'org.mockito:mockito-core:5.0.0'
}
testOptions {
unitTests.all {
testLogging {
events "passed", "skipped", "failed", "standardOut", "standardError"
outputs.upToDateWhen {false}
showStandardStreams = true
}
}
}
}
String aarPath = localMavenPath
task useAar {
File file = project.file("libs")
if (file.exists() && file.isDirectory()) {
file.listFiles(new FileFilter() {
@Override
boolean accept(File pathname) {
return pathname.name.endsWith(".aar")
}
}).each { item ->
String aarName = item.name.substring(0, item.name.length() - 4)
String[] aarInfo = aarName.split("-")
String sha1 = getFileSha1(item)
String md5 = getFileMD5(item)
println("aar: " + aarInfo + " file sha1:" + sha1 + " md5:" + md5)
String fromStr = item.path
String intoStr = aarPath + "/" + aarInfo[0].replace(".", "/") + "/" + aarInfo[1] + "/" + aarInfo[2]
String newName = aarInfo[1] + "-" + aarInfo[2] + ".aar"
project.copy {
from fromStr
into intoStr
rename(item.name, newName)
}
project.file(intoStr + "/" + newName + ".md5").write(md5)
project.file(intoStr + "/" + newName + ".sha1").write(sha1)
String pomPath = intoStr + "/" + newName.substring(0, newName.length() - 4) + ".pom"
project.file(pomPath).write(createPomStr(aarInfo[0], aarInfo[1], aarInfo[2]))
project.file(pomPath + ".md5").write(getFileMD5(project.file(pomPath)))
project.file(pomPath + ".sha1").write(getFileSha1(project.file(pomPath)))
String metadataPath = project.file(intoStr).getParentFile().path + "/maven-metadata.xml"
project.file(metadataPath).write(createMetadataStr(aarInfo[0], aarInfo[1], aarInfo[2]))
project.file(metadataPath + ".md5").write(getFileMD5(project.file(metadataPath)))
project.file(metadataPath + ".sha1").write(getFileSha1(project.file(metadataPath)))
dependencies {
implementation "${aarInfo[0]}:${aarInfo[1]}:${aarInfo[2]}"
compileOnly fileTree(dir: "libs", includes: ['*.jar'])
}
}
}
}
static String createMetadataStr(String groupId, String artifactId, String version) {
return "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n" +
"<metadata>\n" +
" <groupId>$groupId</groupId>\n" +
" <artifactId>$artifactId</artifactId>\n" +
" <versioning>\n" +
" <release>$version</release>\n" +
" <versions>\n" +
" <version>$version</version>\n" +
" </versions>\n" +
" <lastUpdated>${new Date().format('yyyyMMdd')}000000</lastUpdated>\n" +
" </versioning>\n" +
"</metadata>\n"
}
static String createPomStr(String groupId, String artifactId, String version) {
return "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n" +
"<project xsi:schemaLocation=\"http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd\" xmlns=\"http://maven.apache.org/POM/4.0.0\"\n" +
" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\">\n" +
" <modelVersion>4.0.0</modelVersion>\n" +
" <groupId>$groupId</groupId>\n" +
" <artifactId>$artifactId</artifactId>\n" +
" <version>$version</version>\n" +
" <packaging>aar</packaging>\n" +
"</project>\n"
}
static String getFileSha1(File file) {
FileInputStream input = null;
try {
input = new FileInputStream(file);
MessageDigest digest = MessageDigest.getInstance("SHA-1");
byte[] buffer = new byte[1024 * 1024 * 10];
int len = 0;
while ((len = input.read(buffer)) > 0) {
digest.update(buffer, 0, len);
}
String sha1 = new BigInteger(1, digest.digest()).toString(16);
int length = 40 - sha1.length();
if (length > 0) {
for (int i = 0; i < length; i++) {
sha1 = "0" + sha1;
}
}
return sha1;
}
catch (IOException e) {
System.out.println(e);
}
catch (NoSuchAlgorithmException e) {
System.out.println(e);
}
finally {
try {
if (input != null) {
input.close();
}
}
catch (IOException e) {
System.out.println(e);
}
}
}
static String getFileMD5(File file) {
FileInputStream input = null;
try {
input = new FileInputStream(file);
MessageDigest digest = MessageDigest.getInstance("MD5");
byte[] buffer = new byte[1024 * 1024 * 10];
int len = 0;
while ((len = input.read(buffer)) > 0) {
digest.update(buffer, 0, len);
}
String md5 = new BigInteger(1, digest.digest()).toString(16);
int length = 32 - md5.length();
if (length > 0) {
for (int i = 0; i < length; i++) {
md5 = "0" + md5;
}
}
return md5;
}
catch (IOException e) {
System.out.println(e);
}
catch (NoSuchAlgorithmException e) {
System.out.println(e);
}
finally {
try {
if (input != null) {
input.close();
}
}
catch (IOException e) {
System.out.println(e);
}
}
}

View File

@@ -0,0 +1 @@
a997390d9ff195d347c7babfcb3c40eb

View File

@@ -0,0 +1 @@
1876ddcc5d9e9ac1925e2b72c0dc648ee711d7a3

View File

@@ -0,0 +1,9 @@
<?xml version="1.0" encoding="UTF-8"?>
<project xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd" xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<modelVersion>4.0.0</modelVersion>
<groupId>com.entrust.antelop</groupId>
<artifactId>antelop</artifactId>
<version>2.6.4</version>
<packaging>aar</packaging>
</project>

View File

@@ -0,0 +1 @@
7d1d617ace01a32802a824f8a906b1c8

View File

@@ -0,0 +1 @@
87a33be94497ce90c9bcd1b6d7d37bbcedcd0d61

View File

@@ -0,0 +1,12 @@
<?xml version="1.0" encoding="UTF-8"?>
<metadata>
<groupId>com.entrust.antelop</groupId>
<artifactId>antelop</artifactId>
<versioning>
<release>2.6.4</release>
<versions>
<version>2.6.4</version>
</versions>
<lastUpdated>20260121000000</lastUpdated>
</versioning>
</metadata>

View File

@@ -0,0 +1 @@
2b14702afabf7dabc6ee436857156114

View File

@@ -0,0 +1 @@
238e2d82008afe02e0766c6273b14984c94b9375

View File

@@ -0,0 +1,27 @@
<?xml version="1.0" encoding="UTF-8"?>
<module type="JAVA_MODULE" version="4">
<component name="FacetManager">
<facet type="android" name="Android">
<configuration>
<option name="ALLOW_USER_CONFIGURATION" value="false" />
<option name="GEN_FOLDER_RELATIVE_PATH_APT" value="/gen" />
<option name="GEN_FOLDER_RELATIVE_PATH_AIDL" value="/gen" />
<option name="MANIFEST_FILE_RELATIVE_PATH" value="/src/main/AndroidManifest.xml" />
<option name="RES_FOLDER_RELATIVE_PATH" value="/src/main/res" />
<option name="ASSETS_FOLDER_RELATIVE_PATH" value="/src/main/assets" />
<option name="LIBS_FOLDER_RELATIVE_PATH" value="/src/main/libs" />
<option name="PROGUARD_LOGS_FOLDER_RELATIVE_PATH" value="/src/main/proguard_logs" />
</configuration>
</facet>
</component>
<component name="NewModuleRootManager" inherit-compiler-output="true">
<exclude-output />
<content url="file://$MODULE_DIR$">
<sourceFolder url="file://$MODULE_DIR$/src/main/java" isTestSource="false" />
<sourceFolder url="file://$MODULE_DIR$/gen" isTestSource="false" generated="true" />
</content>
<orderEntry type="jdk" jdkName="17" jdkType="JavaSDK" />
<orderEntry type="sourceFolder" forTests="false" />
<orderEntry type="library" name="Flutter for Android" level="project" />
</component>
</module>

View File

@@ -0,0 +1,7 @@
distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
distributionUrl=https\://services.gradle.org/distributions/gradle-8.5-bin.zip
networkTimeout=10000
validateDistributionUrl=true
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists

View File

@@ -0,0 +1,249 @@
#!/bin/sh
#
# Copyright © 2015-2021 the original authors.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# https://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
#
##############################################################################
#
# Gradle start up script for POSIX generated by Gradle.
#
# Important for running:
#
# (1) You need a POSIX-compliant shell to run this script. If your /bin/sh is
# noncompliant, but you have some other compliant shell such as ksh or
# bash, then to run this script, type that shell name before the whole
# command line, like:
#
# ksh Gradle
#
# Busybox and similar reduced shells will NOT work, because this script
# requires all of these POSIX shell features:
# * functions;
# * expansions «$var», «${var}», «${var:-default}», «${var+SET}»,
# «${var#prefix}», «${var%suffix}», and «$( cmd )»;
# * compound commands having a testable exit status, especially «case»;
# * various built-in commands including «command», «set», and «ulimit».
#
# Important for patching:
#
# (2) This script targets any POSIX shell, so it avoids extensions provided
# by Bash, Ksh, etc; in particular arrays are avoided.
#
# The "traditional" practice of packing multiple parameters into a
# space-separated string is a well documented source of bugs and security
# problems, so this is (mostly) avoided, by progressively accumulating
# options in "$@", and eventually passing that to Java.
#
# Where the inherited environment variables (DEFAULT_JVM_OPTS, JAVA_OPTS,
# and GRADLE_OPTS) rely on word-splitting, this is performed explicitly;
# see the in-line comments for details.
#
# There are tweaks for specific operating systems such as AIX, CygWin,
# Darwin, MinGW, and NonStop.
#
# (3) This script is generated from the Groovy template
# https://github.com/gradle/gradle/blob/HEAD/subprojects/plugins/src/main/resources/org/gradle/api/internal/plugins/unixStartScript.txt
# within the Gradle project.
#
# You can find Gradle at https://github.com/gradle/gradle/.
#
##############################################################################
# Attempt to set APP_HOME
# Resolve links: $0 may be a link
app_path=$0
# Need this for daisy-chained symlinks.
while
APP_HOME=${app_path%"${app_path##*/}"} # leaves a trailing /; empty if no leading path
[ -h "$app_path" ]
do
ls=$( ls -ld "$app_path" )
link=${ls#*' -> '}
case $link in #(
/*) app_path=$link ;; #(
*) app_path=$APP_HOME$link ;;
esac
done
# This is normally unused
# shellcheck disable=SC2034
APP_BASE_NAME=${0##*/}
# Discard cd standard output in case $CDPATH is set (https://github.com/gradle/gradle/issues/25036)
APP_HOME=$( cd "${APP_HOME:-./}" > /dev/null && pwd -P ) || exit
# Use the maximum available, or set MAX_FD != -1 to use that value.
MAX_FD=maximum
warn () {
echo "$*"
} >&2
die () {
echo
echo "$*"
echo
exit 1
} >&2
# OS specific support (must be 'true' or 'false').
cygwin=false
msys=false
darwin=false
nonstop=false
case "$( uname )" in #(
CYGWIN* ) cygwin=true ;; #(
Darwin* ) darwin=true ;; #(
MSYS* | MINGW* ) msys=true ;; #(
NONSTOP* ) nonstop=true ;;
esac
CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar
# Determine the Java command to use to start the JVM.
if [ -n "$JAVA_HOME" ] ; then
if [ -x "$JAVA_HOME/jre/sh/java" ] ; then
# IBM's JDK on AIX uses strange locations for the executables
JAVACMD=$JAVA_HOME/jre/sh/java
else
JAVACMD=$JAVA_HOME/bin/java
fi
if [ ! -x "$JAVACMD" ] ; then
die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME
Please set the JAVA_HOME variable in your environment to match the
location of your Java installation."
fi
else
JAVACMD=java
if ! command -v java >/dev/null 2>&1
then
die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
Please set the JAVA_HOME variable in your environment to match the
location of your Java installation."
fi
fi
# Increase the maximum file descriptors if we can.
if ! "$cygwin" && ! "$darwin" && ! "$nonstop" ; then
case $MAX_FD in #(
max*)
# In POSIX sh, ulimit -H is undefined. That's why the result is checked to see if it worked.
# shellcheck disable=SC2039,SC3045
MAX_FD=$( ulimit -H -n ) ||
warn "Could not query maximum file descriptor limit"
esac
case $MAX_FD in #(
'' | soft) :;; #(
*)
# In POSIX sh, ulimit -n is undefined. That's why the result is checked to see if it worked.
# shellcheck disable=SC2039,SC3045
ulimit -n "$MAX_FD" ||
warn "Could not set maximum file descriptor limit to $MAX_FD"
esac
fi
# Collect all arguments for the java command, stacking in reverse order:
# * args from the command line
# * the main class name
# * -classpath
# * -D...appname settings
# * --module-path (only if needed)
# * DEFAULT_JVM_OPTS, JAVA_OPTS, and GRADLE_OPTS environment variables.
# For Cygwin or MSYS, switch paths to Windows format before running java
if "$cygwin" || "$msys" ; then
APP_HOME=$( cygpath --path --mixed "$APP_HOME" )
CLASSPATH=$( cygpath --path --mixed "$CLASSPATH" )
JAVACMD=$( cygpath --unix "$JAVACMD" )
# Now convert the arguments - kludge to limit ourselves to /bin/sh
for arg do
if
case $arg in #(
-*) false ;; # don't mess with options #(
/?*) t=${arg#/} t=/${t%%/*} # looks like a POSIX filepath
[ -e "$t" ] ;; #(
*) false ;;
esac
then
arg=$( cygpath --path --ignore --mixed "$arg" )
fi
# Roll the args list around exactly as many times as the number of
# args, so each arg winds up back in the position where it started, but
# possibly modified.
#
# NB: a `for` loop captures its iteration list before it begins, so
# changing the positional parameters here affects neither the number of
# iterations, nor the values presented in `arg`.
shift # remove old arg
set -- "$@" "$arg" # push replacement arg
done
fi
# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"'
# Collect all arguments for the java command:
# * DEFAULT_JVM_OPTS, JAVA_OPTS, JAVA_OPTS, and optsEnvironmentVar are not allowed to contain shell fragments,
# and any embedded shellness will be escaped.
# * For example: A user cannot expect ${Hostname} to be expanded, as it is an environment variable and will be
# treated as '${Hostname}' itself on the command line.
set -- \
"-Dorg.gradle.appname=$APP_BASE_NAME" \
-classpath "$CLASSPATH" \
org.gradle.wrapper.GradleWrapperMain \
"$@"
# Stop when "xargs" is not available.
if ! command -v xargs >/dev/null 2>&1
then
die "xargs is not available"
fi
# Use "xargs" to parse quoted args.
#
# With -n1 it outputs one arg per line, with the quotes and backslashes removed.
#
# In Bash we could simply go:
#
# readarray ARGS < <( xargs -n1 <<<"$var" ) &&
# set -- "${ARGS[@]}" "$@"
#
# but POSIX shell has neither arrays nor command substitution, so instead we
# post-process each arg (as a line of input to sed) to backslash-escape any
# character that might be a shell metacharacter, then use eval to reverse
# that process (while maintaining the separation between arguments), and wrap
# the whole thing up as a single "set" statement.
#
# This will of course break if any of these variables contains a newline or
# an unmatched quote.
#
eval "set -- $(
printf '%s\n' "$DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS" |
xargs -n1 |
sed ' s~[^-[:alnum:]+,./:=@_]~\\&~g; ' |
tr '\n' ' '
)" '"$@"'
exec "$JAVACMD" "$@"

View File

@@ -0,0 +1,92 @@
@rem
@rem Copyright 2015 the original author or authors.
@rem
@rem Licensed under the Apache License, Version 2.0 (the "License");
@rem you may not use this file except in compliance with the License.
@rem You may obtain a copy of the License at
@rem
@rem https://www.apache.org/licenses/LICENSE-2.0
@rem
@rem Unless required by applicable law or agreed to in writing, software
@rem distributed under the License is distributed on an "AS IS" BASIS,
@rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
@rem See the License for the specific language governing permissions and
@rem limitations under the License.
@rem
@if "%DEBUG%"=="" @echo off
@rem ##########################################################################
@rem
@rem Gradle startup script for Windows
@rem
@rem ##########################################################################
@rem Set local scope for the variables with windows NT shell
if "%OS%"=="Windows_NT" setlocal
set DIRNAME=%~dp0
if "%DIRNAME%"=="" set DIRNAME=.
@rem This is normally unused
set APP_BASE_NAME=%~n0
set APP_HOME=%DIRNAME%
@rem Resolve any "." and ".." in APP_HOME to make it shorter.
for %%i in ("%APP_HOME%") do set APP_HOME=%%~fi
@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
set DEFAULT_JVM_OPTS="-Xmx64m" "-Xms64m"
@rem Find java.exe
if defined JAVA_HOME goto findJavaFromJavaHome
set JAVA_EXE=java.exe
%JAVA_EXE% -version >NUL 2>&1
if %ERRORLEVEL% equ 0 goto execute
echo.
echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
echo.
echo Please set the JAVA_HOME variable in your environment to match the
echo location of your Java installation.
goto fail
:findJavaFromJavaHome
set JAVA_HOME=%JAVA_HOME:"=%
set JAVA_EXE=%JAVA_HOME%/bin/java.exe
if exist "%JAVA_EXE%" goto execute
echo.
echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME%
echo.
echo Please set the JAVA_HOME variable in your environment to match the
echo location of your Java installation.
goto fail
:execute
@rem Setup the command line
set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar
@rem Execute Gradle
"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %*
:end
@rem End local scope for the variables with windows NT shell
if %ERRORLEVEL% equ 0 goto mainEnd
:fail
rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of
rem the _cmd.exe /c_ return code!
set EXIT_CODE=%ERRORLEVEL%
if %EXIT_CODE% equ 0 set EXIT_CODE=1
if not ""=="%GRADLE_EXIT_CONSOLE%" exit %EXIT_CODE%
exit /b %EXIT_CODE%
:mainEnd
if "%OS%"=="Windows_NT" endlocal
:omega

View File

@@ -0,0 +1,2 @@
sdk.dir=/Users/salah.aldemachki/Library/Android/sdk
flutter.sdk=/Users/salah.aldemachki/flutterSdk/flutter

View File

@@ -0,0 +1 @@
rootProject.name = 'flutter_treezor_entrust_sdk_bridge'

View File

@@ -0,0 +1,9 @@
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.treezor.flutter_treezor_entrust_sdk_bridge">
<uses-permission android:name="android.permission.USE_BIOMETRIC" />
<application>
<meta-data
android:name="fr.antelop.notificationService"
android:value="com.treezor.flutter_treezor_entrust_sdk_bridge.WalletNotificationServiceModule" />
</application>
</manifest>

View File

@@ -0,0 +1,31 @@
package com.treezor;
import android.util.Log;
import java.util.HashMap;
import java.util.Map;
import fr.antelop.sdk.AntelopError;
import fr.antelop.sdk.exception.WalletValidationException;
public class NativeModuleBase {
/** Helpers **/
public static Map<String, Object> serializeAntelopError(AntelopError error) {
Map<String, Object> errorMap = new HashMap<>();
errorMap.put("message", error.getMessage());
errorMap.put("reason", error.getReason());
errorMap.put("code", error.getCode().toString());
errorMap.put("type", "AntelopError");
return errorMap;
}
public static Map<String, Object> serializeWalletValidationException (WalletValidationException error) {
Map<String, Object> errorMap = new HashMap<>();
errorMap.put("domain", error.getDomain());
errorMap.put("code", error.getCode().toString());
errorMap.put("message", error.getMessage());
errorMap.put("type", "WalletValidationException");
return errorMap;
}
}

View File

@@ -0,0 +1,70 @@
package com.treezor.flutter_treezor_entrust_sdk_bridge;
import android.content.Context;
import androidx.annotation.NonNull;
import com.treezor.flutter_treezor_entrust_sdk_bridge.WalletNotificationServiceModule;
import com.treezor.sca.CustomerAuthenticatedSignatureModule;
import com.treezor.wallet.WalletManagerModule;
import com.treezor.wallet.WalletProvisioningModule;
import io.flutter.embedding.engine.plugins.FlutterPlugin;
import io.flutter.plugin.common.MethodCall;
import io.flutter.plugin.common.MethodChannel;
import io.flutter.plugin.common.MethodChannel.MethodCallHandler;
import io.flutter.plugin.common.MethodChannel.Result;
/** FlutterTreezorEntrustSdkBridgePlugin */
public class FlutterTreezorEntrustSdkBridgePlugin implements FlutterPlugin, MethodCallHandler {
private static final String WALLET_MANAGER_CHANNEL = "WalletManager";
private static final String WALLET_PROVISIONING_CHANNEL = "WalletProvisioning";
private static final String CUSTOMER_AUTHENTICATED_SIGNATURE_CHANNEL = "CustomerAuthenticatedSignature";
private static final String WALLET_NOTIFICATION_SERVICE_CHANNEL = "WalletNotificationService";
private MethodChannel walletManagerChannel;
private MethodChannel walletProvisioningChannel;
private MethodChannel customerAuthenticatedSignatureChannel;
private MethodChannel walletNotificationServiceChannel;
private WalletManagerModule walletManagerModule;
private WalletProvisioningModule walletProvisioningModule;
private CustomerAuthenticatedSignatureModule customerAuthenticatedSignatureModule;
private WalletNotificationServiceModule walletNotificationServiceModule;
@Override
public void onAttachedToEngine(@NonNull FlutterPluginBinding flutterPluginBinding) {
Context context = flutterPluginBinding.getApplicationContext();
// Initialize channels for each module
walletManagerChannel = new MethodChannel(flutterPluginBinding.getBinaryMessenger(), WALLET_MANAGER_CHANNEL);
walletProvisioningChannel = new MethodChannel(flutterPluginBinding.getBinaryMessenger(), WALLET_PROVISIONING_CHANNEL);
customerAuthenticatedSignatureChannel = new MethodChannel(flutterPluginBinding.getBinaryMessenger(), CUSTOMER_AUTHENTICATED_SIGNATURE_CHANNEL);
walletNotificationServiceChannel = new MethodChannel(flutterPluginBinding.getBinaryMessenger(), WALLET_NOTIFICATION_SERVICE_CHANNEL);
// Set handlers for each module's channel
walletManagerModule = new WalletManagerModule(context, walletManagerChannel, flutterPluginBinding);
walletProvisioningModule = new WalletProvisioningModule(context, walletProvisioningChannel, flutterPluginBinding);
customerAuthenticatedSignatureModule = new CustomerAuthenticatedSignatureModule(context, customerAuthenticatedSignatureChannel, flutterPluginBinding);
walletNotificationServiceModule = new WalletNotificationServiceModule(context, walletNotificationServiceChannel, flutterPluginBinding);
walletManagerChannel.setMethodCallHandler(walletManagerModule);
walletProvisioningChannel.setMethodCallHandler(walletProvisioningModule);
customerAuthenticatedSignatureChannel.setMethodCallHandler(customerAuthenticatedSignatureModule);
}
@Override
public void onMethodCall(@NonNull MethodCall call, @NonNull Result result) {
result.notImplemented();
}
@Override
public void onDetachedFromEngine(@NonNull FlutterPluginBinding binding) {
walletManagerChannel.setMethodCallHandler(null);
walletProvisioningChannel.setMethodCallHandler(null);
customerAuthenticatedSignatureChannel.setMethodCallHandler(null);
walletNotificationServiceChannel.setMethodCallHandler(null);
}
}

View File

@@ -0,0 +1,154 @@
package com.treezor.flutter_treezor_entrust_sdk_bridge;
import android.content.Context;
import androidx.annotation.NonNull;
import android.os.Handler;
import android.os.Looper;
import android.util.Log;
import io.flutter.embedding.engine.plugins.FlutterPlugin;
import io.flutter.plugin.common.MethodChannel;
import io.flutter.plugin.common.EventChannel;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import fr.antelop.sdk.WalletLockReason;
import fr.antelop.sdk.WalletNotificationServiceCallback;
import fr.antelop.sdk.card.EmvApplicationActivationMethod;
public class WalletNotificationServiceModule implements WalletNotificationServiceCallback {
static final String TAG = "WalletNotificationServiceModule";
static final String EVENT_CHANNEL_NAME = "wallet_notification_service_events";
private Context context;
private MethodChannel channel;
private static EventChannel eventChannel;
private static EventChannel.EventSink eventSink;
private final Handler mainHandler = new Handler(Looper.getMainLooper());
private static WalletNotificationServiceModule instance = null;
public WalletNotificationServiceModule() {
// This will be called by Antelop via reflection.
// You can initialize lazy values later if needed.
Log.d(TAG, "WalletNotificationServiceModule instantiated by Antelop SDK");
}
public WalletNotificationServiceModule(Context context, MethodChannel channel, @NonNull FlutterPlugin.FlutterPluginBinding flutterPluginBinding) {
this.context = context;
this.channel = channel;
eventChannel = new EventChannel(flutterPluginBinding.getBinaryMessenger(), EVENT_CHANNEL_NAME);
eventChannel.setStreamHandler(new EventChannel.StreamHandler() {
@Override
public void onListen(Object arguments, EventChannel.EventSink events) {
eventSink = events;
}
@Override
public void onCancel(Object arguments) {
eventSink = null;
}
});
}
public static synchronized WalletNotificationServiceModule getInstance(Context context, MethodChannel channel, @NonNull FlutterPlugin.FlutterPluginBinding flutterPluginBinding) {
if (instance == null) {
instance = new WalletNotificationServiceModule(context, channel, flutterPluginBinding);
}
return instance;
}
@Override
public void onEmvApplicationActivationRequired(Context context, String emvAppId, List<EmvApplicationActivationMethod> methods) {
sendEvent("onEmvApplicationActivationRequired", null);
}
@Override
public void onEmvApplicationCredentialsUpdated(Context context) {
sendEvent("onEmvApplicationCredentialsUpdated", null);
}
@Override
public void onCardsUpdated(Context context) {
sendEvent("onCardsUpdated", null);
}
@Override
public void onWalletLoaded(@NonNull Context context) {
Log.d(TAG, "WalletNotificationServiceModule onWalletLoaded");
sendEvent("onWalletLoaded", null);
}
@Override
public void onWalletLocked(@NonNull Context context, @NonNull WalletLockReason reason) {
Map<String, Object> params = new HashMap<>();
params.put("reason", reason.name());
sendEvent("onWalletLocked", params);
}
@Override
public void onWalletUnlocked(@NonNull Context context) {
sendEvent("onWalletUnlocked", null);
}
@Override
public void onLogout(@NonNull Context context) {
sendEvent("onLogout", null);
}
@Override
public void onWalletDeleted(@NonNull Context context) {
Log.d(TAG, "WalletNotificationServiceModule onWalletDeleted");
sendEvent("onWalletDeleted", null);
}
@Override
public void onSettingsUpdated(@NonNull Context context) {
sendEvent("onSettingsUpdated", null);
}
@Override
public void onCountersUpdated(Context context) {
sendEvent("onCountersUpdated", null);
}
@Override
public void onCustomerCredentialsReset(Context context) {
sendEvent("onCustomerCredentialsReset", null);
}
@Override
public void onSunsetScheduled(@NonNull Context context, @NonNull Date sunsetDate) {
sendEvent("onSunsetScheduled", null);
}
@Override
public void onLostEligibility(@NonNull Context context) {
sendEvent("onLostEligibility", null);
}
private void sendEvent(String eventName, Map<String, Object> params) {
if (eventSink == null) {
Log.w(TAG, "EventSink is not initialized. Dropping event: " + eventName);
return;
}
Map<String, Object> event = new HashMap<>();
event.put("event", eventName);
event.put("params", params != null ? params : null);
mainHandler.post(() -> {
try {
eventSink.success(event);
} catch (Exception e) {
Log.e(TAG, "Failed to send event: " + eventName, e);
}
});
}
}

View File

@@ -0,0 +1,152 @@
package com.treezor.globals;
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.drawable.BitmapDrawable;
import android.graphics.drawable.Drawable;
import android.util.Base64;
import java.io.IOException;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class Utils {
static public byte[] parseHexFormattedBinary(String s) {
if (s == null || s.length() == 0 || (s.length() % 2 != 0)) {
throw new IllegalArgumentException("Hex String is not properly formatted : " + s);
}
int len = s.length();
byte[] out = new byte[len / 2];
for (int i = 0; i < len; i += 2) {
int h = hexToBin(s.charAt(i));
int l = hexToBin(s.charAt(i + 1));
if (h == -1 || l == -1) {
throw new IllegalArgumentException("Hex String contains illegal character " + s);
}
out[i / 2] = (byte) (h * 16 + l);
}
return out;
}
static public byte[] parseStringToBin(String str) {
int len = str.length();
byte[] out = new byte[len / 2];
int endIndx;
int i = 0;
while (i < len) {
endIndx = i + 2;
if (endIndx > len) {
endIndx = len - 1;
}
out[i / 2] = (byte) Integer.parseInt(str.substring(i, endIndx), 16);
i += 2;
}
return out;
}
private static int hexToBin(char ch) {
if ('0' <= ch && ch <= '9')
return ch - '0';
if ('A' <= ch && ch <= 'F')
return ch - 'A' + 10;
if ('a' <= ch && ch <= 'f')
return ch - 'a' + 10;
return -1;
}
/*public static byte[] readableNumbersArrayToBytes(ReadableArray bytesArray) {
int size = bytesArray.size();
byte[] bytes = new byte[size];
for (int i = 0; i < size; i++) {
bytes[i] = (byte)bytesArray.getInt(i);
}
return bytes;
}*/
public static byte[] stringNumbersArrayToBytes(String bytesString) {
int size = bytesString.length();
byte[] bytes = new byte[size];
for (int i = 0; i < size; i++) {
bytes[i] = (byte) (bytesString.charAt(i) - '0'); // Convert each char to its byte value
}
return bytes;
}
/*public static byte[] readableNumbersArrayToBytes(ReadableArray bytesArray) {
int size = bytesArray.size();
byte[] bytes = new byte[size];
for (int i = 0; i < size; i++) {
bytes[i] = (byte)bytesArray.getInt(i);
}
return bytes;
}*/
public static byte[] stringToBytes(String numbersString) {
// Split the string by commas to get individual number strings
String[] numberStrings = numbersString.split(",");
// Initialize byte array with the size of the split array
byte[] bytes = new byte[numberStrings.length];
// Convert each number in the string array to a byte
for (int i = 0; i < numberStrings.length; i++) {
try {
bytes[i] = (byte) Integer.parseInt(numberStrings[i].trim());
} catch (NumberFormatException e) {
// Handle the case where the string can't be converted to an integer
throw new IllegalArgumentException("Invalid number format in input string: " + numbersString, e);
}
}
return bytes;
}
/*public static WritableArray BytesToWritableArray(byte[] bytes) {
int size = bytes.length;
WritableArray bytesArray = new WritableNativeArray();
for (byte aByte : bytes) {
bytesArray.pushInt(aByte);
}
return bytesArray;
}*/
public static boolean stringValueIsNull (String value) {
if(value == null || value == "null") {
return true;
}
return false;
}
////////
// SCA Helpers
//////
static public Drawable getImageDrawable(Context c, String i) throws IOException {
try {
byte[] imageBytes = Base64.decode(i, Base64.DEFAULT);
Bitmap bitmap = BitmapFactory.decodeByteArray(imageBytes, 0, imageBytes.length);
Drawable d = new BitmapDrawable(bitmap);
return d;
}
catch (Exception e) {
throw e;
}
}
static public boolean isBase64Encoded(String input) throws IOException {
try {
String pattern = "^([A-Za-z0-9+/]{4})*([A-Za-z0-9+/]{4}|[A-Za-z0-9+/]{3}=|[A-Za-z0-9+/]{2}==)$";
Pattern r = Pattern.compile(pattern);
Matcher m = r.matcher(input);
return m.find();
}
catch (Exception e) {
return false;
}
}
}

View File

@@ -0,0 +1,407 @@
package com.treezor.sca;
import static com.treezor.NativeModuleBase.serializeAntelopError;
import android.content.Context;
import android.util.Log;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import java.nio.charset.StandardCharsets;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import fr.antelop.sdk.AntelopError;
import fr.antelop.sdk.authentication.CustomCustomerAuthenticatedProcessCallback;
import fr.antelop.sdk.authentication.CustomerAuthenticatedProcess;
import fr.antelop.sdk.authentication.CustomerAuthenticationCredentials;
import fr.antelop.sdk.authentication.CustomerAuthenticationMethod;
import fr.antelop.sdk.authentication.CustomerAuthenticationMethodType;
import fr.antelop.sdk.authentication.CustomerAuthenticationPasscode;
import fr.antelop.sdk.authentication.DefaultCustomerAuthenticatedProcessCallback;
import fr.antelop.sdk.authentication.LocalAuthenticationErrorReason;
import fr.antelop.sdk.authentication.prompt.CustomerAuthenticationFailureReason;
import fr.antelop.sdk.authentication.prompt.CustomerAuthenticationPrompt;
import fr.antelop.sdk.authentication.prompt.CustomerAuthenticationPromptBuilder;
import fr.antelop.sdk.authentication.prompt.CustomerAuthenticationPromptCallback;
import fr.antelop.sdk.authentication.prompt.DeviceBiometricCustomerAuthenticationPrompt;
import fr.antelop.sdk.authentication.prompt.DeviceBiometricCustomerAuthenticationPromptBuilder;
import fr.antelop.sdk.exception.WalletValidationException;
import fr.antelop.sdk.sca.CustomerAuthenticatedSignature;
import fr.antelop.sdk.settings.WalletSettings;
import io.flutter.embedding.engine.plugins.FlutterPlugin;
import io.flutter.plugin.common.MethodCall;
import io.flutter.plugin.common.MethodChannel;
import io.flutter.plugin.common.EventChannel;
import io.flutter.plugin.common.MethodChannel.Result;
import io.flutter.plugin.common.EventChannel;
public class CustomerAuthenticatedSignatureModule implements MethodChannel.MethodCallHandler {
static final String TAG = "CustomerAuthenticatedSignatureModule";
static final String EVENT_CHANNEL_NAME = "customer_authenticated_signature_callback";
private final Context context;
private EventChannel eventChannel;
private EventChannel.EventSink eventSink;
private static CustomerAuthenticatedSignature instance = null;
private static List<CustomerAuthenticationMethod> currentCustomerAuthenticationMethod = null;
public CustomerAuthenticatedSignatureModule(Context context, MethodChannel channel, @NonNull FlutterPlugin.FlutterPluginBinding flutterPluginBinding) {
this.context = context;
eventChannel = new EventChannel(flutterPluginBinding.getBinaryMessenger(), EVENT_CHANNEL_NAME);
eventChannel.setStreamHandler(new EventChannel.StreamHandler() {
@Override
public void onListen(Object arguments, EventChannel.EventSink events) {
eventSink = events;
}
@Override
public void onCancel(Object arguments) {
eventSink = null;
}
});
}
@Override
public void onMethodCall(@NonNull MethodCall call, @NonNull Result result) {
switch (call.method) {
case "_initialize":
_initialize(call, result);
break;
case "signWithDefaultAuthentication":
signWithDefaultAuthentication(result);
break;
case "signWithCustomAuthentication":
signWithCustomAuthentication(result);
break;
/*case "getAuthenticatedMethods":
getAuthenticatedMethods(result);
break;*/
case "setPinCustomerCredentials":
setPinCustomerCredentials(
call.argument("passcode"),
result
);
break;
case "setBioCustomerCredentials":
setBioCustomerCredentials(
call.argument("title"),
call.argument("subTitle"),
result);
break;
case "getAuthenticationPatternName":
getAuthenticationPatternName(result);
break;
case "isOnline":
isOnline(result);
break;
case "getMessage":
getMessage(result);
break;
case "getType":
getType(result);
break;
case "getResult":
getResult(result);
break;
case "getInputData":
getInputData(result);
break;
case "clean":
clean(result);
break;
default:
result.notImplemented();
}
}
public synchronized void _initialize(MethodCall call, MethodChannel.Result result) {
String patternName = call.argument("patternName");
String message = call.argument("message");
String input = call.argument("input"); // assumed to be byte array here
byte[] inputBytes = input.getBytes(StandardCharsets.UTF_8);
try {
CustomerAuthenticatedSignature.SignatureType type = CustomerAuthenticatedSignature.SignatureType.LocalJws;
instance = new CustomerAuthenticatedSignature(patternName, message, type, inputBytes);
result.success(null);
} catch (Exception e) {
result.error("INIT_ERROR", e.getMessage(), null);
}
}
private synchronized void signWithDefaultAuthentication(MethodChannel.Result result) {
if (instance == null) {
result.error("INSTANCE_ERROR", "WalletManager instance is not initialized", null);
return;
}
try {
Context context = this.context;
instance.sign(context, new DefaultCustomerAuthenticatedProcessCallback() {
@NonNull
@Override
public CustomerAuthenticationPrompt buildCustomerAuthenticationPrompt(@NonNull CustomerAuthenticationMethodType customerAuthenticationMethodType, @NonNull CustomerAuthenticationPromptBuilder customerAuthenticationPromptBuilder) {
return customerAuthenticationPromptBuilder.build();
}
@Override
public void onProcessStart(@NonNull CustomerAuthenticatedProcess customerAuthenticatedProcess) {
sendEvent("onProcessStart", null);
}
@Override
public void onProcessSuccess(@NonNull CustomerAuthenticatedProcess customerAuthenticatedProcess) {
sendEvent("onProcessSuccess", null);
}
@Override
public void onError(@NonNull AntelopError antelopError, @NonNull CustomerAuthenticatedProcess customerAuthenticatedProcess) {
Map<String, Object> params = new HashMap<>();
params.put("error", serializeAntelopError(antelopError));
sendEvent("onError", params);
}
@Override
public void onAuthenticationDeclined(@NonNull CustomerAuthenticatedProcess customerAuthenticatedProcess) {
sendEvent("onAuthenticationDeclined", null);
}
});
result.success(null);
} catch (WalletValidationException e) {
result.error("SIGN_ERROR", e.getMessage(), null);
}
}
private synchronized void signWithCustomAuthentication(MethodChannel.Result result) {
if (instance == null) {
result.error("INSTANCE_ERROR", "WalletManager instance is not initialized", null);
return;
}
try {
instance.sign(context, new CustomCustomerAuthenticatedProcessCallback() {
@Override
public void onCustomerCredentialsRequired(@NonNull List<CustomerAuthenticationMethod> list, @NonNull CustomerAuthenticatedProcess customerAuthenticatedProcess) {
Map<String, Object> params = new HashMap<>();
/*List<String> methods = new ArrayList<>();
for (CustomerAuthenticationMethod e : list) {
listCustomerAuthenticationMethod.add(e.)
}*/
currentCustomerAuthenticationMethod = list;
sendEvent("onCustomerCredentialsRequired", params);
}
@Override
public void onCustomerCredentialsInvalid(@NonNull LocalAuthenticationErrorReason localAuthenticationErrorReason, @NonNull CustomerAuthenticatedProcess customerAuthenticatedProcess) {
Map<String, Object> params = new HashMap<>();
params.put("reason", localAuthenticationErrorReason.name());
sendEvent("onCustomerCredentialsInvalid", params);
}
@Override
public void onProcessStart(@NonNull CustomerAuthenticatedProcess customerAuthenticatedProcess) {
sendEvent("onProcessStart", null);
}
@Override
public void onProcessSuccess(@NonNull CustomerAuthenticatedProcess customerAuthenticatedProcess) {
Map<String, Object> params = new HashMap<>();
params.put("signature", instance.getResult());
sendEvent("onProcessSuccess", null);
}
@Override
public void onError(@NonNull AntelopError antelopError, @NonNull CustomerAuthenticatedProcess customerAuthenticatedProcess) {
Map<String, Object> params = new HashMap<>();
params.put("error", serializeAntelopError(antelopError));
sendEvent("onError", params);
}
@Override
public void onAuthenticationDeclined(@NonNull CustomerAuthenticatedProcess customerAuthenticatedProcess) {
sendEvent("onAuthenticationDeclined", null);
}
});
result.success(null);
} catch (WalletValidationException e) {
result.error("SIGN_ERROR", e.getMessage(), null);
}
}
/*private synchronized void getAuthenticatedMethods(MethodChannel.Result result) {
if (instance == null) {
result.error("INSTANCE_ERROR", "WalletManager instance is not initialized", null);
return;
}
try {
List<CustomerAuthenticationMethodType> methods = instance.getAuthenticatedMethods();
List<String> methodNames = methods.stream().map(Enum::name).collect(Collectors.toList());
result.success(methodNames);
} catch (Exception e) {
result.error("METHODS_ERROR", e.getMessage(), null);
}
}*/
private synchronized void setPinCustomerCredentials(String passcode, MethodChannel.Result result) {
if (instance == null) {
result.error("INSTANCE_ERROR", "WalletManager instance is not initialized", null);
return;
}
try {
CustomerAuthenticationPasscode cred = new CustomerAuthenticationPasscode(passcode.getBytes());
instance.setCustomerCredentials(context, cred);
result.success(null);
} catch (Exception e) {
result.error("SET_CREDENTIALS_ERROR", e.getMessage(), null);
}
}
private synchronized void setBioCustomerCredentials(String title, String subTitle, MethodChannel.Result result) {
if (instance == null) {
result.error("INSTANCE_ERROR", "WalletManager instance is not initialized", null);
return;
}
try {
DeviceBiometricCustomerAuthenticationPromptBuilder deviceBioCustom = new DeviceBiometricCustomerAuthenticationPromptBuilder();
deviceBioCustom.setTitle(title);
deviceBioCustom.setSubtitle(subTitle);
DeviceBiometricCustomerAuthenticationPrompt promptIK = deviceBioCustom.build();
CustomerAuthenticationMethod bioCustomerAuthenticationMethod = null;
for(CustomerAuthenticationMethod customerAuthenticationMethod : currentCustomerAuthenticationMethod) {
if (customerAuthenticationMethod.getType().equals(CustomerAuthenticationMethodType.DeviceBiometric)) {
bioCustomerAuthenticationMethod = customerAuthenticationMethod;
}
break;
}
bioCustomerAuthenticationMethod.promptCustomer(context, promptIK, new CustomerAuthenticationPromptCallback() {
@Override
public void onAuthenticationSuccess(@NonNull CustomerAuthenticationCredentials customerAuthenticationCredentials) {
try {
instance.setCustomerCredentials(context, customerAuthenticationCredentials);
} catch (WalletValidationException e) {
throw new RuntimeException(e);
}
result.success(null);
}
@Override
public void onAuthenticationFailure(@NonNull CustomerAuthenticationFailureReason customerAuthenticationFailureReason) {
result.error("SET_CREDENTIALS_ERROR", "reason: " + customerAuthenticationFailureReason, null);
}
});
result.success(null);
} catch (Exception e) {
result.error("SET_CREDENTIALS_ERROR", e.getMessage(), null);
}
}
private synchronized void getAuthenticationPatternName(MethodChannel.Result result) {
if (instance == null) {
result.error("INSTANCE_ERROR", "WalletManager instance is not initialized", null);
return;
}
try {
result.success(instance.getCustomerAuthenticationPatternName());
} catch (Exception e) {
result.error("GET_PATTERN_ERROR", e.getMessage(), null);
}
}
private synchronized void isOnline(MethodChannel.Result result) {
if (instance == null) {
result.error("INSTANCE_ERROR", "WalletManager instance is not initialized", null);
return;
}
try {
result.success(instance.isOnline());
} catch (Exception e) {
result.error("ONLINE_ERROR", e.getMessage(), null);
}
}
private synchronized void getMessage(MethodChannel.Result result) {
if (instance == null) {
result.error("INSTANCE_ERROR", "WalletManager instance is not initialized", null);
return;
}
try {
result.success(instance.getMessage());
} catch (Exception e) {
result.error("GET_MESSAGE_ERROR", e.getMessage(), null);
}
}
private synchronized void getType(MethodChannel.Result result) {
if (instance == null) {
result.error("INSTANCE_ERROR", "WalletManager instance is not initialized", null);
return;
}
try {
result.success(instance.getType().name());
} catch (Exception e) {
result.error("GET_TYPE_ERROR", e.getMessage(), null);
}
}
private synchronized void getResult(MethodChannel.Result result) {
if (instance == null) {
result.error("INSTANCE_ERROR", "WalletManager instance is not initialized", null);
return;
}
try {
result.success(instance.getResult());
} catch (Exception e) {
result.error("GET_RESULT_ERROR", e.getMessage(), null);
}
}
private synchronized void getInputData(MethodChannel.Result result) {
if (instance == null) {
result.error("INSTANCE_ERROR", "WalletManager instance is not initialized", null);
return;
}
try {
byte[] inputData = instance.getInputData();
result.success(inputData);
} catch (Exception e) {
result.error("INPUT_DATA_ERROR", e.getMessage(), null);
}
}
private synchronized void clean(MethodChannel.Result result) {
if (instance == null) {
result.error("INSTANCE_ERROR", "WalletManager instance is not initialized", null);
return;
}
instance = null;
result.success(null);
}
private void sendEvent(String eventName, Map<String, Object> params) {
Map<String, Object> event = new HashMap<>();
// Add the event name under the "event" key
event.put("event", eventName);
// Add the params under the "params" key
if (params != null) {
event.put("params", params);
} else {
event.put("params", null); // Explicitly handle the case when params is null
}
// Pass the structured map to eventSink.success
eventSink.success(event);
}
}

View File

@@ -0,0 +1,419 @@
package com.treezor.wallet;
import static com.treezor.NativeModuleBase.serializeAntelopError;
import static com.treezor.NativeModuleBase.serializeWalletValidationException;
import android.content.Context;
import android.util.Log;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import java.util.HashMap;
import java.util.Map;
import fr.antelop.sdk.AntelopError;
import fr.antelop.sdk.AsyncRequestType;
import fr.antelop.sdk.Wallet;
import fr.antelop.sdk.WalletLockReason;
import fr.antelop.sdk.WalletManager;
import fr.antelop.sdk.WalletManagerCallback;
import fr.antelop.sdk.authentication.CustomerAuthenticationCredentials;
import fr.antelop.sdk.authentication.CustomerAuthenticationMethodType;
import fr.antelop.sdk.authentication.CustomerAuthenticationPasscode;
import fr.antelop.sdk.authentication.CustomerAuthenticationPattern;
import fr.antelop.sdk.authentication.CustomerCredentialsRequiredReason;
import fr.antelop.sdk.authentication.LocalAuthenticationErrorReason;
import fr.antelop.sdk.exception.WalletValidationException;
import io.flutter.embedding.engine.plugins.FlutterPlugin;
import io.flutter.plugin.common.MethodCall;
import io.flutter.plugin.common.MethodChannel;
import io.flutter.plugin.common.EventChannel;
import io.flutter.plugin.common.MethodChannel.Result;
public class WalletManagerModule implements MethodChannel.MethodCallHandler {
static final String TAG = "WalletManagerModule";
static final String EVENT_CHANNEL_NAME = "wallet_manager_callback";
private final Context context;
private EventChannel eventChannel;
private EventChannel.EventSink eventSink;
private static WalletManager instance = null;
public WalletManagerModule(Context context, MethodChannel channel, @NonNull FlutterPlugin.FlutterPluginBinding flutterPluginBinding) {
this.context = context;
eventChannel = new EventChannel(flutterPluginBinding.getBinaryMessenger(), EVENT_CHANNEL_NAME);
eventChannel.setStreamHandler(new EventChannel.StreamHandler() {
@Override
public void onListen(Object arguments, EventChannel.EventSink events) {
eventSink = events;
}
@Override
public void onCancel(Object arguments) {
eventSink = null;
}
});
}
public static synchronized WalletManager getInstance(Context context, WalletManagerCallback callback) throws WalletValidationException {
if (instance == null) {
instance = new WalletManager(context, callback, null);
}
return instance;
}
@Override
public void onMethodCall(@NonNull MethodCall call, @NonNull Result result) {
switch (call.method) {
case "_initialize":
this._initialize(result);
break;
case "connect":
this.connect(
call.argument("loginCreds"),
call.argument("newCreds"),
result
);
break;
case "logout":
this.logout(result);
break;
case "lock":
this.lock(call.argument("reason"), result);
break;
case "disconnect":
this.disconnect(result);
break;
case "delete":
this.delete(result);
break;
case "checkCredentials":
this.checkCredentials(call.argument("credentials"), result);
break;
case "changeCredentials":
this.changeCredentials(call.argument("currentCredentials"), call.argument("newCredentials"), result);
break;
case "activateAuthenticationMethod":
this.activateAuthenticationMethod(call.argument("methodToActivated"), result);
break;
case "clean":
this.clean(result);
break;
default:
result.notImplemented();
break;
}
}
public void _initialize(Result result) {
try {
WalletManagerCallback walletManagerCallback = new WalletManagerCallback() {
@Override
public void onProvisioningRequired(@Nullable Object callbackData) {
sendEvent("onProvisioningRequired", null);
}
@Override
public void onCredentialsRequired(@NonNull CustomerCredentialsRequiredReason reason, @Nullable AntelopError error, @Nullable Object callbackData) {
Log.d(TAG, "Android onCredentialsRequired - reason: " + reason + ", error: " + error);
Map<String, Object> params = new HashMap<>();
params.put("reason", reason.name());
if (error != null) {
params.put("error", serializeAntelopError(error));
}
sendEvent("onCredentialsRequired", params);
}
@Override
public void onConnectionError(@NonNull AntelopError error, @Nullable Object callbackData) {
Map<String, Object> params = new HashMap<>();
params.put("error", serializeAntelopError(error));
sendEvent("onConnectionError", params);
}
@Override
public void onConnectionSuccess(@NonNull Wallet wallet, @Nullable Object callbackData) {// Adjust as needed
sendEvent("onConnectionSuccess", null);
}
@Override
public void onAsyncRequestSuccess(@NonNull AsyncRequestType asyncRequestType, @Nullable Object callbackData) {
/*Map<String, Object> params = new HashMap<>();
params.put("asyncRequestCode", asyncRequestType.name());
sendEvent("onAsyncRequestSuccess", params);*/
}
@Override
public void onAsyncRequestError(@NonNull AsyncRequestType asyncRequestType, @NonNull AntelopError error, @Nullable Object callbackData) {
/*Map<String, Object> params = new HashMap<>();
params.put("asyncRequestCode", asyncRequestType.name());
params.put("error", serializeAntelopError(error));
sendEvent("onAsyncRequestError", params);*/
}
@Override
public void onLocalAuthenticationSuccess(@NonNull CustomerAuthenticationMethodType type, @Nullable Object callbackData) {
/*Map<String, Object> params = new HashMap<>();
params.put("methodType", type.name());
sendEvent("onLocalAuthenticationSuccess", params);*/
}
@Override
public void onLocalAuthenticationError(@NonNull CustomerAuthenticationMethodType type, @NonNull LocalAuthenticationErrorReason reason, @Nullable String message, @Nullable Object callbackData) {
/*Map<String, Object> params = new HashMap<>();
params.put("reason", reason.name());
params.put("methodType", type.name());
sendEvent("onLocalAuthenticationError", params);*/
}
};
instance = new WalletManager(context, walletManagerCallback, null);
result.success(null);
} catch (WalletValidationException e) {
result.error("INIT_ERROR", e.getMessage(), null);
}
}
public synchronized void connect(String loginCreds, String newCreds, Result result) {
if (instance == null) {
result.error("INSTANCE_ERROR", "WalletManager instance is not initialized", null);
return;
}
try {
Log.d(TAG, "Android connect - loginCreds: " + loginCreds + ", newCreds: " + newCreds);
CustomerAuthenticationCredentials customerLoginCreds = null;
CustomerAuthenticationCredentials customerNewCreds = null;
if (loginCreds != null) {
customerLoginCreds = new CustomerAuthenticationPasscode(loginCreds.getBytes());
}
if (newCreds != null) {
customerNewCreds = new CustomerAuthenticationPasscode(newCreds.getBytes());
}
Log.d(TAG, "Android connect - customerLoginCreds: " + customerLoginCreds + ", customerNewCreds: " + customerNewCreds);
instance.connect(customerLoginCreds, customerNewCreds);
result.success(null);
} catch (WalletValidationException e) {
result.error("CONNECT_ERROR", e.getMessage(), null);
} catch (Exception e) {
result.error("UNKNOWN_ERROR", e.getMessage(), null);
}
}
public synchronized void logout(MethodChannel.Result result) {
if (instance == null) {
result.error("INSTANCE_ERROR", "WalletManager instance is not initialized", null);
return;
}
try {
instance.logout();
result.success(null);
} catch (WalletValidationException e) {
result.error("LOGOUT_ERROR", e.getMessage(), null);
} catch (Exception e) {
result.error("UNKNOWN_ERROR", e.getMessage(), null);
}
}
public synchronized void lock(String reason, MethodChannel.Result result) {
Log.d(TAG, "lock: " + reason);
if (instance == null) {
result.error("INSTANCE_ERROR", "WalletManager instance is not initialized", null);
return;
}
try {
WalletLockReason _reason = WalletLockReason.OtherReason;
if (reason.equalsIgnoreCase("FraudulentUseSuspected")) {
_reason = WalletLockReason.FraudulentUseSuspected;
} else if (reason.equalsIgnoreCase("StopService")) {
_reason = WalletLockReason.StopService;
} else if (reason.equalsIgnoreCase("StrongestCvmAttemptCountExceeded")) {
_reason = WalletLockReason.StrongestCvmAttemptCountExceeded;
}
Log.d("AntolopModule", "lock: _reason" + _reason.name());
instance.lock(_reason);
} catch (WalletValidationException e) {
result.error("Error", e.getMessage(), null);
} catch (Exception e) {
Log.d("AntolopModule", "lock error: " + e.getMessage());
result.error("Error", e.getMessage(), null);
}
result.success(null);
}
public synchronized void disconnect(MethodChannel.Result result) {
if (instance == null) {
result.error("INSTANCE_ERROR", "WalletManager instance is not initialized", null);
return;
}
try {
instance.disconnect();
result.success(null);
} catch (Exception e) {
result.error("Error", e.getMessage(), null);
}
}
public synchronized void delete(MethodChannel.Result result) {
if (instance == null) {
result.error("INSTANCE_ERROR", "WalletManager instance is not initialized", null);
return;
}
try {
instance.delete();
result.success(null);
} catch (Exception e) {
result.error("Error", e.getMessage(), null);
}
}
public synchronized void checkCredentials(String credentials, MethodChannel.Result result) {
if (instance == null) {
result.error("INSTANCE_ERROR", "WalletManager instance is not initialized", null);
return;
}
CustomerAuthenticationPasscode _credentials = new CustomerAuthenticationPasscode(credentials.getBytes());
try {
instance.checkCredentials(_credentials);
result.success(null);
} catch (WalletValidationException walletValidationException) {
result.error("Error", walletValidationException.getMessage(), null);
} catch (Exception e) {
result.error("Error", e.getMessage(), null);
}
}
public synchronized void changeCredentials(String currentCredentials, String newCredentials, MethodChannel.Result result) {
if (instance == null) {
result.error("INSTANCE_ERROR", "WalletManager instance is not initialized", null);
return;
}
CustomerAuthenticationPasscode _currentCredentials = new CustomerAuthenticationPasscode(currentCredentials.getBytes());
CustomerAuthenticationPasscode _newCredentials = new CustomerAuthenticationPasscode(newCredentials.getBytes());
try {
instance.changeCredentials(_currentCredentials, _newCredentials);
result.success(null);
} catch (WalletValidationException walletValidationException) {
result.error("Error", walletValidationException.getMessage(), null);
} catch (Exception e) {
result.error("Error", e.getMessage(), null);
}
}
public synchronized void activateAuthenticationMethod(String methodToActivated, MethodChannel.Result result) {
if (instance == null) {
result.error("INSTANCE_ERROR", "WalletManager instance is not initialized", null);
return;
}
try {
CustomerAuthenticationMethodType _type = CustomerAuthenticationMethodType.None;
if (methodToActivated.equals("BIO")) {
_type = CustomerAuthenticationMethodType.DeviceBiometric;
} else if (methodToActivated.equals("PIN")) {
_type = CustomerAuthenticationMethodType.Pin;
}
instance.activateAuthenticationMethod(_type, null);
result.success(null);
} catch (WalletValidationException walletValidationException) {
result.error("Error", walletValidationException.getMessage(), null);
} catch (Exception e) {
result.error("Error", e.getMessage(), null);
}
}
/*public synchronized void deactivateAuthenticationMethod(String type, @Nullable String credentialsInstanceKey, MethodChannel.Result result) {
if (instance == null) {
result.error("INSTANCE_ERROR", "WalletManager instance is not initialized", null);
return;
}
try {
CustomerAuthenticationMethodType _type = CustomerAuthenticationMethodType.valueOf(type);
CustomerAuthenticationCredentials credentials = null;
if(credentialsInstanceKey != null)
credentials = Utils.getCustomerAuthenticationCredentialsFromInstanceKey(credentialsInstanceKey);
instance.deactivateAuthenticationMethod(_type, credentials);
result.success(null);
} catch (WalletValidationException walletValidationException) {
result.error("Error", serializeWalletValidationException(walletValidationException));
} catch (Exception e) {
result.error("Error", e);
}
}*/
/*public synchronized void setCustomerCredentialsForTransaction(String credentialsInstanceKey, MethodChannel.Result result) {
if (instance == null) {
result.error("INSTANCE_ERROR", "WalletManager instance is not initialized", null);
return;
}
try {
CustomerAuthenticationCredentials credentials = Utils.getCustomerAuthenticationCredentialsFromInstanceKey(credentialsInstanceKey);
instance.setCustomerCredentialsForTransaction(credentials);
result.success(null);
} catch (WalletValidationException walletValidationException) {
result.error("Error", serializeWalletValidationException(walletValidationException));
} catch (Exception e) {
result.error("Error", e);
}
}*/
/*public synchronized void synchronizeAuthenticationMethod(String type, @Nullable String credentialsInstanceKey, MethodChannel.Result result) {
if (instance == null) {
result.error("INSTANCE_ERROR", "WalletManager instance is not initialized", null);
return;
}
try {
CustomerAuthenticationMethodType _type = CustomerAuthenticationMethodType.valueOf(type);
CustomerAuthenticationCredentials credentials = null;
if(credentialsInstanceKey != null)
credentials = Utils.getCustomerAuthenticationCredentialsFromInstanceKey(credentialsInstanceKey);
instance.synchronizeAuthenticationMethod(_type, credentials);
result.success(null);
} catch (WalletValidationException walletValidationException) {
result.error("Error", serializeWalletValidationException(walletValidationException));
} catch (Exception e) {
result.error("Error", e);
}
}*/
public synchronized void clean(MethodChannel.Result result) {
if (instance == null) {
result.error("INSTANCE_ERROR", "WalletManager instance is not initialized", null);
return;
}
try {
instance.clean();
instance = null;
result.success(null);
} catch (Exception e) {
result.error("Error", e.getMessage(), null);
}
}
private void sendEvent(String eventName, Map<String, Object> params) {
Map<String, Object> event = new HashMap<>();
// Add the event name under the "event" key
event.put("event", eventName);
// Add the params under the "params" key
if (params != null) {
event.put("params", params);
} else {
event.put("params", null); // Explicitly handle the case when params is null
}
eventSink.success(event);
}
}

View File

@@ -0,0 +1,139 @@
/*package com.treezor.wallet;
import android.content.Context;
import androidx.annotation.NonNull;
import io.flutter.embedding.engine.plugins.FlutterPlugin;
import io.flutter.plugin.common.MethodChannel;
import io.flutter.plugin.common.EventChannel;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import fr.antelop.sdk.WalletLockReason;
import fr.antelop.sdk.WalletNotificationServiceCallback;
import fr.antelop.sdk.card.EmvApplicationActivationMethod;
public class WalletNotificationServiceModule implements WalletNotificationServiceCallback {
static final String TAG = "WalletNotificationServiceModule";
static final String EVENT_CHANNEL_NAME = "wallet_notification_service_events";
private final Context context;
private final MethodChannel channel;
private static EventChannel eventChannel;
private static EventChannel.EventSink eventSink;
private static WalletNotificationServiceModule instance = null;
public WalletNotificationServiceModule(Context context, MethodChannel channel, @NonNull FlutterPlugin.FlutterPluginBinding flutterPluginBinding) {
this.context = context;
this.channel = channel;
eventChannel = new EventChannel(flutterPluginBinding.getBinaryMessenger(), EVENT_CHANNEL_NAME);
eventChannel.setStreamHandler(new EventChannel.StreamHandler() {
@Override
public void onListen(Object arguments, EventChannel.EventSink events) {
eventSink = events;
}
@Override
public void onCancel(Object arguments) {
eventSink = null;
}
});
}
public static synchronized WalletNotificationServiceModule getInstance(Context context, MethodChannel channel, @NonNull FlutterPlugin.FlutterPluginBinding flutterPluginBinding) {
if (instance == null) {
instance = new WalletNotificationServiceModule(context, channel, flutterPluginBinding);
}
return instance;
}
@Override
public void onEmvApplicationActivationRequired(Context context, String emvAppId, List<EmvApplicationActivationMethod> methods) {
sendEvent("onEmvApplicationActivationRequired", null);
}
@Override
public void onEmvApplicationCredentialsUpdated(Context context) {
sendEvent("onEmvApplicationCredentialsUpdated", null);
}
@Override
public void onCardsUpdated(Context context) {
sendEvent("onCardsUpdated", null);
}
@Override
public void onWalletLoaded(@NonNull Context context) {
sendEvent("onWalletLoaded", null);
}
@Override
public void onWalletLocked(@NonNull Context context, @NonNull WalletLockReason reason) {
Map<String, Object> params = new HashMap<>();
params.put("reason", reason.name());
sendEvent("onWalletLocked", params);
}
@Override
public void onWalletUnlocked(@NonNull Context context) {
sendEvent("onWalletUnlocked", null);
}
@Override
public void onLogout(@NonNull Context context) {
sendEvent("onLogout", null);
}
@Override
public void onWalletDeleted(@NonNull Context context) {
sendEvent("onWalletDeleted", null);
}
@Override
public void onSettingsUpdated(@NonNull Context context) {
sendEvent("onSettingsUpdated", null);
}
@Override
public void onCountersUpdated(Context context) {
sendEvent("onCountersUpdated", null);
}
@Override
public void onCustomerCredentialsReset(Context context) {
sendEvent("onCustomerCredentialsReset", null);
}
@Override
public void onSunsetScheduled(@NonNull Context context, @NonNull Date sunsetDate) {
sendEvent("onSunsetScheduled", null);
}
@Override
public void onLostEligibility(@NonNull Context context) {
sendEvent("onLostEligibility", null);
}
private void sendEvent(String eventName, Map<String, Object> params) {
Map<String, Object> event = new HashMap<>();
// Add the event name under the "event" key
event.put("event", eventName);
// Add the params under the "params" key
if (params != null) {
event.put("params", params);
} else {
event.put("params", null); // Explicitly handle the case when params is null
}
// Pass the structured map to eventSink.success
eventSink.success(event);
}
}*/

View File

@@ -0,0 +1,260 @@
package com.treezor.wallet;
import static com.treezor.globals.Utils.parseHexFormattedBinary;
import android.content.Context;
import android.util.Log;
import androidx.annotation.NonNull;
import fr.antelop.sdk.AntelopError;
import fr.antelop.sdk.EligibilityDenialReason;
import fr.antelop.sdk.Product;
import fr.antelop.sdk.WalletProvisioning;
import fr.antelop.sdk.WalletProvisioningCallback;
import fr.antelop.sdk.exception.WalletValidationException;
import io.flutter.embedding.engine.plugins.FlutterPlugin;
import io.flutter.plugin.common.MethodCall;
import io.flutter.plugin.common.MethodChannel;
import io.flutter.plugin.common.EventChannel;
import io.flutter.plugin.common.MethodChannel.Result;
import io.flutter.plugin.common.EventChannel;
import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import androidx.annotation.Nullable;
public class WalletProvisioningModule implements MethodChannel.MethodCallHandler {
static final String TAG = "WProvisioningModule";
static final String EVENT_CHANNEL_NAME = "wallet_provisioning_callback";
private final Context context;
private EventChannel eventChannel;
private EventChannel.EventSink eventSink;
private static WalletProvisioning instance = null;
public WalletProvisioningModule(Context context, MethodChannel channel, @NonNull FlutterPlugin.FlutterPluginBinding flutterPluginBinding) {
this.context = context;
eventChannel = new EventChannel(flutterPluginBinding.getBinaryMessenger(), EVENT_CHANNEL_NAME);
eventChannel.setStreamHandler(new EventChannel.StreamHandler() {
@Override
public void onListen(Object arguments, EventChannel.EventSink events) {
eventSink = events;
}
@Override
public void onCancel(Object arguments) {
eventSink = null;
}
});
}
@Override
public void onMethodCall(@NonNull MethodCall call, @NonNull Result result) {
switch (call.method) {
case "_initialize":
this._initialize(result);
break;
case "initialize":
this.initialize(result);
break;
case "checkEligibility":
this.checkEligibility(call.argument("rootedDeviceForbidden"), result);
break;
case "launch":
this.launch(call.argument("activationCode"), result);
break;
case "clean":
this.clean(result);
break;
default:
result.notImplemented();
}
}
private void _initialize(Result result) {
Log.d(TAG, "_initialize start");
WalletProvisioningCallback walletProvisioningCallback = new WalletProvisioningCallback() {
@Override
public void onInitializationSuccess(Object callbackData) {
Log.d(TAG, "onInitializationSuccess");
sendEvent("onInitializationSuccess", null);
}
@Override
public void onInitializationError(AntelopError error, Object callbackData) {
Log.d(TAG, "onInitializationError: " + error.getCode().toString() + " - " + error.getMessage());
Map<String, Object> errorData = new HashMap<>();
errorData.put("message", error.getMessage());
errorData.put("code", error.getCode().toString());
sendEvent("onInitializationError", errorData);
}
@Override
public void onPermissionNotGranted(String[] permissions, Object callbackData) {
Log.d(TAG, "onPermissionNotGranted");
Map<String, Object> params = new HashMap<>();
List<String> permissionsList = Arrays.asList(permissions);
params.put("permissions", permissionsList);
// Send the event to Flutter using invokeMethod
sendEvent("onPermissionNotGranted", params);
}
@Override
public void onDeviceEligible(boolean fingerprintAllowed, List<Product> eligibleProducts, Object callbackData) {
Log.d(TAG, "onDeviceEligible");
Map<String, Object> params = new HashMap<>();
params.put("fingerprintAllowed", fingerprintAllowed);
// Send the event to Flutter using invokeMethod
sendEvent("onDeviceEligible", params);
}
@Override
public void onDeviceNotEligible(EligibilityDenialReason reason, Object callbackData, @Nullable String denialReference) {
Log.d(TAG, "onDeviceNotEligible: " + reason.toString() + " - " + denialReference);
Map<String, Object> params = new HashMap<>();
params.put("reason", reason.toString());
params.put("denialReference", denialReference);
// Send the event to Flutter using invokeMethod
sendEvent("onDeviceNotEligible", params);
}
@Override
public void onCheckEligibilityError(AntelopError error, Object callbackData) {
Log.d(TAG, "onCheckEligibilityError: " + error.getCode().toString() + " - " + error.getMessage());
Map<String, Object> errorMap = new HashMap<>();
errorMap.put("message", error.getMessage());
errorMap.put("code", error.getCode().toString());
Map<String, Object> params = new HashMap<>();
params.put("error", errorMap);
// Send the event to Flutter using invokeMethod
sendEvent("onCheckEligibilityError", params);
}
@Override
public void onProvisioningPending(Object callbackData) {
Log.d(TAG, "onProvisioningPending");
// Send the event to Flutter using invokeMethod
sendEvent("onProvisioningPending", null);
}
@Override
public void onProvisioningSuccess(Object callbackData) {
Log.d(TAG, "onProvisioningSuccess");
// Send the event to Flutter using invokeMethod
sendEvent("onProvisioningSuccess", null);
}
@Override
public void onProvisioningError(AntelopError error, Object callbackData) {
Log.d(TAG, "onProvisioningError: " + error.getCode().toString() + " - " + error.getMessage());
Map<String, Object> errorMap = new HashMap<>();
errorMap.put("message", error.getMessage());
errorMap.put("code", error.getCode().toString());
Map<String, Object> params = new HashMap<>();
params.put("error", errorMap);
// Send the event to Flutter using invokeMethod
sendEvent("onProvisioningError", params);
}
};
try {
instance = new WalletProvisioning(context, walletProvisioningCallback);
result.success(null);
} catch (WalletValidationException e) {
result.error("INIT_ERROR", e.getMessage(), null);
}
}
private synchronized void initialize(Result result) {
if (instance == null) {
result.error("INSTANCE_ERROR", "WalletProvisioning instance is not initialized", null);
return;
}
try {
instance.initialize();
result.success(null);
} catch (Exception e) {
result.error("INIT_ERROR", e.getMessage(), null);
}
}
private synchronized void checkEligibility(boolean rootedDeviceForbidden, Result result) {
if (instance == null) {
result.error("INSTANCE_ERROR", "WalletManager instance is not initialized", null);
return;
}
try {
instance.checkEligibility(rootedDeviceForbidden);
result.success(null);
} catch (Exception e) {
result.error("CHECK_ELIGIBILITY_ERROR", e.getMessage(), null);
}
}
private synchronized void launch(String activationCode, Result result) {
if (instance == null) {
result.error("INSTANCE_ERROR", "WalletManager instance is not initialized", null);
return;
}
try {
Log.d(TAG, "launch activationCode: " + activationCode);
instance.launch(parseHexFormattedBinary(activationCode), null);
result.success(null);
} catch (Exception e) {
result.error("CHECK_ELIGIBILITY_ERROR", e.getMessage(), null);
}
}
private synchronized void clean(Result result) {
if (instance == null) {
result.error("INSTANCE_ERROR", "WalletManager instance is not initialized", null);
return;
}
try {
instance.clean();
instance = null;
result.success(null);
} catch (Exception e) {
result.error("CLEAN_ERROR", e.getMessage(), null);
}
}
private void sendEvent(String eventName, Map<String, Object> params) {
Map<String, Object> event = new HashMap<>();
// Add the event name under the "event" key
event.put("event", eventName);
// Add the params under the "params" key
if (params != null) {
event.put("params", params);
} else {
event.put("params", null); // Explicitly handle the case when params is null
}
// Pass the structured map to eventSink.success
eventSink.success(event);
}
}

View File

@@ -0,0 +1,29 @@
package com.treezor.flutter_treezor_entrust_sdk_bridge;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.verify;
import io.flutter.plugin.common.MethodCall;
import io.flutter.plugin.common.MethodChannel;
import org.junit.Test;
/**
* This demonstrates a simple unit test of the Java portion of this plugin's implementation.
*
* Once you have built the plugin's example app, you can run these tests from the command
* line by running `./gradlew testDebugUnitTest` in the `example/android/` directory, or
* you can run them directly from IDEs that support JUnit such as Android Studio.
*/
public class FlutterTreezorEntrustSdkBridgePluginTest {
@Test
public void onMethodCall_getPlatformVersion_returnsExpectedValue() {
FlutterTreezorEntrustSdkBridgePlugin plugin = new FlutterTreezorEntrustSdkBridgePlugin();
final MethodCall call = new MethodCall("getPlatformVersion", null);
MethodChannel.Result mockResult = mock(MethodChannel.Result.class);
plugin.onMethodCall(call, mockResult);
verify(mockResult).success("Android " + android.os.Build.VERSION.RELEASE);
}
}

Binary file not shown.

View File

@@ -0,0 +1,31 @@
Extension Discovery Cache
=========================
This folder is used by `package:extension_discovery` to cache lists of
packages that contains extensions for other packages.
DO NOT USE THIS FOLDER
----------------------
* Do not read (or rely) the contents of this folder.
* Do write to this folder.
If you're interested in the lists of extensions stored in this folder use the
API offered by package `extension_discovery` to get this information.
If this package doesn't work for your use-case, then don't try to read the
contents of this folder. It may change, and will not remain stable.
Use package `extension_discovery`
---------------------------------
If you want to access information from this folder.
Feel free to delete this folder
-------------------------------
Files in this folder act as a cache, and the cache is discarded if the files
are older than the modification time of `.dart_tool/package_config.json`.
Hence, it should never be necessary to clear this cache manually, if you find a
need to do please file a bug.

View File

@@ -0,0 +1 @@
{"version":2,"entries":[{"package":"flutter_treezor_entrust_sdk_bridge","rootUri":"../../","packageUri":"lib/"},{"package":"flutter_treezor_entrust_sdk_bridge_example","rootUri":"../","packageUri":"lib/"}]}

View File

@@ -0,0 +1,274 @@
{
"configVersion": 2,
"packages": [
{
"name": "async",
"rootUri": "file:///Users/juliandalcalaf/.pub-cache/hosted/pub.dev/async-2.11.0",
"packageUri": "lib/",
"languageVersion": "2.18"
},
{
"name": "boolean_selector",
"rootUri": "file:///Users/juliandalcalaf/.pub-cache/hosted/pub.dev/boolean_selector-2.1.1",
"packageUri": "lib/",
"languageVersion": "2.17"
},
{
"name": "characters",
"rootUri": "file:///Users/juliandalcalaf/.pub-cache/hosted/pub.dev/characters-1.4.0",
"packageUri": "lib/",
"languageVersion": "3.4"
},
{
"name": "clock",
"rootUri": "file:///Users/juliandalcalaf/.pub-cache/hosted/pub.dev/clock-1.1.2",
"packageUri": "lib/",
"languageVersion": "3.4"
},
{
"name": "collection",
"rootUri": "file:///Users/juliandalcalaf/.pub-cache/hosted/pub.dev/collection-1.19.1",
"packageUri": "lib/",
"languageVersion": "3.4"
},
{
"name": "crypto",
"rootUri": "file:///Users/juliandalcalaf/.pub-cache/hosted/pub.dev/crypto-3.0.6",
"packageUri": "lib/",
"languageVersion": "3.4"
},
{
"name": "cupertino_icons",
"rootUri": "file:///Users/juliandalcalaf/.pub-cache/hosted/pub.dev/cupertino_icons-1.0.8",
"packageUri": "lib/",
"languageVersion": "3.1"
},
{
"name": "dio",
"rootUri": "file:///Users/juliandalcalaf/.pub-cache/hosted/pub.dev/dio-5.7.0",
"packageUri": "lib/",
"languageVersion": "2.18"
},
{
"name": "dio_web_adapter",
"rootUri": "file:///Users/juliandalcalaf/.pub-cache/hosted/pub.dev/dio_web_adapter-2.0.0",
"packageUri": "lib/",
"languageVersion": "3.3"
},
{
"name": "fake_async",
"rootUri": "file:///Users/juliandalcalaf/.pub-cache/hosted/pub.dev/fake_async-1.3.3",
"packageUri": "lib/",
"languageVersion": "3.3"
},
{
"name": "file",
"rootUri": "file:///Users/juliandalcalaf/.pub-cache/hosted/pub.dev/file-7.0.0",
"packageUri": "lib/",
"languageVersion": "3.0"
},
{
"name": "flutter",
"rootUri": "file:///Users/juliandalcalaf/Development/flutter/packages/flutter",
"packageUri": "lib/",
"languageVersion": "3.8"
},
{
"name": "flutter_driver",
"rootUri": "file:///Users/juliandalcalaf/Development/flutter/packages/flutter_driver",
"packageUri": "lib/",
"languageVersion": "3.8"
},
{
"name": "flutter_lints",
"rootUri": "file:///Users/juliandalcalaf/.pub-cache/hosted/pub.dev/flutter_lints-4.0.0",
"packageUri": "lib/",
"languageVersion": "3.1"
},
{
"name": "flutter_test",
"rootUri": "file:///Users/juliandalcalaf/Development/flutter/packages/flutter_test",
"packageUri": "lib/",
"languageVersion": "3.8"
},
{
"name": "flutter_treezor_entrust_sdk_bridge",
"rootUri": "../../",
"packageUri": "lib/",
"languageVersion": "3.5"
},
{
"name": "fuchsia_remote_debug_protocol",
"rootUri": "file:///Users/juliandalcalaf/Development/flutter/packages/fuchsia_remote_debug_protocol",
"packageUri": "lib/",
"languageVersion": "3.8"
},
{
"name": "http_parser",
"rootUri": "file:///Users/juliandalcalaf/.pub-cache/hosted/pub.dev/http_parser-4.0.2",
"packageUri": "lib/",
"languageVersion": "2.12"
},
{
"name": "integration_test",
"rootUri": "file:///Users/juliandalcalaf/Development/flutter/packages/integration_test",
"packageUri": "lib/",
"languageVersion": "3.8"
},
{
"name": "leak_tracker",
"rootUri": "file:///Users/juliandalcalaf/.pub-cache/hosted/pub.dev/leak_tracker-11.0.2",
"packageUri": "lib/",
"languageVersion": "3.2"
},
{
"name": "leak_tracker_flutter_testing",
"rootUri": "file:///Users/juliandalcalaf/.pub-cache/hosted/pub.dev/leak_tracker_flutter_testing-3.0.10",
"packageUri": "lib/",
"languageVersion": "3.2"
},
{
"name": "leak_tracker_testing",
"rootUri": "file:///Users/juliandalcalaf/.pub-cache/hosted/pub.dev/leak_tracker_testing-3.0.2",
"packageUri": "lib/",
"languageVersion": "3.2"
},
{
"name": "lints",
"rootUri": "file:///Users/juliandalcalaf/.pub-cache/hosted/pub.dev/lints-4.0.0",
"packageUri": "lib/",
"languageVersion": "3.1"
},
{
"name": "matcher",
"rootUri": "file:///Users/juliandalcalaf/.pub-cache/hosted/pub.dev/matcher-0.12.17",
"packageUri": "lib/",
"languageVersion": "3.4"
},
{
"name": "material_color_utilities",
"rootUri": "file:///Users/juliandalcalaf/.pub-cache/hosted/pub.dev/material_color_utilities-0.11.1",
"packageUri": "lib/",
"languageVersion": "2.17"
},
{
"name": "meta",
"rootUri": "file:///Users/juliandalcalaf/.pub-cache/hosted/pub.dev/meta-1.16.0",
"packageUri": "lib/",
"languageVersion": "2.12"
},
{
"name": "path",
"rootUri": "file:///Users/juliandalcalaf/.pub-cache/hosted/pub.dev/path-1.9.1",
"packageUri": "lib/",
"languageVersion": "3.4"
},
{
"name": "platform",
"rootUri": "file:///Users/juliandalcalaf/.pub-cache/hosted/pub.dev/platform-3.1.5",
"packageUri": "lib/",
"languageVersion": "3.2"
},
{
"name": "plugin_platform_interface",
"rootUri": "file:///Users/juliandalcalaf/.pub-cache/hosted/pub.dev/plugin_platform_interface-2.1.8",
"packageUri": "lib/",
"languageVersion": "3.0"
},
{
"name": "process",
"rootUri": "file:///Users/juliandalcalaf/.pub-cache/hosted/pub.dev/process-5.0.2",
"packageUri": "lib/",
"languageVersion": "3.0"
},
{
"name": "sky_engine",
"rootUri": "file:///Users/juliandalcalaf/Development/flutter/bin/cache/pkg/sky_engine",
"packageUri": "lib/",
"languageVersion": "3.8"
},
{
"name": "source_span",
"rootUri": "file:///Users/juliandalcalaf/.pub-cache/hosted/pub.dev/source_span-1.10.0",
"packageUri": "lib/",
"languageVersion": "2.18"
},
{
"name": "stack_trace",
"rootUri": "file:///Users/juliandalcalaf/.pub-cache/hosted/pub.dev/stack_trace-1.12.1",
"packageUri": "lib/",
"languageVersion": "3.4"
},
{
"name": "stream_channel",
"rootUri": "file:///Users/juliandalcalaf/.pub-cache/hosted/pub.dev/stream_channel-2.1.4",
"packageUri": "lib/",
"languageVersion": "3.3"
},
{
"name": "string_scanner",
"rootUri": "file:///Users/juliandalcalaf/.pub-cache/hosted/pub.dev/string_scanner-1.3.0",
"packageUri": "lib/",
"languageVersion": "3.1"
},
{
"name": "sync_http",
"rootUri": "file:///Users/juliandalcalaf/.pub-cache/hosted/pub.dev/sync_http-0.3.1",
"packageUri": "lib/",
"languageVersion": "2.12"
},
{
"name": "term_glyph",
"rootUri": "file:///Users/juliandalcalaf/.pub-cache/hosted/pub.dev/term_glyph-1.2.1",
"packageUri": "lib/",
"languageVersion": "2.12"
},
{
"name": "test_api",
"rootUri": "file:///Users/juliandalcalaf/.pub-cache/hosted/pub.dev/test_api-0.7.6",
"packageUri": "lib/",
"languageVersion": "3.5"
},
{
"name": "typed_data",
"rootUri": "file:///Users/juliandalcalaf/.pub-cache/hosted/pub.dev/typed_data-1.4.0",
"packageUri": "lib/",
"languageVersion": "3.5"
},
{
"name": "vector_math",
"rootUri": "file:///Users/juliandalcalaf/.pub-cache/hosted/pub.dev/vector_math-2.2.0",
"packageUri": "lib/",
"languageVersion": "3.1"
},
{
"name": "vm_service",
"rootUri": "file:///Users/juliandalcalaf/.pub-cache/hosted/pub.dev/vm_service-14.3.0",
"packageUri": "lib/",
"languageVersion": "3.3"
},
{
"name": "web",
"rootUri": "file:///Users/juliandalcalaf/.pub-cache/hosted/pub.dev/web-1.1.0",
"packageUri": "lib/",
"languageVersion": "3.4"
},
{
"name": "webdriver",
"rootUri": "file:///Users/juliandalcalaf/.pub-cache/hosted/pub.dev/webdriver-3.0.4",
"packageUri": "lib/",
"languageVersion": "3.1"
},
{
"name": "flutter_treezor_entrust_sdk_bridge_example",
"rootUri": "../",
"packageUri": "lib/",
"languageVersion": "3.5"
}
],
"generator": "pub",
"generatorVersion": "3.9.2",
"flutterRoot": "file:///Users/juliandalcalaf/Development/flutter",
"flutterVersion": "3.35.7",
"pubCache": "file:///Users/juliandalcalaf/.pub-cache"
}

View File

@@ -0,0 +1,371 @@
{
"roots": [
"flutter_treezor_entrust_sdk_bridge_example"
],
"packages": [
{
"name": "flutter_treezor_entrust_sdk_bridge_example",
"version": "0.0.0",
"dependencies": [
"crypto",
"cupertino_icons",
"dio",
"flutter",
"flutter_treezor_entrust_sdk_bridge"
],
"devDependencies": [
"flutter_lints",
"flutter_test",
"integration_test"
]
},
{
"name": "flutter_treezor_entrust_sdk_bridge",
"version": "1.0.2",
"dependencies": [
"flutter",
"plugin_platform_interface"
]
},
{
"name": "flutter_lints",
"version": "4.0.0",
"dependencies": [
"lints"
]
},
{
"name": "flutter_test",
"version": "0.0.0",
"dependencies": [
"clock",
"collection",
"fake_async",
"flutter",
"leak_tracker_flutter_testing",
"matcher",
"meta",
"path",
"stack_trace",
"stream_channel",
"test_api",
"vector_math"
]
},
{
"name": "integration_test",
"version": "0.0.0",
"dependencies": [
"flutter",
"flutter_driver",
"flutter_test",
"path",
"vm_service"
]
},
{
"name": "cupertino_icons",
"version": "1.0.8",
"dependencies": []
},
{
"name": "flutter",
"version": "0.0.0",
"dependencies": [
"characters",
"collection",
"material_color_utilities",
"meta",
"sky_engine",
"vector_math"
]
},
{
"name": "dio",
"version": "5.7.0",
"dependencies": [
"async",
"dio_web_adapter",
"http_parser",
"meta",
"path"
]
},
{
"name": "crypto",
"version": "3.0.6",
"dependencies": [
"typed_data"
]
},
{
"name": "plugin_platform_interface",
"version": "2.1.8",
"dependencies": [
"meta"
]
},
{
"name": "lints",
"version": "4.0.0",
"dependencies": []
},
{
"name": "stream_channel",
"version": "2.1.4",
"dependencies": [
"async"
]
},
{
"name": "meta",
"version": "1.16.0",
"dependencies": []
},
{
"name": "collection",
"version": "1.19.1",
"dependencies": []
},
{
"name": "leak_tracker_flutter_testing",
"version": "3.0.10",
"dependencies": [
"flutter",
"leak_tracker",
"leak_tracker_testing",
"matcher",
"meta"
]
},
{
"name": "vector_math",
"version": "2.2.0",
"dependencies": []
},
{
"name": "stack_trace",
"version": "1.12.1",
"dependencies": [
"path"
]
},
{
"name": "clock",
"version": "1.1.2",
"dependencies": []
},
{
"name": "fake_async",
"version": "1.3.3",
"dependencies": [
"clock",
"collection"
]
},
{
"name": "path",
"version": "1.9.1",
"dependencies": []
},
{
"name": "matcher",
"version": "0.12.17",
"dependencies": [
"async",
"meta",
"stack_trace",
"term_glyph",
"test_api"
]
},
{
"name": "test_api",
"version": "0.7.6",
"dependencies": [
"async",
"boolean_selector",
"collection",
"meta",
"source_span",
"stack_trace",
"stream_channel",
"string_scanner",
"term_glyph"
]
},
{
"name": "vm_service",
"version": "14.3.0",
"dependencies": []
},
{
"name": "flutter_driver",
"version": "0.0.0",
"dependencies": [
"file",
"flutter",
"flutter_test",
"fuchsia_remote_debug_protocol",
"matcher",
"meta",
"path",
"vm_service",
"webdriver"
]
},
{
"name": "sky_engine",
"version": "0.0.0",
"dependencies": []
},
{
"name": "material_color_utilities",
"version": "0.11.1",
"dependencies": [
"collection"
]
},
{
"name": "characters",
"version": "1.4.0",
"dependencies": []
},
{
"name": "dio_web_adapter",
"version": "2.0.0",
"dependencies": [
"dio",
"http_parser",
"meta",
"web"
]
},
{
"name": "http_parser",
"version": "4.0.2",
"dependencies": [
"collection",
"source_span",
"string_scanner",
"typed_data"
]
},
{
"name": "async",
"version": "2.11.0",
"dependencies": [
"collection",
"meta"
]
},
{
"name": "typed_data",
"version": "1.4.0",
"dependencies": [
"collection"
]
},
{
"name": "leak_tracker_testing",
"version": "3.0.2",
"dependencies": [
"leak_tracker",
"matcher",
"meta"
]
},
{
"name": "leak_tracker",
"version": "11.0.2",
"dependencies": [
"clock",
"collection",
"meta",
"path",
"vm_service"
]
},
{
"name": "term_glyph",
"version": "1.2.1",
"dependencies": []
},
{
"name": "string_scanner",
"version": "1.3.0",
"dependencies": [
"source_span"
]
},
{
"name": "source_span",
"version": "1.10.0",
"dependencies": [
"collection",
"path",
"term_glyph"
]
},
{
"name": "boolean_selector",
"version": "2.1.1",
"dependencies": [
"source_span",
"string_scanner"
]
},
{
"name": "webdriver",
"version": "3.0.4",
"dependencies": [
"matcher",
"path",
"stack_trace",
"sync_http"
]
},
{
"name": "fuchsia_remote_debug_protocol",
"version": "0.0.0",
"dependencies": [
"meta",
"process",
"vm_service"
]
},
{
"name": "file",
"version": "7.0.0",
"dependencies": [
"meta",
"path"
]
},
{
"name": "web",
"version": "1.1.0",
"dependencies": []
},
{
"name": "sync_http",
"version": "0.3.1",
"dependencies": []
},
{
"name": "process",
"version": "5.0.2",
"dependencies": [
"file",
"path",
"platform"
]
},
{
"name": "platform",
"version": "3.1.5",
"dependencies": []
}
],
"configVersion": 1
}

View File

@@ -0,0 +1 @@
3.35.7

View File

@@ -0,0 +1 @@
{"info":"This is a generated file; do not edit or check into version control.","plugins":{"ios":[{"name":"flutter_treezor_entrust_sdk_bridge","path":"/Users/juliandalcalaf/Desktop/sf-app-platform/packages/flutter_treezor_entrust_sdk_bridge/","native_build":true,"dependencies":[],"dev_dependency":false},{"name":"integration_test","path":"/Users/juliandalcalaf/Development/flutter/packages/integration_test/","native_build":true,"dependencies":[],"dev_dependency":true}],"android":[{"name":"flutter_treezor_entrust_sdk_bridge","path":"/Users/juliandalcalaf/Desktop/sf-app-platform/packages/flutter_treezor_entrust_sdk_bridge/","native_build":true,"dependencies":[],"dev_dependency":false},{"name":"integration_test","path":"/Users/juliandalcalaf/Development/flutter/packages/integration_test/","native_build":true,"dependencies":[],"dev_dependency":true}],"macos":[],"linux":[],"windows":[],"web":[]},"dependencyGraph":[{"name":"flutter_treezor_entrust_sdk_bridge","dependencies":[]},{"name":"integration_test","dependencies":[]}],"date_created":"2026-01-21 11:38:45.748694","version":"3.35.7","swift_package_manager_enabled":{"ios":false,"macos":false}}

View File

@@ -0,0 +1,16 @@
# flutter_treezor_entrust_sdk_bridge_example
Demonstrates how to use the flutter_treezor_entrust_sdk_bridge plugin.
## Getting Started
This project is a starting point for a Flutter application.
A few resources to get you started if this is your first Flutter project:
- [Lab: Write your first Flutter app](https://docs.flutter.dev/get-started/codelab)
- [Cookbook: Useful Flutter samples](https://docs.flutter.dev/cookbook)
For help getting started with Flutter development, view the
[online documentation](https://docs.flutter.dev/), which offers tutorials,
samples, guidance on mobile development, and a full API reference.

View File

@@ -0,0 +1,28 @@
# This file configures the analyzer, which statically analyzes Dart code to
# check for errors, warnings, and lints.
#
# The issues identified by the analyzer are surfaced in the UI of Dart-enabled
# IDEs (https://dart.dev/tools#ides-and-editors). The analyzer can also be
# invoked from the command line by running `flutter analyze`.
# The following line activates a set of recommended lints for Flutter apps,
# packages, and plugins designed to encourage good coding practices.
include: package:flutter_lints/flutter.yaml
linter:
# The lint rules applied to this project can be customized in the
# section below to disable rules from the `package:flutter_lints/flutter.yaml`
# included above or to enable additional rules. A list of all available lints
# and their documentation is published at https://dart.dev/lints.
#
# Instead of disabling a lint rule for the entire project in the
# section below, it can also be suppressed for a single line of code
# or a specific dart file by using the `// ignore: name_of_lint` and
# `// ignore_for_file: name_of_lint` syntax on the line or in the file
# producing the lint.
rules:
# avoid_print: false # Uncomment to disable the `avoid_print` rule
# prefer_single_quotes: true # Uncomment to enable the `prefer_single_quotes` rule
# Additional information about this file can be found at
# https://dart.dev/guides/language/analysis-options

View File

@@ -0,0 +1,50 @@
plugins {
id "com.android.application"
id "kotlin-android"
// The Flutter Gradle Plugin must be applied after the Android and Kotlin Gradle plugins.
id "dev.flutter.flutter-gradle-plugin"
}
android {
namespace = "com.treezor.flutter_treezor_entrust_sdk_bridge_example"
compileSdk = flutter.compileSdkVersion
ndkVersion = flutter.ndkVersion
compileOptions {
sourceCompatibility = JavaVersion.VERSION_1_8
targetCompatibility = JavaVersion.VERSION_1_8
}
kotlinOptions {
jvmTarget = JavaVersion.VERSION_1_8
}
defaultConfig {
// TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html).
applicationId = "com.treezor.flutter_treezor_entrust_sdk_bridge_example"
// You can update the following values to match your application needs.
// For more information, see: https://flutter.dev/to/review-gradle-config.
minSdk = flutter.minSdkVersion
targetSdk = flutter.targetSdkVersion
versionCode = flutter.versionCode
versionName = flutter.versionName
}
buildTypes {
release {
// TODO: Add your own signing config for the release build.
// Signing with the debug keys for now, so `flutter run --release` works.
signingConfig = signingConfigs.debug
}
}
packagingOptions {
jniLibs {
keepDebugSymbols += "*/*/libscm.so"
useLegacyPackaging = true
}
}
}
flutter {
source = "../.."
}

View File

@@ -0,0 +1,7 @@
<manifest xmlns:android="http://schemas.android.com/apk/res/android">
<!-- The INTERNET permission is required for development. Specifically,
the Flutter tool needs it to communicate with the running application
to allow setting breakpoints, to provide hot reload, etc.
-->
<uses-permission android:name="android.permission.INTERNET"/>
</manifest>

View File

@@ -0,0 +1,57 @@
<manifest xmlns:android="http://schemas.android.com/apk/res/android">
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
<uses-permission android:name="android.permission.USE_BIOMETRIC" />
<application
android:label="flutter_treezor_entrust_sdk_bridge_example"
android:name="${applicationName}"
android:icon="@mipmap/ic_launcher">
<activity
android:name=".MainActivity"
android:exported="true"
android:launchMode="singleTop"
android:taskAffinity=""
android:theme="@style/LaunchTheme"
android:configChanges="orientation|keyboardHidden|keyboard|screenSize|smallestScreenSize|locale|layoutDirection|fontScale|screenLayout|density|uiMode"
android:hardwareAccelerated="true"
android:windowSoftInputMode="adjustResize">
<!-- Specifies an Android theme to apply to this Activity as soon as
the Android process has started. This theme is visible to the user
while the Flutter UI initializes. After that, this theme continues
to determine the Window background behind the Flutter UI. -->
<meta-data
android:name="io.flutter.embedding.android.NormalTheme"
android:resource="@style/NormalTheme"
/>
<intent-filter>
<action android:name="android.intent.action.MAIN"/>
<category android:name="android.intent.category.LAUNCHER"/>
</intent-filter>
</activity>
<!-- Don't delete the meta-data below.
This is used by the Flutter tool to generate GeneratedPluginRegistrant.java -->
<meta-data
android:name="flutterEmbedding"
android:value="2" />
<meta-data
android:name="fr.antelop.application_id"
android:value="\4713640103500149457" />
<meta-data
android:name="fr.antelop.issuer_id"
android:value="treezor" />
</application>
<!-- Required to query activities that can process text, see:
https://developer.android.com/training/package-visibility and
https://developer.android.com/reference/android/content/Intent#ACTION_PROCESS_TEXT.
In particular, this is used by the Flutter engine in io.flutter.plugin.text.ProcessTextPlugin. -->
<queries>
<intent>
<action android:name="android.intent.action.PROCESS_TEXT"/>
<data android:mimeType="text/plain"/>
</intent>
</queries>
</manifest>

View File

@@ -0,0 +1,6 @@
package com.treezor.flutter_treezor_entrust_sdk_bridge_example;
import io.flutter.embedding.android.FlutterActivity;
public class MainActivity extends FlutterActivity {
}

View File

@@ -0,0 +1,29 @@
package io.flutter.plugins;
import androidx.annotation.Keep;
import androidx.annotation.NonNull;
import io.flutter.Log;
import io.flutter.embedding.engine.FlutterEngine;
/**
* Generated file. Do not edit.
* This file is generated by the Flutter tool based on the
* plugins that support the Android platform.
*/
@Keep
public final class GeneratedPluginRegistrant {
private static final String TAG = "GeneratedPluginRegistrant";
public static void registerWith(@NonNull FlutterEngine flutterEngine) {
try {
flutterEngine.getPlugins().add(new com.treezor.flutter_treezor_entrust_sdk_bridge.FlutterTreezorEntrustSdkBridgePlugin());
} catch (Exception e) {
Log.e(TAG, "Error registering plugin flutter_treezor_entrust_sdk_bridge, com.treezor.flutter_treezor_entrust_sdk_bridge.FlutterTreezorEntrustSdkBridgePlugin", e);
}
try {
flutterEngine.getPlugins().add(new dev.flutter.plugins.integration_test.IntegrationTestPlugin());
} catch (Exception e) {
Log.e(TAG, "Error registering plugin integration_test, dev.flutter.plugins.integration_test.IntegrationTestPlugin", e);
}
}
}

View File

@@ -0,0 +1,12 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- Modify this file to customize your launch splash screen -->
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
<item android:drawable="?android:colorBackground" />
<!-- You can insert your own image assets here -->
<!-- <item>
<bitmap
android:gravity="center"
android:src="@mipmap/launch_image" />
</item> -->
</layer-list>

View File

@@ -0,0 +1,12 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- Modify this file to customize your launch splash screen -->
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
<item android:drawable="@android:color/white" />
<!-- You can insert your own image assets here -->
<!-- <item>
<bitmap
android:gravity="center"
android:src="@mipmap/launch_image" />
</item> -->
</layer-list>

Binary file not shown.

After

Width:  |  Height:  |  Size: 544 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 442 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 721 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.4 KiB

View File

@@ -0,0 +1,18 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<!-- Theme applied to the Android Window while the process is starting when the OS's Dark Mode setting is on -->
<style name="LaunchTheme" parent="@android:style/Theme.Black.NoTitleBar">
<!-- Show a splash screen on the activity. Automatically removed when
the Flutter engine draws its first frame -->
<item name="android:windowBackground">@drawable/launch_background</item>
</style>
<!-- Theme applied to the Android Window as soon as the process has started.
This theme determines the color of the Android Window while your
Flutter UI initializes, as well as behind your Flutter UI while its
running.
This Theme is only used starting with V2 of Flutter's Android embedding. -->
<style name="NormalTheme" parent="@android:style/Theme.Black.NoTitleBar">
<item name="android:windowBackground">?android:colorBackground</item>
</style>
</resources>

View File

@@ -0,0 +1,18 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<!-- Theme applied to the Android Window while the process is starting when the OS's Dark Mode setting is off -->
<style name="LaunchTheme" parent="@android:style/Theme.Light.NoTitleBar">
<!-- Show a splash screen on the activity. Automatically removed when
the Flutter engine draws its first frame -->
<item name="android:windowBackground">@drawable/launch_background</item>
</style>
<!-- Theme applied to the Android Window as soon as the process has started.
This theme determines the color of the Android Window while your
Flutter UI initializes, as well as behind your Flutter UI while its
running.
This Theme is only used starting with V2 of Flutter's Android embedding. -->
<style name="NormalTheme" parent="@android:style/Theme.Light.NoTitleBar">
<item name="android:windowBackground">?android:colorBackground</item>
</style>
</resources>

View File

@@ -0,0 +1,7 @@
<manifest xmlns:android="http://schemas.android.com/apk/res/android">
<!-- The INTERNET permission is required for development. Specifically,
the Flutter tool needs it to communicate with the running application
to allow setting breakpoints, to provide hot reload, etc.
-->
<uses-permission android:name="android.permission.INTERNET"/>
</manifest>

View File

@@ -0,0 +1,18 @@
allprojects {
repositories {
google()
mavenCentral()
}
}
rootProject.buildDir = "../build"
subprojects {
project.buildDir = "${rootProject.buildDir}/${project.name}"
}
subprojects {
project.evaluationDependsOn(":app")
}
tasks.register("clean", Delete) {
delete rootProject.buildDir
}

View File

@@ -0,0 +1,27 @@
<?xml version="1.0" encoding="UTF-8"?>
<module type="JAVA_MODULE" version="4">
<component name="FacetManager">
<facet type="android" name="Android">
<configuration>
<option name="ALLOW_USER_CONFIGURATION" value="false" />
<option name="GEN_FOLDER_RELATIVE_PATH_APT" value="/gen" />
<option name="GEN_FOLDER_RELATIVE_PATH_AIDL" value="/gen" />
<option name="MANIFEST_FILE_RELATIVE_PATH" value="/app/src/main/AndroidManifest.xml" />
<option name="RES_FOLDER_RELATIVE_PATH" value="/app/src/main/res" />
<option name="ASSETS_FOLDER_RELATIVE_PATH" value="/app/src/main/assets" />
<option name="LIBS_FOLDER_RELATIVE_PATH" value="/app/src/main/libs" />
<option name="PROGUARD_LOGS_FOLDER_RELATIVE_PATH" value="/app/src/main/proguard_logs" />
</configuration>
</facet>
</component>
<component name="NewModuleRootManager" inherit-compiler-output="true">
<exclude-output />
<content url="file://$MODULE_DIR$">
<sourceFolder url="file://$MODULE_DIR$/app/src/main/java" isTestSource="false" />
<sourceFolder url="file://$MODULE_DIR$/gen" isTestSource="false" generated="true" />
</content>
<orderEntry type="jdk" jdkName="Android API 29 Platform" jdkType="Android SDK" />
<orderEntry type="sourceFolder" forTests="false" />
<orderEntry type="library" name="Flutter for Android" level="project" />
</component>
</module>

View File

@@ -0,0 +1,3 @@
org.gradle.jvmargs=-Xmx4G -XX:MaxMetaspaceSize=2G -XX:+HeapDumpOnOutOfMemoryError
android.useAndroidX=true
android.enableJetifier=true

View File

@@ -0,0 +1,5 @@
distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists
distributionUrl=https\://services.gradle.org/distributions/gradle-8.3-all.zip

View File

@@ -0,0 +1,160 @@
#!/usr/bin/env bash
##############################################################################
##
## Gradle start up script for UN*X
##
##############################################################################
# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
DEFAULT_JVM_OPTS=""
APP_NAME="Gradle"
APP_BASE_NAME=`basename "$0"`
# Use the maximum available, or set MAX_FD != -1 to use that value.
MAX_FD="maximum"
warn ( ) {
echo "$*"
}
die ( ) {
echo
echo "$*"
echo
exit 1
}
# OS specific support (must be 'true' or 'false').
cygwin=false
msys=false
darwin=false
case "`uname`" in
CYGWIN* )
cygwin=true
;;
Darwin* )
darwin=true
;;
MINGW* )
msys=true
;;
esac
# Attempt to set APP_HOME
# Resolve links: $0 may be a link
PRG="$0"
# Need this for relative symlinks.
while [ -h "$PRG" ] ; do
ls=`ls -ld "$PRG"`
link=`expr "$ls" : '.*-> \(.*\)$'`
if expr "$link" : '/.*' > /dev/null; then
PRG="$link"
else
PRG=`dirname "$PRG"`"/$link"
fi
done
SAVED="`pwd`"
cd "`dirname \"$PRG\"`/" >/dev/null
APP_HOME="`pwd -P`"
cd "$SAVED" >/dev/null
CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar
# Determine the Java command to use to start the JVM.
if [ -n "$JAVA_HOME" ] ; then
if [ -x "$JAVA_HOME/jre/sh/java" ] ; then
# IBM's JDK on AIX uses strange locations for the executables
JAVACMD="$JAVA_HOME/jre/sh/java"
else
JAVACMD="$JAVA_HOME/bin/java"
fi
if [ ! -x "$JAVACMD" ] ; then
die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME
Please set the JAVA_HOME variable in your environment to match the
location of your Java installation."
fi
else
JAVACMD="java"
which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
Please set the JAVA_HOME variable in your environment to match the
location of your Java installation."
fi
# Increase the maximum file descriptors if we can.
if [ "$cygwin" = "false" -a "$darwin" = "false" ] ; then
MAX_FD_LIMIT=`ulimit -H -n`
if [ $? -eq 0 ] ; then
if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then
MAX_FD="$MAX_FD_LIMIT"
fi
ulimit -n $MAX_FD
if [ $? -ne 0 ] ; then
warn "Could not set maximum file descriptor limit: $MAX_FD"
fi
else
warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT"
fi
fi
# For Darwin, add options to specify how the application appears in the dock
if $darwin; then
GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\""
fi
# For Cygwin, switch paths to Windows format before running java
if $cygwin ; then
APP_HOME=`cygpath --path --mixed "$APP_HOME"`
CLASSPATH=`cygpath --path --mixed "$CLASSPATH"`
JAVACMD=`cygpath --unix "$JAVACMD"`
# We build the pattern for arguments to be converted via cygpath
ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null`
SEP=""
for dir in $ROOTDIRSRAW ; do
ROOTDIRS="$ROOTDIRS$SEP$dir"
SEP="|"
done
OURCYGPATTERN="(^($ROOTDIRS))"
# Add a user-defined pattern to the cygpath arguments
if [ "$GRADLE_CYGPATTERN" != "" ] ; then
OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)"
fi
# Now convert the arguments - kludge to limit ourselves to /bin/sh
i=0
for arg in "$@" ; do
CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -`
CHECK2=`echo "$arg"|egrep -c "^-"` ### Determine if an option
if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then ### Added a condition
eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"`
else
eval `echo args$i`="\"$arg\""
fi
i=$((i+1))
done
case $i in
(0) set -- ;;
(1) set -- "$args0" ;;
(2) set -- "$args0" "$args1" ;;
(3) set -- "$args0" "$args1" "$args2" ;;
(4) set -- "$args0" "$args1" "$args2" "$args3" ;;
(5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;;
(6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;;
(7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;;
(8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;;
(9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;;
esac
fi
# Split up the JVM_OPTS And GRADLE_OPTS values into an array, following the shell quoting and substitution rules
function splitJvmOpts() {
JVM_OPTS=("$@")
}
eval splitJvmOpts $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS
JVM_OPTS[${#JVM_OPTS[*]}]="-Dorg.gradle.appname=$APP_BASE_NAME"
exec "$JAVACMD" "${JVM_OPTS[@]}" -classpath "$CLASSPATH" org.gradle.wrapper.GradleWrapperMain "$@"

View File

@@ -0,0 +1,90 @@
@if "%DEBUG%" == "" @echo off
@rem ##########################################################################
@rem
@rem Gradle startup script for Windows
@rem
@rem ##########################################################################
@rem Set local scope for the variables with windows NT shell
if "%OS%"=="Windows_NT" setlocal
@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
set DEFAULT_JVM_OPTS=
set DIRNAME=%~dp0
if "%DIRNAME%" == "" set DIRNAME=.
set APP_BASE_NAME=%~n0
set APP_HOME=%DIRNAME%
@rem Find java.exe
if defined JAVA_HOME goto findJavaFromJavaHome
set JAVA_EXE=java.exe
%JAVA_EXE% -version >NUL 2>&1
if "%ERRORLEVEL%" == "0" goto init
echo.
echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
echo.
echo Please set the JAVA_HOME variable in your environment to match the
echo location of your Java installation.
goto fail
:findJavaFromJavaHome
set JAVA_HOME=%JAVA_HOME:"=%
set JAVA_EXE=%JAVA_HOME%/bin/java.exe
if exist "%JAVA_EXE%" goto init
echo.
echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME%
echo.
echo Please set the JAVA_HOME variable in your environment to match the
echo location of your Java installation.
goto fail
:init
@rem Get command-line arguments, handling Windowz variants
if not "%OS%" == "Windows_NT" goto win9xME_args
if "%@eval[2+2]" == "4" goto 4NT_args
:win9xME_args
@rem Slurp the command line arguments.
set CMD_LINE_ARGS=
set _SKIP=2
:win9xME_args_slurp
if "x%~1" == "x" goto execute
set CMD_LINE_ARGS=%*
goto execute
:4NT_args
@rem Get arguments from the 4NT Shell from JP Software
set CMD_LINE_ARGS=%$
:execute
@rem Setup the command line
set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar
@rem Execute Gradle
"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS%
:end
@rem End local scope for the variables with windows NT shell
if "%ERRORLEVEL%"=="0" goto mainEnd
:fail
rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of
rem the _cmd.exe /c_ return code!
if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1
exit /b 1
:mainEnd
if "%OS%"=="Windows_NT" endlocal
:omega

View File

@@ -0,0 +1,3 @@
sdk.dir=/Users/juliandalcalaf/Library/Android/sdk
flutter.sdk=/Users/juliandalcalaf/Development/flutter
flutter.buildMode=debug

View File

@@ -0,0 +1,25 @@
pluginManagement {
def flutterSdkPath = {
def properties = new Properties()
file("local.properties").withInputStream { properties.load(it) }
def flutterSdkPath = properties.getProperty("flutter.sdk")
assert flutterSdkPath != null, "flutter.sdk not set in local.properties"
return flutterSdkPath
}()
includeBuild("$flutterSdkPath/packages/flutter_tools/gradle")
repositories {
google()
mavenCentral()
gradlePluginPortal()
}
}
plugins {
id "dev.flutter.flutter-plugin-loader" version "1.0.0"
id "com.android.application" version "8.1.0" apply false
id "org.jetbrains.kotlin.android" version "1.8.22" apply false
}
include ":app"

View File

@@ -0,0 +1,27 @@
<?xml version="1.0" encoding="UTF-8"?>
<module type="JAVA_MODULE" version="4">
<component name="NewModuleRootManager" inherit-compiler-output="true">
<exclude-output />
<content url="file://$MODULE_DIR$">
<sourceFolder url="file://$MODULE_DIR$/lib" isTestSource="false" />
<sourceFolder url="file://$MODULE_DIR$/test" isTestSource="true" />
<excludeFolder url="file://$MODULE_DIR$/.dart_tool" />
<excludeFolder url="file://$MODULE_DIR$/.idea" />
<excludeFolder url="file://$MODULE_DIR$/build" />
<excludeFolder url="file://$MODULE_DIR$/.pub" />
<excludeFolder url="file://$MODULE_DIR$/ios/.symlinks/plugins/integration_test/.dart_tool" />
<excludeFolder url="file://$MODULE_DIR$/ios/.symlinks/plugins/integration_test/.pub" />
<excludeFolder url="file://$MODULE_DIR$/ios/.symlinks/plugins/integration_test/build" />
<excludeFolder url="file://$MODULE_DIR$/ios/.symlinks/plugins/integration_test/example/.dart_tool" />
<excludeFolder url="file://$MODULE_DIR$/ios/.symlinks/plugins/integration_test/example/.pub" />
<excludeFolder url="file://$MODULE_DIR$/ios/.symlinks/plugins/integration_test/example/build" />
<excludeFolder url="file://$MODULE_DIR$/ios/.symlinks/plugins/integration_test/integration_test_macos/.dart_tool" />
<excludeFolder url="file://$MODULE_DIR$/ios/.symlinks/plugins/integration_test/integration_test_macos/.pub" />
<excludeFolder url="file://$MODULE_DIR$/ios/.symlinks/plugins/integration_test/integration_test_macos/build" />
</content>
<orderEntry type="sourceFolder" forTests="false" />
<orderEntry type="library" name="Dart SDK" level="project" />
<orderEntry type="library" name="Flutter Plugins" level="project" />
<orderEntry type="library" name="Dart Packages" level="project" />
</component>
</module>

View File

@@ -0,0 +1,23 @@
// This is a basic Flutter integration test.
//
// Since integration tests run in a full Flutter application, they can interact
// with the host side of a plugin implementation, unlike Dart unit tests.
//
// For more information about Flutter integration tests, please see
// https://flutter.dev/to/integration-testing
import 'package:flutter_test/flutter_test.dart';
import 'package:integration_test/integration_test.dart';
import 'package:flutter_treezor_entrust_sdk_bridge/flutter_treezor_entrust_sdk_bridge.dart';
void main() {
IntegrationTestWidgetsFlutterBinding.ensureInitialized();
testWidgets('getPlatformVersion test', (WidgetTester tester) async {
final FlutterTreezorEntrustSdkBridge plugin = FlutterTreezorEntrustSdkBridge();
// The version string depends on the host platform running the test, so
// just assert that some non-empty string is returned.
});
}

Binary file not shown.

View File

@@ -0,0 +1,26 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>CFBundleDevelopmentRegion</key>
<string>en</string>
<key>CFBundleExecutable</key>
<string>App</string>
<key>CFBundleIdentifier</key>
<string>io.flutter.flutter.app</string>
<key>CFBundleInfoDictionaryVersion</key>
<string>6.0</string>
<key>CFBundleName</key>
<string>App</string>
<key>CFBundlePackageType</key>
<string>FMWK</string>
<key>CFBundleShortVersionString</key>
<string>1.0</string>
<key>CFBundleSignature</key>
<string>????</string>
<key>CFBundleVersion</key>
<string>1.0</string>
<key>MinimumOSVersion</key>
<string>12.0</string>
</dict>
</plist>

View File

@@ -0,0 +1,2 @@
#include? "Pods/Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig"
#include "Generated.xcconfig"

View File

@@ -0,0 +1,14 @@
// This is a generated file; do not edit or check into version control.
FLUTTER_ROOT=/Users/juliandalcalaf/Development/flutter
FLUTTER_APPLICATION_PATH=/Users/juliandalcalaf/Downloads/flutter_treezor_entrust_sdk_bridge/example
COCOAPODS_PARALLEL_CODE_SIGN=true
FLUTTER_TARGET=lib/main.dart
FLUTTER_BUILD_DIR=build
FLUTTER_BUILD_NAME=1.0.0
FLUTTER_BUILD_NUMBER=1
EXCLUDED_ARCHS[sdk=iphonesimulator*]=i386
EXCLUDED_ARCHS[sdk=iphoneos*]=armv7
DART_OBFUSCATION=false
TRACK_WIDGET_CREATION=true
TREE_SHAKE_ICONS=false
PACKAGE_CONFIG=.dart_tool/package_config.json

View File

@@ -0,0 +1,2 @@
#include? "Pods/Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig"
#include "Generated.xcconfig"

View File

@@ -0,0 +1,32 @@
#
# Generated file, do not edit.
#
import lldb
def handle_new_rx_page(frame: lldb.SBFrame, bp_loc, extra_args, intern_dict):
"""Intercept NOTIFY_DEBUGGER_ABOUT_RX_PAGES and touch the pages."""
base = frame.register["x0"].GetValueAsAddress()
page_len = frame.register["x1"].GetValueAsUnsigned()
# Note: NOTIFY_DEBUGGER_ABOUT_RX_PAGES will check contents of the
# first page to see if handled it correctly. This makes diagnosing
# misconfiguration (e.g. missing breakpoint) easier.
data = bytearray(page_len)
data[0:8] = b'IHELPED!'
error = lldb.SBError()
frame.GetThread().GetProcess().WriteMemory(base, data, error)
if not error.Success():
print(f'Failed to write into {base}[+{page_len}]', error)
return
def __lldb_init_module(debugger: lldb.SBDebugger, _):
target = debugger.GetDummyTarget()
# Caveat: must use BreakpointCreateByRegEx here and not
# BreakpointCreateByName. For some reasons callback function does not
# get carried over from dummy target for the later.
bp = target.BreakpointCreateByRegex("^NOTIFY_DEBUGGER_ABOUT_RX_PAGES$")
bp.SetScriptCallbackFunction('{}.handle_new_rx_page'.format(__name__))
bp.SetAutoContinue(True)
print("-- LLDB integration loaded --")

View File

@@ -0,0 +1,5 @@
#
# Generated file, do not edit.
#
command script import --relative-to-command-file flutter_lldb_helper.py

View File

@@ -0,0 +1,13 @@
#!/bin/sh
# This is a generated file; do not edit or check into version control.
export "FLUTTER_ROOT=/Users/juliandalcalaf/Development/flutter"
export "FLUTTER_APPLICATION_PATH=/Users/juliandalcalaf/Downloads/flutter_treezor_entrust_sdk_bridge/example"
export "COCOAPODS_PARALLEL_CODE_SIGN=true"
export "FLUTTER_TARGET=lib/main.dart"
export "FLUTTER_BUILD_DIR=build"
export "FLUTTER_BUILD_NAME=1.0.0"
export "FLUTTER_BUILD_NUMBER=1"
export "DART_OBFUSCATION=false"
export "TRACK_WIDGET_CREATION=true"
export "TREE_SHAKE_ICONS=false"
export "PACKAGE_CONFIG=.dart_tool/package_config.json"

View File

@@ -0,0 +1,44 @@
# Uncomment this line to define a global platform for your project
# platform :ios, '12.0'
# CocoaPods analytics sends network stats synchronously affecting flutter build latency.
ENV['COCOAPODS_DISABLE_STATS'] = 'true'
project 'Runner', {
'Debug' => :debug,
'Profile' => :release,
'Release' => :release,
}
def flutter_root
generated_xcode_build_settings_path = File.expand_path(File.join('..', 'Flutter', 'Generated.xcconfig'), __FILE__)
unless File.exist?(generated_xcode_build_settings_path)
raise "#{generated_xcode_build_settings_path} must exist. If you're running pod install manually, make sure flutter pub get is executed first"
end
File.foreach(generated_xcode_build_settings_path) do |line|
matches = line.match(/FLUTTER_ROOT\=(.*)/)
return matches[1].strip if matches
end
raise "FLUTTER_ROOT not found in #{generated_xcode_build_settings_path}. Try deleting Generated.xcconfig, then run flutter pub get"
end
require File.expand_path(File.join('packages', 'flutter_tools', 'bin', 'podhelper'), flutter_root)
flutter_ios_podfile_setup
target 'Runner' do
use_frameworks!
use_modular_headers!
flutter_install_all_ios_pods File.dirname(File.realpath(__FILE__))
target 'RunnerTests' do
inherit! :search_paths
end
end
post_install do |installer|
installer.pods_project.targets.each do |target|
flutter_additional_ios_build_settings(target)
end
end

View File

@@ -0,0 +1,28 @@
PODS:
- Flutter (1.0.0)
- flutter_treezor_entrust_sdk_bridge (0.0.1):
- Flutter
- integration_test (0.0.1):
- Flutter
DEPENDENCIES:
- Flutter (from `Flutter`)
- flutter_treezor_entrust_sdk_bridge (from `.symlinks/plugins/flutter_treezor_entrust_sdk_bridge/ios`)
- integration_test (from `.symlinks/plugins/integration_test/ios`)
EXTERNAL SOURCES:
Flutter:
:path: Flutter
flutter_treezor_entrust_sdk_bridge:
:path: ".symlinks/plugins/flutter_treezor_entrust_sdk_bridge/ios"
integration_test:
:path: ".symlinks/plugins/integration_test/ios"
SPEC CHECKSUMS:
Flutter: e0871f40cf51350855a761d2e70bf5af5b9b5de7
flutter_treezor_entrust_sdk_bridge: acace23d4485490eb60fc35ca23559c4c1ab7e83
integration_test: 4a889634ef21a45d28d50d622cf412dc6d9f586e
PODFILE CHECKSUM: 819463e6a0290f5a72f145ba7cde16e8b6ef0796
COCOAPODS: 1.16.2

View File

@@ -0,0 +1,746 @@
// !$*UTF8*$!
{
archiveVersion = 1;
classes = {
};
objectVersion = 54;
objects = {
/* Begin PBXBuildFile section */
1498D2341E8E89220040F4C2 /* GeneratedPluginRegistrant.m in Sources */ = {isa = PBXBuildFile; fileRef = 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */; };
331C808B294A63AB00263BE5 /* RunnerTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 331C807B294A618700263BE5 /* RunnerTests.swift */; };
3B3967161E833CAA004F5970 /* AppFrameworkInfo.plist in Resources */ = {isa = PBXBuildFile; fileRef = 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */; };
74858FAF1ED2DC5600515810 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 74858FAE1ED2DC5600515810 /* AppDelegate.swift */; };
77F0FF292CE8E2AD000E5F12 /* AntelopRelease.plist in Resources */ = {isa = PBXBuildFile; fileRef = 77F0FF282CE8E2AD000E5F12 /* AntelopRelease.plist */; };
97C146FC1CF9000F007C117D /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FA1CF9000F007C117D /* Main.storyboard */; };
97C146FE1CF9000F007C117D /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FD1CF9000F007C117D /* Assets.xcassets */; };
97C147011CF9000F007C117D /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */; };
AFDAF82A7F1A542CC1AFAC6D /* Pods_Runner.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = BCA65477799FB49AB9AC8FFF /* Pods_Runner.framework */; };
C4BF47E714B4722F39CB3F07 /* Pods_RunnerTests.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 6FC648CE04F06E0C51808071 /* Pods_RunnerTests.framework */; };
/* End PBXBuildFile section */
/* Begin PBXContainerItemProxy section */
331C8085294A63A400263BE5 /* PBXContainerItemProxy */ = {
isa = PBXContainerItemProxy;
containerPortal = 97C146E61CF9000F007C117D /* Project object */;
proxyType = 1;
remoteGlobalIDString = 97C146ED1CF9000F007C117D;
remoteInfo = Runner;
};
/* End PBXContainerItemProxy section */
/* Begin PBXCopyFilesBuildPhase section */
77ECBD3E2DB93D6700EADBC1 /* Embed Foundation Extensions */ = {
isa = PBXCopyFilesBuildPhase;
buildActionMask = 2147483647;
dstPath = "";
dstSubfolderSpec = 13;
files = (
);
name = "Embed Foundation Extensions";
runOnlyForDeploymentPostprocessing = 0;
};
/* End PBXCopyFilesBuildPhase section */
/* Begin PBXFileReference section */
02E7AC75B6A7BDEF145133FE /* Pods-Runner.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.debug.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig"; sourceTree = "<group>"; };
133BBA06A983F2C5040EC4DE /* Pods-RunnerTests.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.debug.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.debug.xcconfig"; sourceTree = "<group>"; };
1498D2321E8E86230040F4C2 /* GeneratedPluginRegistrant.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = GeneratedPluginRegistrant.h; sourceTree = "<group>"; };
1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = GeneratedPluginRegistrant.m; sourceTree = "<group>"; };
2DCA66A701932027209F694D /* Pods-Runner.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.profile.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.profile.xcconfig"; sourceTree = "<group>"; };
331C807B294A618700263BE5 /* RunnerTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RunnerTests.swift; sourceTree = "<group>"; };
331C8081294A63A400263BE5 /* RunnerTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = RunnerTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; };
3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = AppFrameworkInfo.plist; path = Flutter/AppFrameworkInfo.plist; sourceTree = "<group>"; };
417F62AE62BF3D6744A452AE /* Pods-Runner.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.release.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig"; sourceTree = "<group>"; };
6FC648CE04F06E0C51808071 /* Pods_RunnerTests.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_RunnerTests.framework; sourceTree = BUILT_PRODUCTS_DIR; };
74858FAD1ED2DC5600515810 /* Runner-Bridging-Header.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "Runner-Bridging-Header.h"; sourceTree = "<group>"; };
74858FAE1ED2DC5600515810 /* AppDelegate.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = "<group>"; };
77ECBD132DB92B6F00EADBC1 /* AntelopSDK.xcframework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.xcframework; name = AntelopSDK.xcframework; path = .symlinks/plugins/flutter_treezor_entrust_sdk_bridge/ios/../../../../../../ios/AntelopSDK.xcframework; sourceTree = "<group>"; };
77ECBD172DB92B7200EADBC1 /* SecureCModule.xcframework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.xcframework; name = SecureCModule.xcframework; path = .symlinks/plugins/flutter_treezor_entrust_sdk_bridge/ios/../../../../../../ios/SecureCModule.xcframework; sourceTree = "<group>"; };
77F0FF282CE8E2AD000E5F12 /* AntelopRelease.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = AntelopRelease.plist; sourceTree = "<group>"; };
77F0FF2A2CE8E300000E5F12 /* Runner.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = Runner.entitlements; sourceTree = "<group>"; };
7AFA3C8E1D35360C0083082E /* Release.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; name = Release.xcconfig; path = Flutter/Release.xcconfig; sourceTree = "<group>"; };
9740EEB21CF90195004384FC /* Debug.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = Debug.xcconfig; path = Flutter/Debug.xcconfig; sourceTree = "<group>"; };
9740EEB31CF90195004384FC /* Generated.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = Generated.xcconfig; path = Flutter/Generated.xcconfig; sourceTree = "<group>"; };
97C146EE1CF9000F007C117D /* Runner.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = Runner.app; sourceTree = BUILT_PRODUCTS_DIR; };
97C146FB1CF9000F007C117D /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = "<group>"; };
97C146FD1CF9000F007C117D /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = "<group>"; };
97C147001CF9000F007C117D /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = "<group>"; };
97C147021CF9000F007C117D /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = "<group>"; };
99C84349C0FFE6466CEC5675 /* Pods_PushExtension.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_PushExtension.framework; sourceTree = BUILT_PRODUCTS_DIR; };
BCA65477799FB49AB9AC8FFF /* Pods_Runner.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_Runner.framework; sourceTree = BUILT_PRODUCTS_DIR; };
EB83C806B041E697DB761E4E /* Pods-RunnerTests.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.profile.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.profile.xcconfig"; sourceTree = "<group>"; };
F5B7333FE22DBFA78D8B43B3 /* Pods-RunnerTests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.release.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.release.xcconfig"; sourceTree = "<group>"; };
/* End PBXFileReference section */
/* Begin PBXFrameworksBuildPhase section */
51D678D7D3128114E52E4BB8 /* Frameworks */ = {
isa = PBXFrameworksBuildPhase;
buildActionMask = 2147483647;
files = (
C4BF47E714B4722F39CB3F07 /* Pods_RunnerTests.framework in Frameworks */,
);
runOnlyForDeploymentPostprocessing = 0;
};
97C146EB1CF9000F007C117D /* Frameworks */ = {
isa = PBXFrameworksBuildPhase;
buildActionMask = 2147483647;
files = (
AFDAF82A7F1A542CC1AFAC6D /* Pods_Runner.framework in Frameworks */,
);
runOnlyForDeploymentPostprocessing = 0;
};
/* End PBXFrameworksBuildPhase section */
/* Begin PBXGroup section */
331C8082294A63A400263BE5 /* RunnerTests */ = {
isa = PBXGroup;
children = (
331C807B294A618700263BE5 /* RunnerTests.swift */,
);
path = RunnerTests;
sourceTree = "<group>";
};
9740EEB11CF90186004384FC /* Flutter */ = {
isa = PBXGroup;
children = (
3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */,
9740EEB21CF90195004384FC /* Debug.xcconfig */,
7AFA3C8E1D35360C0083082E /* Release.xcconfig */,
9740EEB31CF90195004384FC /* Generated.xcconfig */,
);
name = Flutter;
sourceTree = "<group>";
};
97C146E51CF9000F007C117D = {
isa = PBXGroup;
children = (
9740EEB11CF90186004384FC /* Flutter */,
97C146F01CF9000F007C117D /* Runner */,
97C146EF1CF9000F007C117D /* Products */,
331C8082294A63A400263BE5 /* RunnerTests */,
AC109A7B3C0657D06DC46B41 /* Pods */,
FBED2C9DDE0E6AC06441273A /* Frameworks */,
);
sourceTree = "<group>";
};
97C146EF1CF9000F007C117D /* Products */ = {
isa = PBXGroup;
children = (
97C146EE1CF9000F007C117D /* Runner.app */,
331C8081294A63A400263BE5 /* RunnerTests.xctest */,
);
name = Products;
sourceTree = "<group>";
};
97C146F01CF9000F007C117D /* Runner */ = {
isa = PBXGroup;
children = (
77F0FF2A2CE8E300000E5F12 /* Runner.entitlements */,
97C146FA1CF9000F007C117D /* Main.storyboard */,
97C146FD1CF9000F007C117D /* Assets.xcassets */,
97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */,
97C147021CF9000F007C117D /* Info.plist */,
1498D2321E8E86230040F4C2 /* GeneratedPluginRegistrant.h */,
1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */,
74858FAE1ED2DC5600515810 /* AppDelegate.swift */,
74858FAD1ED2DC5600515810 /* Runner-Bridging-Header.h */,
77F0FF282CE8E2AD000E5F12 /* AntelopRelease.plist */,
);
path = Runner;
sourceTree = "<group>";
};
AC109A7B3C0657D06DC46B41 /* Pods */ = {
isa = PBXGroup;
children = (
02E7AC75B6A7BDEF145133FE /* Pods-Runner.debug.xcconfig */,
417F62AE62BF3D6744A452AE /* Pods-Runner.release.xcconfig */,
2DCA66A701932027209F694D /* Pods-Runner.profile.xcconfig */,
133BBA06A983F2C5040EC4DE /* Pods-RunnerTests.debug.xcconfig */,
F5B7333FE22DBFA78D8B43B3 /* Pods-RunnerTests.release.xcconfig */,
EB83C806B041E697DB761E4E /* Pods-RunnerTests.profile.xcconfig */,
);
path = Pods;
sourceTree = "<group>";
};
FBED2C9DDE0E6AC06441273A /* Frameworks */ = {
isa = PBXGroup;
children = (
77ECBD172DB92B7200EADBC1 /* SecureCModule.xcframework */,
77ECBD132DB92B6F00EADBC1 /* AntelopSDK.xcframework */,
BCA65477799FB49AB9AC8FFF /* Pods_Runner.framework */,
6FC648CE04F06E0C51808071 /* Pods_RunnerTests.framework */,
99C84349C0FFE6466CEC5675 /* Pods_PushExtension.framework */,
);
name = Frameworks;
sourceTree = "<group>";
};
/* End PBXGroup section */
/* Begin PBXNativeTarget section */
331C8080294A63A400263BE5 /* RunnerTests */ = {
isa = PBXNativeTarget;
buildConfigurationList = 331C8087294A63A400263BE5 /* Build configuration list for PBXNativeTarget "RunnerTests" */;
buildPhases = (
794191FBEC175AF37F9CE4C8 /* [CP] Check Pods Manifest.lock */,
331C807D294A63A400263BE5 /* Sources */,
331C807F294A63A400263BE5 /* Resources */,
51D678D7D3128114E52E4BB8 /* Frameworks */,
);
buildRules = (
);
dependencies = (
331C8086294A63A400263BE5 /* PBXTargetDependency */,
);
name = RunnerTests;
productName = RunnerTests;
productReference = 331C8081294A63A400263BE5 /* RunnerTests.xctest */;
productType = "com.apple.product-type.bundle.unit-test";
};
97C146ED1CF9000F007C117D /* Runner */ = {
isa = PBXNativeTarget;
buildConfigurationList = 97C147051CF9000F007C117D /* Build configuration list for PBXNativeTarget "Runner" */;
buildPhases = (
F8D4F3EC164159763EDFD510 /* [CP] Check Pods Manifest.lock */,
9740EEB61CF901F6004384FC /* Run Script */,
97C146EA1CF9000F007C117D /* Sources */,
97C146EB1CF9000F007C117D /* Frameworks */,
97C146EC1CF9000F007C117D /* Resources */,
3B06AD1E1E4923F5004D2608 /* Thin Binary */,
88FEBD599DB398AC59C0EE3F /* [CP] Embed Pods Frameworks */,
77ECBD3E2DB93D6700EADBC1 /* Embed Foundation Extensions */,
);
buildRules = (
);
dependencies = (
);
name = Runner;
productName = Runner;
productReference = 97C146EE1CF9000F007C117D /* Runner.app */;
productType = "com.apple.product-type.application";
};
/* End PBXNativeTarget section */
/* Begin PBXProject section */
97C146E61CF9000F007C117D /* Project object */ = {
isa = PBXProject;
attributes = {
BuildIndependentTargetsInParallel = YES;
LastSwiftUpdateCheck = 1620;
LastUpgradeCheck = 1510;
ORGANIZATIONNAME = "";
TargetAttributes = {
331C8080294A63A400263BE5 = {
CreatedOnToolsVersion = 14.0;
TestTargetID = 97C146ED1CF9000F007C117D;
};
97C146ED1CF9000F007C117D = {
CreatedOnToolsVersion = 7.3.1;
LastSwiftMigration = 1100;
};
};
};
buildConfigurationList = 97C146E91CF9000F007C117D /* Build configuration list for PBXProject "Runner" */;
compatibilityVersion = "Xcode 9.3";
developmentRegion = en;
hasScannedForEncodings = 0;
knownRegions = (
en,
Base,
);
mainGroup = 97C146E51CF9000F007C117D;
productRefGroup = 97C146EF1CF9000F007C117D /* Products */;
projectDirPath = "";
projectRoot = "";
targets = (
97C146ED1CF9000F007C117D /* Runner */,
331C8080294A63A400263BE5 /* RunnerTests */,
);
};
/* End PBXProject section */
/* Begin PBXResourcesBuildPhase section */
331C807F294A63A400263BE5 /* Resources */ = {
isa = PBXResourcesBuildPhase;
buildActionMask = 2147483647;
files = (
);
runOnlyForDeploymentPostprocessing = 0;
};
97C146EC1CF9000F007C117D /* Resources */ = {
isa = PBXResourcesBuildPhase;
buildActionMask = 2147483647;
files = (
97C147011CF9000F007C117D /* LaunchScreen.storyboard in Resources */,
3B3967161E833CAA004F5970 /* AppFrameworkInfo.plist in Resources */,
97C146FE1CF9000F007C117D /* Assets.xcassets in Resources */,
77F0FF292CE8E2AD000E5F12 /* AntelopRelease.plist in Resources */,
97C146FC1CF9000F007C117D /* Main.storyboard in Resources */,
);
runOnlyForDeploymentPostprocessing = 0;
};
/* End PBXResourcesBuildPhase section */
/* Begin PBXShellScriptBuildPhase section */
3B06AD1E1E4923F5004D2608 /* Thin Binary */ = {
isa = PBXShellScriptBuildPhase;
alwaysOutOfDate = 1;
buildActionMask = 2147483647;
files = (
);
inputPaths = (
"${TARGET_BUILD_DIR}/${INFOPLIST_PATH}",
);
name = "Thin Binary";
outputPaths = (
);
runOnlyForDeploymentPostprocessing = 0;
shellPath = /bin/sh;
shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" embed_and_thin";
};
794191FBEC175AF37F9CE4C8 /* [CP] Check Pods Manifest.lock */ = {
isa = PBXShellScriptBuildPhase;
buildActionMask = 2147483647;
files = (
);
inputFileListPaths = (
);
inputPaths = (
"${PODS_PODFILE_DIR_PATH}/Podfile.lock",
"${PODS_ROOT}/Manifest.lock",
);
name = "[CP] Check Pods Manifest.lock";
outputFileListPaths = (
);
outputPaths = (
"$(DERIVED_FILE_DIR)/Pods-RunnerTests-checkManifestLockResult.txt",
);
runOnlyForDeploymentPostprocessing = 0;
shellPath = /bin/sh;
shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n";
showEnvVarsInLog = 0;
};
88FEBD599DB398AC59C0EE3F /* [CP] Embed Pods Frameworks */ = {
isa = PBXShellScriptBuildPhase;
buildActionMask = 2147483647;
files = (
);
inputFileListPaths = (
"${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks-${CONFIGURATION}-input-files.xcfilelist",
);
name = "[CP] Embed Pods Frameworks";
outputFileListPaths = (
"${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks-${CONFIGURATION}-output-files.xcfilelist",
);
runOnlyForDeploymentPostprocessing = 0;
shellPath = /bin/sh;
shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks.sh\"\n";
showEnvVarsInLog = 0;
};
9740EEB61CF901F6004384FC /* Run Script */ = {
isa = PBXShellScriptBuildPhase;
alwaysOutOfDate = 1;
buildActionMask = 2147483647;
files = (
);
inputPaths = (
);
name = "Run Script";
outputPaths = (
);
runOnlyForDeploymentPostprocessing = 0;
shellPath = /bin/sh;
shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" build";
};
F8D4F3EC164159763EDFD510 /* [CP] Check Pods Manifest.lock */ = {
isa = PBXShellScriptBuildPhase;
buildActionMask = 2147483647;
files = (
);
inputFileListPaths = (
);
inputPaths = (
"${PODS_PODFILE_DIR_PATH}/Podfile.lock",
"${PODS_ROOT}/Manifest.lock",
);
name = "[CP] Check Pods Manifest.lock";
outputFileListPaths = (
);
outputPaths = (
"$(DERIVED_FILE_DIR)/Pods-Runner-checkManifestLockResult.txt",
);
runOnlyForDeploymentPostprocessing = 0;
shellPath = /bin/sh;
shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n";
showEnvVarsInLog = 0;
};
/* End PBXShellScriptBuildPhase section */
/* Begin PBXSourcesBuildPhase section */
331C807D294A63A400263BE5 /* Sources */ = {
isa = PBXSourcesBuildPhase;
buildActionMask = 2147483647;
files = (
331C808B294A63AB00263BE5 /* RunnerTests.swift in Sources */,
);
runOnlyForDeploymentPostprocessing = 0;
};
97C146EA1CF9000F007C117D /* Sources */ = {
isa = PBXSourcesBuildPhase;
buildActionMask = 2147483647;
files = (
74858FAF1ED2DC5600515810 /* AppDelegate.swift in Sources */,
1498D2341E8E89220040F4C2 /* GeneratedPluginRegistrant.m in Sources */,
);
runOnlyForDeploymentPostprocessing = 0;
};
/* End PBXSourcesBuildPhase section */
/* Begin PBXTargetDependency section */
331C8086294A63A400263BE5 /* PBXTargetDependency */ = {
isa = PBXTargetDependency;
target = 97C146ED1CF9000F007C117D /* Runner */;
targetProxy = 331C8085294A63A400263BE5 /* PBXContainerItemProxy */;
};
/* End PBXTargetDependency section */
/* Begin PBXVariantGroup section */
97C146FA1CF9000F007C117D /* Main.storyboard */ = {
isa = PBXVariantGroup;
children = (
97C146FB1CF9000F007C117D /* Base */,
);
name = Main.storyboard;
sourceTree = "<group>";
};
97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */ = {
isa = PBXVariantGroup;
children = (
97C147001CF9000F007C117D /* Base */,
);
name = LaunchScreen.storyboard;
sourceTree = "<group>";
};
/* End PBXVariantGroup section */
/* Begin XCBuildConfiguration section */
249021D3217E4FDB00AE95B9 /* Profile */ = {
isa = XCBuildConfiguration;
buildSettings = {
ALWAYS_SEARCH_USER_PATHS = NO;
ASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = YES;
CLANG_ANALYZER_NONNULL = YES;
CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x";
CLANG_CXX_LIBRARY = "libc++";
CLANG_ENABLE_MODULES = YES;
CLANG_ENABLE_OBJC_ARC = YES;
CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;
CLANG_WARN_BOOL_CONVERSION = YES;
CLANG_WARN_COMMA = YES;
CLANG_WARN_CONSTANT_CONVERSION = YES;
CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;
CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
CLANG_WARN_EMPTY_BODY = YES;
CLANG_WARN_ENUM_CONVERSION = YES;
CLANG_WARN_INFINITE_RECURSION = YES;
CLANG_WARN_INT_CONVERSION = YES;
CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;
CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;
CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
CLANG_WARN_STRICT_PROTOTYPES = YES;
CLANG_WARN_SUSPICIOUS_MOVE = YES;
CLANG_WARN_UNREACHABLE_CODE = YES;
CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer";
COPY_PHASE_STRIP = NO;
DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
ENABLE_NS_ASSERTIONS = NO;
ENABLE_STRICT_OBJC_MSGSEND = YES;
ENABLE_USER_SCRIPT_SANDBOXING = NO;
GCC_C_LANGUAGE_STANDARD = gnu99;
GCC_NO_COMMON_BLOCKS = YES;
GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
GCC_WARN_UNDECLARED_SELECTOR = YES;
GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
GCC_WARN_UNUSED_FUNCTION = YES;
GCC_WARN_UNUSED_VARIABLE = YES;
IPHONEOS_DEPLOYMENT_TARGET = 12.0;
MTL_ENABLE_DEBUG_INFO = NO;
SDKROOT = iphoneos;
SUPPORTED_PLATFORMS = iphoneos;
TARGETED_DEVICE_FAMILY = "1,2";
VALIDATE_PRODUCT = YES;
};
name = Profile;
};
249021D4217E4FDB00AE95B9 /* Profile */ = {
isa = XCBuildConfiguration;
baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */;
buildSettings = {
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
CLANG_ENABLE_MODULES = YES;
CODE_SIGN_ENTITLEMENTS = Runner/Runner.entitlements;
CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)";
DEVELOPMENT_TEAM = A2XKAF4NGP;
ENABLE_BITCODE = NO;
INFOPLIST_FILE = Runner/Info.plist;
LD_RUNPATH_SEARCH_PATHS = (
"$(inherited)",
"@executable_path/Frameworks",
);
PRODUCT_BUNDLE_IDENTIFIER = co.treezor.sca.integration;
PRODUCT_NAME = "$(TARGET_NAME)";
SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h";
SWIFT_VERSION = 5.0;
VERSIONING_SYSTEM = "apple-generic";
};
name = Profile;
};
331C8088294A63A400263BE5 /* Debug */ = {
isa = XCBuildConfiguration;
baseConfigurationReference = 133BBA06A983F2C5040EC4DE /* Pods-RunnerTests.debug.xcconfig */;
buildSettings = {
BUNDLE_LOADER = "$(TEST_HOST)";
CODE_SIGN_STYLE = Automatic;
CURRENT_PROJECT_VERSION = 1;
GENERATE_INFOPLIST_FILE = YES;
MARKETING_VERSION = 1.0;
PRODUCT_BUNDLE_IDENTIFIER = com.treezor.flutterTreezorEntrustSdkBridgeExample.RunnerTests;
PRODUCT_NAME = "$(TARGET_NAME)";
SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG;
SWIFT_OPTIMIZATION_LEVEL = "-Onone";
SWIFT_VERSION = 5.0;
TEST_HOST = "$(BUILT_PRODUCTS_DIR)/Runner.app/$(BUNDLE_EXECUTABLE_FOLDER_PATH)/Runner";
};
name = Debug;
};
331C8089294A63A400263BE5 /* Release */ = {
isa = XCBuildConfiguration;
baseConfigurationReference = F5B7333FE22DBFA78D8B43B3 /* Pods-RunnerTests.release.xcconfig */;
buildSettings = {
BUNDLE_LOADER = "$(TEST_HOST)";
CODE_SIGN_STYLE = Automatic;
CURRENT_PROJECT_VERSION = 1;
GENERATE_INFOPLIST_FILE = YES;
MARKETING_VERSION = 1.0;
PRODUCT_BUNDLE_IDENTIFIER = com.treezor.flutterTreezorEntrustSdkBridgeExample.RunnerTests;
PRODUCT_NAME = "$(TARGET_NAME)";
SWIFT_VERSION = 5.0;
TEST_HOST = "$(BUILT_PRODUCTS_DIR)/Runner.app/$(BUNDLE_EXECUTABLE_FOLDER_PATH)/Runner";
};
name = Release;
};
331C808A294A63A400263BE5 /* Profile */ = {
isa = XCBuildConfiguration;
baseConfigurationReference = EB83C806B041E697DB761E4E /* Pods-RunnerTests.profile.xcconfig */;
buildSettings = {
BUNDLE_LOADER = "$(TEST_HOST)";
CODE_SIGN_STYLE = Automatic;
CURRENT_PROJECT_VERSION = 1;
GENERATE_INFOPLIST_FILE = YES;
MARKETING_VERSION = 1.0;
PRODUCT_BUNDLE_IDENTIFIER = com.treezor.flutterTreezorEntrustSdkBridgeExample.RunnerTests;
PRODUCT_NAME = "$(TARGET_NAME)";
SWIFT_VERSION = 5.0;
TEST_HOST = "$(BUILT_PRODUCTS_DIR)/Runner.app/$(BUNDLE_EXECUTABLE_FOLDER_PATH)/Runner";
};
name = Profile;
};
97C147031CF9000F007C117D /* Debug */ = {
isa = XCBuildConfiguration;
buildSettings = {
ALWAYS_SEARCH_USER_PATHS = NO;
ASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = YES;
CLANG_ANALYZER_NONNULL = YES;
CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x";
CLANG_CXX_LIBRARY = "libc++";
CLANG_ENABLE_MODULES = YES;
CLANG_ENABLE_OBJC_ARC = YES;
CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;
CLANG_WARN_BOOL_CONVERSION = YES;
CLANG_WARN_COMMA = YES;
CLANG_WARN_CONSTANT_CONVERSION = YES;
CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;
CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
CLANG_WARN_EMPTY_BODY = YES;
CLANG_WARN_ENUM_CONVERSION = YES;
CLANG_WARN_INFINITE_RECURSION = YES;
CLANG_WARN_INT_CONVERSION = YES;
CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;
CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;
CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
CLANG_WARN_STRICT_PROTOTYPES = YES;
CLANG_WARN_SUSPICIOUS_MOVE = YES;
CLANG_WARN_UNREACHABLE_CODE = YES;
CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer";
COPY_PHASE_STRIP = NO;
DEBUG_INFORMATION_FORMAT = dwarf;
ENABLE_STRICT_OBJC_MSGSEND = YES;
ENABLE_TESTABILITY = YES;
ENABLE_USER_SCRIPT_SANDBOXING = NO;
GCC_C_LANGUAGE_STANDARD = gnu99;
GCC_DYNAMIC_NO_PIC = NO;
GCC_NO_COMMON_BLOCKS = YES;
GCC_OPTIMIZATION_LEVEL = 0;
GCC_PREPROCESSOR_DEFINITIONS = (
"DEBUG=1",
"$(inherited)",
);
GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
GCC_WARN_UNDECLARED_SELECTOR = YES;
GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
GCC_WARN_UNUSED_FUNCTION = YES;
GCC_WARN_UNUSED_VARIABLE = YES;
IPHONEOS_DEPLOYMENT_TARGET = 12.0;
MTL_ENABLE_DEBUG_INFO = YES;
ONLY_ACTIVE_ARCH = YES;
SDKROOT = iphoneos;
TARGETED_DEVICE_FAMILY = "1,2";
};
name = Debug;
};
97C147041CF9000F007C117D /* Release */ = {
isa = XCBuildConfiguration;
buildSettings = {
ALWAYS_SEARCH_USER_PATHS = NO;
ASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = YES;
CLANG_ANALYZER_NONNULL = YES;
CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x";
CLANG_CXX_LIBRARY = "libc++";
CLANG_ENABLE_MODULES = YES;
CLANG_ENABLE_OBJC_ARC = YES;
CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;
CLANG_WARN_BOOL_CONVERSION = YES;
CLANG_WARN_COMMA = YES;
CLANG_WARN_CONSTANT_CONVERSION = YES;
CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;
CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
CLANG_WARN_EMPTY_BODY = YES;
CLANG_WARN_ENUM_CONVERSION = YES;
CLANG_WARN_INFINITE_RECURSION = YES;
CLANG_WARN_INT_CONVERSION = YES;
CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;
CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;
CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
CLANG_WARN_STRICT_PROTOTYPES = YES;
CLANG_WARN_SUSPICIOUS_MOVE = YES;
CLANG_WARN_UNREACHABLE_CODE = YES;
CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer";
COPY_PHASE_STRIP = NO;
DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
ENABLE_NS_ASSERTIONS = NO;
ENABLE_STRICT_OBJC_MSGSEND = YES;
ENABLE_USER_SCRIPT_SANDBOXING = NO;
GCC_C_LANGUAGE_STANDARD = gnu99;
GCC_NO_COMMON_BLOCKS = YES;
GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
GCC_WARN_UNDECLARED_SELECTOR = YES;
GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
GCC_WARN_UNUSED_FUNCTION = YES;
GCC_WARN_UNUSED_VARIABLE = YES;
IPHONEOS_DEPLOYMENT_TARGET = 12.0;
MTL_ENABLE_DEBUG_INFO = NO;
SDKROOT = iphoneos;
SUPPORTED_PLATFORMS = iphoneos;
SWIFT_COMPILATION_MODE = wholemodule;
SWIFT_OPTIMIZATION_LEVEL = "-O";
TARGETED_DEVICE_FAMILY = "1,2";
VALIDATE_PRODUCT = YES;
};
name = Release;
};
97C147061CF9000F007C117D /* Debug */ = {
isa = XCBuildConfiguration;
baseConfigurationReference = 9740EEB21CF90195004384FC /* Debug.xcconfig */;
buildSettings = {
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
CLANG_ENABLE_MODULES = YES;
CODE_SIGN_ENTITLEMENTS = Runner/Runner.entitlements;
CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)";
DEVELOPMENT_TEAM = A2XKAF4NGP;
ENABLE_BITCODE = NO;
INFOPLIST_FILE = Runner/Info.plist;
LD_RUNPATH_SEARCH_PATHS = (
"$(inherited)",
"@executable_path/Frameworks",
);
PRODUCT_BUNDLE_IDENTIFIER = co.treezor.sca.integration;
PRODUCT_NAME = "$(TARGET_NAME)";
SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h";
SWIFT_OPTIMIZATION_LEVEL = "-Onone";
SWIFT_VERSION = 5.0;
VERSIONING_SYSTEM = "apple-generic";
};
name = Debug;
};
97C147071CF9000F007C117D /* Release */ = {
isa = XCBuildConfiguration;
baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */;
buildSettings = {
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
CLANG_ENABLE_MODULES = YES;
CODE_SIGN_ENTITLEMENTS = Runner/Runner.entitlements;
CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)";
DEVELOPMENT_TEAM = A2XKAF4NGP;
ENABLE_BITCODE = NO;
INFOPLIST_FILE = Runner/Info.plist;
LD_RUNPATH_SEARCH_PATHS = (
"$(inherited)",
"@executable_path/Frameworks",
);
PRODUCT_BUNDLE_IDENTIFIER = co.treezor.sca.integration;
PRODUCT_NAME = "$(TARGET_NAME)";
SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h";
SWIFT_VERSION = 5.0;
VERSIONING_SYSTEM = "apple-generic";
};
name = Release;
};
/* End XCBuildConfiguration section */
/* Begin XCConfigurationList section */
331C8087294A63A400263BE5 /* Build configuration list for PBXNativeTarget "RunnerTests" */ = {
isa = XCConfigurationList;
buildConfigurations = (
331C8088294A63A400263BE5 /* Debug */,
331C8089294A63A400263BE5 /* Release */,
331C808A294A63A400263BE5 /* Profile */,
);
defaultConfigurationIsVisible = 0;
defaultConfigurationName = Release;
};
97C146E91CF9000F007C117D /* Build configuration list for PBXProject "Runner" */ = {
isa = XCConfigurationList;
buildConfigurations = (
97C147031CF9000F007C117D /* Debug */,
97C147041CF9000F007C117D /* Release */,
249021D3217E4FDB00AE95B9 /* Profile */,
);
defaultConfigurationIsVisible = 0;
defaultConfigurationName = Release;
};
97C147051CF9000F007C117D /* Build configuration list for PBXNativeTarget "Runner" */ = {
isa = XCConfigurationList;
buildConfigurations = (
97C147061CF9000F007C117D /* Debug */,
97C147071CF9000F007C117D /* Release */,
249021D4217E4FDB00AE95B9 /* Profile */,
);
defaultConfigurationIsVisible = 0;
defaultConfigurationName = Release;
};
/* End XCConfigurationList section */
};
rootObject = 97C146E61CF9000F007C117D /* Project object */;
}

View File

@@ -0,0 +1,7 @@
<?xml version="1.0" encoding="UTF-8"?>
<Workspace
version = "1.0">
<FileRef
location = "self:">
</FileRef>
</Workspace>

View File

@@ -0,0 +1,8 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>IDEDidComputeMac32BitWarning</key>
<true/>
</dict>
</plist>

View File

@@ -0,0 +1,8 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>PreviewsEnabled</key>
<false/>
</dict>
</plist>

View File

@@ -0,0 +1,98 @@
<?xml version="1.0" encoding="UTF-8"?>
<Scheme
LastUpgradeVersion = "1510"
version = "1.3">
<BuildAction
parallelizeBuildables = "YES"
buildImplicitDependencies = "YES">
<BuildActionEntries>
<BuildActionEntry
buildForTesting = "YES"
buildForRunning = "YES"
buildForProfiling = "YES"
buildForArchiving = "YES"
buildForAnalyzing = "YES">
<BuildableReference
BuildableIdentifier = "primary"
BlueprintIdentifier = "97C146ED1CF9000F007C117D"
BuildableName = "Runner.app"
BlueprintName = "Runner"
ReferencedContainer = "container:Runner.xcodeproj">
</BuildableReference>
</BuildActionEntry>
</BuildActionEntries>
</BuildAction>
<TestAction
buildConfiguration = "Debug"
selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
shouldUseLaunchSchemeArgsEnv = "YES">
<MacroExpansion>
<BuildableReference
BuildableIdentifier = "primary"
BlueprintIdentifier = "97C146ED1CF9000F007C117D"
BuildableName = "Runner.app"
BlueprintName = "Runner"
ReferencedContainer = "container:Runner.xcodeproj">
</BuildableReference>
</MacroExpansion>
<Testables>
<TestableReference
skipped = "NO"
parallelizable = "YES">
<BuildableReference
BuildableIdentifier = "primary"
BlueprintIdentifier = "331C8080294A63A400263BE5"
BuildableName = "RunnerTests.xctest"
BlueprintName = "RunnerTests"
ReferencedContainer = "container:Runner.xcodeproj">
</BuildableReference>
</TestableReference>
</Testables>
</TestAction>
<LaunchAction
buildConfiguration = "Debug"
selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
launchStyle = "0"
useCustomWorkingDirectory = "NO"
ignoresPersistentStateOnLaunch = "NO"
debugDocumentVersioning = "YES"
debugServiceExtension = "internal"
allowLocationSimulation = "YES">
<BuildableProductRunnable
runnableDebuggingMode = "0">
<BuildableReference
BuildableIdentifier = "primary"
BlueprintIdentifier = "97C146ED1CF9000F007C117D"
BuildableName = "Runner.app"
BlueprintName = "Runner"
ReferencedContainer = "container:Runner.xcodeproj">
</BuildableReference>
</BuildableProductRunnable>
</LaunchAction>
<ProfileAction
buildConfiguration = "Profile"
shouldUseLaunchSchemeArgsEnv = "YES"
savedToolIdentifier = ""
useCustomWorkingDirectory = "NO"
debugDocumentVersioning = "YES">
<BuildableProductRunnable
runnableDebuggingMode = "0">
<BuildableReference
BuildableIdentifier = "primary"
BlueprintIdentifier = "97C146ED1CF9000F007C117D"
BuildableName = "Runner.app"
BlueprintName = "Runner"
ReferencedContainer = "container:Runner.xcodeproj">
</BuildableReference>
</BuildableProductRunnable>
</ProfileAction>
<AnalyzeAction
buildConfiguration = "Debug">
</AnalyzeAction>
<ArchiveAction
buildConfiguration = "Release"
revealArchiveInOrganizer = "YES">
</ArchiveAction>
</Scheme>

View File

@@ -0,0 +1,19 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>SchemeUserState</key>
<dict>
<key>PushExtension.xcscheme_^#shared#^_</key>
<dict>
<key>orderHint</key>
<integer>6</integer>
</dict>
<key>Runner.xcscheme_^#shared#^_</key>
<dict>
<key>orderHint</key>
<integer>0</integer>
</dict>
</dict>
</dict>
</plist>

View File

@@ -0,0 +1,10 @@
<?xml version="1.0" encoding="UTF-8"?>
<Workspace
version = "1.0">
<FileRef
location = "group:Runner.xcodeproj">
</FileRef>
<FileRef
location = "group:Pods/Pods.xcodeproj">
</FileRef>
</Workspace>

View File

@@ -0,0 +1,8 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>IDEDidComputeMac32BitWarning</key>
<true/>
</dict>
</plist>

View File

@@ -0,0 +1,8 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>PreviewsEnabled</key>
<false/>
</dict>
</plist>

View File

@@ -0,0 +1,18 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>fr.antelop.alertLoggingEnabled</key>
<string>The Antelop SDK is logging.</string>
<key>fr.antelop.applicationGroupIdentifier</key>
<string>group.com.treezor.scaintegration</string>
<key>fr.antelop.initialConnectionTimeout</key>
<integer>60</integer>
<key>fr.antelop.application_id</key>
<integer>1602804620702911917</integer>
<key>fr.antelop.issuer_id</key>
<string>treezor</string>
<key>fr.antelop.teamIdentifier</key>
<string>A2XKAF4NGP</string>
</dict>
</plist>

View File

@@ -0,0 +1,46 @@
import Flutter
import UIKit
import AntelopSDK
@main
@objc class AppDelegate: FlutterAppDelegate {
override func application(
_ application: UIApplication,
didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?
) -> Bool {
GeneratedPluginRegistrant.register(with: self)
AntelopAppDelegate.shared.application(application, didFinishLaunchingWithOptions: launchOptions)
return super.application(application, didFinishLaunchingWithOptions: launchOptions)
}
override func applicationDidBecomeActive(_ application: UIApplication) {
// Restart any tasks that were paused (or not yet started) while the application was inactive. If the application was previously in the background, optionally refresh the user interface.
AntelopAppDelegate.shared.applicationDidBecomeActive(application)
}
override func applicationWillTerminate(_ application: UIApplication) {
// Called when the application is about to terminate. Save data if appropriate. See also applicationDidEnterBackground:.
AntelopAppDelegate.shared.applicationWillTerminate(application)
}
override func application(_ application: UIApplication, didRegisterForRemoteNotificationsWithDeviceToken deviceToken: Data) {
//you can retreive the deviceToken for you own Server side push
//Link to AntelopSDK
AntelopAppDelegate.shared.application(application, didRegisterForRemoteNotificationsWithDeviceToken: deviceToken)
}
override func application(_ application: UIApplication, didReceiveRemoteNotification userInfo: [AnyHashable : Any], fetchCompletionHandler completionHandler: @escaping (UIBackgroundFetchResult) -> Void) {
guard !AntelopAppDelegate.shared.didReceiveRemoteNotification(userInfo, fetchCompletionHandler: completionHandler) else {
// Notification is directed to the Antelop SDK, it will take responsability for calling the Completion Handler.
return
}
// This notification is yours, you must call the Completion Handler at some point.
// Your processing ...
//completionHandler(...)
}
override func application(_ application: UIApplication, performFetchWithCompletionHandler completionHandler: @escaping (UIBackgroundFetchResult) -> Void) {
AntelopAppDelegate.shared.application(application, performFetchWithCompletionHandler: completionHandler)
}
}

View File

@@ -0,0 +1,122 @@
{
"images" : [
{
"size" : "20x20",
"idiom" : "iphone",
"filename" : "Icon-App-20x20@2x.png",
"scale" : "2x"
},
{
"size" : "20x20",
"idiom" : "iphone",
"filename" : "Icon-App-20x20@3x.png",
"scale" : "3x"
},
{
"size" : "29x29",
"idiom" : "iphone",
"filename" : "Icon-App-29x29@1x.png",
"scale" : "1x"
},
{
"size" : "29x29",
"idiom" : "iphone",
"filename" : "Icon-App-29x29@2x.png",
"scale" : "2x"
},
{
"size" : "29x29",
"idiom" : "iphone",
"filename" : "Icon-App-29x29@3x.png",
"scale" : "3x"
},
{
"size" : "40x40",
"idiom" : "iphone",
"filename" : "Icon-App-40x40@2x.png",
"scale" : "2x"
},
{
"size" : "40x40",
"idiom" : "iphone",
"filename" : "Icon-App-40x40@3x.png",
"scale" : "3x"
},
{
"size" : "60x60",
"idiom" : "iphone",
"filename" : "Icon-App-60x60@2x.png",
"scale" : "2x"
},
{
"size" : "60x60",
"idiom" : "iphone",
"filename" : "Icon-App-60x60@3x.png",
"scale" : "3x"
},
{
"size" : "20x20",
"idiom" : "ipad",
"filename" : "Icon-App-20x20@1x.png",
"scale" : "1x"
},
{
"size" : "20x20",
"idiom" : "ipad",
"filename" : "Icon-App-20x20@2x.png",
"scale" : "2x"
},
{
"size" : "29x29",
"idiom" : "ipad",
"filename" : "Icon-App-29x29@1x.png",
"scale" : "1x"
},
{
"size" : "29x29",
"idiom" : "ipad",
"filename" : "Icon-App-29x29@2x.png",
"scale" : "2x"
},
{
"size" : "40x40",
"idiom" : "ipad",
"filename" : "Icon-App-40x40@1x.png",
"scale" : "1x"
},
{
"size" : "40x40",
"idiom" : "ipad",
"filename" : "Icon-App-40x40@2x.png",
"scale" : "2x"
},
{
"size" : "76x76",
"idiom" : "ipad",
"filename" : "Icon-App-76x76@1x.png",
"scale" : "1x"
},
{
"size" : "76x76",
"idiom" : "ipad",
"filename" : "Icon-App-76x76@2x.png",
"scale" : "2x"
},
{
"size" : "83.5x83.5",
"idiom" : "ipad",
"filename" : "Icon-App-83.5x83.5@2x.png",
"scale" : "2x"
},
{
"size" : "1024x1024",
"idiom" : "ios-marketing",
"filename" : "Icon-App-1024x1024@1x.png",
"scale" : "1x"
}
],
"info" : {
"version" : 1,
"author" : "xcode"
}
}

Some files were not shown because too many files have changed in this diff Show More