├── .gitignore ├── LICENCE ├── README.md ├── add_precommit_git_hook.sh ├── app ├── .gitignore ├── README.md ├── api-keys.gradle ├── build.gradle ├── dependencies.gradle ├── gradle.properties ├── proguard-rules.pro └── src │ ├── androidTest │ └── java │ │ └── com │ │ └── coinbase │ │ └── sample │ │ └── ApplicationTest.java │ └── main │ ├── AndroidManifest.xml │ ├── java │ └── com │ │ └── coinbase │ │ └── sample │ │ ├── AccountsActivity.kt │ │ ├── AuthInfoActivity.kt │ │ ├── CurrenciesActivity.kt │ │ ├── Extensions.kt │ │ ├── LoginActivity.kt │ │ ├── MainActivity.kt │ │ ├── MainApplication.kt │ │ ├── PaymentMethodsActivity.kt │ │ ├── PricesActivity.kt │ │ └── TransactionsActivity.kt │ └── res │ ├── layout │ ├── activity_accounts.xml │ ├── activity_auth_info.xml │ ├── activity_currencies.xml │ ├── activity_data.xml │ ├── activity_login.xml │ ├── activity_main.xml │ ├── activity_payment_methods.xml │ ├── activity_prices.xml │ ├── activity_transactions.xml │ ├── item_account.xml │ ├── item_currency.xml │ ├── item_payment_method.xml │ ├── item_price.xml │ ├── item_progress.xml │ └── item_transaction.xml │ ├── menu │ └── activity_main.xml │ ├── mipmap-hdpi │ └── ic_launcher.png │ ├── mipmap-mdpi │ └── ic_launcher.png │ ├── mipmap-xhdpi │ └── ic_launcher.png │ ├── mipmap-xxhdpi │ └── ic_launcher.png │ ├── mipmap-xxxhdpi │ └── ic_launcher.png │ ├── values-w820dp │ └── dimens.xml │ └── values │ ├── colors.xml │ ├── dimens.xml │ ├── strings.xml │ └── styles.xml ├── build.gradle ├── coinbase-java ├── .gitignore ├── LICENSE ├── build.gradle ├── dependencies.gradle ├── pom.xml ├── proguard-rules.pro ├── publish.sh ├── src │ ├── main │ │ ├── AndroidManifest.xml │ │ ├── java │ │ │ └── com │ │ │ │ └── coinbase │ │ │ │ ├── ApiConstants.java │ │ │ │ ├── AuthorizationRequest.java │ │ │ │ ├── CallbackVerifier.java │ │ │ │ ├── CallbackVerifierImpl.java │ │ │ │ ├── Coinbase.java │ │ │ │ ├── CoinbaseBuilder.java │ │ │ │ ├── CoinbaseResponse.java │ │ │ │ ├── CoinbaseSSL.java │ │ │ │ ├── PageOrder.java │ │ │ │ ├── PagedResponse.java │ │ │ │ ├── PaginationParams.java │ │ │ │ ├── Scope.java │ │ │ │ ├── errors │ │ │ │ ├── CoinbaseErrorResponse.java │ │ │ │ ├── CoinbaseException.java │ │ │ │ ├── CoinbaseOAuthException.java │ │ │ │ ├── Error.java │ │ │ │ ├── ErrorCodes.java │ │ │ │ └── OAuthError.java │ │ │ │ ├── network │ │ │ │ ├── ApiCall.java │ │ │ │ ├── ApiCallAdapterFactory.java │ │ │ │ └── Callback.java │ │ │ │ └── resources │ │ │ │ ├── ExpandField.java │ │ │ │ ├── ExpandUtils.java │ │ │ │ ├── accounts │ │ │ │ ├── Account.java │ │ │ │ ├── AccountResource.java │ │ │ │ ├── AccountsApi.java │ │ │ │ ├── AccountsApiRx.java │ │ │ │ ├── Currency.java │ │ │ │ └── UpdateAccountRequest.java │ │ │ │ ├── addresses │ │ │ │ ├── Address.java │ │ │ │ ├── AddressResource.java │ │ │ │ ├── AddressesApi.java │ │ │ │ ├── AddressesApiRx.java │ │ │ │ └── GenerateAddressRequest.java │ │ │ │ ├── auth │ │ │ │ ├── AccessToken.java │ │ │ │ ├── AuthApi.java │ │ │ │ ├── AuthApiRx.java │ │ │ │ ├── AuthResource.java │ │ │ │ ├── GetTokensRequest.java │ │ │ │ ├── RefreshTokenRequest.java │ │ │ │ ├── RevokeTokenRequest.java │ │ │ │ └── RevokeTokenResponse.java │ │ │ │ ├── base │ │ │ │ ├── BaseResource.java │ │ │ │ ├── DynamicResource.java │ │ │ │ ├── DynamicResourceDeserializer.java │ │ │ │ ├── ResourceTypeDeserializer.java │ │ │ │ └── UnknownResource.java │ │ │ │ ├── buys │ │ │ │ ├── Buy.java │ │ │ │ └── BuysResource.java │ │ │ │ ├── currencies │ │ │ │ ├── CurrenciesApi.java │ │ │ │ ├── CurrenciesApiRx.java │ │ │ │ ├── CurrenciesResource.java │ │ │ │ └── Currency.java │ │ │ │ ├── deposits │ │ │ │ ├── Deposit.java │ │ │ │ ├── DepositsResource.java │ │ │ │ └── PlaceDepositBody.java │ │ │ │ ├── paymentmethods │ │ │ │ ├── PaymentMethodResource.java │ │ │ │ ├── PaymentMethodsApi.java │ │ │ │ ├── PaymentMethodsApiRx.java │ │ │ │ └── models │ │ │ │ │ ├── Limit.java │ │ │ │ │ ├── Limits.java │ │ │ │ │ ├── NextRequirement.java │ │ │ │ │ └── PaymentMethod.java │ │ │ │ ├── prices │ │ │ │ ├── Price.java │ │ │ │ ├── PricesApi.java │ │ │ │ ├── PricesApiRx.java │ │ │ │ └── PricesResource.java │ │ │ │ ├── rates │ │ │ │ ├── ExchangeRates.java │ │ │ │ ├── ExchangeRatesApi.java │ │ │ │ ├── ExchangeRatesApiRx.java │ │ │ │ └── ExchangeRatesResource.java │ │ │ │ ├── sells │ │ │ │ ├── Sell.java │ │ │ │ └── SellsResource.java │ │ │ │ ├── time │ │ │ │ ├── Time.java │ │ │ │ ├── TimeApi.java │ │ │ │ ├── TimeApiRx.java │ │ │ │ └── TimeResource.java │ │ │ │ ├── trades │ │ │ │ ├── PlaceTradeOrderBody.java │ │ │ │ ├── PlaceTradeOrderBodySerializer.java │ │ │ │ ├── Trade.java │ │ │ │ ├── TradesApi.java │ │ │ │ ├── TradesApiRx.java │ │ │ │ ├── TradesDeserializer.java │ │ │ │ ├── TradesResource.java │ │ │ │ └── TransferOrderBody.java │ │ │ │ ├── transactions │ │ │ │ ├── Application.java │ │ │ │ ├── MoneyHash.java │ │ │ │ ├── MoneyRequest.java │ │ │ │ ├── Network.java │ │ │ │ ├── SendMoneyRequest.java │ │ │ │ ├── Transaction.java │ │ │ │ ├── TransactionRequest.java │ │ │ │ ├── TransactionsApi.java │ │ │ │ ├── TransactionsApiRx.java │ │ │ │ ├── TransactionsResource.java │ │ │ │ └── entities │ │ │ │ │ ├── AddressInfo.java │ │ │ │ │ ├── CryptoAddress.java │ │ │ │ │ ├── CryptoNetwork.java │ │ │ │ │ └── EmailResource.java │ │ │ │ ├── users │ │ │ │ ├── AuthInfo.java │ │ │ │ ├── AuthUser.java │ │ │ │ ├── Country.java │ │ │ │ ├── UpdateUserRequest.java │ │ │ │ ├── User.java │ │ │ │ ├── UserResource.java │ │ │ │ ├── UsersApi.java │ │ │ │ └── UsersApiRx.java │ │ │ │ └── withdrawals │ │ │ │ ├── PlaceWithdrawalBody.java │ │ │ │ ├── Withdrawal.java │ │ │ │ └── WithdrawalsResource.java │ │ ├── res │ │ │ └── values │ │ │ │ └── strings.xml │ │ └── resources │ │ │ ├── com │ │ │ └── coinbase │ │ │ │ └── api │ │ │ │ ├── ca-coinbase.bks │ │ │ │ ├── ca-coinbase.jks │ │ │ │ └── coinbase-callback.pub.der │ │ │ └── org │ │ │ └── joda │ │ │ └── money │ │ │ └── MoneyDataExtension.csv │ └── test │ │ ├── java │ │ └── com │ │ │ └── coinbase │ │ │ ├── AuthorizationRequestTest.java │ │ │ ├── CoinbaseAuthMethodsTest.java │ │ │ ├── CoinbaseAuthenticationTest.java │ │ │ ├── CoinbaseCachingTest.java │ │ │ ├── CustomCryptoNetworkAddressTest.java │ │ │ ├── CustomCurrencyAddressTest.java │ │ │ ├── JsonSerializationTest.java │ │ │ ├── PaginationParamsTest.java │ │ │ ├── TokenAutorefreshTest.java │ │ │ ├── resources │ │ │ ├── accounts │ │ │ │ ├── AccountCurrencyParsingTest.java │ │ │ │ └── AccountResourceTests.java │ │ │ ├── addresses │ │ │ │ └── AddressResourceTests.java │ │ │ ├── base │ │ │ │ └── DeserializerTest.java │ │ │ ├── buys │ │ │ │ ├── BuysResourceTests.java │ │ │ │ └── PlaceBuyOrderRequestTests.java │ │ │ ├── currencies │ │ │ │ └── CurrenciesResourceTest.java │ │ │ ├── deposits │ │ │ │ └── DepositsResourceTests.java │ │ │ ├── paymentmethods │ │ │ │ └── PaymentMethodResourceTest.java │ │ │ ├── prices │ │ │ │ ├── PriceResourceTest.java │ │ │ │ └── PricesResourceTest.java │ │ │ ├── rates │ │ │ │ └── ExchangeRatesResourceTest.java │ │ │ ├── sells │ │ │ │ ├── PlaceSellOrderRequestTests.java │ │ │ │ └── SellsResourceTests.java │ │ │ ├── time │ │ │ │ └── TimeResourceTest.java │ │ │ ├── trades │ │ │ │ └── TradesTests.java │ │ │ ├── transactions │ │ │ │ ├── DynamicResourceTransactionsTest.java │ │ │ │ └── TransactionsResourceTests.java │ │ │ ├── users │ │ │ │ └── UsersResourceTest.java │ │ │ └── withdrawals │ │ │ │ └── WithdrawalsResourceTests.java │ │ │ └── util │ │ │ ├── CurrentThreadExecutorService.java │ │ │ ├── Resource.java │ │ │ ├── ResourceMethodTest.java │ │ │ └── ResourcePaginatedMethodTest.java │ │ └── resources │ │ ├── accounts │ │ ├── account.json │ │ ├── account_currency_obj.json │ │ ├── account_currency_string.json │ │ └── accounts_list.json │ │ ├── address │ │ ├── address.json │ │ ├── address_transactions.json │ │ └── addresses_list.json │ │ ├── auth │ │ ├── auth_info.json │ │ ├── auth_user.json │ │ ├── expired_token_error.json │ │ ├── get_tokens.json │ │ ├── oauth_error.json │ │ └── token_revoked_error.json │ │ ├── buys │ │ ├── commit_buy.json │ │ ├── list_buys.json │ │ ├── place_buy.json │ │ └── show_buy.json │ │ ├── data │ │ ├── buy_price.json │ │ ├── currencies.json │ │ ├── exchange_rates.json │ │ ├── sell_price.json │ │ ├── spot_price_btc_usd.json │ │ ├── spot_prices_usd.json │ │ └── time.json │ │ ├── deposits │ │ ├── commit_deposit.json │ │ ├── list_deposits.json │ │ ├── place_deposit.json │ │ └── show_deposit.json │ │ ├── email.json │ │ ├── empty.json │ │ ├── invalid_currency.json │ │ ├── invalid_date.json │ │ ├── invalid_scope_error.json │ │ ├── malformed.json │ │ ├── payment_methods │ │ ├── payment_method_by_id.json │ │ └── payment_methods.json │ │ ├── sells │ │ ├── commit_sell.json │ │ ├── list_sells.json │ │ ├── place_sell.json │ │ └── show_sell.json │ │ ├── transactions │ │ ├── list_transactions.json │ │ ├── request_money.json │ │ ├── send_money_confirmed.json │ │ ├── show_transaction.json │ │ ├── super_coin_network_transaction.json │ │ ├── super_coin_transaction.json │ │ ├── transaction_from_account.json │ │ ├── transaction_from_btc_address.json │ │ ├── transaction_from_btc_network.json │ │ ├── transaction_from_email.json │ │ ├── transaction_from_user.json │ │ ├── transaction_to_account.json │ │ ├── transaction_to_btc_address.json │ │ ├── transaction_to_email.json │ │ ├── transaction_to_user.json │ │ ├── transaction_with_application.json │ │ └── transfer_money.json │ │ ├── users │ │ ├── update_current_user.json │ │ └── user_by_id.json │ │ ├── validation_error.json │ │ └── withdrawals │ │ ├── commit_withdrawal.json │ │ ├── list_withdrawals.json │ │ ├── place_withdrawal.json │ │ └── show_withdrawal.json └── tools │ ├── rules-checkstyle.xml │ └── rules-pmd.xml ├── gradle.properties ├── gradle └── wrapper │ ├── gradle-wrapper.jar │ ├── gradle-wrapper.properties │ ├── gradlew │ └── gradlew.bat ├── gradlew ├── gradlew.bat └── settings.gradle /.gitignore: -------------------------------------------------------------------------------- 1 | *.class 2 | 3 | # Mobile Tools for Java (J2ME) 4 | .mtj.tmp/ 5 | 6 | # Package Files # 7 | # ignoring all jar files removes gradle-wrapper.jar from repo 8 | !gradle/wrapper/gradle-wrapper.jar 9 | *.war 10 | *.ear 11 | 12 | # virtual machine crash logs, see http://www.java.com/en/download/help/error_hotspot.xml 13 | hs_err_pid* 14 | 15 | # Eclipse 16 | .project 17 | .classpath 18 | .settings/ 19 | 20 | # Maven 21 | target/ 22 | pom.xml.asc 23 | pom.xml.tag 24 | pom.xml.releaseBackup 25 | pom.xml.next 26 | release.properties 27 | coverage-report 28 | bin/ 29 | 30 | #IntelliJ IDEA 31 | .idea/ 32 | *.iml 33 | 34 | .gradle 35 | /local.properties 36 | /.idea/workspace.xml 37 | /.idea/libraries 38 | .DS_Store 39 | /build 40 | /captures 41 | /gradle.properties 42 | coinbase-java/src/test/**/_*.java 43 | -------------------------------------------------------------------------------- /add_precommit_git_hook.sh: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | 3 | PRE_COMMIT_FILE_NAME=pre-commit 4 | HOOKS_PATH=.git/hooks 5 | PRE_COMMIT_FILE=${HOOKS_PATH}/${PRE_COMMIT_FILE_NAME} 6 | 7 | if [ -f ${PRE_COMMIT_FILE} ] ; then 8 | echo 'Pre-commit script already exists, deleting it' 9 | rm ${PRE_COMMIT_FILE} 10 | fi 11 | 12 | touch ${PRE_COMMIT_FILE} 13 | chmod 755 ${PRE_COMMIT_FILE} 14 | 15 | echo '#!/bin/sh 16 | 17 | echo "Running pre-commit script" 18 | 19 | ./gradlew :coinbase-java:codeQualityCheck' > ${PRE_COMMIT_FILE} 20 | 21 | echo 'Pre-commit script is set at '${PRE_COMMIT_FILE} -------------------------------------------------------------------------------- /app/.gitignore: -------------------------------------------------------------------------------- 1 | /build 2 | -------------------------------------------------------------------------------- /app/README.md: -------------------------------------------------------------------------------- 1 | ## Coinbase Sample app 2 | 3 | This is a sample application demonstrating features of Coinbase Android SDK. 4 | 5 | ### Getting started 6 | To start using this sample, log in to your Coinbase account, create a new [OAuth2 application](https://www.coinbase.com/oauth/applications/new) (or get an existing one), 7 | and grab `clientId`, `clientSecret` along with `redirectUri`. Replace stub values in `./api-keys.gradle` and you are ready to go! 8 | 9 | ```groovy 10 | ext.clientId = "" 11 | ext.clientSecret = "" 12 | ext.redirectUri = "" 13 | ``` 14 | 15 | ### Features 16 | 1. Authorization with browser or Custom Chrome Tab 17 | 2. User information and loading of avatar image (using Glide library) 18 | 3. List of user accounts 19 | 4. List of transaction on an account with pagination 20 | 5. List of supported currencies 21 | 6. Spot prices for selected currency and user native currency 22 | 7. List of payment methods 23 | 8. Authorization information 24 | 25 | The sample app uses authorization with read-only scopes for `user`, `account` and `transactions`. Loading data is implemented with both Rx and async callbacks. -------------------------------------------------------------------------------- /app/api-keys.gradle: -------------------------------------------------------------------------------- 1 | // Place your API keys here. 2 | 3 | // NOTE: Go to https://www.coinbase.com/oauth/applications/new 4 | // to create an application and generate your own keys 5 | 6 | // TODO Replace these with placeholders before publishing. 7 | ext.clientId = "f89d5f52d5bf6678b6449e0b6feb5100bf8e0ed3dc45f5f2be51fcea1232111c" 8 | ext.clientSecret = "9fbb237f4bc9c977f5e88895882b5677c4de395fe0996a6eedf912d4fee2b415" 9 | ext.redirectUri = "coinbase-sample-app://coinbase-oauth" 10 | -------------------------------------------------------------------------------- /app/dependencies.gradle: -------------------------------------------------------------------------------- 1 | ext { 2 | 3 | //region Versions 4 | androidSupport = '27.1.1' 5 | rxandroid = '2.0.1' 6 | picasso = '2.71828' 7 | constraintLayout = '1.1.2' 8 | //endregion 9 | 10 | //region Dependencies 11 | projectDependencies = [ 12 | rxandroid : "io.reactivex.rxjava2:rxandroid:$rxandroid", 13 | picasso : "com.squareup.picasso:picasso:$picasso" 14 | ] 15 | 16 | // android dependencies 17 | androidDependencies = [ 18 | androidSupport : "com.android.support:appcompat-v7:$androidSupport", 19 | recyclerView : "com.android.support:recyclerview-v7:$androidSupport", 20 | customtabs : "com.android.support:customtabs:$androidSupport", 21 | constraintLayout : "com.android.support.constraint:constraint-layout:$constraintLayout" 22 | ] 23 | //endregion 24 | } -------------------------------------------------------------------------------- /app/gradle.properties: -------------------------------------------------------------------------------- 1 | # Project-wide Gradle settings. 2 | 3 | # IDE (e.g. Android Studio) users: 4 | # Gradle settings configured through the IDE *will override* 5 | # any settings specified in this file. 6 | 7 | # For more details on how to configure your build environment visit 8 | # http://www.gradle.org/docs/current/userguide/build_environment.html 9 | 10 | # Specifies the JVM arguments used for the daemon process. 11 | # The setting is particularly useful for tweaking memory settings. 12 | # Default value: -Xmx10248m -XX:MaxPermSize=256m 13 | # org.gradle.jvmargs=-Xmx2048m -XX:MaxPermSize=512m -XX:+HeapDumpOnOutOfMemoryError -Dfile.encoding=UTF-8 14 | 15 | # When configured, Gradle will run in incubating parallel mode. 16 | # This option should only be used with decoupled projects. More details, visit 17 | # http://www.gradle.org/docs/current/userguide/multi_project_builds.html#sec:decoupled_projects 18 | # org.gradle.parallel=true 19 | org.gradle.configureondemand=false 20 | -------------------------------------------------------------------------------- /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 /Users/johnnychan/Library/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 | # OkHttp 20 | -dontwarn okio.** 21 | 22 | # Retrofit 23 | -dontwarn retrofit2.** 24 | 25 | -dontwarn okio.** 26 | -dontwarn com.squareup.okhttp3.** 27 | -keep class com.squareup.okhttp3.** { *; } 28 | -keep interface com.squareup.okhttp3.** { *; } 29 | -dontwarn javax.annotation.Nullable 30 | -dontwarn javax.annotation.ParametersAreNonnullByDefault 31 | -dontwarn okhttp3.internal.platform.* 32 | -------------------------------------------------------------------------------- /app/src/androidTest/java/com/coinbase/sample/ApplicationTest.java: -------------------------------------------------------------------------------- 1 | package com.coinbase.sample; 2 | 3 | import android.app.Application; 4 | import android.test.ApplicationTestCase; 5 | 6 | /** 7 | * Testing Fundamentals 8 | */ 9 | public class ApplicationTest extends ApplicationTestCase { 10 | public ApplicationTest() { 11 | super(Application.class); 12 | } 13 | } -------------------------------------------------------------------------------- /app/src/main/res/layout/activity_accounts.xml: -------------------------------------------------------------------------------- 1 | 16 | 17 | 22 | 23 | 27 | 28 | 40 | 41 | -------------------------------------------------------------------------------- /app/src/main/res/layout/activity_currencies.xml: -------------------------------------------------------------------------------- 1 | 16 | 17 | 22 | 23 | 27 | 28 | 40 | 41 | 42 | -------------------------------------------------------------------------------- /app/src/main/res/layout/activity_data.xml: -------------------------------------------------------------------------------- 1 | 16 | 17 | 26 | 27 | 33 | 34 |