Fix and features

- Fix symbol bug when selecting form ETH|BTC|USDT currencies from Binance
- Add candlestick chart in detail activity
This commit is contained in:
Tanguy Herbron 2018-04-10 13:57:46 +02:00
parent 0ab73ddc87
commit f1a4a03a5a
5 changed files with 215 additions and 56 deletions

View File

@ -10,14 +10,13 @@ import android.graphics.drawable.BitmapDrawable;
import android.graphics.drawable.Drawable; import android.graphics.drawable.Drawable;
import android.os.AsyncTask; import android.os.AsyncTask;
import android.os.Bundle; import android.os.Bundle;
import android.preference.SwitchPreference;
import android.support.annotation.NonNull; import android.support.annotation.NonNull;
import android.support.design.widget.BottomNavigationView; import android.support.design.widget.BottomNavigationView;
import android.support.design.widget.Snackbar;
import android.support.v4.app.NavUtils; import android.support.v4.app.NavUtils;
import android.support.v4.content.ContextCompat; import android.support.v4.content.ContextCompat;
import android.support.v7.app.ActionBar; import android.support.v7.app.ActionBar;
import android.support.v7.app.AppCompatActivity; import android.support.v7.app.AppCompatActivity;
import android.util.Log;
import android.view.LayoutInflater; import android.view.LayoutInflater;
import android.view.MenuItem; import android.view.MenuItem;
import android.view.MotionEvent; import android.view.MotionEvent;
@ -30,16 +29,19 @@ import android.widget.ViewFlipper;
import com.binance.api.client.domain.account.Trade; import com.binance.api.client.domain.account.Trade;
import com.daimajia.swipe.SwipeLayout; import com.daimajia.swipe.SwipeLayout;
import com.github.mikephil.charting.charts.BarChart; import com.github.mikephil.charting.charts.BarChart;
import com.github.mikephil.charting.charts.CandleStickChart;
import com.github.mikephil.charting.charts.LineChart; import com.github.mikephil.charting.charts.LineChart;
import com.github.mikephil.charting.data.BarData; import com.github.mikephil.charting.data.BarData;
import com.github.mikephil.charting.data.BarDataSet; import com.github.mikephil.charting.data.BarDataSet;
import com.github.mikephil.charting.data.BarEntry; import com.github.mikephil.charting.data.BarEntry;
import com.github.mikephil.charting.data.CandleData;
import com.github.mikephil.charting.data.CandleDataSet;
import com.github.mikephil.charting.data.CandleEntry;
import com.github.mikephil.charting.data.Entry; import com.github.mikephil.charting.data.Entry;
import com.github.mikephil.charting.data.LineData; import com.github.mikephil.charting.data.LineData;
import com.github.mikephil.charting.data.LineDataSet; import com.github.mikephil.charting.data.LineDataSet;
import com.github.mikephil.charting.highlight.Highlight; import com.github.mikephil.charting.highlight.Highlight;
import com.github.mikephil.charting.listener.OnChartValueSelectedListener; import com.github.mikephil.charting.listener.OnChartValueSelectedListener;
import com.nauk.coinfolio.DataManagers.BalanceManager;
import com.nauk.coinfolio.DataManagers.CurrencyData.Currency; import com.nauk.coinfolio.DataManagers.CurrencyData.Currency;
import com.nauk.coinfolio.DataManagers.CurrencyData.CurrencyDataChart; import com.nauk.coinfolio.DataManagers.CurrencyData.CurrencyDataChart;
import com.nauk.coinfolio.DataManagers.CurrencyData.Transaction; import com.nauk.coinfolio.DataManagers.CurrencyData.Transaction;
@ -54,6 +56,7 @@ import java.text.NumberFormat;
import java.text.SimpleDateFormat; import java.text.SimpleDateFormat;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Date; import java.util.Date;
import java.util.HashMap;
import java.util.List; import java.util.List;
import java.util.Locale; import java.util.Locale;
@ -77,10 +80,16 @@ public class CurrencyDetailsActivity extends AppCompatActivity {
private final static int YEAR = 4; private final static int YEAR = 4;
private List<CurrencyDataChart> dataChartList; private List<CurrencyDataChart> dataChartList;
private LineChart lineChart; private LineChart lineChart;
private CandleStickChart candleStickChart;
private BarChart barChart; private BarChart barChart;
private PreferencesManager preferencesManager; private PreferencesManager preferencesManager;
private BinanceManager binanceManager; private BinanceManager binanceManager;
private boolean displayLineChart;
private Button lineChartButton;
private Button candleStickChartButton;
private BottomNavigationView.OnNavigationItemSelectedListener mOnNavigationItemSelectedListener private BottomNavigationView.OnNavigationItemSelectedListener mOnNavigationItemSelectedListener
= new BottomNavigationView.OnNavigationItemSelectedListener() { = new BottomNavigationView.OnNavigationItemSelectedListener() {
@ -133,13 +142,44 @@ public class CurrencyDetailsActivity extends AppCompatActivity {
databaseManager = new DatabaseManager(this); databaseManager = new DatabaseManager(this);
preferencesManager = new PreferencesManager(this); preferencesManager = new PreferencesManager(this);
displayLineChart = true;
viewFlipper = findViewById(R.id.vfCurrencyDetails); viewFlipper = findViewById(R.id.vfCurrencyDetails);
transactionLayout = findViewById(R.id.listTransactions); transactionLayout = findViewById(R.id.listTransactions);
tradeLayout = findViewById(R.id.listTrades); tradeLayout = findViewById(R.id.listTrades);
lineChart = findViewById(R.id.chartPriceView); lineChart = findViewById(R.id.chartPriceView);
candleStickChart = findViewById(R.id.chartCandleStickView);
barChart = findViewById(R.id.chartVolumeView); barChart = findViewById(R.id.chartVolumeView);
lineChartButton = findViewById(R.id.lineChartButton);
candleStickChartButton = findViewById(R.id.candleStickChartButton);
binanceManager = new BinanceManager(preferencesManager.getBinancePublicKey(), preferencesManager.getBinancePrivateKey()); binanceManager = new BinanceManager(preferencesManager.getBinancePublicKey(), preferencesManager.getBinancePrivateKey());
lineChartButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
lineChartButton.setEnabled(false);
candleStickChartButton.setEnabled(true);
lineChart.setVisibility(View.VISIBLE);
candleStickChart.setVisibility(View.GONE);
displayLineChart = true;
}
});
candleStickChartButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
lineChartButton.setEnabled(true);
candleStickChartButton.setEnabled(false);
lineChart.setVisibility(View.GONE);
candleStickChart.setVisibility(View.VISIBLE);
displayLineChart = false;
}
});
((BottomNavigationView) findViewById(R.id.navigation_details)).getMenu().getItem(1).setEnabled(false); ((BottomNavigationView) findViewById(R.id.navigation_details)).getMenu().getItem(1).setEnabled(false);
setupActionBar(); setupActionBar();
@ -147,6 +187,8 @@ public class CurrencyDetailsActivity extends AppCompatActivity {
drawTransactionList(); drawTransactionList();
initializeButtons(); initializeButtons();
initializeLineChart(lineChart);
initializeCandleStickChart(candleStickChart);
updateChartTab(DAY, 1); updateChartTab(DAY, 1);
@ -225,6 +267,7 @@ public class CurrencyDetailsActivity extends AppCompatActivity {
private void updateCharts(Button button) private void updateCharts(Button button)
{ {
findViewById(R.id.chartPriceView).setVisibility(View.GONE); findViewById(R.id.chartPriceView).setVisibility(View.GONE);
findViewById(R.id.chartCandleStickView).setVisibility(View.GONE);
findViewById(R.id.chartVolumeView).setVisibility(View.GONE); findViewById(R.id.chartVolumeView).setVisibility(View.GONE);
findViewById(R.id.progressLayoutChart).setVisibility(View.VISIBLE); findViewById(R.id.progressLayoutChart).setVisibility(View.VISIBLE);
@ -325,8 +368,22 @@ public class CurrencyDetailsActivity extends AppCompatActivity {
private void updateChartTab(int timeUnit, int amount) private void updateChartTab(int timeUnit, int amount)
{ {
updateChartsData(timeUnit, amount); updateChartsData(timeUnit, amount);
drawPriceChart(); drawPriceLineChart();
drawPriceCandleStickChart();
if(displayLineChart)
{
findViewById(R.id.chartPriceView).setVisibility(View.VISIBLE);
findViewById(R.id.progressLayoutChart).setVisibility(View.GONE);
}
else
{
findViewById(R.id.chartCandleStickView).setVisibility(View.VISIBLE);
findViewById(R.id.progressLayoutChart).setVisibility(View.GONE);
}
drawVolumeChart(); drawVolumeChart();
updateGeneralData(lineChart.getData().getDataSets().get(0).getEntryForIndex(0).getY(), lineChart.getData().getDataSets().get(0).getEntryForIndex(lineChart.getData().getDataSets().get(0).getEntryCount() - 1).getY());
} }
private void updateChartsData(int timeUnit, int amount) private void updateChartsData(int timeUnit, int amount)
@ -399,11 +456,14 @@ public class CurrencyDetailsActivity extends AppCompatActivity {
barChart.setFitBars(true); barChart.setFitBars(true);
} }
private void drawPriceChart() private void drawPriceCandleStickChart()
{ {
initializeLineChart(lineChart); candleStickChart.setData(generatePriceCandleStickChartSet());
}
lineChart.setData(generatePriceChartSet()); private void drawPriceLineChart()
{
lineChart.setData(generatePriceLineChartSet());
lineChart.getAxisLeft().setAxisMinValue(lineChart.getData().getYMin()); lineChart.getAxisLeft().setAxisMinValue(lineChart.getData().getYMin());
lineChart.setOnChartValueSelectedListener(new OnChartValueSelectedListener() { lineChart.setOnChartValueSelectedListener(new OnChartValueSelectedListener() {
@ -424,11 +484,19 @@ public class CurrencyDetailsActivity extends AppCompatActivity {
return toucheEvent(motionEvent); return toucheEvent(motionEvent);
} }
}); });
}
updateGeneralData(lineChart.getData().getDataSets().get(0).getEntryForIndex(0).getY(), lineChart.getData().getDataSets().get(0).getEntryForIndex(lineChart.getData().getDataSets().get(0).getEntryCount() - 1).getY()); private void initializeCandleStickChart(CandleStickChart candleStickChart)
{
findViewById(R.id.chartPriceView).setVisibility(View.VISIBLE); candleStickChart.setDrawGridBackground(false);
findViewById(R.id.progressLayoutChart).setVisibility(View.GONE); candleStickChart.setDrawBorders(false);
candleStickChart.setDrawMarkers(true);
candleStickChart.getDescription().setEnabled(false);
candleStickChart.getAxisLeft().setEnabled(true);
candleStickChart.getAxisRight().setEnabled(true);
candleStickChart.getLegend().setEnabled(false);
candleStickChart.getXAxis().setEnabled(true);
candleStickChart.setViewPortOffsets(0, 0, 0, 0);
} }
private void initializeLineChart(LineChart lineChart) private void initializeLineChart(LineChart lineChart)
@ -472,8 +540,11 @@ public class CurrencyDetailsActivity extends AppCompatActivity {
timestampPlaceholder = getResources().getString(R.string.timestampPlaceholder, date); timestampPlaceholder = getResources().getString(R.string.timestampPlaceholder, date);
((TextView) findViewById(R.id.volumeHightlight)).setText(volumePlaceholder); ((TextView) findViewById(R.id.volumeHightlight)).setText(volumePlaceholder);
findViewById(R.id.volumeHightlight).setVisibility(View.VISIBLE);
((TextView) findViewById(R.id.priceHightlight)).setText(pricePlaceholder); ((TextView) findViewById(R.id.priceHightlight)).setText(pricePlaceholder);
findViewById(R.id.priceHightlight).setVisibility(View.VISIBLE);
((TextView) findViewById(R.id.timestampHightlight)).setText(timestampPlaceholder); ((TextView) findViewById(R.id.timestampHightlight)).setText(timestampPlaceholder);
findViewById(R.id.timestampHightlight).setVisibility(View.VISIBLE);
} }
@ -492,9 +563,12 @@ public class CurrencyDetailsActivity extends AppCompatActivity {
private void hideDataIndicators() private void hideDataIndicators()
{ {
((TextView) findViewById(R.id.volumeHightlight)).setText("\n"); ((TextView) findViewById(R.id.volumeHightlight)).setText(".\n.");
((TextView) findViewById(R.id.priceHightlight)).setText("\n"); findViewById(R.id.volumeHightlight).setVisibility(View.INVISIBLE);
((TextView) findViewById(R.id.timestampHightlight)).setText("\n"); ((TextView) findViewById(R.id.priceHightlight)).setText(".\n.");
findViewById(R.id.priceHightlight).setVisibility(View.INVISIBLE);
((TextView) findViewById(R.id.timestampHightlight)).setText(".\n.");
findViewById(R.id.timestampHightlight).setVisibility(View.INVISIBLE);
} }
private String getDate(long timeStamp){ private String getDate(long timeStamp){
@ -558,7 +632,43 @@ public class CurrencyDetailsActivity extends AppCompatActivity {
return str; return str;
} }
private LineData generatePriceChartSet() private CandleData generatePriceCandleStickChartSet()
{
CandleDataSet dataSet;
ArrayList<CandleEntry> values = new ArrayList<>();
int offsetRange = (int) Math.floor(dataChartList.size() / 200);
if(offsetRange < 1)
{
offsetRange = 1;
}
for(int i = 0, j = 0; i < dataChartList.size(); i+= offsetRange, j++)
{
values.add(new CandleEntry(j, (float) dataChartList.get(i).getHigh()
, (float) dataChartList.get(i).getLow()
, (float) dataChartList.get(i).getOpen()
, (float) dataChartList.get(i).getClose()));
}
dataSet = new CandleDataSet(values, "History");
dataSet.setDrawIcons(false);
dataSet.setDrawValues(false);
dataSet.setDecreasingColor(getColor(R.color.decreaseCandle));
dataSet.setShowCandleBar(true);
dataSet.setShadowColorSameAsCandle(true);
dataSet.setDecreasingPaintStyle(Paint.Style.FILL);
dataSet.setIncreasingColor(getColor(R.color.increaseCandle));
dataSet.setIncreasingPaintStyle(Paint.Style.STROKE);
dataSet.setNeutralColor(getColor(R.color.increaseCandle));
dataSet.setHighLightColor(getColor(R.color.colorAccent));
dataSet.setDrawHorizontalHighlightIndicator(false);
return new CandleData(dataSet);
}
private LineData generatePriceLineChartSet()
{ {
LineDataSet dataSet; LineDataSet dataSet;
ArrayList<Entry> values = new ArrayList<>(); ArrayList<Entry> values = new ArrayList<>();
@ -656,36 +766,39 @@ public class CurrencyDetailsActivity extends AppCompatActivity {
return transColor; return transColor;
} }
private void drawTradeList(List<Trade> trades, String pairSymbol) private void drawTradeList(HashMap<String, List<Trade>> trades)
{ {
findViewById(R.id.tradeProgressBar).setVisibility(View.GONE); findViewById(R.id.tradeProgressBar).setVisibility(View.GONE);
tradeLayout.removeAllViews(); tradeLayout.removeAllViews();
for(int i = trades.size()-1; i >= 0; i--) for(String key : trades.keySet())
{ {
View view = LayoutInflater.from(this).inflate(R.layout.custom_trade_row, null); for(int i = trades.get(key).size()-1; i >= 0; i--)
TextView amountTxtView = view.findViewById(R.id.amountPurchased);
TextView purchasedPrice = view.findViewById(R.id.purchasedPrice);
TextView tradePair = view.findViewById(R.id.pair);
TextView dateTxtView = view.findViewById(R.id.tradeDate);
View tradeIndicator = view.findViewById(R.id.tradeIndicator);
if(trades.get(i).isBuyer())
{ {
tradeIndicator.setBackgroundColor(getColor(R.color.green)); View view = LayoutInflater.from(this).inflate(R.layout.custom_trade_row, null);
} TextView amountTxtView = view.findViewById(R.id.amountPurchased);
else TextView purchasedPrice = view.findViewById(R.id.purchasedPrice);
{ TextView tradePair = view.findViewById(R.id.pair);
tradeIndicator.setBackgroundColor(getColor(R.color.red)); TextView dateTxtView = view.findViewById(R.id.tradeDate);
} View tradeIndicator = view.findViewById(R.id.tradeIndicator);
amountTxtView.setText(String.valueOf(trades.get(i).getQty())); if(trades.get(key).get(i).isBuyer())
purchasedPrice.setText(trades.get(i).getPrice()); {
dateTxtView.setText(getDate(trades.get(i).getTime())); tradeIndicator.setBackgroundColor(getColor(R.color.green));
tradePair.setText(currency.getSymbol() + "/" + pairSymbol); }
else
{
tradeIndicator.setBackgroundColor(getColor(R.color.red));
}
tradeLayout.addView(view); amountTxtView.setText(String.valueOf(trades.get(key).get(i).getQty()));
purchasedPrice.setText(trades.get(key).get(i).getPrice());
dateTxtView.setText(getDate(trades.get(key).get(i).getTime()));
tradePair.setText(currency.getSymbol() + "/" + key);
tradeLayout.addView(view);
}
} }
} }
@ -790,12 +903,12 @@ public class CurrencyDetailsActivity extends AppCompatActivity {
binanceManager.updateTrades(new BinanceManager.BinanceCallBack() { binanceManager.updateTrades(new BinanceManager.BinanceCallBack() {
@Override @Override
public void onSuccess() { public void onSuccess() {
final List<Trade> trades = binanceManager.getTrades(); final HashMap<String, List<Trade>> trades = binanceManager.getTrades();
runOnUiThread(new Runnable() { runOnUiThread(new Runnable() {
@Override @Override
public void run() { public void run() {
drawTradeList(trades, "ETH"); drawTradeList(trades);
} }
}); });
} }

View File

@ -53,6 +53,26 @@ public class CurrencyDataChart implements Parcelable {
return timestamp; return timestamp;
} }
public void setClose(double close) {
this.close = close;
}
public double getHigh() {
return high;
}
public void setHigh(double high) {
this.high = high;
}
public double getLow() {
return low;
}
public void setLow(double low) {
this.low = low;
}
@Override @Override
public int describeContents() { public int describeContents() {
return 0; return 0;

View File

@ -11,6 +11,7 @@ import com.binance.api.client.exception.BinanceApiException;
import com.nauk.coinfolio.DataManagers.CurrencyData.Currency; import com.nauk.coinfolio.DataManagers.CurrencyData.Currency;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.HashMap;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
@ -24,7 +25,7 @@ public class BinanceManager {
private String privateKey; private String privateKey;
private List<Currency> balance; private List<Currency> balance;
private List<Trade> trades; private HashMap<String, List<Trade>> trades;
public BinanceManager(String publicKey, String privateKey) public BinanceManager(String publicKey, String privateKey)
{ {
@ -59,39 +60,33 @@ public class BinanceManager {
public void updateTrades(BinanceCallBack callBack, String symbol) public void updateTrades(BinanceCallBack callBack, String symbol)
{ {
List<Trade> totalTrades = new ArrayList<>(); trades = new HashMap<>();
updateTrades(null, symbol, "BTC"); trades.put("BTC", updateTrades(null, symbol, "BTC"));
totalTrades.addAll(trades);
updateTrades(null, symbol, "ETH"); trades.put("ETH", updateTrades(null, symbol, "ETH"));
totalTrades.addAll(trades);
updateTrades(null, symbol, "USDT"); trades.put("USDT", updateTrades(null, symbol, "USDT"));
totalTrades.addAll(trades);
trades = totalTrades;
callBack.onSuccess(); callBack.onSuccess();
} }
public void updateTrades(BinanceCallBack callBack, String symbol, String pairSymbol) public List<Trade> updateTrades(BinanceCallBack callBack, String symbol, String pairSymbol)
{ {
List<Trade> presentTrades = new ArrayList<>();
BinanceApiClientFactory factory = BinanceApiClientFactory.newInstance(publicKey, privateKey); BinanceApiClientFactory factory = BinanceApiClientFactory.newInstance(publicKey, privateKey);
BinanceApiRestClient client = factory.newRestClient(); BinanceApiRestClient client = factory.newRestClient();
Log.d("coinfolio", symbol + pairSymbol); Log.d("coinfolio", symbol + pairSymbol);
trades = new ArrayList<>();
if(!symbol.equals(pairSymbol)) if(!symbol.equals(pairSymbol))
{ {
try { try {
trades = client.getMyTrades(symbol + pairSymbol); presentTrades = client.getMyTrades(symbol + pairSymbol);
} catch (BinanceApiException e) { } catch (BinanceApiException e) {
try { try {
trades = client.getMyTrades(pairSymbol + symbol); presentTrades = client.getMyTrades(pairSymbol + symbol);
} catch (BinanceApiException f) { } catch (BinanceApiException f) {
f.printStackTrace(); f.printStackTrace();
@ -103,6 +98,8 @@ public class BinanceManager {
{ {
callBack.onSuccess(); callBack.onSuccess();
} }
return presentTrades;
} }
public void setPublicKey(String publicKey) public void setPublicKey(String publicKey)
@ -120,7 +117,7 @@ public class BinanceManager {
return balance; return balance;
} }
public List<Trade> getTrades() public HashMap<String, List<Trade>> getTrades()
{ {
return trades; return trades;
} }

View File

@ -18,11 +18,33 @@
android:layout_height="match_parent" android:layout_height="match_parent"
android:orientation="vertical"> android:orientation="vertical">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content">
<Button
android:text="Line chart"
android:id="@+id/lineChartButton"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_weight="0.5"
android:enabled="false"
style="@style/Widget.AppCompat.Button.Colored"/>
<Button
android:text="Candle stick chart"
android:id="@+id/candleStickChartButton"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_weight="0.5"
style="@style/Widget.AppCompat.Button.Colored"/>
</LinearLayout>
<LinearLayout <LinearLayout
android:id="@+id/progressLayoutChart" android:id="@+id/progressLayoutChart"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="305dp" android:layout_height="305dp"
android:layout_marginTop="15dp"
android:visibility="gone" android:visibility="gone"
android:gravity="center"> android:gravity="center">
@ -39,8 +61,13 @@
<com.github.mikephil.charting.charts.LineChart <com.github.mikephil.charting.charts.LineChart
android:id="@+id/chartPriceView" android:id="@+id/chartPriceView"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="250dp"/>
<com.github.mikephil.charting.charts.CandleStickChart
android:id="@+id/chartCandleStickView"
android:layout_width="match_parent"
android:layout_height="250dp" android:layout_height="250dp"
android:layout_marginTop="15dp" /> android:visibility="gone"/>
<LinearLayout <LinearLayout
android:layout_width="match_parent" android:layout_width="match_parent"

View File

@ -36,4 +36,6 @@
<color name="white">#FFFFFFFF</color> <color name="white">#FFFFFFFF</color>
<color name="cardview_background">#FFFFFFFF</color> <color name="cardview_background">#FFFFFFFF</color>
<color name="summary_background">#FBFCFF</color> <color name="summary_background">#FBFCFF</color>
<color name="decreaseCandle">#FFFF5754</color>
<color name="increaseCandle">#FF45B64A</color>
</resources> </resources>