From 375afee570ce11e1f9a08401f437767f376d5436 Mon Sep 17 00:00:00 2001 From: Tanguy Herbron Date: Thu, 15 Feb 2018 14:55:48 +0100 Subject: [PATCH] Several changes - List generation delay on currency choice activity reduced - Sort currencies by market order in currencies selection activity - Rewritten suggestion list - Add default icon when currencies' icons are missing - Optimize details storage - Enable Binance key input - Replacing Binance library by compiled jar from API's github - New main gradient - Fix crash when balance requests complete before details request --- app/build.gradle | 8 + .../coinfolio/ExampleInstrumentedTest.java | 2 +- .../Activities/CurrencyDetailsActivity.java | 2 - .../Activities/CurrencySelectionActivity.java | 97 ++++++-- .../coinfolio/Activities/HomeActivity.java | 56 +++-- .../Activities/RecordTransactionActivity.java | 2 +- .../Activities/SettingsActivity.java | 2 +- .../DataManagers/BalanceManager.java | 173 ++++++++++++-- .../DataManagers/CurrencyData/Currency.java | 1 - .../DataManagers/DatabaseManager.java | 2 - .../DataManagers/PreferencesManager.java | 21 ++ .../LayoutManagers/CurrencyAdapter.java | 27 ++- .../LayoutManagers/HomeLayoutGenerator.java | 13 - .../main/res/drawable/gradient_background.xml | 22 +- .../res/drawable/ic_details_black_24dp.xml | 2 +- .../res/drawable/ic_settings_black_24dp.xml | 2 +- .../drawable/ic_unfold_less_black_24dp.xml | 2 +- .../main/res/layout/activity_add_currency.xml | 18 +- .../res/layout/activity_currency_summary.xml | 13 +- .../layout/activity_record_transaction.xml | 1 - app/src/main/res/layout/cardview_currency.xml | 2 +- .../res/layout/content_currency_summary.xml | 93 ++++++-- app/src/main/res/values/colors.xml | 22 +- app/src/main/res/xml/pref_exchange.xml | 4 +- .../com/nauk/coinfolio/ExampleUnitTest.java | 2 +- gradle.properties | 1 + library/Binance/.gitignore | 131 ---------- library/Binance/CONTRIBUTING.md | 92 -------- library/Binance/README.md | 107 --------- library/Binance/UNLICENSE | 24 -- library/Binance/pom.xml | 83 ------- .../binance/deser/BalanceMapDeserializer.java | 29 --- .../exceptions/ClientErrorException.java | 27 --- .../httpclients/AsyncBinanceClient.java | 69 ------ .../httpclients/AsyncBinanceClientImpl.java | 223 ------------------ .../binance/httpclients/BinanceClient.java | 68 ------ .../httpclients/BinanceClientImpl.java | 90 ------- .../binance/inject/BinanceClientModule.java | 24 -- .../johnsiu/binance/models/Account.java | 98 -------- .../johnsiu/binance/models/CancelOrder.java | 38 --- .../github/johnsiu/binance/models/Depth.java | 61 ----- .../johnsiu/binance/models/ErrorDetails.java | 26 -- .../github/johnsiu/binance/models/Keys.java | 23 -- .../github/johnsiu/binance/models/Order.java | 55 ----- .../johnsiu/binance/models/OrderStatus.java | 86 ------- .../johnsiu/binance/models/PriceQuantity.java | 31 --- .../github/johnsiu/binance/models/Ticker.java | 137 ----------- .../httpclients/BinanceClientImplTest.java | 87 ------- libs/binance-api.jar | Bin 0 -> 159834 bytes 49 files changed, 447 insertions(+), 1752 deletions(-) delete mode 100644 library/Binance/.gitignore delete mode 100644 library/Binance/CONTRIBUTING.md delete mode 100644 library/Binance/README.md delete mode 100644 library/Binance/UNLICENSE delete mode 100644 library/Binance/pom.xml delete mode 100644 library/Binance/src/main/java/com/github/johnsiu/binance/deser/BalanceMapDeserializer.java delete mode 100644 library/Binance/src/main/java/com/github/johnsiu/binance/exceptions/ClientErrorException.java delete mode 100644 library/Binance/src/main/java/com/github/johnsiu/binance/httpclients/AsyncBinanceClient.java delete mode 100644 library/Binance/src/main/java/com/github/johnsiu/binance/httpclients/AsyncBinanceClientImpl.java delete mode 100644 library/Binance/src/main/java/com/github/johnsiu/binance/httpclients/BinanceClient.java delete mode 100644 library/Binance/src/main/java/com/github/johnsiu/binance/httpclients/BinanceClientImpl.java delete mode 100644 library/Binance/src/main/java/com/github/johnsiu/binance/inject/BinanceClientModule.java delete mode 100644 library/Binance/src/main/java/com/github/johnsiu/binance/models/Account.java delete mode 100644 library/Binance/src/main/java/com/github/johnsiu/binance/models/CancelOrder.java delete mode 100644 library/Binance/src/main/java/com/github/johnsiu/binance/models/Depth.java delete mode 100644 library/Binance/src/main/java/com/github/johnsiu/binance/models/ErrorDetails.java delete mode 100644 library/Binance/src/main/java/com/github/johnsiu/binance/models/Keys.java delete mode 100644 library/Binance/src/main/java/com/github/johnsiu/binance/models/Order.java delete mode 100644 library/Binance/src/main/java/com/github/johnsiu/binance/models/OrderStatus.java delete mode 100644 library/Binance/src/main/java/com/github/johnsiu/binance/models/PriceQuantity.java delete mode 100644 library/Binance/src/main/java/com/github/johnsiu/binance/models/Ticker.java delete mode 100644 library/Binance/src/test/java/com/github/johnsiu/binance/httpclients/BinanceClientImplTest.java create mode 100644 libs/binance-api.jar diff --git a/app/build.gradle b/app/build.gradle index 71f323c..6270387 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -34,7 +34,15 @@ dependencies { implementation 'com.android.support:recyclerview-v7:26.1.0' implementation 'com.daimajia.swipelayout:library:1.2.0@aar' implementation 'com.github.armcha:SpaceNavigationView:1.6.0' + implementation 'com.fasterxml.jackson.core:jackson-databind:2.8.5' + implementation 'com.fasterxml.jackson.core:jackson-core:2.8.5' + implementation 'com.fasterxml.jackson.core:jackson-annotations:2.8.5' + implementation 'com.squareup.retrofit2:retrofit:2.2.0' + implementation 'com.squareup.retrofit2:converter-jackson:2.2.0' + implementation 'com.squareup.okhttp3:logging-interceptor:3.6.0' + implementation 'org.apache.commons:commons-lang3:3.6' testImplementation 'junit:junit:4.12' androidTestImplementation 'com.android.support.test:runner:1.0.1' androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.1' + implementation files('C:/Users/Guitoune/Documents/GitHub/Coinfolio/libs/binance-api.jar') } diff --git a/app/src/androidTest/java/com/nauk/coinfolio/ExampleInstrumentedTest.java b/app/src/androidTest/java/com/nauk/coinfolio/ExampleInstrumentedTest.java index 8f27629..9ec78ff 100644 --- a/app/src/androidTest/java/com/nauk/coinfolio/ExampleInstrumentedTest.java +++ b/app/src/androidTest/java/com/nauk/coinfolio/ExampleInstrumentedTest.java @@ -7,7 +7,7 @@ import android.support.test.runner.AndroidJUnit4; import org.junit.Test; import org.junit.runner.RunWith; -import static org.junit.Assert.*; +import static org.junit.Assert.assertEquals; /** * Instrumented test, which will execute on an Android device. diff --git a/app/src/main/java/com/nauk/coinfolio/Activities/CurrencyDetailsActivity.java b/app/src/main/java/com/nauk/coinfolio/Activities/CurrencyDetailsActivity.java index ad6e6cc..16c8ffe 100644 --- a/app/src/main/java/com/nauk/coinfolio/Activities/CurrencyDetailsActivity.java +++ b/app/src/main/java/com/nauk/coinfolio/Activities/CurrencyDetailsActivity.java @@ -2,12 +2,10 @@ package com.nauk.coinfolio.Activities; import android.content.Intent; import android.graphics.Color; -import android.graphics.drawable.Drawable; import android.os.Bundle; import android.support.annotation.NonNull; import android.support.design.widget.BottomNavigationView; import android.support.v7.app.AppCompatActivity; -import android.util.Log; import android.view.Gravity; import android.view.LayoutInflater; import android.view.MenuItem; diff --git a/app/src/main/java/com/nauk/coinfolio/Activities/CurrencySelectionActivity.java b/app/src/main/java/com/nauk/coinfolio/Activities/CurrencySelectionActivity.java index ac2486a..5702aab 100644 --- a/app/src/main/java/com/nauk/coinfolio/Activities/CurrencySelectionActivity.java +++ b/app/src/main/java/com/nauk/coinfolio/Activities/CurrencySelectionActivity.java @@ -1,15 +1,20 @@ package com.nauk.coinfolio.Activities; import android.content.Intent; -import android.support.v7.app.AppCompatActivity; import android.os.Bundle; -import android.util.Log; +import android.support.v7.app.AppCompatActivity; +import android.text.TextUtils; +import android.view.KeyEvent; import android.view.Menu; import android.view.View; import android.view.Window; import android.view.WindowManager; import android.widget.AdapterView; import android.widget.AutoCompleteTextView; +import android.widget.EditText; +import android.widget.ListView; +import android.widget.SearchView; +import android.widget.TextView; import com.nauk.coinfolio.DataManagers.CurrencyData.Currency; import com.nauk.coinfolio.LayoutManagers.CurrencyAdapter; @@ -17,10 +22,13 @@ import com.nauk.coinfolio.R; import java.util.ArrayList; -public class CurrencySelectionActivity extends AppCompatActivity { +public class CurrencySelectionActivity extends AppCompatActivity implements SearchView.OnQueryTextListener{ - String[] currencySymbols; - String[] currencyNames; + private String[] currencySymbols; + private String[] currencyNames; + private CurrencyAdapter adapter; + private ListView listView; + private android.widget.Filter filter; @Override protected void onCreate(Bundle savedInstanceState) { @@ -37,25 +45,21 @@ public class CurrencySelectionActivity extends AppCompatActivity { currencyNames = intent.getStringArrayExtra("currencyListNames"); setTitle("Select a coin"); + + setupAdapter(); + + setupList(); + + SearchView searchView = findViewById(R.id.search_bar); + + searchView.setIconifiedByDefault(false); + searchView.setOnQueryTextListener(this); + searchView.setSubmitButtonEnabled(false); + searchView.onActionViewExpanded(); } - @Override - public boolean onCreateOptionsMenu(Menu menu) + private void setupAdapter() { - final AutoCompleteTextView searchAutoComplete = findViewById(R.id.search_bar); - - searchAutoComplete.setOnItemClickListener(new AdapterView.OnItemClickListener() { - @Override - public void onItemClick(AdapterView adapterView, View view, int i, long l) { - Currency selectedCurrency = (Currency) adapterView.getItemAtPosition(i); - Intent intent = new Intent(CurrencySelectionActivity.this, RecordTransactionActivity.class); - intent.putExtra("coin", selectedCurrency.getName()); - intent.putExtra("symbol", selectedCurrency.getSymbol()); - startActivity(intent); - finish(); - } - }); - String[] currencyFullname = new String[currencyNames.length]; for(int i = 0; i < currencyFullname.length; i++) @@ -70,11 +74,58 @@ public class CurrencySelectionActivity extends AppCompatActivity { currencyArrayList.add(new Currency(currencyNames[i], currencySymbols[i])); } - CurrencyAdapter adapter = new CurrencyAdapter(this, currencyArrayList); + adapter = new CurrencyAdapter(this, currencyArrayList); + } + + private void setupList() + { + listView = findViewById(R.id.coinsPreview); + + listView.setAdapter(adapter); + listView.setTextFilterEnabled(false); + + filter = adapter.getFilter(); + } + + @Override + public boolean onCreateOptionsMenu(Menu menu) + { + /*final AutoCompleteTextView searchAutoComplete = findViewById(R.id.search_bar); + + searchAutoComplete.setOnItemClickListener(new AdapterView.OnItemClickListener() { + @Override + public void onItemClick(AdapterView adapterView, View view, int i, long l) { + Currency selectedCurrency = (Currency) adapterView.getItemAtPosition(i); + Intent intent = new Intent(CurrencySelectionActivity.this, RecordTransactionActivity.class); + intent.putExtra("coin", selectedCurrency.getName()); + intent.putExtra("symbol", selectedCurrency.getSymbol()); + startActivity(intent); + finish(); + } + }); searchAutoComplete.setAdapter(adapter); - searchAutoComplete.setThreshold(0); + searchAutoComplete.setThreshold(0);*/ return true; } + + @Override + public boolean onQueryTextChange(String text) + { + filter.filter(text); + + if (TextUtils.isEmpty(text)) { + listView.clearTextFilter(); + } else { + listView.setFilterText(text); + } + return true; + } + + @Override + public boolean onQueryTextSubmit(String query) + { + return false; + } } diff --git a/app/src/main/java/com/nauk/coinfolio/Activities/HomeActivity.java b/app/src/main/java/com/nauk/coinfolio/Activities/HomeActivity.java index 026d4c2..4a294bb 100644 --- a/app/src/main/java/com/nauk/coinfolio/Activities/HomeActivity.java +++ b/app/src/main/java/com/nauk/coinfolio/Activities/HomeActivity.java @@ -1,10 +1,10 @@ package com.nauk.coinfolio.Activities; import android.app.Dialog; -import android.app.Fragment; import android.content.Intent; import android.graphics.Bitmap; import android.graphics.BitmapFactory; +import android.graphics.drawable.BitmapDrawable; import android.os.AsyncTask; import android.os.Bundle; import android.os.Handler; @@ -13,22 +13,21 @@ import android.support.annotation.NonNull; import android.support.design.widget.AppBarLayout; import android.support.design.widget.BottomNavigationView; import android.support.design.widget.CollapsingToolbarLayout; -import android.support.design.widget.CoordinatorLayout; import android.support.design.widget.FloatingActionButton; import android.support.design.widget.Snackbar; +import android.support.v4.widget.NestedScrollView; import android.support.v4.widget.SwipeRefreshLayout; import android.support.v7.app.AppCompatActivity; import android.support.v7.graphics.Palette; import android.support.v7.widget.Toolbar; import android.util.Log; import android.view.Gravity; -import android.view.View; import android.view.Menu; import android.view.MenuItem; +import android.view.View; import android.view.ViewGroup; import android.view.Window; import android.view.WindowManager; -import android.widget.FrameLayout; import android.widget.ImageButton; import android.widget.LinearLayout; import android.widget.ProgressBar; @@ -40,8 +39,8 @@ import com.luseen.spacenavigation.SpaceNavigationView; import com.luseen.spacenavigation.SpaceOnClickListener; import com.nauk.coinfolio.DataManagers.BalanceManager; import com.nauk.coinfolio.DataManagers.CurrencyData.Currency; -import com.nauk.coinfolio.LayoutManagers.HomeLayoutGenerator; import com.nauk.coinfolio.DataManagers.PreferencesManager; +import com.nauk.coinfolio.LayoutManagers.HomeLayoutGenerator; import com.nauk.coinfolio.R; import java.io.IOException; @@ -79,6 +78,7 @@ public class HomeActivity extends AppCompatActivity { private Dialog loadingDialog; private Handler handler; private Runnable updateRunnable; + private ViewFlipper viewFlipper; private BottomNavigationView.OnNavigationItemSelectedListener mOnNavigationItemSelectedListener = new BottomNavigationView.OnNavigationItemSelectedListener() { @@ -148,6 +148,8 @@ public class HomeActivity extends AppCompatActivity { toolbarLayout = findViewById(R.id.toolbar_layout); toolbarSubtitle = findViewById(R.id.toolbarSubtitle); currencyLayout = findViewById(R.id.currencyListLayout); + viewFlipper = findViewById(R.id.viewFlipperSummary); + viewFlipper.setDisplayedChild(1); ImageButton addCurrencyButton = findViewById(R.id.floatingAddButton); ImageButton detailsButton = findViewById(R.id.switch_button); @@ -160,11 +162,11 @@ public class HomeActivity extends AppCompatActivity { toolbarSubtitle.setText("US$0.00"); - BottomNavigationView navigation = (BottomNavigationView) findViewById(R.id.navigation_home); + /*BottomNavigationView navigation = (BottomNavigationView) findViewById(R.id.navigation_home); navigation.setOnNavigationItemSelectedListener(mOnNavigationItemSelectedListener); navigation.setSelectedItemId(R.id.navigation_view_list); navigation.setFitsSystemWindows(true); - navigation.setItemBackgroundResource(R.color.colorAccent); + navigation.setItemBackgroundResource(R.color.colorAccent);*/ //Events setup detailsButton.setOnClickListener(new View.OnClickListener() { @@ -223,7 +225,6 @@ public class HomeActivity extends AppCompatActivity { spaceNavigationView.addSpaceItem(new SpaceItem("Charts", R.drawable.ic_show_chart_black_24dp)); spaceNavigationView.addSpaceItem(new SpaceItem("Market Cap.", R.drawable.ic_pie_chart_black_24dp)); spaceNavigationView.setSpaceBackgroundColor(getResources().getColor(R.color.colorPrimary)); - //spaceNavigationView.setCentreButtonIcon(R.drawable.ic_add_white_24dp); spaceNavigationView.setCentreButtonIcon(R.drawable.ic_view_list_white_24dp); spaceNavigationView.setCentreButtonColor(getResources().getColor(R.color.colorAccent)); spaceNavigationView.setCentreButtonIconColorFilterEnabled(false); @@ -237,8 +238,13 @@ public class HomeActivity extends AppCompatActivity { SpaceNavigationView nav = findViewById(R.id.space); nav.changeCurrentItem(-1); - ((AppBarLayout) findViewById(R.id.app_bar)).setNestedScrollingEnabled(true); + + ((NestedScrollView) findViewById(R.id.nestedScrollViewLayout)).setNestedScrollingEnabled(true); ((AppBarLayout) findViewById(R.id.app_bar)).setExpanded(true, true); + + findViewById(R.id.switch_button).setVisibility(View.VISIBLE); + + viewFlipper.setDisplayedChild(1); } @Override @@ -248,9 +254,14 @@ public class HomeActivity extends AppCompatActivity { //0 : Unknown //1 : Market cap - ((AppBarLayout) findViewById(R.id.app_bar)).setNestedScrollingEnabled(false); + ((NestedScrollView) findViewById(R.id.nestedScrollViewLayout)).setNestedScrollingEnabled(false); ((AppBarLayout) findViewById(R.id.app_bar)).setExpanded(false, true); + findViewById(R.id.switch_button).setVisibility(View.GONE); + + + + viewFlipper.setDisplayedChild(itemIndex * 2); } @Override @@ -394,7 +405,9 @@ public class HomeActivity extends AppCompatActivity { result = BitmapFactory.decodeStream(input); } catch (IOException e) { e.printStackTrace(); - result = null; + result = BitmapFactory.decodeResource(this.getResources(), + R.mipmap.icon_coinfolio); + result = Bitmap.createScaledBitmap(result, 50, 50, false); } callBack.onSuccess(result); @@ -470,7 +483,7 @@ public class HomeActivity extends AppCompatActivity { if(balanceManager.getTotalBalance() != null) { - if(coinCounter == balanceManager.getTotalBalance().size()) + if(coinCounter == balanceManager.getTotalBalance().size() && detailsChecker) { for (int i = 0; i < balanceManager.getTotalBalance().size(); i++) { @@ -502,6 +515,8 @@ public class HomeActivity extends AppCompatActivity { { ImageButton imgButton = findViewById(R.id.switch_button); + imgButton.setBackgroundColor(this.getResources().getColor(R.color.buttonColor)); + if(isDetailed) { imgButton.setBackground(this.getResources().getDrawable(R.drawable.ic_unfold_less_black_24dp)); @@ -517,6 +532,7 @@ public class HomeActivity extends AppCompatActivity { private void generateSplash() { LinearLayout loadingLayout = new LinearLayout(this); + loadingLayout.setLayoutParams(new LinearLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT)); loadingLayout.setGravity(Gravity.CENTER); loadingLayout.setOrientation(LinearLayout.VERTICAL); @@ -683,6 +699,14 @@ public class HomeActivity extends AppCompatActivity { @Override protected Void doInBackground(Void... params) { + balanceManager.updateDetails(new BalanceManager.IconCallBack() { + @Override + public void onSuccess() + { + countCoins(false, true); + } + }); + balanceManager.updateTotalBalance(new BalanceManager.VolleyCallBack() { @Override public void onSuccess() { @@ -731,14 +755,6 @@ public class HomeActivity extends AppCompatActivity { } }); - balanceManager.updateDetails(new BalanceManager.IconCallBack() { - @Override - public void onSuccess() - { - countCoins(false, true); - } - }); - return null; } diff --git a/app/src/main/java/com/nauk/coinfolio/Activities/RecordTransactionActivity.java b/app/src/main/java/com/nauk/coinfolio/Activities/RecordTransactionActivity.java index b18085c..aa07931 100644 --- a/app/src/main/java/com/nauk/coinfolio/Activities/RecordTransactionActivity.java +++ b/app/src/main/java/com/nauk/coinfolio/Activities/RecordTransactionActivity.java @@ -1,8 +1,8 @@ package com.nauk.coinfolio.Activities; import android.content.Intent; -import android.support.v7.app.AppCompatActivity; import android.os.Bundle; +import android.support.v7.app.AppCompatActivity; import android.view.View; import android.widget.Button; import android.widget.TextView; diff --git a/app/src/main/java/com/nauk/coinfolio/Activities/SettingsActivity.java b/app/src/main/java/com/nauk/coinfolio/Activities/SettingsActivity.java index f17cd3e..2ec71ea 100644 --- a/app/src/main/java/com/nauk/coinfolio/Activities/SettingsActivity.java +++ b/app/src/main/java/com/nauk/coinfolio/Activities/SettingsActivity.java @@ -12,10 +12,10 @@ import android.os.Bundle; import android.preference.ListPreference; import android.preference.Preference; import android.preference.PreferenceActivity; -import android.support.v7.app.ActionBar; import android.preference.PreferenceFragment; import android.preference.PreferenceManager; import android.preference.RingtonePreference; +import android.support.v7.app.ActionBar; import android.text.TextUtils; import android.view.MenuItem; diff --git a/app/src/main/java/com/nauk/coinfolio/DataManagers/BalanceManager.java b/app/src/main/java/com/nauk/coinfolio/DataManagers/BalanceManager.java index f55b859..6e61730 100644 --- a/app/src/main/java/com/nauk/coinfolio/DataManagers/BalanceManager.java +++ b/app/src/main/java/com/nauk/coinfolio/DataManagers/BalanceManager.java @@ -12,6 +12,10 @@ import com.android.volley.VolleyError; import com.android.volley.toolbox.JsonArrayRequest; import com.android.volley.toolbox.StringRequest; import com.android.volley.toolbox.Volley; +import com.binance.api.client.BinanceApiClientFactory; +import com.binance.api.client.BinanceApiRestClient; +import com.binance.api.client.domain.account.Account; +import com.binance.api.client.domain.account.AssetBalance; import com.nauk.coinfolio.DataManagers.CurrencyData.Currency; import com.nauk.coinfolio.R; @@ -21,6 +25,7 @@ import org.json.JSONObject; import java.util.ArrayList; import java.util.HashMap; +import java.util.LinkedHashMap; import java.util.List; import java.util.Map; import java.util.regex.Pattern; @@ -39,24 +44,24 @@ public class BalanceManager { private String privatePoloniex; final private String hitBalanceUrl = "https://api.hitbtc.com/api/2/trading/balance"; final private String detailUrl = "https://www.cryptocompare.com/api/data/coinlist/"; - final private String binanceBalanceUrl = "https://api.binance.com/api/v3/account"; - final private String binanceTimeUrl = "https://api.binance.com/api/v1/time"; private RequestQueue requestQueue; + private List binanceBalance; private List hitBalance; private List manualBalances; private List totalBalance; private android.content.Context context; - private Map iconUrlList; - private Map coinList; - private Map coinIdList; + private LinkedHashMap coinInfosHashmap; private PreferencesManager preferenceManager; private DatabaseManager databaseManager; + private BinanceApiClientFactory binanceApiClientFactory; + public BalanceManager(android.content.Context context) { this.context = context; preferenceManager = new PreferencesManager(context); requestQueue = Volley.newRequestQueue(context); + binanceBalance = new ArrayList(); hitBalance = new ArrayList(); manualBalances = new ArrayList(); databaseManager = new DatabaseManager(context); @@ -64,18 +69,62 @@ public class BalanceManager { public List getCurrenciesName() { - return new ArrayList<>(coinList.values()); + List currenciesName = new ArrayList<>(); + + for (String symbol : coinInfosHashmap.keySet()) + { + try { + JSONObject jsonObject = new JSONObject(coinInfosHashmap.get(symbol)); + currenciesName.add(jsonObject.getString("CoinName")); + } catch (JSONException e) { + e.printStackTrace(); + } + } + + return currenciesName; + } + + public List getOrders() + { + List currenciesOrder = new ArrayList<>(); + + for(String symbol : coinInfosHashmap.keySet()) + { + try { + JSONObject jsonObject = new JSONObject(coinInfosHashmap.get(symbol)); + currenciesOrder.add(jsonObject.getString("SortOrder")); + } catch (JSONException e) { + e.printStackTrace(); + } + } + + return currenciesOrder; } public List getCurrenciesSymbol() { - return new ArrayList<>(coinList.keySet()); + return new ArrayList<>(coinInfosHashmap.keySet()); } public void updateExchangeKeys() { publicHitKey = preferenceManager.getHitBTCPublicKey(); privateHitKey = preferenceManager.getHitBTCPrivateKey(); + + publicBinanceKey = preferenceManager.getBinancePublicKey(); + privateBinanceKey = preferenceManager.getBinancePrivateKey(); + } + + public boolean isBinanceConfigured() + { + boolean isConfigured = true; + + if(publicBinanceKey == null || privateBinanceKey == null) + { + isConfigured = false; + } + + return isConfigured; } public boolean isHitBTCConfigured() @@ -117,19 +166,61 @@ public class BalanceManager { public void updateTotalBalance(final VolleyCallBack callBack) { + boolean isUpdated = false; manualBalances = databaseManager.getAllCurrencyFromManualCurrency(); + Log.d("coinfolio", "Updating balances " + (privateBinanceKey != null && publicBinanceKey != null && preferenceManager.isBinanceActivated())); + if(privateHitKey != null && publicHitKey != null && preferenceManager.isHitBTCActivated()) { updateHitBalance(callBack); + isUpdated = true; } else { hitBalance = new ArrayList(); + } + + if(privateBinanceKey != null && publicBinanceKey != null && preferenceManager.isBinanceActivated()) + { + Log.d("coinfolio", "Updating Binance"); + updateBinanceBalance(); + isUpdated = true; + } + + if(!isUpdated) + { refreshAllBalances(callBack); } } + private void updateBinanceBalance() + { + Map accountBalanceCache; + BinanceApiClientFactory factory = BinanceApiClientFactory.newInstance(publicBinanceKey, privateBinanceKey); + BinanceApiRestClient client = factory.newRestClient(); + + Account account = client.getAccount(); + List assets = account.getBalances(); + + binanceBalance = new ArrayList(); + + for(int i = 0; i < assets.size(); i++) + { + if(Double.parseDouble(assets.get(i).getFree()) > 0) + { + binanceBalance.add(new Currency(assets.get(i).getAsset(), assets.get(i).getFree())); + } + } + + Log.d("coinfolio", "Binance size : " + binanceBalance.size()); + + for(int i = 0; i < binanceBalance.size(); i++) + { + Log.d("coinfolio", "Binance : " + binanceBalance.get(i).getSymbol() + " " + binanceBalance.get(i).getBalance()); + } + } + private void updateHitBalance(final VolleyCallBack callBack) { JsonArrayRequest arrReq = new JsonArrayRequest(Request.Method.GET, hitBalanceUrl, @@ -269,10 +360,14 @@ public class BalanceManager { String url; try { - url = iconUrlList.get(symbol); + JSONObject jsonObject = new JSONObject(coinInfosHashmap.get(symbol)); + url = "https://www.cryptocompare.com" + jsonObject.getString("ImageUrl") + "?width=50"; } catch (NullPointerException e) { Log.d(context.getResources().getString(R.string.debug), symbol + " has no icon URL"); url = null; + } catch (JSONException e) { + Log.d(context.getResources().getString(R.string.debug), "Url parsing error for " + symbol); + url = null; } return url; @@ -280,12 +375,30 @@ public class BalanceManager { public String getCurrencyName(String symbol) { - return coinList.get(symbol); + String currencyName = null; + + try { + JSONObject jsonObject = new JSONObject(coinInfosHashmap.get(symbol)); + currencyName = jsonObject.getString("CoinName"); + } catch (JSONException e) { + e.printStackTrace(); + } + + return currencyName; } public int getCurrencyId(String symbol) { - return coinIdList.get(symbol); + int id = 0; + + try { + JSONObject jsonObject = new JSONObject(coinInfosHashmap.get(symbol)); + id = jsonObject.getInt("Id"); + } catch (JSONException e) { + e.printStackTrace(); + } + + return id; } private void processDetailResult(String response, final IconCallBack callBack) @@ -293,9 +406,7 @@ public class BalanceManager { response = response.substring(response.indexOf("\"Data\"") + 7, response.lastIndexOf("},\"Type\":100}")); String[] tab = response.split(Pattern.quote("},")); - iconUrlList = new HashMap<>(); - coinList = new HashMap<>(); - coinIdList = new HashMap<>(); + coinInfosHashmap = new LinkedHashMap<>(); for(int i = 0; i < tab.length; i++) { @@ -305,16 +416,42 @@ public class BalanceManager { StrictMode.setThreadPolicy(policy); JSONObject jsonObject = new JSONObject(tab[i]); - iconUrlList.put(jsonObject.getString("Symbol"), "https://www.cryptocompare.com" + jsonObject.getString("ImageUrl") + "?width=50"); - - coinList.put(jsonObject.getString("Symbol"), jsonObject.getString("CoinName")); - - coinIdList.put(jsonObject.getString("Symbol"), jsonObject.getInt("Id")); + coinInfosHashmap.put(jsonObject.getString("Symbol"), tab[i]); } catch (JSONException e) { Log.d(context.getResources().getString(R.string.debug), "ImageUrl not found."); } } + sortDetails(); + callBack.onSuccess(); } + + private void sortDetails() + { + LinkedHashMap sortedHashmap = new LinkedHashMap<>(); + List listInfos = new ArrayList<>(coinInfosHashmap.values()); + List listSymbols = new ArrayList<>(coinInfosHashmap.keySet()); + + for(int i = 0; i < coinInfosHashmap.keySet().size(); i++) + { + + try { + JSONObject jsonObject = new JSONObject(listInfos.get(i)); + int index = jsonObject.getInt("SortOrder"); + + listInfos.add(index, listInfos.get(i)); + listSymbols.add(index, listSymbols.get(i)); + } catch (JSONException e) { + e.printStackTrace(); + } + } + + for(int i = 0; i < listInfos.size(); i++) + { + sortedHashmap.put(listSymbols.get(i), listInfos.get(i)); + } + + coinInfosHashmap = sortedHashmap; + } } diff --git a/app/src/main/java/com/nauk/coinfolio/DataManagers/CurrencyData/Currency.java b/app/src/main/java/com/nauk/coinfolio/DataManagers/CurrencyData/Currency.java index df450c1..5befeb7 100644 --- a/app/src/main/java/com/nauk/coinfolio/DataManagers/CurrencyData/Currency.java +++ b/app/src/main/java/com/nauk/coinfolio/DataManagers/CurrencyData/Currency.java @@ -3,7 +3,6 @@ package com.nauk.coinfolio.DataManagers.CurrencyData; import android.graphics.Bitmap; import android.os.Parcel; import android.os.Parcelable; -import android.util.Log; import java.util.ArrayList; import java.util.List; diff --git a/app/src/main/java/com/nauk/coinfolio/DataManagers/DatabaseManager.java b/app/src/main/java/com/nauk/coinfolio/DataManagers/DatabaseManager.java index 3bd4ad4..4afe2df 100644 --- a/app/src/main/java/com/nauk/coinfolio/DataManagers/DatabaseManager.java +++ b/app/src/main/java/com/nauk/coinfolio/DataManagers/DatabaseManager.java @@ -5,13 +5,11 @@ import android.content.Context; import android.database.Cursor; import android.database.sqlite.SQLiteDatabase; import android.database.sqlite.SQLiteOpenHelper; -import android.util.Log; import com.nauk.coinfolio.DataManagers.CurrencyData.Currency; import com.nauk.coinfolio.DataManagers.CurrencyData.Transaction; import java.util.ArrayList; -import java.util.HashMap; import java.util.List; /** diff --git a/app/src/main/java/com/nauk/coinfolio/DataManagers/PreferencesManager.java b/app/src/main/java/com/nauk/coinfolio/DataManagers/PreferencesManager.java index be1fb1b..b787925 100644 --- a/app/src/main/java/com/nauk/coinfolio/DataManagers/PreferencesManager.java +++ b/app/src/main/java/com/nauk/coinfolio/DataManagers/PreferencesManager.java @@ -65,4 +65,25 @@ public class PreferencesManager { editor.apply(); } + public String getBinancePublicKey() + { + return settingPreferences.getString("binance_publickey", null); + } + + public String getBinancePrivateKey() + { + return settingPreferences.getString("binance_privatekey", null); + } + + public boolean isBinanceActivated() + { + return settingPreferences.getBoolean("enable_binance", false); + } + + public void disableBinance() + { + SharedPreferences.Editor editor = settingPreferences.edit(); + editor.putBoolean("enable_binance", false); + editor.apply(); + } } diff --git a/app/src/main/java/com/nauk/coinfolio/LayoutManagers/CurrencyAdapter.java b/app/src/main/java/com/nauk/coinfolio/LayoutManagers/CurrencyAdapter.java index 9598248..628eba2 100644 --- a/app/src/main/java/com/nauk/coinfolio/LayoutManagers/CurrencyAdapter.java +++ b/app/src/main/java/com/nauk/coinfolio/LayoutManagers/CurrencyAdapter.java @@ -8,11 +8,11 @@ import android.widget.ArrayAdapter; import android.widget.Filter; import android.widget.TextView; -import java.util.ArrayList; - import com.nauk.coinfolio.DataManagers.CurrencyData.Currency; import com.nauk.coinfolio.R; +import java.util.ArrayList; + /** * Created by Guitoune on 17/01/2018. */ @@ -46,9 +46,9 @@ public class CurrencyAdapter extends ArrayAdapter { } // Now assign alternate color for rows if (position % 2 == 0) - convertView.setBackgroundColor(context.getResources().getColor(R.color.listBackground)); - else convertView.setBackgroundColor(context.getResources().getColor(R.color.listBackground2)); + else + convertView.setBackgroundColor(context.getResources().getColor(R.color.listBackground)); return convertView; } @@ -70,13 +70,28 @@ public class CurrencyAdapter extends ArrayAdapter { if (constraint != null) { suggestions.clear(); + int i = 0; + int found = 0; String temp = constraint.toString().toLowerCase(); - for (Currency currency : tempCurrency) { + + while(i < tempCurrency.size() && found < 25) + { + Currency currency = tempCurrency.get(i); + if (currency.getName().toLowerCase().startsWith(temp) + || currency.getSymbol().toLowerCase().startsWith(temp)) { + suggestions.add(currency); + found++; + } + i++; + } + + + /*for (Currency currency : tempCurrency) { if (currency.getName().toLowerCase().startsWith(temp) || currency.getSymbol().toLowerCase().startsWith(temp)) { suggestions.add(currency); } - } + }*/ FilterResults filterResults = new FilterResults(); filterResults.values = suggestions; diff --git a/app/src/main/java/com/nauk/coinfolio/LayoutManagers/HomeLayoutGenerator.java b/app/src/main/java/com/nauk/coinfolio/LayoutManagers/HomeLayoutGenerator.java index 614b6cc..286bfb6 100644 --- a/app/src/main/java/com/nauk/coinfolio/LayoutManagers/HomeLayoutGenerator.java +++ b/app/src/main/java/com/nauk/coinfolio/LayoutManagers/HomeLayoutGenerator.java @@ -1,20 +1,13 @@ package com.nauk.coinfolio.LayoutManagers; -import android.animation.AnimatorInflater; -import android.animation.StateListAnimator; import android.content.Context; import android.content.Intent; -import android.graphics.Bitmap; import android.graphics.Color; import android.graphics.PorterDuff; import android.graphics.PorterDuffColorFilter; -import android.support.v7.widget.CardView; -import android.util.Log; -import android.view.Gravity; import android.view.LayoutInflater; import android.view.View; import android.widget.ImageView; -import android.widget.LinearLayout; import android.widget.TextView; import com.db.chart.model.ChartSet; @@ -26,18 +19,12 @@ import com.nauk.coinfolio.DataManagers.CurrencyData.Currency; import com.nauk.coinfolio.DataManagers.CurrencyData.CurrencyDataChart; import com.nauk.coinfolio.R; -import org.w3c.dom.Text; - import java.util.ArrayList; import java.util.Calendar; import java.util.List; import java.util.Locale; import static java.lang.Math.abs; -import static java.lang.Math.floorDiv; -import static java.lang.Math.floorMod; -import static java.lang.Math.incrementExact; -import static java.sql.Types.NULL; /** * Created by Tiji on 05/01/2018. diff --git a/app/src/main/res/drawable/gradient_background.xml b/app/src/main/res/drawable/gradient_background.xml index fae6990..2dd82b0 100644 --- a/app/src/main/res/drawable/gradient_background.xml +++ b/app/src/main/res/drawable/gradient_background.xml @@ -1,13 +1,9 @@ - - - - - - - - - \ No newline at end of file + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/ic_details_black_24dp.xml b/app/src/main/res/drawable/ic_details_black_24dp.xml index 573bdb5..a30fe27 100644 --- a/app/src/main/res/drawable/ic_details_black_24dp.xml +++ b/app/src/main/res/drawable/ic_details_black_24dp.xml @@ -4,6 +4,6 @@ android:viewportWidth="24.0" android:viewportHeight="24.0"> diff --git a/app/src/main/res/drawable/ic_settings_black_24dp.xml b/app/src/main/res/drawable/ic_settings_black_24dp.xml index dd6cf1c..6e45d2b 100644 --- a/app/src/main/res/drawable/ic_settings_black_24dp.xml +++ b/app/src/main/res/drawable/ic_settings_black_24dp.xml @@ -4,6 +4,6 @@ android:viewportWidth="24.0" android:viewportHeight="24.0"> diff --git a/app/src/main/res/drawable/ic_unfold_less_black_24dp.xml b/app/src/main/res/drawable/ic_unfold_less_black_24dp.xml index 1be5b9b..53fe3a0 100644 --- a/app/src/main/res/drawable/ic_unfold_less_black_24dp.xml +++ b/app/src/main/res/drawable/ic_unfold_less_black_24dp.xml @@ -4,6 +4,6 @@ android:viewportWidth="24.0" android:viewportHeight="24.0"> diff --git a/app/src/main/res/layout/activity_add_currency.xml b/app/src/main/res/layout/activity_add_currency.xml index 00488bf..ee16a26 100644 --- a/app/src/main/res/layout/activity_add_currency.xml +++ b/app/src/main/res/layout/activity_add_currency.xml @@ -1,6 +1,5 @@ + android:gravity="center_horizontal" + android:orientation="vertical"> - - - + + diff --git a/app/src/main/res/layout/activity_currency_summary.xml b/app/src/main/res/layout/activity_currency_summary.xml index 4afe4f3..48961e4 100644 --- a/app/src/main/res/layout/activity_currency_summary.xml +++ b/app/src/main/res/layout/activity_currency_summary.xml @@ -44,8 +44,7 @@ android:layout_width="match_parent" android:layout_height="?attr/actionBarSize" app:layout_collapseMode="pin" - app:popupTheme="@style/AppTheme.PopupOverlay" - android:background="@drawable/gradient_background"> + app:popupTheme="@style/AppTheme.PopupOverlay"> @@ -61,7 +60,8 @@ android:id="@+id/switch_button" android:layout_width="wrap_content" android:layout_height="wrap_content" - android:text="@string/quick_button"/> + android:text="@string/quick_button" + android:visibility="visible"/> @@ -77,7 +77,8 @@ android:id="@+id/settings_button" android:layout_width="wrap_content" android:layout_height="wrap_content" - android:text="@string/action_settings" /> + android:text="@string/action_settings" + android:visibility="visible"/> @@ -86,7 +87,7 @@ - + android:visibility="gone"/>--> diff --git a/app/src/main/res/layout/content_currency_summary.xml b/app/src/main/res/layout/content_currency_summary.xml index 870c2d9..073a65c 100644 --- a/app/src/main/res/layout/content_currency_summary.xml +++ b/app/src/main/res/layout/content_currency_summary.xml @@ -4,35 +4,94 @@ android:id="@+id/swiperefresh" android:layout_width="match_parent" android:layout_height="match_parent" - app:layout_behavior="@string/appbar_scrolling_view_behavior"> + app:layout_behavior="@string/appbar_scrolling_view_behavior" + android:layout_marginBottom="50dp"> - + android:layout_height="match_parent"> + android:layout_height="match_parent"> - + style="?android:attr/progressBarStyleLarge" + android:layout_gravity="center" + android:background="@drawable/circular_progress_bar" /> - + android:layout_height="wrap_content" + android:text="Watch list" + android:layout_gravity="center_vertical" + android:gravity="center_horizontal"/>--> - + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/values/colors.xml b/app/src/main/res/values/colors.xml index bbc7b0e..a939cca 100644 --- a/app/src/main/res/values/colors.xml +++ b/app/src/main/res/values/colors.xml @@ -1,4 +1,23 @@ + + #000046 #111124 @@ -11,6 +30,7 @@ #FFEEEEEE #FFFFFFFF #FF999999 + #FFFFFFFF #FFF44336 #FF4CAF50 - + \ No newline at end of file diff --git a/app/src/main/res/xml/pref_exchange.xml b/app/src/main/res/xml/pref_exchange.xml index 8bb55d2..442d41b 100644 --- a/app/src/main/res/xml/pref_exchange.xml +++ b/app/src/main/res/xml/pref_exchange.xml @@ -59,7 +59,7 @@ + android:enabled="true"> - - bintray-johnsiu-maven-repo - https://dl.bintray.com/johnsiu/maven-repo - - - ``` -then, add the dependency: -```xml - - com.github.johnsiu - binance-java-client - 1.0.1 - - ``` - -## Usage - -### Creating an instance of the async client using Guice -```java - Injector injector = Guice.createInjector(new BinanceClientModule()); - AsyncBinanceClient asyncClient = injector.getInstance(AsyncBinanceClient.class); -``` -### Creating an instance of the sync client using Guice -```java - Injector injector = Guice.createInjector(new BinanceClientModule()); - BinanceClient client = injector.getInstance(BinanceClient.class); -``` - -### Getting latest price of a symbol -```java - Ticker ticker = client.getTicker("ETHBTC")); - double price = ticker.getLastPrice(); -``` -### Getting depth of a symbol -```java - Depth depth = client.getDepth("ETHBTC")); -``` -### Placing a LIMIT order -```java - Keys keys = new Keys("YOUR_API_KEY", "YOUR_SECRET_KEY"); - double quantity = 1; - double price = 0.020041; - Order order = client.placeLimitOrder(keys, "MCOETH", OrderSide.BUY, TimeInForce.GTC, quantity, price); -``` - -### Placing a MARKET order -```java - double quantity = 1; - Order order = client.placeMarketOrder(keys, "MCOETH", OrderSide.SELL, quantity); -``` -### Checking an order’s status -```java - OrderStatus orderStatus = client.checkOrderStatus(keys, order); -``` - -### Cancelling an order -```java - CancelOrder cancelOrder = client.cancelOrder(keys, order); - // or - CancelOrder cancelOrder = client.cancelOrder(keys, orderStatus); - -``` - -### Getting a list of open orders -```java - List openOrders = client.getOpenOrders(keys, "MCOETH"); -``` - -### Getting a list of current position -```java - Account account = client.getAccount(keys); - Map balances = account.getBalances(); -``` - -### Exception handling -```java - try { - Depth depth = client.getDepth("invalid symbol")); - } catch (ClientErrorException e) { - int httpStatusCode = e.getHttpStatusCode(); - String errorCode = e.getErrorDetails().getCode(); - String errorMessage = e.getErrorDetails().getMsg(); - } -``` - -## Contributing - -Please read [CONTRIBUTING.md](CONTRIBUTING.md) for details on our code of conduct, and the process for submitting pull requests to us. - -## Versioning - -We use [SemVer](http://semver.org/) for versioning. For the versions available, see the [tags on this repository](https://github.com/johnsiu/binance-java-client/tags). - -## License - -This project is released into the public domain - see the [UNLICENSE](UNLICENSE) file for details. \ No newline at end of file diff --git a/library/Binance/UNLICENSE b/library/Binance/UNLICENSE deleted file mode 100644 index 00d2e13..0000000 --- a/library/Binance/UNLICENSE +++ /dev/null @@ -1,24 +0,0 @@ -This is free and unencumbered software released into the public domain. - -Anyone is free to copy, modify, publish, use, compile, sell, or -distribute this software, either in source code form or as a compiled -binary, for any purpose, commercial or non-commercial, and by any -means. - -In jurisdictions that recognize copyright laws, the author or authors -of this software dedicate any and all copyright interest in the -software to the public domain. We make this dedication for the benefit -of the public at large and to the detriment of our heirs and -successors. We intend this dedication to be an overt act of -relinquishment in perpetuity of all present and future rights to this -software under copyright law. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR -OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, -ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR -OTHER DEALINGS IN THE SOFTWARE. - -For more information, please refer to \ No newline at end of file diff --git a/library/Binance/pom.xml b/library/Binance/pom.xml deleted file mode 100644 index 3a4fbc9..0000000 --- a/library/Binance/pom.xml +++ /dev/null @@ -1,83 +0,0 @@ - - - 4.0.0 - - com.github.johnsiu - binance-java-client - 1.0.1 - - - 2.9.1 - - - - - bintray-repo-binance-java-client - https://api.bintray.com/maven/johnsiu/maven-repo/binance-java-client/;publish=1 - - - - - - - org.apache.maven.plugins - maven-compiler-plugin - - 1.8 - 1.8 - - - - org.apache.maven.plugins - maven-source-plugin - - - attach-sources - verify - - jar-no-fork - - - - - - - - - - org.asynchttpclient - async-http-client - 2.0.37 - - - com.google.guava - guava - 23.1-jre - - - com.fasterxml.jackson.core - jackson-databind - ${jackson-version} - - - com.fasterxml.jackson.datatype - jackson-datatype-jsr310 - ${jackson-version} - - - com.google.inject - guice - 4.1.0 - - - - junit - junit - 4.12 - test - - - - \ No newline at end of file diff --git a/library/Binance/src/main/java/com/github/johnsiu/binance/deser/BalanceMapDeserializer.java b/library/Binance/src/main/java/com/github/johnsiu/binance/deser/BalanceMapDeserializer.java deleted file mode 100644 index 688115b..0000000 --- a/library/Binance/src/main/java/com/github/johnsiu/binance/deser/BalanceMapDeserializer.java +++ /dev/null @@ -1,29 +0,0 @@ -package com.github.johnsiu.binance.deser; - -import com.fasterxml.jackson.core.JsonParser; -import com.fasterxml.jackson.core.JsonProcessingException; -import com.fasterxml.jackson.core.type.TypeReference; -import com.fasterxml.jackson.databind.DeserializationContext; -import com.fasterxml.jackson.databind.JsonDeserializer; -import com.github.johnsiu.binance.models.Account.Balance; -import com.google.common.collect.ImmutableMap; -import com.google.common.collect.ImmutableMap.Builder; -import java.io.IOException; -import java.util.List; -import java.util.Map; - -/** - * Jackson deserializer for turning an array of balances into a map of asset to balance. - */ -public class BalanceMapDeserializer extends JsonDeserializer> { - - @Override - public Map deserialize(JsonParser p, DeserializationContext ctxt) - throws IOException, JsonProcessingException { - List balances = p.readValueAs(new TypeReference>() { - }); - Builder builder = ImmutableMap.builder(); - balances.forEach(balance -> builder.put(balance.getAsset(), balance)); - return builder.build(); - } -} diff --git a/library/Binance/src/main/java/com/github/johnsiu/binance/exceptions/ClientErrorException.java b/library/Binance/src/main/java/com/github/johnsiu/binance/exceptions/ClientErrorException.java deleted file mode 100644 index e5db96b..0000000 --- a/library/Binance/src/main/java/com/github/johnsiu/binance/exceptions/ClientErrorException.java +++ /dev/null @@ -1,27 +0,0 @@ -package com.github.johnsiu.binance.exceptions; - -import com.github.johnsiu.binance.models.ErrorDetails; - -/** - * Exception thrown when Binance API returned an HTTP 4xx client error. - */ -public class ClientErrorException extends RuntimeException { - - private int httpStatusCode; - // error message from Binance API. - private ErrorDetails errorDetails; - - public ClientErrorException(int httpStatusCode, ErrorDetails errorDetails) { - super(errorDetails.getMsg()); - this.httpStatusCode = httpStatusCode; - this.errorDetails = errorDetails; - } - - public int getHttpStatusCode() { - return httpStatusCode; - } - - public ErrorDetails getErrorDetails() { - return errorDetails; - } -} diff --git a/library/Binance/src/main/java/com/github/johnsiu/binance/httpclients/AsyncBinanceClient.java b/library/Binance/src/main/java/com/github/johnsiu/binance/httpclients/AsyncBinanceClient.java deleted file mode 100644 index e04bd2e..0000000 --- a/library/Binance/src/main/java/com/github/johnsiu/binance/httpclients/AsyncBinanceClient.java +++ /dev/null @@ -1,69 +0,0 @@ -package com.github.johnsiu.binance.httpclients; - -import com.github.johnsiu.binance.models.Account; -import com.github.johnsiu.binance.models.CancelOrder; -import com.github.johnsiu.binance.models.Depth; -import com.github.johnsiu.binance.models.Keys; -import com.github.johnsiu.binance.models.Order; -import com.github.johnsiu.binance.models.Order.OrderSide; -import com.github.johnsiu.binance.models.Order.TimeInForce; -import com.github.johnsiu.binance.models.OrderStatus; -import com.github.johnsiu.binance.models.Ticker; -import com.google.inject.ImplementedBy; -import java.util.List; -import java.util.concurrent.CompletionStage; - -/** - * Async client for accessing Binance API. - */ -@ImplementedBy(AsyncBinanceClientImpl.class) -public interface AsyncBinanceClient { - - /** - * Get the ticker given the symbol. - */ - CompletionStage getTicker(String symbol); - - /** - * Get the depth given the symbol. Limit defaults to 100. - */ - CompletionStage getDepth(String symbol); - - /** - * Get the depth given the symbol and limit. - */ - CompletionStage getDepth(String symbol, int limit); - - /** - * Place a LIMIT order. - */ - CompletionStage placeLimitOrder(Keys keys, String symbol, OrderSide side, - TimeInForce timeInForce, double quantity, double price); - - /** - * Place a MARKET order. - */ - CompletionStage placeMarketOrder(Keys keys, String symbol, OrderSide side, - double quantity); - - /** - * Check the status of an order. - */ - CompletionStage checkOrderStatus(Keys keys, Order order); - - /** - * Cancel an order. - */ - CompletionStage cancelOrder(Keys keys, Order order); - - /** - * Get all open orders. - */ - CompletionStage> getOpenOrders(Keys keys, String symbol); - - /** - * Get account info. - */ - CompletionStage getAccount(Keys keys); - -} diff --git a/library/Binance/src/main/java/com/github/johnsiu/binance/httpclients/AsyncBinanceClientImpl.java b/library/Binance/src/main/java/com/github/johnsiu/binance/httpclients/AsyncBinanceClientImpl.java deleted file mode 100644 index 9daa838..0000000 --- a/library/Binance/src/main/java/com/github/johnsiu/binance/httpclients/AsyncBinanceClientImpl.java +++ /dev/null @@ -1,223 +0,0 @@ -package com.github.johnsiu.binance.httpclients; - -import com.fasterxml.jackson.core.type.TypeReference; -import com.fasterxml.jackson.databind.ObjectMapper; -import com.github.johnsiu.binance.exceptions.ClientErrorException; -import com.github.johnsiu.binance.inject.BinanceClientModule; -import com.github.johnsiu.binance.models.Account; -import com.github.johnsiu.binance.models.CancelOrder; -import com.github.johnsiu.binance.models.Depth; -import com.github.johnsiu.binance.models.ErrorDetails; -import com.github.johnsiu.binance.models.Keys; -import com.github.johnsiu.binance.models.Order; -import com.github.johnsiu.binance.models.Order.OrderSide; -import com.github.johnsiu.binance.models.Order.OrderType; -import com.github.johnsiu.binance.models.Order.TimeInForce; -import com.github.johnsiu.binance.models.OrderStatus; -import com.github.johnsiu.binance.models.Ticker; -import io.netty.handler.codec.http.HttpMethod; -import java.io.IOException; -import java.io.UnsupportedEncodingException; -import java.security.InvalidKeyException; -import java.security.NoSuchAlgorithmException; -import java.util.List; -import java.util.concurrent.CompletableFuture; -import java.util.concurrent.CompletionException; -import java.util.concurrent.CompletionStage; -import java.util.function.Function; -import javax.crypto.Mac; -import javax.crypto.spec.SecretKeySpec; -import javax.inject.Inject; -import javax.inject.Named; -import org.asynchttpclient.AsyncHttpClient; -import org.asynchttpclient.BoundRequestBuilder; -import org.asynchttpclient.Response; - -/** - * Concrete implementation of {@link AsyncBinanceClient}. - */ -public class AsyncBinanceClientImpl implements AsyncBinanceClient { - - private static final String HMAC_SHA256 = "HmacSHA256"; - private static final String APIKEY_HEADER = "X-MBX-APIKEY"; - private static final String ORDER_ENDPOINT = "order"; - private static final String OPEN_ORDERS_ENDPOINT = "openOrders"; - private static final String ACCOUNT_ENDPOINT = "account"; - private final String API_URL = "https://www.binance.com/api/v1/"; - private final String API_V3_URL = "https://www.binance.com/api/v3/"; - private final AsyncHttpClient asyncHttpClient; - private final ObjectMapper objectMapper; - - @Inject - public AsyncBinanceClientImpl(AsyncHttpClient asyncHttpClient, - @Named(BinanceClientModule.BINANCE_CLIENT) ObjectMapper objectMapper) { - this.asyncHttpClient = asyncHttpClient; - this.objectMapper = objectMapper; - } - - @Override - public CompletionStage getTicker(String symbol) { - - return handleResponse( - asyncHttpClient.prepareGet(API_URL + "ticker/24hr?symbol=" + symbol).execute() - .toCompletableFuture(), new TypeReference() { - }); - } - - @Override - public CompletionStage getDepth(String symbol) { - return getDepth(symbol, 100); - } - - @Override - public CompletionStage getDepth(String symbol, int limit) { - - return handleResponse(asyncHttpClient.prepareGet(API_URL + "depth?symbol=" + symbol).execute() - .toCompletableFuture(), new TypeReference() { - }); - } - - @Override - public CompletionStage placeLimitOrder(Keys keys, String symbol, OrderSide side, - TimeInForce timeInForce, double quantity, double price) { - - String queryStr = String.format( - "symbol=%s&side=%s&type=%s&timeInForce=%s&quantity=%f&price=%f×tamp=%d", - symbol, side.name(), OrderType.LIMIT, timeInForce.name(), quantity, price, - System.currentTimeMillis()); - - return makeSignedRequest(keys, HttpMethod.POST, ORDER_ENDPOINT, queryStr, - new TypeReference() { - }); - } - - @Override - public CompletionStage placeMarketOrder(Keys keys, String symbol, OrderSide side, - double quantity) { - - String queryStr = String.format( - "symbol=%s&side=%s&type=%s&quantity=%f×tamp=%d", - symbol, side.name(), OrderType.MARKET, quantity, - System.currentTimeMillis()); - - return makeSignedRequest(keys, HttpMethod.POST, ORDER_ENDPOINT, queryStr, - new TypeReference() { - }); - } - - @Override - public CompletionStage checkOrderStatus(Keys keys, Order order) { - - String queryStr = String.format( - "symbol=%s&orderId=%d&origClientOrderId=%s×tamp=%d", - order.getSymbol(), order.getOrderId(), order.getClientOrderId(), - System.currentTimeMillis()); - - return makeSignedRequest(keys, HttpMethod.GET, ORDER_ENDPOINT, queryStr, - new TypeReference() { - }); - } - - @Override - public CompletionStage cancelOrder(Keys keys, Order order) { - - String queryStr = String.format( - "symbol=%s&orderId=%d&origClientOrderId=%s×tamp=%d", - order.getSymbol(), order.getOrderId(), order.getClientOrderId(), - System.currentTimeMillis()); - return makeSignedRequest(keys, HttpMethod.DELETE, ORDER_ENDPOINT, queryStr, - new TypeReference() { - }); - } - - @Override - public CompletionStage> getOpenOrders(Keys keys, String symbol) { - - String queryStr = String.format( - "symbol=%s×tamp=%d", symbol, System.currentTimeMillis()); - - return makeSignedRequest(keys, HttpMethod.GET, OPEN_ORDERS_ENDPOINT, queryStr, - new TypeReference>() { - } - ); - } - - @Override - public CompletionStage getAccount(Keys keys) { - - String queryStr = String.format( - "timestamp=%d", System.currentTimeMillis()); - - return makeSignedRequest(keys, HttpMethod.GET, ACCOUNT_ENDPOINT, queryStr, - new TypeReference() { - } - ); - } - - private CompletionStage makeSignedRequest(Keys keys, HttpMethod method, String endpoint, - String queryStr, TypeReference typeReference) { - - return CompletableFuture.supplyAsync(() -> { - try { - String signature = signQueryString(keys, queryStr); - String url = API_V3_URL + endpoint + "?" + queryStr + "&signature=" + signature; - BoundRequestBuilder boundRequestBuilder; - if (method == HttpMethod.GET) { - boundRequestBuilder = asyncHttpClient.prepareGet(url); - } else if (method == HttpMethod.POST) { - boundRequestBuilder = asyncHttpClient.preparePost(url); - } else if (method == HttpMethod.DELETE) { - boundRequestBuilder = asyncHttpClient.prepareDelete(url); - } else { - throw new IllegalArgumentException("Unsupported method: " + method); - } - return handleResponse(boundRequestBuilder - .addHeader( - APIKEY_HEADER, keys.getApiKey()) - .execute().toCompletableFuture(), typeReference); - } catch (UnsupportedEncodingException | NoSuchAlgorithmException | InvalidKeyException e) { - throw new CompletionException(e); - } - }).thenCompose(Function.identity()); - } - - private String signQueryString(Keys keys, String queryString) - throws InvalidKeyException, NoSuchAlgorithmException, UnsupportedEncodingException { - - byte[] byteKey = keys.getSecretKey().getBytes("UTF-8"); - Mac sha256HMAC = Mac.getInstance(HMAC_SHA256); - sha256HMAC.init(new SecretKeySpec(byteKey, HMAC_SHA256)); - return bytesToHex(sha256HMAC.doFinal(queryString.getBytes("UTF-8"))); - } - - private CompletionStage handleResponse(CompletableFuture responseFuture, - TypeReference typeReference) { - - return responseFuture.thenApply(response -> { - try { - if (response.getStatusCode() >= 400) { - throw new ClientErrorException(response.getStatusCode(), - objectMapper.readValue(response.getResponseBody(), ErrorDetails.class)); - } - return objectMapper.readValue(response.getResponseBody(), typeReference); - } catch (IOException e) { - throw new CompletionException(e); - } - }); - } - - final private static char[] hexArray = "0123456789ABCDEF" - .toCharArray(); - - private String bytesToHex(byte[] bytes) { - - char[] hexChars = new char[bytes.length * 2]; - int v; - for (int j = 0; j < bytes.length; j++) { - v = bytes[j] & 0xFF; - hexChars[j * 2] = hexArray[v >>> 4]; - hexChars[j * 2 + 1] = hexArray[v & 0x0F]; - } - return new String(hexChars); - } -} diff --git a/library/Binance/src/main/java/com/github/johnsiu/binance/httpclients/BinanceClient.java b/library/Binance/src/main/java/com/github/johnsiu/binance/httpclients/BinanceClient.java deleted file mode 100644 index 1bf6650..0000000 --- a/library/Binance/src/main/java/com/github/johnsiu/binance/httpclients/BinanceClient.java +++ /dev/null @@ -1,68 +0,0 @@ -package com.github.johnsiu.binance.httpclients; - -import com.github.johnsiu.binance.models.Account; -import com.github.johnsiu.binance.models.CancelOrder; -import com.github.johnsiu.binance.models.Depth; -import com.github.johnsiu.binance.models.Keys; -import com.github.johnsiu.binance.models.Order; -import com.github.johnsiu.binance.models.Order.OrderSide; -import com.github.johnsiu.binance.models.Order.TimeInForce; -import com.github.johnsiu.binance.models.OrderStatus; -import com.github.johnsiu.binance.models.Ticker; -import com.google.inject.ImplementedBy; -import java.util.List; - -/** - * Client for accessing Binance API. - */ -@ImplementedBy(BinanceClientImpl.class) -public interface BinanceClient { - - /** - * Get the ticker given the symbol. - */ - Ticker getTicker(String symbol); - - /** - * Get the depth given the symbol. Limit defaults to 100. - */ - Depth getDepth(String symbol); - - /** - * Get the depth given the symbol and limit. - */ - Depth getDepth(String symbol, int limit); - - /** - * Place a LIMIT order. - */ - Order placeLimitOrder(Keys keys, String symbol, OrderSide side, - TimeInForce timeInForce, double quantity, double price); - - /** - * Place a MARKET order. - */ - Order placeMarketOrder(Keys keys, String symbol, OrderSide side, - double quantity); - - /** - * Check the status of an order. - */ - OrderStatus checkOrderStatus(Keys keys, Order order); - - /** - * Cancel an order. - */ - CancelOrder cancelOrder(Keys keys, Order order); - - /** - * Get all open orders. - */ - List getOpenOrders(Keys keys, String symbol); - - /** - * Get account info. - */ - Account getAccount(Keys keys); - -} diff --git a/library/Binance/src/main/java/com/github/johnsiu/binance/httpclients/BinanceClientImpl.java b/library/Binance/src/main/java/com/github/johnsiu/binance/httpclients/BinanceClientImpl.java deleted file mode 100644 index 1e88d54..0000000 --- a/library/Binance/src/main/java/com/github/johnsiu/binance/httpclients/BinanceClientImpl.java +++ /dev/null @@ -1,90 +0,0 @@ -package com.github.johnsiu.binance.httpclients; - -import com.github.johnsiu.binance.models.Account; -import com.github.johnsiu.binance.models.CancelOrder; -import com.github.johnsiu.binance.models.Depth; -import com.github.johnsiu.binance.models.Keys; -import com.github.johnsiu.binance.models.Order; -import com.github.johnsiu.binance.models.Order.OrderSide; -import com.github.johnsiu.binance.models.Order.TimeInForce; -import com.github.johnsiu.binance.models.OrderStatus; -import com.github.johnsiu.binance.models.Ticker; -import java.util.List; -import java.util.concurrent.CompletionException; -import java.util.concurrent.CompletionStage; -import javax.inject.Inject; - -/** - * Concrete implementation of {@link BinanceClient}. - */ -public class BinanceClientImpl implements BinanceClient { - - private final AsyncBinanceClient asyncBinanceClient; - - @Inject - public BinanceClientImpl(AsyncBinanceClient asyncBinanceClient) { - this.asyncBinanceClient = asyncBinanceClient; - } - - @Override - public Ticker getTicker(String symbol) { - return joinAsync(asyncBinanceClient.getTicker(symbol)); - } - - @Override - public Depth getDepth(String symbol) { - return joinAsync(asyncBinanceClient.getDepth(symbol)); - } - - @Override - public Depth getDepth(String symbol, int limit) { - return joinAsync(asyncBinanceClient.getDepth(symbol, limit)); - } - - @Override - public Order placeLimitOrder(Keys keys, String symbol, OrderSide side, - TimeInForce timeInForce, double quantity, double price) { - return joinAsync( - asyncBinanceClient.placeLimitOrder(keys, symbol, side, timeInForce, quantity, price) - ); - } - - @Override - public Order placeMarketOrder(Keys keys, String symbol, OrderSide side, - double quantity) { - return joinAsync( - asyncBinanceClient.placeMarketOrder(keys, symbol, side, quantity) - ); - } - - @Override - public OrderStatus checkOrderStatus(Keys keys, Order order) { - return joinAsync(asyncBinanceClient.checkOrderStatus(keys, order)); - } - - @Override - public CancelOrder cancelOrder(Keys keys, Order order) { - return joinAsync(asyncBinanceClient.cancelOrder(keys, order)); - } - - @Override - public List getOpenOrders(Keys keys, String symbol) { - return joinAsync(asyncBinanceClient.getOpenOrders(keys, symbol)); - } - - @Override - public Account getAccount(Keys keys) { - return joinAsync(asyncBinanceClient.getAccount(keys)); - } - - private T joinAsync(CompletionStage completionStage) { - try { - return completionStage.toCompletableFuture().join(); - } catch (CompletionException e) { - if (e.getCause() instanceof RuntimeException) { - throw (RuntimeException) e.getCause(); - } - throw new RuntimeException(e.getCause()); - } - } -} diff --git a/library/Binance/src/main/java/com/github/johnsiu/binance/inject/BinanceClientModule.java b/library/Binance/src/main/java/com/github/johnsiu/binance/inject/BinanceClientModule.java deleted file mode 100644 index b1696d1..0000000 --- a/library/Binance/src/main/java/com/github/johnsiu/binance/inject/BinanceClientModule.java +++ /dev/null @@ -1,24 +0,0 @@ -package com.github.johnsiu.binance.inject; - -import com.fasterxml.jackson.databind.ObjectMapper; -import com.google.inject.AbstractModule; -import com.google.inject.name.Names; -import org.asynchttpclient.AsyncHttpClient; -import org.asynchttpclient.DefaultAsyncHttpClient; - -/** - * Guice module for dependency injection. - */ -public class BinanceClientModule extends AbstractModule { - - public static final String BINANCE_CLIENT = "BinanceClient"; - - @Override - protected void configure() { - ObjectMapper objectMapper = new ObjectMapper(); - bind(ObjectMapper.class) - .annotatedWith(Names.named(BINANCE_CLIENT)) - .toInstance(objectMapper); - bind(AsyncHttpClient.class).to(DefaultAsyncHttpClient.class); - } -} diff --git a/library/Binance/src/main/java/com/github/johnsiu/binance/models/Account.java b/library/Binance/src/main/java/com/github/johnsiu/binance/models/Account.java deleted file mode 100644 index b44b2df..0000000 --- a/library/Binance/src/main/java/com/github/johnsiu/binance/models/Account.java +++ /dev/null @@ -1,98 +0,0 @@ -package com.github.johnsiu.binance.models; - -import com.fasterxml.jackson.databind.annotation.JsonDeserialize; -import java.util.Map; -import com.github.johnsiu.binance.deser.BalanceMapDeserializer; - -/** - * Represents an account info. - */ -public class Account { - - private int makerCommission; - private int takerCommission; - private int buyerCommission; - private int sellerCommission; - private boolean canTrade; - private boolean canWithdraw; - private boolean canDeposit; - // asset to Balance - private Map balances; - - public int getMakerCommission() { - return makerCommission; - } - - public int getTakerCommission() { - return takerCommission; - } - - public int getBuyerCommission() { - return buyerCommission; - } - - public int getSellerCommission() { - return sellerCommission; - } - - public boolean isCanTrade() { - return canTrade; - } - - public boolean isCanWithdraw() { - return canWithdraw; - } - - public boolean isCanDeposit() { - return canDeposit; - } - - @JsonDeserialize(using = BalanceMapDeserializer.class) - public Map getBalances() { - return balances; - } - - @Override - public String toString() { - return "Account{" + - "makerCommission=" + makerCommission + - ", takerCommission=" + takerCommission + - ", buyerCommission=" + buyerCommission + - ", sellerCommission=" + sellerCommission + - ", canTrade=" + canTrade + - ", canWithdraw=" + canWithdraw + - ", canDeposit=" + canDeposit + - ", balances=" + balances + - '}'; - } - - public static class Balance { - - private String asset; - private double free; - private double locked; - - public String getAsset() { - return asset; - } - - public double getFree() { - return free; - } - - public double getLocked() { - return locked; - } - - @Override - public String toString() { - return "Balance{" + - "asset='" + asset + '\'' + - ", free=" + free + - ", locked=" + locked + - '}'; - } - } - -} - diff --git a/library/Binance/src/main/java/com/github/johnsiu/binance/models/CancelOrder.java b/library/Binance/src/main/java/com/github/johnsiu/binance/models/CancelOrder.java deleted file mode 100644 index f597696..0000000 --- a/library/Binance/src/main/java/com/github/johnsiu/binance/models/CancelOrder.java +++ /dev/null @@ -1,38 +0,0 @@ -package com.github.johnsiu.binance.models; - -/** - * Represents a cancel order. - */ -public class CancelOrder { - - private String symbol; - private long orderId; - private String origClientOrderId; - private String clientOrderId; - - public String getSymbol() { - return symbol; - } - - public long getOrderId() { - return orderId; - } - - public String getOrigClientOrderId() { - return origClientOrderId; - } - - public String getClientOrderId() { - return clientOrderId; - } - - @Override - public String toString() { - return "CancelOrder{" + - "symbol='" + symbol + '\'' + - ", orderId=" + orderId + - ", origClientOrderId='" + origClientOrderId + '\'' + - ", clientOrderId='" + clientOrderId + '\'' + - '}'; - } -} diff --git a/library/Binance/src/main/java/com/github/johnsiu/binance/models/Depth.java b/library/Binance/src/main/java/com/github/johnsiu/binance/models/Depth.java deleted file mode 100644 index d4e66e5..0000000 --- a/library/Binance/src/main/java/com/github/johnsiu/binance/models/Depth.java +++ /dev/null @@ -1,61 +0,0 @@ -package com.github.johnsiu.binance.models; - -import com.fasterxml.jackson.annotation.JsonCreator; -import com.fasterxml.jackson.annotation.JsonProperty; -import com.google.common.collect.ImmutableList; -import com.google.common.collect.ImmutableList.Builder; -import java.util.Collection; -import java.util.Iterator; -import java.util.List; -import java.util.function.Function; - -/** - * Represents depth of a symbol. - */ -public class Depth { - - private long lastUpdateId; - private List bids; - private List asks; - - @JsonCreator - public Depth(@JsonProperty("lastUpdateId") long lastUpdateId, @JsonProperty("bids") List bids, - @JsonProperty("asks") List asks) { - this.lastUpdateId = lastUpdateId; - - Function, List> buildOrdersFunc = (orders) -> { - Builder ordersBuilder = ImmutableList.builder(); - if (orders != null && orders.size() >= 2) { - orders.forEach(value -> { - Iterator iterator = Collection.class.cast(value).iterator(); - ordersBuilder.add(new PriceQuantity(Double.valueOf((String) iterator.next()), - Double.valueOf((String) iterator.next()))); - }); - } - return ordersBuilder.build(); - }; - this.bids = buildOrdersFunc.apply(bids); - this.asks = buildOrdersFunc.apply(asks); - } - - public long getLastUpdateId() { - return lastUpdateId; - } - - public List getBids() { - return bids; - } - - public List getAsks() { - return asks; - } - - @Override - public String toString() { - return "Depth{" + - "lastUpdateId=" + lastUpdateId + - ", bids=" + bids + - ", asks=" + asks + - '}'; - } -} diff --git a/library/Binance/src/main/java/com/github/johnsiu/binance/models/ErrorDetails.java b/library/Binance/src/main/java/com/github/johnsiu/binance/models/ErrorDetails.java deleted file mode 100644 index 5145c3c..0000000 --- a/library/Binance/src/main/java/com/github/johnsiu/binance/models/ErrorDetails.java +++ /dev/null @@ -1,26 +0,0 @@ -package com.github.johnsiu.binance.models; - -/** - * Represents an error from Binance API. - */ -public class ErrorDetails { - - private long code; - private String msg; - - public long getCode() { - return code; - } - - public String getMsg() { - return msg; - } - - @Override - public String toString() { - return "ErrorDetails{" + - "code=" + code + - ", msg='" + msg + '\'' + - '}'; - } -} diff --git a/library/Binance/src/main/java/com/github/johnsiu/binance/models/Keys.java b/library/Binance/src/main/java/com/github/johnsiu/binance/models/Keys.java deleted file mode 100644 index d4c5215..0000000 --- a/library/Binance/src/main/java/com/github/johnsiu/binance/models/Keys.java +++ /dev/null @@ -1,23 +0,0 @@ -package com.github.johnsiu.binance.models; - -/** - * Represents API key and secret key for accessing SIGNED endpoints. - */ -public class Keys { - - private String apiKey; - private String secretKey; - - public Keys(String apiKey, String secretKey) { - this.apiKey = apiKey; - this.secretKey = secretKey; - } - - public String getApiKey() { - return apiKey; - } - - public String getSecretKey() { - return secretKey; - } -} diff --git a/library/Binance/src/main/java/com/github/johnsiu/binance/models/Order.java b/library/Binance/src/main/java/com/github/johnsiu/binance/models/Order.java deleted file mode 100644 index c760b3a..0000000 --- a/library/Binance/src/main/java/com/github/johnsiu/binance/models/Order.java +++ /dev/null @@ -1,55 +0,0 @@ -package com.github.johnsiu.binance.models; - -import java.util.Date; - -/** - * Represents an Order. Can be cancelled. - */ -public class Order { - - private String symbol; - private long orderId; - private String clientOrderId; - private Date transactTime; - - public String getSymbol() { - return symbol; - } - - public long getOrderId() { - return orderId; - } - - public String getClientOrderId() { - return clientOrderId; - } - - public Date getTransactTime() { - return transactTime; - } - - @Override - public String toString() { - return "Order{" + - "symbol='" + symbol + '\'' + - ", orderId=" + orderId + - ", clientOrderId='" + clientOrderId + '\'' + - ", transactTime=" + transactTime + - '}'; - } - - public enum OrderSide { - BUY, SELL - } - - public enum OrderType { - LIMIT, MARKET - } - - public enum TimeInForce { - // Good Till Cancel - GTC, - // Immediate or Cancel - IOC - } -} diff --git a/library/Binance/src/main/java/com/github/johnsiu/binance/models/OrderStatus.java b/library/Binance/src/main/java/com/github/johnsiu/binance/models/OrderStatus.java deleted file mode 100644 index 82a71cd..0000000 --- a/library/Binance/src/main/java/com/github/johnsiu/binance/models/OrderStatus.java +++ /dev/null @@ -1,86 +0,0 @@ -package com.github.johnsiu.binance.models; - -import java.util.Date; - -/** - * Represents an order status. Can be cancelled. - */ -public class OrderStatus extends Order { - - private String price; - private String origQty; - private String executedQty; - private Status status; - private TimeInForce timeInForce; - private OrderType type; - private OrderSide side; - private String stopPrice; - private String icebergQty; - private Date time; - - public String getPrice() { - return price; - } - - public String getOrigQty() { - return origQty; - } - - public String getExecutedQty() { - return executedQty; - } - - public Status getStatus() { - return status; - } - - public TimeInForce getTimeInForce() { - return timeInForce; - } - - public OrderType getType() { - return type; - } - - public OrderSide getSide() { - return side; - } - - public String getStopPrice() { - return stopPrice; - } - - public String getIcebergQty() { - return icebergQty; - } - - public Date getTime() { - return time; - } - - @Override - public String toString() { - return "OrderStatus{" + - "price='" + price + '\'' + - ", origQty='" + origQty + '\'' + - ", executedQty='" + executedQty + '\'' + - ", status=" + status + - ", timeInForce=" + timeInForce + - ", type=" + type + - ", side=" + side + - ", stopPrice='" + stopPrice + '\'' + - ", icebergQty='" + icebergQty + '\'' + - ", time=" + time + - "} " + super.toString(); - } - - public enum Status { - NEW, - PARTIALLY_FILLED, - FILLED, - CANCELED, - PENDING_CANCEL, - REJECTED, - EXPIRED - } -} diff --git a/library/Binance/src/main/java/com/github/johnsiu/binance/models/PriceQuantity.java b/library/Binance/src/main/java/com/github/johnsiu/binance/models/PriceQuantity.java deleted file mode 100644 index 9b3cc1f..0000000 --- a/library/Binance/src/main/java/com/github/johnsiu/binance/models/PriceQuantity.java +++ /dev/null @@ -1,31 +0,0 @@ -package com.github.johnsiu.binance.models; - -/** - * Represents price and quantity of a bid or an ask. - */ -public class PriceQuantity { - - private double price; - private double quantity; - - public PriceQuantity(double price, double quantity) { - this.price = price; - this.quantity = quantity; - } - - public double getPrice() { - return price; - } - - public double getQuantity() { - return quantity; - } - - @Override - public String toString() { - return "PriceQuantity{" + - "price=" + price + - ", quantity=" + quantity + - '}'; - } -} diff --git a/library/Binance/src/main/java/com/github/johnsiu/binance/models/Ticker.java b/library/Binance/src/main/java/com/github/johnsiu/binance/models/Ticker.java deleted file mode 100644 index ccb9bbd..0000000 --- a/library/Binance/src/main/java/com/github/johnsiu/binance/models/Ticker.java +++ /dev/null @@ -1,137 +0,0 @@ -package com.github.johnsiu.binance.models; - -import java.util.Date; - -/** - * Represents a ticker of a symbol. - */ -public class Ticker { - - private double priceChange; - private double priceChangePercent; - private double weightedAvgPrice; - private double prevClosePrice; - private double lastPrice; - private double lastQty; - private double bidPrice; - private double bidQty; - private double askPrice; - private double askQty; - private double openPrice; - private double highPrice; - private double lowPrice; - private double volume; - private double quoteVolume; - private Date openTime; - private Date closeTime; - private long firstId; - private long lastId; - private long count; - - public double getPriceChange() { - return priceChange; - } - - public double getPriceChangePercent() { - return priceChangePercent; - } - - public double getWeightedAvgPrice() { - return weightedAvgPrice; - } - - public double getPrevClosePrice() { - return prevClosePrice; - } - - public double getLastPrice() { - return lastPrice; - } - - public double getLastQty() { - return lastQty; - } - - public double getBidPrice() { - return bidPrice; - } - - public double getBidQty() { - return bidQty; - } - - public double getAskPrice() { - return askPrice; - } - - public double getAskQty() { - return askQty; - } - - public double getOpenPrice() { - return openPrice; - } - - public double getHighPrice() { - return highPrice; - } - - public double getLowPrice() { - return lowPrice; - } - - public double getVolume() { - return volume; - } - - public double getQuoteVolume() { - return quoteVolume; - } - - public Date getOpenTime() { - return openTime; - } - - public Date getCloseTime() { - return closeTime; - } - - public long getFirstId() { - return firstId; - } - - public long getLastId() { - return lastId; - } - - public long getCount() { - return count; - } - - @Override - public String toString() { - return "Ticker{" + - "priceChange=" + priceChange + - ", priceChangePercent=" + priceChangePercent + - ", weightedAvgPrice=" + weightedAvgPrice + - ", prevClosePrice=" + prevClosePrice + - ", lastPrice=" + lastPrice + - ", lastQty=" + lastQty + - ", bidPrice=" + bidPrice + - ", bidQty=" + bidQty + - ", askPrice=" + askPrice + - ", askQty=" + askQty + - ", openPrice=" + openPrice + - ", highPrice=" + highPrice + - ", lowPrice=" + lowPrice + - ", volume=" + volume + - ", quoteVolume=" + quoteVolume + - ", openTime=" + openTime + - ", closeTime=" + closeTime + - ", firstId=" + firstId + - ", lastId=" + lastId + - ", count=" + count + - '}'; - } - -} diff --git a/library/Binance/src/test/java/com/github/johnsiu/binance/httpclients/BinanceClientImplTest.java b/library/Binance/src/test/java/com/github/johnsiu/binance/httpclients/BinanceClientImplTest.java deleted file mode 100644 index 24a62b8..0000000 --- a/library/Binance/src/test/java/com/github/johnsiu/binance/httpclients/BinanceClientImplTest.java +++ /dev/null @@ -1,87 +0,0 @@ -package com.github.johnsiu.binance.httpclients; - -import com.github.johnsiu.binance.exceptions.ClientErrorException; -import com.github.johnsiu.binance.inject.BinanceClientModule; -import com.github.johnsiu.binance.models.Account; -import com.github.johnsiu.binance.models.Depth; -import com.github.johnsiu.binance.models.Keys; -import com.github.johnsiu.binance.models.Order; -import com.github.johnsiu.binance.models.Order.OrderSide; -import com.github.johnsiu.binance.models.Order.TimeInForce; -import com.github.johnsiu.binance.models.OrderStatus; -import com.google.inject.Guice; -import com.google.inject.Injector; -import java.util.List; -import org.junit.Assert; -import org.junit.Test; - -/** - * Test case for {@link BinanceClientImpl} - */ -public class BinanceClientImplTest { - - @Test - public void testGetTicker() { - Injector injector = Guice.createInjector(new BinanceClientModule()); - BinanceClient client = injector.getInstance(BinanceClient.class); - - Assert.assertNotNull(client.getTicker("ETHBTC")); - } - - @Test - public void testGetDepth() { - Injector injector = Guice.createInjector(new BinanceClientModule()); - BinanceClient client = injector.getInstance(BinanceClient.class); - - Assert.assertNotNull(client.getDepth("ETHBTC")); - } - - @Test - public void testGetDepthError() { - Injector injector = Guice.createInjector(new BinanceClientModule()); - BinanceClient client = injector.getInstance(BinanceClient.class); - - try { - Depth depth = client.getDepth("ETHBT"); - Assert.fail(); - } catch (Exception e) { - ClientErrorException cast = (ClientErrorException) e; - Assert.assertEquals("Invalid symbol.", cast.getErrorDetails().getMsg()); - } - } - - @Test - public void testOrder() { - Injector injector = Guice.createInjector(new BinanceClientModule()); - BinanceClient client = injector.getInstance(BinanceClient.class); - - Keys keys = new Keys(System.getProperty("apiKey"), - System.getProperty("secretKey")); - String symbol = "MCOETH"; - Order order = client - .placeLimitOrder(keys, symbol, OrderSide.BUY, TimeInForce.GTC, 1, 0.020041); - Assert.assertNotNull(order); - - OrderStatus orderStatus = client.checkOrderStatus(keys, order); - Assert.assertNotNull(orderStatus); - - List openOrders = client.getOpenOrders(keys, symbol); - Assert.assertFalse(openOrders.isEmpty()); - - openOrders.forEach(openOrder -> client.cancelOrder(keys, openOrder)); - - openOrders = client.getOpenOrders(keys, symbol); - Assert.assertTrue(openOrders.isEmpty()); - } - - @Test - public void testAccount() { - Injector injector = Guice.createInjector(new BinanceClientModule()); - BinanceClient client = injector.getInstance(BinanceClient.class); - - Keys keys = new Keys(System.getProperty("apiKey"), - System.getProperty("secretKey")); - Account account = client.getAccount(keys); - Assert.assertNotNull(account); - } -} diff --git a/libs/binance-api.jar b/libs/binance-api.jar new file mode 100644 index 0000000000000000000000000000000000000000..517d8005dc6365d70c8e9efe0c064c4c8e79afc8 GIT binary patch literal 159834 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%0DEJRaaOyJ{Nh9_ks2kp77!*O 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

rXanExYsh-2@;!|*^@tL9?Ubd;V;9vYd7;Qy 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

wXNANA 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 F^MC#K`r!Zo literal 0 HcmV?d00001