Compare commits
400
Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
4e8bb68f38 | ||
|
|
43fc6498c2 | ||
|
|
0b5dd66a1a | ||
|
|
a71dc8406e | ||
|
|
cd7b7ec9b7 | ||
|
|
8be6bbba46 | ||
|
|
1771c3cf59 | ||
|
|
6fa6f65c8e | ||
|
|
3d802115b9 | ||
|
|
1632880302 | ||
|
|
b3f34d1ea9 | ||
|
|
0491038b09 | ||
|
|
ac6a4af207 | ||
|
|
106e9112e0 | ||
|
|
c625e95d5e | ||
|
|
580ecfedc1 | ||
|
|
4cc99c6bb8 | ||
|
|
6a764869a0 | ||
|
|
aff335b305 | ||
|
|
93ed7c15bd | ||
|
|
c57974d9ff | ||
|
|
a7f9a98f48 | ||
|
|
c703e45105 | ||
|
|
8376fedb4b | ||
|
|
d0d8815d4a | ||
|
|
fa9fceb75d | ||
|
|
293fd5fae1 | ||
|
|
9b6b337453 | ||
|
|
37cf8ffe72 | ||
|
|
4f9e38930e | ||
|
|
99e99b0e81 | ||
|
|
83630b28bb | ||
|
|
c7009ff6f7 | ||
|
|
c2f513f67e | ||
|
|
37284051dc | ||
|
|
c1315eca90 | ||
|
|
9f9370f72d | ||
|
|
61da0db9c9 | ||
|
|
325a860916 | ||
|
|
a383cfa39a | ||
|
|
d5e1d3fe65 | ||
|
|
f0d79f3af0 | ||
|
|
09ac3e6a9e | ||
|
|
f3c85c1e7a | ||
|
|
505171cf87 | ||
|
|
f9c3747768 | ||
|
|
9648f741b4 | ||
|
|
e493a2b79c | ||
|
|
8698e13fa1 | ||
|
|
452e54fc19 | ||
|
|
4f094c174d | ||
|
|
7c04bb9076 | ||
|
|
8d3fa3c3d7 | ||
|
|
32393c9091 | ||
|
|
35f152c479 | ||
|
|
37b36d38c7 | ||
|
|
1a77891273 | ||
|
|
63893ff575 | ||
|
|
226aacdeac | ||
|
|
a37dbb57d6 | ||
|
|
4fdfa3e008 | ||
|
|
8d510be72e | ||
|
|
72d592a5a6 | ||
|
|
1075dfcb8b | ||
|
|
49d4b15761 | ||
|
|
a7f9998d6c | ||
|
|
b2be539374 | ||
|
|
3685f6a500 | ||
|
|
9a51a46869 | ||
|
|
0867b972c3 | ||
|
|
d946d473c6 | ||
|
|
7e8a68ec67 | ||
|
|
39b0a6bb44 | ||
|
|
00ad3e9e1f | ||
|
|
781360a1cf | ||
|
|
c76567c20f | ||
|
|
6d38386c11 | ||
|
|
522d03b846 | ||
|
|
b73fcba395 | ||
|
|
741e9e834b | ||
|
|
ad006b018c | ||
|
|
56c4ffc39f | ||
|
|
d31ed933a0 | ||
|
|
6469ff912a | ||
|
|
ff961bbfe8 | ||
|
|
eba6b63258 | ||
|
|
9bf4da1edd | ||
|
|
c2f8f012a8 | ||
|
|
6c4097f521 | ||
|
|
35671226e4 | ||
|
|
08b9cfcf52 | ||
|
|
0087a66df8 | ||
|
|
3042a4b696 | ||
|
|
cb66886aab | ||
|
|
af2b053fa9 | ||
|
|
fa4521d2e7 | ||
|
|
b33c086966 | ||
|
|
4704cef3da | ||
|
|
329182fdbe | ||
|
|
5c3133adb6 | ||
|
|
f28f479256 | ||
|
|
daf7791d86 | ||
|
|
73ca49aad5 | ||
|
|
7cf42b292b | ||
|
|
2687d7ab9a | ||
|
|
abac5247bf | ||
|
|
939ce8bef5 | ||
|
|
eb1f1bf587 | ||
|
|
46d430b69c | ||
|
|
e4d175ef93 | ||
|
|
25c5106284 | ||
|
|
3fd36c6904 | ||
|
|
fe6f75e1b7 | ||
|
|
6410de803e | ||
|
|
9d2e2e26ad | ||
|
|
6c935057c5 | ||
|
|
d68f7679df | ||
|
|
346ff25843 | ||
|
|
2e7875cfef | ||
|
|
d6f2792622 | ||
|
|
2af23bcb2e | ||
|
|
e0b01d2fed | ||
|
|
9889e80bbd | ||
|
|
e0e497d3d0 | ||
|
|
abc63af4a8 | ||
|
|
b5b16f1278 | ||
|
|
767bd46bff | ||
|
|
8e288aea56 | ||
|
|
4f4f6cf29e | ||
|
|
d8235d9e17 | ||
|
|
5d02472f89 | ||
|
|
f306b084da | ||
|
|
6099262c98 | ||
|
|
37ccc6f825 | ||
|
|
33e58dbca9 | ||
|
|
d8f1944b27 | ||
|
|
6342163152 | ||
|
|
8948dcb736 | ||
|
|
52823d7f59 | ||
|
|
eff60c69d5 | ||
|
|
b30149d9f2 | ||
|
|
2ca39daa59 | ||
|
|
35c2c226df | ||
|
|
5b801b95fa | ||
|
|
b5a6f1b78f | ||
|
|
2571e44de0 | ||
|
|
7f22912f1e | ||
|
|
aac7a97e13 | ||
|
|
eaf463395a | ||
|
|
8342972059 | ||
|
|
98a8359db3 | ||
|
|
9fe7ddaf0b | ||
|
|
5643c4d537 | ||
|
|
09822e142b | ||
|
|
86d7b79175 | ||
|
|
4e5ba2c533 | ||
|
|
b197d54e47 | ||
|
|
1b9bd8b017 | ||
|
|
879f441b7d | ||
|
|
8e882dda21 | ||
|
|
905aa26705 | ||
|
|
3241d3273e | ||
|
|
efc4f6c750 | ||
|
|
c33e2be76b | ||
|
|
8748280279 | ||
|
|
1b4dcb7103 | ||
|
|
5259de7423 | ||
|
|
e167773258 | ||
|
|
57c0e835e2 | ||
|
|
7055c46a60 | ||
|
|
2f1e5c819e | ||
|
|
2df5eccff0 | ||
|
|
a70b07e83d | ||
|
|
8a97331779 | ||
|
|
fdf91cff80 | ||
|
|
f04042c643 | ||
|
|
fd5be21207 | ||
|
|
c62abf10c1 | ||
|
|
458ef05740 | ||
|
|
609a7120b6 | ||
|
|
b62ff59f16 | ||
|
|
c381fc2e2f | ||
|
|
d2493c0725 | ||
|
|
b9f896f4e3 | ||
|
|
7e069ed342 | ||
|
|
b2cdc59670 | ||
|
|
a6e08f0d8e | ||
|
|
0e6d191e58 | ||
|
|
852838f777 | ||
|
|
32efcb06a0 | ||
|
|
179e389e37 | ||
|
|
a4716cc494 | ||
|
|
92aaa194a8 | ||
|
|
64840f74a7 | ||
|
|
bd281e6c9f | ||
|
|
e8350414f3 | ||
|
|
ae900a4cd9 | ||
|
|
46cd4aa893 | ||
|
|
f0d9f2ac54 | ||
|
|
f47c816ce0 | ||
|
|
88889930ae | ||
|
|
e2717ade98 | ||
|
|
f9095a492e | ||
|
|
1f7e40cede | ||
|
|
7bfaa9255c | ||
|
|
166bdbf798 | ||
|
|
ecc41bebe0 | ||
|
|
4cb058f1ca | ||
|
|
a55dd51064 | ||
|
|
d260ea9e03 | ||
|
|
36f90fc567 | ||
|
|
22c6635d93 | ||
|
|
ae2d9b996c | ||
|
|
7c9bb5b21c | ||
|
|
80ac4a8dc2 | ||
|
|
e30962ca75 | ||
|
|
2bcc832cca | ||
|
|
0b8c673094 | ||
|
|
dbabcc223e | ||
|
|
9f7ad853f0 | ||
|
|
28d3cf03d9 | ||
|
|
7b46c445a7 | ||
|
|
cf911aa246 | ||
|
|
a91bdfb047 | ||
|
|
61105e15f6 | ||
|
|
13c81a34b3 | ||
|
|
fbb606b859 | ||
|
|
30753f8766 | ||
|
|
6b4f2901ae | ||
|
|
40e2839793 | ||
|
|
d14f232abf | ||
|
|
8310749696 | ||
|
|
fac4f0c871 | ||
|
|
ae3936eff2 | ||
|
|
920000c3e8 | ||
|
|
b3a3a753d2 | ||
|
|
e5ada29ed8 | ||
|
|
35381a55c0 | ||
|
|
473c5135b2 | ||
|
|
4384d979e7 | ||
|
|
b1ea04900e | ||
|
|
627e1d0e14 | ||
|
|
f7d7c282cd | ||
|
|
07e36096cc | ||
|
|
6311077cec | ||
|
|
6d104d60e2 | ||
|
|
72591f576d | ||
|
|
6eb840c8b2 | ||
|
|
f1d070ed82 | ||
|
|
9e466976dc | ||
|
|
ee61244770 | ||
|
|
34c6292af4 | ||
|
|
0d82dab5c5 | ||
|
|
206ce8849f | ||
|
|
7cef533a8a | ||
|
|
e7807202c9 | ||
|
|
d17f7c67b9 | ||
|
|
82aca6bd76 | ||
|
|
c7b3efe6ad | ||
|
|
d8713fe3c7 | ||
|
|
6f86f73ac6 | ||
|
|
b7948b9869 | ||
|
|
d380186051 | ||
|
|
a91fa39547 | ||
|
|
3b780f4ff2 | ||
|
|
d8eb33e330 | ||
|
|
0b5be54fea | ||
|
|
f99b2aa401 | ||
|
|
27ad8f07c3 | ||
|
|
7402718e68 | ||
|
|
3ac8f0c5fd | ||
|
|
cf4bef8268 | ||
|
|
fe5b5ab4bc | ||
|
|
050f20cfae | ||
|
|
10dcee3e05 | ||
|
|
ce20eddb99 | ||
|
|
eae66c967e | ||
|
|
973bdb61b3 | ||
|
|
663f5f41a0 | ||
|
|
ba3ca2c818 | ||
|
|
95aa500119 | ||
|
|
2cf4be4b34 | ||
|
|
5232432ec5 | ||
|
|
dca26b3350 | ||
|
|
466d279e2a | ||
|
|
250b4d4646 | ||
|
|
320d81432f | ||
|
|
70526f9429 | ||
|
|
9691626992 | ||
|
|
e52f6b8753 | ||
|
|
04cd74e57d | ||
|
|
b826a34f27 | ||
|
|
81cfc83ed3 | ||
|
|
ff3f171646 | ||
|
|
3ae85cacd5 | ||
|
|
36f9436e12 | ||
|
|
8c42e717c1 | ||
|
|
cf0cd283a6 | ||
|
|
316c6038d7 | ||
|
|
f5034a4dfa | ||
|
|
cf58a84838 | ||
|
|
dcd2655860 | ||
|
|
9e0b8e76cf | ||
|
|
40a26f4e10 | ||
|
|
094cf61915 | ||
|
|
c238b6bca5 | ||
|
|
908b5f723c | ||
|
|
085ae22be1 | ||
|
|
0368895edf | ||
|
|
905699b686 | ||
|
|
b198084b78 | ||
|
|
2e7c377343 | ||
|
|
9f36bd44b2 | ||
|
|
4e9b1001df | ||
|
|
e602f0493d | ||
|
|
85991d2272 | ||
|
|
f3ed1e370a | ||
|
|
bdbc48764e | ||
|
|
c74a5a5215 | ||
|
|
c4cac2cef7 | ||
|
|
966f6de31a | ||
|
|
93ed3eb7ff | ||
|
|
bc12c90d2e | ||
|
|
00ec94b73c | ||
|
|
5458c7b2db | ||
|
|
92fae99cf7 | ||
|
|
9cd1e08aaa | ||
|
|
6cf3a6a98e | ||
|
|
c866082cde | ||
|
|
22ca98b0f8 | ||
|
|
b5f7a62b14 | ||
|
|
abe6e97728 | ||
|
|
6940adf1cb | ||
|
|
e55cb6b47b | ||
|
|
ccd034e7a6 | ||
|
|
f2da0cbbdb | ||
|
|
1c6da59611 | ||
|
|
d9bac4a493 | ||
|
|
ebf3016644 | ||
|
|
345ae359aa | ||
|
|
b8298dce44 | ||
|
|
1969f9dfe0 | ||
|
|
8eed842c62 | ||
|
|
b32367a9b2 | ||
|
|
7fb243f9f1 | ||
|
|
6b08194a19 | ||
|
|
55278828e6 | ||
|
|
99755d08e9 | ||
|
|
e95025333f | ||
|
|
ff790d4152 | ||
|
|
6454df4734 | ||
|
|
25dbf1fd61 | ||
|
|
0448edb509 | ||
|
|
44e3076022 | ||
|
|
1009b71908 | ||
|
|
80faac0ca7 | ||
|
|
b43f9e0dfd | ||
|
|
20b5ad9ebb | ||
|
|
e2071dc968 | ||
|
|
1b1f3c4c9f | ||
|
|
889d4c16a4 | ||
|
|
ae0504cbfa | ||
|
|
a95520067f | ||
|
|
56aec16793 | ||
|
|
0594548617 | ||
|
|
f7ec945c56 | ||
|
|
13e46c2fb0 | ||
|
|
301f1c8cf2 | ||
|
|
1e5288a016 | ||
|
|
59e226bab2 | ||
|
|
32cb09c9c6 | ||
|
|
16fecc2ac6 | ||
|
|
0675d0d8d7 | ||
|
|
f9df0f367f | ||
|
|
5aa33fc9c0 | ||
|
|
754b826629 | ||
|
|
72daf93a75 | ||
|
|
89ad4f59d0 | ||
|
|
4304a5dd97 | ||
|
|
fea916590a | ||
|
|
1a98219690 | ||
|
|
3181a7dc20 | ||
|
|
fed52fe309 | ||
|
|
eac77f84c2 | ||
|
|
080584dc2e | ||
|
|
be25ecd4ea | ||
|
|
2be70cca9a | ||
|
|
b2a79b3e89 | ||
|
|
fdf8d11913 | ||
|
|
399be0686c | ||
|
|
0cb554f5c6 | ||
|
|
2901f4c7cf | ||
|
|
0ab227eef8 | ||
|
|
17c408bd06 | ||
|
|
716c968a23 | ||
|
|
8adc32a5c9 | ||
|
|
2934de9b8c | ||
|
|
001789f761 | ||
|
|
8d8057036a | ||
|
|
151ef4a952 |
+2
-2
@@ -31,7 +31,7 @@ reagent.dom/dom-node
|
||||
reagent.dom/force-update-all
|
||||
status-im.multiaccounts.create.core/get-new-key-code
|
||||
status-im.ethereum.decode/string
|
||||
status-im.network.ui.views/mainnet?
|
||||
status-im.ui.screens.network.views/mainnet?
|
||||
status-im.data-store.chats/event->string
|
||||
status-im.mailserver.constants/seven-days
|
||||
status-im.mailserver.constants/connection-timeout
|
||||
@@ -65,7 +65,7 @@ mocks.js-dependencies/emoji-picker
|
||||
mocks.js-dependencies/i18n
|
||||
mocks.js-dependencies/qr-code
|
||||
mocks.js-dependencies/svg
|
||||
mocks.js-dependencies/vector-icons
|
||||
mocks.js-dependencies/icons
|
||||
mocks.js-dependencies/webview
|
||||
mocks.js-dependencies/desktop-linking
|
||||
mocks.js-dependencies/desktop-shortcuts
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
{:lint-as {status-im.utils.views/defview clojure.core/defn
|
||||
status-im.utils.views/letsubs clojure.core/let
|
||||
reagent.core/with-let clojkure.core/let
|
||||
status-im.utils.fx/defn clj-kondo.lint-as/def-catch-all
|
||||
quo.react/with-deps-check clojure.core/fn
|
||||
quo.previews.preview/list-comp clojure.core/for
|
||||
|
||||
@@ -13,7 +13,7 @@ update_configs:
|
||||
update_type: "security"
|
||||
# Keep /mobile/js_files/yarn.lock up to date, batching pull requests weekly
|
||||
- package_manager: "javascript"
|
||||
directory: "/mobile/js_files"
|
||||
directory: "/"
|
||||
update_schedule: "weekly"
|
||||
allowed_updates:
|
||||
- match:
|
||||
|
||||
@@ -24,3 +24,8 @@ QR_READ_TEST_MENU=1
|
||||
ENABLE_ROOT_ALERT=1
|
||||
ENABLE_REFERRAL_INVITE=1
|
||||
ENABLE_QUO_PREVIEW=1
|
||||
MAX_IMAGES_BATCH=5
|
||||
APN_TOPIC=im.status.ethereum.pr
|
||||
COMMUNITIES_ENABLED=1
|
||||
COMMUNITIES_MANAGEMENT_ENABLED=1
|
||||
DATABASE_MANAGEMENT_ENABLED=1
|
||||
|
||||
@@ -23,3 +23,9 @@ KEYCARD_TEST_MENU=1
|
||||
QR_READ_TEST_MENU=1
|
||||
ENABLE_ROOT_ALERT=0
|
||||
ENABLE_REFERRAL_INVITE=1
|
||||
MAX_IMAGES_BATCH=5
|
||||
APN_TOPIC=im.status.ethereum.pr
|
||||
VERIFY_TRANSACTION_CHAIN_ID=3
|
||||
COMMUNITIES_ENABLED=1
|
||||
DATABASE_MANAGEMENT_ENABLED=1
|
||||
COMMUNITIES_MANAGEMENT_ENABLED=1
|
||||
|
||||
@@ -22,3 +22,10 @@ KEYCARD_TEST_MENU=0
|
||||
ENABLE_ROOT_ALERT=1
|
||||
ENABLE_REFERRAL_INVITE=1
|
||||
DISABLE_WALLET_ON_MOBILE_NETWORK=1
|
||||
APN_TOPIC=im.status.ethereum.pr
|
||||
BLANK_PREVIEW=0
|
||||
MAX_IMAGES_BATCH=5
|
||||
GOOGLE_FREE=0
|
||||
COMMUNITIES_ENABLED=1
|
||||
DATABASE_MANAGEMENT_ENABLED=1
|
||||
COMMUNITIES_MANAGEMENT_ENABLED=1
|
||||
|
||||
+6
-1
@@ -17,4 +17,9 @@ RPC_NETWORKS_ONLY=0
|
||||
PARTITIONED_TOPIC=0
|
||||
CONTRACT_NODES=1
|
||||
ENABLE_ROOT_ALERT=1
|
||||
ENABLE_REFERRAL_INVITE=1
|
||||
ENABLE_REFERRAL_INVITE=0
|
||||
MAX_IMAGES_BATCH=5
|
||||
BLANK_PREVIEW=0
|
||||
COMMUNITIES_ENABLED=1
|
||||
DATABASE_MANAGEMENT_ENABLED=1
|
||||
COMMUNITIES_MANAGEMENT_ENABLED=1
|
||||
|
||||
@@ -16,4 +16,5 @@ SNOOPY=0
|
||||
RPC_NETWORKS_ONLY=1
|
||||
PARTITIONED_TOPIC=0
|
||||
ENABLE_ROOT_ALERT=1
|
||||
MAX_IMAGES_BATCH=1
|
||||
ENABLE_REFERRAL_INVITE=0
|
||||
|
||||
+1
-1
@@ -94,4 +94,4 @@ suppress_comment=\\(.\\|\n\\)*\\$FlowIssue\\((\\(<VERSION>\\)? *\\(site=[a-z,_]*
|
||||
suppress_comment=\\(.\\|\n\\)*\\$FlowFixedInNextDeploy
|
||||
|
||||
[version]
|
||||
^0.105.0
|
||||
^0.122.0
|
||||
|
||||
+1
-11
@@ -5,8 +5,6 @@
|
||||
# the repo. Unless a later match takes precedence,
|
||||
# @global-owner1 and @global-owner2 will be requested for
|
||||
# review when someone opens a pull request.
|
||||
* @status-im/status-core
|
||||
|
||||
/ci @jakubgs
|
||||
/fastlane @jakubgs
|
||||
/scripts @jakubgs
|
||||
@@ -24,12 +22,4 @@
|
||||
|
||||
/components @status-im/status-core-ui
|
||||
|
||||
desktop/ @vkjr
|
||||
modules/react-native-desktop*/ @vkjr
|
||||
modules/react-native-desktop*/ @vkjr
|
||||
|
||||
/doc @oskarth @yenda @jeluard
|
||||
|
||||
/deployment @vkjr
|
||||
|
||||
/test/appium/ @antdanchenko @churik
|
||||
/test/appium/ @churik
|
||||
|
||||
@@ -0,0 +1,17 @@
|
||||
name: Zenhub integration assigned
|
||||
on:
|
||||
issues:
|
||||
types:
|
||||
- assigned
|
||||
|
||||
jobs:
|
||||
build:
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- uses: status-im/zenhub-automations@master
|
||||
with:
|
||||
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||
ZENHUB_API_KEY: ${{ secrets.ZENHUB_TOKEN }}
|
||||
INPROG_COLUMN: Z2lkOi8vcmFwdG9yL1BpcGVsaW5lLzMyODI1Mg
|
||||
NEXT_COLUMN: Z2lkOi8vcmFwdG9yL1BpcGVsaW5lLzMyNzk2MQ
|
||||
REVIEW_COLUMN: Z2lkOi8vcmFwdG9yL1BpcGVsaW5lLzIyNjk0MTA
|
||||
@@ -0,0 +1,15 @@
|
||||
name: Zenhub integration branch
|
||||
on:
|
||||
create:
|
||||
|
||||
jobs:
|
||||
build:
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- uses: status-im/zenhub-automations@master
|
||||
with:
|
||||
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||
ZENHUB_API_KEY: ${{ secrets.ZENHUB_TOKEN }}
|
||||
INPROG_COLUMN: Z2lkOi8vcmFwdG9yL1BpcGVsaW5lLzMyODI1Mg
|
||||
NEXT_COLUMN: Z2lkOi8vcmFwdG9yL1BpcGVsaW5lLzMyNzk2MQ
|
||||
REVIEW_COLUMN: Z2lkOi8vcmFwdG9yL1BpcGVsaW5lLzIyNjk0MTA
|
||||
@@ -0,0 +1,17 @@
|
||||
name: Zenhub integration milestoned
|
||||
on:
|
||||
issues:
|
||||
types:
|
||||
- milestoned
|
||||
|
||||
jobs:
|
||||
build:
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- uses: status-im/zenhub-automations@master
|
||||
with:
|
||||
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||
ZENHUB_API_KEY: ${{ secrets.ZENHUB_TOKEN }}
|
||||
INPROG_COLUMN: Z2lkOi8vcmFwdG9yL1BpcGVsaW5lLzMyODI1Mg
|
||||
NEXT_COLUMN: Z2lkOi8vcmFwdG9yL1BpcGVsaW5lLzMyNzk2MQ
|
||||
REVIEW_COLUMN: Z2lkOi8vcmFwdG9yL1BpcGVsaW5lLzIyNjk0MTA
|
||||
@@ -0,0 +1,20 @@
|
||||
name: Zenhub integration PR
|
||||
on:
|
||||
pull_request:
|
||||
branches: [ develop ]
|
||||
types:
|
||||
- ready_for_review
|
||||
- opened
|
||||
|
||||
jobs:
|
||||
build:
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- uses: status-im/zenhub-automations@master
|
||||
if: github.event.pull_request.draft == false
|
||||
with:
|
||||
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||
ZENHUB_API_KEY: ${{ secrets.ZENHUB_TOKEN }}
|
||||
INPROG_COLUMN: Z2lkOi8vcmFwdG9yL1BpcGVsaW5lLzMyODI1Mg
|
||||
NEXT_COLUMN: Z2lkOi8vcmFwdG9yL1BpcGVsaW5lLzMyNzk2MQ
|
||||
REVIEW_COLUMN: Z2lkOi8vcmFwdG9yL1BpcGVsaW5lLzIyNjk0MTA
|
||||
@@ -165,3 +165,7 @@ trace.edn
|
||||
|
||||
/app/
|
||||
project.clj
|
||||
|
||||
##appium
|
||||
test/appium/report/
|
||||
result.xml
|
||||
@@ -127,10 +127,17 @@ _tmpdir-rm: SHELL := /bin/sh
|
||||
_tmpdir-rm: ##@prepare Remove TMPDIR
|
||||
rm -fr "$(TMPDIR)"
|
||||
|
||||
# Remove directories and ignored files
|
||||
clean: SHELL := /bin/sh
|
||||
clean: _fix-node-perms _tmpdir-rm ##@prepare Remove all output folders
|
||||
git clean -dXf
|
||||
|
||||
# Remove directories, ignored and non-ignored files
|
||||
purge: SHELL := /bin/sh
|
||||
purge: _fix-node-perms _tmpdir-rm ##@prepare Remove all output folders
|
||||
git clean -dxf
|
||||
|
||||
|
||||
watchman-clean: export TARGET := watchman
|
||||
watchman-clean: ##@prepare Delete repo directory from watchman
|
||||
watchman watch-del $${STATUS_REACT_HOME}
|
||||
@@ -149,12 +156,15 @@ keystore: export KEYSTORE_PATH ?= $(HOME)/.gradle/status-im.keystore
|
||||
keystore: ##@prepare Generate a Keystore for signing Android APKs
|
||||
@./scripts/generate-keystore.sh
|
||||
|
||||
fdroid-nix-dir: ##@prepare Create /nix directory for F-Droid Vagrant builders
|
||||
mkdir -m 0755 /nix
|
||||
chown vagrant /nix
|
||||
|
||||
#----------------
|
||||
# Release builds
|
||||
#----------------
|
||||
release: release-android release-ios ##@build build release for Android and iOS
|
||||
release: release-android release-ios ##@build Build release for Android and iOS
|
||||
|
||||
release-android: export TARGET := default
|
||||
release-android: export BUILD_ENV ?= prod
|
||||
release-android: export BUILD_TYPE ?= nightly
|
||||
release-android: export BUILD_NUMBER ?= $(TMP_BUILD_NUMBER)
|
||||
@@ -162,12 +172,21 @@ release-android: export KEYSTORE_PATH ?= $(HOME)/.gradle/status-im.keystore
|
||||
release-android: export ANDROID_APK_SIGNED ?= true
|
||||
release-android: export ANDROID_ABI_SPLIT ?= false
|
||||
release-android: export ANDROID_ABI_INCLUDE ?= armeabi-v7a;arm64-v8a;x86
|
||||
release-android: keystore ##@build build release for Android
|
||||
release-android: keystore ##@build Build release for Android
|
||||
scripts/release-android.sh
|
||||
|
||||
release-fdroid: export BUILD_ENV = prod
|
||||
release-fdroid: export BUILD_TYPE = release
|
||||
release-fdroid: export ANDROID_APK_SIGNED = false
|
||||
release-fdroid: export ANDROID_ABI_SPLIT = false
|
||||
release-fdroid: export ANDROID_ABI_INCLUDE = armeabi-v7a;arm64-v8a;x86;x86_64
|
||||
release-fdroid: ##@build Build release for F-Droid
|
||||
echo "GOOGLE_FREE=1" >> .env.release
|
||||
scripts/release-android.sh
|
||||
|
||||
release-ios: export TARGET := ios
|
||||
release-ios: export BUILD_ENV ?= prod
|
||||
release-ios: watchman-clean ##@build build release for iOS release
|
||||
release-ios: watchman-clean ##@build Build release for iOS release
|
||||
@git clean -dxf -f target/ios && \
|
||||
$(MAKE) jsbundle-ios && \
|
||||
xcodebuild -workspace ios/StatusIm.xcworkspace -scheme StatusIm -configuration Release -destination 'generic/platform=iOS' -UseModernBuildSystem=N clean archive
|
||||
@@ -234,15 +253,12 @@ endif
|
||||
lint: export TARGET := clojure
|
||||
lint: ##@test Run code style checks
|
||||
yarn clj-kondo --confg .clj-kondo/config.edn --lint src && \
|
||||
clojure -Sdeps '{:deps {cljfmt {:mvn/version "0.6.7"}}}' \
|
||||
-m cljfmt.main check $$(git diff --diff-filter=d --cached --name-only src && echo src) \
|
||||
--indents indentation.edn
|
||||
TARGETS=$$(git diff --diff-filter=d --cached --name-only src && echo src) && \
|
||||
clojure -Scp "$$CLASS_PATH" -m cljfmt.main check --indents indentation.edn $$TARGETS
|
||||
|
||||
lint-fix: export TARGET := clojure
|
||||
lint-fix: ##@test Run code style checks and fix issues
|
||||
clojure -Sdeps '{:deps {cljfmt {:mvn/version "0.6.7"}}}' \
|
||||
-m cljfmt.main fix src \
|
||||
--indents indentation.edn
|
||||
clojure -Scp "$$CLASS_PATH" -m cljfmt.main fix src --indents indentation.edn
|
||||
|
||||
test: export TARGET := clojure
|
||||
test: ##@test Run tests once in NodeJS
|
||||
|
||||
@@ -1,6 +1,9 @@
|
||||
|
||||
# Status - a Mobile Ethereum Operating System
|
||||
|
||||
[<img src="https://play.google.com/intl/en_us/badges/images/generic/en-play-badge.png" alt="Get it on Google Play" height="80"/>](https://play.google.com/store/apps/details?id=im.status.ethereum)
|
||||
[<img src="https://fdroid.gitlab.io/artwork/badge/get-it-on.png" alt="Get it on F-Droid" height="80"/>](https://f-droid.org/packages/im.status.ethereum/)
|
||||
[<img src="doc/github_badge.png" alt="Get it on Github" height="80"/>](https://github.com/status-im/status-react/releases)
|
||||
|
||||
Join us in creating a browser, messenger, and gateway to a decentralized world. Status is a free (libre) open source mobile client targeting Android & iOS built entirely on [Ethereum](https://ethereum.org/) technologies. That's right, no middle men and `go-ethereum` running directly on your device.
|
||||
|
||||
[](https://www.youtube.com/watch?v=oDCSEmS9c3o "Getting started with Status")
|
||||
|
||||
+975
@@ -0,0 +1,975 @@
|
||||
## 1.11
|
||||
### iOS
|
||||
#### Excerpt
|
||||
V1.11 also makes some improvements to the overall Status experience. Improved compatibility with DApps creates a more seamless experience with your favorite DeFi, NFT, and other decentralized applications. Improvements to Status Nodes and fixes to Android notifications have been made for better performance with private, group chats and public chats.
|
||||
|
||||
Update in the App Store or Google Play if you do not have auto updates enabled.
|
||||
|
||||
For the full changelog, see Github https://github.com/status-im/status-react/milestone/49?closed=1
|
||||
|
||||
#### Added
|
||||
- Add Giphy url support in chat
|
||||
- The Graph (GRT) erc-20 token added to the default list
|
||||
|
||||
#### Changed
|
||||
- Improved compatibility with DApps
|
||||
- Sync with Status Nodes improvements
|
||||
|
||||
#### Fixed
|
||||
- Fixes to Android notifications
|
||||
- UI fixes
|
||||
- Sluggish performance on private group chats bug
|
||||
|
||||
### Android
|
||||
#### Excerpt
|
||||
V1.11 also makes some improvements to the overall Status experience. Improved compatibility with DApps creates a more seamless experience with your favorite DeFi, NFT, and other decentralized applications. Improvements to Status Nodes and fixes to Android notifications have been made for better performance with private, group chats and public chats.
|
||||
|
||||
Update in the App Store or Google Play if you do not have auto updates enabled.
|
||||
|
||||
For the full changelog, see Github https://github.com/status-im/status-react/milestone/49?closed=1
|
||||
|
||||
#### Added
|
||||
- Migrate existing account to Keycard
|
||||
- Add Giphy url support in chat
|
||||
- The Graph (GRT) erc-20 token added to the default list
|
||||
|
||||
#### Changed
|
||||
- Improved compatibility with DApps
|
||||
- Sync with Status Nodes improvements
|
||||
|
||||
#### Fixed
|
||||
- Fixes to Android notifications
|
||||
- UI fixes
|
||||
- Sluggish performance on private group chats bug
|
||||
|
||||
## 1.10
|
||||
### iOS
|
||||
#### Excerpt
|
||||
Status version 1.10 is here and it is a perfect way to kick off 2021! Another feature rich update that makes the overall messaging, browsing, and transacting experience a whole lot better. Save your most frequently used DApps as favorites for one tap access to DeFi, NFTs, and more. Set a profile image to express yourself in chat. Speed up and cancel pending transactions and pull down to check for new transactions.
|
||||
|
||||
#### Added
|
||||
- Pull to refresh on individual account view
|
||||
- Save dapps as favorite
|
||||
- Switch between dapps in multiple tabs
|
||||
- Banner to find dapps to buy crypto
|
||||
- Sent message confirmation icon
|
||||
|
||||
#### Changed
|
||||
- Manage dapp permissions without leaving the browser
|
||||
- Keycard pairing code updated to readible 5 symbol code
|
||||
- Profile and settings back to most right position in tab bar
|
||||
|
||||
#### Fixed
|
||||
- Visibility of tab bar in dark mode
|
||||
- Watching accounts for transaction in chat messages (update status)
|
||||
- Multiple notifications for a single erc20 transfer
|
||||
- Change group chat name when '/' character is included
|
||||
- Show transaction in chat for small amounts
|
||||
- Correction to transaction status in chat
|
||||
- Rotate mailservers on error return
|
||||
- Remove unused transport security entries
|
||||
- Send chat messages in order so that text is always below image
|
||||
- Performance of list rendering
|
||||
- Alignment and image flickering issues in status updates
|
||||
- Disallow multiple pop ups to be shown at the same time
|
||||
- Add multiple custom history nodes without relogin
|
||||
|
||||
|
||||
### Android
|
||||
#### Excerpt
|
||||
Status version 1.10 is here and it is a perfect way to kick off 2021! Another feature rich update that makes the overall messaging, browsing, and transacting experience a whole lot better. Bookmark your most frequently used DApps for one tap access to DeFi, NFTs, and more. Set a profile image to express yourself in chat. Speed up and cancel pending transactions and pull down to check for new transactions.
|
||||
|
||||
#### Added
|
||||
- Pull to refresh on individual account view
|
||||
- Save dapps as favorite
|
||||
- Switch between dapps in multiple tabs
|
||||
- Banner to find dapps to buy crypto
|
||||
- Sent message confirmations
|
||||
|
||||
#### Changed
|
||||
- Install with deeplink to public chat (Join to fetch messages)
|
||||
- Manage dapp permissions without leaving the browser
|
||||
- Keycard pairing code updated to readible 5 symbol code
|
||||
- Profile and settings back to most right position in tab bar
|
||||
|
||||
#### Fixed
|
||||
- Visibility of tab bar in dark mode
|
||||
- Watching accounts for transaction in chat messages (update status)
|
||||
- Multiple notifications for a single erc20 transfer
|
||||
- Change group chat name when '/' character is included
|
||||
- Show transaction in chat for small amounts
|
||||
- Correction to transaction status in chat
|
||||
- Rotate mailservers on error return
|
||||
- Remove unused transport security entries
|
||||
- Send chat messages in order so that text is always below image
|
||||
- Performance of list rendering
|
||||
- Alignment and image flickering issues in status updates
|
||||
- Disallow multiple pop ups to be shown at the same time
|
||||
- Add multiple custom history nodes without relogin
|
||||
|
||||
|
||||
## 1.9
|
||||
### iOS
|
||||
#### Excerpt
|
||||
With release 1.9, Status gives you the tools to better connect and engage with your friends and communities. You'll find a whole new tab for Status updates. Share what's on your mind and follow what your contacts are up to.
|
||||
|
||||
Status updates, and any chat, are now more colorful with opt in link previews.
|
||||
|
||||
#### Full
|
||||
|
||||
#### Added
|
||||
* Profile status updates
|
||||
* Add unfurling of URLs in chats (YouTube)
|
||||
* Onboarding into public chats
|
||||
|
||||
#### Changed
|
||||
* Add backwards compatibility for ENS Usernames
|
||||
* Account cards design to accomodate high value accounts
|
||||
* Rename Status account to Ethereum account for first account on onboarding
|
||||
* Remove manual fetch 24h in bottom sheet
|
||||
* Pinch to zoom on images
|
||||
|
||||
#### Fixed
|
||||
* Personal sign method
|
||||
* Slow asset list
|
||||
* Loading of older transactions (< April)
|
||||
* Loading of message history after rejoining a public chat
|
||||
* Unread message counter update when other user replies to own message
|
||||
* App crash on navigation from and to generate keys in onboarding
|
||||
|
||||
|
||||
### Android
|
||||
#### Excerpt
|
||||
With release 1.9, Status gives you the tools to better connect and engage with your friends and communities. You'll find a whole new tab for Status updates. Share what's on your mind and follow what your contacts are up to.
|
||||
|
||||
Status updates, and any chat, are now more colorful with opt in link previews.
|
||||
|
||||
#### Full
|
||||
|
||||
#### Added
|
||||
* Profile status updates
|
||||
* Add unfurling of URLs in chats (YouTube)
|
||||
* In-app local notifications for transactions(Beta)
|
||||
* Onboarding into public chats
|
||||
|
||||
|
||||
#### Changed
|
||||
* Add backwards compatibility for ENS Usernames
|
||||
* Account cards design to accomodate high value accounts
|
||||
* Rename Status account to Ethereum account for first account on onboarding
|
||||
* Remove manual fetch 24h in bottom sheet
|
||||
* Pinch to zoom on images
|
||||
|
||||
#### Fixed
|
||||
* Personal sign method
|
||||
* Slow asset list
|
||||
* Loading of older transactions (< April)
|
||||
* Loading of message history after rejoining a public chat
|
||||
* Unread message counter update when other user replies to own message
|
||||
* App crash on navigation from and to generate keys in onboarding
|
||||
|
||||
|
||||
|
||||
## 1.8
|
||||
see https://notes.status.im/release-1.8-notes#
|
||||
### Android + iOS
|
||||
#### Excerpt
|
||||
|
||||
#### Full
|
||||
##### V1.8 Release - More people, more private & bug fixes
|
||||
|
||||
This release includes updates that further improve private communication and your control over it. Group chats can now include up to 20 members (previously 10). With this increase, group chat preserves it's confidentiality, e2e encryption, and perfect forward secrecy that come with 1:1 private chats; Now usable with larger groups, without negatively impacting the network. Truly private group chats.
|
||||
|
||||
Additionally, you can now opt out of 'History nodes' under Sync settings. With this option you control if you are ok sharing your IP address with a server in order to collect messages send while you were offline. In case you didn't know, you can also [run your own history node](https://status.im/technical/run_status_node.html) to connect to.
|
||||
|
||||
Finally, when you receive a new ERC-20 token you can now add it to your wallet by tapping 'Scan tokens'.
|
||||
|
||||
|
||||
|
||||
#### Added
|
||||
* Increased private group chat size to 20
|
||||
* Allow users not to connect to history nodes
|
||||
* Added scan button to fetch ERC-20 tokens
|
||||
|
||||
#### Fixed
|
||||
* Fix browser issues with logging in on github.com
|
||||
* Fix bug with mentions not resolved in messages with markdown
|
||||
* Fix blank view when open yearn.finance
|
||||
* Fix entering “0x” in recipient field
|
||||
|
||||
Update in the [App Store](https://apps.apple.com/us/app/status-private-communication/id1178893006) or [Google Play](https://play.google.com/store/apps/details?id=im.status.ethereum) if you do not have auto updates enabled.
|
||||
|
||||
The APK available is [here](https://status-im-files.ams3.cdn.digitaloceanspaces.com/StatusIm-Mobile-v1.8.0.apk).
|
||||
|
||||
For the full changelog, see our [Github](https://github.com/status-im/status-react/commits/release/1.8.x).
|
||||
> [Verify APK link before publishing blog post]
|
||||
>
|
||||
|
||||
## 1.7.2
|
||||
|
||||
This release fixes an issue with fetching ERC20 balance. It was due to a contract that has been migrated to a different address which cause the whole request to fail.
|
||||
|
||||
|
||||
## 1.7.1
|
||||
Full release commits: https://github.com/status-im/status-react/commits/release/1.7.1
|
||||
### Android + iOS
|
||||
#### Excerpt
|
||||
Several users have reported an issue in upgrading from release 1.6.1 to release 1.7. This update fixes the issue.
|
||||
|
||||
#### Full
|
||||
Several users have reported an issue in upgrading from release 1.6.1 to release 1.7. This update fixes the issue.
|
||||
|
||||
The issue occurs when the application is killed during a migration that is part of the update. Killing the app causes the migration to fail and leaves a persistent database error. This error prevents users from unlocking their profile; Showing an error on password entry. The fix provided above resolves this issue by restarting the migration. It also prevents the issue from occuring if you haven’t updated yet.
|
||||
|
||||
So far we’ve only received reports on this issue occurring on Android. We’re monitoring closely to see if further action is required and will take action to prevent this issue from occuring in future updates. Many thanks to our ambassador tbenr and others who reported this issue.
|
||||
|
||||
#### Fixed
|
||||
Retry failed migration
|
||||
|
||||
|
||||
## 1.7
|
||||
Full release commits: https://github.com/status-im/status-react/commits/release/1.7.x
|
||||
|
||||
### Android
|
||||
#### Excerpt (446 characters including spaces)
|
||||
Introducing the ability to mention and be mentioned (Beta). A host of other updates make it easier to recognize people and addresses. Status uses the infamous animal random names by default to provide pseudo-anonymity. You can now give 'Trusting Honeydew Panda' a nickname to recognize them. When sending transactions you can save and select favorite addresses. A safeguard will warn you when sending funds to a contract to prevent loss of funds.
|
||||
|
||||
#### Full
|
||||
Introducing the ability to mention and be mentioned. Note that this feature is in Beta, your feedback is much appreciated. Aside from Mentions, this release includes a host of other updates that are all about making it easier for you to recognize people and addresses. Status uses the infamous animal random names by default to provide pseudo-anonymity. While your best friend might be the 'Trusting Honeydew Panda' you can now give them a nickname to recognize them. Sending transactions got easier with the new feature to save and select favorite addresses. A safeguard will warn you when sending funds to a contract to prevent loss of funds.
|
||||
|
||||
|
||||
#### Added
|
||||
* Mentions (Beta)
|
||||
* Local nicknames
|
||||
* Wallet address selection (favorites, contacts, recent)
|
||||
* Private group chat invite links
|
||||
* Warning when attempting to send a transaction to a contract
|
||||
* New tokens: UNI, COMP, BAL, AKRO, OXT, aUSDC
|
||||
* Collapse long messages for more readible threads
|
||||
|
||||
#### Changed
|
||||
* Removed the ability to enable using Whisper instead of Waku
|
||||
|
||||
#### Fixed
|
||||
* Upgrade phishing detection library
|
||||
* Decimal rounding when using 'Set max'
|
||||
* ENS resolving for IPNS names
|
||||
* SUPR support for old and new token contract
|
||||
|
||||
|
||||
|
||||
|
||||
### iOS
|
||||
#### Excerpt (496 characters incl spaces)
|
||||
Introducing privacy preserving notifications on iOS. Paired with the ability mention and be mentioned (Beta). A host of other updates make it easier to recognize people and addresses. Status uses the infamous animal random names by default to provide pseudo-anonymity. You can now give 'Trusting Honeydew Panda' a nickname to recognize them. When sending transactions you can save and select favorite addresses. A safeguard will warn you when sending funds to a contract to prevent loss of funds.
|
||||
|
||||
#### Full
|
||||
Introducing privacy preserving, remote notifications on iOS. Paired with the ability mention and be mentioned. Note that this feature is in Beta, your feedback is much appreciated. Aside from Mentions, this release includes a host of other updates that are all about making it easier for you to recognize people and addresses. Status uses the infamous animal random names by default to provide pseudo-anonymity. While your best friend might be the 'Trusting Honeydew Panda' you can now give them a nickname to recognize them. Sending transactions got easier with the new feature to save and select favorite addresses. A safeguard will warn you when sending funds to a contract to prevent loss of funds.
|
||||
|
||||
#### Added
|
||||
* (Remote) Notifications on iOS
|
||||
* Mentions (Beta)
|
||||
* Local nicknames
|
||||
* Wallet address selection (favorites, contacts, recent)
|
||||
* Private group chat invite links
|
||||
* Warning when attempting to send a transaction to a contract
|
||||
* New tokens: UNI, COMP, BAL, AKRO, OXT, aUSDC
|
||||
* Collapse long messages for more readible threads
|
||||
#### Changed
|
||||
* Removed the ability to enable using Whisper instead of Waku
|
||||
|
||||
#### Fixed
|
||||
* Upgrade phishing detection library
|
||||
* Decimal rounding when using 'Set max'
|
||||
* ENS resolving for IPNS names
|
||||
* SUPR support for old and new token contract
|
||||
|
||||
|
||||
## 1.6.1
|
||||
### Android + iOS
|
||||
#### Excerpt
|
||||
Introducing a spam mitigation
|
||||
#### Full
|
||||
Introducing a spam mitigation
|
||||
##### Fixed
|
||||
- Restrict message size on input
|
||||
- Drop messages based on character length
|
||||
|
||||
|
||||
## 1.6
|
||||
### Android
|
||||
#### Excerpt
|
||||
#### Full
|
||||
This release includes a small, but important change to existing functionality: Onboard using a 'Referral URL'. You can confirm that you discovered the app through a partner of Status (Opt-in only). It also includes a fix to a persistant bug that resulted in messages not being marked as seen.
|
||||
|
||||
##### Changed
|
||||
- Attribute a referrer when installing and onboarding to the app using a Referral URL
|
||||
|
||||
##### Fixed
|
||||
- Mark 1:1 messages as seen (Badge kept reappearing when tapping 'Add as contact')
|
||||
|
||||
### iOS
|
||||
#### Excerpt
|
||||
#### Full
|
||||
This release includes a fix to a persistant bug that resulted in messages not being marked as seen as well as an issue that caused the app to crash.
|
||||
##### Fixed
|
||||
- Mark 1:1 messages as seen (Badge kept reappearing when tapping 'Add as contact')
|
||||
- Crash on iOS when device passcode is switched off and 'Save password' is enabled inside the app
|
||||
|
||||
|
||||
## 1.5
|
||||
### Excerpt (493 characters excl url)
|
||||
Now including those features that make you feel connected while being miles apart. If there was a time you wondered if you could chat with friends and family, without giving up your privacy or security, wonder no more. Send images, audio messages, and show your love with emoji reactions ❤️; Not a word is sent to the cloud. #appdown is not a thing. E2E encryption is. If you have Internet you can send and receive messages. Securely. Privately. Always.
|
||||
For the full changelog, see our Github
|
||||
|
||||
### Full
|
||||
Now including those features that make you feel connected while being miles apart. If there was a time you wondered if you could chat with friends and family, without giving up your privacy or security, wonder no more. Send images, audio messages, and show your love with emoji reactions ❤️; Not a word is sent to the cloud. #appdown is not a thing. E2E encryption is. If you have Internet you can send and receive messages. Securely. Privately. Always.
|
||||
|
||||
Making new friends on open communities is now easier as well. We took the liberty of surfacing a few active public chats by category.
|
||||
|
||||
For the full changelog, see our Github
|
||||
|
||||
|
||||
#### Added
|
||||
* Send images in 1:1 and group chats
|
||||
* React with emojis to any message
|
||||
* Send voice messages in 1:1 and group chats
|
||||
* Discover public chats by category
|
||||
* Ability to delete an account
|
||||
|
||||
#### Changed
|
||||
* Major interface improvements throughout, introducing our Quo component framework
|
||||
* Auto-forwarding of the onboarding carousel
|
||||
* Clarify and move 'Access existing keys' to import accounts
|
||||
* Showing password entry and confirmation on the same screen
|
||||
* Add contacts or invite friends from Contacts
|
||||
* Searchbar includes search for ENS names
|
||||
|
||||
|
||||
#### Fixed
|
||||
|
||||
|
||||
|
||||
## 1.4.1 - Round of improvements
|
||||
### Excerpt
|
||||
This intermediate release, 1.4.1, includes bug fixes as well as UX and accessibility improvements. Most visibly, a gorgeous set of new icons, accessible input fields and toggling password entry visibility. Next to that the release includes updates to Notifications on Android, like being able to open Status, as well as close the notification service, directly from the notification banner.
|
||||
|
||||
For the full changelog, see our [Github](https://github.com/status-im/status-react/commits/release/1.4.x)
|
||||
|
||||
|
||||
### Full
|
||||
While focused on building new features there are a few improvements we did not want to hold off on sharing. This intermediate release, 1.4.1, includes bug fixes as well as UX and accessibility improvements. Most visibly, a gorgeous set of new icons, accessible input fields and toggling password entry visibility. Next to that the release includes updates to Notifications on Android, like being able to open Status, as well as close the notification service, directly from the notification banner.
|
||||
|
||||
For the full changelog, see our [Github](https://github.com/status-im/status-react/commits/release/1.4.x).
|
||||
|
||||
|
||||
|
||||
#### Added
|
||||
- Language support for Keycard use with Status (see our supported languages in [FAQ](https://status.im/faq/))
|
||||
|
||||
#### Changed
|
||||
- Open the app and close the notification service from the notification banner
|
||||
- More informative error messages for transaction overview contract and network fees
|
||||
- Added a check for encoded characters in urls to increase browser security
|
||||
- More accessible text input
|
||||
- Replace icons with a more unified, carefully crafted set
|
||||
- Update connectivity snackbar to explain messages can still be send and received when offline; only history does not sync
|
||||
|
||||
#### Fixed
|
||||
- ENS name is no longer infinitely pending when transaction has failed
|
||||
- Added explainer that restart of the app is required to Disable logs
|
||||
- Changed notification icon styling to follow convention of other apps
|
||||
- Fixed critical issue that caused occasional app crashes
|
||||
- Now giving feedback when blocking users is in progress
|
||||
- Apply dark mode/light mode changes to System panel
|
||||
- Update balance of custom tokens to be visible upon adding the token
|
||||
- Show chat view after chat search gives no results (chat list showed up empty)
|
||||
- Bring back numpad to sign with Keycard after dismissing an error (e.g. having tapped an unpaired card)
|
||||
- Keyboard changes (include decimals for amount input and auto-capitalization)
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
## 1.4 - Keycard, notifications DRAFT
|
||||
In version 1.4, Status introduces a much anticipated integration with Keycard - the secure, contactless hardware wallet, also designed and developed by The Status Network. This integration enables Keycard holders to store their private keys offline on the Keycard device, add hardware-enforced authorizations to all of their transactions, and introduce two-factor authentication to log into their Status account.
|
||||
|
||||
Another highly anticipated feature is the introduction of notifications. These notifications are [ANDRE to add detail]....
|
||||
|
||||
The final addition to v1.4 is the introduction of browser support for EIP 1139 – A JavaScript Ethereum Provider API for consistency across clients and applications.
|
||||
|
||||
Beyond that, version 1.4 includes some updates to the FAQ, extended translation support, and some fixes to ENS username displays, dark mode contrast, QR code scanner and more.
|
||||
|
||||
For the full changelog, see our [Github](https://github.com/status-im/status-react/commits/release/1.4.x).
|
||||
|
||||
#### Added
|
||||
- Keycard integration on Android
|
||||
- Browser support for eip-1193 (?)
|
||||
- Notifications (Android)
|
||||
- Content type for images in preparation of 'Images in chat' release
|
||||
|
||||
#### Changed
|
||||
- Extended and consolidated FAQ
|
||||
- Extended translation support
|
||||
- Animation in header (Profile + Wallet)
|
||||
|
||||
|
||||
#### Fixed
|
||||
- ENS in chat only when transaction is confirmed
|
||||
- Dark mode contrast (increased)
|
||||
- Updated and expanded token icons
|
||||
- Resolved error on scrolling account view
|
||||
- Parse markdown in subheader chat list
|
||||
- Banner to back up seed phrase tappable
|
||||
- [Chat performance improvements](https://github.com/status-im/status-react/pull/10711)
|
||||
- QR code scanning issue when scanning from join.status.im
|
||||
|
||||
|
||||
## 1.3 - Dark Mode, Group Chat
|
||||
|
||||
In version 1.3, Status catches up to the most important design trend in recent history with the introduction of a dark mode.
|
||||
|
||||
Hyperbolic? Perhaps, but we've heard your requests and we made it happen. Your app's appearance will now default to match your system settings, but if you'd like, you can head to `Profile` > `Appearance` to override it. Dark mode sure is easy on the eyes.
|
||||
|
||||
Beyond that, we're bringing back private groups, another highly requested feature. Private groups allow you to add up to 9 friends to an invite-only chat. At the protocol level, group chats in Status function similarly to 1:1 chats. They're encrypted end-to-end and utilise perfect forward secrecy to protect your privacy.
|
||||
|
||||
In the future, we'd like to expand these to host more than 10 members. We'll embark on further testing to determine the upper limit that our current protocol can support.
|
||||
|
||||
Lastly, we've changed our webview implementation over to the react-native-community package, to remain in sync with the React Native community and benefit from upstream improvements.
|
||||
|
||||
As always, we've also included a few nice fixes in this release. For the full changelog, [see our Github](https://github.com/status-im/status-react/commits/release/1.3.x).
|
||||
|
||||
|
||||
#### Added
|
||||
- Dark mode
|
||||
- Group chat
|
||||
|
||||
#### Changed
|
||||
- Browser implementation now using react-native-community webview package
|
||||
|
||||
#### Fixed
|
||||
- Updates to back navigation
|
||||
- Persistant wallet value
|
||||
- Update to all text input, increasing pressable areas
|
||||
- Improved seed phrase text input on small screens
|
||||
- Easier to find user's public key for sharing (https://github.com/status-im/status-react/pull/10207#event-3163431514)
|
||||
- Shortened universal links (https://github.com/status-im/status-react/issues/10083)
|
||||
|
||||
## 1.2
|
||||
|
||||
### Short Version
|
||||
|
||||
The change log is small, but significant! We've enabled mailservers that use our forked version of Whisper, known as Waku. Waku servers reduces bandwidth consumption by the app and enable Status to serve more concurrent users.
|
||||
|
||||
A few bug fixes and optimizations are included, too.
|
||||
|
||||
### Blog Post
|
||||
|
||||
This release is one of the most important in Status' history. The change log is small, but significant. Today we're rolling out new mailservers that use our fork of the Whisper messaging protocol, known as Waku.
|
||||
|
||||
Waku mailservers prevent Status from using excessive mobile bandwidth. With Waku, Status can support 10 times as many users as with Whisper servers alone.
|
||||
|
||||
Regular Whisper mailservers use topic-based filters to surface only the chats that you want to see, but your device still receives all messages sent over the network. Filtration happens after the fact.
|
||||
|
||||
To save on resources, Waku mailservers simply tell other nodes in the network which topics your device would like to receive content for, filtering before the messages reach your device.
|
||||
|
||||
Heavy message traffic can be incredibly resource intensive, depending on how many topics you follow. For a heavy user, the difference can amount to several hundred kilobytes of data per minute.
|
||||
|
||||
There is a potential privacy tradeoff in making your followed topics apparent to other nodes—it is easier to know if a given IP address belongs to a certain chat.
|
||||
|
||||
In v1.2, we offer the legacy Whisper servers as an option under `Advanced` settings. You can disable Waku by toggling `Waku enabled`. Waku mailservers talk to existing mailservers without any disruption.
|
||||
|
||||
With further improvements to Waku in the pipeline, Status becomes accessible to even more users and can deliver peer-to-peer messaging without draining unnecessary data.
|
||||
|
||||
|
||||
|
||||
### Changelog
|
||||
|
||||
#### Changed
|
||||
- Waku mailservers
|
||||
- Updating wallet fiat prices even more frequently (awaiting clarification)
|
||||
|
||||
#### Fixed
|
||||
- App crashing when webview is closed
|
||||
- Messages not showing when received while on a different tab
|
||||
- Token balances displayed as 0 after relogin
|
||||
|
||||
## 1.1
|
||||
|
||||
Biggest changes:
|
||||
- Status now support importing private key and seed phrase inside multiaccount!
|
||||
(https://github.com/status-im/status-react/pull/10100)
|
||||
- all chat dialogs moved to bottom sheet
|
||||
- added "Mark all as read" option
|
||||
- unread badge is changed for public chat
|
||||
|
||||
More detailed:
|
||||
|
||||
ENS name improvements:
|
||||
|
||||
- https://github.com/status-im/status-react/pull/9952 - fixes ENS to new registry
|
||||
- https://github.com/status-im/status-react/pull/9997 - Check for empty public key (for ENS names)
|
||||
- https://github.com/status-im/status-react/pull/10007 - improve ENS display in Public chats
|
||||
- https://github.com/status-im/status-react/pull/10022 - fix crash on long ENS names
|
||||
|
||||
|
||||
General improvements:
|
||||
|
||||
- https://github.com/status-im/status-react/pull/10027 - deep link handling (rename get.status.im to join.status.im)
|
||||
- https://github.com/status-im/status-react/pull/9940 - changed navigation on logout
|
||||
- https://github.com/status-im/status-react/pull/9917 - added search to currencies and assets
|
||||
- https://github.com/status-im/status-react/pull/9941 - improvement on snackbar by considering login time (less "Offline", "Connected" after login)
|
||||
- https://github.com/status-im/status-react/pull/9898 - added qr code reader for scanning QR when add watch-only address
|
||||
- https://github.com/status-im/status-react/pull/9882 - Respond to FaceID failure callback
|
||||
- https://github.com/status-im/status-react/pull/9915 - Make bottom sheet height dynamical
|
||||
- https://github.com/status-im/status-react/pull/9931 - 2 lines for user name on intro screen
|
||||
|
||||
Chat improvements:
|
||||
- https://github.com/status-im/status-react/pull/10056 - added "Mark all as read" feature
|
||||
- https://github.com/status-im/status-react/pull/9993, https://github.com/status-im/status-react/pull/9999 - better handling of ENS names / chat keys when starting new chat
|
||||
- https://github.com/status-im/status-react/pull/10117 - reworked unread message indicator in public chats
|
||||
- https://github.com/status-im/status-react/pull/9868 - all chat dialogs are moved to bottom sheets
|
||||
|
||||
Performance improvements:
|
||||
- https://github.com/status-im/status-react/pull/9995 - Offload chat messages
|
||||
- https://github.com/status-im/status-react/pull/10120 - Android app UI is slow after background
|
||||
|
||||
Issues fixed:
|
||||
- https://github.com/status-im/status-react/issues/10002
|
||||
- https://github.com/status-im/status-react/issues/8797
|
||||
- https://github.com/status-im/status-react/issues/6839
|
||||
- https://github.com/status-im/status-react/issues/9754
|
||||
- https://github.com/status-im/status-react/issues/10044
|
||||
- https://github.com/status-im/status-react/issues/10041
|
||||
- https://github.com/status-im/status-react/issues/9886
|
||||
|
||||
## 1.0
|
||||
|
||||
### Blog Post
|
||||
|
||||
Status version 1 is live!
|
||||
|
||||
After nearly a year of quiet and focused development, we've restructured the core application, built out the promises of the white paper and prepared the app for a future in which the Status Network seeks to deliver on the promises of Ethereum at large.
|
||||
|
||||
While the core mobile application is no longer the sole focus of the Status Network, it is integral to our dream of a decentralized web. With Status, we're building not just a tool for private and secure communication, but a gateway into an emerging ecosystem of distributed applications that embodies what is possible with decentralized technologies today. We believe apps like Status represent the future of the web—enabling an internet that can uphold human rights, and providing a path towards more open and equitable systems.
|
||||
|
||||
Today, the underpinninngs of the core application are still tethered to the Ethereum stack. Whisper is still the communication layer of Status, and Status is still the only production use case of Whisper.
|
||||
|
||||
The scalability of Whisper is not significantly improved from what it was roughly three years ago, when we first embarked on this project. We face immense challenge in building on this stack every day.
|
||||
|
||||
But we also feel ready to share our progress with the world. Status version 1 launches with the Ethereum wallet, web3-enabled browser and peer-to-peer messenger that our community knows well. It includes new SNT utility features, like a sticker marketplace and a decentralized DApp directory (https://dap.ps). Other white paper features, such as the fiat-to-crypto Teller Network and incentivized messaging with Tribute to Talk, are well underway.
|
||||
|
||||
Most pressingly, we're working to remedy the limitations of Whisper. In a forthcoming release, we'll introduce Waku mailservers, which will reduce the amount of bandwidth Status consumes—an important point for accessibility—and extend the capabilities of our nodes so that Status can support more concurrent users.
|
||||
|
||||
|
||||
[Link to user guide]
|
||||
[Link to roadmap]
|
||||
[Shoutout contributors & team]
|
||||
Huge shout out to our contributors:
|
||||
Enrico
|
||||
Yalu (user GH name)
|
||||
Acolytec3
|
||||
|
||||
-----
|
||||
|
||||
**Support comms**
|
||||
- How to submit stickers for sticker marketplace ([google form](https://docs.google.com/forms/d/19itZB_V5bVW4cyV8a2ifDWHuQSr9V_dkVMCl6ARxOag/edit))
|
||||
- How to share your feedback with us (#status, primarily)
|
||||
- Learn more about Status - Glossary, [FAQs up-to-date](https://status.im/docs/FAQs.html), [user guide by Jonny](https://docs.google.com/presentation/d/11o53KGcuzKouDU5VBeTB01mLCm41hKKuraz-AaudsEg/edit#slide=id.p)
|
||||
- How to release your ENS name ([here](https://hackmd.io/QrfTRP6sQ9aQzjFyb_IfRQ?both))
|
||||
- How to set up your existing ENS name ([here](https://hackmd.io/QrfTRP6sQ9aQzjFyb_IfRQ?both))
|
||||
|
||||
-----
|
||||
|
||||
**v1.0 Change Log**
|
||||
**Added**
|
||||
• Support for multiple Ethereum wallets within one Status account
|
||||
• Generate unlimited additional BIP 44 wallets in Status
|
||||
• Add watch-only addresses as well
|
||||
• Brand new onboarding and key encryption flow
|
||||
• Choose your random name and public chat key during onboarding
|
||||
• You also can recover a seed phrase from any mnemonic compatible wallet
|
||||
• Improvements to wallet transaction flow UI
|
||||
• Sticker market and two initial sticker packs
|
||||
• Choice of wallet to use when interacting with Dapps
|
||||
• [Proper markdown support](https://github.com/status-im/status-react/pull/9409#issue-338045622)
|
||||
• ENS username setting option for use in chat
|
||||
• Improved chat intro screen and public chat list
|
||||
• Updated chat command flow, with additional privacy layer to be compatible with multiaccount
|
||||
|
||||
**Removed**
|
||||
• Custom display names
|
||||
• Custom profile photos, temporarily—photos will become a feature of ENS
|
||||
• Push notifications—these will be improved and reintroduced for Android
|
||||
• Group chat, temporarily—fixes to be prioritized for v1.1
|
||||
• Google Firebase database and Realm.js DB—performance gains, and more in line with our principles (fewer third party services)
|
||||
|
||||
**Changed**
|
||||
• Algorithm for deriving public chat key changed, performance. (andrey review: pubkey or 3 word name?, not sure if Algorithm for deriving pubkey can be changed)
|
||||
• Storage of app state moved to Status-go—performance improvements in chat load times
|
||||
• Browser privacy mode enabled by default, option removed (EIP1102)
|
||||
• Updates to EIP1102 for compatibility (https://github.com/status-im/status-react/pull/9629)
|
||||
• Protocol breaking changes: removed transit encoding in favor of protobuf, for better performance and interoperability with other languages
|
||||
• Roughly 45% improvement in how quickly chats load
|
||||
• Profile screen cleaned up
|
||||
|
||||
|
||||
----
|
||||
|
||||
> Names and picture have changed as we use a different algorithm to generate it (linear > > feedback shift register instead of Mersienne Twister).
|
||||
> There are breaking changing between protocol, as agreed before, so no compatibility at all. Previous version won't be able to receive/send messages to v1.
|
||||
|
||||
> We confirmed the performance improvement with the test-team, roughly 45% improvement in how quickly chats load (maybe greater).
|
||||
>indeed, true, good move to make together.
|
||||
> but I would suggest to also add in the release changelog that the algorithm for deriving a > pubkey -> 3 word name changed, just because a standard was changed
|
||||
> this is also good to say because there is performance gains.
|
||||
|
||||
|
||||
## 0.13.2
|
||||
- V1 notification
|
||||
- Bug fixes:
|
||||
- Neverending loading indicator (#8550)
|
||||
- Last message jumps after chat is opened (#8556)
|
||||
- Sticker Market with two packs launched on mainnet
|
||||
- Account explorer in preparation for multi-account
|
||||
- Onboarding face lift (preparing for multiaccount/keycard)
|
||||
|
||||
## 0.13.0
|
||||
|
||||
This release comes with a long change log and one popularly requested new feature: custom, user-added ERC20 token support.
|
||||
|
||||
If you'd like to see a token that the Status wallet does not display by default, you can now add it yourself. From the wallet screen, open `Manage Assets` from the `...` menu and select `Add custom token`. Fill in the token's contract address, and the relevant information, and you will then be able to view this asset in your wallet.
|
||||
|
||||
We've also added and altered our privacy settings:
|
||||
|
||||
1) New `Preview privacy mode`: toggling this option in your profile will ensure that Status displays a blank screen when switching apps on your phone, to protect you from accidentally exposing your information while doing other things. Thanks to contributor [bitsikka](https://github.com/bitsikka) for this feature!
|
||||
2) `Browser privacy mode` has been relocated from the profile to the browser, and reconfigured into a two option setting. Selecting `Require my permission` for this setting ensures that privacy mode is on, but still means that some DApps may be incompatible with Status.
|
||||
|
||||

|
||||
|
||||
There are a few more important changes:
|
||||
|
||||
- `Fetch more messages` was introduced in 0.12.0 to fill gaps in your message history; it now backfills gaps of up to 30 days in public chats, increased from 24 hours.
|
||||
- We've removed the swipe functionality from the chat screen. To remove a chat, you can now tap on it and hold, pulling up a bottom menu. Another shout out to [bitsikka](https://github.com/bitsikka) for this change!
|
||||
- We've reintroduced bug reporting on both iOS and Android: shake your phone to pull up an email report, or enable `Development mode` from your profile screen to `Report a bug` from there.
|
||||
|
||||
Lastly, we've had some great contributions from the community for this release. They've added new features, refactored and even merged some changes to our developer tools.
|
||||
|
||||
Special thanks to [tbenr](https://github.com/tbenr), [bitsikka](https://github.com/bitsikka), [m0ar](https://github.com/m0ar) and [alexanmtz](https://github.com/alexanmtz) for your recent [commits](https://notes.status.im/CgruSsRzQVGhsagaLxXGqQ?view#0130-mobile-release)!
|
||||
|
||||
To get involved, you can find our current bounty issues on Gitcoin [LINK].
|
||||
|
||||
|
||||
|
||||
**Added**
|
||||
- Custom, user-added ERC20 support
|
||||
- New bug reporting options: shake device to send a report, with logs attached
|
||||
- Bloom Protocol token - thanks to contributor [m0ar](https://github.com/m0ar)!
|
||||
- Preview privacy mode to display blank Status screen when switching apps - thanks to contributor [bitsikka](https://github.com/bitsikka)!
|
||||
- URLs for transactions open in Status (partial [EIP681](https://github.com/ethereum/EIPs/blob/master/EIPS/eip-681.md) support)
|
||||
|
||||
**Changed**
|
||||
- Moved `Browser privacy Mode` toggle to the browser screen as new preference setting
|
||||
- `Fetch more messages` button now retrieves up to 30 days of history in public chats
|
||||
- Long press a chat for more options; no more swiping
|
||||
- Fewer messages rendered before a chat is scrolled for better performance ([8191](https://github.com/status-im/status-react/pull/8191))
|
||||
- Using checksummed addresses in wallet (EIP55) ([8121](https://github.com/status-im/status-react/issues/8121) and [4959](https://github.com/status-im/status-react/issues/4959))
|
||||
- Scanning QR code from a DApp does not cause redirect
|
||||
|
||||
**Fixed**
|
||||
- Browser crash when incorrect domain entered ([8239](https://github.com/status-im/status-react/issues/8239))
|
||||
- ENS registration bug ([8249](https://github.com/status-im/status-react/issues/8249))
|
||||
- Wallet balance updates correctly after Tx received ([8107](https://github.com/status-im/status-react/issues/8107))
|
||||
- Support for EIP1577/`contenthash` field for ENS
|
||||
- Numeric validation for `send`/`receive` chat commands ([1442](https://github.com/status-im/status-react/issues/1442))
|
||||
- Allow to select chat item below plus button ([7859](https://github.com/status-im/status-react/issues/7859))
|
||||
|
||||
|
||||
## 0.12.0
|
||||
|
||||
In this release, we're announcing the launch of Discover!
|
||||
|
||||
Discover is our new portal for exploring the decentralized web. It has long been our vision for Status to act as a gateway to the new web, just like Chrome or Safari do for web2.
|
||||
|
||||
Until this point, however, we've prioritized a curated list of DApps over an open-ended experience.
|
||||
|
||||
With the launch of Discover, our browser becomes just that—a browser, with special capabilities for web3.
|
||||
|
||||
Discover is its own web app and the new go-to for finding DApps. For now, we've ported over our existing list, with a few upgrades to the UI.
|
||||
|
||||
But in the near future, we're decentralizing Discover, enabling anyone to add a DApp and giving the community control over curation through an SNT voting mechanism. More on that [here](https://our.status.im/discover-preparing-for-launch/).
|
||||
|
||||
Discover can be accessed from any browser at https://dap.ps, so you can participate on desktop as well.
|
||||
|
||||
This release also comes with a noteworthy chat improvement. Previously, a gap in connection to the mail servers—which happens if Status is closed for more than 24 hours or otherwise loses connection—meant that some messages might be lost.
|
||||
|
||||
We now detect gaps where messages are missing and offer you the option to fetch the missing history. By tapping `Fetch messages` when it appears within a chat, you can backfill missing history. This is a big step forward for reliability in our peer-to-peer service.
|
||||
|
||||
**Added**
|
||||
- `Fetch messages` option to get missing message history
|
||||
- Discover is live on https://dap.ps
|
||||
|
||||
**Changed**
|
||||
- `DApps` screen is now fully browser-centric with address bar, history and a link to Discover
|
||||
|
||||
|
||||
**Fixed**
|
||||
- Contact syncing between 0.11.0 and newer builds
|
||||
- 503 error when accessing DApps
|
||||
- More reliable history for token transactions
|
||||
|
||||
## 0.11.0
|
||||
|
||||
Download 0.11.0 and you'll notice one thing right away: we have a new navigation!
|
||||
|
||||
The home screen has been split into two tabs: Chats & DApps. From the chat view, you'll find the option to start or join a new chat has moved from the top right corner to bottom center.
|
||||
|
||||
The DApp list also looks slightly different. We've done away with info screens for each DApp. Once you navigate to a URL, you'll find that your browser history appears under a `Recent` section at the top.
|
||||
|
||||
This is phase one of bigger improvements to come, so we'd love to hear your feedback.
|
||||
|
||||
We've also made preparations for the impending [Chaos Unicorn Day](https://chaos-unicorn-day.org/) in this release.
|
||||
|
||||
Reminder: On April 1st, we'll experiment with eliminating all centralized, third party services from Status, including our own node clusters. To safeguard from the chaos, we've prepared [a guide for you](https://our.status.im/bulletproofing-against-chaos-unicorns-with-status-on-arm/).
|
||||
|
||||
|
||||
|
||||
**Added**
|
||||
- New DApps added
|
||||
- New extensions features integrated within Status
|
||||
- Chaos mode and preparation for Chaos Unicorn Day
|
||||
|
||||
**Changed**
|
||||
- New bottom navigation: chats & DApps are separated
|
||||
- Improved UI performance (https://www.pivotaltracker.com/story/show/164245989)
|
||||
|
||||
**Fixed**
|
||||
- Universal link to public chat bug (https://github.com/status-im/status-react/issues/7549)
|
||||
- Beta warning popup (https://github.com/status-im/status-react/issues/7771)
|
||||
- DApp offline error (https://github.com/status-im/status-react/issues/7188#issuecomment-474308724)
|
||||
- Bug with QR code scanner for custom bootnodes (https://github.com/status-im/status-react/pull/7782)
|
||||
- Error message when entering an incorrect custom mailserver (https://github.com/status-im/status-react/issues/7752)
|
||||
|
||||
|
||||
## 0.10.1 - Hot Fix
|
||||
|
||||
**Added**
|
||||
- Option for automatic mail server selection to optimize connection
|
||||
|
||||
**Fixed**
|
||||
- Copy errors corrected
|
||||
- "Fetching messages" indicator appears on home screen
|
||||
|
||||
## 0.10.0
|
||||
|
||||
A handful of exciting new features and fixes coming to you fresh in 0.10.0.
|
||||
|
||||
First, a word about our new version numbers. Until now, our build versions have followed a convention of minor increments: 0.9.31, 0.9.32, 0.9.33. To better reflect the scope of our releases, we've [decided to level up](https://discuss.status.im/t/new-status-versioning-scheme/1066) to 0.10.0 and increment by 0.1.0 for typical releases, and 0.0.N for bug fixes. Our routine is business as usual otherwise.
|
||||
|
||||
Onto the highlights from 0.10.0.
|
||||
|
||||
The option to block a user will come in handy for those who participate in popular public chats. If someone is spamming a chat or otherwise bugging you, simply tap on their icon and hit `Block contact` from their profile. You'll no longer see any of their messages.
|
||||
|
||||
From _your_ profile screen, you can undo this action via a new contact list feature. Open `Contacts` to find a list of users who are able to see your info—namely, photo and display name—and from there, `Blocked users` to see and unblock users as you wish.
|
||||
|
||||
To better find users you _do_ want to hear from, we've added a search bar to the home screen. This allows you to filter through chats and browser history items. Text search within a chat is still to come.
|
||||
|
||||
Back on your profile screen, you'll find another helpful new option to control message syncing. If on a mobile network, you can require Status to ask before syncing conversations, in order to protect against heavy data usage. You can also enable mobile network syncing by default, or turn these options off completely.
|
||||
|
||||
You'll also find a new DApp permissions section here. DApps that adhere to browser privacy mode [ask permission](https://our.status.im/0-9-33/) to access your Ethereum account. You can now revoke access for a given DApp using these settings.
|
||||
|
||||
And that concludes the most significant changes of this release! For more, check out the change log below.
|
||||
|
||||
**Added**
|
||||
- Ability to block specific users from profile view
|
||||
- Contacts and blocked users list
|
||||
- Search bar for chats and browser history
|
||||
- Option to turn off syncing for chat on cell connection
|
||||
- DApp web3 permissions management
|
||||
- New DApps and WBTC token
|
||||
|
||||
**Changed**
|
||||
- Push notifications include sender name
|
||||
- Contact updates pushed periodically to better maintain user data
|
||||
- Public chats show first letter instead of #
|
||||
- Minor tweaks to chat UI
|
||||
|
||||
**Fixed**
|
||||
- Status now works on restricted [ports](https://github.com/status-im/status-react/pull/7382)
|
||||
- Overlap on small screens during log-in
|
||||
- False mailserver connection error [removed](https://github.com/status-im/status-react/issues/7531)
|
||||
- Premature sending of contact requests on Profile > Send message
|
||||
- DApps on same host (i.e. IPFS) no longer share user-granted permissions
|
||||
|
||||
Ready to update to 0.10.0?
|
||||
|
||||
iOS
|
||||
Within TestFlight, make sure you see version 0.10.0 and tap ‘INSTALL.’
|
||||
If you don’t currently have Status installed, access via TestFlight here: https://testflight.apple.com/join/J8EuJmey.
|
||||
|
||||
Android
|
||||
If you are not automatically asked to update, go to Status.im in the PlayStore and click ‘Update.’
|
||||
For more information, please join us in Status.
|
||||
We're more than happy to answer your questions and help you out.
|
||||
|
||||
---
|
||||
Social copy:
|
||||
Release 0.10.0 is here! A whole bunch of exciting features, blocking contacts, searching, & more. Check out the blog for more details and update Status. our.status.im/0-10-0/
|
||||
|
||||
|
||||
|
||||
## 0.9.33
|
||||
|
||||
We're back in action! After a pause for the holidays and a transition back that saw us release 4 small updates to v.0.9.32, we've got a brand new mobile version for you.
|
||||
|
||||
This release is a big one.
|
||||
|
||||
First, we've made significant improvements to log-in, yielding a 10x increase in log-in speed. Android users will also be pleased to find a "Save password until logout" toggle to match iOS. This will save you significant time on launch of the app.
|
||||
|
||||
Push notifications are improved by a number of fixes, including opening to the appropriate chat and no longer exposing your language settings to recipients using a different language than your own.
|
||||
|
||||
Because of these fixes, anyone using an older version of the app **_will not receive notifications_** from users on v.0.9.33. Furthermore, iOS users will not receive push notifications while the app is closed, nor if they are on certain iOS versions (11.X). This is a known and temporary issue.
|
||||
|
||||
Browser privacy mode is now enabled by default. This means that DApps will be required to ask permission before connecting to your wallet, and it may cause some DApps to break. If you find a DApp isn't working, you can go to your profile screen and toggle privacy mode off. In many cases, this should fix the issue.
|
||||
|
||||
We're hopeful that more and more DApp developers will be up to speed with this new convention soon.
|
||||
|
||||
Device pairing is no longer hidden under development mode. Visit the device section on your profile screen to "Pair this device" and sync messages and contacts from your phone to desktop. You can also name your devices to track which you've paired.
|
||||
|
||||
For the full list of changes, see below.
|
||||
|
||||
**Added**
|
||||
- Device pairing and naming
|
||||
- "Save password until logout" for Android
|
||||
- New DApps including Aragon and Dragonereum
|
||||
- BUFF token for ETHDenver
|
||||
- Titles and favicons in browser
|
||||
- Support for EIP1577, multihash interface for ENS names
|
||||
|
||||
**Changed**
|
||||
- Privacy mode enabled by default
|
||||
- Log-in time improved 10x
|
||||
- Private group chats limited to 10 members
|
||||
- Connectivity loading indicator no longer appears as "Fetching messages"
|
||||
- Chat bubble width increased
|
||||
- Ethereum provider consistent with EIP1193
|
||||
- Upgraded styling for group chats
|
||||
|
||||
**Fixed**
|
||||
- Metadata leakage of language settings in push notifications
|
||||
- Push notifications failing to open chat
|
||||
- Loading indicator in browser
|
||||
- Results displaying properly in Etheroll
|
||||
- Issues with extensions installation
|
||||
- Wrong password handling
|
||||
|
||||
-------
|
||||
|
||||
_Notes to call out_
|
||||
- Privacy mode by default instructions
|
||||
- Breaking change: no PNs for old versions after next mobile release - https://github.com/status-im/status-react/pull/6893
|
||||
- Setting up device pairing
|
||||
|
||||
|
||||
## 0.9.32
|
||||
Introducing beta support for Private group chats!
|
||||
In this release you’ll find the ability to start private group chats with your friends. These group chats are e2e encrypted and utilize Signal's [double ratchet algorithm](https://en.wikipedia.org/wiki/Double_Ratchet_Algorithm) for guaranteed privacy. To start chatting go to the Home tab, tap "+", then Start group chat.
|
||||
|
||||
There is also beta support for device pairing between all devices. To begin syncing messages and contacts across devices, go to Profile, tap advanced and turn on development mode, now go to devices and tap pair this device.
|
||||
|
||||
|
||||
|
||||
Added
|
||||
- Private group chats with increases security using Signal's double ratchet algorithm (In beta. Still being tested. Feedback welcome!)
|
||||
- Device pairing and syncing with perfect forward secrecy (in dev mode)
|
||||
- Added DApp Decentraland
|
||||
|
||||
|
||||
Changed
|
||||
- Support multi-extensions store
|
||||
- Restyled wallet onboarding flow, main wallet screen, and sent-transaction screen
|
||||
- Faster sign-in
|
||||
|
||||
Fixed
|
||||
- Transaction history fixes
|
||||
- Updating enabled tokens before navigating to wallet
|
||||
|
||||
[All changes](https://github.com/status-im/status-react/compare/release/0.9.31...release/0.9.32)
|
||||
|
||||
## 0.9.31
|
||||
|
||||
Version 0.9.31 brings Status up to speed with the latest privacy standard for Ethereum browsers, introduced by EIP1102.
|
||||
|
||||
You'll find a new privacy setting on your profile screen called "Browser privacy mode."
|
||||
|
||||
If you toggle this setting ON, DApps will be required to ask your permission before accessing your Status wallet. DApps that do not currently follow this standard may not work!
|
||||
|
||||
If you run into trouble, you can always toggle this setting OFF. With Browser privacy mode OFF, DApps can access your Status wallet without your permission.
|
||||
|
||||
We're encouraging DApp builders to adopt this new standard and make web3 safer for users as soon as possible. Check the Status blog for details on how to comply.
|
||||
|
||||
|
||||
|
||||
Added
|
||||
- Browser privacy mode to toggle new web3 security setting on or off
|
||||
- New DApps: Crypto Takeovers, Cryptographics, blockimmo and SNT Voting DApp
|
||||
- ST to assets list
|
||||
|
||||
Changed
|
||||
- Changing mailserver no longer requires a logout
|
||||
- Send button is inactive when there isn't an active internet or mailserver connection
|
||||
|
||||
Fixed
|
||||
- ENS addresses with unregistered chat IDs no longer resolve in chat
|
||||
- CryptoKitties log-in issue
|
||||
- Restored missing transaction error messages
|
||||
- Granting profile access applies per DApp rather than per host
|
||||
|
||||
[All changes](https://github.com/status-im/status-react/compare/release/0.9.30...release/0.9.31)
|
||||
|
||||
## 0.9.30
|
||||
|
||||
Added
|
||||
|
||||
- ENS registration link on profile screen
|
||||
- Kudos tokens for the Status #CryptoLife Hackathon
|
||||
- Reply and quote a message in chat. Long tap a message and tap Reply.
|
||||
- Chat now resolves all .eth address
|
||||
- New Farsi and Latin American Spanish translations
|
||||
- Every Dapp gets its own built in chat room. Tap the chat icon from the Dapp browser to start chatting
|
||||
- Added Kickback Dapp
|
||||
- New custom RPC networks for POA Network and xDAI Chain
|
||||
|
||||
|
||||
Changed
|
||||
- Anonymous names now shown in chats and profile
|
||||
- Disabled "sign transaction" button when offline
|
||||
- Renamed default international public chats to ensure universal links would work. For example “status 中文” was changed to “status-chinese”.
|
||||
- Removed Instabug for bug reports. In-app help is now available in #status
|
||||
|
||||
Fixed
|
||||
- Fixed an issue where messages are not saved to the database in some circumstances
|
||||
- Fixed an error when fetching history on certain accounts
|
||||
- Fixed logging in after logout when opening app from a notification
|
||||
- Fixed profile QR code
|
||||
- iPhone XS Max improvements
|
||||
|
||||
Known Issues
|
||||
|
||||
- POA and xDAI networks are only available for new accounts, not upgrades
|
||||
- For more POA and xDAI network considerations see this issue post.
|
||||
|
||||
## 0.9.29
|
||||
|
||||
This releases improves message validation to prevent potential crashes or malformed messages. We recommend all users upgrade.
|
||||
|
||||
The fix makes these improvements:
|
||||
- add validate method to StatusMessage protocol
|
||||
- spec all message types for use in validate method
|
||||
- use valid method after transit/decode step to reject invalid messages
|
||||
|
||||
|
||||
## Older Versions
|
||||
|
||||
- [Google docs](https://docs.google.com/document/d/1Z0mFlJJkNbRgv6qm80ob5g4PEvsI8cTmbwZpcRPWPho/edit#)
|
||||
|
||||
@@ -123,6 +123,11 @@ def jscFlavor = 'org.webkit:android-jsc:+'
|
||||
*/
|
||||
def enableHermes = project.ext.react.get("enableHermes", false);
|
||||
|
||||
/**
|
||||
* Exclude google library so we can publish to external android stores
|
||||
*/
|
||||
def googleFree = project.env.get("GOOGLE_FREE", false)
|
||||
|
||||
def getVersionCode = { ->
|
||||
new ByteArrayOutputStream().withStream { stdOut ->
|
||||
if (project.hasProperty("versionCode")) {
|
||||
@@ -322,6 +327,14 @@ dependencies {
|
||||
implementation jscFlavor
|
||||
}
|
||||
|
||||
if (googleFree) {
|
||||
implementation(project(':react-native-device-info')) {
|
||||
exclude group: 'com.google.firebase'
|
||||
exclude group: 'com.google.android.gms'
|
||||
exclude group: 'com.android.installreferrer'
|
||||
}
|
||||
}
|
||||
|
||||
// react-native-screens
|
||||
implementation 'androidx.appcompat:appcompat:1.1.0-rc01'
|
||||
implementation 'androidx.swiperefreshlayout:swiperefreshlayout:1.1.0-alpha02'
|
||||
|
||||
@@ -25,10 +25,6 @@
|
||||
|
||||
<uses-permission android:name="com.android.vending.BILLING" />
|
||||
|
||||
<!-- these permissions should be removed -->
|
||||
<!-- React Native unnecessary permissions (https://github.com/facebook/react-native/issues/5886) -->
|
||||
<uses-permission android:name="android.permission.READ_PHONE_STATE" tools:node="remove"/>
|
||||
|
||||
<application
|
||||
tools:replace="android:allowBackup"
|
||||
android:allowBackup="false"
|
||||
@@ -74,7 +70,8 @@
|
||||
</intent-filter>
|
||||
</activity>
|
||||
<activity android:name="com.facebook.react.devsupport.DevSettingsActivity"/>
|
||||
<service android:name="im.status.ethereum.module.ForegroundService"></service>
|
||||
<service android:name="im.status.ethereum.pushnotifications.ForegroundService"></service>
|
||||
<service android:name="im.status.ethereum.module.LocalNotificationsService" />
|
||||
<provider
|
||||
android:name="androidx.core.content.FileProvider"
|
||||
android:authorities="${applicationId}.provider"
|
||||
|
||||
@@ -18,6 +18,7 @@ import java.util.List;
|
||||
|
||||
import im.status.ethereum.keycard.RNStatusKeycardPackage;
|
||||
import im.status.ethereum.module.StatusPackage;
|
||||
import im.status.ethereum.pushnotifications.PushNotificationPackage;
|
||||
|
||||
public class MainApplication extends MultiDexApplication implements ReactApplication {
|
||||
|
||||
@@ -30,10 +31,12 @@ public class MainApplication extends MultiDexApplication implements ReactApplica
|
||||
@Override
|
||||
protected List<ReactPackage> getPackages() {
|
||||
StatusPackage statusPackage = new StatusPackage(RootUtil.isDeviceRooted());
|
||||
|
||||
List<ReactPackage> packages = new PackageList(this).getPackages();
|
||||
packages.add(statusPackage);
|
||||
packages.add(new ReactNativeDialogsPackage());
|
||||
packages.add(new RNStatusKeycardPackage());
|
||||
packages.add(new PushNotificationPackage());
|
||||
return packages;
|
||||
}
|
||||
|
||||
|
||||
@@ -25,7 +25,7 @@ kotlinVersion=1.3.50
|
||||
minSdkVersion=23
|
||||
compileSdkVersion=29
|
||||
targetSdkVersion=29
|
||||
buildToolsVersion=29.0.2
|
||||
buildToolsVersion=30.0.3
|
||||
supportLibVersion=28.0.0
|
||||
# This should match version from nix/mobile/android/maven-and-npm-deps/maven/default.nix
|
||||
gradlePluginVersion=3.5.3
|
||||
@@ -50,4 +50,4 @@ org.gradle.jvmargs=-Xmx8704M
|
||||
versionCode=9999
|
||||
|
||||
# Flipper
|
||||
FLIPPER_VERSION=0.35.0
|
||||
FLIPPER_VERSION=0.54.0
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
library 'status-react-jenkins@v1.2.3'
|
||||
library 'status-react-jenkins@v1.2.11'
|
||||
|
||||
pipeline {
|
||||
agent { label 'linux' }
|
||||
@@ -101,12 +101,14 @@ pipeline {
|
||||
} else { /* if no universal is available pick first */
|
||||
env.PKG_URL = urls.first()
|
||||
}
|
||||
if (utils.isNightlyBuild()) {
|
||||
env.DIAWI_URL = android.uploadToDiawi()
|
||||
}
|
||||
jenkins.setBuildDesc(APK: env.PKG_URL)
|
||||
/* e2e builds get tested in SauceLabs */
|
||||
if (utils.isE2EBuild()) {
|
||||
env.SAUCE_URL = android.uploadToSauceLabs()
|
||||
}
|
||||
if (utils.isNightlyBuild()) {
|
||||
env.DIAWI_URL = android.uploadToDiawi()
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -114,7 +116,7 @@ pipeline {
|
||||
}
|
||||
stage('Cleanup') {
|
||||
steps {
|
||||
sh 'make clean'
|
||||
sh 'make purge'
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
+45
-8
@@ -1,4 +1,4 @@
|
||||
library 'status-react-jenkins@v1.2.3'
|
||||
library 'status-react-jenkins@v1.2.11'
|
||||
|
||||
pipeline {
|
||||
agent { label 'linux' }
|
||||
@@ -16,6 +16,20 @@ pipeline {
|
||||
))
|
||||
}
|
||||
|
||||
/* WARNING: Defining parameters here with the ?: trick causes them to remember last value. */
|
||||
parameters {
|
||||
choice(
|
||||
name: 'BUILD_TYPE',
|
||||
description: 'Makefile target to build. Optional Parameter.',
|
||||
choices: genChoices(params.BUILD_TYPE, ['manual', 'nightly', 'release', 'pr', 'e2e']),
|
||||
)
|
||||
booleanParam(
|
||||
name: 'PUBLISH',
|
||||
description: 'Trigger publishing of build results for nightly or release.',
|
||||
defaultValue: getPublishDefault(params.PUBLISH),
|
||||
)
|
||||
}
|
||||
|
||||
stages {
|
||||
stage('Prep') {
|
||||
steps { script {
|
||||
@@ -65,18 +79,20 @@ pipeline {
|
||||
]
|
||||
/* add URLs to the build description */
|
||||
jenkins.setBuildDesc(urls)
|
||||
/* Create JSON file with newest build URLs */
|
||||
switch (btype) {
|
||||
/* legacy naming, should have named it nightly.json */
|
||||
case 'nightly': s3.updateBucketJSON(urls, 'latest.json'); break
|
||||
}
|
||||
} }
|
||||
}
|
||||
stage('Publish') {
|
||||
when { expression { params.PUBLISH } }
|
||||
steps { script {
|
||||
switch (btype) {
|
||||
case 'nightly': build(job: 'misc/status.im', wait: false); break
|
||||
case 'release': github.publishReleaseMobile(); break
|
||||
case 'nightly':
|
||||
/* Create JSON file with newest build URLs */
|
||||
s3.updateBucketJSON(urls, 'latest.json');
|
||||
build(job: 'misc/status.im', wait: false);
|
||||
break;
|
||||
case 'release':
|
||||
github.publishReleaseMobile();
|
||||
break;
|
||||
}
|
||||
} }
|
||||
}
|
||||
@@ -93,3 +109,24 @@ pipeline {
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/* Helper that generates list of available choices for a parameter
|
||||
* but re-orders them based on the currently set value. First is default. */
|
||||
def List genChoices(String previousChoice, List defaultChoices) {
|
||||
if (previousChoice == null) {
|
||||
return defaultChoices
|
||||
}
|
||||
choices = defaultChoices.minus(previousChoice)
|
||||
choices.add(0, previousChoice)
|
||||
return choices
|
||||
}
|
||||
|
||||
/* Helper that makes PUBLISH default to 'false' unless:
|
||||
* - The build is for a release branch
|
||||
* - A user explicitly specified a value
|
||||
* Since release builds create and re-create GitHub drafts every time. */
|
||||
def Boolean getPublishDefault(Boolean previousValue) {
|
||||
if (env.JOB_NAME.startsWith('status-react/release')) { return true }
|
||||
if (previousValue != null) { return previousValue }
|
||||
return false
|
||||
}
|
||||
|
||||
+5
-4
@@ -1,7 +1,7 @@
|
||||
library 'status-react-jenkins@v1.2.3'
|
||||
library 'status-react-jenkins@v1.2.11'
|
||||
|
||||
pipeline {
|
||||
agent { label 'macos-xcode-11.5' }
|
||||
agent { label 'macos-xcode-12.3' }
|
||||
|
||||
parameters {
|
||||
string(
|
||||
@@ -99,8 +99,9 @@ pipeline {
|
||||
steps {
|
||||
script {
|
||||
env.PKG_URL = s3.uploadArtifact(api)
|
||||
jenkins.setBuildDesc(IPA: env.PKG_URL)
|
||||
/* e2e builds get tested in SauceLabs */
|
||||
if (btype == 'e2e') {
|
||||
if (utils.isE2EBuild()) {
|
||||
env.SAUCE_URL = ios.uploadToSauceLabs()
|
||||
} else {
|
||||
env.DIAWI_URL = ios.uploadToDiawi()
|
||||
@@ -113,7 +114,7 @@ pipeline {
|
||||
stage('Cleanup') {
|
||||
steps {
|
||||
sh 'make watchman-clean'
|
||||
sh 'make clean'
|
||||
sh 'make purge'
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
library 'status-react-jenkins@v1.2.3'
|
||||
library 'status-react-jenkins@v1.2.11'
|
||||
|
||||
pipeline {
|
||||
agent { label params.AGENT_LABEL }
|
||||
|
||||
@@ -44,13 +44,19 @@ pipeline {
|
||||
credentialsId: 'etherscan-api-key',
|
||||
variable: 'ETHERSCAN_API_KEY'
|
||||
),
|
||||
string(
|
||||
credentialsId: 'infura-e2e-token',
|
||||
variable: 'WEB3_INFURA_PROJECT_ID'
|
||||
),
|
||||
]) {
|
||||
dir('test/appium/tests') {
|
||||
sh """
|
||||
python3 -m pytest -m testrail_id \
|
||||
-m "not upgrade" \
|
||||
-n24 --rerun_count=2 \
|
||||
python3 -m pytest \
|
||||
--numprocesses 15 \
|
||||
--rerun_count=2 \
|
||||
--testrail_report=True \
|
||||
-m testrail_id \
|
||||
-m "not upgrade" \
|
||||
--network=${params.NETWORK} \
|
||||
--apk=${params.APK_NAME}
|
||||
"""
|
||||
|
||||
@@ -80,10 +80,15 @@ pipeline {
|
||||
credentialsId: 'etherscan-api-key',
|
||||
variable: 'ETHERSCAN_API_KEY'
|
||||
),
|
||||
string(
|
||||
credentialsId: 'infura-e2e-token',
|
||||
variable: 'WEB3_INFURA_PROJECT_ID'
|
||||
),
|
||||
]) {
|
||||
dir('test/appium/tests') {
|
||||
sh """
|
||||
python3 -m pytest -n24 \
|
||||
python3 -m pytest \
|
||||
--numprocesses 15 \
|
||||
--rerun_count=2 \
|
||||
--testrail_report=True \
|
||||
-m "${params.TEST_MARKERS}" \
|
||||
|
||||
@@ -48,11 +48,17 @@ pipeline {
|
||||
credentialsId: 'etherscan-api-key',
|
||||
variable: 'ETHERSCAN_API_KEY'
|
||||
),
|
||||
string(
|
||||
credentialsId: 'infura-e2e-token',
|
||||
variable: 'WEB3_INFURA_PROJECT_ID'
|
||||
),
|
||||
]) {
|
||||
dir('test/appium/tests') {
|
||||
sh """
|
||||
python3 -m pytest -m upgrade \
|
||||
-n24 --rerun_count=2 \
|
||||
python3 -m pytest \
|
||||
-m upgrade \
|
||||
--numprocesses 15 \
|
||||
--rerun_count=2 \
|
||||
--testrail_report=True \
|
||||
--network=${params.NETWORK} \
|
||||
--apk=${params.APK_NAME} \
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
library 'status-react-jenkins@v1.2.3'
|
||||
library 'status-react-jenkins@v1.2.11'
|
||||
|
||||
pipeline {
|
||||
agent { label 'macos' }
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
library 'status-react-jenkins@v1.2.3'
|
||||
library 'status-react-jenkins@v1.2.11'
|
||||
|
||||
pipeline {
|
||||
agent { label 'linux' }
|
||||
|
||||
+105
@@ -0,0 +1,105 @@
|
||||
# Description
|
||||
|
||||
This document describes how to update Status APK builds for the [F-Droid](https://f-droid.org/) Android application catalogue.
|
||||
|
||||
# Intro
|
||||
|
||||
In simplest terms F-Droid requires a YAML file that defines the steps necessary to create a universal unsigned APK build. This is achieved by submitting a new app versions into the `metadata/im.status.ethereum.yml` file in the [fdroiddata](https://gitlab.com/fdroid/fdroiddata) repository.
|
||||
|
||||
The app builds defined this way run on servers that generate the unsigned APKs using the [fdroidserver](https://gitlab.com/fdroid/fdroidserver) software. The [server setup](https://f-droid.org/en/docs/Build_Server_Setup/) is quite involved but is not necessary unless you want to run your own instance. Normally the applications defines in `fdroiddata` are built by servers maintained by [the F-Droid volunteers](https://f-droid.org/en/contribute/).
|
||||
|
||||
First release of Status app was merged in [fdroid/fdroiddata#7179](https://gitlab.com/fdroid/fdroiddata/-/merge_requests/7179).
|
||||
|
||||
# Adding New Versions
|
||||
|
||||
You can find our configuration file at [`metadata/im.status.ethereum.yml`](https://gitlab.com/fdroid/fdroiddata/-/blob/master/metadata/im.status.ethereum.yml)
|
||||
|
||||
The file defines all the necessary metadata like `SourceCode`, `Website`, or `License`, but the most important key is `Builds`, which looks like this:
|
||||
```yml
|
||||
Builds:
|
||||
- versionName: 1.12.0
|
||||
versionCode: 2021022512
|
||||
commit: cfb825a11b61d312af8cb5d36686af540c31f481
|
||||
sudo: make fdroid-nix-dir
|
||||
init: nix/scripts/setup.sh
|
||||
output: result/app-release-unsigned.apk
|
||||
scanignore: android/build.gradle
|
||||
scandelete: ios
|
||||
build: make release-fdroid BUILD_NUMBER=$$VERCODE$$
|
||||
```
|
||||
It contains a list of objects defining each release of the application. In order to add a new release simply copy a previous release object and adjust the following values:
|
||||
|
||||
* `versionName` - String version like `1.12.0`.
|
||||
* `versionCode` - Android `versionCode`. We use a timestamp generated by [a script](../scripts/version/gen_build_no.sh).
|
||||
* `commit` - Specific commit SHA1 from which the given release was built.
|
||||
|
||||
The `versionCode` should be the same as the one in build that was uploaded to Play Store.
|
||||
It can be found in the build logs or by using:
|
||||
```
|
||||
> apkanalyzer manifest version-code StatusIm-Mobile-v1.12.0.apk
|
||||
2021022512
|
||||
```
|
||||
|
||||
At the bottom of the file you should also update the following keys:
|
||||
|
||||
* `CurrentVersion` - Same as the new `versionName` added
|
||||
* `CurrentVersionCode` - Same as the `versionCode` added
|
||||
|
||||
Then submit a merge request to the [fdroid/fdroiddata](https://gitlab.com/fdroid/fdroiddata) repository.
|
||||
|
||||
# Checking Builds
|
||||
|
||||
The simplest way to test if the app builds via F-Droid is to use the Docker image:
|
||||
https://gitlab.com/fdroid/docker-executable-fdroidserver
|
||||
|
||||
Which is available under `registry.gitlab.com/fdroid/docker-executable-fdroidserver:latest`.
|
||||
|
||||
Because we use Nix to build the mobile app we need to slightly modify the image with this `Dockerfile`:
|
||||
```Dockerfile
|
||||
FROM registry.gitlab.com/fdroid/docker-executable-fdroidserver:latest
|
||||
ARG BUILDER_UID=1000
|
||||
ENV BUILDER_USER=vagrant
|
||||
RUN useradd -u $BUILDER_UID $BUILDER_USER
|
||||
RUN mkdir -m 0755 /nix /home/$BUILDER_USER \
|
||||
&& chown -R $BUILDER_USER /nix /home/$BUILDER_USER
|
||||
```
|
||||
Build it using:
|
||||
```
|
||||
docker build --build-arg=BUILDER_UID=$UID -t statusteam/docker-executable-fdroidserver:latest .
|
||||
```
|
||||
Then clone the [fdroiddata](https://gitlab.com/fdroid/fdroiddata) and [fdroidserver](https://gitlab.com/fdroid/fdroidserver) repos and use it to test the build of a specific Status Android app version: `1.12.0`
|
||||
```
|
||||
git clone https://gitlab.com/fdroid/fdroidserver
|
||||
git clone https://gitlab.com/fdroid/fdroiddata
|
||||
docker run --rm \
|
||||
-u $UID:$GID -e USER=vagrant \
|
||||
-v $PWD/fdroiddata:/repo \
|
||||
-v $PWD/fdroidserver:/fdroidserver \
|
||||
statusteam/docker-executable-fdroidserver:latest \
|
||||
build im.status.ethereum:1.12.0
|
||||
```
|
||||
We have to create a user and specify the UID because Nix cannot run as `root` and that is the default user for the F-Droid Docker image. By adding our own user and setting the UID we also make it possible to mount folders like `fdroiddata` and `fdroidserver`.
|
||||
|
||||
You can specify a `--vebose` flag for `build` command for additional information.
|
||||
You can provide `--storage-opt size=30G` flag if Docker complains about running out of space.
|
||||
|
||||
You should also run `lint im.status.ethereum` to verify the YAML format is correct.
|
||||
|
||||
# Details
|
||||
|
||||
The original research was done in [#8512](https://github.com/status-im/status-react/issues/8512).
|
||||
|
||||
Normally F-Droid server wants to run Gradle itself, but we do not specify the `gradle` key in order to run `make release-fdroid` ourselves in `build` step. We also add `android/build.gradle` to `scanignore` to avoid F-Droid trying to use Gradle directly.
|
||||
|
||||
Once the PR is merged it may take a few days for the F-Droid server farm to build and deploy the new version to their site and app. You can look up the current state of builds [here](https://f-droid.org/wiki/index.php?title=Special:RecentChanges&days=7&from=&hidebots=0&hideanons=1&hideliu=1&limit=500) and look for your App ID and a `deploy` change after it.
|
||||
|
||||
# F-Droid Build
|
||||
|
||||
F-Droid requires submitted applications to be free of non Open Source software. For this reason we need to exclude certain Google libraries at build time.
|
||||
|
||||
This is achieved by setting `GOOGLE_FREE=1` in the `.env.release` file. This affects two things:
|
||||
|
||||
1. [Clojure code conditional](../src/status_im/acquisition/core.cljs) which stops use of `get-referrer`.
|
||||
2. [Gradle build configuration](../android/app/build.gradle) by excluding Google libraries.
|
||||
|
||||
Both are affected by the `.env` file and both are required.
|
||||
@@ -0,0 +1,21 @@
|
||||
#### Before submission
|
||||
- [ ] Feature or improvements release? (Feature release needs more lead time and assets for comms)
|
||||
- [ ] Sign off by QA
|
||||
- [ ] App store listing content reviewed and updated ([copy](https://docs.google.com/spreadsheets/d/1fLDr3BD1dcg0dolvLiozXoZU27IQirjBzn0h4_QS2u0/edit#gid=0), [images](https://www.dropbox.com/sh/6baklctvxy3nuoo/AACG9kYIVdt2qREW76rP8SP-a?dl=0) )
|
||||
- [ ] Play store content reviewed and updated
|
||||
- [ ] Release notes written and added (500 character limit for updates (Android), no Android references for App store)
|
||||
- [ ] Comms timeframe agreed on (Mon/Tue ping when both submissions are in)
|
||||
- [ ] Privacy policy reviewed and updated
|
||||
- [ ] App translations for key features merged and tested
|
||||
- [ ] Countries to be excluded
|
||||
- [ ] Changes to our FAQ made
|
||||
|
||||
#### Before publishing
|
||||
- [ ] Translations for comms available
|
||||
- [ ] Promotional content ready
|
||||
- [ ] Update Draft with release on https://github.com/status-im/status-react/releases
|
||||
- [ ] Add release to DO store and [update site](https://notes.status.im/s/status-release-upload#) (Jakub - requires credentials to upload)
|
||||
|
||||
#### At time of publishing
|
||||
- [ ] validate draft release on github release page https://github.com/status-im/status-react/releases
|
||||
- [ ] update https://github.com/status-im/status-react/blob/develop/RELEASES.md with release notes
|
||||
@@ -1,4 +1,11 @@
|
||||
# Business Logic Modules
|
||||
# Codebase Strucuture and Guidelines
|
||||
|
||||
|
||||
## Starting the app
|
||||
|
||||
The app is bundled and run in a Nix environment. Information regarding how to run it locally can be found [here](https://status.im/technical/build_status/).
|
||||
|
||||
## Business Logic Modules
|
||||
|
||||
Each business logic module is managed in a module directory.
|
||||
|
||||
@@ -31,7 +38,7 @@ Rationale and how to get there:
|
||||
Currently a lot of business logic is lost in utils and screens namespaces and should be moved to dedicated top level directories.
|
||||
This should make core logic of the app more accessible and organized
|
||||
|
||||
## core.cljs
|
||||
### core.cljs
|
||||
|
||||
Core namespace must only contain functions that can be called outside of the module (i.e. in events or other modules):
|
||||
|
||||
@@ -45,9 +52,8 @@ Core namespace must only contain functions that can be called outside of the mod
|
||||
{:db (module.db/set-current-account db)})
|
||||
```
|
||||
|
||||
## db.cljs
|
||||
### db.cljs
|
||||
|
||||
- must contain specs for the app-db subpart the module modifies
|
||||
- must contain getter and setter functions used by fx producing functions and subscriptions
|
||||
- db logic called by other modules
|
||||
|
||||
@@ -55,26 +61,69 @@ Rationale:
|
||||
|
||||
These guidelines make db.cljs namespaces the place to go when making changes to the db layout and minimize breaking changes when adding/refactoring features
|
||||
|
||||
# Subscriptions
|
||||
## re-frame
|
||||
|
||||
### Subscriptions
|
||||
|
||||
- all subscriptions must be defined in the single `status-im.subs` namespace
|
||||
- subscriptions must subscribe only on other subscriptions, and never on app-db itself
|
||||
- `reg-root-key-sub` should be used for the root keys subscriptions
|
||||
|
||||
# Events
|
||||
### Events
|
||||
|
||||
- all events must be defined in the single `status-im.events` namespace which can be considered as an index of everything going on in the app
|
||||
- events must always be declared with `register-handler-fx`, no `register-handler-db`
|
||||
- events must never use the `trim-v` interceptor
|
||||
- events must only contain a function call defined in a module
|
||||
```clojure
|
||||
(handlers/register-handler-fx
|
||||
:notifications/handle-push-notification-open
|
||||
(fn [cofx [_ event]]
|
||||
(notifications/handle-push-notification-open event cofx)))
|
||||
```
|
||||
- events must use synthetic namespaces:
|
||||
- all events must be defined in the `core.cljs` namespaces
|
||||
- events must always be declared with `fx/defn` macro
|
||||
|
||||
- `:module.ui/` for user triggered events
|
||||
- `:module.callback/` for callback events, which are events bringing back the result of an fx to the event loop, the name of the event should end with `-success` or `-error` most of the time. Other possibilities can be `-granted`, `-denied` for instance.
|
||||
- `:module/` for internal events, examples are time based events marked `-timed-out`, external changes marked `-changed` or reception of external events marked `-received`.
|
||||
## Testing flow
|
||||
- All PRs automatically go to "REVIEW" column on [Pipeline for QA](https://github.com/status-im/status-react/projects/7) project on Github. This is our main board for QA / devs interaction
|
||||
- After the PR gets at least 1 approval, it should be moved to "E2E Tests" column. Some PRs may need approvals from more than one person.
|
||||
- Critical path tests are automatically run for all PRs in "E2E Tests" column.
|
||||
- If E2E tests pass:
|
||||
- If PR doesn't need manual QA (it is small change or change doesn't relate to app) - after passing e2e tests it can be merged (don't use the Github UI to merge, check section on merging PRs).
|
||||
|
||||
- If manual QA needed - add label 'request manual qa'. The QA team will process it (make sure the summary and test instructions are clear). QA team will review results and test PR on different platforms and assign one of the three labels:
|
||||
- No issues - label 'TESTED-OK' and then you can merge it.
|
||||
- If issues - label 'TESTED-ISSUES' and comment from QA with bugs.
|
||||
- After fix and/or discussion the process is repeated.
|
||||
|
||||
- If manual QA is not needed but all tests don't pass, you can ping @churik or @Serhy to confirm that failed E2E tests are not unrelated.
|
||||
|
||||
## Enabling debug logs
|
||||
Calls to `log/debug` will not be printed to the console by default. It can be enabled under "Advanced settings" in the app:
|
||||
|
||||

|
||||
|
||||
## Translations
|
||||
The app relies on system locale to select a language from the [list of supported languages](https://github.com/status-im/status-react/blob/bda73867471cf2bb8a68b1cc27c9f94b92d9a58b/src/status_im/i18n_resources.cljs#L9). It falls back to English in cash the system locale is not supported.
|
||||
|
||||
We use Lokalise App to manage [translations](https://translate.status.im/). In case you need to add/remove a key to translations, you only need to change `en.json`. Missing keys fallback to `en.json`. The actual translations will be added by Lokalise.
|
||||
|
||||
## re-frisk
|
||||
re-frisk is a state visualization tool written by our very own Andrey (@flexsurfer). To start re-frisk, execute the following command:
|
||||
```bash
|
||||
$ yarn shadow-cljs run re-frisk-remote.core/start
|
||||
```
|
||||
|
||||
or you can also use make:
|
||||
|
||||
```bash
|
||||
$ make run-re-frisk
|
||||
```
|
||||
|
||||
A server will be started at http://localhost:4567. It might show "not connected" at first. Don't worry and just start using the app. The events and state will populate.
|
||||
|
||||
## Merging approved PRs
|
||||
We don't Github's UI to merge. Instead `./scripts/merge-pr.sh` is used to sign and merge PR to `develop`. You first need to enable [GPG signing on you commits](https://github.com/status-im/status-react/blob/develop/STARTING_GUIDE.md#configure-gpg-keys-for-signing-commits).
|
||||
|
||||
Once your commits are verfied and PR approved, you can run the script like so:
|
||||
|
||||
```bash
|
||||
$ git checkout develop
|
||||
$ git fetch
|
||||
$ git reset --hard origin/develop
|
||||
$ ./scripts/merge-pr.sh 11370
|
||||
```
|
||||
Replace 11370 with your PR id.
|
||||
|
||||
## Release process
|
||||
TODO(shivekkhurana): Compile release notes
|
||||
|
||||
Binary file not shown.
|
After Width: | Height: | Size: 4.9 KiB |
Binary file not shown.
|
After Width: | Height: | Size: 33 KiB |
+57
-21
@@ -11,18 +11,6 @@
|
||||
# There are a few env variables defined in the .env file in
|
||||
# this directory (fastlane/.env)
|
||||
|
||||
# unlocks keychain if KEYCHAIN_PASSWORD variable is present
|
||||
# (to be used on CI machines)
|
||||
def unlock_keychain_if_needed
|
||||
return unless ENV['KEYCHAIN_PASSWORD']
|
||||
|
||||
unlock_keychain(
|
||||
path: 'login.keychain',
|
||||
password: ENV['KEYCHAIN_PASSWORD'],
|
||||
set_default: true
|
||||
)
|
||||
end
|
||||
|
||||
def curl_upload(url, file, auth, conn_timeout = 5, timeout = 60, retries = 3)
|
||||
rval = sh(
|
||||
'curl',
|
||||
@@ -81,6 +69,45 @@ def upload_to_saucelabs(file)
|
||||
end
|
||||
end
|
||||
|
||||
# Creates and unlocks a keychain into which Fastlane match imports signing keys and certs.
|
||||
class Keychain
|
||||
attr_accessor :name, :pass
|
||||
|
||||
def initialize(name)
|
||||
# Local devs will not have KEYCHAIN_PASSWORD set, and will be prompted for password.
|
||||
return "login.keychain-db" unless ENV['KEYCHAIN_PASSWORD']
|
||||
# We user the same keychain every time because we need to set a default.
|
||||
@name = "#{name}.keychain-db"
|
||||
@pass = ENV['KEYCHAIN_PASSWORD']
|
||||
Fastlane::Actions::CreateKeychainAction.run(
|
||||
name: @name,
|
||||
password: @pass,
|
||||
unlock: true,
|
||||
# Fastlane can't find the signing cert without setting a default.
|
||||
default_keychain: true,
|
||||
# Deleting the keychain would cause race condition for parallel jobs.
|
||||
require_create: false,
|
||||
# Lock it up after 25 minutes just in case we don't delete it.
|
||||
lock_when_sleeps: true,
|
||||
lock_after_timeout: true,
|
||||
timeout: 1500
|
||||
)
|
||||
end
|
||||
end
|
||||
|
||||
# App Store Connect API is an official public API used to manage Apps.
|
||||
# This includes metadata, pricing and availability, provisioning, and more.
|
||||
# It provides a JSON API and auth using API Keys to generate a JSON Web Token (JWT).
|
||||
def asc_api_key()
|
||||
app_store_connect_api_key(
|
||||
key_id: ENV['FASTLANE_ASC_API_KEY_ID'],
|
||||
issuer_id: ENV['FASTLANE_ASC_API_ISSUER_ID'],
|
||||
key_filepath: ENV['FASTLANE_ASC_API_KEY_FILE_PATH'],
|
||||
duration: 1500, # seconds, session length
|
||||
in_house: false,
|
||||
)
|
||||
end
|
||||
|
||||
# builds an ios app with ad-hoc configuration and put it
|
||||
# to "status-ios" output folder
|
||||
# `readonly`:
|
||||
@@ -95,12 +122,16 @@ def build_ios_adhoc(readonly: false, pr_build: false)
|
||||
scheme = pr_build ? 'StatusImPR' : 'StatusIm'
|
||||
app_id = pr_build ? 'im.status.ethereum.pr' : 'im.status.ethereum'
|
||||
|
||||
kc = Keychain.new('fastlane')
|
||||
|
||||
match(
|
||||
type: 'adhoc',
|
||||
force_for_new_devices: true,
|
||||
readonly: readonly,
|
||||
api_key: asc_api_key(),
|
||||
app_identifier: app_id,
|
||||
keychain_name: 'login.keychain'
|
||||
force_for_new_devices: true,
|
||||
keychain_name: kc.name,
|
||||
keychain_password: kc.pass
|
||||
)
|
||||
|
||||
build_ios_app(
|
||||
@@ -128,11 +159,15 @@ def build_ios_e2e
|
||||
showsdks_output = sh('xcodebuild', '-showsdks')
|
||||
simulator_sdk = showsdks_output.scan(/iphonesimulator\d\d?\.\d\d?/).first
|
||||
|
||||
kc = Keychain.new('fastlane')
|
||||
|
||||
match(
|
||||
type: 'adhoc',
|
||||
force_for_new_devices: true,
|
||||
readonly: true,
|
||||
keychain_name: 'login.keychain'
|
||||
api_key: asc_api_key(),
|
||||
force_for_new_devices: true,
|
||||
keychain_name: kc.name,
|
||||
keychain_password: kc.pass
|
||||
)
|
||||
|
||||
build_ios_app(
|
||||
@@ -181,7 +216,6 @@ platform :ios do
|
||||
desc 'It creates an .ipa that can be used by a list of devices, registeded in the App Store Connect.'
|
||||
desc 'This .ipa is ready to be distibuted through diawi.com'
|
||||
lane :adhoc do
|
||||
unlock_keychain_if_needed
|
||||
build_ios_adhoc(readonly: true)
|
||||
end
|
||||
|
||||
@@ -189,31 +223,32 @@ platform :ios do
|
||||
desc 'This lane is used for SauceLabs end-to-end testing.'
|
||||
desc 'It creates an .app that can be used inside of a iPhone simulator.'
|
||||
lane :e2e do
|
||||
unlock_keychain_if_needed
|
||||
build_ios_e2e
|
||||
end
|
||||
|
||||
desc '`fastlane ios pr` - makes a new pr build'
|
||||
desc 'This lane builds a new adhoc build and leaves an .ipa that is ad-hoc signed (can be uploaded to diawi)'
|
||||
lane :pr do
|
||||
unlock_keychain_if_needed
|
||||
build_ios_adhoc(pr_build: true)
|
||||
end
|
||||
|
||||
desc '`fastlane ios nightly` - makes a new nightly'
|
||||
desc 'This lane builds a new nightly and leaves an .ipa that is ad-hoc signed (can be uploaded to diawi)'
|
||||
lane :nightly do
|
||||
unlock_keychain_if_needed
|
||||
build_ios_adhoc()
|
||||
end
|
||||
|
||||
desc '`fastlane ios release` builds a release & uploads it to TestFlight'
|
||||
lane :release do
|
||||
kc = Keychain.new('fastlane')
|
||||
|
||||
match(
|
||||
type: 'appstore',
|
||||
readonly: true,
|
||||
api_key: asc_api_key(),
|
||||
app_identifier: 'im.status.ethereum',
|
||||
keychain_name: 'login.keychain'
|
||||
keychain_name: kc.name,
|
||||
keychain_password: kc.pass
|
||||
)
|
||||
|
||||
build_ios_app(
|
||||
@@ -230,6 +265,7 @@ platform :ios do
|
||||
"ITSAppUsesNonExemptEncryption": false
|
||||
}
|
||||
)
|
||||
|
||||
upload_to_testflight(
|
||||
ipa: 'status-ios/StatusIm.ipa',
|
||||
skip_waiting_for_build_processing: true
|
||||
|
||||
+21
-19
@@ -6,22 +6,22 @@ GEM
|
||||
public_suffix (>= 2.0.2, < 5.0)
|
||||
atomos (0.1.3)
|
||||
aws-eventstream (1.1.0)
|
||||
aws-partitions (1.350.0)
|
||||
aws-sdk-core (3.104.3)
|
||||
aws-partitions (1.383.0)
|
||||
aws-sdk-core (3.109.1)
|
||||
aws-eventstream (~> 1, >= 1.0.2)
|
||||
aws-partitions (~> 1, >= 1.239.0)
|
||||
aws-sigv4 (~> 1.1)
|
||||
jmespath (~> 1.0)
|
||||
aws-sdk-kms (1.36.0)
|
||||
aws-sdk-core (~> 3, >= 3.99.0)
|
||||
aws-sdk-kms (1.39.0)
|
||||
aws-sdk-core (~> 3, >= 3.109.0)
|
||||
aws-sigv4 (~> 1.1)
|
||||
aws-sdk-s3 (1.75.0)
|
||||
aws-sdk-core (~> 3, >= 3.104.1)
|
||||
aws-sdk-s3 (1.83.1)
|
||||
aws-sdk-core (~> 3, >= 3.109.0)
|
||||
aws-sdk-kms (~> 1)
|
||||
aws-sigv4 (~> 1.1)
|
||||
aws-sigv4 (1.2.1)
|
||||
aws-sigv4 (1.2.2)
|
||||
aws-eventstream (~> 1, >= 1.0.2)
|
||||
babosa (1.0.3)
|
||||
babosa (1.0.4)
|
||||
claide (1.0.3)
|
||||
colored (1.2)
|
||||
colored2 (3.1.2)
|
||||
@@ -35,16 +35,17 @@ GEM
|
||||
unf (>= 0.0.5, < 1.0.0)
|
||||
dotenv (2.7.6)
|
||||
emoji_regex (3.0.0)
|
||||
excon (0.76.0)
|
||||
faraday (1.0.1)
|
||||
excon (0.78.0)
|
||||
faraday (1.1.0)
|
||||
multipart-post (>= 1.2, < 3)
|
||||
faraday-cookie_jar (0.0.6)
|
||||
faraday (>= 0.7.4)
|
||||
ruby2_keywords
|
||||
faraday-cookie_jar (0.0.7)
|
||||
faraday (>= 0.8.0)
|
||||
http-cookie (~> 1.0.0)
|
||||
faraday_middleware (1.0.0)
|
||||
faraday (~> 1.0)
|
||||
fastimage (2.2.0)
|
||||
fastlane (2.154.0)
|
||||
fastlane (2.164.0)
|
||||
CFPropertyList (>= 2.3, < 4.0.0)
|
||||
addressable (>= 2.3, < 3.0.0)
|
||||
aws-sdk-s3 (~> 1.0)
|
||||
@@ -95,17 +96,17 @@ GEM
|
||||
google-cloud-core (1.5.0)
|
||||
google-cloud-env (~> 1.0)
|
||||
google-cloud-errors (~> 1.0)
|
||||
google-cloud-env (1.3.3)
|
||||
google-cloud-env (1.4.0)
|
||||
faraday (>= 0.17.3, < 2.0)
|
||||
google-cloud-errors (1.0.1)
|
||||
google-cloud-storage (1.27.0)
|
||||
google-cloud-storage (1.29.1)
|
||||
addressable (~> 2.5)
|
||||
digest-crc (~> 0.4)
|
||||
google-api-client (~> 0.33)
|
||||
google-cloud-core (~> 1.2)
|
||||
googleauth (~> 0.9)
|
||||
mini_mime (~> 1.0)
|
||||
googleauth (0.13.1)
|
||||
googleauth (0.14.0)
|
||||
faraday (>= 0.17.3, < 2.0)
|
||||
jwt (>= 1.4, < 3.0)
|
||||
memoist (~> 0.16)
|
||||
@@ -119,7 +120,7 @@ GEM
|
||||
httpclient (2.8.3)
|
||||
jmespath (1.4.0)
|
||||
json (2.3.1)
|
||||
jwt (2.2.1)
|
||||
jwt (2.2.2)
|
||||
memoist (0.16.2)
|
||||
mime-types (3.3.1)
|
||||
mime-types-data (~> 3.2015)
|
||||
@@ -133,7 +134,7 @@ GEM
|
||||
netrc (0.11.0)
|
||||
os (1.1.1)
|
||||
plist (3.5.0)
|
||||
public_suffix (4.0.5)
|
||||
public_suffix (4.0.6)
|
||||
rake (13.0.1)
|
||||
representable (3.0.4)
|
||||
declarative (< 0.1.0)
|
||||
@@ -146,6 +147,7 @@ GEM
|
||||
netrc (~> 0.8)
|
||||
retriable (3.1.2)
|
||||
rouge (2.0.7)
|
||||
ruby2_keywords (0.0.2)
|
||||
rubyzip (2.3.0)
|
||||
security (0.1.3)
|
||||
signet (0.14.0)
|
||||
@@ -170,7 +172,7 @@ GEM
|
||||
unf_ext (0.0.7.7)
|
||||
unicode-display_width (1.7.0)
|
||||
word_wrap (1.0.0)
|
||||
xcodeproj (1.17.1)
|
||||
xcodeproj (1.19.0)
|
||||
CFPropertyList (>= 2.3.3, < 4.0)
|
||||
atomos (~> 0.1.3)
|
||||
claide (>= 1.0.2, < 2.0)
|
||||
|
||||
+43
-33
@@ -35,10 +35,10 @@
|
||||
platforms = [];
|
||||
source = {
|
||||
remotes = ["https://rubygems.org"];
|
||||
sha256 = "1rwd13lqambjpq94qhccw3ixn6bvwnqcnd3v1rdlmpcvqq2rw49c";
|
||||
sha256 = "1as2xr2yjsylrjys084bm2q90la0nw7rm1cgwx57wcds58i9zrwb";
|
||||
type = "gem";
|
||||
};
|
||||
version = "1.350.0";
|
||||
version = "1.383.0";
|
||||
};
|
||||
aws-sdk-core = {
|
||||
dependencies = ["aws-eventstream" "aws-partitions" "aws-sigv4" "jmespath"];
|
||||
@@ -46,10 +46,10 @@
|
||||
platforms = [];
|
||||
source = {
|
||||
remotes = ["https://rubygems.org"];
|
||||
sha256 = "1xfv8nfz8n700z29di51mcyyrnmbpq7flff4hx9mm92avnly1ysy";
|
||||
sha256 = "0xmppcxq7jm8lffqibkhq257hfwfbv82zm2y1fbhwm3icgxzwlfx";
|
||||
type = "gem";
|
||||
};
|
||||
version = "3.104.3";
|
||||
version = "3.109.1";
|
||||
};
|
||||
aws-sdk-kms = {
|
||||
dependencies = ["aws-sdk-core" "aws-sigv4"];
|
||||
@@ -57,10 +57,10 @@
|
||||
platforms = [];
|
||||
source = {
|
||||
remotes = ["https://rubygems.org"];
|
||||
sha256 = "0rpwpj4f4q9wdrbgiqngzwfdaaqyz0iif8sv16z6z0mm6y3cb06q";
|
||||
sha256 = "0ly1m631qm2ciif7sysbzrgczjvz95ga3g6w6vrzvfdv31jjnl9a";
|
||||
type = "gem";
|
||||
};
|
||||
version = "1.36.0";
|
||||
version = "1.39.0";
|
||||
};
|
||||
aws-sdk-s3 = {
|
||||
dependencies = ["aws-sdk-core" "aws-sdk-kms" "aws-sigv4"];
|
||||
@@ -68,10 +68,10 @@
|
||||
platforms = [];
|
||||
source = {
|
||||
remotes = ["https://rubygems.org"];
|
||||
sha256 = "068xx6wp86wkmikdzg4wqxmg570hc3ydp8211j02g13djjr3k28n";
|
||||
sha256 = "021yqghdb1i980vn249hv44jajr0v3hq4ik4r6fqh9kwp04fsbqv";
|
||||
type = "gem";
|
||||
};
|
||||
version = "1.75.0";
|
||||
version = "1.83.1";
|
||||
};
|
||||
aws-sigv4 = {
|
||||
dependencies = ["aws-eventstream"];
|
||||
@@ -79,20 +79,20 @@
|
||||
platforms = [];
|
||||
source = {
|
||||
remotes = ["https://rubygems.org"];
|
||||
sha256 = "0aknh3q37rq3ixxa84x2p26g8a15zmiig2rm1pmailsb9vqhfh3j";
|
||||
sha256 = "1ll9382c1x2hp750cilh01h1cycgyhdr4cmmgx23k94hyyb8chv5";
|
||||
type = "gem";
|
||||
};
|
||||
version = "1.2.1";
|
||||
version = "1.2.2";
|
||||
};
|
||||
babosa = {
|
||||
groups = ["default"];
|
||||
platforms = [];
|
||||
source = {
|
||||
remotes = ["https://rubygems.org"];
|
||||
sha256 = "10nn9bw63i4awpzn5vrx6kmpx1sg7z8r3fhw9r8bvg9pz2wh489g";
|
||||
sha256 = "16dwqn33kmxkqkv51cwiikdkbrdjfsymlnc0rgbjwilmym8a9phq";
|
||||
type = "gem";
|
||||
};
|
||||
version = "1.0.3";
|
||||
version = "1.0.4";
|
||||
};
|
||||
CFPropertyList = {
|
||||
groups = ["default"];
|
||||
@@ -212,21 +212,21 @@
|
||||
platforms = [];
|
||||
source = {
|
||||
remotes = ["https://rubygems.org"];
|
||||
sha256 = "05is0kb650j8wrdi4rgkdls662chnhdg2p64pgq3zkd3d7l2a9zw";
|
||||
sha256 = "1hi89v53pm2abfv9j8lgqdd7hgkr7fr0gwrczr940iwbb3xv7rrs";
|
||||
type = "gem";
|
||||
};
|
||||
version = "0.76.0";
|
||||
version = "0.78.0";
|
||||
};
|
||||
faraday = {
|
||||
dependencies = ["multipart-post"];
|
||||
dependencies = ["multipart-post" "ruby2_keywords"];
|
||||
groups = ["default"];
|
||||
platforms = [];
|
||||
source = {
|
||||
remotes = ["https://rubygems.org"];
|
||||
sha256 = "0wwks9652xwgjm7yszcq5xr960pjypc07ivwzbjzpvy9zh2fw6iq";
|
||||
sha256 = "16dapwi5pivrl25r4lkr1mxjrzkznj4wlcb08fzkmxnj4g5c6y35";
|
||||
type = "gem";
|
||||
};
|
||||
version = "1.0.1";
|
||||
version = "1.1.0";
|
||||
};
|
||||
faraday-cookie_jar = {
|
||||
dependencies = ["faraday" "http-cookie"];
|
||||
@@ -234,10 +234,10 @@
|
||||
platforms = [];
|
||||
source = {
|
||||
remotes = ["https://rubygems.org"];
|
||||
sha256 = "1di4gx6446a6zdkrpj679m5k515i53wvb4yxcsqvy8d8zacxiiv6";
|
||||
sha256 = "00hligx26w9wdnpgsrf0qdnqld4rdccy8ym6027h5m735mpvxjzk";
|
||||
type = "gem";
|
||||
};
|
||||
version = "0.0.6";
|
||||
version = "0.0.7";
|
||||
};
|
||||
faraday_middleware = {
|
||||
dependencies = ["faraday"];
|
||||
@@ -266,10 +266,10 @@
|
||||
platforms = [];
|
||||
source = {
|
||||
remotes = ["https://rubygems.org"];
|
||||
sha256 = "05y7qn8f1d3q355vf1fvbwz0sf73bwiwbcpzidd1szh49400h65b";
|
||||
sha256 = "1mr143fx505iwgci6v9bl4pd6v305wrc4q1s329sjmy67jfbm47w";
|
||||
type = "gem";
|
||||
};
|
||||
version = "2.154.0";
|
||||
version = "2.164.0";
|
||||
};
|
||||
fastlane-plugin-clean_testflight_testers = {
|
||||
groups = ["default"];
|
||||
@@ -330,10 +330,10 @@
|
||||
platforms = [];
|
||||
source = {
|
||||
remotes = ["https://rubygems.org"];
|
||||
sha256 = "0frifczbhs5k699avaxnaypijfmjd2zb1rbdmcb30vdx8sskypa9";
|
||||
sha256 = "0bjgxyvagy6hjj8yg7fqq24rwdjxb6hx7fdd1bmn4mwd846lci2i";
|
||||
type = "gem";
|
||||
};
|
||||
version = "1.3.3";
|
||||
version = "1.4.0";
|
||||
};
|
||||
google-cloud-errors = {
|
||||
groups = ["default"];
|
||||
@@ -351,10 +351,10 @@
|
||||
platforms = [];
|
||||
source = {
|
||||
remotes = ["https://rubygems.org"];
|
||||
sha256 = "06pmgk210frapxjjshy9iax6jb5ps8fbylcy0c9ypwji6cwxk990";
|
||||
sha256 = "1d8yc807dbd4pcwrrg2pdl30hghcnjid55qrjl2shffhzgiyl54h";
|
||||
type = "gem";
|
||||
};
|
||||
version = "1.27.0";
|
||||
version = "1.29.1";
|
||||
};
|
||||
googleauth = {
|
||||
dependencies = ["faraday" "jwt" "memoist" "multi_json" "os" "signet"];
|
||||
@@ -362,10 +362,10 @@
|
||||
platforms = [];
|
||||
source = {
|
||||
remotes = ["https://rubygems.org"];
|
||||
sha256 = "0ldhllhv8mlbalp8a3zb1hsj5p2i8f0vf88r71vm083gq7820iwn";
|
||||
sha256 = "0cm60nbmwzf83fzy06f3iyn5a6sw91siw8x9bdvpwwmjsmivana6";
|
||||
type = "gem";
|
||||
};
|
||||
version = "0.13.1";
|
||||
version = "0.14.0";
|
||||
};
|
||||
highline = {
|
||||
groups = ["default"];
|
||||
@@ -433,10 +433,10 @@
|
||||
platforms = [];
|
||||
source = {
|
||||
remotes = ["https://rubygems.org"];
|
||||
sha256 = "01zg1vp3lyl3flyjdkrcc93ghf833qgfgh2p1biqfhkzz11r129c";
|
||||
sha256 = "14ynyq1q483spj20ffl4xayfqx1a8qr761mqjfxczf8lwlap392n";
|
||||
type = "gem";
|
||||
};
|
||||
version = "2.2.1";
|
||||
version = "2.2.2";
|
||||
};
|
||||
memoist = {
|
||||
groups = ["default"];
|
||||
@@ -564,10 +564,10 @@
|
||||
platforms = [];
|
||||
source = {
|
||||
remotes = ["https://rubygems.org"];
|
||||
sha256 = "0vywld400fzi17cszwrchrzcqys4qm6sshbv73wy5mwcixmrgg7g";
|
||||
sha256 = "1xqcgkl7bwws1qrlnmxgh8g4g9m10vg60bhlw40fplninb3ng6d9";
|
||||
type = "gem";
|
||||
};
|
||||
version = "4.0.5";
|
||||
version = "4.0.6";
|
||||
};
|
||||
rake = {
|
||||
groups = ["default"];
|
||||
@@ -621,6 +621,16 @@
|
||||
};
|
||||
version = "2.0.7";
|
||||
};
|
||||
ruby2_keywords = {
|
||||
groups = ["default"];
|
||||
platforms = [];
|
||||
source = {
|
||||
remotes = ["https://rubygems.org"];
|
||||
sha256 = "17pcc0wgvh3ikrkr7bm3nx0qhyiqwidd13ij0fa50k7gsbnr2p0l";
|
||||
type = "gem";
|
||||
};
|
||||
version = "0.0.2";
|
||||
};
|
||||
rubyzip = {
|
||||
groups = ["default"];
|
||||
platforms = [];
|
||||
@@ -782,10 +792,10 @@
|
||||
platforms = [];
|
||||
source = {
|
||||
remotes = ["https://rubygems.org"];
|
||||
sha256 = "0mv5rsbgwq4vzri31w2f1474arrsr5j69rdhklrci6jnjps8dmx9";
|
||||
sha256 = "1411j6sfnz0cx4fiw52f0yqx4bgcn8cmpgi3i5rwmmahayyjz2fn";
|
||||
type = "gem";
|
||||
};
|
||||
version = "1.17.1";
|
||||
version = "1.19.0";
|
||||
};
|
||||
xcpretty = {
|
||||
dependencies = ["rouge"];
|
||||
|
||||
@@ -1,12 +1,12 @@
|
||||
Status é uma ferramenta de comunicação segura e privada. Converse com os seus amigos, armazene ativos e explore o futuro da web sem que os seus dados sejam explorados.
|
||||
Status es una herramienta de comunicación segura y privada. Chatea con amigos, almacena activos y explora el futuro de la web sin ser explotado por tu información personal.
|
||||
|
||||
Com a Status, apenas você controlas as suas informações.
|
||||
Solo tú controlas tu información, con Status.
|
||||
|
||||
CONVERSA
|
||||
A Status remove terceiros centralizados das suas mensagens. Não é apenas o seu conteúdo que está protegido, mas também os seus metadados - para uma privacidade máxima.
|
||||
CHAT
|
||||
Status quita de en medio terceros centralizados a tus mensajes. No sólo tu contenido es protegido, sino también tu metadata: por máxima privacidad.
|
||||
|
||||
TRANSACIONA
|
||||
Armazene ativos digitais na sua carteira Status. Envie e solicite tokens aos seus amigos, ou transacione com aplicações descentralizadas.
|
||||
TRANSFIERE
|
||||
Almacena activos digitales en tu monedero Status (ERC20 and ERC721). Envía y recibe monedas de tus amigos, o transfiere activos con aplicaciónes descentralizadas.
|
||||
|
||||
EXPLORA
|
||||
Acesse à aplicações baseadas na Ethereum na web3. Joge jogos, troce ativos digitais e muito mais.
|
||||
Accede a aplicaciones basadas en Ethereum de la Web3. Juega, intercambia bienes digitales y más.
|
||||
@@ -1 +1 @@
|
||||
Converse e faça transações de uma forma segura
|
||||
Chatea y transfiere de forma segura
|
||||
@@ -1 +1 @@
|
||||
Status - Comunição Privada
|
||||
Status - Comunicación Privada
|
||||
@@ -1,7 +0,0 @@
|
||||
`cd fiddle`
|
||||
|
||||
`yarn install`
|
||||
|
||||
`clj prepare.clj`
|
||||
|
||||
`clj -A:dev`
|
||||
@@ -1,17 +0,0 @@
|
||||
{:deps {org.clojure/clojurescript {:mvn/version "1.10.520"}
|
||||
com.bhauman/figwheel-main {:mvn/version "0.2.0"}
|
||||
org.clojure/core.async {:mvn/version "0.4.474"}
|
||||
reagent {:mvn/version "0.8.1" :exclusions [cljsjs/react cljsjs/react-dom]}
|
||||
re-frame {:git/url "https://github.com/status-im/re-frame"
|
||||
:sha "b0d3b0f016f217c6a397a54e5eba9486471fb172"
|
||||
:deps/manifest :deps}
|
||||
com.andrewmcveigh/cljs-time {:mvn/version "0.5.2"}
|
||||
status-im/timbre {:mvn/version "4.10.0-2-status"}
|
||||
com.taoensso/encore {:mvn/version "2.94.0"}
|
||||
hickory {:mvn/version "0.7.1"}
|
||||
cljs-bean {:mvn/version "1.3.0"}}
|
||||
|
||||
:paths ["src" "../src" "resources" "target" "../resources"]
|
||||
|
||||
:aliases {:dev {:extra-deps {re-frisk {:mvn/version "0.5.4.1"}}
|
||||
:main-opts ["-m" "figwheel.main" "-b" "dev" "-r"]}}}
|
||||
@@ -1,10 +0,0 @@
|
||||
{:main fiddle.core
|
||||
:output-to "resources/public/js/main.js"
|
||||
:preloads [re-frisk.preload]
|
||||
:infer-externs true
|
||||
:npm-deps false
|
||||
:foreign-libs [{:file "dist/index_bundle.js"
|
||||
:provides ["react" "react-dom" "react-native-web"]
|
||||
:global-exports {react React
|
||||
react-dom ReactDOM
|
||||
react-native-web ReactNativeWeb}}]}
|
||||
Vendored
-38
File diff suppressed because one or more lines are too long
@@ -1,9 +0,0 @@
|
||||
{
|
||||
"dependencies": {
|
||||
"react": "^16.9.0",
|
||||
"react-dom": "^16.9.0",
|
||||
"react-native-web": "^0.11.6",
|
||||
"webpack": "^4.39.2",
|
||||
"webpack-cli": "^3.3.6"
|
||||
}
|
||||
}
|
||||
@@ -1,18 +0,0 @@
|
||||
(ns prepare
|
||||
(:require [clojure.string :as str]
|
||||
[clojure.java.io :as io]))
|
||||
|
||||
;;TODO copy dirs to have images
|
||||
;(io/copy (io/file "../resources/images") (io/file "./resources/public/images"))
|
||||
|
||||
(let [fls (file-seq (java.io.File. "../android/app/src/main/res/drawable-mdpi"))]
|
||||
(spit "./resources/public/icons.edn"
|
||||
(pr-str
|
||||
(remove nil?
|
||||
(map
|
||||
(fn [fl]
|
||||
(let [n (first (str/split (.getName fl) #".png"))]
|
||||
(when (.isFile fl)
|
||||
(io/copy (io/file (.getPath fl)) (io/file (str "./resources/public/" (str/replace n #"_" "-"))))
|
||||
(str/replace n #"_" "-"))))
|
||||
fls)))))
|
||||
@@ -1,25 +0,0 @@
|
||||
<!DOCTYPE html>
|
||||
<html>
|
||||
<head>
|
||||
<meta charset='utf-8'>
|
||||
<meta content="ie=edge" http-equiv="x-ua-compatible" />
|
||||
<title>Fiddle</title>
|
||||
<meta content="width=device-width, initial-scale=1" name="viewport" />
|
||||
|
||||
<style>
|
||||
@import url('https://rsms.me/inter/inter.css');
|
||||
|
||||
html, body {
|
||||
height: 100%;
|
||||
margin: 0;
|
||||
}
|
||||
</style>
|
||||
</head>
|
||||
<body>
|
||||
<div id="app" class="app"></div>
|
||||
<script src="js/main.js" type="text/javascript"></script>
|
||||
<script type="text/javascript">
|
||||
fiddle.core.init();
|
||||
</script>
|
||||
</body>
|
||||
</html>
|
||||
@@ -1,17 +0,0 @@
|
||||
(ns ^:figwheel-hooks fiddle.core
|
||||
(:require [reagent.core :as reagent]
|
||||
[re-frame.core :as re-frame]
|
||||
[fiddle.views.main :as main]
|
||||
fiddle.subs
|
||||
fiddle.events))
|
||||
|
||||
(defn mount-root []
|
||||
(reagent/render [main/main] (js/document.getElementById "app")))
|
||||
|
||||
(defn ^:export init []
|
||||
(re-frame/dispatch-sync [:initialize-db])
|
||||
(re-frame/dispatch [:load-icons])
|
||||
(mount-root))
|
||||
|
||||
(defn ^:after-load on-reload []
|
||||
(mount-root))
|
||||
@@ -1,33 +0,0 @@
|
||||
(ns fiddle.events
|
||||
(:require [re-frame.core :as re-frame]
|
||||
[cljs.reader :as reader]))
|
||||
|
||||
(re-frame/reg-event-fx
|
||||
:initialize-db
|
||||
(fn [_ _]
|
||||
{:db {:view-id :colors}}))
|
||||
|
||||
(re-frame/reg-fx
|
||||
:load-icons-fx
|
||||
(fn []
|
||||
(let [cl (js/XMLHttpRequest.)]
|
||||
(.open cl "GET" "./icons.edn")
|
||||
(set! (.-onreadystatechange cl) #(when (= (.-status cl) 200)
|
||||
(re-frame/dispatch [:set :icons (reader/read-string (.-responseText cl))])))
|
||||
(.send cl))))
|
||||
|
||||
|
||||
(re-frame/reg-event-fx
|
||||
:load-icons
|
||||
(fn [_ _]
|
||||
{:load-icons-fx nil}))
|
||||
|
||||
(re-frame/reg-event-fx
|
||||
:set
|
||||
(fn [{:keys [db]} [_ k v]]
|
||||
{:db (assoc db k v)}))
|
||||
|
||||
(re-frame/reg-event-fx
|
||||
:set-in
|
||||
(fn [{:keys [db]} [_ path v]]
|
||||
{:db (assoc-in db path v)}))
|
||||
@@ -1,13 +0,0 @@
|
||||
(ns fiddle.frame
|
||||
(:require [status-im.ui.components.react :as react]
|
||||
[re-frame.core :as re-frame]))
|
||||
|
||||
(def width 375)
|
||||
(def height 568) ;667
|
||||
|
||||
(re-frame/reg-sub :dimensions/window-width (fn [_] width))
|
||||
(re-frame/reg-sub :dimensions/window (fn [_] {:width width :height height}))
|
||||
|
||||
(defn frame [content]
|
||||
[react/view {:style {:width width :height height :border-color :black :border-width 1}}
|
||||
content])
|
||||
@@ -1,16 +0,0 @@
|
||||
(ns fiddle.snippets)
|
||||
|
||||
(defmacro code-snippet [code & [white?]]
|
||||
(let [show? (gensym 'show)]
|
||||
`[(fn []
|
||||
(let [~show? (reagent/atom false)]
|
||||
(fn []
|
||||
[react/view
|
||||
(when @~show?
|
||||
[react/text {:style {:font-family "monospace" :background-color :black :color "#44d058"
|
||||
:max-width 400 }}
|
||||
(with-out-str (cljs.pprint/pprint '~code))])
|
||||
[react/view {:align-items :flex-end :background-color (when-not ~white? colors/gray-lighter)}
|
||||
[react/touchable-highlight {:on-press #(swap! ~show? not)}
|
||||
[react/text {:style {:font-size 14 :color :blue :padding 3}} (if @~show? "Hide" "Code")]]]
|
||||
~code])))]))
|
||||
@@ -1,6 +0,0 @@
|
||||
(ns fiddle.subs
|
||||
(:require [re-frame.core :as re-frame]))
|
||||
|
||||
(re-frame/reg-sub :view-id (fn [db] (get db :view-id)))
|
||||
|
||||
(re-frame/reg-sub :icons (fn [db] (get db :icons)))
|
||||
@@ -1,38 +0,0 @@
|
||||
(ns fiddle.views.colors
|
||||
(:require [status-im.ui.components.react :as react]
|
||||
[status-im.ui.components.colors :as colors]))
|
||||
|
||||
(defn color [name color color-name usage & [bg?]]
|
||||
[react/view {:margin 10 :padding 10 :border-radius 8 :background-color (when bg? colors/blue)}
|
||||
[react/text {:style {:typography :main-medium :color (when bg? colors/white)}} name]
|
||||
[react/view {:margin-vertical 24 :width 156 :height 156 :border-radius 80 :background-color color
|
||||
:border-width 1 :border-color colors/gray}]
|
||||
[react/text {:style {:color (when bg? colors/white)}} color-name]
|
||||
[react/text {:style {:color (when bg? colors/white)}} color]
|
||||
[react/text {:style {:margin-top 6 :color (if bg? colors/white-transparent colors/gray) :font-size 12}} usage]])
|
||||
|
||||
(defn colors-arr [title colors]
|
||||
[react/view
|
||||
[react/text title]
|
||||
[react/view {:flex-direction :row :flex-wrap :wrap :flex 1 :margin-vertical 24}
|
||||
(for [color colors]
|
||||
[react/view {:margin-left 10 :width 40 :height 40 :border-radius 20 :background-color color}])]])
|
||||
|
||||
(defn colors []
|
||||
[react/scroll-view
|
||||
[react/view {:flex-direction :row :flex-wrap :wrap :flex 1}
|
||||
[color "Accent Blue" colors/blue "blue" "Links, buttons"]
|
||||
[color "Light Blue" colors/blue-light "blue-light" "Button background"]
|
||||
[color "White" colors/white "white" "Background, icons"]
|
||||
[color "Dark Grey" colors/gray "gray" "Secondary text"]
|
||||
[color "Light Grey" colors/gray-lighter "gray-lighter" "Background, inputs, dividers"]
|
||||
[color "Black" colors/black "black" "Icons"]
|
||||
[color "Red" colors/red "red" "Errors"]
|
||||
[color "Green" colors/green "green" "Success"]
|
||||
[color "40% of Dark Grey" colors/gray-transparent-40 "gray-transparent-40" "Chevrons in lists (>) "]
|
||||
[color "10% of Black" colors/black-transparent "black-transparent" ""]
|
||||
[color "70% of White" colors/white-transparent-70 "white-transparent-70" "Secondary text on blue background" true]
|
||||
[color "40% of White" colors/white-transparent "white-transparent" "Chevrons in lists (>) on the\nblue background\nText in Wallet\n\n" true]
|
||||
[color "10% of White" colors/white-transparent-10 "white-transparent-10" "Backgrounds behind icons" true]]
|
||||
[colors-arr "Chat colors" colors/chat-colors]
|
||||
[colors-arr "Account colors" colors/account-colors]])
|
||||
@@ -1,16 +0,0 @@
|
||||
(ns fiddle.views.icons
|
||||
(:require-macros [status-im.utils.views :as views])
|
||||
(:require [status-im.ui.components.react :as react]
|
||||
[status-im.ui.components.icons.vector-icons :as vector-icons]
|
||||
[status-im.ui.components.colors :as colors]))
|
||||
|
||||
(views/defview icons []
|
||||
(views/letsubs [icons [:icons]]
|
||||
(if icons
|
||||
[react/view {:flex-direction :row :flex-wrap :wrap :flex 1 :background-color colors/gray-transparent-40}
|
||||
(for [icon icons]
|
||||
[react/view {:padding 20}
|
||||
[react/text {:srtle {:margin-bottom 5}} icon]
|
||||
[vector-icons/icon icon]])]
|
||||
[react/view
|
||||
[react/text "To see all icons please run `clj prepare.clj` command in terminal"]])))
|
||||
@@ -1,214 +0,0 @@
|
||||
(ns fiddle.views.list-items
|
||||
(:require [status-im.ui.components.react :as react]
|
||||
[status-im.ui.components.colors :as colors]
|
||||
[status-im.ui.components.list-item.views :as list-item]
|
||||
[fiddle.frame :as frame]
|
||||
[status-im.ui.components.badge :as badge]
|
||||
cljs.pprint
|
||||
[reagent.core :as reagent]
|
||||
[status-im.ui.components.button :as button])
|
||||
(:require-macros [fiddle.snippets :as snippets]))
|
||||
|
||||
(defn item [name content]
|
||||
[react/view
|
||||
[react/text {:style {:color colors/gray :margin-bottom 10 :margin-top 40}} name]
|
||||
[react/view {:background-color :white :width frame/width}
|
||||
content]])
|
||||
|
||||
(defn list-header []
|
||||
[react/view
|
||||
{:background-color colors/gray-lighter
|
||||
:flex 1
|
||||
:padding 20
|
||||
:flex-direction :row
|
||||
:flex-wrap :wrap}
|
||||
[react/view {:width 375}
|
||||
[react/view {:background-color :white}
|
||||
(snippets/code-snippet [list-item/list-item {:type :section-header :title "Header title"}])]]])
|
||||
|
||||
(defn list-items []
|
||||
[react/view
|
||||
{:background-color colors/gray-lighter
|
||||
:flex 1
|
||||
:padding 20
|
||||
:flex-direction :row
|
||||
:flex-wrap :wrap}
|
||||
[react/view {:margin-right 10}
|
||||
[item "Default with Image"
|
||||
(snippets/code-snippet
|
||||
[list-item/list-item
|
||||
{:title "George"
|
||||
:on-press #()
|
||||
:icon [react/view
|
||||
{:width 40
|
||||
:height 40
|
||||
:border-radius 20
|
||||
:background-color colors/green}]}])]
|
||||
[item "Default with Image, icon"
|
||||
(snippets/code-snippet
|
||||
[list-item/list-item
|
||||
{:title "George"
|
||||
:on-press #()
|
||||
:icon [react/view
|
||||
{:width 40
|
||||
:height 40
|
||||
:border-radius 20
|
||||
:background-color colors/green}]
|
||||
:accessories [:main-icons/more]}])]
|
||||
[item "With radio button (TODO!)"
|
||||
(snippets/code-snippet
|
||||
[list-item/list-item
|
||||
{:title "George"
|
||||
:on-press #()
|
||||
:icon [react/view
|
||||
{:width 40
|
||||
:height 40
|
||||
:border-radius 20
|
||||
:background-color colors/green}]}])]]
|
||||
[react/view {:margin-right 10}
|
||||
[item "Default wIth icon in circle"
|
||||
(snippets/code-snippet
|
||||
[list-item/list-item
|
||||
{:title "Clear History"
|
||||
:theme :action
|
||||
:icon :main-icons/close
|
||||
:on-press #()}])]
|
||||
[item "Default wIth icon in circle, chevron"
|
||||
(snippets/code-snippet
|
||||
[list-item/list-item
|
||||
{:title "Get a ENS username?"
|
||||
:icon :main-icons/address
|
||||
:on-press #()
|
||||
:accessories [:chevron]}])]
|
||||
[item "Default wIth icon in circle, chevron and accessory"
|
||||
(snippets/code-snippet
|
||||
[list-item/list-item
|
||||
{:title "Contacts"
|
||||
:icon :main-icons/in-contacts
|
||||
:on-press #()
|
||||
:accessories [[react/text {:style {:color colors/gray}} "4"]
|
||||
:chevron]}])]
|
||||
[item "Default wIth icon in circle, chevron and badge"
|
||||
(snippets/code-snippet
|
||||
[list-item/list-item
|
||||
{:title "Privacy and Security"
|
||||
:icon :main-icons/profile
|
||||
:on-press #()
|
||||
:accessories [[badge/badge "333"] :chevron]}])]
|
||||
[item "Default wIth icon in circle, switch"
|
||||
(snippets/code-snippet
|
||||
[list-item/list-item
|
||||
{:title "Notifications"
|
||||
:icon :main-icons/notification
|
||||
:on-press #()
|
||||
:accessories
|
||||
[[react/switch {}]]}])]
|
||||
[item "Default wIth icon in circle, red"
|
||||
(snippets/code-snippet
|
||||
[list-item/list-item
|
||||
{:title "Delete and Leave"
|
||||
:theme :action-red
|
||||
:icon :main-icons/delete
|
||||
:on-press #()}])]]
|
||||
[react/view {:margin-right 10}
|
||||
[item "Two lines with icon in circle, chevron"
|
||||
(snippets/code-snippet
|
||||
[list-item/list-item
|
||||
{:title "alex.stateofus.eth"
|
||||
:subtitle "ENS name"
|
||||
:icon :main-icons/address
|
||||
:accessories [:chevron]
|
||||
:on-press #()}])]
|
||||
[item "Two lines with icon in circle"
|
||||
(snippets/code-snippet
|
||||
[list-item/list-item
|
||||
{:title "alex.stateofus.eth"
|
||||
:subtitle "ENS name"
|
||||
:icon :main-icons/address
|
||||
:on-press #()}])]
|
||||
[item "Two lines with icon in circle, blue title"
|
||||
(snippets/code-snippet
|
||||
[list-item/list-item
|
||||
{:title "Add or Create a Profile"
|
||||
:subtitle "Requires signout"
|
||||
:theme :action
|
||||
:icon :main-icons/address
|
||||
:on-press #()}])]
|
||||
[item "Two lines with dapp icon,title and subtitle"
|
||||
(snippets/code-snippet
|
||||
[list-item/list-item
|
||||
{:title "CryptoKitties"
|
||||
:subtitle "https://cryptokitties.co"
|
||||
:icon [react/view {:width 40
|
||||
:height 40
|
||||
:border-radius 20
|
||||
:background-color colors/green}]
|
||||
:on-press #()}])]]
|
||||
[react/view {:margin-right 10}
|
||||
[item "Default Small"
|
||||
(snippets/code-snippet
|
||||
[list-item/list-item
|
||||
{:title "Everybody"
|
||||
:type :small
|
||||
:on-press #()}])]
|
||||
[item "Default Small button"
|
||||
(snippets/code-snippet
|
||||
[list-item/list-item
|
||||
{:title "Change Passcode"
|
||||
:type :small
|
||||
:theme :action
|
||||
:on-press #()}])]
|
||||
[item "Default Small red button"
|
||||
(snippets/code-snippet
|
||||
[list-item/list-item
|
||||
{:title "Delete all Contacts"
|
||||
:type :small
|
||||
:theme :action-red
|
||||
:on-press #()}])]
|
||||
[item "Default Small with chevron"
|
||||
(snippets/code-snippet
|
||||
[list-item/list-item
|
||||
{:title "Recovery Phrase"
|
||||
:type :small
|
||||
:on-press #()
|
||||
:accessories [:chevron]}])]
|
||||
[item "Default Small with chevron and accessory"
|
||||
(snippets/code-snippet
|
||||
[list-item/list-item
|
||||
{:title "Main Currency"
|
||||
:type :small
|
||||
:on-press #()
|
||||
:accessories [[react/text {:style {:color colors/gray}} "USD"]
|
||||
:chevron]}])]
|
||||
[item "Default Small with chevron, badge"
|
||||
(snippets/code-snippet
|
||||
[list-item/list-item
|
||||
{:title "Recovery Phrase"
|
||||
:type :small
|
||||
:on-press #()
|
||||
:accessories [[badge/badge "2"] :chevron]}])]]
|
||||
[react/view {:margin-right 10}
|
||||
[item "Long title"
|
||||
(snippets/code-snippet
|
||||
[list-item/list-item
|
||||
{:title "loooooooooong loooooooooooooong looooooong title"
|
||||
:subtitle "ENS name"
|
||||
:icon :main-icons/address
|
||||
:accessories [:chevron]
|
||||
:on-press #()}])]
|
||||
[item "Long subtitle"
|
||||
(snippets/code-snippet
|
||||
[list-item/list-item
|
||||
{:title "alex.stateofus.eth"
|
||||
:subtitle "loooooooooooooooong loooooong looooooong subtitle"
|
||||
:icon :main-icons/address
|
||||
:accessories [:chevron]
|
||||
:on-press #()}])]
|
||||
[item "Title-prefix + long title"
|
||||
(snippets/code-snippet
|
||||
[list-item/list-item
|
||||
{:title-prefix "From"
|
||||
:title-prefix-width 45
|
||||
:title "title-prefix and loooooong title really loooonglooo00oooong"
|
||||
:type :small
|
||||
:on-press #()}])]]])
|
||||
@@ -1,52 +0,0 @@
|
||||
(ns fiddle.views.main
|
||||
(:require-macros [status-im.utils.views :as views])
|
||||
(:require [status-im.ui.components.react :as react]
|
||||
[status-im.ui.components.button :as button]
|
||||
[fiddle.views.colors :as colors]
|
||||
[fiddle.views.screens :as screens]
|
||||
[fiddle.views.typography :as typography]
|
||||
[fiddle.views.icons :as icons]
|
||||
[fiddle.views.list-items :as list-items]
|
||||
[fiddle.views.ui :as ui]
|
||||
[fiddle.views.toolbar :as toolbar]
|
||||
[fiddle.views.topbar :as topbar]
|
||||
[re-frame.core :as re-frame]))
|
||||
|
||||
(defn btn [id label view-id]
|
||||
[react/view {:margin-bottom 5}
|
||||
[button/button
|
||||
{:label label
|
||||
:disabled? (= id view-id)
|
||||
:type :secondary
|
||||
:on-press #(re-frame/dispatch [:set :view-id id])}]])
|
||||
|
||||
(views/defview main []
|
||||
(views/letsubs [view-id [:view-id]]
|
||||
[react/view {:flex 1 :flex-direction :row :padding 10}
|
||||
[react/view {:padding-right 20}
|
||||
[btn :colors "Colors" view-id]
|
||||
[btn :icons "Icons" view-id]
|
||||
[btn :typography "Typography" view-id]
|
||||
[btn :list-header "List Header" view-id]
|
||||
[btn :list-items "List Items" view-id]
|
||||
[btn :top-bar "Top Bar" view-id]
|
||||
[btn :ui "UI elements" view-id]
|
||||
[btn :tooltip "Tooltips" view-id]
|
||||
[btn :bottom "Bottom Sheet" view-id]
|
||||
[btn :popover "Popover" view-id]
|
||||
[btn :input "Text input" view-id]
|
||||
[btn :tabbar "Tab Bar" view-id]
|
||||
[btn :toolbar "Toolbar" view-id]
|
||||
[btn :snack "Snackbar" view-id]
|
||||
[btn :screens "Screens" view-id]]
|
||||
(case view-id
|
||||
:colors [colors/colors]
|
||||
:icons [icons/icons]
|
||||
:screens [screens/screens]
|
||||
:typography [typography/typography]
|
||||
:list-items [list-items/list-items]
|
||||
:toolbar [toolbar/toolbar-view]
|
||||
:top-bar [topbar/topbar-view]
|
||||
:list-header [list-items/list-header]
|
||||
:ui [ui/ui]
|
||||
[react/text "TODO"])]))
|
||||
@@ -1,11 +0,0 @@
|
||||
(ns fiddle.views.screens
|
||||
(:require [re-frame.core :as re-frame]
|
||||
[status-im.ui.components.react :as react]
|
||||
[status-im.ui.screens.wallet.add-new.views :as add-new]
|
||||
[fiddle.frame :as frame]))
|
||||
|
||||
|
||||
(defn screens []
|
||||
[react/view {:flex-direction :row}
|
||||
[frame/frame
|
||||
[add-new/add-account]]])
|
||||
@@ -1,29 +0,0 @@
|
||||
(ns fiddle.views.toolbar
|
||||
(:require [status-im.ui.components.react :as react]
|
||||
[status-im.ui.components.toolbar :as toolbar]
|
||||
[status-im.ui.components.colors :as colors]
|
||||
cljs.pprint
|
||||
[reagent.core :as reagent]
|
||||
[status-im.ui.components.button :as button])
|
||||
(:require-macros [fiddle.snippets :as snippets]))
|
||||
|
||||
(defn toolbar-view []
|
||||
[react/view
|
||||
{:background-color colors/gray-lighter
|
||||
:flex 1
|
||||
:padding 20
|
||||
:flex-direction :row
|
||||
:flex-wrap :wrap}
|
||||
[react/view {:width 375}
|
||||
[react/view {:background-color :white :margin 10}
|
||||
(snippets/code-snippet [toolbar/toolbar {:center {:type :secondary :label "Label"}}])]
|
||||
[react/view {:background-color :white :margin 10}
|
||||
(snippets/code-snippet [toolbar/toolbar {:left {:type :previous :label "Label"} :right {:type :next :label "Label"}}])]
|
||||
[react/view {:background-color :white :margin 10}
|
||||
(snippets/code-snippet [toolbar/toolbar {:left {:type :secondary :label "Label"} :right {:label "Label"}}])]
|
||||
[react/view {:background-color :white :margin 10}
|
||||
(snippets/code-snippet [toolbar/toolbar {:left {:type :previous :label "Label"}}])]
|
||||
[react/view {:background-color :white :margin 10}
|
||||
(snippets/code-snippet [toolbar/toolbar {:right {:type :next :label "Label"}}])]
|
||||
[react/view {:background-color :white :margin 10}
|
||||
(snippets/code-snippet [toolbar/toolbar {:center {:label "Label"}}])]]])
|
||||
@@ -1,33 +0,0 @@
|
||||
(ns fiddle.views.topbar
|
||||
(:require [status-im.ui.components.react :as react]
|
||||
[status-im.ui.components.topbar :as topbar]
|
||||
[status-im.ui.components.colors :as colors]
|
||||
cljs.pprint
|
||||
[reagent.core :as reagent])
|
||||
(:require-macros [fiddle.snippets :as snippets]))
|
||||
|
||||
(defn topbar-view []
|
||||
[react/view
|
||||
{:background-color colors/gray-lighter
|
||||
:flex 1
|
||||
:padding 20
|
||||
:flex-direction :row
|
||||
:flex-wrap :wrap}
|
||||
[react/view {:width 375}
|
||||
[react/view {:background-color :white :margin 10}
|
||||
(snippets/code-snippet [topbar/topbar {:title "Chat Invites"}])]
|
||||
[react/view {:background-color :white :margin 10}
|
||||
(snippets/code-snippet [topbar/topbar {:title "Chat Invites tile tile title tile tile title tile tile title tile tile title tile tile title tile tile title 3"}])]
|
||||
[react/view {:background-color :white :margin 10}
|
||||
(snippets/code-snippet [topbar/topbar {:title "Chat" :navigation :none :show-border? true}])
|
||||
[react/view {:height 10}]]
|
||||
[react/view {:background-color :white :margin 10}
|
||||
(snippets/code-snippet [topbar/topbar {:title "Blocked Users" :accessories [{:label "Done" :handler #(js/alert "Done")}]}])]
|
||||
[react/view {:background-color :white :margin 10}
|
||||
(snippets/code-snippet [topbar/topbar {:title "Blocked Users" :accessories [{:label "Done" :handler #(js/alert "Done")}] :navigation {:label "Cancel" :handler #(js/alert "Cancel")}}])]
|
||||
[react/view {:background-color :white :margin 10}
|
||||
(snippets/code-snippet [topbar/topbar {:title "Chat Invites" :accessories [{:icon :more :handler #(js/alert "More")}]}])]
|
||||
[react/view {:background-color :white :margin 10}
|
||||
(snippets/code-snippet [topbar/topbar {:title "Title" :accessories [{:icon :more :handler #(js/alert "More")} {:icon :share :handler #(js/alert "Share")}]}])]
|
||||
[react/view {:background-color :white :margin 10}
|
||||
(snippets/code-snippet [topbar/topbar {:title "test"}])]]])
|
||||
@@ -1,21 +0,0 @@
|
||||
(ns fiddle.views.typography
|
||||
(:require [status-im.ui.components.react :as react]
|
||||
[status-im.ui.components.colors :as colors]
|
||||
[status-im.ui.components.typography :as typography]))
|
||||
|
||||
(defn typo [name key]
|
||||
[react/view {:flex-direction :row :align-items :center :margin-bottom 40}
|
||||
[react/text {:style {:typography key :margin-right 20 :width 200}} name]
|
||||
[react/text {:style {:margin-right 20 :width 200}} (str key)]
|
||||
[react/text {:style {:color colors/gray}} (get typography/typography-styles key)]])
|
||||
|
||||
(defn typography []
|
||||
[react/view {:flex-direction :row :flex 1}
|
||||
[react/view {:padding 20}
|
||||
[typo "Header" :header]
|
||||
[typo "Title Bold" :title-bold]
|
||||
[typo "Title" :title]
|
||||
[typo "Main Medium" :main-medium]
|
||||
[typo "Main" nil]
|
||||
[typo "Caption" :caption]
|
||||
[typo "TIMESTAMP" :timestamp]]])
|
||||
@@ -1,82 +0,0 @@
|
||||
(ns fiddle.views.ui
|
||||
(:require [status-im.ui.components.react :as react]
|
||||
[status-im.ui.components.button :as button]
|
||||
[status-im.ui.components.colors :as colors]
|
||||
[status-im.ui.components.badge :as badge]
|
||||
[status-im.ui.components.checkbox.view :as checkbox]
|
||||
[reagent.core :as reagent]
|
||||
[status-im.ui.components.radio :as radio]
|
||||
cljs.pprint)
|
||||
(:require-macros [fiddle.snippets :as snippets]))
|
||||
|
||||
(def sw (reagent/atom true))
|
||||
(def ch (reagent/atom true))
|
||||
(def ch2 (reagent/atom false))
|
||||
|
||||
(defn ui []
|
||||
[react/view {:flex-direction :row :flex-wrap :wrap :flex 1}
|
||||
[react/view
|
||||
[react/text {:style {:typography :main-medium}} "Main button"]
|
||||
[react/view {:padding 40 :background-color :while :border-radius 20}
|
||||
(snippets/code-snippet [button/button {:label "Label"}] true)
|
||||
(snippets/code-snippet [button/button {:label "Label" :disabled? true}] true)]]
|
||||
[react/view
|
||||
[react/text {:style {:typography :main-medium}} "Secondary button"]
|
||||
[react/view {:padding 40 :background-color :while :border-radius 20}
|
||||
(snippets/code-snippet [button/button {:label "Label" :type :secondary}] true)
|
||||
(snippets/code-snippet [button/button {:label "Label" :type :secondary :disabled? true}] true)]]
|
||||
[react/view
|
||||
[react/text {:style {:typography :main-medium}} "Next and previous buttons"]
|
||||
[react/view {:padding 40 :background-color :while :border-radius 20 :flex-direction :row}
|
||||
[react/view
|
||||
(snippets/code-snippet [button/button {:label "Label" :type :next}] true)
|
||||
(snippets/code-snippet [button/button {:label "Label" :type :previous}] true)]
|
||||
[react/view
|
||||
(snippets/code-snippet [button/button {:label "Label" :type :next :disabled? true}] true)
|
||||
(snippets/code-snippet [button/button {:label "Label2" :type :previous :disabled? true}] true)]]]
|
||||
[react/view
|
||||
[react/text {:style {:typography :main-medium}} "Switch"]
|
||||
[react/view {:padding 40 :background-color :while :border-radius 20}
|
||||
(snippets/code-snippet
|
||||
[react/switch
|
||||
{:track-color #js {:true colors/blue :false nil}
|
||||
:value @sw
|
||||
:on-value-change #(swap! sw not)
|
||||
:disabled false}]
|
||||
true)
|
||||
[react/view {:height 20}]
|
||||
(snippets/code-snippet
|
||||
[react/switch
|
||||
{:track-color #js {:true colors/blue :false nil}
|
||||
:value false
|
||||
:disabled true}]
|
||||
true)]]
|
||||
[react/view
|
||||
[react/text {:style {:typography :main-medium}} "Badge"]
|
||||
[react/view {:padding 40 :background-color :while :border-radius 20 :flex-direction :row :flex-wrap :wrap}
|
||||
[react/view {:margin 10}
|
||||
(snippets/code-snippet [badge/badge "8"] true)]
|
||||
[react/view {:margin 10}
|
||||
[badge/badge "8" true]]
|
||||
[react/view {:margin 10}
|
||||
[badge/badge "128"]]
|
||||
[react/view {:margin 10}
|
||||
[badge/badge "338" true]]]]
|
||||
[react/view
|
||||
[react/text {:style {:typography :main-medium}} "Checkbox"]
|
||||
[react/view {:padding 40 :background-color :while :border-radius 20}
|
||||
(snippets/code-snippet
|
||||
[checkbox/checkbox
|
||||
{:checked? @ch :on-value-change #(swap! ch not)}]
|
||||
true)
|
||||
[react/view {:height 20}]
|
||||
(snippets/code-snippet
|
||||
[checkbox/checkbox
|
||||
{:checked? @ch2 :on-value-change #(swap! ch2 not)}]
|
||||
true)]]
|
||||
[react/view
|
||||
[react/text {:style {:typography :main-medium}} "Radio button"]
|
||||
[react/view {:padding 40 :background-color :while :border-radius 20}
|
||||
(snippets/code-snippet [radio/radio true] true)
|
||||
[react/view {:height 20}]
|
||||
(snippets/code-snippet [radio/radio false] true)]]])
|
||||
@@ -1,6 +0,0 @@
|
||||
import React from 'react';
|
||||
import ReactDOM from 'react-dom';
|
||||
window.deps = {'react-native-web' : require('react-native-web') };
|
||||
window.React = React;
|
||||
window.ReactDOM = ReactDOM;
|
||||
window.ReactNativeWeb = window.deps['react-native-web'];
|
||||
@@ -1,20 +0,0 @@
|
||||
(ns status-im.i18n-resources
|
||||
(:require-macros [status-im.i18n :as i18n])
|
||||
(:require [status-im.utils.types :as types]
|
||||
[clojure.string :as string]))
|
||||
|
||||
(def default-device-language
|
||||
:en)
|
||||
|
||||
;; translations
|
||||
(def translations-by-locale
|
||||
(->> (i18n/translations [:en :es_419 :fa :ko :ms :pl :ru :zh_Hans_CN])
|
||||
(map (fn [[k t]]
|
||||
(let [k' (-> (name k)
|
||||
(string/replace "_" "-")
|
||||
keyword)]
|
||||
[k' (types/json->clj t)])))
|
||||
(into {})))
|
||||
|
||||
;; API compatibility
|
||||
(defn load-language [lang])
|
||||
@@ -1,43 +0,0 @@
|
||||
(ns status-im.react-native.js-dependencies)
|
||||
|
||||
(def action-button (fn [] #js {:default #js {:Item #js {}}}))
|
||||
(def config (fn [] #js {:default #js {}}))
|
||||
(def camera (fn [] #js {:default #js {:constants #js {}}}))
|
||||
(def dialogs (fn [] #js {}))
|
||||
(def dismiss-keyboard (fn [] #js {}))
|
||||
(def emoji-picker (fn [] #js {:default #js {}}))
|
||||
(def fs (fn [] #js {}))
|
||||
(def i18n #js {:locale "en"})
|
||||
(def react-native-languages #js {:language "en", :addEventListener (fn []), :removeEventListener (fn [])})
|
||||
(def image-crop-picker (fn [] #js {}))
|
||||
(def image-resizer (fn [] #js {}))
|
||||
(def qr-code (fn [] #js {}))
|
||||
(def react-native
|
||||
#js {:NativeModules #js {}
|
||||
:Animated #js {:View #js {}
|
||||
:FlatList #js {}
|
||||
:Text #js {}}
|
||||
:DeviceEventEmitter #js {:addListener (fn [])}
|
||||
:Dimensions #js {:get (fn [])}})
|
||||
(def vector-icons (fn [] #js {:default #js {}}))
|
||||
(def webview (fn [] #js {:WebView #js {}}))
|
||||
(def touchid (fn [] #js {}))
|
||||
(def svg (fn [] #js {:default #js {}}))
|
||||
(def status-keycard (fn [] #js {:default #js {}}))
|
||||
|
||||
(def snoopy (fn [] #js {:default #js {}}))
|
||||
(def snoopy-filter (fn [] #js {:default #js {}}))
|
||||
(def snoopy-bars (fn [] #js {:default #js {}}))
|
||||
(def snoopy-buffer (fn [] #js {:default #js {}}))
|
||||
|
||||
(def fetch (fn [_ _] #js {}))
|
||||
|
||||
(def background-timer (fn [] #js {:setTimeout js/setTimeout
|
||||
:setInterval js/setInterval
|
||||
:clearTimeout js/clearTimeout
|
||||
:clearInterval js/clearInterval}))
|
||||
|
||||
(def keychain (fn [] #js {:setGenericPassword (constantly (.resolve js/Promise true))}))
|
||||
(def react-navigation #js {:NavigationActions #js {}})
|
||||
(def react-native-mail (fn [] #js {:mail #js {}}))
|
||||
(def react-native-navigation-twopane #js {})
|
||||
@@ -1,33 +0,0 @@
|
||||
(ns status-im.react-native.resources)
|
||||
|
||||
(def ui
|
||||
{:lock "images/ui/lock.png"
|
||||
:tribute-to-talk "images/ui/tribute-to-talk.png"
|
||||
:hardwallet-card "images/ui/hardwallet-card.png"
|
||||
:secret-keys "images/ui/secret-keys.png"
|
||||
:keycard-lock "images/ui/keycard-lock.png"
|
||||
:keycard "images/ui/keycard.png"
|
||||
:keycard-logo "images/ui/keycard-logo.png"
|
||||
:keycard-logo-blue "images/ui/keycard-logo-blue.png"
|
||||
:keycard-logo-gray "images/ui/keycard-logo-gray.png"
|
||||
:keycard-key "images/ui/keycard-key.png"
|
||||
:keycard-empty "images/ui/keycard-empty.png"
|
||||
:keycard-phone "images/ui/keycard-phone.png"
|
||||
:keycard-connection "images/ui/keycard-connection.png"
|
||||
:keycard-wrong "images/ui/keycard-wrong.png"
|
||||
:not-keycard "images/ui/not-keycard.png"
|
||||
:status-logo "images/ui/status-logo.png"
|
||||
:hold-card-animation "images/ui/hold-card-animation.gif"
|
||||
:warning-sign "images/ui/warning-sign.png"
|
||||
:phone-nfc-on "images/ui/phone-nfc-on.png"
|
||||
:phone-nfc-off "images/ui/phone-nfc-off.png"
|
||||
:dapp-store "images/ui/dapp-store.png"
|
||||
:ens-header "images/ui/ens-header.png"})
|
||||
|
||||
(def loaded-images (atom {}))
|
||||
|
||||
(defn get-image [k]
|
||||
(if (contains? @loaded-images k)
|
||||
(get @loaded-images k)
|
||||
(get (swap! loaded-images assoc k
|
||||
(get ui k)) k)))
|
||||
@@ -1,328 +0,0 @@
|
||||
(ns status-im.ui.components.react
|
||||
(:require-macros [status-im.utils.views :as views])
|
||||
(:require [goog.object :as object]
|
||||
[reagent.core :as reagent]
|
||||
[status-im.ui.components.styles :as styles]
|
||||
[status-im.utils.utils :as utils]
|
||||
[status-im.i18n :as i18n]
|
||||
[status-im.ui.components.colors :as colors]
|
||||
[status-im.ui.components.typography :as typography]
|
||||
[status-im.utils.platform :as platform]
|
||||
[react-native-web :as rnw]))
|
||||
|
||||
(defn adapt-class [class]
|
||||
(when class
|
||||
(reagent/adapt-react-class class)))
|
||||
|
||||
(defn get-web-class [name]
|
||||
(fn []
|
||||
(adapt-class (goog.object/get rnw name))))
|
||||
|
||||
(defn get-class [name] (get-web-class name))
|
||||
|
||||
(def device-event-emitter nil)
|
||||
(defn dismiss-keyboard! [] ())
|
||||
(def splash-screen nil)
|
||||
|
||||
;; React Components
|
||||
|
||||
(def app-registry nil)
|
||||
(def app-state nil)
|
||||
(def net-info nil)
|
||||
(def view-class ((get-web-class "View")))
|
||||
|
||||
(defn view [& props]
|
||||
(into []
|
||||
(concat
|
||||
[view-class]
|
||||
(cond-> (into [] props)
|
||||
(and (map? (first props)) (not (contains? (first props) :style)))
|
||||
(assoc 0 {:style (first props)})))))
|
||||
|
||||
(def safe-area-view (get-web-class "SafeAreaView"))
|
||||
(def progress-bar (get-web-class "ProgressBarAndroid"))
|
||||
|
||||
(def status-bar-class (get-web-class "StatusBar"))
|
||||
|
||||
(def scroll-view-class (get-web-class "ScrollView"))
|
||||
(def keyboard-avoiding-view-class (get-web-class "KeyboardAvoidingView"))
|
||||
|
||||
(def text-class ((get-web-class "Text")))
|
||||
(def text-input-class (get-web-class "TextInput"))
|
||||
(def image-class (get-web-class "Image"))
|
||||
(def picker-obj nil)
|
||||
(def animated-flat-list-class #())
|
||||
(defn picker-class [] )
|
||||
(defn picker-item-class [] )
|
||||
|
||||
(defn valid-source? [source]
|
||||
(or (not (map? source))
|
||||
(not (contains? source :uri))
|
||||
(and (contains? source :uri)
|
||||
(:uri source))))
|
||||
|
||||
(defn image [{:keys [source] :as props}]
|
||||
(when (valid-source? source)
|
||||
(let [source (if (fn? source) (source) source)]
|
||||
[(image-class) (assoc props :source source)])))
|
||||
|
||||
(def switch-class (get-web-class "Switch"))
|
||||
|
||||
(defn switch [props]
|
||||
[(switch-class) props])
|
||||
|
||||
(def touchable-highlight ((get-web-class "TouchableOpacity")))
|
||||
(def touchable-opacity-class (get-web-class "TouchableOpacity"))
|
||||
(def activity-indicator-class (get-web-class "ActivityIndicator"))
|
||||
|
||||
(defn activity-indicator [props]
|
||||
[(activity-indicator-class) props])
|
||||
|
||||
(def modal nil)
|
||||
|
||||
(def pan-responder nil)
|
||||
(def animated (get-web-class "Animated"))
|
||||
|
||||
(defn animated-view-class []
|
||||
(reagent/adapt-react-class (.-View (animated))))
|
||||
|
||||
(defn animated-view [props & content]
|
||||
(vec (conj content props (animated-view-class))))
|
||||
|
||||
(def dimensions nil)
|
||||
(def keyboard nil)
|
||||
(def linking nil)
|
||||
|
||||
(def max-font-size-multiplier 1.25)
|
||||
|
||||
(defn prepare-text-props [props]
|
||||
(-> props
|
||||
(update :style typography/get-style)
|
||||
(update-in [:style :font-family] #(or % "Inter"))
|
||||
(assoc :max-font-size-multiplier max-font-size-multiplier)))
|
||||
|
||||
(defn prepare-nested-text-props [props]
|
||||
(-> props
|
||||
(update :style typography/get-nested-style)
|
||||
(assoc :parseBasicMarkdown true)
|
||||
(assoc :nested? true)))
|
||||
|
||||
;; Accessor methods for React Components
|
||||
(defn text
|
||||
"For nested text elements, use nested-text instead"
|
||||
([text-element]
|
||||
(text {} text-element))
|
||||
([options text-element]
|
||||
[text-class (prepare-text-props options) text-element]))
|
||||
|
||||
(defn nested-text
|
||||
"Returns nested text elements with proper styling and typography
|
||||
Do not use the nested? option, it is for internal usage of the function only"
|
||||
[options & nested-text-elements]
|
||||
(let [options-with-style (if (:nested? options)
|
||||
(prepare-nested-text-props options)
|
||||
(prepare-text-props options))]
|
||||
(reduce (fn [acc text-element]
|
||||
(conj acc
|
||||
(if (string? text-element)
|
||||
text-element
|
||||
(let [[options & nested-text-elements] text-element]
|
||||
(apply nested-text (prepare-nested-text-props options)
|
||||
nested-text-elements)))))
|
||||
[text-class (dissoc options-with-style :nested?)]
|
||||
nested-text-elements)))
|
||||
|
||||
(defn text-input
|
||||
[options text]
|
||||
[(text-input-class)
|
||||
(merge
|
||||
{:underline-color-android :transparent
|
||||
:max-font-size-multiplier max-font-size-multiplier
|
||||
:placeholder-text-color colors/text-gray
|
||||
:placeholder (i18n/label :t/type-a-message)
|
||||
:value text}
|
||||
(-> options
|
||||
(update :style typography/get-style)
|
||||
(update :style dissoc :line-height)))])
|
||||
|
||||
(defn i18n-text
|
||||
[{:keys [style key]}]
|
||||
[text {:style style} (i18n/label key)])
|
||||
|
||||
(defn icon
|
||||
([n] (icon n styles/icon-default))
|
||||
([n style]
|
||||
[image {:source {:uri (keyword (str "icon_" (name n)))}
|
||||
:resizeMode "contain"
|
||||
:style style}]))
|
||||
|
||||
(defn touchable-opacity [props content]
|
||||
[(touchable-opacity-class) props content])
|
||||
|
||||
#_(defn touchable-highlight [props content]
|
||||
[(touchable-highlight-class)
|
||||
(merge {:underlay-color :transparent} props)
|
||||
content])
|
||||
|
||||
(defn touchable-without-feedback [props content]
|
||||
nil)
|
||||
|
||||
(defn get-dimensions [name]
|
||||
(js->clj (.get (dimensions) name) :keywordize-keys true))
|
||||
|
||||
(defn list-item [component]
|
||||
(reagent/as-element component))
|
||||
|
||||
(defn value->picker-item [{:keys [value label]}]
|
||||
[(picker-item-class) {:value (or value "") :label (or label value "")}])
|
||||
|
||||
(defn picker [{:keys [style on-change selected enabled data]}]
|
||||
(into
|
||||
[(picker-class) (merge (when style {:style style})
|
||||
(when enabled {:enabled enabled})
|
||||
(when on-change {:on-value-change on-change})
|
||||
(when selected {:selected-value selected}))]
|
||||
(map value->picker-item data)))
|
||||
|
||||
;; Image picker
|
||||
|
||||
(def image-picker-class nil)
|
||||
|
||||
(defn show-access-error [o]
|
||||
(when (= "E_PERMISSION_MISSING" (object/get o "code"))
|
||||
(utils/show-popup (i18n/label :t/error)
|
||||
(i18n/label :t/photos-access-error))))
|
||||
|
||||
(defn show-image-picker
|
||||
([images-fn]
|
||||
(show-image-picker images-fn nil))
|
||||
([images-fn media-type]
|
||||
(let [image-picker (.-default (image-picker-class))]
|
||||
(-> image-picker
|
||||
(.openPicker (clj->js {:multiple false :mediaType (or media-type "any")}))
|
||||
(.then images-fn)
|
||||
(.catch show-access-error)))))
|
||||
|
||||
;; Clipboard
|
||||
|
||||
(def sharing
|
||||
nil)
|
||||
|
||||
(defn copy-to-clipboard [text]
|
||||
nil)
|
||||
|
||||
(defn get-from-clipboard [clbk]
|
||||
nil)
|
||||
|
||||
;; HTTP Bridge
|
||||
|
||||
(def http-bridge nil)
|
||||
|
||||
;; KeyboardAvoidingView
|
||||
|
||||
(defn keyboard-avoiding-view [props & children]
|
||||
(let [view-element (if platform/ios?
|
||||
[(keyboard-avoiding-view-class) (merge {:behavior :padding} props)]
|
||||
[view props])]
|
||||
(vec (concat view-element children))))
|
||||
|
||||
(defn scroll-view [props & children]
|
||||
(vec (conj children props (scroll-view-class))))
|
||||
|
||||
(views/defview with-activity-indicator
|
||||
[{:keys [timeout style enabled? preview]} comp]
|
||||
(views/letsubs
|
||||
[loading (reagent/atom true)]
|
||||
{:component-did-mount (fn []
|
||||
(if (or (nil? timeout)
|
||||
(> 100 timeout))
|
||||
(reset! loading false)
|
||||
(utils/set-timeout #(reset! loading false)
|
||||
timeout)))}
|
||||
(if (and (not enabled?) @loading)
|
||||
(or preview
|
||||
[view {:style (or style {:justify-content :center
|
||||
:align-items :center})}
|
||||
[activity-indicator {:animating true}]])
|
||||
comp)))
|
||||
|
||||
(defn navigation-wrapper
|
||||
"Wraps component so that it will be shown only when current-screen is one of views"
|
||||
[{:keys [component views current-view hide?]
|
||||
:or {hide? false}}]
|
||||
(let [current-view? (if (set? views)
|
||||
(views current-view)
|
||||
(= views current-view))
|
||||
|
||||
style (if current-view?
|
||||
{:flex 1
|
||||
:zIndex 0}
|
||||
{:opacity 0
|
||||
:flex 0
|
||||
:zIndex -1})
|
||||
|
||||
component' (if (fn? component) [component] component)]
|
||||
|
||||
(when (or (not hide?) (and hide? current-view?))
|
||||
(if hide?
|
||||
component'
|
||||
[view style (if (fn? component) [component] component)]))))
|
||||
|
||||
(defn with-empty-preview [comp]
|
||||
[with-activity-indicator
|
||||
{:preview [view {}]}
|
||||
comp])
|
||||
|
||||
;; Platform-specific View
|
||||
|
||||
(defmulti create-main-screen-view #(cond
|
||||
platform/iphone-x? :iphone-x
|
||||
platform/ios? :ios
|
||||
platform/android? :android))
|
||||
|
||||
(defmethod create-main-screen-view :iphone-x [current-view]
|
||||
(fn [props & children]
|
||||
(let [props (merge props
|
||||
{:background-color
|
||||
(case current-view
|
||||
(:wallet-send-transaction
|
||||
:wallet-request-transaction
|
||||
:wallet-send-assets
|
||||
:wallet-request-assets
|
||||
:choose-recipient
|
||||
:recent-recipients
|
||||
:select-account
|
||||
:wallet-send-transaction-request
|
||||
:contact-code
|
||||
:wallet-settings-hook)
|
||||
colors/blue
|
||||
|
||||
(:qr-viewer
|
||||
:recipient-qr-code)
|
||||
"#2f3031"
|
||||
|
||||
colors/white)})
|
||||
bottom-background (when (#{:recent-recipients
|
||||
:select-account
|
||||
:wallet-send-assets
|
||||
:wallet-request-assets} current-view)
|
||||
[view {:background-color colors/white
|
||||
:position :absolute
|
||||
:bottom 0
|
||||
:right 0
|
||||
:left 0
|
||||
:height 100
|
||||
:z-index -1000}])
|
||||
children (conj children bottom-background)]
|
||||
(apply vector (safe-area-view) props children))))
|
||||
|
||||
(defmethod create-main-screen-view :default [_]
|
||||
view)
|
||||
|
||||
(views/defview main-screen-modal-view [current-view & components]
|
||||
(views/letsubs []
|
||||
(let [main-screen-view (create-main-screen-view current-view)]
|
||||
[main-screen-view styles/flex
|
||||
[keyboard-avoiding-view
|
||||
{:flex 1 :flex-direction :column}
|
||||
(apply vector view styles/flex components)]])))
|
||||
@@ -1,6 +0,0 @@
|
||||
module.exports = {
|
||||
entry: './src/js/index.js',
|
||||
output: {
|
||||
filename: 'index_bundle.js'
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,9 @@
|
||||
//
|
||||
// Bridge.swift
|
||||
// StatusIm
|
||||
//
|
||||
// Created by Andrea Franz on 02/12/2020.
|
||||
// Copyright © 2020 Status. All rights reserved.
|
||||
//
|
||||
|
||||
import Foundation
|
||||
+15
-76
@@ -1,83 +1,17 @@
|
||||
platform :ios, '9.0'
|
||||
platform :ios, '10.0'
|
||||
|
||||
require_relative '../node_modules/react-native/scripts/react_native_pods'
|
||||
require_relative '../node_modules/@react-native-community/cli-platform-ios/native_modules'
|
||||
|
||||
def add_flipper_pods!(versions = {})
|
||||
versions['Flipper'] ||= '~> 0.37.0'
|
||||
versions['DoubleConversion'] ||= '1.1.7'
|
||||
versions['Flipper-Folly'] ||= '~> 2.1'
|
||||
versions['Flipper-Glog'] ||= '0.3.6'
|
||||
versions['Flipper-PeerTalk'] ||= '~> 0.0.4'
|
||||
versions['Flipper-RSocket'] ||= '~> 1.0'
|
||||
|
||||
pod 'FlipperKit', versions['Flipper'], :configuration => 'Debug'
|
||||
pod 'FlipperKit/FlipperKitLayoutPlugin', versions['Flipper'], :configuration => 'Debug'
|
||||
pod 'FlipperKit/SKIOSNetworkPlugin', versions['Flipper'], :configuration => 'Debug'
|
||||
pod 'FlipperKit/FlipperKitUserDefaultsPlugin', versions['Flipper'], :configuration => 'Debug'
|
||||
pod 'FlipperKit/FlipperKitReactPlugin', versions['Flipper'], :configuration => 'Debug'
|
||||
|
||||
# List all transitive dependencies for FlipperKit pods
|
||||
# to avoid them being linked in Release builds
|
||||
pod 'Flipper', versions['Flipper'], :configuration => 'Debug'
|
||||
pod 'Flipper-DoubleConversion', versions['DoubleConversion'], :configuration => 'Debug'
|
||||
pod 'Flipper-Folly', versions['Flipper-Folly'], :configuration => 'Debug'
|
||||
pod 'Flipper-Glog', versions['Flipper-Glog'], :configuration => 'Debug'
|
||||
pod 'Flipper-PeerTalk', versions['Flipper-PeerTalk'], :configuration => 'Debug'
|
||||
pod 'Flipper-RSocket', versions['Flipper-RSocket'], :configuration => 'Debug'
|
||||
pod 'FlipperKit/Core', versions['Flipper'], :configuration => 'Debug'
|
||||
pod 'FlipperKit/CppBridge', versions['Flipper'], :configuration => 'Debug'
|
||||
pod 'FlipperKit/FBCxxFollyDynamicConvert', versions['Flipper'], :configuration => 'Debug'
|
||||
pod 'FlipperKit/FBDefines', versions['Flipper'], :configuration => 'Debug'
|
||||
pod 'FlipperKit/FKPortForwarding', versions['Flipper'], :configuration => 'Debug'
|
||||
pod 'FlipperKit/FlipperKitHighlightOverlay', versions['Flipper'], :configuration => 'Debug'
|
||||
pod 'FlipperKit/FlipperKitLayoutTextSearchable', versions['Flipper'], :configuration => 'Debug'
|
||||
pod 'FlipperKit/FlipperKitNetworkPlugin', versions['Flipper'], :configuration => 'Debug'
|
||||
end
|
||||
|
||||
# Post Install processing for Flipper
|
||||
def flipper_post_install(installer)
|
||||
installer.pods_project.targets.each do |target|
|
||||
if target.name == 'YogaKit'
|
||||
target.build_configurations.each do |config|
|
||||
config.build_settings['SWIFT_VERSION'] = '4.1'
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
abstract_target 'Status' do
|
||||
# Pods for StatusQuo
|
||||
pod 'FBLazyVector', :path => "../node_modules/react-native/Libraries/FBLazyVector"
|
||||
pod 'FBReactNativeSpec', :path => "../node_modules/react-native/Libraries/FBReactNativeSpec"
|
||||
pod 'RCTRequired', :path => "../node_modules/react-native/Libraries/RCTRequired"
|
||||
pod 'RCTTypeSafety', :path => "../node_modules/react-native/Libraries/TypeSafety"
|
||||
pod 'React', :path => '../node_modules/react-native/'
|
||||
pod 'React-Core', :path => '../node_modules/react-native/'
|
||||
pod 'React-CoreModules', :path => '../node_modules/react-native/React/CoreModules'
|
||||
pod 'React-Core/DevSupport', :path => '../node_modules/react-native/'
|
||||
pod 'React-RCTActionSheet', :path => '../node_modules/react-native/Libraries/ActionSheetIOS'
|
||||
pod 'React-RCTAnimation', :path => '../node_modules/react-native/Libraries/NativeAnimation'
|
||||
pod 'React-RCTBlob', :path => '../node_modules/react-native/Libraries/Blob'
|
||||
pod 'React-RCTImage', :path => '../node_modules/react-native/Libraries/Image'
|
||||
pod 'React-RCTLinking', :path => '../node_modules/react-native/Libraries/LinkingIOS'
|
||||
pod 'React-RCTNetwork', :path => '../node_modules/react-native/Libraries/Network'
|
||||
pod 'React-RCTSettings', :path => '../node_modules/react-native/Libraries/Settings'
|
||||
pod 'React-RCTText', :path => '../node_modules/react-native/Libraries/Text'
|
||||
pod 'React-RCTVibration', :path => '../node_modules/react-native/Libraries/Vibration'
|
||||
pod 'React-Core/RCTWebSocket', :path => '../node_modules/react-native/'
|
||||
config = use_native_modules!
|
||||
|
||||
pod 'React-cxxreact', :path => '../node_modules/react-native/ReactCommon/cxxreact'
|
||||
pod 'React-jsi', :path => '../node_modules/react-native/ReactCommon/jsi'
|
||||
pod 'React-jsiexecutor', :path => '../node_modules/react-native/ReactCommon/jsiexecutor'
|
||||
pod 'React-jsinspector', :path => '../node_modules/react-native/ReactCommon/jsinspector'
|
||||
pod 'ReactCommon/callinvoker', :path => "../node_modules/react-native/ReactCommon"
|
||||
pod 'ReactCommon/turbomodule/core', :path => "../node_modules/react-native/ReactCommon"
|
||||
pod 'Yoga', :path => '../node_modules/react-native/ReactCommon/yoga', :modular_headers => true
|
||||
|
||||
pod 'DoubleConversion', :podspec => '../node_modules/react-native/third-party-podspecs/DoubleConversion.podspec'
|
||||
pod 'glog', :podspec => '../node_modules/react-native/third-party-podspecs/glog.podspec'
|
||||
pod 'Folly', :podspec => '../node_modules/react-native/third-party-podspecs/Folly.podspec'
|
||||
use_react_native!(:path => config["reactNativePath"])
|
||||
|
||||
pod 'react-native-image-resizer', :path => '../node_modules/react-native-image-resizer'
|
||||
pod 'react-native-config', :path => '../node_modules/react-native-config'
|
||||
|
||||
pod 'SQLCipher', '~>3.0'
|
||||
pod 'SSZipArchive'
|
||||
|
||||
@@ -85,17 +19,21 @@ abstract_target 'Status' do
|
||||
pod 'Permission-Microphone', :path => "#{permissions_path}/Microphone.podspec"
|
||||
pod 'Permission-Camera', :path => "#{permissions_path}/Camera.podspec"
|
||||
|
||||
pod "react-native-status-keycard", path: "../node_modules/react-native-status-keycard"
|
||||
pod "Keycard", git: "https://github.com/status-im/Keycard.swift.git"
|
||||
pod 'secp256k1', git: "https://github.com/status-im/secp256k1.swift.git", submodules: true
|
||||
|
||||
target 'StatusIm' do
|
||||
target 'StatusImTests' do
|
||||
inherit! :complete
|
||||
# Pods for testing
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
target 'StatusImPR' do
|
||||
end
|
||||
|
||||
add_flipper_pods!
|
||||
|
||||
use_flipper!
|
||||
post_install do |installer|
|
||||
flipper_post_install(installer)
|
||||
end
|
||||
@@ -103,3 +41,4 @@ abstract_target 'Status' do
|
||||
|
||||
use_native_modules!
|
||||
end
|
||||
|
||||
|
||||
+341
-264
@@ -1,248 +1,270 @@
|
||||
PODS:
|
||||
- boost-for-react-native (1.63.0)
|
||||
- CocoaAsyncSocket (7.6.4)
|
||||
- BVLinearGradient (2.5.6):
|
||||
- React
|
||||
- CocoaAsyncSocket (7.6.5)
|
||||
- CocoaLibEvent (1.0.0)
|
||||
- CryptoSwift (1.3.8)
|
||||
- DoubleConversion (1.1.6)
|
||||
- FBLazyVector (0.62.2)
|
||||
- FBReactNativeSpec (0.62.2):
|
||||
- Folly (= 2018.10.22.00)
|
||||
- RCTRequired (= 0.62.2)
|
||||
- RCTTypeSafety (= 0.62.2)
|
||||
- React-Core (= 0.62.2)
|
||||
- React-jsi (= 0.62.2)
|
||||
- ReactCommon/turbomodule/core (= 0.62.2)
|
||||
- Flipper (0.37.0):
|
||||
- FBLazyVector (0.63.4)
|
||||
- FBReactNativeSpec (0.63.4):
|
||||
- Folly (= 2020.01.13.00)
|
||||
- RCTRequired (= 0.63.4)
|
||||
- RCTTypeSafety (= 0.63.4)
|
||||
- React-Core (= 0.63.4)
|
||||
- React-jsi (= 0.63.4)
|
||||
- ReactCommon/turbomodule/core (= 0.63.4)
|
||||
- Flipper (0.54.0):
|
||||
- Flipper-Folly (~> 2.2)
|
||||
- Flipper-RSocket (~> 1.1)
|
||||
- Flipper-DoubleConversion (1.1.7)
|
||||
- Flipper-Folly (2.2.0):
|
||||
- Flipper-Folly (2.3.0):
|
||||
- boost-for-react-native
|
||||
- CocoaLibEvent (~> 1.0)
|
||||
- Flipper-DoubleConversion
|
||||
- Flipper-Glog
|
||||
- OpenSSL-Universal (= 1.0.2.19)
|
||||
- OpenSSL-Universal (= 1.0.2.20)
|
||||
- Flipper-Glog (0.3.6)
|
||||
- Flipper-PeerTalk (0.0.4)
|
||||
- Flipper-RSocket (1.1.0):
|
||||
- Flipper-Folly (~> 2.2)
|
||||
- FlipperKit (0.37.0):
|
||||
- FlipperKit/Core (= 0.37.0)
|
||||
- FlipperKit/Core (0.37.0):
|
||||
- Flipper (~> 0.37.0)
|
||||
- FlipperKit (0.54.0):
|
||||
- FlipperKit/Core (= 0.54.0)
|
||||
- FlipperKit/Core (0.54.0):
|
||||
- Flipper (~> 0.54.0)
|
||||
- FlipperKit/CppBridge
|
||||
- FlipperKit/FBCxxFollyDynamicConvert
|
||||
- FlipperKit/FBDefines
|
||||
- FlipperKit/FKPortForwarding
|
||||
- FlipperKit/CppBridge (0.37.0):
|
||||
- Flipper (~> 0.37.0)
|
||||
- FlipperKit/FBCxxFollyDynamicConvert (0.37.0):
|
||||
- FlipperKit/CppBridge (0.54.0):
|
||||
- Flipper (~> 0.54.0)
|
||||
- FlipperKit/FBCxxFollyDynamicConvert (0.54.0):
|
||||
- Flipper-Folly (~> 2.2)
|
||||
- FlipperKit/FBDefines (0.37.0)
|
||||
- FlipperKit/FKPortForwarding (0.37.0):
|
||||
- FlipperKit/FBDefines (0.54.0)
|
||||
- FlipperKit/FKPortForwarding (0.54.0):
|
||||
- CocoaAsyncSocket (~> 7.6)
|
||||
- Flipper-PeerTalk (~> 0.0.4)
|
||||
- FlipperKit/FlipperKitHighlightOverlay (0.37.0)
|
||||
- FlipperKit/FlipperKitLayoutPlugin (0.37.0):
|
||||
- FlipperKit/FlipperKitHighlightOverlay (0.54.0)
|
||||
- FlipperKit/FlipperKitLayoutPlugin (0.54.0):
|
||||
- FlipperKit/Core
|
||||
- FlipperKit/FlipperKitHighlightOverlay
|
||||
- FlipperKit/FlipperKitLayoutTextSearchable
|
||||
- YogaKit (~> 1.18)
|
||||
- FlipperKit/FlipperKitLayoutTextSearchable (0.37.0)
|
||||
- FlipperKit/FlipperKitNetworkPlugin (0.37.0):
|
||||
- FlipperKit/FlipperKitLayoutTextSearchable (0.54.0)
|
||||
- FlipperKit/FlipperKitNetworkPlugin (0.54.0):
|
||||
- FlipperKit/Core
|
||||
- FlipperKit/FlipperKitReactPlugin (0.37.0):
|
||||
- FlipperKit/FlipperKitReactPlugin (0.54.0):
|
||||
- FlipperKit/Core
|
||||
- FlipperKit/FlipperKitUserDefaultsPlugin (0.37.0):
|
||||
- FlipperKit/FlipperKitUserDefaultsPlugin (0.54.0):
|
||||
- FlipperKit/Core
|
||||
- FlipperKit/SKIOSNetworkPlugin (0.37.0):
|
||||
- FlipperKit/SKIOSNetworkPlugin (0.54.0):
|
||||
- FlipperKit/Core
|
||||
- FlipperKit/FlipperKitNetworkPlugin
|
||||
- Folly (2018.10.22.00):
|
||||
- Folly (2020.01.13.00):
|
||||
- boost-for-react-native
|
||||
- DoubleConversion
|
||||
- Folly/Default (= 2018.10.22.00)
|
||||
- Folly/Default (= 2020.01.13.00)
|
||||
- glog
|
||||
- Folly/Default (2018.10.22.00):
|
||||
- Folly/Default (2020.01.13.00):
|
||||
- boost-for-react-native
|
||||
- DoubleConversion
|
||||
- glog
|
||||
- glog (0.3.5)
|
||||
- OpenSSL-Universal (1.0.2.19):
|
||||
- OpenSSL-Universal/Static (= 1.0.2.19)
|
||||
- OpenSSL-Universal/Static (1.0.2.19)
|
||||
- Keycard (3.0.4):
|
||||
- CryptoSwift
|
||||
- secp256k1
|
||||
- libwebp (1.1.0):
|
||||
- libwebp/demux (= 1.1.0)
|
||||
- libwebp/mux (= 1.1.0)
|
||||
- libwebp/webp (= 1.1.0)
|
||||
- libwebp/demux (1.1.0):
|
||||
- libwebp/webp
|
||||
- libwebp/mux (1.1.0):
|
||||
- libwebp/demux
|
||||
- libwebp/webp (1.1.0)
|
||||
- OpenSSL-Universal (1.0.2.20):
|
||||
- OpenSSL-Universal/Static (= 1.0.2.20)
|
||||
- OpenSSL-Universal/Static (1.0.2.20)
|
||||
- Permission-Camera (2.1.5):
|
||||
- RNPermissions
|
||||
- Permission-Microphone (2.1.5):
|
||||
- RNPermissions
|
||||
- RCTRequired (0.62.2)
|
||||
- RCTTypeSafety (0.62.2):
|
||||
- FBLazyVector (= 0.62.2)
|
||||
- Folly (= 2018.10.22.00)
|
||||
- RCTRequired (= 0.62.2)
|
||||
- React-Core (= 0.62.2)
|
||||
- React (0.62.2):
|
||||
- React-Core (= 0.62.2)
|
||||
- React-Core/DevSupport (= 0.62.2)
|
||||
- React-Core/RCTWebSocket (= 0.62.2)
|
||||
- React-RCTActionSheet (= 0.62.2)
|
||||
- React-RCTAnimation (= 0.62.2)
|
||||
- React-RCTBlob (= 0.62.2)
|
||||
- React-RCTImage (= 0.62.2)
|
||||
- React-RCTLinking (= 0.62.2)
|
||||
- React-RCTNetwork (= 0.62.2)
|
||||
- React-RCTSettings (= 0.62.2)
|
||||
- React-RCTText (= 0.62.2)
|
||||
- React-RCTVibration (= 0.62.2)
|
||||
- React-Core (0.62.2):
|
||||
- Folly (= 2018.10.22.00)
|
||||
- RCTRequired (0.63.4)
|
||||
- RCTTypeSafety (0.63.4):
|
||||
- FBLazyVector (= 0.63.4)
|
||||
- Folly (= 2020.01.13.00)
|
||||
- RCTRequired (= 0.63.4)
|
||||
- React-Core (= 0.63.4)
|
||||
- React (0.63.4):
|
||||
- React-Core (= 0.63.4)
|
||||
- React-Core/DevSupport (= 0.63.4)
|
||||
- React-Core/RCTWebSocket (= 0.63.4)
|
||||
- React-RCTActionSheet (= 0.63.4)
|
||||
- React-RCTAnimation (= 0.63.4)
|
||||
- React-RCTBlob (= 0.63.4)
|
||||
- React-RCTImage (= 0.63.4)
|
||||
- React-RCTLinking (= 0.63.4)
|
||||
- React-RCTNetwork (= 0.63.4)
|
||||
- React-RCTSettings (= 0.63.4)
|
||||
- React-RCTText (= 0.63.4)
|
||||
- React-RCTVibration (= 0.63.4)
|
||||
- React-callinvoker (0.63.4)
|
||||
- React-Core (0.63.4):
|
||||
- Folly (= 2020.01.13.00)
|
||||
- glog
|
||||
- React-Core/Default (= 0.62.2)
|
||||
- React-cxxreact (= 0.62.2)
|
||||
- React-jsi (= 0.62.2)
|
||||
- React-jsiexecutor (= 0.62.2)
|
||||
- React-Core/Default (= 0.63.4)
|
||||
- React-cxxreact (= 0.63.4)
|
||||
- React-jsi (= 0.63.4)
|
||||
- React-jsiexecutor (= 0.63.4)
|
||||
- Yoga
|
||||
- React-Core/CoreModulesHeaders (0.62.2):
|
||||
- Folly (= 2018.10.22.00)
|
||||
- React-Core/CoreModulesHeaders (0.63.4):
|
||||
- Folly (= 2020.01.13.00)
|
||||
- glog
|
||||
- React-Core/Default
|
||||
- React-cxxreact (= 0.62.2)
|
||||
- React-jsi (= 0.62.2)
|
||||
- React-jsiexecutor (= 0.62.2)
|
||||
- React-cxxreact (= 0.63.4)
|
||||
- React-jsi (= 0.63.4)
|
||||
- React-jsiexecutor (= 0.63.4)
|
||||
- Yoga
|
||||
- React-Core/Default (0.62.2):
|
||||
- Folly (= 2018.10.22.00)
|
||||
- React-Core/Default (0.63.4):
|
||||
- Folly (= 2020.01.13.00)
|
||||
- glog
|
||||
- React-cxxreact (= 0.62.2)
|
||||
- React-jsi (= 0.62.2)
|
||||
- React-jsiexecutor (= 0.62.2)
|
||||
- React-cxxreact (= 0.63.4)
|
||||
- React-jsi (= 0.63.4)
|
||||
- React-jsiexecutor (= 0.63.4)
|
||||
- Yoga
|
||||
- React-Core/DevSupport (0.62.2):
|
||||
- Folly (= 2018.10.22.00)
|
||||
- React-Core/DevSupport (0.63.4):
|
||||
- Folly (= 2020.01.13.00)
|
||||
- glog
|
||||
- React-Core/Default (= 0.62.2)
|
||||
- React-Core/RCTWebSocket (= 0.62.2)
|
||||
- React-cxxreact (= 0.62.2)
|
||||
- React-jsi (= 0.62.2)
|
||||
- React-jsiexecutor (= 0.62.2)
|
||||
- React-jsinspector (= 0.62.2)
|
||||
- React-Core/Default (= 0.63.4)
|
||||
- React-Core/RCTWebSocket (= 0.63.4)
|
||||
- React-cxxreact (= 0.63.4)
|
||||
- React-jsi (= 0.63.4)
|
||||
- React-jsiexecutor (= 0.63.4)
|
||||
- React-jsinspector (= 0.63.4)
|
||||
- Yoga
|
||||
- React-Core/RCTActionSheetHeaders (0.62.2):
|
||||
- Folly (= 2018.10.22.00)
|
||||
- React-Core/RCTActionSheetHeaders (0.63.4):
|
||||
- Folly (= 2020.01.13.00)
|
||||
- glog
|
||||
- React-Core/Default
|
||||
- React-cxxreact (= 0.62.2)
|
||||
- React-jsi (= 0.62.2)
|
||||
- React-jsiexecutor (= 0.62.2)
|
||||
- React-cxxreact (= 0.63.4)
|
||||
- React-jsi (= 0.63.4)
|
||||
- React-jsiexecutor (= 0.63.4)
|
||||
- Yoga
|
||||
- React-Core/RCTAnimationHeaders (0.62.2):
|
||||
- Folly (= 2018.10.22.00)
|
||||
- React-Core/RCTAnimationHeaders (0.63.4):
|
||||
- Folly (= 2020.01.13.00)
|
||||
- glog
|
||||
- React-Core/Default
|
||||
- React-cxxreact (= 0.62.2)
|
||||
- React-jsi (= 0.62.2)
|
||||
- React-jsiexecutor (= 0.62.2)
|
||||
- React-cxxreact (= 0.63.4)
|
||||
- React-jsi (= 0.63.4)
|
||||
- React-jsiexecutor (= 0.63.4)
|
||||
- Yoga
|
||||
- React-Core/RCTBlobHeaders (0.62.2):
|
||||
- Folly (= 2018.10.22.00)
|
||||
- React-Core/RCTBlobHeaders (0.63.4):
|
||||
- Folly (= 2020.01.13.00)
|
||||
- glog
|
||||
- React-Core/Default
|
||||
- React-cxxreact (= 0.62.2)
|
||||
- React-jsi (= 0.62.2)
|
||||
- React-jsiexecutor (= 0.62.2)
|
||||
- React-cxxreact (= 0.63.4)
|
||||
- React-jsi (= 0.63.4)
|
||||
- React-jsiexecutor (= 0.63.4)
|
||||
- Yoga
|
||||
- React-Core/RCTImageHeaders (0.62.2):
|
||||
- Folly (= 2018.10.22.00)
|
||||
- React-Core/RCTImageHeaders (0.63.4):
|
||||
- Folly (= 2020.01.13.00)
|
||||
- glog
|
||||
- React-Core/Default
|
||||
- React-cxxreact (= 0.62.2)
|
||||
- React-jsi (= 0.62.2)
|
||||
- React-jsiexecutor (= 0.62.2)
|
||||
- React-cxxreact (= 0.63.4)
|
||||
- React-jsi (= 0.63.4)
|
||||
- React-jsiexecutor (= 0.63.4)
|
||||
- Yoga
|
||||
- React-Core/RCTLinkingHeaders (0.62.2):
|
||||
- Folly (= 2018.10.22.00)
|
||||
- React-Core/RCTLinkingHeaders (0.63.4):
|
||||
- Folly (= 2020.01.13.00)
|
||||
- glog
|
||||
- React-Core/Default
|
||||
- React-cxxreact (= 0.62.2)
|
||||
- React-jsi (= 0.62.2)
|
||||
- React-jsiexecutor (= 0.62.2)
|
||||
- React-cxxreact (= 0.63.4)
|
||||
- React-jsi (= 0.63.4)
|
||||
- React-jsiexecutor (= 0.63.4)
|
||||
- Yoga
|
||||
- React-Core/RCTNetworkHeaders (0.62.2):
|
||||
- Folly (= 2018.10.22.00)
|
||||
- React-Core/RCTNetworkHeaders (0.63.4):
|
||||
- Folly (= 2020.01.13.00)
|
||||
- glog
|
||||
- React-Core/Default
|
||||
- React-cxxreact (= 0.62.2)
|
||||
- React-jsi (= 0.62.2)
|
||||
- React-jsiexecutor (= 0.62.2)
|
||||
- React-cxxreact (= 0.63.4)
|
||||
- React-jsi (= 0.63.4)
|
||||
- React-jsiexecutor (= 0.63.4)
|
||||
- Yoga
|
||||
- React-Core/RCTSettingsHeaders (0.62.2):
|
||||
- Folly (= 2018.10.22.00)
|
||||
- React-Core/RCTSettingsHeaders (0.63.4):
|
||||
- Folly (= 2020.01.13.00)
|
||||
- glog
|
||||
- React-Core/Default
|
||||
- React-cxxreact (= 0.62.2)
|
||||
- React-jsi (= 0.62.2)
|
||||
- React-jsiexecutor (= 0.62.2)
|
||||
- React-cxxreact (= 0.63.4)
|
||||
- React-jsi (= 0.63.4)
|
||||
- React-jsiexecutor (= 0.63.4)
|
||||
- Yoga
|
||||
- React-Core/RCTTextHeaders (0.62.2):
|
||||
- Folly (= 2018.10.22.00)
|
||||
- React-Core/RCTTextHeaders (0.63.4):
|
||||
- Folly (= 2020.01.13.00)
|
||||
- glog
|
||||
- React-Core/Default
|
||||
- React-cxxreact (= 0.62.2)
|
||||
- React-jsi (= 0.62.2)
|
||||
- React-jsiexecutor (= 0.62.2)
|
||||
- React-cxxreact (= 0.63.4)
|
||||
- React-jsi (= 0.63.4)
|
||||
- React-jsiexecutor (= 0.63.4)
|
||||
- Yoga
|
||||
- React-Core/RCTVibrationHeaders (0.62.2):
|
||||
- Folly (= 2018.10.22.00)
|
||||
- React-Core/RCTVibrationHeaders (0.63.4):
|
||||
- Folly (= 2020.01.13.00)
|
||||
- glog
|
||||
- React-Core/Default
|
||||
- React-cxxreact (= 0.62.2)
|
||||
- React-jsi (= 0.62.2)
|
||||
- React-jsiexecutor (= 0.62.2)
|
||||
- React-cxxreact (= 0.63.4)
|
||||
- React-jsi (= 0.63.4)
|
||||
- React-jsiexecutor (= 0.63.4)
|
||||
- Yoga
|
||||
- React-Core/RCTWebSocket (0.62.2):
|
||||
- Folly (= 2018.10.22.00)
|
||||
- React-Core/RCTWebSocket (0.63.4):
|
||||
- Folly (= 2020.01.13.00)
|
||||
- glog
|
||||
- React-Core/Default (= 0.62.2)
|
||||
- React-cxxreact (= 0.62.2)
|
||||
- React-jsi (= 0.62.2)
|
||||
- React-jsiexecutor (= 0.62.2)
|
||||
- React-Core/Default (= 0.63.4)
|
||||
- React-cxxreact (= 0.63.4)
|
||||
- React-jsi (= 0.63.4)
|
||||
- React-jsiexecutor (= 0.63.4)
|
||||
- Yoga
|
||||
- React-CoreModules (0.62.2):
|
||||
- FBReactNativeSpec (= 0.62.2)
|
||||
- Folly (= 2018.10.22.00)
|
||||
- RCTTypeSafety (= 0.62.2)
|
||||
- React-Core/CoreModulesHeaders (= 0.62.2)
|
||||
- React-RCTImage (= 0.62.2)
|
||||
- ReactCommon/turbomodule/core (= 0.62.2)
|
||||
- React-cxxreact (0.62.2):
|
||||
- React-CoreModules (0.63.4):
|
||||
- FBReactNativeSpec (= 0.63.4)
|
||||
- Folly (= 2020.01.13.00)
|
||||
- RCTTypeSafety (= 0.63.4)
|
||||
- React-Core/CoreModulesHeaders (= 0.63.4)
|
||||
- React-jsi (= 0.63.4)
|
||||
- React-RCTImage (= 0.63.4)
|
||||
- ReactCommon/turbomodule/core (= 0.63.4)
|
||||
- React-cxxreact (0.63.4):
|
||||
- boost-for-react-native (= 1.63.0)
|
||||
- DoubleConversion
|
||||
- Folly (= 2018.10.22.00)
|
||||
- Folly (= 2020.01.13.00)
|
||||
- glog
|
||||
- React-jsinspector (= 0.62.2)
|
||||
- React-jsi (0.62.2):
|
||||
- React-callinvoker (= 0.63.4)
|
||||
- React-jsinspector (= 0.63.4)
|
||||
- React-jsi (0.63.4):
|
||||
- boost-for-react-native (= 1.63.0)
|
||||
- DoubleConversion
|
||||
- Folly (= 2018.10.22.00)
|
||||
- Folly (= 2020.01.13.00)
|
||||
- glog
|
||||
- React-jsi/Default (= 0.62.2)
|
||||
- React-jsi/Default (0.62.2):
|
||||
- React-jsi/Default (= 0.63.4)
|
||||
- React-jsi/Default (0.63.4):
|
||||
- boost-for-react-native (= 1.63.0)
|
||||
- DoubleConversion
|
||||
- Folly (= 2018.10.22.00)
|
||||
- Folly (= 2020.01.13.00)
|
||||
- glog
|
||||
- React-jsiexecutor (0.62.2):
|
||||
- React-jsiexecutor (0.63.4):
|
||||
- DoubleConversion
|
||||
- Folly (= 2018.10.22.00)
|
||||
- Folly (= 2020.01.13.00)
|
||||
- glog
|
||||
- React-cxxreact (= 0.62.2)
|
||||
- React-jsi (= 0.62.2)
|
||||
- React-jsinspector (0.62.2)
|
||||
- React-cxxreact (= 0.63.4)
|
||||
- React-jsi (= 0.63.4)
|
||||
- React-jsinspector (0.63.4)
|
||||
- react-native-background-timer (2.2.0):
|
||||
- React
|
||||
- react-native-camera-kit (8.0.4):
|
||||
- React
|
||||
- react-native-cameraroll (1.6.2):
|
||||
- React
|
||||
- react-native-config (1.4.2):
|
||||
- react-native-config/App (= 1.4.2)
|
||||
- react-native-config/App (1.4.2):
|
||||
- React-Core
|
||||
- react-native-image-resizer (1.2.3):
|
||||
- React
|
||||
- react-native-mail (4.0.0):
|
||||
@@ -257,67 +279,71 @@ PODS:
|
||||
- React
|
||||
- react-native-splash-screen (3.2.0):
|
||||
- React
|
||||
- react-native-webview (10.3.1):
|
||||
- react-native-status-keycard (2.5.30):
|
||||
- Keycard
|
||||
- React
|
||||
- React-RCTActionSheet (0.62.2):
|
||||
- React-Core/RCTActionSheetHeaders (= 0.62.2)
|
||||
- React-RCTAnimation (0.62.2):
|
||||
- FBReactNativeSpec (= 0.62.2)
|
||||
- Folly (= 2018.10.22.00)
|
||||
- RCTTypeSafety (= 0.62.2)
|
||||
- React-Core/RCTAnimationHeaders (= 0.62.2)
|
||||
- ReactCommon/turbomodule/core (= 0.62.2)
|
||||
- React-RCTBlob (0.62.2):
|
||||
- FBReactNativeSpec (= 0.62.2)
|
||||
- Folly (= 2018.10.22.00)
|
||||
- React-Core/RCTBlobHeaders (= 0.62.2)
|
||||
- React-Core/RCTWebSocket (= 0.62.2)
|
||||
- React-jsi (= 0.62.2)
|
||||
- React-RCTNetwork (= 0.62.2)
|
||||
- ReactCommon/turbomodule/core (= 0.62.2)
|
||||
- React-RCTImage (0.62.2):
|
||||
- FBReactNativeSpec (= 0.62.2)
|
||||
- Folly (= 2018.10.22.00)
|
||||
- RCTTypeSafety (= 0.62.2)
|
||||
- React-Core/RCTImageHeaders (= 0.62.2)
|
||||
- React-RCTNetwork (= 0.62.2)
|
||||
- ReactCommon/turbomodule/core (= 0.62.2)
|
||||
- React-RCTLinking (0.62.2):
|
||||
- FBReactNativeSpec (= 0.62.2)
|
||||
- React-Core/RCTLinkingHeaders (= 0.62.2)
|
||||
- ReactCommon/turbomodule/core (= 0.62.2)
|
||||
- React-RCTNetwork (0.62.2):
|
||||
- FBReactNativeSpec (= 0.62.2)
|
||||
- Folly (= 2018.10.22.00)
|
||||
- RCTTypeSafety (= 0.62.2)
|
||||
- React-Core/RCTNetworkHeaders (= 0.62.2)
|
||||
- ReactCommon/turbomodule/core (= 0.62.2)
|
||||
- React-RCTSettings (0.62.2):
|
||||
- FBReactNativeSpec (= 0.62.2)
|
||||
- Folly (= 2018.10.22.00)
|
||||
- RCTTypeSafety (= 0.62.2)
|
||||
- React-Core/RCTSettingsHeaders (= 0.62.2)
|
||||
- ReactCommon/turbomodule/core (= 0.62.2)
|
||||
- React-RCTText (0.62.2):
|
||||
- React-Core/RCTTextHeaders (= 0.62.2)
|
||||
- React-RCTVibration (0.62.2):
|
||||
- FBReactNativeSpec (= 0.62.2)
|
||||
- Folly (= 2018.10.22.00)
|
||||
- React-Core/RCTVibrationHeaders (= 0.62.2)
|
||||
- ReactCommon/turbomodule/core (= 0.62.2)
|
||||
- ReactCommon/callinvoker (0.62.2):
|
||||
- react-native-webview (10.9.2):
|
||||
- React-Core
|
||||
- React-RCTActionSheet (0.63.4):
|
||||
- React-Core/RCTActionSheetHeaders (= 0.63.4)
|
||||
- React-RCTAnimation (0.63.4):
|
||||
- FBReactNativeSpec (= 0.63.4)
|
||||
- Folly (= 2020.01.13.00)
|
||||
- RCTTypeSafety (= 0.63.4)
|
||||
- React-Core/RCTAnimationHeaders (= 0.63.4)
|
||||
- React-jsi (= 0.63.4)
|
||||
- ReactCommon/turbomodule/core (= 0.63.4)
|
||||
- React-RCTBlob (0.63.4):
|
||||
- FBReactNativeSpec (= 0.63.4)
|
||||
- Folly (= 2020.01.13.00)
|
||||
- React-Core/RCTBlobHeaders (= 0.63.4)
|
||||
- React-Core/RCTWebSocket (= 0.63.4)
|
||||
- React-jsi (= 0.63.4)
|
||||
- React-RCTNetwork (= 0.63.4)
|
||||
- ReactCommon/turbomodule/core (= 0.63.4)
|
||||
- React-RCTImage (0.63.4):
|
||||
- FBReactNativeSpec (= 0.63.4)
|
||||
- Folly (= 2020.01.13.00)
|
||||
- RCTTypeSafety (= 0.63.4)
|
||||
- React-Core/RCTImageHeaders (= 0.63.4)
|
||||
- React-jsi (= 0.63.4)
|
||||
- React-RCTNetwork (= 0.63.4)
|
||||
- ReactCommon/turbomodule/core (= 0.63.4)
|
||||
- React-RCTLinking (0.63.4):
|
||||
- FBReactNativeSpec (= 0.63.4)
|
||||
- React-Core/RCTLinkingHeaders (= 0.63.4)
|
||||
- React-jsi (= 0.63.4)
|
||||
- ReactCommon/turbomodule/core (= 0.63.4)
|
||||
- React-RCTNetwork (0.63.4):
|
||||
- FBReactNativeSpec (= 0.63.4)
|
||||
- Folly (= 2020.01.13.00)
|
||||
- RCTTypeSafety (= 0.63.4)
|
||||
- React-Core/RCTNetworkHeaders (= 0.63.4)
|
||||
- React-jsi (= 0.63.4)
|
||||
- ReactCommon/turbomodule/core (= 0.63.4)
|
||||
- React-RCTSettings (0.63.4):
|
||||
- FBReactNativeSpec (= 0.63.4)
|
||||
- Folly (= 2020.01.13.00)
|
||||
- RCTTypeSafety (= 0.63.4)
|
||||
- React-Core/RCTSettingsHeaders (= 0.63.4)
|
||||
- React-jsi (= 0.63.4)
|
||||
- ReactCommon/turbomodule/core (= 0.63.4)
|
||||
- React-RCTText (0.63.4):
|
||||
- React-Core/RCTTextHeaders (= 0.63.4)
|
||||
- React-RCTVibration (0.63.4):
|
||||
- FBReactNativeSpec (= 0.63.4)
|
||||
- Folly (= 2020.01.13.00)
|
||||
- React-Core/RCTVibrationHeaders (= 0.63.4)
|
||||
- React-jsi (= 0.63.4)
|
||||
- ReactCommon/turbomodule/core (= 0.63.4)
|
||||
- ReactCommon/turbomodule/core (0.63.4):
|
||||
- DoubleConversion
|
||||
- Folly (= 2018.10.22.00)
|
||||
- Folly (= 2020.01.13.00)
|
||||
- glog
|
||||
- React-cxxreact (= 0.62.2)
|
||||
- ReactCommon/turbomodule/core (0.62.2):
|
||||
- DoubleConversion
|
||||
- Folly (= 2018.10.22.00)
|
||||
- glog
|
||||
- React-Core (= 0.62.2)
|
||||
- React-cxxreact (= 0.62.2)
|
||||
- React-jsi (= 0.62.2)
|
||||
- ReactCommon/callinvoker (= 0.62.2)
|
||||
- React-callinvoker (= 0.63.4)
|
||||
- React-Core (= 0.63.4)
|
||||
- React-cxxreact (= 0.63.4)
|
||||
- React-jsi (= 0.63.4)
|
||||
- ReactNativeAudioToolkit (2.0.3):
|
||||
- React
|
||||
- ReactNativeDarkMode (0.2.2):
|
||||
@@ -328,11 +354,13 @@ PODS:
|
||||
- React
|
||||
- RNCMaskedView (0.1.9):
|
||||
- React
|
||||
- RNCPushNotificationIOS (1.4.1):
|
||||
- React
|
||||
- RNDeviceInfo (5.6.1):
|
||||
- React
|
||||
- RNFS (2.16.6):
|
||||
- React
|
||||
- RNGestureHandler (1.6.1):
|
||||
- RNGestureHandler (1.8.0):
|
||||
- React
|
||||
- RNImageCropPicker (0.31.1):
|
||||
- React-Core
|
||||
@@ -351,19 +379,26 @@ PODS:
|
||||
- React
|
||||
- RNReactNativeHapticFeedback (1.9.0):
|
||||
- React
|
||||
- RNReanimated (1.8.0):
|
||||
- RNReanimated (1.13.0):
|
||||
- React
|
||||
- RNScreens (2.5.0):
|
||||
- RNScreens (2.10.1):
|
||||
- React
|
||||
- RNSVG (9.13.6):
|
||||
- React
|
||||
- SDWebImage (5.10.2):
|
||||
- SDWebImage/Core (= 5.10.2)
|
||||
- SDWebImage/Core (5.10.2)
|
||||
- SDWebImageWebPCoder (0.6.1):
|
||||
- libwebp (~> 1.0)
|
||||
- SDWebImage/Core (~> 5.7)
|
||||
- secp256k1 (0.1.6)
|
||||
- SQLCipher (3.4.2):
|
||||
- SQLCipher/standard (= 3.4.2)
|
||||
- SQLCipher/common (3.4.2)
|
||||
- SQLCipher/standard (3.4.2):
|
||||
- SQLCipher/common
|
||||
- SSZipArchive (2.2.3)
|
||||
- TOCropViewController (2.5.3)
|
||||
- TOCropViewController (2.6.0)
|
||||
- TouchID (4.4.1):
|
||||
- React
|
||||
- Yoga (1.14.0)
|
||||
@@ -371,35 +406,38 @@ PODS:
|
||||
- Yoga (~> 1.14)
|
||||
|
||||
DEPENDENCIES:
|
||||
- BVLinearGradient (from `../node_modules/react-native-linear-gradient`)
|
||||
- DoubleConversion (from `../node_modules/react-native/third-party-podspecs/DoubleConversion.podspec`)
|
||||
- FBLazyVector (from `../node_modules/react-native/Libraries/FBLazyVector`)
|
||||
- FBReactNativeSpec (from `../node_modules/react-native/Libraries/FBReactNativeSpec`)
|
||||
- Flipper (~> 0.37.0)
|
||||
- Flipper (~> 0.54.0)
|
||||
- Flipper-DoubleConversion (= 1.1.7)
|
||||
- Flipper-Folly (~> 2.1)
|
||||
- Flipper-Folly (~> 2.2)
|
||||
- Flipper-Glog (= 0.3.6)
|
||||
- Flipper-PeerTalk (~> 0.0.4)
|
||||
- Flipper-RSocket (~> 1.0)
|
||||
- FlipperKit (~> 0.37.0)
|
||||
- FlipperKit/Core (~> 0.37.0)
|
||||
- FlipperKit/CppBridge (~> 0.37.0)
|
||||
- FlipperKit/FBCxxFollyDynamicConvert (~> 0.37.0)
|
||||
- FlipperKit/FBDefines (~> 0.37.0)
|
||||
- FlipperKit/FKPortForwarding (~> 0.37.0)
|
||||
- FlipperKit/FlipperKitHighlightOverlay (~> 0.37.0)
|
||||
- FlipperKit/FlipperKitLayoutPlugin (~> 0.37.0)
|
||||
- FlipperKit/FlipperKitLayoutTextSearchable (~> 0.37.0)
|
||||
- FlipperKit/FlipperKitNetworkPlugin (~> 0.37.0)
|
||||
- FlipperKit/FlipperKitReactPlugin (~> 0.37.0)
|
||||
- FlipperKit/FlipperKitUserDefaultsPlugin (~> 0.37.0)
|
||||
- FlipperKit/SKIOSNetworkPlugin (~> 0.37.0)
|
||||
- Flipper-RSocket (~> 1.1)
|
||||
- FlipperKit (~> 0.54.0)
|
||||
- FlipperKit/Core (~> 0.54.0)
|
||||
- FlipperKit/CppBridge (~> 0.54.0)
|
||||
- FlipperKit/FBCxxFollyDynamicConvert (~> 0.54.0)
|
||||
- FlipperKit/FBDefines (~> 0.54.0)
|
||||
- FlipperKit/FKPortForwarding (~> 0.54.0)
|
||||
- FlipperKit/FlipperKitHighlightOverlay (~> 0.54.0)
|
||||
- FlipperKit/FlipperKitLayoutPlugin (~> 0.54.0)
|
||||
- FlipperKit/FlipperKitLayoutTextSearchable (~> 0.54.0)
|
||||
- FlipperKit/FlipperKitNetworkPlugin (~> 0.54.0)
|
||||
- FlipperKit/FlipperKitReactPlugin (~> 0.54.0)
|
||||
- FlipperKit/FlipperKitUserDefaultsPlugin (~> 0.54.0)
|
||||
- FlipperKit/SKIOSNetworkPlugin (~> 0.54.0)
|
||||
- Folly (from `../node_modules/react-native/third-party-podspecs/Folly.podspec`)
|
||||
- glog (from `../node_modules/react-native/third-party-podspecs/glog.podspec`)
|
||||
- Keycard (from `https://github.com/status-im/Keycard.swift.git`)
|
||||
- Permission-Camera (from `../node_modules/react-native-permissions/ios/Camera.podspec`)
|
||||
- Permission-Microphone (from `../node_modules/react-native-permissions/ios/Microphone.podspec`)
|
||||
- RCTRequired (from `../node_modules/react-native/Libraries/RCTRequired`)
|
||||
- RCTTypeSafety (from `../node_modules/react-native/Libraries/TypeSafety`)
|
||||
- React (from `../node_modules/react-native/`)
|
||||
- React-callinvoker (from `../node_modules/react-native/ReactCommon/callinvoker`)
|
||||
- React-Core (from `../node_modules/react-native/`)
|
||||
- React-Core/DevSupport (from `../node_modules/react-native/`)
|
||||
- React-Core/RCTWebSocket (from `../node_modules/react-native/`)
|
||||
@@ -411,6 +449,7 @@ DEPENDENCIES:
|
||||
- react-native-background-timer (from `../node_modules/react-native-background-timer`)
|
||||
- react-native-camera-kit (from `../node_modules/react-native-camera-kit`)
|
||||
- "react-native-cameraroll (from `../node_modules/@react-native-community/cameraroll`)"
|
||||
- react-native-config (from `../node_modules/react-native-config`)
|
||||
- react-native-image-resizer (from `../node_modules/react-native-image-resizer`)
|
||||
- react-native-mail (from `../node_modules/react-native-mail`)
|
||||
- "react-native-netinfo (from `../node_modules/@react-native-community/netinfo`)"
|
||||
@@ -418,6 +457,7 @@ DEPENDENCIES:
|
||||
- react-native-shake (from `../node_modules/react-native-shake`)
|
||||
- "react-native-slider (from `../node_modules/@react-native-community/slider`)"
|
||||
- react-native-splash-screen (from `../node_modules/react-native-splash-screen`)
|
||||
- react-native-status-keycard (from `../node_modules/react-native-status-keycard`)
|
||||
- react-native-webview (from `../node_modules/react-native-webview`)
|
||||
- React-RCTActionSheet (from `../node_modules/react-native/Libraries/ActionSheetIOS`)
|
||||
- React-RCTAnimation (from `../node_modules/react-native/Libraries/NativeAnimation`)
|
||||
@@ -428,13 +468,13 @@ DEPENDENCIES:
|
||||
- React-RCTSettings (from `../node_modules/react-native/Libraries/Settings`)
|
||||
- React-RCTText (from `../node_modules/react-native/Libraries/Text`)
|
||||
- React-RCTVibration (from `../node_modules/react-native/Libraries/Vibration`)
|
||||
- ReactCommon/callinvoker (from `../node_modules/react-native/ReactCommon`)
|
||||
- ReactCommon/turbomodule/core (from `../node_modules/react-native/ReactCommon`)
|
||||
- "ReactNativeAudioToolkit (from `../node_modules/@react-native-community/audio-toolkit`)"
|
||||
- ReactNativeDarkMode (from `../node_modules/react-native-dark-mode`)
|
||||
- "RNCAsyncStorage (from `../node_modules/@react-native-community/async-storage`)"
|
||||
- "RNCClipboard (from `../node_modules/@react-native-community/clipboard`)"
|
||||
- "RNCMaskedView (from `../node_modules/@react-native-community/masked-view`)"
|
||||
- "RNCPushNotificationIOS (from `../node_modules/@react-native-community/push-notification-ios`)"
|
||||
- RNDeviceInfo (from `../node_modules/react-native-device-info`)
|
||||
- RNFS (from `../node_modules/react-native-fs`)
|
||||
- RNGestureHandler (from `../node_modules/react-native-gesture-handler`)
|
||||
@@ -446,6 +486,7 @@ DEPENDENCIES:
|
||||
- RNReanimated (from `../node_modules/react-native-reanimated`)
|
||||
- RNScreens (from `../node_modules/react-native-screens`)
|
||||
- RNSVG (from `../node_modules/react-native-svg`)
|
||||
- secp256k1 (from `https://github.com/status-im/secp256k1.swift.git`)
|
||||
- SQLCipher (~> 3.0)
|
||||
- SSZipArchive
|
||||
- TouchID (from `../node_modules/react-native-touch-id`)
|
||||
@@ -456,6 +497,7 @@ SPEC REPOS:
|
||||
- boost-for-react-native
|
||||
- CocoaAsyncSocket
|
||||
- CocoaLibEvent
|
||||
- CryptoSwift
|
||||
- Flipper
|
||||
- Flipper-DoubleConversion
|
||||
- Flipper-Folly
|
||||
@@ -470,6 +512,8 @@ SPEC REPOS:
|
||||
- YogaKit
|
||||
|
||||
EXTERNAL SOURCES:
|
||||
BVLinearGradient:
|
||||
:path: "../node_modules/react-native-linear-gradient"
|
||||
DoubleConversion:
|
||||
:podspec: "../node_modules/react-native/third-party-podspecs/DoubleConversion.podspec"
|
||||
FBLazyVector:
|
||||
@@ -480,6 +524,8 @@ EXTERNAL SOURCES:
|
||||
:podspec: "../node_modules/react-native/third-party-podspecs/Folly.podspec"
|
||||
glog:
|
||||
:podspec: "../node_modules/react-native/third-party-podspecs/glog.podspec"
|
||||
Keycard:
|
||||
:git: https://github.com/status-im/Keycard.swift.git
|
||||
Permission-Camera:
|
||||
:path: "../node_modules/react-native-permissions/ios/Camera.podspec"
|
||||
Permission-Microphone:
|
||||
@@ -490,6 +536,8 @@ EXTERNAL SOURCES:
|
||||
:path: "../node_modules/react-native/Libraries/TypeSafety"
|
||||
React:
|
||||
:path: "../node_modules/react-native/"
|
||||
React-callinvoker:
|
||||
:path: "../node_modules/react-native/ReactCommon/callinvoker"
|
||||
React-Core:
|
||||
:path: "../node_modules/react-native/"
|
||||
React-CoreModules:
|
||||
@@ -508,6 +556,8 @@ EXTERNAL SOURCES:
|
||||
:path: "../node_modules/react-native-camera-kit"
|
||||
react-native-cameraroll:
|
||||
:path: "../node_modules/@react-native-community/cameraroll"
|
||||
react-native-config:
|
||||
:path: "../node_modules/react-native-config"
|
||||
react-native-image-resizer:
|
||||
:path: "../node_modules/react-native-image-resizer"
|
||||
react-native-mail:
|
||||
@@ -522,6 +572,8 @@ EXTERNAL SOURCES:
|
||||
:path: "../node_modules/@react-native-community/slider"
|
||||
react-native-splash-screen:
|
||||
:path: "../node_modules/react-native-splash-screen"
|
||||
react-native-status-keycard:
|
||||
:path: "../node_modules/react-native-status-keycard"
|
||||
react-native-webview:
|
||||
:path: "../node_modules/react-native-webview"
|
||||
React-RCTActionSheet:
|
||||
@@ -554,6 +606,8 @@ EXTERNAL SOURCES:
|
||||
:path: "../node_modules/@react-native-community/clipboard"
|
||||
RNCMaskedView:
|
||||
:path: "../node_modules/@react-native-community/masked-view"
|
||||
RNCPushNotificationIOS:
|
||||
:path: "../node_modules/@react-native-community/push-notification-ios"
|
||||
RNDeviceInfo:
|
||||
:path: "../node_modules/react-native-device-info"
|
||||
RNFS:
|
||||
@@ -576,42 +630,60 @@ EXTERNAL SOURCES:
|
||||
:path: "../node_modules/react-native-screens"
|
||||
RNSVG:
|
||||
:path: "../node_modules/react-native-svg"
|
||||
secp256k1:
|
||||
:git: https://github.com/status-im/secp256k1.swift.git
|
||||
:submodules: true
|
||||
TouchID:
|
||||
:path: "../node_modules/react-native-touch-id"
|
||||
Yoga:
|
||||
:path: "../node_modules/react-native/ReactCommon/yoga"
|
||||
|
||||
CHECKOUT OPTIONS:
|
||||
Keycard:
|
||||
:commit: 36e260cfafc2755a47f1e5f542858ceb0c6c37df
|
||||
:git: https://github.com/status-im/Keycard.swift.git
|
||||
secp256k1:
|
||||
:commit: 46a1fa30d9b8babeae85ff519050f42394ab5fcc
|
||||
:git: https://github.com/status-im/secp256k1.swift.git
|
||||
:submodules: true
|
||||
|
||||
SPEC CHECKSUMS:
|
||||
boost-for-react-native: 39c7adb57c4e60d6c5479dd8623128eb5b3f0f2c
|
||||
CocoaAsyncSocket: 694058e7c0ed05a9e217d1b3c7ded962f4180845
|
||||
BVLinearGradient: e3aad03778a456d77928f594a649e96995f1c872
|
||||
CocoaAsyncSocket: 065fd1e645c7abab64f7a6a2007a48038fdc6a99
|
||||
CocoaLibEvent: 2fab71b8bd46dd33ddb959f7928ec5909f838e3f
|
||||
DoubleConversion: 5805e889d232975c086db112ece9ed034df7a0b2
|
||||
FBLazyVector: 4aab18c93cd9546e4bfed752b4084585eca8b245
|
||||
FBReactNativeSpec: 5465d51ccfeecb7faa12f9ae0024f2044ce4044e
|
||||
Flipper: 1670db365568191bd123a0c905b834e77ba9e3d3
|
||||
CryptoSwift: 01b0f0cba1d5c212e5a335ff6c054fb75a204f00
|
||||
DoubleConversion: cde416483dac037923206447da6e1454df403714
|
||||
FBLazyVector: 3bb422f41b18121b71783a905c10e58606f7dc3e
|
||||
FBReactNativeSpec: f2c97f2529dd79c083355182cc158c9f98f4bd6e
|
||||
Flipper: be611d4b742d8c87fbae2ca5f44603a02539e365
|
||||
Flipper-DoubleConversion: 38631e41ef4f9b12861c67d17cb5518d06badc41
|
||||
Flipper-Folly: c12092ea368353b58e992843a990a3225d4533c3
|
||||
Flipper-Folly: e4493b013c02d9347d5e0cb4d128680239f6c78a
|
||||
Flipper-Glog: 1dfd6abf1e922806c52ceb8701a3599a79a200a6
|
||||
Flipper-PeerTalk: 116d8f857dc6ef55c7a5a75ea3ceaafe878aadc9
|
||||
Flipper-RSocket: 64e7431a55835eb953b0bf984ef3b90ae9fdddd7
|
||||
FlipperKit: afd4259ef9eadeeb2d30250b37d95cb3b6b97a69
|
||||
Folly: 30e7936e1c45c08d884aa59369ed951a8e68cf51
|
||||
glog: 682164e7ac67e41afd8f7b6a37a96d04caf61cc0
|
||||
OpenSSL-Universal: 8b48cc0d10c1b2923617dfe5c178aa9ed2689355
|
||||
FlipperKit: ab353d41aea8aae2ea6daaf813e67496642f3d7d
|
||||
Folly: b73c3869541e86821df3c387eb0af5f65addfab4
|
||||
glog: cee4319f395bad5865ef3f32466c2e0ae677432c
|
||||
Keycard: dd96182888da0aacf4de821b641103143bbb26cc
|
||||
libwebp: 946cb3063cea9236285f7e9a8505d806d30e07f3
|
||||
OpenSSL-Universal: ff34003318d5e1163e9529b08470708e389ffcdd
|
||||
Permission-Camera: afad27bf90337684d4a86f3825112d648c8c4d3b
|
||||
Permission-Microphone: 0ffabc3fe1c75cfb260525ee3f529383c9f4368c
|
||||
RCTRequired: cec6a34b3ac8a9915c37e7e4ad3aa74726ce4035
|
||||
RCTTypeSafety: 93006131180074cffa227a1075802c89a49dd4ce
|
||||
React: 29a8b1a02bd764fb7644ef04019270849b9a7ac3
|
||||
React-Core: b12bffb3f567fdf99510acb716ef1abd426e0e05
|
||||
React-CoreModules: 4a9b87bbe669d6c3173c0132c3328e3b000783d0
|
||||
React-cxxreact: e65f9c2ba0ac5be946f53548c1aaaee5873a8103
|
||||
React-jsi: b6dc94a6a12ff98e8877287a0b7620d365201161
|
||||
React-jsiexecutor: 1540d1c01bb493ae3124ed83351b1b6a155db7da
|
||||
React-jsinspector: 512e560d0e985d0e8c479a54a4e5c147a9c83493
|
||||
RCTRequired: 082f10cd3f905d6c124597fd1c14f6f2655ff65e
|
||||
RCTTypeSafety: 8c9c544ecbf20337d069e4ae7fd9a377aadf504b
|
||||
React: b0a957a2c44da4113b0c4c9853d8387f8e64e615
|
||||
React-callinvoker: c3f44dd3cb195b6aa46621fff95ded79d59043fe
|
||||
React-Core: d3b2a1ac9a2c13c3bcde712d9281fc1c8a5b315b
|
||||
React-CoreModules: 0581ff36cb797da0943d424f69e7098e43e9be60
|
||||
React-cxxreact: c1480d4fda5720086c90df537ee7d285d4c57ac3
|
||||
React-jsi: a0418934cf48f25b485631deb27c64dc40fb4c31
|
||||
React-jsiexecutor: 93bd528844ad21dc07aab1c67cb10abae6df6949
|
||||
React-jsinspector: 58aef7155bc9a9683f5b60b35eccea8722a4f53a
|
||||
react-native-background-timer: 1f7d560647b40e6a60b01c452ba29c54bf581fc4
|
||||
react-native-camera-kit: 498a6d111a904834e0824e9073cfadef7303235f
|
||||
react-native-cameraroll: ac69828fc43b9dbf92149714fd739577d38e4448
|
||||
react-native-config: c98128a72bc2c3a1ca72caec0b021f0fa944aa29
|
||||
react-native-image-resizer: 2f1577efa3bc762597681f530c8e8d05ce0ceeb3
|
||||
react-native-mail: 7e37dfbe93ff0d4c7df346b738854dbed533e86f
|
||||
react-native-netinfo: ddaca8bbb9e6e914b1a23787ccb879bc642931c9
|
||||
@@ -619,40 +691,45 @@ SPEC CHECKSUMS:
|
||||
react-native-shake: de052eaa3eadc4a326b8ddd7ac80c06e8d84528c
|
||||
react-native-slider: 12bd76d3d568c9c5500825db54123d44b48e4ad4
|
||||
react-native-splash-screen: 200d11d188e2e78cea3ad319964f6142b6384865
|
||||
react-native-webview: 40bbeb6d011226f34cb83f845aeb0fdf515cfc5f
|
||||
React-RCTActionSheet: f41ea8a811aac770e0cc6e0ad6b270c644ea8b7c
|
||||
React-RCTAnimation: 49ab98b1c1ff4445148b72a3d61554138565bad0
|
||||
React-RCTBlob: a332773f0ebc413a0ce85942a55b064471587a71
|
||||
React-RCTImage: e70be9b9c74fe4e42d0005f42cace7981c994ac3
|
||||
React-RCTLinking: c1b9739a88d56ecbec23b7f63650e44672ab2ad2
|
||||
React-RCTNetwork: 73138b6f45e5a2768ad93f3d57873c2a18d14b44
|
||||
React-RCTSettings: 6e3738a87e21b39a8cb08d627e68c44acf1e325a
|
||||
React-RCTText: fae545b10cfdb3d247c36c56f61a94cfd6dba41d
|
||||
React-RCTVibration: 4356114dbcba4ce66991096e51a66e61eda51256
|
||||
ReactCommon: ed4e11d27609d571e7eee8b65548efc191116eb3
|
||||
react-native-status-keycard: a001766cf8f27de56406ac712a52a982f1f28744
|
||||
react-native-webview: 4e96d493f9f90ba4f03b28933f30b2964df07e39
|
||||
React-RCTActionSheet: 89a0ca9f4a06c1f93c26067af074ccdce0f40336
|
||||
React-RCTAnimation: 1bde3ecc0c104c55df246eda516e0deb03c4e49b
|
||||
React-RCTBlob: a97d378b527740cc667e03ebfa183a75231ab0f0
|
||||
React-RCTImage: c1b1f2d3f43a4a528c8946d6092384b5c880d2f0
|
||||
React-RCTLinking: 35ae4ab9dc0410d1fcbdce4d7623194a27214fb2
|
||||
React-RCTNetwork: 29ec2696f8d8cfff7331fac83d3e893c95ef43ae
|
||||
React-RCTSettings: 60f0691bba2074ef394f95d4c2265ec284e0a46a
|
||||
React-RCTText: 5c51df3f08cb9dedc6e790161195d12bac06101c
|
||||
React-RCTVibration: ae4f914cfe8de7d4de95ae1ea6cc8f6315d73d9d
|
||||
ReactCommon: 73d79c7039f473b76db6ff7c6b159c478acbbb3b
|
||||
ReactNativeAudioToolkit: de9610f323e855ac6574be8c99621f3d57c5df06
|
||||
ReactNativeDarkMode: 0178ffca3b10f6a7c9f49d6f9810232b328fa949
|
||||
RNCAsyncStorage: d059c3ee71738c39834a627476322a5a8cd5bf36
|
||||
RNCClipboard: 8148e21ac347c51fd6cd4b683389094c216bb543
|
||||
RNCMaskedView: 71fc32d971f03b7f03d6ab6b86b730c4ee64f5b6
|
||||
RNCPushNotificationIOS: c145c6253ea016e5efeff604f2720736b4a596f7
|
||||
RNDeviceInfo: b6e650fbd234732c759544218657d549b4339038
|
||||
RNFS: 2bd9eb49dc82fa9676382f0585b992c424cd59df
|
||||
RNGestureHandler: 8f09cd560f8d533eb36da5a6c5a843af9f056b38
|
||||
RNGestureHandler: 7a5833d0f788dbd107fbb913e09aa0c1ff333c39
|
||||
RNImageCropPicker: 38865ab4af1b0b2146ad66061196bc0184946855
|
||||
RNKeychain: 216f37338fcb9e5c3a2530f1e3295f737a690cb1
|
||||
RNLanguages: 962e562af0d34ab1958d89bcfdb64fafc37c513e
|
||||
RNPermissions: ad71dd4f767ec254f2cd57592fbee02afee75467
|
||||
RNReactNativeHapticFeedback: 2566b468cc8d0e7bb2f84b23adc0f4614594d071
|
||||
RNReanimated: 955cf4068714003d2f1a6e2bae3fb1118f359aff
|
||||
RNScreens: ac02d0e4529f08ced69f5580d416f968a6ec3a1d
|
||||
RNReanimated: 89f5e0a04d1dd52fbf27e7e7030d8f80a646a3fc
|
||||
RNScreens: b748efec66e095134c7166ca333b628cd7e6f3e2
|
||||
RNSVG: 8ba35cbeb385a52fd960fd28db9d7d18b4c2974f
|
||||
SDWebImage: b969dcfc02c40a5da71eac0b03b8f1a0c794a86f
|
||||
SDWebImageWebPCoder: d0dac55073088d24b2ac1b191a71a8f8d0adac21
|
||||
secp256k1: f61d67e6fdcb85fd727acf1bf35ace6036db540c
|
||||
SQLCipher: f9fcf29b2e59ced7defc2a2bdd0ebe79b40d4990
|
||||
SSZipArchive: 62d4947b08730e4cda640473b0066d209ff033c9
|
||||
TOCropViewController: 20a14b6a7a098308bf369e7c8d700dc983a974e6
|
||||
TOCropViewController: 3105367e808b7d3d886a74ff59bf4804e7d3ab38
|
||||
TouchID: ba4c656d849cceabc2e4eef722dea5e55959ecf4
|
||||
Yoga: 3ebccbdd559724312790e7742142d062476b698e
|
||||
Yoga: 4bd86afe9883422a7c4028c00e34790f560923d6
|
||||
YogaKit: f782866e155069a2cca2517aafea43200b01fd5a
|
||||
|
||||
PODFILE CHECKSUM: 5faa578ff5cb7a30abc18b9d620df288750a72fe
|
||||
PODFILE CHECKSUM: 5d4b89aa09f8d53bc530d173622952e85d5d7662
|
||||
|
||||
COCOAPODS: 1.9.1
|
||||
COCOAPODS: 1.10.1
|
||||
|
||||
@@ -25,7 +25,6 @@
|
||||
3AAD2AC324A3A60E0075D594 /* libRCTStatus.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 201067C41D4789F700FA83B6 /* libRCTStatus.a */; };
|
||||
3AAD2AC524A3A60E0075D594 /* libc++.tbd in Frameworks */ = {isa = PBXBuildFile; fileRef = 8B9A886A2CB448B1ABA0EB62 /* libc++.tbd */; };
|
||||
3AAD2AC624A3A60E0075D594 /* libz.tbd in Frameworks */ = {isa = PBXBuildFile; fileRef = 4E586E1B0E544F64AA9F5BD1 /* libz.tbd */; };
|
||||
3AAD2AC824A3A60E0075D594 /* libReactNativeConfig.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 9EF083611F3B538B00876A8F /* libReactNativeConfig.a */; };
|
||||
3AAD2ACA24A3A60E0075D594 /* launch-image-universal.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 74B758FB20D7C00B003343C3 /* launch-image-universal.storyboard */; };
|
||||
3AAD2ACB24A3A60E0075D594 /* Images.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = B2F2D1BB1D9D531B00B7B453 /* Images.xcassets */; };
|
||||
3AAD2ACC24A3A60E0075D594 /* Inter-Bold.otf in Resources */ = {isa = PBXBuildFile; fileRef = CD4A2C27D6D5473184DC1F7E /* Inter-Bold.otf */; };
|
||||
@@ -39,21 +38,23 @@
|
||||
3AAD2AD424A3A60E0075D594 /* Inter-SemiBoldItalic.otf in Resources */ = {isa = PBXBuildFile; fileRef = A4F2BBE8D4DD4140A6CCAC39 /* Inter-SemiBoldItalic.otf */; };
|
||||
3ABC7AF8245FF85900612C45 /* InterStatus-Regular.otf in Resources */ = {isa = PBXBuildFile; fileRef = 9C76AF5A418D4D65A4CAD1D9 /* InterStatus-Regular.otf */; };
|
||||
57C854A7993C47A3B1AECD32 /* Inter-MediumItalic.otf in Resources */ = {isa = PBXBuildFile; fileRef = C6B1215047604CD59A4C74D6 /* Inter-MediumItalic.otf */; };
|
||||
68E19BBDF749E72ED1F9DEF5 /* libPods-Status-StatusIm.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 132CE3B093884B0FB239A0AB /* libPods-Status-StatusIm.a */; };
|
||||
6C137817D5298C82BC79177C /* libPods-Status-StatusImPR.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 5D4CB5416994C913628B8754 /* libPods-Status-StatusImPR.a */; };
|
||||
65F6941925780A4F00A45E76 /* Bridge.swift in Sources */ = {isa = PBXBuildFile; fileRef = 65F6941825780A4F00A45E76 /* Bridge.swift */; };
|
||||
65F6941A25780A4F00A45E76 /* Bridge.swift in Sources */ = {isa = PBXBuildFile; fileRef = 65F6941825780A4F00A45E76 /* Bridge.swift */; };
|
||||
65F6941B25780A4F00A45E76 /* Bridge.swift in Sources */ = {isa = PBXBuildFile; fileRef = 65F6941825780A4F00A45E76 /* Bridge.swift */; };
|
||||
70ADBB5ECF934DCF8A0E4919 /* Inter-Regular.otf in Resources */ = {isa = PBXBuildFile; fileRef = 1426DF592BA248FC81D955CB /* Inter-Regular.otf */; };
|
||||
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 */; };
|
||||
899B05F2F45193B7098B604A /* libPods-Status-StatusIm-StatusImTests.a in Frameworks */ = {isa = PBXBuildFile; fileRef = B00E6B2D94C4B463D8EFF8B8 /* libPods-Status-StatusIm-StatusImTests.a */; };
|
||||
9EF0836B1F3B53AB00876A8F /* libReactNativeConfig.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 9EF083611F3B538B00876A8F /* libReactNativeConfig.a */; };
|
||||
8770D567D65A8F938D95C371 /* libPods-Status-StatusIm-StatusImTests.a in Frameworks */ = {isa = PBXBuildFile; fileRef = DB52D45D10528E6992A83A71 /* libPods-Status-StatusIm-StatusImTests.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 */; };
|
||||
BA68A2377A20496EA737000D /* libz.tbd in Frameworks */ = {isa = PBXBuildFile; fileRef = 4E586E1B0E544F64AA9F5BD1 /* libz.tbd */; };
|
||||
C8F62CB13C1F732A6ABDB977 /* libPods-Status-StatusImPR.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 9B9F8F780F889F228546DF60 /* libPods-Status-StatusImPR.a */; };
|
||||
CE4E31B31D8695250033ED64 /* Statusgo.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = CE4E31B21D8695250033ED64 /* Statusgo.framework */; };
|
||||
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 */; };
|
||||
DBE02ADA80FE465743702EFB /* libPods-Status-StatusIm.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 1EA4C352EDC255945D9357D4 /* libPods-Status-StatusIm.a */; };
|
||||
/* End PBXBuildFile section */
|
||||
|
||||
/* Begin PBXContainerItemProxy section */
|
||||
@@ -78,13 +79,6 @@
|
||||
remoteGlobalIDString = 0974579A1D2A440A000D9368;
|
||||
remoteInfo = RCTWKWebView;
|
||||
};
|
||||
9EF083601F3B538B00876A8F /* PBXContainerItemProxy */ = {
|
||||
isa = PBXContainerItemProxy;
|
||||
containerPortal = 9EF083381F3B538A00876A8F /* ReactNativeConfig.xcodeproj */;
|
||||
proxyType = 2;
|
||||
remoteGlobalIDString = EB2648DF1C7BE17A00B8F155;
|
||||
remoteInfo = ReactNativeConfig;
|
||||
};
|
||||
/* End PBXContainerItemProxy section */
|
||||
|
||||
/* Begin PBXCopyFilesBuildPhase section */
|
||||
@@ -115,16 +109,14 @@
|
||||
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>"; };
|
||||
064351D2FD901F8B6C9AE2A5 /* Pods-StatusImTests.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-StatusImTests.debug.xcconfig"; path = "Pods/Target Support Files/Pods-StatusImTests/Pods-StatusImTests.debug.xcconfig"; sourceTree = "<group>"; };
|
||||
132CE3B093884B0FB239A0AB /* libPods-Status-StatusIm.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = "libPods-Status-StatusIm.a"; sourceTree = BUILT_PRODUCTS_DIR; };
|
||||
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.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = AppDelegate.m; path = StatusIm/AppDelegate.m; 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>"; };
|
||||
1EA4C352EDC255945D9357D4 /* libPods-Status-StatusIm.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = "libPods-Status-StatusIm.a"; sourceTree = BUILT_PRODUCTS_DIR; };
|
||||
3887F5B027AC2EC4E7B8BC02 /* Pods-Status-StatusIm.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Status-StatusIm.debug.xcconfig"; path = "Pods/Target Support Files/Pods-Status-StatusIm/Pods-Status-StatusIm.debug.xcconfig"; sourceTree = "<group>"; };
|
||||
38A44830EC5708E89387F641 /* Pods-StatusIm.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-StatusIm.release.xcconfig"; path = "Pods/Target Support Files/Pods-StatusIm/Pods-StatusIm.release.xcconfig"; sourceTree = "<group>"; };
|
||||
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; };
|
||||
@@ -134,7 +126,12 @@
|
||||
439B6B4B407A4E2AACAFE5BE /* RCTStatus.xcodeproj */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = "wrapper.pb-project"; name = RCTStatus.xcodeproj; path = "../modules/react-native-status/ios/RCTStatus/RCTStatus.xcodeproj"; sourceTree = "<group>"; };
|
||||
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; };
|
||||
5D4CB5416994C913628B8754 /* libPods-Status-StatusImPR.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = "libPods-Status-StatusImPR.a"; sourceTree = BUILT_PRODUCTS_DIR; };
|
||||
5E9C2936B3890356C5BE1078 /* Pods-StatusIm-StatusImTests.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-StatusIm-StatusImTests.debug.xcconfig"; path = "Pods/Target Support Files/Pods-StatusIm-StatusImTests/Pods-StatusIm-StatusImTests.debug.xcconfig"; sourceTree = "<group>"; };
|
||||
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>"; };
|
||||
69291A6222A63434694EA2A6 /* Pods-Status-StatusImPR.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Status-StatusImPR.release.xcconfig"; path = "Pods/Target Support Files/Pods-Status-StatusImPR/Pods-Status-StatusImPR.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>"; };
|
||||
74B758FB20D7C00B003343C3 /* launch-image-universal.storyboard */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; path = "launch-image-universal.storyboard"; sourceTree = "<group>"; };
|
||||
@@ -143,14 +140,9 @@
|
||||
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>"; };
|
||||
977B1E37198B72A48870BFE5 /* Pods-Status-StatusIm-StatusImTests.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Status-StatusIm-StatusImTests.debug.xcconfig"; path = "Pods/Target Support Files/Pods-Status-StatusIm-StatusImTests/Pods-Status-StatusIm-StatusImTests.debug.xcconfig"; sourceTree = "<group>"; };
|
||||
9B9F8F780F889F228546DF60 /* libPods-Status-StatusImPR.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = "libPods-Status-StatusImPR.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>"; };
|
||||
9EF083381F3B538A00876A8F /* ReactNativeConfig.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = ReactNativeConfig.xcodeproj; path = "../node_modules/react-native-config/ios/ReactNativeConfig.xcodeproj"; sourceTree = "<group>"; };
|
||||
A08FD367B3239F901A12B5F4 /* Pods-StatusIm-StatusImTests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-StatusIm-StatusImTests.release.xcconfig"; path = "Pods/Target Support Files/Pods-StatusIm-StatusImTests/Pods-StatusIm-StatusImTests.release.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>"; };
|
||||
ACA66A8F16CD2FE21F38738B /* Pods-StatusIm.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-StatusIm.debug.xcconfig"; path = "Pods/Target Support Files/Pods-StatusIm/Pods-StatusIm.debug.xcconfig"; sourceTree = "<group>"; };
|
||||
B00E6B2D94C4B463D8EFF8B8 /* libPods-Status-StatusIm-StatusImTests.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = "libPods-Status-StatusIm-StatusImTests.a"; sourceTree = BUILT_PRODUCTS_DIR; };
|
||||
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>"; };
|
||||
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; };
|
||||
@@ -160,7 +152,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.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Statusgo.framework; path = "../modules/react-native-status/ios/RCTStatus/Statusgo.framework"; sourceTree = "<group>"; };
|
||||
D489EE8D5F52DA10AC715727 /* Pods-StatusImTests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-StatusImTests.release.xcconfig"; path = "Pods/Target Support Files/Pods-StatusImTests/Pods-StatusImTests.release.xcconfig"; sourceTree = "<group>"; };
|
||||
DB52D45D10528E6992A83A71 /* libPods-Status-StatusIm-StatusImTests.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = "libPods-Status-StatusIm-StatusImTests.a"; sourceTree = BUILT_PRODUCTS_DIR; };
|
||||
/* End PBXFileReference section */
|
||||
|
||||
/* Begin PBXFrameworksBuildPhase section */
|
||||
@@ -168,7 +160,7 @@
|
||||
isa = PBXFrameworksBuildPhase;
|
||||
buildActionMask = 2147483647;
|
||||
files = (
|
||||
899B05F2F45193B7098B604A /* libPods-Status-StatusIm-StatusImTests.a in Frameworks */,
|
||||
8770D567D65A8F938D95C371 /* libPods-Status-StatusIm-StatusImTests.a in Frameworks */,
|
||||
);
|
||||
runOnlyForDeploymentPostprocessing = 0;
|
||||
};
|
||||
@@ -182,8 +174,7 @@
|
||||
20AB9EC61D47CC0300E7FD9C /* libRCTStatus.a in Frameworks */,
|
||||
25DC9C9DC25846BD8D084888 /* libc++.tbd in Frameworks */,
|
||||
BA68A2377A20496EA737000D /* libz.tbd in Frameworks */,
|
||||
9EF0836B1F3B53AB00876A8F /* libReactNativeConfig.a in Frameworks */,
|
||||
DBE02ADA80FE465743702EFB /* libPods-Status-StatusIm.a in Frameworks */,
|
||||
68E19BBDF749E72ED1F9DEF5 /* libPods-Status-StatusIm.a in Frameworks */,
|
||||
);
|
||||
runOnlyForDeploymentPostprocessing = 0;
|
||||
};
|
||||
@@ -198,8 +189,7 @@
|
||||
3AAD2AC324A3A60E0075D594 /* libRCTStatus.a in Frameworks */,
|
||||
3AAD2AC524A3A60E0075D594 /* libc++.tbd in Frameworks */,
|
||||
3AAD2AC624A3A60E0075D594 /* libz.tbd in Frameworks */,
|
||||
3AAD2AC824A3A60E0075D594 /* libReactNativeConfig.a in Frameworks */,
|
||||
C8F62CB13C1F732A6ABDB977 /* libPods-Status-StatusImPR.a in Frameworks */,
|
||||
6C137817D5298C82BC79177C /* libPods-Status-StatusImPR.a in Frameworks */,
|
||||
);
|
||||
runOnlyForDeploymentPostprocessing = 0;
|
||||
};
|
||||
@@ -275,12 +265,6 @@
|
||||
5C1C8762251D6EF495FB2384 /* Pods */ = {
|
||||
isa = PBXGroup;
|
||||
children = (
|
||||
ACA66A8F16CD2FE21F38738B /* Pods-StatusIm.debug.xcconfig */,
|
||||
38A44830EC5708E89387F641 /* Pods-StatusIm.release.xcconfig */,
|
||||
064351D2FD901F8B6C9AE2A5 /* Pods-StatusImTests.debug.xcconfig */,
|
||||
D489EE8D5F52DA10AC715727 /* Pods-StatusImTests.release.xcconfig */,
|
||||
5E9C2936B3890356C5BE1078 /* Pods-StatusIm-StatusImTests.debug.xcconfig */,
|
||||
A08FD367B3239F901A12B5F4 /* Pods-StatusIm-StatusImTests.release.xcconfig */,
|
||||
3887F5B027AC2EC4E7B8BC02 /* Pods-Status-StatusIm.debug.xcconfig */,
|
||||
784390E981501E6517651C4E /* Pods-Status-StatusIm.release.xcconfig */,
|
||||
977B1E37198B72A48870BFE5 /* Pods-Status-StatusIm-StatusImTests.debug.xcconfig */,
|
||||
@@ -294,7 +278,6 @@
|
||||
832341AE1AAA6A7D00B99B32 /* Libraries */ = {
|
||||
isa = PBXGroup;
|
||||
children = (
|
||||
9EF083381F3B538A00876A8F /* ReactNativeConfig.xcodeproj */,
|
||||
9EC0135C1E06FB1900155B5C /* RCTWKWebView.xcodeproj */,
|
||||
439B6B4B407A4E2AACAFE5BE /* RCTStatus.xcodeproj */,
|
||||
);
|
||||
@@ -304,6 +287,7 @@
|
||||
83CBB9F61A601CBA00E9B192 = {
|
||||
isa = PBXGroup;
|
||||
children = (
|
||||
65F6941825780A4F00A45E76 /* Bridge.swift */,
|
||||
3AAD2AB624A3A5F10075D594 /* StatusImPR */,
|
||||
13B07FAE1A68108700A75B9A /* StatusIm */,
|
||||
832341AE1AAA6A7D00B99B32 /* Libraries */,
|
||||
@@ -312,6 +296,7 @@
|
||||
A97BA941B2FB44B4B66EE6D3 /* Frameworks */,
|
||||
1E7837547A9A40E18AD63CF3 /* Resources */,
|
||||
5C1C8762251D6EF495FB2384 /* Pods */,
|
||||
65F6941725780A4E00A45E76 /* StatusImTests-Bridging-Header.h */,
|
||||
);
|
||||
indentWidth = 2;
|
||||
sourceTree = "<group>";
|
||||
@@ -336,17 +321,11 @@
|
||||
name = Products;
|
||||
sourceTree = "<group>";
|
||||
};
|
||||
9EF083391F3B538A00876A8F /* Products */ = {
|
||||
isa = PBXGroup;
|
||||
children = (
|
||||
9EF083611F3B538B00876A8F /* libReactNativeConfig.a */,
|
||||
);
|
||||
name = Products;
|
||||
sourceTree = "<group>";
|
||||
};
|
||||
A97BA941B2FB44B4B66EE6D3 /* Frameworks */ = {
|
||||
isa = PBXGroup;
|
||||
children = (
|
||||
65F693BD2578002500A45E76 /* CoreNFC.framework */,
|
||||
65F693BF2578003600A45E76 /* CoreNFC.framework */,
|
||||
3A8F8EA924A4D31600BF206D /* GameKit.framework */,
|
||||
4C16DE0B1F89508700AA10DB /* JavaScriptCore.framework */,
|
||||
B24FC7FE1DE7195F00D694FF /* MessageUI.framework */,
|
||||
@@ -354,9 +333,9 @@
|
||||
CE4E31B21D8695250033ED64 /* Statusgo.framework */,
|
||||
8B9A886A2CB448B1ABA0EB62 /* libc++.tbd */,
|
||||
4E586E1B0E544F64AA9F5BD1 /* libz.tbd */,
|
||||
1EA4C352EDC255945D9357D4 /* libPods-Status-StatusIm.a */,
|
||||
B00E6B2D94C4B463D8EFF8B8 /* libPods-Status-StatusIm-StatusImTests.a */,
|
||||
9B9F8F780F889F228546DF60 /* libPods-Status-StatusImPR.a */,
|
||||
132CE3B093884B0FB239A0AB /* libPods-Status-StatusIm.a */,
|
||||
DB52D45D10528E6992A83A71 /* libPods-Status-StatusIm-StatusImTests.a */,
|
||||
5D4CB5416994C913628B8754 /* libPods-Status-StatusImPR.a */,
|
||||
);
|
||||
name = Frameworks;
|
||||
sourceTree = "<group>";
|
||||
@@ -488,10 +467,6 @@
|
||||
ProductGroup = 9EC0135D1E06FB1900155B5C /* Products */;
|
||||
ProjectRef = 9EC0135C1E06FB1900155B5C /* RCTWKWebView.xcodeproj */;
|
||||
},
|
||||
{
|
||||
ProductGroup = 9EF083391F3B538A00876A8F /* Products */;
|
||||
ProjectRef = 9EF083381F3B538A00876A8F /* ReactNativeConfig.xcodeproj */;
|
||||
},
|
||||
);
|
||||
projectRoot = "";
|
||||
targets = (
|
||||
@@ -517,13 +492,6 @@
|
||||
remoteRef = 9EC013781E06FB1900155B5C /* PBXContainerItemProxy */;
|
||||
sourceTree = BUILT_PRODUCTS_DIR;
|
||||
};
|
||||
9EF083611F3B538B00876A8F /* libReactNativeConfig.a */ = {
|
||||
isa = PBXReferenceProxy;
|
||||
fileType = archive.ar;
|
||||
path = libReactNativeConfig.a;
|
||||
remoteRef = 9EF083601F3B538B00876A8F /* PBXContainerItemProxy */;
|
||||
sourceTree = BUILT_PRODUCTS_DIR;
|
||||
};
|
||||
/* End PBXReferenceProxy section */
|
||||
|
||||
/* Begin PBXResourcesBuildPhase section */
|
||||
@@ -564,7 +532,6 @@
|
||||
3AAD2ACF24A3A60E0075D594 /* Inter-Italic.otf in Resources */,
|
||||
3AAD2AD024A3A60E0075D594 /* Inter-Medium.otf in Resources */,
|
||||
3AAD2AD124A3A60E0075D594 /* Inter-MediumItalic.otf in Resources */,
|
||||
3A6406FF24A3ADF90046ED37 /* Info.plist in Resources */,
|
||||
3AAD2AD224A3A60E0075D594 /* Inter-Regular.otf in Resources */,
|
||||
3AAD2AD324A3A60E0075D594 /* Inter-SemiBold.otf in Resources */,
|
||||
3AAD2AD424A3A60E0075D594 /* Inter-SemiBoldItalic.otf in Resources */,
|
||||
@@ -596,11 +563,13 @@
|
||||
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}/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}/TOCropViewControllerBundle.bundle",
|
||||
);
|
||||
runOnlyForDeploymentPostprocessing = 0;
|
||||
@@ -688,11 +657,13 @@
|
||||
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";
|
||||
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;
|
||||
@@ -730,11 +701,13 @@
|
||||
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}/React-Core/AccessibilityResources.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}/TOCropViewControllerBundle.bundle",
|
||||
);
|
||||
runOnlyForDeploymentPostprocessing = 0;
|
||||
@@ -763,6 +736,7 @@
|
||||
isa = PBXSourcesBuildPhase;
|
||||
buildActionMask = 2147483647;
|
||||
files = (
|
||||
65F6941A25780A4F00A45E76 /* Bridge.swift in Sources */,
|
||||
00E356F31AD99517003FC87E /* StatusImTests.m in Sources */,
|
||||
);
|
||||
runOnlyForDeploymentPostprocessing = 0;
|
||||
@@ -771,6 +745,7 @@
|
||||
isa = PBXSourcesBuildPhase;
|
||||
buildActionMask = 2147483647;
|
||||
files = (
|
||||
65F6941925780A4F00A45E76 /* Bridge.swift in Sources */,
|
||||
13B07FBC1A68108700A75B9A /* AppDelegate.m in Sources */,
|
||||
3A2626CF245C3F2200D5F94B /* Dummy.swift in Sources */,
|
||||
13B07FC11A68108700A75B9A /* main.m in Sources */,
|
||||
@@ -781,6 +756,7 @@
|
||||
isa = PBXSourcesBuildPhase;
|
||||
buildActionMask = 2147483647;
|
||||
files = (
|
||||
65F6941B25780A4F00A45E76 /* Bridge.swift in Sources */,
|
||||
3AAD2ABC24A3A60E0075D594 /* AppDelegate.m in Sources */,
|
||||
3AAD2ABD24A3A60E0075D594 /* Dummy.swift in Sources */,
|
||||
3AAD2ABE24A3A60E0075D594 /* main.m in Sources */,
|
||||
@@ -805,6 +781,7 @@
|
||||
ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES;
|
||||
BUNDLE_ID_SUFFIX = .debug;
|
||||
BUNDLE_LOADER = "$(TEST_HOST)";
|
||||
CLANG_ENABLE_MODULES = YES;
|
||||
CODE_SIGN_IDENTITY = "iPhone Developer";
|
||||
DEVELOPMENT_TEAM = DTX7Z4U3YA;
|
||||
FRAMEWORK_SEARCH_PATHS = (
|
||||
@@ -816,13 +793,16 @@
|
||||
"$(inherited)",
|
||||
);
|
||||
INFOPLIST_FILE = StatusImTests/Info.plist;
|
||||
IPHONEOS_DEPLOYMENT_TARGET = 8.2;
|
||||
IPHONEOS_DEPLOYMENT_TARGET = 11.0;
|
||||
LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks";
|
||||
LIBRARY_SEARCH_PATHS = "$(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;
|
||||
TEST_HOST = "$(BUILT_PRODUCTS_DIR)/StatusIm.app/StatusIm";
|
||||
};
|
||||
name = Debug;
|
||||
@@ -834,6 +814,7 @@
|
||||
ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES;
|
||||
BUNDLE_ID_SUFFIX = "";
|
||||
BUNDLE_LOADER = "$(TEST_HOST)";
|
||||
CLANG_ENABLE_MODULES = YES;
|
||||
CODE_SIGN_IDENTITY = "iPhone Distribution";
|
||||
COPY_PHASE_STRIP = NO;
|
||||
DEVELOPMENT_TEAM = DTX7Z4U3YA;
|
||||
@@ -842,13 +823,15 @@
|
||||
"$(inherited)",
|
||||
);
|
||||
INFOPLIST_FILE = StatusImTests/Info.plist;
|
||||
IPHONEOS_DEPLOYMENT_TARGET = 8.2;
|
||||
IPHONEOS_DEPLOYMENT_TARGET = 11.0;
|
||||
LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks";
|
||||
LIBRARY_SEARCH_PATHS = "$(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;
|
||||
TEST_HOST = "$(BUILT_PRODUCTS_DIR)/StatusIm.app/StatusIm";
|
||||
};
|
||||
name = Release;
|
||||
@@ -867,6 +850,9 @@
|
||||
CUSTOM_PRODUCT_NAME = "Status Debug";
|
||||
DEAD_CODE_STRIPPING = YES;
|
||||
DEVELOPMENT_TEAM = DTX7Z4U3YA;
|
||||
EXCLUDED_ARCHS = "";
|
||||
"EXCLUDED_ARCHS[sdk=iphoneos*]" = x86_64;
|
||||
"EXCLUDED_ARCHS[sdk=iphonesimulator*]" = arm64;
|
||||
FRAMEWORK_SEARCH_PATHS = (
|
||||
"$(PROJECT_DIR)/../modules/react-native-status/ios/RCTStatus",
|
||||
"$(inherited)",
|
||||
@@ -915,7 +901,8 @@
|
||||
SWIFT_OPTIMIZATION_LEVEL = "-Onone";
|
||||
SWIFT_VERSION = 5.0;
|
||||
TARGETED_DEVICE_FAMILY = 1;
|
||||
VALID_ARCHS = "arm64 armv7 armv7s";
|
||||
VALID_ARCHS = "x86_64 armv7 armv7s arm64";
|
||||
"VALID_ARCHS[sdk=iphonesimulator*]" = "armv7 armv7s x86_64 ";
|
||||
};
|
||||
name = Debug;
|
||||
};
|
||||
@@ -933,6 +920,7 @@
|
||||
CUSTOM_PRODUCT_NAME = Status;
|
||||
DEAD_CODE_STRIPPING = YES;
|
||||
DEVELOPMENT_TEAM = DTX7Z4U3YA;
|
||||
EXCLUDED_ARCHS = "";
|
||||
FRAMEWORK_SEARCH_PATHS = (
|
||||
"$(PROJECT_DIR)/../modules/react-native-status/ios/RCTStatus",
|
||||
"$(inherited)",
|
||||
@@ -1138,6 +1126,9 @@
|
||||
ENABLE_BITCODE = NO;
|
||||
ENABLE_STRICT_OBJC_MSGSEND = YES;
|
||||
ENABLE_TESTABILITY = YES;
|
||||
EXCLUDED_ARCHS = "";
|
||||
"EXCLUDED_ARCHS[sdk=iphoneos*]" = x86_64;
|
||||
"EXCLUDED_ARCHS[sdk=iphonesimulator*]" = arm64;
|
||||
GCC_C_LANGUAGE_STANDARD = gnu99;
|
||||
GCC_DYNAMIC_NO_PIC = NO;
|
||||
GCC_NO_COMMON_BLOCKS = YES;
|
||||
@@ -1168,15 +1159,17 @@
|
||||
"$(SRCROOT)/../node_modules/react-native-image-resizer/ios/RCTImageResizer",
|
||||
"$(SRCROOT)/../node_modules/react-native-splash-screen/ios/**",
|
||||
);
|
||||
IPHONEOS_DEPLOYMENT_TARGET = 8.0;
|
||||
IPHONEOS_DEPLOYMENT_TARGET = 11.0;
|
||||
LIBRARY_SEARCH_PATHS = (
|
||||
"\"$(TOOLCHAIN_DIR)/usr/lib/swift/$(PLATFORM_NAME)\"",
|
||||
"\"$(TOOLCHAIN_DIR)/usr/lib/swift-5.0/$(PLATFORM_NAME)\"",
|
||||
"\"$(inherited)\"",
|
||||
);
|
||||
MTL_ENABLE_DEBUG_INFO = YES;
|
||||
ONLY_ACTIVE_ARCH = YES;
|
||||
ONLY_ACTIVE_ARCH = NO;
|
||||
SDKROOT = iphoneos;
|
||||
VALID_ARCHS = "armv7 armv7s arm64";
|
||||
"VALID_ARCHS[sdk=iphonesimulator*]" = "armv7 armv7s x86_64";
|
||||
};
|
||||
name = Debug;
|
||||
};
|
||||
@@ -1217,6 +1210,7 @@
|
||||
ENABLE_BITCODE = NO;
|
||||
ENABLE_NS_ASSERTIONS = NO;
|
||||
ENABLE_STRICT_OBJC_MSGSEND = YES;
|
||||
EXCLUDED_ARCHS = "";
|
||||
GCC_C_LANGUAGE_STANDARD = gnu99;
|
||||
GCC_NO_COMMON_BLOCKS = YES;
|
||||
GCC_PRECOMPILE_PREFIX_HEADER = NO;
|
||||
@@ -1239,13 +1233,14 @@
|
||||
"$(SRCROOT)/../node_modules/react-native-image-resizer/ios/RCTImageResizer",
|
||||
"$(SRCROOT)/../node_modules/react-native-splash-screen/ios/**",
|
||||
);
|
||||
IPHONEOS_DEPLOYMENT_TARGET = 8.0;
|
||||
IPHONEOS_DEPLOYMENT_TARGET = 11.0;
|
||||
LIBRARY_SEARCH_PATHS = (
|
||||
"\"$(TOOLCHAIN_DIR)/usr/lib/swift/$(PLATFORM_NAME)\"",
|
||||
"\"$(TOOLCHAIN_DIR)/usr/lib/swift-5.0/$(PLATFORM_NAME)\"",
|
||||
"\"$(inherited)\"",
|
||||
);
|
||||
MTL_ENABLE_DEBUG_INFO = NO;
|
||||
ONLY_ACTIVE_ARCH = NO;
|
||||
SDKROOT = iphoneos;
|
||||
VALIDATE_PRODUCT = YES;
|
||||
VALID_ARCHS = "armv7 armv7s arm64";
|
||||
|
||||
@@ -9,8 +9,9 @@
|
||||
|
||||
#import <React/RCTBridgeDelegate.h>
|
||||
#import <UIKit/UIKit.h>
|
||||
#import <UserNotifications/UNUserNotificationCenter.h>
|
||||
|
||||
@interface AppDelegate : UIResponder <UIApplicationDelegate, RCTBridgeDelegate>
|
||||
@interface AppDelegate : UIResponder <UIApplicationDelegate, RCTBridgeDelegate, UNUserNotificationCenterDelegate>
|
||||
|
||||
@property (nonatomic, strong) UIWindow *window;
|
||||
|
||||
|
||||
@@ -20,6 +20,9 @@
|
||||
#import <React/RCTBundleURLProvider.h>
|
||||
#import <React/RCTRootView.h>
|
||||
|
||||
#import <UserNotifications/UserNotifications.h>
|
||||
#import <RNCPushNotificationIOS.h>
|
||||
|
||||
#if DEBUG
|
||||
#import <FlipperKit/FlipperClient.h>
|
||||
#import <FlipperKitLayoutPlugin/FlipperKitLayoutPlugin.h>
|
||||
@@ -88,6 +91,9 @@ static void InitializeFlipper(UIApplication *application) {
|
||||
[self.window makeKeyAndVisible];
|
||||
[RNSplashScreen show];
|
||||
|
||||
UNUserNotificationCenter *center = [UNUserNotificationCenter currentNotificationCenter];
|
||||
center.delegate = self;
|
||||
|
||||
return YES;
|
||||
}
|
||||
|
||||
@@ -137,4 +143,46 @@ static void InitializeFlipper(UIApplication *application) {
|
||||
}
|
||||
}
|
||||
|
||||
// Required to register for notifications
|
||||
- (void)application:(UIApplication *)application didRegisterUserNotificationSettings:(UIUserNotificationSettings *)notificationSettings
|
||||
{
|
||||
[RNCPushNotificationIOS didRegisterUserNotificationSettings:notificationSettings];
|
||||
}
|
||||
// Required for the register event.
|
||||
- (void)application:(UIApplication *)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken
|
||||
{
|
||||
[RNCPushNotificationIOS didRegisterForRemoteNotificationsWithDeviceToken:deviceToken];
|
||||
}
|
||||
// Required for the registrationError event.
|
||||
- (void)application:(UIApplication *)application didFailToRegisterForRemoteNotificationsWithError:(NSError *)error
|
||||
{
|
||||
[RNCPushNotificationIOS didFailToRegisterForRemoteNotificationsWithError:error];
|
||||
}
|
||||
// IOS 10+ Required for localNotification event
|
||||
- (void)userNotificationCenter:(UNUserNotificationCenter *)center
|
||||
didReceiveNotificationResponse:(UNNotificationResponse *)response
|
||||
withCompletionHandler:(void (^)(void))completionHandler
|
||||
{
|
||||
[RNCPushNotificationIOS didReceiveNotificationResponse:response];
|
||||
completionHandler();
|
||||
}
|
||||
// IOS 4-10 Required for the localNotification event.
|
||||
- (void)application:(UIApplication *)application didReceiveLocalNotification:(UILocalNotification *)notification
|
||||
{
|
||||
[RNCPushNotificationIOS didReceiveLocalNotification:notification];
|
||||
}
|
||||
// Manage notifications while app is in the foreground
|
||||
- (void)userNotificationCenter:(UNUserNotificationCenter *)center willPresentNotification:(UNNotification *)notification withCompletionHandler:(void (^)(UNNotificationPresentationOptions options))completionHandler
|
||||
{
|
||||
NSDictionary *userInfo = notification.request.content.userInfo;
|
||||
|
||||
NSString *notificationType = userInfo[@"notificationType"]; // check your notification type
|
||||
if (![notificationType isEqual: @"local-notification"]) { // we silence all notifications which are not local
|
||||
completionHandler(UNNotificationPresentationOptionNone);
|
||||
return;
|
||||
}
|
||||
|
||||
completionHandler(UNAuthorizationOptionSound | UNAuthorizationOptionAlert | UNAuthorizationOptionBadge);
|
||||
}
|
||||
|
||||
@end
|
||||
|
||||
@@ -1,42 +0,0 @@
|
||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<document type="com.apple.InterfaceBuilder3.CocoaTouch.XIB" version="3.0" toolsVersion="7702" systemVersion="14D136" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" launchScreen="YES" useTraitCollections="YES">
|
||||
<dependencies>
|
||||
<deployment identifier="iOS"/>
|
||||
<plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="7701"/>
|
||||
<capability name="Constraints with non-1.0 multipliers" minToolsVersion="5.1"/>
|
||||
</dependencies>
|
||||
<objects>
|
||||
<placeholder placeholderIdentifier="IBFilesOwner" id="-1" userLabel="File's Owner"/>
|
||||
<placeholder placeholderIdentifier="IBFirstResponder" id="-2" customClass="UIResponder"/>
|
||||
<view contentMode="scaleToFill" id="iN0-l3-epB">
|
||||
<rect key="frame" x="0.0" y="0.0" width="480" height="480"/>
|
||||
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
|
||||
<subviews>
|
||||
<label opaque="NO" clipsSubviews="YES" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Powered by React Native" textAlignment="center" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" minimumFontSize="9" translatesAutoresizingMaskIntoConstraints="NO" id="8ie-xW-0ye">
|
||||
<rect key="frame" x="20" y="439" width="441" height="21"/>
|
||||
<fontDescription key="fontDescription" type="system" pointSize="17"/>
|
||||
<color key="textColor" cocoaTouchSystemColor="darkTextColor"/>
|
||||
<nil key="highlightedColor"/>
|
||||
</label>
|
||||
<label opaque="NO" clipsSubviews="YES" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="StatusIm" textAlignment="center" lineBreakMode="middleTruncation" baselineAdjustment="alignBaselines" minimumFontSize="18" translatesAutoresizingMaskIntoConstraints="NO" id="kId-c2-rCX">
|
||||
<rect key="frame" x="20" y="140" width="441" height="43"/>
|
||||
<fontDescription key="fontDescription" type="boldSystem" pointSize="36"/>
|
||||
<color key="textColor" cocoaTouchSystemColor="darkTextColor"/>
|
||||
<nil key="highlightedColor"/>
|
||||
</label>
|
||||
</subviews>
|
||||
<color key="backgroundColor" white="1" alpha="1" colorSpace="custom" customColorSpace="calibratedWhite"/>
|
||||
<constraints>
|
||||
<constraint firstItem="kId-c2-rCX" firstAttribute="centerY" secondItem="iN0-l3-epB" secondAttribute="bottom" multiplier="1/3" constant="1" id="5cJ-9S-tgC"/>
|
||||
<constraint firstAttribute="centerX" secondItem="kId-c2-rCX" secondAttribute="centerX" id="Koa-jz-hwk"/>
|
||||
<constraint firstAttribute="bottom" secondItem="8ie-xW-0ye" secondAttribute="bottom" constant="20" id="Kzo-t9-V3l"/>
|
||||
<constraint firstItem="8ie-xW-0ye" firstAttribute="leading" secondItem="iN0-l3-epB" secondAttribute="leading" constant="20" symbolic="YES" id="MfP-vx-nX0"/>
|
||||
<constraint firstAttribute="centerX" secondItem="8ie-xW-0ye" secondAttribute="centerX" id="ZEH-qu-HZ9"/>
|
||||
<constraint firstItem="kId-c2-rCX" firstAttribute="leading" secondItem="iN0-l3-epB" secondAttribute="leading" constant="20" symbolic="YES" id="fvb-Df-36g"/>
|
||||
</constraints>
|
||||
<nil key="simulatedStatusBarMetrics"/>
|
||||
<freeformSimulatedSizeMetrics key="simulatedDestinationMetrics"/>
|
||||
<point key="canvasLocation" x="548" y="455"/>
|
||||
</view>
|
||||
</objects>
|
||||
</document>
|
||||
@@ -63,11 +63,6 @@
|
||||
<true/>
|
||||
<key>NSExceptionDomains</key>
|
||||
<dict>
|
||||
<key>api.status.im</key>
|
||||
<dict>
|
||||
<key>NSTemporaryExceptionAllowsInsecureHTTPLoads</key>
|
||||
<true/>
|
||||
</dict>
|
||||
<key>localhost</key>
|
||||
<dict>
|
||||
<key>NSTemporaryExceptionAllowsInsecureHTTPLoads</key>
|
||||
@@ -132,5 +127,12 @@
|
||||
</array>
|
||||
<key>UIViewControllerBasedStatusBarAppearance</key>
|
||||
<false/>
|
||||
<key>com.apple.developer.nfc.readersession.iso7816.select-identifiers</key>
|
||||
<array>
|
||||
<string>A00000080400010101</string>
|
||||
<string>A00000080400010301</string>
|
||||
</array>
|
||||
<key>NFCReaderUsageDescription</key>
|
||||
<string>Enable Keycard</string>
|
||||
</dict>
|
||||
</plist>
|
||||
|
||||
@@ -0,0 +1,58 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<document type="com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB" version="3.0" toolsVersion="15702" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" launchScreen="YES" useTraitCollections="YES" useSafeAreas="YES" colorMatched="YES" initialViewController="01J-lp-oVM">
|
||||
<device id="retina4_7" orientation="portrait" appearance="light"/>
|
||||
<dependencies>
|
||||
<deployment identifier="iOS"/>
|
||||
<plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="15704"/>
|
||||
<capability name="Safe area layout guides" minToolsVersion="9.0"/>
|
||||
<capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/>
|
||||
</dependencies>
|
||||
<scenes>
|
||||
<!--View Controller-->
|
||||
<scene sceneID="EHf-IW-A2E">
|
||||
<objects>
|
||||
<viewController id="01J-lp-oVM" sceneMemberID="viewController">
|
||||
<view key="view" contentMode="scaleToFill" id="Ze5-6b-2t3">
|
||||
<rect key="frame" x="0.0" y="0.0" width="375" height="667"/>
|
||||
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
|
||||
<subviews>
|
||||
<label opaque="NO" clipsSubviews="YES" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="" textAlignment="center" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" minimumFontSize="9" translatesAutoresizingMaskIntoConstraints="NO" id="obG-Y5-kRd">
|
||||
<rect key="frame" x="0.0" y="647" width="375" height="0.0"/>
|
||||
<fontDescription key="fontDescription" type="system" pointSize="17"/>
|
||||
<color key="textColor" red="0.0" green="0.0" blue="0.0" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
|
||||
<nil key="highlightedColor"/>
|
||||
</label>
|
||||
<label opaque="NO" clipsSubviews="YES" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="StatusIm" textAlignment="center" lineBreakMode="middleTruncation" baselineAdjustment="alignBaselines" minimumFontSize="18" translatesAutoresizingMaskIntoConstraints="NO" id="GJd-Yh-RWb">
|
||||
<rect key="frame" x="0.0" y="202" width="375" height="43"/>
|
||||
<fontDescription key="fontDescription" type="boldSystem" pointSize="36"/>
|
||||
<color key="textColor" red="0.0" green="0.0" blue="0.0" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
|
||||
<nil key="highlightedColor"/>
|
||||
</label>
|
||||
<label opaque="NO" clipsSubviews="YES" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Powered by React Native" textAlignment="center" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" minimumFontSize="9" translatesAutoresizingMaskIntoConstraints="NO" id="MN2-I3-ftu">
|
||||
<rect key="frame" x="0.0" y="626" width="375" height="21"/>
|
||||
<fontDescription key="fontDescription" type="system" pointSize="17"/>
|
||||
<color key="textColor" cocoaTouchSystemColor="darkTextColor"/>
|
||||
<nil key="highlightedColor"/>
|
||||
</label>
|
||||
</subviews>
|
||||
<color key="backgroundColor" red="1" green="1" blue="1" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
|
||||
<constraints>
|
||||
<constraint firstItem="Bcu-3y-fUS" firstAttribute="centerX" secondItem="obG-Y5-kRd" secondAttribute="centerX" id="5cz-MP-9tL"/>
|
||||
<constraint firstItem="Bcu-3y-fUS" firstAttribute="bottom" secondItem="MN2-I3-ftu" secondAttribute="bottom" constant="20" id="OZV-Vh-mqD"/>
|
||||
<constraint firstItem="Bcu-3y-fUS" firstAttribute="centerX" secondItem="GJd-Yh-RWb" secondAttribute="centerX" id="Q3B-4B-g5h"/>
|
||||
<constraint firstItem="obG-Y5-kRd" firstAttribute="leading" secondItem="Bcu-3y-fUS" secondAttribute="leading" symbolic="YES" id="SfN-ll-jLj"/>
|
||||
<constraint firstAttribute="bottom" secondItem="obG-Y5-kRd" secondAttribute="bottom" constant="20" id="Y44-ml-fuU"/>
|
||||
<constraint firstItem="MN2-I3-ftu" firstAttribute="centerX" secondItem="Bcu-3y-fUS" secondAttribute="centerX" id="akx-eg-2ui"/>
|
||||
<constraint firstItem="MN2-I3-ftu" firstAttribute="leading" secondItem="Bcu-3y-fUS" secondAttribute="leading" id="i1E-0Y-4RG"/>
|
||||
<constraint firstItem="GJd-Yh-RWb" firstAttribute="centerY" secondItem="Ze5-6b-2t3" secondAttribute="bottom" multiplier="1/3" constant="1" id="moa-c2-u7t"/>
|
||||
<constraint firstItem="GJd-Yh-RWb" firstAttribute="leading" secondItem="Bcu-3y-fUS" secondAttribute="leading" symbolic="YES" id="x7j-FC-K8j"/>
|
||||
</constraints>
|
||||
<viewLayoutGuide key="safeArea" id="Bcu-3y-fUS"/>
|
||||
</view>
|
||||
</viewController>
|
||||
<placeholder placeholderIdentifier="IBFirstResponder" id="iYj-Kq-Ea1" userLabel="First Responder" sceneMemberID="firstResponder"/>
|
||||
</objects>
|
||||
<point key="canvasLocation" x="52.173913043478265" y="375"/>
|
||||
</scene>
|
||||
</scenes>
|
||||
</document>
|
||||
@@ -2,6 +2,11 @@
|
||||
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
|
||||
<plist version="1.0">
|
||||
<dict>
|
||||
<key>com.apple.developer.nfc.readersession.formats</key>
|
||||
<array>
|
||||
<string>NDEF</string>
|
||||
<string>TAG</string>
|
||||
</array>
|
||||
<key>aps-environment</key>
|
||||
<string>development</string>
|
||||
<key>com.apple.developer.associated-domains</key>
|
||||
|
||||
@@ -133,5 +133,12 @@
|
||||
</array>
|
||||
<key>UIViewControllerBasedStatusBarAppearance</key>
|
||||
<false/>
|
||||
<key>com.apple.developer.nfc.readersession.iso7816.select-identifiers</key>
|
||||
<array>
|
||||
<string>A00000080400010101</string>
|
||||
<string>A00000080400010301</string>
|
||||
</array>
|
||||
<key>NFCReaderUsageDescription</key>
|
||||
<string>Enable Keycard</string>
|
||||
</dict>
|
||||
</plist>
|
||||
|
||||
@@ -2,6 +2,11 @@
|
||||
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
|
||||
<plist version="1.0">
|
||||
<dict>
|
||||
<key>com.apple.developer.nfc.readersession.formats</key>
|
||||
<array>
|
||||
<string>NDEF</string>
|
||||
<string>TAG</string>
|
||||
</array>
|
||||
<key>aps-environment</key>
|
||||
<string>development</string>
|
||||
<key>com.apple.developer.associated-domains</key>
|
||||
|
||||
@@ -0,0 +1,4 @@
|
||||
//
|
||||
// Use this file to import your target's public headers that you would like to expose to Swift.
|
||||
//
|
||||
|
||||
@@ -20,5 +20,12 @@
|
||||
<string>????</string>
|
||||
<key>CFBundleVersion</key>
|
||||
<string>1</string>
|
||||
<key>com.apple.developer.nfc.readersession.iso7816.select-identifiers</key>
|
||||
<array>
|
||||
<string>A00000080400010101</string>
|
||||
<string>A00000080400010301</string>
|
||||
</array>
|
||||
<key>NFCReaderUsageDescription</key>
|
||||
<string>Enable Keycard</string>
|
||||
</dict>
|
||||
</plist>
|
||||
|
||||
+20
@@ -0,0 +1,20 @@
|
||||
package im.status.ethereum.module;
|
||||
|
||||
import android.content.Intent;
|
||||
import android.os.Bundle;
|
||||
import com.facebook.react.HeadlessJsTaskService;
|
||||
import com.facebook.react.bridge.Arguments;
|
||||
import com.facebook.react.jstasks.HeadlessJsTaskConfig;
|
||||
import javax.annotation.Nullable;
|
||||
|
||||
public class LocalNotificationsService extends HeadlessJsTaskService {
|
||||
|
||||
@Override
|
||||
protected @Nullable HeadlessJsTaskConfig getTaskConfig(Intent intent) {
|
||||
Bundle extras = intent.getExtras();
|
||||
if (extras != null) {
|
||||
return new HeadlessJsTaskConfig("LocalNotifications", Arguments.fromBundle(extras), 60000, true);
|
||||
}
|
||||
return null;
|
||||
}
|
||||
}
|
||||
+105
-35
@@ -7,8 +7,10 @@ import android.content.DialogInterface;
|
||||
import android.content.Intent;
|
||||
import android.content.SharedPreferences;
|
||||
import android.net.Uri;
|
||||
import android.os.Bundle;
|
||||
import android.os.Build;
|
||||
import android.os.Environment;
|
||||
|
||||
import android.preference.PreferenceManager;
|
||||
|
||||
import androidx.core.content.FileProvider;
|
||||
@@ -16,9 +18,15 @@ import androidx.core.content.FileProvider;
|
||||
import android.util.Log;
|
||||
import android.view.Window;
|
||||
import android.view.WindowManager;
|
||||
import android.webkit.WebView;
|
||||
import android.webkit.CookieManager;
|
||||
import android.webkit.CookieSyncManager;
|
||||
import android.webkit.WebStorage;
|
||||
import android.content.Context;
|
||||
import android.view.View;
|
||||
import android.widget.TextView;
|
||||
import android.widget.EditText;
|
||||
import android.view.inputmethod.InputMethodManager;
|
||||
|
||||
import com.facebook.react.bridge.Arguments;
|
||||
import com.facebook.react.bridge.Callback;
|
||||
@@ -30,6 +38,9 @@ import com.facebook.react.bridge.ReadableMap;
|
||||
import com.facebook.react.bridge.ReadableArray;
|
||||
import com.facebook.react.bridge.WritableMap;
|
||||
import com.facebook.react.modules.core.DeviceEventManagerModule;
|
||||
import com.facebook.react.uimanager.UIManagerModule;
|
||||
import com.facebook.react.uimanager.UIBlock;
|
||||
import com.facebook.react.uimanager.NativeViewHierarchyManager;
|
||||
|
||||
import statusgo.SignalHandler;
|
||||
import statusgo.Statusgo;
|
||||
@@ -64,11 +75,11 @@ class StatusModule extends ReactContextBaseJavaModule implements LifecycleEventL
|
||||
private static final String TAG = "StatusModule";
|
||||
private static final String logsZipFileName = "Status-debug-logs.zip";
|
||||
private static final String gethLogFileName = "geth.log";
|
||||
private static final String exportDBFileName = "export.db";
|
||||
private static final String statusLogFileName = "Status.log";
|
||||
private static StatusModule module;
|
||||
private ReactApplicationContext reactContext;
|
||||
private boolean rootedDevice;
|
||||
private NewMessageSignalHandler newMessageSignalHandler;
|
||||
private boolean background;
|
||||
|
||||
StatusModule(ReactApplicationContext reactContext, boolean rootedDevice) {
|
||||
@@ -100,19 +111,6 @@ class StatusModule extends ReactContextBaseJavaModule implements LifecycleEventL
|
||||
Log.d(TAG, "******************* ON HOST DESTROY *************************");
|
||||
}
|
||||
|
||||
@ReactMethod
|
||||
public void enableNotifications() {
|
||||
this.newMessageSignalHandler = new NewMessageSignalHandler(reactContext);
|
||||
}
|
||||
|
||||
@ReactMethod
|
||||
public void disableNotifications() {
|
||||
if (newMessageSignalHandler != null) {
|
||||
newMessageSignalHandler.stop();
|
||||
newMessageSignalHandler = null;
|
||||
}
|
||||
}
|
||||
|
||||
private boolean checkAvailability() {
|
||||
// We wait at least 10s for getCurrentActivity to return a value,
|
||||
// otherwise we give up
|
||||
@@ -141,23 +139,10 @@ class StatusModule extends ReactContextBaseJavaModule implements LifecycleEventL
|
||||
}
|
||||
|
||||
public void handleSignal(final String jsonEventString) {
|
||||
try {
|
||||
final JSONObject jsonEvent = new JSONObject(jsonEventString);
|
||||
String eventType = jsonEvent.getString("type");
|
||||
Log.d(TAG, "Signal event: " + jsonEventString);
|
||||
// NOTE: the newMessageSignalHandler is only instanciated if the user
|
||||
// enabled notifications in the app
|
||||
if (this.background && newMessageSignalHandler != null) {
|
||||
if (eventType.equals("messages.new")) {
|
||||
newMessageSignalHandler.handleNewMessageSignal(jsonEvent);
|
||||
}
|
||||
}
|
||||
WritableMap params = Arguments.createMap();
|
||||
params.putString("jsonEvent", jsonEventString);
|
||||
this.getReactApplicationContext().getJSModule(DeviceEventManagerModule.RCTDeviceEventEmitter.class).emit("gethEvent", params);
|
||||
} catch (JSONException e) {
|
||||
Log.e(TAG, "JSON conversion failed: " + e.getMessage());
|
||||
}
|
||||
Log.d(TAG, "Signal event");
|
||||
WritableMap params = Arguments.createMap();
|
||||
params.putString("jsonEvent", jsonEventString);
|
||||
this.getReactApplicationContext().getJSModule(DeviceEventManagerModule.RCTDeviceEventEmitter.class).emit("gethEvent", params);
|
||||
}
|
||||
|
||||
private File getLogsFile() {
|
||||
@@ -170,6 +155,16 @@ class StatusModule extends ReactContextBaseJavaModule implements LifecycleEventL
|
||||
return logFile;
|
||||
}
|
||||
|
||||
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;
|
||||
}
|
||||
|
||||
private File prepareLogsFile(final Context context) {
|
||||
final File logFile = getLogsFile();
|
||||
|
||||
@@ -375,10 +370,39 @@ class StatusModule extends ReactContextBaseJavaModule implements LifecycleEventL
|
||||
}
|
||||
}
|
||||
|
||||
@ReactMethod
|
||||
public void exportUnencryptedDatabase(final String accountData, final String password) {
|
||||
Log.d(TAG, "login");
|
||||
|
||||
final File newFile = getExportDBFile();
|
||||
|
||||
this.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.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);
|
||||
}
|
||||
}
|
||||
|
||||
@ReactMethod
|
||||
public void logout() {
|
||||
Log.d(TAG, "logout");
|
||||
disableNotifications();
|
||||
String result = Statusgo.logout();
|
||||
if (result.startsWith("{\"error\":\"\"")) {
|
||||
Log.d(TAG, "Logout result: " + result);
|
||||
@@ -1042,6 +1066,22 @@ class StatusModule extends ReactContextBaseJavaModule implements LifecycleEventL
|
||||
}
|
||||
}
|
||||
|
||||
@ReactMethod
|
||||
public void toggleWebviewDebug(final boolean val) {
|
||||
Log.d(TAG, "toggleWebviewDebug");
|
||||
final Activity activity = getCurrentActivity();
|
||||
if (activity == null) {
|
||||
return;
|
||||
}
|
||||
|
||||
activity.runOnUiThread(new Runnable() {
|
||||
@Override
|
||||
public void run() {
|
||||
WebView.setWebContentsDebuggingEnabled(val);
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
@ReactMethod
|
||||
public void clearStorageAPIs() {
|
||||
Log.d(TAG, "clearStorageAPIs");
|
||||
@@ -1106,9 +1146,21 @@ class StatusModule extends ReactContextBaseJavaModule implements LifecycleEventL
|
||||
}
|
||||
|
||||
@ReactMethod
|
||||
public void startWallet() {
|
||||
public void startWallet(final boolean watchNewBlocks) {
|
||||
Log.d(TAG, "StartWallet");
|
||||
Statusgo.startWallet();
|
||||
Statusgo.startWallet(watchNewBlocks);
|
||||
}
|
||||
|
||||
@ReactMethod
|
||||
public void stopLocalNotifications() {
|
||||
Log.d(TAG, "stopLocalNotifications");
|
||||
Statusgo.stopLocalNotifications();
|
||||
}
|
||||
|
||||
@ReactMethod
|
||||
public void startLocalNotifications() {
|
||||
Log.d(TAG, "startLocalNotifications");
|
||||
Statusgo.startLocalNotifications();
|
||||
}
|
||||
|
||||
@ReactMethod
|
||||
@@ -1298,7 +1350,6 @@ class StatusModule extends ReactContextBaseJavaModule implements LifecycleEventL
|
||||
StatusThreadPoolExecutor.getInstance().execute(r);
|
||||
}
|
||||
|
||||
|
||||
@ReactMethod
|
||||
public void getNodesFromContract(final String rpcEndpoint, final String contractAddress, final Callback callback) {
|
||||
Log.d(TAG, "getNodesFromContract");
|
||||
@@ -1386,5 +1437,24 @@ class StatusModule extends ReactContextBaseJavaModule implements LifecycleEventL
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
@ReactMethod
|
||||
public void resetKeyboardInputCursor(final int reactTagToReset, final int selection) {
|
||||
UIManagerModule uiManager = getReactApplicationContext().getNativeModule(UIManagerModule.class);
|
||||
uiManager.addUIBlock(new UIBlock() {
|
||||
@Override
|
||||
public void execute(NativeViewHierarchyManager nativeViewHierarchyManager) {
|
||||
InputMethodManager imm = (InputMethodManager) getReactApplicationContext().getBaseContext().getSystemService(Context.INPUT_METHOD_SERVICE);
|
||||
if (imm != null) {
|
||||
View viewToReset = nativeViewHierarchyManager.resolveView(reactTagToReset);
|
||||
imm.restartInput(viewToReset);
|
||||
try {
|
||||
EditText textView = (EditText) viewToReset;
|
||||
textView.setSelection(selection);
|
||||
} catch (Exception e) {}
|
||||
}
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
+2
-1
@@ -1,4 +1,4 @@
|
||||
package im.status.ethereum.module;
|
||||
package im.status.ethereum.pushnotifications;
|
||||
|
||||
import android.content.Context;
|
||||
import android.content.Intent;
|
||||
@@ -13,6 +13,7 @@ import androidx.core.app.NotificationCompat;
|
||||
import androidx.core.app.NotificationManagerCompat;
|
||||
|
||||
import android.os.Build;
|
||||
import im.status.ethereum.module.R;
|
||||
|
||||
public class ForegroundService extends Service {
|
||||
private static final String CHANNEL_ID = "status-service";
|
||||
+58
-91
@@ -1,4 +1,4 @@
|
||||
package im.status.ethereum.module;
|
||||
package im.status.ethereum.pushnotifications;
|
||||
|
||||
import android.content.Context;
|
||||
import android.content.ContentResolver;
|
||||
@@ -33,10 +33,12 @@ import androidx.core.app.NotificationManagerCompat;
|
||||
import androidx.core.app.NotificationCompat;
|
||||
|
||||
import android.os.Build;
|
||||
import android.os.Bundle;
|
||||
import android.net.Uri;
|
||||
import android.media.AudioAttributes;
|
||||
|
||||
import android.util.Log;
|
||||
import im.status.ethereum.module.R;
|
||||
|
||||
public class NewMessageSignalHandler {
|
||||
//NOTE: currently we only show notifications for 1-1 chats, in the future we
|
||||
@@ -57,6 +59,8 @@ public class NewMessageSignalHandler {
|
||||
private Context context;
|
||||
private Intent serviceIntent;
|
||||
private Boolean shouldRefreshNotifications;
|
||||
private int ONE_TO_ONE_CHAT_TYPE = 1;
|
||||
private int PRIVATE_GROUP_CHAT_TYPE = 3;
|
||||
|
||||
//NOTE: we use a dynamically created BroadcastReceiver here so that we can capture
|
||||
//intents from notifications and act on them. For instance when tapping/dismissing
|
||||
@@ -68,8 +72,9 @@ public class NewMessageSignalHandler {
|
||||
if (intent.getAction() == ACTION_TAP_NOTIFICATION ||
|
||||
intent.getAction() == ACTION_DELETE_NOTIFICATION) {
|
||||
String chatId = intent.getExtras().getString("im.status.ethereum.chatId");
|
||||
int chatType = intent.getExtras().getInt("im.status.ethereum.chatType");
|
||||
if (intent.getAction() == ACTION_TAP_NOTIFICATION) {
|
||||
context.startActivity(getOpenAppIntent(chatId));
|
||||
context.startActivity(getOpenAppIntent(chatId, chatType));
|
||||
}
|
||||
removeChat(chatId);
|
||||
// clean up the group notifications when there is no
|
||||
@@ -122,9 +127,15 @@ public class NewMessageSignalHandler {
|
||||
//NOTE: this method takes a chatId and returns an intent that will open the app in that chat
|
||||
//Once we support other kind of notifications we will need to adapt it. The simplest method
|
||||
//is probably to pass the universal link as param instead of the chatId.
|
||||
public Intent getOpenAppIntent(String chatId) {
|
||||
public Intent getOpenAppIntent(String chatId, int chatType) {
|
||||
Intent intent = getOpenAppIntent();
|
||||
intent.setData(Uri.parse("status-im://p/" + chatId));
|
||||
String path = "";
|
||||
if (chatType == ONE_TO_ONE_CHAT_TYPE) {
|
||||
path = "p/";
|
||||
} else if (chatType == PRIVATE_GROUP_CHAT_TYPE) {
|
||||
path = "g/args?a2=";
|
||||
}
|
||||
intent.setData(Uri.parse("status-im://" + path + chatId));
|
||||
return intent;
|
||||
}
|
||||
|
||||
@@ -175,15 +186,17 @@ public class NewMessageSignalHandler {
|
||||
this.chats.remove(chatId);
|
||||
}
|
||||
|
||||
private PendingIntent createOnDismissedIntent(Context context, int notificationId, String chatId) {
|
||||
private PendingIntent createOnDismissedIntent(Context context, int notificationId, String chatId, int chatType) {
|
||||
Intent intent = new Intent(ACTION_DELETE_NOTIFICATION);
|
||||
intent.putExtra("im.status.ethereum.chatId", chatId);
|
||||
intent.putExtra("im.status.ethereum.chatType", chatType);
|
||||
return PendingIntent.getBroadcast(context.getApplicationContext(), notificationId, intent, PendingIntent.FLAG_CANCEL_CURRENT);
|
||||
}
|
||||
|
||||
private PendingIntent createOnTapIntent(Context context, int notificationId, String chatId) {
|
||||
private PendingIntent createOnTapIntent(Context context, int notificationId, String chatId, int chatType) {
|
||||
Intent intent = new Intent(ACTION_TAP_NOTIFICATION);
|
||||
intent.putExtra("im.status.ethereum.chatId", chatId);
|
||||
intent.putExtra("im.status.ethereum.chatType", chatType);
|
||||
return PendingIntent.getBroadcast(context.getApplicationContext(), notificationId, intent, PendingIntent.FLAG_CANCEL_CURRENT);
|
||||
}
|
||||
|
||||
@@ -203,8 +216,8 @@ public class NewMessageSignalHandler {
|
||||
.setStyle(messagingStyle)
|
||||
.setGroup(GROUP_STATUS_MESSAGES)
|
||||
.setGroupSummary(true)
|
||||
.setContentIntent(createOnTapIntent(context, notificationId, chat.getId()))
|
||||
.setDeleteIntent(createOnDismissedIntent(context, notificationId, chat.getId()))
|
||||
.setContentIntent(createOnTapIntent(context, notificationId, chat.getId(), chat.getType()))
|
||||
.setDeleteIntent(createOnDismissedIntent(context, notificationId, chat.getId(), chat.getType()))
|
||||
.setNumber(messages.size())
|
||||
.setAutoCancel(true);
|
||||
if (Build.VERSION.SDK_INT >= 21) {
|
||||
@@ -224,31 +237,13 @@ public class NewMessageSignalHandler {
|
||||
}
|
||||
}
|
||||
|
||||
void handleNewMessageSignal(JSONObject newMessageSignal) {
|
||||
try {
|
||||
JSONArray chatsNewMessagesData = newMessageSignal.getJSONObject("event").getJSONArray("chats");
|
||||
for (int i = 0; i < chatsNewMessagesData.length(); i++) {
|
||||
try {
|
||||
upsertChat(chatsNewMessagesData.getJSONObject(i));
|
||||
} catch (JSONException e) {
|
||||
Log.e(TAG, "JSON conversion failed: " + e.getMessage());
|
||||
}
|
||||
}
|
||||
JSONArray messagesNewMessagesData = newMessageSignal.getJSONObject("event").getJSONArray("messages");
|
||||
for (int i = 0; i < messagesNewMessagesData.length(); i++) {
|
||||
try {
|
||||
upsertMessage(messagesNewMessagesData.getJSONObject(i));
|
||||
} catch (JSONException e) {
|
||||
Log.e(TAG, "JSON conversion failed: " + e.getMessage());
|
||||
}
|
||||
}
|
||||
void handleNewMessage (Bundle data) {
|
||||
upsertChat(data);
|
||||
upsertMessage(data);
|
||||
|
||||
if(shouldRefreshNotifications) {
|
||||
refreshNotifications();
|
||||
shouldRefreshNotifications = false;
|
||||
}
|
||||
} catch (JSONException e) {
|
||||
Log.e(TAG, "JSON conversion failed: " + e.getMessage());
|
||||
if(shouldRefreshNotifications) {
|
||||
refreshNotifications();
|
||||
shouldRefreshNotifications = false;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -268,69 +263,37 @@ public class NewMessageSignalHandler {
|
||||
return person;
|
||||
}
|
||||
|
||||
private void upsertChat(JSONObject chatData) {
|
||||
try {
|
||||
// NOTE: this is an exemple of chatData
|
||||
// {"chatId":"contact-discovery-3622","filterId":"c0239d63f830e8b25f4bf7183c8d207f355a925b89514a17068cae4898e7f193",
|
||||
// "symKeyId":"","oneToOne":true,"identity":"046599511623d7385b926ce709ac57d518dac10d451a81f75cd32c7fb4b1c...",
|
||||
// "topic":"0xc446561b","discovery":false,"negotiated":false,"listen":true}
|
||||
int oneToOne = chatData.getInt("chatType");
|
||||
// NOTE: for now we only notify one to one chats
|
||||
// TODO: also notifiy on mentions, keywords and group chats
|
||||
// TODO: one would have to pass the ens name and keywords to notify on when instanciating the class as well
|
||||
// as have a method to add new ones after the handler is instanciated
|
||||
if (oneToOne == 1) {
|
||||
//JSONArray messagesData = chatNewMessagesData.getJSONArray("messages");
|
||||
private void upsertChat(Bundle data) {
|
||||
String id = data.getString("chatId");
|
||||
int type = Integer.parseInt(data.getString("chatType"));
|
||||
StatusChat chat = chats.get(id);
|
||||
|
||||
// there is no proper id for oneToOne chat in chatData so we peek into first message sig
|
||||
// TODO: won't work for sync becaus it could be our own message
|
||||
String id = chatData.getString("id");
|
||||
StatusChat chat = chats.get(id);
|
||||
// if the chat was not already there, we create one
|
||||
if (chat == null) {
|
||||
chat = new StatusChat(id, type);
|
||||
}
|
||||
|
||||
chats.put(id, chat);
|
||||
}
|
||||
|
||||
// if the chat was not already there, we create one
|
||||
if (chat == null) {
|
||||
chat = new StatusChat(id, true);
|
||||
}
|
||||
private void upsertMessage(Bundle data) {
|
||||
String chatId = data.getString("chatId");
|
||||
StatusChat chat = chats.get(chatId);
|
||||
if (chat == null) {
|
||||
return;
|
||||
}
|
||||
|
||||
chats.put(id, chat);
|
||||
}
|
||||
} catch (JSONException e) {
|
||||
Log.e(TAG, "JSON conversion failed: " + e.getMessage());
|
||||
StatusMessage message = createMessage(data);
|
||||
if (message != null) {
|
||||
chat.appendMessage(message);
|
||||
chats.put(chatId, chat);
|
||||
shouldRefreshNotifications = true;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
private void upsertMessage(JSONObject messageData) {
|
||||
try {
|
||||
String chatId = messageData.getString("localChatId");
|
||||
StatusChat chat = chats.get(chatId);
|
||||
if (chat == null) {
|
||||
return;
|
||||
}
|
||||
|
||||
StatusMessage message = createMessage(messageData);
|
||||
if (message != null) {
|
||||
chat.appendMessage(message);
|
||||
chats.put(chatId, chat);
|
||||
shouldRefreshNotifications = true;
|
||||
}
|
||||
|
||||
}
|
||||
catch (JSONException e) {
|
||||
Log.e(TAG, "JSON conversion failed: " + e.getMessage());
|
||||
}
|
||||
}
|
||||
|
||||
private StatusMessage createMessage(JSONObject messageData) {
|
||||
try {
|
||||
Person author = getPerson(messageData.getString("from"), messageData.getString("identicon"), messageData.getString("alias"));
|
||||
return new StatusMessage(author, messageData.getLong("whisperTimestamp"), messageData.getString("text"));
|
||||
} catch (JSONException e) {
|
||||
Log.e(TAG, "JSON conversion failed: " + e.getMessage());
|
||||
}
|
||||
return null;
|
||||
private StatusMessage createMessage(Bundle data) {
|
||||
Person author = getPerson(data.getString("from"), data.getString("identicon"), data.getString("alias"));
|
||||
return new StatusMessage(author, data.getLong("whisperTimestamp"), data.getString("text"));
|
||||
}
|
||||
}
|
||||
|
||||
@@ -338,11 +301,11 @@ class StatusChat {
|
||||
private ArrayList<StatusMessage> messages;
|
||||
private String id;
|
||||
private String name;
|
||||
private Boolean oneToOne;
|
||||
private int type;
|
||||
|
||||
StatusChat(String id, Boolean oneToOne) {
|
||||
StatusChat(String id, int type) {
|
||||
this.id = id;
|
||||
this.oneToOne = oneToOne;
|
||||
this.type = type;
|
||||
this.messages = new ArrayList<StatusMessage>();
|
||||
this.name = name;
|
||||
}
|
||||
@@ -351,6 +314,10 @@ class StatusChat {
|
||||
return id;
|
||||
}
|
||||
|
||||
public int getType() {
|
||||
return this.type;
|
||||
}
|
||||
|
||||
public String getName() {
|
||||
|
||||
//TODO this should be improved as it would rename the chat
|
||||
+136
@@ -0,0 +1,136 @@
|
||||
package im.status.ethereum.pushnotifications;
|
||||
|
||||
import android.app.Activity;
|
||||
import android.app.Application;
|
||||
import android.app.NotificationManager;
|
||||
import android.content.BroadcastReceiver;
|
||||
import android.content.Context;
|
||||
import android.content.Intent;
|
||||
import android.content.IntentFilter;
|
||||
import android.os.Bundle;
|
||||
|
||||
import androidx.annotation.NonNull;
|
||||
import androidx.core.app.NotificationManagerCompat;
|
||||
|
||||
import java.security.SecureRandom;
|
||||
|
||||
import com.facebook.react.bridge.ActivityEventListener;
|
||||
import com.facebook.react.bridge.Arguments;
|
||||
import com.facebook.react.bridge.Callback;
|
||||
import com.facebook.react.bridge.Promise;
|
||||
import com.facebook.react.bridge.ReactApplicationContext;
|
||||
import com.facebook.react.bridge.ReactContext;
|
||||
import com.facebook.react.bridge.ReactContextBaseJavaModule;
|
||||
import com.facebook.react.bridge.ReactMethod;
|
||||
import com.facebook.react.bridge.ReadableArray;
|
||||
import com.facebook.react.bridge.WritableArray;
|
||||
import com.facebook.react.bridge.ReadableMap;
|
||||
import com.facebook.react.bridge.WritableMap;
|
||||
import android.util.Log;
|
||||
|
||||
import im.status.ethereum.pushnotifications.PushNotificationJsDelivery;
|
||||
|
||||
public class PushNotification extends ReactContextBaseJavaModule implements ActivityEventListener {
|
||||
public static final String LOG_TAG = "PushNotification";
|
||||
|
||||
private final SecureRandom mRandomNumberGenerator = new SecureRandom();
|
||||
private PushNotificationHelper pushNotificationHelper;
|
||||
private PushNotificationJsDelivery delivery;
|
||||
private ReactApplicationContext reactContext;
|
||||
private NewMessageSignalHandler newMessageSignalHandler;
|
||||
|
||||
public PushNotification(ReactApplicationContext reactContext) {
|
||||
super(reactContext);
|
||||
this.reactContext = reactContext;
|
||||
reactContext.addActivityEventListener(this);
|
||||
Application applicationContext = (Application) reactContext.getApplicationContext();
|
||||
|
||||
pushNotificationHelper = new PushNotificationHelper(applicationContext);
|
||||
|
||||
delivery = new PushNotificationJsDelivery(reactContext);
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getName() {
|
||||
return "PushNotification";
|
||||
}
|
||||
|
||||
// removed @Override temporarily just to get it working on different versions of RN
|
||||
public void onActivityResult(Activity activity, int requestCode, int resultCode, Intent data) {
|
||||
onActivityResult(requestCode, resultCode, data);
|
||||
}
|
||||
|
||||
// removed @Override temporarily just to get it working on different versions of RN
|
||||
public void onActivityResult(int requestCode, int resultCode, Intent data) {
|
||||
// Ignored, required to implement ActivityEventListener for RN 0.33
|
||||
}
|
||||
|
||||
private Bundle getBundleFromIntent(Intent intent) {
|
||||
Bundle bundle = null;
|
||||
if (intent.hasExtra("notification")) {
|
||||
bundle = intent.getBundleExtra("notification");
|
||||
} else if (intent.hasExtra("google.message_id")) {
|
||||
bundle = new Bundle();
|
||||
|
||||
bundle.putBundle("data", intent.getExtras());
|
||||
}
|
||||
|
||||
if(null != bundle && !bundle.getBoolean("foreground", false) && !bundle.containsKey("userInteraction")) {
|
||||
bundle.putBoolean("userInteraction", true);
|
||||
}
|
||||
|
||||
return bundle;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onNewIntent(Intent intent) {
|
||||
Bundle bundle = this.getBundleFromIntent(intent);
|
||||
if (bundle != null) {
|
||||
delivery.notifyNotification(bundle);
|
||||
}
|
||||
}
|
||||
|
||||
@ReactMethod
|
||||
/**
|
||||
* Creates a channel if it does not already exist. Returns whether the channel was created.
|
||||
*/
|
||||
public void createChannel(ReadableMap channelInfo, Callback callback) {
|
||||
boolean created = pushNotificationHelper.createChannel(channelInfo);
|
||||
|
||||
if(callback != null) {
|
||||
callback.invoke(created);
|
||||
}
|
||||
}
|
||||
|
||||
@ReactMethod
|
||||
public void presentLocalNotification(ReadableMap details) {
|
||||
Bundle bundle = Arguments.toBundle(details);
|
||||
// If notification ID is not provided by the user, generate one at random
|
||||
if (bundle.getString("id") == null) {
|
||||
bundle.putString("id", String.valueOf(mRandomNumberGenerator.nextInt()));
|
||||
}
|
||||
|
||||
String type = bundle.getString("type");
|
||||
if (type != null && type.equals("message")) {
|
||||
if (this.newMessageSignalHandler != null) {
|
||||
newMessageSignalHandler.handleNewMessage(bundle);
|
||||
}
|
||||
} else {
|
||||
pushNotificationHelper.sendToNotificationCentre(bundle);
|
||||
}
|
||||
}
|
||||
|
||||
@ReactMethod
|
||||
public void enableNotifications() {
|
||||
this.newMessageSignalHandler = new NewMessageSignalHandler(reactContext);
|
||||
}
|
||||
|
||||
@ReactMethod
|
||||
public void disableNotifications() {
|
||||
if (newMessageSignalHandler != null) {
|
||||
newMessageSignalHandler.stop();
|
||||
newMessageSignalHandler = null;
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
+90
@@ -0,0 +1,90 @@
|
||||
package im.status.ethereum.pushnotifications;
|
||||
|
||||
import android.os.Build;
|
||||
import android.app.Application;
|
||||
import android.app.NotificationManager;
|
||||
import android.content.BroadcastReceiver;
|
||||
import android.content.Context;
|
||||
import android.content.Intent;
|
||||
import android.os.Bundle;
|
||||
import android.os.Handler;
|
||||
import android.os.Looper;
|
||||
import android.util.Log;
|
||||
|
||||
import com.facebook.react.ReactApplication;
|
||||
import com.facebook.react.ReactInstanceManager;
|
||||
import com.facebook.react.bridge.ReactContext;
|
||||
|
||||
|
||||
import im.status.ethereum.pushnotifications.PushNotificationJsDelivery;
|
||||
import static im.status.ethereum.pushnotifications.PushNotification.LOG_TAG;
|
||||
|
||||
public class PushNotificationActions extends BroadcastReceiver {
|
||||
@Override
|
||||
public void onReceive(final Context context, Intent intent) {
|
||||
String intentActionPrefix = context.getPackageName() + ".ACTION_";
|
||||
|
||||
Log.i(LOG_TAG, "PushNotificationBootEventReceiver loading scheduled notifications");
|
||||
|
||||
if (null == intent.getAction() || !intent.getAction().startsWith(intentActionPrefix)) {
|
||||
return;
|
||||
}
|
||||
|
||||
final Bundle bundle = intent.getBundleExtra("notification");
|
||||
|
||||
// Dismiss the notification popup.
|
||||
NotificationManager manager = (NotificationManager) context.getSystemService(context.NOTIFICATION_SERVICE);
|
||||
int notificationID = Integer.parseInt(bundle.getString("id"));
|
||||
|
||||
boolean autoCancel = bundle.getBoolean("autoCancel", true);
|
||||
|
||||
if(autoCancel) {
|
||||
if (bundle.containsKey("tag")) {
|
||||
String tag = bundle.getString("tag");
|
||||
manager.cancel(tag, notificationID);
|
||||
} else {
|
||||
manager.cancel(notificationID);
|
||||
}
|
||||
}
|
||||
|
||||
boolean invokeApp = bundle.getBoolean("invokeApp", true);
|
||||
|
||||
// Notify the action.
|
||||
if(invokeApp) {
|
||||
PushNotificationHelper helper = new PushNotificationHelper((Application) context.getApplicationContext());
|
||||
|
||||
helper.invokeApp(bundle);
|
||||
} else {
|
||||
|
||||
// We need to run this on the main thread, as the React code assumes that is true.
|
||||
// Namely, DevServerHelper constructs a Handler() without a Looper, which triggers:
|
||||
// "Can't create handler inside thread that has not called Looper.prepare()"
|
||||
Handler handler = new Handler(Looper.getMainLooper());
|
||||
handler.post(new Runnable() {
|
||||
public void run() {
|
||||
// Construct and load our normal React JS code bundle
|
||||
final ReactInstanceManager mReactInstanceManager = ((ReactApplication) context.getApplicationContext()).getReactNativeHost().getReactInstanceManager();
|
||||
ReactContext context = mReactInstanceManager.getCurrentReactContext();
|
||||
PushNotificationJsDelivery delivery = new PushNotificationJsDelivery(context);
|
||||
// If it's constructed, send a notification
|
||||
if (context != null) {
|
||||
delivery.notifyNotificationAction(bundle);
|
||||
} else {
|
||||
// Otherwise wait for construction, then send the notification
|
||||
mReactInstanceManager.addReactInstanceEventListener(new ReactInstanceManager.ReactInstanceEventListener() {
|
||||
public void onReactContextInitialized(ReactContext context) {
|
||||
PushNotificationJsDelivery delivery = new PushNotificationJsDelivery(context);
|
||||
delivery.notifyNotificationAction(bundle);
|
||||
mReactInstanceManager.removeReactInstanceEventListener(this);
|
||||
}
|
||||
});
|
||||
if (!mReactInstanceManager.hasStartedCreatingInitialContext()) {
|
||||
// Construct it in the background
|
||||
mReactInstanceManager.createReactContextInBackground();
|
||||
}
|
||||
}
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
||||
}
|
||||
+549
@@ -0,0 +1,549 @@
|
||||
// https://github.com/zo0r/react-native-push-notification/blob/bedc8f646aab67d594f291449fbfa24e07b64fe8/android/src/main/java/com/dieam/reactnativepushnotification/modules/RNPushNotificationHelper.java Copy-Paste with removed firebase
|
||||
package im.status.ethereum.pushnotifications;
|
||||
|
||||
import android.app.ActivityManager;
|
||||
import android.app.ActivityManager.RunningAppProcessInfo;
|
||||
import android.app.AlarmManager;
|
||||
import android.app.Application;
|
||||
import android.app.Notification;
|
||||
import android.app.NotificationChannel;
|
||||
import android.app.NotificationManager;
|
||||
import android.app.PendingIntent;
|
||||
import android.content.Context;
|
||||
import android.content.Intent;
|
||||
import android.content.SharedPreferences;
|
||||
import android.content.pm.ApplicationInfo;
|
||||
import android.content.res.Resources;
|
||||
import android.graphics.Bitmap;
|
||||
import android.graphics.BitmapFactory;
|
||||
import android.graphics.Color;
|
||||
import android.media.AudioAttributes;
|
||||
import android.media.RingtoneManager;
|
||||
import android.net.Uri;
|
||||
import android.os.Build;
|
||||
import android.os.Bundle;
|
||||
import android.service.notification.StatusBarNotification;
|
||||
import android.util.Log;
|
||||
|
||||
import androidx.annotation.RequiresApi;
|
||||
import androidx.core.app.NotificationCompat;
|
||||
|
||||
import com.facebook.react.bridge.Arguments;
|
||||
import com.facebook.react.bridge.ReadableArray;
|
||||
import com.facebook.react.bridge.ReadableMap;
|
||||
import com.facebook.react.bridge.WritableArray;
|
||||
import com.facebook.react.bridge.WritableMap;
|
||||
|
||||
import org.json.JSONArray;
|
||||
import org.json.JSONException;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.Arrays;
|
||||
import java.util.Calendar;
|
||||
import java.util.Date;
|
||||
import java.util.GregorianCalendar;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
|
||||
import static im.status.ethereum.pushnotifications.PushNotification.LOG_TAG;
|
||||
|
||||
public class PushNotificationHelper {
|
||||
|
||||
private Context context;
|
||||
|
||||
private static final long DEFAULT_VIBRATION = 300L;
|
||||
private static final String CHANNEL_ID = "status-im-notifications";
|
||||
|
||||
public PushNotificationHelper(Application context) {
|
||||
this.context = context;
|
||||
}
|
||||
|
||||
private NotificationManager notificationManager() {
|
||||
return (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE);
|
||||
}
|
||||
|
||||
public void invokeApp(Bundle bundle) {
|
||||
String packageName = context.getPackageName();
|
||||
Intent launchIntent = context.getPackageManager().getLaunchIntentForPackage(packageName);
|
||||
String className = launchIntent.getComponent().getClassName();
|
||||
|
||||
try {
|
||||
Class<?> activityClass = Class.forName(className);
|
||||
Intent activityIntent = new Intent(context, activityClass);
|
||||
|
||||
if(bundle != null) {
|
||||
activityIntent.putExtra("notification", bundle);
|
||||
}
|
||||
|
||||
activityIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
|
||||
|
||||
context.startActivity(activityIntent);
|
||||
} catch(Exception e) {
|
||||
Log.e(LOG_TAG, "Class not found", e);
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
public void sendToNotificationCentre(final Bundle bundle) {
|
||||
PushNotificationPicturesAggregator aggregator = new PushNotificationPicturesAggregator(new PushNotificationPicturesAggregator.Callback() {
|
||||
public void call(Bitmap largeIconImage, Bitmap bigPictureImage) {
|
||||
sendToNotificationCentreWithPicture(bundle, largeIconImage, bigPictureImage);
|
||||
}
|
||||
});
|
||||
|
||||
aggregator.setLargeIconUrl(context, bundle.getString("largeIconUrl"));
|
||||
aggregator.setBigPictureUrl(context, bundle.getString("bigPictureUrl"));
|
||||
}
|
||||
|
||||
public void sendToNotificationCentreWithPicture(final Bundle bundle, Bitmap largeIconBitmap, Bitmap bigPictureBitmap) {
|
||||
try {
|
||||
Class intentClass = getMainActivityClass();
|
||||
if (intentClass == null) {
|
||||
Log.e(LOG_TAG, "No activity class found for the notification");
|
||||
return;
|
||||
}
|
||||
|
||||
if (bundle.getString("message") == null) {
|
||||
// this happens when a 'data' notification is received - we do not synthesize a local notification in this case
|
||||
Log.d(LOG_TAG, "Ignore this message if you sent data-only notification. Cannot send to notification centre because there is no 'message' field in: " + bundle);
|
||||
return;
|
||||
}
|
||||
|
||||
String notificationIdString = bundle.getString("id");
|
||||
if (notificationIdString == null) {
|
||||
Log.e(LOG_TAG, "No notification ID specified for the notification");
|
||||
return;
|
||||
}
|
||||
|
||||
Resources res = context.getResources();
|
||||
String packageName = context.getPackageName();
|
||||
|
||||
String title = bundle.getString("title");
|
||||
if (title == null) {
|
||||
ApplicationInfo appInfo = context.getApplicationInfo();
|
||||
title = context.getPackageManager().getApplicationLabel(appInfo).toString();
|
||||
}
|
||||
|
||||
int priority = NotificationCompat.PRIORITY_HIGH;
|
||||
final String priorityString = bundle.getString("priority");
|
||||
|
||||
if (priorityString != null) {
|
||||
switch (priorityString.toLowerCase()) {
|
||||
case "max":
|
||||
priority = NotificationCompat.PRIORITY_MAX;
|
||||
break;
|
||||
case "high":
|
||||
priority = NotificationCompat.PRIORITY_HIGH;
|
||||
break;
|
||||
case "low":
|
||||
priority = NotificationCompat.PRIORITY_LOW;
|
||||
break;
|
||||
case "min":
|
||||
priority = NotificationCompat.PRIORITY_MIN;
|
||||
break;
|
||||
case "default":
|
||||
priority = NotificationCompat.PRIORITY_DEFAULT;
|
||||
break;
|
||||
default:
|
||||
priority = NotificationCompat.PRIORITY_HIGH;
|
||||
}
|
||||
}
|
||||
|
||||
int visibility = NotificationCompat.VISIBILITY_PRIVATE;
|
||||
final String visibilityString = bundle.getString("visibility");
|
||||
|
||||
if (visibilityString != null) {
|
||||
switch (visibilityString.toLowerCase()) {
|
||||
case "private":
|
||||
visibility = NotificationCompat.VISIBILITY_PRIVATE;
|
||||
break;
|
||||
case "public":
|
||||
visibility = NotificationCompat.VISIBILITY_PUBLIC;
|
||||
break;
|
||||
case "secret":
|
||||
visibility = NotificationCompat.VISIBILITY_SECRET;
|
||||
break;
|
||||
default:
|
||||
visibility = NotificationCompat.VISIBILITY_PRIVATE;
|
||||
}
|
||||
}
|
||||
|
||||
String channel_id = bundle.getString("channelId");
|
||||
|
||||
if(channel_id == null) {
|
||||
channel_id = this.getNotificationDefaultChannelId();
|
||||
}
|
||||
|
||||
NotificationCompat.Builder notification = new NotificationCompat.Builder(context, channel_id)
|
||||
.setContentTitle(title)
|
||||
.setTicker(bundle.getString("ticker"))
|
||||
.setVisibility(visibility)
|
||||
.setPriority(priority)
|
||||
.setAutoCancel(bundle.getBoolean("autoCancel", true))
|
||||
.setOnlyAlertOnce(bundle.getBoolean("onlyAlertOnce", false));
|
||||
|
||||
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) { // API 24 and higher
|
||||
// Restore showing timestamp on Android 7+
|
||||
// Source: https://developer.android.com/reference/android/app/Notification.Builder.html#setShowWhen(boolean)
|
||||
boolean showWhen = bundle.getBoolean("showWhen", true);
|
||||
|
||||
notification.setShowWhen(showWhen);
|
||||
}
|
||||
|
||||
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { // API 26 and higher
|
||||
// Changing Default mode of notification
|
||||
notification.setDefaults(Notification.DEFAULT_LIGHTS);
|
||||
}
|
||||
|
||||
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT_WATCH) { // API 20 and higher
|
||||
String group = bundle.getString("group");
|
||||
|
||||
if (group != null) {
|
||||
notification.setGroup(group);
|
||||
}
|
||||
|
||||
if (bundle.containsKey("groupSummary") || bundle.getBoolean("groupSummary")) {
|
||||
notification.setGroupSummary(bundle.getBoolean("groupSummary"));
|
||||
}
|
||||
}
|
||||
|
||||
String numberString = bundle.getString("number");
|
||||
|
||||
if (numberString != null) {
|
||||
notification.setNumber(Integer.parseInt(numberString));
|
||||
}
|
||||
|
||||
// Small icon
|
||||
int smallIconResId = 0;
|
||||
|
||||
String smallIcon = bundle.getString("smallIcon");
|
||||
|
||||
if (smallIcon != null && !smallIcon.isEmpty()) {
|
||||
smallIconResId = res.getIdentifier(smallIcon, "mipmap", packageName);
|
||||
} else if(smallIcon == null) {
|
||||
smallIconResId = res.getIdentifier("ic_stat_notify_status", "drawable", packageName);
|
||||
}
|
||||
|
||||
if (smallIconResId == 0) {
|
||||
smallIconResId = res.getIdentifier("ic_launcher", "mipmap", packageName);
|
||||
|
||||
if (smallIconResId == 0) {
|
||||
smallIconResId = android.R.drawable.ic_dialog_info;
|
||||
}
|
||||
}
|
||||
|
||||
notification.setSmallIcon(smallIconResId);
|
||||
|
||||
// Large icon
|
||||
if(largeIconBitmap == null) {
|
||||
int largeIconResId = 0;
|
||||
|
||||
String largeIcon = bundle.getString("largeIcon");
|
||||
|
||||
if (largeIcon != null && !largeIcon.isEmpty()) {
|
||||
largeIconResId = res.getIdentifier(largeIcon, "mipmap", packageName);
|
||||
} else if(largeIcon == null) {
|
||||
largeIconResId = res.getIdentifier("ic_launcher", "mipmap", packageName);
|
||||
}
|
||||
|
||||
// Before Lolipop there was no large icon for notifications.
|
||||
if (largeIconResId != 0 && (largeIcon != null || Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP)) {
|
||||
largeIconBitmap = BitmapFactory.decodeResource(res, largeIconResId);
|
||||
}
|
||||
}
|
||||
|
||||
if (largeIconBitmap != null){
|
||||
notification.setLargeIcon(largeIconBitmap);
|
||||
}
|
||||
|
||||
String message = bundle.getString("message");
|
||||
|
||||
notification.setContentText(message);
|
||||
|
||||
String subText = bundle.getString("subText");
|
||||
|
||||
if (subText != null) {
|
||||
notification.setSubText(subText);
|
||||
}
|
||||
|
||||
String bigText = bundle.getString("bigText");
|
||||
|
||||
if (bigText == null) {
|
||||
bigText = message;
|
||||
}
|
||||
|
||||
NotificationCompat.Style style;
|
||||
|
||||
if(bigPictureBitmap != null) {
|
||||
style = new NotificationCompat.BigPictureStyle()
|
||||
.bigPicture(bigPictureBitmap)
|
||||
.setBigContentTitle(title)
|
||||
.setSummaryText(message);
|
||||
} else {
|
||||
style = new NotificationCompat.BigTextStyle().bigText(bigText);
|
||||
}
|
||||
|
||||
notification.setStyle(style);
|
||||
|
||||
Intent intent = new Intent(context, intentClass);
|
||||
intent.addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP);
|
||||
bundle.putBoolean("foreground", this.isApplicationInForeground());
|
||||
bundle.putBoolean("userInteraction", true);
|
||||
intent.putExtra("notification", bundle);
|
||||
|
||||
Uri soundUri = null;
|
||||
|
||||
if (!bundle.containsKey("playSound") || bundle.getBoolean("playSound")) {
|
||||
String soundName = bundle.getString("soundName");
|
||||
|
||||
if (soundName == null) {
|
||||
soundName = "default";
|
||||
}
|
||||
|
||||
soundUri = getSoundUri(soundName);
|
||||
|
||||
notification.setSound(soundUri);
|
||||
}
|
||||
|
||||
if (soundUri == null || Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
|
||||
notification.setSound(null);
|
||||
}
|
||||
|
||||
if (bundle.containsKey("ongoing") || bundle.getBoolean("ongoing")) {
|
||||
notification.setOngoing(bundle.getBoolean("ongoing"));
|
||||
}
|
||||
|
||||
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
|
||||
notification.setCategory(NotificationCompat.CATEGORY_CALL);
|
||||
|
||||
String color = bundle.getString("color");
|
||||
int defaultColor = -1;
|
||||
if (color != null) {
|
||||
notification.setColor(Color.parseColor(color));
|
||||
} else if (defaultColor != -1) {
|
||||
notification.setColor(defaultColor);
|
||||
}
|
||||
}
|
||||
|
||||
int notificationID = Integer.parseInt(notificationIdString);
|
||||
|
||||
PendingIntent pendingIntent = PendingIntent.getActivity(context, notificationID, intent,
|
||||
PendingIntent.FLAG_UPDATE_CURRENT);
|
||||
|
||||
NotificationManager notificationManager = notificationManager();
|
||||
|
||||
long[] vibratePattern = new long[]{0};
|
||||
|
||||
if (!bundle.containsKey("vibrate") || bundle.getBoolean("vibrate")) {
|
||||
long vibration = bundle.containsKey("vibration") ? (long) bundle.getDouble("vibration") : DEFAULT_VIBRATION;
|
||||
if (vibration == 0)
|
||||
vibration = DEFAULT_VIBRATION;
|
||||
|
||||
vibratePattern = new long[]{0, vibration};
|
||||
|
||||
notification.setVibrate(vibratePattern);
|
||||
}
|
||||
|
||||
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
|
||||
// Define the shortcutId
|
||||
String shortcutId = bundle.getString("shortcutId");
|
||||
|
||||
if (shortcutId != null) {
|
||||
notification.setShortcutId(shortcutId);
|
||||
}
|
||||
|
||||
Long timeoutAfter = (long) bundle.getDouble("timeoutAfter");
|
||||
|
||||
if (timeoutAfter != null && timeoutAfter >= 0) {
|
||||
notification.setTimeoutAfter(timeoutAfter);
|
||||
}
|
||||
}
|
||||
|
||||
Long when = (long) bundle.getDouble("when");
|
||||
|
||||
if (when != null && when >= 0) {
|
||||
notification.setWhen(when);
|
||||
}
|
||||
|
||||
notification.setUsesChronometer(bundle.getBoolean("usesChronometer", false));
|
||||
notification.setChannelId(channel_id);
|
||||
notification.setContentIntent(pendingIntent);
|
||||
|
||||
JSONArray actionsArray = null;
|
||||
try {
|
||||
actionsArray = bundle.getString("actions") != null ? new JSONArray(bundle.getString("actions")) : null;
|
||||
} catch (JSONException e) {
|
||||
Log.e(LOG_TAG, "Exception while converting actions to JSON object.", e);
|
||||
}
|
||||
|
||||
if (actionsArray != null) {
|
||||
// No icon for now. The icon value of 0 shows no icon.
|
||||
int icon = 0;
|
||||
|
||||
// Add button for each actions.
|
||||
for (int i = 0; i < actionsArray.length(); i++) {
|
||||
String action;
|
||||
try {
|
||||
action = actionsArray.getString(i);
|
||||
} catch (JSONException e) {
|
||||
Log.e(LOG_TAG, "Exception while getting action from actionsArray.", e);
|
||||
continue;
|
||||
}
|
||||
|
||||
|
||||
Intent actionIntent = new Intent(context, PushNotificationActions.class);
|
||||
actionIntent.setAction(packageName + ".ACTION_" + i);
|
||||
|
||||
actionIntent.addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP);
|
||||
|
||||
// Add "action" for later identifying which button gets pressed.
|
||||
bundle.putString("action", action);
|
||||
actionIntent.putExtra("notification", bundle);
|
||||
actionIntent.setPackage(packageName);
|
||||
|
||||
PendingIntent pendingActionIntent = PendingIntent.getBroadcast(context, notificationID, actionIntent,
|
||||
PendingIntent.FLAG_UPDATE_CURRENT);
|
||||
|
||||
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
|
||||
notification.addAction(new NotificationCompat.Action.Builder(icon, action, pendingActionIntent).build());
|
||||
} else {
|
||||
notification.addAction(icon, action, pendingActionIntent);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
if (!(this.isApplicationInForeground() && bundle.getBoolean("ignoreInForeground"))) {
|
||||
Notification info = notification.build();
|
||||
info.defaults |= Notification.DEFAULT_LIGHTS;
|
||||
|
||||
if (bundle.containsKey("tag")) {
|
||||
String tag = bundle.getString("tag");
|
||||
notificationManager.notify(tag, notificationID, info);
|
||||
} else {
|
||||
notificationManager.notify(notificationID, info);
|
||||
}
|
||||
}
|
||||
} catch (Exception e) {
|
||||
Log.e(LOG_TAG, "failed to send push notification", e);
|
||||
}
|
||||
}
|
||||
|
||||
private boolean checkOrCreateChannel(NotificationManager manager, String channel_id, String channel_name, String channel_description, Uri soundUri, int importance, long[] vibratePattern, boolean showBadge) {
|
||||
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.O)
|
||||
return false;
|
||||
if (manager == null)
|
||||
return false;
|
||||
|
||||
NotificationChannel channel = manager.getNotificationChannel(channel_id);
|
||||
|
||||
if (
|
||||
channel == null && channel_name != null && channel_description != null ||
|
||||
channel != null &&
|
||||
(
|
||||
channel_name != null && !channel.getName().equals(channel_name) ||
|
||||
channel_description != null && !channel.getDescription().equals(channel_description)
|
||||
)
|
||||
) {
|
||||
// If channel doesn't exist create a new one.
|
||||
// If channel name or description is updated then update the existing channel.
|
||||
channel = new NotificationChannel(channel_id, channel_name, importance);
|
||||
|
||||
channel.setDescription(channel_description);
|
||||
channel.enableLights(true);
|
||||
channel.enableVibration(vibratePattern != null);
|
||||
channel.setVibrationPattern(vibratePattern);
|
||||
channel.setShowBadge(showBadge);
|
||||
|
||||
if (soundUri != null) {
|
||||
AudioAttributes audioAttributes = new AudioAttributes.Builder()
|
||||
.setContentType(AudioAttributes.CONTENT_TYPE_SONIFICATION)
|
||||
.setUsage(AudioAttributes.USAGE_NOTIFICATION)
|
||||
.build();
|
||||
|
||||
channel.setSound(soundUri, audioAttributes);
|
||||
} else {
|
||||
channel.setSound(null, null);
|
||||
}
|
||||
|
||||
manager.createNotificationChannel(channel);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
public boolean createChannel(ReadableMap channelInfo) {
|
||||
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.O)
|
||||
return false;
|
||||
|
||||
String channelId = channelInfo.getString("channelId");
|
||||
String channelName = channelInfo.getString("channelName");
|
||||
String channelDescription = channelInfo.hasKey("channelDescription") ? channelInfo.getString("channelDescription") : "";
|
||||
String soundName = channelInfo.hasKey("soundName") ? channelInfo.getString("soundName") : "default";
|
||||
int importance = channelInfo.hasKey("importance") ? channelInfo.getInt("importance") : 4;
|
||||
boolean vibrate = channelInfo.hasKey("vibrate") && channelInfo.getBoolean("vibrate");
|
||||
long[] vibratePattern = vibrate ? new long[] { DEFAULT_VIBRATION } : null;
|
||||
boolean showBadge = channelInfo.hasKey("showBadge") && channelInfo.getBoolean("showBadge");
|
||||
|
||||
NotificationManager manager = notificationManager();
|
||||
|
||||
Uri soundUri = getSoundUri(soundName);
|
||||
|
||||
return checkOrCreateChannel(manager, channelId, channelName, channelDescription, soundUri, importance, vibratePattern, showBadge);
|
||||
}
|
||||
|
||||
public String getNotificationDefaultChannelId() {
|
||||
return this.CHANNEL_ID;
|
||||
}
|
||||
|
||||
private Uri getSoundUri(String soundName) {
|
||||
if (soundName == null || "default".equalsIgnoreCase(soundName)) {
|
||||
return RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION);
|
||||
} else {
|
||||
|
||||
// sound name can be full filename, or just the resource name.
|
||||
// So the strings 'my_sound.mp3' AND 'my_sound' are accepted
|
||||
// The reason is to make the iOS and android javascript interfaces compatible
|
||||
|
||||
int resId;
|
||||
if (context.getResources().getIdentifier(soundName, "raw", context.getPackageName()) != 0) {
|
||||
resId = context.getResources().getIdentifier(soundName, "raw", context.getPackageName());
|
||||
} else {
|
||||
soundName = soundName.substring(0, soundName.lastIndexOf('.'));
|
||||
resId = context.getResources().getIdentifier(soundName, "raw", context.getPackageName());
|
||||
}
|
||||
|
||||
return Uri.parse("android.resource://" + context.getPackageName() + "/" + resId);
|
||||
}
|
||||
}
|
||||
|
||||
public Class getMainActivityClass() {
|
||||
String packageName = context.getPackageName();
|
||||
Intent launchIntent = context.getPackageManager().getLaunchIntentForPackage(packageName);
|
||||
String className = launchIntent.getComponent().getClassName();
|
||||
try {
|
||||
return Class.forName(className);
|
||||
} catch (ClassNotFoundException e) {
|
||||
e.printStackTrace();
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
public boolean isApplicationInForeground() {
|
||||
ActivityManager activityManager = (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE);
|
||||
List<RunningAppProcessInfo> processInfos = activityManager.getRunningAppProcesses();
|
||||
if (processInfos != null) {
|
||||
for (RunningAppProcessInfo processInfo : processInfos) {
|
||||
if (processInfo.processName.equals(context.getPackageName())
|
||||
&& processInfo.importance == RunningAppProcessInfo.IMPORTANCE_FOREGROUND
|
||||
&& processInfo.pkgList.length > 0) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
}
|
||||
+86
@@ -0,0 +1,86 @@
|
||||
package im.status.ethereum.pushnotifications;
|
||||
|
||||
import android.os.Build;
|
||||
import android.app.Application;
|
||||
import android.app.NotificationManager;
|
||||
import android.content.BroadcastReceiver;
|
||||
import android.content.Context;
|
||||
import android.content.Intent;
|
||||
import android.os.Bundle;
|
||||
import android.os.Handler;
|
||||
import android.os.Looper;
|
||||
import android.util.Log;
|
||||
|
||||
import com.facebook.react.bridge.ReactContext;
|
||||
import com.facebook.react.bridge.Arguments;
|
||||
import com.facebook.react.bridge.WritableMap;
|
||||
import com.facebook.react.modules.core.DeviceEventManagerModule;
|
||||
|
||||
import org.json.JSONException;
|
||||
import org.json.JSONObject;
|
||||
|
||||
import java.util.Set;
|
||||
|
||||
import static im.status.ethereum.pushnotifications.PushNotification.LOG_TAG;
|
||||
|
||||
class PushNotificationJsDelivery {
|
||||
|
||||
private ReactContext reactContext;
|
||||
|
||||
PushNotificationJsDelivery(ReactContext context){
|
||||
reactContext = context;
|
||||
}
|
||||
|
||||
String convertJSON(Bundle bundle) {
|
||||
try {
|
||||
JSONObject json = convertJSONObject(bundle);
|
||||
return json.toString();
|
||||
} catch (JSONException e) {
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
// a Bundle is not a map, so we have to convert it explicitly
|
||||
private JSONObject convertJSONObject(Bundle bundle) throws JSONException {
|
||||
JSONObject json = new JSONObject();
|
||||
Set<String> keys = bundle.keySet();
|
||||
for (String key : keys) {
|
||||
Object value = bundle.get(key);
|
||||
if (value instanceof Bundle) {
|
||||
json.put(key, convertJSONObject((Bundle)value));
|
||||
} else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
|
||||
json.put(key, JSONObject.wrap(value));
|
||||
} else {
|
||||
json.put(key, value);
|
||||
}
|
||||
}
|
||||
return json;
|
||||
}
|
||||
|
||||
void notifyNotification(Bundle bundle) {
|
||||
String bundleString = convertJSON(bundle);
|
||||
|
||||
WritableMap params = Arguments.createMap();
|
||||
params.putString("dataJSON", bundleString);
|
||||
|
||||
sendEvent("remoteNotificationReceived", params);
|
||||
}
|
||||
|
||||
void notifyNotificationAction(Bundle bundle) {
|
||||
String bundleString = convertJSON(bundle);
|
||||
|
||||
WritableMap params = Arguments.createMap();
|
||||
params.putString("dataJSON", bundleString);
|
||||
|
||||
sendEvent("notificationActionReceived", params);
|
||||
}
|
||||
|
||||
void sendEvent(String eventName, Object params) {
|
||||
if (reactContext.hasActiveCatalystInstance()) {
|
||||
reactContext
|
||||
.getJSModule(DeviceEventManagerModule.RCTDeviceEventEmitter.class)
|
||||
.emit(eventName, params);
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user