├── .gitignore ├── .travis.yml ├── LICENSE ├── README.md ├── app ├── .gitignore ├── build.gradle ├── proguard-rules.pro └── src │ └── main │ ├── AndroidManifest.xml │ ├── ic_launcher-web.png │ ├── java │ └── com │ │ └── wallet │ │ └── crypto │ │ └── trustapp │ │ ├── App.java │ │ ├── C.java │ │ ├── di │ │ ├── AccountsManageModule.java │ │ ├── ActivityScope.java │ │ ├── AddTokenModule.java │ │ ├── AppComponent.java │ │ ├── BuildersModule.java │ │ ├── ConfirmationModule.java │ │ ├── FragmentScope.java │ │ ├── GasSettingsModule.java │ │ ├── ImportModule.java │ │ ├── RepositoriesModule.java │ │ ├── SendModule.java │ │ ├── SettingsFragmentModule.java │ │ ├── SettingsModule.java │ │ ├── SplashModule.java │ │ ├── TokensModule.java │ │ ├── ToolsModule.java │ │ ├── TransactionDetailModule.java │ │ └── TransactionsModule.java │ │ ├── entity │ │ ├── Address.java │ │ ├── ApiErrorException.java │ │ ├── ErrorEnvelope.java │ │ ├── GasSettings.java │ │ ├── NetworkInfo.java │ │ ├── ServiceErrorException.java │ │ ├── ServiceException.java │ │ ├── Ticker.java │ │ ├── Token.java │ │ ├── TokenInfo.java │ │ ├── Transaction.java │ │ ├── TransactionContract.java │ │ ├── TransactionOperation.java │ │ └── Wallet.java │ │ ├── interact │ │ ├── AddTokenInteract.java │ │ ├── CreateTransactionInteract.java │ │ ├── CreateTransactionInteractType.java │ │ ├── CreateWalletInteract.java │ │ ├── DeleteWalletInteract.java │ │ ├── ExportWalletInteract.java │ │ ├── FetchGasSettingsInteract.java │ │ ├── FetchTokensInteract.java │ │ ├── FetchTransactionsInteract.java │ │ ├── FetchWalletsInteract.java │ │ ├── FindDefaultNetworkInteract.java │ │ ├── FindDefaultWalletInteract.java │ │ ├── GetDefaultWalletBalance.java │ │ ├── ImportWalletInteract.java │ │ ├── SetDefaultWalletInteract.java │ │ └── rx │ │ │ └── operator │ │ │ ├── CompletableErrorProxyOperator.java │ │ │ ├── Operators.java │ │ │ └── SavePasswordOperator.java │ │ ├── repository │ │ ├── EthereumNetworkRepository.java │ │ ├── EthereumNetworkRepositoryType.java │ │ ├── OnNetworkChangeListener.java │ │ ├── PasswordStore.java │ │ ├── PreferenceRepositoryType.java │ │ ├── RealmTokenSource.java │ │ ├── SharedPreferenceRepository.java │ │ ├── TokenLocalSource.java │ │ ├── TokenRepository.java │ │ ├── TokenRepositoryType.java │ │ ├── TransactionInDiskSource.java │ │ ├── TransactionInMemorySource.java │ │ ├── TransactionLocalSource.java │ │ ├── TransactionRepository.java │ │ ├── TransactionRepositoryType.java │ │ ├── TrustPasswordStore.java │ │ ├── WalletRepository.java │ │ ├── WalletRepositoryType.java │ │ └── entity │ │ │ └── RealmTokenInfo.java │ │ ├── router │ │ ├── AddTokenRouter.java │ │ ├── ConfirmationRouter.java │ │ ├── ExternalBrowserRouter.java │ │ ├── GasSettingsRouter.java │ │ ├── ImportWalletRouter.java │ │ ├── ManageWalletsRouter.java │ │ ├── MyAddressRouter.java │ │ ├── MyTokensRouter.java │ │ ├── SendRouter.java │ │ ├── SendTokenRouter.java │ │ ├── SettingsRouter.java │ │ ├── TransactionDetailRouter.java │ │ └── TransactionsRouter.java │ │ ├── service │ │ ├── AccountKeystoreService.java │ │ ├── BlockExplorerClient.java │ │ ├── BlockExplorerClientType.java │ │ ├── CoinmarketcapTickerService.java │ │ ├── EthplorerTokenService.java │ │ ├── GethKeystoreAccountService.java │ │ ├── TickerService.java │ │ ├── TokenExplorerClientType.java │ │ └── TrustWalletTickerService.java │ │ ├── ui │ │ ├── AddTokenActivity.java │ │ ├── BaseActivity.java │ │ ├── ConfirmationActivity.java │ │ ├── GasSettingsActivity.java │ │ ├── ImportKeystoreFragment.java │ │ ├── ImportPrivateKeyFragment.java │ │ ├── ImportWalletActivity.java │ │ ├── MyAddressActivity.java │ │ ├── SendActivity.java │ │ ├── SettingsActivity.java │ │ ├── SettingsFragment.java │ │ ├── SplashActivity.java │ │ ├── TokensActivity.java │ │ ├── TransactionDetailActivity.java │ │ ├── TransactionsActivity.java │ │ ├── WalletsActivity.java │ │ ├── barcode │ │ │ ├── BarcodeCaptureActivity.java │ │ │ ├── BarcodeTracker.java │ │ │ └── BarcodeTrackerFactory.java │ │ ├── camera │ │ │ ├── CameraSource.java │ │ │ └── CameraSourcePreview.java │ │ └── widget │ │ │ ├── OnBackupClickListener.java │ │ │ ├── OnDepositClickListener.java │ │ │ ├── OnImportKeystoreListener.java │ │ │ ├── OnImportPrivateKeyListener.java │ │ │ ├── OnTokenClickListener.java │ │ │ ├── OnTransactionClickListener.java │ │ │ ├── adapter │ │ │ ├── TabPagerAdapter.java │ │ │ ├── TokensAdapter.java │ │ │ ├── TransactionsAdapter.java │ │ │ └── WalletsAdapter.java │ │ │ ├── entity │ │ │ ├── DateSortedItem.java │ │ │ ├── SortedItem.java │ │ │ ├── TimestampSortedItem.java │ │ │ └── TransactionSortedItem.java │ │ │ └── holder │ │ │ ├── BinderViewHolder.java │ │ │ ├── TokenHolder.java │ │ │ ├── TransactionDateHolder.java │ │ │ ├── TransactionHolder.java │ │ │ └── WalletHolder.java │ │ ├── util │ │ ├── BalanceUtils.java │ │ ├── KS.java │ │ ├── KeyboardUtils.java │ │ ├── LogInterceptor.java │ │ ├── QRURLParser.java │ │ └── RootUtil.java │ │ ├── viewmodel │ │ ├── AddTokenViewModel.java │ │ ├── AddTokenViewModelFactory.java │ │ ├── BaseNavigationActivity.java │ │ ├── BaseViewModel.java │ │ ├── ConfirmationViewModel.java │ │ ├── ConfirmationViewModelFactory.java │ │ ├── CreateAccountViewModel.java │ │ ├── CreateAccountViewModelFactory.java │ │ ├── GasSettingsViewModel.java │ │ ├── GasSettingsViewModelFactory.java │ │ ├── ImportWalletViewModel.java │ │ ├── ImportWalletViewModelFactory.java │ │ ├── SendViewModel.java │ │ ├── SendViewModelFactory.java │ │ ├── SplashViewModel.java │ │ ├── SplashViewModelFactory.java │ │ ├── TokensViewModel.java │ │ ├── TokensViewModelFactory.java │ │ ├── TransactionDetailViewModel.java │ │ ├── TransactionDetailViewModelFactory.java │ │ ├── TransactionsViewModel.java │ │ ├── TransactionsViewModelFactory.java │ │ ├── WalletsViewModel.java │ │ └── WalletsViewModelFactory.java │ │ └── widget │ │ ├── AddWalletView.java │ │ ├── BackupView.java │ │ ├── BackupWarningView.java │ │ ├── DepositView.java │ │ ├── EmptyTransactionsView.java │ │ ├── HelperTextInputLayout.java │ │ └── SystemView.java │ ├── res │ ├── drawable-hdpi │ │ ├── ic_action_deposit.png │ │ ├── ic_facebook.png │ │ ├── settings_rpc_server.png │ │ └── token_icon.png │ ├── drawable-mdpi │ │ ├── ic_action_deposit.png │ │ ├── ic_facebook.png │ │ ├── ic_share_white_24dp.xml │ │ ├── settings_rpc_server.png │ │ └── token_icon.png │ ├── drawable-nodpi │ │ ├── no_transactions_mascot.png │ │ ├── onboarding_erc20.png │ │ └── settings_facebook.png │ ├── drawable-v21 │ │ └── bg_ripple_primary_color.xml │ ├── drawable-xhdpi │ │ ├── ic_action_deposit.png │ │ ├── ic_facebook.png │ │ ├── settings_rpc_server.png │ │ └── token_icon.png │ ├── drawable-xxhdpi │ │ ├── ic_action_deposit.png │ │ ├── ic_facebook.png │ │ ├── settings_rpc_server.png │ │ └── token_icon.png │ ├── drawable │ │ ├── bg_ripple_primary_color.xml │ │ ├── ic_add_black_24dp.xml │ │ ├── ic_add_circle_black_24dp.xml │ │ ├── ic_add_white_24dp.xml │ │ ├── ic_arrow_downward_black_24dp.xml │ │ ├── ic_arrow_upward_black_24dp.xml │ │ ├── ic_attach_money_white_24dp.xml │ │ ├── ic_autorenew_black_24dp.xml │ │ ├── ic_backup_black_24dp.xml │ │ ├── ic_call_received_white_24dp.xml │ │ ├── ic_chevron_right_black_24dp.xml │ │ ├── ic_code_black_24dp.xml │ │ ├── ic_content_paste_black_24dp.xml │ │ ├── ic_dashboard_black_24dp.xml │ │ ├── ic_delete_forever_black_24dp.xml │ │ ├── ic_error_outline_black_24dp.xml │ │ ├── ic_file_download_black_24dp.xml │ │ ├── ic_home_black_24dp.xml │ │ ├── ic_import_export_black_24dp.xml │ │ ├── ic_notifications_black_24dp.xml │ │ ├── ic_send_white_24dp.xml │ │ ├── ic_settings_white_24dp.xml │ │ ├── ic_share_black_24dp.xml │ │ ├── ic_swap_horiz_white_24dp.xml │ │ ├── ic_warning_black_24dp.xml │ │ └── splash_background.xml │ ├── font │ │ ├── roboto_bolt.ttf │ │ └── roboto_regular.ttf │ ├── layout-land │ │ └── layout_dialog_warning_backup.xml │ ├── layout │ │ ├── account_list_content.xml │ │ ├── activity_add_token.xml │ │ ├── activity_confirm.xml │ │ ├── activity_gas_settings.xml │ │ ├── activity_import_wallet.xml │ │ ├── activity_my_address.xml │ │ ├── activity_send.xml │ │ ├── activity_settings.xml │ │ ├── activity_splash.xml │ │ ├── activity_tokens.xml │ │ ├── activity_transaction_detail.xml │ │ ├── activity_transactions.xml │ │ ├── activity_wallets.xml │ │ ├── fragment_import_keystore.xml │ │ ├── fragment_import_private_key.xml │ │ ├── item_token.xml │ │ ├── item_transaction.xml │ │ ├── item_transactions_date_head.xml │ │ ├── item_wallet_manage.xml │ │ ├── layout_app_bar.xml │ │ ├── layout_app_bar_with_tab.xml │ │ ├── layout_barcode_capture.xml │ │ ├── layout_dialog_add_account.xml │ │ ├── layout_dialog_backup.xml │ │ ├── layout_dialog_deposit.xml │ │ ├── layout_dialog_warning_backup.xml │ │ ├── layout_empty_add_account.xml │ │ ├── layout_empty_transactions.xml │ │ ├── layout_page_intro.xml │ │ ├── layout_simple_toolbar.xml │ │ └── layout_system_view.xml │ ├── menu │ │ ├── confirmation_menu.xml │ │ ├── menu_add.xml │ │ ├── menu_deposit.xml │ │ ├── menu_main_network.xml │ │ ├── menu_secondary_network.xml │ │ ├── menu_settings.xml │ │ ├── menu_share.xml │ │ ├── send_menu.xml │ │ └── send_settings_menu.xml │ ├── mipmap-anydpi-v26 │ │ ├── ic_launcher.xml │ │ ├── ic_launcher_round.xml │ │ └── ic_splash.png │ ├── mipmap-hdpi │ │ ├── ic_launcher.png │ │ ├── ic_launcher_background.png │ │ ├── ic_launcher_foreground.png │ │ ├── ic_launcher_round.png │ │ ├── settings_backup.png │ │ ├── settings_bug.png │ │ ├── settings_donate.png │ │ ├── settings_email.png │ │ ├── settings_open_source.png │ │ ├── settings_privacy_policy.png │ │ ├── settings_rating.png │ │ ├── settings_server.png │ │ ├── settings_telegram.png │ │ ├── settings_terms.png │ │ ├── settings_twitter.png │ │ └── token_logo.png │ ├── mipmap-mdpi │ │ ├── ic_launcher.png │ │ ├── ic_launcher_background.png │ │ ├── ic_launcher_foreground.png │ │ ├── ic_launcher_round.png │ │ ├── settings_backup.png │ │ ├── settings_bug.png │ │ ├── settings_donate.png │ │ ├── settings_email.png │ │ ├── settings_open_source.png │ │ ├── settings_privacy_policy.png │ │ ├── settings_rating.png │ │ ├── settings_server.png │ │ ├── settings_telegram.png │ │ ├── settings_terms.png │ │ ├── settings_twitter.png │ │ └── token_logo.png │ ├── mipmap-xhdpi │ │ ├── ic_launcher.png │ │ ├── ic_launcher_background.png │ │ ├── ic_launcher_foreground.png │ │ ├── ic_launcher_round.png │ │ ├── settings_backup.png │ │ ├── settings_bug.png │ │ ├── settings_donate.png │ │ ├── settings_email.png │ │ ├── settings_open_source.png │ │ ├── settings_privacy_policy.png │ │ ├── settings_rating.png │ │ ├── settings_server.png │ │ ├── settings_telegram.png │ │ ├── settings_terms.png │ │ ├── settings_twitter.png │ │ └── token_logo.png │ ├── mipmap-xxhdpi │ │ ├── ic_launcher.png │ │ ├── ic_launcher_background.png │ │ ├── ic_launcher_foreground.png │ │ ├── ic_launcher_round.png │ │ ├── settings_backup.png │ │ ├── settings_bug.png │ │ ├── settings_donate.png │ │ ├── settings_email.png │ │ ├── settings_open_source.png │ │ ├── settings_privacy_policy.png │ │ ├── settings_rating.png │ │ ├── settings_server.png │ │ ├── settings_telegram.png │ │ ├── settings_terms.png │ │ ├── settings_twitter.png │ │ └── token_logo.png │ ├── mipmap-xxxhdpi │ │ ├── backup_warning.png │ │ ├── ic_launcher.png │ │ ├── ic_launcher_background.png │ │ ├── ic_launcher_foreground.png │ │ ├── ic_launcher_round.png │ │ ├── ic_splash.png │ │ ├── onboarding_lock.png │ │ ├── onboarding_open_source.png │ │ ├── onboarding_rocket.png │ │ ├── qr_code_icon.png │ │ ├── settings_backup.png │ │ ├── settings_bug.png │ │ ├── settings_donate.png │ │ ├── settings_email.png │ │ ├── settings_export.png │ │ ├── settings_open_source.png │ │ ├── settings_privacy_policy.png │ │ ├── settings_rating.png │ │ ├── settings_server.png │ │ ├── settings_telegram.png │ │ ├── settings_terms.png │ │ ├── settings_twitter.png │ │ └── token_logo.png │ ├── values-land │ │ └── dimens.xml │ ├── values │ │ ├── colors.xml │ │ ├── dimens.xml │ │ ├── helper_input_layout_res.xml │ │ ├── ic_launcher_background.xml │ │ ├── strings.xml │ │ └── styles.xml │ └── xml │ │ └── fragment_settings.xml │ └── settings_rating-web.png ├── build.gradle ├── gradle.properties ├── gradle └── wrapper │ ├── gradle-wrapper.jar │ └── gradle-wrapper.properties ├── gradlew ├── gradlew.bat └── settings.gradle /.gitignore: -------------------------------------------------------------------------------- 1 | .idea 2 | .DS_Store 3 | /captures 4 | .externalNativeBuild 5 | 6 | ### Android ### 7 | # Built application files 8 | *.apk 9 | *.ap_ 10 | *.iml 11 | *.swp 12 | *.swo 13 | 14 | # Files for the Dalvik VM 15 | *.dex 16 | 17 | # Java class files 18 | *.class 19 | 20 | # Generated files 21 | bin/ 22 | gen/ 23 | 24 | # Gradle files 25 | .gradle/ 26 | /build 27 | app/release 28 | 29 | # Fastlane 30 | fastlane/report.xml 31 | 32 | # Local configuration file (sdk path, etc) 33 | /local.properties 34 | 35 | # Proguard folder generated by Eclipse 36 | proguard/ 37 | 38 | # Log Files 39 | *.log 40 | 41 | # Android Studio Navigation editor temp files 42 | .navigation/ 43 | 44 | ### Android Patch ### 45 | gen-external-apklibs 46 | -------------------------------------------------------------------------------- /.travis.yml: -------------------------------------------------------------------------------- 1 | language: android 2 | sudo: false 3 | android: 4 | components: 5 | # Uncomment the lines below if you want to 6 | # use the latest revision of Android SDK Tools 7 | - tools 8 | - platform-tools 9 | 10 | # The BuildTools version used by your project 11 | - build-tools-26.0.2 12 | 13 | # The SDK version used to compile your project 14 | - android-26 15 | 16 | - extra-android-m2repository 17 | - extra-google-android-support 18 | 19 | # Specify at least one system image, 20 | # if you need to run emulator(s) during your tests 21 | - sys-img-x86-android-26 22 | 23 | licenses: 24 | - 'android-sdk-preview-license-.+' 25 | - 'android-sdk-license-.+' 26 | - 'google-gdk-license-.+' 27 | 28 | install: 29 | - true 30 | 31 | script: 32 | - ./gradlew build 33 | 34 | after_success: 35 | - bash <(curl -s https://copilot.blackducksoftware.com/ci/travis/scripts/upload) 36 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Trust - Ethereum Wallet for Android 2 | 3 | [![Build Status](https://travis-ci.org/TrustWallet/trust-wallet-android.svg?branch=master)](https://travis-ci.org/TrustWallet/trust-wallet-android) 4 | [![License](https://img.shields.io/badge/license-GPL3-green.svg?style=flat)](https://github.com/fastlane/fastlane/blob/master/LICENSE) 5 | 6 | [](https://play.google.com/store/apps/details?id=com.wallet.crypto.trustapp) 7 | 8 | [](https://play.google.com/store/apps/details?id=com.wallet.crypto.trustapp) 9 | 10 | Welcome to Trust's open source Android app! 11 | 12 | Please read our post on why Android open source development harm our users: https://medium.com/@trustwallet/why-open-sourcing-android-app-could-be-a-harm-to-the-crypto-community-fb3ae1707dc6 13 | 14 | Website: https://trustwalletapp.com 15 | 16 | Download Android version: https://play.google.com/store/apps/details?id=com.wallet.crypto.trustapp 17 | 18 | Blog: https://medium.com/@trustwallet 19 | 20 | 21 | -------------------------------------------------------------------------------- /app/.gitignore: -------------------------------------------------------------------------------- 1 | /build 2 | -------------------------------------------------------------------------------- /app/proguard-rules.pro: -------------------------------------------------------------------------------- 1 | # Add project specific ProGuard rules here. 2 | # By default, the flags in this file are appended to flags specified 3 | # in /home/marat/Android/Sdk/tools/proguard/proguard-android.txt 4 | # You can edit the include path and order by changing the proguardFiles 5 | # directive in build.gradle. 6 | # 7 | # For more details, see 8 | # http://developer.android.com/guide/developing/tools/proguard.html 9 | 10 | # Add any project specific keep options here: 11 | 12 | # If your project uses WebView with JS, uncomment the following 13 | # and specify the fully qualified class name to the JavaScript interface 14 | # class: 15 | #-keepclassmembers class fqcn.of.javascript.interface.for.webview { 16 | # public *; 17 | #} 18 | 19 | # Uncomment this to preserve the line number information for 20 | # debugging stack traces. 21 | #-keepattributes SourceFile,LineNumberTable 22 | 23 | # If you keep the line number information, uncomment this to 24 | # hide the original source file name. 25 | #-renamesourcefileattribute SourceFile 26 | -------------------------------------------------------------------------------- /app/src/main/ic_launcher-web.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/trustwallet/trust-wallet-android-source/4d9ad8315aa4e5f5232e91be5bf1156770870e44/app/src/main/ic_launcher-web.png -------------------------------------------------------------------------------- /app/src/main/java/com/wallet/crypto/trustapp/App.java: -------------------------------------------------------------------------------- 1 | package com.wallet.crypto.trustapp; 2 | 3 | import android.app.Activity; 4 | import android.support.multidex.MultiDexApplication; 5 | 6 | import com.wallet.crypto.trustapp.di.DaggerAppComponent; 7 | 8 | import javax.inject.Inject; 9 | 10 | import dagger.android.AndroidInjector; 11 | import dagger.android.DispatchingAndroidInjector; 12 | import dagger.android.HasActivityInjector; 13 | import io.realm.Realm; 14 | 15 | public class App extends MultiDexApplication implements HasActivityInjector { 16 | 17 | @Inject 18 | DispatchingAndroidInjector dispatchingAndroidInjector; 19 | 20 | @Override 21 | public void onCreate() { 22 | super.onCreate(); 23 | Realm.init(this); 24 | DaggerAppComponent 25 | .builder() 26 | .application(this) 27 | .build() 28 | .inject(this); 29 | } 30 | 31 | @Override 32 | public AndroidInjector activityInjector() { 33 | return dispatchingAndroidInjector; 34 | } 35 | 36 | } 37 | -------------------------------------------------------------------------------- /app/src/main/java/com/wallet/crypto/trustapp/di/ActivityScope.java: -------------------------------------------------------------------------------- 1 | package com.wallet.crypto.trustapp.di; 2 | 3 | import java.lang.annotation.Retention; 4 | 5 | import javax.inject.Scope; 6 | 7 | import static java.lang.annotation.RetentionPolicy.RUNTIME; 8 | 9 | @Scope 10 | @Retention(RUNTIME) 11 | public @interface ActivityScope { 12 | } -------------------------------------------------------------------------------- /app/src/main/java/com/wallet/crypto/trustapp/di/AddTokenModule.java: -------------------------------------------------------------------------------- 1 | package com.wallet.crypto.trustapp.di; 2 | 3 | import com.wallet.crypto.trustapp.interact.AddTokenInteract; 4 | import com.wallet.crypto.trustapp.interact.FindDefaultWalletInteract; 5 | import com.wallet.crypto.trustapp.repository.TokenRepositoryType; 6 | import com.wallet.crypto.trustapp.repository.WalletRepositoryType; 7 | import com.wallet.crypto.trustapp.router.MyTokensRouter; 8 | import com.wallet.crypto.trustapp.viewmodel.AddTokenViewModelFactory; 9 | 10 | import dagger.Module; 11 | import dagger.Provides; 12 | 13 | @Module 14 | public class AddTokenModule { 15 | 16 | @Provides 17 | AddTokenViewModelFactory addTokenViewModelFactory( 18 | AddTokenInteract addTokenInteract, 19 | FindDefaultWalletInteract findDefaultWalletInteract, 20 | MyTokensRouter myTokensRouter) { 21 | return new AddTokenViewModelFactory( 22 | addTokenInteract, findDefaultWalletInteract, myTokensRouter); 23 | } 24 | 25 | @Provides 26 | AddTokenInteract provideAddTokenInteract( 27 | TokenRepositoryType tokenRepository, 28 | WalletRepositoryType walletRepository) { 29 | return new AddTokenInteract(walletRepository, tokenRepository); 30 | } 31 | 32 | @Provides 33 | FindDefaultWalletInteract provideFindDefaultWalletInteract(WalletRepositoryType walletRepository) { 34 | return new FindDefaultWalletInteract(walletRepository); 35 | } 36 | 37 | @Provides 38 | MyTokensRouter provideMyTokensRouter() { 39 | return new MyTokensRouter(); 40 | } 41 | } 42 | -------------------------------------------------------------------------------- /app/src/main/java/com/wallet/crypto/trustapp/di/AppComponent.java: -------------------------------------------------------------------------------- 1 | package com.wallet.crypto.trustapp.di; 2 | 3 | import com.wallet.crypto.trustapp.App; 4 | 5 | import javax.inject.Singleton; 6 | 7 | import dagger.BindsInstance; 8 | import dagger.Component; 9 | import dagger.android.support.AndroidSupportInjectionModule; 10 | 11 | @Singleton 12 | @Component(modules = { 13 | AndroidSupportInjectionModule.class, 14 | ToolsModule.class, 15 | RepositoriesModule.class, 16 | BuildersModule.class }) 17 | public interface AppComponent { 18 | 19 | @Component.Builder 20 | interface Builder { 21 | @BindsInstance 22 | Builder application(App app); 23 | AppComponent build(); 24 | } 25 | void inject(App app); 26 | } 27 | -------------------------------------------------------------------------------- /app/src/main/java/com/wallet/crypto/trustapp/di/FragmentScope.java: -------------------------------------------------------------------------------- 1 | package com.wallet.crypto.trustapp.di; 2 | 3 | import java.lang.annotation.Retention; 4 | 5 | import javax.inject.Scope; 6 | 7 | import static java.lang.annotation.RetentionPolicy.RUNTIME; 8 | 9 | @Scope 10 | @Retention(RUNTIME) 11 | public @interface FragmentScope { 12 | } -------------------------------------------------------------------------------- /app/src/main/java/com/wallet/crypto/trustapp/di/GasSettingsModule.java: -------------------------------------------------------------------------------- 1 | package com.wallet.crypto.trustapp.di; 2 | 3 | 4 | import com.wallet.crypto.trustapp.interact.FindDefaultNetworkInteract; 5 | import com.wallet.crypto.trustapp.repository.EthereumNetworkRepositoryType; 6 | import com.wallet.crypto.trustapp.viewmodel.GasSettingsViewModelFactory; 7 | 8 | import dagger.Module; 9 | import dagger.Provides; 10 | 11 | @Module 12 | public class GasSettingsModule { 13 | 14 | @Provides 15 | public GasSettingsViewModelFactory provideGasSettingsViewModelFactory(FindDefaultNetworkInteract findDefaultNetworkInteract) { 16 | return new GasSettingsViewModelFactory(findDefaultNetworkInteract); 17 | } 18 | 19 | @Provides 20 | FindDefaultNetworkInteract provideFindDefaultNetworkInteract( 21 | EthereumNetworkRepositoryType ethereumNetworkRepositoryType) { 22 | return new FindDefaultNetworkInteract(ethereumNetworkRepositoryType); 23 | } 24 | } 25 | -------------------------------------------------------------------------------- /app/src/main/java/com/wallet/crypto/trustapp/di/ImportModule.java: -------------------------------------------------------------------------------- 1 | package com.wallet.crypto.trustapp.di; 2 | 3 | import com.wallet.crypto.trustapp.interact.ImportWalletInteract; 4 | import com.wallet.crypto.trustapp.repository.PasswordStore; 5 | import com.wallet.crypto.trustapp.repository.WalletRepositoryType; 6 | import com.wallet.crypto.trustapp.viewmodel.ImportWalletViewModelFactory; 7 | 8 | import dagger.Module; 9 | import dagger.Provides; 10 | 11 | @Module 12 | class ImportModule { 13 | @Provides 14 | ImportWalletViewModelFactory provideImportWalletViewModelFactory( 15 | ImportWalletInteract importWalletInteract) { 16 | return new ImportWalletViewModelFactory(importWalletInteract); 17 | } 18 | 19 | @Provides 20 | ImportWalletInteract provideImportWalletInteract( 21 | WalletRepositoryType walletRepository, PasswordStore passwordStore) { 22 | return new ImportWalletInteract(walletRepository, passwordStore); 23 | } 24 | } 25 | -------------------------------------------------------------------------------- /app/src/main/java/com/wallet/crypto/trustapp/di/SendModule.java: -------------------------------------------------------------------------------- 1 | package com.wallet.crypto.trustapp.di; 2 | 3 | import com.wallet.crypto.trustapp.router.ConfirmationRouter; 4 | import com.wallet.crypto.trustapp.viewmodel.SendViewModelFactory; 5 | 6 | import dagger.Module; 7 | import dagger.Provides; 8 | 9 | @Module 10 | class SendModule { 11 | @Provides 12 | SendViewModelFactory provideSendViewModelFactory(ConfirmationRouter confirmationRouter) { 13 | return new SendViewModelFactory(confirmationRouter); 14 | } 15 | 16 | @Provides 17 | ConfirmationRouter provideConfirmationRouter() { 18 | return new ConfirmationRouter(); 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /app/src/main/java/com/wallet/crypto/trustapp/di/SettingsFragmentModule.java: -------------------------------------------------------------------------------- 1 | package com.wallet.crypto.trustapp.di; 2 | 3 | import com.wallet.crypto.trustapp.interact.FindDefaultWalletInteract; 4 | import com.wallet.crypto.trustapp.repository.WalletRepositoryType; 5 | import com.wallet.crypto.trustapp.router.ManageWalletsRouter; 6 | 7 | import dagger.Module; 8 | import dagger.Provides; 9 | 10 | @Module 11 | class SettingsFragmentModule { 12 | @Provides 13 | FindDefaultWalletInteract provideFindDefaultWalletInteract(WalletRepositoryType walletRepository) { 14 | return new FindDefaultWalletInteract(walletRepository); 15 | } 16 | 17 | @Provides 18 | ManageWalletsRouter provideManageWalletsRouter() { 19 | return new ManageWalletsRouter(); 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /app/src/main/java/com/wallet/crypto/trustapp/di/SettingsModule.java: -------------------------------------------------------------------------------- 1 | package com.wallet.crypto.trustapp.di; 2 | 3 | import com.wallet.crypto.trustapp.ui.SettingsFragment; 4 | 5 | import dagger.Module; 6 | import dagger.android.ContributesAndroidInjector; 7 | 8 | @Module 9 | public interface SettingsModule { 10 | @FragmentScope 11 | @ContributesAndroidInjector(modules = {SettingsFragmentModule.class}) 12 | SettingsFragment settingsFragment(); 13 | } 14 | -------------------------------------------------------------------------------- /app/src/main/java/com/wallet/crypto/trustapp/di/SplashModule.java: -------------------------------------------------------------------------------- 1 | package com.wallet.crypto.trustapp.di; 2 | 3 | import com.wallet.crypto.trustapp.interact.FetchWalletsInteract; 4 | import com.wallet.crypto.trustapp.repository.WalletRepositoryType; 5 | import com.wallet.crypto.trustapp.viewmodel.SplashViewModelFactory; 6 | 7 | import dagger.Module; 8 | import dagger.Provides; 9 | 10 | @Module 11 | public class SplashModule { 12 | 13 | @Provides 14 | SplashViewModelFactory provideSplashViewModelFactory(FetchWalletsInteract fetchWalletsInteract) { 15 | return new SplashViewModelFactory(fetchWalletsInteract); 16 | } 17 | 18 | @Provides 19 | FetchWalletsInteract provideFetchWalletInteract(WalletRepositoryType walletRepository) { 20 | return new FetchWalletsInteract(walletRepository); 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /app/src/main/java/com/wallet/crypto/trustapp/di/TokensModule.java: -------------------------------------------------------------------------------- 1 | package com.wallet.crypto.trustapp.di; 2 | 3 | import com.wallet.crypto.trustapp.interact.FetchTokensInteract; 4 | import com.wallet.crypto.trustapp.interact.FindDefaultNetworkInteract; 5 | import com.wallet.crypto.trustapp.repository.EthereumNetworkRepositoryType; 6 | import com.wallet.crypto.trustapp.repository.TokenRepositoryType; 7 | import com.wallet.crypto.trustapp.router.AddTokenRouter; 8 | import com.wallet.crypto.trustapp.router.SendTokenRouter; 9 | import com.wallet.crypto.trustapp.router.TransactionsRouter; 10 | import com.wallet.crypto.trustapp.viewmodel.TokensViewModelFactory; 11 | 12 | import dagger.Module; 13 | import dagger.Provides; 14 | 15 | @Module 16 | class TokensModule { 17 | 18 | @Provides 19 | TokensViewModelFactory provideTokensViewModelFactory( 20 | FindDefaultNetworkInteract findDefaultNetworkInteract, 21 | FetchTokensInteract fetchTokensInteract, 22 | AddTokenRouter addTokenRouter, 23 | SendTokenRouter sendTokenRouter, 24 | TransactionsRouter transactionsRouter) { 25 | return new TokensViewModelFactory( 26 | findDefaultNetworkInteract, 27 | fetchTokensInteract, 28 | addTokenRouter, 29 | sendTokenRouter, 30 | transactionsRouter); 31 | } 32 | 33 | @Provides 34 | FindDefaultNetworkInteract provideFindDefaultNetworkInteract( 35 | EthereumNetworkRepositoryType networkRepository) { 36 | return new FindDefaultNetworkInteract(networkRepository); 37 | } 38 | 39 | @Provides 40 | FetchTokensInteract provideFetchTokensInteract(TokenRepositoryType tokenRepository) { 41 | return new FetchTokensInteract(tokenRepository); 42 | } 43 | 44 | @Provides 45 | AddTokenRouter provideAddTokenRouter() { 46 | return new AddTokenRouter(); 47 | } 48 | 49 | @Provides 50 | SendTokenRouter provideSendTokenRouter() { 51 | return new SendTokenRouter(); 52 | } 53 | 54 | @Provides 55 | TransactionsRouter provideTransactionsRouter() { 56 | return new TransactionsRouter(); 57 | } 58 | } 59 | -------------------------------------------------------------------------------- /app/src/main/java/com/wallet/crypto/trustapp/di/ToolsModule.java: -------------------------------------------------------------------------------- 1 | package com.wallet.crypto.trustapp.di; 2 | 3 | import android.content.Context; 4 | 5 | import com.google.gson.Gson; 6 | import com.wallet.crypto.trustapp.App; 7 | import com.wallet.crypto.trustapp.repository.PasswordStore; 8 | import com.wallet.crypto.trustapp.repository.TrustPasswordStore; 9 | import com.wallet.crypto.trustapp.util.LogInterceptor; 10 | 11 | import javax.inject.Singleton; 12 | 13 | import dagger.Module; 14 | import dagger.Provides; 15 | import okhttp3.OkHttpClient; 16 | 17 | @Module 18 | class ToolsModule { 19 | @Provides 20 | Context provideContext(App application) { 21 | return application.getApplicationContext(); 22 | } 23 | 24 | @Singleton 25 | @Provides 26 | Gson provideGson() { 27 | return new Gson(); 28 | } 29 | 30 | @Singleton 31 | @Provides 32 | OkHttpClient okHttpClient() { 33 | return new OkHttpClient.Builder() 34 | .addInterceptor(new LogInterceptor()) 35 | .build(); 36 | } 37 | 38 | @Singleton 39 | @Provides 40 | PasswordStore passwordStore(Context context) { 41 | return new TrustPasswordStore(context); 42 | } 43 | } 44 | -------------------------------------------------------------------------------- /app/src/main/java/com/wallet/crypto/trustapp/di/TransactionDetailModule.java: -------------------------------------------------------------------------------- 1 | package com.wallet.crypto.trustapp.di; 2 | 3 | import com.wallet.crypto.trustapp.interact.FindDefaultNetworkInteract; 4 | import com.wallet.crypto.trustapp.interact.FindDefaultWalletInteract; 5 | import com.wallet.crypto.trustapp.repository.EthereumNetworkRepositoryType; 6 | import com.wallet.crypto.trustapp.repository.WalletRepositoryType; 7 | import com.wallet.crypto.trustapp.router.ExternalBrowserRouter; 8 | import com.wallet.crypto.trustapp.viewmodel.TransactionDetailViewModelFactory; 9 | 10 | import dagger.Module; 11 | import dagger.Provides; 12 | 13 | @Module 14 | public class TransactionDetailModule { 15 | 16 | @Provides 17 | TransactionDetailViewModelFactory provideTransactionDetailViewModelFactory( 18 | FindDefaultNetworkInteract findDefaultNetworkInteract, 19 | FindDefaultWalletInteract findDefaultWalletInteract, 20 | ExternalBrowserRouter externalBrowserRouter) { 21 | return new TransactionDetailViewModelFactory( 22 | findDefaultNetworkInteract, findDefaultWalletInteract, externalBrowserRouter); 23 | } 24 | 25 | @Provides 26 | FindDefaultNetworkInteract provideFindDefaultNetworkInteract( 27 | EthereumNetworkRepositoryType ethereumNetworkRepository) { 28 | return new FindDefaultNetworkInteract(ethereumNetworkRepository); 29 | } 30 | 31 | @Provides 32 | ExternalBrowserRouter externalBrowserRouter() { 33 | return new ExternalBrowserRouter(); 34 | } 35 | 36 | @Provides 37 | FindDefaultWalletInteract findDefaultWalletInteract(WalletRepositoryType walletRepository) { 38 | return new FindDefaultWalletInteract(walletRepository); 39 | } 40 | } 41 | -------------------------------------------------------------------------------- /app/src/main/java/com/wallet/crypto/trustapp/entity/Address.java: -------------------------------------------------------------------------------- 1 | package com.wallet.crypto.trustapp.entity; 2 | 3 | import android.text.TextUtils; 4 | 5 | import java.util.regex.Pattern; 6 | 7 | public class Address { 8 | 9 | private static final Pattern ignoreCaseAddrPattern = Pattern.compile("(?i)^(0x)?[0-9a-f]{40}$"); 10 | private static final Pattern lowerCaseAddrPattern = Pattern.compile("^(0x)?[0-9a-f]{40}$"); 11 | private static final Pattern upperCaseAddrPattern = Pattern.compile("^(0x)?[0-9A-F]{40}$"); 12 | 13 | public final String value; 14 | 15 | public Address(String value) { 16 | this.value = value; 17 | } 18 | 19 | public static boolean isAddress(String address) { 20 | return !(TextUtils.isEmpty(address) || !ignoreCaseAddrPattern.matcher(address).find()) 21 | && (lowerCaseAddrPattern.matcher(address).find() || upperCaseAddrPattern.matcher(address).find()); 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /app/src/main/java/com/wallet/crypto/trustapp/entity/ApiErrorException.java: -------------------------------------------------------------------------------- 1 | package com.wallet.crypto.trustapp.entity; 2 | 3 | public class ApiErrorException extends Exception { 4 | private final ErrorEnvelope errorEnvelope; 5 | 6 | public ApiErrorException(ErrorEnvelope errorEnvelope) { 7 | super(errorEnvelope.message); 8 | 9 | this.errorEnvelope = errorEnvelope; 10 | } 11 | } 12 | -------------------------------------------------------------------------------- /app/src/main/java/com/wallet/crypto/trustapp/entity/ErrorEnvelope.java: -------------------------------------------------------------------------------- 1 | package com.wallet.crypto.trustapp.entity; 2 | 3 | import android.support.annotation.Nullable; 4 | 5 | import com.wallet.crypto.trustapp.C; 6 | 7 | public class ErrorEnvelope { 8 | public final int code; 9 | @Nullable 10 | public final String message; 11 | @Nullable 12 | private final Throwable throwable; 13 | 14 | public ErrorEnvelope(@Nullable String message) { 15 | this(C.ErrorCode.UNKNOWN, message); 16 | } 17 | 18 | public ErrorEnvelope(int code, @Nullable String message) { 19 | this(code, message, null); 20 | } 21 | 22 | public ErrorEnvelope(int code, @Nullable String message, @Nullable Throwable throwable) { 23 | this.code = code; 24 | this.message = message; 25 | this.throwable = throwable; 26 | } 27 | } 28 | -------------------------------------------------------------------------------- /app/src/main/java/com/wallet/crypto/trustapp/entity/GasSettings.java: -------------------------------------------------------------------------------- 1 | package com.wallet.crypto.trustapp.entity; 2 | 3 | 4 | import android.os.Parcel; 5 | import android.os.Parcelable; 6 | 7 | import java.math.BigInteger; 8 | 9 | public class GasSettings implements Parcelable { 10 | public final BigInteger gasPrice; 11 | public final BigInteger gasLimit; 12 | 13 | public GasSettings(BigInteger gasPrice, BigInteger gasLimit) { 14 | this.gasPrice = gasPrice; 15 | this.gasLimit = gasLimit; 16 | } 17 | 18 | private GasSettings(Parcel in) { 19 | gasPrice = new BigInteger(in.readString()); 20 | gasLimit = new BigInteger(in.readString()); 21 | } 22 | 23 | public static final Creator CREATOR = new Creator() { 24 | @Override 25 | public GasSettings createFromParcel(Parcel in) { 26 | return new GasSettings(in); 27 | } 28 | 29 | @Override 30 | public GasSettings[] newArray(int size) { 31 | return new GasSettings[size]; 32 | } 33 | }; 34 | 35 | @Override 36 | public int describeContents() { 37 | return 0; 38 | } 39 | 40 | @Override 41 | public void writeToParcel(Parcel parcel, int i) { 42 | parcel.writeString(gasPrice.toString(10)); 43 | parcel.writeString(gasLimit.toString(10)); 44 | } 45 | } 46 | -------------------------------------------------------------------------------- /app/src/main/java/com/wallet/crypto/trustapp/entity/NetworkInfo.java: -------------------------------------------------------------------------------- 1 | package com.wallet.crypto.trustapp.entity; 2 | 3 | public class NetworkInfo { 4 | public final String name; 5 | public final String symbol; 6 | public final String rpcServerUrl; 7 | public final String backendUrl; 8 | public final String etherscanUrl; 9 | public final int chainId; 10 | public final boolean isMainNetwork; 11 | 12 | public NetworkInfo( 13 | String name, 14 | String symbol, 15 | String rpcServerUrl, 16 | String backendUrl, 17 | String etherscanUrl, 18 | int chainId, 19 | boolean isMainNetwork) { 20 | this.name = name; 21 | this.symbol = symbol; 22 | this.rpcServerUrl = rpcServerUrl; 23 | this.backendUrl = backendUrl; 24 | this.etherscanUrl = etherscanUrl; 25 | this.chainId = chainId; 26 | this.isMainNetwork = isMainNetwork; 27 | } 28 | } 29 | -------------------------------------------------------------------------------- /app/src/main/java/com/wallet/crypto/trustapp/entity/ServiceErrorException.java: -------------------------------------------------------------------------------- 1 | package com.wallet.crypto.trustapp.entity; 2 | 3 | import android.support.annotation.Nullable; 4 | 5 | public class ServiceErrorException extends Exception { 6 | 7 | public static final int UNKNOWN_ERROR = -1; 8 | public static final int INVALID_DATA = 1; 9 | public static final int KEY_STORE_ERROR = 1001; 10 | public static final int FAIL_TO_SAVE_IV_FILE = 1002; 11 | public static final int KEY_STORE_SECRET = 1003; 12 | public static final int USER_NOT_AUTHENTICATED = 1004; 13 | public static final int KEY_IS_GONE = 1005; 14 | public static final int IV_OR_ALIAS_NO_ON_DISK = 1006; 15 | public static final int INVALID_KEY = 1007; 16 | 17 | public final int code; 18 | 19 | public ServiceErrorException(int code, @Nullable String message, Throwable throwable) { 20 | super(message, throwable); 21 | this.code = code; 22 | } 23 | 24 | public ServiceErrorException(int code, @Nullable String message) { 25 | this(code, message, null); 26 | } 27 | 28 | public ServiceErrorException(int code) { 29 | this(code, null); 30 | } 31 | } 32 | -------------------------------------------------------------------------------- /app/src/main/java/com/wallet/crypto/trustapp/entity/ServiceException.java: -------------------------------------------------------------------------------- 1 | package com.wallet.crypto.trustapp.entity; 2 | 3 | public class ServiceException extends Exception { 4 | public final ErrorEnvelope error; 5 | 6 | public ServiceException(String message) { 7 | super(message); 8 | 9 | error = new ErrorEnvelope(message); 10 | } 11 | } 12 | -------------------------------------------------------------------------------- /app/src/main/java/com/wallet/crypto/trustapp/entity/Ticker.java: -------------------------------------------------------------------------------- 1 | package com.wallet.crypto.trustapp.entity; 2 | 3 | import com.google.gson.annotations.SerializedName; 4 | 5 | public class Ticker { 6 | public String id; 7 | public String name; 8 | public String symbol; 9 | public String price; 10 | @SerializedName("percent_change_24h") 11 | public String percentChange24h; 12 | } 13 | -------------------------------------------------------------------------------- /app/src/main/java/com/wallet/crypto/trustapp/entity/Token.java: -------------------------------------------------------------------------------- 1 | package com.wallet.crypto.trustapp.entity; 2 | 3 | import android.os.Parcel; 4 | import android.os.Parcelable; 5 | 6 | import java.math.BigDecimal; 7 | import java.math.BigInteger; 8 | 9 | public class Token implements Parcelable { 10 | public final TokenInfo tokenInfo; 11 | public final BigDecimal balance; 12 | 13 | public Token(TokenInfo tokenInfo, BigDecimal balance) { 14 | this.tokenInfo = tokenInfo; 15 | this.balance = balance; 16 | } 17 | 18 | private Token(Parcel in) { 19 | tokenInfo = in.readParcelable(TokenInfo.class.getClassLoader()); 20 | balance = new BigDecimal(in.readString()); 21 | } 22 | 23 | public static final Creator CREATOR = new Creator() { 24 | @Override 25 | public Token createFromParcel(Parcel in) { 26 | return new Token(in); 27 | } 28 | 29 | @Override 30 | public Token[] newArray(int size) { 31 | return new Token[size]; 32 | } 33 | }; 34 | 35 | @Override 36 | public int describeContents() { 37 | return 0; 38 | } 39 | 40 | @Override 41 | public void writeToParcel(Parcel dest, int flags) { 42 | dest.writeParcelable(tokenInfo, flags); 43 | dest.writeString(balance.toString()); 44 | } 45 | } 46 | -------------------------------------------------------------------------------- /app/src/main/java/com/wallet/crypto/trustapp/entity/TokenInfo.java: -------------------------------------------------------------------------------- 1 | package com.wallet.crypto.trustapp.entity; 2 | 3 | import android.os.Parcel; 4 | import android.os.Parcelable; 5 | 6 | public class TokenInfo implements Parcelable { 7 | public final String address; 8 | public final String name; 9 | public final String symbol; 10 | public final int decimals; 11 | 12 | public TokenInfo(String address, String name, String symbol, int decimals) { 13 | this.address = address; 14 | this.name = name; 15 | this.symbol = symbol; 16 | this.decimals = decimals; 17 | } 18 | 19 | private TokenInfo(Parcel in) { 20 | address = in.readString(); 21 | name = in.readString(); 22 | symbol = in.readString(); 23 | decimals = in.readInt(); 24 | } 25 | 26 | public static final Creator CREATOR = new Creator() { 27 | @Override 28 | public TokenInfo createFromParcel(Parcel in) { 29 | return new TokenInfo(in); 30 | } 31 | 32 | @Override 33 | public TokenInfo[] newArray(int size) { 34 | return new TokenInfo[size]; 35 | } 36 | }; 37 | 38 | @Override 39 | public int describeContents() { 40 | return 0; 41 | } 42 | 43 | @Override 44 | public void writeToParcel(Parcel dest, int flags) { 45 | dest.writeString(address); 46 | dest.writeString(name); 47 | dest.writeString(symbol); 48 | dest.writeInt(decimals); 49 | } 50 | } 51 | -------------------------------------------------------------------------------- /app/src/main/java/com/wallet/crypto/trustapp/entity/TransactionContract.java: -------------------------------------------------------------------------------- 1 | package com.wallet.crypto.trustapp.entity; 2 | 3 | import android.os.Parcel; 4 | import android.os.Parcelable; 5 | 6 | public class TransactionContract implements Parcelable { 7 | public String address; 8 | public String name; 9 | public String totalSupply; 10 | public long decimals; 11 | public String symbol; 12 | 13 | protected TransactionContract(Parcel in) { 14 | address = in.readString(); 15 | name = in.readString(); 16 | totalSupply = in.readString(); 17 | decimals = in.readLong(); 18 | symbol = in.readString(); 19 | } 20 | 21 | public static final Creator CREATOR = new Creator() { 22 | @Override 23 | public TransactionContract createFromParcel(Parcel in) { 24 | return new TransactionContract(in); 25 | } 26 | 27 | @Override 28 | public TransactionContract[] newArray(int size) { 29 | return new TransactionContract[size]; 30 | } 31 | }; 32 | 33 | @Override 34 | public int describeContents() { 35 | return 0; 36 | } 37 | 38 | @Override 39 | public void writeToParcel(Parcel parcel, int i) { 40 | parcel.writeString(address); 41 | parcel.writeString(name); 42 | parcel.writeString(totalSupply); 43 | parcel.writeLong(decimals); 44 | parcel.writeString(symbol); 45 | } 46 | } 47 | -------------------------------------------------------------------------------- /app/src/main/java/com/wallet/crypto/trustapp/entity/TransactionOperation.java: -------------------------------------------------------------------------------- 1 | package com.wallet.crypto.trustapp.entity; 2 | 3 | import android.os.Parcel; 4 | import android.os.Parcelable; 5 | 6 | public class TransactionOperation implements Parcelable { 7 | public String transactionId; 8 | public String viewType; 9 | public String from; 10 | public String to; 11 | public String value; 12 | public TransactionContract contract; 13 | 14 | public TransactionOperation() { 15 | 16 | } 17 | 18 | private TransactionOperation(Parcel in) { 19 | transactionId = in.readString(); 20 | viewType = in.readString(); 21 | from = in.readString(); 22 | to = in.readString(); 23 | value = in.readString(); 24 | contract = in.readParcelable(TransactionContract.class.getClassLoader()); 25 | } 26 | 27 | public static final Creator CREATOR = new Creator() { 28 | @Override 29 | public TransactionOperation createFromParcel(Parcel in) { 30 | return new TransactionOperation(in); 31 | } 32 | 33 | @Override 34 | public TransactionOperation[] newArray(int size) { 35 | return new TransactionOperation[size]; 36 | } 37 | }; 38 | 39 | @Override 40 | public int describeContents() { 41 | return 0; 42 | } 43 | 44 | @Override 45 | public void writeToParcel(Parcel parcel, int flags) { 46 | parcel.writeString(transactionId); 47 | parcel.writeString(viewType); 48 | parcel.writeString(from); 49 | parcel.writeString(to); 50 | parcel.writeString(value); 51 | parcel.writeParcelable(contract, flags); 52 | } 53 | } 54 | -------------------------------------------------------------------------------- /app/src/main/java/com/wallet/crypto/trustapp/entity/Wallet.java: -------------------------------------------------------------------------------- 1 | package com.wallet.crypto.trustapp.entity; 2 | 3 | import android.os.Parcel; 4 | import android.os.Parcelable; 5 | 6 | public class Wallet implements Parcelable { 7 | public final String address; 8 | 9 | public Wallet(String address) { 10 | this.address = address; 11 | } 12 | 13 | private Wallet(Parcel in) { 14 | address = in.readString(); 15 | } 16 | 17 | public static final Creator CREATOR = new Creator() { 18 | @Override 19 | public Wallet createFromParcel(Parcel in) { 20 | return new Wallet(in); 21 | } 22 | 23 | @Override 24 | public Wallet[] newArray(int size) { 25 | return new Wallet[size]; 26 | } 27 | }; 28 | 29 | public boolean sameAddress(String address) { 30 | return this.address.equals(address); 31 | } 32 | 33 | @Override 34 | public int describeContents() { 35 | return 0; 36 | } 37 | 38 | @Override 39 | public void writeToParcel(Parcel parcel, int i) { 40 | parcel.writeString(address); 41 | } 42 | } 43 | -------------------------------------------------------------------------------- /app/src/main/java/com/wallet/crypto/trustapp/interact/AddTokenInteract.java: -------------------------------------------------------------------------------- 1 | package com.wallet.crypto.trustapp.interact; 2 | 3 | import com.wallet.crypto.trustapp.repository.TokenRepositoryType; 4 | import com.wallet.crypto.trustapp.repository.WalletRepositoryType; 5 | 6 | import io.reactivex.Completable; 7 | import io.reactivex.android.schedulers.AndroidSchedulers; 8 | 9 | public class AddTokenInteract { 10 | private final TokenRepositoryType tokenRepository; 11 | private final WalletRepositoryType walletRepository; 12 | 13 | public AddTokenInteract( 14 | WalletRepositoryType walletRepository, TokenRepositoryType tokenRepository) { 15 | this.walletRepository = walletRepository; 16 | this.tokenRepository = tokenRepository; 17 | } 18 | 19 | public Completable add(String address, String symbol, int decimals) { 20 | return walletRepository 21 | .getDefaultWallet() 22 | .flatMapCompletable(wallet -> tokenRepository 23 | .addToken(wallet, address, symbol, decimals) 24 | .observeOn(AndroidSchedulers.mainThread())); 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /app/src/main/java/com/wallet/crypto/trustapp/interact/CreateTransactionInteract.java: -------------------------------------------------------------------------------- 1 | package com.wallet.crypto.trustapp.interact; 2 | 3 | 4 | import com.wallet.crypto.trustapp.entity.Wallet; 5 | import com.wallet.crypto.trustapp.repository.PasswordStore; 6 | import com.wallet.crypto.trustapp.repository.TokenRepository; 7 | import com.wallet.crypto.trustapp.repository.TransactionRepositoryType; 8 | 9 | import java.math.BigInteger; 10 | 11 | import io.reactivex.Single; 12 | import io.reactivex.android.schedulers.AndroidSchedulers; 13 | 14 | public class CreateTransactionInteract { 15 | private final TransactionRepositoryType transactionRepository; 16 | private final PasswordStore passwordStore; 17 | 18 | public CreateTransactionInteract(TransactionRepositoryType transactionRepository, PasswordStore passwordStore) { 19 | this.transactionRepository = transactionRepository; 20 | this.passwordStore = passwordStore; 21 | } 22 | 23 | public Single create(Wallet from, String to, BigInteger subunitAmount, BigInteger gasPrice, BigInteger gasLimit, byte[] data) { 24 | return passwordStore.getPassword(from) 25 | .flatMap(password -> 26 | transactionRepository.createTransaction(from, to, subunitAmount, gasPrice, gasLimit, data, password) 27 | .observeOn(AndroidSchedulers.mainThread())); 28 | } 29 | 30 | } 31 | -------------------------------------------------------------------------------- /app/src/main/java/com/wallet/crypto/trustapp/interact/CreateTransactionInteractType.java: -------------------------------------------------------------------------------- 1 | package com.wallet.crypto.trustapp.interact; 2 | 3 | 4 | import com.wallet.crypto.trustapp.entity.Wallet; 5 | 6 | import java.math.BigInteger; 7 | 8 | import io.reactivex.Single; 9 | 10 | public interface CreateTransactionInteractType { 11 | 12 | public Single create(Wallet from, String to, String wei, BigInteger gasPrice, BigInteger gasLimit, String password); 13 | } 14 | -------------------------------------------------------------------------------- /app/src/main/java/com/wallet/crypto/trustapp/interact/CreateWalletInteract.java: -------------------------------------------------------------------------------- 1 | package com.wallet.crypto.trustapp.interact; 2 | 3 | import com.wallet.crypto.trustapp.entity.Wallet; 4 | import com.wallet.crypto.trustapp.interact.rx.operator.Operators; 5 | import com.wallet.crypto.trustapp.repository.PasswordStore; 6 | import com.wallet.crypto.trustapp.repository.WalletRepositoryType; 7 | 8 | import io.reactivex.Single; 9 | 10 | import static com.wallet.crypto.trustapp.interact.rx.operator.Operators.completableErrorProxy; 11 | 12 | public class CreateWalletInteract { 13 | 14 | private final WalletRepositoryType walletRepository; 15 | private final PasswordStore passwordStore; 16 | 17 | public CreateWalletInteract(WalletRepositoryType walletRepository, PasswordStore passwordStore) { 18 | this.walletRepository = walletRepository; 19 | this.passwordStore = passwordStore; 20 | } 21 | 22 | public Single create() { 23 | return passwordStore.generatePassword() 24 | .flatMap(masterPassword -> walletRepository 25 | .createWallet(masterPassword) 26 | .compose(Operators.savePassword(passwordStore, walletRepository, masterPassword)) 27 | .flatMap(wallet -> passwordVerification(wallet, masterPassword))); 28 | } 29 | 30 | private Single passwordVerification(Wallet wallet, String masterPassword) { 31 | return passwordStore 32 | .getPassword(wallet) 33 | .flatMap(password -> walletRepository 34 | .exportWallet(wallet, password, password) 35 | .flatMap(keyStore -> walletRepository.findWallet(wallet.address))) 36 | .onErrorResumeNext(throwable -> walletRepository 37 | .deleteWallet(wallet.address, masterPassword) 38 | .lift(completableErrorProxy(throwable)) 39 | .toSingle(() -> wallet)); 40 | } 41 | } 42 | -------------------------------------------------------------------------------- /app/src/main/java/com/wallet/crypto/trustapp/interact/DeleteWalletInteract.java: -------------------------------------------------------------------------------- 1 | package com.wallet.crypto.trustapp.interact; 2 | 3 | import com.wallet.crypto.trustapp.entity.Wallet; 4 | import com.wallet.crypto.trustapp.repository.PasswordStore; 5 | import com.wallet.crypto.trustapp.repository.WalletRepositoryType; 6 | 7 | import io.reactivex.Single; 8 | import io.reactivex.android.schedulers.AndroidSchedulers; 9 | 10 | /** 11 | * Delete and fetch wallets 12 | */ 13 | public class DeleteWalletInteract { 14 | private final WalletRepositoryType walletRepository; 15 | private final PasswordStore passwordStore; 16 | 17 | public DeleteWalletInteract(WalletRepositoryType walletRepository, PasswordStore passwordStore) { 18 | this.walletRepository = walletRepository; 19 | this.passwordStore = passwordStore; 20 | } 21 | 22 | public Single delete(Wallet wallet) { 23 | return passwordStore.getPassword(wallet) 24 | .flatMapCompletable(password -> walletRepository.deleteWallet(wallet.address, password)) 25 | .andThen(walletRepository.fetchWallets()) 26 | .observeOn(AndroidSchedulers.mainThread()); 27 | } 28 | } 29 | -------------------------------------------------------------------------------- /app/src/main/java/com/wallet/crypto/trustapp/interact/ExportWalletInteract.java: -------------------------------------------------------------------------------- 1 | package com.wallet.crypto.trustapp.interact; 2 | 3 | import com.wallet.crypto.trustapp.entity.Wallet; 4 | import com.wallet.crypto.trustapp.repository.PasswordStore; 5 | import com.wallet.crypto.trustapp.repository.WalletRepositoryType; 6 | 7 | import io.reactivex.Single; 8 | import io.reactivex.android.schedulers.AndroidSchedulers; 9 | 10 | public class ExportWalletInteract { 11 | 12 | private final WalletRepositoryType walletRepository; 13 | private final PasswordStore passwordStore; 14 | 15 | public ExportWalletInteract(WalletRepositoryType walletRepository, PasswordStore passwordStore) { 16 | this.walletRepository = walletRepository; 17 | this.passwordStore = passwordStore; 18 | } 19 | 20 | public Single export(Wallet wallet, String backupPassword) { 21 | return passwordStore 22 | .getPassword(wallet) 23 | .flatMap(password -> walletRepository 24 | .exportWallet(wallet, password, backupPassword)) 25 | .observeOn(AndroidSchedulers.mainThread()); 26 | } 27 | } 28 | -------------------------------------------------------------------------------- /app/src/main/java/com/wallet/crypto/trustapp/interact/FetchGasSettingsInteract.java: -------------------------------------------------------------------------------- 1 | package com.wallet.crypto.trustapp.interact; 2 | 3 | 4 | import com.wallet.crypto.trustapp.entity.GasSettings; 5 | import com.wallet.crypto.trustapp.repository.PreferenceRepositoryType; 6 | 7 | public class FetchGasSettingsInteract { 8 | private final PreferenceRepositoryType repository; 9 | 10 | public FetchGasSettingsInteract(PreferenceRepositoryType repository) { 11 | this.repository = repository; 12 | } 13 | 14 | public GasSettings fetch(boolean forTokenTransfer) { 15 | return repository.getGasSettings(forTokenTransfer); 16 | } 17 | 18 | } 19 | -------------------------------------------------------------------------------- /app/src/main/java/com/wallet/crypto/trustapp/interact/FetchTokensInteract.java: -------------------------------------------------------------------------------- 1 | package com.wallet.crypto.trustapp.interact; 2 | 3 | import com.wallet.crypto.trustapp.entity.Token; 4 | import com.wallet.crypto.trustapp.entity.Wallet; 5 | import com.wallet.crypto.trustapp.repository.TokenRepositoryType; 6 | 7 | import io.reactivex.Observable; 8 | import io.reactivex.Single; 9 | import io.reactivex.android.schedulers.AndroidSchedulers; 10 | import io.reactivex.schedulers.Schedulers; 11 | 12 | public class FetchTokensInteract { 13 | 14 | private final TokenRepositoryType tokenRepository; 15 | 16 | public FetchTokensInteract(TokenRepositoryType tokenRepository) { 17 | this.tokenRepository = tokenRepository; 18 | } 19 | 20 | public Observable fetch(Wallet wallet) { 21 | return tokenRepository.fetch(wallet.address) 22 | .subscribeOn(Schedulers.io()) 23 | .observeOn(AndroidSchedulers.mainThread()); 24 | } 25 | } 26 | -------------------------------------------------------------------------------- /app/src/main/java/com/wallet/crypto/trustapp/interact/FetchTransactionsInteract.java: -------------------------------------------------------------------------------- 1 | package com.wallet.crypto.trustapp.interact; 2 | 3 | import com.wallet.crypto.trustapp.entity.Transaction; 4 | import com.wallet.crypto.trustapp.entity.Wallet; 5 | import com.wallet.crypto.trustapp.repository.TransactionRepositoryType; 6 | 7 | import io.reactivex.Observable; 8 | import io.reactivex.android.schedulers.AndroidSchedulers; 9 | 10 | public class FetchTransactionsInteract { 11 | 12 | private final TransactionRepositoryType transactionRepository; 13 | 14 | public FetchTransactionsInteract(TransactionRepositoryType transactionRepository) { 15 | this.transactionRepository = transactionRepository; 16 | } 17 | 18 | public Observable fetch(Wallet wallet) { 19 | return transactionRepository 20 | .fetchTransaction(wallet) 21 | .observeOn(AndroidSchedulers.mainThread()); 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /app/src/main/java/com/wallet/crypto/trustapp/interact/FetchWalletsInteract.java: -------------------------------------------------------------------------------- 1 | package com.wallet.crypto.trustapp.interact; 2 | 3 | import com.wallet.crypto.trustapp.entity.Wallet; 4 | import com.wallet.crypto.trustapp.repository.WalletRepositoryType; 5 | 6 | import io.reactivex.Single; 7 | import io.reactivex.android.schedulers.AndroidSchedulers; 8 | 9 | public class FetchWalletsInteract { 10 | 11 | private final WalletRepositoryType accountRepository; 12 | 13 | public FetchWalletsInteract(WalletRepositoryType accountRepository) { 14 | this.accountRepository = accountRepository; 15 | } 16 | 17 | public Single fetch() { 18 | return accountRepository 19 | .fetchWallets() 20 | .observeOn(AndroidSchedulers.mainThread()); 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /app/src/main/java/com/wallet/crypto/trustapp/interact/FindDefaultNetworkInteract.java: -------------------------------------------------------------------------------- 1 | package com.wallet.crypto.trustapp.interact; 2 | 3 | import com.wallet.crypto.trustapp.entity.NetworkInfo; 4 | import com.wallet.crypto.trustapp.repository.EthereumNetworkRepositoryType; 5 | 6 | import io.reactivex.Single; 7 | import io.reactivex.android.schedulers.AndroidSchedulers; 8 | 9 | public class FindDefaultNetworkInteract { 10 | 11 | private final EthereumNetworkRepositoryType ethereumNetworkRepository; 12 | 13 | public FindDefaultNetworkInteract(EthereumNetworkRepositoryType ethereumNetworkRepository) { 14 | this.ethereumNetworkRepository = ethereumNetworkRepository; 15 | } 16 | 17 | public Single find() { 18 | return Single.just(ethereumNetworkRepository.getDefaultNetwork()) 19 | .observeOn(AndroidSchedulers.mainThread()); 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /app/src/main/java/com/wallet/crypto/trustapp/interact/FindDefaultWalletInteract.java: -------------------------------------------------------------------------------- 1 | package com.wallet.crypto.trustapp.interact; 2 | 3 | import com.wallet.crypto.trustapp.entity.Wallet; 4 | import com.wallet.crypto.trustapp.repository.WalletRepositoryType; 5 | 6 | import io.reactivex.Flowable; 7 | import io.reactivex.Single; 8 | import io.reactivex.android.schedulers.AndroidSchedulers; 9 | 10 | public class FindDefaultWalletInteract { 11 | 12 | private final WalletRepositoryType walletRepository; 13 | 14 | public FindDefaultWalletInteract(WalletRepositoryType walletRepository) { 15 | this.walletRepository = walletRepository; 16 | } 17 | 18 | public Single find() { 19 | return walletRepository 20 | .getDefaultWallet() 21 | .onErrorResumeNext(walletRepository 22 | .fetchWallets() 23 | .to(single -> Flowable.fromArray(single.blockingGet())) 24 | .firstOrError() 25 | .flatMapCompletable(walletRepository::setDefaultWallet) 26 | .andThen(walletRepository.getDefaultWallet())) 27 | .observeOn(AndroidSchedulers.mainThread()); 28 | } 29 | } 30 | -------------------------------------------------------------------------------- /app/src/main/java/com/wallet/crypto/trustapp/interact/ImportWalletInteract.java: -------------------------------------------------------------------------------- 1 | package com.wallet.crypto.trustapp.interact; 2 | 3 | import com.wallet.crypto.trustapp.entity.Wallet; 4 | import com.wallet.crypto.trustapp.interact.rx.operator.Operators; 5 | import com.wallet.crypto.trustapp.repository.PasswordStore; 6 | import com.wallet.crypto.trustapp.repository.WalletRepositoryType; 7 | 8 | import io.reactivex.Single; 9 | import io.reactivex.android.schedulers.AndroidSchedulers; 10 | 11 | public class ImportWalletInteract { 12 | 13 | private final WalletRepositoryType walletRepository; 14 | private final PasswordStore passwordStore; 15 | 16 | public ImportWalletInteract(WalletRepositoryType walletRepository, PasswordStore passwordStore) { 17 | this.walletRepository = walletRepository; 18 | this.passwordStore = passwordStore; 19 | } 20 | 21 | public Single importKeystore(String keystore, String password) { 22 | return passwordStore 23 | .generatePassword() 24 | .flatMap(newPassword -> walletRepository 25 | .importKeystoreToWallet(keystore, password, newPassword) 26 | .compose(Operators.savePassword(passwordStore, walletRepository, newPassword))) 27 | .observeOn(AndroidSchedulers.mainThread()); 28 | } 29 | 30 | public Single importPrivateKey(String privateKey) { 31 | return passwordStore 32 | .generatePassword() 33 | .flatMap(newPassword -> walletRepository 34 | .importPrivateKeyToWallet(privateKey, newPassword) 35 | .compose(Operators.savePassword(passwordStore, walletRepository, newPassword))) 36 | .observeOn(AndroidSchedulers.mainThread()); 37 | } 38 | } 39 | -------------------------------------------------------------------------------- /app/src/main/java/com/wallet/crypto/trustapp/interact/SetDefaultWalletInteract.java: -------------------------------------------------------------------------------- 1 | package com.wallet.crypto.trustapp.interact; 2 | 3 | import com.wallet.crypto.trustapp.entity.Wallet; 4 | import com.wallet.crypto.trustapp.repository.WalletRepositoryType; 5 | 6 | import io.reactivex.Completable; 7 | import io.reactivex.android.schedulers.AndroidSchedulers; 8 | 9 | public class SetDefaultWalletInteract { 10 | 11 | private WalletRepositoryType accountRepository; 12 | 13 | public SetDefaultWalletInteract(WalletRepositoryType walletRepositoryType) { 14 | this.accountRepository = walletRepositoryType; 15 | } 16 | 17 | public Completable set(Wallet wallet) { 18 | return accountRepository 19 | .setDefaultWallet(wallet) 20 | .observeOn(AndroidSchedulers.mainThread()); 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /app/src/main/java/com/wallet/crypto/trustapp/interact/rx/operator/CompletableErrorProxyOperator.java: -------------------------------------------------------------------------------- 1 | package com.wallet.crypto.trustapp.interact.rx.operator; 2 | 3 | import io.reactivex.CompletableObserver; 4 | import io.reactivex.CompletableOperator; 5 | import io.reactivex.observers.DisposableCompletableObserver; 6 | 7 | public class CompletableErrorProxyOperator implements CompletableOperator { 8 | 9 | private final Throwable throwable; 10 | 11 | CompletableErrorProxyOperator(Throwable throwable) { 12 | this.throwable = throwable; 13 | } 14 | 15 | @Override 16 | public CompletableObserver apply(CompletableObserver observer) throws Exception { 17 | return new DisposableCompletableObserver() { 18 | @Override 19 | public void onComplete() { 20 | if (!isDisposed()) { 21 | observer.onError(throwable); 22 | } 23 | } 24 | 25 | @Override 26 | public void onError(Throwable ex) { 27 | if (!isDisposed()) { 28 | observer.onError(ex); 29 | } 30 | } 31 | }; 32 | } 33 | } -------------------------------------------------------------------------------- /app/src/main/java/com/wallet/crypto/trustapp/interact/rx/operator/Operators.java: -------------------------------------------------------------------------------- 1 | package com.wallet.crypto.trustapp.interact.rx.operator; 2 | 3 | import com.wallet.crypto.trustapp.entity.Wallet; 4 | import com.wallet.crypto.trustapp.repository.PasswordStore; 5 | import com.wallet.crypto.trustapp.repository.WalletRepositoryType; 6 | 7 | import io.reactivex.CompletableOperator; 8 | import io.reactivex.SingleTransformer; 9 | 10 | public class Operators { 11 | 12 | public static SingleTransformer savePassword( 13 | PasswordStore passwordStore, WalletRepositoryType walletRepository, String password) { 14 | return new SavePasswordOperator(passwordStore, walletRepository, password); 15 | } 16 | 17 | public static CompletableOperator completableErrorProxy(Throwable throwable) { 18 | return new CompletableErrorProxyOperator(throwable); 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /app/src/main/java/com/wallet/crypto/trustapp/interact/rx/operator/SavePasswordOperator.java: -------------------------------------------------------------------------------- 1 | package com.wallet.crypto.trustapp.interact.rx.operator; 2 | 3 | import com.wallet.crypto.trustapp.entity.Wallet; 4 | import com.wallet.crypto.trustapp.repository.PasswordStore; 5 | import com.wallet.crypto.trustapp.repository.WalletRepositoryType; 6 | 7 | import io.reactivex.Single; 8 | import io.reactivex.SingleSource; 9 | import io.reactivex.SingleTransformer; 10 | import io.reactivex.observers.DisposableCompletableObserver; 11 | 12 | public class SavePasswordOperator implements SingleTransformer { 13 | 14 | private final PasswordStore passwordStore; 15 | private final String password; 16 | private final WalletRepositoryType walletRepository; 17 | 18 | public SavePasswordOperator( 19 | PasswordStore passwordStore, WalletRepositoryType walletRepository, String password) { 20 | this.passwordStore = passwordStore; 21 | this.password = password; 22 | this.walletRepository = walletRepository; 23 | } 24 | 25 | @Override 26 | public SingleSource apply(Single upstream) { 27 | Wallet wallet = upstream.blockingGet(); 28 | return passwordStore 29 | .setPassword(wallet, password) 30 | .onErrorResumeNext(err -> walletRepository.deleteWallet(wallet.address, password) 31 | .lift(observer -> new DisposableCompletableObserver() { 32 | @Override 33 | public void onComplete() { 34 | observer.onError(err); 35 | } 36 | 37 | @Override 38 | public void onError(Throwable e) { 39 | observer.onError(e); 40 | } 41 | })) 42 | .toSingle(() -> wallet); 43 | } 44 | } 45 | -------------------------------------------------------------------------------- /app/src/main/java/com/wallet/crypto/trustapp/repository/EthereumNetworkRepositoryType.java: -------------------------------------------------------------------------------- 1 | package com.wallet.crypto.trustapp.repository; 2 | 3 | import com.wallet.crypto.trustapp.entity.NetworkInfo; 4 | import com.wallet.crypto.trustapp.entity.Ticker; 5 | 6 | import io.reactivex.Single; 7 | 8 | public interface EthereumNetworkRepositoryType { 9 | 10 | NetworkInfo getDefaultNetwork(); 11 | 12 | void setDefaultNetworkInfo(NetworkInfo networkInfo); 13 | 14 | NetworkInfo[] getAvailableNetworkList(); 15 | 16 | void addOnChangeDefaultNetwork(OnNetworkChangeListener onNetworkChanged); 17 | 18 | Single getTicker(); 19 | } 20 | -------------------------------------------------------------------------------- /app/src/main/java/com/wallet/crypto/trustapp/repository/OnNetworkChangeListener.java: -------------------------------------------------------------------------------- 1 | package com.wallet.crypto.trustapp.repository; 2 | 3 | import com.wallet.crypto.trustapp.entity.NetworkInfo; 4 | 5 | public interface OnNetworkChangeListener { 6 | void onNetworkChanged(NetworkInfo networkInfo); 7 | } 8 | -------------------------------------------------------------------------------- /app/src/main/java/com/wallet/crypto/trustapp/repository/PasswordStore.java: -------------------------------------------------------------------------------- 1 | package com.wallet.crypto.trustapp.repository; 2 | 3 | import com.wallet.crypto.trustapp.entity.Wallet; 4 | 5 | import io.reactivex.Completable; 6 | import io.reactivex.Single; 7 | 8 | public interface PasswordStore { 9 | Single getPassword(Wallet wallet); 10 | Completable setPassword(Wallet wallet, String password); 11 | Single generatePassword(); 12 | } 13 | -------------------------------------------------------------------------------- /app/src/main/java/com/wallet/crypto/trustapp/repository/PreferenceRepositoryType.java: -------------------------------------------------------------------------------- 1 | package com.wallet.crypto.trustapp.repository; 2 | 3 | import com.wallet.crypto.trustapp.entity.GasSettings; 4 | 5 | public interface PreferenceRepositoryType { 6 | String getCurrentWalletAddress(); 7 | void setCurrentWalletAddress(String address); 8 | 9 | String getDefaultNetwork(); 10 | void setDefaultNetwork(String netName); 11 | 12 | GasSettings getGasSettings(boolean forTokenTransfer); 13 | void setGasSettings(GasSettings gasPrice); 14 | 15 | } 16 | -------------------------------------------------------------------------------- /app/src/main/java/com/wallet/crypto/trustapp/repository/TokenLocalSource.java: -------------------------------------------------------------------------------- 1 | package com.wallet.crypto.trustapp.repository; 2 | 3 | import com.wallet.crypto.trustapp.entity.NetworkInfo; 4 | import com.wallet.crypto.trustapp.entity.TokenInfo; 5 | import com.wallet.crypto.trustapp.entity.Wallet; 6 | 7 | import io.reactivex.Completable; 8 | import io.reactivex.Single; 9 | 10 | public interface TokenLocalSource { 11 | Completable put(NetworkInfo networkInfo, Wallet wallet, TokenInfo tokenInfo); 12 | Single fetch(NetworkInfo networkInfo, Wallet wallet); 13 | } 14 | -------------------------------------------------------------------------------- /app/src/main/java/com/wallet/crypto/trustapp/repository/TokenRepositoryType.java: -------------------------------------------------------------------------------- 1 | package com.wallet.crypto.trustapp.repository; 2 | 3 | import com.wallet.crypto.trustapp.entity.Token; 4 | import com.wallet.crypto.trustapp.entity.Wallet; 5 | 6 | import io.reactivex.Completable; 7 | import io.reactivex.Observable; 8 | 9 | public interface TokenRepositoryType { 10 | 11 | Observable fetch(String walletAddress); 12 | 13 | Completable addToken(Wallet wallet, String address, String symbol, int decimals); 14 | } 15 | -------------------------------------------------------------------------------- /app/src/main/java/com/wallet/crypto/trustapp/repository/TransactionInDiskSource.java: -------------------------------------------------------------------------------- 1 | package com.wallet.crypto.trustapp.repository; 2 | 3 | import com.wallet.crypto.trustapp.entity.Transaction; 4 | import com.wallet.crypto.trustapp.entity.Wallet; 5 | 6 | import io.reactivex.Single; 7 | 8 | public class TransactionInDiskSource implements TransactionLocalSource { 9 | @Override 10 | public Single fetchTransaction(Wallet wallet) { 11 | return null; 12 | } 13 | 14 | @Override 15 | public void putTransactions(Wallet wallet, Transaction[] transactions) { 16 | 17 | } 18 | 19 | @Override 20 | public void clear() { 21 | 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /app/src/main/java/com/wallet/crypto/trustapp/repository/TransactionInMemorySource.java: -------------------------------------------------------------------------------- 1 | package com.wallet.crypto.trustapp.repository; 2 | 3 | import android.text.format.DateUtils; 4 | 5 | import com.wallet.crypto.trustapp.entity.Transaction; 6 | import com.wallet.crypto.trustapp.entity.Wallet; 7 | 8 | import java.util.Map; 9 | 10 | import io.reactivex.Single; 11 | 12 | // TODO: Add pagination. 13 | public class TransactionInMemorySource implements TransactionLocalSource { 14 | 15 | private static final long MAX_TIME_OUT = DateUtils.MINUTE_IN_MILLIS; 16 | private final Map cache = new java.util.concurrent.ConcurrentHashMap<>(); 17 | 18 | @Override 19 | public Single fetchTransaction(Wallet wallet) { 20 | return Single.fromCallable(() -> { 21 | CacheUnit unit = cache.get(wallet.address); 22 | Transaction[] transactions = new Transaction[0]; 23 | if (unit != null) { 24 | if (System.currentTimeMillis() - unit.create > MAX_TIME_OUT) { 25 | cache.remove(wallet.address); 26 | } else { 27 | transactions = unit.transactions; 28 | } 29 | 30 | } 31 | return transactions; 32 | }); 33 | } 34 | 35 | @Override 36 | public void putTransactions(Wallet wallet, Transaction[] transactions) { 37 | cache.put(wallet.address, new CacheUnit(wallet.address, System.currentTimeMillis(), transactions)); 38 | } 39 | 40 | @Override 41 | public void clear() { 42 | cache.clear(); 43 | } 44 | 45 | private static class CacheUnit { 46 | final String accountAddress; 47 | final long create; 48 | final Transaction[] transactions; 49 | 50 | private CacheUnit(String accountAddress, long create, Transaction[] transactions) { 51 | this.accountAddress = accountAddress; 52 | this.create = create; 53 | this.transactions = transactions; 54 | } 55 | } 56 | } 57 | -------------------------------------------------------------------------------- /app/src/main/java/com/wallet/crypto/trustapp/repository/TransactionLocalSource.java: -------------------------------------------------------------------------------- 1 | package com.wallet.crypto.trustapp.repository; 2 | 3 | import com.wallet.crypto.trustapp.entity.Transaction; 4 | import com.wallet.crypto.trustapp.entity.Wallet; 5 | 6 | import io.reactivex.Single; 7 | 8 | public interface TransactionLocalSource { 9 | Single fetchTransaction(Wallet wallet); 10 | 11 | void putTransactions(Wallet wallet, Transaction[] transactions); 12 | 13 | void clear(); 14 | } 15 | -------------------------------------------------------------------------------- /app/src/main/java/com/wallet/crypto/trustapp/repository/TransactionRepositoryType.java: -------------------------------------------------------------------------------- 1 | package com.wallet.crypto.trustapp.repository; 2 | 3 | import com.wallet.crypto.trustapp.entity.Transaction; 4 | import com.wallet.crypto.trustapp.entity.Wallet; 5 | 6 | import java.math.BigInteger; 7 | 8 | import io.reactivex.Maybe; 9 | import io.reactivex.Observable; 10 | import io.reactivex.Single; 11 | 12 | public interface TransactionRepositoryType { 13 | Observable fetchTransaction(Wallet wallet); 14 | Maybe findTransaction(Wallet wallet, String transactionHash); 15 | Single createTransaction(Wallet from, String toAddress, BigInteger subunitAmount, BigInteger gasPrice, BigInteger gasLimit, byte[] data, String password); 16 | } 17 | -------------------------------------------------------------------------------- /app/src/main/java/com/wallet/crypto/trustapp/repository/TrustPasswordStore.java: -------------------------------------------------------------------------------- 1 | package com.wallet.crypto.trustapp.repository; 2 | 3 | import android.content.Context; 4 | 5 | import com.wallet.crypto.trustapp.entity.Wallet; 6 | import com.wallet.crypto.trustapp.util.KS; 7 | 8 | import java.security.SecureRandom; 9 | 10 | import io.reactivex.Completable; 11 | import io.reactivex.Single; 12 | 13 | public class TrustPasswordStore implements PasswordStore { 14 | 15 | private final Context context; 16 | 17 | public TrustPasswordStore(Context context) { 18 | this.context = context; 19 | } 20 | 21 | @Override 22 | public Single getPassword(Wallet wallet) { 23 | return Single.fromCallable(() -> new String(KS.get(context, wallet.address))); 24 | } 25 | 26 | @Override 27 | public Completable setPassword(Wallet wallet, String password) { 28 | return Completable.fromAction(() -> KS.put(context, wallet.address, password)); 29 | } 30 | 31 | @Override 32 | public Single generatePassword() { 33 | return Single.fromCallable(() -> { 34 | byte bytes[] = new byte[256]; 35 | SecureRandom random = new SecureRandom(); 36 | random.nextBytes(bytes); 37 | return new String(bytes); 38 | }); 39 | } 40 | } 41 | -------------------------------------------------------------------------------- /app/src/main/java/com/wallet/crypto/trustapp/repository/WalletRepositoryType.java: -------------------------------------------------------------------------------- 1 | package com.wallet.crypto.trustapp.repository; 2 | 3 | import com.wallet.crypto.trustapp.entity.Wallet; 4 | 5 | import java.math.BigInteger; 6 | 7 | import io.reactivex.Completable; 8 | import io.reactivex.Maybe; 9 | import io.reactivex.Single; 10 | 11 | public interface WalletRepositoryType { 12 | Single fetchWallets(); 13 | Single findWallet(String address); 14 | 15 | Single createWallet(String password); 16 | Single importKeystoreToWallet(String store, String password, String newPassword); 17 | Single importPrivateKeyToWallet(String privateKey, String newPassword); 18 | Single exportWallet(Wallet wallet, String password, String newPassword); 19 | 20 | Completable deleteWallet(String address, String password); 21 | 22 | Completable setDefaultWallet(Wallet wallet); 23 | Single getDefaultWallet(); 24 | 25 | Single balanceInWei(Wallet wallet); 26 | } 27 | -------------------------------------------------------------------------------- /app/src/main/java/com/wallet/crypto/trustapp/repository/entity/RealmTokenInfo.java: -------------------------------------------------------------------------------- 1 | package com.wallet.crypto.trustapp.repository.entity; 2 | 3 | import io.realm.RealmObject; 4 | import io.realm.annotations.PrimaryKey; 5 | 6 | public class RealmTokenInfo extends RealmObject { 7 | @PrimaryKey 8 | private String address; 9 | private String name; 10 | private String symbol; 11 | private int decimals; 12 | private long addedTime; 13 | 14 | public int getDecimals() { 15 | return decimals; 16 | } 17 | 18 | public void setDecimals(int decimals) { 19 | this.decimals = decimals; 20 | } 21 | 22 | public String getSymbol() { 23 | return symbol; 24 | } 25 | 26 | public void setSymbol(String symbol) { 27 | this.symbol = symbol; 28 | } 29 | 30 | public String getName() { 31 | return name; 32 | } 33 | 34 | public void setName(String name) { 35 | this.name = name; 36 | } 37 | 38 | public String getAddress() { 39 | return address; 40 | } 41 | 42 | public void setAddress(String address) { 43 | this.address = address; 44 | } 45 | 46 | public long getAddedTime() { 47 | return addedTime; 48 | } 49 | 50 | public void setAddedTime(long addedTime) { 51 | this.addedTime = addedTime; 52 | } 53 | } 54 | -------------------------------------------------------------------------------- /app/src/main/java/com/wallet/crypto/trustapp/router/AddTokenRouter.java: -------------------------------------------------------------------------------- 1 | package com.wallet.crypto.trustapp.router; 2 | 3 | import android.content.Context; 4 | import android.content.Intent; 5 | 6 | import com.wallet.crypto.trustapp.ui.AddTokenActivity; 7 | 8 | public class AddTokenRouter { 9 | 10 | public void open(Context context) { 11 | Intent intent = new Intent(context, AddTokenActivity.class); 12 | context.startActivity(intent); 13 | } 14 | } 15 | -------------------------------------------------------------------------------- /app/src/main/java/com/wallet/crypto/trustapp/router/ConfirmationRouter.java: -------------------------------------------------------------------------------- 1 | package com.wallet.crypto.trustapp.router; 2 | 3 | 4 | import android.content.Context; 5 | import android.content.Intent; 6 | 7 | import com.wallet.crypto.trustapp.C; 8 | import com.wallet.crypto.trustapp.ui.ConfirmationActivity; 9 | 10 | import java.math.BigInteger; 11 | 12 | public class ConfirmationRouter { 13 | public void open(Context context, String to, BigInteger amount, String contractAddress, int decimals, String symbol, boolean sendingTokens) { 14 | Intent intent = new Intent(context, ConfirmationActivity.class); 15 | intent.putExtra(C.EXTRA_TO_ADDRESS, to); 16 | intent.putExtra(C.EXTRA_AMOUNT, amount.toString()); 17 | intent.putExtra(C.EXTRA_CONTRACT_ADDRESS, contractAddress); 18 | intent.putExtra(C.EXTRA_DECIMALS, decimals); 19 | intent.putExtra(C.EXTRA_SYMBOL, symbol); 20 | intent.putExtra(C.EXTRA_SENDING_TOKENS, sendingTokens); 21 | context.startActivity(intent); 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /app/src/main/java/com/wallet/crypto/trustapp/router/ExternalBrowserRouter.java: -------------------------------------------------------------------------------- 1 | package com.wallet.crypto.trustapp.router; 2 | 3 | import android.content.Context; 4 | import android.content.Intent; 5 | import android.net.Uri; 6 | 7 | public class ExternalBrowserRouter { 8 | 9 | public void open(Context context, Uri uri) { 10 | Intent launchBrowser = new Intent(Intent.ACTION_VIEW, uri); 11 | context.startActivity(launchBrowser); 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /app/src/main/java/com/wallet/crypto/trustapp/router/GasSettingsRouter.java: -------------------------------------------------------------------------------- 1 | package com.wallet.crypto.trustapp.router; 2 | 3 | 4 | import android.app.Activity; 5 | import android.content.Intent; 6 | 7 | import com.wallet.crypto.trustapp.C; 8 | import com.wallet.crypto.trustapp.entity.GasSettings; 9 | import com.wallet.crypto.trustapp.ui.GasSettingsActivity; 10 | import com.wallet.crypto.trustapp.viewmodel.GasSettingsViewModel; 11 | 12 | public class GasSettingsRouter { 13 | public void open(Activity context, GasSettings gasSettings) { 14 | Intent intent = new Intent(context, GasSettingsActivity.class); 15 | intent.putExtra(C.EXTRA_GAS_PRICE, gasSettings.gasPrice.toString()); 16 | intent.putExtra(C.EXTRA_GAS_LIMIT, gasSettings.gasLimit.toString()); 17 | context.startActivityForResult(intent, GasSettingsViewModel.SET_GAS_SETTINGS); 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /app/src/main/java/com/wallet/crypto/trustapp/router/ImportWalletRouter.java: -------------------------------------------------------------------------------- 1 | package com.wallet.crypto.trustapp.router; 2 | 3 | import android.app.Activity; 4 | import android.content.Context; 5 | import android.content.Intent; 6 | 7 | import com.wallet.crypto.trustapp.ui.ImportWalletActivity; 8 | 9 | public class ImportWalletRouter { 10 | 11 | public void open(Context context) { 12 | Intent intent = new Intent(context, ImportWalletActivity.class); 13 | context.startActivity(intent); 14 | } 15 | 16 | public void openForResult(Activity activity, int requestCode) { 17 | Intent intent = new Intent(activity, ImportWalletActivity.class); 18 | activity.startActivityForResult(intent, requestCode); 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /app/src/main/java/com/wallet/crypto/trustapp/router/ManageWalletsRouter.java: -------------------------------------------------------------------------------- 1 | package com.wallet.crypto.trustapp.router; 2 | 3 | import android.content.Context; 4 | import android.content.Intent; 5 | 6 | import com.wallet.crypto.trustapp.ui.WalletsActivity; 7 | 8 | public class ManageWalletsRouter { 9 | 10 | public void open(Context context, boolean isClearStack) { 11 | Intent intent = new Intent(context, WalletsActivity.class); 12 | if (isClearStack) { 13 | intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK); 14 | } 15 | context.startActivity(intent); 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /app/src/main/java/com/wallet/crypto/trustapp/router/MyAddressRouter.java: -------------------------------------------------------------------------------- 1 | package com.wallet.crypto.trustapp.router; 2 | 3 | import android.content.Context; 4 | import android.content.Intent; 5 | 6 | import com.wallet.crypto.trustapp.entity.Wallet; 7 | import com.wallet.crypto.trustapp.ui.MyAddressActivity; 8 | 9 | import static com.wallet.crypto.trustapp.C.Key.WALLET; 10 | 11 | public class MyAddressRouter { 12 | 13 | public void open(Context context, Wallet wallet) { 14 | Intent intent = new Intent(context, MyAddressActivity.class); 15 | intent.putExtra(WALLET, wallet); 16 | context.startActivity(intent); 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /app/src/main/java/com/wallet/crypto/trustapp/router/MyTokensRouter.java: -------------------------------------------------------------------------------- 1 | package com.wallet.crypto.trustapp.router; 2 | 3 | import android.content.Context; 4 | import android.content.Intent; 5 | 6 | import com.wallet.crypto.trustapp.entity.Wallet; 7 | import com.wallet.crypto.trustapp.ui.TokensActivity; 8 | 9 | import static com.wallet.crypto.trustapp.C.Key.WALLET; 10 | 11 | public class MyTokensRouter { 12 | 13 | public void open(Context context, Wallet wallet) { 14 | Intent intent = new Intent(context, TokensActivity.class); 15 | intent.putExtra(WALLET, wallet); 16 | intent.setFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP); 17 | context.startActivity(intent); 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /app/src/main/java/com/wallet/crypto/trustapp/router/SendRouter.java: -------------------------------------------------------------------------------- 1 | package com.wallet.crypto.trustapp.router; 2 | 3 | import android.content.Context; 4 | import android.content.Intent; 5 | 6 | import com.wallet.crypto.trustapp.ui.SendActivity; 7 | 8 | public class SendRouter { 9 | 10 | public void open(Context context) { 11 | Intent intent = new Intent(context, SendActivity.class); 12 | context.startActivity(intent); 13 | } 14 | } 15 | -------------------------------------------------------------------------------- /app/src/main/java/com/wallet/crypto/trustapp/router/SendTokenRouter.java: -------------------------------------------------------------------------------- 1 | package com.wallet.crypto.trustapp.router; 2 | 3 | 4 | import android.content.Context; 5 | import android.content.Intent; 6 | 7 | import com.wallet.crypto.trustapp.C; 8 | import com.wallet.crypto.trustapp.ui.SendActivity; 9 | 10 | public class SendTokenRouter { 11 | public void open(Context context, String address, String symbol, int decimals) { 12 | Intent intent = new Intent(context, SendActivity.class); 13 | intent.putExtra(C.EXTRA_SENDING_TOKENS, true); 14 | intent.putExtra(C.EXTRA_CONTRACT_ADDRESS, address); 15 | intent.putExtra(C.EXTRA_SYMBOL, symbol); 16 | intent.putExtra(C.EXTRA_DECIMALS, decimals); 17 | context.startActivity(intent); 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /app/src/main/java/com/wallet/crypto/trustapp/router/SettingsRouter.java: -------------------------------------------------------------------------------- 1 | package com.wallet.crypto.trustapp.router; 2 | 3 | import android.content.Context; 4 | import android.content.Intent; 5 | 6 | import com.wallet.crypto.trustapp.ui.SettingsActivity; 7 | 8 | public class SettingsRouter { 9 | 10 | public void open(Context context) { 11 | Intent intent = new Intent(context, SettingsActivity.class); 12 | context.startActivity(intent); 13 | } 14 | } 15 | -------------------------------------------------------------------------------- /app/src/main/java/com/wallet/crypto/trustapp/router/TransactionDetailRouter.java: -------------------------------------------------------------------------------- 1 | package com.wallet.crypto.trustapp.router; 2 | 3 | import android.content.Context; 4 | import android.content.Intent; 5 | 6 | import com.wallet.crypto.trustapp.entity.Transaction; 7 | import com.wallet.crypto.trustapp.ui.TransactionDetailActivity; 8 | 9 | import static com.wallet.crypto.trustapp.C.Key.TRANSACTION; 10 | 11 | public class TransactionDetailRouter { 12 | 13 | public void open(Context context, Transaction transaction) { 14 | Intent intent = new Intent(context, TransactionDetailActivity.class); 15 | intent.putExtra(TRANSACTION, transaction); 16 | context.startActivity(intent); 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /app/src/main/java/com/wallet/crypto/trustapp/router/TransactionsRouter.java: -------------------------------------------------------------------------------- 1 | package com.wallet.crypto.trustapp.router; 2 | 3 | import android.content.Context; 4 | import android.content.Intent; 5 | 6 | import com.wallet.crypto.trustapp.ui.TransactionsActivity; 7 | 8 | public class TransactionsRouter { 9 | public void open(Context context, boolean isClearStack) { 10 | Intent intent = new Intent(context, TransactionsActivity.class); 11 | if (isClearStack) { 12 | intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK); 13 | } 14 | context.startActivity(intent); 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /app/src/main/java/com/wallet/crypto/trustapp/service/BlockExplorerClientType.java: -------------------------------------------------------------------------------- 1 | package com.wallet.crypto.trustapp.service; 2 | 3 | import com.wallet.crypto.trustapp.entity.Transaction; 4 | 5 | import io.reactivex.Observable; 6 | 7 | public interface BlockExplorerClientType { 8 | Observable fetchTransactions(String forAddress); 9 | } 10 | -------------------------------------------------------------------------------- /app/src/main/java/com/wallet/crypto/trustapp/service/TickerService.java: -------------------------------------------------------------------------------- 1 | package com.wallet.crypto.trustapp.service; 2 | 3 | import com.wallet.crypto.trustapp.entity.Ticker; 4 | 5 | import io.reactivex.Observable; 6 | 7 | public interface TickerService { 8 | 9 | Observable fetchTickerPrice(String ticker); 10 | } 11 | -------------------------------------------------------------------------------- /app/src/main/java/com/wallet/crypto/trustapp/service/TokenExplorerClientType.java: -------------------------------------------------------------------------------- 1 | package com.wallet.crypto.trustapp.service; 2 | 3 | import com.wallet.crypto.trustapp.entity.TokenInfo; 4 | 5 | import io.reactivex.Observable; 6 | 7 | public interface TokenExplorerClientType { 8 | Observable fetch(String walletAddress); 9 | } -------------------------------------------------------------------------------- /app/src/main/java/com/wallet/crypto/trustapp/ui/BaseActivity.java: -------------------------------------------------------------------------------- 1 | package com.wallet.crypto.trustapp.ui; 2 | 3 | import android.support.v7.app.ActionBar; 4 | import android.support.v7.app.AppCompatActivity; 5 | import android.support.v7.widget.Toolbar; 6 | import android.view.MenuItem; 7 | 8 | import com.wallet.crypto.trustapp.R; 9 | 10 | 11 | public abstract class BaseActivity extends AppCompatActivity { 12 | 13 | protected Toolbar toolbar() { 14 | Toolbar toolbar = findViewById(R.id.toolbar); 15 | if (toolbar != null) { 16 | setSupportActionBar(toolbar); 17 | toolbar.setTitle(getTitle()); 18 | } 19 | enableDisplayHomeAsUp(); 20 | return toolbar; 21 | } 22 | 23 | protected void setTitle(String title) { 24 | ActionBar actionBar = getSupportActionBar(); 25 | if (actionBar != null) { 26 | actionBar.setTitle(title); 27 | } 28 | } 29 | 30 | protected void setSubtitle(String subtitle) { 31 | ActionBar actionBar = getSupportActionBar(); 32 | if (actionBar != null) { 33 | actionBar.setSubtitle(subtitle); 34 | } 35 | } 36 | 37 | protected void enableDisplayHomeAsUp() { 38 | ActionBar actionBar = getSupportActionBar(); 39 | if (actionBar != null) { 40 | actionBar.setDisplayHomeAsUpEnabled(true); 41 | } 42 | } 43 | 44 | protected void dissableDisplayHomeAsUp() { 45 | ActionBar actionBar = getSupportActionBar(); 46 | if (actionBar != null) { 47 | actionBar.setDisplayHomeAsUpEnabled(false); 48 | } 49 | } 50 | 51 | protected void hideToolbar() { 52 | ActionBar actionBar = getSupportActionBar(); 53 | if (actionBar != null) { 54 | actionBar.hide(); 55 | } 56 | } 57 | 58 | protected void showToolbar() { 59 | ActionBar actionBar = getSupportActionBar(); 60 | if (actionBar != null) { 61 | actionBar.show(); 62 | } 63 | } 64 | 65 | @Override 66 | public boolean onOptionsItemSelected(MenuItem item) { 67 | switch (item.getItemId()) { 68 | case android.R.id.home: 69 | finish(); 70 | break; 71 | } 72 | return true; 73 | } 74 | } 75 | -------------------------------------------------------------------------------- /app/src/main/java/com/wallet/crypto/trustapp/ui/SettingsActivity.java: -------------------------------------------------------------------------------- 1 | package com.wallet.crypto.trustapp.ui; 2 | 3 | import android.app.Fragment; 4 | import android.os.Bundle; 5 | import android.view.MenuItem; 6 | 7 | import com.wallet.crypto.trustapp.R; 8 | import com.wallet.crypto.trustapp.router.TransactionsRouter; 9 | 10 | import javax.inject.Inject; 11 | 12 | import dagger.android.AndroidInjection; 13 | import dagger.android.AndroidInjector; 14 | import dagger.android.DispatchingAndroidInjector; 15 | import dagger.android.HasFragmentInjector; 16 | 17 | public class SettingsActivity extends BaseActivity implements HasFragmentInjector { 18 | 19 | @Inject 20 | DispatchingAndroidInjector fragmentInjector; 21 | 22 | @Override 23 | protected void onCreate(Bundle savedInstanceState) { 24 | AndroidInjection.inject(this); 25 | super.onCreate(savedInstanceState); 26 | setContentView(R.layout.activity_settings); 27 | toolbar(); 28 | // Display the fragment as the main content. 29 | getFragmentManager().beginTransaction() 30 | .replace(R.id.fragment_container, new SettingsFragment()) 31 | .commit(); 32 | } 33 | 34 | @Override 35 | public boolean onOptionsItemSelected(MenuItem item) { 36 | switch (item.getItemId()) { 37 | case android.R.id.home: { 38 | new TransactionsRouter().open(this, true); 39 | return true; 40 | } 41 | } 42 | return super.onOptionsItemSelected(item); 43 | } 44 | 45 | @Override 46 | public void onBackPressed() { 47 | new TransactionsRouter().open(this, true); 48 | } 49 | 50 | @Override 51 | public AndroidInjector fragmentInjector() { 52 | return fragmentInjector; 53 | } 54 | } 55 | -------------------------------------------------------------------------------- /app/src/main/java/com/wallet/crypto/trustapp/ui/SplashActivity.java: -------------------------------------------------------------------------------- 1 | package com.wallet.crypto.trustapp.ui; 2 | 3 | import android.arch.lifecycle.ViewModelProviders; 4 | import android.os.Bundle; 5 | import android.support.v7.app.AppCompatActivity; 6 | 7 | import com.wallet.crypto.trustapp.entity.Wallet; 8 | import com.wallet.crypto.trustapp.router.ManageWalletsRouter; 9 | import com.wallet.crypto.trustapp.router.TransactionsRouter; 10 | import com.wallet.crypto.trustapp.viewmodel.SplashViewModel; 11 | import com.wallet.crypto.trustapp.viewmodel.SplashViewModelFactory; 12 | 13 | import javax.inject.Inject; 14 | 15 | import dagger.android.AndroidInjection; 16 | 17 | public class SplashActivity extends AppCompatActivity { 18 | 19 | @Inject 20 | SplashViewModelFactory splashViewModelFactory; 21 | SplashViewModel splashViewModel; 22 | 23 | 24 | @Override 25 | protected void onCreate(Bundle savedInstanceState) { 26 | AndroidInjection.inject(this); 27 | super.onCreate(savedInstanceState); 28 | 29 | splashViewModel = ViewModelProviders.of(this, splashViewModelFactory) 30 | .get(SplashViewModel.class); 31 | splashViewModel.wallets().observe(this, this::onWallets); 32 | } 33 | 34 | private void onWallets(Wallet[] wallets) { 35 | // Start home activity 36 | if (wallets.length == 0) { 37 | new ManageWalletsRouter().open(this, true); 38 | } else { 39 | new TransactionsRouter().open(this, true); 40 | } 41 | } 42 | 43 | } 44 | -------------------------------------------------------------------------------- /app/src/main/java/com/wallet/crypto/trustapp/ui/barcode/BarcodeTracker.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (C) The Android Open Source Project 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); 5 | * you may not use this file except in compliance with the License. 6 | * You may obtain a copy of the License at 7 | * 8 | * http://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | * See the License for the specific language governing permissions and 14 | * limitations under the License. 15 | */ 16 | package com.wallet.crypto.trustapp.ui.barcode; 17 | 18 | import android.content.Context; 19 | 20 | import com.google.android.gms.vision.Tracker; 21 | import com.google.android.gms.vision.barcode.Barcode; 22 | 23 | class BarcodeTracker extends Tracker { 24 | private BarcodeGraphicTrackerCallback mListener; 25 | 26 | public interface BarcodeGraphicTrackerCallback { 27 | void onDetectedQrCode(Barcode barcode); 28 | } 29 | 30 | BarcodeTracker(Context listener) { 31 | mListener = (BarcodeGraphicTrackerCallback) listener; 32 | } 33 | 34 | @Override 35 | public void onNewItem(int id, Barcode item) { 36 | if (item.displayValue != null) { 37 | mListener.onDetectedQrCode(item); 38 | } 39 | } 40 | } 41 | -------------------------------------------------------------------------------- /app/src/main/java/com/wallet/crypto/trustapp/ui/barcode/BarcodeTrackerFactory.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (C) The Android Open Source Project 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); 5 | * you may not use this file except in compliance with the License. 6 | * You may obtain a copy of the License at 7 | * 8 | * http://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | * See the License for the specific language governing permissions and 14 | * limitations under the License. 15 | */ 16 | package com.wallet.crypto.trustapp.ui.barcode; 17 | 18 | import android.content.Context; 19 | 20 | import com.google.android.gms.vision.MultiProcessor; 21 | import com.google.android.gms.vision.Tracker; 22 | import com.google.android.gms.vision.barcode.Barcode; 23 | 24 | /** 25 | * Factory for creating a tracker and associated graphic to be associated with a new barcode_capture. The 26 | * multi-processor uses this factory to create barcode_capture trackers as needed -- one for each barcode_capture. 27 | */ 28 | class BarcodeTrackerFactory implements MultiProcessor.Factory { 29 | private Context mContext; 30 | 31 | BarcodeTrackerFactory(Context context) { 32 | mContext = context; 33 | } 34 | 35 | @Override 36 | public Tracker create(Barcode barcode) { 37 | return new BarcodeTracker(mContext); 38 | } 39 | } -------------------------------------------------------------------------------- /app/src/main/java/com/wallet/crypto/trustapp/ui/widget/OnBackupClickListener.java: -------------------------------------------------------------------------------- 1 | package com.wallet.crypto.trustapp.ui.widget; 2 | 3 | import android.view.View; 4 | 5 | import com.wallet.crypto.trustapp.entity.Wallet; 6 | 7 | public interface OnBackupClickListener { 8 | void onBackupClick(View view, Wallet wallet); 9 | } 10 | -------------------------------------------------------------------------------- /app/src/main/java/com/wallet/crypto/trustapp/ui/widget/OnDepositClickListener.java: -------------------------------------------------------------------------------- 1 | package com.wallet.crypto.trustapp.ui.widget; 2 | 3 | import android.net.Uri; 4 | import android.view.View; 5 | 6 | public interface OnDepositClickListener { 7 | 8 | void onDepositClick(View view, Uri uri); 9 | } 10 | -------------------------------------------------------------------------------- /app/src/main/java/com/wallet/crypto/trustapp/ui/widget/OnImportKeystoreListener.java: -------------------------------------------------------------------------------- 1 | package com.wallet.crypto.trustapp.ui.widget; 2 | 3 | public interface OnImportKeystoreListener { 4 | void onKeystore(String keystore, String password); 5 | } 6 | -------------------------------------------------------------------------------- /app/src/main/java/com/wallet/crypto/trustapp/ui/widget/OnImportPrivateKeyListener.java: -------------------------------------------------------------------------------- 1 | package com.wallet.crypto.trustapp.ui.widget; 2 | 3 | public interface OnImportPrivateKeyListener { 4 | 5 | void onPrivateKey(String key); 6 | } 7 | -------------------------------------------------------------------------------- /app/src/main/java/com/wallet/crypto/trustapp/ui/widget/OnTokenClickListener.java: -------------------------------------------------------------------------------- 1 | package com.wallet.crypto.trustapp.ui.widget; 2 | 3 | import android.view.View; 4 | 5 | import com.wallet.crypto.trustapp.entity.Token; 6 | 7 | public interface OnTokenClickListener { 8 | void onTokenClick(View view, Token token); 9 | } 10 | -------------------------------------------------------------------------------- /app/src/main/java/com/wallet/crypto/trustapp/ui/widget/OnTransactionClickListener.java: -------------------------------------------------------------------------------- 1 | package com.wallet.crypto.trustapp.ui.widget; 2 | 3 | import android.view.View; 4 | 5 | import com.wallet.crypto.trustapp.entity.Transaction; 6 | 7 | public interface OnTransactionClickListener { 8 | void onTransactionClick(View view, Transaction transaction); 9 | } 10 | -------------------------------------------------------------------------------- /app/src/main/java/com/wallet/crypto/trustapp/ui/widget/adapter/TabPagerAdapter.java: -------------------------------------------------------------------------------- 1 | package com.wallet.crypto.trustapp.ui.widget.adapter; 2 | 3 | import android.support.v4.app.Fragment; 4 | import android.support.v4.app.FragmentManager; 5 | import android.support.v4.app.FragmentPagerAdapter; 6 | import android.support.v4.util.Pair; 7 | 8 | import java.util.List; 9 | 10 | public class TabPagerAdapter extends FragmentPagerAdapter { 11 | 12 | private final List> pages; 13 | 14 | public TabPagerAdapter(FragmentManager fm, List> pages) { 15 | super(fm); 16 | 17 | this.pages = pages; 18 | } 19 | 20 | // Return fragment with respect to position. 21 | @Override 22 | public Fragment getItem(int position) { 23 | return pages.get(position).second; 24 | } 25 | 26 | @Override 27 | public int getCount() { 28 | return pages.size(); 29 | } 30 | 31 | // This method returns the title of the tab according to its position. 32 | @Override 33 | public CharSequence getPageTitle(int position) { 34 | return pages.get(position).first; 35 | } 36 | 37 | } -------------------------------------------------------------------------------- /app/src/main/java/com/wallet/crypto/trustapp/ui/widget/adapter/TokensAdapter.java: -------------------------------------------------------------------------------- 1 | package com.wallet.crypto.trustapp.ui.widget.adapter; 2 | 3 | import android.support.v7.widget.RecyclerView; 4 | import android.view.ViewGroup; 5 | 6 | import com.wallet.crypto.trustapp.R; 7 | import com.wallet.crypto.trustapp.entity.Token; 8 | import com.wallet.crypto.trustapp.ui.widget.OnTokenClickListener; 9 | import com.wallet.crypto.trustapp.ui.widget.holder.TokenHolder; 10 | 11 | import java.util.ArrayList; 12 | import java.util.Arrays; 13 | import java.util.List; 14 | 15 | public class TokensAdapter extends RecyclerView.Adapter { 16 | 17 | private final OnTokenClickListener onTokenClickListener; 18 | private final List items = new ArrayList<>(); 19 | 20 | public TokensAdapter(OnTokenClickListener onTokenClickListener) { 21 | this.onTokenClickListener = onTokenClickListener; 22 | } 23 | 24 | @Override 25 | public TokenHolder onCreateViewHolder(ViewGroup parent, int viewType) { 26 | TokenHolder tokenHolder = new TokenHolder(R.layout.item_token, parent); 27 | tokenHolder.setOnTokenClickListener(onTokenClickListener); 28 | return tokenHolder; 29 | } 30 | 31 | @Override 32 | public void onBindViewHolder(TokenHolder holder, int position) { 33 | holder.bind(items.get(position)); 34 | } 35 | 36 | @Override 37 | public int getItemCount() { 38 | return items.size(); 39 | } 40 | 41 | public void setTokens(Token[] tokens) { 42 | items.clear(); 43 | items.addAll(Arrays.asList(tokens)); 44 | notifyDataSetChanged(); 45 | } 46 | } 47 | -------------------------------------------------------------------------------- /app/src/main/java/com/wallet/crypto/trustapp/ui/widget/entity/DateSortedItem.java: -------------------------------------------------------------------------------- 1 | package com.wallet.crypto.trustapp.ui.widget.entity; 2 | 3 | import android.text.format.DateUtils; 4 | 5 | import com.wallet.crypto.trustapp.ui.widget.holder.TransactionDateHolder; 6 | 7 | import java.util.Calendar; 8 | import java.util.Date; 9 | import java.util.TimeZone; 10 | 11 | public class DateSortedItem extends TimestampSortedItem { 12 | public DateSortedItem(Date value) { 13 | super(TransactionDateHolder.VIEW_TYPE, value, 0, DESC); 14 | } 15 | 16 | @Override 17 | public Date getTimestamp() { 18 | return value; 19 | } 20 | 21 | @Override 22 | public boolean areContentsTheSame(SortedItem newItem) { 23 | return viewType == newItem.viewType && value.equals(((TimestampSortedItem) newItem).value); 24 | } 25 | 26 | @Override 27 | public boolean areItemsTheSame(SortedItem other) { 28 | return viewType == other.viewType; 29 | } 30 | 31 | public static DateSortedItem round(long timeStampInSec) { 32 | Calendar calendar = Calendar.getInstance(TimeZone.getTimeZone("UTC")); 33 | calendar.setTimeInMillis(timeStampInSec * DateUtils.SECOND_IN_MILLIS); 34 | calendar.set(Calendar.MILLISECOND, 999); 35 | calendar.set(Calendar.SECOND, 59); 36 | calendar.set(Calendar.MINUTE, 59); 37 | calendar.set(Calendar.HOUR_OF_DAY, 23); 38 | return new DateSortedItem(calendar.getTime()); 39 | } 40 | } 41 | -------------------------------------------------------------------------------- /app/src/main/java/com/wallet/crypto/trustapp/ui/widget/entity/SortedItem.java: -------------------------------------------------------------------------------- 1 | package com.wallet.crypto.trustapp.ui.widget.entity; 2 | 3 | import java.util.ArrayList; 4 | import java.util.List; 5 | 6 | public abstract class SortedItem { 7 | protected final List tags = new ArrayList<>(); 8 | 9 | public final int viewType; 10 | public final T value; 11 | public final int weight; 12 | 13 | public SortedItem(int viewType, T value, int weight) { 14 | this.viewType = viewType; 15 | this.value = value; 16 | this.weight = weight; 17 | } 18 | 19 | public abstract int compare(SortedItem other); 20 | 21 | public abstract boolean areContentsTheSame(SortedItem newItem); 22 | 23 | public abstract boolean areItemsTheSame(SortedItem other); 24 | } 25 | -------------------------------------------------------------------------------- /app/src/main/java/com/wallet/crypto/trustapp/ui/widget/entity/TimestampSortedItem.java: -------------------------------------------------------------------------------- 1 | package com.wallet.crypto.trustapp.ui.widget.entity; 2 | 3 | import java.util.Date; 4 | 5 | public abstract class TimestampSortedItem extends SortedItem { 6 | 7 | public static final int ADC = 1; 8 | public static final int DESC = -1; 9 | 10 | private static final int IS_TIMESTAMP_TAG = 1; 11 | 12 | private final int order; 13 | 14 | 15 | public TimestampSortedItem(int viewType, T value, int weight, int order) { 16 | super(viewType, value, weight); 17 | tags.add(IS_TIMESTAMP_TAG); 18 | this.order = order; 19 | } 20 | 21 | public abstract Date getTimestamp(); 22 | 23 | @Override 24 | public int compare(SortedItem other) { 25 | if (other.tags.contains(IS_TIMESTAMP_TAG)) { 26 | TimestampSortedItem otherTimestamp = (TimestampSortedItem) other; 27 | return order * (getTimestamp().compareTo(otherTimestamp.getTimestamp()));/* 28 | ? 1 : getTimestamp() == otherTimestamp.getTimestamp() ? 0 : -1);*/ 29 | } 30 | return Integer.MIN_VALUE; 31 | } 32 | } 33 | -------------------------------------------------------------------------------- /app/src/main/java/com/wallet/crypto/trustapp/ui/widget/entity/TransactionSortedItem.java: -------------------------------------------------------------------------------- 1 | package com.wallet.crypto.trustapp.ui.widget.entity; 2 | 3 | import android.text.format.DateUtils; 4 | 5 | import com.wallet.crypto.trustapp.entity.Transaction; 6 | 7 | import java.util.Calendar; 8 | import java.util.Date; 9 | import java.util.TimeZone; 10 | 11 | public class TransactionSortedItem extends TimestampSortedItem { 12 | 13 | public TransactionSortedItem(int viewType, Transaction value, int order) { 14 | super(viewType, value, 0, order); 15 | } 16 | 17 | @Override 18 | public int compare(SortedItem other) { 19 | return super.compare(other); 20 | // return other.viewType == TransactionHolder.VIEW_TYPE || 21 | // ? super.compare(other) 22 | // : weight - other.weight; 23 | } 24 | 25 | @Override 26 | public boolean areContentsTheSame(SortedItem newItem) { 27 | if (viewType == newItem.viewType) { 28 | Transaction transaction = (Transaction)newItem.value; 29 | return value.hash.equals(transaction.hash) && value.timeStamp == transaction.timeStamp; 30 | } 31 | return false; 32 | } 33 | 34 | @Override 35 | public boolean areItemsTheSame(SortedItem other) { 36 | return viewType == other.viewType; 37 | } 38 | 39 | @Override 40 | public Date getTimestamp() { 41 | Calendar calendar = Calendar.getInstance(TimeZone.getTimeZone("UTC")); 42 | calendar.setTimeInMillis(value.timeStamp * DateUtils.SECOND_IN_MILLIS); 43 | return calendar.getTime(); 44 | } 45 | } 46 | -------------------------------------------------------------------------------- /app/src/main/java/com/wallet/crypto/trustapp/ui/widget/holder/BinderViewHolder.java: -------------------------------------------------------------------------------- 1 | package com.wallet.crypto.trustapp.ui.widget.holder; 2 | 3 | import android.content.Context; 4 | import android.os.Bundle; 5 | import android.support.annotation.NonNull; 6 | import android.support.annotation.Nullable; 7 | import android.support.v7.widget.RecyclerView; 8 | import android.view.LayoutInflater; 9 | import android.view.View; 10 | import android.view.ViewGroup; 11 | 12 | public abstract class BinderViewHolder extends RecyclerView.ViewHolder { 13 | public BinderViewHolder(int resId, ViewGroup parent) { 14 | super(LayoutInflater.from(parent.getContext()) 15 | .inflate(resId, parent, false)); 16 | } 17 | 18 | public abstract void bind(@Nullable T data, @NonNull Bundle addition); 19 | 20 | public void bind(@Nullable T data) { 21 | bind(data, Bundle.EMPTY); 22 | } 23 | 24 | protected T findViewById(int id) { 25 | return itemView.findViewById(id); 26 | } 27 | 28 | protected Context getContext() { 29 | return itemView.getContext(); 30 | } 31 | 32 | protected String getString(int stringResId) { 33 | return getContext().getString(stringResId); 34 | } 35 | 36 | 37 | public String getString(int stringResId, Object... args) { 38 | return getContext().getString(stringResId, args); 39 | } 40 | } 41 | -------------------------------------------------------------------------------- /app/src/main/java/com/wallet/crypto/trustapp/ui/widget/holder/TransactionDateHolder.java: -------------------------------------------------------------------------------- 1 | package com.wallet.crypto.trustapp.ui.widget.holder; 2 | 3 | import android.os.Bundle; 4 | import android.support.annotation.NonNull; 5 | import android.support.annotation.Nullable; 6 | import android.text.format.DateFormat; 7 | import android.view.ViewGroup; 8 | import android.widget.TextView; 9 | 10 | import com.wallet.crypto.trustapp.R; 11 | 12 | import java.util.Calendar; 13 | import java.util.Date; 14 | import java.util.TimeZone; 15 | 16 | public class TransactionDateHolder extends BinderViewHolder { 17 | 18 | // private static final String DATE_TEMPLATE = "MM/dd/yy H:mm:ss zzz"; 19 | 20 | public static final int VIEW_TYPE = 1004; 21 | private final TextView title; 22 | 23 | public TransactionDateHolder(int resId, ViewGroup parent) { 24 | super(resId, parent); 25 | 26 | title = findViewById(R.id.title); 27 | } 28 | 29 | @Override 30 | public void bind(@Nullable Date data, @NonNull Bundle addition) { 31 | if (data == null) { 32 | title.setText(null); 33 | } else { 34 | java.text.DateFormat dateFormat = DateFormat.getMediumDateFormat(getContext()); 35 | dateFormat.setTimeZone(TimeZone.getTimeZone("UTC")); 36 | Calendar calendar = Calendar.getInstance(); 37 | calendar.setTimeZone(TimeZone.getTimeZone("UTC")); 38 | calendar.setTime(data); 39 | title.setText(dateFormat.format(calendar.getTime())); 40 | } 41 | } 42 | } 43 | -------------------------------------------------------------------------------- /app/src/main/java/com/wallet/crypto/trustapp/util/KeyboardUtils.java: -------------------------------------------------------------------------------- 1 | package com.wallet.crypto.trustapp.util; 2 | 3 | import android.content.Context; 4 | import android.view.View; 5 | import android.view.inputmethod.InputMethodManager; 6 | 7 | public class KeyboardUtils { 8 | 9 | public static void showKeyboard(View view) { 10 | InputMethodManager inputMethodManager 11 | = (InputMethodManager) view.getContext().getSystemService(Context.INPUT_METHOD_SERVICE); 12 | if (inputMethodManager != null) { 13 | inputMethodManager.showSoftInput(view, InputMethodManager.SHOW_IMPLICIT); 14 | } 15 | } 16 | 17 | public static void hideKeyboard(View view) { 18 | InputMethodManager inputMethodManager 19 | = (InputMethodManager) view.getContext().getSystemService(Context.INPUT_METHOD_SERVICE); 20 | if (inputMethodManager != null) { 21 | inputMethodManager.hideSoftInputFromWindow( 22 | view.getWindowToken(), 0); 23 | } 24 | } 25 | } 26 | -------------------------------------------------------------------------------- /app/src/main/java/com/wallet/crypto/trustapp/util/RootUtil.java: -------------------------------------------------------------------------------- 1 | package com.wallet.crypto.trustapp.util; 2 | 3 | import java.io.BufferedReader; 4 | import java.io.File; 5 | import java.io.InputStreamReader; 6 | 7 | /** @author Kevin Kowalewski */ 8 | public class RootUtil { 9 | public static boolean isDeviceRooted() { 10 | return checkRootMethod1() || checkRootMethod2() || checkRootMethod3(); 11 | } 12 | 13 | private static boolean checkRootMethod1() { 14 | String buildTags = android.os.Build.TAGS; 15 | return buildTags != null && buildTags.contains("test-keys"); 16 | } 17 | 18 | private static boolean checkRootMethod2() { 19 | String[] paths = { "/system/app/Superuser.apk", "/sbin/su", "/system/bin/su", "/system/xbin/su", "/data/local/xbin/su", "/data/local/bin/su", "/system/sd/xbin/su", 20 | "/system/bin/failsafe/su", "/data/local/su", "/su/bin/su"}; 21 | for (String path : paths) { 22 | if (new File(path).exists()) { 23 | return true; 24 | } 25 | } 26 | return false; 27 | } 28 | 29 | private static boolean checkRootMethod3() { 30 | Process process = null; 31 | try { 32 | process = Runtime.getRuntime().exec(new String[] { "/system/xbin/which", "su" }); 33 | BufferedReader in = new BufferedReader(new InputStreamReader(process.getInputStream())); 34 | if (in.readLine() != null) return true; 35 | return false; 36 | } catch (Throwable t) { 37 | return false; 38 | } finally { 39 | if (process != null) process.destroy(); 40 | } 41 | } 42 | } -------------------------------------------------------------------------------- /app/src/main/java/com/wallet/crypto/trustapp/viewmodel/AddTokenViewModel.java: -------------------------------------------------------------------------------- 1 | package com.wallet.crypto.trustapp.viewmodel; 2 | 3 | import android.arch.lifecycle.LiveData; 4 | import android.arch.lifecycle.MutableLiveData; 5 | import android.content.Context; 6 | 7 | import com.wallet.crypto.trustapp.interact.AddTokenInteract; 8 | import com.wallet.crypto.trustapp.interact.FindDefaultWalletInteract; 9 | import com.wallet.crypto.trustapp.router.MyTokensRouter; 10 | 11 | public class AddTokenViewModel extends BaseViewModel { 12 | 13 | private final AddTokenInteract addTokenInteract; 14 | private final FindDefaultWalletInteract findDefaultWalletInteract; 15 | private final MyTokensRouter myTokensRouter; 16 | 17 | private final MutableLiveData result = new MutableLiveData<>(); 18 | 19 | AddTokenViewModel( 20 | AddTokenInteract addTokenInteract, 21 | FindDefaultWalletInteract findDefaultWalletInteract, 22 | MyTokensRouter myTokensRouter) { 23 | this.addTokenInteract = addTokenInteract; 24 | this.findDefaultWalletInteract = findDefaultWalletInteract; 25 | this.myTokensRouter = myTokensRouter; 26 | } 27 | 28 | public void save(String address, String symbol, int decimals) { 29 | addTokenInteract 30 | .add(address, symbol, decimals) 31 | .subscribe(this::onSaved, this::onError); 32 | } 33 | 34 | private void onSaved() { 35 | progress.postValue(false); 36 | result.postValue(true); 37 | } 38 | 39 | public LiveData result() { 40 | return result; 41 | } 42 | 43 | public void showTokens(Context context) { 44 | findDefaultWalletInteract 45 | .find() 46 | .subscribe(w -> myTokensRouter.open(context, w)); 47 | 48 | } 49 | } 50 | -------------------------------------------------------------------------------- /app/src/main/java/com/wallet/crypto/trustapp/viewmodel/AddTokenViewModelFactory.java: -------------------------------------------------------------------------------- 1 | package com.wallet.crypto.trustapp.viewmodel; 2 | 3 | import android.arch.lifecycle.ViewModel; 4 | import android.arch.lifecycle.ViewModelProvider; 5 | import android.support.annotation.NonNull; 6 | 7 | import com.wallet.crypto.trustapp.interact.AddTokenInteract; 8 | import com.wallet.crypto.trustapp.interact.FindDefaultWalletInteract; 9 | import com.wallet.crypto.trustapp.router.MyTokensRouter; 10 | 11 | public class AddTokenViewModelFactory implements ViewModelProvider.Factory { 12 | 13 | private final AddTokenInteract addTokenInteract; 14 | private final FindDefaultWalletInteract findDefaultWalletInteract; 15 | private final MyTokensRouter myTokensRouter; 16 | 17 | public AddTokenViewModelFactory( 18 | AddTokenInteract addTokenInteract, 19 | FindDefaultWalletInteract findDefaultWalletInteract, 20 | MyTokensRouter myTokensRouter) { 21 | this.addTokenInteract = addTokenInteract; 22 | this.findDefaultWalletInteract = findDefaultWalletInteract; 23 | this.myTokensRouter = myTokensRouter; 24 | } 25 | 26 | @NonNull 27 | @Override 28 | public T create(@NonNull Class modelClass) { 29 | return (T) new AddTokenViewModel(addTokenInteract, findDefaultWalletInteract, myTokensRouter); 30 | } 31 | } 32 | -------------------------------------------------------------------------------- /app/src/main/java/com/wallet/crypto/trustapp/viewmodel/BaseNavigationActivity.java: -------------------------------------------------------------------------------- 1 | package com.wallet.crypto.trustapp.viewmodel; 2 | 3 | import android.support.annotation.MenuRes; 4 | import android.support.annotation.NonNull; 5 | import android.support.design.widget.BottomNavigationView; 6 | import android.view.MenuItem; 7 | 8 | import com.wallet.crypto.trustapp.R; 9 | import com.wallet.crypto.trustapp.ui.BaseActivity; 10 | 11 | public class BaseNavigationActivity extends BaseActivity implements BottomNavigationView.OnNavigationItemSelectedListener { 12 | 13 | private BottomNavigationView navigation; 14 | 15 | protected void initBottomNavigation() { 16 | navigation = findViewById(R.id.bottom_navigation); 17 | navigation.setOnNavigationItemSelectedListener(this); 18 | } 19 | 20 | protected void setBottomMenu(@MenuRes int menuRes) { 21 | navigation.getMenu().clear(); 22 | navigation.inflateMenu(menuRes); 23 | } 24 | 25 | @Override 26 | public boolean onNavigationItemSelected(@NonNull MenuItem item) { 27 | return false; 28 | } 29 | } 30 | -------------------------------------------------------------------------------- /app/src/main/java/com/wallet/crypto/trustapp/viewmodel/BaseViewModel.java: -------------------------------------------------------------------------------- 1 | package com.wallet.crypto.trustapp.viewmodel; 2 | 3 | import android.arch.lifecycle.LiveData; 4 | import android.arch.lifecycle.MutableLiveData; 5 | import android.arch.lifecycle.ViewModel; 6 | import android.util.Log; 7 | 8 | import com.wallet.crypto.trustapp.C; 9 | import com.wallet.crypto.trustapp.entity.ErrorEnvelope; 10 | import com.wallet.crypto.trustapp.entity.ServiceException; 11 | 12 | import io.reactivex.disposables.Disposable; 13 | 14 | public class BaseViewModel extends ViewModel { 15 | 16 | protected final MutableLiveData error = new MutableLiveData<>(); 17 | protected final MutableLiveData progress = new MutableLiveData<>(); 18 | protected Disposable disposable; 19 | 20 | @Override 21 | protected void onCleared() { 22 | cancel(); 23 | } 24 | 25 | protected void cancel() { 26 | if (disposable != null && !disposable.isDisposed()) { 27 | disposable.dispose(); 28 | } 29 | } 30 | 31 | public LiveData error() { 32 | return error; 33 | } 34 | 35 | public LiveData progress() { 36 | return progress; 37 | } 38 | 39 | protected void onError(Throwable throwable) { 40 | if (throwable instanceof ServiceException) { 41 | error.postValue(((ServiceException) throwable).error); 42 | } else { 43 | error.postValue(new ErrorEnvelope(C.ErrorCode.UNKNOWN, null, throwable)); 44 | // TODO: Add dialog with offer send error log to developers: notify about error. 45 | Log.d("SESSION", "Err", throwable); 46 | } 47 | } 48 | } 49 | -------------------------------------------------------------------------------- /app/src/main/java/com/wallet/crypto/trustapp/viewmodel/ConfirmationViewModelFactory.java: -------------------------------------------------------------------------------- 1 | package com.wallet.crypto.trustapp.viewmodel; 2 | 3 | import android.arch.lifecycle.ViewModel; 4 | import android.arch.lifecycle.ViewModelProvider; 5 | import android.support.annotation.NonNull; 6 | 7 | import com.wallet.crypto.trustapp.interact.CreateTransactionInteract; 8 | import com.wallet.crypto.trustapp.interact.FetchGasSettingsInteract; 9 | import com.wallet.crypto.trustapp.interact.FindDefaultWalletInteract; 10 | import com.wallet.crypto.trustapp.router.GasSettingsRouter; 11 | 12 | public class ConfirmationViewModelFactory implements ViewModelProvider.Factory { 13 | 14 | private FindDefaultWalletInteract findDefaultWalletInteract; 15 | private FetchGasSettingsInteract fetchGasSettingsInteract; 16 | private CreateTransactionInteract createTransactionInteract; 17 | private GasSettingsRouter gasSettingsRouter; 18 | 19 | public ConfirmationViewModelFactory(FindDefaultWalletInteract findDefaultWalletInteract, 20 | FetchGasSettingsInteract fetchGasSettingsInteract, 21 | CreateTransactionInteract createTransactionInteract, 22 | GasSettingsRouter gasSettingsRouter) { 23 | this.findDefaultWalletInteract = findDefaultWalletInteract; 24 | this.fetchGasSettingsInteract = fetchGasSettingsInteract; 25 | this.createTransactionInteract = createTransactionInteract; 26 | this.gasSettingsRouter = gasSettingsRouter; 27 | } 28 | 29 | @NonNull 30 | @Override 31 | public T create(@NonNull Class modelClass) { 32 | return (T) new ConfirmationViewModel(findDefaultWalletInteract, fetchGasSettingsInteract, createTransactionInteract, gasSettingsRouter); 33 | } 34 | } 35 | -------------------------------------------------------------------------------- /app/src/main/java/com/wallet/crypto/trustapp/viewmodel/CreateAccountViewModel.java: -------------------------------------------------------------------------------- 1 | package com.wallet.crypto.trustapp.viewmodel; 2 | 3 | public class CreateAccountViewModel extends BaseViewModel { 4 | 5 | public CreateAccountViewModel() { 6 | 7 | } 8 | } 9 | -------------------------------------------------------------------------------- /app/src/main/java/com/wallet/crypto/trustapp/viewmodel/CreateAccountViewModelFactory.java: -------------------------------------------------------------------------------- 1 | package com.wallet.crypto.trustapp.viewmodel; 2 | 3 | 4 | import android.arch.lifecycle.ViewModel; 5 | import android.arch.lifecycle.ViewModelProvider; 6 | import android.support.annotation.NonNull; 7 | 8 | public class CreateAccountViewModelFactory implements ViewModelProvider.Factory { 9 | 10 | public CreateAccountViewModelFactory() { } 11 | 12 | @NonNull 13 | @Override 14 | public T create(@NonNull Class modelClass) { 15 | return (T) new CreateAccountViewModel(); 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /app/src/main/java/com/wallet/crypto/trustapp/viewmodel/GasSettingsViewModel.java: -------------------------------------------------------------------------------- 1 | package com.wallet.crypto.trustapp.viewmodel; 2 | 3 | 4 | import android.arch.lifecycle.LiveData; 5 | import android.arch.lifecycle.MutableLiveData; 6 | 7 | import com.wallet.crypto.trustapp.entity.NetworkInfo; 8 | import com.wallet.crypto.trustapp.interact.FindDefaultNetworkInteract; 9 | 10 | import java.math.BigInteger; 11 | 12 | public class GasSettingsViewModel extends BaseViewModel { 13 | 14 | public static final int SET_GAS_SETTINGS = 1; 15 | 16 | private FindDefaultNetworkInteract findDefaultNetworkInteract; 17 | 18 | private MutableLiveData gasPrice = new MutableLiveData<>(); 19 | private MutableLiveData gasLimit = new MutableLiveData<>(); 20 | private MutableLiveData defaultNetwork = new MutableLiveData<>(); 21 | 22 | public GasSettingsViewModel(FindDefaultNetworkInteract findDefaultNetworkInteract) { 23 | this.findDefaultNetworkInteract = findDefaultNetworkInteract; 24 | gasPrice.setValue(new BigInteger("0")); 25 | gasLimit.setValue(new BigInteger("0")); 26 | } 27 | 28 | public void prepare() { 29 | findDefaultNetworkInteract 30 | .find() 31 | .subscribe(this::onDefaultNetwork, this::onError); 32 | } 33 | 34 | public MutableLiveData gasPrice() { 35 | return gasPrice; 36 | } 37 | 38 | public MutableLiveData gasLimit() { 39 | return gasLimit; 40 | } 41 | 42 | public LiveData defaultNetwork() { 43 | return defaultNetwork; 44 | } 45 | 46 | private void onDefaultNetwork(NetworkInfo networkInfo) { 47 | defaultNetwork.setValue(networkInfo); 48 | } 49 | 50 | public BigInteger networkFee() { 51 | return gasPrice.getValue().multiply(gasLimit.getValue()); 52 | } 53 | 54 | } 55 | -------------------------------------------------------------------------------- /app/src/main/java/com/wallet/crypto/trustapp/viewmodel/GasSettingsViewModelFactory.java: -------------------------------------------------------------------------------- 1 | package com.wallet.crypto.trustapp.viewmodel; 2 | 3 | 4 | import android.arch.lifecycle.ViewModel; 5 | import android.arch.lifecycle.ViewModelProvider; 6 | import android.support.annotation.NonNull; 7 | 8 | import com.wallet.crypto.trustapp.interact.FindDefaultNetworkInteract; 9 | 10 | public class GasSettingsViewModelFactory implements ViewModelProvider.Factory { 11 | 12 | FindDefaultNetworkInteract findDefaultNetworkInteract; 13 | 14 | public GasSettingsViewModelFactory(FindDefaultNetworkInteract findDefaultNetworkInteract) { 15 | this.findDefaultNetworkInteract = findDefaultNetworkInteract; 16 | } 17 | 18 | @NonNull 19 | @Override 20 | public T create(@NonNull Class modelClass) { 21 | return (T) new GasSettingsViewModel(findDefaultNetworkInteract); 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /app/src/main/java/com/wallet/crypto/trustapp/viewmodel/ImportWalletViewModel.java: -------------------------------------------------------------------------------- 1 | package com.wallet.crypto.trustapp.viewmodel; 2 | 3 | import android.arch.lifecycle.LiveData; 4 | import android.arch.lifecycle.MutableLiveData; 5 | 6 | import com.wallet.crypto.trustapp.entity.Wallet; 7 | import com.wallet.crypto.trustapp.interact.ImportWalletInteract; 8 | import com.wallet.crypto.trustapp.ui.widget.OnImportKeystoreListener; 9 | import com.wallet.crypto.trustapp.ui.widget.OnImportPrivateKeyListener; 10 | 11 | public class ImportWalletViewModel extends BaseViewModel implements OnImportKeystoreListener, OnImportPrivateKeyListener { 12 | 13 | private final ImportWalletInteract importWalletInteract; 14 | private final MutableLiveData wallet = new MutableLiveData<>(); 15 | 16 | ImportWalletViewModel(ImportWalletInteract importWalletInteract) { 17 | this.importWalletInteract = importWalletInteract; 18 | } 19 | 20 | @Override 21 | public void onKeystore(String keystore, String password) { 22 | progress.postValue(true); 23 | importWalletInteract 24 | .importKeystore(keystore, password) 25 | .subscribe(this::onWallet, this::onError); 26 | } 27 | 28 | @Override 29 | public void onPrivateKey(String key) { 30 | progress.postValue(true); 31 | importWalletInteract 32 | .importPrivateKey(key) 33 | .subscribe(this::onWallet, this::onError); 34 | } 35 | 36 | public LiveData wallet() { 37 | return wallet; 38 | } 39 | 40 | private void onWallet(Wallet wallet) { 41 | progress.postValue(false); 42 | this.wallet.postValue(wallet); 43 | } 44 | } 45 | -------------------------------------------------------------------------------- /app/src/main/java/com/wallet/crypto/trustapp/viewmodel/ImportWalletViewModelFactory.java: -------------------------------------------------------------------------------- 1 | package com.wallet.crypto.trustapp.viewmodel; 2 | 3 | import android.arch.lifecycle.ViewModel; 4 | import android.arch.lifecycle.ViewModelProvider; 5 | import android.support.annotation.NonNull; 6 | 7 | import com.wallet.crypto.trustapp.interact.ImportWalletInteract; 8 | 9 | public class ImportWalletViewModelFactory implements ViewModelProvider.Factory { 10 | 11 | private final ImportWalletInteract importWalletInteract; 12 | 13 | public ImportWalletViewModelFactory(ImportWalletInteract importWalletInteract) { 14 | this.importWalletInteract = importWalletInteract; 15 | } 16 | 17 | @NonNull 18 | @Override 19 | public T create(@NonNull Class modelClass) { 20 | return (T) new ImportWalletViewModel(importWalletInteract); 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /app/src/main/java/com/wallet/crypto/trustapp/viewmodel/SendViewModel.java: -------------------------------------------------------------------------------- 1 | package com.wallet.crypto.trustapp.viewmodel; 2 | 3 | import android.arch.lifecycle.MutableLiveData; 4 | import android.content.Context; 5 | 6 | import com.wallet.crypto.trustapp.entity.Transaction; 7 | import com.wallet.crypto.trustapp.entity.Wallet; 8 | import com.wallet.crypto.trustapp.router.ConfirmationRouter; 9 | 10 | import java.math.BigInteger; 11 | 12 | public class SendViewModel extends BaseViewModel { 13 | private final MutableLiveData defaultWallet = new MutableLiveData<>(); 14 | private final MutableLiveData transaction = new MutableLiveData<>(); 15 | private final ConfirmationRouter confirmationRouter; 16 | 17 | SendViewModel(ConfirmationRouter confirmationRouter) { 18 | this.confirmationRouter = confirmationRouter; 19 | } 20 | 21 | public void openConfirmation(Context context, String to, BigInteger amount, String contractAddress, int decimals, String symbol, boolean sendingTokens) { 22 | confirmationRouter.open(context, to, amount, contractAddress, decimals, symbol, sendingTokens); 23 | } 24 | } 25 | -------------------------------------------------------------------------------- /app/src/main/java/com/wallet/crypto/trustapp/viewmodel/SendViewModelFactory.java: -------------------------------------------------------------------------------- 1 | package com.wallet.crypto.trustapp.viewmodel; 2 | 3 | import android.arch.lifecycle.ViewModel; 4 | import android.arch.lifecycle.ViewModelProvider; 5 | 6 | import com.wallet.crypto.trustapp.router.ConfirmationRouter; 7 | 8 | import io.reactivex.annotations.NonNull; 9 | 10 | public class SendViewModelFactory implements ViewModelProvider.Factory { 11 | 12 | private final ConfirmationRouter confirmationRouter; 13 | 14 | public SendViewModelFactory(ConfirmationRouter confirmationRouter) { 15 | this.confirmationRouter = confirmationRouter; 16 | } 17 | 18 | @NonNull 19 | @Override 20 | public T create(@NonNull Class modelClass) { 21 | return (T) new SendViewModel(confirmationRouter); 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /app/src/main/java/com/wallet/crypto/trustapp/viewmodel/SplashViewModel.java: -------------------------------------------------------------------------------- 1 | package com.wallet.crypto.trustapp.viewmodel; 2 | 3 | import android.arch.lifecycle.LiveData; 4 | import android.arch.lifecycle.MutableLiveData; 5 | import android.arch.lifecycle.ViewModel; 6 | 7 | import com.wallet.crypto.trustapp.entity.Wallet; 8 | import com.wallet.crypto.trustapp.interact.FetchWalletsInteract; 9 | 10 | public class SplashViewModel extends ViewModel { 11 | private final FetchWalletsInteract fetchWalletsInteract; 12 | private MutableLiveData wallets = new MutableLiveData<>(); 13 | 14 | SplashViewModel(FetchWalletsInteract fetchWalletsInteract) { 15 | this.fetchWalletsInteract = fetchWalletsInteract; 16 | 17 | fetchWalletsInteract 18 | .fetch() 19 | .subscribe(wallets::postValue, this::onError); 20 | } 21 | 22 | private void onError(Throwable throwable) { 23 | wallets.postValue(new Wallet[0]); 24 | } 25 | 26 | public LiveData wallets() { 27 | return wallets; 28 | } 29 | } 30 | -------------------------------------------------------------------------------- /app/src/main/java/com/wallet/crypto/trustapp/viewmodel/SplashViewModelFactory.java: -------------------------------------------------------------------------------- 1 | package com.wallet.crypto.trustapp.viewmodel; 2 | 3 | import android.arch.lifecycle.ViewModel; 4 | import android.arch.lifecycle.ViewModelProvider; 5 | import android.support.annotation.NonNull; 6 | 7 | import com.wallet.crypto.trustapp.interact.FetchWalletsInteract; 8 | 9 | public class SplashViewModelFactory implements ViewModelProvider.Factory { 10 | 11 | private final FetchWalletsInteract fetchWalletsInteract; 12 | 13 | public SplashViewModelFactory(FetchWalletsInteract fetchWalletsInteract) { 14 | this.fetchWalletsInteract = fetchWalletsInteract; 15 | } 16 | @NonNull 17 | @Override 18 | public T create(@NonNull Class modelClass) { 19 | return (T) new SplashViewModel(fetchWalletsInteract); 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /app/src/main/java/com/wallet/crypto/trustapp/viewmodel/TokensViewModelFactory.java: -------------------------------------------------------------------------------- 1 | package com.wallet.crypto.trustapp.viewmodel; 2 | 3 | import android.arch.lifecycle.ViewModel; 4 | import android.arch.lifecycle.ViewModelProvider; 5 | import android.support.annotation.NonNull; 6 | 7 | import com.wallet.crypto.trustapp.interact.FetchTokensInteract; 8 | import com.wallet.crypto.trustapp.interact.FindDefaultNetworkInteract; 9 | import com.wallet.crypto.trustapp.router.AddTokenRouter; 10 | import com.wallet.crypto.trustapp.router.SendTokenRouter; 11 | import com.wallet.crypto.trustapp.router.TransactionsRouter; 12 | 13 | public class TokensViewModelFactory implements ViewModelProvider.Factory { 14 | 15 | private final FindDefaultNetworkInteract findDefaultNetworkInteract; 16 | private final FetchTokensInteract fetchTokensInteract; 17 | private final AddTokenRouter addTokenRouter; 18 | private final SendTokenRouter sendTokenRouter; 19 | private final TransactionsRouter transactionsRouter; 20 | 21 | public TokensViewModelFactory(FindDefaultNetworkInteract findDefaultNetworkInteract, 22 | FetchTokensInteract fetchTokensInteract, 23 | AddTokenRouter addTokenRouter, 24 | SendTokenRouter sendTokenRouter, 25 | TransactionsRouter transactionsRouter) { 26 | this.findDefaultNetworkInteract = findDefaultNetworkInteract; 27 | this.fetchTokensInteract = fetchTokensInteract; 28 | this.addTokenRouter = addTokenRouter; 29 | this.sendTokenRouter = sendTokenRouter; 30 | this.transactionsRouter = transactionsRouter; 31 | } 32 | 33 | @NonNull 34 | @Override 35 | public T create(@NonNull Class modelClass) { 36 | return (T) new TokensViewModel( 37 | findDefaultNetworkInteract, 38 | fetchTokensInteract, 39 | addTokenRouter, 40 | sendTokenRouter, 41 | transactionsRouter); 42 | } 43 | } 44 | -------------------------------------------------------------------------------- /app/src/main/java/com/wallet/crypto/trustapp/viewmodel/TransactionDetailViewModelFactory.java: -------------------------------------------------------------------------------- 1 | package com.wallet.crypto.trustapp.viewmodel; 2 | 3 | import android.arch.lifecycle.ViewModel; 4 | import android.arch.lifecycle.ViewModelProvider; 5 | import android.support.annotation.NonNull; 6 | 7 | import com.wallet.crypto.trustapp.interact.FindDefaultNetworkInteract; 8 | import com.wallet.crypto.trustapp.interact.FindDefaultWalletInteract; 9 | import com.wallet.crypto.trustapp.router.ExternalBrowserRouter; 10 | 11 | public class TransactionDetailViewModelFactory implements ViewModelProvider.Factory { 12 | 13 | private final FindDefaultNetworkInteract findDefaultNetworkInteract; 14 | private final FindDefaultWalletInteract findDefaultWalletInteract; 15 | private final ExternalBrowserRouter externalBrowserRouter; 16 | 17 | public TransactionDetailViewModelFactory( 18 | FindDefaultNetworkInteract findDefaultNetworkInteract, 19 | FindDefaultWalletInteract findDefaultWalletInteract, 20 | ExternalBrowserRouter externalBrowserRouter) { 21 | this.findDefaultNetworkInteract = findDefaultNetworkInteract; 22 | this.findDefaultWalletInteract = findDefaultWalletInteract; 23 | this.externalBrowserRouter = externalBrowserRouter; 24 | } 25 | 26 | @NonNull 27 | @Override 28 | public T create(@NonNull Class modelClass) { 29 | return (T) new TransactionDetailViewModel( 30 | findDefaultNetworkInteract, 31 | findDefaultWalletInteract, 32 | externalBrowserRouter); 33 | } 34 | } 35 | -------------------------------------------------------------------------------- /app/src/main/java/com/wallet/crypto/trustapp/widget/BackupView.java: -------------------------------------------------------------------------------- 1 | package com.wallet.crypto.trustapp.widget; 2 | 3 | import android.content.Context; 4 | import android.support.annotation.NonNull; 5 | import android.view.LayoutInflater; 6 | import android.widget.EditText; 7 | import android.widget.FrameLayout; 8 | 9 | import com.wallet.crypto.trustapp.R; 10 | 11 | public class BackupView extends FrameLayout { 12 | private EditText password; 13 | 14 | public BackupView(@NonNull Context context) { 15 | super(context); 16 | 17 | init(); 18 | } 19 | 20 | private void init() { 21 | LayoutInflater.from(getContext()) 22 | .inflate(R.layout.layout_dialog_backup, this, true); 23 | password = findViewById(R.id.password); 24 | } 25 | 26 | public String getPassword() { 27 | return password.getText().toString(); 28 | } 29 | 30 | public void showKeyBoard() { 31 | password.requestFocus(); 32 | } 33 | 34 | @Override 35 | protected void onAttachedToWindow() { 36 | super.onAttachedToWindow(); 37 | showKeyBoard(); 38 | } 39 | } 40 | -------------------------------------------------------------------------------- /app/src/main/java/com/wallet/crypto/trustapp/widget/EmptyTransactionsView.java: -------------------------------------------------------------------------------- 1 | package com.wallet.crypto.trustapp.widget; 2 | 3 | import android.content.Context; 4 | import android.support.annotation.NonNull; 5 | import android.view.LayoutInflater; 6 | import android.widget.FrameLayout; 7 | 8 | import com.wallet.crypto.trustapp.R; 9 | import com.wallet.crypto.trustapp.entity.NetworkInfo; 10 | 11 | public class EmptyTransactionsView extends FrameLayout { 12 | 13 | public EmptyTransactionsView(@NonNull Context context, OnClickListener onClickListener) { 14 | super(context); 15 | 16 | LayoutInflater.from(getContext()) 17 | .inflate(R.layout.layout_empty_transactions, this, true); 18 | 19 | findViewById(R.id.action_buy).setOnClickListener(onClickListener); 20 | } 21 | 22 | public void setNetworkInfo(NetworkInfo networkInfo) { 23 | if (networkInfo.isMainNetwork) { 24 | findViewById(R.id.action_buy).setVisibility(VISIBLE); 25 | } else { 26 | findViewById(R.id.action_buy).setVisibility(GONE); 27 | } 28 | } 29 | } 30 | -------------------------------------------------------------------------------- /app/src/main/res/drawable-hdpi/ic_action_deposit.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/trustwallet/trust-wallet-android-source/4d9ad8315aa4e5f5232e91be5bf1156770870e44/app/src/main/res/drawable-hdpi/ic_action_deposit.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-hdpi/ic_facebook.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/trustwallet/trust-wallet-android-source/4d9ad8315aa4e5f5232e91be5bf1156770870e44/app/src/main/res/drawable-hdpi/ic_facebook.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-hdpi/settings_rpc_server.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/trustwallet/trust-wallet-android-source/4d9ad8315aa4e5f5232e91be5bf1156770870e44/app/src/main/res/drawable-hdpi/settings_rpc_server.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-hdpi/token_icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/trustwallet/trust-wallet-android-source/4d9ad8315aa4e5f5232e91be5bf1156770870e44/app/src/main/res/drawable-hdpi/token_icon.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-mdpi/ic_action_deposit.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/trustwallet/trust-wallet-android-source/4d9ad8315aa4e5f5232e91be5bf1156770870e44/app/src/main/res/drawable-mdpi/ic_action_deposit.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-mdpi/ic_facebook.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/trustwallet/trust-wallet-android-source/4d9ad8315aa4e5f5232e91be5bf1156770870e44/app/src/main/res/drawable-mdpi/ic_facebook.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-mdpi/ic_share_white_24dp.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | 10 | -------------------------------------------------------------------------------- /app/src/main/res/drawable-mdpi/settings_rpc_server.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/trustwallet/trust-wallet-android-source/4d9ad8315aa4e5f5232e91be5bf1156770870e44/app/src/main/res/drawable-mdpi/settings_rpc_server.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-mdpi/token_icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/trustwallet/trust-wallet-android-source/4d9ad8315aa4e5f5232e91be5bf1156770870e44/app/src/main/res/drawable-mdpi/token_icon.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-nodpi/no_transactions_mascot.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/trustwallet/trust-wallet-android-source/4d9ad8315aa4e5f5232e91be5bf1156770870e44/app/src/main/res/drawable-nodpi/no_transactions_mascot.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-nodpi/onboarding_erc20.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/trustwallet/trust-wallet-android-source/4d9ad8315aa4e5f5232e91be5bf1156770870e44/app/src/main/res/drawable-nodpi/onboarding_erc20.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-nodpi/settings_facebook.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/trustwallet/trust-wallet-android-source/4d9ad8315aa4e5f5232e91be5bf1156770870e44/app/src/main/res/drawable-nodpi/settings_facebook.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-v21/bg_ripple_primary_color.xml: -------------------------------------------------------------------------------- 1 | 5 | 6 | 7 | 8 | 9 | 10 | -------------------------------------------------------------------------------- /app/src/main/res/drawable-xhdpi/ic_action_deposit.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/trustwallet/trust-wallet-android-source/4d9ad8315aa4e5f5232e91be5bf1156770870e44/app/src/main/res/drawable-xhdpi/ic_action_deposit.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xhdpi/ic_facebook.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/trustwallet/trust-wallet-android-source/4d9ad8315aa4e5f5232e91be5bf1156770870e44/app/src/main/res/drawable-xhdpi/ic_facebook.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xhdpi/settings_rpc_server.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/trustwallet/trust-wallet-android-source/4d9ad8315aa4e5f5232e91be5bf1156770870e44/app/src/main/res/drawable-xhdpi/settings_rpc_server.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xhdpi/token_icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/trustwallet/trust-wallet-android-source/4d9ad8315aa4e5f5232e91be5bf1156770870e44/app/src/main/res/drawable-xhdpi/token_icon.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xxhdpi/ic_action_deposit.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/trustwallet/trust-wallet-android-source/4d9ad8315aa4e5f5232e91be5bf1156770870e44/app/src/main/res/drawable-xxhdpi/ic_action_deposit.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xxhdpi/ic_facebook.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/trustwallet/trust-wallet-android-source/4d9ad8315aa4e5f5232e91be5bf1156770870e44/app/src/main/res/drawable-xxhdpi/ic_facebook.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xxhdpi/settings_rpc_server.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/trustwallet/trust-wallet-android-source/4d9ad8315aa4e5f5232e91be5bf1156770870e44/app/src/main/res/drawable-xxhdpi/settings_rpc_server.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xxhdpi/token_icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/trustwallet/trust-wallet-android-source/4d9ad8315aa4e5f5232e91be5bf1156770870e44/app/src/main/res/drawable-xxhdpi/token_icon.png -------------------------------------------------------------------------------- /app/src/main/res/drawable/bg_ripple_primary_color.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_add_black_24dp.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | 10 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_add_circle_black_24dp.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | 10 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_add_white_24dp.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | 10 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_arrow_downward_black_24dp.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | 10 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_arrow_upward_black_24dp.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | 10 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_attach_money_white_24dp.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | 10 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_autorenew_black_24dp.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | 10 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_backup_black_24dp.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | 10 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_call_received_white_24dp.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | 10 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_chevron_right_black_24dp.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | 10 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_code_black_24dp.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | 10 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_content_paste_black_24dp.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | 10 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_dashboard_black_24dp.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | 10 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_delete_forever_black_24dp.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | 10 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_error_outline_black_24dp.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | 10 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_file_download_black_24dp.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | 10 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_home_black_24dp.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | 10 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_import_export_black_24dp.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | 10 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_notifications_black_24dp.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | 10 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_send_white_24dp.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | 10 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_settings_white_24dp.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | 10 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_share_black_24dp.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | 10 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_swap_horiz_white_24dp.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | 10 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_warning_black_24dp.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | 10 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/splash_background.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 5 | 6 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /app/src/main/res/font/roboto_bolt.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/trustwallet/trust-wallet-android-source/4d9ad8315aa4e5f5232e91be5bf1156770870e44/app/src/main/res/font/roboto_bolt.ttf -------------------------------------------------------------------------------- /app/src/main/res/font/roboto_regular.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/trustwallet/trust-wallet-android-source/4d9ad8315aa4e5f5232e91be5bf1156770870e44/app/src/main/res/font/roboto_regular.ttf -------------------------------------------------------------------------------- /app/src/main/res/layout/account_list_content.xml: -------------------------------------------------------------------------------- 1 | 2 | 9 | 10 | 16 | 17 | 31 | 32 | 40 | 41 | 42 | -------------------------------------------------------------------------------- /app/src/main/res/layout/activity_import_wallet.xml: -------------------------------------------------------------------------------- 1 | 2 | 10 | 11 | 17 | -------------------------------------------------------------------------------- /app/src/main/res/layout/activity_my_address.xml: -------------------------------------------------------------------------------- 1 | 2 | 9 | 10 | 17 | 25 | 32 | 40 |