Compare commits
9 Commits
v2.0.8
...
aeon-0.2.0
Author | SHA1 | Date | |
---|---|---|---|
![]() |
137a3a3ddc | ||
![]() |
67f24673b1 | ||
![]() |
1b9aac7526 | ||
![]() |
b68c425bae | ||
![]() |
cf58072c6c | ||
![]() |
6960347014 | ||
![]() |
cc5a8969d6 | ||
![]() |
c0ebf6c318 | ||
![]() |
4aa46d8cf9 |
@@ -3,13 +3,11 @@ jobs:
|
|||||||
build:
|
build:
|
||||||
working_directory: ~/code
|
working_directory: ~/code
|
||||||
docker:
|
docker:
|
||||||
- image: circleci/android:api-28-ndk
|
- image: bitriseio/android-ndk
|
||||||
environment:
|
environment:
|
||||||
JVM_OPTS: -Xmx3200m
|
JVM_OPTS: -Xmx3200m
|
||||||
steps:
|
steps:
|
||||||
- checkout
|
- checkout
|
||||||
- run: yes | sdkmanager --licenses || exit 0
|
|
||||||
- run: yes | sdkmanager --update || exit 0
|
|
||||||
- restore_cache:
|
- restore_cache:
|
||||||
key: jars-{{ checksum "build.gradle" }}-{{ checksum "app/build.gradle" }}
|
key: jars-{{ checksum "build.gradle" }}-{{ checksum "app/build.gradle" }}
|
||||||
- run:
|
- run:
|
||||||
|
9
.gitignore
vendored
@@ -6,13 +6,4 @@
|
|||||||
/captures
|
/captures
|
||||||
.externalNativeBuild
|
.externalNativeBuild
|
||||||
.DS_Store
|
.DS_Store
|
||||||
/app/build
|
|
||||||
/app/release
|
/app/release
|
||||||
/app/alpha
|
|
||||||
/app/prod
|
|
||||||
/app/alphaMainnet
|
|
||||||
/app/prodMainnet
|
|
||||||
/app/alphaStagenet
|
|
||||||
/app/prodStagenet
|
|
||||||
/app/.cxx
|
|
||||||
/monerujo.id
|
|
||||||
|
18
.idea/gradle.xml
generated
Normal file
@@ -0,0 +1,18 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<project version="4">
|
||||||
|
<component name="GradleSettings">
|
||||||
|
<option name="linkedExternalProjectsSettings">
|
||||||
|
<GradleProjectSettings>
|
||||||
|
<option name="distributionType" value="DEFAULT_WRAPPED" />
|
||||||
|
<option name="externalProjectPath" value="$PROJECT_DIR$" />
|
||||||
|
<option name="modules">
|
||||||
|
<set>
|
||||||
|
<option value="$PROJECT_DIR$" />
|
||||||
|
<option value="$PROJECT_DIR$/app" />
|
||||||
|
</set>
|
||||||
|
</option>
|
||||||
|
<option name="resolveModulePerSourceSet" value="false" />
|
||||||
|
</GradleProjectSettings>
|
||||||
|
</option>
|
||||||
|
</component>
|
||||||
|
</project>
|
9
.idea/modules.xml
generated
Normal file
@@ -0,0 +1,9 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<project version="4">
|
||||||
|
<component name="ProjectModuleManager">
|
||||||
|
<modules>
|
||||||
|
<module fileurl="file://$PROJECT_DIR$/aeonwallet.iml" filepath="$PROJECT_DIR$/aeonwallet.iml" />
|
||||||
|
<module fileurl="file://$PROJECT_DIR$/app/app.iml" filepath="$PROJECT_DIR$/app/app.iml" />
|
||||||
|
</modules>
|
||||||
|
</component>
|
||||||
|
</project>
|
12
.idea/runConfigurations.xml
generated
Normal file
@@ -0,0 +1,12 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<project version="4">
|
||||||
|
<component name="RunConfigurationProducerService">
|
||||||
|
<option name="ignoredProducers">
|
||||||
|
<set>
|
||||||
|
<option value="org.jetbrains.plugins.gradle.execution.test.runner.AllInPackageGradleConfigurationProducer" />
|
||||||
|
<option value="org.jetbrains.plugins.gradle.execution.test.runner.TestClassGradleConfigurationProducer" />
|
||||||
|
<option value="org.jetbrains.plugins.gradle.execution.test.runner.TestMethodGradleConfigurationProducer" />
|
||||||
|
</set>
|
||||||
|
</option>
|
||||||
|
</component>
|
||||||
|
</project>
|
6
.idea/vcs.xml
generated
Normal file
@@ -0,0 +1,6 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<project version="4">
|
||||||
|
<component name="VcsDirectoryMappings">
|
||||||
|
<mapping directory="$PROJECT_DIR$" vcs="Git" />
|
||||||
|
</component>
|
||||||
|
</project>
|
3
app/.gitignore
vendored
Normal file
@@ -0,0 +1,3 @@
|
|||||||
|
.externalNativeBuild
|
||||||
|
build
|
||||||
|
app.iml
|
@@ -7,25 +7,17 @@ add_library( monerujo
|
|||||||
|
|
||||||
set(EXTERNAL_LIBS_DIR ${CMAKE_SOURCE_DIR}/../external-libs)
|
set(EXTERNAL_LIBS_DIR ${CMAKE_SOURCE_DIR}/../external-libs)
|
||||||
|
|
||||||
############
|
|
||||||
# libsodium
|
|
||||||
############
|
|
||||||
|
|
||||||
add_library(sodium STATIC IMPORTED)
|
|
||||||
set_target_properties(sodium PROPERTIES IMPORTED_LOCATION
|
|
||||||
${EXTERNAL_LIBS_DIR}/${ANDROID_ABI}/libsodium.a)
|
|
||||||
|
|
||||||
############
|
############
|
||||||
# OpenSSL
|
# OpenSSL
|
||||||
############
|
############
|
||||||
|
|
||||||
add_library(crypto STATIC IMPORTED)
|
add_library(crypto STATIC IMPORTED)
|
||||||
set_target_properties(crypto PROPERTIES IMPORTED_LOCATION
|
set_target_properties(crypto PROPERTIES IMPORTED_LOCATION
|
||||||
${EXTERNAL_LIBS_DIR}/${ANDROID_ABI}/libcrypto.a)
|
${EXTERNAL_LIBS_DIR}/openssl/lib/${ANDROID_ABI}/libcrypto.a)
|
||||||
|
|
||||||
add_library(ssl STATIC IMPORTED)
|
add_library(ssl STATIC IMPORTED)
|
||||||
set_target_properties(ssl PROPERTIES IMPORTED_LOCATION
|
set_target_properties(ssl PROPERTIES IMPORTED_LOCATION
|
||||||
${EXTERNAL_LIBS_DIR}/${ANDROID_ABI}/libssl.a)
|
${EXTERNAL_LIBS_DIR}/openssl/lib/${ANDROID_ABI}/libssl.a)
|
||||||
|
|
||||||
############
|
############
|
||||||
# Boost
|
# Boost
|
||||||
@@ -33,143 +25,119 @@ set_target_properties(ssl PROPERTIES IMPORTED_LOCATION
|
|||||||
|
|
||||||
add_library(boost_chrono STATIC IMPORTED)
|
add_library(boost_chrono STATIC IMPORTED)
|
||||||
set_target_properties(boost_chrono PROPERTIES IMPORTED_LOCATION
|
set_target_properties(boost_chrono PROPERTIES IMPORTED_LOCATION
|
||||||
${EXTERNAL_LIBS_DIR}/${ANDROID_ABI}/libboost_chrono.a)
|
${EXTERNAL_LIBS_DIR}/boost/lib/${ANDROID_ABI}/libboost_chrono.a)
|
||||||
|
|
||||||
add_library(boost_date_time STATIC IMPORTED)
|
add_library(boost_date_time STATIC IMPORTED)
|
||||||
set_target_properties(boost_date_time PROPERTIES IMPORTED_LOCATION
|
set_target_properties(boost_date_time PROPERTIES IMPORTED_LOCATION
|
||||||
${EXTERNAL_LIBS_DIR}/${ANDROID_ABI}/libboost_date_time.a)
|
${EXTERNAL_LIBS_DIR}/boost/lib/${ANDROID_ABI}/libboost_date_time.a)
|
||||||
|
|
||||||
add_library(boost_filesystem STATIC IMPORTED)
|
add_library(boost_filesystem STATIC IMPORTED)
|
||||||
set_target_properties(boost_filesystem PROPERTIES IMPORTED_LOCATION
|
set_target_properties(boost_filesystem PROPERTIES IMPORTED_LOCATION
|
||||||
${EXTERNAL_LIBS_DIR}/${ANDROID_ABI}/libboost_filesystem.a)
|
${EXTERNAL_LIBS_DIR}/boost/lib/${ANDROID_ABI}/libboost_filesystem.a)
|
||||||
|
|
||||||
add_library(boost_program_options STATIC IMPORTED)
|
add_library(boost_program_options STATIC IMPORTED)
|
||||||
set_target_properties(boost_program_options PROPERTIES IMPORTED_LOCATION
|
set_target_properties(boost_program_options PROPERTIES IMPORTED_LOCATION
|
||||||
${EXTERNAL_LIBS_DIR}/${ANDROID_ABI}/libboost_program_options.a)
|
${EXTERNAL_LIBS_DIR}/boost/lib/${ANDROID_ABI}/libboost_program_options.a)
|
||||||
|
|
||||||
add_library(boost_regex STATIC IMPORTED)
|
add_library(boost_regex STATIC IMPORTED)
|
||||||
set_target_properties(boost_regex PROPERTIES IMPORTED_LOCATION
|
set_target_properties(boost_regex PROPERTIES IMPORTED_LOCATION
|
||||||
${EXTERNAL_LIBS_DIR}/${ANDROID_ABI}/libboost_regex.a)
|
${EXTERNAL_LIBS_DIR}/boost/lib/${ANDROID_ABI}/libboost_regex.a)
|
||||||
|
|
||||||
add_library(boost_serialization STATIC IMPORTED)
|
add_library(boost_serialization STATIC IMPORTED)
|
||||||
set_target_properties(boost_serialization PROPERTIES IMPORTED_LOCATION
|
set_target_properties(boost_serialization PROPERTIES IMPORTED_LOCATION
|
||||||
${EXTERNAL_LIBS_DIR}/${ANDROID_ABI}/libboost_serialization.a)
|
${EXTERNAL_LIBS_DIR}/boost/lib/${ANDROID_ABI}/libboost_serialization.a)
|
||||||
|
|
||||||
add_library(boost_system STATIC IMPORTED)
|
add_library(boost_system STATIC IMPORTED)
|
||||||
set_target_properties(boost_system PROPERTIES IMPORTED_LOCATION
|
set_target_properties(boost_system PROPERTIES IMPORTED_LOCATION
|
||||||
${EXTERNAL_LIBS_DIR}/${ANDROID_ABI}/libboost_system.a)
|
${EXTERNAL_LIBS_DIR}/boost/lib/${ANDROID_ABI}/libboost_system.a)
|
||||||
|
|
||||||
add_library(boost_thread STATIC IMPORTED)
|
add_library(boost_thread STATIC IMPORTED)
|
||||||
set_target_properties(boost_thread PROPERTIES IMPORTED_LOCATION
|
set_target_properties(boost_thread PROPERTIES IMPORTED_LOCATION
|
||||||
${EXTERNAL_LIBS_DIR}/${ANDROID_ABI}/libboost_thread.a)
|
${EXTERNAL_LIBS_DIR}/boost/lib/${ANDROID_ABI}/libboost_thread.a)
|
||||||
|
|
||||||
add_library(boost_wserialization STATIC IMPORTED)
|
add_library(boost_wserialization STATIC IMPORTED)
|
||||||
set_target_properties(boost_wserialization PROPERTIES IMPORTED_LOCATION
|
set_target_properties(boost_wserialization PROPERTIES IMPORTED_LOCATION
|
||||||
${EXTERNAL_LIBS_DIR}/${ANDROID_ABI}/libboost_wserialization.a)
|
${EXTERNAL_LIBS_DIR}/boost/lib/${ANDROID_ABI}/libboost_wserialization.a)
|
||||||
|
|
||||||
#############
|
#############
|
||||||
# Monero
|
# Aeon
|
||||||
#############
|
#############
|
||||||
|
|
||||||
add_library(wallet_api STATIC IMPORTED)
|
add_library(wallet_api STATIC IMPORTED)
|
||||||
set_target_properties(wallet_api PROPERTIES IMPORTED_LOCATION
|
set_target_properties(wallet_api PROPERTIES IMPORTED_LOCATION
|
||||||
${EXTERNAL_LIBS_DIR}/${ANDROID_ABI}/monero/libwallet_api.a)
|
${EXTERNAL_LIBS_DIR}/aeon/lib/${ANDROID_ABI}/libwallet_api.a)
|
||||||
|
|
||||||
add_library(wallet STATIC IMPORTED)
|
add_library(wallet STATIC IMPORTED)
|
||||||
set_target_properties(wallet PROPERTIES IMPORTED_LOCATION
|
set_target_properties(wallet PROPERTIES IMPORTED_LOCATION
|
||||||
${EXTERNAL_LIBS_DIR}/${ANDROID_ABI}/monero/libwallet.a)
|
${EXTERNAL_LIBS_DIR}/aeon/lib/${ANDROID_ABI}/libwallet.a)
|
||||||
|
|
||||||
add_library(cryptonote_core STATIC IMPORTED)
|
add_library(cryptonote_core STATIC IMPORTED)
|
||||||
set_target_properties(cryptonote_core PROPERTIES IMPORTED_LOCATION
|
set_target_properties(cryptonote_core PROPERTIES IMPORTED_LOCATION
|
||||||
${EXTERNAL_LIBS_DIR}/${ANDROID_ABI}/monero/libcryptonote_core.a)
|
${EXTERNAL_LIBS_DIR}/aeon/lib/${ANDROID_ABI}/libcryptonote_core.a)
|
||||||
|
|
||||||
add_library(cryptonote_basic STATIC IMPORTED)
|
add_library(cryptonote_basic STATIC IMPORTED)
|
||||||
set_target_properties(cryptonote_basic PROPERTIES IMPORTED_LOCATION
|
set_target_properties(cryptonote_basic PROPERTIES IMPORTED_LOCATION
|
||||||
${EXTERNAL_LIBS_DIR}/${ANDROID_ABI}/monero/libcryptonote_basic.a)
|
${EXTERNAL_LIBS_DIR}/aeon/lib/${ANDROID_ABI}/libcryptonote_basic.a)
|
||||||
|
|
||||||
add_library(mnemonics STATIC IMPORTED)
|
add_library(mnemonics STATIC IMPORTED)
|
||||||
set_target_properties(mnemonics PROPERTIES IMPORTED_LOCATION
|
set_target_properties(mnemonics PROPERTIES IMPORTED_LOCATION
|
||||||
${EXTERNAL_LIBS_DIR}/${ANDROID_ABI}/monero/libmnemonics.a)
|
${EXTERNAL_LIBS_DIR}/aeon/lib/${ANDROID_ABI}/libmnemonics.a)
|
||||||
|
|
||||||
add_library(common STATIC IMPORTED)
|
add_library(common STATIC IMPORTED)
|
||||||
set_target_properties(common PROPERTIES IMPORTED_LOCATION
|
set_target_properties(common PROPERTIES IMPORTED_LOCATION
|
||||||
${EXTERNAL_LIBS_DIR}/${ANDROID_ABI}/monero/libcommon.a)
|
${EXTERNAL_LIBS_DIR}/aeon/lib/${ANDROID_ABI}/libcommon.a)
|
||||||
|
|
||||||
add_library(cncrypto STATIC IMPORTED)
|
add_library(cncrypto STATIC IMPORTED)
|
||||||
set_target_properties(cncrypto PROPERTIES IMPORTED_LOCATION
|
set_target_properties(cncrypto PROPERTIES IMPORTED_LOCATION
|
||||||
${EXTERNAL_LIBS_DIR}/${ANDROID_ABI}/monero/libcncrypto.a)
|
${EXTERNAL_LIBS_DIR}/aeon/lib/${ANDROID_ABI}/libcncrypto.a)
|
||||||
|
|
||||||
add_library(ringct STATIC IMPORTED)
|
add_library(ringct STATIC IMPORTED)
|
||||||
set_target_properties(ringct PROPERTIES IMPORTED_LOCATION
|
set_target_properties(ringct PROPERTIES IMPORTED_LOCATION
|
||||||
${EXTERNAL_LIBS_DIR}/${ANDROID_ABI}/monero/libringct.a)
|
${EXTERNAL_LIBS_DIR}/aeon/lib/${ANDROID_ABI}/libringct.a)
|
||||||
|
|
||||||
add_library(ringct_basic STATIC IMPORTED)
|
add_library(ringct_basic STATIC IMPORTED)
|
||||||
set_target_properties(ringct_basic PROPERTIES IMPORTED_LOCATION
|
set_target_properties(ringct_basic PROPERTIES IMPORTED_LOCATION
|
||||||
${EXTERNAL_LIBS_DIR}/${ANDROID_ABI}/monero/libringct_basic.a)
|
${EXTERNAL_LIBS_DIR}/aeon/lib/${ANDROID_ABI}/libringct_basic.a)
|
||||||
|
|
||||||
add_library(blockchain_db STATIC IMPORTED)
|
add_library(blockchain_db STATIC IMPORTED)
|
||||||
set_target_properties(blockchain_db PROPERTIES IMPORTED_LOCATION
|
set_target_properties(blockchain_db PROPERTIES IMPORTED_LOCATION
|
||||||
${EXTERNAL_LIBS_DIR}/${ANDROID_ABI}/monero/libblockchain_db.a)
|
${EXTERNAL_LIBS_DIR}/aeon/lib/${ANDROID_ABI}/libblockchain_db.a)
|
||||||
|
|
||||||
add_library(lmdb STATIC IMPORTED)
|
add_library(lmdb STATIC IMPORTED)
|
||||||
set_target_properties(lmdb PROPERTIES IMPORTED_LOCATION
|
set_target_properties(lmdb PROPERTIES IMPORTED_LOCATION
|
||||||
${EXTERNAL_LIBS_DIR}/${ANDROID_ABI}/monero/liblmdb.a)
|
${EXTERNAL_LIBS_DIR}/aeon/lib/${ANDROID_ABI}/liblmdb.a)
|
||||||
|
|
||||||
add_library(easylogging STATIC IMPORTED)
|
add_library(easylogging STATIC IMPORTED)
|
||||||
set_target_properties(easylogging PROPERTIES IMPORTED_LOCATION
|
set_target_properties(easylogging PROPERTIES IMPORTED_LOCATION
|
||||||
${EXTERNAL_LIBS_DIR}/${ANDROID_ABI}/monero/libeasylogging.a)
|
${EXTERNAL_LIBS_DIR}/aeon/lib/${ANDROID_ABI}/libeasylogging.a)
|
||||||
|
|
||||||
add_library(unbound STATIC IMPORTED)
|
add_library(unbound STATIC IMPORTED)
|
||||||
set_target_properties(unbound PROPERTIES IMPORTED_LOCATION
|
set_target_properties(unbound PROPERTIES IMPORTED_LOCATION
|
||||||
${EXTERNAL_LIBS_DIR}/${ANDROID_ABI}/monero/libunbound.a)
|
${EXTERNAL_LIBS_DIR}/aeon/lib/${ANDROID_ABI}/libunbound.a)
|
||||||
|
|
||||||
add_library(epee STATIC IMPORTED)
|
add_library(epee STATIC IMPORTED)
|
||||||
set_target_properties(epee PROPERTIES IMPORTED_LOCATION
|
set_target_properties(epee PROPERTIES IMPORTED_LOCATION
|
||||||
${EXTERNAL_LIBS_DIR}/${ANDROID_ABI}/monero/libepee.a)
|
${EXTERNAL_LIBS_DIR}/aeon/lib/${ANDROID_ABI}/libepee.a)
|
||||||
|
|
||||||
add_library(blocks STATIC IMPORTED)
|
add_library(blocks STATIC IMPORTED)
|
||||||
set_target_properties(blocks PROPERTIES IMPORTED_LOCATION
|
set_target_properties(blocks PROPERTIES IMPORTED_LOCATION
|
||||||
${EXTERNAL_LIBS_DIR}/${ANDROID_ABI}/monero/libblocks.a)
|
${EXTERNAL_LIBS_DIR}/aeon/lib/${ANDROID_ABI}/libblocks.a)
|
||||||
|
|
||||||
add_library(checkpoints STATIC IMPORTED)
|
add_library(checkpoints STATIC IMPORTED)
|
||||||
set_target_properties(checkpoints PROPERTIES IMPORTED_LOCATION
|
set_target_properties(checkpoints PROPERTIES IMPORTED_LOCATION
|
||||||
${EXTERNAL_LIBS_DIR}/${ANDROID_ABI}/monero/libcheckpoints.a)
|
${EXTERNAL_LIBS_DIR}/aeon/lib/${ANDROID_ABI}/libcheckpoints.a)
|
||||||
|
|
||||||
add_library(device STATIC IMPORTED)
|
add_library(device STATIC IMPORTED)
|
||||||
set_target_properties(device PROPERTIES IMPORTED_LOCATION
|
set_target_properties(device PROPERTIES IMPORTED_LOCATION
|
||||||
${EXTERNAL_LIBS_DIR}/${ANDROID_ABI}/monero/libdevice.a)
|
${EXTERNAL_LIBS_DIR}/aeon/lib/${ANDROID_ABI}/libdevice.a)
|
||||||
|
|
||||||
add_library(device_trezor STATIC IMPORTED)
|
|
||||||
set_target_properties(device_trezor PROPERTIES IMPORTED_LOCATION
|
|
||||||
${EXTERNAL_LIBS_DIR}/${ANDROID_ABI}/monero/libdevice_trezor.a)
|
|
||||||
|
|
||||||
add_library(multisig STATIC IMPORTED)
|
add_library(multisig STATIC IMPORTED)
|
||||||
set_target_properties(multisig PROPERTIES IMPORTED_LOCATION
|
set_target_properties(multisig PROPERTIES IMPORTED_LOCATION
|
||||||
${EXTERNAL_LIBS_DIR}/${ANDROID_ABI}/monero/libmultisig.a)
|
${EXTERNAL_LIBS_DIR}/aeon/lib/${ANDROID_ABI}/libmultisig.a)
|
||||||
|
|
||||||
add_library(version STATIC IMPORTED)
|
add_library(version STATIC IMPORTED)
|
||||||
set_target_properties(version PROPERTIES IMPORTED_LOCATION
|
set_target_properties(version PROPERTIES IMPORTED_LOCATION
|
||||||
${EXTERNAL_LIBS_DIR}/${ANDROID_ABI}/monero/libversion.a)
|
${EXTERNAL_LIBS_DIR}/aeon/lib/${ANDROID_ABI}/libversion.a)
|
||||||
|
|
||||||
add_library(net STATIC IMPORTED)
|
|
||||||
set_target_properties(net PROPERTIES IMPORTED_LOCATION
|
|
||||||
${EXTERNAL_LIBS_DIR}/${ANDROID_ABI}/monero/libnet.a)
|
|
||||||
|
|
||||||
add_library(hardforks STATIC IMPORTED)
|
|
||||||
set_target_properties(hardforks PROPERTIES IMPORTED_LOCATION
|
|
||||||
${EXTERNAL_LIBS_DIR}/${ANDROID_ABI}/monero/libhardforks.a)
|
|
||||||
|
|
||||||
add_library(randomx STATIC IMPORTED)
|
|
||||||
set_target_properties(randomx PROPERTIES IMPORTED_LOCATION
|
|
||||||
${EXTERNAL_LIBS_DIR}/${ANDROID_ABI}/monero/librandomx.a)
|
|
||||||
|
|
||||||
add_library(rpc_base STATIC IMPORTED)
|
|
||||||
set_target_properties(rpc_base PROPERTIES IMPORTED_LOCATION
|
|
||||||
${EXTERNAL_LIBS_DIR}/${ANDROID_ABI}/monero/librpc_base.a)
|
|
||||||
|
|
||||||
add_library(wallet-crypto STATIC IMPORTED)
|
|
||||||
set_target_properties(wallet-crypto PROPERTIES IMPORTED_LOCATION
|
|
||||||
${EXTERNAL_LIBS_DIR}/${ANDROID_ABI}/monero/libwallet-crypto.a)
|
|
||||||
|
|
||||||
#############
|
#############
|
||||||
# System
|
# System
|
||||||
@@ -177,16 +145,10 @@ set_target_properties(wallet-crypto PROPERTIES IMPORTED_LOCATION
|
|||||||
|
|
||||||
find_library( log-lib log )
|
find_library( log-lib log )
|
||||||
|
|
||||||
include_directories( ${EXTERNAL_LIBS_DIR}/include )
|
include_directories( ${EXTERNAL_LIBS_DIR}/aeon/include )
|
||||||
|
|
||||||
message(STATUS EXTERNAL_LIBS_DIR : ${EXTERNAL_LIBS_DIR})
|
message(STATUS EXTERNAL_LIBS_DIR : ${EXTERNAL_LIBS_DIR})
|
||||||
|
|
||||||
if(${ANDROID_ABI} STREQUAL "x86_64")
|
|
||||||
set(EXTRA_LIBS "wallet-crypto")
|
|
||||||
else()
|
|
||||||
set(EXTRA_LIBS "")
|
|
||||||
endif()
|
|
||||||
|
|
||||||
target_link_libraries( monerujo
|
target_link_libraries( monerujo
|
||||||
|
|
||||||
wallet_api
|
wallet_api
|
||||||
@@ -196,7 +158,6 @@ target_link_libraries( monerujo
|
|||||||
mnemonics
|
mnemonics
|
||||||
ringct
|
ringct
|
||||||
ringct_basic
|
ringct_basic
|
||||||
net
|
|
||||||
common
|
common
|
||||||
cncrypto
|
cncrypto
|
||||||
blockchain_db
|
blockchain_db
|
||||||
@@ -207,13 +168,8 @@ target_link_libraries( monerujo
|
|||||||
blocks
|
blocks
|
||||||
checkpoints
|
checkpoints
|
||||||
device
|
device
|
||||||
device_trezor
|
|
||||||
multisig
|
multisig
|
||||||
version
|
version
|
||||||
randomx
|
|
||||||
hardforks
|
|
||||||
rpc_base
|
|
||||||
${EXTRA_LIBS}
|
|
||||||
|
|
||||||
boost_chrono
|
boost_chrono
|
||||||
boost_date_time
|
boost_date_time
|
||||||
@@ -228,7 +184,5 @@ target_link_libraries( monerujo
|
|||||||
ssl
|
ssl
|
||||||
crypto
|
crypto
|
||||||
|
|
||||||
sodium
|
|
||||||
|
|
||||||
${log-lib}
|
${log-lib}
|
||||||
)
|
)
|
||||||
|
113
app/build.gradle
@@ -1,16 +1,15 @@
|
|||||||
apply plugin: 'com.android.application'
|
apply plugin: 'com.android.application'
|
||||||
|
|
||||||
android {
|
android {
|
||||||
compileSdkVersion 30
|
compileSdkVersion 25
|
||||||
buildToolsVersion '30.0.3'
|
buildToolsVersion '27.0.3'
|
||||||
ndkVersion '17.2.4988734'
|
|
||||||
defaultConfig {
|
defaultConfig {
|
||||||
applicationId "com.m2049r.xmrwallet"
|
applicationId "com.m2049r.aeonwallet"
|
||||||
minSdkVersion 21
|
minSdkVersion 21
|
||||||
targetSdkVersion 30
|
targetSdkVersion 25
|
||||||
versionCode 1008
|
versionCode 20
|
||||||
versionName "2.0.8 'Puginarug'"
|
versionName "0.2.0 'Accounts RC1'"
|
||||||
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
|
testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
|
||||||
externalNativeBuild {
|
externalNativeBuild {
|
||||||
cmake {
|
cmake {
|
||||||
cppFlags "-std=c++11"
|
cppFlags "-std=c++11"
|
||||||
@@ -18,36 +17,6 @@ android {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
bundle {
|
|
||||||
language {
|
|
||||||
enableSplit = false
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
flavorDimensions 'type', 'net'
|
|
||||||
productFlavors {
|
|
||||||
mainnet {
|
|
||||||
dimension 'net'
|
|
||||||
}
|
|
||||||
stagenet {
|
|
||||||
dimension 'net'
|
|
||||||
applicationIdSuffix '.stage'
|
|
||||||
versionNameSuffix ' (stage)'
|
|
||||||
}
|
|
||||||
devnet {
|
|
||||||
dimension 'net'
|
|
||||||
applicationIdSuffix '.test'
|
|
||||||
versionNameSuffix ' (test)'
|
|
||||||
}
|
|
||||||
alpha {
|
|
||||||
dimension 'type'
|
|
||||||
applicationIdSuffix '.alpha'
|
|
||||||
versionNameSuffix ' (alpha)'
|
|
||||||
}
|
|
||||||
prod {
|
|
||||||
dimension 'type'
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
buildTypes {
|
buildTypes {
|
||||||
release {
|
release {
|
||||||
@@ -57,11 +26,7 @@ android {
|
|||||||
debug {
|
debug {
|
||||||
applicationIdSuffix ".debug"
|
applicationIdSuffix ".debug"
|
||||||
}
|
}
|
||||||
applicationVariants.all { variant ->
|
|
||||||
variant.buildConfigField "String", "ID_A", "\"" + getId("ID_A") + "\""
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
externalNativeBuild {
|
externalNativeBuild {
|
||||||
cmake {
|
cmake {
|
||||||
path "CMakeLists.txt"
|
path "CMakeLists.txt"
|
||||||
@@ -80,75 +45,37 @@ android {
|
|||||||
// Map for the version code that gives each ABI a value.
|
// Map for the version code that gives each ABI a value.
|
||||||
def abiCodes = ['armeabi-v7a': 1, 'arm64-v8a': 2, 'x86': 3, 'x86_64': 4]
|
def abiCodes = ['armeabi-v7a': 1, 'arm64-v8a': 2, 'x86': 3, 'x86_64': 4]
|
||||||
|
|
||||||
// Enumerate translated locales
|
|
||||||
def availableLocales = ["en"]
|
|
||||||
new File("app/src/main/res/").eachFileMatch(~/^values-.*/) { file ->
|
|
||||||
def languageTag = file.name.substring(7).replace("-r", "-")
|
|
||||||
if (languageTag != "night")
|
|
||||||
availableLocales.add(languageTag)
|
|
||||||
}
|
|
||||||
|
|
||||||
// APKs for the same app that all have the same version information.
|
// APKs for the same app that all have the same version information.
|
||||||
android.applicationVariants.all { variant ->
|
android.applicationVariants.all { variant ->
|
||||||
// Update string resource: available_locales
|
|
||||||
variant.resValue("string", "available_locales", availableLocales.join(","))
|
|
||||||
// Assigns a different version code for each output APK.
|
// Assigns a different version code for each output APK.
|
||||||
variant.outputs.all {
|
variant.outputs.all {
|
||||||
output ->
|
output ->
|
||||||
def abiName = output.getFilter(com.android.build.OutputFile.ABI)
|
def abiName = output.getFilter(com.android.build.OutputFile.ABI)
|
||||||
output.versionCodeOverride = abiCodes.get(abiName, 0) + 10 * versionCode
|
output.versionCodeOverride = abiCodes.get(abiName, 0) + 10 * variant.versionCode
|
||||||
|
|
||||||
if (abiName == null) abiName = "universal"
|
if (abiName == null) abiName = "universal"
|
||||||
def v = "${variant.versionName}".replaceFirst(" '.*' ?", "")
|
def v = "${variant.versionName}".replaceFirst(" .*\$", "").replace(".", "x")
|
||||||
.replace(".", "x")
|
|
||||||
.replace("(", "-")
|
|
||||||
.replace(")", "")
|
|
||||||
outputFileName = "$rootProject.ext.apkName-" + v + "_" + abiName + ".apk"
|
outputFileName = "$rootProject.ext.apkName-" + v + "_" + abiName + ".apk"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
compileOptions {
|
|
||||||
sourceCompatibility JavaVersion.VERSION_1_8
|
|
||||||
targetCompatibility JavaVersion.VERSION_1_8
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
def getId(name) {
|
|
||||||
def Properties props = new Properties()
|
|
||||||
props.load(new FileInputStream(new File('monerujo.id')))
|
|
||||||
return props[name]
|
|
||||||
}
|
}
|
||||||
|
|
||||||
dependencies {
|
dependencies {
|
||||||
implementation 'androidx.core:core:1.3.2'
|
implementation 'com.android.support:appcompat-v7:25.4.0'
|
||||||
implementation 'androidx.appcompat:appcompat:1.2.0'
|
implementation 'com.android.support:design:25.4.0'
|
||||||
implementation 'com.google.android.material:material:1.3.0'
|
implementation 'com.android.support:support-v4:25.4.0'
|
||||||
implementation 'androidx.legacy:legacy-support-v4:1.0.0'
|
implementation 'com.android.support:recyclerview-v7:25.4.0'
|
||||||
implementation 'androidx.recyclerview:recyclerview:1.2.0'
|
implementation 'com.android.support:cardview-v7:25.4.0'
|
||||||
implementation 'androidx.cardview:cardview:1.0.0'
|
|
||||||
implementation 'androidx.swiperefreshlayout:swiperefreshlayout:1.2.0-alpha01'
|
|
||||||
implementation 'androidx.constraintlayout:constraintlayout:2.0.4'
|
|
||||||
|
|
||||||
implementation 'me.dm7.barcodescanner:zxing:1.9.8'
|
implementation 'me.dm7.barcodescanner:zxing:1.9.8'
|
||||||
implementation "com.squareup.okhttp3:okhttp:4.9.0"
|
|
||||||
implementation "io.github.rburgst:okhttp-digest:2.5"
|
|
||||||
implementation "com.jakewharton.timber:timber:4.7.1"
|
|
||||||
|
|
||||||
implementation 'com.nulab-inc:zxcvbn:1.3.0'
|
implementation "com.squareup.okhttp3:okhttp:$rootProject.ext.okHttpVersion"
|
||||||
|
implementation "com.jakewharton.timber:timber:$rootProject.ext.timberVersion"
|
||||||
|
|
||||||
implementation 'dnsjava:dnsjava:2.1.9'
|
implementation 'com.nulab-inc:zxcvbn:1.2.3'
|
||||||
implementation 'org.jitsi:dnssecjava:1.2.0'
|
|
||||||
implementation 'org.slf4j:slf4j-nop:1.7.30'
|
|
||||||
implementation 'com.github.brnunes:swipeablerecyclerview:1.0.2'
|
|
||||||
|
|
||||||
implementation 'com.github.aelstad:keccakj:1.1.0'
|
|
||||||
|
|
||||||
testImplementation "junit:junit:$rootProject.ext.junitVersion"
|
testImplementation "junit:junit:$rootProject.ext.junitVersion"
|
||||||
testImplementation "org.mockito:mockito-all:$rootProject.ext.mockitoVersion"
|
testImplementation "org.mockito:mockito-all:$rootProject.ext.mockitoVersion"
|
||||||
testImplementation "com.squareup.okhttp3:mockwebserver:4.9.0"
|
testImplementation "com.squareup.okhttp3:mockwebserver:$rootProject.ext.okHttpVersion"
|
||||||
testImplementation 'org.json:json:20180813'
|
testImplementation 'org.json:json:20140107'
|
||||||
testImplementation 'net.jodah:concurrentunit:0.4.4'
|
testImplementation 'net.jodah:concurrentunit:0.4.2'
|
||||||
|
|
||||||
compileOnly 'org.projectlombok:lombok:1.18.16'
|
|
||||||
annotationProcessor 'org.projectlombok:lombok:1.18.16'
|
|
||||||
}
|
}
|
||||||
|
Before Width: | Height: | Size: 244 KiB |
Before Width: | Height: | Size: 8.0 KiB |
Before Width: | Height: | Size: 4.4 KiB |
Before Width: | Height: | Size: 14 KiB |
Before Width: | Height: | Size: 28 KiB |
Before Width: | Height: | Size: 47 KiB |
4
app/src/debug/res/values/strings.xml
Normal file
@@ -0,0 +1,4 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<resources>
|
||||||
|
<string name="app_name" translatable="false">monerujoAE</string>
|
||||||
|
</resources>
|
@@ -1,91 +1,46 @@
|
|||||||
<?xml version="1.0" encoding="utf-8"?>
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
|
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
package="com.m2049r.xmrwallet">
|
package="com.m2049r.aeonwallet">
|
||||||
|
|
||||||
<uses-permission android:name="android.permission.INTERNET" />
|
<uses-permission android:name="android.permission.INTERNET" />
|
||||||
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
|
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
|
||||||
<uses-permission android:name="android.permission.USE_FINGERPRINT" />
|
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
|
||||||
<uses-permission android:name="android.permission.WAKE_LOCK" />
|
<uses-permission android:name="android.permission.WAKE_LOCK" />
|
||||||
<uses-permission android:name="android.permission.CAMERA" />
|
<uses-permission android:name="android.permission.CAMERA" />
|
||||||
<uses-permission android:name="android.permission.USE_BIOMETRIC" />
|
<uses-permission android:name="android.permission.USE_FINGERPRINT" />
|
||||||
<uses-permission android:name="android.permission.NFC" />
|
|
||||||
<uses-permission android:name="android.permission.FOREGROUND_SERVICE" />
|
|
||||||
|
|
||||||
<application
|
<application
|
||||||
android:name=".XmrWalletApplication"
|
android:allowBackup="true"
|
||||||
android:allowBackup="false"
|
|
||||||
android:icon="@mipmap/ic_launcher"
|
android:icon="@mipmap/ic_launcher"
|
||||||
android:label="@string/app_name"
|
android:label="@string/app_name"
|
||||||
android:preserveLegacyExternalStorage="true"
|
|
||||||
android:supportsRtl="true"
|
android:supportsRtl="true"
|
||||||
android:theme="@style/MyMaterialTheme"
|
android:name=".XmrWalletApplication"
|
||||||
android:usesCleartextTraffic="true">
|
android:theme="@style/MyMaterialTheme">
|
||||||
|
|
||||||
<activity
|
<activity
|
||||||
android:name=".MainActivity"
|
android:name=".WalletActivity"
|
||||||
android:configChanges="orientation|keyboardHidden|uiMode"
|
android:configChanges="orientation|keyboardHidden"
|
||||||
android:launchMode="singleTop"
|
android:label="@string/wallet_activity_name"
|
||||||
|
android:launchMode="singleTask"
|
||||||
|
android:screenOrientation="portrait" />
|
||||||
|
|
||||||
|
<activity
|
||||||
|
android:name=".LoginActivity"
|
||||||
|
android:configChanges="orientation|keyboardHidden"
|
||||||
|
android:label="@string/app_name"
|
||||||
android:screenOrientation="portrait">
|
android:screenOrientation="portrait">
|
||||||
<intent-filter>
|
<intent-filter>
|
||||||
<action android:name="android.intent.action.MAIN" />
|
<action android:name="android.intent.action.MAIN" />
|
||||||
<category android:name="android.intent.category.LAUNCHER" />
|
<category android:name="android.intent.category.LAUNCHER" />
|
||||||
</intent-filter>
|
</intent-filter>
|
||||||
</activity>
|
</activity>
|
||||||
<activity
|
|
||||||
android:name=".WalletActivity"
|
|
||||||
android:configChanges="orientation|keyboardHidden|uiMode"
|
|
||||||
android:label="@string/wallet_activity_name"
|
|
||||||
android:launchMode="singleTask"
|
|
||||||
android:screenOrientation="behind" />
|
|
||||||
<activity
|
|
||||||
android:name=".LoginActivity"
|
|
||||||
android:configChanges="orientation|keyboardHidden|uiMode"
|
|
||||||
android:label="@string/app_name"
|
|
||||||
android:launchMode="singleTop"
|
|
||||||
android:screenOrientation="locked">
|
|
||||||
<intent-filter>
|
|
||||||
<action android:name="android.hardware.usb.action.USB_DEVICE_ATTACHED" />
|
|
||||||
</intent-filter>
|
|
||||||
|
|
||||||
<intent-filter android:label="@string/app_name">
|
|
||||||
<action android:name="android.intent.action.VIEW" />
|
|
||||||
<data android:scheme="monero" />
|
|
||||||
|
|
||||||
<category android:name="android.intent.category.DEFAULT" />
|
|
||||||
<category android:name="android.intent.category.BROWSABLE" />
|
|
||||||
</intent-filter>
|
|
||||||
|
|
||||||
<intent-filter android:label="@string/app_name">
|
|
||||||
<action android:name="android.intent.action.VIEW" />
|
|
||||||
<data android:scheme="bitcoin" />
|
|
||||||
|
|
||||||
<category android:name="android.intent.category.DEFAULT" />
|
|
||||||
<category android:name="android.intent.category.BROWSABLE" />
|
|
||||||
</intent-filter>
|
|
||||||
|
|
||||||
<meta-data
|
|
||||||
android:name="android.hardware.usb.action.USB_DEVICE_ATTACHED"
|
|
||||||
android:resource="@xml/usb_device_filter" />
|
|
||||||
</activity>
|
|
||||||
<activity
|
|
||||||
android:name=".onboarding.OnBoardingActivity"
|
|
||||||
android:configChanges="orientation|keyboardHidden|uiMode"
|
|
||||||
android:launchMode="singleTask"
|
|
||||||
android:screenOrientation="portrait" />
|
|
||||||
|
|
||||||
<service
|
<service
|
||||||
android:name=".service.WalletService"
|
android:name=".service.WalletService"
|
||||||
android:description="@string/service_description"
|
android:description="@string/service_description"
|
||||||
android:exported="false"
|
android:exported="false"
|
||||||
android:label="Monero Wallet Service" />
|
android:label="Wallet Service" />
|
||||||
|
|
||||||
<provider
|
|
||||||
android:name="androidx.core.content.FileProvider"
|
|
||||||
android:authorities="${applicationId}.fileprovider"
|
|
||||||
android:exported="false"
|
|
||||||
android:grantUriPermissions="true">
|
|
||||||
<meta-data
|
|
||||||
android:name="android.support.FILE_PROVIDER_PATHS"
|
|
||||||
android:resource="@xml/filepaths" />
|
|
||||||
</provider>
|
|
||||||
</application>
|
</application>
|
||||||
</manifest>
|
|
||||||
|
</manifest>
|
@@ -54,22 +54,15 @@ extern "C"
|
|||||||
{
|
{
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
extern const char* const MONERO_VERSION; // the actual monero core version
|
|
||||||
|
|
||||||
// from monero-core crypto/hash-ops.h - avoid #including monero code here
|
// from monero-core crypto/hash-ops.h - avoid #including monero code here
|
||||||
enum {
|
enum {
|
||||||
HASH_SIZE = 32,
|
HASH_SIZE = 32,
|
||||||
HASH_DATA_AREA = 136
|
HASH_DATA_AREA = 136
|
||||||
};
|
};
|
||||||
|
|
||||||
void cn_slow_hash(const void *data, size_t length, char *hash, int variant, int prehashed, uint64_t height);
|
void cn_slow_hash(const void *data, size_t length, char *hash, int light, int variant, int prehashed);
|
||||||
|
|
||||||
inline void slow_hash(const void *data, const size_t length, char *hash) {
|
inline void slow_hash(const void *data, const size_t length, char *hash) {
|
||||||
cn_slow_hash(data, length, hash, 0 /*variant*/, 0 /*prehashed*/, 0 /*height*/);
|
cn_slow_hash(data, length, hash, 0 /*light*/, 0 /* variant */, 0/*prehashed*/);
|
||||||
}
|
|
||||||
|
|
||||||
inline void slow_hash_broken(const void *data, char *hash, int variant) {
|
|
||||||
cn_slow_hash(data, 200 /*sizeof(union hash_state)*/, hash, variant, 1 /*prehashed*/, 0 /*height*/);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
|
Before Width: | Height: | Size: 245 KiB After Width: | Height: | Size: 67 KiB |
@@ -1,53 +0,0 @@
|
|||||||
/*
|
|
||||||
*******************************************************************************
|
|
||||||
* BTChip Bitcoin Hardware Wallet Java API
|
|
||||||
* (c) 2014 BTChip - 1BTChip7VfTnrPra5jqci7ejnMguuHogTn
|
|
||||||
*
|
|
||||||
* 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
|
|
||||||
*
|
|
||||||
* http://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.
|
|
||||||
********************************************************************************
|
|
||||||
*/
|
|
||||||
|
|
||||||
package com.btchip;
|
|
||||||
|
|
||||||
public class BTChipException extends Exception {
|
|
||||||
|
|
||||||
private static final long serialVersionUID = 5512803003827126405L;
|
|
||||||
|
|
||||||
public BTChipException(String reason) {
|
|
||||||
super(reason);
|
|
||||||
}
|
|
||||||
|
|
||||||
public BTChipException(String reason, Throwable cause) {
|
|
||||||
super(reason, cause);
|
|
||||||
}
|
|
||||||
|
|
||||||
public BTChipException(String reason, int sw) {
|
|
||||||
super(reason);
|
|
||||||
this.sw = sw;
|
|
||||||
}
|
|
||||||
|
|
||||||
public int getSW() {
|
|
||||||
return sw;
|
|
||||||
}
|
|
||||||
|
|
||||||
public String toString() {
|
|
||||||
if (sw == 0) {
|
|
||||||
return "BTChip Exception : " + getMessage();
|
|
||||||
} else {
|
|
||||||
return "BTChip Exception : " + getMessage() + " " + Integer.toHexString(sw);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private int sw;
|
|
||||||
|
|
||||||
}
|
|
@@ -1,31 +0,0 @@
|
|||||||
/*
|
|
||||||
*******************************************************************************
|
|
||||||
* BTChip Bitcoin Hardware Wallet Java API
|
|
||||||
* (c) 2014 BTChip - 1BTChip7VfTnrPra5jqci7ejnMguuHogTn
|
|
||||||
* (c) 2018 m2049r
|
|
||||||
*
|
|
||||||
* 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
|
|
||||||
*
|
|
||||||
* http://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.
|
|
||||||
********************************************************************************
|
|
||||||
*/
|
|
||||||
|
|
||||||
package com.btchip.comm;
|
|
||||||
|
|
||||||
import com.btchip.BTChipException;
|
|
||||||
|
|
||||||
public interface BTChipTransport {
|
|
||||||
byte[] exchange(byte[] command);
|
|
||||||
|
|
||||||
void close();
|
|
||||||
|
|
||||||
void setDebug(boolean debugFlag);
|
|
||||||
}
|
|
@@ -1,126 +0,0 @@
|
|||||||
/*
|
|
||||||
*******************************************************************************
|
|
||||||
* BTChip Bitcoin Hardware Wallet Java API
|
|
||||||
* (c) 2014 BTChip - 1BTChip7VfTnrPra5jqci7ejnMguuHogTn
|
|
||||||
* (c) 2018 m2049r
|
|
||||||
*
|
|
||||||
* 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
|
|
||||||
*
|
|
||||||
* http://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.
|
|
||||||
********************************************************************************
|
|
||||||
*/
|
|
||||||
|
|
||||||
package com.btchip.comm;
|
|
||||||
|
|
||||||
import java.io.ByteArrayOutputStream;
|
|
||||||
|
|
||||||
public class LedgerHelper {
|
|
||||||
|
|
||||||
private static final int TAG_APDU = 0x05;
|
|
||||||
|
|
||||||
public static byte[] wrapCommandAPDU(int channel, byte[] command, int packetSize) {
|
|
||||||
ByteArrayOutputStream output = new ByteArrayOutputStream();
|
|
||||||
if (packetSize < 3) {
|
|
||||||
throw new IllegalArgumentException("Can't handle Ledger framing with less than 3 bytes for the report");
|
|
||||||
}
|
|
||||||
int sequenceIdx = 0;
|
|
||||||
int offset = 0;
|
|
||||||
output.write(channel >> 8);
|
|
||||||
output.write(channel);
|
|
||||||
output.write(TAG_APDU);
|
|
||||||
output.write(sequenceIdx >> 8);
|
|
||||||
output.write(sequenceIdx);
|
|
||||||
sequenceIdx++;
|
|
||||||
output.write(command.length >> 8);
|
|
||||||
output.write(command.length);
|
|
||||||
int blockSize = (command.length > packetSize - 7 ? packetSize - 7 : command.length);
|
|
||||||
output.write(command, offset, blockSize);
|
|
||||||
offset += blockSize;
|
|
||||||
while (offset != command.length) {
|
|
||||||
output.write(channel >> 8);
|
|
||||||
output.write(channel);
|
|
||||||
output.write(TAG_APDU);
|
|
||||||
output.write(sequenceIdx >> 8);
|
|
||||||
output.write(sequenceIdx);
|
|
||||||
sequenceIdx++;
|
|
||||||
blockSize = (command.length - offset > packetSize - 5 ? packetSize - 5 : command.length - offset);
|
|
||||||
output.write(command, offset, blockSize);
|
|
||||||
offset += blockSize;
|
|
||||||
}
|
|
||||||
if ((output.size() % packetSize) != 0) {
|
|
||||||
byte[] padding = new byte[packetSize - (output.size() % packetSize)];
|
|
||||||
output.write(padding, 0, padding.length);
|
|
||||||
}
|
|
||||||
return output.toByteArray();
|
|
||||||
}
|
|
||||||
|
|
||||||
public static byte[] unwrapResponseAPDU(int channel, byte[] data, int packetSize) {
|
|
||||||
ByteArrayOutputStream response = new ByteArrayOutputStream();
|
|
||||||
int offset = 0;
|
|
||||||
int responseLength;
|
|
||||||
int sequenceIdx = 0;
|
|
||||||
if ((data == null) || (data.length < 7 + 5)) {
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
if (data[offset++] != (channel >> 8)) {
|
|
||||||
throw new IllegalArgumentException("Invalid channel");
|
|
||||||
}
|
|
||||||
if (data[offset++] != (channel & 0xff)) {
|
|
||||||
throw new IllegalArgumentException("Invalid channel");
|
|
||||||
}
|
|
||||||
if (data[offset++] != TAG_APDU) {
|
|
||||||
throw new IllegalArgumentException("Invalid tag");
|
|
||||||
}
|
|
||||||
if (data[offset++] != 0x00) {
|
|
||||||
throw new IllegalArgumentException("Invalid sequence");
|
|
||||||
}
|
|
||||||
if (data[offset++] != 0x00) {
|
|
||||||
throw new IllegalArgumentException("Invalid sequence");
|
|
||||||
}
|
|
||||||
responseLength = ((data[offset++] & 0xff) << 8);
|
|
||||||
responseLength |= (data[offset++] & 0xff);
|
|
||||||
if (data.length < 7 + responseLength) {
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
int blockSize = (responseLength > packetSize - 7 ? packetSize - 7 : responseLength);
|
|
||||||
response.write(data, offset, blockSize);
|
|
||||||
offset += blockSize;
|
|
||||||
while (response.size() != responseLength) {
|
|
||||||
sequenceIdx++;
|
|
||||||
if (offset == data.length) {
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
if (data[offset++] != (channel >> 8)) {
|
|
||||||
throw new IllegalArgumentException("Invalid channel");
|
|
||||||
}
|
|
||||||
if (data[offset++] != (channel & 0xff)) {
|
|
||||||
throw new IllegalArgumentException("Invalid channel");
|
|
||||||
}
|
|
||||||
if (data[offset++] != TAG_APDU) {
|
|
||||||
throw new IllegalArgumentException("Invalid tag");
|
|
||||||
}
|
|
||||||
if (data[offset++] != (sequenceIdx >> 8)) {
|
|
||||||
throw new IllegalArgumentException("Invalid sequence");
|
|
||||||
}
|
|
||||||
if (data[offset++] != (sequenceIdx & 0xff)) {
|
|
||||||
throw new IllegalArgumentException("Invalid sequence");
|
|
||||||
}
|
|
||||||
blockSize = (responseLength - response.size() > packetSize - 5 ? packetSize - 5 : responseLength - response.size());
|
|
||||||
if (blockSize > data.length - offset) {
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
response.write(data, offset, blockSize);
|
|
||||||
offset += blockSize;
|
|
||||||
}
|
|
||||||
return response.toByteArray();
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
@@ -1,149 +0,0 @@
|
|||||||
/*
|
|
||||||
*******************************************************************************
|
|
||||||
* BTChip Bitcoin Hardware Wallet Java API
|
|
||||||
* (c) 2014 BTChip - 1BTChip7VfTnrPra5jqci7ejnMguuHogTn
|
|
||||||
* (c) 2018 m2049r
|
|
||||||
*
|
|
||||||
* 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
|
|
||||||
*
|
|
||||||
* http://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.
|
|
||||||
********************************************************************************
|
|
||||||
*/
|
|
||||||
|
|
||||||
package com.btchip.comm.android;
|
|
||||||
|
|
||||||
import android.hardware.usb.UsbConstants;
|
|
||||||
import android.hardware.usb.UsbDevice;
|
|
||||||
import android.hardware.usb.UsbDeviceConnection;
|
|
||||||
import android.hardware.usb.UsbEndpoint;
|
|
||||||
import android.hardware.usb.UsbInterface;
|
|
||||||
import android.hardware.usb.UsbManager;
|
|
||||||
import android.hardware.usb.UsbRequest;
|
|
||||||
|
|
||||||
import com.btchip.BTChipException;
|
|
||||||
import com.btchip.comm.BTChipTransport;
|
|
||||||
import com.btchip.comm.LedgerHelper;
|
|
||||||
import com.btchip.utils.Dump;
|
|
||||||
|
|
||||||
import java.io.ByteArrayOutputStream;
|
|
||||||
import java.io.IOException;
|
|
||||||
import java.nio.ByteBuffer;
|
|
||||||
import java.util.HashMap;
|
|
||||||
|
|
||||||
import timber.log.Timber;
|
|
||||||
|
|
||||||
public class BTChipTransportAndroidHID implements BTChipTransport {
|
|
||||||
|
|
||||||
public static UsbDevice getDevice(UsbManager manager) {
|
|
||||||
HashMap<String, UsbDevice> deviceList = manager.getDeviceList();
|
|
||||||
for (UsbDevice device : deviceList.values()) {
|
|
||||||
Timber.d("%04X:%04X %s, %s", device.getVendorId(), device.getProductId(), device.getManufacturerName(), device.getProductName());
|
|
||||||
if (device.getVendorId() == VID) {
|
|
||||||
final int deviceProductId = device.getProductId();
|
|
||||||
for (int pid : PID_HIDS) {
|
|
||||||
if (deviceProductId == pid)
|
|
||||||
return device;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
public static BTChipTransport open(UsbManager manager, UsbDevice device) throws IOException {
|
|
||||||
UsbDeviceConnection connection = manager.openDevice(device);
|
|
||||||
if (connection == null) throw new IOException("Device not connected");
|
|
||||||
// Must only be called once permission is granted (see http://developer.android.com/reference/android/hardware/usb/UsbManager.html)
|
|
||||||
// Important if enumerating, rather than being awaken by the intent notification
|
|
||||||
UsbInterface dongleInterface = device.getInterface(0);
|
|
||||||
UsbEndpoint in = null;
|
|
||||||
UsbEndpoint out = null;
|
|
||||||
for (int i = 0; i < dongleInterface.getEndpointCount(); i++) {
|
|
||||||
UsbEndpoint tmpEndpoint = dongleInterface.getEndpoint(i);
|
|
||||||
if (tmpEndpoint.getDirection() == UsbConstants.USB_DIR_IN) {
|
|
||||||
in = tmpEndpoint;
|
|
||||||
} else {
|
|
||||||
out = tmpEndpoint;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
connection.claimInterface(dongleInterface, true);
|
|
||||||
return new BTChipTransportAndroidHID(connection, dongleInterface, in, out);
|
|
||||||
}
|
|
||||||
|
|
||||||
private static final int VID = 0x2C97;
|
|
||||||
private static final int[] PID_HIDS = {0x0001, 0x0004};
|
|
||||||
|
|
||||||
private UsbDeviceConnection connection;
|
|
||||||
private UsbInterface dongleInterface;
|
|
||||||
private UsbEndpoint in;
|
|
||||||
private UsbEndpoint out;
|
|
||||||
private byte transferBuffer[];
|
|
||||||
private boolean debug;
|
|
||||||
|
|
||||||
public BTChipTransportAndroidHID(UsbDeviceConnection connection, UsbInterface dongleInterface, UsbEndpoint in, UsbEndpoint out) {
|
|
||||||
this.connection = connection;
|
|
||||||
this.dongleInterface = dongleInterface;
|
|
||||||
this.in = in;
|
|
||||||
this.out = out;
|
|
||||||
transferBuffer = new byte[HID_BUFFER_SIZE];
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public byte[] exchange(byte[] command) {
|
|
||||||
ByteArrayOutputStream response = new ByteArrayOutputStream();
|
|
||||||
byte[] responseData = null;
|
|
||||||
int offset = 0;
|
|
||||||
if (debug) {
|
|
||||||
Timber.d("=> %s", Dump.dump(command));
|
|
||||||
}
|
|
||||||
command = LedgerHelper.wrapCommandAPDU(LEDGER_DEFAULT_CHANNEL, command, HID_BUFFER_SIZE);
|
|
||||||
UsbRequest requestOut = new UsbRequest();
|
|
||||||
requestOut.initialize(connection, out);
|
|
||||||
while (offset != command.length) {
|
|
||||||
int blockSize = (command.length - offset > HID_BUFFER_SIZE ? HID_BUFFER_SIZE : command.length - offset);
|
|
||||||
System.arraycopy(command, offset, transferBuffer, 0, blockSize);
|
|
||||||
requestOut.queue(ByteBuffer.wrap(transferBuffer), HID_BUFFER_SIZE);
|
|
||||||
connection.requestWait();
|
|
||||||
offset += blockSize;
|
|
||||||
}
|
|
||||||
requestOut.close();
|
|
||||||
ByteBuffer responseBuffer = ByteBuffer.allocate(HID_BUFFER_SIZE);
|
|
||||||
UsbRequest requestIn = new UsbRequest();
|
|
||||||
requestIn.initialize(connection, in);
|
|
||||||
while ((responseData = LedgerHelper.unwrapResponseAPDU(LEDGER_DEFAULT_CHANNEL, response.toByteArray(), HID_BUFFER_SIZE)) == null) {
|
|
||||||
responseBuffer.clear();
|
|
||||||
requestIn.queue(responseBuffer, HID_BUFFER_SIZE);
|
|
||||||
connection.requestWait();
|
|
||||||
responseBuffer.rewind();
|
|
||||||
responseBuffer.get(transferBuffer, 0, HID_BUFFER_SIZE);
|
|
||||||
response.write(transferBuffer, 0, HID_BUFFER_SIZE);
|
|
||||||
}
|
|
||||||
requestIn.close();
|
|
||||||
if (debug) {
|
|
||||||
Timber.d("<= %s", Dump.dump(responseData));
|
|
||||||
}
|
|
||||||
return responseData;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void close() {
|
|
||||||
connection.releaseInterface(dongleInterface);
|
|
||||||
connection.close();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void setDebug(boolean debugFlag) {
|
|
||||||
this.debug = debugFlag;
|
|
||||||
}
|
|
||||||
|
|
||||||
private static final int HID_BUFFER_SIZE = 64;
|
|
||||||
private static final int LEDGER_DEFAULT_CHANNEL = 1;
|
|
||||||
private static final int SW1_DATA_AVAILABLE = 0x61;
|
|
||||||
}
|
|
@@ -1,62 +0,0 @@
|
|||||||
/*
|
|
||||||
*******************************************************************************
|
|
||||||
* BTChip Bitcoin Hardware Wallet Java API
|
|
||||||
* (c) 2014 BTChip - 1BTChip7VfTnrPra5jqci7ejnMguuHogTn
|
|
||||||
*
|
|
||||||
* 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
|
|
||||||
*
|
|
||||||
* http://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.
|
|
||||||
********************************************************************************
|
|
||||||
*/
|
|
||||||
|
|
||||||
package com.btchip.utils;
|
|
||||||
|
|
||||||
import java.io.ByteArrayOutputStream;
|
|
||||||
|
|
||||||
public class Dump {
|
|
||||||
|
|
||||||
public static String dump(byte[] buffer, int offset, int length) {
|
|
||||||
String result = "";
|
|
||||||
for (int i = 0; i < length; i++) {
|
|
||||||
String temp = Integer.toHexString((buffer[offset + i]) & 0xff);
|
|
||||||
if (temp.length() < 2) {
|
|
||||||
temp = "0" + temp;
|
|
||||||
}
|
|
||||||
result += temp;
|
|
||||||
}
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
|
|
||||||
public static String dump(byte[] buffer) {
|
|
||||||
return dump(buffer, 0, buffer.length);
|
|
||||||
}
|
|
||||||
|
|
||||||
public static byte[] hexToBin(String src) {
|
|
||||||
ByteArrayOutputStream result = new ByteArrayOutputStream();
|
|
||||||
int i = 0;
|
|
||||||
while (i < src.length()) {
|
|
||||||
char x = src.charAt(i);
|
|
||||||
if (!((x >= '0' && x <= '9') || (x >= 'A' && x <= 'F') || (x >= 'a' && x <= 'f'))) {
|
|
||||||
i++;
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
try {
|
|
||||||
result.write(Integer.valueOf("" + src.charAt(i) + src.charAt(i + 1), 16));
|
|
||||||
i += 2;
|
|
||||||
} catch (Exception e) {
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return result.toByteArray();
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
}
|
|
1112
app/src/main/java/com/m2049r/aeonwallet/LoginActivity.java
Normal file
497
app/src/main/java/com/m2049r/aeonwallet/LoginFragment.java
Normal file
@@ -14,7 +14,7 @@
|
|||||||
* limitations under the License.
|
* limitations under the License.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
package com.m2049r.xmrwallet;
|
package com.m2049r.aeonwallet;
|
||||||
|
|
||||||
public interface OnBackPressedListener {
|
public interface OnBackPressedListener {
|
||||||
boolean onBackPressed();
|
boolean onBackPressed();
|