Compare commits
307
Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
3f3437bdfd | ||
|
|
b69fe523f9 | ||
|
|
3e5d758e92 | ||
|
|
7f40f410e7 | ||
|
|
497c95fd26 | ||
|
|
604eaccbbf | ||
|
|
842dbbbd8d | ||
|
|
10f5f9ec7d | ||
|
|
07fb3610d1 | ||
|
|
43951b9dfd | ||
|
|
834bf612ac | ||
|
|
161ba2713f | ||
|
|
245b3fcf57 | ||
|
|
90e5774dd6 | ||
|
|
be59785a1f | ||
|
|
45129b8244 | ||
|
|
0c6bb61ebe | ||
|
|
7ec77db666 | ||
|
|
b907881d59 | ||
|
|
0d7c2684ee | ||
|
|
5802097f5f | ||
|
|
5fc9722992 | ||
|
|
4eaf832b43 | ||
|
|
a9b4d86b00 | ||
|
|
8a24185ad6 | ||
|
|
355e144ef7 | ||
|
|
d8d1e030e4 | ||
|
|
9187ec25c1 | ||
|
|
de29c6f7d9 | ||
|
|
e6ee2714d7 | ||
|
|
25e3a56dba | ||
|
|
7b9f4983cb | ||
|
|
94ab27bcbb | ||
|
|
041ceda95e | ||
|
|
86c1dbd25d | ||
|
|
a094d218d5 | ||
|
|
3951b8a39c | ||
|
|
1757dc5d53 | ||
|
|
f942092a5e | ||
|
|
d4be3a6976 | ||
|
|
6037fe80c4 | ||
|
|
6a1fdc5b08 | ||
|
|
17f6a72590 | ||
|
|
aaf5b72675 | ||
|
|
a1490d414c | ||
|
|
8c26125e52 | ||
|
|
86fefc2e32 | ||
|
|
d8e3934a05 | ||
|
|
65b0d1cd17 | ||
|
|
b65ac2ab14 | ||
|
|
c00eb0d539 | ||
|
|
42e407fbcf | ||
|
|
e9c2d24cc3 | ||
|
|
d9aa885eb2 | ||
|
|
bd192b0f7d | ||
|
|
e8008d0aa9 | ||
|
|
2ec6a3ed06 | ||
|
|
8fc6f4776b | ||
|
|
cd54aa9b92 | ||
|
|
8aa586fe6e | ||
|
|
1e55827c4b | ||
|
|
03f813c957 | ||
|
|
6d6766dce1 | ||
|
|
ce3d32dc0a | ||
|
|
56ff84f475 | ||
|
|
cdb39452d7 | ||
|
|
3794742c8f | ||
|
|
9db49b8ca0 | ||
|
|
ce5ae1d191 | ||
|
|
3a5122a50c | ||
|
|
782d038fb0 | ||
|
|
e6f9932dc5 | ||
|
|
380603ddce | ||
|
|
9b550e4b82 | ||
|
|
6b5c807176 | ||
|
|
54b2e0e678 | ||
|
|
01a503f3bf | ||
|
|
696fedcca2 | ||
|
|
7a1c29899b | ||
|
|
9b2f6147b6 | ||
|
|
5c801331af | ||
|
|
96b09eb862 | ||
|
|
e104a9a935 | ||
|
|
34930a7136 | ||
|
|
e6f8df9a52 | ||
|
|
f873dfcde0 | ||
|
|
8034167750 | ||
|
|
702899a9cf | ||
|
|
59f536c479 | ||
|
|
8353c65602 | ||
|
|
1f967c6aa1 | ||
|
|
ca53bf7388 | ||
|
|
2e2104d4d1 | ||
|
|
ac48fbef44 | ||
|
|
8f67f38de9 | ||
|
|
ea4578b3e0 | ||
|
|
2b40a4d0c4 | ||
|
|
17afff272e | ||
|
|
3526355e23 | ||
|
|
f708cdcf50 | ||
|
|
3af4384e00 | ||
|
|
a6b19c021f | ||
|
|
a258717e83 | ||
|
|
a8395e51a4 | ||
|
|
db501b5efd | ||
|
|
44732e9736 | ||
|
|
d12c05aab6 | ||
|
|
4134d18cbc | ||
|
|
8600c1d3a5 | ||
|
|
570c62e30e | ||
|
|
549efdb77c | ||
|
|
8807a63989 | ||
|
|
c0be0b7670 | ||
|
|
6e854428f2 | ||
|
|
c81dd8e3e3 | ||
|
|
24f4c4a07e | ||
|
|
98762c74f1 | ||
|
|
f3aeddb53a | ||
|
|
f5fcc9f45e | ||
|
|
9aa9dc1b4c | ||
|
|
61974dae4d | ||
|
|
8b3e639abd | ||
|
|
7c901fa045 | ||
|
|
8a12ad3510 | ||
|
|
c8044cd2f2 | ||
|
|
6872d1a857 | ||
|
|
98d4969ca5 | ||
|
|
5412092ca1 | ||
|
|
a8695116e2 | ||
|
|
76773a4165 | ||
|
|
32fc7b14e8 | ||
|
|
82a8f9f44d | ||
|
|
8df72d0c29 | ||
|
|
794cd57961 | ||
|
|
6bc29088ab | ||
|
|
658f62e8ce | ||
|
|
e6b346ca32 | ||
|
|
00b0755a73 | ||
|
|
f8cc85f5e2 | ||
|
|
6ba89d0c6e | ||
|
|
2614131426 | ||
|
|
cfc43be3cc | ||
|
|
3164cc6a6c | ||
|
|
5badb5bdb5 | ||
|
|
292fd78ff8 | ||
|
|
c875fb33fa | ||
|
|
b5962fd83a | ||
|
|
1d1eae13a9 | ||
|
|
63a168b6f4 | ||
|
|
ce7912632c | ||
|
|
ec53f17897 | ||
|
|
7987e537c8 | ||
|
|
074a2b292d | ||
|
|
8b417524fa | ||
|
|
f6a433c818 | ||
|
|
4940341504 | ||
|
|
06aa4671b6 | ||
|
|
7eaa5f6bb1 | ||
|
|
d48f933502 | ||
|
|
14d76eb4d4 | ||
|
|
ae1f82f33c | ||
|
|
c5a3eea048 | ||
|
|
c847cb5d03 | ||
|
|
4e1851d53c | ||
|
|
edd1d0661d | ||
|
|
18fc168537 | ||
|
|
ca8b404e5b | ||
|
|
f98e5cf11f | ||
|
|
5aca098aa2 | ||
|
|
55a182f430 | ||
|
|
8e31dae33b | ||
|
|
ce69df19ac | ||
|
|
681bcbf726 | ||
|
|
aeef913f63 | ||
|
|
74e84644aa | ||
|
|
0e29149363 | ||
|
|
5fe28a2c9b | ||
|
|
5fba1dbfa3 | ||
|
|
32098d2548 | ||
|
|
60a4aa2f8e | ||
|
|
f8699c582a | ||
|
|
9ba6c6262e | ||
|
|
5fc23816a6 | ||
|
|
59513eae65 | ||
|
|
aead730d28 | ||
|
|
5bff89a58f | ||
|
|
e1177d20b5 | ||
|
|
0a6eaf1c12 | ||
|
|
d24eb96c9d | ||
|
|
3dfd9df935 | ||
|
|
d0374d9fd2 | ||
|
|
f0026b4d10 | ||
|
|
b9a02f707d | ||
|
|
d4e1b63ef7 | ||
|
|
e9b973196b | ||
|
|
74149c1ff0 | ||
|
|
288f57192a | ||
|
|
a52bc11592 | ||
|
|
354cda3be5 | ||
|
|
f114908c4d | ||
|
|
b0964eff64 | ||
|
|
b0d2e6e5d7 | ||
|
|
df0e9313da | ||
|
|
76bf8d365c | ||
|
|
41763689e0 | ||
|
|
a6a7ec8bc0 | ||
|
|
7e896979f6 | ||
|
|
68402ae669 | ||
|
|
8c67ce0b75 | ||
|
|
e2b9e12038 | ||
|
|
a03cc3c3ab | ||
|
|
da25280555 | ||
|
|
68e4cf3632 | ||
|
|
dd7795a8b8 | ||
|
|
feb875310e | ||
|
|
8b0681c44a | ||
|
|
9bbde035dc | ||
|
|
260a741b17 | ||
|
|
48789e8793 | ||
|
|
2dfb3ab838 | ||
|
|
e05d5000b1 | ||
|
|
3067b814b1 | ||
|
|
e9bbb34797 | ||
|
|
28aeb2dad0 | ||
|
|
fef3165f24 | ||
|
|
88d1a17a94 | ||
|
|
ed824bdb06 | ||
|
|
932fee2857 | ||
|
|
53874c8343 | ||
|
|
e6d9ef0298 | ||
|
|
4aee5af791 | ||
|
|
3ee004afab | ||
|
|
6c07fac28b | ||
|
|
98deaa4459 | ||
|
|
7de1f95054 | ||
|
|
9e71fc2d14 | ||
|
|
e44b29f3a6 | ||
|
|
e5ed5e624b | ||
|
|
f075cd0bdc | ||
|
|
1d44472aa6 | ||
|
|
495bc91989 | ||
|
|
bcf8e39e84 | ||
|
|
c86cdf9ac8 | ||
|
|
1948c11508 | ||
|
|
02d4618997 | ||
|
|
fd4d64c53e | ||
|
|
17b64ab3ba | ||
|
|
6a88a34d34 | ||
|
|
3be1532b32 | ||
|
|
44846c80c8 | ||
|
|
a405de62e6 | ||
|
|
06dc9ea1d3 | ||
|
|
32a4bb1153 | ||
|
|
418053b21e | ||
|
|
2528efb538 | ||
|
|
399da799a6 | ||
|
|
ebc12c36e4 | ||
|
|
c003db42ae | ||
|
|
a716f4e435 | ||
|
|
6f07e8022e | ||
|
|
38fcb0c1a0 | ||
|
|
0cc414d717 | ||
|
|
ad42882c5b | ||
|
|
ee35fd52f6 | ||
|
|
fba363d9ea | ||
|
|
51541f7f0a | ||
|
|
1e37765197 | ||
|
|
90913500b4 | ||
|
|
6d74d0396e | ||
|
|
fd24a80904 | ||
|
|
ab53450ba8 | ||
|
|
813d96df10 | ||
|
|
6363756c09 | ||
|
|
5854a473f0 | ||
|
|
c2f0060a47 | ||
|
|
0fdb599d93 | ||
|
|
ef5153f138 | ||
|
|
463e8a5eec | ||
|
|
40e6c44b99 | ||
|
|
fc801213ef | ||
|
|
9e5b8b5f9c | ||
|
|
772efa90d4 | ||
|
|
8fb42d2503 | ||
|
|
2295b01bc9 | ||
|
|
2ee7db9370 | ||
|
|
27407b9cbb | ||
|
|
01a881523f | ||
|
|
3b5afb5d60 | ||
|
|
e5cee4b640 | ||
|
|
7948582e46 | ||
|
|
6c5242b3e0 | ||
|
|
60d6a5c3cc | ||
|
|
049822b5bb | ||
|
|
02c7460a24 | ||
|
|
10c6bf7156 | ||
|
|
d0d7310e82 | ||
|
|
219dd7cb46 | ||
|
|
9da0559b15 | ||
|
|
aa7db8b883 | ||
|
|
a06c5fdc02 | ||
|
|
2a515a82ce | ||
|
|
69294b196f | ||
|
|
58606dc87c | ||
|
|
bccf0f8d11 | ||
|
|
aab62dd19e | ||
|
|
fa9645d6dd | ||
|
|
614b03d701 |
@@ -26,7 +26,7 @@
|
||||
malli.generator malli.generator
|
||||
malli.transform malli.transform
|
||||
malli.util malli.util
|
||||
promesa.core p
|
||||
promesa.core promesa
|
||||
schema.core schema
|
||||
status-im.feature-flags ff
|
||||
taoensso.timbre log}}
|
||||
|
||||
@@ -34,4 +34,6 @@ STICKERS_TEST_ENABLED=1
|
||||
LOCAL_PAIRING_ENABLED=1
|
||||
TEST_STATEOFUS=1
|
||||
FAST_CREATE_COMMUNITY_ENABLED=1
|
||||
FLAG_NEW_CONTACT_UI_ENABLED=0
|
||||
TEST_NETWORKS_ENABLED=1
|
||||
SHOW_NOT_IMPLEMENTED_FEATURES=0
|
||||
ENABLE_ALERT_BANNER=0
|
||||
|
||||
@@ -33,3 +33,8 @@ TWO_MINUTES_SYNCING=1
|
||||
STICKERS_TEST_ENABLED=1
|
||||
LOCAL_PAIRING_ENABLED=1
|
||||
FAST_CREATE_COMMUNITY_ENABLED=1
|
||||
TEST_NETWORKS_ENABLED=1
|
||||
SHOW_NOT_IMPLEMENTED_FEATURES=1
|
||||
DELETE_MESSAGE_FOR_ME_UNDO_TIME_LIMIT=10000
|
||||
DELETE_MESSAGE_UNDO_TIME_LIMIT=10000
|
||||
ENABLE_ALERT_BANNER=0
|
||||
|
||||
@@ -35,3 +35,6 @@ ENABLE_QUO_PREVIEW=1
|
||||
STICKERS_TEST_ENABLED=1
|
||||
LOCAL_PAIRING_ENABLED=1
|
||||
FAST_CREATE_COMMUNITY_ENABLED=1
|
||||
TEST_NETWORKS_ENABLED=1
|
||||
SHOW_NOT_IMPLEMENTED_FEATURES=1
|
||||
ENABLE_ALERT_BANNER=1
|
||||
|
||||
@@ -22,3 +22,5 @@ COMMUNITIES_ENABLED=1
|
||||
DATABASE_MANAGEMENT_ENABLED=1
|
||||
DELETE_MESSAGE_ENABLED=1
|
||||
FAST_CREATE_COMMUNITY_ENABLED=0
|
||||
TEST_NETWORKS_ENABLED=0
|
||||
ENABLE_ALERT_BANNER=1
|
||||
|
||||
@@ -20,3 +20,4 @@ MAX_IMAGES_BATCH=1
|
||||
DELETE_MESSAGE_ENABLED=1
|
||||
COLLECTIBLES_ENABLED=1
|
||||
FAST_CREATE_COMMUNITY_ENABLED=0
|
||||
TEST_NETWORKS_ENABLED=0
|
||||
|
||||
@@ -375,25 +375,25 @@ test-contract: export SHADOW_NS_REGEXP := ^tests\.contract-test.*$$
|
||||
test-contract: ##@test Run contract tests
|
||||
test-contract: _test-clojure
|
||||
|
||||
android-test: jsbundle
|
||||
android-test: export TARGET := android
|
||||
android-test:
|
||||
test-android: jsbundle
|
||||
test-android: export TARGET := android
|
||||
test-android: ##@test Android Gradle test
|
||||
cd android && ./gradlew test
|
||||
|
||||
component-test-watch: export TARGET := clojure
|
||||
component-test-watch: export COMPONENT_TEST := true
|
||||
component-test-watch: export BABEL_ENV := test
|
||||
component-test-watch: export JEST_USE_SILENT_REPORTER := false
|
||||
component-test-watch: ##@ Watch tests and re-run no changes to cljs files
|
||||
test-component-watch: export TARGET := clojure
|
||||
test-component-watch: export COMPONENT_TEST := true
|
||||
test-component-watch: export BABEL_ENV := test
|
||||
test-component-watch: export JEST_USE_SILENT_REPORTER := false
|
||||
test-component-watch: ##@ Watch tests and re-run no changes to cljs files
|
||||
@scripts/check-metro-shadow-process.sh
|
||||
rm -rf ./component-spec
|
||||
nodemon --exec 'yarn shadow-cljs compile component-test && jest --config=test/jest/jest.config.js --testEnvironment node ' -e cljs
|
||||
|
||||
component-test: export TARGET := clojure
|
||||
component-test: export COMPONENT_TEST := true
|
||||
component-test: export BABEL_ENV := test
|
||||
component-test: export JEST_USE_SILENT_REPORTER := false
|
||||
component-test: ##@test Run component tests once in NodeJS
|
||||
test-component: export TARGET := clojure
|
||||
test-component: export COMPONENT_TEST := true
|
||||
test-component: export BABEL_ENV := test
|
||||
test-component: export JEST_USE_SILENT_REPORTER := false
|
||||
test-component: ##@test Run component tests once in NodeJS
|
||||
@scripts/check-metro-shadow-process.sh
|
||||
rm -rf ./component-spec
|
||||
yarn shadow-cljs compile component-test && \
|
||||
@@ -441,6 +441,10 @@ _list: SHELL := /bin/sh
|
||||
_list:
|
||||
@$(MAKE) -pRrq -f $(lastword $(MAKEFILE_LIST)) : 2>/dev/null | awk -v RS= -F: '/^# File/,/^# Finished Make data base/ {if ($$1 !~ "^[#.]") {print $$1}}' | sort | egrep -v -e '^[^[:alnum:]]' -e '^$@$$'
|
||||
|
||||
patch-file: export TARGET := default
|
||||
patch-file: ##@other Generates patch file for npm deps
|
||||
@scripts/patch-npm-lib.sh
|
||||
|
||||
#--------------
|
||||
# REPLs
|
||||
#--------------
|
||||
|
||||
@@ -138,11 +138,24 @@ def getEnvOrConfig = { varName ->
|
||||
android {
|
||||
ndkVersion rootProject.ext.ndkVersion
|
||||
|
||||
compileSdkVersion rootProject.ext.compileSdkVersion
|
||||
buildToolsVersion rootProject.ext.buildToolsVersion
|
||||
compileSdk rootProject.ext.compileSdkVersion
|
||||
|
||||
kotlinOptions {
|
||||
jvmTarget = JavaVersion.VERSION_17
|
||||
}
|
||||
|
||||
// https://developer.android.com/studio/projects/install-ndk#vanilla_cmake
|
||||
externalNativeBuild {
|
||||
cmake {
|
||||
// This version must match cmakeVersions inside nix/pkgs/android-sdk/compose.nix
|
||||
version "3.22.1"
|
||||
}
|
||||
}
|
||||
|
||||
compileOptions {
|
||||
sourceCompatibility JavaVersion.VERSION_11
|
||||
targetCompatibility JavaVersion.VERSION_11
|
||||
sourceCompatibility JavaVersion.VERSION_17
|
||||
targetCompatibility JavaVersion.VERSION_17
|
||||
}
|
||||
|
||||
namespace "im.status.ethereum"
|
||||
@@ -194,10 +207,6 @@ android {
|
||||
doNotStrip '*/mips/*.so'
|
||||
doNotStrip '*/mips64/*.so'
|
||||
}
|
||||
dexOptions {
|
||||
jumboMode true
|
||||
javaMaxHeapSize "8g"
|
||||
}
|
||||
splits {
|
||||
abi {
|
||||
reset()
|
||||
@@ -286,6 +295,7 @@ dependencies {
|
||||
implementation("com.facebook.fresco:animated-gif:2.5.0")
|
||||
implementation("com.squareup.okhttp3:okhttp-tls:4.9.2")
|
||||
implementation("com.google.prefab:cli:2.0.0")
|
||||
implementation("com.android.tools.build:aapt2:8.1.1-10154469")
|
||||
}
|
||||
|
||||
|
||||
|
||||
@@ -7,7 +7,5 @@
|
||||
<!-- Remove licensing permission since we don't license our app and it blocks F-Droid submissions. -->
|
||||
<uses-permission tools:node="remove" android:name="com.android.vending.CHECK_LICENSE"/>
|
||||
|
||||
<application tools:targetApi="28" tools:ignore="GoogleAppIndexingWarning" android:usesCleartextTraffic="true" >
|
||||
<activity android:name="com.facebook.react.devsupport.DevSettingsActivity" android:exported="false" />
|
||||
</application>
|
||||
<application tools:targetApi="28" tools:ignore="GoogleAppIndexingWarning" android:usesCleartextTraffic="true" />
|
||||
</manifest>
|
||||
|
||||
@@ -2,8 +2,16 @@
|
||||
xmlns:tools="http://schemas.android.com/tools"
|
||||
android:installLocation="auto">
|
||||
|
||||
<queries>
|
||||
<intent>
|
||||
<action android:name="android.intent.action.SEND_MULTIPLE" />
|
||||
<data android:mimeType="*/*" />
|
||||
</intent>
|
||||
</queries>
|
||||
|
||||
<!-- non-dangerous permissions -->
|
||||
<uses-permission android:name="android.permission.FOREGROUND_SERVICE" />
|
||||
<uses-permission android:name="android.permission.FOREGROUND_SERVICE_SPECIAL_USE"/>
|
||||
<uses-permission android:name="android.permission.INTERNET"/>
|
||||
<uses-permission android:name="android.permission.NFC"/>
|
||||
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
|
||||
@@ -74,7 +82,13 @@
|
||||
</intent-filter>
|
||||
</activity>
|
||||
<activity android:name="com.facebook.react.devsupport.DevSettingsActivity"/>
|
||||
<service android:name="im.status.ethereum.pushnotifications.ForegroundService"></service>
|
||||
<service
|
||||
android:name="im.status.ethereum.pushnotifications.ForegroundService"
|
||||
android:foregroundServiceType="specialUse">
|
||||
<property
|
||||
android:name="android.app.PROPERTY_SPECIAL_USE_FGS_SUBTYPE"
|
||||
android:value="local notifications"/>
|
||||
</service>
|
||||
<provider
|
||||
android:name="androidx.core.content.FileProvider"
|
||||
android:authorities="${applicationId}.provider"
|
||||
|
||||
@@ -99,7 +99,7 @@ class MainActivity : NavigationActivity(), ActivityCompat.OnRequestPermissionsRe
|
||||
|
||||
private fun tryToEmit(eventName: String, event: WritableMap) {
|
||||
try {
|
||||
(getApplication() as MainApplication).getReactNativeHost()
|
||||
(getApplication() as MainApplication).reactNativeHost
|
||||
.getReactInstanceManager()
|
||||
.getCurrentReactContext()
|
||||
?.getJSModule(DeviceEventManagerModule.RCTDeviceEventEmitter::class.java)
|
||||
|
||||
@@ -25,14 +25,13 @@ class MainApplication : NavigationApplication() {
|
||||
return BuildConfig.DEBUG
|
||||
}
|
||||
|
||||
override fun getPackages(): List<ReactPackage> {
|
||||
val statusPackage = StatusPackage(RootUtil.isDeviceRooted())
|
||||
val packages = PackageList(this).getPackages()
|
||||
packages.add(statusPackage)
|
||||
packages.add(RNStatusKeycardPackage())
|
||||
packages.add(PushNotificationPackage())
|
||||
packages.add(BlurViewPackage())
|
||||
return packages
|
||||
override fun getPackages(): List<ReactPackage> =
|
||||
PackageList(this).packages.apply {
|
||||
// Packages that cannot be autolinked yet can be added manually here
|
||||
add(StatusPackage(RootUtil.isDeviceRooted()))
|
||||
add(RNStatusKeycardPackage())
|
||||
add(PushNotificationPackage())
|
||||
add(BlurViewPackage())
|
||||
}
|
||||
|
||||
override fun getJSMainModuleName(): String = "index"
|
||||
@@ -42,9 +41,8 @@ class MainApplication : NavigationApplication() {
|
||||
override val isHermesEnabled: Boolean = BuildConfig.IS_HERMES_ENABLED
|
||||
}
|
||||
|
||||
override fun getReactNativeHost(): ReactNativeHost {
|
||||
return mReactNativeHost
|
||||
}
|
||||
override val reactNativeHost: ReactNativeHost
|
||||
get() = mReactNativeHost
|
||||
|
||||
override fun onCreate() {
|
||||
super.onCreate()
|
||||
|
||||
@@ -15,6 +15,8 @@ ext {
|
||||
supportLibVersion = project.supportLibVersion
|
||||
gradlePluginVersion = project.gradlePluginVersion
|
||||
kotlinVersion = project.kotlinPluginVersion
|
||||
kotlinPluginVersion = project.kotlinPluginVersion
|
||||
kotlinToolsVersion = project.kotlinPluginVersion
|
||||
ndkVersion = "25.2.9519653"
|
||||
}
|
||||
|
||||
@@ -28,6 +30,7 @@ buildscript {
|
||||
classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:${project.ext.kotlinPluginVersion}"
|
||||
classpath("com.android.tools.build:gradle")
|
||||
classpath("com.facebook.react:react-native-gradle-plugin")
|
||||
classpath("org.jetbrains.kotlin:kotlin-gradle-plugin")
|
||||
}
|
||||
}
|
||||
|
||||
@@ -41,11 +44,30 @@ subprojects {
|
||||
defaultConfig {
|
||||
targetSdkVersion rootProject.ext.targetSdkVersion
|
||||
}
|
||||
|
||||
// Speed up Tests Stage
|
||||
tasks.withType(Test).configureEach {
|
||||
// https://docs.gradle.org/current/userguide/performance.html#execute_tests_in_parallel
|
||||
maxParallelForks = Runtime.runtime.availableProcessors().intdiv(2) ?: 1
|
||||
// https://docs.gradle.org/current/userguide/performance.html#fork_tests_into_multiple_processes
|
||||
forkEvery = 100
|
||||
// https://docs.gradle.org/current/userguide/performance.html#disable_reports
|
||||
reports.html.required = false
|
||||
reports.junitXml.required = false
|
||||
}
|
||||
// Speed up Java Compile Stage
|
||||
// https://docs.gradle.org/current/userguide/performance.html#run_the_compiler_as_a_separate_process
|
||||
tasks.withType(JavaCompile).configureEach {
|
||||
options.fork = true
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
apply plugin: "com.facebook.react.rootproject"
|
||||
|
||||
allprojects {
|
||||
beforeEvaluate {
|
||||
if (System.env.STATUS_GO_ANDROID_LIBDIR == null || System.env.STATUS_GO_ANDROID_LIBDIR == "") {
|
||||
|
||||
@@ -22,9 +22,9 @@
|
||||
|
||||
# Version requirements used throughout the Gradle scripts
|
||||
minSdkVersion=24
|
||||
compileSdkVersion=33
|
||||
targetSdkVersion=33
|
||||
buildToolsVersion=33.0.0
|
||||
compileSdkVersion=34
|
||||
targetSdkVersion=34
|
||||
buildToolsVersion=34.0.0
|
||||
supportLibVersion=28.0.0
|
||||
# This should match version from nix/pkgs/aapt2/default.nix
|
||||
gradlePluginVersion=7.4.2
|
||||
@@ -43,7 +43,7 @@ ANDROID_ABI_SPLIT=false
|
||||
# Some platforms are excluded though
|
||||
ANDROID_ABI_INCLUDE=armeabi-v7a;arm64-v8a;x86;x86_64
|
||||
|
||||
org.gradle.jvmargs=-Xmx8704M
|
||||
org.gradle.jvmargs=-Xmx8704M -XX:+UseParallelGC
|
||||
|
||||
versionCode=9999
|
||||
commitHash=unknown
|
||||
|
||||
+2
-20
@@ -1,22 +1,4 @@
|
||||
module.exports = {
|
||||
presets: [
|
||||
"@babel/preset-env"
|
||||
// 'module:metro-react-native-babel-preset'
|
||||
],
|
||||
/*plugins: ['react-native-reanimated/plugin', '@babel/plugin-transform-named-capturing-groups-regex'],
|
||||
env: {
|
||||
test: {
|
||||
presets: [
|
||||
'@babel/preset-react',
|
||||
[
|
||||
'@babel/preset-env',
|
||||
{
|
||||
targets: {
|
||||
node: 'current',
|
||||
},
|
||||
},
|
||||
],
|
||||
],
|
||||
},
|
||||
},*/
|
||||
presets: ['module:@react-native/babel-preset'],
|
||||
plugins: ['react-native-reanimated/plugin', '@babel/plugin-transform-named-capturing-groups-regex'],
|
||||
};
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
#!/usr/bin/env groovy
|
||||
library 'status-jenkins-lib@v1.8.7'
|
||||
library 'status-jenkins-lib@v1.8.12'
|
||||
|
||||
/* Options section can't access functions in objects. */
|
||||
def isPRBuild = utils.isPRBuild()
|
||||
@@ -34,10 +34,10 @@ pipeline {
|
||||
}
|
||||
|
||||
environment {
|
||||
LANG = "en_US.UTF-8"
|
||||
LC_ALL = "en_US.UTF-8"
|
||||
LANGUAGE = "en_US.UTF-8"
|
||||
TARGET = "android${utils.isE2EBuild() ? "-e2e" : ""}"
|
||||
LANG = 'en_US.UTF-8'
|
||||
LC_ALL = 'en_US.UTF-8'
|
||||
LANGUAGE = 'en_US.UTF-8'
|
||||
PLATFORM = "android${utils.isE2EBuild() ? "-e2e" : ""}"
|
||||
BUILD_ENV = 'prod'
|
||||
NIX_CONF_DIR = "${env.WORKSPACE}/nix"
|
||||
FASTLANE_DISABLE_COLORS = 1
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
#!/usr/bin/env groovy
|
||||
library 'status-jenkins-lib@v1.8.7'
|
||||
library 'status-jenkins-lib@v1.8.12'
|
||||
|
||||
pipeline {
|
||||
agent { label 'linux' }
|
||||
@@ -81,7 +81,7 @@ pipeline {
|
||||
stage('Publish') {
|
||||
when { expression { params.PUBLISH } }
|
||||
steps { script {
|
||||
switch (btype) {
|
||||
switch (utils.getBuildType()) {
|
||||
case 'nightly': /* Create JSON file with newest build URLs */
|
||||
s3.updateBucketJSON(urls, 'latest.json');
|
||||
break;
|
||||
|
||||
@@ -1,12 +1,12 @@
|
||||
#!/usr/bin/env groovy
|
||||
library 'status-jenkins-lib@v1.8.7'
|
||||
library 'status-jenkins-lib@v1.8.12'
|
||||
|
||||
pipeline {
|
||||
agent { label 'linux' }
|
||||
|
||||
triggers {
|
||||
// Nightly at 2am
|
||||
cron 'H 2 * * *'
|
||||
// Nightly at 0am
|
||||
cron 'H 0 * * *'
|
||||
}
|
||||
|
||||
parameters {
|
||||
|
||||
+5
-5
@@ -1,5 +1,5 @@
|
||||
#!/usr/bin/env groovy
|
||||
library 'status-jenkins-lib@v1.8.7'
|
||||
library 'status-jenkins-lib@v1.8.12'
|
||||
|
||||
/* Options section can't access functions in objects. */
|
||||
def isPRBuild = utils.isPRBuild()
|
||||
@@ -34,10 +34,10 @@ pipeline {
|
||||
}
|
||||
|
||||
environment {
|
||||
LANG = "en_US.UTF-8"
|
||||
LC_ALL = "en_US.UTF-8"
|
||||
LANGUAGE = "en_US.UTF-8"
|
||||
TARGET = 'ios'
|
||||
LANG = 'en_US.UTF-8'
|
||||
LC_ALL = 'en_US.UTF-8'
|
||||
LANGUAGE = 'en_US.UTF-8'
|
||||
PLATFORM = 'ios'
|
||||
NIX_CONF_DIR = "${env.WORKSPACE}/nix"
|
||||
FASTLANE_DISABLE_COLORS = 1
|
||||
BUNDLE_PATH = "${HOME}/.bundle"
|
||||
|
||||
+34
-41
@@ -1,5 +1,5 @@
|
||||
#!/usr/bin/env groovy
|
||||
library 'status-jenkins-lib@v1.8.7'
|
||||
library 'status-jenkins-lib@v1.8.12'
|
||||
|
||||
/* Options section can't access functions in objects. */
|
||||
def isPRBuild = utils.isPRBuild()
|
||||
@@ -29,61 +29,47 @@ pipeline {
|
||||
description: 'Specify build type. Values: pr / e2e / nightly / release',
|
||||
defaultValue: 'pr',
|
||||
)
|
||||
booleanParam(
|
||||
name: 'RUN_CONTRACT_TESTS',
|
||||
description: 'Whether to run optional and slow contract tests.',
|
||||
defaultValue: false,
|
||||
)
|
||||
}
|
||||
|
||||
environment {
|
||||
LANG = "en_US.UTF-8"
|
||||
LC_ALL = "en_US.UTF-8"
|
||||
LANGUAGE = "en_US.UTF-8"
|
||||
TARGET = 'tests'
|
||||
LANG = 'en_US.UTF-8'
|
||||
LC_ALL = 'en_US.UTF-8'
|
||||
LANGUAGE = 'en_US.UTF-8'
|
||||
PLATFORM = 'tests'
|
||||
BUILD_ENV = 'prod'
|
||||
NIX_CONF_DIR = "${env.WORKSPACE}/nix"
|
||||
LOG_FILE = utils.pkgFilename(ext: 'log', arch: 'tests')
|
||||
CLJ_LINTER_PRINT_WARNINGS = 'true'
|
||||
}
|
||||
|
||||
stages {
|
||||
stage('Checks') {
|
||||
stage('Test') {
|
||||
parallel {
|
||||
stage('Lint') {
|
||||
steps {
|
||||
sh """#!/bin/bash
|
||||
set -eo pipefail
|
||||
make lint CLJ_LINTER_PRINT_WARNINGS=true 2>&1 | tee ${LOG_FILE}
|
||||
"""
|
||||
}
|
||||
steps { make('lint') }
|
||||
}
|
||||
stage('Unit Tests') {
|
||||
steps {
|
||||
sh """#!/bin/bash
|
||||
set -eo pipefail
|
||||
make test-unit 2>&1 | tee -a ${LOG_FILE}
|
||||
"""
|
||||
}
|
||||
stage('Unit') {
|
||||
steps { make('test-unit') }
|
||||
}
|
||||
stage('Component') {
|
||||
steps { make('test-component') }
|
||||
}
|
||||
}
|
||||
}
|
||||
stage('Contract Tests') {
|
||||
steps {
|
||||
sh """#!/bin/bash
|
||||
set -eo pipefail
|
||||
make test-contract 2>&1 | tee -a ${LOG_FILE}
|
||||
"""
|
||||
}
|
||||
}
|
||||
stage('Integration Tests') {
|
||||
steps {
|
||||
sh """#!/bin/bash
|
||||
set -eo pipefail
|
||||
make test-integration 2>&1 | tee -a ${LOG_FILE}
|
||||
"""
|
||||
}
|
||||
}
|
||||
stage('Component Tests') {
|
||||
steps {
|
||||
sh """#!/bin/bash
|
||||
set -eo pipefail
|
||||
make component-test 2>&1 | tee -a ${LOG_FILE}
|
||||
"""
|
||||
stage('Heavy Test') {
|
||||
parallel {
|
||||
stage('Contract') {
|
||||
when { expression { params.RUN_CONTRACT_TESTS } }
|
||||
steps { make('test-contract') }
|
||||
}
|
||||
stage('Integration') {
|
||||
steps { make('test-integration') }
|
||||
}
|
||||
}
|
||||
}
|
||||
stage('Upload') {
|
||||
@@ -100,3 +86,10 @@ pipeline {
|
||||
always { sh 'make purge' }
|
||||
}
|
||||
}
|
||||
|
||||
def make(target) {
|
||||
sh """#!/bin/bash
|
||||
set -eo pipefail
|
||||
make ${target} 2>&1 | tee -a ${LOG_FILE}
|
||||
"""
|
||||
}
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
#!/usr/bin/env groovy
|
||||
library 'status-jenkins-lib@v1.8.7'
|
||||
library 'status-jenkins-lib@v1.8.12'
|
||||
|
||||
pipeline {
|
||||
|
||||
@@ -36,6 +36,12 @@ pipeline {
|
||||
))
|
||||
}
|
||||
|
||||
environment {
|
||||
/* Avoid race conditions with other builds using virtualenv. */
|
||||
VIRTUAL_ENV = "${WORKSPACE_TMP}/venv"
|
||||
PATH = "${VIRTUAL_ENV}/bin:${PATH}"
|
||||
}
|
||||
|
||||
stages {
|
||||
stage('Fetch') {
|
||||
steps { script {
|
||||
@@ -52,7 +58,8 @@ pipeline {
|
||||
stage('Setup') {
|
||||
steps { script {
|
||||
dir('test/appium') {
|
||||
sh 'pip3 install --user -r requirements.txt'
|
||||
sh "python3 -m venv ${VIRTUAL_ENV}"
|
||||
sh 'pip3 install -r requirements.txt'
|
||||
}
|
||||
} }
|
||||
}
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
#!/usr/bin/env groovy
|
||||
library 'status-jenkins-lib@v1.8.7'
|
||||
library 'status-jenkins-lib@v1.8.12'
|
||||
|
||||
pipeline {
|
||||
|
||||
@@ -54,6 +54,12 @@ pipeline {
|
||||
))
|
||||
}
|
||||
|
||||
environment {
|
||||
/* Avoid race conditions with other builds using virtualenv. */
|
||||
VIRTUAL_ENV = "${WORKSPACE_TMP}/venv"
|
||||
PATH = "${VIRTUAL_ENV}/bin:${PATH}"
|
||||
}
|
||||
|
||||
stages {
|
||||
stage('Prep') {
|
||||
steps { script {
|
||||
@@ -79,7 +85,8 @@ pipeline {
|
||||
stage('Setup') {
|
||||
steps { script {
|
||||
dir('test/appium') {
|
||||
sh 'pip3 install --user -r requirements.txt'
|
||||
sh "python3 -m venv ${VIRTUAL_ENV}"
|
||||
sh 'pip3 install -r requirements.txt'
|
||||
}
|
||||
} }
|
||||
}
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
#!/usr/bin/env groovy
|
||||
library 'status-jenkins-lib@v1.8.7'
|
||||
library 'status-jenkins-lib@v1.8.12'
|
||||
|
||||
pipeline {
|
||||
|
||||
@@ -35,6 +35,11 @@ pipeline {
|
||||
))
|
||||
}
|
||||
|
||||
environment {
|
||||
/* Avoid race conditions with other builds using virtualenv. */
|
||||
VIRTUAL_ENV = "${WORKSPACE_TMP}/venv"
|
||||
PATH = "${VIRTUAL_ENV}/bin:${PATH}"
|
||||
}
|
||||
|
||||
stages {
|
||||
stage('Prep') {
|
||||
@@ -51,7 +56,8 @@ pipeline {
|
||||
stage('Setup') {
|
||||
steps { script {
|
||||
dir('test/appium') {
|
||||
sh 'pip3 install --user -r requirements.txt'
|
||||
sh "python3 -m venv ${VIRTUAL_ENV}"
|
||||
sh 'pip3 install -r requirements.txt'
|
||||
}
|
||||
} }
|
||||
}
|
||||
|
||||
@@ -1,14 +1,14 @@
|
||||
#!/usr/bin/env groovy
|
||||
library 'status-jenkins-lib@v1.8.7'
|
||||
library 'status-jenkins-lib@v1.8.12'
|
||||
|
||||
pipeline {
|
||||
agent { label 'macos' }
|
||||
|
||||
environment {
|
||||
LANG = 'en_US.UTF-8'
|
||||
LANGUAGE = 'en_US.UTF-8'
|
||||
LC_ALL = 'en_US.UTF-8'
|
||||
TARGET = 'ios'
|
||||
LANG = 'en_US.UTF-8'
|
||||
LANGUAGE = 'en_US.UTF-8'
|
||||
LC_ALL = 'en_US.UTF-8'
|
||||
PLATFORM = 'ios'
|
||||
FASTLANE_DISABLE_COLORS = 1
|
||||
/* avoid writing to r/o /nix */
|
||||
GEM_HOME = '~/.rubygems'
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
#!/usr/bin/env groovy
|
||||
library 'status-jenkins-lib@v1.8.7'
|
||||
library 'status-jenkins-lib@v1.8.12'
|
||||
|
||||
pipeline {
|
||||
agent { label params.AGENT_LABEL }
|
||||
|
||||
@@ -1,14 +1,14 @@
|
||||
#!/usr/bin/env groovy
|
||||
library 'status-jenkins-lib@v1.8.7'
|
||||
library 'status-jenkins-lib@v1.8.12'
|
||||
|
||||
pipeline {
|
||||
agent { label 'linux' }
|
||||
|
||||
environment {
|
||||
LANG = 'en_US.UTF-8'
|
||||
LANGUAGE = 'en_US.UTF-8'
|
||||
LC_ALL = 'en_US.UTF-8'
|
||||
TARGET = 'ios'
|
||||
LANG = 'en_US.UTF-8'
|
||||
LANGUAGE = 'en_US.UTF-8'
|
||||
LC_ALL = 'en_US.UTF-8'
|
||||
PLATFORM = 'ios'
|
||||
FASTLANE_DISABLE_COLORS = 1
|
||||
/* avoid writing to r/o /nix */
|
||||
GEM_HOME = '~/.rubygems'
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
#!/usr/bin/env groovy
|
||||
library 'status-jenkins-lib@v1.8.7'
|
||||
library 'status-jenkins-lib@v1.8.12'
|
||||
|
||||
pipeline {
|
||||
agent {
|
||||
|
||||
@@ -16,10 +16,10 @@ Both of these links are showing it for React-Testing-Library (not Native) howeve
|
||||
## Running the tests
|
||||
To run these tests there are two methods.
|
||||
|
||||
`make component-test`
|
||||
`make test-component`
|
||||
setups and runs the test suite once.
|
||||
|
||||
`make component-test-watch`
|
||||
`make test-component-watch`
|
||||
setups and runs the test suite and watches for code changes will then retrigger the test suite.
|
||||
|
||||
## Writing Tests
|
||||
@@ -38,7 +38,7 @@ There is a file of utility functions defined in "src/test_helpers/component.cljs
|
||||
## Configuration
|
||||
Status Mobile has a bespoke tech stack, as such there is more complexities to configuring the tests.
|
||||
|
||||
### Shadow-CLJS
|
||||
### Shadow-CLJS
|
||||
the configuration for compiling our tests are defined in the "shadow-cljs.edn" file.
|
||||
The three main parts of this are
|
||||
`:target :npm-module`
|
||||
@@ -47,9 +47,9 @@ Needed for the configuration we are using
|
||||
a vector of entry points for the test files.
|
||||
and the `ns-regexp` to specify what tests to find. Since we have multiple forms of tests we decided that "component-spec" is the least likely to detect the wrong file type.
|
||||
|
||||
It's worth knowing that our tests are compiled to JS and then run in the temporary folder `component-tests`.
|
||||
It's worth knowing that our tests are compiled to JS and then run in the temporary folder `component-tests`.
|
||||
|
||||
### Jest
|
||||
There is also further configuration for Jest in "test/jest". There is a jest config file which has some mostly standard configuration pieces, where the tests live, what environment variables are set etc. This is documented by Jest here: https://jestjs.io/docs/configuration
|
||||
|
||||
There is also a setup file which is used to set some global and default values. Additionally this file is used to mock some of the react native (among other) dependencies
|
||||
There is also a setup file which is used to set some global and default values. Additionally this file is used to mock some of the react native (among other) dependencies.
|
||||
|
||||
+5
-15
@@ -20,12 +20,6 @@ required by bignumber.js otherwise there is a compilation error
|
||||
|
||||
used to generate guids and random values in `status-im.utils.random`
|
||||
|
||||
## "create-react-class": "15.6.2"
|
||||
|
||||
fixed version because even bugfix update causes compilation error with current version of react-native (0.59)
|
||||
|
||||
internal react library, used by figwheel for instance but also probably react
|
||||
|
||||
## "emojilib": "^2.4.0"
|
||||
|
||||
used for emojis
|
||||
@@ -113,11 +107,6 @@ used for profile picture
|
||||
used for storing password when user saves password
|
||||
TODO: check if fork is necessary, merge with upstream?
|
||||
|
||||
## "react-native-languages": "^3.0.2"
|
||||
|
||||
TODO DEPRECATED, should be replaced with https://github.com/react-native-community/react-native-localize
|
||||
used to get user language and interact with i18n.js
|
||||
|
||||
## "react-native-mail": "git+https://github.com/status-im/react-native-mail.git#v3.0.8_status"
|
||||
|
||||
used to send email to support when phone is shaked
|
||||
@@ -131,6 +120,7 @@ TODO: update once bug is fixed for Android that causes crash when app is back fr
|
||||
## "react-native-shake": "^3.3.1"
|
||||
|
||||
used to send email to support when phone is shaked
|
||||
|
||||
## "react-native-lottie-splash-screen": "^1.0.1"
|
||||
|
||||
used to make splash screen with lottie animation during initial loading for android, also used as replacement of "react-native-splash-screen" for iOS
|
||||
@@ -157,10 +147,10 @@ used for browser
|
||||
used for native navigation
|
||||
fixed because even bugfix version upgrade causes runtime errors with current version of react-native
|
||||
|
||||
## "rn-emoji-keyboard": "https://github.com/status-im/rn-emoji-keyboard"
|
||||
|
||||
Used for taking emoji input, for custom emoji thumbnails for community channels
|
||||
|
||||
## "react-native-draggable-flatlist": "https://github.com/computerjazz/react-native-draggable-flatlist"
|
||||
|
||||
A drag-and-drop-enabled FlatList component for React Native
|
||||
|
||||
## "react-native-shadow-2": "https://github.com/SrBrahma/react-native-shadow-2"
|
||||
|
||||
A shadow component that is consistent across both platforms
|
||||
|
||||
+55
-22
@@ -2,46 +2,80 @@
|
||||
|
||||
[Pipeline for QA](https://github.com/status-im/status-mobile/projects/7) is a project board for developers and testers used to track the status of a pull request, get reviews and manual testing, and run autotests.
|
||||
|
||||
The generally accepted recommendations for its use are described below:
|
||||
The generally accepted requirements for its use are described below:
|
||||
|
||||
## Opening a PR
|
||||
- Once a PR is created, it moves to the ```REVIEW``` column where a review will be requested automatically.
|
||||
- You can also request a review inside the PR from a particular person if needed.
|
||||
- When creating a PR, do not forget to assign it to yourself.
|
||||
- Also in case the PR adds new functionality, a short description would be appreciated.
|
||||
- Also in case the PR adds new functionality, a description **MUST** be added.
|
||||
|
||||
### What if the work is still in progress?
|
||||
|
||||
- If PR work is not finished yet, please mark it as a draft or add [WIP] to the title and keep it in the `CONTRIBUTOR` column until it's ready to be reviewed/tested.
|
||||
- Alternatively, you can open a `draft`.
|
||||
|
||||
### When is a PR considered ready to move forward?
|
||||
|
||||
Ready for testing, a PR should meet the following criteria:
|
||||
|
||||
1. Reviewed and has at least 1 approval.
|
||||
2. Rebased to the `develop` branch (both `status-mobile` and `status-go` if needed, depending on what part has changes).
|
||||
- **NOTE:** QAs can use the `Update with rebase` button from GitHub if:
|
||||
- The PR has no `status-go` changes.
|
||||
- The PR has no conflict with the develop branch.
|
||||
3. All possible conflicts have been resolved.
|
||||
4. Has the label: `request-manual-qa` or `skip-manual-qa`.
|
||||
5. PRs **MUST** identify what area is affected and should have a description.
|
||||
|
||||
|
||||
### When is a PR considered to be Ready for testing by QA team?
|
||||
Ready for testing PR should meet the following criteria:
|
||||
### E2E tests and analyzing the results
|
||||
|
||||
1. Reviewed and has at least 1 approval
|
||||
2. Rebased to `develop` branch (both `status-mobile` and `status-go` if needed, depending on what part has changes)
|
||||
3. All possible conflicts have been resolved
|
||||
4. Has the label: `request-manual-qa`
|
||||
The PR **MUST** be moved to the E2E column when it is ready for testing (**mandatory for all PRs**).
|
||||
That will also trigger e2e tests run. QAs are monitoring PRs from E2E column and take it into test.
|
||||
This step cannot be skipped. So, at least one comment from the `status-im-auto` bot with results is a prerequisite for moving forward.
|
||||
Information on how to analyze tests can be found [here](https://github.com/status-im/status-mobile/blob/develop/doc/how-to-launch-e2e.md).
|
||||
Tests might be flaky, as they depend on infrastructure - SauceLabs and Waku.
|
||||
|
||||
**From the perspective of a developer it means that once work on PR is finished:**
|
||||
If there are `Failed tests` and you are not sure about the reason, you can always ping the mobile QAs for help (preferably in PRs by `@status-im/mobile-qa`).
|
||||
|
||||
1. It should be rebased to the latest `develop`. If there are conflicts - they should be resolved if possible.
|
||||
2. If the PR was in the `Contributor` column - it should be moved to `Review` column.
|
||||
3. Wait for the review.
|
||||
4. Make sure that after review and before requesting manual QA your PR is rebased to current develop.
|
||||
5. Once the PR has been approved by reviewer(s) - label `request-manual-qa` should be applied to the PR
|
||||
6. Move PR to the E2E column when it is ready for testing (**mandatory for all PRs**). That will also trigger e2e tests run. QAs are monitoring PRs from E2E column and take it into test.
|
||||
|
||||
After that - PR will be taken into manual testing by the QA team.
|
||||
**For now, it is the only reliable source of regression in the app because, due to time constraints, it is not possible to test thoroughly each PR.
|
||||
Please, respect this rule.**
|
||||
|
||||
## Testing PR
|
||||
|
||||
### Adding `skip-manual-qa`
|
||||
|
||||
**Do not hesitate to use a `skip-manual-qa`** if you're sure that it is a simple flow and you checked it.
|
||||
- Please ask another team member before adding the `skip-manual-qa` label (PR/Status community/DMs) so that there's a second opinion.
|
||||
- The PR MUST have a proper reasoning why manual QA is skipped.
|
||||
- The PR MUST include the steps of testing that has been done by the developer prior to moving it forward.
|
||||
|
||||
**NOTE:** Make sure that QAs are OK with that;
|
||||
|
||||
Before merging PRs, please make sure that information is added about how you tested the PRs, that e2s have been passed and their results have been reviewed.
|
||||
|
||||
The QA team appreciates your help!
|
||||
|
||||
|
||||
### Manual testing
|
||||
- If you think PR needs and is ready for manual testing, please add the ```request-manual-qa``` label.
|
||||
|
||||
#### Prerequisites for manual testing
|
||||
1. PR has a description of the change and details the area of the application affected by the change.
|
||||
2. PR has automation results from the previous E2E test run step.
|
||||
3. PR includes a demo, test steps, and any possible regression(s)
|
||||
4. If appropriate, PR details what elements of a feature are out of scope.
|
||||
|
||||
**If one of the prerequisites is missing, the PR will be moved to the contributor folder with a corresponding comment.**
|
||||
|
||||
- If you think a PR needs and is ready for manual testing, please add the `request-manual-qa` label.
|
||||
- QA engineer picks up one of PRs with the ```request-manual-qa``` label, drags the item to the ```IN TESTING``` column and assigns it to themselves.
|
||||
- During testing, QA will add comments describing the issues found, and also review automation tests results.
|
||||
Usually found issues are numbered as "Issue 1, Issue 2", etc.
|
||||
When the first round of testing is completed and all issues for this stage are found, the QA can add the ```Tested - Issues``` label and drag the card to the ```CONTRIBUTOR``` column. These two actions are optional.
|
||||
When the first round of testing is completed and all issues for this stage are found, the QA can add the ```Tested - Issues``` label and drag the card to the ```CONTRIBUTOR``` column. These two actions are optional.
|
||||
|
||||
**IMPORTANT NOTE:** when the issues are fixed, developer **MUST** notify the QA that it is ready to be re-tested again by mention them in the PR.
|
||||
|
||||
- When manual testing of the PR is fully completed and all the issues are fixed, the QA adds the ```Tested - OK``` label and drags the card to the ```Design review``` column (the cases when design review is necessary are described below).
|
||||
- If design review is not required, the QA drags the PR to the ```MERGE``` column. After that the developer merges PR into develop.
|
||||
- If design review has been done, the designer (```@Francesca-G```) drags the PR to the ```MERGE``` column.
|
||||
@@ -64,11 +98,11 @@ There are three possible scenarios when the design review is completed:
|
||||
---
|
||||
**Notes:**
|
||||
- If your PR has a long story and started from `develop` branch several days ago, please rebase it to current develop before adding label
|
||||
- if PR can be tested by developer (in case of small changes) and/or developer is sure that the changes made cannot introduce a regression, then PR can be merged without manual testing. Also, currently, PRs are not manually tested if the changes relate only the design (creation of components, etc.) and do not affect the functionality.
|
||||
- if PR can be tested by developer (in case of small changes) and/or developer is sure that the changes made cannot introduce a regression, then PR can be merged without manual testing. Also, currently, PRs are not manually tested if the changes relate only the design (creation of components, etc.) and do not affect the functionality (see `skip-manual-qa` label)
|
||||
---
|
||||
|
||||
#### Why my PR is in `Contributor` column?
|
||||
PR can be moved to this column by the ```status-github-bot``` or by QA engineer with label `Tested-issues`.
|
||||
PR can be moved to this column by the ```status-github-bot``` or by QA engineer with label `Tested-issues` or if one of the requirements for manual QA was not met.
|
||||
In the first case most often this happens due to conflicting files in PR.
|
||||
In the second case - after fixing of all found issues, the developer should ping the QA in the PR comments for retesting.
|
||||
|
||||
@@ -86,7 +120,6 @@ In the second case - after fixing of all found issues, the developer should ping
|
||||
6. In case of manual testing - the label ```Tested - OK``` from QA
|
||||
7. In case of design review - the approval from the designer
|
||||
|
||||
|
||||
You can merge your PR into develop - some useful clues you can find [here](https://notes.status.im/setup-e2e#3-Merging-PR)
|
||||
|
||||
HAPPY DEVELOPMENT! :tada:
|
||||
|
||||
+2
-2
@@ -54,13 +54,13 @@ Here I'm showing a terminal-only experience using Tmux (left pane Emacs, right p
|
||||
To run tests:
|
||||
|
||||
```
|
||||
make component-test
|
||||
make test-component
|
||||
```
|
||||
|
||||
Also test watcher can be launched. It will re-run the entire test suite when any file is modified
|
||||
|
||||
```
|
||||
make component-test-watch
|
||||
make test-component-watch
|
||||
```
|
||||
|
||||
Check [component tests doc](./component-tests-overview.md) for more.
|
||||
|
||||
@@ -128,3 +128,19 @@ Status-mobile uses `shadow-cljs` for hot reloading changes and uses its own [rel
|
||||
|
||||
### Solution
|
||||
Open react native's [In-App Developer Menu](https://reactnative.dev/docs/debugging#accessing-the-in-app-developer-menu) and press "Disable Fast Refresh" or "Disable Hot Reloading"
|
||||
|
||||
# App crashing after running `make run-ios`
|
||||
|
||||
### Cause
|
||||
It's possible that installing XCode from a `.xip` file might cause XCode to act funny
|
||||
Since it's not installed from the App Store, Or you might be missing a Rosetta installation.
|
||||
|
||||
[Reference/Similar issue](https://github.com/expo/expo-cli/issues/3197)
|
||||
|
||||
You might see something like this after running `make run-ios`:
|
||||
```
|
||||
Underlying error (domain=FBSOpenApplicationServiceErrorDomain, code=1):
|
||||
```
|
||||
### Solution
|
||||
Run `softwareupdate --install-rosetta --agree-to-license`
|
||||
to accept XCode's license and install Rosetta.
|
||||
|
||||
+2
-2
@@ -164,7 +164,7 @@ def build_ios_e2e
|
||||
# 3. directory where to up StatusIm.app
|
||||
derived_data_path: 'status-ios',
|
||||
output_name: 'StatusIm.app',
|
||||
buildlog_path: 'ios/logs',
|
||||
buildlog_path: 'logs',
|
||||
# -------------------------------------
|
||||
# Normal stuff
|
||||
scheme: 'StatusIm',
|
||||
@@ -231,7 +231,7 @@ platform :ios do
|
||||
clean: true,
|
||||
export_method: 'app-store',
|
||||
output_directory: 'status-ios',
|
||||
buildlog_path: 'ios/logs',
|
||||
buildlog_path: 'logs',
|
||||
include_symbols: false,
|
||||
export_options: {
|
||||
"combileBitcode": true,
|
||||
|
||||
@@ -1,3 +1,4 @@
|
||||
source 'https://rubygems.org'
|
||||
|
||||
gem 'activesupport', '>= 6.1.7.3', '< 7.1.0'
|
||||
gem 'fastlane', '>= 2.131.0'
|
||||
|
||||
+60
-51
@@ -3,25 +3,30 @@ GEM
|
||||
specs:
|
||||
CFPropertyList (3.0.6)
|
||||
rexml
|
||||
addressable (2.8.4)
|
||||
activesupport (7.0.8)
|
||||
concurrent-ruby (~> 1.0, >= 1.0.2)
|
||||
i18n (>= 1.6, < 2)
|
||||
minitest (>= 5.1)
|
||||
tzinfo (~> 2.0)
|
||||
addressable (2.8.6)
|
||||
public_suffix (>= 2.0.2, < 6.0)
|
||||
artifactory (3.0.15)
|
||||
atomos (0.1.3)
|
||||
aws-eventstream (1.2.0)
|
||||
aws-partitions (1.768.0)
|
||||
aws-sdk-core (3.173.0)
|
||||
aws-eventstream (~> 1, >= 1.0.2)
|
||||
aws-eventstream (1.3.0)
|
||||
aws-partitions (1.872.0)
|
||||
aws-sdk-core (3.190.1)
|
||||
aws-eventstream (~> 1, >= 1.3.0)
|
||||
aws-partitions (~> 1, >= 1.651.0)
|
||||
aws-sigv4 (~> 1.5)
|
||||
aws-sigv4 (~> 1.8)
|
||||
jmespath (~> 1, >= 1.6.1)
|
||||
aws-sdk-kms (1.64.0)
|
||||
aws-sdk-core (~> 3, >= 3.165.0)
|
||||
aws-sdk-kms (1.75.0)
|
||||
aws-sdk-core (~> 3, >= 3.188.0)
|
||||
aws-sigv4 (~> 1.1)
|
||||
aws-sdk-s3 (1.122.0)
|
||||
aws-sdk-core (~> 3, >= 3.165.0)
|
||||
aws-sdk-s3 (1.141.0)
|
||||
aws-sdk-core (~> 3, >= 3.189.0)
|
||||
aws-sdk-kms (~> 1)
|
||||
aws-sigv4 (~> 1.4)
|
||||
aws-sigv4 (1.5.2)
|
||||
aws-sigv4 (~> 1.8)
|
||||
aws-sigv4 (1.8.0)
|
||||
aws-eventstream (~> 1, >= 1.0.2)
|
||||
babosa (1.0.4)
|
||||
claide (1.1.0)
|
||||
@@ -29,14 +34,14 @@ GEM
|
||||
colored2 (3.1.2)
|
||||
commander (4.6.0)
|
||||
highline (~> 2.0.0)
|
||||
concurrent-ruby (1.2.2)
|
||||
declarative (0.0.20)
|
||||
digest-crc (0.6.4)
|
||||
digest-crc (0.6.5)
|
||||
rake (>= 12.0.0, < 14.0.0)
|
||||
domain_name (0.5.20190701)
|
||||
unf (>= 0.0.5, < 1.0.0)
|
||||
domain_name (0.6.20231109)
|
||||
dotenv (2.8.1)
|
||||
emoji_regex (3.2.3)
|
||||
excon (0.99.0)
|
||||
excon (0.108.0)
|
||||
faraday (1.10.3)
|
||||
faraday-em_http (~> 1.0)
|
||||
faraday-em_synchrony (~> 1.0)
|
||||
@@ -66,7 +71,7 @@ GEM
|
||||
faraday_middleware (1.2.0)
|
||||
faraday (~> 1.0)
|
||||
fastimage (2.2.7)
|
||||
fastlane (2.212.2)
|
||||
fastlane (2.217.0)
|
||||
CFPropertyList (>= 2.3, < 4.0.0)
|
||||
addressable (>= 2.8, < 3.0.0)
|
||||
artifactory (~> 3.0)
|
||||
@@ -87,10 +92,11 @@ GEM
|
||||
google-apis-playcustomapp_v1 (~> 0.1)
|
||||
google-cloud-storage (~> 1.31)
|
||||
highline (~> 2.0)
|
||||
http-cookie (~> 1.0.5)
|
||||
json (< 3.0.0)
|
||||
jwt (>= 2.1.0, < 3)
|
||||
mini_magick (>= 4.9.4, < 5.0.0)
|
||||
multipart-post (~> 2.0.0)
|
||||
multipart-post (>= 2.0.0, < 3.0.0)
|
||||
naturally (~> 2.2)
|
||||
optparse (~> 0.1.1)
|
||||
plist (>= 3.1.0, < 4.0.0)
|
||||
@@ -98,7 +104,7 @@ GEM
|
||||
security (= 0.1.3)
|
||||
simctl (~> 1.6.3)
|
||||
terminal-notifier (>= 2.0.0, < 3.0.0)
|
||||
terminal-table (>= 1.4.5, < 2.0.0)
|
||||
terminal-table (~> 3)
|
||||
tty-screen (>= 0.6.3, < 1.0.0)
|
||||
tty-spinner (>= 0.8.0, < 1.0.0)
|
||||
word_wrap (~> 1.0.0)
|
||||
@@ -106,9 +112,9 @@ GEM
|
||||
xcpretty (~> 0.3.0)
|
||||
xcpretty-travis-formatter (>= 0.0.3)
|
||||
gh_inspector (1.1.3)
|
||||
google-apis-androidpublisher_v3 (0.42.0)
|
||||
google-apis-androidpublisher_v3 (0.54.0)
|
||||
google-apis-core (>= 0.11.0, < 2.a)
|
||||
google-apis-core (0.11.0)
|
||||
google-apis-core (0.11.2)
|
||||
addressable (~> 2.5, >= 2.5.1)
|
||||
googleauth (>= 0.16.2, < 2.a)
|
||||
httpclient (>= 2.8.1, < 3.a)
|
||||
@@ -121,26 +127,26 @@ GEM
|
||||
google-apis-core (>= 0.11.0, < 2.a)
|
||||
google-apis-playcustomapp_v1 (0.13.0)
|
||||
google-apis-core (>= 0.11.0, < 2.a)
|
||||
google-apis-storage_v1 (0.19.0)
|
||||
google-apis-core (>= 0.9.0, < 2.a)
|
||||
google-cloud-core (1.6.0)
|
||||
google-cloud-env (~> 1.0)
|
||||
google-apis-storage_v1 (0.29.0)
|
||||
google-apis-core (>= 0.11.0, < 2.a)
|
||||
google-cloud-core (1.6.1)
|
||||
google-cloud-env (>= 1.0, < 3.a)
|
||||
google-cloud-errors (~> 1.0)
|
||||
google-cloud-env (1.6.0)
|
||||
faraday (>= 0.17.3, < 3.0)
|
||||
google-cloud-env (2.1.0)
|
||||
faraday (>= 1.0, < 3.a)
|
||||
google-cloud-errors (1.3.1)
|
||||
google-cloud-storage (1.44.0)
|
||||
google-cloud-storage (1.45.0)
|
||||
addressable (~> 2.8)
|
||||
digest-crc (~> 0.4)
|
||||
google-apis-iamcredentials_v1 (~> 0.1)
|
||||
google-apis-storage_v1 (~> 0.19.0)
|
||||
google-apis-storage_v1 (~> 0.29.0)
|
||||
google-cloud-core (~> 1.6)
|
||||
googleauth (>= 0.16.2, < 2.a)
|
||||
mini_mime (~> 1.0)
|
||||
googleauth (1.5.2)
|
||||
faraday (>= 0.17.3, < 3.a)
|
||||
googleauth (1.9.1)
|
||||
faraday (>= 1.0, < 3.a)
|
||||
google-cloud-env (~> 2.1)
|
||||
jwt (>= 1.4, < 3.0)
|
||||
memoist (~> 0.16)
|
||||
multi_json (~> 1.11)
|
||||
os (>= 0.9, < 2.0)
|
||||
signet (>= 0.16, < 2.a)
|
||||
@@ -148,32 +154,34 @@ GEM
|
||||
http-cookie (1.0.5)
|
||||
domain_name (~> 0.5)
|
||||
httpclient (2.8.3)
|
||||
i18n (1.14.1)
|
||||
concurrent-ruby (~> 1.0)
|
||||
jmespath (1.6.2)
|
||||
json (2.6.3)
|
||||
jwt (2.7.0)
|
||||
memoist (0.16.2)
|
||||
json (2.7.1)
|
||||
jwt (2.7.1)
|
||||
mini_magick (4.12.0)
|
||||
mini_mime (1.1.2)
|
||||
mini_mime (1.1.5)
|
||||
minitest (5.20.0)
|
||||
multi_json (1.15.0)
|
||||
multipart-post (2.0.0)
|
||||
multipart-post (2.3.0)
|
||||
nanaimo (0.3.0)
|
||||
naturally (2.2.1)
|
||||
optparse (0.1.1)
|
||||
os (1.1.4)
|
||||
plist (3.7.0)
|
||||
public_suffix (5.0.1)
|
||||
rake (13.0.6)
|
||||
public_suffix (5.0.4)
|
||||
rake (13.1.0)
|
||||
representable (3.2.0)
|
||||
declarative (< 0.1.0)
|
||||
trailblazer-option (>= 0.1.1, < 0.2.0)
|
||||
uber (< 0.2.0)
|
||||
retriable (3.1.2)
|
||||
rexml (3.2.5)
|
||||
rexml (3.2.6)
|
||||
rouge (2.0.7)
|
||||
ruby2_keywords (0.0.5)
|
||||
rubyzip (2.3.2)
|
||||
security (0.1.3)
|
||||
signet (0.17.0)
|
||||
signet (0.18.0)
|
||||
addressable (~> 2.8)
|
||||
faraday (>= 0.17.5, < 3.a)
|
||||
jwt (>= 1.5, < 3.0)
|
||||
@@ -182,21 +190,20 @@ GEM
|
||||
CFPropertyList
|
||||
naturally
|
||||
terminal-notifier (2.0.0)
|
||||
terminal-table (1.8.0)
|
||||
unicode-display_width (~> 1.1, >= 1.1.1)
|
||||
terminal-table (3.0.2)
|
||||
unicode-display_width (>= 1.1.1, < 3)
|
||||
trailblazer-option (0.1.2)
|
||||
tty-cursor (0.7.1)
|
||||
tty-screen (0.8.1)
|
||||
tty-screen (0.8.2)
|
||||
tty-spinner (0.9.3)
|
||||
tty-cursor (~> 0.7)
|
||||
tzinfo (2.0.6)
|
||||
concurrent-ruby (~> 1.0)
|
||||
uber (0.1.0)
|
||||
unf (0.1.4)
|
||||
unf_ext
|
||||
unf_ext (0.0.8.2)
|
||||
unicode-display_width (1.8.0)
|
||||
unicode-display_width (2.5.0)
|
||||
webrick (1.8.1)
|
||||
word_wrap (1.0.0)
|
||||
xcodeproj (1.22.0)
|
||||
xcodeproj (1.23.0)
|
||||
CFPropertyList (>= 2.3.3, < 4.0)
|
||||
atomos (~> 0.1.3)
|
||||
claide (>= 1.0.2, < 2.0)
|
||||
@@ -209,10 +216,12 @@ GEM
|
||||
xcpretty (~> 0.2, >= 0.0.7)
|
||||
|
||||
PLATFORMS
|
||||
ruby
|
||||
arm64-darwin-22
|
||||
x86_64-darwin-22
|
||||
|
||||
DEPENDENCIES
|
||||
activesupport (>= 6.1.7.3, < 7.1.0)
|
||||
fastlane (>= 2.131.0)
|
||||
|
||||
BUNDLED WITH
|
||||
2.3.9
|
||||
2.4.13
|
||||
|
||||
+115
-94
@@ -1,14 +1,25 @@
|
||||
{
|
||||
activesupport = {
|
||||
dependencies = ["concurrent-ruby" "i18n" "minitest" "tzinfo"];
|
||||
groups = ["default"];
|
||||
platforms = [];
|
||||
source = {
|
||||
remotes = ["https://rubygems.org"];
|
||||
sha256 = "188kbwkn1lbhz40ala8ykp20jzqphgc68g3d8flin8cqa2xid0s5";
|
||||
type = "gem";
|
||||
};
|
||||
version = "7.0.8";
|
||||
};
|
||||
addressable = {
|
||||
dependencies = ["public_suffix"];
|
||||
groups = ["default"];
|
||||
platforms = [];
|
||||
source = {
|
||||
remotes = ["https://rubygems.org"];
|
||||
sha256 = "15s8van7r2ad3dq6i03l3z4hqnvxcq75a3h72kxvf9an53sqma20";
|
||||
sha256 = "0irbdwkkjwzajq1ip6ba46q49sxnrl2cw7ddkdhsfhb6aprnm3vr";
|
||||
type = "gem";
|
||||
};
|
||||
version = "2.8.4";
|
||||
version = "2.8.6";
|
||||
};
|
||||
artifactory = {
|
||||
groups = ["default"];
|
||||
@@ -35,20 +46,20 @@
|
||||
platforms = [];
|
||||
source = {
|
||||
remotes = ["https://rubygems.org"];
|
||||
sha256 = "1pyis1nvnbjxk12a43xvgj2gv0mvp4cnkc1gzw0v1018r61399gz";
|
||||
sha256 = "0gvdg4yx4p9av2glmp7vsxhs0n8fj1ga9kq2xdb8f95j7b04qhzi";
|
||||
type = "gem";
|
||||
};
|
||||
version = "1.2.0";
|
||||
version = "1.3.0";
|
||||
};
|
||||
aws-partitions = {
|
||||
groups = ["default"];
|
||||
platforms = [];
|
||||
source = {
|
||||
remotes = ["https://rubygems.org"];
|
||||
sha256 = "1256rf6zjh3canwr636w7yczbvhh72cpz2fw5ixljbh4fcfkrvlm";
|
||||
sha256 = "1ddbcz8p3abbw8d8pn796z1ry1mbapl6ayhh37ziwal6bd047kvm";
|
||||
type = "gem";
|
||||
};
|
||||
version = "1.768.0";
|
||||
version = "1.872.0";
|
||||
};
|
||||
aws-sdk-core = {
|
||||
dependencies = ["aws-eventstream" "aws-partitions" "aws-sigv4" "jmespath"];
|
||||
@@ -56,10 +67,10 @@
|
||||
platforms = [];
|
||||
source = {
|
||||
remotes = ["https://rubygems.org"];
|
||||
sha256 = "10djgbz4k9w3axka8xrhf97h9yh9svi5g5xvncfwnkg6h22w2177";
|
||||
sha256 = "1ansagfl5irx1y6b9xf4xpi9j6q6k5pbd2aw80hn0p4m3ycafamh";
|
||||
type = "gem";
|
||||
};
|
||||
version = "3.173.0";
|
||||
version = "3.190.1";
|
||||
};
|
||||
aws-sdk-kms = {
|
||||
dependencies = ["aws-sdk-core" "aws-sigv4"];
|
||||
@@ -67,10 +78,10 @@
|
||||
platforms = [];
|
||||
source = {
|
||||
remotes = ["https://rubygems.org"];
|
||||
sha256 = "1bcm0c9f7xy5qj5f0z3gddqslhb2vzrj9smc39pgqyq4jmn5kpj0";
|
||||
sha256 = "1qzxqfgrhnl5rdc39a1gl2pgrdxgnsj12zycpxnsx8lg6arfmnr1";
|
||||
type = "gem";
|
||||
};
|
||||
version = "1.64.0";
|
||||
version = "1.75.0";
|
||||
};
|
||||
aws-sdk-s3 = {
|
||||
dependencies = ["aws-sdk-core" "aws-sdk-kms" "aws-sigv4"];
|
||||
@@ -78,10 +89,10 @@
|
||||
platforms = [];
|
||||
source = {
|
||||
remotes = ["https://rubygems.org"];
|
||||
sha256 = "01cryf8kfkmlsxb327szcwcagsp7lss5gmk6zxlgap65lv8bc7rx";
|
||||
sha256 = "0bnhpmi0iiaj88rqc5lhhnp2gyrk4fs8xz51lj36wwzng94qinya";
|
||||
type = "gem";
|
||||
};
|
||||
version = "1.122.0";
|
||||
version = "1.141.0";
|
||||
};
|
||||
aws-sigv4 = {
|
||||
dependencies = ["aws-eventstream"];
|
||||
@@ -89,10 +100,10 @@
|
||||
platforms = [];
|
||||
source = {
|
||||
remotes = ["https://rubygems.org"];
|
||||
sha256 = "11hkna2av47bl0yprgp8k4ya70rc3m2ib5w10fn0piplgkkmhz7m";
|
||||
sha256 = "1g3w27wzjy4si6kp49w10as6ml6g6zl3xrfqs5ikpfciidv9kpc4";
|
||||
type = "gem";
|
||||
};
|
||||
version = "1.5.2";
|
||||
version = "1.8.0";
|
||||
};
|
||||
babosa = {
|
||||
groups = ["default"];
|
||||
@@ -156,6 +167,16 @@
|
||||
};
|
||||
version = "4.6.0";
|
||||
};
|
||||
concurrent-ruby = {
|
||||
groups = ["default"];
|
||||
platforms = [];
|
||||
source = {
|
||||
remotes = ["https://rubygems.org"];
|
||||
sha256 = "0krcwb6mn0iklajwngwsg850nk8k9b35dhmc2qkbdqvmifdi2y9q";
|
||||
type = "gem";
|
||||
};
|
||||
version = "1.2.2";
|
||||
};
|
||||
declarative = {
|
||||
groups = ["default"];
|
||||
platforms = [];
|
||||
@@ -172,21 +193,20 @@
|
||||
platforms = [];
|
||||
source = {
|
||||
remotes = ["https://rubygems.org"];
|
||||
sha256 = "1czaak53w8n13y1fr0q23gp0fhklvxjac5n562qj3xk6sh5ad0x2";
|
||||
sha256 = "09114ndpnnyamc2q07bmpzw7kp3rbbfv7plmxcbzzi9d6prmd92w";
|
||||
type = "gem";
|
||||
};
|
||||
version = "0.6.4";
|
||||
version = "0.6.5";
|
||||
};
|
||||
domain_name = {
|
||||
dependencies = ["unf"];
|
||||
groups = ["default"];
|
||||
platforms = [];
|
||||
source = {
|
||||
remotes = ["https://rubygems.org"];
|
||||
sha256 = "0lcqjsmixjp52bnlgzh4lg9ppsk52x9hpwdjd53k8jnbah2602h0";
|
||||
sha256 = "1gpciaifmxql8h01ci12qq08dnqrdlzkkz6fmia9v9yc3r9a29si";
|
||||
type = "gem";
|
||||
};
|
||||
version = "0.5.20190701";
|
||||
version = "0.6.20231109";
|
||||
};
|
||||
dotenv = {
|
||||
groups = ["default"];
|
||||
@@ -213,10 +233,10 @@
|
||||
platforms = [];
|
||||
source = {
|
||||
remotes = ["https://rubygems.org"];
|
||||
sha256 = "0j826kfvzn7nc5pv950n270r0sx1702k988ad11cdlav3dcxxw09";
|
||||
sha256 = "1q9yz7x36mpzpz04bg6hdyrzzk4bri9jg3h2ygw26bf6v3axq53q";
|
||||
type = "gem";
|
||||
};
|
||||
version = "0.99.0";
|
||||
version = "0.108.0";
|
||||
};
|
||||
faraday = {
|
||||
dependencies = ["faraday-em_http" "faraday-em_synchrony" "faraday-excon" "faraday-httpclient" "faraday-multipart" "faraday-net_http" "faraday-net_http_persistent" "faraday-patron" "faraday-rack" "faraday-retry" "ruby2_keywords"];
|
||||
@@ -363,15 +383,15 @@
|
||||
version = "2.2.7";
|
||||
};
|
||||
fastlane = {
|
||||
dependencies = ["CFPropertyList" "addressable" "artifactory" "aws-sdk-s3" "babosa" "colored" "commander" "dotenv" "emoji_regex" "excon" "faraday" "faraday-cookie_jar" "faraday_middleware" "fastimage" "gh_inspector" "google-apis-androidpublisher_v3" "google-apis-playcustomapp_v1" "google-cloud-storage" "highline" "json" "jwt" "mini_magick" "multipart-post" "naturally" "optparse" "plist" "rubyzip" "security" "simctl" "terminal-notifier" "terminal-table" "tty-screen" "tty-spinner" "word_wrap" "xcodeproj" "xcpretty" "xcpretty-travis-formatter"];
|
||||
dependencies = ["CFPropertyList" "addressable" "artifactory" "aws-sdk-s3" "babosa" "colored" "commander" "dotenv" "emoji_regex" "excon" "faraday" "faraday-cookie_jar" "faraday_middleware" "fastimage" "gh_inspector" "google-apis-androidpublisher_v3" "google-apis-playcustomapp_v1" "google-cloud-storage" "highline" "http-cookie" "json" "jwt" "mini_magick" "multipart-post" "naturally" "optparse" "plist" "rubyzip" "security" "simctl" "terminal-notifier" "terminal-table" "tty-screen" "tty-spinner" "word_wrap" "xcodeproj" "xcpretty" "xcpretty-travis-formatter"];
|
||||
groups = ["default"];
|
||||
platforms = [];
|
||||
source = {
|
||||
remotes = ["https://rubygems.org"];
|
||||
sha256 = "15sa3v3aaslympg9nmadmpxpbzykdiybzxn3navc7mf0iscb3q7s";
|
||||
sha256 = "0p2b92csayzlj60v15fz3mq4h23kvvr7swhaavi6fpaqzf70iafi";
|
||||
type = "gem";
|
||||
};
|
||||
version = "2.212.2";
|
||||
version = "2.217.0";
|
||||
};
|
||||
gh_inspector = {
|
||||
groups = ["default"];
|
||||
@@ -389,10 +409,10 @@
|
||||
platforms = [];
|
||||
source = {
|
||||
remotes = ["https://rubygems.org"];
|
||||
sha256 = "0ks2ak4fcvlflhyinykvd88g2ybxwsbc347aww349zhn1mqprbvg";
|
||||
sha256 = "046j100lrh5dhb8p3gr38fyqrw8vcif97pqb55ysipy874lafw49";
|
||||
type = "gem";
|
||||
};
|
||||
version = "0.42.0";
|
||||
version = "0.54.0";
|
||||
};
|
||||
google-apis-core = {
|
||||
dependencies = ["addressable" "googleauth" "httpclient" "mini_mime" "representable" "retriable" "rexml" "webrick"];
|
||||
@@ -400,10 +420,10 @@
|
||||
platforms = [];
|
||||
source = {
|
||||
remotes = ["https://rubygems.org"];
|
||||
sha256 = "184zkm5agi7r5fl79hgahjpydsc4d23nd2ynh2sr9z8gs2w4h82f";
|
||||
sha256 = "1cly6ycryjhk15d60v3nqvhqpjk9f0nznnslbdnin90f5r54sbpd";
|
||||
type = "gem";
|
||||
};
|
||||
version = "0.11.0";
|
||||
version = "0.11.2";
|
||||
};
|
||||
google-apis-iamcredentials_v1 = {
|
||||
dependencies = ["google-apis-core"];
|
||||
@@ -433,10 +453,10 @@
|
||||
platforms = [];
|
||||
source = {
|
||||
remotes = ["https://rubygems.org"];
|
||||
sha256 = "17qamcjnf22zvw1g169g8a2gkzdsxx4ij3a4ganihyrcf9r62asj";
|
||||
sha256 = "1k432qgxf41c4m6d68rascm0gyj18r7ypmrnyzmxh7k7nh543awx";
|
||||
type = "gem";
|
||||
};
|
||||
version = "0.19.0";
|
||||
version = "0.29.0";
|
||||
};
|
||||
google-cloud-core = {
|
||||
dependencies = ["google-cloud-env" "google-cloud-errors"];
|
||||
@@ -444,10 +464,10 @@
|
||||
platforms = [];
|
||||
source = {
|
||||
remotes = ["https://rubygems.org"];
|
||||
sha256 = "0amp8vd16pzbdrfbp7k0k38rqxpwd88bkyp35l3x719hbb6l85za";
|
||||
sha256 = "00wfvdvdv9m4l5ydn6xp65n68mgmpqr3n09hzvxs7gp8fly3j17v";
|
||||
type = "gem";
|
||||
};
|
||||
version = "1.6.0";
|
||||
version = "1.6.1";
|
||||
};
|
||||
google-cloud-env = {
|
||||
dependencies = ["faraday"];
|
||||
@@ -455,10 +475,10 @@
|
||||
platforms = [];
|
||||
source = {
|
||||
remotes = ["https://rubygems.org"];
|
||||
sha256 = "05gshdqscg4kil6ppfzmikyavsx449bxyj47j33r4n4p8swsqyb1";
|
||||
sha256 = "056r1p8vhjswnx2cy3mzhwc5gj03whmpz8m4p2ph37gag5bpnxmf";
|
||||
type = "gem";
|
||||
};
|
||||
version = "1.6.0";
|
||||
version = "2.1.0";
|
||||
};
|
||||
google-cloud-errors = {
|
||||
groups = ["default"];
|
||||
@@ -476,21 +496,21 @@
|
||||
platforms = [];
|
||||
source = {
|
||||
remotes = ["https://rubygems.org"];
|
||||
sha256 = "1skhlpcykxxzw3050cwngdyc3n746wfx443w1w9chxwjbh2ix6i9";
|
||||
sha256 = "0033bi8qwm0ksxsv5zhz4nzwsiaapq3xk79z8f8rx3v09vdap07j";
|
||||
type = "gem";
|
||||
};
|
||||
version = "1.44.0";
|
||||
version = "1.45.0";
|
||||
};
|
||||
googleauth = {
|
||||
dependencies = ["faraday" "jwt" "memoist" "multi_json" "os" "signet"];
|
||||
dependencies = ["faraday" "google-cloud-env" "jwt" "multi_json" "os" "signet"];
|
||||
groups = ["default"];
|
||||
platforms = [];
|
||||
source = {
|
||||
remotes = ["https://rubygems.org"];
|
||||
sha256 = "1lj5haarpn7rybbq9s031zcn9ji3rlz5bk64bwa2j34q5s1h5gis";
|
||||
sha256 = "0spv89di017rg25psiv4w3pn6f67y2w6vv8w910i83b5yii84rl1";
|
||||
type = "gem";
|
||||
};
|
||||
version = "1.5.2";
|
||||
version = "1.9.1";
|
||||
};
|
||||
highline = {
|
||||
groups = ["default"];
|
||||
@@ -523,6 +543,17 @@
|
||||
};
|
||||
version = "2.8.3";
|
||||
};
|
||||
i18n = {
|
||||
dependencies = ["concurrent-ruby"];
|
||||
groups = ["default"];
|
||||
platforms = [];
|
||||
source = {
|
||||
remotes = ["https://rubygems.org"];
|
||||
sha256 = "0qaamqsh5f3szhcakkak8ikxlzxqnv49n2p7504hcz2l0f4nj0wx";
|
||||
type = "gem";
|
||||
};
|
||||
version = "1.14.1";
|
||||
};
|
||||
jmespath = {
|
||||
groups = ["default"];
|
||||
platforms = [];
|
||||
@@ -538,30 +569,20 @@
|
||||
platforms = [];
|
||||
source = {
|
||||
remotes = ["https://rubygems.org"];
|
||||
sha256 = "0nalhin1gda4v8ybk6lq8f407cgfrj6qzn234yra4ipkmlbfmal6";
|
||||
sha256 = "0r9jmjhg2ly3l736flk7r2al47b5c8cayh0gqkq0yhjqzc9a6zhq";
|
||||
type = "gem";
|
||||
};
|
||||
version = "2.6.3";
|
||||
version = "2.7.1";
|
||||
};
|
||||
jwt = {
|
||||
groups = ["default"];
|
||||
platforms = [];
|
||||
source = {
|
||||
remotes = ["https://rubygems.org"];
|
||||
sha256 = "09yj3z5snhaawh2z1w45yyihzmh57m6m7dp8ra8gxavhj5kbiq5p";
|
||||
sha256 = "16z11alz13vfc4zs5l3fk6n51n2jw9lskvc4h4prnww0y797qd87";
|
||||
type = "gem";
|
||||
};
|
||||
version = "2.7.0";
|
||||
};
|
||||
memoist = {
|
||||
groups = ["default"];
|
||||
platforms = [];
|
||||
source = {
|
||||
remotes = ["https://rubygems.org"];
|
||||
sha256 = "0i9wpzix3sjhf6d9zw60dm4371iq8kyz7ckh2qapan2vyaim6b55";
|
||||
type = "gem";
|
||||
};
|
||||
version = "0.16.2";
|
||||
version = "2.7.1";
|
||||
};
|
||||
mini_magick = {
|
||||
groups = ["default"];
|
||||
@@ -578,10 +599,20 @@
|
||||
platforms = [];
|
||||
source = {
|
||||
remotes = ["https://rubygems.org"];
|
||||
sha256 = "0lbim375gw2dk6383qirz13hgdmxlan0vc5da2l072j3qw6fqjm5";
|
||||
sha256 = "1vycif7pjzkr29mfk4dlqv3disc5dn0va04lkwajlpr1wkibg0c6";
|
||||
type = "gem";
|
||||
};
|
||||
version = "1.1.2";
|
||||
version = "1.1.5";
|
||||
};
|
||||
minitest = {
|
||||
groups = ["default"];
|
||||
platforms = [];
|
||||
source = {
|
||||
remotes = ["https://rubygems.org"];
|
||||
sha256 = "0bkmfi9mb49m0fkdhl2g38i3xxa02d411gg0m8x0gvbwfmmg5ym3";
|
||||
type = "gem";
|
||||
};
|
||||
version = "5.20.0";
|
||||
};
|
||||
multi_json = {
|
||||
groups = ["default"];
|
||||
@@ -598,10 +629,10 @@
|
||||
platforms = [];
|
||||
source = {
|
||||
remotes = ["https://rubygems.org"];
|
||||
sha256 = "09k0b3cybqilk1gwrwwain95rdypixb2q9w65gd44gfzsd84xi1x";
|
||||
sha256 = "0lgyysrpl50wgcb9ahg29i4p01z0irb3p9lirygma0kkfr5dgk9x";
|
||||
type = "gem";
|
||||
};
|
||||
version = "2.0.0";
|
||||
version = "2.3.0";
|
||||
};
|
||||
nanaimo = {
|
||||
groups = ["default"];
|
||||
@@ -658,20 +689,20 @@
|
||||
platforms = [];
|
||||
source = {
|
||||
remotes = ["https://rubygems.org"];
|
||||
sha256 = "0hz0bx2qs2pwb0bwazzsah03ilpf3aai8b7lk7s35jsfzwbkjq35";
|
||||
sha256 = "1bni4qjrsh2q49pnmmd6if4iv3ak36bd2cckrs6npl111n769k9m";
|
||||
type = "gem";
|
||||
};
|
||||
version = "5.0.1";
|
||||
version = "5.0.4";
|
||||
};
|
||||
rake = {
|
||||
groups = ["default"];
|
||||
platforms = [];
|
||||
source = {
|
||||
remotes = ["https://rubygems.org"];
|
||||
sha256 = "15whn7p9nrkxangbs9hh75q585yfn66lv0v2mhj6q6dl6x8bzr2w";
|
||||
sha256 = "1ilr853hawi09626axx0mps4rkkmxcs54mapz9jnqvpnlwd3wsmy";
|
||||
type = "gem";
|
||||
};
|
||||
version = "13.0.6";
|
||||
version = "13.1.0";
|
||||
};
|
||||
representable = {
|
||||
dependencies = ["declarative" "trailblazer-option" "uber"];
|
||||
@@ -699,10 +730,10 @@
|
||||
platforms = [];
|
||||
source = {
|
||||
remotes = ["https://rubygems.org"];
|
||||
sha256 = "08ximcyfjy94pm1rhcx04ny1vx2sk0x4y185gzn86yfsbzwkng53";
|
||||
sha256 = "05i8518ay14kjbma550mv0jm8a6di8yp5phzrd8rj44z9qnrlrp0";
|
||||
type = "gem";
|
||||
};
|
||||
version = "3.2.5";
|
||||
version = "3.2.6";
|
||||
};
|
||||
rouge = {
|
||||
groups = ["default"];
|
||||
@@ -750,10 +781,10 @@
|
||||
platforms = [];
|
||||
source = {
|
||||
remotes = ["https://rubygems.org"];
|
||||
sha256 = "0100rclkhagf032rg3r0gf3f4znrvvvqrimy6hpa73f21n9k2a0x";
|
||||
sha256 = "0fzakk5y7zzii76zlkynpp1c764mzkkfg4mpj18f5pf2xp1aikb6";
|
||||
type = "gem";
|
||||
};
|
||||
version = "0.17.0";
|
||||
version = "0.18.0";
|
||||
};
|
||||
simctl = {
|
||||
dependencies = ["CFPropertyList" "naturally"];
|
||||
@@ -782,10 +813,10 @@
|
||||
platforms = [];
|
||||
source = {
|
||||
remotes = ["https://rubygems.org"];
|
||||
sha256 = "1512cngw35hsmhvw4c05rscihc59mnj09m249sm9p3pik831ydqk";
|
||||
sha256 = "14dfmfjppmng5hwj7c5ka6qdapawm3h6k9lhn8zj001ybypvclgr";
|
||||
type = "gem";
|
||||
};
|
||||
version = "1.8.0";
|
||||
version = "3.0.2";
|
||||
};
|
||||
trailblazer-option = {
|
||||
groups = ["default"];
|
||||
@@ -812,10 +843,10 @@
|
||||
platforms = [];
|
||||
source = {
|
||||
remotes = ["https://rubygems.org"];
|
||||
sha256 = "18jr6s1cg8yb26wzkqa6874q0z93rq0y5aw092kdqazk71y6a235";
|
||||
sha256 = "0l4vh6g333jxm9lakilkva2gn17j6gb052626r1pdbmy2lhnb460";
|
||||
type = "gem";
|
||||
};
|
||||
version = "0.8.1";
|
||||
version = "0.8.2";
|
||||
};
|
||||
tty-spinner = {
|
||||
dependencies = ["tty-cursor"];
|
||||
@@ -828,6 +859,17 @@
|
||||
};
|
||||
version = "0.9.3";
|
||||
};
|
||||
tzinfo = {
|
||||
dependencies = ["concurrent-ruby"];
|
||||
groups = ["default"];
|
||||
platforms = [];
|
||||
source = {
|
||||
remotes = ["https://rubygems.org"];
|
||||
sha256 = "16w2g84dzaf3z13gxyzlzbf748kylk5bdgg3n1ipvkvvqy685bwd";
|
||||
type = "gem";
|
||||
};
|
||||
version = "2.0.6";
|
||||
};
|
||||
uber = {
|
||||
groups = ["default"];
|
||||
platforms = [];
|
||||
@@ -838,36 +880,15 @@
|
||||
};
|
||||
version = "0.1.0";
|
||||
};
|
||||
unf = {
|
||||
dependencies = ["unf_ext"];
|
||||
groups = ["default"];
|
||||
platforms = [];
|
||||
source = {
|
||||
remotes = ["https://rubygems.org"];
|
||||
sha256 = "0bh2cf73i2ffh4fcpdn9ir4mhq8zi50ik0zqa1braahzadx536a9";
|
||||
type = "gem";
|
||||
};
|
||||
version = "0.1.4";
|
||||
};
|
||||
unf_ext = {
|
||||
groups = ["default"];
|
||||
platforms = [];
|
||||
source = {
|
||||
remotes = ["https://rubygems.org"];
|
||||
sha256 = "1yj2nz2l101vr1x9w2k83a0fag1xgnmjwp8w8rw4ik2rwcz65fch";
|
||||
type = "gem";
|
||||
};
|
||||
version = "0.0.8.2";
|
||||
};
|
||||
unicode-display_width = {
|
||||
groups = ["default"];
|
||||
platforms = [];
|
||||
source = {
|
||||
remotes = ["https://rubygems.org"];
|
||||
sha256 = "1204c1jx2g89pc25qk5150mk7j5k90692i7ihgfzqnad6qni74h2";
|
||||
sha256 = "1d0azx233nags5jx3fqyr23qa2rhgzbhv8pxp46dgbg1mpf82xky";
|
||||
type = "gem";
|
||||
};
|
||||
version = "1.8.0";
|
||||
version = "2.5.0";
|
||||
};
|
||||
webrick = {
|
||||
groups = ["default"];
|
||||
@@ -895,10 +916,10 @@
|
||||
platforms = [];
|
||||
source = {
|
||||
remotes = ["https://rubygems.org"];
|
||||
sha256 = "1s7hxaqd1fi4rlmm2jbrglyvka1r95frlxan61vfcnd8n6pxynpi";
|
||||
sha256 = "176ndahc5fssyx04q176vy6wngs1av4vrsdrkdpjij700hqll8hn";
|
||||
type = "gem";
|
||||
};
|
||||
version = "1.22.0";
|
||||
version = "1.23.0";
|
||||
};
|
||||
xcpretty = {
|
||||
dependencies = ["rouge"];
|
||||
|
||||
+29
-14
@@ -1,13 +1,28 @@
|
||||
# Resolve react_native_pods.rb with node to allow for hoisting
|
||||
require Pod::Executable.execute_command('node', ['-p',
|
||||
'require.resolve(
|
||||
"react-native/scripts/react_native_pods.rb",
|
||||
{paths: [process.argv[1]]},
|
||||
)', __dir__]).strip
|
||||
def node_require(script)
|
||||
# Resolve script with node to allow for hoisting
|
||||
require Pod::Executable.execute_command('node', ['-p',
|
||||
"require.resolve(
|
||||
'#{script}',
|
||||
{paths: [process.argv[1]]},
|
||||
)", __dir__]).strip
|
||||
end
|
||||
|
||||
node_require('react-native/scripts/react_native_pods.rb')
|
||||
node_require('react-native-permissions/scripts/setup.rb')
|
||||
|
||||
platform :ios, min_ios_version_supported
|
||||
prepare_react_native_project!
|
||||
|
||||
setup_permissions([
|
||||
'Camera',
|
||||
'FaceID',
|
||||
'MediaLibrary',
|
||||
'Microphone',
|
||||
'Notifications',
|
||||
'PhotoLibrary',
|
||||
'PhotoLibraryAddOnly',
|
||||
])
|
||||
|
||||
linkage = ENV['USE_FRAMEWORKS']
|
||||
if linkage != nil
|
||||
Pod::UI.puts "Configuring Pod with #{linkage}ally linked Frameworks".green
|
||||
@@ -32,8 +47,8 @@ abstract_target 'Status' do
|
||||
|
||||
use_react_native!(
|
||||
:path => config[:reactNativePath],
|
||||
:hermes_enabled => false,
|
||||
:fabric_enabled => flags[:fabric_enabled],
|
||||
:hermes_enabled => true,
|
||||
# An absolute path to your application root.
|
||||
:app_path => "#{Pod::Config.instance.installation_root}/.."
|
||||
)
|
||||
@@ -43,9 +58,6 @@ abstract_target 'Status' do
|
||||
|
||||
pod 'SSZipArchive', '2.4.3'
|
||||
|
||||
permissions_path = '../node_modules/react-native-permissions/ios'
|
||||
pod 'Permission-Microphone', :path => "#{permissions_path}/Microphone/Permission-Microphone.podspec"
|
||||
pod 'Permission-Camera', :path => "#{permissions_path}/Camera/Permission-Camera.podspec"
|
||||
pod "react-native-status-keycard", path: "../node_modules/react-native-status-keycard"
|
||||
pod "react-native-status", path: "../modules/react-native-status"
|
||||
pod "Keycard", git: "https://github.com/status-im/Keycard.swift.git"
|
||||
@@ -63,15 +75,18 @@ abstract_target 'Status' do
|
||||
end
|
||||
|
||||
post_install do |installer|
|
||||
# as per react-native 0.73.2 template
|
||||
# https://github.com/facebook/react-native/blob/c5c0563f209ead8f884204763e02115bd66d1960/packages/react-native/template/ios/Podfile#L49-L52
|
||||
react_native_post_install(
|
||||
installer,
|
||||
config[:reactNativePath],
|
||||
:mac_catalyst_enabled => false,
|
||||
)
|
||||
# some of libs wouldn't be build for x86_64 otherwise and that is
|
||||
# necessary for ios simulators
|
||||
installer.pods_project.targets.each do |target|
|
||||
target.build_configurations.each do |config|
|
||||
config.build_settings['ONLY_ACTIVE_ARCH'] = 'NO'
|
||||
# fix for no template named 'unary_function' in namespace 'std'; did you mean '__unary_function'?
|
||||
# ref : https://github.com/facebook/react-native/issues/37748
|
||||
# TODO : remove after upgrading to react-native 0.72.x
|
||||
config.build_settings['GCC_PREPROCESSOR_DEFINITIONS'] ||= ['$(inherited)', '_LIBCPP_ENABLE_CXX17_REMOVED_UNARY_BINARY_FUNCTION']
|
||||
end
|
||||
# We need to remove the predefinition of IPHONEOS_DEPLOYMENT_TARGET from RNCK lib to use our own.
|
||||
case target.name
|
||||
|
||||
+1008
-312
File diff suppressed because it is too large
Load Diff
@@ -8,6 +8,8 @@
|
||||
|
||||
/* Begin PBXBuildFile section */
|
||||
00E356F31AD99517003FC87E /* StatusImTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 00E356F21AD99517003FC87E /* StatusImTests.m */; };
|
||||
0BF51D8C7FBD6A668E6E1FC0 /* libPods-Status-StatusIm.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 45C29909A975E0654116557F /* libPods-Status-StatusIm.a */; };
|
||||
131972279C6DBF736235F9F9 /* libPods-Status-StatusIm-StatusImTests.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 2D9DF8AC0F6547107DE1A25D /* libPods-Status-StatusIm-StatusImTests.a */; };
|
||||
13B07FBC1A68108700A75B9A /* AppDelegate.mm in Sources */ = {isa = PBXBuildFile; fileRef = 13B07FB01A68108700A75B9A /* AppDelegate.mm */; };
|
||||
13B07FC11A68108700A75B9A /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = 13B07FB71A68108700A75B9A /* main.m */; };
|
||||
25DC9C9DC25846BD8D084888 /* libc++.tbd in Frameworks */ = {isa = PBXBuildFile; fileRef = 8B9A886A2CB448B1ABA0EB62 /* libc++.tbd */; };
|
||||
@@ -44,8 +46,6 @@
|
||||
715D8133290BE850006F5C88 /* UbuntuMono-Regular.ttf in Resources */ = {isa = PBXBuildFile; fileRef = 715D8131290BE850006F5C88 /* UbuntuMono-Regular.ttf */; };
|
||||
74B758FC20D7C00B003343C3 /* launch-image-universal.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 74B758FB20D7C00B003343C3 /* launch-image-universal.storyboard */; };
|
||||
8391E8E0E93C41A98AAA6631 /* Inter-SemiBoldItalic.otf in Resources */ = {isa = PBXBuildFile; fileRef = A4F2BBE8D4DD4140A6CCAC39 /* Inter-SemiBoldItalic.otf */; };
|
||||
8BE7C1BD90A0AB68254988BD /* libPods-Status-StatusIm.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 28A248DF828DD5505CABC707 /* libPods-Status-StatusIm.a */; };
|
||||
9930D2C5DF7BE851C6CE54A1 /* libPods-Status-StatusImPR.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 5B792BBAE71EAA1C3F2C9C47 /* libPods-Status-StatusImPR.a */; };
|
||||
B24FC7FD1DE7195700D694FF /* Social.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = B24FC7FC1DE7195700D694FF /* Social.framework */; };
|
||||
B24FC7FF1DE7195F00D694FF /* MessageUI.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = B24FC7FE1DE7195F00D694FF /* MessageUI.framework */; };
|
||||
B2F2D1BC1D9D531B00B7B453 /* Images.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = B2F2D1BB1D9D531B00B7B453 /* Images.xcassets */; };
|
||||
@@ -60,7 +60,7 @@
|
||||
D1786306E0184916B11F4C37 /* Inter-Medium.otf in Resources */ = {isa = PBXBuildFile; fileRef = B2A38FC3D3954DE7B2B171F8 /* Inter-Medium.otf */; };
|
||||
D84616FB563A48EBB1678699 /* Inter-Bold.otf in Resources */ = {isa = PBXBuildFile; fileRef = CD4A2C27D6D5473184DC1F7E /* Inter-Bold.otf */; };
|
||||
D99C50E5E18942A39C8DDF61 /* Inter-BoldItalic.otf in Resources */ = {isa = PBXBuildFile; fileRef = B321D25F4493470980039457 /* Inter-BoldItalic.otf */; };
|
||||
E6794203DEE6BE3C85F205F8 /* libPods-Status-StatusIm-StatusImTests.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 9305FC57D289E57F96162DD2 /* libPods-Status-StatusIm-StatusImTests.a */; };
|
||||
DE2F1721F9D5702C7CEC5594 /* libPods-Status-StatusImPR.a in Frameworks */ = {isa = PBXBuildFile; fileRef = B17DF204648B8189F8ABD0A7 /* libPods-Status-StatusImPR.a */; };
|
||||
/* End PBXBuildFile section */
|
||||
|
||||
/* Begin PBXContainerItemProxy section */
|
||||
@@ -108,40 +108,40 @@
|
||||
00E356EE1AD99517003FC87E /* StatusImTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = StatusImTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; };
|
||||
00E356F11AD99517003FC87E /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = "<group>"; };
|
||||
00E356F21AD99517003FC87E /* StatusImTests.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = StatusImTests.m; sourceTree = "<group>"; };
|
||||
1130DCD9CBDCA3CA461F55B4 /* Pods-Status-StatusIm.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Status-StatusIm.debug.xcconfig"; path = "Target Support Files/Pods-Status-StatusIm/Pods-Status-StatusIm.debug.xcconfig"; sourceTree = "<group>"; };
|
||||
13B07F961A680F5B00A75B9A /* StatusIm.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = StatusIm.app; sourceTree = BUILT_PRODUCTS_DIR; };
|
||||
13B07FAF1A68108700A75B9A /* AppDelegate.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = AppDelegate.h; path = StatusIm/AppDelegate.h; sourceTree = "<group>"; };
|
||||
13B07FB01A68108700A75B9A /* AppDelegate.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; name = AppDelegate.mm; path = StatusIm/AppDelegate.mm; sourceTree = "<group>"; };
|
||||
13B07FB61A68108700A75B9A /* Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = Info.plist; path = StatusIm/Info.plist; sourceTree = "<group>"; };
|
||||
13B07FB71A68108700A75B9A /* main.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = main.m; path = StatusIm/main.m; sourceTree = "<group>"; };
|
||||
1426DF592BA248FC81D955CB /* Inter-Regular.otf */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = unknown; name = "Inter-Regular.otf"; path = "../resources/fonts/Inter-Regular.otf"; sourceTree = "<group>"; };
|
||||
28A248DF828DD5505CABC707 /* libPods-Status-StatusIm.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = "libPods-Status-StatusIm.a"; sourceTree = BUILT_PRODUCTS_DIR; };
|
||||
1B74FBFCB9B8E34B63250A52 /* Pods-Status-StatusIm-StatusImTests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Status-StatusIm-StatusImTests.release.xcconfig"; path = "Target Support Files/Pods-Status-StatusIm-StatusImTests/Pods-Status-StatusIm-StatusImTests.release.xcconfig"; sourceTree = "<group>"; };
|
||||
232FE8EAB57384181B0DB836 /* Pods-Status-StatusIm.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Status-StatusIm.release.xcconfig"; path = "Target Support Files/Pods-Status-StatusIm/Pods-Status-StatusIm.release.xcconfig"; sourceTree = "<group>"; };
|
||||
2D9DF8AC0F6547107DE1A25D /* libPods-Status-StatusIm-StatusImTests.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = "libPods-Status-StatusIm-StatusImTests.a"; sourceTree = BUILT_PRODUCTS_DIR; };
|
||||
3A2626CE245C3F2200D5F94B /* Dummy.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Dummy.swift; sourceTree = "<group>"; };
|
||||
3A6406FB24A3ADF90046ED37 /* Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = "<group>"; };
|
||||
3A8F8EA924A4D31600BF206D /* GameKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = GameKit.framework; path = System/Library/Frameworks/GameKit.framework; sourceTree = SDKROOT; };
|
||||
3AAD2ADC24A3A60E0075D594 /* Status PR.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = "Status PR.app"; sourceTree = BUILT_PRODUCTS_DIR; };
|
||||
3AB1C3AD245C043900098F67 /* StatusIm-Bridging-Header.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "StatusIm-Bridging-Header.h"; sourceTree = "<group>"; };
|
||||
45C29909A975E0654116557F /* libPods-Status-StatusIm.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = "libPods-Status-StatusIm.a"; sourceTree = BUILT_PRODUCTS_DIR; };
|
||||
4C16DE0B1F89508700AA10DB /* JavaScriptCore.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = JavaScriptCore.framework; path = System/Library/Frameworks/JavaScriptCore.framework; sourceTree = SDKROOT; };
|
||||
4E586E1B0E544F64AA9F5BD1 /* libz.tbd */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = "sourcecode.text-based-dylib-definition"; name = libz.tbd; path = usr/lib/libz.tbd; sourceTree = SDKROOT; };
|
||||
59C9C002A09CA7F40E69C6CB /* Pods-Status-StatusIm-StatusImTests.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Status-StatusIm-StatusImTests.debug.xcconfig"; path = "Target Support Files/Pods-Status-StatusIm-StatusImTests/Pods-Status-StatusIm-StatusImTests.debug.xcconfig"; sourceTree = "<group>"; };
|
||||
5B792BBAE71EAA1C3F2C9C47 /* libPods-Status-StatusImPR.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = "libPods-Status-StatusImPR.a"; sourceTree = BUILT_PRODUCTS_DIR; };
|
||||
65F693BD2578002500A45E76 /* CoreNFC.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreNFC.framework; path = System/Library/Frameworks/CoreNFC.framework; sourceTree = SDKROOT; };
|
||||
65F693BF2578003600A45E76 /* CoreNFC.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreNFC.framework; path = Platforms/MacOSX.platform/Developer/SDKs/MacOSX11.0.sdk/System/iOSSupport/System/Library/Frameworks/CoreNFC.framework; sourceTree = DEVELOPER_DIR; };
|
||||
65F6941725780A4E00A45E76 /* StatusImTests-Bridging-Header.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "StatusImTests-Bridging-Header.h"; sourceTree = "<group>"; };
|
||||
65F6941825780A4F00A45E76 /* Bridge.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Bridge.swift; sourceTree = "<group>"; };
|
||||
668C1A2ADF1899973DAA1AB7 /* Pods-Status-StatusIm.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Status-StatusIm.release.xcconfig"; path = "Target Support Files/Pods-Status-StatusIm/Pods-Status-StatusIm.release.xcconfig"; sourceTree = "<group>"; };
|
||||
693A62DB37BC4CD5A30E5C96 /* Inter-SemiBold.otf */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = unknown; name = "Inter-SemiBold.otf"; path = "../resources/fonts/Inter-SemiBold.otf"; sourceTree = "<group>"; };
|
||||
715D8131290BE850006F5C88 /* UbuntuMono-Regular.ttf */ = {isa = PBXFileReference; lastKnownFileType = file; name = "UbuntuMono-Regular.ttf"; path = "../resources/fonts/UbuntuMono-Regular.ttf"; sourceTree = "<group>"; };
|
||||
74B758FB20D7C00B003343C3 /* launch-image-universal.storyboard */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; path = "launch-image-universal.storyboard"; sourceTree = "<group>"; };
|
||||
7A393286DD0E844D050D0B89 /* Pods-Status-StatusImPR.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Status-StatusImPR.release.xcconfig"; path = "Target Support Files/Pods-Status-StatusImPR/Pods-Status-StatusImPR.release.xcconfig"; sourceTree = "<group>"; };
|
||||
7BF7B2DB23EE09E5229629DA /* Pods-Status-StatusImPR.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Status-StatusImPR.debug.xcconfig"; path = "Target Support Files/Pods-Status-StatusImPR/Pods-Status-StatusImPR.debug.xcconfig"; sourceTree = "<group>"; };
|
||||
8B9A886A2CB448B1ABA0EB62 /* libc++.tbd */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = "sourcecode.text-based-dylib-definition"; name = "libc++.tbd"; path = "usr/lib/libc++.tbd"; sourceTree = SDKROOT; };
|
||||
922C4CA61F4D5F8B0033C753 /* StatusIm.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; name = StatusIm.entitlements; path = StatusIm/StatusIm.entitlements; sourceTree = "<group>"; };
|
||||
9305FC57D289E57F96162DD2 /* libPods-Status-StatusIm-StatusImTests.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = "libPods-Status-StatusIm-StatusImTests.a"; sourceTree = BUILT_PRODUCTS_DIR; };
|
||||
9C76AF5A418D4D65A4CAD1D9 /* InterStatus-Regular.otf */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = unknown; name = "InterStatus-Regular.otf"; path = "../resources/fonts/InterStatus-Regular.otf"; sourceTree = "<group>"; };
|
||||
9EC0135C1E06FB1900155B5C /* RCTWKWebView.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = RCTWKWebView.xcodeproj; path = "../node_modules/react-native-wkwebview-reborn/ios/RCTWKWebView.xcodeproj"; sourceTree = "<group>"; };
|
||||
A18E846035BD6544591E45B9 /* Pods-Status-StatusImPR.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Status-StatusImPR.release.xcconfig"; path = "Target Support Files/Pods-Status-StatusImPR/Pods-Status-StatusImPR.release.xcconfig"; sourceTree = "<group>"; };
|
||||
A0B5AD061DF0F6CC98603A99 /* Pods-Status-StatusIm.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Status-StatusIm.debug.xcconfig"; path = "Target Support Files/Pods-Status-StatusIm/Pods-Status-StatusIm.debug.xcconfig"; sourceTree = "<group>"; };
|
||||
A4F2BBE8D4DD4140A6CCAC39 /* Inter-SemiBoldItalic.otf */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = unknown; name = "Inter-SemiBoldItalic.otf"; path = "../resources/fonts/Inter-SemiBoldItalic.otf"; sourceTree = "<group>"; };
|
||||
ACFD5EEA905CF67FD6F8C2CC /* Pods-Status-StatusIm-StatusImTests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Status-StatusIm-StatusImTests.release.xcconfig"; path = "Target Support Files/Pods-Status-StatusIm-StatusImTests/Pods-Status-StatusIm-StatusImTests.release.xcconfig"; sourceTree = "<group>"; };
|
||||
B07176ACDAA1422E8F0A3D6B /* Inter-Italic.otf */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = unknown; name = "Inter-Italic.otf"; path = "../resources/fonts/Inter-Italic.otf"; sourceTree = "<group>"; };
|
||||
B17DF204648B8189F8ABD0A7 /* libPods-Status-StatusImPR.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = "libPods-Status-StatusImPR.a"; sourceTree = BUILT_PRODUCTS_DIR; };
|
||||
B24FC7FC1DE7195700D694FF /* Social.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Social.framework; path = System/Library/Frameworks/Social.framework; sourceTree = SDKROOT; };
|
||||
B24FC7FE1DE7195F00D694FF /* MessageUI.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = MessageUI.framework; path = System/Library/Frameworks/MessageUI.framework; sourceTree = SDKROOT; };
|
||||
B2A38FC3D3954DE7B2B171F8 /* Inter-Medium.otf */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = unknown; name = "Inter-Medium.otf"; path = "../resources/fonts/Inter-Medium.otf"; sourceTree = "<group>"; };
|
||||
@@ -153,7 +153,7 @@
|
||||
C6B1215047604CD59A4C74D6 /* Inter-MediumItalic.otf */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = unknown; name = "Inter-MediumItalic.otf"; path = "../resources/fonts/Inter-MediumItalic.otf"; sourceTree = "<group>"; };
|
||||
CD4A2C27D6D5473184DC1F7E /* Inter-Bold.otf */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = unknown; name = "Inter-Bold.otf"; path = "../resources/fonts/Inter-Bold.otf"; sourceTree = "<group>"; };
|
||||
CE4E31B21D8695250033ED64 /* Statusgo.xcframework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.xcframework; name = Statusgo.xcframework; path = "../modules/react-native-status/ios/RCTStatus/Statusgo.xcframework"; sourceTree = "<group>"; };
|
||||
D0D6FCD821497D4A6D28C82E /* Pods-Status-StatusImPR.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Status-StatusImPR.debug.xcconfig"; path = "Target Support Files/Pods-Status-StatusImPR/Pods-Status-StatusImPR.debug.xcconfig"; sourceTree = "<group>"; };
|
||||
D40C4023C7D5B793AEF98426 /* Pods-Status-StatusIm-StatusImTests.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Status-StatusIm-StatusImTests.debug.xcconfig"; path = "Target Support Files/Pods-Status-StatusIm-StatusImTests/Pods-Status-StatusIm-StatusImTests.debug.xcconfig"; sourceTree = "<group>"; };
|
||||
/* End PBXFileReference section */
|
||||
|
||||
/* Begin PBXFrameworksBuildPhase section */
|
||||
@@ -161,7 +161,7 @@
|
||||
isa = PBXFrameworksBuildPhase;
|
||||
buildActionMask = 2147483647;
|
||||
files = (
|
||||
E6794203DEE6BE3C85F205F8 /* libPods-Status-StatusIm-StatusImTests.a in Frameworks */,
|
||||
131972279C6DBF736235F9F9 /* libPods-Status-StatusIm-StatusImTests.a in Frameworks */,
|
||||
);
|
||||
runOnlyForDeploymentPostprocessing = 0;
|
||||
};
|
||||
@@ -174,7 +174,7 @@
|
||||
CE4E31B31D8695250033ED64 /* Statusgo.xcframework in Frameworks */,
|
||||
25DC9C9DC25846BD8D084888 /* libc++.tbd in Frameworks */,
|
||||
BA68A2377A20496EA737000D /* libz.tbd in Frameworks */,
|
||||
8BE7C1BD90A0AB68254988BD /* libPods-Status-StatusIm.a in Frameworks */,
|
||||
0BF51D8C7FBD6A668E6E1FC0 /* libPods-Status-StatusIm.a in Frameworks */,
|
||||
);
|
||||
runOnlyForDeploymentPostprocessing = 0;
|
||||
};
|
||||
@@ -188,7 +188,7 @@
|
||||
3AAD2AC224A3A60E0075D594 /* Statusgo.xcframework in Frameworks */,
|
||||
3AAD2AC524A3A60E0075D594 /* libc++.tbd in Frameworks */,
|
||||
3AAD2AC624A3A60E0075D594 /* libz.tbd in Frameworks */,
|
||||
9930D2C5DF7BE851C6CE54A1 /* libPods-Status-StatusImPR.a in Frameworks */,
|
||||
DE2F1721F9D5702C7CEC5594 /* libPods-Status-StatusImPR.a in Frameworks */,
|
||||
);
|
||||
runOnlyForDeploymentPostprocessing = 0;
|
||||
};
|
||||
@@ -314,9 +314,9 @@
|
||||
CE4E31B21D8695250033ED64 /* Statusgo.xcframework */,
|
||||
8B9A886A2CB448B1ABA0EB62 /* libc++.tbd */,
|
||||
4E586E1B0E544F64AA9F5BD1 /* libz.tbd */,
|
||||
28A248DF828DD5505CABC707 /* libPods-Status-StatusIm.a */,
|
||||
9305FC57D289E57F96162DD2 /* libPods-Status-StatusIm-StatusImTests.a */,
|
||||
5B792BBAE71EAA1C3F2C9C47 /* libPods-Status-StatusImPR.a */,
|
||||
45C29909A975E0654116557F /* libPods-Status-StatusIm.a */,
|
||||
2D9DF8AC0F6547107DE1A25D /* libPods-Status-StatusIm-StatusImTests.a */,
|
||||
B17DF204648B8189F8ABD0A7 /* libPods-Status-StatusImPR.a */,
|
||||
);
|
||||
name = Frameworks;
|
||||
sourceTree = "<group>";
|
||||
@@ -324,12 +324,12 @@
|
||||
D0D5C8D06825D33BA2D2121E /* Pods */ = {
|
||||
isa = PBXGroup;
|
||||
children = (
|
||||
1130DCD9CBDCA3CA461F55B4 /* Pods-Status-StatusIm.debug.xcconfig */,
|
||||
668C1A2ADF1899973DAA1AB7 /* Pods-Status-StatusIm.release.xcconfig */,
|
||||
59C9C002A09CA7F40E69C6CB /* Pods-Status-StatusIm-StatusImTests.debug.xcconfig */,
|
||||
ACFD5EEA905CF67FD6F8C2CC /* Pods-Status-StatusIm-StatusImTests.release.xcconfig */,
|
||||
D0D6FCD821497D4A6D28C82E /* Pods-Status-StatusImPR.debug.xcconfig */,
|
||||
A18E846035BD6544591E45B9 /* Pods-Status-StatusImPR.release.xcconfig */,
|
||||
A0B5AD061DF0F6CC98603A99 /* Pods-Status-StatusIm.debug.xcconfig */,
|
||||
232FE8EAB57384181B0DB836 /* Pods-Status-StatusIm.release.xcconfig */,
|
||||
D40C4023C7D5B793AEF98426 /* Pods-Status-StatusIm-StatusImTests.debug.xcconfig */,
|
||||
1B74FBFCB9B8E34B63250A52 /* Pods-Status-StatusIm-StatusImTests.release.xcconfig */,
|
||||
7BF7B2DB23EE09E5229629DA /* Pods-Status-StatusImPR.debug.xcconfig */,
|
||||
7A393286DD0E844D050D0B89 /* Pods-Status-StatusImPR.release.xcconfig */,
|
||||
);
|
||||
path = Pods;
|
||||
sourceTree = "<group>";
|
||||
@@ -341,11 +341,12 @@
|
||||
isa = PBXNativeTarget;
|
||||
buildConfigurationList = 00E357021AD99517003FC87E /* Build configuration list for PBXNativeTarget "StatusImTests" */;
|
||||
buildPhases = (
|
||||
CA339D1D94763C013F2794AD /* [CP] Check Pods Manifest.lock */,
|
||||
5937040F3338CDF93E777A93 /* [CP] Check Pods Manifest.lock */,
|
||||
00E356EA1AD99517003FC87E /* Sources */,
|
||||
00E356EB1AD99517003FC87E /* Frameworks */,
|
||||
00E356EC1AD99517003FC87E /* Resources */,
|
||||
D737FA0B0E9D346092C626FB /* [CP] Copy Pods Resources */,
|
||||
7AD665439C08CFEF5EF84F6A /* [CP] Embed Pods Frameworks */,
|
||||
02C1A8CA208E38DA07BAC311 /* [CP] Copy Pods Resources */,
|
||||
);
|
||||
buildRules = (
|
||||
);
|
||||
@@ -361,14 +362,15 @@
|
||||
isa = PBXNativeTarget;
|
||||
buildConfigurationList = 13B07F931A680F5B00A75B9A /* Build configuration list for PBXNativeTarget "StatusIm" */;
|
||||
buildPhases = (
|
||||
523CD6BCB20FD78FBF3564AD /* [CP] Check Pods Manifest.lock */,
|
||||
1DFD6BF757E89B72F40FCEE9 /* [CP] Check Pods Manifest.lock */,
|
||||
13B07F871A680F5B00A75B9A /* Sources */,
|
||||
13B07F8C1A680F5B00A75B9A /* Frameworks */,
|
||||
13B07F8E1A680F5B00A75B9A /* Resources */,
|
||||
00DD1BFF1BD5951E006B06BC /* Bundle React Native code and images */,
|
||||
20B6B6891D92C42700CC5C6A /* Embed Frameworks */,
|
||||
E3914A731DF919ED00EBB515 /* Run Script */,
|
||||
28606042DA81A750949525E4 /* [CP] Copy Pods Resources */,
|
||||
50F2A2E15670F86233743A5C /* [CP] Embed Pods Frameworks */,
|
||||
1B623A051F855FC5B09A0480 /* [CP] Copy Pods Resources */,
|
||||
);
|
||||
buildRules = (
|
||||
);
|
||||
@@ -383,14 +385,15 @@
|
||||
isa = PBXNativeTarget;
|
||||
buildConfigurationList = 3AAD2AD924A3A60E0075D594 /* Build configuration list for PBXNativeTarget "StatusImPR" */;
|
||||
buildPhases = (
|
||||
BDAFF7E8D7D1C97E92C1F9B0 /* [CP] Check Pods Manifest.lock */,
|
||||
EB421F3ED78A38D285D771D2 /* [CP] Check Pods Manifest.lock */,
|
||||
3AAD2ABB24A3A60E0075D594 /* Sources */,
|
||||
3AAD2ABF24A3A60E0075D594 /* Frameworks */,
|
||||
3AAD2AC924A3A60E0075D594 /* Resources */,
|
||||
3AAD2AD524A3A60E0075D594 /* Bundle React Native code and images */,
|
||||
3AAD2AD624A3A60E0075D594 /* Embed Frameworks */,
|
||||
3AAD2AD724A3A60E0075D594 /* Run Script */,
|
||||
BB1D92AA7446228787D6925C /* [CP] Copy Pods Resources */,
|
||||
F4561A2D3C9E6C4B66F4C4F5 /* [CP] Embed Pods Frameworks */,
|
||||
6FA1467F7B916ED92FA688E0 /* [CP] Copy Pods Resources */,
|
||||
);
|
||||
buildRules = (
|
||||
);
|
||||
@@ -542,9 +545,33 @@
|
||||
);
|
||||
runOnlyForDeploymentPostprocessing = 0;
|
||||
shellPath = "/usr/bin/env sh";
|
||||
shellScript = "set -o errexit\nexport NODE_BINARY=\"${NODE_BINARY:-node}\"\nexport NODE_ARGS=\"${NODE_ARGS:- --max-old-space-size=16384 }\"\n\nbash -x ../node_modules/react-native/scripts/react-native-xcode.sh > ../logs/react-native-xcode.log 2>&1";
|
||||
shellScript = "set -o errexit\nexport NODE_BINARY=\"${NODE_BINARY:-node}\"\nexport NODE_ARGS=\"${NODE_ARGS:- --max-old-space-size=16384 }\"\n\n\"../node_modules/react-native/scripts/react-native-xcode.sh\"\n";
|
||||
};
|
||||
28606042DA81A750949525E4 /* [CP] Copy Pods Resources */ = {
|
||||
02C1A8CA208E38DA07BAC311 /* [CP] Copy Pods Resources */ = {
|
||||
isa = PBXShellScriptBuildPhase;
|
||||
buildActionMask = 2147483647;
|
||||
files = (
|
||||
);
|
||||
inputPaths = (
|
||||
"${PODS_ROOT}/Target Support Files/Pods-Status-StatusIm-StatusImTests/Pods-Status-StatusIm-StatusImTests-resources.sh",
|
||||
"${PODS_CONFIGURATION_BUILD_DIR}/RNImageCropPicker/QBImagePicker.bundle",
|
||||
"${PODS_CONFIGURATION_BUILD_DIR}/RNPermissions/RNPermissionsPrivacyInfo.bundle",
|
||||
"${PODS_CONFIGURATION_BUILD_DIR}/React-Core/RCTI18nStrings.bundle",
|
||||
"${PODS_CONFIGURATION_BUILD_DIR}/TOCropViewController/TOCropViewControllerBundle.bundle",
|
||||
);
|
||||
name = "[CP] Copy Pods Resources";
|
||||
outputPaths = (
|
||||
"${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/QBImagePicker.bundle",
|
||||
"${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/RNPermissionsPrivacyInfo.bundle",
|
||||
"${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/RCTI18nStrings.bundle",
|
||||
"${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/TOCropViewControllerBundle.bundle",
|
||||
);
|
||||
runOnlyForDeploymentPostprocessing = 0;
|
||||
shellPath = /bin/sh;
|
||||
shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-Status-StatusIm-StatusImTests/Pods-Status-StatusIm-StatusImTests-resources.sh\"\n";
|
||||
showEnvVarsInLog = 0;
|
||||
};
|
||||
1B623A051F855FC5B09A0480 /* [CP] Copy Pods Resources */ = {
|
||||
isa = PBXShellScriptBuildPhase;
|
||||
buildActionMask = 2147483647;
|
||||
files = (
|
||||
@@ -552,13 +579,15 @@
|
||||
inputPaths = (
|
||||
"${PODS_ROOT}/Target Support Files/Pods-Status-StatusIm/Pods-Status-StatusIm-resources.sh",
|
||||
"${PODS_CONFIGURATION_BUILD_DIR}/RNImageCropPicker/QBImagePicker.bundle",
|
||||
"${PODS_CONFIGURATION_BUILD_DIR}/React-Core/AccessibilityResources.bundle",
|
||||
"${PODS_CONFIGURATION_BUILD_DIR}/RNPermissions/RNPermissionsPrivacyInfo.bundle",
|
||||
"${PODS_CONFIGURATION_BUILD_DIR}/React-Core/RCTI18nStrings.bundle",
|
||||
"${PODS_CONFIGURATION_BUILD_DIR}/TOCropViewController/TOCropViewControllerBundle.bundle",
|
||||
);
|
||||
name = "[CP] Copy Pods Resources";
|
||||
outputPaths = (
|
||||
"${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/QBImagePicker.bundle",
|
||||
"${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/AccessibilityResources.bundle",
|
||||
"${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/RNPermissionsPrivacyInfo.bundle",
|
||||
"${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/RCTI18nStrings.bundle",
|
||||
"${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/TOCropViewControllerBundle.bundle",
|
||||
);
|
||||
runOnlyForDeploymentPostprocessing = 0;
|
||||
@@ -566,35 +595,7 @@
|
||||
shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-Status-StatusIm/Pods-Status-StatusIm-resources.sh\"\n";
|
||||
showEnvVarsInLog = 0;
|
||||
};
|
||||
3AAD2AD524A3A60E0075D594 /* Bundle React Native code and images */ = {
|
||||
isa = PBXShellScriptBuildPhase;
|
||||
buildActionMask = 2147483647;
|
||||
files = (
|
||||
);
|
||||
inputPaths = (
|
||||
);
|
||||
name = "Bundle React Native code and images";
|
||||
outputPaths = (
|
||||
);
|
||||
runOnlyForDeploymentPostprocessing = 0;
|
||||
shellPath = "/usr/bin/env sh";
|
||||
shellScript = "set -o errexit\nexport NODE_BINARY=\"${NODE_BINARY:-node}\"\nexport NODE_ARGS=\"${NODE_ARGS:- --max-old-space-size=16384 }\"\n\nbash -x ../node_modules/react-native/scripts/react-native-xcode.sh > ../logs/react-native-xcode.log 2>&1";
|
||||
};
|
||||
3AAD2AD724A3A60E0075D594 /* Run Script */ = {
|
||||
isa = PBXShellScriptBuildPhase;
|
||||
buildActionMask = 8;
|
||||
files = (
|
||||
);
|
||||
inputPaths = (
|
||||
);
|
||||
name = "Run Script";
|
||||
outputPaths = (
|
||||
);
|
||||
runOnlyForDeploymentPostprocessing = 1;
|
||||
shellPath = "/usr/bin/env sh";
|
||||
shellScript = "\"${PROJECT_DIR}/scripts/set_xcode_version.sh\" > ../logs/set_xcode_version.log 2>&1";
|
||||
};
|
||||
523CD6BCB20FD78FBF3564AD /* [CP] Check Pods Manifest.lock */ = {
|
||||
1DFD6BF757E89B72F40FCEE9 /* [CP] Check Pods Manifest.lock */ = {
|
||||
isa = PBXShellScriptBuildPhase;
|
||||
buildActionMask = 2147483647;
|
||||
files = (
|
||||
@@ -616,51 +617,53 @@
|
||||
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;
|
||||
};
|
||||
BB1D92AA7446228787D6925C /* [CP] Copy Pods Resources */ = {
|
||||
3AAD2AD524A3A60E0075D594 /* Bundle React Native code and images */ = {
|
||||
isa = PBXShellScriptBuildPhase;
|
||||
buildActionMask = 2147483647;
|
||||
files = (
|
||||
);
|
||||
inputPaths = (
|
||||
"${PODS_ROOT}/Target Support Files/Pods-Status-StatusImPR/Pods-Status-StatusImPR-resources.sh",
|
||||
"${PODS_CONFIGURATION_BUILD_DIR}/RNImageCropPicker/QBImagePicker.bundle",
|
||||
"${PODS_CONFIGURATION_BUILD_DIR}/React-Core/AccessibilityResources.bundle",
|
||||
"${PODS_CONFIGURATION_BUILD_DIR}/TOCropViewController/TOCropViewControllerBundle.bundle",
|
||||
);
|
||||
name = "[CP] Copy Pods Resources";
|
||||
name = "Bundle React Native code and images";
|
||||
outputPaths = (
|
||||
"${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/QBImagePicker.bundle",
|
||||
"${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/AccessibilityResources.bundle",
|
||||
"${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/TOCropViewControllerBundle.bundle",
|
||||
);
|
||||
runOnlyForDeploymentPostprocessing = 0;
|
||||
shellPath = /bin/sh;
|
||||
shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-Status-StatusImPR/Pods-Status-StatusImPR-resources.sh\"\n";
|
||||
showEnvVarsInLog = 0;
|
||||
shellPath = "/usr/bin/env sh";
|
||||
shellScript = "set -o errexit\nexport NODE_BINARY=\"${NODE_BINARY:-node}\"\nexport NODE_ARGS=\"${NODE_ARGS:- --max-old-space-size=16384 }\"\n\n\"../node_modules/react-native/scripts/react-native-xcode.sh\"\n";
|
||||
};
|
||||
BDAFF7E8D7D1C97E92C1F9B0 /* [CP] Check Pods Manifest.lock */ = {
|
||||
3AAD2AD724A3A60E0075D594 /* Run Script */ = {
|
||||
isa = PBXShellScriptBuildPhase;
|
||||
buildActionMask = 8;
|
||||
files = (
|
||||
);
|
||||
inputPaths = (
|
||||
);
|
||||
name = "Run Script";
|
||||
outputPaths = (
|
||||
);
|
||||
runOnlyForDeploymentPostprocessing = 1;
|
||||
shellPath = "/usr/bin/env sh";
|
||||
shellScript = "\"${PROJECT_DIR}/scripts/set_xcode_version.sh\" > ../logs/set_xcode_version.log 2>&1\n";
|
||||
};
|
||||
50F2A2E15670F86233743A5C /* [CP] Embed Pods Frameworks */ = {
|
||||
isa = PBXShellScriptBuildPhase;
|
||||
buildActionMask = 2147483647;
|
||||
files = (
|
||||
);
|
||||
inputFileListPaths = (
|
||||
);
|
||||
inputPaths = (
|
||||
"${PODS_PODFILE_DIR_PATH}/Podfile.lock",
|
||||
"${PODS_ROOT}/Manifest.lock",
|
||||
);
|
||||
name = "[CP] Check Pods Manifest.lock";
|
||||
outputFileListPaths = (
|
||||
"${PODS_ROOT}/Target Support Files/Pods-Status-StatusIm/Pods-Status-StatusIm-frameworks.sh",
|
||||
"${PODS_XCFRAMEWORKS_BUILD_DIR}/hermes-engine/Pre-built/hermes.framework/hermes",
|
||||
);
|
||||
name = "[CP] Embed Pods Frameworks";
|
||||
outputPaths = (
|
||||
"$(DERIVED_FILE_DIR)/Pods-Status-StatusImPR-checkManifestLockResult.txt",
|
||||
"${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/hermes.framework",
|
||||
);
|
||||
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";
|
||||
shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-Status-StatusIm/Pods-Status-StatusIm-frameworks.sh\"\n";
|
||||
showEnvVarsInLog = 0;
|
||||
};
|
||||
CA339D1D94763C013F2794AD /* [CP] Check Pods Manifest.lock */ = {
|
||||
5937040F3338CDF93E777A93 /* [CP] Check Pods Manifest.lock */ = {
|
||||
isa = PBXShellScriptBuildPhase;
|
||||
buildActionMask = 2147483647;
|
||||
files = (
|
||||
@@ -682,26 +685,46 @@
|
||||
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;
|
||||
};
|
||||
D737FA0B0E9D346092C626FB /* [CP] Copy Pods Resources */ = {
|
||||
6FA1467F7B916ED92FA688E0 /* [CP] Copy Pods Resources */ = {
|
||||
isa = PBXShellScriptBuildPhase;
|
||||
buildActionMask = 2147483647;
|
||||
files = (
|
||||
);
|
||||
inputPaths = (
|
||||
"${PODS_ROOT}/Target Support Files/Pods-Status-StatusIm-StatusImTests/Pods-Status-StatusIm-StatusImTests-resources.sh",
|
||||
"${PODS_ROOT}/Target Support Files/Pods-Status-StatusImPR/Pods-Status-StatusImPR-resources.sh",
|
||||
"${PODS_CONFIGURATION_BUILD_DIR}/RNImageCropPicker/QBImagePicker.bundle",
|
||||
"${PODS_CONFIGURATION_BUILD_DIR}/React-Core/AccessibilityResources.bundle",
|
||||
"${PODS_CONFIGURATION_BUILD_DIR}/RNPermissions/RNPermissionsPrivacyInfo.bundle",
|
||||
"${PODS_CONFIGURATION_BUILD_DIR}/React-Core/RCTI18nStrings.bundle",
|
||||
"${PODS_CONFIGURATION_BUILD_DIR}/TOCropViewController/TOCropViewControllerBundle.bundle",
|
||||
);
|
||||
name = "[CP] Copy Pods Resources";
|
||||
outputPaths = (
|
||||
"${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/QBImagePicker.bundle",
|
||||
"${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/AccessibilityResources.bundle",
|
||||
"${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/RNPermissionsPrivacyInfo.bundle",
|
||||
"${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/RCTI18nStrings.bundle",
|
||||
"${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/TOCropViewControllerBundle.bundle",
|
||||
);
|
||||
runOnlyForDeploymentPostprocessing = 0;
|
||||
shellPath = /bin/sh;
|
||||
shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-Status-StatusIm-StatusImTests/Pods-Status-StatusIm-StatusImTests-resources.sh\"\n";
|
||||
shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-Status-StatusImPR/Pods-Status-StatusImPR-resources.sh\"\n";
|
||||
showEnvVarsInLog = 0;
|
||||
};
|
||||
7AD665439C08CFEF5EF84F6A /* [CP] Embed Pods Frameworks */ = {
|
||||
isa = PBXShellScriptBuildPhase;
|
||||
buildActionMask = 2147483647;
|
||||
files = (
|
||||
);
|
||||
inputPaths = (
|
||||
"${PODS_ROOT}/Target Support Files/Pods-Status-StatusIm-StatusImTests/Pods-Status-StatusIm-StatusImTests-frameworks.sh",
|
||||
"${PODS_XCFRAMEWORKS_BUILD_DIR}/hermes-engine/Pre-built/hermes.framework/hermes",
|
||||
);
|
||||
name = "[CP] Embed Pods Frameworks";
|
||||
outputPaths = (
|
||||
"${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/hermes.framework",
|
||||
);
|
||||
runOnlyForDeploymentPostprocessing = 0;
|
||||
shellPath = /bin/sh;
|
||||
shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-Status-StatusIm-StatusImTests/Pods-Status-StatusIm-StatusImTests-frameworks.sh\"\n";
|
||||
showEnvVarsInLog = 0;
|
||||
};
|
||||
E3914A731DF919ED00EBB515 /* Run Script */ = {
|
||||
@@ -716,7 +739,47 @@
|
||||
);
|
||||
runOnlyForDeploymentPostprocessing = 1;
|
||||
shellPath = "/usr/bin/env sh";
|
||||
shellScript = "\"${PROJECT_DIR}/scripts/set_xcode_version.sh\" > ../logs/set_xcode_version.log 2>&1";
|
||||
shellScript = "\"${PROJECT_DIR}/scripts/set_xcode_version.sh\" > ../logs/set_xcode_version.log 2>&1\n";
|
||||
};
|
||||
EB421F3ED78A38D285D771D2 /* [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-Status-StatusImPR-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;
|
||||
};
|
||||
F4561A2D3C9E6C4B66F4C4F5 /* [CP] Embed Pods Frameworks */ = {
|
||||
isa = PBXShellScriptBuildPhase;
|
||||
buildActionMask = 2147483647;
|
||||
files = (
|
||||
);
|
||||
inputPaths = (
|
||||
"${PODS_ROOT}/Target Support Files/Pods-Status-StatusImPR/Pods-Status-StatusImPR-frameworks.sh",
|
||||
"${PODS_XCFRAMEWORKS_BUILD_DIR}/hermes-engine/Pre-built/hermes.framework/hermes",
|
||||
);
|
||||
name = "[CP] Embed Pods Frameworks";
|
||||
outputPaths = (
|
||||
"${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/hermes.framework",
|
||||
);
|
||||
runOnlyForDeploymentPostprocessing = 0;
|
||||
shellPath = /bin/sh;
|
||||
shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-Status-StatusImPR/Pods-Status-StatusImPR-frameworks.sh\"\n";
|
||||
showEnvVarsInLog = 0;
|
||||
};
|
||||
/* End PBXShellScriptBuildPhase section */
|
||||
|
||||
@@ -765,7 +828,7 @@
|
||||
/* Begin XCBuildConfiguration section */
|
||||
00E356F61AD99517003FC87E /* Debug */ = {
|
||||
isa = XCBuildConfiguration;
|
||||
baseConfigurationReference = 59C9C002A09CA7F40E69C6CB /* Pods-Status-StatusIm-StatusImTests.debug.xcconfig */;
|
||||
baseConfigurationReference = D40C4023C7D5B793AEF98426 /* Pods-Status-StatusIm-StatusImTests.debug.xcconfig */;
|
||||
buildSettings = {
|
||||
ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES;
|
||||
BUNDLE_ID_SUFFIX = .debug;
|
||||
@@ -782,27 +845,27 @@
|
||||
"$(inherited)",
|
||||
);
|
||||
INFOPLIST_FILE = StatusImTests/Info.plist;
|
||||
IPHONEOS_DEPLOYMENT_TARGET = 12.4;
|
||||
IPHONEOS_DEPLOYMENT_TARGET = 13.4;
|
||||
LD_RUNPATH_SEARCH_PATHS = (
|
||||
"$(inherited)",
|
||||
"@executable_path/Frameworks",
|
||||
"@loader_path/Frameworks",
|
||||
);
|
||||
LIBRARY_SEARCH_PATHS = "$(inherited)";
|
||||
LIBRARY_SEARCH_PATHS = "$(SDKROOT)/usr/lib/swift$(inherited)";
|
||||
PRODUCT_BUNDLE_IDENTIFIER = im.status.ethereum;
|
||||
PRODUCT_NAME = "$(TARGET_NAME)";
|
||||
PROVISIONING_PROFILE = "";
|
||||
PROVISIONING_PROFILE_SPECIFIER = "";
|
||||
SWIFT_OBJC_BRIDGING_HEADER = "StatusImTests-Bridging-Header.h";
|
||||
SWIFT_OPTIMIZATION_LEVEL = "-Onone";
|
||||
SWIFT_VERSION = 5.0;
|
||||
SWIFT_VERSION = 5.2;
|
||||
TEST_HOST = "$(BUILT_PRODUCTS_DIR)/StatusIm.app/StatusIm";
|
||||
};
|
||||
name = Debug;
|
||||
};
|
||||
00E356F71AD99517003FC87E /* Release */ = {
|
||||
isa = XCBuildConfiguration;
|
||||
baseConfigurationReference = ACFD5EEA905CF67FD6F8C2CC /* Pods-Status-StatusIm-StatusImTests.release.xcconfig */;
|
||||
baseConfigurationReference = 1B74FBFCB9B8E34B63250A52 /* Pods-Status-StatusIm-StatusImTests.release.xcconfig */;
|
||||
buildSettings = {
|
||||
ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES;
|
||||
BUNDLE_ID_SUFFIX = "";
|
||||
@@ -816,30 +879,30 @@
|
||||
"$(inherited)",
|
||||
);
|
||||
INFOPLIST_FILE = StatusImTests/Info.plist;
|
||||
IPHONEOS_DEPLOYMENT_TARGET = 12.4;
|
||||
IPHONEOS_DEPLOYMENT_TARGET = 13.4;
|
||||
LD_RUNPATH_SEARCH_PATHS = (
|
||||
"$(inherited)",
|
||||
"@executable_path/Frameworks",
|
||||
"@loader_path/Frameworks",
|
||||
);
|
||||
LIBRARY_SEARCH_PATHS = "$(inherited)";
|
||||
LIBRARY_SEARCH_PATHS = "$(SDKROOT)/usr/lib/swift$(inherited)";
|
||||
PRODUCT_BUNDLE_IDENTIFIER = im.status.ethereum;
|
||||
PRODUCT_NAME = "$(TARGET_NAME)";
|
||||
PROVISIONING_PROFILE = "";
|
||||
PROVISIONING_PROFILE_SPECIFIER = "";
|
||||
SWIFT_OBJC_BRIDGING_HEADER = "StatusImTests-Bridging-Header.h";
|
||||
SWIFT_VERSION = 5.0;
|
||||
SWIFT_VERSION = 5.2;
|
||||
TEST_HOST = "$(BUILT_PRODUCTS_DIR)/StatusIm.app/StatusIm";
|
||||
};
|
||||
name = Release;
|
||||
};
|
||||
13B07F941A680F5B00A75B9A /* Debug */ = {
|
||||
isa = XCBuildConfiguration;
|
||||
baseConfigurationReference = 1130DCD9CBDCA3CA461F55B4 /* Pods-Status-StatusIm.debug.xcconfig */;
|
||||
baseConfigurationReference = A0B5AD061DF0F6CC98603A99 /* Pods-Status-StatusIm.debug.xcconfig */;
|
||||
buildSettings = {
|
||||
ASSETCATALOG_COMPILER_APPICON_NAME = "AppIcon$(BUNDLE_ID_SUFFIX)";
|
||||
BUNDLE_ID_SUFFIX = .debug;
|
||||
CLANG_CXX_LANGUAGE_STANDARD = "c++17";
|
||||
CLANG_CXX_LANGUAGE_STANDARD = "c++20";
|
||||
CLANG_ENABLE_MODULES = YES;
|
||||
CODE_SIGN_ENTITLEMENTS = StatusIm/StatusIm.entitlements;
|
||||
CODE_SIGN_IDENTITY = "Apple Development";
|
||||
@@ -879,13 +942,14 @@
|
||||
"$(SRCROOT)/../node_modules/react-native/Libraries/LinkingIOS",
|
||||
);
|
||||
INFOPLIST_FILE = StatusIm/Info.plist;
|
||||
IPHONEOS_DEPLOYMENT_TARGET = 12.4;
|
||||
IPHONEOS_DEPLOYMENT_TARGET = 13.4;
|
||||
LD_RUNPATH_SEARCH_PATHS = (
|
||||
/usr/lib/swift,
|
||||
"$(inherited)",
|
||||
"@executable_path/Frameworks",
|
||||
);
|
||||
LIBRARY_SEARCH_PATHS = (
|
||||
"$(SDKROOT)/usr/lib/swift",
|
||||
"$(inherited)",
|
||||
"$(PROJECT_DIR)",
|
||||
);
|
||||
@@ -894,19 +958,20 @@
|
||||
"-DFOLLY_NO_CONFIG",
|
||||
"-DFOLLY_MOBILE=1",
|
||||
"-DFOLLY_USE_LIBCPP=1",
|
||||
"-DFOLLY_CFG_NO_COROUTINES=1",
|
||||
);
|
||||
OTHER_LDFLAGS = (
|
||||
"$(inherited)",
|
||||
"-lc++",
|
||||
"-ObjC",
|
||||
"-lresolv",
|
||||
);
|
||||
PRESERVE_DEAD_CODE_INITS_AND_TERMS = YES;
|
||||
PRODUCT_BUNDLE_IDENTIFIER = im.status.ethereum;
|
||||
PRODUCT_NAME = StatusIm;
|
||||
PROVISIONING_PROFILE_SPECIFIER = "";
|
||||
SWIFT_OBJC_BRIDGING_HEADER = "StatusIm-Bridging-Header.h";
|
||||
SWIFT_OPTIMIZATION_LEVEL = "-Onone";
|
||||
SWIFT_VERSION = 5.0;
|
||||
SWIFT_VERSION = 5.2;
|
||||
TARGETED_DEVICE_FAMILY = 1;
|
||||
VALID_ARCHS = "x86_64 arm64";
|
||||
"VALID_ARCHS[sdk=iphonesimulator*]" = "x86_64 ";
|
||||
@@ -915,11 +980,11 @@
|
||||
};
|
||||
13B07F951A680F5B00A75B9A /* Release */ = {
|
||||
isa = XCBuildConfiguration;
|
||||
baseConfigurationReference = 668C1A2ADF1899973DAA1AB7 /* Pods-Status-StatusIm.release.xcconfig */;
|
||||
baseConfigurationReference = 232FE8EAB57384181B0DB836 /* Pods-Status-StatusIm.release.xcconfig */;
|
||||
buildSettings = {
|
||||
ASSETCATALOG_COMPILER_APPICON_NAME = "AppIcon$(BUNDLE_ID_SUFFIX)";
|
||||
BUNDLE_ID_SUFFIX = "";
|
||||
CLANG_CXX_LANGUAGE_STANDARD = "c++17";
|
||||
CLANG_CXX_LANGUAGE_STANDARD = "c++20";
|
||||
CLANG_ENABLE_MODULES = YES;
|
||||
CODE_SIGN_ENTITLEMENTS = StatusIm/StatusIm.entitlements;
|
||||
CODE_SIGN_IDENTITY = "iPhone Developer";
|
||||
@@ -953,13 +1018,14 @@
|
||||
"$(SRCROOT)/../node_modules/react-native/Libraries/LinkingIOS",
|
||||
);
|
||||
INFOPLIST_FILE = StatusIm/Info.plist;
|
||||
IPHONEOS_DEPLOYMENT_TARGET = 12.4;
|
||||
IPHONEOS_DEPLOYMENT_TARGET = 13.4;
|
||||
LD_RUNPATH_SEARCH_PATHS = (
|
||||
/usr/lib/swift,
|
||||
"$(inherited)",
|
||||
"@executable_path/Frameworks",
|
||||
);
|
||||
LIBRARY_SEARCH_PATHS = (
|
||||
"$(SDKROOT)/usr/lib/swift",
|
||||
"$(inherited)",
|
||||
"$(PROJECT_DIR)",
|
||||
);
|
||||
@@ -968,19 +1034,20 @@
|
||||
"-DFOLLY_NO_CONFIG",
|
||||
"-DFOLLY_MOBILE=1",
|
||||
"-DFOLLY_USE_LIBCPP=1",
|
||||
"-DFOLLY_CFG_NO_COROUTINES=1",
|
||||
);
|
||||
OTHER_LDFLAGS = (
|
||||
"$(inherited)",
|
||||
"-lc++",
|
||||
"-ObjC",
|
||||
"-lresolv",
|
||||
);
|
||||
PRESERVE_DEAD_CODE_INITS_AND_TERMS = YES;
|
||||
PRODUCT_BUNDLE_IDENTIFIER = im.status.ethereum;
|
||||
PRODUCT_NAME = StatusIm;
|
||||
PROVISIONING_PROFILE = "e2202b12-7a66-4ff7-af3c-a52e35f32dc1";
|
||||
PROVISIONING_PROFILE_SPECIFIER = "match AdHoc im.status.ethereum";
|
||||
SWIFT_OBJC_BRIDGING_HEADER = "StatusIm-Bridging-Header.h";
|
||||
SWIFT_VERSION = 5.0;
|
||||
SWIFT_VERSION = 5.2;
|
||||
TARGETED_DEVICE_FAMILY = 1;
|
||||
VALID_ARCHS = arm64;
|
||||
};
|
||||
@@ -988,11 +1055,11 @@
|
||||
};
|
||||
3AAD2ADA24A3A60E0075D594 /* Debug */ = {
|
||||
isa = XCBuildConfiguration;
|
||||
baseConfigurationReference = D0D6FCD821497D4A6D28C82E /* Pods-Status-StatusImPR.debug.xcconfig */;
|
||||
baseConfigurationReference = 7BF7B2DB23EE09E5229629DA /* Pods-Status-StatusImPR.debug.xcconfig */;
|
||||
buildSettings = {
|
||||
ASSETCATALOG_COMPILER_APPICON_NAME = "AppIcon$(BUNDLE_ID_SUFFIX)";
|
||||
BUNDLE_ID_SUFFIX = .debug;
|
||||
CLANG_CXX_LANGUAGE_STANDARD = "c++17";
|
||||
CLANG_CXX_LANGUAGE_STANDARD = "c++20";
|
||||
CLANG_ENABLE_MODULES = YES;
|
||||
CODE_SIGN_ENTITLEMENTS = StatusImPR/StatusImPR.entitlements;
|
||||
CODE_SIGN_IDENTITY = "iPhone Distribution";
|
||||
@@ -1031,13 +1098,14 @@
|
||||
"$(SRCROOT)/../node_modules/react-native/Libraries/LinkingIOS",
|
||||
);
|
||||
INFOPLIST_FILE = StatusImPR/Info.plist;
|
||||
IPHONEOS_DEPLOYMENT_TARGET = 12.4;
|
||||
IPHONEOS_DEPLOYMENT_TARGET = 13.4;
|
||||
LD_RUNPATH_SEARCH_PATHS = (
|
||||
/usr/lib/swift,
|
||||
"$(inherited)",
|
||||
"@executable_path/Frameworks",
|
||||
);
|
||||
LIBRARY_SEARCH_PATHS = (
|
||||
"$(SDKROOT)/usr/lib/swift",
|
||||
"$(inherited)",
|
||||
"$(PROJECT_DIR)",
|
||||
);
|
||||
@@ -1046,18 +1114,20 @@
|
||||
"-DFOLLY_NO_CONFIG",
|
||||
"-DFOLLY_MOBILE=1",
|
||||
"-DFOLLY_USE_LIBCPP=1",
|
||||
"-DFOLLY_CFG_NO_COROUTINES=1",
|
||||
);
|
||||
OTHER_LDFLAGS = (
|
||||
"$(inherited)",
|
||||
"-lc++",
|
||||
"-ObjC",
|
||||
"-lresolv",
|
||||
);
|
||||
PRODUCT_BUNDLE_IDENTIFIER = im.status.ethereum.pr;
|
||||
PRODUCT_NAME = "Status PR";
|
||||
PROVISIONING_PROFILE_SPECIFIER = "match Development im.status.ethereum.pr";
|
||||
SWIFT_OBJC_BRIDGING_HEADER = "StatusIm-Bridging-Header.h";
|
||||
SWIFT_OPTIMIZATION_LEVEL = "-Onone";
|
||||
SWIFT_VERSION = 5.0;
|
||||
SWIFT_VERSION = 5.2;
|
||||
TARGETED_DEVICE_FAMILY = 1;
|
||||
VALID_ARCHS = arm64;
|
||||
};
|
||||
@@ -1065,11 +1135,11 @@
|
||||
};
|
||||
3AAD2ADB24A3A60E0075D594 /* Release */ = {
|
||||
isa = XCBuildConfiguration;
|
||||
baseConfigurationReference = A18E846035BD6544591E45B9 /* Pods-Status-StatusImPR.release.xcconfig */;
|
||||
baseConfigurationReference = 7A393286DD0E844D050D0B89 /* Pods-Status-StatusImPR.release.xcconfig */;
|
||||
buildSettings = {
|
||||
ASSETCATALOG_COMPILER_APPICON_NAME = "AppIconPR$(BUNDLE_ID_SUFFIX)";
|
||||
BUNDLE_ID_SUFFIX = "";
|
||||
CLANG_CXX_LANGUAGE_STANDARD = "c++17";
|
||||
CLANG_CXX_LANGUAGE_STANDARD = "c++20";
|
||||
CLANG_ENABLE_MODULES = YES;
|
||||
CODE_SIGN_ENTITLEMENTS = StatusImPR/StatusImPR.entitlements;
|
||||
CODE_SIGN_IDENTITY = "iPhone Developer";
|
||||
@@ -1102,13 +1172,14 @@
|
||||
"$(SRCROOT)/../node_modules/react-native/Libraries/LinkingIOS",
|
||||
);
|
||||
INFOPLIST_FILE = StatusImPR/Info.plist;
|
||||
IPHONEOS_DEPLOYMENT_TARGET = 12.4;
|
||||
IPHONEOS_DEPLOYMENT_TARGET = 13.4;
|
||||
LD_RUNPATH_SEARCH_PATHS = (
|
||||
/usr/lib/swift,
|
||||
"$(inherited)",
|
||||
"@executable_path/Frameworks",
|
||||
);
|
||||
LIBRARY_SEARCH_PATHS = (
|
||||
"$(SDKROOT)/usr/lib/swift",
|
||||
"$(inherited)",
|
||||
"$(PROJECT_DIR)",
|
||||
);
|
||||
@@ -1117,17 +1188,19 @@
|
||||
"-DFOLLY_NO_CONFIG",
|
||||
"-DFOLLY_MOBILE=1",
|
||||
"-DFOLLY_USE_LIBCPP=1",
|
||||
"-DFOLLY_CFG_NO_COROUTINES=1",
|
||||
);
|
||||
OTHER_LDFLAGS = (
|
||||
"$(inherited)",
|
||||
"-lc++",
|
||||
"-ObjC",
|
||||
"-lresolv",
|
||||
);
|
||||
PRODUCT_BUNDLE_IDENTIFIER = im.status.ethereum.pr;
|
||||
PRODUCT_NAME = "Status PR";
|
||||
PROVISIONING_PROFILE_SPECIFIER = "match AdHoc im.status.ethereum.pr";
|
||||
SWIFT_OBJC_BRIDGING_HEADER = "StatusIm-Bridging-Header.h";
|
||||
SWIFT_VERSION = 5.0;
|
||||
SWIFT_VERSION = 5.2;
|
||||
TARGETED_DEVICE_FAMILY = 1;
|
||||
VALID_ARCHS = arm64;
|
||||
};
|
||||
@@ -1139,7 +1212,7 @@
|
||||
ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES;
|
||||
ALWAYS_SEARCH_USER_PATHS = NO;
|
||||
CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES;
|
||||
CLANG_CXX_LANGUAGE_STANDARD = "c++17";
|
||||
CLANG_CXX_LANGUAGE_STANDARD = "c++20";
|
||||
CLANG_CXX_LIBRARY = "libc++";
|
||||
CLANG_ENABLE_MODULES = YES;
|
||||
CLANG_ENABLE_OBJC_ARC = YES;
|
||||
@@ -1166,13 +1239,14 @@
|
||||
"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer";
|
||||
CODE_SIGN_STYLE = Manual;
|
||||
COPY_PHASE_STRIP = NO;
|
||||
DEAD_CODE_STRIPPING = YES;
|
||||
DEVELOPMENT_TEAM = 8B5X2M6H2Y;
|
||||
ENABLE_BITCODE = NO;
|
||||
ENABLE_STRICT_OBJC_MSGSEND = YES;
|
||||
ENABLE_TESTABILITY = YES;
|
||||
EXCLUDED_ARCHS = "";
|
||||
"EXCLUDED_ARCHS[sdk=iphoneos*]" = x86_64;
|
||||
"EXCLUDED_ARCHS[sdk=iphonesimulator*]" = "";
|
||||
"EXCLUDED_ARCHS[sdk=iphonesimulator*]" = i386;
|
||||
GCC_C_LANGUAGE_STANDARD = gnu99;
|
||||
GCC_DYNAMIC_NO_PIC = NO;
|
||||
GCC_NO_COMMON_BLOCKS = YES;
|
||||
@@ -1203,21 +1277,30 @@
|
||||
"$(SRCROOT)/../node_modules/react-native-image-resizer/ios/RCTImageResizer",
|
||||
"$(SRCROOT)/../node_modules/react-native-lottie-splash-screen/ios/**",
|
||||
);
|
||||
IPHONEOS_DEPLOYMENT_TARGET = 12.4;
|
||||
IPHONEOS_DEPLOYMENT_TARGET = 13.4;
|
||||
LIBRARY_SEARCH_PATHS = (
|
||||
"$(SDKROOT)/usr/lib/swift",
|
||||
"\"$(TOOLCHAIN_DIR)/usr/lib/swift/$(PLATFORM_NAME)\"",
|
||||
"\"$(inherited)\"",
|
||||
);
|
||||
MTL_ENABLE_DEBUG_INFO = YES;
|
||||
ONLY_ACTIVE_ARCH = YES;
|
||||
OTHER_CFLAGS = (
|
||||
"$(inherited)",
|
||||
" ",
|
||||
);
|
||||
OTHER_CPLUSPLUSFLAGS = (
|
||||
"$(OTHER_CFLAGS)",
|
||||
"-DFOLLY_NO_CONFIG",
|
||||
"-DFOLLY_MOBILE=1",
|
||||
"-DFOLLY_USE_LIBCPP=1",
|
||||
"-DFOLLY_CFG_NO_COROUTINES=1",
|
||||
" ",
|
||||
);
|
||||
PRESERVE_DEAD_CODE_INITS_AND_TERMS = YES;
|
||||
OTHER_LDFLAGS = "$(inherited)";
|
||||
REACT_NATIVE_PATH = "${PODS_ROOT}/../../node_modules/react-native";
|
||||
SDKROOT = iphoneos;
|
||||
USE_HERMES = true;
|
||||
VALID_ARCHS = arm64;
|
||||
"VALID_ARCHS[sdk=iphonesimulator*]" = x86_64;
|
||||
};
|
||||
@@ -1229,7 +1312,7 @@
|
||||
ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES;
|
||||
ALWAYS_SEARCH_USER_PATHS = NO;
|
||||
CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES;
|
||||
CLANG_CXX_LANGUAGE_STANDARD = "c++17";
|
||||
CLANG_CXX_LANGUAGE_STANDARD = "c++20";
|
||||
CLANG_CXX_LIBRARY = "libc++";
|
||||
CLANG_ENABLE_MODULES = YES;
|
||||
CLANG_ENABLE_OBJC_ARC = YES;
|
||||
@@ -1256,12 +1339,13 @@
|
||||
"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Distribution";
|
||||
CODE_SIGN_STYLE = Manual;
|
||||
COPY_PHASE_STRIP = YES;
|
||||
DEAD_CODE_STRIPPING = YES;
|
||||
DEVELOPMENT_TEAM = 8B5X2M6H2Y;
|
||||
ENABLE_BITCODE = NO;
|
||||
ENABLE_NS_ASSERTIONS = NO;
|
||||
ENABLE_STRICT_OBJC_MSGSEND = YES;
|
||||
EXCLUDED_ARCHS = "";
|
||||
"EXCLUDED_ARCHS[sdk=iphonesimulator*]" = "";
|
||||
"EXCLUDED_ARCHS[sdk=iphonesimulator*]" = i386;
|
||||
GCC_C_LANGUAGE_STANDARD = gnu99;
|
||||
GCC_NO_COMMON_BLOCKS = YES;
|
||||
GCC_PRECOMPILE_PREFIX_HEADER = NO;
|
||||
@@ -1284,21 +1368,30 @@
|
||||
"$(SRCROOT)/../node_modules/react-native-image-resizer/ios/RCTImageResizer",
|
||||
"$(SRCROOT)/../node_modules/react-native-lottie-splash-screen/ios/**",
|
||||
);
|
||||
IPHONEOS_DEPLOYMENT_TARGET = 12.4;
|
||||
IPHONEOS_DEPLOYMENT_TARGET = 13.4;
|
||||
LIBRARY_SEARCH_PATHS = (
|
||||
"$(SDKROOT)/usr/lib/swift",
|
||||
"\"$(TOOLCHAIN_DIR)/usr/lib/swift/$(PLATFORM_NAME)\"",
|
||||
"\"$(inherited)\"",
|
||||
);
|
||||
MTL_ENABLE_DEBUG_INFO = NO;
|
||||
ONLY_ACTIVE_ARCH = NO;
|
||||
OTHER_CFLAGS = (
|
||||
"$(inherited)",
|
||||
" ",
|
||||
);
|
||||
OTHER_CPLUSPLUSFLAGS = (
|
||||
"$(OTHER_CFLAGS)",
|
||||
"-DFOLLY_NO_CONFIG",
|
||||
"-DFOLLY_MOBILE=1",
|
||||
"-DFOLLY_USE_LIBCPP=1",
|
||||
"-DFOLLY_CFG_NO_COROUTINES=1",
|
||||
" ",
|
||||
);
|
||||
PRESERVE_DEAD_CODE_INITS_AND_TERMS = YES;
|
||||
OTHER_LDFLAGS = "$(inherited)";
|
||||
REACT_NATIVE_PATH = "${PODS_ROOT}/../../node_modules/react-native";
|
||||
SDKROOT = iphoneos;
|
||||
USE_HERMES = true;
|
||||
VALIDATE_PRODUCT = YES;
|
||||
VALID_ARCHS = arm64;
|
||||
};
|
||||
|
||||
@@ -104,6 +104,11 @@ extern "C" NSString* StatusgoImageServerTLSCert();
|
||||
|
||||
|
||||
- (NSURL *)sourceURLForBridge:(RCTBridge *)bridge
|
||||
{
|
||||
return [self getBundleURL];
|
||||
}
|
||||
|
||||
- (NSURL *)getBundleURL
|
||||
{
|
||||
#if DEBUG
|
||||
return [[RCTBundleURLProvider sharedSettings] jsBundleURLForBundleRoot:@"index"];
|
||||
|
||||
+12
-17
@@ -2,12 +2,12 @@
|
||||
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
|
||||
<plist version="1.0">
|
||||
<dict>
|
||||
<key>CADisableMinimumFrameDurationOnPhone</key>
|
||||
<true/>
|
||||
<key>CFBundleBuildUrl</key>
|
||||
<string>????</string>
|
||||
<key>CFBundleCommitHash</key>
|
||||
<string>unknown</string>
|
||||
<key>NSFaceIDUsageDescription</key>
|
||||
<string>Enabling Face ID allows you quick and secure access to your account.</string>
|
||||
<key>CFBundleDevelopmentRegion</key>
|
||||
<string>en</string>
|
||||
<key>CFBundleDisplayName</key>
|
||||
@@ -59,31 +59,29 @@
|
||||
</array>
|
||||
<key>LSRequiresIPhoneOS</key>
|
||||
<true/>
|
||||
<key>NFCReaderUsageDescription</key>
|
||||
<string>Enable Keycard</string>
|
||||
<key>NSAppTransportSecurity</key>
|
||||
<dict>
|
||||
<key>NSAllowsArbitraryLoads</key>
|
||||
<false/>
|
||||
<key>NSAllowsLocalNetworking</key>
|
||||
<true/>
|
||||
<key>NSExceptionDomains</key>
|
||||
<dict>
|
||||
<key>localhost</key>
|
||||
<dict>
|
||||
<key>NSTemporaryExceptionAllowsInsecureHTTPLoads</key>
|
||||
<true/>
|
||||
</dict>
|
||||
</dict>
|
||||
</dict>
|
||||
<key>NSCameraUsageDescription</key>
|
||||
<string>Status uses camera to take pictures and scan QR codes.</string>
|
||||
<key>NSFaceIDUsageDescription</key>
|
||||
<string>Enabling Face ID allows you quick and secure access to your account.</string>
|
||||
<key>NSLocationAlwaysUsageDescription</key>
|
||||
<string>Location access is required for some DApps to function properly.</string>
|
||||
<key>NSLocationWhenInUseUsageDescription</key>
|
||||
<string>Location access is required for some DApps to function properly.</string>
|
||||
<key>NSPhotoLibraryUsageDescription</key>
|
||||
<string>Photos access is required to give you the ability to send images.</string>
|
||||
<key>NSPhotoLibraryAddUsageDescription</key>
|
||||
<string>Photos access is required to give you the ability to save images.</string>
|
||||
<key>NSMicrophoneUsageDescription</key>
|
||||
<string>Need microphone access for sending audio messages.</string>
|
||||
<key>NSPhotoLibraryAddUsageDescription</key>
|
||||
<string>Photos access is required to give you the ability to save images.</string>
|
||||
<key>NSPhotoLibraryUsageDescription</key>
|
||||
<string>Photos access is required to give you the ability to send images.</string>
|
||||
<key>UIAppFonts</key>
|
||||
<array>
|
||||
<string>Inter-Bold.otf</string>
|
||||
@@ -140,8 +138,5 @@
|
||||
<string>A00000080400010301</string>
|
||||
<string>A000000151000000</string>
|
||||
</array>
|
||||
<key>NFCReaderUsageDescription</key>
|
||||
<string>Enable Keycard</string>
|
||||
<key>CADisableMinimumFrameDurationOnPhone</key><true/>
|
||||
</dict>
|
||||
</plist>
|
||||
|
||||
+3
-1
@@ -22,6 +22,8 @@ This directory is the destination of logs created during build time of debug bui
|
||||
These log files are uploaded to Jenkins as CI job artifacts on failure using `archiveArtifacts`.
|
||||
|
||||
* `react-native-xcode.log` - Output from `node_modules/react-native/scripts/react-native-xcode.sh`.
|
||||
- Created by redirecting output of `shellScript` in `ios/StatusIm.xcodeproj/project.pbxproj`.
|
||||
- Created by redirecting output of `shellScript` in `ios/StatusIm.xcodeproj/project.pbxproj` for "Bundle React Native code and images" build Phase.
|
||||
* `set_xcode_version.log` - Output from `node_modules/react-native/scripts/react-native-xcode.sh`.
|
||||
- Created by redirecting output of `shellScript` in `ios/StatusIm.xcodeproj/project.pbxproj` for "Run Script" build Phase.
|
||||
* `Status PR-StatusImPR.log - Created by [Fastlane Gym](https://docs.fastlane.tools/actions/gym/).
|
||||
- Configred via [`Fastfile`](../Fastfile) using `buildlog_path` argument for `build_ios_app`.
|
||||
|
||||
-355
@@ -1,355 +0,0 @@
|
||||
package im.status.ethereum.module;
|
||||
|
||||
import com.facebook.react.bridge.Callback;
|
||||
import com.facebook.react.bridge.ReactMethod;
|
||||
import com.facebook.react.bridge.ReactApplicationContext;
|
||||
import com.facebook.react.bridge.ReactContextBaseJavaModule;
|
||||
import statusgo.Statusgo;
|
||||
import java.io.File;
|
||||
import java.io.FileInputStream;
|
||||
import java.io.FileOutputStream;
|
||||
import java.io.InputStream;
|
||||
import java.io.OutputStream;
|
||||
import java.io.IOException;
|
||||
import org.json.JSONObject;
|
||||
import org.json.JSONException;
|
||||
import android.util.Log;
|
||||
import android.content.Context;
|
||||
import android.app.Activity;
|
||||
|
||||
public class AccountManager extends ReactContextBaseJavaModule {
|
||||
private static final String TAG = "AccountManager";
|
||||
private static final String gethLogFileName = "geth.log";
|
||||
private ReactApplicationContext reactContext;
|
||||
|
||||
private Utils utils;
|
||||
private LogManager logManager;
|
||||
|
||||
public AccountManager(ReactApplicationContext reactContext) {
|
||||
super(reactContext);
|
||||
this.reactContext = reactContext;
|
||||
this.utils = new Utils(reactContext);
|
||||
this.logManager = new LogManager(reactContext);
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getName() {
|
||||
return "AccountManager";
|
||||
}
|
||||
|
||||
private String getTestnetDataDir(final String absRootDirPath) {
|
||||
return this.utils.pathCombine(absRootDirPath, "ethereum/testnet");
|
||||
}
|
||||
|
||||
@ReactMethod
|
||||
public void createAccountAndLogin(final String createAccountRequest) {
|
||||
Log.d(TAG, "createAccountAndLogin");
|
||||
String result = Statusgo.createAccountAndLogin(createAccountRequest);
|
||||
if (result.startsWith("{\"error\":\"\"")) {
|
||||
Log.d(TAG, "createAccountAndLogin success: " + result);
|
||||
Log.d(TAG, "Geth node started");
|
||||
} else {
|
||||
Log.e(TAG, "createAccountAndLogin failed: " + result);
|
||||
}
|
||||
}
|
||||
|
||||
@ReactMethod
|
||||
public void restoreAccountAndLogin(final String restoreAccountRequest) {
|
||||
Log.d(TAG, "restoreAccountAndLogin");
|
||||
String result = Statusgo.restoreAccountAndLogin(restoreAccountRequest);
|
||||
if (result.startsWith("{\"error\":\"\"")) {
|
||||
Log.d(TAG, "restoreAccountAndLogin success: " + result);
|
||||
Log.d(TAG, "Geth node started");
|
||||
} else {
|
||||
Log.e(TAG, "restoreAccountAndLogin failed: " + result);
|
||||
}
|
||||
}
|
||||
|
||||
private String updateConfig(final String jsonConfigString, final String absRootDirPath, final String keystoreDirPath) throws JSONException {
|
||||
final JSONObject jsonConfig = new JSONObject(jsonConfigString);
|
||||
// retrieve parameters from app config, that will be applied onto the Go-side config later on
|
||||
final String dataDirPath = jsonConfig.getString("DataDir");
|
||||
final Boolean logEnabled = jsonConfig.getBoolean("LogEnabled");
|
||||
final Context context = this.getReactApplicationContext();
|
||||
final File gethLogFile = logEnabled ? this.logManager.prepareLogsFile(context) : null;
|
||||
String gethLogDirPath = null;
|
||||
if (gethLogFile != null) {
|
||||
gethLogDirPath = gethLogFile.getParent();
|
||||
}
|
||||
|
||||
Log.d(TAG, "log dir: " + gethLogDirPath + " log name: " + gethLogFileName);
|
||||
|
||||
jsonConfig.put("DataDir", dataDirPath);
|
||||
jsonConfig.put("KeyStoreDir", keystoreDirPath);
|
||||
jsonConfig.put("LogDir", gethLogDirPath);
|
||||
jsonConfig.put("LogFile", gethLogFileName);
|
||||
|
||||
return jsonConfig.toString();
|
||||
}
|
||||
|
||||
private static void prettyPrintConfig(final String config) {
|
||||
Log.d(TAG, "startNode() with config (see below)");
|
||||
String configOutput = config;
|
||||
final int maxOutputLen = 4000;
|
||||
Log.d(TAG, "********************** NODE CONFIG ****************************");
|
||||
while (!configOutput.isEmpty()) {
|
||||
Log.d(TAG, "Node config:" + configOutput.substring(0, Math.min(maxOutputLen, configOutput.length())));
|
||||
if (configOutput.length() > maxOutputLen) {
|
||||
configOutput = configOutput.substring(maxOutputLen);
|
||||
} else {
|
||||
break;
|
||||
}
|
||||
}
|
||||
Log.d(TAG, "******************* ENDOF NODE CONFIG *************************");
|
||||
}
|
||||
|
||||
private void copyDirectory(File sourceLocation, File targetLocation) throws IOException {
|
||||
if (sourceLocation.isDirectory()) {
|
||||
if (!targetLocation.exists() && !targetLocation.mkdirs()) {
|
||||
throw new IOException("Cannot create dir " + targetLocation.getAbsolutePath());
|
||||
}
|
||||
|
||||
String[] children = sourceLocation.list();
|
||||
for (int i = 0; i < children.length; i++) {
|
||||
copyDirectory(new File(sourceLocation, children[i]), new File(targetLocation, children[i]));
|
||||
}
|
||||
} else {
|
||||
File directory = targetLocation.getParentFile();
|
||||
if (directory != null && !directory.exists() && !directory.mkdirs()) {
|
||||
throw new IOException("Cannot create dir " + directory.getAbsolutePath());
|
||||
}
|
||||
|
||||
InputStream in = new FileInputStream(sourceLocation);
|
||||
OutputStream out = new FileOutputStream(targetLocation);
|
||||
|
||||
byte[] buf = new byte[1024];
|
||||
int len;
|
||||
while ((len = in.read(buf)) > 0) {
|
||||
out.write(buf, 0, len);
|
||||
}
|
||||
in.close();
|
||||
out.close();
|
||||
}
|
||||
}
|
||||
|
||||
private String prepareDirAndUpdateConfig(final String jsonConfigString, final String keyUID) {
|
||||
|
||||
final String absRootDirPath = this.utils.getNoBackupDirectory();
|
||||
final String dataFolder = this.getTestnetDataDir(absRootDirPath);
|
||||
Log.d(TAG, "Starting Geth node in folder: " + dataFolder);
|
||||
|
||||
try {
|
||||
final File newFile = new File(dataFolder);
|
||||
// todo handle error?
|
||||
newFile.mkdir();
|
||||
} catch (Exception e) {
|
||||
Log.e(TAG, "error making folder: " + dataFolder, e);
|
||||
}
|
||||
|
||||
final String ropstenFlagPath = this.utils.pathCombine(absRootDirPath, "ropsten_flag");
|
||||
final File ropstenFlag = new File(ropstenFlagPath);
|
||||
if (!ropstenFlag.exists()) {
|
||||
try {
|
||||
final String chaindDataFolderPath = this.utils.pathCombine(dataFolder, "StatusIM/lightchaindata");
|
||||
final File lightChainFolder = new File(chaindDataFolderPath);
|
||||
if (lightChainFolder.isDirectory()) {
|
||||
String[] children = lightChainFolder.list();
|
||||
for (int i = 0; i < children.length; i++) {
|
||||
new File(lightChainFolder, children[i]).delete();
|
||||
}
|
||||
}
|
||||
lightChainFolder.delete();
|
||||
ropstenFlag.createNewFile();
|
||||
} catch (IOException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
|
||||
String testnetDataDir = dataFolder;
|
||||
String oldKeystoreDir = this.utils.pathCombine(testnetDataDir, "keystore");
|
||||
String newKeystoreDir = this.utils.pathCombine(absRootDirPath, "keystore");
|
||||
final File oldKeystore = new File(oldKeystoreDir);
|
||||
if (oldKeystore.exists()) {
|
||||
try {
|
||||
final File newKeystore = new File(newKeystoreDir);
|
||||
copyDirectory(oldKeystore, newKeystore);
|
||||
|
||||
if (oldKeystore.isDirectory()) {
|
||||
String[] children = oldKeystore.list();
|
||||
for (int i = 0; i < children.length; i++) {
|
||||
new File(oldKeystoreDir, children[i]).delete();
|
||||
}
|
||||
}
|
||||
oldKeystore.delete();
|
||||
} catch (IOException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
|
||||
try {
|
||||
final String multiaccountKeystoreDir = this.utils.pathCombine("/keystore", keyUID);
|
||||
final String updatedJsonConfigString = this.updateConfig(jsonConfigString, absRootDirPath, multiaccountKeystoreDir);
|
||||
|
||||
prettyPrintConfig(updatedJsonConfigString);
|
||||
|
||||
return updatedJsonConfigString;
|
||||
} catch (JSONException e) {
|
||||
Log.e(TAG, "updateConfig failed: " + e.getMessage());
|
||||
System.exit(1);
|
||||
|
||||
return "";
|
||||
}
|
||||
}
|
||||
|
||||
@ReactMethod
|
||||
public void prepareDirAndUpdateConfig(final String keyUID, final String config, final Callback callback) {
|
||||
Log.d(TAG, "prepareDirAndUpdateConfig");
|
||||
String finalConfig = prepareDirAndUpdateConfig(config, keyUID);
|
||||
callback.invoke(finalConfig);
|
||||
}
|
||||
|
||||
@ReactMethod
|
||||
public void saveAccountAndLoginWithKeycard(final String multiaccountData, final String password, final String settings, final String config, final String accountsData, final String chatKey) {
|
||||
try {
|
||||
Log.d(TAG, "saveAccountAndLoginWithKeycard");
|
||||
String finalConfig = prepareDirAndUpdateConfig(config, this.utils.getKeyUID(multiaccountData));
|
||||
String result = Statusgo.saveAccountAndLoginWithKeycard(multiaccountData, password, settings, finalConfig, accountsData, chatKey);
|
||||
if (result.startsWith("{\"error\":\"\"")) {
|
||||
Log.d(TAG, "saveAccountAndLoginWithKeycard result: " + result);
|
||||
Log.d(TAG, "Geth node started");
|
||||
} else {
|
||||
Log.e(TAG, "saveAccountAndLoginWithKeycard failed: " + result);
|
||||
}
|
||||
} catch (JSONException e) {
|
||||
Log.e(TAG, "JSON conversion failed: " + e.getMessage());
|
||||
}
|
||||
}
|
||||
|
||||
@ReactMethod
|
||||
public void loginWithKeycard(final String accountData, final String password, final String chatKey, final String nodeConfigJSON) {
|
||||
Log.d(TAG, "loginWithKeycard");
|
||||
this.utils.migrateKeyStoreDir(accountData, password);
|
||||
String result = Statusgo.loginWithKeycard(accountData, password, chatKey, nodeConfigJSON);
|
||||
if (result.startsWith("{\"error\":\"\"")) {
|
||||
Log.d(TAG, "LoginWithKeycard result: " + result);
|
||||
} else {
|
||||
Log.e(TAG, "LoginWithKeycard failed: " + result);
|
||||
}
|
||||
}
|
||||
|
||||
@ReactMethod
|
||||
public void loginWithConfig(final String accountData, final String password, final String configJSON) {
|
||||
Log.d(TAG, "loginWithConfig");
|
||||
this.utils.migrateKeyStoreDir(accountData, password);
|
||||
String result = Statusgo.loginWithConfig(accountData, password, configJSON);
|
||||
if (result.startsWith("{\"error\":\"\"")) {
|
||||
Log.d(TAG, "LoginWithConfig result: " + result);
|
||||
} else {
|
||||
Log.e(TAG, "LoginWithConfig failed: " + result);
|
||||
}
|
||||
}
|
||||
|
||||
@ReactMethod
|
||||
public void loginAccount(final String request) {
|
||||
Log.d(TAG, "loginAccount");
|
||||
String result = Statusgo.loginAccount(request);
|
||||
if (result.startsWith("{\"error\":\"\"")) {
|
||||
Log.d(TAG, "loginAccount result: " + result);
|
||||
} else {
|
||||
Log.e(TAG, "loginAccount failed: " + result);
|
||||
}
|
||||
}
|
||||
|
||||
@ReactMethod
|
||||
public void verify(final String address, final String password, final Callback callback) throws JSONException {
|
||||
Activity currentActivity = getCurrentActivity();
|
||||
|
||||
final String absRootDirPath = this.utils.getNoBackupDirectory();
|
||||
final String newKeystoreDir = this.utils.pathCombine(absRootDirPath, "keystore");
|
||||
|
||||
this.utils.executeRunnableStatusGoMethod(() -> Statusgo.verifyAccountPassword(newKeystoreDir, address, password), callback);
|
||||
}
|
||||
|
||||
@ReactMethod
|
||||
public void verifyDatabasePassword(final String keyUID, final String password, final Callback callback) throws JSONException {
|
||||
this.utils.executeRunnableStatusGoMethod(() -> Statusgo.verifyDatabasePassword(keyUID, password), callback);
|
||||
}
|
||||
|
||||
@ReactMethod
|
||||
private void openAccounts(final Callback callback) throws JSONException {
|
||||
Log.d(TAG, "openAccounts");
|
||||
final String rootDir = this.utils.getNoBackupDirectory();
|
||||
Log.d(TAG, "[Opening accounts" + rootDir);
|
||||
this.utils.executeRunnableStatusGoMethod(() -> Statusgo.openAccounts(rootDir), callback);
|
||||
}
|
||||
|
||||
//TODO : refactor logout usage to accept callback so that we can do this.utils.executeRunnableStatusGoMethod
|
||||
@ReactMethod
|
||||
public void logout() {
|
||||
Log.d(TAG, "logout");
|
||||
Runnable r = new Runnable() {
|
||||
@Override
|
||||
public void run() {
|
||||
String result = Statusgo.logout();
|
||||
if (result.startsWith("{\"error\":\"\"")) {
|
||||
Log.d(TAG, "Logout result: " + result);
|
||||
} else {
|
||||
Log.e(TAG, "Logout failed: " + result);
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
StatusThreadPoolExecutor.getInstance().execute(r);
|
||||
}
|
||||
|
||||
@ReactMethod
|
||||
public void multiAccountStoreAccount(final String json, final Callback callback) throws JSONException {
|
||||
this.utils.executeRunnableStatusGoMethod(() -> Statusgo.multiAccountStoreAccount(json), callback);
|
||||
}
|
||||
|
||||
@ReactMethod
|
||||
public void multiAccountLoadAccount(final String json, final Callback callback) throws JSONException {
|
||||
this.utils.executeRunnableStatusGoMethod(() -> Statusgo.multiAccountLoadAccount(json), callback);
|
||||
}
|
||||
|
||||
@ReactMethod
|
||||
public void multiAccountDeriveAddresses(final String json, final Callback callback) throws JSONException {
|
||||
this.utils.executeRunnableStatusGoMethod(() -> Statusgo.multiAccountDeriveAddresses(json), callback);
|
||||
}
|
||||
|
||||
@ReactMethod
|
||||
public void multiAccountGenerateAndDeriveAddresses(final String json, final Callback callback) throws JSONException {
|
||||
this.utils.executeRunnableStatusGoMethod(() -> Statusgo.multiAccountGenerateAndDeriveAddresses(json), callback);
|
||||
}
|
||||
|
||||
@ReactMethod
|
||||
public void multiAccountStoreDerived(final String json, final Callback callback) throws JSONException {
|
||||
this.utils.executeRunnableStatusGoMethod(() -> Statusgo.multiAccountStoreDerivedAccounts(json), callback);
|
||||
}
|
||||
|
||||
@ReactMethod
|
||||
public void multiAccountImportMnemonic(final String json, final Callback callback) throws JSONException {
|
||||
this.utils.executeRunnableStatusGoMethod(() -> Statusgo.multiAccountImportMnemonic(json), callback);
|
||||
}
|
||||
|
||||
@ReactMethod
|
||||
public void multiAccountImportPrivateKey(final String json, final Callback callback) throws JSONException {
|
||||
this.utils.executeRunnableStatusGoMethod(() -> Statusgo.multiAccountImportPrivateKey(json), callback);
|
||||
}
|
||||
|
||||
@ReactMethod
|
||||
public void deleteMultiaccount(final String keyUID, final Callback callback) throws JSONException {
|
||||
final String keyStoreDir = this.utils.getKeyStorePath(keyUID);
|
||||
this.utils.executeRunnableStatusGoMethod(() -> Statusgo.deleteMultiaccount(keyUID, keyStoreDir), callback);
|
||||
}
|
||||
|
||||
@ReactMethod
|
||||
public void getRandomMnemonic(final Callback callback) throws JSONException {
|
||||
this.utils.executeRunnableStatusGoMethod(() -> Statusgo.getRandomMnemonic(), callback);
|
||||
}
|
||||
|
||||
@ReactMethod
|
||||
public void createAccountFromMnemonicAndDeriveAccountsForPaths(final String mnemonic, final Callback callback) throws JSONException {
|
||||
this.utils.executeRunnableStatusGoMethod(() -> Statusgo.createAccountFromMnemonicAndDeriveAccountsForPaths(mnemonic), callback);
|
||||
}
|
||||
}
|
||||
+333
@@ -0,0 +1,333 @@
|
||||
package im.status.ethereum.module
|
||||
|
||||
import android.app.Activity
|
||||
import android.content.Context
|
||||
import android.util.Log
|
||||
import com.facebook.react.bridge.Callback
|
||||
import com.facebook.react.bridge.ReactApplicationContext
|
||||
import com.facebook.react.bridge.ReactContextBaseJavaModule
|
||||
import com.facebook.react.bridge.ReactMethod
|
||||
import org.json.JSONException
|
||||
import org.json.JSONObject
|
||||
import statusgo.Statusgo
|
||||
import java.io.*
|
||||
|
||||
class AccountManager(private val reactContext: ReactApplicationContext) : ReactContextBaseJavaModule(reactContext) {
|
||||
|
||||
private val utils = Utils(reactContext)
|
||||
private val logManager = LogManager(reactContext)
|
||||
|
||||
override fun getName() = "AccountManager"
|
||||
|
||||
private fun getTestnetDataDir(absRootDirPath: String) = utils.pathCombine(absRootDirPath, "ethereum/testnet")
|
||||
|
||||
@ReactMethod
|
||||
fun createAccountAndLogin(createAccountRequest: String) {
|
||||
Log.d(TAG, "createAccountAndLogin")
|
||||
val result = Statusgo.createAccountAndLogin(createAccountRequest)
|
||||
if (result.startsWith("{\"error\":\"\"")) {
|
||||
Log.d(TAG, "createAccountAndLogin success: $result")
|
||||
Log.d(TAG, "Geth node started")
|
||||
} else {
|
||||
Log.e(TAG, "createAccountAndLogin failed: $result")
|
||||
}
|
||||
}
|
||||
|
||||
@ReactMethod
|
||||
fun restoreAccountAndLogin(restoreAccountRequest: String) {
|
||||
Log.d(TAG, "restoreAccountAndLogin")
|
||||
val result = Statusgo.restoreAccountAndLogin(restoreAccountRequest)
|
||||
if (result.startsWith("{\"error\":\"\"")) {
|
||||
Log.d(TAG, "restoreAccountAndLogin success: $result")
|
||||
Log.d(TAG, "Geth node started")
|
||||
} else {
|
||||
Log.e(TAG, "restoreAccountAndLogin failed: $result")
|
||||
}
|
||||
}
|
||||
|
||||
private fun updateConfig(jsonConfigString: String, absRootDirPath: String, keystoreDirPath: String): String {
|
||||
val jsonConfig = JSONObject(jsonConfigString)
|
||||
// when doing local pair syncing, backend will provide default data dir
|
||||
val dataDirPath = jsonConfig.optString("DataDir","")
|
||||
val logEnabled = jsonConfig.getBoolean("LogEnabled")
|
||||
val gethLogFile = if (logEnabled) logManager.prepareLogsFile(reactContext) else null
|
||||
val gethLogDirPath = gethLogFile?.parent
|
||||
|
||||
Log.d(TAG, "log dir: $gethLogDirPath log name: $gethLogFileName")
|
||||
|
||||
jsonConfig.put("DataDir", dataDirPath)
|
||||
jsonConfig.put("KeyStoreDir", keystoreDirPath)
|
||||
jsonConfig.put("LogDir", gethLogDirPath)
|
||||
jsonConfig.put("LogFile", gethLogFileName)
|
||||
|
||||
return jsonConfig.toString()
|
||||
}
|
||||
|
||||
private fun copyDirectory(sourceLocation: File, targetLocation: File) {
|
||||
if (sourceLocation.isDirectory) {
|
||||
if (!targetLocation.exists() && !targetLocation.mkdirs()) {
|
||||
throw IOException("Cannot create dir ${targetLocation.absolutePath}")
|
||||
}
|
||||
|
||||
val children = sourceLocation.list()
|
||||
children?.forEach { child ->
|
||||
copyDirectory(File(sourceLocation, child), File(targetLocation, child))
|
||||
}
|
||||
} else {
|
||||
val directory = targetLocation.parentFile
|
||||
if (directory != null && !directory.exists() && !directory.mkdirs()) {
|
||||
throw IOException("Cannot create dir ${directory.absolutePath}")
|
||||
}
|
||||
|
||||
sourceLocation.inputStream().use { input ->
|
||||
targetLocation.outputStream().use { output ->
|
||||
input.copyTo(output)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private fun prepareDirAndUpdateConfig(jsonConfigString: String, keyUID: String): String {
|
||||
val absRootDirPath = utils.getNoBackupDirectory()
|
||||
val dataFolder = getTestnetDataDir(absRootDirPath)
|
||||
Log.d(TAG, "Starting Geth node in folder: $dataFolder")
|
||||
|
||||
try {
|
||||
File(dataFolder).mkdir()
|
||||
} catch (e: Exception) {
|
||||
Log.e(TAG, "error making folder: $dataFolder", e)
|
||||
}
|
||||
|
||||
val ropstenFlagPath = utils.pathCombine(absRootDirPath, "ropsten_flag")
|
||||
val ropstenFlag = File(ropstenFlagPath)
|
||||
if (!ropstenFlag.exists()) {
|
||||
try {
|
||||
val chaindDataFolderPath = utils.pathCombine(dataFolder, "StatusIM/lightchaindata")
|
||||
val lightChainFolder = File(chaindDataFolderPath)
|
||||
if (lightChainFolder.isDirectory) {
|
||||
lightChainFolder.listFiles()?.forEach { it.delete() }
|
||||
}
|
||||
lightChainFolder.delete()
|
||||
ropstenFlag.createNewFile()
|
||||
} catch (e: IOException) {
|
||||
e.printStackTrace()
|
||||
}
|
||||
}
|
||||
|
||||
val testnetDataDir = dataFolder
|
||||
val oldKeystoreDir = utils.pathCombine(testnetDataDir, "keystore")
|
||||
val newKeystoreDir = utils.pathCombine(absRootDirPath, "keystore")
|
||||
val oldKeystore = File(oldKeystoreDir)
|
||||
if (oldKeystore.exists()) {
|
||||
try {
|
||||
val newKeystore = File(newKeystoreDir)
|
||||
copyDirectory(oldKeystore, newKeystore)
|
||||
|
||||
if (oldKeystore.isDirectory) {
|
||||
oldKeystore.listFiles()?.forEach { it.delete() }
|
||||
}
|
||||
oldKeystore.delete()
|
||||
} catch (e: IOException) {
|
||||
e.printStackTrace()
|
||||
}
|
||||
}
|
||||
|
||||
return try {
|
||||
val multiaccountKeystoreDir = utils.pathCombine("/keystore", keyUID)
|
||||
val updatedJsonConfigString = updateConfig(jsonConfigString, absRootDirPath, multiaccountKeystoreDir)
|
||||
|
||||
prettyPrintConfig(updatedJsonConfigString)
|
||||
|
||||
updatedJsonConfigString
|
||||
} catch (e: JSONException) {
|
||||
Log.e(TAG, "updateConfig failed: ${e.message}")
|
||||
""
|
||||
}
|
||||
}
|
||||
|
||||
@ReactMethod
|
||||
fun prepareDirAndUpdateConfig(keyUID: String, config: String, callback: Callback) {
|
||||
Log.d(TAG, "prepareDirAndUpdateConfig")
|
||||
val finalConfig = prepareDirAndUpdateConfig(config, keyUID)
|
||||
callback.invoke(finalConfig)
|
||||
}
|
||||
|
||||
@ReactMethod
|
||||
fun saveAccountAndLoginWithKeycard(
|
||||
multiaccountData: String,
|
||||
password: String,
|
||||
settings: String,
|
||||
config: String,
|
||||
accountsData: String,
|
||||
chatKey: String
|
||||
) {
|
||||
try {
|
||||
Log.d(TAG, "saveAccountAndLoginWithKeycard")
|
||||
val keyUID = utils.getKeyUID(multiaccountData)
|
||||
val finalConfig = prepareDirAndUpdateConfig(config, keyUID)
|
||||
val result = Statusgo.saveAccountAndLoginWithKeycard(
|
||||
multiaccountData,
|
||||
password,
|
||||
settings,
|
||||
finalConfig,
|
||||
accountsData,
|
||||
chatKey
|
||||
)
|
||||
if (result.startsWith("{\"error\":\"\"")) {
|
||||
Log.d(TAG, "saveAccountAndLoginWithKeycard result: $result")
|
||||
Log.d(TAG, "Geth node started")
|
||||
} else {
|
||||
Log.e(TAG, "saveAccountAndLoginWithKeycard failed: $result")
|
||||
}
|
||||
} catch (e: JSONException) {
|
||||
Log.e(TAG, "JSON conversion failed: ${e.message}")
|
||||
}
|
||||
}
|
||||
|
||||
@ReactMethod
|
||||
fun loginWithKeycard(accountData: String, password: String, chatKey: String, nodeConfigJSON: String) {
|
||||
Log.d(TAG, "loginWithKeycard")
|
||||
utils.migrateKeyStoreDir(accountData, password)
|
||||
val result = Statusgo.loginWithKeycard(accountData, password, chatKey, nodeConfigJSON)
|
||||
if (result.startsWith("{\"error\":\"\"")) {
|
||||
Log.d(TAG, "LoginWithKeycard result: $result")
|
||||
} else {
|
||||
Log.e(TAG, "LoginWithKeycard failed: $result")
|
||||
}
|
||||
}
|
||||
|
||||
@ReactMethod
|
||||
fun loginWithConfig(accountData: String, password: String, configJSON: String) {
|
||||
Log.d(TAG, "loginWithConfig")
|
||||
utils.migrateKeyStoreDir(accountData, password)
|
||||
val result = Statusgo.loginWithConfig(accountData, password, configJSON)
|
||||
if (result.startsWith("{\"error\":\"\"")) {
|
||||
Log.d(TAG, "LoginWithConfig result: $result")
|
||||
} else {
|
||||
Log.e(TAG, "LoginWithConfig failed: $result")
|
||||
}
|
||||
}
|
||||
|
||||
@ReactMethod
|
||||
fun loginAccount(request: String) {
|
||||
Log.d(TAG, "loginAccount")
|
||||
val result = Statusgo.loginAccount(request)
|
||||
if (result.startsWith("{\"error\":\"\"")) {
|
||||
Log.d(TAG, "loginAccount result: $result")
|
||||
} else {
|
||||
Log.e(TAG, "loginAccount failed: $result")
|
||||
}
|
||||
}
|
||||
|
||||
@ReactMethod
|
||||
fun verify(address: String, password: String, callback: Callback) {
|
||||
val absRootDirPath = utils.getNoBackupDirectory()
|
||||
val newKeystoreDir = utils.pathCombine(absRootDirPath, "keystore")
|
||||
|
||||
utils.executeRunnableStatusGoMethod(
|
||||
{ Statusgo.verifyAccountPassword(newKeystoreDir, address, password) },
|
||||
callback
|
||||
)
|
||||
}
|
||||
|
||||
@ReactMethod
|
||||
fun verifyDatabasePassword(keyUID: String, password: String, callback: Callback) {
|
||||
utils.executeRunnableStatusGoMethod(
|
||||
{ Statusgo.verifyDatabasePassword(keyUID, password) },
|
||||
callback
|
||||
)
|
||||
}
|
||||
|
||||
@ReactMethod
|
||||
private fun openAccounts(callback: Callback) {
|
||||
Log.d(TAG, "openAccounts")
|
||||
val rootDir = utils.getNoBackupDirectory()
|
||||
Log.d(TAG, "[Opening accounts $rootDir")
|
||||
utils.executeRunnableStatusGoMethod({ Statusgo.openAccounts(rootDir) }, callback)
|
||||
}
|
||||
|
||||
@ReactMethod
|
||||
fun logout() {
|
||||
Log.d(TAG, "logout")
|
||||
val runnable = Runnable {
|
||||
val result = Statusgo.logout()
|
||||
if (result.startsWith("{\"error\":\"\"")) {
|
||||
Log.d(TAG, "Logout result: $result")
|
||||
} else {
|
||||
Log.e(TAG, "Logout failed: $result")
|
||||
}
|
||||
}
|
||||
StatusThreadPoolExecutor.getInstance().execute(runnable)
|
||||
}
|
||||
|
||||
@ReactMethod
|
||||
fun multiAccountStoreAccount(json: String, callback: Callback) {
|
||||
utils.executeRunnableStatusGoMethod({ Statusgo.multiAccountStoreAccount(json) }, callback)
|
||||
}
|
||||
|
||||
@ReactMethod
|
||||
fun multiAccountLoadAccount(json: String, callback: Callback) {
|
||||
utils.executeRunnableStatusGoMethod({ Statusgo.multiAccountLoadAccount(json) }, callback)
|
||||
}
|
||||
|
||||
@ReactMethod
|
||||
fun multiAccountDeriveAddresses(json: String, callback: Callback) {
|
||||
utils.executeRunnableStatusGoMethod({ Statusgo.multiAccountDeriveAddresses(json) }, callback)
|
||||
}
|
||||
|
||||
@ReactMethod
|
||||
fun multiAccountGenerateAndDeriveAddresses(json: String, callback: Callback) {
|
||||
utils.executeRunnableStatusGoMethod({ Statusgo.multiAccountGenerateAndDeriveAddresses(json) }, callback)
|
||||
}
|
||||
|
||||
@ReactMethod
|
||||
fun multiAccountStoreDerived(json: String, callback: Callback) {
|
||||
utils.executeRunnableStatusGoMethod({ Statusgo.multiAccountStoreDerivedAccounts(json) }, callback)
|
||||
}
|
||||
|
||||
@ReactMethod
|
||||
fun multiAccountImportMnemonic(json: String, callback: Callback) {
|
||||
utils.executeRunnableStatusGoMethod({ Statusgo.multiAccountImportMnemonic(json) }, callback)
|
||||
}
|
||||
|
||||
@ReactMethod
|
||||
fun multiAccountImportPrivateKey(json: String, callback: Callback) {
|
||||
utils.executeRunnableStatusGoMethod({ Statusgo.multiAccountImportPrivateKey(json) }, callback)
|
||||
}
|
||||
|
||||
@ReactMethod
|
||||
fun deleteMultiaccount(keyUID: String, callback: Callback) {
|
||||
val keyStoreDir = utils.getKeyStorePath(keyUID)
|
||||
utils.executeRunnableStatusGoMethod({ Statusgo.deleteMultiaccount(keyUID, keyStoreDir) }, callback)
|
||||
}
|
||||
|
||||
@ReactMethod
|
||||
fun getRandomMnemonic(callback: Callback) {
|
||||
utils.executeRunnableStatusGoMethod({ Statusgo.getRandomMnemonic() }, callback)
|
||||
}
|
||||
|
||||
@ReactMethod
|
||||
fun createAccountFromMnemonicAndDeriveAccountsForPaths(mnemonic: String, callback: Callback) {
|
||||
utils.executeRunnableStatusGoMethod(
|
||||
{ Statusgo.createAccountFromMnemonicAndDeriveAccountsForPaths(mnemonic) },
|
||||
callback
|
||||
)
|
||||
}
|
||||
|
||||
companion object {
|
||||
private const val TAG = "AccountManager"
|
||||
private const val gethLogFileName = "geth.log"
|
||||
|
||||
private fun prettyPrintConfig(config: String) {
|
||||
Log.d(TAG, "startNode() with config (see below)")
|
||||
var configOutput = config
|
||||
val maxOutputLen = 4000
|
||||
Log.d(TAG, "********************** NODE CONFIG ****************************")
|
||||
while (configOutput.isNotEmpty()) {
|
||||
Log.d(TAG, "Node config:${configOutput.take(maxOutputLen)}")
|
||||
configOutput = configOutput.drop(maxOutputLen)
|
||||
}
|
||||
Log.d(TAG, "******************* ENDOF NODE CONFIG *************************")
|
||||
}
|
||||
}
|
||||
}
|
||||
-66
@@ -1,66 +0,0 @@
|
||||
package im.status.ethereum.module;
|
||||
|
||||
import com.facebook.react.bridge.ReactApplicationContext;
|
||||
import com.facebook.react.bridge.ReactContextBaseJavaModule;
|
||||
import com.facebook.react.bridge.ReactMethod;
|
||||
import com.facebook.react.bridge.Callback;
|
||||
import statusgo.Statusgo;
|
||||
import android.util.Log;
|
||||
import java.io.File;
|
||||
import android.os.Environment;
|
||||
import android.content.Context;
|
||||
public class DatabaseManager extends ReactContextBaseJavaModule {
|
||||
private static final String TAG = "DatabaseManager";
|
||||
private ReactApplicationContext reactContext;
|
||||
private static final String exportDBFileName = "export.db";
|
||||
private Utils utils;
|
||||
public DatabaseManager(ReactApplicationContext reactContext) {
|
||||
this.reactContext = reactContext;
|
||||
this.utils = new Utils(reactContext);
|
||||
}
|
||||
@Override
|
||||
public String getName() {
|
||||
return "DatabaseManager";
|
||||
}
|
||||
|
||||
private File getExportDBFile() {
|
||||
final Context context = this.getReactApplicationContext();
|
||||
// Environment.getExternalStoragePublicDirectory doesn't work as expected on Android Q
|
||||
// https://developer.android.com/reference/android/os/Environment#getExternalStoragePublicDirectory(java.lang.String)
|
||||
final File pubDirectory = context.getExternalFilesDir(Environment.DIRECTORY_DOWNLOADS);
|
||||
final File filename = new File(pubDirectory, exportDBFileName);
|
||||
|
||||
return filename;
|
||||
}
|
||||
|
||||
@ReactMethod
|
||||
public void exportUnencryptedDatabase(final String accountData, final String password, final Callback callback) {
|
||||
Log.d(TAG, "login");
|
||||
|
||||
final File newFile = getExportDBFile();
|
||||
|
||||
this.utils.migrateKeyStoreDir(accountData, password);
|
||||
String result = Statusgo.exportUnencryptedDatabase(accountData, password, newFile.getAbsolutePath());
|
||||
if (result.startsWith("{\"error\":\"\"")) {
|
||||
Log.d(TAG, "Login result: " + result);
|
||||
} else {
|
||||
Log.e(TAG, "Login failed: " + result);
|
||||
}
|
||||
}
|
||||
|
||||
@ReactMethod
|
||||
public void importUnencryptedDatabase(final String accountData, final String password) {
|
||||
Log.d(TAG, "importUnencryptedDatabase");
|
||||
|
||||
final File newFile = getExportDBFile();
|
||||
|
||||
this.utils.migrateKeyStoreDir(accountData, password);
|
||||
String result = Statusgo.importUnencryptedDatabase(accountData, password, newFile.getAbsolutePath());
|
||||
if (result.startsWith("{\"error\":\"\"")) {
|
||||
Log.d(TAG, "import result: " + result);
|
||||
} else {
|
||||
Log.e(TAG, "import failed: " + result);
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
+58
@@ -0,0 +1,58 @@
|
||||
package im.status.ethereum.module
|
||||
|
||||
import android.content.Context
|
||||
import android.os.Environment
|
||||
import android.util.Log
|
||||
import com.facebook.react.bridge.Callback
|
||||
import com.facebook.react.bridge.ReactApplicationContext
|
||||
import com.facebook.react.bridge.ReactContextBaseJavaModule
|
||||
import com.facebook.react.bridge.ReactMethod
|
||||
import statusgo.Statusgo
|
||||
import java.io.File
|
||||
|
||||
class DatabaseManager(private val reactContext: ReactApplicationContext) : ReactContextBaseJavaModule(reactContext) {
|
||||
|
||||
private val utils = Utils(reactContext)
|
||||
|
||||
override fun getName() = "DatabaseManager"
|
||||
|
||||
private fun getExportDBFile(): File {
|
||||
val pubDirectory = reactContext.getExternalFilesDir(Environment.DIRECTORY_DOWNLOADS)
|
||||
return File(pubDirectory, exportDBFileName)
|
||||
}
|
||||
|
||||
@ReactMethod
|
||||
fun exportUnencryptedDatabase(accountData: String, password: String, callback: Callback) {
|
||||
Log.d(TAG, "login")
|
||||
|
||||
val newFile = getExportDBFile()
|
||||
|
||||
utils.migrateKeyStoreDir(accountData, password)
|
||||
val result = Statusgo.exportUnencryptedDatabase(accountData, password, newFile.absolutePath)
|
||||
if (result.startsWith("{\"error\":\"\"")) {
|
||||
Log.d(TAG, "Login result: $result")
|
||||
} else {
|
||||
Log.e(TAG, "Login failed: $result")
|
||||
}
|
||||
}
|
||||
|
||||
@ReactMethod
|
||||
fun importUnencryptedDatabase(accountData: String, password: String) {
|
||||
Log.d(TAG, "importUnencryptedDatabase")
|
||||
|
||||
val newFile = getExportDBFile()
|
||||
|
||||
utils.migrateKeyStoreDir(accountData, password)
|
||||
val result = Statusgo.importUnencryptedDatabase(accountData, password, newFile.absolutePath)
|
||||
if (result.startsWith("{\"error\":\"\"")) {
|
||||
Log.d(TAG, "import result: $result")
|
||||
} else {
|
||||
Log.e(TAG, "import failed: $result")
|
||||
}
|
||||
}
|
||||
|
||||
companion object {
|
||||
private const val TAG = "DatabaseManager"
|
||||
private const val exportDBFileName = "export.db"
|
||||
}
|
||||
}
|
||||
-227
@@ -1,227 +0,0 @@
|
||||
package im.status.ethereum.module;
|
||||
|
||||
import com.facebook.react.bridge.ReactMethod;
|
||||
import com.facebook.react.bridge.ReactContextBaseJavaModule;
|
||||
import com.facebook.react.bridge.ReactApplicationContext;
|
||||
import com.facebook.react.bridge.Callback;
|
||||
import java.io.File;
|
||||
import java.util.Stack;
|
||||
import android.util.Log;
|
||||
import android.net.Uri;
|
||||
import java.io.OutputStreamWriter;
|
||||
import java.io.IOException;
|
||||
import android.app.Activity;
|
||||
import android.app.AlertDialog;
|
||||
import android.content.DialogInterface;
|
||||
import androidx.core.content.FileProvider;
|
||||
import java.io.BufferedInputStream;
|
||||
import java.io.BufferedOutputStream;
|
||||
import java.io.FileOutputStream;
|
||||
import java.util.zip.ZipOutputStream;
|
||||
import java.io.FileInputStream;
|
||||
import java.util.zip.ZipEntry;
|
||||
import org.json.JSONObject;
|
||||
import statusgo.Statusgo;
|
||||
import android.content.Context;
|
||||
import org.json.JSONException;
|
||||
public class LogManager extends ReactContextBaseJavaModule {
|
||||
private static final String TAG = "LogManager";
|
||||
private static final String gethLogFileName = "geth.log";
|
||||
private static final String statusLogFileName = "Status.log";
|
||||
private static final String logsZipFileName = "Status-debug-logs.zip";
|
||||
private ReactApplicationContext reactContext;
|
||||
private Utils utils;
|
||||
|
||||
public LogManager(ReactApplicationContext reactContext) {
|
||||
super(reactContext);
|
||||
this.reactContext = reactContext;
|
||||
this.utils = new Utils(reactContext);
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getName() {
|
||||
return "LogManager";
|
||||
}
|
||||
|
||||
private File getLogsFile() {
|
||||
final File pubDirectory = this.utils.getPublicStorageDirectory();
|
||||
final File logFile = new File(pubDirectory, gethLogFileName);
|
||||
|
||||
return logFile;
|
||||
}
|
||||
|
||||
public File prepareLogsFile(final Context context) {
|
||||
final File logFile = this.utils.getLogsFile();
|
||||
|
||||
try {
|
||||
logFile.setReadable(true);
|
||||
File parent = logFile.getParentFile();
|
||||
if (!parent.canWrite()) {
|
||||
return null;
|
||||
}
|
||||
if (!parent.exists()) {
|
||||
parent.mkdirs();
|
||||
}
|
||||
logFile.createNewFile();
|
||||
logFile.setWritable(true);
|
||||
Log.d(TAG, "Can write " + logFile.canWrite());
|
||||
Uri gethLogUri = Uri.fromFile(logFile);
|
||||
|
||||
String gethLogFilePath = logFile.getAbsolutePath();
|
||||
Log.d(TAG, gethLogFilePath);
|
||||
|
||||
return logFile;
|
||||
} catch (Exception e) {
|
||||
Log.d(TAG, "Can't create geth.log file! " + e.getMessage());
|
||||
}
|
||||
|
||||
return null;
|
||||
}
|
||||
|
||||
private void showErrorMessage(final String message) {
|
||||
final Activity activity = getCurrentActivity();
|
||||
|
||||
new AlertDialog.Builder(activity)
|
||||
.setTitle("Error")
|
||||
.setMessage(message)
|
||||
.setNegativeButton("Exit", new DialogInterface.OnClickListener() {
|
||||
public void onClick(final DialogInterface dialog, final int id) {
|
||||
dialog.dismiss();
|
||||
}
|
||||
}).show();
|
||||
}
|
||||
|
||||
private void dumpAdbLogsTo(final FileOutputStream statusLogStream) throws IOException {
|
||||
final String filter = "logcat -d -b main ReactNativeJS:D StatusModule:D StatusService:D StatusNativeLogs:D *:S";
|
||||
final java.lang.Process p = Runtime.getRuntime().exec(filter);
|
||||
final java.io.BufferedReader in = new java.io.BufferedReader(new java.io.InputStreamReader(p.getInputStream()));
|
||||
final java.io.BufferedWriter out = new java.io.BufferedWriter(new java.io.OutputStreamWriter(statusLogStream));
|
||||
String line;
|
||||
while ((line = in.readLine()) != null) {
|
||||
out.write(line);
|
||||
out.newLine();
|
||||
}
|
||||
out.close();
|
||||
in.close();
|
||||
}
|
||||
|
||||
private Boolean zip(File[] _files, File zipFile, Stack<String> errorList) {
|
||||
final int BUFFER = 0x8000;
|
||||
|
||||
try {
|
||||
BufferedInputStream origin = null;
|
||||
FileOutputStream dest = new FileOutputStream(zipFile);
|
||||
ZipOutputStream out = new ZipOutputStream(new BufferedOutputStream(dest));
|
||||
byte data[] = new byte[BUFFER];
|
||||
|
||||
for (int i = 0; i < _files.length; i++) {
|
||||
final File file = _files[i];
|
||||
if (file == null || !file.exists()) {
|
||||
continue;
|
||||
}
|
||||
|
||||
Log.v("Compress", "Adding: " + file.getAbsolutePath());
|
||||
try {
|
||||
FileInputStream fi = new FileInputStream(file);
|
||||
origin = new BufferedInputStream(fi, BUFFER);
|
||||
|
||||
ZipEntry entry = new ZipEntry(file.getName());
|
||||
out.putNextEntry(entry);
|
||||
int count;
|
||||
|
||||
while ((count = origin.read(data, 0, BUFFER)) != -1) {
|
||||
out.write(data, 0, count);
|
||||
}
|
||||
origin.close();
|
||||
} catch (IOException e) {
|
||||
Log.e(TAG, e.getMessage());
|
||||
errorList.push(e.getMessage());
|
||||
}
|
||||
}
|
||||
|
||||
out.close();
|
||||
|
||||
return true;
|
||||
} catch (Exception e) {
|
||||
Log.e(TAG, e.getMessage());
|
||||
e.printStackTrace();
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
@ReactMethod
|
||||
public void sendLogs(final String dbJson, final String jsLogs, final Callback callback) {
|
||||
Log.d(TAG, "sendLogs");
|
||||
if (!this.utils.checkAvailability()) {
|
||||
return;
|
||||
}
|
||||
|
||||
final Context context = this.getReactApplicationContext();
|
||||
final File logsTempDir = new File(context.getCacheDir(), "logs"); // This path needs to be in sync with android/app/src/main/res/xml/file_provider_paths.xml
|
||||
logsTempDir.mkdir();
|
||||
|
||||
final File dbFile = new File(logsTempDir, "db.json");
|
||||
try {
|
||||
OutputStreamWriter outputStreamWriter = new OutputStreamWriter(new FileOutputStream(dbFile));
|
||||
outputStreamWriter.write(dbJson);
|
||||
outputStreamWriter.close();
|
||||
} catch (IOException e) {
|
||||
Log.e(TAG, "File write failed: " + e.toString());
|
||||
showErrorMessage(e.getLocalizedMessage());
|
||||
}
|
||||
|
||||
final File zipFile = new File(logsTempDir, logsZipFileName);
|
||||
final File statusLogFile = new File(logsTempDir, statusLogFileName);
|
||||
final File gethLogFile = getLogsFile();
|
||||
|
||||
try {
|
||||
if (zipFile.exists() || zipFile.createNewFile()) {
|
||||
final long usableSpace = zipFile.getUsableSpace();
|
||||
if (usableSpace < 20 * 1024 * 1024) {
|
||||
final String message = String.format("Insufficient space available on device (%s) to write logs.\nPlease free up some space.", android.text.format.Formatter.formatShortFileSize(context, usableSpace));
|
||||
Log.e(TAG, message);
|
||||
showErrorMessage(message);
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
dumpAdbLogsTo(new FileOutputStream(statusLogFile));
|
||||
|
||||
final Stack<String> errorList = new Stack<String>();
|
||||
final Boolean zipped = zip(new File[]{dbFile, gethLogFile, statusLogFile}, zipFile, errorList);
|
||||
if (zipped && zipFile.exists()) {
|
||||
zipFile.setReadable(true, false);
|
||||
Uri extUri = FileProvider.getUriForFile(context, context.getPackageName() + ".provider", zipFile);
|
||||
callback.invoke(extUri.toString());
|
||||
} else {
|
||||
Log.d(TAG, "File " + zipFile.getAbsolutePath() + " does not exist");
|
||||
}
|
||||
} catch (Exception e) {
|
||||
Log.e(TAG, e.getMessage());
|
||||
showErrorMessage(e.getLocalizedMessage());
|
||||
e.printStackTrace();
|
||||
return;
|
||||
} finally {
|
||||
dbFile.delete();
|
||||
statusLogFile.delete();
|
||||
zipFile.deleteOnExit();
|
||||
}
|
||||
}
|
||||
|
||||
@ReactMethod
|
||||
public void initLogging(final boolean enabled, final boolean mobileSystem, final String logLevel, final Callback callback) throws JSONException {
|
||||
final JSONObject jsonConfig = new JSONObject();
|
||||
jsonConfig.put("Enabled", enabled);
|
||||
jsonConfig.put("MobileSystem", mobileSystem);
|
||||
jsonConfig.put("Level", logLevel);
|
||||
jsonConfig.put("File", getLogsFile().getAbsolutePath());
|
||||
final String config = jsonConfig.toString();
|
||||
this.utils.executeRunnableStatusGoMethod(() -> Statusgo.initLogging(config), callback);
|
||||
}
|
||||
|
||||
@ReactMethod(isBlockingSynchronousMethod = true)
|
||||
public String logFileDirectory() {
|
||||
return this.utils.getPublicStorageDirectory().getAbsolutePath();
|
||||
}
|
||||
|
||||
}
|
||||
+211
@@ -0,0 +1,211 @@
|
||||
package im.status.ethereum.module
|
||||
|
||||
import android.app.Activity
|
||||
import android.app.AlertDialog
|
||||
import android.content.Context
|
||||
import android.content.DialogInterface
|
||||
import android.net.Uri
|
||||
import android.util.Log
|
||||
import androidx.core.content.FileProvider
|
||||
import com.facebook.react.bridge.Callback
|
||||
import com.facebook.react.bridge.ReactApplicationContext
|
||||
import com.facebook.react.bridge.ReactContextBaseJavaModule
|
||||
import com.facebook.react.bridge.ReactMethod
|
||||
import org.json.JSONException
|
||||
import org.json.JSONObject
|
||||
import statusgo.Statusgo
|
||||
import java.io.*
|
||||
import java.util.*
|
||||
import java.util.zip.ZipEntry
|
||||
import java.util.zip.ZipOutputStream
|
||||
|
||||
class LogManager(private val reactContext: ReactApplicationContext) : ReactContextBaseJavaModule(reactContext) {
|
||||
|
||||
private val utils = Utils(reactContext)
|
||||
|
||||
override fun getName() = "LogManager"
|
||||
|
||||
private fun getLogsFile(): File {
|
||||
val pubDirectory = utils.getPublicStorageDirectory()
|
||||
return File(pubDirectory, gethLogFileName)
|
||||
}
|
||||
|
||||
fun prepareLogsFile(context: Context): File? {
|
||||
val logFile = utils.getLogsFile()
|
||||
|
||||
try {
|
||||
logFile.setReadable(true)
|
||||
val parent = logFile.parentFile
|
||||
if (!parent?.canWrite()!!) {
|
||||
return null
|
||||
}
|
||||
if (!parent.exists()) {
|
||||
parent.mkdirs()
|
||||
}
|
||||
logFile.createNewFile()
|
||||
logFile.setWritable(true)
|
||||
Log.d(TAG, "Can write ${logFile.canWrite()}")
|
||||
val gethLogUri = Uri.fromFile(logFile)
|
||||
|
||||
val gethLogFilePath = logFile.absolutePath
|
||||
Log.d(TAG, gethLogFilePath)
|
||||
|
||||
return logFile
|
||||
} catch (e: Exception) {
|
||||
Log.d(TAG, "Can't create geth.log file! ${e.message}")
|
||||
}
|
||||
|
||||
return null
|
||||
}
|
||||
|
||||
private fun showErrorMessage(message: String) {
|
||||
val activity = currentActivity
|
||||
|
||||
AlertDialog.Builder(activity)
|
||||
.setTitle("Error")
|
||||
.setMessage(message)
|
||||
.setNegativeButton("Exit") { dialog, _ ->
|
||||
dialog.dismiss()
|
||||
}.show()
|
||||
}
|
||||
|
||||
private fun dumpAdbLogsTo(statusLogStream: FileOutputStream) {
|
||||
val filter = "logcat -d -b main ReactNativeJS:D StatusModule:D StatusService:D StatusNativeLogs:D *:S"
|
||||
val p = Runtime.getRuntime().exec(filter)
|
||||
val input = BufferedReader(InputStreamReader(p.inputStream))
|
||||
val output = BufferedWriter(OutputStreamWriter(statusLogStream))
|
||||
var line: String?
|
||||
while (input.readLine().also { line = it } != null) {
|
||||
output.write(line)
|
||||
output.newLine()
|
||||
}
|
||||
output.close()
|
||||
input.close()
|
||||
}
|
||||
|
||||
private fun zip(files: Array<File>, zipFile: File, errorList: Stack<String>): Boolean {
|
||||
val BUFFER = 0x8000
|
||||
|
||||
try {
|
||||
var origin: BufferedInputStream? = null
|
||||
val dest = FileOutputStream(zipFile)
|
||||
val out = ZipOutputStream(BufferedOutputStream(dest))
|
||||
val data = ByteArray(BUFFER)
|
||||
|
||||
for (file in files) {
|
||||
if (file == null || !file.exists()) {
|
||||
continue
|
||||
}
|
||||
|
||||
Log.v("Compress", "Adding: ${file.absolutePath}")
|
||||
try {
|
||||
val fi = FileInputStream(file)
|
||||
origin = BufferedInputStream(fi, BUFFER)
|
||||
|
||||
val entry = ZipEntry(file.name)
|
||||
out.putNextEntry(entry)
|
||||
var count: Int
|
||||
|
||||
while (origin.read(data, 0, BUFFER).also { count = it } != -1) {
|
||||
out.write(data, 0, count)
|
||||
}
|
||||
origin.close()
|
||||
} catch (e: IOException) {
|
||||
Log.e(TAG, e.message!!)
|
||||
errorList.push(e.message!!)
|
||||
}
|
||||
}
|
||||
|
||||
out.close()
|
||||
|
||||
return true
|
||||
} catch (e: Exception) {
|
||||
Log.e(TAG, e.message!!)
|
||||
e.printStackTrace()
|
||||
return false
|
||||
}
|
||||
}
|
||||
|
||||
@ReactMethod
|
||||
fun sendLogs(dbJson: String, jsLogs: String, callback: Callback) {
|
||||
Log.d(TAG, "sendLogs")
|
||||
if (!utils.checkAvailability()) {
|
||||
return
|
||||
}
|
||||
|
||||
val context = reactApplicationContext
|
||||
val logsTempDir = File(context.cacheDir, "logs") // This path needs to be in sync with android/app/src/main/res/xml/file_provider_paths.xml
|
||||
logsTempDir.mkdir()
|
||||
|
||||
val dbFile = File(logsTempDir, "db.json")
|
||||
try {
|
||||
val outputStreamWriter = OutputStreamWriter(FileOutputStream(dbFile))
|
||||
outputStreamWriter.write(dbJson)
|
||||
outputStreamWriter.close()
|
||||
} catch (e: IOException) {
|
||||
Log.e(TAG, "File write failed: ${e}")
|
||||
showErrorMessage(e.localizedMessage!!)
|
||||
}
|
||||
|
||||
val zipFile = File(logsTempDir, logsZipFileName)
|
||||
val statusLogFile = File(logsTempDir, statusLogFileName)
|
||||
val gethLogFile = getLogsFile()
|
||||
|
||||
try {
|
||||
if (zipFile.exists() || zipFile.createNewFile()) {
|
||||
val usableSpace = zipFile.usableSpace
|
||||
if (usableSpace < 20 * 1024 * 1024) {
|
||||
val message = "Insufficient space available on device (${android.text.format.Formatter.formatShortFileSize(context, usableSpace)}) to write logs.\nPlease free up some space."
|
||||
Log.e(TAG, message)
|
||||
showErrorMessage(message)
|
||||
return
|
||||
}
|
||||
}
|
||||
|
||||
dumpAdbLogsTo(FileOutputStream(statusLogFile))
|
||||
|
||||
val errorList = Stack<String>()
|
||||
val zipped = zip(arrayOf(dbFile, gethLogFile, statusLogFile), zipFile, errorList)
|
||||
if (zipped && zipFile.exists()) {
|
||||
zipFile.setReadable(true, false)
|
||||
val extUri = FileProvider.getUriForFile(context, "${context.packageName}.provider", zipFile)
|
||||
callback.invoke(extUri.toString())
|
||||
} else {
|
||||
Log.d(TAG, "File ${zipFile.absolutePath} does not exist")
|
||||
}
|
||||
} catch (e: Exception) {
|
||||
Log.e(TAG, e.message!!)
|
||||
showErrorMessage(e.localizedMessage!!)
|
||||
e.printStackTrace()
|
||||
return
|
||||
} finally {
|
||||
dbFile.delete()
|
||||
statusLogFile.delete()
|
||||
zipFile.deleteOnExit()
|
||||
}
|
||||
}
|
||||
|
||||
@ReactMethod
|
||||
fun initLogging(enabled: Boolean, mobileSystem: Boolean, logLevel: String, callback: Callback) {
|
||||
val jsonConfig = JSONObject().apply {
|
||||
put("Enabled", enabled)
|
||||
put("MobileSystem", mobileSystem)
|
||||
put("Level", logLevel)
|
||||
put("File", getLogsFile().absolutePath)
|
||||
}
|
||||
val config = jsonConfig.toString()
|
||||
utils.executeRunnableStatusGoMethod({ Statusgo.initLogging(config) }, callback)
|
||||
}
|
||||
|
||||
@ReactMethod(isBlockingSynchronousMethod = true)
|
||||
fun logFileDirectory(): String? {
|
||||
return utils.getPublicStorageDirectory()?.absolutePath
|
||||
}
|
||||
|
||||
companion object {
|
||||
private const val TAG = "LogManager"
|
||||
private const val gethLogFileName = "geth.log"
|
||||
private const val statusLogFileName = "Status.log"
|
||||
private const val logsZipFileName = "Status-debug-logs.zip"
|
||||
}
|
||||
}
|
||||
+133
@@ -0,0 +1,133 @@
|
||||
package im.status.ethereum.module
|
||||
|
||||
import com.facebook.react.bridge.ReactApplicationContext
|
||||
import com.facebook.react.bridge.ReactContextBaseJavaModule
|
||||
import com.facebook.react.bridge.ReactMethod
|
||||
import com.facebook.react.bridge.ReadableMap
|
||||
import com.facebook.react.bridge.Callback
|
||||
import android.util.Log
|
||||
import android.content.Intent
|
||||
import android.net.Uri
|
||||
import android.content.pm.PackageManager
|
||||
import java.io.File
|
||||
import androidx.core.content.FileProvider
|
||||
import android.text.Html
|
||||
|
||||
class MailManager(private val reactContext: ReactApplicationContext) : ReactContextBaseJavaModule(reactContext) {
|
||||
|
||||
private val utils = Utils(reactContext)
|
||||
|
||||
override fun getName() = "MailManager"
|
||||
|
||||
@ReactMethod
|
||||
fun mail(options: ReadableMap, callback: Callback) {
|
||||
Log.d(TAG, "attempting to send email")
|
||||
val i = Intent(Intent.ACTION_SEND_MULTIPLE)
|
||||
val selectorIntent = Intent(Intent.ACTION_SENDTO, Uri.parse("mailto:"))
|
||||
i.selector = selectorIntent
|
||||
|
||||
if (options.hasKey("subject") && !options.isNull("subject")) {
|
||||
i.putExtra(Intent.EXTRA_SUBJECT, options.getString("subject"))
|
||||
}
|
||||
|
||||
if (options.hasKey("body") && !options.isNull("body")) {
|
||||
val body = options.getString("body")
|
||||
if (options.hasKey("isHTML") && options.getBoolean("isHTML")) {
|
||||
i.putExtra(Intent.EXTRA_TEXT, Html.fromHtml(body))
|
||||
} else {
|
||||
i.putExtra(Intent.EXTRA_TEXT, body)
|
||||
}
|
||||
}
|
||||
|
||||
if (options.hasKey("recipients") && !options.isNull("recipients")) {
|
||||
val recipients = options.getArray("recipients")
|
||||
i.putExtra(Intent.EXTRA_EMAIL, this.utils.readableArrayToStringArray(recipients!!))
|
||||
}
|
||||
|
||||
if (options.hasKey("ccRecipients") && !options.isNull("ccRecipients")) {
|
||||
val ccRecipients = options.getArray("ccRecipients")
|
||||
i.putExtra(Intent.EXTRA_CC, this.utils.readableArrayToStringArray(ccRecipients!!))
|
||||
}
|
||||
|
||||
if (options.hasKey("bccRecipients") && !options.isNull("bccRecipients")) {
|
||||
val bccRecipients = options.getArray("bccRecipients")
|
||||
i.putExtra(Intent.EXTRA_BCC, this.utils.readableArrayToStringArray(bccRecipients!!))
|
||||
}
|
||||
|
||||
if (options.hasKey("attachments") && !options.isNull("attachments")) {
|
||||
val r = options.getArray("attachments")
|
||||
val length = r?.size() ?: 0
|
||||
|
||||
val provider = reactContext.applicationContext.packageName + ".rnmail.provider"
|
||||
val resolvedIntentActivities = reactContext.packageManager.queryIntentActivities(i,
|
||||
PackageManager.MATCH_DEFAULT_ONLY)
|
||||
|
||||
val uris = ArrayList<Uri>()
|
||||
for (keyIndex in 0 until length) {
|
||||
val clip = r?.getMap(keyIndex)
|
||||
val uri: Uri
|
||||
if (clip?.hasKey("path") == true && !clip.isNull("path")) {
|
||||
val path = clip.getString("path")
|
||||
val file = File(path)
|
||||
uri = FileProvider.getUriForFile(reactContext, provider, file)
|
||||
} else if (clip?.hasKey("uri") == true && !clip.isNull("uri")) {
|
||||
val uriPath = clip.getString("uri")
|
||||
uri = Uri.parse(uriPath)
|
||||
} else {
|
||||
callback.invoke("not_found")
|
||||
return
|
||||
}
|
||||
uris.add(uri)
|
||||
|
||||
for (resolvedIntentInfo in resolvedIntentActivities) {
|
||||
val packageName = resolvedIntentInfo.activityInfo.packageName
|
||||
reactContext.grantUriPermission(packageName, uri,
|
||||
Intent.FLAG_GRANT_WRITE_URI_PERMISSION or Intent.FLAG_GRANT_READ_URI_PERMISSION)
|
||||
}
|
||||
}
|
||||
|
||||
i.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION)
|
||||
i.putParcelableArrayListExtra(Intent.EXTRA_STREAM, uris)
|
||||
}
|
||||
|
||||
val manager = reactContext.packageManager
|
||||
val list = manager.queryIntentActivities(i, 0)
|
||||
|
||||
if (list == null || list.isEmpty()) {
|
||||
Log.d(TAG, "not_available")
|
||||
callback.invoke("not_available")
|
||||
return
|
||||
}
|
||||
|
||||
if (list.size == 1) {
|
||||
i.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)
|
||||
try {
|
||||
reactContext.startActivity(i)
|
||||
} catch (ex: Exception) {
|
||||
Log.e(TAG, ex.message!!)
|
||||
callback.invoke("error")
|
||||
}
|
||||
} else {
|
||||
var chooserTitle = "Send Mail"
|
||||
|
||||
if (options.hasKey("customChooserTitle") && !options.isNull("customChooserTitle")) {
|
||||
chooserTitle = options.getString("customChooserTitle") ?: ""
|
||||
}
|
||||
|
||||
val chooser = Intent.createChooser(i, chooserTitle)
|
||||
chooser.flags = Intent.FLAG_ACTIVITY_NEW_TASK
|
||||
|
||||
try {
|
||||
reactContext.startActivity(chooser)
|
||||
} catch (ex: Exception) {
|
||||
Log.e(TAG, ex.message!!)
|
||||
callback.invoke("error")
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
companion object {
|
||||
private const val TAG = "MailManager"
|
||||
}
|
||||
|
||||
}
|
||||
-78
@@ -1,78 +0,0 @@
|
||||
package im.status.ethereum.module;
|
||||
|
||||
import com.facebook.react.bridge.ReactApplicationContext;
|
||||
import com.facebook.react.bridge.ReactContextBaseJavaModule;
|
||||
import com.facebook.react.bridge.ReactMethod;
|
||||
import com.facebook.react.bridge.Callback;
|
||||
import org.json.JSONException;
|
||||
import statusgo.Statusgo;
|
||||
import org.json.JSONObject;
|
||||
|
||||
public class NetworkManager extends ReactContextBaseJavaModule {
|
||||
private ReactApplicationContext reactContext;
|
||||
private Utils utils;
|
||||
|
||||
public NetworkManager(ReactApplicationContext reactContext) {
|
||||
super(reactContext);
|
||||
this.reactContext = reactContext;
|
||||
this.utils = new Utils(reactContext);
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getName() {
|
||||
return "NetworkManager";
|
||||
}
|
||||
|
||||
@ReactMethod
|
||||
public void startSearchForLocalPairingPeers(final Callback callback) throws JSONException {
|
||||
this.utils.executeRunnableStatusGoMethod(() -> Statusgo.startSearchForLocalPairingPeers(), callback);
|
||||
}
|
||||
|
||||
@ReactMethod
|
||||
public void getConnectionStringForBootstrappingAnotherDevice(final String configJSON, final Callback callback) throws JSONException {
|
||||
final JSONObject jsonConfig = new JSONObject(configJSON);
|
||||
final JSONObject senderConfig = jsonConfig.getJSONObject("senderConfig");
|
||||
final String keyUID = senderConfig.getString("keyUID");
|
||||
final String keyStorePath = this.utils.getKeyStorePath(keyUID);
|
||||
senderConfig.put("keystorePath", keyStorePath);
|
||||
|
||||
this.utils.executeRunnableStatusGoMethod(() -> Statusgo.getConnectionStringForBootstrappingAnotherDevice(jsonConfig.toString()), callback);
|
||||
}
|
||||
|
||||
@ReactMethod
|
||||
public void inputConnectionStringForBootstrapping(final String connectionString, final String configJSON, final Callback callback) throws JSONException {
|
||||
final JSONObject jsonConfig = new JSONObject(configJSON);
|
||||
final JSONObject receiverConfig = jsonConfig.getJSONObject("receiverConfig");
|
||||
final String keyStorePath = this.utils.pathCombine(this.utils.getNoBackupDirectory(), "/keystore");
|
||||
receiverConfig.put("keystorePath", keyStorePath);
|
||||
receiverConfig.getJSONObject("nodeConfig").put("rootDataDir", this.utils.getNoBackupDirectory());
|
||||
|
||||
this.utils.executeRunnableStatusGoMethod(() -> Statusgo.inputConnectionStringForBootstrapping(connectionString, jsonConfig.toString()), callback);
|
||||
}
|
||||
|
||||
@ReactMethod
|
||||
public void sendTransactionWithSignature(final String txArgsJSON, final String signature, final Callback callback) throws JSONException {
|
||||
this.utils.executeRunnableStatusGoMethod(() -> Statusgo.sendTransactionWithSignature(txArgsJSON, signature), callback);
|
||||
}
|
||||
|
||||
@ReactMethod
|
||||
public void sendTransaction(final String txArgsJSON, final String password, final Callback callback) throws JSONException {
|
||||
this.utils.executeRunnableStatusGoMethod(() -> Statusgo.sendTransaction(txArgsJSON, password), callback);
|
||||
}
|
||||
|
||||
@ReactMethod
|
||||
public void callRPC(final String payload, final Callback callback) throws JSONException {
|
||||
this.utils.executeRunnableStatusGoMethod(() -> Statusgo.callRPC(payload), callback);
|
||||
}
|
||||
|
||||
@ReactMethod
|
||||
public void callPrivateRPC(final String payload, final Callback callback) throws JSONException {
|
||||
this.utils.executeRunnableStatusGoMethod(() -> Statusgo.callPrivateRPC(payload), callback);
|
||||
}
|
||||
|
||||
@ReactMethod
|
||||
public void recover(final String rpcParams, final Callback callback) throws JSONException {
|
||||
this.utils.executeRunnableStatusGoMethod(() -> Statusgo.recover(rpcParams), callback);
|
||||
}
|
||||
|
||||
}
|
||||
+78
@@ -0,0 +1,78 @@
|
||||
package im.status.ethereum.module
|
||||
|
||||
import com.facebook.react.bridge.Callback
|
||||
import com.facebook.react.bridge.ReactApplicationContext
|
||||
import com.facebook.react.bridge.ReactContextBaseJavaModule
|
||||
import com.facebook.react.bridge.ReactMethod
|
||||
import org.json.JSONException
|
||||
import org.json.JSONObject
|
||||
import statusgo.Statusgo
|
||||
|
||||
class NetworkManager(private val reactContext: ReactApplicationContext) : ReactContextBaseJavaModule(reactContext) {
|
||||
|
||||
private val utils = Utils(reactContext)
|
||||
|
||||
override fun getName() = "NetworkManager"
|
||||
|
||||
@ReactMethod
|
||||
fun startSearchForLocalPairingPeers(callback: Callback) {
|
||||
utils.executeRunnableStatusGoMethod({ Statusgo.startSearchForLocalPairingPeers() }, callback)
|
||||
}
|
||||
|
||||
@ReactMethod
|
||||
fun getConnectionStringForBootstrappingAnotherDevice(configJSON: String, callback: Callback) {
|
||||
val jsonConfig = JSONObject(configJSON)
|
||||
val senderConfig = jsonConfig.getJSONObject("senderConfig")
|
||||
val keyUID = senderConfig.getString("keyUID")
|
||||
val keyStorePath = utils.getKeyStorePath(keyUID)
|
||||
senderConfig.put("keystorePath", keyStorePath)
|
||||
|
||||
utils.executeRunnableStatusGoMethod(
|
||||
{ Statusgo.getConnectionStringForBootstrappingAnotherDevice(jsonConfig.toString()) },
|
||||
callback
|
||||
)
|
||||
}
|
||||
|
||||
@ReactMethod
|
||||
fun inputConnectionStringForBootstrapping(connectionString: String, configJSON: String, callback: Callback) {
|
||||
val jsonConfig = JSONObject(configJSON)
|
||||
val receiverConfig = jsonConfig.getJSONObject("receiverConfig")
|
||||
val keyStorePath = utils.pathCombine(utils.getNoBackupDirectory(), "/keystore")
|
||||
receiverConfig.put("keystorePath", keyStorePath)
|
||||
receiverConfig.getJSONObject("nodeConfig").put("rootDataDir", utils.getNoBackupDirectory())
|
||||
|
||||
utils.executeRunnableStatusGoMethod(
|
||||
{ Statusgo.inputConnectionStringForBootstrapping(connectionString, jsonConfig.toString()) },
|
||||
callback
|
||||
)
|
||||
}
|
||||
|
||||
@ReactMethod
|
||||
fun sendTransactionWithSignature(txArgsJSON: String, signature: String, callback: Callback) {
|
||||
utils.executeRunnableStatusGoMethod(
|
||||
{ Statusgo.sendTransactionWithSignature(txArgsJSON, signature) },
|
||||
callback
|
||||
)
|
||||
}
|
||||
|
||||
@ReactMethod
|
||||
fun sendTransaction(txArgsJSON: String, password: String, callback: Callback) {
|
||||
utils.executeRunnableStatusGoMethod({ Statusgo.sendTransaction(txArgsJSON, password) }, callback)
|
||||
}
|
||||
|
||||
@ReactMethod
|
||||
fun callRPC(payload: String, callback: Callback) {
|
||||
utils.executeRunnableStatusGoMethod({ Statusgo.callRPC(payload) }, callback)
|
||||
}
|
||||
|
||||
@ReactMethod
|
||||
fun callPrivateRPC(payload: String, callback: Callback) {
|
||||
utils.executeRunnableStatusGoMethod({ Statusgo.callPrivateRPC(payload) }, callback)
|
||||
}
|
||||
|
||||
@ReactMethod
|
||||
fun recover(rpcParams: String, callback: Callback) {
|
||||
utils.executeRunnableStatusGoMethod({ Statusgo.recover(rpcParams) }, callback)
|
||||
}
|
||||
|
||||
}
|
||||
-147
@@ -1,147 +0,0 @@
|
||||
package im.status.ethereum.module;
|
||||
|
||||
import android.app.Activity;
|
||||
import android.util.Log;
|
||||
import android.view.Window;
|
||||
import android.view.WindowManager;
|
||||
import android.os.Build;
|
||||
|
||||
import com.facebook.react.bridge.Arguments;
|
||||
import com.facebook.react.bridge.Callback;
|
||||
import com.facebook.react.bridge.LifecycleEventListener;
|
||||
import com.facebook.react.bridge.ReactApplicationContext;
|
||||
import com.facebook.react.bridge.ReactContextBaseJavaModule;
|
||||
import com.facebook.react.bridge.ReactMethod;
|
||||
import com.facebook.react.bridge.WritableMap;
|
||||
import com.facebook.react.modules.core.DeviceEventManagerModule;
|
||||
|
||||
import statusgo.SignalHandler;
|
||||
import statusgo.Statusgo;
|
||||
|
||||
import org.json.JSONException;
|
||||
import java.lang.reflect.Method;
|
||||
import java.util.HashMap;
|
||||
import java.util.Map;
|
||||
import javax.annotation.Nullable;
|
||||
|
||||
class StatusModule extends ReactContextBaseJavaModule implements LifecycleEventListener, SignalHandler {
|
||||
|
||||
private static final String TAG = "StatusModule";
|
||||
private static StatusModule module;
|
||||
private ReactApplicationContext reactContext;
|
||||
private boolean rootedDevice;
|
||||
private boolean background;
|
||||
private Utils utils;
|
||||
|
||||
|
||||
StatusModule(ReactApplicationContext reactContext, boolean rootedDevice) {
|
||||
super(reactContext);
|
||||
this.reactContext = reactContext;
|
||||
this.rootedDevice = rootedDevice;
|
||||
this.utils = new Utils(reactContext);
|
||||
|
||||
reactContext.addLifecycleEventListener(this);
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getName() {
|
||||
return "Status";
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onHostResume() {
|
||||
module = this;
|
||||
this.background = false;
|
||||
Statusgo.setMobileSignalHandler(this);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onHostPause() {
|
||||
this.background = true;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onHostDestroy() {
|
||||
Log.d(TAG, "******************* ON HOST DESTROY *************************");
|
||||
}
|
||||
|
||||
public void handleSignal(final String jsonEventString) {
|
||||
Log.d(TAG, "Signal event");
|
||||
WritableMap params = Arguments.createMap();
|
||||
params.putString("jsonEvent", jsonEventString);
|
||||
this.getReactApplicationContext().getJSModule(DeviceEventManagerModule.RCTDeviceEventEmitter.class).emit("gethEvent", params);
|
||||
}
|
||||
|
||||
@ReactMethod
|
||||
public void closeApplication() {
|
||||
System.exit(0);
|
||||
}
|
||||
|
||||
@ReactMethod
|
||||
public void connectionChange(final String type, final boolean isExpensive) {
|
||||
Log.d(TAG, "ConnectionChange: " + type + ", is expensive " + isExpensive);
|
||||
Statusgo.connectionChange(type, isExpensive ? 1 : 0);
|
||||
}
|
||||
|
||||
@ReactMethod
|
||||
public void appStateChange(final String type) {
|
||||
Log.d(TAG, "AppStateChange: " + type);
|
||||
Statusgo.appStateChange(type);
|
||||
}
|
||||
|
||||
@ReactMethod
|
||||
public void startLocalNotifications() {
|
||||
Log.d(TAG, "startLocalNotifications");
|
||||
Statusgo.startLocalNotifications();
|
||||
}
|
||||
|
||||
@ReactMethod
|
||||
public void getNodeConfig(final Callback callback) throws JSONException {
|
||||
this.utils.executeRunnableStatusGoMethod(() -> Statusgo.getNodeConfig(), callback);
|
||||
}
|
||||
|
||||
@ReactMethod
|
||||
public void deleteImportedKey(final String keyUID, final String address, final String password, final Callback callback) throws JSONException {
|
||||
final String keyStoreDir = this.utils.getKeyStorePath(keyUID);
|
||||
this.utils.executeRunnableStatusGoMethod(() -> Statusgo.deleteImportedKey(address, password, keyStoreDir), callback);
|
||||
}
|
||||
|
||||
@ReactMethod(isBlockingSynchronousMethod = true)
|
||||
public String fleets() {
|
||||
return Statusgo.fleets();
|
||||
}
|
||||
|
||||
@Override
|
||||
public @Nullable
|
||||
Map<String, Object> getConstants() {
|
||||
HashMap<String, Object> constants = new HashMap<String, Object>();
|
||||
|
||||
constants.put("is24Hour", this.utils.is24Hour());
|
||||
constants.put("model", Build.MODEL);
|
||||
constants.put("brand", Build.BRAND);
|
||||
constants.put("buildId", Build.ID);
|
||||
constants.put("deviceId", Build.BOARD);
|
||||
return constants;
|
||||
}
|
||||
|
||||
@ReactMethod
|
||||
public void isDeviceRooted(final Callback callback) {
|
||||
callback.invoke(rootedDevice);
|
||||
}
|
||||
|
||||
@ReactMethod
|
||||
public void deactivateKeepAwake() {
|
||||
final Activity activity = getCurrentActivity();
|
||||
|
||||
if (activity != null) {
|
||||
activity.runOnUiThread(new Runnable() {
|
||||
@Override
|
||||
public void run() {
|
||||
activity.getWindow().clearFlags(android.view.WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
+113
@@ -0,0 +1,113 @@
|
||||
package im.status.ethereum.module
|
||||
|
||||
import android.app.Activity
|
||||
import android.os.Build
|
||||
import android.util.Log
|
||||
import com.facebook.react.bridge.*
|
||||
import com.facebook.react.modules.core.DeviceEventManagerModule
|
||||
import statusgo.SignalHandler
|
||||
import statusgo.Statusgo
|
||||
import org.json.JSONException
|
||||
import android.view.WindowManager
|
||||
|
||||
class StatusModule(private val reactContext: ReactApplicationContext, private val rootedDevice: Boolean) : ReactContextBaseJavaModule(reactContext), LifecycleEventListener, SignalHandler {
|
||||
|
||||
companion object {
|
||||
private const val TAG = "StatusModule"
|
||||
private var module: StatusModule? = null
|
||||
}
|
||||
|
||||
private val utils: Utils = Utils(reactContext)
|
||||
private var background: Boolean = false
|
||||
|
||||
init {
|
||||
reactContext.addLifecycleEventListener(this)
|
||||
}
|
||||
|
||||
override fun getName(): String {
|
||||
return "Status"
|
||||
}
|
||||
|
||||
override fun onHostResume() {
|
||||
module = this
|
||||
background = false
|
||||
Statusgo.setMobileSignalHandler(this)
|
||||
}
|
||||
|
||||
override fun onHostPause() {
|
||||
background = true
|
||||
}
|
||||
|
||||
override fun onHostDestroy() {
|
||||
Log.d(TAG, "******************* ON HOST DESTROY *************************")
|
||||
}
|
||||
|
||||
override fun handleSignal(jsonEventString: String) {
|
||||
val params = Arguments.createMap()
|
||||
params.putString("jsonEvent", jsonEventString)
|
||||
reactContext.getJSModule(DeviceEventManagerModule.RCTDeviceEventEmitter::class.java).emit("gethEvent", params)
|
||||
}
|
||||
|
||||
@ReactMethod
|
||||
fun closeApplication() {
|
||||
System.exit(0)
|
||||
}
|
||||
|
||||
@ReactMethod
|
||||
fun connectionChange(type: String, isExpensive: Boolean) {
|
||||
Log.d(TAG, "ConnectionChange: $type, is expensive $isExpensive")
|
||||
Statusgo.connectionChange(type, if (isExpensive) 1 else 0)
|
||||
}
|
||||
|
||||
@ReactMethod
|
||||
fun appStateChange(type: String) {
|
||||
Log.d(TAG, "AppStateChange: $type")
|
||||
Statusgo.appStateChange(type)
|
||||
}
|
||||
|
||||
@ReactMethod
|
||||
fun startLocalNotifications() {
|
||||
Log.d(TAG, "startLocalNotifications")
|
||||
Statusgo.startLocalNotifications()
|
||||
}
|
||||
|
||||
@ReactMethod
|
||||
fun getNodeConfig(callback: Callback) {
|
||||
utils.executeRunnableStatusGoMethod({ Statusgo.getNodeConfig() }, callback)
|
||||
}
|
||||
|
||||
@ReactMethod
|
||||
fun deleteImportedKey(keyUID: String, address: String, password: String, callback: Callback) {
|
||||
val keyStoreDir = utils.getKeyStorePath(keyUID)
|
||||
utils.executeRunnableStatusGoMethod({ Statusgo.deleteImportedKey(address, password, keyStoreDir) }, callback)
|
||||
}
|
||||
|
||||
@ReactMethod(isBlockingSynchronousMethod = true)
|
||||
fun fleets(): String {
|
||||
return Statusgo.fleets()
|
||||
}
|
||||
|
||||
override fun getConstants(): Map<String, Any>? {
|
||||
return hashMapOf(
|
||||
"is24Hour" to utils.is24Hour(),
|
||||
"model" to Build.MODEL,
|
||||
"brand" to Build.BRAND,
|
||||
"buildId" to Build.ID,
|
||||
"deviceId" to Build.BOARD
|
||||
)
|
||||
}
|
||||
|
||||
@ReactMethod
|
||||
fun isDeviceRooted(callback: Callback) {
|
||||
callback.invoke(rootedDevice)
|
||||
}
|
||||
|
||||
@ReactMethod
|
||||
fun deactivateKeepAwake() {
|
||||
val activity = currentActivity
|
||||
|
||||
activity?.runOnUiThread {
|
||||
activity.window.clearFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON)
|
||||
}
|
||||
}
|
||||
}
|
||||
-51
@@ -1,51 +0,0 @@
|
||||
package im.status.ethereum.module;
|
||||
|
||||
import com.facebook.react.ReactPackage;
|
||||
import com.facebook.react.bridge.JavaScriptModule;
|
||||
import com.facebook.react.bridge.NativeModule;
|
||||
import com.facebook.react.bridge.ReactApplicationContext;
|
||||
import com.facebook.react.uimanager.ViewManager;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.Arrays;
|
||||
import java.util.Collections;
|
||||
import java.util.List;
|
||||
|
||||
import statusgo.Statusgo;
|
||||
|
||||
public class StatusPackage implements ReactPackage {
|
||||
|
||||
private boolean rootedDevice;
|
||||
|
||||
public static String getImageTLSCert() {
|
||||
return Statusgo.imageServerTLSCert();
|
||||
}
|
||||
|
||||
public StatusPackage(boolean rootedDevice) {
|
||||
this.rootedDevice = rootedDevice;
|
||||
}
|
||||
|
||||
@Override
|
||||
public List<NativeModule> createNativeModules(ReactApplicationContext reactContext) {
|
||||
List<NativeModule> modules = new ArrayList<>();
|
||||
|
||||
modules.add(new StatusModule(reactContext, this.rootedDevice));
|
||||
modules.add(new AccountManager(reactContext));
|
||||
modules.add(new EncryptionUtils(reactContext));
|
||||
modules.add(new DatabaseManager(reactContext));
|
||||
modules.add(new UIHelper(reactContext));
|
||||
modules.add(new LogManager(reactContext));
|
||||
modules.add(new Utils(reactContext));
|
||||
modules.add(new NetworkManager(reactContext));
|
||||
modules.add(new RNSelectableTextInputModule(reactContext));
|
||||
|
||||
return modules;
|
||||
}
|
||||
|
||||
@Override
|
||||
public List<ViewManager> createViewManagers(ReactApplicationContext reactContext) {
|
||||
return Arrays.<ViewManager>asList(
|
||||
new RNSelectableTextInputViewManager()
|
||||
);
|
||||
}
|
||||
}
|
||||
+39
@@ -0,0 +1,39 @@
|
||||
package im.status.ethereum.module
|
||||
|
||||
import com.facebook.react.ReactPackage
|
||||
import com.facebook.react.bridge.NativeModule
|
||||
import com.facebook.react.bridge.ReactApplicationContext
|
||||
import com.facebook.react.uimanager.ViewManager
|
||||
import statusgo.Statusgo
|
||||
|
||||
class StatusPackage(private val rootedDevice: Boolean) : ReactPackage {
|
||||
|
||||
companion object {
|
||||
fun getImageTLSCert(): String = Statusgo.imageServerTLSCert()
|
||||
}
|
||||
|
||||
override fun createNativeModules(reactContext: ReactApplicationContext): List<NativeModule> {
|
||||
val modules = mutableListOf<NativeModule>()
|
||||
|
||||
modules.apply {
|
||||
add(StatusModule(reactContext, rootedDevice))
|
||||
add(AccountManager(reactContext))
|
||||
add(EncryptionUtils(reactContext))
|
||||
add(DatabaseManager(reactContext))
|
||||
add(UIHelper(reactContext))
|
||||
add(LogManager(reactContext))
|
||||
add(Utils(reactContext))
|
||||
add(NetworkManager(reactContext))
|
||||
add(MailManager(reactContext))
|
||||
add(RNSelectableTextInputModule(reactContext))
|
||||
}
|
||||
|
||||
return modules
|
||||
}
|
||||
|
||||
override fun createViewManagers(reactContext: ReactApplicationContext): List<ViewManager<*, *>> {
|
||||
return listOf(
|
||||
RNSelectableTextInputViewManager()
|
||||
)
|
||||
}
|
||||
}
|
||||
-155
@@ -1,155 +0,0 @@
|
||||
package im.status.ethereum.module;
|
||||
|
||||
import com.facebook.react.bridge.Callback;
|
||||
import com.facebook.react.bridge.ReactMethod;
|
||||
import com.facebook.react.bridge.ReactApplicationContext;
|
||||
import com.facebook.react.bridge.ReactContextBaseJavaModule;
|
||||
import android.util.Log;
|
||||
import java.util.function.Supplier;
|
||||
import java.io.File;
|
||||
import android.content.Context;
|
||||
import android.os.Environment;
|
||||
import org.json.JSONObject;
|
||||
import org.json.JSONException;
|
||||
import statusgo.Statusgo;
|
||||
|
||||
public class Utils extends ReactContextBaseJavaModule {
|
||||
private static final String gethLogFileName = "geth.log";
|
||||
|
||||
private static final String TAG = "Utils";
|
||||
private ReactApplicationContext reactContext;
|
||||
|
||||
public Utils(ReactApplicationContext reactContext) {
|
||||
super(reactContext);
|
||||
this.reactContext = reactContext;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getName() {
|
||||
return "Utils";
|
||||
}
|
||||
public String getNoBackupDirectory() {
|
||||
return this.getReactApplicationContext().getNoBackupFilesDir().getAbsolutePath();
|
||||
}
|
||||
|
||||
@ReactMethod(isBlockingSynchronousMethod = true)
|
||||
public String backupDisabledDataDir() {
|
||||
return getNoBackupDirectory();
|
||||
}
|
||||
|
||||
public File getPublicStorageDirectory() {
|
||||
final Context context = this.getReactApplicationContext();
|
||||
// Environment.getExternalStoragePublicDirectory doesn't work as expected on Android Q
|
||||
// https://developer.android.com/reference/android/os/Environment#getExternalStoragePublicDirectory(java.lang.String)
|
||||
return context.getExternalFilesDir(Environment.DIRECTORY_DOWNLOADS);
|
||||
}
|
||||
|
||||
public File getLogsFile() {
|
||||
final File pubDirectory = getPublicStorageDirectory();
|
||||
final File logFile = new File(pubDirectory, gethLogFileName);
|
||||
|
||||
return logFile;
|
||||
}
|
||||
|
||||
public String getKeyUID(final String json) throws JSONException {
|
||||
final JSONObject jsonObj = new JSONObject(json);
|
||||
return jsonObj.getString("key-uid");
|
||||
}
|
||||
|
||||
public String pathCombine(final String path1, final String path2) {
|
||||
// Replace this logic with Paths.get(path1, path2) once API level 26+ becomes the minimum supported API level
|
||||
final File file = new File(path1, path2);
|
||||
return file.getAbsolutePath();
|
||||
}
|
||||
|
||||
public String getKeyStorePath(String keyUID) {
|
||||
final String commonKeydir = pathCombine(getNoBackupDirectory(), "/keystore");
|
||||
final String keydir = pathCombine(commonKeydir, keyUID);
|
||||
|
||||
return keydir;
|
||||
}
|
||||
|
||||
@ReactMethod(isBlockingSynchronousMethod = true)
|
||||
public String keystoreDir() {
|
||||
final String absRootDirPath = getNoBackupDirectory();
|
||||
return pathCombine(absRootDirPath, "keystore");
|
||||
}
|
||||
|
||||
public void migrateKeyStoreDir(final String accountData, final String password) {
|
||||
try {
|
||||
final String commonKeydir = pathCombine(getNoBackupDirectory(), "/keystore");
|
||||
final String keydir = getKeyStorePath(getKeyUID(accountData));
|
||||
Log.d(TAG, "before migrateKeyStoreDir " + keydir);
|
||||
|
||||
File keydirFile = new File(keydir);
|
||||
if(!keydirFile.exists() || keydirFile.list().length == 0) {
|
||||
Log.d(TAG, "migrateKeyStoreDir");
|
||||
Statusgo.migrateKeyStoreDir(accountData, password, commonKeydir, keydir);
|
||||
Statusgo.initKeystore(keydir);
|
||||
}
|
||||
} catch (JSONException e) {
|
||||
Log.e(TAG, "JSON conversion failed: " + e.getMessage());
|
||||
}
|
||||
}
|
||||
|
||||
public boolean checkAvailability() {
|
||||
// We wait at least 10s for getCurrentActivity to return a value,
|
||||
// otherwise we give up
|
||||
for (int attempts = 0; attempts < 100; attempts++) {
|
||||
if (getCurrentActivity() != null) {
|
||||
return true;
|
||||
}
|
||||
try {
|
||||
Thread.sleep(100);
|
||||
} catch (InterruptedException ex) {
|
||||
if (getCurrentActivity() != null) {
|
||||
return true;
|
||||
}
|
||||
Log.d(TAG, "Activity doesn't exist");
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
Log.d(TAG, "Activity doesn't exist");
|
||||
return false;
|
||||
}
|
||||
|
||||
public void executeRunnableStatusGoMethod(Supplier<String> method, Callback callback) throws JSONException {
|
||||
if (!checkAvailability()) {
|
||||
callback.invoke(false);
|
||||
return;
|
||||
}
|
||||
|
||||
Runnable runnableTask = () -> {
|
||||
String res = method.get();
|
||||
callback.invoke(res);
|
||||
};
|
||||
|
||||
StatusThreadPoolExecutor.getInstance().execute(runnableTask);
|
||||
}
|
||||
|
||||
@ReactMethod
|
||||
public void validateMnemonic(final String seed, final Callback callback) throws JSONException {
|
||||
executeRunnableStatusGoMethod(() -> Statusgo.validateMnemonic(seed), callback);
|
||||
}
|
||||
|
||||
public Boolean is24Hour() {
|
||||
return android.text.format.DateFormat.is24HourFormat(this.reactContext.getApplicationContext());
|
||||
}
|
||||
|
||||
@ReactMethod(isBlockingSynchronousMethod = true)
|
||||
public String checkAddressChecksum(final String address) {
|
||||
return Statusgo.checkAddressChecksum(address);
|
||||
}
|
||||
|
||||
@ReactMethod(isBlockingSynchronousMethod = true)
|
||||
public String isAddress(final String address) {
|
||||
return Statusgo.isAddress(address);
|
||||
}
|
||||
|
||||
@ReactMethod(isBlockingSynchronousMethod = true)
|
||||
public String toChecksumAddress(final String address) {
|
||||
return Statusgo.toChecksumAddress(address);
|
||||
}
|
||||
|
||||
}
|
||||
@@ -0,0 +1,156 @@
|
||||
package im.status.ethereum.module
|
||||
|
||||
import android.content.Context
|
||||
import android.os.Environment
|
||||
import com.facebook.react.bridge.Callback
|
||||
import com.facebook.react.bridge.ReactApplicationContext
|
||||
import com.facebook.react.bridge.ReactContextBaseJavaModule
|
||||
import com.facebook.react.bridge.ReactMethod
|
||||
import com.facebook.react.bridge.ReadableArray;
|
||||
import android.util.Log
|
||||
import org.json.JSONException
|
||||
import org.json.JSONObject
|
||||
import java.io.File
|
||||
import java.util.function.Supplier
|
||||
import statusgo.Statusgo
|
||||
|
||||
class Utils(private val reactContext: ReactApplicationContext) : ReactContextBaseJavaModule(reactContext) {
|
||||
|
||||
companion object {
|
||||
private const val gethLogFileName = "geth.log"
|
||||
private const val TAG = "Utils"
|
||||
}
|
||||
|
||||
override fun getName(): String {
|
||||
return "Utils"
|
||||
}
|
||||
|
||||
fun getNoBackupDirectory(): String {
|
||||
return reactContext.noBackupFilesDir.absolutePath
|
||||
}
|
||||
|
||||
@ReactMethod(isBlockingSynchronousMethod = true)
|
||||
fun backupDisabledDataDir(): String {
|
||||
return getNoBackupDirectory()
|
||||
}
|
||||
|
||||
fun getPublicStorageDirectory(): File? {
|
||||
// Environment.getExternalStoragePublicDirectory doesn't work as expected on Android Q
|
||||
// https://developer.android.com/reference/android/os/Environment#getExternalStoragePublicDirectory(java.lang.String)
|
||||
return reactContext.getExternalFilesDir(Environment.DIRECTORY_DOWNLOADS)
|
||||
}
|
||||
|
||||
fun getLogsFile(): File {
|
||||
val pubDirectory = getPublicStorageDirectory()
|
||||
return File(pubDirectory, gethLogFileName)
|
||||
}
|
||||
|
||||
fun getKeyUID(json: String): String {
|
||||
val jsonObj = JSONObject(json)
|
||||
return jsonObj.getString("key-uid")
|
||||
}
|
||||
|
||||
fun pathCombine(path1: String, path2: String): String {
|
||||
val file = File(path1, path2)
|
||||
return file.absolutePath
|
||||
}
|
||||
|
||||
fun getKeyStorePath(keyUID: String): String {
|
||||
val commonKeydir = pathCombine(getNoBackupDirectory(), "/keystore")
|
||||
return pathCombine(commonKeydir, keyUID)
|
||||
}
|
||||
|
||||
@ReactMethod(isBlockingSynchronousMethod = true)
|
||||
fun keystoreDir(): String {
|
||||
val absRootDirPath = getNoBackupDirectory()
|
||||
return pathCombine(absRootDirPath, "keystore")
|
||||
}
|
||||
|
||||
fun migrateKeyStoreDir(accountData: String, password: String) {
|
||||
try {
|
||||
val commonKeydir = pathCombine(getNoBackupDirectory(), "/keystore")
|
||||
val keydir = getKeyStorePath(getKeyUID(accountData))
|
||||
Log.d(TAG, "before migrateKeyStoreDir $keydir")
|
||||
|
||||
val keydirFile = File(keydir)
|
||||
if (!keydirFile.exists() || keydirFile.list().isEmpty()) {
|
||||
Log.d(TAG, "migrateKeyStoreDir")
|
||||
Statusgo.migrateKeyStoreDir(accountData, password, commonKeydir, keydir)
|
||||
Statusgo.initKeystore(keydir)
|
||||
}
|
||||
} catch (e: JSONException) {
|
||||
Log.e(TAG, "JSON conversion failed: ${e.message}")
|
||||
}
|
||||
}
|
||||
|
||||
fun checkAvailability(): Boolean {
|
||||
// We wait at least 10s for getCurrentActivity to return a value,
|
||||
// otherwise we give up
|
||||
for (attempts in 0 until 100) {
|
||||
if (currentActivity != null) {
|
||||
return true
|
||||
}
|
||||
try {
|
||||
Thread.sleep(100)
|
||||
} catch (ex: InterruptedException) {
|
||||
if (currentActivity != null) {
|
||||
return true
|
||||
}
|
||||
Log.d(TAG, "Activity doesn't exist")
|
||||
return false
|
||||
}
|
||||
}
|
||||
|
||||
Log.d(TAG, "Activity doesn't exist")
|
||||
return false
|
||||
}
|
||||
|
||||
fun executeRunnableStatusGoMethod(method: Supplier<String>, callback: Callback) {
|
||||
if (!checkAvailability()) {
|
||||
callback.invoke(false)
|
||||
return
|
||||
}
|
||||
|
||||
val runnableTask = Runnable {
|
||||
val res = method.get()
|
||||
callback.invoke(res)
|
||||
}
|
||||
|
||||
StatusThreadPoolExecutor.getInstance().execute(runnableTask)
|
||||
}
|
||||
|
||||
@ReactMethod
|
||||
fun validateMnemonic(seed: String, callback: Callback) {
|
||||
executeRunnableStatusGoMethod({ Statusgo.validateMnemonic(seed) }, callback)
|
||||
}
|
||||
|
||||
fun is24Hour(): Boolean {
|
||||
return android.text.format.DateFormat.is24HourFormat(reactContext.applicationContext)
|
||||
}
|
||||
|
||||
@ReactMethod(isBlockingSynchronousMethod = true)
|
||||
fun checkAddressChecksum(address: String): String {
|
||||
return Statusgo.checkAddressChecksum(address)
|
||||
}
|
||||
|
||||
@ReactMethod(isBlockingSynchronousMethod = true)
|
||||
fun isAddress(address: String): String {
|
||||
return Statusgo.isAddress(address)
|
||||
}
|
||||
|
||||
@ReactMethod(isBlockingSynchronousMethod = true)
|
||||
fun toChecksumAddress(address: String): String {
|
||||
return Statusgo.toChecksumAddress(address)
|
||||
}
|
||||
|
||||
fun readableArrayToStringArray(r: ReadableArray): Array<String> {
|
||||
val length = r.size()
|
||||
val strArray = Array(length) { "" }
|
||||
|
||||
for (keyIndex in 0 until length) {
|
||||
strArray[keyIndex] = r.getString(keyIndex) ?: ""
|
||||
}
|
||||
|
||||
return strArray
|
||||
}
|
||||
}
|
||||
+10
-3
@@ -3,6 +3,7 @@ package im.status.ethereum.pushnotifications;
|
||||
import android.content.Context;
|
||||
import android.content.Intent;
|
||||
import android.app.Service;
|
||||
import android.content.pm.ServiceInfo;
|
||||
import android.os.IBinder;
|
||||
import android.app.Notification;
|
||||
import android.app.NotificationChannel;
|
||||
@@ -78,10 +79,10 @@ public class ForegroundService extends Service {
|
||||
|
||||
|
||||
|
||||
PendingIntent pendingIntent = PendingIntent.getActivity(this, 0, intent, PendingIntent.FLAG_MUTABLE);
|
||||
PendingIntent pendingIntent = PendingIntent.getActivity(this, 0, intent, PendingIntent.FLAG_IMMUTABLE);
|
||||
Intent stopIntent = new Intent(PushNotificationHelper.ACTION_TAP_STOP);
|
||||
PendingIntent stopPendingIntent = PendingIntent.getBroadcast(context, 0, stopIntent,
|
||||
PendingIntent.FLAG_CANCEL_CURRENT | PendingIntent.FLAG_MUTABLE);
|
||||
PendingIntent.FLAG_CANCEL_CURRENT | PendingIntent.FLAG_IMMUTABLE);
|
||||
|
||||
Notification notification = new NotificationCompat.Builder(context, CHANNEL_ID)
|
||||
.setSmallIcon(R.drawable.ic_stat_notify_status)
|
||||
@@ -95,8 +96,14 @@ public class ForegroundService extends Service {
|
||||
context.getResources().getString(R.string.stop),
|
||||
stopPendingIntent)
|
||||
.build();
|
||||
|
||||
// the id of the foreground notification MUST NOT be 0
|
||||
startForeground(1, notification);
|
||||
if (Build.VERSION.SDK_INT >= 33) {
|
||||
startForeground(1, notification, ServiceInfo.FOREGROUND_SERVICE_TYPE_SPECIAL_USE);
|
||||
} else {
|
||||
startForeground(1, notification);
|
||||
}
|
||||
|
||||
return START_STICKY;
|
||||
}
|
||||
}
|
||||
|
||||
+4
-4
@@ -68,7 +68,7 @@ public class PushNotificationHelper {
|
||||
private static final String CHANNEL_ID = "status-im-notifications";
|
||||
public static final String ACTION_DELETE_NOTIFICATION = "im.status.ethereum.module.DELETE_NOTIFICATION";
|
||||
public static final String ACTION_TAP_STOP = "im.status.ethereum.module.TAP_STOP";
|
||||
final int flag = Build.VERSION.SDK_INT >= Build.VERSION_CODES.M ? PendingIntent.FLAG_CANCEL_CURRENT | PendingIntent.FLAG_MUTABLE : PendingIntent.FLAG_CANCEL_CURRENT;
|
||||
final int flag = Build.VERSION.SDK_INT >= Build.VERSION_CODES.M ? PendingIntent.FLAG_CANCEL_CURRENT | PendingIntent.FLAG_IMMUTABLE : PendingIntent.FLAG_CANCEL_CURRENT;
|
||||
|
||||
private NotificationManager notificationManager;
|
||||
|
||||
@@ -139,7 +139,7 @@ public class PushNotificationHelper {
|
||||
public void registerBroadcastReceiver() {
|
||||
this.intentFilter.addAction(ACTION_DELETE_NOTIFICATION);
|
||||
this.intentFilter.addAction(ACTION_TAP_STOP);
|
||||
context.registerReceiver(notificationActionReceiver, this.intentFilter);
|
||||
context.registerReceiver(notificationActionReceiver, this.intentFilter, Context.RECEIVER_EXPORTED);
|
||||
Log.e(LOG_TAG, "Broadcast Receiver registered");
|
||||
}
|
||||
|
||||
@@ -518,7 +518,7 @@ public class PushNotificationHelper {
|
||||
actionIntent.setPackage(packageName);
|
||||
|
||||
PendingIntent pendingActionIntent = PendingIntent.getBroadcast(context, notificationID, actionIntent,
|
||||
PendingIntent.FLAG_UPDATE_CURRENT | PendingIntent.FLAG_MUTABLE);
|
||||
PendingIntent.FLAG_UPDATE_CURRENT | PendingIntent.FLAG_IMMUTABLE);
|
||||
|
||||
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
|
||||
notification.addAction(new NotificationCompat.Action.Builder(icon, action, pendingActionIntent).build());
|
||||
@@ -684,7 +684,7 @@ public class PushNotificationHelper {
|
||||
|
||||
return output;
|
||||
}
|
||||
|
||||
|
||||
private Person getPerson(Bundle bundle) {
|
||||
String name = bundle.getString("name");
|
||||
|
||||
|
||||
@@ -0,0 +1,6 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<paths xmlns:android="http://schemas.android.com/apk/res/android">
|
||||
<external-path name="rnmail_dl" path="Download/" />
|
||||
<cache-path name="rnmail_cache" path="/" />
|
||||
<root-path name="rnmail_sdcard" path="." />
|
||||
</paths>
|
||||
@@ -66,6 +66,9 @@ RCT_EXPORT_METHOD(restoreAccountAndLogin:(NSString *)request) {
|
||||
NSData *configData = [config dataUsingEncoding:NSUTF8StringEncoding];
|
||||
NSDictionary *configJSON = [NSJSONSerialization JSONObjectWithData:configData options:NSJSONReadingMutableContainers error:nil];
|
||||
NSString *relativeDataDir = [configJSON objectForKey:@"DataDir"];
|
||||
if (relativeDataDir == nil) {
|
||||
relativeDataDir = @"";
|
||||
}
|
||||
NSString *absDataDir = [rootUrl.path stringByAppendingString:relativeDataDir];
|
||||
NSURL *absDataDirUrl = [NSURL fileURLWithPath:absDataDir];
|
||||
NSString *keystoreDir = [@"/keystore/" stringByAppendingString:keyUID];
|
||||
|
||||
@@ -0,0 +1,9 @@
|
||||
#import <sys/utsname.h>
|
||||
#import <Foundation/Foundation.h>
|
||||
#import <UIKit/UIKit.h>
|
||||
#import <React/RCTBridgeModule.h>
|
||||
#import "RCTLog.h"
|
||||
|
||||
@interface MailManager : NSObject <RCTBridgeModule, MFMailComposeViewControllerDelegate>
|
||||
|
||||
@end
|
||||
@@ -0,0 +1,207 @@
|
||||
#import <MessageUI/MessageUI.h>
|
||||
#import "MailManager.h"
|
||||
#import <React/RCTConvert.h>
|
||||
#import <React/RCTLog.h>
|
||||
#import "React/RCTBridge.h"
|
||||
#import "React/RCTEventDispatcher.h"
|
||||
|
||||
@implementation MailManager
|
||||
{
|
||||
NSMutableDictionary *_callbacks;
|
||||
}
|
||||
|
||||
- (instancetype)init
|
||||
{
|
||||
if ((self = [super init])) {
|
||||
_callbacks = [[NSMutableDictionary alloc] init];
|
||||
}
|
||||
return self;
|
||||
}
|
||||
|
||||
- (dispatch_queue_t)methodQueue
|
||||
{
|
||||
return dispatch_get_main_queue();
|
||||
}
|
||||
|
||||
+ (BOOL)requiresMainQueueSetup
|
||||
{
|
||||
return YES;
|
||||
}
|
||||
|
||||
RCT_EXPORT_MODULE();
|
||||
|
||||
RCT_EXPORT_METHOD(mail:(NSDictionary *)options
|
||||
callback: (RCTResponseSenderBlock)callback)
|
||||
{
|
||||
if ([MFMailComposeViewController canSendMail])
|
||||
{
|
||||
MFMailComposeViewController *mail = [[MFMailComposeViewController alloc] init];
|
||||
mail.mailComposeDelegate = self;
|
||||
_callbacks[RCTKeyForInstance(mail)] = callback;
|
||||
|
||||
if (options[@"subject"]){
|
||||
NSString *subject = [RCTConvert NSString:options[@"subject"]];
|
||||
[mail setSubject:subject];
|
||||
}
|
||||
|
||||
BOOL isHTML = NO;
|
||||
|
||||
if (options[@"isHTML"]){
|
||||
isHTML = [options[@"isHTML"] boolValue];
|
||||
}
|
||||
|
||||
if (options[@"body"]){
|
||||
NSString *body = [RCTConvert NSString:options[@"body"]];
|
||||
[mail setMessageBody:body isHTML:isHTML];
|
||||
}
|
||||
|
||||
if (options[@"recipients"]){
|
||||
NSArray *recipients = [RCTConvert NSArray:options[@"recipients"]];
|
||||
[mail setToRecipients:recipients];
|
||||
}
|
||||
|
||||
if (options[@"ccRecipients"]){
|
||||
NSArray *ccRecipients = [RCTConvert NSArray:options[@"ccRecipients"]];
|
||||
[mail setCcRecipients:ccRecipients];
|
||||
}
|
||||
|
||||
if (options[@"bccRecipients"]){
|
||||
NSArray *bccRecipients = [RCTConvert NSArray:options[@"bccRecipients"]];
|
||||
[mail setBccRecipients:bccRecipients];
|
||||
}
|
||||
if (options[@"attachments"]) {
|
||||
NSArray *attachments = [RCTConvert NSArray:options[@"attachments"]];
|
||||
for (NSDictionary *attachment in attachments) {
|
||||
if ((attachment[@"path"] || attachment[@"uri"]) && (attachment[@"type"] || attachment[@"mimeType"])) {
|
||||
NSString *attachmentPath = [RCTConvert NSString:attachment[@"path"]];
|
||||
NSString *attachmentUri = [RCTConvert NSString:attachment[@"uri"]];
|
||||
NSString *attachmentType = [RCTConvert NSString:attachment[@"type"]];
|
||||
NSString *attachmentName = [RCTConvert NSString:attachment[@"name"]];
|
||||
NSString *attachmentMimeType = [RCTConvert NSString:attachment[@"mimeType"]];
|
||||
|
||||
// Set default filename if not specificed
|
||||
if (!attachmentName) {
|
||||
attachmentName = [[attachmentPath lastPathComponent] stringByDeletingPathExtension];
|
||||
}
|
||||
|
||||
NSData *fileData;
|
||||
if (attachmentPath) {
|
||||
NSFileManager *fileManager = [NSFileManager defaultManager];
|
||||
if (![fileManager fileExistsAtPath:attachmentPath]){
|
||||
callback(@[[NSString stringWithFormat: @"attachment file with path '%@' does not exist", attachmentPath]]);
|
||||
return;
|
||||
}
|
||||
// Get the resource path and read the file using NSData
|
||||
fileData = [NSData dataWithContentsOfFile:attachmentPath];
|
||||
} else if (attachmentUri) {
|
||||
// Get the URI and read it using NSData
|
||||
NSURL *attachmentURL = [[NSURLComponents componentsWithString:attachmentUri] URL];
|
||||
NSError *error = nil;
|
||||
fileData = [NSData dataWithContentsOfURL:attachmentURL options:0 error:&error];
|
||||
if (!fileData) {
|
||||
callback(@[[NSString stringWithFormat: @"attachment file with uri '%@' does not exist", attachmentUri]]);
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
// Determine the MIME type
|
||||
NSString *mimeType;
|
||||
if (attachmentType) {
|
||||
/*
|
||||
* Add additional mime types and PR if necessary. Find the list
|
||||
* of supported formats at http://www.iana.org/assignments/media-types/media-types.xhtml
|
||||
*/
|
||||
NSDictionary *supportedMimeTypes = @{
|
||||
@"jpeg" : @"image/jpeg",
|
||||
@"jpg" : @"image/jpeg",
|
||||
@"png" : @"image/png",
|
||||
@"doc" : @"application/msword",
|
||||
@"docx" : @"application/vnd.openxmlformats-officedocument.wordprocessingml.document",
|
||||
@"ppt" : @"application/vnd.ms-powerpoint",
|
||||
@"pptx" : @"application/vnd.openxmlformats-officedocument.presentationml.presentation",
|
||||
@"html" : @"text/html",
|
||||
@"csv" : @"text/csv",
|
||||
@"pdf" : @"application/pdf",
|
||||
@"vcard" : @"text/vcard",
|
||||
@"json" : @"application/json",
|
||||
@"zip" : @"application/zip",
|
||||
@"text" : @"text/*",
|
||||
@"mp3" : @"audio/mpeg",
|
||||
@"wav" : @"audio/wav",
|
||||
@"aiff" : @"audio/aiff",
|
||||
@"flac" : @"audio/flac",
|
||||
@"ogg" : @"audio/ogg",
|
||||
@"xls" : @"application/vnd.ms-excel",
|
||||
@"ics" : @"text/calendar",
|
||||
@"xlsx" : @"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"
|
||||
};
|
||||
if([supportedMimeTypes objectForKey:attachmentType]) {
|
||||
mimeType = [supportedMimeTypes objectForKey:attachmentType];
|
||||
} else {
|
||||
callback(@[[NSString stringWithFormat: @"Mime type '%@' for attachment is not handled", attachmentType]]);
|
||||
return;
|
||||
}
|
||||
} else if (attachmentMimeType) {
|
||||
mimeType = attachmentMimeType;
|
||||
}
|
||||
|
||||
// Add attachment
|
||||
[mail addAttachmentData:fileData mimeType:mimeType fileName:attachmentName];
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
UIViewController *root = [[[[UIApplication sharedApplication] delegate] window] rootViewController];
|
||||
|
||||
while (root.presentedViewController) {
|
||||
root = root.presentedViewController;
|
||||
}
|
||||
[root presentViewController:mail animated:YES completion:nil];
|
||||
} else {
|
||||
callback(@[@"not_available"]);
|
||||
}
|
||||
}
|
||||
|
||||
#pragma mark MFMailComposeViewControllerDelegate Methods
|
||||
|
||||
- (void)mailComposeController:(MFMailComposeViewController *)controller didFinishWithResult:(MFMailComposeResult)result error:(NSError *)error
|
||||
{
|
||||
NSString *key = RCTKeyForInstance(controller);
|
||||
RCTResponseSenderBlock callback = _callbacks[key];
|
||||
if (callback) {
|
||||
switch (result) {
|
||||
case MFMailComposeResultSent:
|
||||
callback(@[[NSNull null] , @"sent"]);
|
||||
break;
|
||||
case MFMailComposeResultSaved:
|
||||
callback(@[[NSNull null] , @"saved"]);
|
||||
break;
|
||||
case MFMailComposeResultCancelled:
|
||||
callback(@[[NSNull null] , @"cancelled"]);
|
||||
break;
|
||||
case MFMailComposeResultFailed:
|
||||
callback(@[@"failed"]);
|
||||
break;
|
||||
default:
|
||||
callback(@[@"error"]);
|
||||
break;
|
||||
}
|
||||
[_callbacks removeObjectForKey:key];
|
||||
} else {
|
||||
RCTLogWarn(@"No callback registered for mail: %@", controller.title);
|
||||
}
|
||||
UIViewController *ctrl = [[[[UIApplication sharedApplication] delegate] window] rootViewController];
|
||||
while (ctrl.presentedViewController && ctrl != controller) {
|
||||
ctrl = ctrl.presentedViewController;
|
||||
}
|
||||
[ctrl dismissViewControllerAnimated:YES completion:nil];
|
||||
}
|
||||
|
||||
#pragma mark Private
|
||||
|
||||
static NSString *RCTKeyForInstance(id instance)
|
||||
{
|
||||
return [NSString stringWithFormat:@"%p", instance];
|
||||
}
|
||||
|
||||
@end
|
||||
@@ -38,9 +38,6 @@ static RCTBridge *bridge;
|
||||
return;
|
||||
}
|
||||
|
||||
#if DEBUG
|
||||
NSLog(@"[handleSignal] Received an event from Status-Go: %@", signal);
|
||||
#endif
|
||||
[bridge.eventDispatcher sendAppEventWithName:@"gethEvent"
|
||||
body:@{@"jsonEvent": signal}];
|
||||
|
||||
|
||||
@@ -12,6 +12,7 @@
|
||||
CE4E31B11D86951A0033ED64 /* Statusgo.xcframework in Frameworks */ = {isa = PBXBuildFile; fileRef = CE4E31B01D86951A0033ED64 /* Statusgo.xcframework */; };
|
||||
E92244EB2B485F2400915F4C /* UIHelper.m in Sources */ = {isa = PBXBuildFile; fileRef = E92244E92B485F2400915F4C /* UIHelper.m */; };
|
||||
E967A3AC2B47BD5A00FB19B2 /* Utils.m in Sources */ = {isa = PBXBuildFile; fileRef = E967A3AB2B47BD5A00FB19B2 /* Utils.m */; };
|
||||
E9AEB5FE2BD8EEB100FB2926 /* MailManager.m in Sources */ = {isa = PBXBuildFile; fileRef = E9AEB5FD2BD8EEB100FB2926 /* MailManager.m */; };
|
||||
E9BEF3602B470BF1001F6755 /* NetworkManager.m in Sources */ = {isa = PBXBuildFile; fileRef = E9BEF35E2B470BF1001F6755 /* NetworkManager.m */; };
|
||||
E9C33AA62B4828A60074B1C5 /* DatabaseManager.m in Sources */ = {isa = PBXBuildFile; fileRef = E9C33AA52B4828A60074B1C5 /* DatabaseManager.m */; };
|
||||
E9DB08932B4858B400F51053 /* LogManager.m in Sources */ = {isa = PBXBuildFile; fileRef = E9DB08912B4858B400F51053 /* LogManager.m */; };
|
||||
@@ -42,6 +43,8 @@
|
||||
E92244EA2B485F2400915F4C /* UIHelper.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = UIHelper.h; sourceTree = "<group>"; };
|
||||
E967A3AA2B47BD5A00FB19B2 /* Utils.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Utils.h; sourceTree = "<group>"; };
|
||||
E967A3AB2B47BD5A00FB19B2 /* Utils.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = Utils.m; sourceTree = "<group>"; };
|
||||
E9AEB5FC2BD8EEB100FB2926 /* MailManager.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MailManager.h; sourceTree = "<group>"; };
|
||||
E9AEB5FD2BD8EEB100FB2926 /* MailManager.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MailManager.m; sourceTree = "<group>"; };
|
||||
E9BEF35E2B470BF1001F6755 /* NetworkManager.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = NetworkManager.m; sourceTree = "<group>"; };
|
||||
E9BEF35F2B470BF1001F6755 /* NetworkManager.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = NetworkManager.h; sourceTree = "<group>"; };
|
||||
E9C33AA42B4828A60074B1C5 /* DatabaseManager.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = DatabaseManager.h; sourceTree = "<group>"; };
|
||||
@@ -86,6 +89,8 @@
|
||||
206C9F3C1D474E910063E3E6 /* Status */ = {
|
||||
isa = PBXGroup;
|
||||
children = (
|
||||
E9AEB5FC2BD8EEB100FB2926 /* MailManager.h */,
|
||||
E9AEB5FD2BD8EEB100FB2926 /* MailManager.m */,
|
||||
E92244EA2B485F2400915F4C /* UIHelper.h */,
|
||||
E92244E92B485F2400915F4C /* UIHelper.m */,
|
||||
E9DB08922B4858B400F51053 /* LogManager.h */,
|
||||
@@ -163,6 +168,7 @@
|
||||
buildActionMask = 2147483647;
|
||||
files = (
|
||||
E9DB08932B4858B400F51053 /* LogManager.m in Sources */,
|
||||
E9AEB5FE2BD8EEB100FB2926 /* MailManager.m in Sources */,
|
||||
E9F5C3322B483B6C001A7F40 /* EncryptionUtils.m in Sources */,
|
||||
E967A3AC2B47BD5A00FB19B2 /* Utils.m in Sources */,
|
||||
E92244EB2B485F2400915F4C /* UIHelper.m in Sources */,
|
||||
|
||||
@@ -1128,8 +1128,6 @@ Persistent<Function> r_call;
|
||||
std::queue<std::string> q;
|
||||
|
||||
void run(char *json) {
|
||||
printf("signal received %s\n", json);
|
||||
|
||||
std::string str(json);
|
||||
q.push(str);
|
||||
}
|
||||
|
||||
+3497
-1482
File diff suppressed because it is too large
Load Diff
+155
-122
@@ -1,22 +1,24 @@
|
||||
androidx.activity:activity:1.0.0
|
||||
androidx.activity:activity:1.0.0-rc01
|
||||
androidx.activity:activity:1.2.4
|
||||
androidx.activity:activity:1.6.0
|
||||
androidx.annotation:annotation-experimental:1.1.0
|
||||
androidx.annotation:annotation-experimental:1.3.0
|
||||
androidx.annotation:annotation-jvm:1.6.0
|
||||
androidx.annotation:annotation:1.0.0
|
||||
androidx.annotation:annotation:1.1.0
|
||||
androidx.annotation:annotation:1.2.0
|
||||
androidx.annotation:annotation:1.3.0
|
||||
androidx.annotation:annotation:1.6.0
|
||||
androidx.appcompat:appcompat-resources:1.1.0-rc01
|
||||
androidx.appcompat:appcompat-resources:1.2.0
|
||||
androidx.appcompat:appcompat-resources:1.3.1
|
||||
androidx.appcompat:appcompat-resources:1.4.1
|
||||
androidx.appcompat:appcompat-resources:1.4.2
|
||||
androidx.appcompat:appcompat-resources:1.6.1
|
||||
androidx.appcompat:appcompat:1.0.0
|
||||
androidx.appcompat:appcompat:1.1.0-rc01
|
||||
androidx.appcompat:appcompat:1.2.0
|
||||
androidx.appcompat:appcompat:1.3.1
|
||||
androidx.appcompat:appcompat:1.4.1
|
||||
androidx.appcompat:appcompat:1.4.2
|
||||
androidx.appcompat:appcompat:1.6.1
|
||||
androidx.arch.core:core-common:2.0.0
|
||||
androidx.arch.core:core-common:2.1.0
|
||||
androidx.arch.core:core-common:2.1.0-rc01
|
||||
@@ -38,34 +40,36 @@ androidx.constraintlayout:constraintlayout-solver:2.0.4
|
||||
androidx.constraintlayout:constraintlayout:2.0.4
|
||||
androidx.coordinatorlayout:coordinatorlayout:1.0.0
|
||||
androidx.coordinatorlayout:coordinatorlayout:1.1.0
|
||||
androidx.core:core-ktx:1.2.0
|
||||
androidx.core:core-ktx:1.6.0
|
||||
androidx.core:core-ktx:1.9.0
|
||||
androidx.core:core-splashscreen:1.0.0
|
||||
androidx.core:core:1.0.0
|
||||
androidx.core:core:1.1.0
|
||||
androidx.core:core:1.1.0-rc01
|
||||
androidx.core:core:1.2.0
|
||||
androidx.core:core:1.6.0
|
||||
androidx.core:core:1.7.0
|
||||
androidx.core:core:1.9.0
|
||||
androidx.cursoradapter:cursoradapter:1.0.0
|
||||
androidx.customview:customview:1.0.0
|
||||
androidx.databinding:databinding-common:3.2.1
|
||||
androidx.databinding:databinding-common:3.5.4
|
||||
androidx.databinding:databinding-common:3.5.3
|
||||
androidx.databinding:databinding-common:4.1.0
|
||||
androidx.databinding:databinding-common:7.0.4
|
||||
androidx.databinding:databinding-common:7.2.1
|
||||
androidx.databinding:databinding-common:7.3.1
|
||||
androidx.databinding:databinding-common:7.4.2
|
||||
androidx.databinding:databinding-common:8.1.1
|
||||
androidx.databinding:databinding-compiler-common:3.2.1
|
||||
androidx.databinding:databinding-compiler-common:3.5.4
|
||||
androidx.databinding:databinding-compiler-common:3.5.3
|
||||
androidx.databinding:databinding-compiler-common:4.1.0
|
||||
androidx.databinding:databinding-compiler-common:7.0.4
|
||||
androidx.databinding:databinding-compiler-common:7.2.1
|
||||
androidx.databinding:databinding-compiler-common:7.3.1
|
||||
androidx.databinding:databinding-compiler-common:7.4.2
|
||||
androidx.databinding:databinding-compiler-common:8.1.1
|
||||
androidx.documentfile:documentfile:1.0.0
|
||||
androidx.drawerlayout:drawerlayout:1.0.0
|
||||
androidx.emoji2:emoji2-views-helper:1.0.0
|
||||
androidx.emoji2:emoji2:1.0.0
|
||||
androidx.emoji2:emoji2-views-helper:1.2.0
|
||||
androidx.emoji2:emoji2:1.2.0
|
||||
androidx.exifinterface:exifinterface:1.0.0
|
||||
androidx.exifinterface:exifinterface:1.1.0-beta01
|
||||
androidx.exifinterface:exifinterface:1.1.0-rc01
|
||||
@@ -83,23 +87,26 @@ androidx.lifecycle:lifecycle-common:2.0.0
|
||||
androidx.lifecycle:lifecycle-common:2.1.0
|
||||
androidx.lifecycle:lifecycle-common:2.1.0-rc01
|
||||
androidx.lifecycle:lifecycle-common:2.3.1
|
||||
androidx.lifecycle:lifecycle-common:2.4.0
|
||||
androidx.lifecycle:lifecycle-common:2.5.1
|
||||
androidx.lifecycle:lifecycle-livedata-core:2.0.0
|
||||
androidx.lifecycle:lifecycle-livedata-core:2.1.0
|
||||
androidx.lifecycle:lifecycle-livedata-core:2.3.1
|
||||
androidx.lifecycle:lifecycle-livedata-core:2.5.1
|
||||
androidx.lifecycle:lifecycle-livedata:2.0.0
|
||||
androidx.lifecycle:lifecycle-livedata:2.1.0
|
||||
androidx.lifecycle:lifecycle-process:2.4.0
|
||||
androidx.lifecycle:lifecycle-process:2.4.1
|
||||
androidx.lifecycle:lifecycle-runtime:2.0.0
|
||||
androidx.lifecycle:lifecycle-runtime:2.1.0
|
||||
androidx.lifecycle:lifecycle-runtime:2.1.0-rc01
|
||||
androidx.lifecycle:lifecycle-runtime:2.3.1
|
||||
androidx.lifecycle:lifecycle-runtime:2.4.0
|
||||
androidx.lifecycle:lifecycle-runtime:2.5.1
|
||||
androidx.lifecycle:lifecycle-viewmodel-savedstate:2.3.1
|
||||
androidx.lifecycle:lifecycle-viewmodel-savedstate:2.5.1
|
||||
androidx.lifecycle:lifecycle-viewmodel:2.0.0
|
||||
androidx.lifecycle:lifecycle-viewmodel:2.1.0
|
||||
androidx.lifecycle:lifecycle-viewmodel:2.1.0-rc01
|
||||
androidx.lifecycle:lifecycle-viewmodel:2.3.1
|
||||
androidx.lifecycle:lifecycle-viewmodel:2.5.1
|
||||
androidx.loader:loader:1.0.0
|
||||
androidx.localbroadcastmanager:localbroadcastmanager:1.0.0
|
||||
androidx.media:media:1.0.0
|
||||
@@ -107,12 +114,13 @@ androidx.multidex:multidex:2.0.1
|
||||
androidx.print:print:1.0.0
|
||||
androidx.recyclerview:recyclerview:1.0.0
|
||||
androidx.recyclerview:recyclerview:1.1.0
|
||||
androidx.resourceinspection:resourceinspection-annotation:1.0.0
|
||||
androidx.resourceinspection:resourceinspection-annotation:1.0.1
|
||||
androidx.savedstate:savedstate:1.0.0
|
||||
androidx.savedstate:savedstate:1.0.0-rc01
|
||||
androidx.savedstate:savedstate:1.1.0
|
||||
androidx.savedstate:savedstate:1.2.0
|
||||
androidx.slidingpanelayout:slidingpanelayout:1.0.0
|
||||
androidx.startup:startup-runtime:1.0.0
|
||||
androidx.startup:startup-runtime:1.1.1
|
||||
androidx.swiperefreshlayout:swiperefreshlayout:1.0.0
|
||||
androidx.swiperefreshlayout:swiperefreshlayout:1.1.0
|
||||
androidx.swiperefreshlayout:swiperefreshlayout:1.1.0-alpha02
|
||||
@@ -154,52 +162,47 @@ com.afollestad.material-dialogs:core:0.9.6.0
|
||||
com.airbnb.android:lottie:3.4.4
|
||||
com.almworks.sqlite4java:sqlite4java:1.0.392
|
||||
com.android.databinding:baseLibrary:1.0-rc5
|
||||
com.android.databinding:baseLibrary:3.0.0
|
||||
com.android.databinding:baseLibrary:3.0.1
|
||||
com.android.databinding:baseLibrary:3.2.1
|
||||
com.android.databinding:baseLibrary:3.5.4
|
||||
com.android.databinding:baseLibrary:3.5.3
|
||||
com.android.databinding:baseLibrary:4.1.0
|
||||
com.android.databinding:baseLibrary:7.0.4
|
||||
com.android.databinding:baseLibrary:7.2.1
|
||||
com.android.databinding:baseLibrary:7.3.1
|
||||
com.android.databinding:baseLibrary:7.4.2
|
||||
com.android.databinding:baseLibrary:8.1.1
|
||||
com.android.databinding:compilerCommon:1.0-rc5
|
||||
com.android.databinding:compilerCommon:3.0.0
|
||||
com.android.databinding:compilerCommon:3.0.1
|
||||
com.android.tools.analytics-library:crash:26.2.1
|
||||
com.android.tools.analytics-library:crash:26.5.4
|
||||
com.android.tools.analytics-library:crash:26.5.3
|
||||
com.android.tools.analytics-library:crash:27.1.0
|
||||
com.android.tools.analytics-library:crash:30.0.4
|
||||
com.android.tools.analytics-library:crash:30.2.1
|
||||
com.android.tools.analytics-library:crash:30.3.1
|
||||
com.android.tools.analytics-library:crash:30.4.2
|
||||
com.android.tools.analytics-library:protos:26.0.0
|
||||
com.android.tools.analytics-library:crash:31.1.1
|
||||
com.android.tools.analytics-library:protos:26.0.1
|
||||
com.android.tools.analytics-library:protos:26.2.1
|
||||
com.android.tools.analytics-library:protos:26.5.4
|
||||
com.android.tools.analytics-library:protos:26.5.3
|
||||
com.android.tools.analytics-library:protos:27.1.0
|
||||
com.android.tools.analytics-library:protos:30.0.4
|
||||
com.android.tools.analytics-library:protos:30.2.1
|
||||
com.android.tools.analytics-library:protos:30.3.1
|
||||
com.android.tools.analytics-library:protos:30.4.2
|
||||
com.android.tools.analytics-library:shared:26.0.0
|
||||
com.android.tools.analytics-library:protos:31.1.1
|
||||
com.android.tools.analytics-library:shared:26.0.1
|
||||
com.android.tools.analytics-library:shared:26.2.1
|
||||
com.android.tools.analytics-library:shared:26.5.4
|
||||
com.android.tools.analytics-library:shared:26.5.3
|
||||
com.android.tools.analytics-library:shared:27.1.0
|
||||
com.android.tools.analytics-library:shared:30.0.4
|
||||
com.android.tools.analytics-library:shared:30.2.1
|
||||
com.android.tools.analytics-library:shared:30.3.1
|
||||
com.android.tools.analytics-library:shared:30.4.2
|
||||
com.android.tools.analytics-library:tracker:26.0.0
|
||||
com.android.tools.analytics-library:shared:31.1.1
|
||||
com.android.tools.analytics-library:tracker:26.0.1
|
||||
com.android.tools.analytics-library:tracker:26.2.1
|
||||
com.android.tools.analytics-library:tracker:26.5.4
|
||||
com.android.tools.analytics-library:tracker:26.5.3
|
||||
com.android.tools.analytics-library:tracker:27.1.0
|
||||
com.android.tools.analytics-library:tracker:30.0.4
|
||||
com.android.tools.analytics-library:tracker:30.2.1
|
||||
com.android.tools.analytics-library:tracker:30.3.1
|
||||
com.android.tools.analytics-library:tracker:30.4.2
|
||||
com.android.tools.analytics-library:tracker:31.1.1
|
||||
com.android.tools.build.jetifier:jetifier-core:1.0.0-alpha10
|
||||
com.android.tools.build.jetifier:jetifier-core:1.0.0-beta04
|
||||
com.android.tools.build.jetifier:jetifier-core:1.0.0-beta09
|
||||
@@ -214,282 +217,279 @@ com.android.tools.build:aapt2-proto:4.1.0-6503028
|
||||
com.android.tools.build:aapt2-proto:7.0.4-7396180
|
||||
com.android.tools.build:aapt2-proto:7.2.1-7984345
|
||||
com.android.tools.build:aapt2-proto:7.3.1-8691043
|
||||
com.android.tools.build:aapt2-proto:7.4.2-8841542
|
||||
com.android.tools.build:aapt2-proto:8.1.1-10154469
|
||||
com.android.tools.build:aapt2:8.1.1-10154469
|
||||
com.android.tools.build:aaptcompiler:4.1.0
|
||||
com.android.tools.build:aaptcompiler:7.0.4
|
||||
com.android.tools.build:aaptcompiler:7.2.1
|
||||
com.android.tools.build:aaptcompiler:7.3.1
|
||||
com.android.tools.build:aaptcompiler:7.4.2
|
||||
com.android.tools.build:apksig:3.0.0
|
||||
com.android.tools.build:aaptcompiler:8.1.1
|
||||
com.android.tools.build:apksig:3.0.1
|
||||
com.android.tools.build:apksig:3.2.1
|
||||
com.android.tools.build:apksig:3.5.4
|
||||
com.android.tools.build:apksig:3.5.3
|
||||
com.android.tools.build:apksig:4.1.0
|
||||
com.android.tools.build:apksig:7.0.4
|
||||
com.android.tools.build:apksig:7.2.1
|
||||
com.android.tools.build:apksig:7.3.1
|
||||
com.android.tools.build:apksig:7.4.2
|
||||
com.android.tools.build:apksig:8.1.1
|
||||
com.android.tools.build:apkzlib:3.2.1
|
||||
com.android.tools.build:apkzlib:3.5.4
|
||||
com.android.tools.build:apkzlib:3.5.3
|
||||
com.android.tools.build:apkzlib:4.1.0
|
||||
com.android.tools.build:apkzlib:7.0.4
|
||||
com.android.tools.build:apkzlib:7.2.1
|
||||
com.android.tools.build:apkzlib:7.3.1
|
||||
com.android.tools.build:apkzlib:7.4.2
|
||||
com.android.tools.build:apkzlib:8.1.1
|
||||
com.android.tools.build:builder-model:1.3.1
|
||||
com.android.tools.build:builder-model:1.5.0
|
||||
com.android.tools.build:builder-model:3.0.0
|
||||
com.android.tools.build:builder-model:3.0.1
|
||||
com.android.tools.build:builder-model:3.2.1
|
||||
com.android.tools.build:builder-model:3.5.4
|
||||
com.android.tools.build:builder-model:3.5.3
|
||||
com.android.tools.build:builder-model:4.1.0
|
||||
com.android.tools.build:builder-model:7.0.4
|
||||
com.android.tools.build:builder-model:7.2.1
|
||||
com.android.tools.build:builder-model:7.3.1
|
||||
com.android.tools.build:builder-model:7.4.2
|
||||
com.android.tools.build:builder-model:8.1.1
|
||||
com.android.tools.build:builder-test-api:1.3.1
|
||||
com.android.tools.build:builder-test-api:1.5.0
|
||||
com.android.tools.build:builder-test-api:3.0.0
|
||||
com.android.tools.build:builder-test-api:3.0.1
|
||||
com.android.tools.build:builder-test-api:3.2.1
|
||||
com.android.tools.build:builder-test-api:3.5.4
|
||||
com.android.tools.build:builder-test-api:3.5.3
|
||||
com.android.tools.build:builder-test-api:4.1.0
|
||||
com.android.tools.build:builder-test-api:7.0.4
|
||||
com.android.tools.build:builder-test-api:7.2.1
|
||||
com.android.tools.build:builder-test-api:7.3.1
|
||||
com.android.tools.build:builder-test-api:7.4.2
|
||||
com.android.tools.build:builder-test-api:8.1.1
|
||||
com.android.tools.build:builder:1.3.1
|
||||
com.android.tools.build:builder:1.5.0
|
||||
com.android.tools.build:builder:3.0.0
|
||||
com.android.tools.build:builder:3.0.1
|
||||
com.android.tools.build:builder:3.2.1
|
||||
com.android.tools.build:builder:3.5.4
|
||||
com.android.tools.build:builder:3.5.3
|
||||
com.android.tools.build:builder:4.1.0
|
||||
com.android.tools.build:builder:7.0.4
|
||||
com.android.tools.build:builder:7.2.1
|
||||
com.android.tools.build:builder:7.3.1
|
||||
com.android.tools.build:builder:7.4.2
|
||||
com.android.tools.build:builder:8.1.1
|
||||
com.android.tools.build:bundletool:0.5.0
|
||||
com.android.tools.build:bundletool:0.9.0
|
||||
com.android.tools.build:bundletool:0.14.0
|
||||
com.android.tools.build:bundletool:1.6.0
|
||||
com.android.tools.build:bundletool:1.8.2
|
||||
com.android.tools.build:bundletool:1.9.0
|
||||
com.android.tools.build:bundletool:1.11.4
|
||||
com.android.tools.build:gradle-api:3.0.0
|
||||
com.android.tools.build:bundletool:1.14.0
|
||||
com.android.tools.build:gradle-api:3.0.1
|
||||
com.android.tools.build:gradle-api:3.2.1
|
||||
com.android.tools.build:gradle-api:3.5.4
|
||||
com.android.tools.build:gradle-api:3.5.3
|
||||
com.android.tools.build:gradle-api:4.1.0
|
||||
com.android.tools.build:gradle-api:7.0.4
|
||||
com.android.tools.build:gradle-api:7.2.1
|
||||
com.android.tools.build:gradle-api:7.3.1
|
||||
com.android.tools.build:gradle-api:7.4.2
|
||||
com.android.tools.build:gradle-api:8.1.1
|
||||
com.android.tools.build:gradle-core:1.3.1
|
||||
com.android.tools.build:gradle-core:1.5.0
|
||||
com.android.tools.build:gradle-core:3.0.0
|
||||
com.android.tools.build:gradle-core:3.0.1
|
||||
com.android.tools.build:gradle-settings-api:7.4.2
|
||||
com.android.tools.build:gradle-settings-api:8.1.1
|
||||
com.android.tools.build:gradle:1.3.1
|
||||
com.android.tools.build:gradle:1.5.0
|
||||
com.android.tools.build:gradle:3.0.0
|
||||
com.android.tools.build:gradle:3.0.1
|
||||
com.android.tools.build:gradle:3.2.1
|
||||
com.android.tools.build:gradle:3.5.4
|
||||
com.android.tools.build:gradle:3.5.3
|
||||
com.android.tools.build:gradle:4.1.0
|
||||
com.android.tools.build:gradle:7.0.4
|
||||
com.android.tools.build:gradle:7.2.1
|
||||
com.android.tools.build:gradle:7.3.1
|
||||
com.android.tools.build:manifest-merger:24.3.1
|
||||
com.android.tools.build:manifest-merger:24.5.0
|
||||
com.android.tools.build:manifest-merger:26.0.0
|
||||
com.android.tools.build:manifest-merger:26.0.1
|
||||
com.android.tools.build:manifest-merger:26.2.1
|
||||
com.android.tools.build:manifest-merger:26.5.4
|
||||
com.android.tools.build:manifest-merger:26.5.3
|
||||
com.android.tools.build:manifest-merger:27.1.0
|
||||
com.android.tools.build:manifest-merger:30.0.4
|
||||
com.android.tools.build:manifest-merger:30.2.1
|
||||
com.android.tools.build:manifest-merger:30.3.1
|
||||
com.android.tools.build:manifest-merger:30.4.2
|
||||
com.android.tools.build:manifest-merger:31.1.1
|
||||
com.android.tools.build:transform-api:1.5.0
|
||||
com.android.tools.build:transform-api:2.0.0-deprecated-use-gradle-api
|
||||
com.android.tools.ddms:ddmlib:24.3.1
|
||||
com.android.tools.ddms:ddmlib:24.5.0
|
||||
com.android.tools.ddms:ddmlib:26.0.0
|
||||
com.android.tools.ddms:ddmlib:26.0.1
|
||||
com.android.tools.ddms:ddmlib:26.2.1
|
||||
com.android.tools.ddms:ddmlib:26.5.4
|
||||
com.android.tools.ddms:ddmlib:26.5.3
|
||||
com.android.tools.ddms:ddmlib:27.1.0
|
||||
com.android.tools.ddms:ddmlib:30.0.4
|
||||
com.android.tools.ddms:ddmlib:30.2.1
|
||||
com.android.tools.ddms:ddmlib:30.3.1
|
||||
com.android.tools.ddms:ddmlib:30.4.2
|
||||
com.android.tools.external.com-intellij:intellij-core:26.0.0
|
||||
com.android.tools.ddms:ddmlib:31.1.1
|
||||
com.android.tools.external.com-intellij:intellij-core:26.0.1
|
||||
com.android.tools.external.lombok:lombok-ast:0.2.3
|
||||
com.android.tools.external.org-jetbrains:uast:26.0.0
|
||||
com.android.tools.external.org-jetbrains:uast:26.0.1
|
||||
com.android.tools.jack:jack-api:0.9.0
|
||||
com.android.tools.jill:jill-api:0.9.0
|
||||
com.android.tools.layoutlib:layoutlib-api:24.3.1
|
||||
com.android.tools.layoutlib:layoutlib-api:24.5.0
|
||||
com.android.tools.layoutlib:layoutlib-api:26.0.0
|
||||
com.android.tools.layoutlib:layoutlib-api:26.0.1
|
||||
com.android.tools.layoutlib:layoutlib-api:26.2.1
|
||||
com.android.tools.layoutlib:layoutlib-api:26.5.4
|
||||
com.android.tools.layoutlib:layoutlib-api:26.5.3
|
||||
com.android.tools.layoutlib:layoutlib-api:27.1.0
|
||||
com.android.tools.layoutlib:layoutlib-api:30.0.4
|
||||
com.android.tools.layoutlib:layoutlib-api:30.2.1
|
||||
com.android.tools.layoutlib:layoutlib-api:30.3.1
|
||||
com.android.tools.layoutlib:layoutlib-api:30.4.2
|
||||
com.android.tools.layoutlib:layoutlib-api:31.1.1
|
||||
com.android.tools.lint:lint-api:24.3.1
|
||||
com.android.tools.lint:lint-api:24.5.0
|
||||
com.android.tools.lint:lint-api:26.0.0
|
||||
com.android.tools.lint:lint-api:26.0.1
|
||||
com.android.tools.lint:lint-checks:24.3.1
|
||||
com.android.tools.lint:lint-checks:24.5.0
|
||||
com.android.tools.lint:lint-checks:26.0.0
|
||||
com.android.tools.lint:lint-checks:26.0.1
|
||||
com.android.tools.lint:lint-gradle-api:26.2.1
|
||||
com.android.tools.lint:lint-gradle-api:26.5.4
|
||||
com.android.tools.lint:lint-gradle-api:26.5.3
|
||||
com.android.tools.lint:lint-gradle-api:27.1.0
|
||||
com.android.tools.lint:lint-model:27.1.0
|
||||
com.android.tools.lint:lint-model:30.0.4
|
||||
com.android.tools.lint:lint-model:30.2.1
|
||||
com.android.tools.lint:lint-model:30.3.1
|
||||
com.android.tools.lint:lint-model:30.4.2
|
||||
com.android.tools.lint:lint-model:31.1.1
|
||||
com.android.tools.lint:lint-typedef-remover:30.2.1
|
||||
com.android.tools.lint:lint-typedef-remover:30.3.1
|
||||
com.android.tools.lint:lint-typedef-remover:30.4.2
|
||||
com.android.tools.lint:lint-typedef-remover:31.1.1
|
||||
com.android.tools.lint:lint:24.3.1
|
||||
com.android.tools.lint:lint:24.5.0
|
||||
com.android.tools.lint:lint:26.0.0
|
||||
com.android.tools.lint:lint:26.0.1
|
||||
com.android.tools.utp:android-device-provider-ddmlib-proto:30.2.1
|
||||
com.android.tools.utp:android-device-provider-ddmlib-proto:30.3.1
|
||||
com.android.tools.utp:android-device-provider-ddmlib-proto:30.4.2
|
||||
com.android.tools.utp:android-device-provider-ddmlib-proto:31.1.1
|
||||
com.android.tools.utp:android-device-provider-gradle-proto:30.0.4
|
||||
com.android.tools.utp:android-device-provider-gradle-proto:30.2.1
|
||||
com.android.tools.utp:android-device-provider-gradle-proto:30.3.1
|
||||
com.android.tools.utp:android-device-provider-gradle-proto:30.4.2
|
||||
com.android.tools.utp:android-device-provider-gradle-proto:31.1.1
|
||||
com.android.tools.utp:android-test-plugin-host-additional-test-output-proto:30.2.1
|
||||
com.android.tools.utp:android-test-plugin-host-additional-test-output-proto:30.3.1
|
||||
com.android.tools.utp:android-test-plugin-host-additional-test-output-proto:30.4.2
|
||||
com.android.tools.utp:android-test-plugin-host-additional-test-output-proto:31.1.1
|
||||
com.android.tools.utp:android-test-plugin-host-apk-installer-proto:31.1.1
|
||||
com.android.tools.utp:android-test-plugin-host-coverage-proto:30.2.1
|
||||
com.android.tools.utp:android-test-plugin-host-coverage-proto:30.3.1
|
||||
com.android.tools.utp:android-test-plugin-host-coverage-proto:30.4.2
|
||||
com.android.tools.utp:android-test-plugin-host-coverage-proto:31.1.1
|
||||
com.android.tools.utp:android-test-plugin-host-emulator-control-proto:31.1.1
|
||||
com.android.tools.utp:android-test-plugin-host-logcat-proto:31.1.1
|
||||
com.android.tools.utp:android-test-plugin-host-retention-proto:30.0.4
|
||||
com.android.tools.utp:android-test-plugin-host-retention-proto:30.2.1
|
||||
com.android.tools.utp:android-test-plugin-host-retention-proto:30.3.1
|
||||
com.android.tools.utp:android-test-plugin-host-retention-proto:30.4.2
|
||||
com.android.tools.utp:android-test-plugin-host-retention-proto:31.1.1
|
||||
com.android.tools.utp:android-test-plugin-result-listener-gradle-proto:30.0.4
|
||||
com.android.tools.utp:android-test-plugin-result-listener-gradle-proto:30.2.1
|
||||
com.android.tools.utp:android-test-plugin-result-listener-gradle-proto:30.3.1
|
||||
com.android.tools.utp:android-test-plugin-result-listener-gradle-proto:30.4.2
|
||||
com.android.tools.utp:android-test-plugin-result-listener-gradle-proto:31.1.1
|
||||
com.android.tools:annotations:24.3.1
|
||||
com.android.tools:annotations:24.5.0
|
||||
com.android.tools:annotations:26.0.0
|
||||
com.android.tools:annotations:26.0.1
|
||||
com.android.tools:annotations:26.2.1
|
||||
com.android.tools:annotations:26.5.4
|
||||
com.android.tools:annotations:26.5.3
|
||||
com.android.tools:annotations:27.1.0
|
||||
com.android.tools:annotations:30.0.4
|
||||
com.android.tools:annotations:30.2.1
|
||||
com.android.tools:annotations:30.3.1
|
||||
com.android.tools:annotations:30.4.2
|
||||
com.android.tools:annotations:31.1.1
|
||||
com.android.tools:common:24.3.1
|
||||
com.android.tools:common:24.5.0
|
||||
com.android.tools:common:26.0.0
|
||||
com.android.tools:common:26.0.1
|
||||
com.android.tools:common:26.2.1
|
||||
com.android.tools:common:26.5.4
|
||||
com.android.tools:common:26.5.3
|
||||
com.android.tools:common:27.1.0
|
||||
com.android.tools:common:30.0.4
|
||||
com.android.tools:common:30.2.1
|
||||
com.android.tools:common:30.3.1
|
||||
com.android.tools:common:30.4.2
|
||||
com.android.tools:common:31.1.1
|
||||
com.android.tools:dvlib:24.3.1
|
||||
com.android.tools:dvlib:24.5.0
|
||||
com.android.tools:dvlib:26.0.0
|
||||
com.android.tools:dvlib:26.0.1
|
||||
com.android.tools:dvlib:26.2.1
|
||||
com.android.tools:dvlib:26.5.4
|
||||
com.android.tools:dvlib:26.5.3
|
||||
com.android.tools:dvlib:27.1.0
|
||||
com.android.tools:dvlib:30.0.4
|
||||
com.android.tools:dvlib:30.2.1
|
||||
com.android.tools:dvlib:30.3.1
|
||||
com.android.tools:dvlib:30.4.2
|
||||
com.android.tools:repository:26.0.0
|
||||
com.android.tools:dvlib:31.1.1
|
||||
com.android.tools:repository:26.0.1
|
||||
com.android.tools:repository:26.2.1
|
||||
com.android.tools:repository:26.5.4
|
||||
com.android.tools:repository:26.5.3
|
||||
com.android.tools:repository:27.1.0
|
||||
com.android.tools:repository:30.0.4
|
||||
com.android.tools:repository:30.2.1
|
||||
com.android.tools:repository:30.3.1
|
||||
com.android.tools:repository:30.4.2
|
||||
com.android.tools:repository:31.1.1
|
||||
com.android.tools:sdklib:24.3.1
|
||||
com.android.tools:sdklib:24.5.0
|
||||
com.android.tools:sdklib:26.0.0
|
||||
com.android.tools:sdklib:26.0.1
|
||||
com.android.tools:sdklib:26.2.1
|
||||
com.android.tools:sdklib:26.5.4
|
||||
com.android.tools:sdklib:26.5.3
|
||||
com.android.tools:sdklib:27.1.0
|
||||
com.android.tools:sdklib:30.0.4
|
||||
com.android.tools:sdklib:30.2.1
|
||||
com.android.tools:sdklib:30.3.1
|
||||
com.android.tools:sdklib:30.4.2
|
||||
com.android.tools:sdklib:31.1.1
|
||||
com.android.tools:sdk-common:24.3.1
|
||||
com.android.tools:sdk-common:24.5.0
|
||||
com.android.tools:sdk-common:26.0.0
|
||||
com.android.tools:sdk-common:26.0.1
|
||||
com.android.tools:sdk-common:26.2.1
|
||||
com.android.tools:sdk-common:26.5.4
|
||||
com.android.tools:sdk-common:26.5.3
|
||||
com.android.tools:sdk-common:27.1.0
|
||||
com.android.tools:sdk-common:30.0.4
|
||||
com.android.tools:sdk-common:30.2.1
|
||||
com.android.tools:sdk-common:30.3.1
|
||||
com.android.tools:sdk-common:30.4.2
|
||||
com.android.tools:sdk-common:31.1.1
|
||||
com.android:signflinger:4.1.0
|
||||
com.android:signflinger:7.0.4
|
||||
com.android:signflinger:7.2.1
|
||||
com.android:signflinger:7.3.1
|
||||
com.android:signflinger:7.4.2
|
||||
com.android:signflinger:8.1.1
|
||||
com.android:zipflinger:4.1.0
|
||||
com.android:zipflinger:7.0.4
|
||||
com.android:zipflinger:7.2.1
|
||||
com.android:zipflinger:7.3.1
|
||||
com.android:zipflinger:7.4.2
|
||||
com.android:zipflinger:8.1.1
|
||||
com.diffplug.durian:durian-collect:1.2.0
|
||||
com.diffplug.durian:durian-core:1.2.0
|
||||
com.diffplug.durian:durian-io:1.2.0
|
||||
com.diffplug.spotless:spotless-lib-extra:2.26.2
|
||||
com.diffplug.spotless:spotless-lib-extra:2.30.0
|
||||
com.diffplug.spotless:spotless-lib:2.26.2
|
||||
com.diffplug.spotless:spotless-lib:2.30.0
|
||||
com.diffplug.spotless:spotless-plugin-gradle:6.7.2
|
||||
com.diffplug.spotless:spotless-plugin-gradle:6.11.0
|
||||
com.drewnoakes:metadata-extractor:2.18.0
|
||||
com.facebook.conceal:conceal:1.1.3
|
||||
com.facebook.fbjni:fbjni:0.3.0
|
||||
com.facebook.fbjni:fbjni:0.5.1
|
||||
com.facebook.fresco:animated-base:2.5.0
|
||||
com.facebook.fresco:animated-drawable:2.5.0
|
||||
com.facebook.fresco:animated-gif:2.5.0
|
||||
com.facebook.fresco:drawee:2.5.0
|
||||
com.facebook.fresco:drawee:3.1.3
|
||||
com.facebook.fresco:fbcore:2.5.0
|
||||
com.facebook.fresco:fbcore:3.1.3
|
||||
com.facebook.fresco:fresco:2.5.0
|
||||
com.facebook.fresco:fresco:3.1.3
|
||||
com.facebook.fresco:imagepipeline-base:2.5.0
|
||||
com.facebook.fresco:imagepipeline-base:3.1.3
|
||||
com.facebook.fresco:imagepipeline-native:2.5.0
|
||||
com.facebook.fresco:imagepipeline-okhttp3:2.5.0
|
||||
com.facebook.fresco:imagepipeline-native:3.1.3
|
||||
com.facebook.fresco:imagepipeline-okhttp3:3.1.3
|
||||
com.facebook.fresco:imagepipeline:2.5.0
|
||||
com.facebook.fresco:imagepipeline:3.1.3
|
||||
com.facebook.fresco:memory-type-ashmem:2.5.0
|
||||
com.facebook.fresco:memory-type-ashmem:3.1.3
|
||||
com.facebook.fresco:memory-type-java:2.5.0
|
||||
com.facebook.fresco:memory-type-java:3.1.3
|
||||
com.facebook.fresco:memory-type-native:2.5.0
|
||||
com.facebook.fresco:middleware:2.5.0
|
||||
com.facebook.fresco:memory-type-native:3.1.3
|
||||
com.facebook.fresco:middleware:3.1.3
|
||||
com.facebook.fresco:nativeimagefilters:2.5.0
|
||||
com.facebook.fresco:nativeimagefilters:3.1.3
|
||||
com.facebook.fresco:nativeimagetranscoder:2.5.0
|
||||
com.facebook.fresco:soloader:2.5.0
|
||||
com.facebook.fresco:ui-common:2.5.0
|
||||
com.facebook.fresco:nativeimagetranscoder:3.1.3
|
||||
com.facebook.fresco:soloader:3.1.3
|
||||
com.facebook.fresco:ui-common:3.1.3
|
||||
com.facebook.infer.annotation:infer-annotation:0.18.0
|
||||
com.facebook.react:hermes-android:0.72.5
|
||||
com.facebook.react:react-android:0.72.5
|
||||
com.facebook.react:hermes-android:0.73.5
|
||||
com.facebook.react:react-android:0.73.5
|
||||
com.facebook.soloader:annotation:0.10.5
|
||||
com.facebook.soloader:nativeloader:0.10.5
|
||||
com.facebook.soloader:soloader:0.10.5
|
||||
@@ -517,6 +517,7 @@ com.github.wix-playground:ahbottomnavigation:3.3.0
|
||||
com.github.wix-playground:reflow-animator:1.0.6
|
||||
com.github.yalantis:ucrop:2.2.6-native
|
||||
com.googlecode.concurrent-trees:concurrent-trees:2.6.1
|
||||
com.googlecode.javaewah:JavaEWAH:1.1.12
|
||||
com.googlecode.javaewah:JavaEWAH:1.1.13
|
||||
com.googlecode.json-simple:json-simple:1.1
|
||||
com.googlecode.juniversalchardet:juniversalchardet:1.0.3
|
||||
@@ -545,6 +546,7 @@ com.google.code.gson:gson:2.8.5
|
||||
com.google.code.gson:gson:2.8.6
|
||||
com.google.code.gson:gson:2.8.9
|
||||
com.google.crypto.tink:tink:1.3.0-rc2
|
||||
com.google.crypto.tink:tink:1.7.0
|
||||
com.google.dagger:dagger:2.28.3
|
||||
com.google.errorprone:error_prone_annotations:2.0.18
|
||||
com.google.errorprone:error_prone_annotations:2.2.0
|
||||
@@ -552,8 +554,8 @@ com.google.errorprone:error_prone_annotations:2.3.1
|
||||
com.google.errorprone:error_prone_annotations:2.3.2
|
||||
com.google.errorprone:error_prone_annotations:2.3.4
|
||||
com.google.errorprone:error_prone_annotations:2.4.0
|
||||
com.google.errorprone:error_prone_annotations:2.7.1
|
||||
com.google.errorprone:error_prone_annotations:2.9.0
|
||||
com.google.errorprone:error_prone_annotations:2.11.0
|
||||
com.google.firebase:firebase-annotations:16.0.0
|
||||
com.google.firebase:firebase-components:16.1.0
|
||||
com.google.firebase:firebase-encoders-json:17.1.0
|
||||
@@ -567,7 +569,7 @@ com.google.guava:guava:27.0.1-jre
|
||||
com.google.guava:guava:28.1-jre
|
||||
com.google.guava:guava:29.0-jre
|
||||
com.google.guava:guava:30.1-jre
|
||||
com.google.guava:guava:31.0.1-jre
|
||||
com.google.guava:guava:31.1-jre
|
||||
com.google.guava:listenablefuture:1.0
|
||||
com.google.guava:listenablefuture:9999.0-empty-to-avoid-conflict-with-guava
|
||||
com.google.j2objc:j2objc-annotations:1.1
|
||||
@@ -582,10 +584,12 @@ com.google.prefab:cli:2.0.0
|
||||
com.google.protobuf:protobuf-java-util:3.4.0
|
||||
com.google.protobuf:protobuf-java-util:3.10.0
|
||||
com.google.protobuf:protobuf-java-util:3.17.2
|
||||
com.google.protobuf:protobuf-java-util:3.19.3
|
||||
com.google.protobuf:protobuf-java:3.0.0
|
||||
com.google.protobuf:protobuf-java:3.4.0
|
||||
com.google.protobuf:protobuf-java:3.10.0
|
||||
com.google.protobuf:protobuf-java:3.17.2
|
||||
com.google.protobuf:protobuf-java:3.19.3
|
||||
com.google.testing.platform:core-proto:0.0.8-alpha04
|
||||
com.google.testing.platform:core-proto:0.0.8-alpha07
|
||||
com.google.testing.platform:core-proto:0.0.8-alpha08
|
||||
@@ -617,38 +621,56 @@ de.undercouch:gradle-download-task:4.1.1
|
||||
de.undercouch:gradle-download-task:5.0.1
|
||||
io.grpc:grpc-api:1.21.1
|
||||
io.grpc:grpc-api:1.39.0
|
||||
io.grpc:grpc-api:1.45.1
|
||||
io.grpc:grpc-context:1.21.1
|
||||
io.grpc:grpc-context:1.39.0
|
||||
io.grpc:grpc-context:1.45.1
|
||||
io.grpc:grpc-core:1.21.1
|
||||
io.grpc:grpc-core:1.39.0
|
||||
io.grpc:grpc-core:1.45.1
|
||||
io.grpc:grpc-netty:1.21.1
|
||||
io.grpc:grpc-netty:1.39.0
|
||||
io.grpc:grpc-netty:1.45.1
|
||||
io.grpc:grpc-protobuf-lite:1.21.1
|
||||
io.grpc:grpc-protobuf-lite:1.39.0
|
||||
io.grpc:grpc-protobuf-lite:1.45.1
|
||||
io.grpc:grpc-protobuf:1.21.1
|
||||
io.grpc:grpc-protobuf:1.39.0
|
||||
io.grpc:grpc-protobuf:1.45.1
|
||||
io.grpc:grpc-stub:1.21.1
|
||||
io.grpc:grpc-stub:1.39.0
|
||||
io.grpc:grpc-stub:1.45.1
|
||||
io.netty:netty-buffer:4.1.34.Final
|
||||
io.netty:netty-buffer:4.1.52.Final
|
||||
io.netty:netty-buffer:4.1.72.Final
|
||||
io.netty:netty-codec-http2:4.1.34.Final
|
||||
io.netty:netty-codec-http2:4.1.52.Final
|
||||
io.netty:netty-codec-http2:4.1.72.Final
|
||||
io.netty:netty-codec-http:4.1.34.Final
|
||||
io.netty:netty-codec-http:4.1.52.Final
|
||||
io.netty:netty-codec-http:4.1.72.Final
|
||||
io.netty:netty-codec-socks:4.1.34.Final
|
||||
io.netty:netty-codec-socks:4.1.52.Final
|
||||
io.netty:netty-codec-socks:4.1.72.Final
|
||||
io.netty:netty-codec:4.1.34.Final
|
||||
io.netty:netty-codec:4.1.52.Final
|
||||
io.netty:netty-codec:4.1.72.Final
|
||||
io.netty:netty-common:4.1.34.Final
|
||||
io.netty:netty-common:4.1.52.Final
|
||||
io.netty:netty-common:4.1.72.Final
|
||||
io.netty:netty-handler-proxy:4.1.34.Final
|
||||
io.netty:netty-handler-proxy:4.1.52.Final
|
||||
io.netty:netty-handler-proxy:4.1.72.Final
|
||||
io.netty:netty-handler:4.1.34.Final
|
||||
io.netty:netty-handler:4.1.52.Final
|
||||
io.netty:netty-handler:4.1.72.Final
|
||||
io.netty:netty-resolver:4.1.34.Final
|
||||
io.netty:netty-resolver:4.1.52.Final
|
||||
io.netty:netty-resolver:4.1.72.Final
|
||||
io.netty:netty-tcnative-classes:2.0.46.Final
|
||||
io.netty:netty-transport:4.1.34.Final
|
||||
io.netty:netty-transport:4.1.52.Final
|
||||
io.netty:netty-transport:4.1.72.Final
|
||||
io.opencensus:opencensus-api:0.21.0
|
||||
io.opencensus:opencensus-contrib-grpc-metrics:0.21.0
|
||||
io.perfmark:perfmark-api:0.23.0
|
||||
@@ -686,6 +708,7 @@ org.antlr:antlr:3.5.2
|
||||
org.apache.commons:commons-compress:1.8.1
|
||||
org.apache.commons:commons-compress:1.12
|
||||
org.apache.commons:commons-compress:1.20
|
||||
org.apache.commons:commons-compress:1.21
|
||||
org.apache.commons:commons-lang3:3.3.2
|
||||
org.apache.commons:commons-lang3:3.9
|
||||
org.apache.httpcomponents:httpclient:4.1.1
|
||||
@@ -700,6 +723,7 @@ org.apache.httpcomponents:httpcore:4.4.5
|
||||
org.apache.httpcomponents:httpcore:4.4.10
|
||||
org.apache.httpcomponents:httpcore:4.4.11
|
||||
org.apache.httpcomponents:httpcore:4.4.13
|
||||
org.apache.httpcomponents:httpcore:4.4.15
|
||||
org.apache.httpcomponents:httpmime:4.1
|
||||
org.apache.httpcomponents:httpmime:4.5.2
|
||||
org.apache.httpcomponents:httpmime:4.5.6
|
||||
@@ -717,16 +741,18 @@ org.checkerframework:checker-qual:2.8.1
|
||||
org.checkerframework:checker-qual:2.11.1
|
||||
org.checkerframework:checker-qual:3.5.0
|
||||
org.checkerframework:checker-qual:3.12.0
|
||||
org.codehaus.groovy:groovy-xml:3.0.9
|
||||
org.codehaus.groovy:groovy-xml:3.0.10
|
||||
org.codehaus.groovy:groovy:3.0.9
|
||||
org.codehaus.groovy:groovy:3.0.10
|
||||
org.codehaus.mojo:animal-sniffer-annotations:1.14
|
||||
org.codehaus.mojo:animal-sniffer-annotations:1.17
|
||||
org.codehaus.mojo:animal-sniffer-annotations:1.18
|
||||
org.codehaus.mojo:animal-sniffer-annotations:1.19
|
||||
org.codehaus.woodstox:stax2-api:4.2.1
|
||||
org.conscrypt:conscrypt-android:2.0.0
|
||||
org.eclipse.jdt.core.compiler:ecj:4.4.2
|
||||
org.eclipse.jdt.core.compiler:ecj:4.6.1
|
||||
org.eclipse.jgit:org.eclipse.jgit:5.13.0.202109080827-r
|
||||
org.eclipse.jgit:org.eclipse.jgit:5.13.1.202206130422-r
|
||||
org.fusesource.jansi:jansi:1.18
|
||||
org.glassfish.jaxb:jaxb-core:2.2.11
|
||||
@@ -738,23 +764,22 @@ org.glassfish.jaxb:txw2:2.3.1
|
||||
org.glassfish.jaxb:txw2:2.3.2
|
||||
org.hamcrest:hamcrest-core:1.3
|
||||
org.hamcrest:hamcrest:2.2
|
||||
org.jacoco:org.jacoco.agent:0.8.8
|
||||
org.jacoco:org.jacoco.ant:0.8.8
|
||||
org.jacoco:org.jacoco.core:0.7.4.201502262128
|
||||
org.jacoco:org.jacoco.core:0.8.8
|
||||
org.jacoco:org.jacoco.report:0.7.4.201502262128
|
||||
org.jacoco:org.jacoco.report:0.8.8
|
||||
org.jdom:jdom2:2.0.6
|
||||
org.jetbrains.dokka:dokka-core:1.4.32
|
||||
org.jetbrains.intellij.deps:trove4j:1.0.20181211
|
||||
org.jetbrains.intellij.deps:trove4j:1.0.20200330
|
||||
org.jetbrains.kotlinx:atomicfu:0.16.3
|
||||
org.jetbrains.kotlinx:kotlinx-coroutines-android:1.5.2
|
||||
org.jetbrains.kotlinx:kotlinx-coroutines-android:1.6.1
|
||||
org.jetbrains.kotlinx:kotlinx-coroutines-bom:1.6.1
|
||||
org.jetbrains.kotlinx:kotlinx-coroutines-core-jvm:1.4.1
|
||||
org.jetbrains.kotlinx:kotlinx-coroutines-core-jvm:1.5.0
|
||||
org.jetbrains.kotlinx:kotlinx-coroutines-core-jvm:1.5.2
|
||||
org.jetbrains.kotlinx:kotlinx-coroutines-core-jvm:1.6.1
|
||||
org.jetbrains.kotlinx:kotlinx-coroutines-core:1.4.1
|
||||
org.jetbrains.kotlinx:kotlinx-coroutines-core:1.5.2
|
||||
org.jetbrains.kotlinx:kotlinx-coroutines-core:1.6.1
|
||||
org.jetbrains.kotlin:kotlin-android-extensions:1.6.20
|
||||
org.jetbrains.kotlin:kotlin-android-extensions:1.9.0
|
||||
org.jetbrains.kotlin:kotlin-annotations-jvm:1.3.72
|
||||
@@ -794,7 +819,7 @@ org.jetbrains.kotlin:kotlin-reflect:1.3.72
|
||||
org.jetbrains.kotlin:kotlin-reflect:1.4.32
|
||||
org.jetbrains.kotlin:kotlin-reflect:1.5.31
|
||||
org.jetbrains.kotlin:kotlin-reflect:1.6.10
|
||||
org.jetbrains.kotlin:kotlin-reflect:1.7.10
|
||||
org.jetbrains.kotlin:kotlin-reflect:1.8.20-RC2
|
||||
org.jetbrains.kotlin:kotlin-scripting-common:1.6.20
|
||||
org.jetbrains.kotlin:kotlin-scripting-common:1.9.0
|
||||
org.jetbrains.kotlin:kotlin-scripting-compiler-embeddable:1.6.20
|
||||
@@ -810,7 +835,8 @@ org.jetbrains.kotlin:kotlin-stdlib-common:1.3.72
|
||||
org.jetbrains.kotlin:kotlin-stdlib-common:1.4.32
|
||||
org.jetbrains.kotlin:kotlin-stdlib-common:1.5.31
|
||||
org.jetbrains.kotlin:kotlin-stdlib-common:1.6.20
|
||||
org.jetbrains.kotlin:kotlin-stdlib-common:1.7.22
|
||||
org.jetbrains.kotlin:kotlin-stdlib-common:1.8.20-RC2
|
||||
org.jetbrains.kotlin:kotlin-stdlib-common:1.8.21
|
||||
org.jetbrains.kotlin:kotlin-stdlib-common:1.9.0
|
||||
org.jetbrains.kotlin:kotlin-stdlib-jdk7:1.2.71
|
||||
org.jetbrains.kotlin:kotlin-stdlib-jdk7:1.3.50
|
||||
@@ -818,14 +844,16 @@ org.jetbrains.kotlin:kotlin-stdlib-jdk7:1.3.72
|
||||
org.jetbrains.kotlin:kotlin-stdlib-jdk7:1.4.32
|
||||
org.jetbrains.kotlin:kotlin-stdlib-jdk7:1.5.31
|
||||
org.jetbrains.kotlin:kotlin-stdlib-jdk7:1.6.20
|
||||
org.jetbrains.kotlin:kotlin-stdlib-jdk7:1.7.22
|
||||
org.jetbrains.kotlin:kotlin-stdlib-jdk7:1.8.20-RC2
|
||||
org.jetbrains.kotlin:kotlin-stdlib-jdk7:1.8.21
|
||||
org.jetbrains.kotlin:kotlin-stdlib-jdk7:1.9.0
|
||||
org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.2.71
|
||||
org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.3.50
|
||||
org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.3.72
|
||||
org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.4.32
|
||||
org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.5.31
|
||||
org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.7.22
|
||||
org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.8.20-RC2
|
||||
org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.8.21
|
||||
org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.9.0
|
||||
org.jetbrains.kotlin:kotlin-stdlib:1.1.3-2
|
||||
org.jetbrains.kotlin:kotlin-stdlib:1.2.71
|
||||
@@ -834,7 +862,8 @@ org.jetbrains.kotlin:kotlin-stdlib:1.3.72
|
||||
org.jetbrains.kotlin:kotlin-stdlib:1.4.32
|
||||
org.jetbrains.kotlin:kotlin-stdlib:1.5.31
|
||||
org.jetbrains.kotlin:kotlin-stdlib:1.6.20
|
||||
org.jetbrains.kotlin:kotlin-stdlib:1.7.22
|
||||
org.jetbrains.kotlin:kotlin-stdlib:1.8.20-RC2
|
||||
org.jetbrains.kotlin:kotlin-stdlib:1.8.21
|
||||
org.jetbrains.kotlin:kotlin-stdlib:1.9.0
|
||||
org.jetbrains.kotlin:kotlin-tooling-core:1.9.0
|
||||
org.jetbrains.kotlin:kotlin-tooling-metadata:1.6.20
|
||||
@@ -906,8 +935,12 @@ com.squareup.okio:okio:1.13.0
|
||||
com.squareup.okio:okio:1.15.0
|
||||
com.squareup.okhttp3:okhttp:3.12.1
|
||||
org.jetbrains.kotlin.jvm:org.jetbrains.kotlin.jvm.gradle.plugin:1.7.22
|
||||
com.android.tools.lint:lint-gradle:30.4.2
|
||||
com.android.tools.build:gradle:7.4.2
|
||||
com.android.tools.build:aapt2:7.4.2-8841542
|
||||
org.jetbrains.kotlinx:kotlinx-coroutines-core:1.5.2
|
||||
org.jetbrains.kotlin.jvm:org.jetbrains.kotlin.jvm.gradle.plugin:1.9.0
|
||||
org.jetbrains.kotlin.jvm:org.jetbrains.kotlin.jvm.gradle.plugin:1.9.0
|
||||
org.gradle.toolchains.foojay-resolver-convention:org.gradle.toolchains.foojay-resolver-convention.gradle.plugin:0.5.0
|
||||
org.jetbrains.kotlin.jvm:org.jetbrains.kotlin.jvm.gradle.plugin:1.8.0
|
||||
com.android.tools.build:gradle:8.1.1
|
||||
com.google.errorprone:error_prone_annotations:2.7.1
|
||||
com.android.tools.lint:lint-gradle:31.1.1
|
||||
org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.8.0
|
||||
com.android.tools.build:gradle:3.5.4
|
||||
+277
-156
File diff suppressed because it is too large
Load Diff
@@ -47,11 +47,15 @@ com.squareup.okio:okio:1.13.0
|
||||
com.squareup.okio:okio:1.15.0
|
||||
com.squareup.okhttp3:okhttp:3.12.1
|
||||
org.jetbrains.kotlin.jvm:org.jetbrains.kotlin.jvm.gradle.plugin:1.7.22
|
||||
com.android.tools.lint:lint-gradle:30.4.2
|
||||
com.android.tools.build:gradle:7.4.2
|
||||
com.android.tools.build:aapt2:7.4.2-8841542
|
||||
org.jetbrains.kotlinx:kotlinx-coroutines-core:1.5.2
|
||||
org.jetbrains.kotlin.jvm:org.jetbrains.kotlin.jvm.gradle.plugin:1.9.0' \
|
||||
org.jetbrains.kotlin.jvm:org.jetbrains.kotlin.jvm.gradle.plugin:1.9.0
|
||||
org.gradle.toolchains.foojay-resolver-convention:org.gradle.toolchains.foojay-resolver-convention.gradle.plugin:0.5.0
|
||||
org.jetbrains.kotlin.jvm:org.jetbrains.kotlin.jvm.gradle.plugin:1.8.0
|
||||
com.android.tools.build:gradle:8.1.1
|
||||
com.google.errorprone:error_prone_annotations:2.7.1
|
||||
com.android.tools.lint:lint-gradle:31.1.1
|
||||
org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.8.0
|
||||
com.android.tools.build:gradle:3.5.4' \
|
||||
>> "${DEPS_LIST}"
|
||||
}
|
||||
|
||||
|
||||
@@ -6,8 +6,8 @@ react-native-blob-util
|
||||
react-native-blur
|
||||
react-native-camera-kit
|
||||
react-native-camera-roll_camera-roll
|
||||
react-native-clipboard_clipboard
|
||||
react-native-community_audio-toolkit
|
||||
react-native-community_clipboard
|
||||
react-native-community_masked-view
|
||||
react-native-community_netinfo
|
||||
react-native-community_slider
|
||||
@@ -16,20 +16,17 @@ react-native-dialogs
|
||||
react-native-fast-image
|
||||
react-native-fs
|
||||
react-native-gesture-handler
|
||||
react-native-haptic-feedback
|
||||
react-native-get-random-values
|
||||
react-native-hole-view
|
||||
react-native-image-crop-picker
|
||||
react-native-image-resizer
|
||||
react-native-keychain
|
||||
react-native-languages
|
||||
react-native-linear-gradient
|
||||
react-native-lottie-splash-screen
|
||||
react-native-mail
|
||||
react-native-navigation
|
||||
react-native-nfc-manager
|
||||
react-native-orientation-locker
|
||||
react-native-permissions
|
||||
react-native-randombytes
|
||||
react-native-reanimated
|
||||
react-native-shake
|
||||
react-native-share
|
||||
@@ -39,3 +36,4 @@ react-native-status-keycard
|
||||
react-native-svg
|
||||
react-native-transparent-video
|
||||
react-native-webview
|
||||
walletconnect_react-native-compat
|
||||
|
||||
@@ -4,15 +4,16 @@
|
||||
|
||||
{ stdenv, deps, nodejs, patchMavenSources }:
|
||||
|
||||
let
|
||||
patchesDir = ./../../../patches;
|
||||
patches = builtins.attrNames (builtins.readDir patchesDir);
|
||||
in
|
||||
stdenv.mkDerivation {
|
||||
name = "${deps.nodejs.name}-patched";
|
||||
phases = [
|
||||
"unpackPhase"
|
||||
"patchGradlePhase"
|
||||
"patchBuildIdPhase"
|
||||
"patchKeyChainPhase"
|
||||
"patchGlogPhase"
|
||||
"patchBoostPodSpec"
|
||||
"patchNodeLibsPhase"
|
||||
"installPhase"
|
||||
];
|
||||
|
||||
@@ -49,41 +50,15 @@ stdenv.mkDerivation {
|
||||
done
|
||||
'';
|
||||
|
||||
# Do not add a BuildId to the generated libraries, for reproducibility
|
||||
patchBuildIdPhase = ''
|
||||
substituteInPlace ./node_modules/react-native/ReactAndroid/src/main/jni/CMakeLists.txt --replace \
|
||||
'-Wl,--build-id' \
|
||||
'-Wl,--build-id=none'
|
||||
'';
|
||||
|
||||
installPhase = ''
|
||||
mkdir -p $out
|
||||
cp -R node_modules $out/
|
||||
'';
|
||||
|
||||
# Remove gradle-test-logger-plugin:
|
||||
# https://github.com/oblador/react-native-keychain/issues/595
|
||||
# TODO: remove this patch when we this library fixes above issue
|
||||
patchKeyChainPhase = ''
|
||||
sed -i -e '/classpath/d' \
|
||||
-e '/apply plugin: "com\.adarshr\.test-logger"/d' \
|
||||
./node_modules/react-native-keychain/android/build.gradle
|
||||
'';
|
||||
|
||||
# Fix pod issue after upgrading to MacOS Sonoma and Xcode 15
|
||||
# https://github.com/status-im/status-mobile/issues/17682
|
||||
patchGlogPhase = ''
|
||||
substituteInPlace ./node_modules/react-native/scripts/ios-configure-glog.sh \
|
||||
--replace 'export CC="' '#export CC="' \
|
||||
--replace 'export CXX="' '#export CXX="'
|
||||
'';
|
||||
|
||||
# to fix pod checksum issue : https://github.com/facebook/react-native/issues/42180
|
||||
# TODO remove this patch after upgrading to react-native 0.73.2
|
||||
patchBoostPodSpec = ''
|
||||
substituteInPlace ./node_modules/react-native/third-party-podspecs/boost.podspec \
|
||||
--replace 'https://boostorg.jfrog.io/artifactory/main/release/1.76.0/source/boost_1_76_0.tar.bz2' \
|
||||
'https://sourceforge.net/projects/boost/files/boost/1.76.0/boost_1_76_0.tar.bz2' \
|
||||
patchNodeLibsPhase = ''
|
||||
for patch in ${toString patches}; do
|
||||
patch -p1 < ${patchesDir}/$patch
|
||||
done
|
||||
'';
|
||||
|
||||
# The ELF types are incompatible with the host platform, so let's not even try
|
||||
|
||||
@@ -27,7 +27,6 @@ deps node_modules
|
||||
> ls node_modules | grep react-native-image
|
||||
react-native-image-crop-picker
|
||||
react-native-image-resizer
|
||||
react-native-image-viewing
|
||||
```
|
||||
|
||||
# Known Issues
|
||||
|
||||
@@ -26,9 +26,10 @@
|
||||
|
||||
let
|
||||
inherit (lib) toLower optionalString stringLength makeLibraryPath elem;
|
||||
notDebug = (buildType != "debug");
|
||||
|
||||
# Pass secretsFile for POKT_TOKEN to jsbundle build
|
||||
builtJsBundle = jsbundle { inherit secretsFile; };
|
||||
builtJsBundle = lib.optionals notDebug jsbundle { inherit secretsFile; };
|
||||
|
||||
# Map ANDROID_ABI_INCLUDE to status-go targets
|
||||
androidAbiIncludeSplit = lib.splitString ";" androidAbiInclude;
|
||||
@@ -119,8 +120,10 @@ in stdenv.mkDerivation rec {
|
||||
# Export all vars from .env file
|
||||
export $(cut -d= -f1 .env)
|
||||
|
||||
${lib.optionalString notDebug ''
|
||||
# Symlink React Native entrypoint.
|
||||
cp -Lr ${builtJsBundle} ./result
|
||||
''}
|
||||
|
||||
# Copy android/ directory
|
||||
mkdir -p ./android/build
|
||||
@@ -153,6 +156,7 @@ in stdenv.mkDerivation rec {
|
||||
--no-scan \
|
||||
--no-watch-fs \
|
||||
--no-build-cache \
|
||||
--parallel \
|
||||
-Dmaven.repo.local='${deps.gradle}' \
|
||||
assemble${gradleBuildType}
|
||||
'';
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
{ lib, stdenv, callPackage, mkShell,
|
||||
bundlerEnv, cocoapods, bundler, ruby, curl }:
|
||||
bundlerEnv, cocoapods, bundler, ruby, curl, clang }:
|
||||
|
||||
let
|
||||
inherit (lib) optionals optionalString unique;
|
||||
@@ -14,7 +14,7 @@ let
|
||||
|
||||
inherit (fastlane) shellHook;
|
||||
|
||||
buildInputs = [ ruby bundler fastlane curl ]
|
||||
buildInputs = [ ruby bundler fastlane curl clang ]
|
||||
++ optionals stdenv.isDarwin [ cocoapods ];
|
||||
in {
|
||||
# HELPERS
|
||||
|
||||
@@ -7,6 +7,8 @@ let
|
||||
manifestLock = "ios/Pods/Manifest.lock";
|
||||
in mkShell {
|
||||
buildInputs = [ cocoapods ];
|
||||
# https://github.com/reactwg/react-native-new-architecture/blob/main/docs/enable-apps.md#enable-new-architecture-for-ios
|
||||
RCT_NEW_ARCH_ENABLED = 1;
|
||||
shellHook = ''
|
||||
pushd "$STATUS_MOBILE_HOME" > /dev/null
|
||||
{
|
||||
|
||||
+15
-12
@@ -56,19 +56,24 @@ in {
|
||||
ruby = super.ruby_3_1;
|
||||
yarn = super.yarn.override { nodejs = super.nodejs-18_x; };
|
||||
openjdk = super.openjdk11_headless;
|
||||
xcodeWrapper = super.xcodeenv.composeXcodeWrapper {
|
||||
version = "15.0";
|
||||
allowHigher = true;
|
||||
xcodeWrapper = callPackage ./pkgs/xcodeenv/compose-xcodewrapper.nix { } {
|
||||
versions = ["15.1"];
|
||||
};
|
||||
go = super.go_1_19;
|
||||
go = super.go_1_20;
|
||||
clang = super.clang_15;
|
||||
buildGoPackage = super.buildGo119Package;
|
||||
buildGoModule = super.buildGo119Module;
|
||||
buildGoPackage = super.buildGo120Package;
|
||||
buildGoModule = super.buildGo120Module;
|
||||
gomobile = (super.gomobile.overrideAttrs (old: {
|
||||
patches = self.fetchurl { # https://github.com/golang/mobile/pull/84
|
||||
url = "https://github.com/golang/mobile/commit/f20e966e05b8f7e06bed500fa0da81cf6ebca307.patch";
|
||||
sha256 = "sha256-TZ/Yhe8gMRQUZFAs9G5/cf2b9QGtTHRSObBFD5Pbh7Y=";
|
||||
};
|
||||
patches = [
|
||||
(self.fetchurl { # https://github.com/golang/mobile/pull/84
|
||||
url = "https://github.com/golang/mobile/commit/f20e966e05b8f7e06bed500fa0da81cf6ebca307.patch";
|
||||
sha256 = "sha256-TZ/Yhe8gMRQUZFAs9G5/cf2b9QGtTHRSObBFD5Pbh7Y=";
|
||||
})
|
||||
(self.fetchurl { # https://github.com/golang/go/issues/58426
|
||||
url = "https://github.com/golang/mobile/commit/406ed3a7b8e44dc32844953647b49696d8847d51.patch";
|
||||
sha256 = "sha256-dqbYukHkQEw8npOkKykOAzMC3ot/Y4DEuh7fE+ptlr8=";
|
||||
})
|
||||
];
|
||||
})).override {
|
||||
# FIXME: No Android SDK packages for aarch64-darwin.
|
||||
withAndroidPkgs = stdenv.system != "aarch64-darwin";
|
||||
@@ -84,6 +89,4 @@ in {
|
||||
aapt2 = callPackage ./pkgs/aapt2 { };
|
||||
patchMavenSources = callPackage ./pkgs/patch-maven-srcs { };
|
||||
goMavenResolver = callPackage ./pkgs/go-maven-resolver { };
|
||||
xcbeautify = callPackage ./pkgs/xcbeautify { };
|
||||
idb-companion = callPackage ./pkgs/idb-companion { };
|
||||
}
|
||||
|
||||
+4
-3
@@ -6,10 +6,11 @@ let
|
||||
# For testing local version of nixpkgs
|
||||
#nixpkgsSrc = (import <nixpkgs> { }).lib.cleanSource "/home/jakubgs/work/nixpkgs";
|
||||
|
||||
# We follow the master branch of official nixpkgs.
|
||||
# We follow release 23-11 of nixpkgs
|
||||
# https://github.com/NixOS/nixpkgs/releases/tag/23.11
|
||||
nixpkgsSrc = builtins.fetchTarball {
|
||||
url = "https://github.com/NixOS/nixpkgs/archive/e7603eba51f2c7820c0a182c6bbb351181caa8e7.tar.gz";
|
||||
sha256 = "sha256:0mwck8jyr74wh1b7g6nac1mxy6a0rkppz8n12andsffybsipz5jw";
|
||||
url = "https://github.com/NixOS/nixpkgs/archive/224fd9a362487ab2894dac0df161c84ab1d8880b.tar.gz";
|
||||
sha256 = "sha256:1syvl39pi1h8lf5gkd9h7ksn5hp34cj7pa3abr59217kv0bdklhy";
|
||||
};
|
||||
|
||||
# Status specific configuration defaults
|
||||
|
||||
@@ -10,7 +10,7 @@ let
|
||||
|
||||
pname = "aapt2";
|
||||
# Warning: This must be the same as gradlePluginVersion android/gradle.properties
|
||||
version = "7.4.2-8841542";
|
||||
version = "8.1.1-10154469";
|
||||
|
||||
pkgPath = "com/android/tools/build/aapt2";
|
||||
repoUrl = "https://dl.google.com/dl/android/maven2";
|
||||
@@ -29,20 +29,20 @@ let
|
||||
jar = fetchurl {
|
||||
url = "${repoUrl}/${pkgPath}/${version}/${filenames.jar}";
|
||||
sha256 = getAttr platform {
|
||||
linux = "sha256-bHKE8i7QbE0UFgn1TW4gzPj7MBV7t/PVo+Txd6jW0wE=";
|
||||
osx = "sha256-Gmm9dnu2+OccqfqsUiKeanc4FNNkk7lCO0YAoxACjl0=";
|
||||
linux = "sha256-p54GGvEfAo0yk8euVO7QTu/c3zuityZhyGdhFSV6w+E=";
|
||||
osx = "sha256-bO4ljdUEfbuns7EyT1FKGLqNGz+0bms5XsplXvzD2T0=";
|
||||
};
|
||||
};
|
||||
sha = fetchurl {
|
||||
url = "${repoUrl}/${pkgPath}/${version}/${filenames.jar}.sha1";
|
||||
sha256 = getAttr platform {
|
||||
linux = "sha256-mSbHKU3snj5NTg3MN37pmVnVnYRKI9yoMVNJGuUXTso=";
|
||||
osx = "sha256-V/t81ELdzRFoMPSD8wSgbtdQgmUkkOdqRu2iqKIeNVg=";
|
||||
linux = "sha256-oUJOQ9j/sJ7Yt0V9WOrRmuqYI+2UWZxeefJ/WyNoWgw=";
|
||||
osx = "sha256-w+q2j4MKtIOihPMaJxuIP9IwXvRIyBxgRIJLox4E7ac=";
|
||||
};
|
||||
};
|
||||
pom = fetchurl {
|
||||
url = "${repoUrl}/${pkgPath}/${version}/${filenames.pom}";
|
||||
sha256 = "sha256-9gY2kGJqgVcd1T3UOzYM+xoPug/eGBRUF+cA6Fu9ZRw=";
|
||||
sha256 = "sha256-UdUGCoMmEfJxBS2demYKGdG4lzd2DqQbDUCHt/h7Ohg=";
|
||||
};
|
||||
};
|
||||
|
||||
|
||||
@@ -14,8 +14,9 @@ androidenv.composeAndroidPackages {
|
||||
cmdLineToolsVersion = "9.0";
|
||||
toolsVersion = "26.1.1";
|
||||
platformToolsVersion = "33.0.3";
|
||||
buildToolsVersions = [ "33.0.0" ];
|
||||
platformVersions = [ "33" ];
|
||||
buildToolsVersions = [ "34.0.0" ];
|
||||
platformVersions = [ "34" ];
|
||||
# This version must match cmake version inside android/app/build.gradle
|
||||
cmakeVersions = [ "3.22.1" ];
|
||||
ndkVersion = "25.2.9519653";
|
||||
includeNDK = true;
|
||||
|
||||
@@ -1,29 +0,0 @@
|
||||
{ stdenv, fetchurl, lib }:
|
||||
|
||||
stdenv.mkDerivation rec {
|
||||
pname = "idb-companion";
|
||||
version = "1.1.8";
|
||||
|
||||
src = fetchurl {
|
||||
url = "https://github.com/facebook/idb/releases/download/v${version}/idb-companion.universal.tar.gz";
|
||||
sha256 = "sha256-O3LMappbGiKhiCBahAkNOilDR6hGGA79dVzxo8hI4+c=";
|
||||
};
|
||||
|
||||
buildInputs = [ ];
|
||||
|
||||
unpackPhase = ''
|
||||
tar -xzf $src
|
||||
'';
|
||||
|
||||
installPhase = ''
|
||||
mkdir -p $out/bin
|
||||
cp -r ./* $out/bin/
|
||||
'';
|
||||
|
||||
meta = with lib; {
|
||||
description = "A powerful command line tool for automating iOS simulators and devices";
|
||||
homepage = "https://github.com/facebook/idb";
|
||||
license = licenses.mit;
|
||||
platforms = platforms.darwin;
|
||||
};
|
||||
}
|
||||
@@ -1,35 +0,0 @@
|
||||
{ stdenv, fetchurl, unzip, lib }:
|
||||
|
||||
let
|
||||
inherit (lib) getAttr;
|
||||
in
|
||||
stdenv.mkDerivation rec {
|
||||
pname = "xcbeautify";
|
||||
version = "1.1.1";
|
||||
arch = if stdenv.hostPlatform.isAarch64 then "arm64" else "x86_64";
|
||||
|
||||
src = fetchurl {
|
||||
url = "https://github.com/tuist/xcbeautify/releases/download/${version}/xcbeautify-${version}-${arch}-apple-macosx.zip";
|
||||
sha256 = getAttr arch {
|
||||
arm64 = "sha256-VaZBWZNx5iZxjpsVbKQA4wVsigjlhArDCsQXY/RBDx4=";
|
||||
x86_64 = "sha256-Q1t4nHQu05mPqNRmL0KQukGRAHdkQHM7H24ar0isQTo=";
|
||||
};
|
||||
};
|
||||
|
||||
buildInputs = [ unzip ];
|
||||
|
||||
unpackPhase = ''
|
||||
unzip $src
|
||||
'';
|
||||
|
||||
installPhase = ''
|
||||
install -D xcbeautify $out/bin/xcbeautify
|
||||
'';
|
||||
|
||||
meta = with lib; {
|
||||
description = "A little beautifier tool for xcodebuild";
|
||||
homepage = "https://github.com/tuist/xcbeautify";
|
||||
license = licenses.mit;
|
||||
platforms = platforms.darwin;
|
||||
};
|
||||
}
|
||||
@@ -0,0 +1,50 @@
|
||||
{ stdenv, lib, writeShellScriptBin }:
|
||||
{ versions ? [ "15.1" ]
|
||||
, xcodeBaseDir ? "/Applications/Xcode.app" }:
|
||||
|
||||
assert stdenv.isDarwin;
|
||||
|
||||
let
|
||||
xcodebuildPath = "${xcodeBaseDir}/Contents/Developer/usr/bin/xcodebuild";
|
||||
|
||||
xcodebuildWrapper = writeShellScriptBin "xcodebuild" ''
|
||||
currentVer="$(${xcodebuildPath} -version | awk 'NR==1{print $2}')"
|
||||
wrapperVers=(${lib.concatStringsSep " " versions})
|
||||
|
||||
for ver in "''${wrapperVers[@]}"; do
|
||||
if [[ "$currentVer" == "$ver" ]]; then
|
||||
# here exec replaces the shell without creating a new process
|
||||
# https://www.gnu.org/software/bash/manual/bash.html#index-exec
|
||||
exec "${xcodebuildPath}" "$@"
|
||||
fi
|
||||
done
|
||||
|
||||
echo "The installed Xcode version ($currentVer) does not match any of the allowed versions: ${lib.concatStringsSep ", " versions}"
|
||||
echo "Please update your local Xcode installation to match one of the allowed versions"
|
||||
exit 1
|
||||
'';
|
||||
in
|
||||
stdenv.mkDerivation {
|
||||
pname = "xcode-wrapper-plus";
|
||||
version = lib.concatStringsSep "," versions;
|
||||
# Fails in sandbox. Use `--option sandbox relaxed` or `--option sandbox false`.
|
||||
__noChroot = true;
|
||||
buildCommand = ''
|
||||
mkdir -p $out/bin
|
||||
cd $out/bin
|
||||
ln -s "${xcodebuildWrapper}/bin/xcode-select"
|
||||
ln -s /usr/bin/security
|
||||
ln -s /usr/bin/codesign
|
||||
ln -s /usr/bin/xcrun
|
||||
ln -s /usr/bin/plutil
|
||||
ln -s /usr/bin/clang
|
||||
ln -s /usr/bin/lipo
|
||||
ln -s /usr/bin/file
|
||||
ln -s /usr/bin/rev
|
||||
ln -s "${xcodebuildWrapper}/bin/xcodebuild"
|
||||
ln -s "${xcodeBaseDir}/Contents/Developer/Applications/Simulator.app/Contents/MacOS/Simulator"
|
||||
|
||||
cd ..
|
||||
ln -s "${xcodeBaseDir}/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs"
|
||||
'';
|
||||
}
|
||||
@@ -27,6 +27,7 @@ nix_install_type() {
|
||||
if [[ "$(os_name)" =~ NixOS ]]; then
|
||||
echo "nixos"
|
||||
else
|
||||
USER=$(id -un) # Missing in Docker.
|
||||
case "${NIX_STORE_DIR_GROUP}" in
|
||||
"nixbld") echo "multi";;
|
||||
"30000") echo "multi";;
|
||||
|
||||
@@ -53,14 +53,6 @@ copyNodeModules() {
|
||||
|
||||
# Find files that were modified and should cause a re-copying of node modules.
|
||||
# Some files are generated/modified by build processes and should be ignored.
|
||||
#
|
||||
# react-native/ReactCommon/react/renderer/components/rncore/*
|
||||
# generated at runtime by react-native
|
||||
# related code https://github.com/facebook/react-native/blob/v0.72.5/packages/react-native/ReactCommon/React-rncore.podspec#L19
|
||||
#
|
||||
# react-native-config/ios/ReactNativeConfig/GeneratedDotEnv.m
|
||||
# generated at runtime by react-native-config
|
||||
# related code https://github.com/lugg/react-native-config/blob/v1.5.0/react-native-config.podspec#L52
|
||||
findFilesNewerThan() {
|
||||
local sentinel="${1}"
|
||||
local dir="${2}"
|
||||
@@ -69,8 +61,14 @@ findFilesNewerThan() {
|
||||
-not -ipath "*/*android/build/*" -prune \
|
||||
-not -ipath "*/xcuserdata/*" -prune \
|
||||
-not -ipath "*/scripts/.packager.env" \
|
||||
\ # generated at runtime by react-native \
|
||||
\ # related code https://github.com/facebook/react-native/blob/v0.72.5/packages/react-native/ReactCommon/React-rncore.podspec#L19 \
|
||||
-not -path "*/node_modules/react-native/ReactCommon/react/renderer/components/rncore/*" \
|
||||
\ # generated at runtime by react-native-config \
|
||||
\ # related code https://github.com/lugg/react-native-config/blob/v1.5.0/react-native-config.podspec#L52 \
|
||||
-not -path "*/node_modules/react-native-config/ios/ReactNativeConfig/GeneratedDotEnv.m" \
|
||||
\ # generated at runtime by react-native from v0.73.x onwards \
|
||||
-not -path "*/node_modules/react-native/React/Fabric/*" \
|
||||
-print
|
||||
}
|
||||
|
||||
|
||||
@@ -11,6 +11,12 @@ buildGoPackage {
|
||||
|
||||
phases = ["unpackPhase" "configurePhase" "buildPhase"];
|
||||
|
||||
# https://pkg.go.dev/net#hdr-Name_Resolution
|
||||
# https://github.com/status-im/status-mobile/issues/19736
|
||||
# https://github.com/status-im/status-mobile/issues/19581
|
||||
# TODO: try removing when go is upgraded to 1.22
|
||||
GODEBUG = "netdns=cgo+2";
|
||||
|
||||
preBuild = ''
|
||||
pushd go/src/$goPackagePath
|
||||
go run cmd/library/*.go > $NIX_BUILD_TOP/main.go
|
||||
|
||||
@@ -38,10 +38,15 @@ in buildGoPackage {
|
||||
# Ensure XCode is present for iOS, instead of failing at the end of the build.
|
||||
preConfigure = optionalString isIOS enforceXCodeAvailable;
|
||||
|
||||
# https://pkg.go.dev/net#hdr-Name_Resolution
|
||||
# https://github.com/status-im/status-mobile/issues/19736
|
||||
# https://github.com/status-im/status-mobile/issues/19581
|
||||
# TODO: try removing when go is upgraded to 1.22
|
||||
GODEBUG = "netdns=cgo+2";
|
||||
|
||||
buildPhase = ''
|
||||
runHook preBuild
|
||||
echo -e "\nBuilding $pname for: ${concatStringsSep "," targets}"
|
||||
|
||||
gomobile bind \
|
||||
${concatStringsSep " " goBuildFlags} \
|
||||
-ldflags="$ldflags" \
|
||||
|
||||
+26
-33
@@ -8,24 +8,27 @@
|
||||
"preinstall": "scripts/check-nix-shell.sh && make status-go-library"
|
||||
},
|
||||
"dependencies": {
|
||||
"@babel/preset-typescript": "^7.17.12",
|
||||
"@ethersproject/shims": "^5.7.0",
|
||||
"@json-rpc-tools/utils": "^1.7.6",
|
||||
"@react-native-async-storage/async-storage": "1.19.3",
|
||||
"@react-native-camera-roll/camera-roll": "git+https://github.com/status-im/react-native-camera-roll.git#refs/tags/v5.1.1.1",
|
||||
"@react-native-camera-roll/camera-roll": "7.5.2",
|
||||
"@react-native-clipboard/clipboard": "1.13.2",
|
||||
"@react-native-community/audio-toolkit": "git+https://github.com/tbenr/react-native-audio-toolkit.git#refs/tags/v2.0.3-status-v6",
|
||||
"@react-native-community/blur": "git+https://github.com/status-im/react-native-blur.git#refs/tags/v4.3.3-status",
|
||||
"@react-native-community/clipboard": "^1.2.2",
|
||||
"@react-native-community/blur": "4.4.0",
|
||||
"@react-native-community/hooks": "^3.0.0",
|
||||
"@react-native-community/masked-view": "^0.1.6",
|
||||
"@react-native-community/netinfo": "^4.4.0",
|
||||
"@react-native-community/push-notification-ios": "^1.4.1",
|
||||
"@react-native-community/slider": "^3.0.0",
|
||||
"@react-native/metro-config": "^0.72.9",
|
||||
"@walletconnect/react-native-compat": "^2.12.2",
|
||||
"@walletconnect/web3wallet": "^1.11.2",
|
||||
"base-64": "^1.0.0",
|
||||
"bignumber.js": "git+https://github.com/status-im/bignumber.js.git#refs/tags/v4.0.2-status",
|
||||
"chance": "^1.1.0",
|
||||
"create-react-class": "^15.6.2",
|
||||
"emojilib": "^2.4.0",
|
||||
"eth-phishing-detect": "^1.2.0",
|
||||
"ethers": "5.7.2",
|
||||
"fast-text-encoding": "^1.0.6",
|
||||
"form-data": "^4.0.0",
|
||||
"functional-red-black-tree": "^1.0.1",
|
||||
"i18n-js": "^3.3.0",
|
||||
@@ -33,44 +36,39 @@
|
||||
"node-libs-react-native": "^1.2.1",
|
||||
"react": "18.2.0",
|
||||
"react-dom": "18.0.0",
|
||||
"react-native": "0.72.5",
|
||||
"react-native": "0.73.5",
|
||||
"react-native-background-timer": "^2.1.1",
|
||||
"react-native-biometrics": "^3.0.1",
|
||||
"react-native-blob-util": "^0.13.18",
|
||||
"react-native-camera-kit": "14.0.0-beta13",
|
||||
"react-native-config": "^1.5.0",
|
||||
"react-native-dialogs": "^1.0.4",
|
||||
"react-native-dialogs": "1.1.2",
|
||||
"react-native-draggable-flatlist": "4.0.1",
|
||||
"react-native-fast-image": "^8.5.11",
|
||||
"react-native-fs": "^2.14.1",
|
||||
"react-native-gesture-handler": "2.6.1",
|
||||
"react-native-gesture-handler": "2.14.1",
|
||||
"react-native-get-random-values": "^1.11.0",
|
||||
"react-native-gifted-charts": "^1.3.2",
|
||||
"react-native-haptic-feedback": "^1.9.0",
|
||||
"react-native-hole-view": "3.0.0-alpha3",
|
||||
"react-native-hole-view": "^3.0.0-alpha4",
|
||||
"react-native-image-crop-picker": "0.40.0",
|
||||
"react-native-image-resizer": "^1.2.3",
|
||||
"react-native-image-viewing": "git+https://github.com/status-im/react-native-image-viewing.git#refs/tags/v0.2.1.status",
|
||||
"react-native-keychain": "8.1.2",
|
||||
"react-native-languages": "^3.0.2",
|
||||
"react-native-linear-gradient": "^2.8.0",
|
||||
"react-native-lottie-splash-screen": "^1.0.1",
|
||||
"react-native-mail": "git+https://github.com/status-im/react-native-mail.git#refs/tags/v6.1.2-status",
|
||||
"react-native-navigation": "7.37.0",
|
||||
"react-native-navigation": "7.38.3",
|
||||
"react-native-orientation-locker": "^1.5.0",
|
||||
"react-native-permissions": "3.8.0",
|
||||
"react-native-randombytes": "^3.6.1",
|
||||
"react-native-permissions": "4.1.5",
|
||||
"react-native-reanimated": "3.6.1",
|
||||
"react-native-redash": "18.1.0",
|
||||
"react-native-shadow-2": "^7.0.8",
|
||||
"react-native-shake": "^3.3.1",
|
||||
"react-native-share": "^8.2.2",
|
||||
"react-native-share": "10.0.2",
|
||||
"react-native-static-safe-area-insets": "^2.2.0",
|
||||
"react-native-status-keycard": "git+https://github.com/status-im/react-native-status-keycard.git#refs/tags/v2.5.39",
|
||||
"react-native-svg": "13.10.0",
|
||||
"react-native-transparent-video": "git+https://github.com/status-im/react-native-transparent-video.git#refs/tags/0.1.1",
|
||||
"react-native-webview": "13.6.3",
|
||||
"react-syntax-highlighter": "^15.5.0",
|
||||
"rn-emoji-keyboard": "0.7.0",
|
||||
"tdigest": "^0.1.1"
|
||||
"react-syntax-highlighter": "^15.5.0"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@babel/core": "^7.20.0",
|
||||
@@ -78,37 +76,32 @@
|
||||
"@babel/helper-builder-react-jsx": "^7.20.0",
|
||||
"@babel/plugin-transform-block-scoping": "^7.20.0",
|
||||
"@babel/preset-env": "^7.20.0",
|
||||
"@babel/preset-es2015": "^7.0.0-beta.53",
|
||||
"@babel/preset-react": "^7.18.6",
|
||||
"@babel/register": "7.0.0",
|
||||
"@jest/globals": "^25.1.0",
|
||||
"@mapbox/node-pre-gyp": "^1.0.9",
|
||||
"@react-native/babel-preset": "0.73.21",
|
||||
"@react-native/codegen": "0.73.2",
|
||||
"@react-native/gradle-plugin": "0.73.4",
|
||||
"@react-native/metro-config": "0.73.5",
|
||||
"@testing-library/jest-native": "^5.4.3",
|
||||
"@testing-library/react-native": "^12.4.2",
|
||||
"@tsconfig/react-native": "^3.0.0",
|
||||
"@types/jest": "^28.1.6",
|
||||
"@types/react": "^18.0.24",
|
||||
"@types/react": "^18.2.6",
|
||||
"@types/react-test-renderer": "^18.0.0",
|
||||
"babel-jest": "^29.7.0",
|
||||
"babel-jest": "^29.6.3",
|
||||
"concurrently": "^7.6.0",
|
||||
"jest": "^29.7.0",
|
||||
"jest-image-snapshot": "^5.1.0",
|
||||
"jest-silent-reporter": "^0.5.0",
|
||||
"metro-react-native-babel-preset": "0.76.8",
|
||||
"nodemon": "^2.0.16",
|
||||
"nyc": "^14.1.1",
|
||||
"prettier": "^2.8.8",
|
||||
"process": "0.11.10",
|
||||
"react-test-renderer": "18.1.0",
|
||||
"rn-snoopy": "git+https://github.com/status-im/rn-snoopy.git#refs/tags/v2.0.2-status",
|
||||
"shadow-cljs": "2.26.2"
|
||||
},
|
||||
"resolutions": {
|
||||
"_comment": "This prevents random metro crashes till we upgrade to react-native 0.73.x",
|
||||
"metro": "^0.79.1",
|
||||
"metro-config": "^0.79.1",
|
||||
"metro-core": "^0.79.1"
|
||||
},
|
||||
"binary": {
|
||||
"module_name": "status_nodejs_addon",
|
||||
"module_path": "./lib/binding/",
|
||||
@@ -116,6 +109,6 @@
|
||||
"remote_path": "{version}"
|
||||
},
|
||||
"engines": {
|
||||
"node": ">=16"
|
||||
"node": ">=18"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -0,0 +1,11 @@
|
||||
--- /tmp/tmp-status-mobile-851dbcb56/tmp.gcyqIAUEIA/build.gradle 2024-04-16 18:11:12.481819000 +0200
|
||||
+++ ./node_modules/@react-native-community/blur/android/build.gradle 2024-04-16 18:11:18.889991702 +0200
|
||||
@@ -5,7 +5,7 @@
|
||||
}
|
||||
|
||||
dependencies {
|
||||
- classpath 'com.android.tools.build:gradle:3.5.3'
|
||||
+ classpath 'com.android.tools.build:gradle:3.5.4'
|
||||
}
|
||||
}
|
||||
|
||||
@@ -0,0 +1,10 @@
|
||||
--- /tmp/tmp-status-mobile-61974dae4/tmp.6k5ZPUa0Hp/BlurView.ios.tsx 2024-04-16 17:07:33.229847000 +0200
|
||||
+++ ./node_modules/@react-native-community/blur/src/components/BlurView.ios.tsx 2024-04-16 17:07:58.540617624 +0200
|
||||
@@ -6,6 +6,7 @@
|
||||
| 'dark'
|
||||
| 'light'
|
||||
| 'xlight'
|
||||
+ | 'transparent'
|
||||
| 'prominent'
|
||||
| 'regular'
|
||||
| 'extraDark'
|
||||
@@ -0,0 +1,57 @@
|
||||
--- /tmp/tmp-status-mobile-851dbcb56/tmp.beqWjtcNwi/BlurView.mm 2024-04-16 17:55:00.688450000 +0200
|
||||
+++ ./node_modules/@react-native-community/blur/ios/BlurView.mm 2024-04-16 17:56:17.772952042 +0200
|
||||
@@ -73,7 +73,7 @@
|
||||
{
|
||||
const auto &oldViewProps = *std::static_pointer_cast<const BlurViewProps>(_props);
|
||||
const auto &newViewProps = *std::static_pointer_cast<const BlurViewProps>(props);
|
||||
-
|
||||
+
|
||||
if (oldViewProps.blurAmount != newViewProps.blurAmount) {
|
||||
NSNumber *blurAmount = [NSNumber numberWithInt:newViewProps.blurAmount];
|
||||
[self setBlurAmount:blurAmount];
|
||||
@@ -83,12 +83,12 @@
|
||||
NSString *blurType = [NSString stringWithUTF8String:toString(newViewProps.blurType).c_str()];
|
||||
[self setBlurType:blurType];
|
||||
}
|
||||
-
|
||||
+
|
||||
if (oldViewProps.reducedTransparencyFallbackColor != newViewProps.reducedTransparencyFallbackColor) {
|
||||
UIColor *color = RCTUIColorFromSharedColor(newViewProps.reducedTransparencyFallbackColor);
|
||||
[self setReducedTransparencyFallbackColor:color];
|
||||
}
|
||||
-
|
||||
+
|
||||
[super updateProps:props oldProps:oldProps];
|
||||
}
|
||||
#endif // RCT_NEW_ARCH_ENABLED
|
||||
@@ -131,6 +131,7 @@
|
||||
|
||||
- (UIBlurEffectStyle)blurEffectStyle
|
||||
{
|
||||
+ if ([self.blurType isEqual: @"transparent"]) return UIBlurEffectStyleDark;
|
||||
if ([self.blurType isEqual: @"xlight"]) return UIBlurEffectStyleExtraLight;
|
||||
if ([self.blurType isEqual: @"light"]) return UIBlurEffectStyleLight;
|
||||
if ([self.blurType isEqual: @"dark"]) return UIBlurEffectStyleDark;
|
||||
@@ -160,7 +161,7 @@
|
||||
if ([self.blurType isEqual: @"thinMaterialLight"]) return UIBlurEffectStyleSystemThinMaterialLight;
|
||||
if ([self.blurType isEqual: @"ultraThinMaterialLight"]) return UIBlurEffectStyleSystemUltraThinMaterialLight;
|
||||
#endif
|
||||
-
|
||||
+
|
||||
#if TARGET_OS_TV
|
||||
if ([self.blurType isEqual: @"regular"]) return UIBlurEffectStyleRegular;
|
||||
if ([self.blurType isEqual: @"prominent"]) return UIBlurEffectStyleProminent;
|
||||
@@ -183,6 +184,13 @@
|
||||
UIBlurEffectStyle style = [self blurEffectStyle];
|
||||
self.blurEffect = [BlurEffectWithAmount effectWithStyle:style andBlurAmount:self.blurAmount];
|
||||
self.blurEffectView.effect = self.blurEffect;
|
||||
+
|
||||
+ if ([self.blurType isEqual: @"transparent"]) {
|
||||
+ for (UIView *subview in self.blurEffectView.subviews) {
|
||||
+ subview.backgroundColor = [UIColor clearColor];
|
||||
+ }
|
||||
+ }
|
||||
+
|
||||
}
|
||||
|
||||
- (void)updateFallbackView
|
||||
@@ -0,0 +1,10 @@
|
||||
--- /tmp/tmp-status-mobile-61974dae4/tmp.NHLSFZG6LG/BlurViewNativeComponent.ts 2024-04-16 17:08:42.755929000 +0200
|
||||
+++ ./node_modules/@react-native-community/blur/src/fabric/BlurViewNativeComponent.ts 2024-04-16 17:08:57.634037113 +0200
|
||||
@@ -10,6 +10,7 @@
|
||||
| 'dark'
|
||||
| 'light'
|
||||
| 'xlight'
|
||||
+ | 'transparent'
|
||||
| 'prominent'
|
||||
| 'regular'
|
||||
| 'extraDark'
|
||||
@@ -0,0 +1,22 @@
|
||||
--- /tmp/tmp-status-mobile-3907e6b2e/tmp.re8kHerusA/CameraRoll.ts 2024-04-16 15:17:12.942432000 +0200
|
||||
+++ ./node_modules/@react-native-camera-roll/camera-roll/src/CameraRoll.ts 2024-04-16 15:17:42.455250986 +0200
|
||||
@@ -239,6 +239,19 @@
|
||||
}
|
||||
|
||||
/**
|
||||
+ * Returns total iOS image count
|
||||
+ */
|
||||
+ static getPhotosCountiOS(): Promise<number> {
|
||||
+ return RNCCameraRoll.getPhotosCountiOS('');
|
||||
+ }
|
||||
+ /**
|
||||
+ * Returns favorites and their count iOS
|
||||
+ */
|
||||
+ static getFavoritesiOS(): Promise<Album> {
|
||||
+ return RNCCameraRoll.getFavoritesiOS('');
|
||||
+ }
|
||||
+
|
||||
+ /**
|
||||
* Saves the photo or video to the camera roll or photo library, and returns the URI of the newly created asset.
|
||||
*
|
||||
* @deprecated `save(...)` is deprecated - use `saveAsset(...)` instead.
|
||||
@@ -0,0 +1,37 @@
|
||||
--- /tmp/tmp-status-mobile-ca53bf738/tmp.QcO69SAqs7/CameraRollModule.java 2024-04-19 14:02:42.746932000 +0200
|
||||
+++ ./node_modules/@react-native-camera-roll/camera-roll/android/src/main/java/com/reactnativecommunity/cameraroll/CameraRollModule.java 2024-04-19 14:03:51.776866113 +0200
|
||||
@@ -677,7 +677,7 @@
|
||||
|
||||
WritableArray subTypes = Arguments.createArray();
|
||||
node.putArray("subTypes", subTypes);
|
||||
-
|
||||
+
|
||||
if (includeSourceType) {
|
||||
node.putString("sourceType", "UserLibrary");
|
||||
} else {
|
||||
@@ -685,7 +685,7 @@
|
||||
}
|
||||
|
||||
WritableArray group_name = Arguments.createArray();
|
||||
-
|
||||
+
|
||||
if (includeAlbums) {
|
||||
group_name.pushString(media.getString(groupNameIndex));
|
||||
}
|
||||
@@ -1089,6 +1089,16 @@
|
||||
promise.reject("CameraRoll:getPhotoThumbnail", "getPhotoThumbnail is not supported on Android");
|
||||
}
|
||||
|
||||
+ @ReactMethod
|
||||
+ public void getPhotosCountiOS(String arg, Promise promise) {
|
||||
+ promise.reject("CameraRoll:getPhotosCountiOS", "getPhotosCountiOS is not supported on Android");
|
||||
+ }
|
||||
+
|
||||
+ @ReactMethod
|
||||
+ public void getFavoritesiOS(String arg, Promise promise) {
|
||||
+ promise.reject("CameraRoll:getFavoritesiOS", "getFavoritesiOS is not supported on Android");
|
||||
+ }
|
||||
+
|
||||
public void addListener(String eventName) {}
|
||||
public void removeListeners(double count) {}
|
||||
}
|
||||
@@ -0,0 +1,11 @@
|
||||
--- /tmp/tmp-status-mobile-3907e6b2e/tmp.juxTO1BeCM/NativeCameraRollModule.ts 2024-04-16 15:21:28.379979000 +0200
|
||||
+++ ./node_modules/@react-native-camera-roll/camera-roll/src/NativeCameraRollModule.ts 2024-04-16 15:21:40.490391291 +0200
|
||||
@@ -81,6 +81,8 @@
|
||||
getPhotos(params: Object): Promise<PhotoIdentifiersPage>;
|
||||
getAlbums(params: Object): Promise<Album[]>;
|
||||
deletePhotos(photoUris: Array<string>): Promise<void>;
|
||||
+ getPhotosCountiOS(arg: string): Promise<number>;
|
||||
+ getFavoritesiOS(arg: string): Promise<Album>;
|
||||
getPhotoByInternalID(
|
||||
internalID: string,
|
||||
options: Object,
|
||||
@@ -0,0 +1,16 @@
|
||||
--- /tmp/tmp-status-mobile-ca53bf738/tmp.Ay8Xen8Mmn/NativeCameraRollModuleSpec.java 2024-04-19 12:10:05.789750000 +0200
|
||||
+++ ./node_modules/@react-native-camera-roll/camera-roll/android/src/paper/java/com/reactnativecommunity/cameraroll/NativeCameraRollModuleSpec.java 2024-04-19 12:12:27.231493426 +0200
|
||||
@@ -50,4 +50,13 @@
|
||||
@ReactMethod
|
||||
@DoNotStrip
|
||||
public abstract void getPhotoThumbnail(String internalID, ReadableMap options, Promise promise);
|
||||
+
|
||||
+ @ReactMethod
|
||||
+ @DoNotStrip
|
||||
+ public abstract void getPhotosCountiOS(String arg, Promise promise);
|
||||
+
|
||||
+ @ReactMethod
|
||||
+ @DoNotStrip
|
||||
+ public abstract void getFavoritesiOS(String arg, Promise promise);
|
||||
+
|
||||
}
|
||||
@@ -0,0 +1,56 @@
|
||||
--- /tmp/tmp-status-mobile-3907e6b2e/tmp.O0mkyjqnsy/RNCCameraRoll.mm 2024-04-16 15:26:23.070258000 +0200
|
||||
+++ ./node_modules/@react-native-camera-roll/camera-roll/ios/RNCCameraRoll.mm 2024-04-16 15:26:32.664996066 +0200
|
||||
@@ -955,6 +955,53 @@
|
||||
return [albumTitles copy];
|
||||
}
|
||||
|
||||
+RCT_EXPORT_METHOD(getPhotosCountiOS:(NSString *)blank
|
||||
+ resolve:(RCTPromiseResolveBlock)resolve
|
||||
+ reject:(RCTPromiseRejectBlock)reject)
|
||||
+{
|
||||
+ __block NSInteger intTotalCount=0;
|
||||
+ PHFetchOptions *allPhotosOptions = [PHFetchOptions new];
|
||||
+ allPhotosOptions.predicate = [NSPredicate predicateWithFormat:@"mediaType == %d ",PHAssetMediaTypeImage];
|
||||
+ PHFetchResult *allPhotosResult = [PHAsset fetchAssetsWithOptions:allPhotosOptions];
|
||||
+ intTotalCount+=allPhotosResult.count;
|
||||
+
|
||||
+ resolve(@(intTotalCount));
|
||||
+}
|
||||
+
|
||||
+RCT_EXPORT_METHOD(getFavoritesiOS:(NSString *)blank
|
||||
+ resolve:(RCTPromiseResolveBlock)resolve
|
||||
+ reject:(RCTPromiseRejectBlock)reject)
|
||||
+{
|
||||
+ __block NSInteger intTotalCount=0;
|
||||
+ PHFetchOptions *fetchOptions = [PHFetchOptions new];
|
||||
+ NSString *format = @"(favorite == true)";
|
||||
+ fetchOptions.predicate = [NSPredicate predicateWithFormat:format];
|
||||
+ PHFetchResult<PHAsset *> *const assetsFetchResult = [PHAsset fetchAssetsWithOptions:fetchOptions];
|
||||
+ PHAsset *imageAsset = [assetsFetchResult firstObject];
|
||||
+ NSMutableArray * result = [NSMutableArray new];
|
||||
+
|
||||
+ for (PHAsset* asset in assetsFetchResult) {
|
||||
+ NSArray *resources = [PHAssetResource assetResourcesForAsset:asset ];
|
||||
+ if ([resources count] < 1) continue;
|
||||
+ NSString *orgFilename = ((PHAssetResource*)resources[0]).originalFilename;
|
||||
+ NSString *uit = ((PHAssetResource*)resources[0]).uniformTypeIdentifier;
|
||||
+ NSString *mimeType = (NSString *)CFBridgingRelease(UTTypeCopyPreferredTagWithClass((__bridge CFStringRef _Nonnull)(uit), kUTTagClassMIMEType));
|
||||
+ CFStringRef extension = UTTypeCopyPreferredTagWithClass((__bridge CFStringRef _Nonnull)(uit), kUTTagClassFilenameExtension);
|
||||
+ [result addObject:@{
|
||||
+ @"width": @([asset pixelWidth]),
|
||||
+ @"height": @([asset pixelHeight]),
|
||||
+ @"filename": orgFilename ?: @"",
|
||||
+ @"mimeType": mimeType ?: @"",
|
||||
+ @"id": [asset localIdentifier],
|
||||
+ @"creationDate": [asset creationDate],
|
||||
+ @"uri": [NSString stringWithFormat:@"ph://%@", [asset localIdentifier]],
|
||||
+ @"duration": @([asset duration])
|
||||
+ }];
|
||||
+ }
|
||||
+ [result addObject:@{@"count": @(assetsFetchResult.count)}];
|
||||
+ resolve(result);
|
||||
+}
|
||||
+
|
||||
static void checkPhotoLibraryConfig()
|
||||
{
|
||||
#if RCT_DEV
|
||||
@@ -0,0 +1,10 @@
|
||||
--- /tmp/tmp-status-mobile-61974dae4/tmp.zy6uXqO4gW/VibrancyViewNativeComponent.ts 2024-04-16 17:09:23.772623000 +0200
|
||||
+++ ./node_modules/@react-native-community/blur/src/fabric/VibrancyViewNativeComponent.ts 2024-04-16 17:09:39.033737349 +0200
|
||||
@@ -10,6 +10,7 @@
|
||||
| 'dark'
|
||||
| 'light'
|
||||
| 'xlight'
|
||||
+ | 'transparent'
|
||||
| 'prominent'
|
||||
| 'regular'
|
||||
| 'extraDark'
|
||||
@@ -0,0 +1,12 @@
|
||||
# Do not add a BuildId to the generated libraries, for reproducibility
|
||||
--- ./node_modules/react-native/ReactAndroid/src/main/jni/CMakeLists.txt
|
||||
+++ ./node_modules/react-native/ReactAndroid/src/main/jni/CMakeLists-patched.txt
|
||||
@@ -21,7 +21,7 @@
|
||||
endif(CCACHE_FOUND)
|
||||
|
||||
# Make sure every shared lib includes a .note.gnu.build-id header
|
||||
-add_link_options(-Wl,--build-id)
|
||||
+add_link_options(-Wl,--build-id=none)
|
||||
add_compile_options(-Wall -Werror -std=c++20)
|
||||
|
||||
function(add_react_android_subdir relative_path)
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user