Marketcap fixes and improvements

- Add rank
- Fix marketcap not displaying for NANO and BCN
- Add crash catcher for some not well support cryptocurrencies
This commit is contained in:
Tanguy Herbron 2018-04-22 18:34:55 +02:00
parent 97dc6df33a
commit c431b18d36
8 changed files with 313 additions and 27 deletions

View File

@ -90,6 +90,9 @@ public class CurrencyDetailsActivity extends AppCompatActivity {
private PreferencesManager preferencesManager;
private BinanceManager binanceManager;
private boolean isSnapshotUpdated;
private boolean isTickerUpdated;
private boolean displayLineChart;
private Button lineChartButton;
@ -147,6 +150,9 @@ public class CurrencyDetailsActivity extends AppCompatActivity {
databaseManager = new DatabaseManager(this);
preferencesManager = new PreferencesManager(this);
isSnapshotUpdated = false;
isTickerUpdated = false;
displayLineChart = true;
viewFlipper = findViewById(R.id.vfCurrencyDetails);
@ -231,6 +237,17 @@ public class CurrencyDetailsActivity extends AppCompatActivity {
.setMovementMethod(LinkMovementMethod.getInstance());
((TextView) findViewById(R.id.txtViewPercentageCoinEmited))
.setText("Percentage of coin emited : " + numberConformer(currency.getMinedCoinSupply() / currency.getMaxCoinSupply() * 100) + "%");
if(currency.getMarketCapitalization() != 0)
{
((TextView) findViewById(R.id.txtViewMarketCapitalization))
.setText(PlaceholderManager.getValueString(numberConformer(currency.getMarketCapitalization()), this));
}
if(currency.getRank() != 0)
{
((TextView) findViewById(R.id.txtViewRank))
.setText(String.valueOf(currency.getRank()));
}
if(currency.getMaxCoinSupply() == 0)
{
@ -251,6 +268,24 @@ public class CurrencyDetailsActivity extends AppCompatActivity {
currency.updateSnapshot(this, new Currency.CurrencyCallBack() {
@Override
public void onSuccess(final Currency currency) {
isSnapshotUpdated = true;
dataCounter();
}
});
currency.updateTicker(this, preferencesManager.getDefaultCurrency(), new Currency.CurrencyCallBack() {
@Override
public void onSuccess(Currency currency) {
isTickerUpdated = true;
dataCounter();
}
});
}
private void dataCounter()
{
if(isTickerUpdated && isSnapshotUpdated)
{
runOnUiThread(new Runnable() {
@Override
public void run() {
@ -258,7 +293,6 @@ public class CurrencyDetailsActivity extends AppCompatActivity {
}
});
}
});
}
private void setupActionBar()

View File

@ -44,6 +44,7 @@ import com.github.mikephil.charting.data.PieEntry;
import com.github.mikephil.charting.formatter.PercentFormatter;
import com.nauk.coinfolio.DataManagers.BalanceManager;
import com.nauk.coinfolio.DataManagers.CurrencyData.Currency;
import com.nauk.coinfolio.DataManagers.CurrencyData.CurrencyTickerList;
import com.nauk.coinfolio.DataManagers.MarketCapManager;
import com.nauk.coinfolio.DataManagers.PreferencesManager;
import com.nauk.coinfolio.LayoutManagers.HomeLayoutGenerator;

View File

@ -32,6 +32,7 @@ import com.nauk.coinfolio.Activities.HomeActivity;
import com.nauk.coinfolio.Activities.SettingsActivity;
import com.nauk.coinfolio.DataManagers.BalanceManager;
import com.nauk.coinfolio.DataManagers.CurrencyData.Currency;
import com.nauk.coinfolio.DataManagers.CurrencyData.CurrencyTickerList;
import com.nauk.coinfolio.DataManagers.PreferencesManager;
import com.nauk.coinfolio.LayoutManagers.HomeLayoutGenerator;
import com.nauk.coinfolio.PlaceholderManager;
@ -62,6 +63,7 @@ public class Summary extends Fragment {
private SwipeRefreshLayout refreshLayout;
private Dialog loadingDialog;
private String defaultCurrency;
private CurrencyTickerList currencyTickerList;
private TextView toolbarSubtitle;
private CollapsingToolbarLayout toolbarLayout;
@ -73,6 +75,7 @@ public class Summary extends Fragment {
private int iconCounter;
private float totalValue;
private boolean detailsChecker;
private boolean tickersChecker;
protected float totalFluctuation;
private long lastTimestamp;
@ -88,10 +91,12 @@ public class Summary extends Fragment {
layoutGenerator = new HomeLayoutGenerator(getActivity());
refreshLayout = fragmentView.findViewById(R.id.swiperefreshsummary);
toolbarSubtitle = fragmentView.findViewById(R.id.toolbarSubtitle);
currencyTickerList = new CurrencyTickerList(getActivity());
totalValue = 0;
totalFluctuation = 0;
lastTimestamp = 0;
tickersChecker = false;
defaultCurrency = preferencesManager.getDefaultCurrency();
@ -277,6 +282,11 @@ public class Summary extends Fragment {
{
currencyLayout.addView(currencyView.get(i));
}
if(loadingDialog.isShowing())
{
loadingDialog.dismiss();
}
}
});
}
@ -285,13 +295,18 @@ public class Summary extends Fragment {
newRunnable.run();
}
private void countCoins(boolean isCoin, boolean isDetails)
private void countCoins(boolean isCoin, boolean isDetails, boolean isTickers)
{
if(isCoin)
{
coinCounter++;
}
if(isTickers)
{
tickersChecker = true;
}
if(isDetails)
{
detailsChecker = true;
@ -299,7 +314,7 @@ public class Summary extends Fragment {
if(balanceManager.getTotalBalance() != null)
{
if(coinCounter == balanceManager.getTotalBalance().size() && detailsChecker)
if(coinCounter == balanceManager.getTotalBalance().size() && detailsChecker && tickersChecker)
{
IconDownloader iconDownloader = new IconDownloader();
iconDownloader.execute();
@ -500,6 +515,8 @@ public class Summary extends Fragment {
{
final Currency localCurrency = balanceManager.getTotalBalance().get(i);
localCurrency.setTickerId(currencyTickerList.getTickerIdForSymbol(localCurrency.getSymbol()));
updateChartColor(localCurrency);
loadCurrency(localCurrency);
@ -514,11 +531,6 @@ public class Summary extends Fragment {
}
});
if(loadingDialog.isShowing())
{
loadingDialog.dismiss();
}
return null;
}
@ -626,11 +638,17 @@ public class Summary extends Fragment {
@Override
protected Void doInBackground(Void... params)
{
currencyTickerList.update(new BalanceManager.IconCallBack() {
@Override
public void onSuccess() {
countCoins(false, false, true);
}
});
balanceManager.updateDetails(new BalanceManager.IconCallBack() {
@Override
public void onSuccess()
{
countCoins(false, true);
countCoins(false, true, false);
}
});
@ -647,8 +665,7 @@ public class Summary extends Fragment {
balance.get(i).updatePrice(getActivity(), defaultCurrency, new Currency.CurrencyCallBack() {
@Override
public void onSuccess(Currency currency) {
countCoins(true, false);
Log.d("coinfolio", "History " + currency.getSymbol());
countCoins(true, false, false);
}
});
}
@ -658,7 +675,7 @@ public class Summary extends Fragment {
getActivity().runOnUiThread(new Runnable() {
@Override
public void run() {
countCoins(false, false);
countCoins(false, false, false);
}
});
}

View File

@ -42,6 +42,7 @@ import com.nauk.coinfolio.DataManagers.BalanceManager;
import com.nauk.coinfolio.DataManagers.CurrencyData.Currency;
import com.nauk.coinfolio.DataManagers.CurrencyData.CurrencyDataChart;
import com.nauk.coinfolio.DataManagers.CurrencyData.CurrencyDetailsList;
import com.nauk.coinfolio.DataManagers.CurrencyData.CurrencyTickerList;
import com.nauk.coinfolio.DataManagers.PreferencesManager;
import com.nauk.coinfolio.DataManagers.WatchlistManager;
import com.nauk.coinfolio.PlaceholderManager;
@ -73,6 +74,9 @@ public class Watchlist extends Fragment {
private long lastTimestamp;
private PreferencesManager preferencesManager;
private String defaultCurrency;
private CurrencyTickerList currencyTickerList;
private boolean tickerUpdated;
private boolean detailsUpdated;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState)
@ -85,6 +89,15 @@ public class Watchlist extends Fragment {
lastTimestamp = 0;
defaultCurrency = preferencesManager.getDefaultCurrency();
currencyTickerList = new CurrencyTickerList(getActivity());
tickerUpdated = false;
currencyTickerList.update(new BalanceManager.IconCallBack() {
@Override
public void onSuccess() {
tickerUpdated = true;
checkUpdatedData();
}
});
watchlistManager = new WatchlistManager(getContext());
@ -212,14 +225,15 @@ public class Watchlist extends Fragment {
}
lastTimestamp = System.currentTimeMillis()/1000;
detailsUpdated = false;
watchlistManager.updateWatchlist();
currencyDetailsList.update(new BalanceManager.IconCallBack() {
@Override
public void onSuccess() {
WatchlistUpdater watchlistUpdater = new WatchlistUpdater();
watchlistUpdater.execute();
detailsUpdated = true;
checkUpdatedData();
}
});
}
@ -232,6 +246,15 @@ public class Watchlist extends Fragment {
}
}
private void checkUpdatedData()
{
if(tickerUpdated && detailsUpdated)
{
WatchlistUpdater watchlistUpdater = new WatchlistUpdater();
watchlistUpdater.execute();
}
}
private void generateCards()
{
final List<View> watchlistViews = new ArrayList<View>();
@ -516,6 +539,7 @@ public class Watchlist extends Fragment {
protected Void doInBackground(Void... voids) {
for(final Currency currency : watchlistManager.getWatchlist())
{
currency.setTickerId(currencyTickerList.getTickerIdForSymbol(currency.getSymbol()));
currency.setId(getCurrencyId(currency.getSymbol()));
currency.updatePrice(getActivity(), preferencesManager.getDefaultCurrency(), new Currency.CurrencyCallBack() {
@Override

View File

@ -19,6 +19,7 @@ import java.util.List;
public class Currency implements Parcelable {
private int id;
private String tickerId;
private String name;
private String symbol;
private double value;
@ -38,6 +39,7 @@ public class Currency implements Parcelable {
private String proofType;
private int totalSupply;
private double marketCapitalization;
private int rank;
private List<String> socialMediaLinks;
//private String proofType
@ -152,7 +154,29 @@ public class Currency implements Parcelable {
dataRetriver.updateSnapshot(id, new CurrencyDataRetriever.CurrencyCallBack() {
@Override
public void onSuccess(Currency currencyInfo) {
Currency.this.mergeWith(currencyInfo);
//Currency.this.mergeWith(currencyInfo);
Currency.this.proofType = currencyInfo.proofType;
Currency.this.algorithm = currencyInfo.algorithm;
Currency.this.description = currencyInfo.description;
Currency.this.maxCoinSupply = currencyInfo.maxCoinSupply;
Currency.this.minedCoinSupply = currencyInfo.minedCoinSupply;
callBack.onSuccess(Currency.this);
}
});
}
public void updateTicker(android.content.Context context, String toSymbol, final CurrencyCallBack callBack)
{
dataRetriver = new CurrencyDataRetriever(context);
dataRetriver.updateTickerInfos(tickerId, toSymbol, new CurrencyDataRetriever.CurrencyCallBack() {
@Override
public void onSuccess(Currency currencyInfo) {
//Currency.this.mergeWith(currencyInfo);
Currency.this.marketCapitalization = currencyInfo.marketCapitalization;
Currency.this.rank = currencyInfo.rank;
callBack.onSuccess(Currency.this);
}
@ -355,6 +379,30 @@ public class Currency implements Parcelable {
this.proofType = proofType;
}
public double getMarketCapitalization() {
return marketCapitalization;
}
public void setMarketCapitalization(double marketCapitalization) {
this.marketCapitalization = marketCapitalization;
}
public int getRank() {
return rank;
}
public void setRank(int rank) {
this.rank = rank;
}
public String getTickerId() {
return tickerId;
}
public void setTickerId(String tickerId) {
this.tickerId = tickerId;
}
private void updateDayFluctuation()
{
if(historyMinutes != null)
@ -412,6 +460,7 @@ public class Currency implements Parcelable {
dest.writeList(this.historyMinutes);
dest.writeParcelable(this.icon, flags);
dest.writeInt(this.chartColor);
dest.writeString(this.tickerId);
}
protected Currency(Parcel in) {
@ -426,6 +475,7 @@ public class Currency implements Parcelable {
in.readList(this.historyMinutes, CurrencyDataChart.class.getClassLoader());
this.icon = in.readParcelable(Bitmap.class.getClassLoader());
this.chartColor = in.readInt();
this.tickerId = in.readString();
}
public static final Parcelable.Creator<Currency> CREATOR = new Parcelable.Creator<Currency>() {

View File

@ -33,6 +33,7 @@ public class CurrencyDataRetriever {
private String dayHistoryUrl = "https://min-api.cryptocompare.com/data/histoday";
private String priceUrl = "https://min-api.cryptocompare.com/data/pricemultifull?fsyms=";
private String snapshotUrl = "https://www.cryptocompare.com/api/data/coinsnapshotfullbyid/?id=";
private String tickerUrl = "https://api.coinmarketcap.com/v1/ticker/";
private RequestQueue requestQueue;
@ -45,12 +46,49 @@ public class CurrencyDataRetriever {
requestQueue = Volley.newRequestQueue(context);
}
public void updateTickerInfos(String currencyName, final String toSymbol, final CurrencyCallBack callBack)
{
final String requestUrl = tickerUrl + currencyName + "/?convert=" + toSymbol;
StringRequest stringRequest = new StringRequest(Request.Method.GET, requestUrl,
new Response.Listener<String>() {
@Override
public void onResponse(String response) {
callBack.onSuccess(processTicker(response, toSymbol));
}
},
new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
callBack.onSuccess(new Currency());
}
});
requestQueue.add(stringRequest);
}
private Currency processTicker(String response, String toSymbol)
{
Currency currency = new Currency();
response = response.substring(1, response.length()-1);
try {
JSONObject jsonObject = new JSONObject(response);
currency.setMarketCapitalization(jsonObject.getDouble("market_cap_" + toSymbol.toLowerCase()));
currency.setRank(jsonObject.getInt("rank"));
} catch (JSONException e) {
e.printStackTrace();
}
return currency;
}
public void updateSnapshot(int id, final CurrencyCallBack callBack)
{
final String requestUrl = snapshotUrl + id;
Log.d("coinfolio", "Update snapshot for " + id);
StringRequest stringRequest = new StringRequest(Request.Method.GET, requestUrl,
new Response.Listener<String>() {
@Override
@ -61,7 +99,7 @@ public class CurrencyDataRetriever {
new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
callBack.onSuccess(new Currency());
}
});

View File

@ -0,0 +1,101 @@
package com.nauk.coinfolio.DataManagers.CurrencyData;
import android.util.Log;
import com.android.volley.Request;
import com.android.volley.RequestQueue;
import com.android.volley.Response;
import com.android.volley.VolleyError;
import com.android.volley.toolbox.StringRequest;
import com.android.volley.toolbox.Volley;
import com.nauk.coinfolio.DataManagers.BalanceManager;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
import java.util.LinkedHashMap;
import java.util.regex.Pattern;
/**
* Created by Guitoune on 22/04/2018.
*/
public class CurrencyTickerList {
final private static String TICKERLISTURL = "https://api.coinmarketcap.com/v1/ticker/?limit=0";
private RequestQueue requestQueue;
private LinkedHashMap<String, String> coinTickersHashmap;
private android.content.Context context;
public CurrencyTickerList(android.content.Context context)
{
this.context = context;
requestQueue = Volley.newRequestQueue(context);
}
public void update(final BalanceManager.IconCallBack callBack)
{
coinTickersHashmap = new LinkedHashMap<>();
StringRequest strRequest = new StringRequest(Request.Method.GET, TICKERLISTURL,
new Response.Listener<String>() {
@Override
public void onResponse(String response) {
if (response.length() > 0) {
processTickerListResult(response, callBack);
}
}
},
new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
}
});
requestQueue.add(strRequest);
}
public String getTickerIdForSymbol(String symbol)
{
String tickerId = null;
try {
JSONObject jsonObject = new JSONObject(coinTickersHashmap.get(symbol));
tickerId = jsonObject.getString("id");
} catch (JSONException | NullPointerException e) {
e.printStackTrace();
}
return tickerId;
}
public void processTickerListResult(String response, BalanceManager.IconCallBack callBack)
{
response = response.substring(1, response.length() - 1);
String[] strTable = response.split(Pattern.quote("},"));
for(int i = 0; i < strTable.length; i++)
{
strTable[i] += "}";
try {
JSONObject jsonObject = new JSONObject(strTable[i]);
switch (jsonObject.getString("symbol"))
{
case "MIOTA":
coinTickersHashmap.put("IOT", strTable[i]);
break;
case "NANO":
coinTickersHashmap.put("XRB", strTable[i]);
break;
default:
coinTickersHashmap.put(jsonObject.getString("symbol"), strTable[i]);
break;
}
} catch (JSONException e) {
e.printStackTrace();
}
}
callBack.onSuccess();
}
}

View File

@ -443,13 +443,13 @@
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="4dp"
android:layout_weight="0.5"
android:orientation="vertical">
android:orientation="horizontal">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical">
android:orientation="vertical"
android:layout_weight="0.5">
<TextView
android:layout_width="match_parent"
@ -460,7 +460,28 @@
<TextView
android:id="@+id/txtViewMarketCapitalization"
android:layout_width="match_parent"
android:layout_height="wrap_content"/>
android:layout_height="wrap_content"
android:text="--"/>
</LinearLayout>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical"
android:layout_weight="0.5">
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="Rank"
android:textStyle="bold"/>
<TextView
android:id="@+id/txtViewRank"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="--"/>
</LinearLayout>