├── .gitignore ├── .travis.yml ├── Gemfile ├── Gemfile.lock ├── LICENSE ├── README.md ├── app ├── .gitignore ├── CMakeLists.txt ├── build.gradle ├── proguard-rules.pro └── src │ ├── androidTest │ └── java │ │ └── im │ │ └── adamant │ │ └── android │ │ ├── ChatListUINetworkTest.java │ │ ├── LoginUINetworkTest.java │ │ ├── LoginUITest.java │ │ ├── PincodeInAccessModeUINetworkTest.java │ │ ├── SettingsTest.java │ │ ├── base │ │ ├── ActivityWithMockingNetworkUITest.java │ │ └── BaseTest.java │ │ ├── dispatchers │ │ ├── BaseDispatcher.java │ │ ├── BasePeriodicTimeoutDispatcher.java │ │ ├── ChatListPeriodicTimeoutDispatcher.java │ │ ├── ContactsListPeriodicTimeoutDispatcher.java │ │ ├── ServerDownOnSendMessageDispatcher.java │ │ └── SuccessAuthorizationDispatcher.java │ │ ├── idling_resources │ │ ├── ActivityIdlingResosurce.java │ │ ├── FragmentIdlingResource.java │ │ ├── InFragmentRecyclerViewHasTextWatchInstruction.java │ │ └── InFragmentRecyclerViewNotEmptyWatchInstruction.java │ │ └── utils │ │ ├── AssetReaderUtil.java │ │ ├── InstrumentedTestConstants.java │ │ ├── RecyclerViewMatcher.java │ │ ├── TestUtils.java │ │ └── ToastMatcher.java │ ├── main │ ├── AndroidManifest.xml │ ├── ic_add-web.png │ ├── ic_launcher-web.png │ ├── java │ │ └── im │ │ │ └── adamant │ │ │ └── android │ │ │ ├── AdamantApplication.java │ │ │ ├── Constants.java │ │ │ ├── InstrumentationTestFacade.java │ │ │ ├── Screens.java │ │ │ ├── avatars │ │ │ ├── Avatar.java │ │ │ ├── AvatarGraphics.java │ │ │ ├── AvatarThemesProvider.java │ │ │ ├── AvatarTypes.java │ │ │ ├── CachedAvatar.java │ │ │ ├── PositionChecker.java │ │ │ ├── RoundWithBorderAvatar.java │ │ │ ├── SquareAvatar.java │ │ │ └── Triangle.java │ │ │ ├── core │ │ │ ├── AdamantApi.java │ │ │ ├── AdamantApiBuilder.java │ │ │ ├── AdamantApiWrapper.java │ │ │ ├── DefaultAdamantApiBuilderImpl.java │ │ │ ├── encryption │ │ │ │ ├── AdamantKeyGenerator.java │ │ │ │ ├── Encryptor.java │ │ │ │ ├── Hex.java │ │ │ │ └── KeyStoreCipher.java │ │ │ ├── entities │ │ │ │ ├── Account.java │ │ │ │ ├── HasNodeTimestamp.java │ │ │ │ ├── Participant.java │ │ │ │ ├── ServerNode.java │ │ │ │ ├── Transaction.java │ │ │ │ ├── TransactionMessage.java │ │ │ │ ├── TransactionState.java │ │ │ │ ├── UnnormalizedTransactionMessage.java │ │ │ │ ├── WithBytesDigest.java │ │ │ │ └── transaction_assets │ │ │ │ │ ├── NotUsedAsset.java │ │ │ │ │ ├── TransactionAsset.java │ │ │ │ │ ├── TransactionChatAsset.java │ │ │ │ │ └── TransactionStateAsset.java │ │ │ ├── exceptions │ │ │ │ ├── EmptyAdamantKeyValueStorage.java │ │ │ │ ├── EncryptionException.java │ │ │ │ ├── InvalidValueForKeyValueStorage.java │ │ │ │ ├── MessageDecryptException.java │ │ │ │ ├── MessageTooShortException.java │ │ │ │ ├── NotAuthorizedException.java │ │ │ │ ├── NotEnoughAdamantBalanceException.java │ │ │ │ ├── NotFoundPublicKey.java │ │ │ │ ├── NotSupportedPushNotificationFacade.java │ │ │ │ ├── NotSupportedWalletFacade.java │ │ │ │ └── WrongPincodeException.java │ │ │ ├── kvs │ │ │ │ ├── ApiKvsProvider.java │ │ │ │ └── KvsProvider.java │ │ │ ├── requests │ │ │ │ ├── NewAccount.java │ │ │ │ └── ProcessTransaction.java │ │ │ ├── responses │ │ │ │ ├── Authorization.java │ │ │ │ ├── ChatList.java │ │ │ │ ├── MessageList.java │ │ │ │ ├── OperationComplete.java │ │ │ │ ├── ParametrizedTransactionList.java │ │ │ │ ├── PublicKeyResponse.java │ │ │ │ ├── TransactionDetailsResponse.java │ │ │ │ ├── TransactionList.java │ │ │ │ ├── TransactionWasNormalized.java │ │ │ │ └── TransactionWasProcessed.java │ │ │ └── retrofit │ │ │ │ └── AdamantTransactonTypeAdapterFactory.java │ │ │ ├── dagger │ │ │ ├── AdamantApiModule.java │ │ │ ├── AppComponent.java │ │ │ ├── AppModule.java │ │ │ ├── AvatarsModule.java │ │ │ ├── EncryptionModule.java │ │ │ ├── GeneralModule.java │ │ │ ├── InteractorsModule.java │ │ │ ├── MarkdownModule.java │ │ │ ├── MessagesModule.java │ │ │ ├── PushNotificationsModule.java │ │ │ ├── WalletsModule.java │ │ │ ├── activities │ │ │ │ ├── ActivityScope.java │ │ │ │ ├── AllTransactionsScreenModule.java │ │ │ │ ├── LoginScreenModule.java │ │ │ │ ├── MainScreenModule.java │ │ │ │ ├── MessagesScreenModule.java │ │ │ │ ├── NodesListScreenModule.java │ │ │ │ ├── PincodeScreenModule.java │ │ │ │ ├── RegistrationScreenModule.java │ │ │ │ ├── ScanQrCodeScreenModule.java │ │ │ │ ├── SendCurrencyTransferScreenModule.java │ │ │ │ ├── ShowQrCodeScreenModule.java │ │ │ │ ├── SplashScreenModule.java │ │ │ │ └── TransferDetailsScreenModule.java │ │ │ ├── fragments │ │ │ │ ├── BottomLoginModule.java │ │ │ │ ├── ChatsScreenModule.java │ │ │ │ ├── CreateChatScreenModule.java │ │ │ │ ├── FragmentScope.java │ │ │ │ ├── SendFundsFragmentModule.java │ │ │ │ ├── SettingsScreenModule.java │ │ │ │ └── WalletScreenModule.java │ │ │ ├── receivers │ │ │ │ ├── BootCompletedBroadcastReceiverModule.java │ │ │ │ └── ReceiverScope.java │ │ │ └── services │ │ │ │ ├── AdamantBalanceUpdateServiceModule.java │ │ │ │ ├── AdamantFirebaseMessagingServiceModule.java │ │ │ │ ├── AdamantLocalMessagingServiceModule.java │ │ │ │ ├── SaveContactsServiceModule.java │ │ │ │ ├── ServerNodePingServiceModule.java │ │ │ │ └── ServiceScope.java │ │ │ ├── helpers │ │ │ ├── AdamantAddressValidateHelper.java │ │ │ ├── AlternativePingHelper.java │ │ │ ├── AnimationUtils.java │ │ │ ├── BalanceConvertHelper.java │ │ │ ├── CharSequenceHelper.java │ │ │ ├── DrawableClickListener.java │ │ │ ├── DrawableColorHelper.java │ │ │ ├── HtmlHelper.java │ │ │ ├── KvsHelper.java │ │ │ ├── LoggerHelper.java │ │ │ ├── NotificationHelper.java │ │ │ ├── PublicKeyStorage.java │ │ │ ├── PublicKeyStorageImpl.java │ │ │ ├── QrCodeHelper.java │ │ │ └── Settings.java │ │ │ ├── interactors │ │ │ ├── AccountInteractor.java │ │ │ ├── AuthorizeInteractor.java │ │ │ ├── ChatUpdatePublicKeyInteractor.java │ │ │ ├── HasNewMessagesInteractor.java │ │ │ ├── LogoutInteractor.java │ │ │ ├── SaveContactsInteractor.java │ │ │ ├── SecurityInteractor.java │ │ │ ├── SendFundsInteractor.java │ │ │ ├── ServerNodeInteractor.java │ │ │ ├── SwitchPushNotificationServiceInteractor.java │ │ │ ├── TransferDetailsInteractor.java │ │ │ ├── WalletInteractor.java │ │ │ ├── chats │ │ │ │ ├── ChatHistoryInteractor.java │ │ │ │ ├── ChatInteractor.java │ │ │ │ ├── ChatsStorage.java │ │ │ │ ├── ContactsSource.java │ │ │ │ ├── HistoryTransactionsSource.java │ │ │ │ ├── LastTransactionInChatsSource.java │ │ │ │ └── NewTransactionsSource.java │ │ │ ├── push │ │ │ │ ├── DisabledNotificationServiceFacade.java │ │ │ │ ├── FCMNotificationServiceFacade.java │ │ │ │ ├── LocalNotificationServiceFacade.java │ │ │ │ ├── PushNotificationServiceFacade.java │ │ │ │ ├── SupportedPushNotificationFacadeType.java │ │ │ │ └── SupportedPushNotificationFacadeTypeKey.java │ │ │ └── wallets │ │ │ │ ├── AdamantWalletFacade.java │ │ │ │ ├── BinanceWalletFacade.java │ │ │ │ ├── EthereumWalletFacade.java │ │ │ │ ├── SupportedWalletFacadeType.java │ │ │ │ ├── SupportedWalletFacadeTypeKey.java │ │ │ │ ├── WalletFacade.java │ │ │ │ └── entities │ │ │ │ ├── ADMTransferDetails.java │ │ │ │ └── TransferDetails.java │ │ │ ├── markdown │ │ │ ├── AdamantAddressEntity.java │ │ │ ├── AdamantAddressExtractor.java │ │ │ ├── AdamantMarkdownProcessor.java │ │ │ └── renderers │ │ │ │ ├── BlockRenderer.java │ │ │ │ ├── InlineRenderer.java │ │ │ │ ├── block │ │ │ │ └── QuoteBlockRenderer.java │ │ │ │ └── inline │ │ │ │ ├── AdamantLinkRenderer.java │ │ │ │ ├── AllowedOtherLinkRenderer.java │ │ │ │ ├── BoldRenderer.java │ │ │ │ ├── EmailLinkRenderer.java │ │ │ │ ├── ItalicRenderer.java │ │ │ │ ├── NewLineRenderer.java │ │ │ │ └── StrikeRenderer.java │ │ │ ├── receivers │ │ │ └── BootCompletedBroadcast.java │ │ │ ├── rx │ │ │ ├── Irrelevant.java │ │ │ ├── ObservableRxList.java │ │ │ └── RxTaskManager.java │ │ │ ├── services │ │ │ ├── AdamantBalanceUpdateService.java │ │ │ ├── AdamantFirebaseMessagingService.java │ │ │ ├── AdamantLocalMessagingService.java │ │ │ ├── SaveContactsService.java │ │ │ └── ServerNodesPingService.java │ │ │ └── ui │ │ │ ├── AllTransactionsScreen.java │ │ │ ├── BaseActivity.java │ │ │ ├── LoginScreen.java │ │ │ ├── MainScreen.java │ │ │ ├── MessagesScreen.java │ │ │ ├── NodesListScreen.java │ │ │ ├── PincodeScreen.java │ │ │ ├── RegistrationScreen.java │ │ │ ├── ScanQrCodeScreen.java │ │ │ ├── SendFundsScreen.java │ │ │ ├── ShowQrCodeScreen.java │ │ │ ├── SplashScreen.java │ │ │ ├── TransferDetailsScreen.java │ │ │ ├── adapters │ │ │ ├── CardAdapter.java │ │ │ ├── ChatsAdapter.java │ │ │ ├── CurrencyCardAdapter.java │ │ │ ├── CurrencyTransfersAdapter.java │ │ │ ├── FragmentsAdapter.java │ │ │ ├── KeyPinAdapter.java │ │ │ ├── LanguageAdapter.java │ │ │ ├── MessagesAdapter.java │ │ │ ├── PassphraseAdapter.java │ │ │ ├── PushNotificationServiceAdapter.java │ │ │ ├── SendCurrencyFragmentAdapter.java │ │ │ ├── ServerNodeAdapter.java │ │ │ └── WelcomeCardsAdapter.java │ │ │ ├── custom_view │ │ │ ├── EndlessRecyclerViewScrollListener.java │ │ │ ├── EndlessUpScrollListener.java │ │ │ ├── IgnoreLastDividerItemDecorator.java │ │ │ ├── ItemSpaceDecoration.java │ │ │ ├── LTRGridLayoutManager.java │ │ │ ├── NoSwipePager.java │ │ │ ├── PinIndicatorLayout.java │ │ │ ├── SimpleDotIndicatorDecoration.java │ │ │ └── TodayRelativeTimeView.java │ │ │ ├── entities │ │ │ ├── Chat.java │ │ │ ├── Contact.java │ │ │ ├── CurrencyCardItem.java │ │ │ ├── CurrencyTransferEntity.java │ │ │ ├── UITransferDetails.java │ │ │ └── WelcomeCard.java │ │ │ ├── fragments │ │ │ ├── BottomLoginFragment.java │ │ │ ├── BottomNavigationDrawerFragment.java │ │ │ ├── ChatsScreen.java │ │ │ ├── CreateChatFragment.java │ │ │ ├── SendFundsFragment.java │ │ │ ├── SettingsScreen.java │ │ │ ├── WalletScreen.java │ │ │ ├── base │ │ │ │ ├── BaseBottomFragment.java │ │ │ │ ├── BaseDialogFragment.java │ │ │ │ └── BaseFragment.java │ │ │ └── dialogs │ │ │ │ └── ConfirmationSendFundsDialog.java │ │ │ ├── holders │ │ │ ├── CurrencyTransferHolder.java │ │ │ ├── FragmentClassHolder.java │ │ │ ├── KeyPinDigitHolder.java │ │ │ ├── KeyPinHolder.java │ │ │ ├── KeyPinIconHolder.java │ │ │ ├── PushNotificationServiceHolder.java │ │ │ ├── ServerNodeHolder.java │ │ │ └── WelcomeCardHolder.java │ │ │ ├── mappers │ │ │ ├── LocalizedChatMapper.java │ │ │ ├── LocalizedMessageMapper.java │ │ │ ├── TransactionToChatMapper.java │ │ │ └── TransactionToMessageMapper.java │ │ │ ├── messages_support │ │ │ ├── SupportedMessageListContentType.java │ │ │ ├── builders │ │ │ │ ├── AdamantBasicMessageBuilder.java │ │ │ │ ├── AdamantTransferMessageBuilder.java │ │ │ │ ├── BinanceTransferMessageBuilder.java │ │ │ │ ├── EthereumTransferMessageBuilder.java │ │ │ │ ├── FallbackMessageBuilder.java │ │ │ │ └── MessageBuilder.java │ │ │ ├── entities │ │ │ │ ├── AbstractMessage.java │ │ │ │ ├── AdamantBasicMessage.java │ │ │ │ ├── AdamantPushSubscriptionMessage.java │ │ │ │ ├── AdamantTransferMessage.java │ │ │ │ ├── BinanceTransferMessage.java │ │ │ │ ├── EthereumTransferMessage.java │ │ │ │ ├── FallbackMessage.java │ │ │ │ ├── MessageListContent.java │ │ │ │ └── Separator.java │ │ │ ├── factories │ │ │ │ ├── AdamantBasicMessageFactory.java │ │ │ │ ├── AdamantPushSubscriptionMessageFactory.java │ │ │ │ ├── AdamantTransferMessageFactory.java │ │ │ │ ├── BinanceTransferMessageFactory.java │ │ │ │ ├── EthereumTransferMessageFactory.java │ │ │ │ ├── FallbackMessageFactory.java │ │ │ │ ├── MessageFactory.java │ │ │ │ └── MessageFactoryProvider.java │ │ │ ├── holders │ │ │ │ ├── AbstractMessageListContentViewHolder.java │ │ │ │ ├── AbstractMessageViewHolder.java │ │ │ │ ├── AdamantBasicMessageViewHolder.java │ │ │ │ ├── AdamantTransferMessageViewHolder.java │ │ │ │ ├── BinanceTransferMessageViewHolder.java │ │ │ │ ├── EthereumTransferMessageViewHolder.java │ │ │ │ ├── FallbackMessageViewHolder.java │ │ │ │ └── SeparatorViewHolder.java │ │ │ └── processors │ │ │ │ ├── AbstractMessageProcessor.java │ │ │ │ ├── AdamantBasicMessageProcessor.java │ │ │ │ ├── AdamantPushSubscriptionMessageProcessor.java │ │ │ │ ├── AdamantTransferMessageProcessor.java │ │ │ │ └── MessageProcessor.java │ │ │ ├── mvp_view │ │ │ ├── AllTransactionsView.java │ │ │ ├── ChatsView.java │ │ │ ├── CreateChatView.java │ │ │ ├── LoginView.java │ │ │ ├── MainView.java │ │ │ ├── MessagesView.java │ │ │ ├── NodesListView.java │ │ │ ├── PinCodeView.java │ │ │ ├── PushSubscriptionView.java │ │ │ ├── RegistrationView.java │ │ │ ├── ScanQrCodeView.java │ │ │ ├── SendFundsView.java │ │ │ ├── SettingsView.java │ │ │ ├── ShowQrCodeView.java │ │ │ ├── TransferDetailsView.java │ │ │ └── WalletView.java │ │ │ ├── navigators │ │ │ └── DefaultNavigator.java │ │ │ ├── presenters │ │ │ ├── AllTransactionsPresenter.java │ │ │ ├── BasePresenter.java │ │ │ ├── ChatsPresenter.java │ │ │ ├── CreateChatPresenter.java │ │ │ ├── LoginPresenter.java │ │ │ ├── MainPresenter.java │ │ │ ├── MessagesPresenter.java │ │ │ ├── NodesListPresenter.java │ │ │ ├── PincodePresenter.java │ │ │ ├── ProtectedBasePresenter.java │ │ │ ├── RegistrationPresenter.java │ │ │ ├── SendFundsPresenter.java │ │ │ ├── SettingsPresenter.java │ │ │ ├── ShowQrCodePresenter.java │ │ │ ├── TransferDetailsPresenter.java │ │ │ └── WalletPresenter.java │ │ │ └── transformations │ │ │ ├── FixedHideBottomViewOnScrollBehavior.java │ │ │ ├── FragmentContainerStickyBottomBehavior.java │ │ │ ├── PassphraseAvatarOutlineProvider.java │ │ │ ├── PassphraseAvatarTransformation.java │ │ │ └── ShadowTransformation.java │ └── res │ │ ├── animator │ │ └── click_on_pin_key_button.xml │ │ ├── color │ │ ├── add_icon_button.xml │ │ ├── on_click_pincode_icon_key.xml │ │ ├── on_click_pincode_text_key.xml │ │ ├── selected_tab_icon_color.xml │ │ └── text_input_2_background.xml │ │ ├── drawable-hdpi │ │ ├── ic_menu.png │ │ ├── ic_notification_logo_android5.png │ │ └── send.png │ │ ├── drawable-mdpi │ │ ├── ic_menu.png │ │ ├── ic_notification_logo_android5.png │ │ └── send.png │ │ ├── drawable-v21 │ │ ├── alternate_background_ripple.xml │ │ └── selectable_item_pincode_background.xml │ │ ├── drawable-v24 │ │ └── bg.png │ │ ├── drawable-xhdpi │ │ ├── ic_menu.png │ │ ├── ic_notification_logo_android5.png │ │ └── send.png │ │ ├── drawable-xxhdpi │ │ ├── ic_menu.png │ │ ├── ic_notification_logo_android5.png │ │ └── send.png │ │ ├── drawable-xxxhdpi │ │ ├── ic_menu.png │ │ └── send.png │ │ ├── drawable │ │ ├── bg.png │ │ ├── bottom_navigation_item_color.xml │ │ ├── bottom_sheet_dialog_background.xml │ │ ├── currency_card_background.xml │ │ ├── empty_view_background.xml │ │ ├── flat_button_selector_text.xml │ │ ├── ic_add_chat.xml │ │ ├── ic_add_file.xml │ │ ├── ic_adm_line.xml │ │ ├── ic_adm_logo.xml │ │ ├── ic_adm_token.xml │ │ ├── ic_attention.xml │ │ ├── ic_avatar_circle.xml │ │ ├── ic_backspace.xml │ │ ├── ic_bnb_line.xml │ │ ├── ic_chats.xml │ │ ├── ic_clipboard_copy.xml │ │ ├── ic_copy.xml │ │ ├── ic_create_new_chat.xml │ │ ├── ic_delete.xml │ │ ├── ic_delivered.xml │ │ ├── ic_download.xml │ │ ├── ic_drawer_navigation.xml │ │ ├── ic_empty_avatar.xml │ │ ├── ic_ethereum.xml │ │ ├── ic_ethereum_line.xml │ │ ├── ic_exit_to_app_black_24dp.xml │ │ ├── ic_from_file.xml │ │ ├── ic_generate_qrcode.xml │ │ ├── ic_launcher_background.xml │ │ ├── ic_my_qr_code.xml │ │ ├── ic_not_sended.xml │ │ ├── ic_plus.xml │ │ ├── ic_qr_code.xml │ │ ├── ic_qr_scan.xml │ │ ├── ic_qrcode_frome_gallery.xml │ │ ├── ic_refresh.xml │ │ ├── ic_reset_pin_code.xml │ │ ├── ic_save.xml │ │ ├── ic_scan_qr.xml │ │ ├── ic_send_address.xml │ │ ├── ic_sending.xml │ │ ├── ic_settings.xml │ │ ├── ic_wallet.xml │ │ ├── ic_welcome_card1.xml │ │ ├── ic_welcome_card2.xml │ │ ├── ic_welcome_card3.xml │ │ ├── ic_welcome_card4.xml │ │ ├── ic_welcome_card5.xml │ │ ├── line_divider.xml │ │ ├── primary_button_selector_background.xml │ │ ├── primary_button_selector_text.xml │ │ ├── secondary_button_selector_text.xml │ │ ├── selectable_item_pincode_background.xml │ │ ├── selectable_text.xml │ │ ├── text_input_2_normal.xml │ │ ├── text_input_2_selected.xml │ │ └── tile_bg.xml │ │ ├── font │ │ ├── ubuntu.xml │ │ ├── ubuntu_bold.ttf │ │ ├── ubuntu_light_italic.ttf │ │ └── ubuntu_reqular.ttf │ │ ├── layout-v23 │ │ └── list_item_pincode_icon_key.xml │ │ ├── layout │ │ ├── activity_all_transactions_screen.xml │ │ ├── activity_create_chat_screen.xml │ │ ├── activity_login_screen.xml │ │ ├── activity_main.xml │ │ ├── activity_messages_screen.xml │ │ ├── activity_nodes_list_screen.xml │ │ ├── activity_pin_code_screen.xml │ │ ├── activity_registration_screen.xml │ │ ├── activity_scan_qrcode_screen.xml │ │ ├── activity_send_funds_screen.xml │ │ ├── activity_show_qr_code_screen.xml │ │ ├── activity_splash_screen.xml │ │ ├── activity_transfer_details_screen.xml │ │ ├── custom_action_bar.xml │ │ ├── dialog_rename_contact.xml │ │ ├── fragment_bottom_login.xml │ │ ├── fragment_bottom_navigation.xml │ │ ├── fragment_chats_screen.xml │ │ ├── fragment_create_chat_screen.xml │ │ ├── fragment_send_funds.xml │ │ ├── fragment_settings_screen.xml │ │ ├── fragment_wallet_screen.xml │ │ ├── list_item_chat.xml │ │ ├── list_item_general_message.xml │ │ ├── list_item_passphrase.xml │ │ ├── list_item_pincode_digit_key.xml │ │ ├── list_item_pincode_icon_key.xml │ │ ├── list_item_push_notification_service.xml │ │ ├── list_item_separator_message.xml │ │ ├── list_item_servernodes.xml │ │ ├── list_item_wallet_card.xml │ │ ├── list_item_wallet_transfer.xml │ │ ├── list_item_welcome_card.xml │ │ ├── list_subitem_adamant_basic_message.xml │ │ ├── list_subitem_adamant_transfer_message.xml │ │ ├── list_subitem_binance_transfer_message.xml │ │ ├── list_subitem_etherium_transfer_message.xml │ │ ├── list_subitem_fallback_message.xml │ │ └── wallet_tab_layout.xml │ │ ├── menu │ │ ├── activity_messages_menu.xml │ │ ├── fragment_chats_menu.xml │ │ └── navigation.xml │ │ ├── mipmap-anydpi-v26 │ │ ├── ic_add.xml │ │ ├── ic_add_round.xml │ │ ├── ic_launcher.xml │ │ └── ic_launcher_round.xml │ │ ├── mipmap-hdpi │ │ ├── ic_add.png │ │ ├── ic_add_foreground.png │ │ ├── ic_add_round.png │ │ ├── ic_launcher.png │ │ ├── ic_launcher_foreground.png │ │ └── ic_launcher_round.png │ │ ├── mipmap-mdpi │ │ ├── ic_add.png │ │ ├── ic_add_foreground.png │ │ ├── ic_add_round.png │ │ ├── ic_launcher.png │ │ ├── ic_launcher_foreground.png │ │ └── ic_launcher_round.png │ │ ├── mipmap-xhdpi │ │ ├── ic_add.png │ │ ├── ic_add_foreground.png │ │ ├── ic_add_round.png │ │ ├── ic_launcher.png │ │ ├── ic_launcher_foreground.png │ │ └── ic_launcher_round.png │ │ ├── mipmap-xxhdpi │ │ ├── ic_add.png │ │ ├── ic_add_foreground.png │ │ ├── ic_add_round.png │ │ ├── ic_launcher.png │ │ ├── ic_launcher_foreground.png │ │ └── ic_launcher_round.png │ │ ├── mipmap-xxxhdpi │ │ ├── ic_add.png │ │ ├── ic_add_foreground.png │ │ ├── ic_add_round.png │ │ ├── ic_launcher.png │ │ ├── ic_launcher_foreground.png │ │ └── ic_launcher_round.png │ │ ├── values-hdpi │ │ └── dimens.xml │ │ ├── values-ldpi │ │ └── dimens.xml │ │ ├── values-mdpi │ │ └── dimens.xml │ │ ├── values-ru │ │ └── strings.xml │ │ ├── values-sw480dp │ │ └── dimens.xml │ │ ├── values-sw600dp │ │ └── dimens.xml │ │ ├── values-v21 │ │ └── styles.xml │ │ ├── values-v23 │ │ └── styles.xml │ │ ├── values-v26 │ │ └── styles.xml │ │ └── values │ │ ├── attrs.xml │ │ ├── colors.xml │ │ ├── dimens.xml │ │ ├── strings.xml │ │ └── styles.xml │ ├── release │ └── google-services.json.enc │ ├── test │ └── java │ │ └── im │ │ └── adamant │ │ └── android │ │ ├── TestApplication.java │ │ ├── TestConstants.java │ │ ├── cases │ │ ├── core │ │ │ ├── AdamantApiWrapperSwitchOnFailureTest.java │ │ │ └── AdamantApiWrapperTest.java │ │ ├── interactors │ │ │ ├── FCMNotificationServiceFacadeTest.java │ │ │ └── chats │ │ │ │ └── ChatStorageTest.java │ │ ├── markdown │ │ │ ├── AdamantAddressExtractorTest.java │ │ │ └── MarkdownTest.java │ │ └── presenters │ │ │ └── SettingsPresenterTest.java │ │ ├── dagger │ │ ├── TestAdamantApiModule.java │ │ ├── TestAppComponent.java │ │ ├── TestAppModule.java │ │ ├── TestAvatarsModule.java │ │ ├── TestEncryptionModule.java │ │ ├── TestGeneralModule.java │ │ ├── TestInteractorsModule.java │ │ ├── TestMarkdownModule.java │ │ ├── TestMessagesModule.java │ │ ├── TestPresenterModule.java │ │ ├── TestPushNotificationModule.java │ │ ├── TestWalletsModule.java │ │ ├── activities │ │ │ ├── TestAllTransactionsScreenModule.java │ │ │ ├── TestLoginScreenModule.java │ │ │ ├── TestMainScreenModule.java │ │ │ ├── TestMessagesScreenModule.java │ │ │ ├── TestNodesListScreenModule.java │ │ │ ├── TestPushSubscriptionScreenModule.java │ │ │ ├── TestRegistrationScreenModule.java │ │ │ ├── TestScanQrCodeScreenModule.java │ │ │ ├── TestSendCurrencyTransferScreenModule.java │ │ │ ├── TestShowQrCodeScreenModule.java │ │ │ ├── TestSplashScreenModule.java │ │ │ └── TestTransferDetailsScreenModule.java │ │ ├── fragments │ │ │ ├── TestBottomLoginModule.java │ │ │ ├── TestBottomNavigationScreenModule.java │ │ │ ├── TestChatsScreenModule.java │ │ │ ├── TestCreateChatScreenModule.java │ │ │ ├── TestSendFundsFragmentModule.java │ │ │ ├── TestSettingsScreenModule.java │ │ │ └── TestWalletScreenModule.java │ │ ├── receivers │ │ │ └── TestBootCompletedBroadcastReceiverModule.java │ │ └── services │ │ │ ├── TestAdamantBalanceUpdateServiceModule.java │ │ │ ├── TestAdamantFirebaseMessagingServiceModule.java │ │ │ ├── TestAdamantLocalMessagingServiceModule.java │ │ │ ├── TestSaveContactsServiceModule.java │ │ │ └── TestServerNodePingServiceModule.java │ │ └── shadows │ │ ├── FirebaseInstanceIdShadow.java │ │ └── LocaleChangerShadow.java │ └── withoutServer │ └── assets │ └── network │ ├── accounts │ ├── error_not_found_account.json │ ├── get_0_01_balance_account.json │ └── get_zero_balance_account.json │ ├── chats │ └── correct_chat_list.json │ ├── kvs │ ├── contact_list.json │ └── empty_contact_list.json │ ├── public_keys │ └── U1119781441708645832.json │ └── transactions │ └── transactions.json ├── build.gradle ├── changelog.sh ├── fastlane ├── Appfile └── Fastfile ├── files.zip.enc ├── gradle.properties ├── gradle └── wrapper │ ├── gradle-wrapper.jar │ └── gradle-wrapper.properties ├── gradlew ├── gradlew.bat └── settings.gradle /.gitignore: -------------------------------------------------------------------------------- 1 | *.iml 2 | .gradle 3 | /local.properties 4 | /.idea 5 | .DS_Store 6 | /build 7 | /captures 8 | .externalNativeBuild 9 | adamant-keystore.jks 10 | /fastlane/README.md 11 | /fastlane/report.xml 12 | google-services.json 13 | /captures 14 | -------------------------------------------------------------------------------- /Gemfile: -------------------------------------------------------------------------------- 1 | source "https://rubygems.org" 2 | 3 | gem "fastlane" 4 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # ADAMANT Android Client 2 | 3 | ![travis](https://travis-ci.org/Adamant-im/adamant-android.svg?branch=master) 4 | 5 | Android native client for ADAMANT Messenger. 6 | 7 | You can use this repository to build your own ADAMANT Android application. 8 | 9 | ADAMANT is the most secure and anonymous messenger, encrypted with Blockchain. 10 | 11 | Highlights: 12 | 13 | - The most secure and anonymous messenger (see comparison table) 14 | - PWA version is also available https://msg.adamant.im/ 15 | - Trusted. Open-source project. 16 | - The only one which is Blockchain-powered 17 | - Integrated token transfers 18 | 19 | Read more about ADAMANT at [adamant.im](https://adamant.im) 20 | 21 | ## Contributors 22 | 23 | To successfully compile the project, put the file google-services.json in the folder: / app / src / debug 24 | and place "test_net=false" to local.properties file. 25 | 26 | Generate your google-services.json by yourself in the firebase console. -------------------------------------------------------------------------------- /app/.gitignore: -------------------------------------------------------------------------------- 1 | /build 2 | google-services.json 3 | /release 4 | -------------------------------------------------------------------------------- /app/src/androidTest/java/im/adamant/android/SettingsTest.java: -------------------------------------------------------------------------------- 1 | package im.adamant.android; 2 | 3 | public class SettingsTest { 4 | } 5 | -------------------------------------------------------------------------------- /app/src/androidTest/java/im/adamant/android/dispatchers/ChatListPeriodicTimeoutDispatcher.java: -------------------------------------------------------------------------------- 1 | package im.adamant.android.dispatchers; 2 | 3 | 4 | import android.content.Context; 5 | 6 | import java.util.HashMap; 7 | import java.util.Map; 8 | 9 | import javax.annotation.Nonnull; 10 | 11 | import static im.adamant.android.utils.InstrumentedTestConstants.CHATROOMS_PATH; 12 | import static im.adamant.android.utils.InstrumentedTestConstants.CONTACTS_PATH; 13 | 14 | public class ChatListPeriodicTimeoutDispatcher extends BasePeriodicTimeoutDispatcher { 15 | 16 | public ChatListPeriodicTimeoutDispatcher(Context context) { 17 | super(context); 18 | } 19 | 20 | @Nonnull 21 | @Override 22 | protected Map provideRequestPathAndResponseFile() { 23 | Map data = new HashMap<>(); 24 | data.put(CHATROOMS_PATH, "chats/correct_chat_list.json"); 25 | data.put(CONTACTS_PATH, "kvs/empty_contact_list.json"); 26 | 27 | return data; 28 | } 29 | 30 | @Override 31 | protected int provideAttempts() { 32 | return 1; 33 | } 34 | } 35 | -------------------------------------------------------------------------------- /app/src/androidTest/java/im/adamant/android/dispatchers/ContactsListPeriodicTimeoutDispatcher.java: -------------------------------------------------------------------------------- 1 | package im.adamant.android.dispatchers; 2 | 3 | import android.content.Context; 4 | 5 | import java.util.HashMap; 6 | import java.util.Map; 7 | 8 | import javax.annotation.Nonnull; 9 | 10 | import static im.adamant.android.utils.InstrumentedTestConstants.CHATROOMS_PATH; 11 | import static im.adamant.android.utils.InstrumentedTestConstants.CONTACTS_PATH; 12 | 13 | public class ContactsListPeriodicTimeoutDispatcher extends BasePeriodicTimeoutDispatcher { 14 | 15 | public ContactsListPeriodicTimeoutDispatcher(Context context) { 16 | super(context); 17 | } 18 | 19 | @Nonnull 20 | @Override 21 | protected Map provideRequestPathAndResponseFile() { 22 | Map data = new HashMap<>(); 23 | data.put(CHATROOMS_PATH, "chats/correct_chat_list.json"); 24 | data.put(CONTACTS_PATH, "kvs/contact_list.json"); 25 | 26 | return data; 27 | } 28 | 29 | @Override 30 | protected int provideAttempts() { 31 | return 1; 32 | } 33 | } 34 | -------------------------------------------------------------------------------- /app/src/androidTest/java/im/adamant/android/dispatchers/ServerDownOnSendMessageDispatcher.java: -------------------------------------------------------------------------------- 1 | package im.adamant.android.dispatchers; 2 | 3 | import android.content.Context; 4 | 5 | import java.util.Set; 6 | 7 | import im.adamant.android.utils.AssetReaderUtil; 8 | import im.adamant.android.utils.InstrumentedTestConstants; 9 | import okhttp3.mockwebserver.MockResponse; 10 | import okhttp3.mockwebserver.RecordedRequest; 11 | 12 | public class ServerDownOnSendMessageDispatcher extends BaseDispatcher { 13 | 14 | public ServerDownOnSendMessageDispatcher(Context context) { 15 | super(context); 16 | } 17 | 18 | @Override 19 | protected void initializePaths(Set paths) { 20 | paths.add(InstrumentedTestConstants.NORMALIZE_PATH); 21 | paths.add(InstrumentedTestConstants.PROCESS_PATH); 22 | paths.add(InstrumentedTestConstants.ACCOUNT_PATH); 23 | } 24 | 25 | @Override 26 | protected MockResponse route(String path, RecordedRequest request) { 27 | if (InstrumentedTestConstants.ACCOUNT_PATH.equalsIgnoreCase(path)) { 28 | return new MockResponse() 29 | .setResponseCode(200) 30 | .setBody( 31 | AssetReaderUtil.asset(context, "accounts/get_0_01_balance_account.json") 32 | ); 33 | } else { 34 | return new MockResponse().setResponseCode(500); 35 | } 36 | } 37 | } 38 | -------------------------------------------------------------------------------- /app/src/androidTest/java/im/adamant/android/utils/InstrumentedTestConstants.java: -------------------------------------------------------------------------------- 1 | package im.adamant.android.utils; 2 | 3 | public interface InstrumentedTestConstants { 4 | String PASSPHRASE = "sword custom cushion around skin chair magic call evidence dynamic main suspect"; 5 | String ADDRESS = "U15650841420785452182"; 6 | long DEFAULT_BALANCE = 10000000; 7 | String PUBLIC_KEY = "8c0d033510fc5707418037bbb6ae1b1e8622fd442fe3b0b2ba47f13877355ba4"; 8 | String SECRET_KEY = "8898aa6df66f98eba31be8517f69880dc65a3f2cf6e09a2abb9843e050d706308c0d033510fc5707418037bbb6ae1b1e8622fd442fe3b0b2ba47f13877355ba4"; 9 | String PINCODE = "332233"; 10 | 11 | String CHATROOMS_PATH = "/api/chatrooms/U15650841420785452182"; 12 | String CONTACTS_PATH = "/api/states/get"; 13 | String NORMALIZE_PATH = "/api/chats/normalize"; 14 | String PROCESS_PATH = "/api/chats/process"; 15 | String ACCOUNT_PATH = "/api/accounts"; 16 | } 17 | -------------------------------------------------------------------------------- /app/src/androidTest/java/im/adamant/android/utils/TestUtils.java: -------------------------------------------------------------------------------- 1 | package im.adamant.android.utils; 2 | 3 | public class TestUtils { 4 | public static RecyclerViewMatcher withRecyclerView(final int recyclerViewId) { 5 | return new RecyclerViewMatcher(recyclerViewId); 6 | } 7 | } 8 | -------------------------------------------------------------------------------- /app/src/androidTest/java/im/adamant/android/utils/ToastMatcher.java: -------------------------------------------------------------------------------- 1 | package im.adamant.android.utils; 2 | 3 | import android.os.IBinder; 4 | import android.view.WindowManager; 5 | 6 | import androidx.test.espresso.Root; 7 | 8 | import org.hamcrest.Description; 9 | import org.hamcrest.TypeSafeMatcher; 10 | 11 | public class ToastMatcher extends TypeSafeMatcher { 12 | @Override 13 | public void describeTo(Description description) { 14 | description.appendText("is toast"); 15 | } 16 | 17 | @Override 18 | public boolean matchesSafely(Root root) { 19 | int type = root.getWindowLayoutParams().get().type; 20 | if ((type == WindowManager.LayoutParams.TYPE_TOAST)) { 21 | IBinder windowToken = root.getDecorView().getWindowToken(); 22 | IBinder appToken = root.getDecorView().getApplicationWindowToken(); 23 | if (windowToken == appToken) { 24 | return true; 25 | } 26 | } 27 | return false; 28 | } 29 | } 30 | -------------------------------------------------------------------------------- /app/src/main/ic_add-web.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Adamant-im/adamant-android/a653fa6e3084cf964f416f710da5c8af97072f96/app/src/main/ic_add-web.png -------------------------------------------------------------------------------- /app/src/main/ic_launcher-web.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Adamant-im/adamant-android/a653fa6e3084cf964f416f710da5c8af97072f96/app/src/main/ic_launcher-web.png -------------------------------------------------------------------------------- /app/src/main/java/im/adamant/android/Constants.java: -------------------------------------------------------------------------------- 1 | package im.adamant.android; 2 | 3 | public interface Constants { 4 | int SCAN_QR_CODE_RESULT = 1000; 5 | int IMAGE_FROM_GALLERY_SELECTED_RESULT = 1001; 6 | String ADAMANT_ACCOUNT_ALIAS = "adamant_account"; 7 | String KVS_CONTACT_LIST = "contact_list"; 8 | String ADAMANT_SYSTEM_NOTIFICATION_CHANNEL_ID = "adamant_system_notification"; 9 | String ADAMANT_DEFAULT_NOTIFICATION_CHANNEL_ID = "adamant_default_notification"; 10 | String UI_SCHEDULER = "ui_scheduler"; 11 | String IO_SCHEDULER = "io_scheduler"; 12 | String KEY = "key"; 13 | String ADDRESS = "address"; 14 | String PASSPHRASE = "passphrase"; 15 | } 16 | -------------------------------------------------------------------------------- /app/src/main/java/im/adamant/android/InstrumentationTestFacade.java: -------------------------------------------------------------------------------- 1 | package im.adamant.android; 2 | 3 | import im.adamant.android.core.AdamantApiWrapper; 4 | import im.adamant.android.helpers.Settings; 5 | import im.adamant.android.interactors.LogoutInteractor; 6 | import im.adamant.android.interactors.SecurityInteractor; 7 | import ru.terrakok.cicerone.Router; 8 | 9 | public class InstrumentationTestFacade { 10 | private LogoutInteractor logoutInteractor; 11 | private SecurityInteractor securityInteractor; 12 | private AdamantApiWrapper adamantApiWrapper; 13 | private Settings settings; 14 | 15 | public InstrumentationTestFacade( 16 | LogoutInteractor logoutInteractor, 17 | SecurityInteractor securityInteractor, 18 | AdamantApiWrapper adamantApiWrapper, 19 | Settings settings 20 | ) { 21 | this.logoutInteractor = logoutInteractor; 22 | this.securityInteractor = securityInteractor; 23 | this.adamantApiWrapper = adamantApiWrapper; 24 | this.settings = settings; 25 | } 26 | 27 | public void logout() { 28 | logoutInteractor.logout(); 29 | } 30 | 31 | public AdamantApiWrapper getApiWrapper() { 32 | return adamantApiWrapper; 33 | } 34 | 35 | public SecurityInteractor getSecurityInteractor() { 36 | return securityInteractor; 37 | } 38 | 39 | public Settings getSettings() { 40 | return settings; 41 | } 42 | } 43 | -------------------------------------------------------------------------------- /app/src/main/java/im/adamant/android/Screens.java: -------------------------------------------------------------------------------- 1 | package im.adamant.android; 2 | 3 | public interface Screens { 4 | String LOGIN_SCREEN = "login_screen"; 5 | String WALLET_SCREEN = "wallet_screen"; 6 | String SETTINGS_SCREEN = "settings_screen"; 7 | String CHATS_SCREEN = "chats_screen"; 8 | String CREATE_CHAT_SCREEN = "create_chat_screen"; 9 | String MESSAGES_SCREEN = "messages_screen"; 10 | String SCAN_QRCODE_SCREEN = "scan_qrcode_screen"; 11 | String SHOW_QRCODE_SCREEN = "show_qrcode_screen"; 12 | String SPLASH_SCREEN = "splash_screen"; 13 | String REGISTRATION_SCREEN = "registration_screen"; 14 | String SEND_CURRENCY_TRANSFER_SCREEN = "send_currency_transfer_screen"; 15 | String NODES_LIST_SCREEN = "nodes_list_screen"; 16 | String PUSH_SUBSCRIPTION_SCREEN = "push_subscription_service_screen"; 17 | String PINCODE_SCREEN = "pincode_screen"; 18 | String ALL_TRANSACTIONS_SCREEN = "all_transactions_screen"; 19 | String TRANSFER_DETAILS_SCREEN = "transfer_details_screen"; 20 | } 21 | -------------------------------------------------------------------------------- /app/src/main/java/im/adamant/android/avatars/Avatar.java: -------------------------------------------------------------------------------- 1 | package im.adamant.android.avatars; 2 | 3 | import android.content.Context; 4 | import android.graphics.Bitmap; 5 | import android.graphics.Canvas; 6 | import android.graphics.Color; 7 | import android.graphics.Paint; 8 | import android.util.DisplayMetrics; 9 | import android.util.Pair; 10 | import android.util.TypedValue; 11 | 12 | import io.reactivex.Single; 13 | import io.reactivex.android.schedulers.AndroidSchedulers; 14 | import io.reactivex.schedulers.Schedulers; 15 | 16 | public interface Avatar { 17 | Single build(String key, int sizePx); 18 | AvatarGraphics getGraphics(); 19 | } 20 | -------------------------------------------------------------------------------- /app/src/main/java/im/adamant/android/avatars/AvatarTypes.java: -------------------------------------------------------------------------------- 1 | package im.adamant.android.avatars; 2 | 3 | public interface AvatarTypes { 4 | String BORDER_ROUNDED ="border_rounded"; 5 | String SQUARE = "square"; 6 | } 7 | -------------------------------------------------------------------------------- /app/src/main/java/im/adamant/android/avatars/CachedAvatar.java: -------------------------------------------------------------------------------- 1 | package im.adamant.android.avatars; 2 | 3 | import android.graphics.Bitmap; 4 | import android.util.LruCache; 5 | 6 | import io.reactivex.Single; 7 | 8 | public class CachedAvatar implements Avatar { 9 | private final LruCache cache; 10 | private Avatar delegate; 11 | 12 | public CachedAvatar(Avatar delegate, int cacheSize) { 13 | this.delegate = delegate; 14 | cache = new LruCache<>(cacheSize); 15 | } 16 | 17 | @Override 18 | public Single build(String key, int sizePx) { 19 | String hashKey = key + sizePx; 20 | 21 | Bitmap bitmap = cache.get(hashKey); 22 | if (bitmap != null){return Single.just(bitmap);} 23 | 24 | return delegate 25 | .build(key, sizePx) 26 | .doOnSuccess(avatar -> cache.put(hashKey, avatar)); 27 | } 28 | 29 | @Override 30 | public AvatarGraphics getGraphics() { 31 | return null; 32 | } 33 | } 34 | -------------------------------------------------------------------------------- /app/src/main/java/im/adamant/android/avatars/PositionChecker.java: -------------------------------------------------------------------------------- 1 | package im.adamant.android.avatars; 2 | 3 | @FunctionalInterface 4 | public interface PositionChecker { 5 | boolean isIt(int coordinate); 6 | } 7 | -------------------------------------------------------------------------------- /app/src/main/java/im/adamant/android/core/DefaultAdamantApiBuilderImpl.java: -------------------------------------------------------------------------------- 1 | package im.adamant.android.core; 2 | 3 | import com.google.gson.Gson; 4 | 5 | import im.adamant.android.BuildConfig; 6 | import im.adamant.android.core.entities.ServerNode; 7 | import im.adamant.android.rx.ObservableRxList; 8 | import io.reactivex.Observable; 9 | import okhttp3.OkHttpClient; 10 | import okhttp3.logging.HttpLoggingInterceptor; 11 | import retrofit2.Retrofit; 12 | import retrofit2.adapter.rxjava2.RxJava2CallAdapterFactory; 13 | import retrofit2.converter.gson.GsonConverterFactory; 14 | 15 | public class DefaultAdamantApiBuilderImpl extends AdamantApiBuilder { 16 | public DefaultAdamantApiBuilderImpl(ObservableRxList nodes, Gson gson) { 17 | super(nodes, gson); 18 | } 19 | 20 | @Override 21 | protected void addInterceptors(OkHttpClient.Builder httpClient) { 22 | if (BuildConfig.DEBUG){ 23 | HttpLoggingInterceptor logging = new HttpLoggingInterceptor(); 24 | logging.setLevel(HttpLoggingInterceptor.Level.BODY); 25 | httpClient.addInterceptor(logging); 26 | } 27 | } 28 | } 29 | -------------------------------------------------------------------------------- /app/src/main/java/im/adamant/android/core/entities/Account.java: -------------------------------------------------------------------------------- 1 | package im.adamant.android.core.entities; 2 | 3 | public class Account { 4 | private String address; 5 | private long balance; 6 | private long unconfirmedBalance; 7 | private String publicKey; 8 | 9 | public long getBalance() { 10 | return balance; 11 | } 12 | 13 | public void setBalance(long balance) { 14 | this.balance = balance; 15 | } 16 | 17 | public long getUnconfirmedBalance() { 18 | return unconfirmedBalance; 19 | } 20 | 21 | public void setUnconfirmedBalance(long unconfirmedBalance) { 22 | this.unconfirmedBalance = unconfirmedBalance; 23 | } 24 | 25 | public String getPublicKey() { 26 | return publicKey; 27 | } 28 | 29 | public void setPublicKey(String publicKey) { 30 | this.publicKey = publicKey; 31 | } 32 | 33 | public String getAddress() { 34 | return address; 35 | } 36 | 37 | public String getPurifiedAddress() { 38 | return address.substring(1); 39 | } 40 | 41 | public void setAddress(String address) { 42 | this.address = address; 43 | } 44 | } 45 | -------------------------------------------------------------------------------- /app/src/main/java/im/adamant/android/core/entities/HasNodeTimestamp.java: -------------------------------------------------------------------------------- 1 | package im.adamant.android.core.entities; 2 | 3 | public interface HasNodeTimestamp { 4 | int getNodeTimestamp(); 5 | } 6 | -------------------------------------------------------------------------------- /app/src/main/java/im/adamant/android/core/entities/Participant.java: -------------------------------------------------------------------------------- 1 | package im.adamant.android.core.entities; 2 | 3 | public class Participant { 4 | private String address; 5 | private String publicKey; 6 | 7 | public String getAddress() { 8 | return address; 9 | } 10 | 11 | public void setAddress(String address) { 12 | this.address = address; 13 | } 14 | 15 | public String getPublicKey() { 16 | return publicKey; 17 | } 18 | 19 | public void setPublicKey(String publicKey) { 20 | this.publicKey = publicKey; 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /app/src/main/java/im/adamant/android/core/entities/WithBytesDigest.java: -------------------------------------------------------------------------------- 1 | package im.adamant.android.core.entities; 2 | 3 | public interface WithBytesDigest { 4 | int INTEGER_SIZE = 4; 5 | byte[] getBytesDigest(); 6 | } 7 | -------------------------------------------------------------------------------- /app/src/main/java/im/adamant/android/core/entities/transaction_assets/NotUsedAsset.java: -------------------------------------------------------------------------------- 1 | package im.adamant.android.core.entities.transaction_assets; 2 | 3 | public class NotUsedAsset implements TransactionAsset { 4 | @Override 5 | public byte[] getBytesDigest() { 6 | return new byte[0]; 7 | } 8 | } 9 | -------------------------------------------------------------------------------- /app/src/main/java/im/adamant/android/core/entities/transaction_assets/TransactionAsset.java: -------------------------------------------------------------------------------- 1 | package im.adamant.android.core.entities.transaction_assets; 2 | 3 | import im.adamant.android.core.entities.WithBytesDigest; 4 | 5 | public interface TransactionAsset extends WithBytesDigest { 6 | 7 | } 8 | -------------------------------------------------------------------------------- /app/src/main/java/im/adamant/android/core/entities/transaction_assets/TransactionChatAsset.java: -------------------------------------------------------------------------------- 1 | package im.adamant.android.core.entities.transaction_assets; 2 | 3 | import im.adamant.android.core.entities.TransactionMessage; 4 | 5 | public class TransactionChatAsset implements TransactionAsset { 6 | private TransactionMessage chat; 7 | 8 | public TransactionMessage getChat () 9 | { 10 | return chat; 11 | } 12 | 13 | public void setChat (TransactionMessage chat) 14 | { 15 | this.chat = chat; 16 | } 17 | 18 | @Override 19 | public String toString() 20 | { 21 | return this.getClass().getCanonicalName() + " [chat = " + chat + "]"; 22 | } 23 | 24 | @Override 25 | public byte[] getBytesDigest() { 26 | if(chat != null){ 27 | return chat.getBytesDigest(); 28 | } 29 | return new byte[0]; 30 | } 31 | } 32 | -------------------------------------------------------------------------------- /app/src/main/java/im/adamant/android/core/entities/transaction_assets/TransactionStateAsset.java: -------------------------------------------------------------------------------- 1 | package im.adamant.android.core.entities.transaction_assets; 2 | 3 | import im.adamant.android.core.entities.TransactionState; 4 | 5 | public class TransactionStateAsset implements TransactionAsset { 6 | private TransactionState state; 7 | 8 | public TransactionState getState() { 9 | return state; 10 | } 11 | 12 | public void setState(TransactionState state) { 13 | this.state = state; 14 | } 15 | 16 | @Override 17 | public byte[] getBytesDigest() { 18 | if (state == null){ 19 | return new byte[0]; 20 | } else { 21 | return state.getBytesDigest(); 22 | } 23 | } 24 | } 25 | -------------------------------------------------------------------------------- /app/src/main/java/im/adamant/android/core/exceptions/EmptyAdamantKeyValueStorage.java: -------------------------------------------------------------------------------- 1 | package im.adamant.android.core.exceptions; 2 | 3 | public class EmptyAdamantKeyValueStorage extends Exception { 4 | } 5 | -------------------------------------------------------------------------------- /app/src/main/java/im/adamant/android/core/exceptions/EncryptionException.java: -------------------------------------------------------------------------------- 1 | package im.adamant.android.core.exceptions; 2 | 3 | public class EncryptionException extends Exception { 4 | public EncryptionException(String message) { 5 | super(message); 6 | } 7 | 8 | public EncryptionException(String message, Throwable cause) { 9 | super(message, cause); 10 | } 11 | } 12 | -------------------------------------------------------------------------------- /app/src/main/java/im/adamant/android/core/exceptions/InvalidValueForKeyValueStorage.java: -------------------------------------------------------------------------------- 1 | package im.adamant.android.core.exceptions; 2 | 3 | public class InvalidValueForKeyValueStorage extends Exception { 4 | } 5 | -------------------------------------------------------------------------------- /app/src/main/java/im/adamant/android/core/exceptions/MessageDecryptException.java: -------------------------------------------------------------------------------- 1 | package im.adamant.android.core.exceptions; 2 | 3 | public class MessageDecryptException extends Exception { 4 | private String companionId; 5 | private String transactionId; 6 | private long timestamp; 7 | private boolean isISay; 8 | 9 | public MessageDecryptException(Throwable cause, String companionId, String transactionId, boolean isISay, long timestamp) { 10 | super(cause); 11 | this.companionId = companionId; 12 | this.timestamp = timestamp; 13 | this.isISay = isISay; 14 | this.transactionId = transactionId; 15 | } 16 | 17 | public MessageDecryptException(String message, String companionId, String transactionId, boolean isISay, long timestamp) { 18 | super(message); 19 | this.companionId = companionId; 20 | this.timestamp = timestamp; 21 | this.transactionId = transactionId; 22 | this.isISay = isISay; 23 | } 24 | 25 | public String getCompanionId() { 26 | return companionId; 27 | } 28 | 29 | public long getTimestamp() { 30 | return timestamp; 31 | } 32 | 33 | public boolean isISay() { 34 | return isISay; 35 | } 36 | 37 | public String getTransactionId() { 38 | return transactionId; 39 | } 40 | } 41 | -------------------------------------------------------------------------------- /app/src/main/java/im/adamant/android/core/exceptions/MessageTooShortException.java: -------------------------------------------------------------------------------- 1 | package im.adamant.android.core.exceptions; 2 | 3 | public class MessageTooShortException extends Exception { 4 | public MessageTooShortException(String message) { 5 | super(message); 6 | } 7 | } 8 | -------------------------------------------------------------------------------- /app/src/main/java/im/adamant/android/core/exceptions/NotAuthorizedException.java: -------------------------------------------------------------------------------- 1 | package im.adamant.android.core.exceptions; 2 | 3 | public class NotAuthorizedException extends Exception { 4 | public NotAuthorizedException(String message) { 5 | super(message); 6 | } 7 | } 8 | -------------------------------------------------------------------------------- /app/src/main/java/im/adamant/android/core/exceptions/NotEnoughAdamantBalanceException.java: -------------------------------------------------------------------------------- 1 | package im.adamant.android.core.exceptions; 2 | 3 | public class NotEnoughAdamantBalanceException extends Exception { 4 | public NotEnoughAdamantBalanceException(String message) { 5 | super(message); 6 | } 7 | } 8 | -------------------------------------------------------------------------------- /app/src/main/java/im/adamant/android/core/exceptions/NotFoundPublicKey.java: -------------------------------------------------------------------------------- 1 | package im.adamant.android.core.exceptions; 2 | 3 | public class NotFoundPublicKey extends Exception { 4 | public NotFoundPublicKey(String message) { 5 | super(message); 6 | } 7 | } 8 | -------------------------------------------------------------------------------- /app/src/main/java/im/adamant/android/core/exceptions/NotSupportedPushNotificationFacade.java: -------------------------------------------------------------------------------- 1 | package im.adamant.android.core.exceptions; 2 | 3 | public class NotSupportedPushNotificationFacade extends Exception { 4 | public NotSupportedPushNotificationFacade(String message) { 5 | super(message); 6 | } 7 | } 8 | -------------------------------------------------------------------------------- /app/src/main/java/im/adamant/android/core/exceptions/NotSupportedWalletFacade.java: -------------------------------------------------------------------------------- 1 | package im.adamant.android.core.exceptions; 2 | 3 | public class NotSupportedWalletFacade extends Exception { 4 | public NotSupportedWalletFacade(String message) { 5 | super(message); 6 | } 7 | } 8 | -------------------------------------------------------------------------------- /app/src/main/java/im/adamant/android/core/exceptions/WrongPincodeException.java: -------------------------------------------------------------------------------- 1 | package im.adamant.android.core.exceptions; 2 | 3 | public class WrongPincodeException extends Exception { 4 | public WrongPincodeException(String message) { 5 | super(message); 6 | } 7 | } 8 | -------------------------------------------------------------------------------- /app/src/main/java/im/adamant/android/core/kvs/KvsProvider.java: -------------------------------------------------------------------------------- 1 | package im.adamant.android.core.kvs; 2 | 3 | import im.adamant.android.core.entities.Transaction; 4 | import im.adamant.android.core.entities.TransactionState; 5 | import im.adamant.android.core.entities.transaction_assets.TransactionStateAsset; 6 | import io.reactivex.Completable; 7 | import io.reactivex.Flowable; 8 | 9 | public interface KvsProvider { 10 | Flowable> get(String key); 11 | Flowable> get(String key, String ownerAddress); 12 | Completable put(Transaction transaction); 13 | } 14 | -------------------------------------------------------------------------------- /app/src/main/java/im/adamant/android/core/requests/NewAccount.java: -------------------------------------------------------------------------------- 1 | package im.adamant.android.core.requests; 2 | 3 | public class NewAccount { 4 | private String publicKey; 5 | 6 | public String getPublicKey() { 7 | return publicKey; 8 | } 9 | 10 | public void setPublicKey(String publicKey) { 11 | this.publicKey = publicKey; 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /app/src/main/java/im/adamant/android/core/requests/ProcessTransaction.java: -------------------------------------------------------------------------------- 1 | package im.adamant.android.core.requests; 2 | 3 | import im.adamant.android.core.entities.Transaction; 4 | 5 | public class ProcessTransaction { 6 | private Transaction transaction; 7 | 8 | public ProcessTransaction(Transaction transaction) { 9 | this.transaction = transaction; 10 | } 11 | 12 | public Transaction getTransaction() { 13 | return transaction; 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /app/src/main/java/im/adamant/android/core/responses/Authorization.java: -------------------------------------------------------------------------------- 1 | package im.adamant.android.core.responses; 2 | 3 | import im.adamant.android.core.entities.Account; 4 | import im.adamant.android.core.entities.HasNodeTimestamp; 5 | 6 | public class Authorization implements HasNodeTimestamp { 7 | private int nodeTimestamp; 8 | private boolean success; 9 | private Account account; 10 | private String error; 11 | 12 | public boolean isSuccess() { 13 | return success; 14 | } 15 | 16 | public void setSuccess(boolean success) { 17 | this.success = success; 18 | } 19 | 20 | public Account getAccount() { 21 | return account; 22 | } 23 | 24 | public void setAccount(Account account) { 25 | this.account = account; 26 | } 27 | 28 | public String getError() { 29 | return error; 30 | } 31 | 32 | public void setError(String error) { 33 | this.error = error; 34 | } 35 | 36 | public int getNodeTimestamp() { 37 | return nodeTimestamp; 38 | } 39 | 40 | public void setNodeTimestamp(int nodeTimestamp) { 41 | this.nodeTimestamp = nodeTimestamp; 42 | } 43 | 44 | @Override 45 | public String toString() { 46 | String str = "Success: " + success + ". Account: "; 47 | if (account == null){ 48 | str += "null"; 49 | } else { 50 | str += account.getPublicKey() + ", Balance: " + account.getBalance(); 51 | } 52 | 53 | return str; 54 | } 55 | } 56 | -------------------------------------------------------------------------------- /app/src/main/java/im/adamant/android/core/responses/OperationComplete.java: -------------------------------------------------------------------------------- 1 | package im.adamant.android.core.responses; 2 | 3 | import im.adamant.android.core.entities.HasNodeTimestamp; 4 | 5 | public class OperationComplete implements HasNodeTimestamp { 6 | private int nodeTimestamp; 7 | private boolean success; 8 | private String transactionId; 9 | 10 | public int getNodeTimestamp() { 11 | return nodeTimestamp; 12 | } 13 | 14 | public void setNodeTimestamp(int nodeTimestamp) { 15 | this.nodeTimestamp = nodeTimestamp; 16 | } 17 | 18 | public boolean isSuccess() { 19 | return success; 20 | } 21 | 22 | public void setSuccess(boolean success) { 23 | this.success = success; 24 | } 25 | 26 | public String getTransactionId() { 27 | return transactionId; 28 | } 29 | 30 | public void setTransactionId(String transactionId) { 31 | this.transactionId = transactionId; 32 | } 33 | } 34 | -------------------------------------------------------------------------------- /app/src/main/java/im/adamant/android/core/responses/PublicKeyResponse.java: -------------------------------------------------------------------------------- 1 | package im.adamant.android.core.responses; 2 | 3 | import im.adamant.android.core.entities.HasNodeTimestamp; 4 | 5 | public class PublicKeyResponse implements HasNodeTimestamp { 6 | private int nodeTimestamp; 7 | private boolean success; 8 | private String publicKey; 9 | private String error; 10 | 11 | public boolean isSuccess() { 12 | return success; 13 | } 14 | 15 | public void setSuccess(boolean success) { 16 | this.success = success; 17 | } 18 | 19 | public String getPublicKey() { 20 | return publicKey; 21 | } 22 | 23 | public void setPublicKey(String publicKey) { 24 | this.publicKey = publicKey; 25 | } 26 | 27 | public String getError() { 28 | return error; 29 | } 30 | 31 | public void setError(String error) { 32 | this.error = error; 33 | } 34 | 35 | public int getNodeTimestamp() { 36 | return nodeTimestamp; 37 | } 38 | 39 | public void setNodeTimestamp(int nodeTimestamp) { 40 | this.nodeTimestamp = nodeTimestamp; 41 | } 42 | } 43 | -------------------------------------------------------------------------------- /app/src/main/java/im/adamant/android/core/responses/TransactionDetailsResponse.java: -------------------------------------------------------------------------------- 1 | package im.adamant.android.core.responses; 2 | 3 | import im.adamant.android.core.entities.HasNodeTimestamp; 4 | import im.adamant.android.core.entities.Transaction; 5 | 6 | public class TransactionDetailsResponse implements HasNodeTimestamp { 7 | private int nodeTimestamp; 8 | private boolean success; 9 | private Transaction transaction; 10 | private String error; 11 | 12 | public int getNodeTimestamp() { 13 | return nodeTimestamp; 14 | } 15 | 16 | public TransactionDetailsResponse setNodeTimestamp(int nodeTimestamp) { 17 | this.nodeTimestamp = nodeTimestamp; 18 | return this; 19 | } 20 | 21 | public boolean isSuccess() { 22 | return success; 23 | } 24 | 25 | public TransactionDetailsResponse setSuccess(boolean success) { 26 | this.success = success; 27 | return this; 28 | } 29 | 30 | public Transaction getTransaction() { 31 | return transaction; 32 | } 33 | 34 | public TransactionDetailsResponse setTransaction(Transaction transaction) { 35 | this.transaction = transaction; 36 | return this; 37 | } 38 | 39 | public String getError() { 40 | return error; 41 | } 42 | } 43 | -------------------------------------------------------------------------------- /app/src/main/java/im/adamant/android/core/responses/TransactionWasNormalized.java: -------------------------------------------------------------------------------- 1 | package im.adamant.android.core.responses; 2 | 3 | import im.adamant.android.core.entities.HasNodeTimestamp; 4 | import im.adamant.android.core.entities.Transaction; 5 | import im.adamant.android.core.entities.transaction_assets.TransactionAsset; 6 | 7 | public class TransactionWasNormalized implements HasNodeTimestamp { 8 | private int nodeTimestamp; 9 | private boolean success; 10 | private Transaction transaction; 11 | private String error; 12 | 13 | public boolean isSuccess() { 14 | return success; 15 | } 16 | 17 | public void setSuccess(boolean success) { 18 | this.success = success; 19 | } 20 | 21 | public Transaction getTransaction() { 22 | return transaction; 23 | } 24 | 25 | public void setTransaction(Transaction transaction) { 26 | this.transaction = transaction; 27 | } 28 | 29 | public String getError() { 30 | return error; 31 | } 32 | 33 | public void setError(String error) { 34 | this.error = error; 35 | } 36 | 37 | public int getNodeTimestamp() { 38 | return nodeTimestamp; 39 | } 40 | 41 | public void setNodeTimestamp(int nodeTimestamp) { 42 | this.nodeTimestamp = nodeTimestamp; 43 | } 44 | } 45 | -------------------------------------------------------------------------------- /app/src/main/java/im/adamant/android/core/responses/TransactionWasProcessed.java: -------------------------------------------------------------------------------- 1 | package im.adamant.android.core.responses; 2 | 3 | import im.adamant.android.core.entities.HasNodeTimestamp; 4 | 5 | public class TransactionWasProcessed implements HasNodeTimestamp { 6 | private int nodeTimestamp; 7 | private boolean success; 8 | private String transactionId; 9 | private String error; 10 | 11 | public boolean isSuccess() { 12 | return success; 13 | } 14 | 15 | public void setSuccess(boolean success) { 16 | this.success = success; 17 | } 18 | 19 | public String getTransactionId() { 20 | return transactionId; 21 | } 22 | 23 | public void setTransactionId(String transactionId) { 24 | this.transactionId = transactionId; 25 | } 26 | 27 | public int getNodeTimestamp() { 28 | return nodeTimestamp; 29 | } 30 | 31 | public void setNodeTimestamp(int nodeTimestamp) { 32 | this.nodeTimestamp = nodeTimestamp; 33 | } 34 | 35 | public String getError() { 36 | return error; 37 | } 38 | 39 | public void setError(String error) { 40 | this.error = error; 41 | } 42 | } 43 | -------------------------------------------------------------------------------- /app/src/main/java/im/adamant/android/dagger/AppComponent.java: -------------------------------------------------------------------------------- 1 | package im.adamant.android.dagger; 2 | 3 | import android.content.Context; 4 | 5 | import im.adamant.android.AdamantApplication; 6 | 7 | import javax.inject.Singleton; 8 | 9 | import dagger.BindsInstance; 10 | import dagger.Component; 11 | 12 | @Singleton 13 | @Component(modules = { 14 | AvatarsModule.class, 15 | EncryptionModule.class, 16 | MessagesModule.class, 17 | AdamantApiModule.class, 18 | WalletsModule.class, 19 | GeneralModule.class, 20 | MarkdownModule.class, 21 | InteractorsModule.class, 22 | PushNotificationsModule.class, 23 | AppModule.class 24 | }) 25 | public interface AppComponent { 26 | @Component.Builder 27 | interface Builder { 28 | @BindsInstance 29 | Builder context(Context context); 30 | AppComponent build(); 31 | } 32 | 33 | void inject(AdamantApplication app); 34 | } 35 | -------------------------------------------------------------------------------- /app/src/main/java/im/adamant/android/dagger/activities/ActivityScope.java: -------------------------------------------------------------------------------- 1 | package im.adamant.android.dagger.activities; 2 | 3 | import java.lang.annotation.Retention; 4 | import java.lang.annotation.RetentionPolicy; 5 | 6 | @Retention(RetentionPolicy.RUNTIME) 7 | public @interface ActivityScope {} 8 | -------------------------------------------------------------------------------- /app/src/main/java/im/adamant/android/dagger/activities/AllTransactionsScreenModule.java: -------------------------------------------------------------------------------- 1 | package im.adamant.android.dagger.activities; 2 | 3 | import dagger.Module; 4 | import dagger.Provides; 5 | import im.adamant.android.interactors.AccountInteractor; 6 | import im.adamant.android.interactors.WalletInteractor; 7 | import im.adamant.android.ui.adapters.CurrencyTransfersAdapter; 8 | import im.adamant.android.ui.presenters.AllTransactionsPresenter; 9 | import ru.terrakok.cicerone.Router; 10 | 11 | @Module 12 | public class AllTransactionsScreenModule { 13 | @ActivityScope 14 | @Provides 15 | public CurrencyTransfersAdapter provideAdapter(){ 16 | return new CurrencyTransfersAdapter(); 17 | } 18 | 19 | @ActivityScope 20 | @Provides 21 | public static AllTransactionsPresenter provideAllTransactionsPresenter( 22 | Router router, 23 | AccountInteractor accountInteractor, 24 | WalletInteractor walletInteractor 25 | ) { 26 | return new AllTransactionsPresenter( 27 | router, 28 | accountInteractor, 29 | walletInteractor 30 | ); 31 | } 32 | } 33 | -------------------------------------------------------------------------------- /app/src/main/java/im/adamant/android/dagger/activities/NodesListScreenModule.java: -------------------------------------------------------------------------------- 1 | package im.adamant.android.dagger.activities; 2 | 3 | import javax.inject.Named; 4 | 5 | import dagger.Module; 6 | import dagger.Provides; 7 | import im.adamant.android.Screens; 8 | import im.adamant.android.helpers.Settings; 9 | import im.adamant.android.interactors.ServerNodeInteractor; 10 | import im.adamant.android.ui.adapters.ServerNodeAdapter; 11 | import im.adamant.android.ui.presenters.NodesListPresenter; 12 | import io.reactivex.disposables.CompositeDisposable; 13 | 14 | @Module 15 | public class NodesListScreenModule { 16 | @ActivityScope 17 | @Provides 18 | public ServerNodeAdapter provideAdapter(Settings settings){ 19 | return new ServerNodeAdapter(settings.getNodes()); 20 | } 21 | 22 | @ActivityScope 23 | @Provides 24 | public static NodesListPresenter provideNodesListPresenter( 25 | ServerNodeInteractor serverNodeInteractor 26 | ) { 27 | return new NodesListPresenter( 28 | serverNodeInteractor 29 | ); 30 | } 31 | } 32 | -------------------------------------------------------------------------------- /app/src/main/java/im/adamant/android/dagger/activities/PincodeScreenModule.java: -------------------------------------------------------------------------------- 1 | package im.adamant.android.dagger.activities; 2 | 3 | import javax.inject.Named; 4 | 5 | import dagger.Module; 6 | import dagger.Provides; 7 | import im.adamant.android.Screens; 8 | import im.adamant.android.interactors.LogoutInteractor; 9 | import im.adamant.android.interactors.SecurityInteractor; 10 | import im.adamant.android.ui.adapters.KeyPinAdapter; 11 | import im.adamant.android.ui.presenters.PincodePresenter; 12 | import io.reactivex.disposables.CompositeDisposable; 13 | 14 | @Module 15 | public class PincodeScreenModule { 16 | 17 | @ActivityScope 18 | @Provides 19 | public static KeyPinAdapter provideKeyPinAdapter() { 20 | return new KeyPinAdapter(); 21 | } 22 | 23 | @ActivityScope 24 | @Provides 25 | public static PincodePresenter providePincodePresenter( 26 | SecurityInteractor securityInteractor, 27 | LogoutInteractor logoutInteractor 28 | ) { 29 | return new PincodePresenter(securityInteractor, logoutInteractor); 30 | } 31 | } 32 | -------------------------------------------------------------------------------- /app/src/main/java/im/adamant/android/dagger/activities/ScanQrCodeScreenModule.java: -------------------------------------------------------------------------------- 1 | package im.adamant.android.dagger.activities; 2 | 3 | import dagger.Module; 4 | 5 | @Module 6 | public class ScanQrCodeScreenModule { 7 | } 8 | -------------------------------------------------------------------------------- /app/src/main/java/im/adamant/android/dagger/activities/ShowQrCodeScreenModule.java: -------------------------------------------------------------------------------- 1 | package im.adamant.android.dagger.activities; 2 | 3 | import javax.inject.Named; 4 | 5 | import dagger.Module; 6 | import dagger.Provides; 7 | import im.adamant.android.Screens; 8 | import im.adamant.android.helpers.QrCodeHelper; 9 | import im.adamant.android.ui.presenters.ShowQrCodePresenter; 10 | import io.reactivex.disposables.CompositeDisposable; 11 | 12 | @Module 13 | public class ShowQrCodeScreenModule { 14 | 15 | @ActivityScope 16 | @Provides 17 | public static ShowQrCodePresenter provideShowQrCodePresenter( 18 | QrCodeHelper qrCodeHelper 19 | ) { 20 | return new ShowQrCodePresenter(qrCodeHelper); 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /app/src/main/java/im/adamant/android/dagger/activities/SplashScreenModule.java: -------------------------------------------------------------------------------- 1 | package im.adamant.android.dagger.activities; 2 | 3 | import javax.inject.Named; 4 | 5 | import dagger.Module; 6 | import dagger.Provides; 7 | import im.adamant.android.Screens; 8 | import io.reactivex.disposables.CompositeDisposable; 9 | 10 | @Module 11 | public class SplashScreenModule { 12 | @ActivityScope 13 | @Provides 14 | @Named(value = Screens.SPLASH_SCREEN) 15 | public CompositeDisposable provideComposite() { 16 | return new CompositeDisposable(); 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /app/src/main/java/im/adamant/android/dagger/activities/TransferDetailsScreenModule.java: -------------------------------------------------------------------------------- 1 | package im.adamant.android.dagger.activities; 2 | 3 | import dagger.Module; 4 | import dagger.Provides; 5 | import im.adamant.android.interactors.AccountInteractor; 6 | import im.adamant.android.interactors.TransferDetailsInteractor; 7 | import im.adamant.android.interactors.chats.ChatsStorage; 8 | import im.adamant.android.ui.presenters.TransferDetailsPresenter; 9 | import ru.terrakok.cicerone.Router; 10 | 11 | @Module 12 | public class TransferDetailsScreenModule { 13 | @ActivityScope 14 | @Provides 15 | public TransferDetailsPresenter provideTransferDetailsPresenter(Router router, AccountInteractor accountInteractor, 16 | TransferDetailsInteractor interactor, ChatsStorage chatsStorage) { 17 | return new TransferDetailsPresenter(router, accountInteractor, interactor, chatsStorage); 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /app/src/main/java/im/adamant/android/dagger/fragments/BottomLoginModule.java: -------------------------------------------------------------------------------- 1 | package im.adamant.android.dagger.fragments; 2 | 3 | import javax.inject.Named; 4 | import javax.inject.Singleton; 5 | 6 | import dagger.Module; 7 | import dagger.Provides; 8 | import im.adamant.android.Screens; 9 | import im.adamant.android.interactors.AuthorizeInteractor; 10 | import im.adamant.android.ui.presenters.LoginPresenter; 11 | import io.reactivex.disposables.CompositeDisposable; 12 | import ru.terrakok.cicerone.Router; 13 | 14 | @Module 15 | public class BottomLoginModule { 16 | @FragmentScope 17 | @Provides 18 | public static LoginPresenter provideLoginPresenter( 19 | Router router, 20 | AuthorizeInteractor interactor 21 | ){ 22 | return new LoginPresenter(router, interactor); 23 | } 24 | } 25 | -------------------------------------------------------------------------------- /app/src/main/java/im/adamant/android/dagger/fragments/ChatsScreenModule.java: -------------------------------------------------------------------------------- 1 | package im.adamant.android.dagger.fragments; 2 | 3 | import im.adamant.android.avatars.Avatar; 4 | import im.adamant.android.interactors.AccountInteractor; 5 | import im.adamant.android.interactors.chats.ChatInteractor; 6 | import im.adamant.android.ui.presenters.ChatsPresenter; 7 | import im.adamant.android.interactors.chats.ChatsStorage; 8 | import im.adamant.android.ui.adapters.ChatsAdapter; 9 | 10 | import dagger.Module; 11 | import dagger.Provides; 12 | import im.adamant.android.ui.fragments.ChatsScreen; 13 | import ru.terrakok.cicerone.Router; 14 | 15 | @Module 16 | public class ChatsScreenModule { 17 | @FragmentScope 18 | @Provides 19 | public ChatsAdapter provideAdapter( 20 | ChatsScreen chatsScreen, 21 | Avatar avatar 22 | ){ 23 | return new ChatsAdapter(null, chatsScreen, avatar); 24 | } 25 | 26 | @FragmentScope 27 | @Provides 28 | public static ChatsPresenter provideChatsPresenter( 29 | Router router, 30 | ChatInteractor chatInteractor, 31 | AccountInteractor accountInteractor, 32 | ChatsStorage chatsStorage 33 | ){ 34 | return new ChatsPresenter(router, accountInteractor, chatInteractor, chatsStorage); 35 | } 36 | } 37 | -------------------------------------------------------------------------------- /app/src/main/java/im/adamant/android/dagger/fragments/FragmentScope.java: -------------------------------------------------------------------------------- 1 | package im.adamant.android.dagger.fragments; 2 | 3 | import java.lang.annotation.Retention; 4 | import java.lang.annotation.RetentionPolicy; 5 | 6 | @Retention(RetentionPolicy.RUNTIME) 7 | public @interface FragmentScope { } 8 | -------------------------------------------------------------------------------- /app/src/main/java/im/adamant/android/dagger/receivers/BootCompletedBroadcastReceiverModule.java: -------------------------------------------------------------------------------- 1 | package im.adamant.android.dagger.receivers; 2 | 3 | import dagger.Module; 4 | 5 | @Module 6 | public class BootCompletedBroadcastReceiverModule { 7 | } 8 | -------------------------------------------------------------------------------- /app/src/main/java/im/adamant/android/dagger/receivers/ReceiverScope.java: -------------------------------------------------------------------------------- 1 | package im.adamant.android.dagger.receivers; 2 | 3 | import java.lang.annotation.Retention; 4 | import java.lang.annotation.RetentionPolicy; 5 | 6 | @Retention(RetentionPolicy.RUNTIME) 7 | public @interface ReceiverScope {} 8 | -------------------------------------------------------------------------------- /app/src/main/java/im/adamant/android/dagger/services/AdamantBalanceUpdateServiceModule.java: -------------------------------------------------------------------------------- 1 | package im.adamant.android.dagger.services; 2 | 3 | import javax.inject.Named; 4 | 5 | import dagger.Module; 6 | import dagger.Provides; 7 | import io.reactivex.disposables.CompositeDisposable; 8 | 9 | @Module 10 | public class AdamantBalanceUpdateServiceModule { 11 | public static final String NAME = "BalanceUpdateServiceModule"; 12 | 13 | @ServiceScope 14 | @Provides 15 | @Named(NAME) 16 | public static CompositeDisposable provideDisposable() { 17 | return new CompositeDisposable(); 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /app/src/main/java/im/adamant/android/dagger/services/AdamantFirebaseMessagingServiceModule.java: -------------------------------------------------------------------------------- 1 | package im.adamant.android.dagger.services; 2 | 3 | import dagger.Module; 4 | 5 | @Module 6 | public class AdamantFirebaseMessagingServiceModule { } 7 | -------------------------------------------------------------------------------- /app/src/main/java/im/adamant/android/dagger/services/AdamantLocalMessagingServiceModule.java: -------------------------------------------------------------------------------- 1 | package im.adamant.android.dagger.services; 2 | 3 | import dagger.Module; 4 | 5 | @Module 6 | public class AdamantLocalMessagingServiceModule { 7 | } 8 | -------------------------------------------------------------------------------- /app/src/main/java/im/adamant/android/dagger/services/SaveContactsServiceModule.java: -------------------------------------------------------------------------------- 1 | package im.adamant.android.dagger.services; 2 | 3 | import javax.inject.Named; 4 | 5 | import dagger.Module; 6 | import dagger.Provides; 7 | import io.reactivex.disposables.CompositeDisposable; 8 | 9 | @Module 10 | public class SaveContactsServiceModule { 11 | public static final String NAME = "SaveContactsServiceModule"; 12 | 13 | @ServiceScope 14 | @Provides 15 | @Named(NAME) 16 | public static CompositeDisposable provideDisposable() { 17 | return new CompositeDisposable(); 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /app/src/main/java/im/adamant/android/dagger/services/ServerNodePingServiceModule.java: -------------------------------------------------------------------------------- 1 | package im.adamant.android.dagger.services; 2 | 3 | import javax.inject.Named; 4 | 5 | import dagger.Module; 6 | import dagger.Provides; 7 | import io.reactivex.disposables.CompositeDisposable; 8 | 9 | @Module 10 | public class ServerNodePingServiceModule { 11 | public static final String NAME = "ServerNodePingServiceModule"; 12 | 13 | @ServiceScope 14 | @Provides 15 | @Named(NAME) 16 | public static CompositeDisposable provideDisposable() { 17 | return new CompositeDisposable(); 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /app/src/main/java/im/adamant/android/dagger/services/ServiceScope.java: -------------------------------------------------------------------------------- 1 | package im.adamant.android.dagger.services; 2 | 3 | import java.lang.annotation.Retention; 4 | import java.lang.annotation.RetentionPolicy; 5 | 6 | @Retention(RetentionPolicy.RUNTIME) 7 | public @interface ServiceScope {} 8 | -------------------------------------------------------------------------------- /app/src/main/java/im/adamant/android/helpers/AdamantAddressValidateHelper.java: -------------------------------------------------------------------------------- 1 | package im.adamant.android.helpers; 2 | 3 | public class AdamantAddressValidateHelper { 4 | public static boolean validate(String address) { 5 | if (address == null || address.isEmpty()) { return false; } 6 | try { 7 | if (!"U".equalsIgnoreCase(address.substring(0, 1))) { return false; } 8 | if (address.length() < 16){return false;} 9 | }catch (Exception ex){ 10 | ex.printStackTrace(); 11 | return false; 12 | } 13 | 14 | return true; 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /app/src/main/java/im/adamant/android/helpers/BalanceConvertHelper.java: -------------------------------------------------------------------------------- 1 | package im.adamant.android.helpers; 2 | 3 | import java.math.BigDecimal; 4 | import java.math.RoundingMode; 5 | 6 | public class BalanceConvertHelper { 7 | public static final BigDecimal MULTIPLIER = new BigDecimal(100_000_000L); 8 | 9 | public static BigDecimal convert(long balance) { 10 | return (new BigDecimal(balance)) 11 | .divide( 12 | MULTIPLIER, 13 | 3, 14 | RoundingMode.HALF_EVEN 15 | ); 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /app/src/main/java/im/adamant/android/helpers/HtmlHelper.java: -------------------------------------------------------------------------------- 1 | package im.adamant.android.helpers; 2 | 3 | import android.os.Build; 4 | import android.text.Html; 5 | import android.text.Spanned; 6 | 7 | import static android.text.Html.FROM_HTML_MODE_LEGACY; 8 | 9 | public class HtmlHelper { 10 | @SuppressWarnings("deprecation") 11 | public static Spanned fromHtml(String html){ 12 | if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) { 13 | return Html.fromHtml(html, FROM_HTML_MODE_LEGACY); 14 | } else { 15 | return Html.fromHtml(html); 16 | } 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /app/src/main/java/im/adamant/android/helpers/PublicKeyStorage.java: -------------------------------------------------------------------------------- 1 | package im.adamant.android.helpers; 2 | 3 | import android.util.Pair; 4 | 5 | import im.adamant.android.core.entities.Transaction; 6 | import im.adamant.android.core.responses.ChatList; 7 | import io.reactivex.Flowable; 8 | 9 | public interface PublicKeyStorage { 10 | void setPublicKey(String address, String publicKey); 11 | Flowable findPublicKey(String address); 12 | void savePublicKeysFromParticipant(ChatList.ChatDescription description); 13 | Pair> combinePublicKeyWithTransaction(Transaction transaction) throws Exception; 14 | } 15 | -------------------------------------------------------------------------------- /app/src/main/java/im/adamant/android/interactors/AccountInteractor.java: -------------------------------------------------------------------------------- 1 | package im.adamant.android.interactors; 2 | 3 | import java.math.BigDecimal; 4 | 5 | import im.adamant.android.core.AdamantApiWrapper; 6 | import im.adamant.android.helpers.BalanceConvertHelper; 7 | import im.adamant.android.interactors.chats.ChatsStorage; 8 | import im.adamant.android.helpers.Settings; 9 | import io.reactivex.Flowable; 10 | 11 | public class AccountInteractor { 12 | private AdamantApiWrapper api; 13 | private Settings settings; 14 | private ChatsStorage chatsStorage; 15 | 16 | public AccountInteractor( 17 | AdamantApiWrapper api, 18 | Settings settings, 19 | ChatsStorage chatsStorage 20 | ) { 21 | this.api = api; 22 | this.settings = settings; 23 | this.chatsStorage = chatsStorage; 24 | } 25 | 26 | public Flowable getAdamantBalance() { 27 | return Flowable.fromCallable(this::getBalance); 28 | } 29 | 30 | public boolean isAuthorized() { 31 | return api.isAuthorized(); 32 | } 33 | 34 | private BigDecimal getBalance() { 35 | if (api.isAuthorized()){ 36 | return BalanceConvertHelper.convert(api.getAccount().getUnconfirmedBalance()); 37 | } else { 38 | return BigDecimal.ZERO; 39 | } 40 | } 41 | } 42 | -------------------------------------------------------------------------------- /app/src/main/java/im/adamant/android/interactors/ServerNodeInteractor.java: -------------------------------------------------------------------------------- 1 | package im.adamant.android.interactors; 2 | 3 | import im.adamant.android.core.AdamantApiWrapper; 4 | import im.adamant.android.core.entities.ServerNode; 5 | import im.adamant.android.helpers.Settings; 6 | 7 | public class ServerNodeInteractor { 8 | private Settings settings; 9 | private AdamantApiWrapper api; 10 | 11 | public ServerNodeInteractor(AdamantApiWrapper api, Settings settings) { 12 | this.settings = settings; 13 | this.api = api; 14 | } 15 | 16 | public void addServerNode(String nodeUrl){ 17 | settings.addNode(new ServerNode(nodeUrl)); 18 | } 19 | 20 | public void deleteNode(ServerNode node){settings.removeNode(node);} 21 | 22 | public void switchNode(int index) { 23 | api.buildApibyIndex(index); 24 | } 25 | 26 | public void resetToDefaults() { 27 | settings.resetNodesToDefault(); 28 | api.buildApibyIndex(0); 29 | } 30 | } 31 | -------------------------------------------------------------------------------- /app/src/main/java/im/adamant/android/interactors/push/DisabledNotificationServiceFacade.java: -------------------------------------------------------------------------------- 1 | package im.adamant.android.interactors.push; 2 | 3 | import im.adamant.android.R; 4 | import io.reactivex.Completable; 5 | 6 | 7 | public class DisabledNotificationServiceFacade implements PushNotificationServiceFacade { 8 | @Override 9 | public int getTitleResource() { 10 | return R.string.disabled_notification_service_full; 11 | } 12 | 13 | @Override 14 | public int getShortTitleResource() { 15 | return R.string.disabled_notification_service_short; 16 | } 17 | 18 | @Override 19 | public int getDescriptionResource() { 20 | return R.string.disabled_notification_service_description; 21 | } 22 | 23 | @Override 24 | public SupportedPushNotificationFacadeType getFacadeType() { 25 | return SupportedPushNotificationFacadeType.DISABLED; 26 | } 27 | 28 | @Override 29 | public Completable subscribe() { 30 | return Completable.complete(); 31 | } 32 | 33 | @Override 34 | public Completable unsubscribe() { 35 | return Completable.complete(); 36 | } 37 | 38 | } 39 | -------------------------------------------------------------------------------- /app/src/main/java/im/adamant/android/interactors/push/PushNotificationServiceFacade.java: -------------------------------------------------------------------------------- 1 | package im.adamant.android.interactors.push; 2 | 3 | import io.reactivex.Completable; 4 | import io.reactivex.Flowable; 5 | 6 | public interface PushNotificationServiceFacade { 7 | // enum Event { 8 | // SUBSCRIBED, 9 | // UNSUBSCRIBED 10 | // } 11 | 12 | int getTitleResource(); 13 | int getShortTitleResource(); 14 | int getDescriptionResource(); 15 | 16 | SupportedPushNotificationFacadeType getFacadeType(); 17 | 18 | Completable subscribe(); 19 | Completable unsubscribe(); 20 | 21 | } 22 | -------------------------------------------------------------------------------- /app/src/main/java/im/adamant/android/interactors/push/SupportedPushNotificationFacadeType.java: -------------------------------------------------------------------------------- 1 | package im.adamant.android.interactors.push; 2 | 3 | public enum SupportedPushNotificationFacadeType { 4 | FCM, 5 | LOCAL_SERVICE, 6 | DISABLED 7 | } 8 | -------------------------------------------------------------------------------- /app/src/main/java/im/adamant/android/interactors/push/SupportedPushNotificationFacadeTypeKey.java: -------------------------------------------------------------------------------- 1 | package im.adamant.android.interactors.push; 2 | 3 | import dagger.MapKey; 4 | 5 | @MapKey 6 | public @interface SupportedPushNotificationFacadeTypeKey { 7 | SupportedPushNotificationFacadeType value(); 8 | } 9 | -------------------------------------------------------------------------------- /app/src/main/java/im/adamant/android/interactors/wallets/SupportedWalletFacadeType.java: -------------------------------------------------------------------------------- 1 | package im.adamant.android.interactors.wallets; 2 | 3 | public enum SupportedWalletFacadeType { 4 | ADM, 5 | ETH, 6 | BNB 7 | } 8 | -------------------------------------------------------------------------------- /app/src/main/java/im/adamant/android/interactors/wallets/SupportedWalletFacadeTypeKey.java: -------------------------------------------------------------------------------- 1 | package im.adamant.android.interactors.wallets; 2 | 3 | import dagger.MapKey; 4 | 5 | @MapKey 6 | public @interface SupportedWalletFacadeTypeKey { 7 | SupportedWalletFacadeType value(); 8 | } 9 | -------------------------------------------------------------------------------- /app/src/main/java/im/adamant/android/interactors/wallets/WalletFacade.java: -------------------------------------------------------------------------------- 1 | package im.adamant.android.interactors.wallets; 2 | 3 | import java.math.BigDecimal; 4 | import java.util.List; 5 | 6 | import im.adamant.android.interactors.chats.ChatsStorage; 7 | import im.adamant.android.interactors.wallets.entities.TransferDetails; 8 | import im.adamant.android.ui.entities.CurrencyTransferEntity; 9 | import io.reactivex.Flowable; 10 | import io.reactivex.Single; 11 | 12 | //Facade is needed to simplify each blockchain's API for working with a wallet. 13 | public interface WalletFacade { 14 | BigDecimal getBalance(); 15 | String getAddress(); 16 | SupportedWalletFacadeType getCurrencyType(); 17 | String getTitle(); 18 | int getPrecision(); 19 | int getBackgroundLogoResource(); 20 | void setChatStorage(ChatsStorage chatStorage); 21 | Single> getLastTransfers(); 22 | Flowable getNewTransfers(); 23 | Flowable getNextTransfers(int offset); 24 | boolean isAvailableAirdropLink(); 25 | int getAirdropLinkResource(); 26 | String getAirdropLinkString(); 27 | boolean isSupportFundsSending(); 28 | Flowable getFee(); 29 | String getCurrencyAddress(String adamantAddress, String adamantPublicKey); 30 | int getIconForEditText(); 31 | boolean isSupportComment(); 32 | Flowable getTransferDetails(String id); 33 | String getExplorerUrl(String transactionId); 34 | } 35 | -------------------------------------------------------------------------------- /app/src/main/java/im/adamant/android/interactors/wallets/entities/ADMTransferDetails.java: -------------------------------------------------------------------------------- 1 | package im.adamant.android.interactors.wallets.entities; 2 | 3 | public class ADMTransferDetails extends TransferDetails { 4 | @Override 5 | public STATUS getStatus() { 6 | if (getConfirmations() > 0) { 7 | return STATUS.SUCCESS; 8 | } else { 9 | return STATUS.PENDING; 10 | } 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /app/src/main/java/im/adamant/android/markdown/AdamantAddressEntity.java: -------------------------------------------------------------------------------- 1 | package im.adamant.android.markdown; 2 | 3 | import java.util.Objects; 4 | 5 | public class AdamantAddressEntity { 6 | private String address; 7 | private String label = ""; 8 | 9 | public String getAddress() { 10 | return address; 11 | } 12 | 13 | public void setAddress(String address) { 14 | this.address = address; 15 | } 16 | 17 | public String getLabel() { 18 | return label; 19 | } 20 | 21 | public void setLabel(String label) { 22 | this.label = label; 23 | } 24 | 25 | @Override 26 | public String toString() { 27 | return address + " : " + Objects.toString(label); 28 | } 29 | } 30 | -------------------------------------------------------------------------------- /app/src/main/java/im/adamant/android/markdown/renderers/BlockRenderer.java: -------------------------------------------------------------------------------- 1 | package im.adamant.android.markdown.renderers; 2 | 3 | import java.util.List; 4 | 5 | import androidx.annotation.NonNull; 6 | 7 | public interface BlockRenderer { 8 | @NonNull 9 | String getContentBlock(String s); 10 | String renderBlock(String s); 11 | } 12 | -------------------------------------------------------------------------------- /app/src/main/java/im/adamant/android/markdown/renderers/InlineRenderer.java: -------------------------------------------------------------------------------- 1 | package im.adamant.android.markdown.renderers; 2 | 3 | import java.util.regex.Matcher; 4 | import java.util.regex.Pattern; 5 | 6 | public interface InlineRenderer { 7 | Pattern providePattern(); 8 | void renderItem(StringBuilder itemBuilder, Matcher matcher); 9 | } 10 | -------------------------------------------------------------------------------- /app/src/main/java/im/adamant/android/markdown/renderers/block/QuoteBlockRenderer.java: -------------------------------------------------------------------------------- 1 | package im.adamant.android.markdown.renderers.block; 2 | 3 | import java.util.regex.Matcher; 4 | import java.util.regex.Pattern; 5 | 6 | import androidx.annotation.NonNull; 7 | import im.adamant.android.markdown.renderers.BlockRenderer; 8 | 9 | public class QuoteBlockRenderer implements BlockRenderer { 10 | public static final Pattern PATTERN = Pattern.compile("^> (.*)"); 11 | 12 | // @Override 13 | // public BlockDescription getNextBlock(StringBuilder s) { 14 | // Matcher matcher = PATTERN.matcher(s); 15 | // if (matcher.find()) { 16 | // return new BlockDescription(matcher.group(1), matcher.group().length()) ; 17 | // } else { 18 | // return null; 19 | // } 20 | // } 21 | 22 | @NonNull 23 | @Override 24 | public String getContentBlock(String s) { 25 | Matcher matcher = PATTERN.matcher(s); 26 | if (matcher.find()) { 27 | return matcher.group(1); 28 | } else { 29 | return ""; 30 | } 31 | } 32 | 33 | @Override 34 | public String renderBlock(String s) { 35 | return "
" + s + "
"; 36 | } 37 | } 38 | -------------------------------------------------------------------------------- /app/src/main/java/im/adamant/android/markdown/renderers/inline/AdamantLinkRenderer.java: -------------------------------------------------------------------------------- 1 | package im.adamant.android.markdown.renderers.inline; 2 | 3 | import java.util.regex.Matcher; 4 | import java.util.regex.Pattern; 5 | 6 | import im.adamant.android.markdown.renderers.InlineRenderer; 7 | 8 | 9 | public class AdamantLinkRenderer implements InlineRenderer { 10 | public static final Pattern PATTERN = Pattern.compile("U(\\d{15,})(\\?\\S*\\b)*"); 11 | 12 | @Override 13 | public Pattern providePattern() { 14 | return PATTERN; 15 | } 16 | 17 | @Override 18 | public void renderItem(StringBuilder builder, Matcher matcher) { 19 | builder.append(" 1){ 23 | String params = matcher.group(2); 24 | if (params != null){ 25 | builder.append("&"); 26 | builder.append(params.substring(1)); 27 | } 28 | } 29 | 30 | builder.append("\">"); 31 | builder.append(matcher.group(1)); 32 | builder.append(""); 33 | } 34 | 35 | 36 | } 37 | -------------------------------------------------------------------------------- /app/src/main/java/im/adamant/android/markdown/renderers/inline/AllowedOtherLinkRenderer.java: -------------------------------------------------------------------------------- 1 | package im.adamant.android.markdown.renderers.inline; 2 | 3 | import java.util.regex.Matcher; 4 | import java.util.regex.Pattern; 5 | 6 | import im.adamant.android.markdown.renderers.InlineRenderer; 7 | 8 | public class AllowedOtherLinkRenderer implements InlineRenderer { 9 | public static final Pattern PATTERN = Pattern.compile("((eth|bch|bitcoin|https?|s?ftp|magnet|tor|onion|tg):([^\\s\\x00-\\x1f<>]+[^\\s\\x00-\\x1f<>.]))\\b"); 10 | 11 | @Override 12 | public Pattern providePattern() { 13 | return PATTERN; 14 | } 15 | 16 | @Override 17 | public void renderItem(StringBuilder builder, Matcher matcher) { 18 | builder.append(""); 21 | builder.append(matcher.group(1)); 22 | builder.append(""); 23 | } 24 | } 25 | -------------------------------------------------------------------------------- /app/src/main/java/im/adamant/android/markdown/renderers/inline/BoldRenderer.java: -------------------------------------------------------------------------------- 1 | package im.adamant.android.markdown.renderers.inline; 2 | 3 | import java.util.regex.Matcher; 4 | import java.util.regex.Pattern; 5 | 6 | import im.adamant.android.markdown.renderers.InlineRenderer; 7 | 8 | public class BoldRenderer implements InlineRenderer { 9 | public static final Pattern PATTERN = Pattern.compile("\\*\\*([^*]+?)\\*\\*"); 10 | 11 | @Override 12 | public Pattern providePattern() { 13 | return PATTERN; 14 | } 15 | 16 | @Override 17 | public void renderItem(StringBuilder itemBuilder, Matcher matcher) { 18 | itemBuilder.append(""); 19 | itemBuilder.append(matcher.group(1)); 20 | itemBuilder.append(""); 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /app/src/main/java/im/adamant/android/markdown/renderers/inline/EmailLinkRenderer.java: -------------------------------------------------------------------------------- 1 | package im.adamant.android.markdown.renderers.inline; 2 | 3 | import java.util.regex.Matcher; 4 | import java.util.regex.Pattern; 5 | 6 | import im.adamant.android.markdown.renderers.InlineRenderer; 7 | 8 | public class EmailLinkRenderer implements InlineRenderer { 9 | public static final Pattern PATTERN = Pattern.compile("[a-zA-Z0-9.!#$%&'*+/=?^_`{|}~-]+(@)[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)+(?![-_])"); 10 | 11 | @Override 12 | public Pattern providePattern() { 13 | return PATTERN; 14 | } 15 | 16 | @Override 17 | public void renderItem(StringBuilder builder, Matcher matcher) { 18 | builder.append(""); 21 | builder.append(matcher.group(0)); 22 | builder.append(""); 23 | } 24 | } 25 | -------------------------------------------------------------------------------- /app/src/main/java/im/adamant/android/markdown/renderers/inline/ItalicRenderer.java: -------------------------------------------------------------------------------- 1 | package im.adamant.android.markdown.renderers.inline; 2 | 3 | import java.util.regex.Matcher; 4 | import java.util.regex.Pattern; 5 | 6 | import im.adamant.android.markdown.renderers.InlineRenderer; 7 | 8 | public class ItalicRenderer implements InlineRenderer { 9 | public static final Pattern PATTERN = Pattern.compile("_([^*]+?)_|\\*([^*]+?)\\*"); 10 | 11 | @Override 12 | public Pattern providePattern() { 13 | return PATTERN; 14 | } 15 | 16 | @Override 17 | public void renderItem(StringBuilder itemBuilder, Matcher matcher) { 18 | if (matcher.group(2) != null) { 19 | itemBuilder.append(""); 20 | itemBuilder.append(matcher.group(2)); 21 | itemBuilder.append(""); 22 | } else if (matcher.group(1) != null) { 23 | itemBuilder.append(""); 24 | itemBuilder.append(matcher.group(1)); 25 | itemBuilder.append(""); 26 | } 27 | } 28 | } 29 | -------------------------------------------------------------------------------- /app/src/main/java/im/adamant/android/markdown/renderers/inline/NewLineRenderer.java: -------------------------------------------------------------------------------- 1 | package im.adamant.android.markdown.renderers.inline; 2 | 3 | import java.util.regex.Matcher; 4 | import java.util.regex.Pattern; 5 | 6 | import im.adamant.android.markdown.renderers.InlineRenderer; 7 | 8 | public class NewLineRenderer implements InlineRenderer { 9 | public static final Pattern PATTERN = Pattern.compile("\\n"); 10 | 11 | @Override 12 | public Pattern providePattern() { 13 | return PATTERN; 14 | } 15 | 16 | @Override 17 | public void renderItem(StringBuilder builder, Matcher matcher) { 18 | builder.append("
"); 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /app/src/main/java/im/adamant/android/markdown/renderers/inline/StrikeRenderer.java: -------------------------------------------------------------------------------- 1 | package im.adamant.android.markdown.renderers.inline; 2 | 3 | import java.util.regex.Matcher; 4 | import java.util.regex.Pattern; 5 | 6 | import im.adamant.android.markdown.renderers.InlineRenderer; 7 | 8 | public class StrikeRenderer implements InlineRenderer { 9 | public static final Pattern PATTERN = Pattern.compile("~([^*]+)~"); 10 | 11 | @Override 12 | public Pattern providePattern() { 13 | return PATTERN; 14 | } 15 | 16 | @Override 17 | public void renderItem(StringBuilder itemBuilder, Matcher matcher) { 18 | itemBuilder.append(""); 19 | itemBuilder.append(matcher.group(1)); 20 | itemBuilder.append(""); 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /app/src/main/java/im/adamant/android/rx/Irrelevant.java: -------------------------------------------------------------------------------- 1 | package im.adamant.android.rx; 2 | 3 | public enum Irrelevant { INSTANCE } 4 | -------------------------------------------------------------------------------- /app/src/main/java/im/adamant/android/ui/adapters/CardAdapter.java: -------------------------------------------------------------------------------- 1 | package im.adamant.android.ui.adapters; 2 | 3 | import androidx.cardview.widget.CardView; 4 | 5 | public interface CardAdapter { 6 | 7 | int MAX_ELEVATION_FACTOR = 3; 8 | 9 | float getBaseElevation(); 10 | 11 | CardView getCardViewAt(int position); 12 | 13 | int getCount(); 14 | } 15 | -------------------------------------------------------------------------------- /app/src/main/java/im/adamant/android/ui/adapters/WelcomeCardsAdapter.java: -------------------------------------------------------------------------------- 1 | package im.adamant.android.ui.adapters; 2 | 3 | import android.view.LayoutInflater; 4 | import android.view.View; 5 | import android.view.ViewGroup; 6 | 7 | import java.util.ArrayList; 8 | import java.util.Collection; 9 | import java.util.List; 10 | 11 | import androidx.annotation.NonNull; 12 | import androidx.recyclerview.widget.RecyclerView; 13 | import im.adamant.android.R; 14 | import im.adamant.android.ui.entities.WelcomeCard; 15 | import im.adamant.android.ui.holders.WelcomeCardHolder; 16 | 17 | public class WelcomeCardsAdapter extends RecyclerView.Adapter { 18 | private List cards = new ArrayList<>(); 19 | 20 | public WelcomeCardsAdapter(List cards) { 21 | if (cards != null) { 22 | this.cards = cards; 23 | } 24 | } 25 | 26 | @NonNull 27 | @Override 28 | public WelcomeCardHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) { 29 | LayoutInflater inflater = LayoutInflater.from(parent.getContext()); 30 | View v = inflater.inflate(R.layout.list_item_welcome_card, parent, false); 31 | return new WelcomeCardHolder(v); 32 | } 33 | 34 | @Override 35 | public void onBindViewHolder(@NonNull WelcomeCardHolder holder, int position) { 36 | holder.bind(cards.get(position)); 37 | } 38 | 39 | @Override 40 | public int getItemCount() { 41 | return cards.size(); 42 | } 43 | } 44 | -------------------------------------------------------------------------------- /app/src/main/java/im/adamant/android/ui/custom_view/IgnoreLastDividerItemDecorator.java: -------------------------------------------------------------------------------- 1 | package im.adamant.android.ui.custom_view; 2 | 3 | import android.graphics.Canvas; 4 | import android.graphics.drawable.Drawable; 5 | import android.view.View; 6 | 7 | import org.jetbrains.annotations.NotNull; 8 | 9 | import androidx.recyclerview.widget.RecyclerView; 10 | 11 | public class IgnoreLastDividerItemDecorator extends RecyclerView.ItemDecoration { 12 | private Drawable mDivider; 13 | 14 | public IgnoreLastDividerItemDecorator(Drawable divider) { 15 | mDivider = divider; 16 | } 17 | 18 | @Override 19 | public void onDraw(@NotNull Canvas canvas, @NotNull RecyclerView parent, @NotNull RecyclerView.State state) { 20 | int dividerLeft = parent.getPaddingLeft(); 21 | int dividerRight = parent.getWidth() - parent.getPaddingRight(); 22 | 23 | int childCount = parent.getChildCount(); 24 | for (int i = 0; i <= childCount - 2; i++) { 25 | View child = parent.getChildAt(i); 26 | 27 | RecyclerView.LayoutParams params = (RecyclerView.LayoutParams) child.getLayoutParams(); 28 | 29 | int dividerTop = child.getBottom() + params.bottomMargin; 30 | int dividerBottom = dividerTop + mDivider.getIntrinsicHeight(); 31 | 32 | mDivider.setBounds(dividerLeft, dividerTop, dividerRight, dividerBottom); 33 | mDivider.draw(canvas); 34 | } 35 | } 36 | } 37 | -------------------------------------------------------------------------------- /app/src/main/java/im/adamant/android/ui/custom_view/LTRGridLayoutManager.java: -------------------------------------------------------------------------------- 1 | package im.adamant.android.ui.custom_view; 2 | 3 | import android.content.Context; 4 | import android.util.AttributeSet; 5 | 6 | import androidx.recyclerview.widget.GridLayoutManager; 7 | 8 | public class LTRGridLayoutManager extends GridLayoutManager { 9 | public LTRGridLayoutManager(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) { 10 | super(context, attrs, defStyleAttr, defStyleRes); 11 | } 12 | 13 | public LTRGridLayoutManager(Context context, int spanCount) { 14 | super(context, spanCount); 15 | } 16 | 17 | public LTRGridLayoutManager(Context context, int spanCount, int orientation, boolean reverseLayout) { 18 | super(context, spanCount, orientation, reverseLayout); 19 | } 20 | 21 | @Override 22 | protected boolean isLayoutRTL(){ 23 | return false; 24 | } 25 | } 26 | -------------------------------------------------------------------------------- /app/src/main/java/im/adamant/android/ui/custom_view/NoSwipePager.java: -------------------------------------------------------------------------------- 1 | package im.adamant.android.ui.custom_view; 2 | 3 | import android.content.Context; 4 | import androidx.annotation.NonNull; 5 | import androidx.annotation.Nullable; 6 | import androidx.viewpager.widget.ViewPager; 7 | import android.util.AttributeSet; 8 | import android.view.MotionEvent; 9 | 10 | public class NoSwipePager extends ViewPager { 11 | private boolean enabled = false; 12 | 13 | public NoSwipePager(@NonNull Context context) { 14 | super(context); 15 | } 16 | 17 | public NoSwipePager(@NonNull Context context, @Nullable AttributeSet attrs) { 18 | super(context, attrs); 19 | } 20 | 21 | @Override 22 | public boolean onTouchEvent(MotionEvent event) { 23 | if (this.enabled) { 24 | return super.onTouchEvent(event); 25 | } 26 | return false; 27 | } 28 | 29 | @Override 30 | public boolean onInterceptTouchEvent(MotionEvent event) { 31 | if (this.enabled) { 32 | return super.onInterceptTouchEvent(event); 33 | } 34 | return false; 35 | } 36 | 37 | public void setPagingEnabled(boolean enabled) { 38 | this.enabled = enabled; 39 | } 40 | } 41 | -------------------------------------------------------------------------------- /app/src/main/java/im/adamant/android/ui/entities/Contact.java: -------------------------------------------------------------------------------- 1 | package im.adamant.android.ui.entities; 2 | 3 | public class Contact { 4 | private String displayName; 5 | 6 | public String getDisplayName() { 7 | return displayName; 8 | } 9 | 10 | public void setDisplayName(String displayName) { 11 | this.displayName = displayName; 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /app/src/main/java/im/adamant/android/ui/entities/WelcomeCard.java: -------------------------------------------------------------------------------- 1 | package im.adamant.android.ui.entities; 2 | 3 | import android.text.Spannable; 4 | import android.text.Spanned; 5 | 6 | public class WelcomeCard { 7 | private int imageResource; 8 | private Spanned text; 9 | 10 | public WelcomeCard(int imageResource, Spanned text) { 11 | this.imageResource = imageResource; 12 | this.text = text; 13 | } 14 | 15 | public int getImageResource() { 16 | return imageResource; 17 | } 18 | 19 | public Spanned getText() { 20 | return text; 21 | } 22 | 23 | } 24 | -------------------------------------------------------------------------------- /app/src/main/java/im/adamant/android/ui/holders/FragmentClassHolder.java: -------------------------------------------------------------------------------- 1 | package im.adamant.android.ui.holders; 2 | 3 | import androidx.annotation.NonNull; 4 | 5 | import im.adamant.android.ui.fragments.base.BaseFragment; 6 | 7 | public class FragmentClassHolder { 8 | private int titleResource; 9 | private Class fragmentClass; 10 | 11 | public FragmentClassHolder(int title, @NonNull Class fragmentClass) { 12 | this.titleResource = title; 13 | this.fragmentClass = fragmentClass; 14 | } 15 | 16 | public int getTitle() { 17 | return titleResource; 18 | } 19 | 20 | public Class getFragmentClass() { 21 | return fragmentClass; 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /app/src/main/java/im/adamant/android/ui/holders/KeyPinHolder.java: -------------------------------------------------------------------------------- 1 | package im.adamant.android.ui.holders; 2 | 3 | import android.view.View; 4 | 5 | import androidx.annotation.NonNull; 6 | import androidx.recyclerview.widget.RecyclerView; 7 | import im.adamant.android.ui.adapters.KeyPinAdapter; 8 | 9 | public abstract class KeyPinHolder extends RecyclerView.ViewHolder { 10 | public KeyPinHolder(@NonNull View itemView) { 11 | super(itemView); 12 | } 13 | 14 | public abstract void bind(KeyPinAdapter.KeyPinEntry key); 15 | 16 | public interface HolderClickListener { 17 | void click(KeyPinAdapter.KeyPinEntry key); 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /app/src/main/java/im/adamant/android/ui/holders/KeyPinIconHolder.java: -------------------------------------------------------------------------------- 1 | package im.adamant.android.ui.holders; 2 | 3 | import android.content.Context; 4 | import android.content.res.ColorStateList; 5 | import android.view.View; 6 | import android.widget.ImageButton; 7 | 8 | import androidx.annotation.NonNull; 9 | import androidx.appcompat.content.res.AppCompatResources; 10 | 11 | import im.adamant.android.R; 12 | import im.adamant.android.ui.adapters.KeyPinAdapter; 13 | 14 | public class KeyPinIconHolder extends KeyPinHolder { 15 | private Context context; 16 | private ImageButton button; 17 | private HolderClickListener listener; 18 | 19 | public KeyPinIconHolder(@NonNull View itemView, @NonNull HolderClickListener listener) { 20 | super(itemView); 21 | this.listener = listener; 22 | this.context = itemView.getContext(); 23 | this.button = itemView.findViewById(R.id.list_item_pincode_icon_button); 24 | } 25 | 26 | public void bind(KeyPinAdapter.KeyPinEntry key) { 27 | if(key.getType() != KeyPinAdapter.KeyEntryType.DIGIT) { 28 | if (key.isVisible()) { 29 | button.setVisibility(View.VISIBLE); 30 | } else { 31 | button.setVisibility(View.GONE); 32 | } 33 | button.setImageDrawable(AppCompatResources.getDrawable(context, key.getIcon())); 34 | } 35 | 36 | button.setOnClickListener(v -> { 37 | listener.click(key); 38 | }); 39 | } 40 | } 41 | -------------------------------------------------------------------------------- /app/src/main/java/im/adamant/android/ui/holders/PushNotificationServiceHolder.java: -------------------------------------------------------------------------------- 1 | package im.adamant.android.ui.holders; 2 | 3 | import android.content.Context; 4 | import android.view.View; 5 | import android.widget.TextView; 6 | 7 | import androidx.annotation.NonNull; 8 | import androidx.recyclerview.widget.RecyclerView; 9 | import im.adamant.android.R; 10 | import im.adamant.android.interactors.push.PushNotificationServiceFacade; 11 | 12 | public class PushNotificationServiceHolder extends RecyclerView.ViewHolder { 13 | private TextView titleView; 14 | private TextView descriptionView; 15 | private Context context; 16 | 17 | public PushNotificationServiceHolder(@NonNull View itemView, Context context) { 18 | super(itemView); 19 | 20 | this.context = context; 21 | titleView = itemView.findViewById(R.id.list_item_push_notification_service_tv_title); 22 | descriptionView = itemView.findViewById(R.id.list_item_push_notification_service_tv_description); 23 | } 24 | 25 | public void bind(PushNotificationServiceFacade facade) { 26 | titleView.setText(context.getString(facade.getTitleResource())); 27 | descriptionView.setText(context.getString(facade.getDescriptionResource())); 28 | } 29 | } 30 | -------------------------------------------------------------------------------- /app/src/main/java/im/adamant/android/ui/holders/WelcomeCardHolder.java: -------------------------------------------------------------------------------- 1 | package im.adamant.android.ui.holders; 2 | 3 | import android.text.method.LinkMovementMethod; 4 | import android.view.View; 5 | import android.widget.ImageView; 6 | import android.widget.TextView; 7 | 8 | import androidx.annotation.NonNull; 9 | import androidx.recyclerview.widget.RecyclerView; 10 | import im.adamant.android.R; 11 | import im.adamant.android.ui.entities.WelcomeCard; 12 | 13 | public class WelcomeCardHolder extends RecyclerView.ViewHolder { 14 | private ImageView imageView; 15 | private TextView textView; 16 | 17 | public WelcomeCardHolder(@NonNull View itemView) { 18 | super(itemView); 19 | 20 | imageView = itemView.findViewById(R.id.list_item_welcome_card_iv_image); 21 | textView = itemView.findViewById(R.id.list_item_welcome_card_tv_text); 22 | } 23 | 24 | public void bind(WelcomeCard welcomeCard) { 25 | imageView.setImageResource(welcomeCard.getImageResource()); 26 | textView.setText(welcomeCard.getText()); 27 | textView.setMovementMethod(LinkMovementMethod.getInstance()); 28 | } 29 | } 30 | -------------------------------------------------------------------------------- /app/src/main/java/im/adamant/android/ui/mappers/LocalizedChatMapper.java: -------------------------------------------------------------------------------- 1 | package im.adamant.android.ui.mappers; 2 | 3 | import android.content.Context; 4 | 5 | import im.adamant.android.BuildConfig; 6 | import im.adamant.android.R; 7 | import im.adamant.android.ui.entities.Chat; 8 | import io.reactivex.functions.Function; 9 | 10 | public class LocalizedChatMapper implements Function { 11 | private Context context; 12 | 13 | public LocalizedChatMapper(Context context) { 14 | this.context = context; 15 | } 16 | 17 | @Override 18 | public Chat apply(Chat chat) throws Exception { 19 | String chatTitle = chat.getCompanionId(); 20 | 21 | switch (chat.getCompanionId()){ 22 | case BuildConfig.WELCOME_MESSAGE_ADDR: { 23 | chatTitle = context.getString(R.string.hello_message_baunty_name); 24 | } 25 | break; 26 | case BuildConfig.MESSAGE_CTNCR_ADDR: { 27 | chatTitle = context.getString(R.string.hello_message_ico_name); 28 | } 29 | break; 30 | } 31 | 32 | chat.setTitle(chatTitle); 33 | 34 | return chat; 35 | } 36 | } 37 | -------------------------------------------------------------------------------- /app/src/main/java/im/adamant/android/ui/mappers/TransactionToChatMapper.java: -------------------------------------------------------------------------------- 1 | package im.adamant.android.ui.mappers; 2 | 3 | import android.util.Pair; 4 | 5 | import im.adamant.android.core.AdamantApiWrapper; 6 | import im.adamant.android.core.entities.Transaction; 7 | import im.adamant.android.helpers.PublicKeyStorage; 8 | import im.adamant.android.ui.entities.Chat; 9 | import io.reactivex.functions.Function; 10 | 11 | public class TransactionToChatMapper implements Function>, Chat> { 12 | private AdamantApiWrapper api; 13 | 14 | public TransactionToChatMapper(AdamantApiWrapper api) { 15 | this.api = api; 16 | } 17 | 18 | @Override 19 | public Chat apply(Pair> transactionPair) throws Exception { 20 | Transaction transaction = transactionPair.second; 21 | String ownAddress = api.getAccount().getAddress(); 22 | boolean iRecipient = ownAddress.equalsIgnoreCase(transaction.getRecipientId()); 23 | 24 | String companionId = (iRecipient) ? transaction.getSenderId() : transaction.getRecipientId(); 25 | String companionPublicKey = transactionPair.first; 26 | 27 | Chat chat = new Chat(); 28 | chat.setCompanionId(companionId); 29 | chat.setTitle(companionId); 30 | chat.setCompanionPublicKey(companionPublicKey); 31 | 32 | return chat; 33 | } 34 | 35 | 36 | } 37 | -------------------------------------------------------------------------------- /app/src/main/java/im/adamant/android/ui/messages_support/SupportedMessageListContentType.java: -------------------------------------------------------------------------------- 1 | package im.adamant.android.ui.messages_support; 2 | 3 | public enum SupportedMessageListContentType { 4 | ADAMANT_BASIC, 5 | ADAMANT_TRANSFER_MESSAGE, 6 | ADAMANT_SUBSCRIBE_ON_NOTIFICATION, 7 | ETHEREUM_TRANSFER, 8 | BINANCE_TRANSFER, //TODO: May be refactor to ERC20 9 | FALLBACK, 10 | SEPARATOR, 11 | UNDEFINED // Causes an exception as a protection against developer inattention 12 | } 13 | -------------------------------------------------------------------------------- /app/src/main/java/im/adamant/android/ui/messages_support/builders/MessageBuilder.java: -------------------------------------------------------------------------------- 1 | package im.adamant.android.ui.messages_support.builders; 2 | 3 | import im.adamant.android.core.entities.Transaction; 4 | import im.adamant.android.ui.messages_support.entities.AbstractMessage; 5 | 6 | public interface MessageBuilder { 7 | T build( 8 | Transaction transaction, 9 | String decryptedMessage, 10 | boolean isISayed, 11 | long date, 12 | String companionId, 13 | String ownerKey 14 | ); 15 | } 16 | -------------------------------------------------------------------------------- /app/src/main/java/im/adamant/android/ui/messages_support/entities/AdamantBasicMessage.java: -------------------------------------------------------------------------------- 1 | package im.adamant.android.ui.messages_support.entities; 2 | 3 | import android.content.Context; 4 | import android.text.Spanned; 5 | 6 | import im.adamant.android.markdown.AdamantMarkdownProcessor; 7 | import im.adamant.android.helpers.HtmlHelper; 8 | 9 | public class AdamantBasicMessage extends AbstractMessage { 10 | private String text; 11 | private transient Spanned htmlText; 12 | 13 | @Override 14 | public String getShortedMessage(Context context, int preferredLimit) { 15 | return text; 16 | } 17 | 18 | public String getText() { 19 | return text; 20 | } 21 | 22 | public Spanned getHtmlText(AdamantMarkdownProcessor adamantAddressProcessor){ 23 | if (htmlText == null){ 24 | try { 25 | htmlText = HtmlHelper.fromHtml(adamantAddressProcessor.getHtmlString(text)); 26 | } catch (Exception e) { 27 | e.printStackTrace(); 28 | } 29 | } 30 | 31 | return htmlText; 32 | } 33 | 34 | public void setText(String text) { 35 | this.text = text; 36 | } 37 | } 38 | -------------------------------------------------------------------------------- /app/src/main/java/im/adamant/android/ui/messages_support/entities/AdamantPushSubscriptionMessage.java: -------------------------------------------------------------------------------- 1 | package im.adamant.android.ui.messages_support.entities; 2 | 3 | import android.content.Context; 4 | 5 | import com.google.gson.annotations.Expose; 6 | 7 | public class AdamantPushSubscriptionMessage extends AbstractMessage { 8 | public static final String ADD_ACTION = "add"; 9 | public static final String REMOVE_ACTION = "remove"; 10 | 11 | @Expose 12 | private String token; 13 | 14 | @Expose 15 | private String provider; 16 | 17 | @Expose 18 | private String action; 19 | 20 | @Override 21 | public String getShortedMessage(Context context, int preferredLimit) { 22 | return ""; 23 | } 24 | 25 | public String getToken() { 26 | return token; 27 | } 28 | 29 | public void setToken(String token) { 30 | this.token = token; 31 | } 32 | 33 | public String getProvider() { 34 | return provider; 35 | } 36 | 37 | public void setProvider(String provider) { 38 | this.provider = provider; 39 | } 40 | 41 | public String getAction() { 42 | return action; 43 | } 44 | 45 | public void setAction(String action) { 46 | this.action = action; 47 | } 48 | } 49 | -------------------------------------------------------------------------------- /app/src/main/java/im/adamant/android/ui/messages_support/entities/AdamantTransferMessage.java: -------------------------------------------------------------------------------- 1 | package im.adamant.android.ui.messages_support.entities; 2 | 3 | import android.content.Context; 4 | 5 | import java.math.BigDecimal; 6 | 7 | import im.adamant.android.R; 8 | 9 | public class AdamantTransferMessage extends AbstractMessage { 10 | private BigDecimal amount; 11 | private String transactionId; 12 | 13 | @Override 14 | public String getShortedMessage(Context context, int preferredLimit) { 15 | String message = ""; 16 | if (isiSay()) { 17 | message = context.getString(R.string.sended); 18 | } else { 19 | message = context.getString(R.string.received); 20 | } 21 | 22 | message += amount + context.getString(R.string.adm_currency_abbr); 23 | 24 | return message; 25 | } 26 | 27 | public BigDecimal getAmount() { 28 | return amount; 29 | } 30 | 31 | public void setAmount(BigDecimal amount) { 32 | this.amount = amount; 33 | } 34 | } 35 | -------------------------------------------------------------------------------- /app/src/main/java/im/adamant/android/ui/messages_support/entities/MessageListContent.java: -------------------------------------------------------------------------------- 1 | package im.adamant.android.ui.messages_support.entities; 2 | 3 | import im.adamant.android.ui.messages_support.SupportedMessageListContentType; 4 | 5 | public interface MessageListContent { 6 | SupportedMessageListContentType getSupportedType(); 7 | void setSupportedType(SupportedMessageListContentType supportedType); 8 | String getCompanionId(); 9 | void setCompanionId(String companionId); 10 | long getTimestamp(); 11 | void setTimestamp(long timestamp); 12 | } 13 | -------------------------------------------------------------------------------- /app/src/main/java/im/adamant/android/ui/messages_support/entities/Separator.java: -------------------------------------------------------------------------------- 1 | package im.adamant.android.ui.messages_support.entities; 2 | 3 | import im.adamant.android.ui.messages_support.SupportedMessageListContentType; 4 | 5 | public class Separator implements MessageListContent { 6 | private SupportedMessageListContentType supportedMessageListContentType = SupportedMessageListContentType.SEPARATOR; 7 | private long timestamp; 8 | 9 | public long getTimestamp() { 10 | return timestamp; 11 | } 12 | 13 | public void setTimestamp(long timestamp) { 14 | this.timestamp = timestamp; 15 | } 16 | 17 | @Override 18 | public SupportedMessageListContentType getSupportedType() { 19 | return supportedMessageListContentType; 20 | } 21 | 22 | @Override 23 | public void setSupportedType(SupportedMessageListContentType supportedType) { 24 | 25 | } 26 | 27 | @Override 28 | public String getCompanionId() { 29 | return null; 30 | } 31 | 32 | @Override 33 | public void setCompanionId(String companionId) { 34 | 35 | } 36 | } 37 | -------------------------------------------------------------------------------- /app/src/main/java/im/adamant/android/ui/messages_support/factories/MessageFactory.java: -------------------------------------------------------------------------------- 1 | package im.adamant.android.ui.messages_support.factories; 2 | 3 | import android.view.ViewGroup; 4 | 5 | import im.adamant.android.ui.messages_support.entities.AbstractMessage; 6 | import im.adamant.android.ui.messages_support.holders.AbstractMessageListContentViewHolder; 7 | import im.adamant.android.ui.messages_support.builders.MessageBuilder; 8 | import im.adamant.android.ui.messages_support.processors.MessageProcessor; 9 | 10 | public interface MessageFactory { 11 | MessageBuilder getMessageBuilder(); 12 | AbstractMessageListContentViewHolder getViewHolder(ViewGroup parent); 13 | MessageProcessor getMessageProcessor(); 14 | } 15 | -------------------------------------------------------------------------------- /app/src/main/java/im/adamant/android/ui/messages_support/factories/MessageFactoryProvider.java: -------------------------------------------------------------------------------- 1 | package im.adamant.android.ui.messages_support.factories; 2 | 3 | import java.util.HashMap; 4 | import java.util.Map; 5 | 6 | import im.adamant.android.ui.messages_support.SupportedMessageListContentType; 7 | 8 | public class MessageFactoryProvider { 9 | private Map factories = new HashMap<>(); 10 | 11 | public MessageFactory getFactoryByType(SupportedMessageListContentType type) throws Exception { 12 | if (type == null || type == SupportedMessageListContentType.UNDEFINED){ 13 | throw new Exception("Not implemented!"); 14 | } 15 | 16 | if (!factories.containsKey(type)){ 17 | throw new Exception("Type has not registered!"); 18 | } 19 | 20 | return factories.get(type); 21 | } 22 | 23 | public void registerFactory(SupportedMessageListContentType type, MessageFactory factory){ 24 | factories.put(type, factory); 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /app/src/main/java/im/adamant/android/ui/messages_support/holders/AbstractMessageListContentViewHolder.java: -------------------------------------------------------------------------------- 1 | package im.adamant.android.ui.messages_support.holders; 2 | 3 | import android.content.Context; 4 | import androidx.recyclerview.widget.RecyclerView; 5 | import android.view.View; 6 | 7 | import im.adamant.android.ui.messages_support.entities.AbstractMessage; 8 | import im.adamant.android.ui.messages_support.entities.MessageListContent; 9 | 10 | public abstract class AbstractMessageListContentViewHolder extends RecyclerView.ViewHolder { 11 | protected Context context; 12 | 13 | public AbstractMessageListContentViewHolder(Context context, View v) { 14 | super(v); 15 | this.context = context; 16 | } 17 | 18 | public abstract void bind(MessageListContent message, boolean isNextMessageWithSameSender, boolean isLastMessage); 19 | } 20 | -------------------------------------------------------------------------------- /app/src/main/java/im/adamant/android/ui/messages_support/processors/MessageProcessor.java: -------------------------------------------------------------------------------- 1 | package im.adamant.android.ui.messages_support.processors; 2 | 3 | import java.util.HashMap; 4 | 5 | import im.adamant.android.core.entities.Transaction; 6 | import im.adamant.android.core.entities.UnnormalizedTransactionMessage; 7 | import im.adamant.android.core.entities.transaction_assets.TransactionAsset; 8 | import im.adamant.android.core.responses.TransactionWasProcessed; 9 | import im.adamant.android.ui.messages_support.entities.AbstractMessage; 10 | import io.reactivex.Flowable; 11 | import io.reactivex.Single; 12 | 13 | public interface MessageProcessor { 14 | long calculateMessageCostInAdamant(T message); 15 | Single buildTransactionMessage(T message, String recipientPublicKey); 16 | Single> buildNormalizedTransaction(T message); 17 | Single sendMessage(T message); 18 | Single sendTransaction(Single> transactionSource); 19 | } 20 | -------------------------------------------------------------------------------- /app/src/main/java/im/adamant/android/ui/mvp_view/AllTransactionsView.java: -------------------------------------------------------------------------------- 1 | package im.adamant.android.ui.mvp_view; 2 | 3 | import com.arellomobile.mvp.MvpView; 4 | import com.arellomobile.mvp.viewstate.strategy.AddToEndSingleStrategy; 5 | import com.arellomobile.mvp.viewstate.strategy.StateStrategyType; 6 | 7 | import java.util.List; 8 | 9 | import im.adamant.android.ui.entities.CurrencyTransferEntity; 10 | 11 | public interface AllTransactionsView extends MvpView { 12 | void firstTransfersWasLoaded(List transfers); 13 | void newTransferWasLoaded(CurrencyTransferEntity transfer); 14 | 15 | @StateStrategyType(AddToEndSingleStrategy.class) 16 | void setLoading(boolean loading); 17 | 18 | void nextTransferWasLoaded(CurrencyTransferEntity transfer); 19 | } 20 | -------------------------------------------------------------------------------- /app/src/main/java/im/adamant/android/ui/mvp_view/ChatsView.java: -------------------------------------------------------------------------------- 1 | package im.adamant.android.ui.mvp_view; 2 | 3 | import com.arellomobile.mvp.MvpView; 4 | import com.arellomobile.mvp.viewstate.strategy.AddToEndSingleStrategy; 5 | import com.arellomobile.mvp.viewstate.strategy.StateStrategyType; 6 | 7 | import java.util.List; 8 | 9 | import im.adamant.android.ui.entities.Chat; 10 | 11 | @StateStrategyType(AddToEndSingleStrategy.class) 12 | public interface ChatsView extends MvpView { 13 | // @StateStrategyType(SkipStrategy.class) 14 | void showChats(List chats); 15 | void progress(boolean value); 16 | } 17 | -------------------------------------------------------------------------------- /app/src/main/java/im/adamant/android/ui/mvp_view/CreateChatView.java: -------------------------------------------------------------------------------- 1 | package im.adamant.android.ui.mvp_view; 2 | 3 | import com.arellomobile.mvp.MvpView; 4 | import com.arellomobile.mvp.viewstate.strategy.SkipStrategy; 5 | import com.arellomobile.mvp.viewstate.strategy.StateStrategyType; 6 | 7 | public interface CreateChatView extends MvpView { 8 | void showError(int resourceId); 9 | void lockUI(); 10 | void unlockUI(); 11 | void showQrCode(String content); 12 | 13 | @StateStrategyType(SkipStrategy.class) 14 | void close(); 15 | } 16 | -------------------------------------------------------------------------------- /app/src/main/java/im/adamant/android/ui/mvp_view/LoginView.java: -------------------------------------------------------------------------------- 1 | package im.adamant.android.ui.mvp_view; 2 | 3 | import com.arellomobile.mvp.MvpView; 4 | 5 | public interface LoginView extends MvpView { 6 | void setPassphrase(String passphrase); 7 | void invalidWords(CharSequence word, CharSequence suggestion1, CharSequence suggestion2); 8 | void invalidSymbol(); 9 | void invalidCount(int currentCount, int necessaryCount); 10 | void invalidChecksum(); 11 | void networkError(String errorString); 12 | void lockUI(); 13 | void unlockUI(); 14 | } 15 | -------------------------------------------------------------------------------- /app/src/main/java/im/adamant/android/ui/mvp_view/MainView.java: -------------------------------------------------------------------------------- 1 | package im.adamant.android.ui.mvp_view; 2 | 3 | import com.arellomobile.mvp.MvpView; 4 | 5 | public interface MainView extends MvpView { 6 | void showWalletScreen(); 7 | void showChatsScreen(); 8 | void showSettingsScreen(); 9 | } 10 | -------------------------------------------------------------------------------- /app/src/main/java/im/adamant/android/ui/mvp_view/NodesListView.java: -------------------------------------------------------------------------------- 1 | package im.adamant.android.ui.mvp_view; 2 | 3 | import com.arellomobile.mvp.MvpView; 4 | 5 | public interface NodesListView extends MvpView { 6 | void clearNodeTextField(); 7 | void hideKeyboard(); 8 | } 9 | -------------------------------------------------------------------------------- /app/src/main/java/im/adamant/android/ui/mvp_view/PinCodeView.java: -------------------------------------------------------------------------------- 1 | package im.adamant.android.ui.mvp_view; 2 | 3 | import com.arellomobile.mvp.MvpView; 4 | import com.arellomobile.mvp.viewstate.strategy.SkipStrategy; 5 | import com.arellomobile.mvp.viewstate.strategy.StateStrategyType; 6 | 7 | public interface PinCodeView extends MvpView { 8 | String ARG_MODE = "mode"; 9 | 10 | enum MODE { 11 | ACCESS_TO_APP, 12 | CREATE, 13 | CONFIRM 14 | } 15 | 16 | @StateStrategyType(SkipStrategy.class) 17 | void startProcess(); 18 | 19 | @StateStrategyType(SkipStrategy.class) 20 | void stopProcess(boolean success); 21 | 22 | void setSuggestion(int resourceId); 23 | 24 | // void shuffleKeyboard(); 25 | 26 | @StateStrategyType(SkipStrategy.class) 27 | void goToMain(); 28 | 29 | @StateStrategyType(SkipStrategy.class) 30 | void goToSplash(); 31 | 32 | @StateStrategyType(SkipStrategy.class) 33 | void close(); 34 | 35 | @StateStrategyType(SkipStrategy.class) 36 | void showError(int resourceId); 37 | 38 | void showWrongPin(int attemptsRemained); 39 | 40 | @StateStrategyType(SkipStrategy.class) 41 | void showRepeatableError(int resourceId, int secondsLeft); 42 | 43 | void setCancelButtonText(int resourceId); 44 | 45 | void clearError(); 46 | } 47 | -------------------------------------------------------------------------------- /app/src/main/java/im/adamant/android/ui/mvp_view/PushSubscriptionView.java: -------------------------------------------------------------------------------- 1 | package im.adamant.android.ui.mvp_view; 2 | 3 | import com.arellomobile.mvp.MvpView; 4 | import com.arellomobile.mvp.viewstate.strategy.SkipStrategy; 5 | import com.arellomobile.mvp.viewstate.strategy.StateStrategyType; 6 | 7 | import java.util.List; 8 | import java.util.Map; 9 | 10 | import im.adamant.android.interactors.push.PushNotificationServiceFacade; 11 | import im.adamant.android.interactors.push.SupportedPushNotificationFacadeType; 12 | 13 | public interface PushSubscriptionView extends MvpView { 14 | void setEnablePushServiceTypeOption(boolean value); 15 | void displayCurrentNotificationFacade(PushNotificationServiceFacade facade); 16 | void startProgress(); 17 | void stopProgress(); 18 | 19 | @StateStrategyType(SkipStrategy.class) 20 | void showSelectServiceDialog(List facades, PushNotificationServiceFacade current); 21 | 22 | void showFacadesDescriptions(List facades); 23 | 24 | @StateStrategyType(SkipStrategy.class) 25 | void showMessage(String message); 26 | 27 | @StateStrategyType(SkipStrategy.class) 28 | void showMessage(int messageResource); 29 | } 30 | -------------------------------------------------------------------------------- /app/src/main/java/im/adamant/android/ui/mvp_view/RegistrationView.java: -------------------------------------------------------------------------------- 1 | package im.adamant.android.ui.mvp_view; 2 | 3 | import android.util.Pair; 4 | 5 | import com.arellomobile.mvp.MvpView; 6 | 7 | import java.util.List; 8 | 9 | 10 | public interface RegistrationView extends MvpView { 11 | void invalidWords(CharSequence word, CharSequence suggestion1, CharSequence suggestion2); 12 | void invalidSymbol(); 13 | void invalidCount(int currentCount, int necessaryCount); 14 | void invalidChecksum(); 15 | void onEnteredValidPassphrase(); 16 | void updatePassphraseList(List> passphrases); 17 | void showPassphrase(String passphrase); 18 | void lockUI(); 19 | void unlockUI(); 20 | } 21 | -------------------------------------------------------------------------------- /app/src/main/java/im/adamant/android/ui/mvp_view/ScanQrCodeView.java: -------------------------------------------------------------------------------- 1 | package im.adamant.android.ui.mvp_view; 2 | 3 | import com.arellomobile.mvp.MvpView; 4 | 5 | public interface ScanQrCodeView extends MvpView { 6 | } 7 | -------------------------------------------------------------------------------- /app/src/main/java/im/adamant/android/ui/mvp_view/SendFundsView.java: -------------------------------------------------------------------------------- 1 | package im.adamant.android.ui.mvp_view; 2 | 3 | import com.arellomobile.mvp.MvpView; 4 | import com.arellomobile.mvp.viewstate.strategy.SkipStrategy; 5 | import com.arellomobile.mvp.viewstate.strategy.StateStrategyType; 6 | 7 | import java.math.BigDecimal; 8 | import java.util.List; 9 | 10 | public interface SendFundsView extends MvpView { 11 | void setFundsSendingIsSupported(boolean value); 12 | void setRecipientAddress(String address); 13 | void setFee(BigDecimal fee, String currencyAbbr); 14 | void setCurrentBalance(BigDecimal balance, String currencyAbbr); 15 | void setReminder(BigDecimal reminder, String currencyAbbr); 16 | void setTotalAmount(BigDecimal totalAmount, String currencyAbbr); 17 | void setRecipientName(String name); 18 | void lockRecipientAddress(); 19 | void unlockRecipientAddress(); 20 | void lockSendButton(); 21 | void unlockSendButton(); 22 | void setEditTextCurrencyIcons(int resourceId); 23 | void hideCommentField(); 24 | void showCommentField(); 25 | void showRecipientAddressError(int resourceId); 26 | void dropRecipientAddressError(); 27 | void showAmountError(int resourceId); 28 | void dropAmountError(); 29 | 30 | @StateStrategyType(SkipStrategy.class) 31 | void showTransferConfirmationDialog(BigDecimal amount, String currencyAbbr, String address); 32 | } 33 | -------------------------------------------------------------------------------- /app/src/main/java/im/adamant/android/ui/mvp_view/SettingsView.java: -------------------------------------------------------------------------------- 1 | package im.adamant.android.ui.mvp_view; 2 | 3 | import com.arellomobile.mvp.MvpView; 4 | import com.arellomobile.mvp.viewstate.strategy.SkipStrategy; 5 | import com.arellomobile.mvp.viewstate.strategy.StateStrategyType; 6 | 7 | import java.util.List; 8 | 9 | import im.adamant.android.core.entities.ServerNode; 10 | import im.adamant.android.interactors.push.PushNotificationServiceFacade; 11 | 12 | public interface SettingsView extends MvpView { 13 | @StateStrategyType(SkipStrategy.class) 14 | void setCheckedStoreKeyPairOption(boolean value); 15 | void setEnablePushOption(boolean value); 16 | void displayCurrentNotificationFacade(PushNotificationServiceFacade facade); 17 | void startProgress(); 18 | void stopProgress(); 19 | 20 | void showExitDialog(); 21 | 22 | @StateStrategyType(SkipStrategy.class) 23 | void showTEENotSupportedDialog(); 24 | 25 | @StateStrategyType(SkipStrategy.class) 26 | void showVerifyingDialog(); 27 | 28 | @StateStrategyType(SkipStrategy.class) 29 | void hideVerifyingDialog(); 30 | 31 | @StateStrategyType(SkipStrategy.class) 32 | void showMessage(String message); 33 | 34 | @StateStrategyType(SkipStrategy.class) 35 | void showMessage(int messageResource); 36 | 37 | @StateStrategyType(SkipStrategy.class) 38 | void showSelectServiceDialog(List facades, PushNotificationServiceFacade current); 39 | } 40 | -------------------------------------------------------------------------------- /app/src/main/java/im/adamant/android/ui/mvp_view/ShowQrCodeView.java: -------------------------------------------------------------------------------- 1 | package im.adamant.android.ui.mvp_view; 2 | 3 | import android.graphics.Bitmap; 4 | 5 | import com.arellomobile.mvp.MvpView; 6 | 7 | public interface ShowQrCodeView extends MvpView { 8 | void showQrCode(Bitmap bitmap); 9 | void showMessage(int resourceId); 10 | void showContent(String content); 11 | } 12 | -------------------------------------------------------------------------------- /app/src/main/java/im/adamant/android/ui/mvp_view/TransferDetailsView.java: -------------------------------------------------------------------------------- 1 | package im.adamant.android.ui.mvp_view; 2 | 3 | import com.arellomobile.mvp.MvpView; 4 | import com.arellomobile.mvp.viewstate.strategy.AddToEndSingleStrategy; 5 | import com.arellomobile.mvp.viewstate.strategy.OneExecutionStateStrategy; 6 | import com.arellomobile.mvp.viewstate.strategy.StateStrategyType; 7 | 8 | import im.adamant.android.interactors.wallets.entities.TransferDetails; 9 | import im.adamant.android.ui.entities.UITransferDetails; 10 | 11 | public interface TransferDetailsView extends MvpView { 12 | @StateStrategyType(AddToEndSingleStrategy.class) 13 | void showTransferDetails(UITransferDetails details); 14 | 15 | @StateStrategyType(AddToEndSingleStrategy.class) 16 | void setLoading(boolean loading); 17 | 18 | @StateStrategyType(OneExecutionStateStrategy.class) 19 | void openBrowser(String url); 20 | 21 | @StateStrategyType(OneExecutionStateStrategy.class) 22 | void share(String text); 23 | 24 | void shareStatus(TransferDetails.STATUS status); 25 | } 26 | -------------------------------------------------------------------------------- /app/src/main/java/im/adamant/android/ui/mvp_view/WalletView.java: -------------------------------------------------------------------------------- 1 | package im.adamant.android.ui.mvp_view; 2 | 3 | import com.arellomobile.mvp.MvpView; 4 | import com.arellomobile.mvp.viewstate.strategy.SkipStrategy; 5 | import com.arellomobile.mvp.viewstate.strategy.StateStrategyType; 6 | 7 | import java.util.List; 8 | 9 | import im.adamant.android.ui.entities.CurrencyTransferEntity; 10 | import im.adamant.android.ui.entities.CurrencyCardItem; 11 | 12 | public interface WalletView extends MvpView { 13 | void showCurrencyCards(List currencyCardItems); 14 | void showLastTransfers(List currencyTransferEntities); 15 | void startTransfersLoad(); 16 | 17 | @StateStrategyType(SkipStrategy.class) 18 | void putAddressToClipboard(String address); 19 | 20 | @StateStrategyType(SkipStrategy.class) 21 | void createQrCode(String address); 22 | } 23 | -------------------------------------------------------------------------------- /app/src/main/java/im/adamant/android/ui/presenters/BasePresenter.java: -------------------------------------------------------------------------------- 1 | package im.adamant.android.ui.presenters; 2 | 3 | import com.arellomobile.mvp.MvpPresenter; 4 | import com.arellomobile.mvp.MvpView; 5 | 6 | import im.adamant.android.rx.RxTaskManager; 7 | import io.reactivex.disposables.CompositeDisposable; 8 | 9 | public abstract class BasePresenter extends MvpPresenter { 10 | protected CompositeDisposable subscriptions = new CompositeDisposable(); 11 | 12 | @Override 13 | public void onDestroy() { 14 | super.onDestroy(); 15 | subscriptions.dispose(); 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /app/src/main/java/im/adamant/android/ui/presenters/NodesListPresenter.java: -------------------------------------------------------------------------------- 1 | package im.adamant.android.ui.presenters; 2 | 3 | import android.webkit.URLUtil; 4 | 5 | import com.arellomobile.mvp.InjectViewState; 6 | 7 | import im.adamant.android.core.entities.ServerNode; 8 | import im.adamant.android.helpers.Settings; 9 | import im.adamant.android.interactors.ServerNodeInteractor; 10 | import im.adamant.android.rx.RxTaskManager; 11 | import im.adamant.android.ui.mvp_view.NodesListView; 12 | import io.reactivex.disposables.CompositeDisposable; 13 | 14 | @InjectViewState 15 | public class NodesListPresenter extends BasePresenter { 16 | private ServerNodeInteractor serverNodeInteractor; 17 | 18 | public NodesListPresenter(ServerNodeInteractor serverNodeInteractor) { 19 | this.serverNodeInteractor = serverNodeInteractor; 20 | } 21 | 22 | public void onClickAddNewNode(String nodeUrl) { 23 | if (URLUtil.isValidUrl(nodeUrl)){ 24 | serverNodeInteractor.addServerNode(nodeUrl); 25 | getViewState().clearNodeTextField(); 26 | getViewState().hideKeyboard(); 27 | } 28 | } 29 | 30 | public void onClickDeleteNode(ServerNode serverNode){ 31 | serverNodeInteractor.deleteNode(serverNode); 32 | } 33 | 34 | public void onClickSwitchNode(int index) { 35 | serverNodeInteractor.switchNode(index); 36 | } 37 | 38 | public void onClickResetDefaults() { 39 | serverNodeInteractor.resetToDefaults(); 40 | } 41 | } 42 | -------------------------------------------------------------------------------- /app/src/main/java/im/adamant/android/ui/presenters/ProtectedBasePresenter.java: -------------------------------------------------------------------------------- 1 | package im.adamant.android.ui.presenters; 2 | 3 | import com.arellomobile.mvp.MvpView; 4 | 5 | import im.adamant.android.Screens; 6 | import im.adamant.android.interactors.AccountInteractor; 7 | import im.adamant.android.interactors.LogoutInteractor; 8 | import io.reactivex.disposables.Disposable; 9 | import ru.terrakok.cicerone.Router; 10 | 11 | public class ProtectedBasePresenter extends BasePresenter { 12 | protected Router router; 13 | protected AccountInteractor accountInteractor; 14 | 15 | public ProtectedBasePresenter(Router router, AccountInteractor accountInteractor) { 16 | this.router = router; 17 | this.accountInteractor = accountInteractor; 18 | } 19 | 20 | @Override 21 | public void attachView(V view) { 22 | super.attachView(view); 23 | 24 | if (!accountInteractor.isAuthorized()) { 25 | router.navigateTo(Screens.SPLASH_SCREEN); 26 | } 27 | } 28 | } 29 | -------------------------------------------------------------------------------- /app/src/main/java/im/adamant/android/ui/transformations/PassphraseAvatarOutlineProvider.java: -------------------------------------------------------------------------------- 1 | package im.adamant.android.ui.transformations; 2 | 3 | import android.graphics.Outline; 4 | import android.os.Build; 5 | import android.view.View; 6 | import android.view.ViewOutlineProvider; 7 | 8 | import androidx.annotation.RequiresApi; 9 | 10 | @RequiresApi(Build.VERSION_CODES.LOLLIPOP) 11 | public class PassphraseAvatarOutlineProvider extends ViewOutlineProvider { 12 | 13 | @Override 14 | public void getOutline(View view, Outline outline) { 15 | outline.setOval(0 , 0, view.getRight() - view.getLeft(), view.getBottom() - view.getTop()); 16 | } 17 | } -------------------------------------------------------------------------------- /app/src/main/res/animator/click_on_pin_key_button.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 7 | 8 | 9 | 12 | 13 | -------------------------------------------------------------------------------- /app/src/main/res/color/add_icon_button.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /app/src/main/res/color/on_click_pincode_icon_key.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /app/src/main/res/color/on_click_pincode_text_key.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /app/src/main/res/color/selected_tab_icon_color.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /app/src/main/res/color/text_input_2_background.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /app/src/main/res/drawable-hdpi/ic_menu.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Adamant-im/adamant-android/a653fa6e3084cf964f416f710da5c8af97072f96/app/src/main/res/drawable-hdpi/ic_menu.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-hdpi/ic_notification_logo_android5.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Adamant-im/adamant-android/a653fa6e3084cf964f416f710da5c8af97072f96/app/src/main/res/drawable-hdpi/ic_notification_logo_android5.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-hdpi/send.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Adamant-im/adamant-android/a653fa6e3084cf964f416f710da5c8af97072f96/app/src/main/res/drawable-hdpi/send.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-mdpi/ic_menu.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Adamant-im/adamant-android/a653fa6e3084cf964f416f710da5c8af97072f96/app/src/main/res/drawable-mdpi/ic_menu.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-mdpi/ic_notification_logo_android5.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Adamant-im/adamant-android/a653fa6e3084cf964f416f710da5c8af97072f96/app/src/main/res/drawable-mdpi/ic_notification_logo_android5.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-mdpi/send.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Adamant-im/adamant-android/a653fa6e3084cf964f416f710da5c8af97072f96/app/src/main/res/drawable-mdpi/send.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-v21/alternate_background_ripple.xml: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /app/src/main/res/drawable-v21/selectable_item_pincode_background.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /app/src/main/res/drawable-v24/bg.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Adamant-im/adamant-android/a653fa6e3084cf964f416f710da5c8af97072f96/app/src/main/res/drawable-v24/bg.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xhdpi/ic_menu.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Adamant-im/adamant-android/a653fa6e3084cf964f416f710da5c8af97072f96/app/src/main/res/drawable-xhdpi/ic_menu.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xhdpi/ic_notification_logo_android5.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Adamant-im/adamant-android/a653fa6e3084cf964f416f710da5c8af97072f96/app/src/main/res/drawable-xhdpi/ic_notification_logo_android5.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xhdpi/send.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Adamant-im/adamant-android/a653fa6e3084cf964f416f710da5c8af97072f96/app/src/main/res/drawable-xhdpi/send.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xxhdpi/ic_menu.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Adamant-im/adamant-android/a653fa6e3084cf964f416f710da5c8af97072f96/app/src/main/res/drawable-xxhdpi/ic_menu.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xxhdpi/ic_notification_logo_android5.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Adamant-im/adamant-android/a653fa6e3084cf964f416f710da5c8af97072f96/app/src/main/res/drawable-xxhdpi/ic_notification_logo_android5.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xxhdpi/send.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Adamant-im/adamant-android/a653fa6e3084cf964f416f710da5c8af97072f96/app/src/main/res/drawable-xxhdpi/send.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xxxhdpi/ic_menu.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Adamant-im/adamant-android/a653fa6e3084cf964f416f710da5c8af97072f96/app/src/main/res/drawable-xxxhdpi/ic_menu.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xxxhdpi/send.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Adamant-im/adamant-android/a653fa6e3084cf964f416f710da5c8af97072f96/app/src/main/res/drawable-xxxhdpi/send.png -------------------------------------------------------------------------------- /app/src/main/res/drawable/bg.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Adamant-im/adamant-android/a653fa6e3084cf964f416f710da5c8af97072f96/app/src/main/res/drawable/bg.png -------------------------------------------------------------------------------- /app/src/main/res/drawable/bottom_navigation_item_color.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/bottom_sheet_dialog_background.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/currency_card_background.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 9 | 13 | 15 | 16 | 17 | 18 | 19 | 20 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/flat_button_selector_text.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_add_file.xml: -------------------------------------------------------------------------------- 1 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_adm_line.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | 10 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_adm_token.xml: -------------------------------------------------------------------------------- 1 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_attention.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | 10 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_avatar_circle.xml: -------------------------------------------------------------------------------- 1 | 6 | 11 | 12 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_backspace.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | 10 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_bnb_line.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | 12 | 13 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_chats.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | 12 | 15 | 18 | 21 | 24 | 25 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_clipboard_copy.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | 10 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_copy.xml: -------------------------------------------------------------------------------- 1 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_create_new_chat.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | 10 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_delete.xml: -------------------------------------------------------------------------------- 1 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_delivered.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | 10 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_download.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | 10 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_drawer_navigation.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | 10 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_empty_avatar.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | 10 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_ethereum.xml: -------------------------------------------------------------------------------- 1 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_ethereum_line.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | 12 | 13 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_exit_to_app_black_24dp.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | 10 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_from_file.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | 10 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_generate_qrcode.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | 10 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_not_sended.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | 10 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_plus.xml: -------------------------------------------------------------------------------- 1 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_qrcode_frome_gallery.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | 10 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_refresh.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | 10 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_reset_pin_code.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | 12 | 15 | 18 | 19 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_save.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | 10 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_send_address.xml: -------------------------------------------------------------------------------- 1 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_sending.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | 10 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_settings.xml: -------------------------------------------------------------------------------- 1 | 6 | 11 | 16 | 17 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_wallet.xml: -------------------------------------------------------------------------------- 1 | 6 | 11 | 14 | 15 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/line_divider.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 5 | 8 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/primary_button_selector_background.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/primary_button_selector_text.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/secondary_button_selector_text.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/selectable_item_pincode_background.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/selectable_text.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/text_input_2_normal.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 8 | 9 | 12 | 13 | 14 | 15 | 20 | 21 | 22 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/text_input_2_selected.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 8 | 9 | 12 | 13 | 14 | 15 | 20 | 21 | 22 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/tile_bg.xml: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /app/src/main/res/font/ubuntu.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 5 | 9 | 10 | 14 | 15 | 19 | 20 | -------------------------------------------------------------------------------- /app/src/main/res/font/ubuntu_bold.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Adamant-im/adamant-android/a653fa6e3084cf964f416f710da5c8af97072f96/app/src/main/res/font/ubuntu_bold.ttf -------------------------------------------------------------------------------- /app/src/main/res/font/ubuntu_light_italic.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Adamant-im/adamant-android/a653fa6e3084cf964f416f710da5c8af97072f96/app/src/main/res/font/ubuntu_light_italic.ttf -------------------------------------------------------------------------------- /app/src/main/res/font/ubuntu_reqular.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Adamant-im/adamant-android/a653fa6e3084cf964f416f710da5c8af97072f96/app/src/main/res/font/ubuntu_reqular.ttf -------------------------------------------------------------------------------- /app/src/main/res/layout-v23/list_item_pincode_icon_key.xml: -------------------------------------------------------------------------------- 1 | 2 | 9 | 10 | 16 | 17 | -------------------------------------------------------------------------------- /app/src/main/res/layout/activity_all_transactions_screen.xml: -------------------------------------------------------------------------------- 1 | 2 | 7 | 8 | 18 | 19 | 25 | 26 | -------------------------------------------------------------------------------- /app/src/main/res/layout/custom_action_bar.xml: -------------------------------------------------------------------------------- 1 | 7 | 8 | 15 | 16 | 21 | 22 | 28 | 29 | 35 | 36 | 37 | 38 | 39 | -------------------------------------------------------------------------------- /app/src/main/res/layout/list_item_passphrase.xml: -------------------------------------------------------------------------------- 1 | 2 | 7 | 8 | 22 | -------------------------------------------------------------------------------- /app/src/main/res/layout/list_item_pincode_icon_key.xml: -------------------------------------------------------------------------------- 1 | 2 | 9 | 10 | 15 | 16 | -------------------------------------------------------------------------------- /app/src/main/res/layout/list_item_push_notification_service.xml: -------------------------------------------------------------------------------- 1 | 2 | 8 | 9 | 18 | 19 | 30 | -------------------------------------------------------------------------------- /app/src/main/res/layout/list_subitem_adamant_basic_message.xml: -------------------------------------------------------------------------------- 1 | 2 | 8 | 9 | 24 | 25 | -------------------------------------------------------------------------------- /app/src/main/res/layout/list_subitem_adamant_transfer_message.xml: -------------------------------------------------------------------------------- 1 | 2 | 8 | 9 | 23 | 24 | 25 | -------------------------------------------------------------------------------- /app/src/main/res/layout/list_subitem_fallback_message.xml: -------------------------------------------------------------------------------- 1 | 2 | 7 | 8 | 23 | 24 | -------------------------------------------------------------------------------- /app/src/main/res/layout/wallet_tab_layout.xml: -------------------------------------------------------------------------------- 1 | 2 | 5 | 6 | 12 | 13 | 21 | 22 | 30 | 31 | -------------------------------------------------------------------------------- /app/src/main/res/menu/activity_messages_menu.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 8 | 12 | 16 | -------------------------------------------------------------------------------- /app/src/main/res/menu/fragment_chats_menu.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 9 | -------------------------------------------------------------------------------- /app/src/main/res/menu/navigation.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 5 | 10 | 11 | 16 | 17 | 22 | 23 | -------------------------------------------------------------------------------- /app/src/main/res/mipmap-anydpi-v26/ic_add.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /app/src/main/res/mipmap-anydpi-v26/ic_add_round.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /app/src/main/res/mipmap-hdpi/ic_add.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Adamant-im/adamant-android/a653fa6e3084cf964f416f710da5c8af97072f96/app/src/main/res/mipmap-hdpi/ic_add.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-hdpi/ic_add_foreground.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Adamant-im/adamant-android/a653fa6e3084cf964f416f710da5c8af97072f96/app/src/main/res/mipmap-hdpi/ic_add_foreground.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-hdpi/ic_add_round.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Adamant-im/adamant-android/a653fa6e3084cf964f416f710da5c8af97072f96/app/src/main/res/mipmap-hdpi/ic_add_round.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-hdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Adamant-im/adamant-android/a653fa6e3084cf964f416f710da5c8af97072f96/app/src/main/res/mipmap-hdpi/ic_launcher.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-hdpi/ic_launcher_foreground.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Adamant-im/adamant-android/a653fa6e3084cf964f416f710da5c8af97072f96/app/src/main/res/mipmap-hdpi/ic_launcher_foreground.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-hdpi/ic_launcher_round.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Adamant-im/adamant-android/a653fa6e3084cf964f416f710da5c8af97072f96/app/src/main/res/mipmap-hdpi/ic_launcher_round.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-mdpi/ic_add.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Adamant-im/adamant-android/a653fa6e3084cf964f416f710da5c8af97072f96/app/src/main/res/mipmap-mdpi/ic_add.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-mdpi/ic_add_foreground.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Adamant-im/adamant-android/a653fa6e3084cf964f416f710da5c8af97072f96/app/src/main/res/mipmap-mdpi/ic_add_foreground.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-mdpi/ic_add_round.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Adamant-im/adamant-android/a653fa6e3084cf964f416f710da5c8af97072f96/app/src/main/res/mipmap-mdpi/ic_add_round.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-mdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Adamant-im/adamant-android/a653fa6e3084cf964f416f710da5c8af97072f96/app/src/main/res/mipmap-mdpi/ic_launcher.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-mdpi/ic_launcher_foreground.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Adamant-im/adamant-android/a653fa6e3084cf964f416f710da5c8af97072f96/app/src/main/res/mipmap-mdpi/ic_launcher_foreground.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-mdpi/ic_launcher_round.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Adamant-im/adamant-android/a653fa6e3084cf964f416f710da5c8af97072f96/app/src/main/res/mipmap-mdpi/ic_launcher_round.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xhdpi/ic_add.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Adamant-im/adamant-android/a653fa6e3084cf964f416f710da5c8af97072f96/app/src/main/res/mipmap-xhdpi/ic_add.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xhdpi/ic_add_foreground.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Adamant-im/adamant-android/a653fa6e3084cf964f416f710da5c8af97072f96/app/src/main/res/mipmap-xhdpi/ic_add_foreground.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xhdpi/ic_add_round.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Adamant-im/adamant-android/a653fa6e3084cf964f416f710da5c8af97072f96/app/src/main/res/mipmap-xhdpi/ic_add_round.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xhdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Adamant-im/adamant-android/a653fa6e3084cf964f416f710da5c8af97072f96/app/src/main/res/mipmap-xhdpi/ic_launcher.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xhdpi/ic_launcher_foreground.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Adamant-im/adamant-android/a653fa6e3084cf964f416f710da5c8af97072f96/app/src/main/res/mipmap-xhdpi/ic_launcher_foreground.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xhdpi/ic_launcher_round.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Adamant-im/adamant-android/a653fa6e3084cf964f416f710da5c8af97072f96/app/src/main/res/mipmap-xhdpi/ic_launcher_round.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xxhdpi/ic_add.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Adamant-im/adamant-android/a653fa6e3084cf964f416f710da5c8af97072f96/app/src/main/res/mipmap-xxhdpi/ic_add.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xxhdpi/ic_add_foreground.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Adamant-im/adamant-android/a653fa6e3084cf964f416f710da5c8af97072f96/app/src/main/res/mipmap-xxhdpi/ic_add_foreground.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xxhdpi/ic_add_round.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Adamant-im/adamant-android/a653fa6e3084cf964f416f710da5c8af97072f96/app/src/main/res/mipmap-xxhdpi/ic_add_round.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xxhdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Adamant-im/adamant-android/a653fa6e3084cf964f416f710da5c8af97072f96/app/src/main/res/mipmap-xxhdpi/ic_launcher.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xxhdpi/ic_launcher_foreground.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Adamant-im/adamant-android/a653fa6e3084cf964f416f710da5c8af97072f96/app/src/main/res/mipmap-xxhdpi/ic_launcher_foreground.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Adamant-im/adamant-android/a653fa6e3084cf964f416f710da5c8af97072f96/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xxxhdpi/ic_add.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Adamant-im/adamant-android/a653fa6e3084cf964f416f710da5c8af97072f96/app/src/main/res/mipmap-xxxhdpi/ic_add.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xxxhdpi/ic_add_foreground.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Adamant-im/adamant-android/a653fa6e3084cf964f416f710da5c8af97072f96/app/src/main/res/mipmap-xxxhdpi/ic_add_foreground.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xxxhdpi/ic_add_round.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Adamant-im/adamant-android/a653fa6e3084cf964f416f710da5c8af97072f96/app/src/main/res/mipmap-xxxhdpi/ic_add_round.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xxxhdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Adamant-im/adamant-android/a653fa6e3084cf964f416f710da5c8af97072f96/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xxxhdpi/ic_launcher_foreground.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Adamant-im/adamant-android/a653fa6e3084cf964f416f710da5c8af97072f96/app/src/main/res/mipmap-xxxhdpi/ic_launcher_foreground.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Adamant-im/adamant-android/a653fa6e3084cf964f416f710da5c8af97072f96/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png -------------------------------------------------------------------------------- /app/src/main/res/values-hdpi/dimens.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 284dp 4 | 20dp 5 | 12sp 6 | 14sp 7 | -------------------------------------------------------------------------------- /app/src/main/res/values-ldpi/dimens.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 244dp 4 | 12dp 5 | 10sp 6 | 12sp 7 | -------------------------------------------------------------------------------- /app/src/main/res/values-mdpi/dimens.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 244dp 4 | 12dp 5 | 10sp 6 | 12sp 7 | -------------------------------------------------------------------------------- /app/src/main/res/values-sw480dp/dimens.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 284dp 4 | 20dp 5 | 12sp 6 | 14sp 7 | -------------------------------------------------------------------------------- /app/src/main/res/values-sw600dp/dimens.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 424dp 4 | 20dp 5 | 12sp 6 | 14sp 7 | -------------------------------------------------------------------------------- /app/src/main/res/values-v21/styles.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 19 | 20 | 23 | 24 | 25 | 26 | 27 | 28 | -------------------------------------------------------------------------------- /app/src/main/res/values-v23/styles.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 6 | -------------------------------------------------------------------------------- /app/src/main/res/values-v26/styles.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 8 | 9 | 14 | 15 | 19 | 20 | 23 | 24 | 27 | -------------------------------------------------------------------------------- /app/src/main/res/values/attrs.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /app/src/release/google-services.json.enc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Adamant-im/adamant-android/a653fa6e3084cf964f416f710da5c8af97072f96/app/src/release/google-services.json.enc -------------------------------------------------------------------------------- /app/src/test/java/im/adamant/android/TestConstants.java: -------------------------------------------------------------------------------- 1 | package im.adamant.android; 2 | 3 | public interface TestConstants { 4 | String TEST_PUBLIC_KEY = "8c0d033510fc5707418037bbb6ae1b1e8622fd442fe3b0b2ba47f13877355ba4"; 5 | String TEST_PASS_PHRASE = "sword custom cushion around skin chair magic call evidence dynamic main suspect"; 6 | String TEST_SECRET_KEY = "8898aa6df66f98eba31be8517f69880dc65a3f2cf6e09a2abb9843e050d706308c0d033510fc5707418037bbb6ae1b1e8622fd442fe3b0b2ba47f13877355ba4"; 7 | String TEST_ADDRESS = "U15650841420785452182"; 8 | String TEST_COMPANION_ADDRESS = "U1119781441708645832"; 9 | long TEST_BALANCE = 100_000_000_000L; 10 | String FAKE_FCM_TOKEN = "bk3RNwTe3H0:CI2k_HHwgIpoDKCIZvvDMExUdFQ3P1..."; 11 | String FAKE_FCM_ID = "tst-00001"; 12 | } 13 | -------------------------------------------------------------------------------- /app/src/test/java/im/adamant/android/dagger/TestAdamantApiModule.java: -------------------------------------------------------------------------------- 1 | package im.adamant.android.dagger; 2 | 3 | import javax.inject.Singleton; 4 | 5 | import dagger.Module; 6 | import dagger.Provides; 7 | import im.adamant.android.core.AdamantApiBuilder; 8 | import im.adamant.android.core.DefaultAdamantApiBuilderImpl; 9 | import im.adamant.android.core.AdamantApiWrapper; 10 | import im.adamant.android.helpers.PublicKeyStorageImpl; 11 | import im.adamant.android.helpers.PublicKeyStorage; 12 | 13 | import static org.mockito.Mockito.mock; 14 | 15 | @Module 16 | public abstract class TestAdamantApiModule { 17 | @Singleton 18 | @Provides 19 | public static AdamantApiBuilder provideApiBuilder() { 20 | return mock(DefaultAdamantApiBuilderImpl.class); 21 | } 22 | 23 | @Singleton 24 | @Provides 25 | public static AdamantApiWrapper provideAdamantApiWrapper() { 26 | return mock(AdamantApiWrapper.class); 27 | } 28 | 29 | @Singleton 30 | @Provides 31 | public static PublicKeyStorage providePublicKeyStorage() { 32 | return mock(PublicKeyStorageImpl.class); 33 | } 34 | } 35 | -------------------------------------------------------------------------------- /app/src/test/java/im/adamant/android/dagger/TestAppComponent.java: -------------------------------------------------------------------------------- 1 | package im.adamant.android.dagger; 2 | 3 | import android.content.Context; 4 | 5 | import javax.inject.Singleton; 6 | 7 | import dagger.BindsInstance; 8 | import dagger.Component; 9 | import im.adamant.android.TestApplication; 10 | import im.adamant.android.cases.interactors.FCMNotificationServiceFacadeTest; 11 | import im.adamant.android.cases.presenters.SettingsPresenterTest; 12 | 13 | @Singleton 14 | @Component(modules = { 15 | TestAvatarsModule.class, 16 | TestEncryptionModule.class, 17 | TestMessagesModule.class, 18 | TestAdamantApiModule.class, 19 | TestWalletsModule.class, 20 | TestGeneralModule.class, 21 | TestMarkdownModule.class, 22 | TestInteractorsModule.class, 23 | TestPushNotificationModule.class, 24 | TestPresenterModule.class, 25 | TestAppModule.class 26 | }) 27 | public interface TestAppComponent { 28 | @Component.Builder 29 | interface Builder { 30 | @BindsInstance 31 | Builder context(Context context); 32 | TestAppComponent build(); 33 | } 34 | 35 | void inject(TestApplication app); 36 | void inject(SettingsPresenterTest test); 37 | void inject(FCMNotificationServiceFacadeTest test); 38 | } 39 | -------------------------------------------------------------------------------- /app/src/test/java/im/adamant/android/dagger/TestAvatarsModule.java: -------------------------------------------------------------------------------- 1 | package im.adamant.android.dagger; 2 | 3 | import javax.inject.Singleton; 4 | 5 | import dagger.Module; 6 | import dagger.Provides; 7 | import im.adamant.android.avatars.Avatar; 8 | import im.adamant.android.avatars.AvatarGraphics; 9 | import im.adamant.android.avatars.AvatarThemesProvider; 10 | 11 | import static org.mockito.Mockito.mock; 12 | 13 | @Module 14 | public abstract class TestAvatarsModule { 15 | @Singleton 16 | @Provides 17 | public static AvatarThemesProvider provideAvatarThemes() { 18 | return mock(AvatarThemesProvider.class); 19 | } 20 | 21 | @Singleton 22 | @Provides 23 | public static AvatarGraphics provideAvatarGraphics() { 24 | return mock(AvatarGraphics.class); 25 | } 26 | 27 | @Singleton 28 | @Provides 29 | public static Avatar provideAvatar(){ 30 | return mock(Avatar.class); 31 | } 32 | } 33 | -------------------------------------------------------------------------------- /app/src/test/java/im/adamant/android/dagger/TestMarkdownModule.java: -------------------------------------------------------------------------------- 1 | package im.adamant.android.dagger; 2 | 3 | import javax.inject.Singleton; 4 | 5 | import dagger.Module; 6 | import dagger.Provides; 7 | import im.adamant.android.markdown.AdamantAddressExtractor; 8 | import im.adamant.android.markdown.AdamantMarkdownProcessor; 9 | 10 | import static org.mockito.Mockito.mock; 11 | 12 | @Module 13 | public abstract class TestMarkdownModule { 14 | @Singleton 15 | @Provides 16 | public static AdamantMarkdownProcessor provideAdamantAddressProcessor() { 17 | return mock(AdamantMarkdownProcessor.class); 18 | } 19 | 20 | @Singleton 21 | @Provides 22 | public static AdamantAddressExtractor provideAdamantAddressExtractor() { 23 | return mock(AdamantAddressExtractor.class); 24 | } 25 | } 26 | -------------------------------------------------------------------------------- /app/src/test/java/im/adamant/android/dagger/activities/TestAllTransactionsScreenModule.java: -------------------------------------------------------------------------------- 1 | package im.adamant.android.dagger.activities; 2 | 3 | import dagger.Module; 4 | import dagger.Provides; 5 | import im.adamant.android.ui.adapters.CurrencyTransfersAdapter; 6 | import im.adamant.android.ui.presenters.AllTransactionsPresenter; 7 | 8 | import static org.mockito.Mockito.mock; 9 | 10 | @Module 11 | public class TestAllTransactionsScreenModule { 12 | @ActivityScope 13 | @Provides 14 | public CurrencyTransfersAdapter provideAdapter(){ 15 | return mock(CurrencyTransfersAdapter.class); 16 | } 17 | 18 | @ActivityScope 19 | @Provides 20 | public static AllTransactionsPresenter provideAllTransactionsPresenter() { 21 | return mock(AllTransactionsPresenter.class); 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /app/src/test/java/im/adamant/android/dagger/activities/TestLoginScreenModule.java: -------------------------------------------------------------------------------- 1 | package im.adamant.android.dagger.activities; 2 | 3 | import dagger.Module; 4 | import dagger.Provides; 5 | import dagger.android.ContributesAndroidInjector; 6 | import im.adamant.android.dagger.fragments.TestBottomLoginModule; 7 | import im.adamant.android.ui.adapters.WelcomeCardsAdapter; 8 | import im.adamant.android.ui.fragments.BottomLoginFragment; 9 | 10 | import static org.mockito.Mockito.mock; 11 | 12 | @Module 13 | public abstract class TestLoginScreenModule { 14 | @ContributesAndroidInjector(modules = {TestBottomLoginModule.class}) 15 | public abstract BottomLoginFragment provideBottomFragment(); 16 | 17 | @ActivityScope 18 | @Provides 19 | public static WelcomeCardsAdapter provideWelcomeCardAdapter() { 20 | return mock(WelcomeCardsAdapter.class); 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /app/src/test/java/im/adamant/android/dagger/activities/TestMessagesScreenModule.java: -------------------------------------------------------------------------------- 1 | package im.adamant.android.dagger.activities; 2 | 3 | import dagger.Module; 4 | import dagger.Provides; 5 | import im.adamant.android.ui.adapters.MessagesAdapter; 6 | import im.adamant.android.ui.messages_support.factories.MessageFactoryProvider; 7 | 8 | import static org.mockito.Mockito.mock; 9 | 10 | @Module 11 | public class TestMessagesScreenModule { 12 | @ActivityScope 13 | @Provides 14 | public MessagesAdapter provideAdapter() { 15 | return mock(MessagesAdapter.class); 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /app/src/test/java/im/adamant/android/dagger/activities/TestNodesListScreenModule.java: -------------------------------------------------------------------------------- 1 | package im.adamant.android.dagger.activities; 2 | 3 | import dagger.Module; 4 | import dagger.Provides; 5 | import im.adamant.android.helpers.Settings; 6 | import im.adamant.android.ui.adapters.ServerNodeAdapter; 7 | 8 | import static org.mockito.Mockito.mock; 9 | 10 | @Module 11 | public class TestNodesListScreenModule { 12 | @ActivityScope 13 | @Provides 14 | public ServerNodeAdapter provideAdapter() { 15 | return mock(ServerNodeAdapter.class); 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /app/src/test/java/im/adamant/android/dagger/activities/TestPushSubscriptionScreenModule.java: -------------------------------------------------------------------------------- 1 | package im.adamant.android.dagger.activities; 2 | 3 | import java.util.ArrayList; 4 | import java.util.Collection; 5 | 6 | import dagger.Module; 7 | import dagger.Provides; 8 | import im.adamant.android.interactors.SwitchPushNotificationServiceInteractor; 9 | import im.adamant.android.interactors.push.PushNotificationServiceFacade; 10 | import im.adamant.android.ui.adapters.PushNotificationServiceAdapter; 11 | 12 | import static org.mockito.Mockito.mock; 13 | 14 | @Module 15 | public class TestPushSubscriptionScreenModule { 16 | @ActivityScope 17 | @Provides 18 | public static PushNotificationServiceAdapter provideAdapter() { 19 | return mock(PushNotificationServiceAdapter.class); 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /app/src/test/java/im/adamant/android/dagger/activities/TestRegistrationScreenModule.java: -------------------------------------------------------------------------------- 1 | package im.adamant.android.dagger.activities; 2 | 3 | import android.os.Build; 4 | 5 | import dagger.Module; 6 | import dagger.Provides; 7 | import im.adamant.android.avatars.Avatar; 8 | import im.adamant.android.ui.adapters.PassphraseAdapter; 9 | import im.adamant.android.ui.transformations.PassphraseAvatarOutlineProvider; 10 | import im.adamant.android.ui.transformations.PassphraseAvatarTransformation; 11 | 12 | import static org.mockito.Mockito.mock; 13 | 14 | @Module 15 | public class TestRegistrationScreenModule { 16 | 17 | @ActivityScope 18 | @Provides 19 | public static PassphraseAdapter provideNewPassphraseAdapter() { 20 | return mock(PassphraseAdapter.class); 21 | } 22 | 23 | @ActivityScope 24 | @Provides 25 | public static PassphraseAvatarTransformation provideAvatarTransforamtion() { 26 | return mock(PassphraseAvatarTransformation.class); 27 | } 28 | } 29 | -------------------------------------------------------------------------------- /app/src/test/java/im/adamant/android/dagger/activities/TestScanQrCodeScreenModule.java: -------------------------------------------------------------------------------- 1 | package im.adamant.android.dagger.activities; 2 | 3 | import dagger.Module; 4 | 5 | @Module 6 | public class TestScanQrCodeScreenModule { 7 | } 8 | -------------------------------------------------------------------------------- /app/src/test/java/im/adamant/android/dagger/activities/TestSendCurrencyTransferScreenModule.java: -------------------------------------------------------------------------------- 1 | package im.adamant.android.dagger.activities; 2 | 3 | import dagger.Module; 4 | import dagger.Provides; 5 | import dagger.android.ContributesAndroidInjector; 6 | import im.adamant.android.dagger.fragments.TestSendFundsFragmentModule; 7 | import im.adamant.android.ui.adapters.SendCurrencyFragmentAdapter; 8 | import im.adamant.android.ui.fragments.SendFundsFragment; 9 | 10 | import static org.mockito.Mockito.mock; 11 | 12 | @Module 13 | public abstract class TestSendCurrencyTransferScreenModule { 14 | @ActivityScope 15 | @Provides 16 | public static SendCurrencyFragmentAdapter provideFragmentAdapter() { 17 | return mock(SendCurrencyFragmentAdapter.class); 18 | } 19 | 20 | @ContributesAndroidInjector(modules = {TestSendFundsFragmentModule.class}) 21 | public abstract SendFundsFragment createSendCurrencyFragmentInjector(); 22 | } 23 | -------------------------------------------------------------------------------- /app/src/test/java/im/adamant/android/dagger/activities/TestShowQrCodeScreenModule.java: -------------------------------------------------------------------------------- 1 | package im.adamant.android.dagger.activities; 2 | 3 | import dagger.Module; 4 | 5 | @Module 6 | public class TestShowQrCodeScreenModule { 7 | 8 | } 9 | -------------------------------------------------------------------------------- /app/src/test/java/im/adamant/android/dagger/activities/TestSplashScreenModule.java: -------------------------------------------------------------------------------- 1 | package im.adamant.android.dagger.activities; 2 | 3 | import javax.inject.Named; 4 | 5 | import dagger.Module; 6 | import dagger.Provides; 7 | import im.adamant.android.Screens; 8 | import io.reactivex.disposables.CompositeDisposable; 9 | 10 | @Module 11 | public class TestSplashScreenModule { 12 | @ActivityScope 13 | @Provides 14 | @Named(value = Screens.SPLASH_SCREEN) 15 | public CompositeDisposable provideComposite() { 16 | return new CompositeDisposable(); 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /app/src/test/java/im/adamant/android/dagger/activities/TestTransferDetailsScreenModule.java: -------------------------------------------------------------------------------- 1 | package im.adamant.android.dagger.activities; 2 | 3 | import dagger.Module; 4 | 5 | @Module 6 | public class TestTransferDetailsScreenModule { 7 | } 8 | -------------------------------------------------------------------------------- /app/src/test/java/im/adamant/android/dagger/fragments/TestBottomLoginModule.java: -------------------------------------------------------------------------------- 1 | package im.adamant.android.dagger.fragments; 2 | 3 | import dagger.Module; 4 | 5 | @Module 6 | public class TestBottomLoginModule { 7 | 8 | } 9 | -------------------------------------------------------------------------------- /app/src/test/java/im/adamant/android/dagger/fragments/TestBottomNavigationScreenModule.java: -------------------------------------------------------------------------------- 1 | package im.adamant.android.dagger.fragments; 2 | 3 | import dagger.Module; 4 | 5 | @Module 6 | public class TestBottomNavigationScreenModule { 7 | } 8 | -------------------------------------------------------------------------------- /app/src/test/java/im/adamant/android/dagger/fragments/TestChatsScreenModule.java: -------------------------------------------------------------------------------- 1 | package im.adamant.android.dagger.fragments; 2 | 3 | import javax.inject.Named; 4 | 5 | import dagger.Module; 6 | import dagger.Provides; 7 | import im.adamant.android.Screens; 8 | import im.adamant.android.avatars.Avatar; 9 | import im.adamant.android.ui.adapters.ChatsAdapter; 10 | import im.adamant.android.ui.fragments.ChatsScreen; 11 | import io.reactivex.disposables.CompositeDisposable; 12 | 13 | import static org.mockito.Mockito.mock; 14 | 15 | @Module 16 | public class TestChatsScreenModule { 17 | @FragmentScope 18 | @Provides 19 | public ChatsAdapter provideAdapter() { 20 | return mock(ChatsAdapter.class); 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /app/src/test/java/im/adamant/android/dagger/fragments/TestCreateChatScreenModule.java: -------------------------------------------------------------------------------- 1 | package im.adamant.android.dagger.fragments; 2 | 3 | import javax.inject.Named; 4 | 5 | import dagger.Module; 6 | import dagger.Provides; 7 | import im.adamant.android.Screens; 8 | import im.adamant.android.helpers.QrCodeHelper; 9 | 10 | import static org.mockito.Mockito.mock; 11 | 12 | @Module 13 | public class TestCreateChatScreenModule { 14 | @FragmentScope 15 | @Provides 16 | @Named(value = Screens.CREATE_CHAT_SCREEN) 17 | public QrCodeHelper provideQrCodeParser() { 18 | return mock(QrCodeHelper.class); 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /app/src/test/java/im/adamant/android/dagger/fragments/TestSendFundsFragmentModule.java: -------------------------------------------------------------------------------- 1 | package im.adamant.android.dagger.fragments; 2 | 3 | import javax.inject.Named; 4 | 5 | import dagger.Module; 6 | import dagger.Provides; 7 | import im.adamant.android.Screens; 8 | import im.adamant.android.ui.presenters.SendFundsPresenter; 9 | import io.reactivex.disposables.CompositeDisposable; 10 | 11 | import static org.mockito.Mockito.mock; 12 | 13 | @Module 14 | public class TestSendFundsFragmentModule { 15 | @FragmentScope 16 | @Provides 17 | public static SendFundsPresenter provideSendFundsPresenter() { 18 | return mock(SendFundsPresenter.class); 19 | } 20 | 21 | @FragmentScope 22 | @Provides 23 | @Named(value = Screens.SEND_CURRENCY_TRANSFER_SCREEN) 24 | public static CompositeDisposable provideSendCurrencyTransferComposite() { 25 | return new CompositeDisposable(); 26 | } 27 | } 28 | -------------------------------------------------------------------------------- /app/src/test/java/im/adamant/android/dagger/fragments/TestSettingsScreenModule.java: -------------------------------------------------------------------------------- 1 | package im.adamant.android.dagger.fragments; 2 | 3 | import dagger.Module; 4 | 5 | @Module 6 | public class TestSettingsScreenModule { 7 | 8 | } 9 | -------------------------------------------------------------------------------- /app/src/test/java/im/adamant/android/dagger/fragments/TestWalletScreenModule.java: -------------------------------------------------------------------------------- 1 | package im.adamant.android.dagger.fragments; 2 | 3 | import javax.inject.Named; 4 | 5 | import dagger.Module; 6 | import dagger.Provides; 7 | import im.adamant.android.Screens; 8 | import im.adamant.android.helpers.QrCodeHelper; 9 | import im.adamant.android.ui.adapters.CurrencyCardAdapter; 10 | import im.adamant.android.ui.adapters.CurrencyTransfersAdapter; 11 | 12 | import static org.mockito.Mockito.mock; 13 | 14 | @Module 15 | public class TestWalletScreenModule { 16 | @FragmentScope 17 | @Provides 18 | @Named(value = Screens.WALLET_SCREEN) 19 | public QrCodeHelper provideQrCodeParser() { 20 | return mock(QrCodeHelper.class); 21 | } 22 | 23 | @FragmentScope 24 | @Provides 25 | public CurrencyCardAdapter provideCardAdapter() { 26 | return mock(CurrencyCardAdapter.class); 27 | } 28 | 29 | @FragmentScope 30 | @Provides 31 | public CurrencyTransfersAdapter provideCurrencyTransferAdapter() { 32 | return mock(CurrencyTransfersAdapter.class); 33 | } 34 | } 35 | -------------------------------------------------------------------------------- /app/src/test/java/im/adamant/android/dagger/receivers/TestBootCompletedBroadcastReceiverModule.java: -------------------------------------------------------------------------------- 1 | package im.adamant.android.dagger.receivers; 2 | 3 | import dagger.Module; 4 | 5 | @Module 6 | public class TestBootCompletedBroadcastReceiverModule { 7 | } 8 | -------------------------------------------------------------------------------- /app/src/test/java/im/adamant/android/dagger/services/TestAdamantBalanceUpdateServiceModule.java: -------------------------------------------------------------------------------- 1 | package im.adamant.android.dagger.services; 2 | 3 | import javax.inject.Named; 4 | 5 | import dagger.Module; 6 | import dagger.Provides; 7 | import io.reactivex.disposables.CompositeDisposable; 8 | 9 | @Module 10 | public class TestAdamantBalanceUpdateServiceModule { 11 | public static final String NAME = "BalanceUpdateServiceModule"; 12 | 13 | @ServiceScope 14 | @Provides 15 | @Named(NAME) 16 | public static CompositeDisposable provideDisposable() { 17 | return new CompositeDisposable(); 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /app/src/test/java/im/adamant/android/dagger/services/TestAdamantFirebaseMessagingServiceModule.java: -------------------------------------------------------------------------------- 1 | package im.adamant.android.dagger.services; 2 | 3 | import dagger.Module; 4 | 5 | @Module 6 | public class TestAdamantFirebaseMessagingServiceModule { } 7 | -------------------------------------------------------------------------------- /app/src/test/java/im/adamant/android/dagger/services/TestAdamantLocalMessagingServiceModule.java: -------------------------------------------------------------------------------- 1 | package im.adamant.android.dagger.services; 2 | 3 | import dagger.Module; 4 | 5 | @Module 6 | public class TestAdamantLocalMessagingServiceModule { 7 | } 8 | -------------------------------------------------------------------------------- /app/src/test/java/im/adamant/android/dagger/services/TestSaveContactsServiceModule.java: -------------------------------------------------------------------------------- 1 | package im.adamant.android.dagger.services; 2 | 3 | import javax.inject.Named; 4 | 5 | import dagger.Module; 6 | import dagger.Provides; 7 | import io.reactivex.disposables.CompositeDisposable; 8 | 9 | @Module 10 | public class TestSaveContactsServiceModule { 11 | public static final String NAME = "SaveContactsServiceModule"; 12 | 13 | @ServiceScope 14 | @Provides 15 | @Named(NAME) 16 | public static CompositeDisposable provideDisposable() { 17 | return new CompositeDisposable(); 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /app/src/test/java/im/adamant/android/dagger/services/TestServerNodePingServiceModule.java: -------------------------------------------------------------------------------- 1 | package im.adamant.android.dagger.services; 2 | 3 | import javax.inject.Named; 4 | 5 | import dagger.Module; 6 | import dagger.Provides; 7 | import io.reactivex.disposables.CompositeDisposable; 8 | 9 | @Module 10 | public class TestServerNodePingServiceModule { 11 | public static final String NAME = "ServerNodePingServiceModule"; 12 | 13 | @ServiceScope 14 | @Provides 15 | @Named(NAME) 16 | public static CompositeDisposable provideDisposable() { 17 | return new CompositeDisposable(); 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /app/src/withoutServer/assets/network/accounts/error_not_found_account.json: -------------------------------------------------------------------------------- 1 | {"success":false,"nodeTimestamp":59541357,"error":"Account not found"} -------------------------------------------------------------------------------- /app/src/withoutServer/assets/network/accounts/get_0_01_balance_account.json: -------------------------------------------------------------------------------- 1 | {"success":true,"nodeTimestamp":59541357,"account":{"address":"U15650841420785452182","unconfirmedBalance":"10000000","balance":"10000000","publicKey":"8c0d033510fc5707418037bbb6ae1b1e8622fd442fe3b0b2ba47f13877355ba4","unconfirmedSignature":0,"secondSignature":0,"secondPublicKey":null,"multisignatures":[],"u_multisignatures":[]}} -------------------------------------------------------------------------------- /app/src/withoutServer/assets/network/accounts/get_zero_balance_account.json: -------------------------------------------------------------------------------- 1 | {"success":true,"nodeTimestamp":59541357,"account":{"address":"U15650841420785452182","unconfirmedBalance":"0","balance":"0","publicKey":"8c0d033510fc5707418037bbb6ae1b1e8622fd442fe3b0b2ba47f13877355ba4","unconfirmedSignature":0,"secondSignature":0,"secondPublicKey":null,"multisignatures":[],"u_multisignatures":[]}} -------------------------------------------------------------------------------- /app/src/withoutServer/assets/network/kvs/empty_contact_list.json: -------------------------------------------------------------------------------- 1 | { 2 | "success": true, 3 | "nodeTimestamp": 62874173, 4 | "transactions": [], 5 | "count": "0" 6 | } -------------------------------------------------------------------------------- /app/src/withoutServer/assets/network/public_keys/U1119781441708645832.json: -------------------------------------------------------------------------------- 1 | { 2 | "success": true, 3 | "nodeTimestamp": 61565191, 4 | "publicKey": "716a3fe588d5b7130c8c3a553e4f421f01f7e72506e79638406008091ca32c20" 5 | } -------------------------------------------------------------------------------- /app/src/withoutServer/assets/network/transactions/transactions.json: -------------------------------------------------------------------------------- 1 | { 2 | "success": true, 3 | "nodeTimestamp": 61085505, 4 | "transactions": [ 5 | { 6 | "id": "12738792577025539780", 7 | "height": 10440858, 8 | "blockId": "8896761861382646679", 9 | "type": 0, 10 | "timestamp": 59541505, 11 | "senderPublicKey": "cdab95b082b9774bd975677c868261618c7ce7bea97d02e0f56d483e30c077b6", 12 | "senderId": "U15423595369615486571", 13 | "recipientId": "U15650841420785452182", 14 | "recipientPublicKey": "8c0d033510fc5707418037bbb6ae1b1e8622fd442fe3b0b2ba47f13877355ba4", 15 | "amount": 10000000, 16 | "fee": 50000000, 17 | "signature": "93764f0c571054bf15d2839fae6490ef7f5f9bfcf4e35dcedc2df5a8c4ed281c9188d3714f5f85a756237fc901f737f0fc38feb3b009af33f5bdcc1cc6d4d203", 18 | "signatures": [], 19 | "confirmations": 305625, 20 | "asset": {} 21 | } 22 | ], 23 | "count": "1" 24 | } -------------------------------------------------------------------------------- /build.gradle: -------------------------------------------------------------------------------- 1 | // Top-level build file where you can add configuration options common to all sub-projects/modules. 2 | 3 | buildscript { 4 | repositories { 5 | google() 6 | jcenter() 7 | maven { 8 | url "https://plugins.gradle.org/m2/" 9 | } 10 | } 11 | dependencies { 12 | classpath 'com.android.tools.build:gradle:3.4.2' 13 | classpath "pl.allegro.tech.build:axion-release-plugin:1.9.1" 14 | classpath 'com.google.gms:google-services:4.2.0' 15 | } 16 | } 17 | 18 | plugins { 19 | id "org.sonarqube" version "2.7" 20 | } 21 | 22 | allprojects { 23 | repositories { 24 | google() 25 | jcenter() 26 | maven { 27 | url "https://dl.bintray.com/terl/lazysodium-maven" 28 | } 29 | maven { 30 | url "https://dl.bintray.com/novacrypto/BIP/" 31 | } 32 | maven { 33 | url "https://dl.bintray.com/novacrypto/SecureString/" 34 | } 35 | maven { url "https://jitpack.io" } 36 | maven { 37 | name 'Sonatype SNAPSHOTs'; 38 | url "https://oss.sonatype.org/content/repositories/snapshots" 39 | } 40 | } 41 | 42 | // tasks.withType(JavaCompile) { 43 | // options.compilerArgs << "-Xlint:unchecked" << "-Xlint:deprecation" 44 | // } 45 | } 46 | 47 | task clean(type: Delete) { 48 | delete rootProject.buildDir 49 | } 50 | 51 | apply plugin: "pl.allegro.tech.build.axion-release" -------------------------------------------------------------------------------- /changelog.sh: -------------------------------------------------------------------------------- 1 | git log --pretty=oneline --abbrev-commit --after="$1" --before="$2" > changelog-"$1"--"$2".log -------------------------------------------------------------------------------- /fastlane/Appfile: -------------------------------------------------------------------------------- 1 | json_key_file("travis-ci-service-account.json") 2 | package_name("im.adamant.android") 3 | -------------------------------------------------------------------------------- /fastlane/Fastfile: -------------------------------------------------------------------------------- 1 | # This file contains the fastlane.tools configuration 2 | # You can find the documentation at https://docs.fastlane.tools 3 | # 4 | # For a list of all available actions, check out 5 | # 6 | # https://docs.fastlane.tools/actions 7 | # 8 | # For a list of all available plugins, check out 9 | # 10 | # https://docs.fastlane.tools/plugins/available-plugins 11 | # 12 | 13 | # Uncomment the line if you want fastlane to automatically update itself 14 | # update_fastlane 15 | 16 | default_platform(:android) 17 | 18 | platform :android do 19 | desc "Deploy a new version to the Google Play (Internal testing)" 20 | lane :deploy do 21 | supply(track: "internal", 22 | package_name: "im.adamant.android", 23 | apk: "app/build/outputs/apk/withServer/release/adamant.apk") 24 | end 25 | end 26 | -------------------------------------------------------------------------------- /files.zip.enc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Adamant-im/adamant-android/a653fa6e3084cf964f416f710da5c8af97072f96/files.zip.enc -------------------------------------------------------------------------------- /gradle.properties: -------------------------------------------------------------------------------- 1 | # Project-wide Gradle settings. 2 | # IDE (e.g. Android Studio) users: 3 | # Gradle settings configured through the IDE *will override* 4 | # any settings specified in this file. 5 | # For more details on how to configure your build environment visit 6 | # http://www.gradle.org/docs/current/userguide/build_environment.html 7 | # Specifies the JVM arguments used for the daemon process. 8 | # The setting is particularly useful for tweaking memory settings. 9 | android.enableJetifier=true 10 | android.useAndroidX=true 11 | org.gradle.jvmargs=-Xmx1536m 12 | # When configured, Gradle will run in incubating parallel mode. 13 | # This option should only be used with decoupled projects. More details, visit 14 | # http://www.gradle.org/docs/current/userguide/multi_project_builds.html#sec:decoupled_projects 15 | # org.gradle.parallel=true 16 | android.jetifier.blacklist = butterknife-compiler 17 | android.enableUnitTestBinaryResources=true -------------------------------------------------------------------------------- /gradle/wrapper/gradle-wrapper.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Adamant-im/adamant-android/a653fa6e3084cf964f416f710da5c8af97072f96/gradle/wrapper/gradle-wrapper.jar -------------------------------------------------------------------------------- /gradle/wrapper/gradle-wrapper.properties: -------------------------------------------------------------------------------- 1 | #Sun Apr 28 15:12:12 MSK 2019 2 | distributionBase=GRADLE_USER_HOME 3 | distributionPath=api/dists 4 | zipStoreBase=GRADLE_USER_HOME 5 | zipStorePath=api/dists 6 | distributionUrl=https\://services.gradle.org/distributions/gradle-5.1.1-all.zip 7 | -------------------------------------------------------------------------------- /settings.gradle: -------------------------------------------------------------------------------- 1 | include ':app' --------------------------------------------------------------------------------