Update HomeActivity with fragments
- Fragments for WatchList, Currency list and Market cap - WatchList implementation
This commit is contained in:
parent
970c709874
commit
4393a7d592
@ -21,6 +21,8 @@ import android.widget.SearchView;
|
|||||||
import com.nauk.coinfolio.DataManagers.BalanceManager;
|
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.CurrencyDetailsList;
|
import com.nauk.coinfolio.DataManagers.CurrencyData.CurrencyDetailsList;
|
||||||
|
import com.nauk.coinfolio.DataManagers.DatabaseManager;
|
||||||
|
import com.nauk.coinfolio.DataManagers.PreferencesManager;
|
||||||
import com.nauk.coinfolio.LayoutManagers.CurrencyListAdapter;
|
import com.nauk.coinfolio.LayoutManagers.CurrencyListAdapter;
|
||||||
import com.nauk.coinfolio.R;
|
import com.nauk.coinfolio.R;
|
||||||
|
|
||||||
@ -33,6 +35,7 @@ public class CurrencySelectionActivity extends AppCompatActivity implements Sear
|
|||||||
private ListView listView;
|
private ListView listView;
|
||||||
private android.widget.Filter filter;
|
private android.widget.Filter filter;
|
||||||
private CurrencyDetailsList currencyDetailsList;
|
private CurrencyDetailsList currencyDetailsList;
|
||||||
|
private boolean isWatchList;
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected void onCreate(Bundle savedInstanceState) {
|
protected void onCreate(Bundle savedInstanceState) {
|
||||||
@ -47,10 +50,11 @@ public class CurrencySelectionActivity extends AppCompatActivity implements Sear
|
|||||||
|
|
||||||
setTitle("Select a coin");
|
setTitle("Select a coin");
|
||||||
|
|
||||||
|
Intent intent = getIntent();
|
||||||
|
isWatchList = intent.getBooleanExtra("isWatchList", false);
|
||||||
|
|
||||||
ListLoader listLoader = new ListLoader();
|
ListLoader listLoader = new ListLoader();
|
||||||
listLoader.execute();
|
listLoader.execute();
|
||||||
|
|
||||||
Log.d("coinfolio", "Started");
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private void setupSearchView()
|
private void setupSearchView()
|
||||||
@ -89,10 +93,23 @@ public class CurrencySelectionActivity extends AppCompatActivity implements Sear
|
|||||||
@Override
|
@Override
|
||||||
public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) {
|
public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) {
|
||||||
Currency selectedCurrency = (Currency) adapterView.getItemAtPosition(i);
|
Currency selectedCurrency = (Currency) adapterView.getItemAtPosition(i);
|
||||||
Intent intent = new Intent(CurrencySelectionActivity.this, RecordTransactionActivity.class);
|
|
||||||
intent.putExtra("coin", selectedCurrency.getName());
|
if(isWatchList)
|
||||||
intent.putExtra("symbol", selectedCurrency.getSymbol());
|
{
|
||||||
startActivity(intent);
|
PreferencesManager preferencesManager = new PreferencesManager(getApplicationContext());
|
||||||
|
DatabaseManager databaseManager = new DatabaseManager(getApplicationContext());
|
||||||
|
|
||||||
|
databaseManager.addCurrencyToWatchlist(selectedCurrency);
|
||||||
|
preferencesManager.setMustUpdate(true);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
Intent intent = new Intent(CurrencySelectionActivity.this, RecordTransactionActivity.class);
|
||||||
|
intent.putExtra("coin", selectedCurrency.getName());
|
||||||
|
intent.putExtra("symbol", selectedCurrency.getSymbol());
|
||||||
|
startActivity(intent);
|
||||||
|
}
|
||||||
|
|
||||||
finish();
|
finish();
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
@ -15,6 +15,7 @@ import android.support.design.widget.AppBarLayout;
|
|||||||
import android.support.design.widget.BottomNavigationView;
|
import android.support.design.widget.BottomNavigationView;
|
||||||
import android.support.design.widget.CollapsingToolbarLayout;
|
import android.support.design.widget.CollapsingToolbarLayout;
|
||||||
import android.support.design.widget.Snackbar;
|
import android.support.design.widget.Snackbar;
|
||||||
|
import android.support.v4.view.ViewPager;
|
||||||
import android.support.v4.widget.SwipeRefreshLayout;
|
import android.support.v4.widget.SwipeRefreshLayout;
|
||||||
import android.support.v7.app.AppCompatActivity;
|
import android.support.v7.app.AppCompatActivity;
|
||||||
import android.support.v7.graphics.Palette;
|
import android.support.v7.graphics.Palette;
|
||||||
@ -28,6 +29,7 @@ import android.view.MenuItem;
|
|||||||
import android.view.MotionEvent;
|
import android.view.MotionEvent;
|
||||||
import android.view.View;
|
import android.view.View;
|
||||||
import android.view.ViewGroup;
|
import android.view.ViewGroup;
|
||||||
|
import android.view.ViewParent;
|
||||||
import android.widget.Button;
|
import android.widget.Button;
|
||||||
import android.widget.ImageButton;
|
import android.widget.ImageButton;
|
||||||
import android.widget.LinearLayout;
|
import android.widget.LinearLayout;
|
||||||
@ -45,6 +47,7 @@ import com.nauk.coinfolio.DataManagers.CurrencyData.Currency;
|
|||||||
import com.nauk.coinfolio.DataManagers.MarketCapManager;
|
import com.nauk.coinfolio.DataManagers.MarketCapManager;
|
||||||
import com.nauk.coinfolio.DataManagers.PreferencesManager;
|
import com.nauk.coinfolio.DataManagers.PreferencesManager;
|
||||||
import com.nauk.coinfolio.LayoutManagers.HomeLayoutGenerator;
|
import com.nauk.coinfolio.LayoutManagers.HomeLayoutGenerator;
|
||||||
|
import com.nauk.coinfolio.PagerAdapter;
|
||||||
import com.nauk.coinfolio.R;
|
import com.nauk.coinfolio.R;
|
||||||
|
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
@ -72,30 +75,14 @@ import java.util.Locale;
|
|||||||
public class HomeActivity extends AppCompatActivity {
|
public class HomeActivity extends AppCompatActivity {
|
||||||
|
|
||||||
private PreferencesManager preferencesManager;
|
private PreferencesManager preferencesManager;
|
||||||
private BalanceManager balanceManager;
|
|
||||||
private MarketCapManager marketCapManager;
|
|
||||||
|
|
||||||
private int coinCounter;
|
|
||||||
private int iconCounter;
|
|
||||||
private int marketCapCounter;
|
|
||||||
private long lastTimestamp;
|
|
||||||
private boolean detailsChecker;
|
|
||||||
private boolean isDetailed;
|
|
||||||
protected float totalValue;
|
|
||||||
protected float totalFluctuation;
|
|
||||||
|
|
||||||
private CollapsingToolbarLayout toolbarLayout;
|
private CollapsingToolbarLayout toolbarLayout;
|
||||||
private SwipeRefreshLayout refreshLayout;
|
|
||||||
private LinearLayout currencyLayout;
|
|
||||||
private TextView toolbarSubtitle;
|
|
||||||
private Dialog loadingDialog;
|
|
||||||
private Handler handler;
|
|
||||||
private Runnable updateRunnable;
|
|
||||||
private ViewFlipper viewFlipper;
|
private ViewFlipper viewFlipper;
|
||||||
private HomeLayoutGenerator layoutGenerator;
|
private HomeLayoutGenerator layoutGenerator;
|
||||||
private BottomNavigationView bottomNavigationView;
|
private BottomNavigationView bottomNavigationView;
|
||||||
|
|
||||||
private HashMap<String, Integer> dominantCurrenciesColors;
|
private ViewPager viewPager;
|
||||||
|
|
||||||
|
|
||||||
private BottomNavigationView.OnNavigationItemSelectedListener onNavigationItemSelectedListener
|
private BottomNavigationView.OnNavigationItemSelectedListener onNavigationItemSelectedListener
|
||||||
= new BottomNavigationView.OnNavigationItemSelectedListener() {
|
= new BottomNavigationView.OnNavigationItemSelectedListener() {
|
||||||
@ -106,13 +93,13 @@ public class HomeActivity extends AppCompatActivity {
|
|||||||
switch (item.getItemId())
|
switch (item.getItemId())
|
||||||
{
|
{
|
||||||
case R.id.navigation_watchlist:
|
case R.id.navigation_watchlist:
|
||||||
switchSecondaryViews(0);
|
viewPager.setCurrentItem(0);
|
||||||
break;
|
break;
|
||||||
case R.id.navigation_currencies_list:
|
case R.id.navigation_currencies_list:
|
||||||
switchMainView();
|
viewPager.setCurrentItem(1);
|
||||||
break;
|
break;
|
||||||
case R.id.navigation_market_cap:
|
case R.id.navigation_market_cap:
|
||||||
switchSecondaryViews(2);
|
viewPager.setCurrentItem(2);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
return false;
|
return false;
|
||||||
@ -134,65 +121,40 @@ public class HomeActivity extends AppCompatActivity {
|
|||||||
setContentView(R.layout.activity_currency_summary);
|
setContentView(R.layout.activity_currency_summary);
|
||||||
setSupportActionBar((Toolbar) findViewById(R.id.toolbar));
|
setSupportActionBar((Toolbar) findViewById(R.id.toolbar));
|
||||||
|
|
||||||
generateSplashScreen();
|
viewPager = findViewById(R.id.viewPager);
|
||||||
|
final PagerAdapter adapter = new PagerAdapter(getSupportFragmentManager(), 3);
|
||||||
|
|
||||||
|
viewPager.setAdapter(adapter);
|
||||||
|
viewPager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() {
|
||||||
|
@Override
|
||||||
|
public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {
|
||||||
|
bottomNavigationView.getMenu().getItem(position).setChecked(true);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onPageSelected(int position) {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onPageScrollStateChanged(int state) {
|
||||||
|
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
//Objects initialization
|
//Objects initialization
|
||||||
preferencesManager = new PreferencesManager(this);
|
preferencesManager = new PreferencesManager(this);
|
||||||
balanceManager = new BalanceManager(this);
|
|
||||||
marketCapManager = new MarketCapManager(this);
|
|
||||||
handler = new Handler();
|
|
||||||
updateRunnable = new Runnable() {
|
|
||||||
@Override
|
|
||||||
public void run() {
|
|
||||||
if (refreshLayout.isRefreshing())
|
|
||||||
{
|
|
||||||
refreshLayout.setRefreshing(false);
|
|
||||||
|
|
||||||
showErrorSnackbar();
|
|
||||||
}
|
|
||||||
|
|
||||||
if (loadingDialog.isShowing())
|
|
||||||
{
|
|
||||||
loadingDialog.dismiss();
|
|
||||||
|
|
||||||
showErrorSnackbar();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
isDetailed = preferencesManager.getDetailOption();
|
|
||||||
|
|
||||||
//Layouts setup
|
//Layouts setup
|
||||||
refreshLayout = findViewById(R.id.swiperefresh);
|
|
||||||
toolbarLayout = findViewById(R.id.toolbar_layout);
|
toolbarLayout = findViewById(R.id.toolbar_layout);
|
||||||
toolbarSubtitle = findViewById(R.id.toolbarSubtitle);
|
|
||||||
currencyLayout = findViewById(R.id.currencyListLayout);
|
|
||||||
viewFlipper = findViewById(R.id.viewFlipperSummary);
|
viewFlipper = findViewById(R.id.viewFlipperSummary);
|
||||||
|
|
||||||
bottomNavigationView = findViewById(R.id.navigationSummary);
|
bottomNavigationView = findViewById(R.id.navigationSummary);
|
||||||
bottomNavigationView.setOnNavigationItemSelectedListener(onNavigationItemSelectedListener);
|
bottomNavigationView.setOnNavigationItemSelectedListener(onNavigationItemSelectedListener);
|
||||||
bottomNavigationView.setSelectedItemId(R.id.navigation_currencies_list);
|
bottomNavigationView.setSelectedItemId(R.id.navigation_currencies_list);
|
||||||
|
|
||||||
layoutGenerator = new HomeLayoutGenerator(this);
|
|
||||||
|
|
||||||
Button addCurrencyButton = findViewById(R.id.buttonAddTransaction);
|
|
||||||
ImageButton detailsButton = findViewById(R.id.switch_button);
|
|
||||||
ImageButton settingsButton = findViewById(R.id.settings_button);
|
|
||||||
|
|
||||||
toolbarLayout.setForegroundGravity(Gravity.CENTER);
|
toolbarLayout.setForegroundGravity(Gravity.CENTER);
|
||||||
|
|
||||||
totalValue = 0;
|
ImageButton settingsButton = findViewById(R.id.settings_button);
|
||||||
totalFluctuation = 0;
|
|
||||||
|
|
||||||
updateTitle();
|
|
||||||
|
|
||||||
//Events setup
|
|
||||||
detailsButton.setOnClickListener(new View.OnClickListener() {
|
|
||||||
@Override
|
|
||||||
public void onClick(View view) {
|
|
||||||
switchView();
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
settingsButton.setBackground(this.getResources().getDrawable(R.drawable.ic_settings_black_24dp));
|
settingsButton.setBackground(this.getResources().getDrawable(R.drawable.ic_settings_black_24dp));
|
||||||
settingsButton.setOnClickListener(new View.OnClickListener() {
|
settingsButton.setOnClickListener(new View.OnClickListener() {
|
||||||
@ -204,115 +166,29 @@ public class HomeActivity extends AppCompatActivity {
|
|||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
refreshLayout.setOnRefreshListener(
|
|
||||||
new SwipeRefreshLayout.OnRefreshListener() {
|
|
||||||
@Override
|
|
||||||
public void onRefresh() {
|
|
||||||
switch (viewFlipper.getDisplayedChild())
|
|
||||||
{
|
|
||||||
case 0:
|
|
||||||
Log.d(getResources().getString(R.string.debug), "Watchlist");
|
|
||||||
refreshLayout.setRefreshing(false);
|
|
||||||
break;
|
|
||||||
case 1:
|
|
||||||
updateAll(false);
|
|
||||||
break;
|
|
||||||
case 2:
|
|
||||||
Log.d(getResources().getString(R.string.debug), "Market cap");
|
|
||||||
refreshLayout.setRefreshing(false);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
}
|
|
||||||
);
|
|
||||||
|
|
||||||
addCurrencyButton.setOnClickListener(new View.OnClickListener() {
|
|
||||||
@Override
|
|
||||||
public void onClick(View view) {
|
|
||||||
Intent addIntent = new Intent(HomeActivity.this, CurrencySelectionActivity.class);
|
|
||||||
|
|
||||||
startActivity(addIntent);
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
updateViewButtonIcon();
|
updateViewButtonIcon();
|
||||||
|
|
||||||
lastTimestamp = 0;
|
|
||||||
|
|
||||||
setupDominantCurrenciesColors();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
protected void updateTitle()
|
private void updateViewButtonIcon()
|
||||||
{
|
{
|
||||||
float totalFluctuationPercentage = totalFluctuation / (totalValue - totalFluctuation) * 100;
|
ImageButton imgButton = findViewById(R.id.switch_button);
|
||||||
|
|
||||||
if(preferencesManager.isBalanceHidden())
|
imgButton.setBackgroundColor(this.getResources().getColor(R.color.buttonColor));
|
||||||
|
|
||||||
|
if(preferencesManager.getDetailOption())
|
||||||
{
|
{
|
||||||
toolbarLayout.setTitle(getResources().getString(R.string.currencyPercentagePlaceholder, String.format("%.2f", totalFluctuationPercentage)));
|
imgButton.setBackground(this.getResources().getDrawable(R.drawable.ic_unfold_less_black_24dp));
|
||||||
toolbarSubtitle.setVisibility(View.GONE);
|
preferencesManager.setDetailOption(true);
|
||||||
|
|
||||||
if(totalFluctuation > 0)
|
|
||||||
{
|
|
||||||
toolbarLayout.setCollapsedTitleTextColor(getResources().getColor(R.color.increase));
|
|
||||||
toolbarLayout.setExpandedTitleColor(getResources().getColor(R.color.increase));
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
toolbarLayout.setCollapsedTitleTextColor(getResources().getColor(R.color.decrease));
|
|
||||||
toolbarLayout.setExpandedTitleColor(getResources().getColor(R.color.decrease));
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
toolbarLayout.setTitle(getResources().getString(R.string.currencyDollarPlaceholder, String.format("%.2f", totalValue)));
|
imgButton.setBackground(this.getResources().getDrawable(R.drawable.ic_details_black_24dp));
|
||||||
toolbarLayout.setCollapsedTitleTextColor(Color.WHITE);
|
preferencesManager.setDetailOption(false);
|
||||||
toolbarLayout.setExpandedTitleColor(Color.WHITE);
|
|
||||||
|
|
||||||
toolbarSubtitle.setVisibility(View.VISIBLE);
|
|
||||||
|
|
||||||
if(totalFluctuation > 0)
|
|
||||||
{
|
|
||||||
toolbarSubtitle.setTextColor(getResources().getColor(R.color.increase));
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
toolbarSubtitle.setTextColor(getResources().getColor(R.color.decrease));
|
|
||||||
}
|
|
||||||
|
|
||||||
if(totalFluctuation == 0)
|
|
||||||
{
|
|
||||||
toolbarSubtitle.setText(getResources().getString(R.string.currencyDollarPlaceholder, "0.00"));
|
|
||||||
toolbarSubtitle.setTextColor(-1275068417);
|
|
||||||
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
toolbarSubtitle.setText("US$" + String.format("%.2f", totalFluctuation) + " (" + String.format("%.2f", totalFluctuationPercentage) + "%)");
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private void setupDominantCurrenciesColors()
|
|
||||||
{
|
|
||||||
dominantCurrenciesColors = new HashMap<>();
|
|
||||||
|
|
||||||
dominantCurrenciesColors.put("BTC", -489456);
|
|
||||||
dominantCurrenciesColors.put("ETH", -13619152);
|
|
||||||
dominantCurrenciesColors.put("XRP", -16744256);
|
|
||||||
dominantCurrenciesColors.put("BCH", -1011696);
|
|
||||||
dominantCurrenciesColors.put("LTC", -4671304);
|
|
||||||
dominantCurrenciesColors.put("ADA", -16773080);
|
|
||||||
dominantCurrenciesColors.put("NEO", -9390048);
|
|
||||||
dominantCurrenciesColors.put("XLM", -11509656);
|
|
||||||
dominantCurrenciesColors.put("XMR", -499712);
|
|
||||||
dominantCurrenciesColors.put("EOS", -1513240);
|
|
||||||
dominantCurrenciesColors.put("IOT", -1513240);
|
|
||||||
dominantCurrenciesColors.put("DASH", -15175496);
|
|
||||||
dominantCurrenciesColors.put("XEM", -7829368);
|
|
||||||
dominantCurrenciesColors.put("TRX", -7829360);
|
|
||||||
dominantCurrenciesColors.put("ETC", -10448784);
|
|
||||||
}
|
|
||||||
|
|
||||||
private void switchMainView()
|
private void switchMainView()
|
||||||
{
|
{
|
||||||
@ -356,50 +232,10 @@ public class HomeActivity extends AppCompatActivity {
|
|||||||
viewFlipper.setDisplayedChild(itemIndex);
|
viewFlipper.setDisplayedChild(itemIndex);
|
||||||
}
|
}
|
||||||
|
|
||||||
private void showErrorSnackbar()
|
|
||||||
{
|
|
||||||
Snackbar.make(findViewById(R.id.viewFlipperSummary), "Error while updating data", Snackbar.LENGTH_LONG)
|
|
||||||
.setAction("Update", new View.OnClickListener() {
|
|
||||||
@Override
|
|
||||||
public void onClick(View view) {
|
|
||||||
updateAll(true);
|
|
||||||
}
|
|
||||||
})
|
|
||||||
.show();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected void onResume() {
|
protected void onResume() {
|
||||||
super.onResume();
|
super.onResume();
|
||||||
|
|
||||||
//addTestWatchlistCardview();
|
|
||||||
displayBalance(preferencesManager.isBalanceHidden());
|
|
||||||
|
|
||||||
updateAll(preferencesManager.mustUpdate());
|
|
||||||
}
|
|
||||||
|
|
||||||
private void displayBalance(boolean hideBalance)
|
|
||||||
{
|
|
||||||
updateTitle();
|
|
||||||
|
|
||||||
if(hideBalance)
|
|
||||||
{
|
|
||||||
for(int i = 0; i < currencyLayout.getChildCount(); i++)
|
|
||||||
{
|
|
||||||
currencyLayout.getChildAt(i).findViewById(R.id.currencyPortfolioDominance).setVisibility(View.VISIBLE);
|
|
||||||
currencyLayout.getChildAt(i).findViewById(R.id.percentageOwnedTextView).setVisibility(View.VISIBLE);
|
|
||||||
currencyLayout.getChildAt(i).findViewById(R.id.currencyOwnedInfoLayout).setVisibility(View.GONE);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
for(int i = 0; i < currencyLayout.getChildCount(); i++)
|
|
||||||
{
|
|
||||||
currencyLayout.getChildAt(i).findViewById(R.id.currencyPortfolioDominance).setVisibility(View.INVISIBLE);
|
|
||||||
currencyLayout.getChildAt(i).findViewById(R.id.percentageOwnedTextView).setVisibility(View.GONE);
|
|
||||||
currencyLayout.getChildAt(i).findViewById(R.id.currencyOwnedInfoLayout).setVisibility(View.VISIBLE);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private void addTestWatchlistCardview()
|
private void addTestWatchlistCardview()
|
||||||
@ -447,579 +283,6 @@ public class HomeActivity extends AppCompatActivity {
|
|||||||
return super.onOptionsItemSelected(item);
|
return super.onOptionsItemSelected(item);
|
||||||
}
|
}
|
||||||
|
|
||||||
private void switchView()
|
|
||||||
{
|
|
||||||
if(isDetailed)
|
|
||||||
{
|
|
||||||
isDetailed = false;
|
|
||||||
|
|
||||||
adaptView();
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
isDetailed = true;
|
|
||||||
|
|
||||||
adaptView();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private void adaptView()
|
|
||||||
{
|
|
||||||
currencyLayout.removeAllViews();
|
|
||||||
|
|
||||||
for(int i = 0; i < balanceManager.getTotalBalance().size(); i++)
|
|
||||||
{
|
|
||||||
final Currency currency = balanceManager.getTotalBalance().get(i);
|
|
||||||
|
|
||||||
if(!currency.getSymbol().equals("USD") && ((currency.getBalance() * currency.getValue()) > 0.001 || currency.getHistoryMinutes() == null))
|
|
||||||
{
|
|
||||||
currencyLayout.addView(layoutGenerator.getInfoLayout(currency, isDetailed, totalValue, preferencesManager.isBalanceHidden()));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
updateViewButtonIcon();
|
|
||||||
}
|
|
||||||
|
|
||||||
private void updateAll(boolean mustUpdate)
|
|
||||||
{
|
|
||||||
if(System.currentTimeMillis()/1000 - lastTimestamp > 60 || mustUpdate)
|
|
||||||
{
|
|
||||||
lastTimestamp = System.currentTimeMillis() / 1000;
|
|
||||||
balanceManager.updateExchangeKeys();
|
|
||||||
refreshLayout.setRefreshing(true);
|
|
||||||
|
|
||||||
resetCounters();
|
|
||||||
DataUpdater updater = new DataUpdater();
|
|
||||||
updater.execute();
|
|
||||||
|
|
||||||
handler.postDelayed(updateRunnable, 10000);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
if(refreshLayout.isRefreshing())
|
|
||||||
{
|
|
||||||
refreshLayout.setRefreshing(false);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private void resetCounters()
|
|
||||||
{
|
|
||||||
coinCounter = 0;
|
|
||||||
iconCounter = 0;
|
|
||||||
detailsChecker = false;
|
|
||||||
|
|
||||||
totalValue = 0;
|
|
||||||
totalFluctuation = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
private void getBitmapFromURL(String src, IconCallBack callBack) {
|
|
||||||
Bitmap result;
|
|
||||||
|
|
||||||
try {
|
|
||||||
java.net.URL url = new java.net.URL(src);
|
|
||||||
HttpURLConnection connection = (HttpURLConnection) url
|
|
||||||
.openConnection();
|
|
||||||
connection.setDoInput(true);
|
|
||||||
connection.connect();
|
|
||||||
InputStream input = connection.getInputStream();
|
|
||||||
result = BitmapFactory.decodeStream(input);
|
|
||||||
} catch (IOException e) {
|
|
||||||
e.printStackTrace();
|
|
||||||
result = BitmapFactory.decodeResource(this.getResources(),
|
|
||||||
R.mipmap.icon_coinfolio);
|
|
||||||
result = Bitmap.createScaledBitmap(result, 50, 50, false);
|
|
||||||
}
|
|
||||||
|
|
||||||
callBack.onSuccess(result);
|
|
||||||
}
|
|
||||||
|
|
||||||
private void countIcons()
|
|
||||||
{
|
|
||||||
int offset = 0;
|
|
||||||
|
|
||||||
for(int i = 0; i < balanceManager.getTotalBalance().size(); i++)
|
|
||||||
{
|
|
||||||
if(balanceManager.getTotalBalance().get(i).getSymbol().equals("USD"))
|
|
||||||
{
|
|
||||||
offset++;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
iconCounter++;
|
|
||||||
|
|
||||||
if(balanceManager.getTotalBalance() != null)
|
|
||||||
{
|
|
||||||
if(balanceManager.getTotalBalance().size() == 0)
|
|
||||||
{
|
|
||||||
updateNoBalance();
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
if(iconCounter == balanceManager.getTotalBalance().size() - offset)
|
|
||||||
{
|
|
||||||
Log.d(getResources().getString(R.string.debug), "Loading heavy");
|
|
||||||
|
|
||||||
UiHeavyLoadCalculator uiHeavyLoadCalculator = new UiHeavyLoadCalculator();
|
|
||||||
uiHeavyLoadCalculator.execute();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private void updateNoBalance()
|
|
||||||
{
|
|
||||||
refreshLayout.setRefreshing(false);
|
|
||||||
|
|
||||||
currencyLayout.removeAllViews();
|
|
||||||
|
|
||||||
if(loadingDialog.isShowing())
|
|
||||||
{
|
|
||||||
loadingDialog.dismiss();
|
|
||||||
}
|
|
||||||
|
|
||||||
runOnUiThread(new Runnable() {
|
|
||||||
@Override
|
|
||||||
public void run() {
|
|
||||||
|
|
||||||
updateTitle();
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
private void updateMarketCap()
|
|
||||||
{
|
|
||||||
marketCapCounter = 0;
|
|
||||||
|
|
||||||
marketCapManager.updateTopCurrencies(new MarketCapManager.VolleyCallBack() {
|
|
||||||
@Override
|
|
||||||
public void onSuccess()
|
|
||||||
{
|
|
||||||
countCompletedMarketCapRequest();
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
marketCapManager.updateMarketCap(new MarketCapManager.VolleyCallBack() {
|
|
||||||
@Override
|
|
||||||
public void onSuccess() {
|
|
||||||
countCompletedMarketCapRequest();
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
@SuppressLint("ClickableViewAccessibility")
|
|
||||||
private void countCompletedMarketCapRequest()
|
|
||||||
{
|
|
||||||
marketCapCounter++;
|
|
||||||
|
|
||||||
if(marketCapCounter == 2)
|
|
||||||
{
|
|
||||||
setupTextViewMarketCap();
|
|
||||||
|
|
||||||
findViewById(R.id.progressBarMarketCap).setVisibility(View.GONE);
|
|
||||||
findViewById(R.id.layoutProgressMarketCap).setVisibility(View.VISIBLE);
|
|
||||||
|
|
||||||
List<PieEntry> entries = new ArrayList<>();
|
|
||||||
|
|
||||||
ArrayList<Integer> colors = new ArrayList<>();
|
|
||||||
|
|
||||||
float otherCurrenciesDominance = 0;
|
|
||||||
|
|
||||||
for(Iterator i = marketCapManager.getDominance().keySet().iterator(); i.hasNext(); )
|
|
||||||
{
|
|
||||||
String key = (String) i.next();
|
|
||||||
entries.add(new PieEntry(marketCapManager.getDominance().get(key), key));
|
|
||||||
otherCurrenciesDominance += marketCapManager.getDominance().get(key);
|
|
||||||
colors.add(dominantCurrenciesColors.get(key));
|
|
||||||
}
|
|
||||||
entries.add(new PieEntry(100-otherCurrenciesDominance, "Others"));
|
|
||||||
colors.add(-12369084);
|
|
||||||
|
|
||||||
PieDataSet set = new PieDataSet(entries, "Market Cap Dominance");
|
|
||||||
set.setColors(colors);
|
|
||||||
set.setSliceSpace(1);
|
|
||||||
set.setYValuePosition(PieDataSet.ValuePosition.OUTSIDE_SLICE);
|
|
||||||
set.setXValuePosition(PieDataSet.ValuePosition.OUTSIDE_SLICE);
|
|
||||||
PieData data = new PieData(set);
|
|
||||||
data.setValueTextSize(10);
|
|
||||||
data.setValueFormatter(new PercentFormatter());
|
|
||||||
|
|
||||||
setupPieChart(data);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private void setupPieChart(PieData data)
|
|
||||||
{
|
|
||||||
PieChart pieChart = findViewById(R.id.marketCapPieChart);
|
|
||||||
|
|
||||||
pieChart.setData(data);
|
|
||||||
pieChart.setDrawSlicesUnderHole(false);
|
|
||||||
pieChart.setUsePercentValues(true);
|
|
||||||
pieChart.setTouchEnabled(true);
|
|
||||||
|
|
||||||
pieChart.setEntryLabelColor(Color.parseColor("#FF000000"));
|
|
||||||
|
|
||||||
pieChart.setOnTouchListener(new View.OnTouchListener() {
|
|
||||||
@Override
|
|
||||||
public boolean onTouch(View view, MotionEvent motionEvent) {
|
|
||||||
switch (motionEvent.getAction())
|
|
||||||
{
|
|
||||||
case MotionEvent.ACTION_DOWN:
|
|
||||||
refreshLayout.setEnabled(false);
|
|
||||||
break;
|
|
||||||
case MotionEvent.ACTION_MOVE:
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
refreshLayout.setEnabled(true);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
pieChart.getDescription().setEnabled(false);
|
|
||||||
pieChart.getLegend().setEnabled(false);
|
|
||||||
pieChart.setCenterText(generateCenterSpannableText());
|
|
||||||
pieChart.invalidate(); // refresh
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
private void setupTextViewMarketCap()
|
|
||||||
{
|
|
||||||
DecimalFormat formatter = (DecimalFormat) NumberFormat.getInstance(Locale.UK);
|
|
||||||
DecimalFormatSymbols symbols = formatter.getDecimalFormatSymbols();
|
|
||||||
|
|
||||||
symbols.setGroupingSeparator(' ');
|
|
||||||
formatter.setDecimalFormatSymbols(symbols);
|
|
||||||
|
|
||||||
((TextView) findViewById(R.id.marketCapTextView)).setText(getResources().getString(R.string.market_cap_textview, formatter.format(marketCapManager.getMarketCap())));
|
|
||||||
|
|
||||||
((TextView) findViewById(R.id.dayVolumeTotalMarketCap)).setText(getResources().getString(R.string.volume_market_cap_textview, formatter.format(marketCapManager.getDayVolume())));
|
|
||||||
}
|
|
||||||
|
|
||||||
private SpannableString generateCenterSpannableText() {
|
|
||||||
|
|
||||||
SpannableString spannableString = new SpannableString("Market Capitalization Dominance");
|
|
||||||
return spannableString;
|
|
||||||
}
|
|
||||||
|
|
||||||
private void countCoins(boolean isCoin, boolean isDetails)
|
|
||||||
{
|
|
||||||
if(isCoin)
|
|
||||||
{
|
|
||||||
coinCounter++;
|
|
||||||
}
|
|
||||||
|
|
||||||
if(isDetails)
|
|
||||||
{
|
|
||||||
detailsChecker = true;
|
|
||||||
}
|
|
||||||
|
|
||||||
if(balanceManager.getTotalBalance() != null)
|
|
||||||
{
|
|
||||||
if(coinCounter == balanceManager.getTotalBalance().size() && detailsChecker)
|
|
||||||
{
|
|
||||||
IconDownloader iconDownloader = new IconDownloader();
|
|
||||||
iconDownloader.execute();
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
if(balanceManager.getTotalBalance().size() == 0)
|
|
||||||
{
|
|
||||||
countIcons();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private void updateViewButtonIcon()
|
|
||||||
{
|
|
||||||
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));
|
|
||||||
preferencesManager.setDetailOption(true);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
imgButton.setBackground(this.getResources().getDrawable(R.drawable.ic_details_black_24dp));
|
|
||||||
preferencesManager.setDetailOption(false);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private void generateSplashScreen()
|
|
||||||
{
|
|
||||||
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);
|
|
||||||
|
|
||||||
loadingDialog = new Dialog(this, android.R.style.Theme_Black_NoTitleBar_Fullscreen);
|
|
||||||
|
|
||||||
TextView txtView = new TextView(this);
|
|
||||||
txtView.setText("Loading data...");
|
|
||||||
txtView.setTextSize(20);
|
|
||||||
txtView.setGravity(Gravity.CENTER);
|
|
||||||
txtView.setTextColor(this.getResources().getColor(R.color.cardview_light_background));
|
|
||||||
|
|
||||||
ProgressBar progressBar = new ProgressBar(this);
|
|
||||||
progressBar.setIndeterminate(true);
|
|
||||||
|
|
||||||
loadingLayout.setBackgroundColor(this.getResources().getColor(R.color.colorPrimaryDark));
|
|
||||||
loadingLayout.addView(txtView);
|
|
||||||
loadingLayout.addView(progressBar);
|
|
||||||
|
|
||||||
loadingDialog.setContentView(loadingLayout);
|
|
||||||
loadingDialog.show();
|
|
||||||
}
|
|
||||||
|
|
||||||
private class IconDownloader extends AsyncTask<Void, Integer, Void>
|
|
||||||
{
|
|
||||||
@Override
|
|
||||||
protected void onPreExecute()
|
|
||||||
{
|
|
||||||
super.onPreExecute();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
protected void onProgressUpdate(Integer... values)
|
|
||||||
{
|
|
||||||
super.onProgressUpdate(values);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
protected Void doInBackground(Void... params)
|
|
||||||
{
|
|
||||||
for (int i = 0; i < balanceManager.getTotalBalance().size(); i++)
|
|
||||||
{
|
|
||||||
final Currency localCurrency = balanceManager.getTotalBalance().get(i);
|
|
||||||
|
|
||||||
if(balanceManager.getIconUrl(localCurrency.getSymbol()) != null)
|
|
||||||
{
|
|
||||||
getBitmapFromURL(balanceManager.getIconUrl(localCurrency.getSymbol()), new IconCallBack() {
|
|
||||||
@Override
|
|
||||||
public void onSuccess(Bitmap bitmapIcon) {
|
|
||||||
localCurrency.setIcon(bitmapIcon);
|
|
||||||
countIcons();
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
protected void onPostExecute(Void result)
|
|
||||||
{
|
|
||||||
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private class UiHeavyLoadCalculator extends AsyncTask<Void, Integer, Void>
|
|
||||||
{
|
|
||||||
|
|
||||||
@Override
|
|
||||||
protected void onPreExecute()
|
|
||||||
{
|
|
||||||
super.onPreExecute();
|
|
||||||
|
|
||||||
totalValue = 0;
|
|
||||||
totalFluctuation = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
protected void onProgressUpdate(Integer... values)
|
|
||||||
{
|
|
||||||
super.onProgressUpdate(values);
|
|
||||||
}
|
|
||||||
|
|
||||||
private void updateChartColor(Currency currency)
|
|
||||||
{
|
|
||||||
if(currency.getIcon() != null)
|
|
||||||
{
|
|
||||||
Palette.Builder builder = Palette.from(currency.getIcon());
|
|
||||||
|
|
||||||
currency.setChartColor(builder.generate().getDominantColor(0));
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
currency.setChartColor(12369084);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private void loadCurrency(Currency currency)
|
|
||||||
{
|
|
||||||
if(!currency.getSymbol().equals("USD") && (currency.getBalance() * currency.getValue()) > 0.001)
|
|
||||||
{
|
|
||||||
currency.setName(balanceManager.getCurrencyName(currency.getSymbol()));
|
|
||||||
currency.setId(balanceManager.getCurrencyId(currency.getSymbol()));
|
|
||||||
totalValue += currency.getValue() * currency.getBalance();
|
|
||||||
totalFluctuation += (currency.getValue() * currency.getBalance()) * (currency.getDayFluctuationPercentage() / 100);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private void refreshCurrencyList()
|
|
||||||
{
|
|
||||||
runOnUiThread(new Runnable() {
|
|
||||||
@Override
|
|
||||||
public void run() {
|
|
||||||
currencyLayout.removeAllViews();
|
|
||||||
|
|
||||||
for(int i = 0; i < balanceManager.getTotalBalance().size(); i++)
|
|
||||||
{
|
|
||||||
Currency currency = balanceManager.getTotalBalance().get(i);
|
|
||||||
|
|
||||||
if(!currency.getSymbol().equals("USD") && (currency.getBalance() * currency.getValue()) > 0.001) {
|
|
||||||
currencyLayout.addView(layoutGenerator.getInfoLayout(currency, isDetailed, totalValue, preferencesManager.isBalanceHidden()));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
protected Void doInBackground(Void... params)
|
|
||||||
{
|
|
||||||
if(Looper.myLooper() == null)
|
|
||||||
{
|
|
||||||
Looper.prepare();
|
|
||||||
}
|
|
||||||
|
|
||||||
balanceManager.sortCoins();
|
|
||||||
|
|
||||||
for(int i = 0; i < balanceManager.getTotalBalance().size(); i++)
|
|
||||||
{
|
|
||||||
final Currency localCurrency = balanceManager.getTotalBalance().get(i);
|
|
||||||
|
|
||||||
updateChartColor(localCurrency);
|
|
||||||
|
|
||||||
loadCurrency(localCurrency);
|
|
||||||
|
|
||||||
balanceManager.getTotalBalance().set(i, localCurrency);
|
|
||||||
}
|
|
||||||
|
|
||||||
runOnUiThread(new Runnable() {
|
|
||||||
@Override
|
|
||||||
public void run() {
|
|
||||||
updateTitle();
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
if(loadingDialog.isShowing())
|
|
||||||
{
|
|
||||||
loadingDialog.dismiss();
|
|
||||||
}
|
|
||||||
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
protected void onPostExecute(Void result)
|
|
||||||
{
|
|
||||||
refreshLayout.setRefreshing(false);
|
|
||||||
refreshCurrencyList();
|
|
||||||
HomeActivity.this.totalValue = totalValue;
|
|
||||||
handler.removeCallbacks(updateRunnable);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private class DataUpdater extends AsyncTask<Void, Integer, Void>
|
|
||||||
{
|
|
||||||
@Override
|
|
||||||
protected void onPreExecute()
|
|
||||||
{
|
|
||||||
super.onPreExecute();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
protected void onProgressUpdate(Integer... values)
|
|
||||||
{
|
|
||||||
super.onProgressUpdate(values);
|
|
||||||
}
|
|
||||||
|
|
||||||
@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() {
|
|
||||||
|
|
||||||
final List<Currency> balance = balanceManager.getTotalBalance();
|
|
||||||
|
|
||||||
if(balanceManager.getTotalBalance().size() > 0)
|
|
||||||
{
|
|
||||||
for(int i = 0; i < balanceManager.getTotalBalance().size(); i++)
|
|
||||||
{
|
|
||||||
balance.get(i).updateHistoryMinutes(getApplicationContext(), new Currency.CurrencyCallBack() {
|
|
||||||
@Override
|
|
||||||
public void onSuccess(Currency currency) {
|
|
||||||
countCoins(true, false);
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
runOnUiThread(new Runnable() {
|
|
||||||
@Override
|
|
||||||
public void run() {
|
|
||||||
countCoins(false, false);
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public void onError(String error)
|
|
||||||
{
|
|
||||||
switch (error)
|
|
||||||
{
|
|
||||||
case "com.android.volley.AuthFailureError":
|
|
||||||
preferencesManager.disableHitBTC();
|
|
||||||
Snackbar.make(findViewById(R.id.viewFlipperSummary), "HitBTC synchronization error : Invalid keys", Snackbar.LENGTH_LONG)
|
|
||||||
.show();
|
|
||||||
refreshLayout.setRefreshing(false);
|
|
||||||
updateAll(true);
|
|
||||||
break;
|
|
||||||
case "API-key format invalid.":
|
|
||||||
preferencesManager.disableBinance();
|
|
||||||
Snackbar.make(findViewById(R.id.viewFlipperSummary), "Binance synchronization error : Invalid keys", Snackbar.LENGTH_LONG)
|
|
||||||
.show();
|
|
||||||
updateAll(true);
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
Snackbar.make(findViewById(R.id.viewFlipperSummary), "Unexpected error", Snackbar.LENGTH_LONG)
|
|
||||||
.show();
|
|
||||||
Log.d("coinfolio", error);
|
|
||||||
updateAll(true);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
updateMarketCap();
|
|
||||||
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
protected void onPostExecute(Void result)
|
|
||||||
{
|
|
||||||
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public interface IconCallBack
|
public interface IconCallBack
|
||||||
{
|
{
|
||||||
void onSuccess(Bitmap bitmap);
|
void onSuccess(Bitmap bitmap);
|
||||||
|
@ -0,0 +1,232 @@
|
|||||||
|
package com.nauk.coinfolio.Activities.HomeActivityFragments;
|
||||||
|
|
||||||
|
import android.annotation.SuppressLint;
|
||||||
|
import android.graphics.Color;
|
||||||
|
import android.support.v4.app.Fragment;
|
||||||
|
import android.os.Bundle;
|
||||||
|
import android.support.v4.widget.SwipeRefreshLayout;
|
||||||
|
import android.text.SpannableString;
|
||||||
|
import android.view.LayoutInflater;
|
||||||
|
import android.view.MotionEvent;
|
||||||
|
import android.view.View;
|
||||||
|
import android.view.ViewGroup;
|
||||||
|
import android.widget.TextView;
|
||||||
|
|
||||||
|
import com.github.mikephil.charting.charts.PieChart;
|
||||||
|
import com.github.mikephil.charting.data.PieData;
|
||||||
|
import com.github.mikephil.charting.data.PieDataSet;
|
||||||
|
import com.github.mikephil.charting.data.PieEntry;
|
||||||
|
import com.github.mikephil.charting.formatter.PercentFormatter;
|
||||||
|
import com.nauk.coinfolio.DataManagers.MarketCapManager;
|
||||||
|
import com.nauk.coinfolio.R;
|
||||||
|
|
||||||
|
import java.text.DecimalFormat;
|
||||||
|
import java.text.DecimalFormatSymbols;
|
||||||
|
import java.text.NumberFormat;
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.HashMap;
|
||||||
|
import java.util.Iterator;
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.Locale;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Created by Tiji on 13/04/2018.
|
||||||
|
*/
|
||||||
|
|
||||||
|
public class MarketCapitalization extends Fragment {
|
||||||
|
|
||||||
|
private int marketCapCounter;
|
||||||
|
|
||||||
|
private MarketCapManager marketCapManager;
|
||||||
|
private HashMap<String, Integer> dominantCurrenciesColors;
|
||||||
|
private SwipeRefreshLayout refreshLayout;
|
||||||
|
private long lastTimestamp;
|
||||||
|
|
||||||
|
private View view;
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState)
|
||||||
|
{
|
||||||
|
view = inflater.inflate(R.layout.fragment_marketcap_homeactivity, container, false);
|
||||||
|
|
||||||
|
marketCapManager = new MarketCapManager(getContext());
|
||||||
|
refreshLayout = view.findViewById(R.id.swiperefresh);
|
||||||
|
|
||||||
|
refreshLayout.setOnRefreshListener(
|
||||||
|
new SwipeRefreshLayout.OnRefreshListener() {
|
||||||
|
@Override
|
||||||
|
public void onRefresh() {
|
||||||
|
updateMarketCap();
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
);
|
||||||
|
|
||||||
|
lastTimestamp = 0;
|
||||||
|
|
||||||
|
setupDominantCurrenciesColors();
|
||||||
|
|
||||||
|
updateMarketCap();
|
||||||
|
|
||||||
|
return view;
|
||||||
|
}
|
||||||
|
|
||||||
|
private void setupDominantCurrenciesColors()
|
||||||
|
{
|
||||||
|
dominantCurrenciesColors = new HashMap<>();
|
||||||
|
|
||||||
|
dominantCurrenciesColors.put("BTC", -489456);
|
||||||
|
dominantCurrenciesColors.put("ETH", -13619152);
|
||||||
|
dominantCurrenciesColors.put("XRP", -16744256);
|
||||||
|
dominantCurrenciesColors.put("BCH", -1011696);
|
||||||
|
dominantCurrenciesColors.put("LTC", -4671304);
|
||||||
|
dominantCurrenciesColors.put("ADA", -16773080);
|
||||||
|
dominantCurrenciesColors.put("NEO", -9390048);
|
||||||
|
dominantCurrenciesColors.put("XLM", -11509656);
|
||||||
|
dominantCurrenciesColors.put("XMR", -499712);
|
||||||
|
dominantCurrenciesColors.put("EOS", -1513240);
|
||||||
|
dominantCurrenciesColors.put("IOT", -1513240);
|
||||||
|
dominantCurrenciesColors.put("DASH", -15175496);
|
||||||
|
dominantCurrenciesColors.put("XEM", -7829368);
|
||||||
|
dominantCurrenciesColors.put("TRX", -7829360);
|
||||||
|
dominantCurrenciesColors.put("ETC", -10448784);
|
||||||
|
}
|
||||||
|
|
||||||
|
private void updateMarketCap()
|
||||||
|
{
|
||||||
|
if(System.currentTimeMillis() / 1000 - lastTimestamp > 60)
|
||||||
|
{
|
||||||
|
if(!refreshLayout.isRefreshing())
|
||||||
|
{
|
||||||
|
refreshLayout.setRefreshing(true);
|
||||||
|
}
|
||||||
|
|
||||||
|
marketCapCounter = 0;
|
||||||
|
|
||||||
|
lastTimestamp = System.currentTimeMillis() / 1000;
|
||||||
|
|
||||||
|
marketCapManager.updateTopCurrencies(new MarketCapManager.VolleyCallBack() {
|
||||||
|
@Override
|
||||||
|
public void onSuccess()
|
||||||
|
{
|
||||||
|
countCompletedMarketCapRequest();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
marketCapManager.updateMarketCap(new MarketCapManager.VolleyCallBack() {
|
||||||
|
@Override
|
||||||
|
public void onSuccess() {
|
||||||
|
countCompletedMarketCapRequest();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if(refreshLayout.isRefreshing())
|
||||||
|
{
|
||||||
|
refreshLayout.setRefreshing(false);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@SuppressLint("ClickableViewAccessibility")
|
||||||
|
private void countCompletedMarketCapRequest()
|
||||||
|
{
|
||||||
|
marketCapCounter++;
|
||||||
|
|
||||||
|
if(marketCapCounter == 2)
|
||||||
|
{
|
||||||
|
setupTextViewMarketCap();
|
||||||
|
|
||||||
|
view.findViewById(R.id.progressBarMarketCap).setVisibility(View.GONE);
|
||||||
|
view.findViewById(R.id.layoutProgressMarketCap).setVisibility(View.VISIBLE);
|
||||||
|
|
||||||
|
List<PieEntry> entries = new ArrayList<>();
|
||||||
|
|
||||||
|
ArrayList<Integer> colors = new ArrayList<>();
|
||||||
|
|
||||||
|
float otherCurrenciesDominance = 0;
|
||||||
|
|
||||||
|
for(Iterator i = marketCapManager.getDominance().keySet().iterator(); i.hasNext(); )
|
||||||
|
{
|
||||||
|
String key = (String) i.next();
|
||||||
|
entries.add(new PieEntry(marketCapManager.getDominance().get(key), key));
|
||||||
|
otherCurrenciesDominance += marketCapManager.getDominance().get(key);
|
||||||
|
colors.add(dominantCurrenciesColors.get(key));
|
||||||
|
}
|
||||||
|
entries.add(new PieEntry(100-otherCurrenciesDominance, "Others"));
|
||||||
|
colors.add(-12369084);
|
||||||
|
|
||||||
|
PieDataSet set = new PieDataSet(entries, "Market Cap Dominance");
|
||||||
|
set.setColors(colors);
|
||||||
|
set.setSliceSpace(1);
|
||||||
|
set.setYValuePosition(PieDataSet.ValuePosition.OUTSIDE_SLICE);
|
||||||
|
set.setXValuePosition(PieDataSet.ValuePosition.OUTSIDE_SLICE);
|
||||||
|
PieData data = new PieData(set);
|
||||||
|
data.setValueTextSize(10);
|
||||||
|
data.setValueFormatter(new PercentFormatter());
|
||||||
|
|
||||||
|
setupPieChart(data);
|
||||||
|
|
||||||
|
if(refreshLayout.isRefreshing())
|
||||||
|
{
|
||||||
|
refreshLayout.setRefreshing(false);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void setupPieChart(PieData data)
|
||||||
|
{
|
||||||
|
PieChart pieChart = view.findViewById(R.id.marketCapPieChart);
|
||||||
|
|
||||||
|
pieChart.setData(data);
|
||||||
|
pieChart.setDrawSlicesUnderHole(false);
|
||||||
|
pieChart.setUsePercentValues(true);
|
||||||
|
pieChart.setTouchEnabled(true);
|
||||||
|
|
||||||
|
pieChart.setEntryLabelColor(Color.parseColor("#FF000000"));
|
||||||
|
|
||||||
|
pieChart.setOnTouchListener(new View.OnTouchListener() {
|
||||||
|
@Override
|
||||||
|
public boolean onTouch(View view, MotionEvent motionEvent) {
|
||||||
|
switch (motionEvent.getAction())
|
||||||
|
{
|
||||||
|
case MotionEvent.ACTION_DOWN:
|
||||||
|
refreshLayout.setEnabled(false);
|
||||||
|
break;
|
||||||
|
case MotionEvent.ACTION_MOVE:
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
refreshLayout.setEnabled(true);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
pieChart.getDescription().setEnabled(false);
|
||||||
|
pieChart.getLegend().setEnabled(false);
|
||||||
|
pieChart.setCenterText(generateCenterSpannableText());
|
||||||
|
pieChart.invalidate(); // refresh
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
private SpannableString generateCenterSpannableText() {
|
||||||
|
|
||||||
|
SpannableString spannableString = new SpannableString("Market Capitalization Dominance");
|
||||||
|
return spannableString;
|
||||||
|
}
|
||||||
|
|
||||||
|
private void setupTextViewMarketCap()
|
||||||
|
{
|
||||||
|
DecimalFormat formatter = (DecimalFormat) NumberFormat.getInstance(Locale.UK);
|
||||||
|
DecimalFormatSymbols symbols = formatter.getDecimalFormatSymbols();
|
||||||
|
|
||||||
|
symbols.setGroupingSeparator(' ');
|
||||||
|
formatter.setDecimalFormatSymbols(symbols);
|
||||||
|
|
||||||
|
((TextView) view.findViewById(R.id.marketCapTextView)).setText(getResources().getString(R.string.market_cap_textview, formatter.format(marketCapManager.getMarketCap())));
|
||||||
|
|
||||||
|
((TextView) view.findViewById(R.id.dayVolumeTotalMarketCap)).setText(getResources().getString(R.string.volume_market_cap_textview, formatter.format(marketCapManager.getDayVolume())));
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,660 @@
|
|||||||
|
package com.nauk.coinfolio.Activities.HomeActivityFragments;
|
||||||
|
|
||||||
|
import android.app.Dialog;
|
||||||
|
import android.content.Intent;
|
||||||
|
import android.graphics.Bitmap;
|
||||||
|
import android.graphics.BitmapFactory;
|
||||||
|
import android.graphics.Color;
|
||||||
|
import android.os.AsyncTask;
|
||||||
|
import android.os.Handler;
|
||||||
|
import android.os.Looper;
|
||||||
|
import android.support.design.widget.CollapsingToolbarLayout;
|
||||||
|
import android.support.design.widget.Snackbar;
|
||||||
|
import android.support.v4.app.Fragment;
|
||||||
|
import android.os.Bundle;
|
||||||
|
import android.support.v4.widget.SwipeRefreshLayout;
|
||||||
|
import android.support.v7.graphics.Palette;
|
||||||
|
import android.util.Log;
|
||||||
|
import android.view.Gravity;
|
||||||
|
import android.view.LayoutInflater;
|
||||||
|
import android.view.View;
|
||||||
|
import android.view.ViewGroup;
|
||||||
|
import android.widget.Button;
|
||||||
|
import android.widget.ImageButton;
|
||||||
|
import android.widget.LinearLayout;
|
||||||
|
import android.widget.ProgressBar;
|
||||||
|
import android.widget.TextView;
|
||||||
|
|
||||||
|
import com.nauk.coinfolio.Activities.CurrencySelectionActivity;
|
||||||
|
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.PreferencesManager;
|
||||||
|
import com.nauk.coinfolio.LayoutManagers.HomeLayoutGenerator;
|
||||||
|
import com.nauk.coinfolio.R;
|
||||||
|
|
||||||
|
import java.io.IOException;
|
||||||
|
import java.io.InputStream;
|
||||||
|
import java.net.HttpURLConnection;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Created by Tiji on 13/04/2018.
|
||||||
|
*/
|
||||||
|
|
||||||
|
public class Summary extends Fragment {
|
||||||
|
|
||||||
|
private boolean isDetailed;
|
||||||
|
private LinearLayout currencyLayout;
|
||||||
|
private PreferencesManager preferencesManager;
|
||||||
|
private BalanceManager balanceManager;
|
||||||
|
private HomeLayoutGenerator layoutGenerator;
|
||||||
|
private View view;
|
||||||
|
private SwipeRefreshLayout refreshLayout;
|
||||||
|
private Dialog loadingDialog;
|
||||||
|
|
||||||
|
private TextView toolbarSubtitle;
|
||||||
|
private CollapsingToolbarLayout toolbarLayout;
|
||||||
|
private Handler handler;
|
||||||
|
|
||||||
|
private Runnable updateRunnable;
|
||||||
|
|
||||||
|
private int coinCounter;
|
||||||
|
private int iconCounter;
|
||||||
|
private float totalValue;
|
||||||
|
private boolean detailsChecker;
|
||||||
|
protected float totalFluctuation;
|
||||||
|
private long lastTimestamp;
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState)
|
||||||
|
{
|
||||||
|
view = inflater.inflate(R.layout.fragment_summary_homeactivity, container, false);
|
||||||
|
|
||||||
|
currencyLayout = view.findViewById(R.id.currencyListLayout);
|
||||||
|
preferencesManager = new PreferencesManager(getActivity());
|
||||||
|
balanceManager = new BalanceManager(getActivity());
|
||||||
|
layoutGenerator = new HomeLayoutGenerator(getActivity());
|
||||||
|
refreshLayout = view.findViewById(R.id.swiperefresh);
|
||||||
|
toolbarSubtitle = getActivity().findViewById(R.id.toolbarSubtitle);
|
||||||
|
toolbarLayout = getActivity().findViewById(R.id.toolbar_layout);
|
||||||
|
|
||||||
|
isDetailed = preferencesManager.getDetailOption();
|
||||||
|
|
||||||
|
totalValue = 0;
|
||||||
|
totalFluctuation = 0;
|
||||||
|
lastTimestamp = 0;
|
||||||
|
|
||||||
|
handler = new Handler();
|
||||||
|
updateRunnable = new Runnable() {
|
||||||
|
@Override
|
||||||
|
public void run() {
|
||||||
|
if (refreshLayout.isRefreshing())
|
||||||
|
{
|
||||||
|
refreshLayout.setRefreshing(false);
|
||||||
|
|
||||||
|
showErrorSnackbar();
|
||||||
|
}
|
||||||
|
|
||||||
|
if (loadingDialog.isShowing())
|
||||||
|
{
|
||||||
|
loadingDialog.dismiss();
|
||||||
|
|
||||||
|
showErrorSnackbar();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
refreshLayout.setOnRefreshListener(
|
||||||
|
new SwipeRefreshLayout.OnRefreshListener() {
|
||||||
|
@Override
|
||||||
|
public void onRefresh() {
|
||||||
|
updateAll(false);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
);
|
||||||
|
|
||||||
|
handler.postDelayed(updateRunnable, 10000);
|
||||||
|
|
||||||
|
Button addCurrencyButton = view.findViewById(R.id.buttonAddTransaction);
|
||||||
|
|
||||||
|
addCurrencyButton.setOnClickListener(new View.OnClickListener() {
|
||||||
|
@Override
|
||||||
|
public void onClick(View view) {
|
||||||
|
Intent addIntent = new Intent(getActivity(), CurrencySelectionActivity.class);
|
||||||
|
|
||||||
|
startActivity(addIntent);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
ImageButton detailsButton = getActivity().findViewById(R.id.switch_button);
|
||||||
|
detailsButton.setOnClickListener(new View.OnClickListener() {
|
||||||
|
@Override
|
||||||
|
public void onClick(View view) {
|
||||||
|
switchView();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
displayBalance(preferencesManager.isBalanceHidden());
|
||||||
|
|
||||||
|
updateTitle();
|
||||||
|
|
||||||
|
generateSplashScreen();
|
||||||
|
|
||||||
|
updateAll(true);
|
||||||
|
|
||||||
|
return view;
|
||||||
|
}
|
||||||
|
|
||||||
|
private void updateAll(boolean mustUpdate)
|
||||||
|
{
|
||||||
|
if(System.currentTimeMillis()/1000 - lastTimestamp > 60 || mustUpdate)
|
||||||
|
{
|
||||||
|
if(!refreshLayout.isRefreshing())
|
||||||
|
{
|
||||||
|
refreshLayout.setRefreshing(true);
|
||||||
|
}
|
||||||
|
|
||||||
|
lastTimestamp = System.currentTimeMillis() / 1000;
|
||||||
|
balanceManager.updateExchangeKeys();
|
||||||
|
refreshLayout.setRefreshing(true);
|
||||||
|
|
||||||
|
resetCounters();
|
||||||
|
DataUpdater updater = new DataUpdater();
|
||||||
|
updater.execute();
|
||||||
|
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if(refreshLayout.isRefreshing())
|
||||||
|
{
|
||||||
|
refreshLayout.setRefreshing(false);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void showErrorSnackbar()
|
||||||
|
{
|
||||||
|
/*Snackbar.make(getActivity().findViewById(R.id.viewFlipperSummary), "Error while updating data", Snackbar.LENGTH_LONG)
|
||||||
|
.setAction("Update", new View.OnClickListener() {
|
||||||
|
@Override
|
||||||
|
public void onClick(View view) {
|
||||||
|
|
||||||
|
}
|
||||||
|
})
|
||||||
|
.show();*/
|
||||||
|
}
|
||||||
|
|
||||||
|
private void resetCounters()
|
||||||
|
{
|
||||||
|
coinCounter = 0;
|
||||||
|
iconCounter = 0;
|
||||||
|
detailsChecker = false;
|
||||||
|
|
||||||
|
totalValue = 0;
|
||||||
|
totalFluctuation = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
private void generateSplashScreen()
|
||||||
|
{
|
||||||
|
LinearLayout loadingLayout = new LinearLayout(getActivity());
|
||||||
|
|
||||||
|
loadingLayout.setLayoutParams(new LinearLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT));
|
||||||
|
loadingLayout.setGravity(Gravity.CENTER);
|
||||||
|
loadingLayout.setOrientation(LinearLayout.VERTICAL);
|
||||||
|
|
||||||
|
loadingDialog = new Dialog(getActivity(), android.R.style.Theme_Black_NoTitleBar_Fullscreen);
|
||||||
|
|
||||||
|
TextView txtView = new TextView(getActivity());
|
||||||
|
txtView.setText("Loading data...");
|
||||||
|
txtView.setTextSize(20);
|
||||||
|
txtView.setGravity(Gravity.CENTER);
|
||||||
|
txtView.setTextColor(this.getResources().getColor(R.color.cardview_light_background));
|
||||||
|
|
||||||
|
ProgressBar progressBar = new ProgressBar(getActivity());
|
||||||
|
progressBar.setIndeterminate(true);
|
||||||
|
|
||||||
|
loadingLayout.setBackgroundColor(this.getResources().getColor(R.color.colorPrimaryDark));
|
||||||
|
loadingLayout.addView(txtView);
|
||||||
|
loadingLayout.addView(progressBar);
|
||||||
|
|
||||||
|
loadingDialog.setContentView(loadingLayout);
|
||||||
|
loadingDialog.show();
|
||||||
|
}
|
||||||
|
|
||||||
|
private void switchView()
|
||||||
|
{
|
||||||
|
if(isDetailed)
|
||||||
|
{
|
||||||
|
isDetailed = false;
|
||||||
|
|
||||||
|
adaptView();
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
isDetailed = true;
|
||||||
|
|
||||||
|
adaptView();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void adaptView()
|
||||||
|
{
|
||||||
|
currencyLayout.removeAllViews();
|
||||||
|
|
||||||
|
for(int i = 0; i < balanceManager.getTotalBalance().size(); i++)
|
||||||
|
{
|
||||||
|
final Currency currency = balanceManager.getTotalBalance().get(i);
|
||||||
|
|
||||||
|
if(!currency.getSymbol().equals("USD") && ((currency.getBalance() * currency.getValue()) > 0.001 || currency.getHistoryMinutes() == null))
|
||||||
|
{
|
||||||
|
currencyLayout.addView(layoutGenerator.getInfoLayout(currency, isDetailed, totalValue, preferencesManager.isBalanceHidden()));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void countCoins(boolean isCoin, boolean isDetails)
|
||||||
|
{
|
||||||
|
if(isCoin)
|
||||||
|
{
|
||||||
|
coinCounter++;
|
||||||
|
}
|
||||||
|
|
||||||
|
if(isDetails)
|
||||||
|
{
|
||||||
|
detailsChecker = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
if(balanceManager.getTotalBalance() != null)
|
||||||
|
{
|
||||||
|
if(coinCounter == balanceManager.getTotalBalance().size() && detailsChecker)
|
||||||
|
{
|
||||||
|
IconDownloader iconDownloader = new IconDownloader();
|
||||||
|
iconDownloader.execute();
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if(balanceManager.getTotalBalance().size() == 0)
|
||||||
|
{
|
||||||
|
countIcons();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
private void countIcons()
|
||||||
|
{
|
||||||
|
int offset = 0;
|
||||||
|
|
||||||
|
for(int i = 0; i < balanceManager.getTotalBalance().size(); i++)
|
||||||
|
{
|
||||||
|
if(balanceManager.getTotalBalance().get(i).getSymbol().equals("USD"))
|
||||||
|
{
|
||||||
|
offset++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
iconCounter++;
|
||||||
|
|
||||||
|
if(balanceManager.getTotalBalance() != null)
|
||||||
|
{
|
||||||
|
if(balanceManager.getTotalBalance().size() == 0)
|
||||||
|
{
|
||||||
|
updateNoBalance();
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if(iconCounter == balanceManager.getTotalBalance().size() - offset)
|
||||||
|
{
|
||||||
|
Log.d(getResources().getString(R.string.debug), "Loading heavy");
|
||||||
|
|
||||||
|
UiHeavyLoadCalculator uiHeavyLoadCalculator = new UiHeavyLoadCalculator();
|
||||||
|
uiHeavyLoadCalculator.execute();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void updateNoBalance()
|
||||||
|
{
|
||||||
|
refreshLayout.setRefreshing(false);
|
||||||
|
|
||||||
|
currencyLayout.removeAllViews();
|
||||||
|
|
||||||
|
if(loadingDialog.isShowing())
|
||||||
|
{
|
||||||
|
loadingDialog.dismiss();
|
||||||
|
}
|
||||||
|
|
||||||
|
getActivity().runOnUiThread(new Runnable() {
|
||||||
|
@Override
|
||||||
|
public void run() {
|
||||||
|
|
||||||
|
updateTitle();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
protected void updateTitle()
|
||||||
|
{
|
||||||
|
float totalFluctuationPercentage = totalFluctuation / (totalValue - totalFluctuation) * 100;
|
||||||
|
|
||||||
|
if(preferencesManager.isBalanceHidden())
|
||||||
|
{
|
||||||
|
toolbarLayout.setTitle(getResources().getString(R.string.currencyPercentagePlaceholder, String.format("%.2f", totalFluctuationPercentage)));
|
||||||
|
toolbarSubtitle.setVisibility(View.GONE);
|
||||||
|
|
||||||
|
if(totalFluctuation > 0)
|
||||||
|
{
|
||||||
|
toolbarLayout.setCollapsedTitleTextColor(getResources().getColor(R.color.increase));
|
||||||
|
toolbarLayout.setExpandedTitleColor(getResources().getColor(R.color.increase));
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
toolbarLayout.setCollapsedTitleTextColor(getResources().getColor(R.color.decrease));
|
||||||
|
toolbarLayout.setExpandedTitleColor(getResources().getColor(R.color.decrease));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
toolbarLayout.setTitle(getResources().getString(R.string.currencyDollarPlaceholder, String.format("%.2f", totalValue)));
|
||||||
|
toolbarLayout.setCollapsedTitleTextColor(Color.WHITE);
|
||||||
|
toolbarLayout.setExpandedTitleColor(Color.WHITE);
|
||||||
|
|
||||||
|
toolbarSubtitle.setVisibility(View.VISIBLE);
|
||||||
|
|
||||||
|
if(totalFluctuation > 0)
|
||||||
|
{
|
||||||
|
toolbarSubtitle.setTextColor(getResources().getColor(R.color.increase));
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
toolbarSubtitle.setTextColor(getResources().getColor(R.color.decrease));
|
||||||
|
}
|
||||||
|
|
||||||
|
if(totalFluctuation == 0)
|
||||||
|
{
|
||||||
|
toolbarSubtitle.setText(getResources().getString(R.string.currencyDollarPlaceholder, "0.00"));
|
||||||
|
toolbarSubtitle.setTextColor(-1275068417);
|
||||||
|
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
toolbarSubtitle.setText("US$" + String.format("%.2f", totalFluctuation) + " (" + String.format("%.2f", totalFluctuationPercentage) + "%)");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private class UiHeavyLoadCalculator extends AsyncTask<Void, Integer, Void>
|
||||||
|
{
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected void onPreExecute()
|
||||||
|
{
|
||||||
|
super.onPreExecute();
|
||||||
|
|
||||||
|
totalValue = 0;
|
||||||
|
totalFluctuation = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected void onProgressUpdate(Integer... values)
|
||||||
|
{
|
||||||
|
super.onProgressUpdate(values);
|
||||||
|
}
|
||||||
|
|
||||||
|
private void updateChartColor(Currency currency)
|
||||||
|
{
|
||||||
|
if(currency.getIcon() != null)
|
||||||
|
{
|
||||||
|
Palette.Builder builder = Palette.from(currency.getIcon());
|
||||||
|
|
||||||
|
currency.setChartColor(builder.generate().getDominantColor(0));
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
currency.setChartColor(12369084);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void loadCurrency(Currency currency)
|
||||||
|
{
|
||||||
|
if(!currency.getSymbol().equals("USD") && (currency.getBalance() * currency.getValue()) > 0.001)
|
||||||
|
{
|
||||||
|
currency.setName(balanceManager.getCurrencyName(currency.getSymbol()));
|
||||||
|
currency.setId(balanceManager.getCurrencyId(currency.getSymbol()));
|
||||||
|
totalValue += currency.getValue() * currency.getBalance();
|
||||||
|
totalFluctuation += (currency.getValue() * currency.getBalance()) * (currency.getDayFluctuationPercentage() / 100);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void refreshCurrencyList()
|
||||||
|
{
|
||||||
|
getActivity().runOnUiThread(new Runnable() {
|
||||||
|
@Override
|
||||||
|
public void run() {
|
||||||
|
currencyLayout.removeAllViews();
|
||||||
|
|
||||||
|
for(int i = 0; i < balanceManager.getTotalBalance().size(); i++)
|
||||||
|
{
|
||||||
|
Currency currency = balanceManager.getTotalBalance().get(i);
|
||||||
|
|
||||||
|
if(!currency.getSymbol().equals("USD") && (currency.getBalance() * currency.getValue()) > 0.001) {
|
||||||
|
currencyLayout.addView(layoutGenerator.getInfoLayout(currency, isDetailed, totalValue, preferencesManager.isBalanceHidden()));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected Void doInBackground(Void... params)
|
||||||
|
{
|
||||||
|
if(Looper.myLooper() == null)
|
||||||
|
{
|
||||||
|
Looper.prepare();
|
||||||
|
}
|
||||||
|
|
||||||
|
balanceManager.sortCoins();
|
||||||
|
|
||||||
|
for(int i = 0; i < balanceManager.getTotalBalance().size(); i++)
|
||||||
|
{
|
||||||
|
final Currency localCurrency = balanceManager.getTotalBalance().get(i);
|
||||||
|
|
||||||
|
updateChartColor(localCurrency);
|
||||||
|
|
||||||
|
loadCurrency(localCurrency);
|
||||||
|
|
||||||
|
balanceManager.getTotalBalance().set(i, localCurrency);
|
||||||
|
}
|
||||||
|
|
||||||
|
getActivity().runOnUiThread(new Runnable() {
|
||||||
|
@Override
|
||||||
|
public void run() {
|
||||||
|
updateTitle();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
if(loadingDialog.isShowing())
|
||||||
|
{
|
||||||
|
loadingDialog.dismiss();
|
||||||
|
}
|
||||||
|
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected void onPostExecute(Void result)
|
||||||
|
{
|
||||||
|
refreshLayout.setRefreshing(false);
|
||||||
|
refreshCurrencyList();
|
||||||
|
totalValue = totalValue;
|
||||||
|
handler.removeCallbacks(updateRunnable);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void getBitmapFromURL(String src, HomeActivity.IconCallBack callBack) {
|
||||||
|
Bitmap result;
|
||||||
|
|
||||||
|
try {
|
||||||
|
java.net.URL url = new java.net.URL(src);
|
||||||
|
HttpURLConnection connection = (HttpURLConnection) url
|
||||||
|
.openConnection();
|
||||||
|
connection.setDoInput(true);
|
||||||
|
connection.connect();
|
||||||
|
InputStream input = connection.getInputStream();
|
||||||
|
result = BitmapFactory.decodeStream(input);
|
||||||
|
} catch (IOException e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
result = BitmapFactory.decodeResource(this.getResources(),
|
||||||
|
R.mipmap.icon_coinfolio);
|
||||||
|
result = Bitmap.createScaledBitmap(result, 50, 50, false);
|
||||||
|
}
|
||||||
|
|
||||||
|
callBack.onSuccess(result);
|
||||||
|
}
|
||||||
|
|
||||||
|
private void displayBalance(boolean hideBalance)
|
||||||
|
{
|
||||||
|
updateTitle();
|
||||||
|
|
||||||
|
if(hideBalance)
|
||||||
|
{
|
||||||
|
for(int i = 0; i < currencyLayout.getChildCount(); i++)
|
||||||
|
{
|
||||||
|
currencyLayout.getChildAt(i).findViewById(R.id.currencyPortfolioDominance).setVisibility(View.VISIBLE);
|
||||||
|
currencyLayout.getChildAt(i).findViewById(R.id.percentageOwnedTextView).setVisibility(View.VISIBLE);
|
||||||
|
currencyLayout.getChildAt(i).findViewById(R.id.currencyOwnedInfoLayout).setVisibility(View.GONE);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
for(int i = 0; i < currencyLayout.getChildCount(); i++)
|
||||||
|
{
|
||||||
|
currencyLayout.getChildAt(i).findViewById(R.id.currencyPortfolioDominance).setVisibility(View.INVISIBLE);
|
||||||
|
currencyLayout.getChildAt(i).findViewById(R.id.percentageOwnedTextView).setVisibility(View.GONE);
|
||||||
|
currencyLayout.getChildAt(i).findViewById(R.id.currencyOwnedInfoLayout).setVisibility(View.VISIBLE);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private class IconDownloader extends AsyncTask<Void, Integer, Void>
|
||||||
|
{
|
||||||
|
@Override
|
||||||
|
protected void onPreExecute()
|
||||||
|
{
|
||||||
|
super.onPreExecute();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected void onProgressUpdate(Integer... values)
|
||||||
|
{
|
||||||
|
super.onProgressUpdate(values);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected Void doInBackground(Void... params)
|
||||||
|
{
|
||||||
|
for (int i = 0; i < balanceManager.getTotalBalance().size(); i++)
|
||||||
|
{
|
||||||
|
final Currency localCurrency = balanceManager.getTotalBalance().get(i);
|
||||||
|
|
||||||
|
if(balanceManager.getIconUrl(localCurrency.getSymbol()) != null)
|
||||||
|
{
|
||||||
|
getBitmapFromURL(balanceManager.getIconUrl(localCurrency.getSymbol()), new HomeActivity.IconCallBack() {
|
||||||
|
@Override
|
||||||
|
public void onSuccess(Bitmap bitmapIcon) {
|
||||||
|
localCurrency.setIcon(bitmapIcon);
|
||||||
|
countIcons();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected void onPostExecute(Void result)
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
private class DataUpdater extends AsyncTask<Void, Integer, Void>
|
||||||
|
{
|
||||||
|
@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() {
|
||||||
|
|
||||||
|
final List<Currency> balance = balanceManager.getTotalBalance();
|
||||||
|
|
||||||
|
if(balanceManager.getTotalBalance().size() > 0)
|
||||||
|
{
|
||||||
|
for(int i = 0; i < balanceManager.getTotalBalance().size(); i++)
|
||||||
|
{
|
||||||
|
balance.get(i).updateHistoryMinutes(getActivity(), new Currency.CurrencyCallBack() {
|
||||||
|
@Override
|
||||||
|
public void onSuccess(Currency currency) {
|
||||||
|
countCoins(true, false);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
getActivity().runOnUiThread(new Runnable() {
|
||||||
|
@Override
|
||||||
|
public void run() {
|
||||||
|
countCoins(false, false);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public void onError(String error)
|
||||||
|
{
|
||||||
|
/*switch (error)
|
||||||
|
{
|
||||||
|
case "com.android.volley.AuthFailureError":
|
||||||
|
preferencesManager.disableHitBTC();
|
||||||
|
Snackbar.make(findViewById(R.id.viewFlipperSummary), "HitBTC synchronization error : Invalid keys", Snackbar.LENGTH_LONG)
|
||||||
|
.show();
|
||||||
|
refreshLayout.setRefreshing(false);
|
||||||
|
updateAll(true);
|
||||||
|
break;
|
||||||
|
case "API-key format invalid.":
|
||||||
|
preferencesManager.disableBinance();
|
||||||
|
Snackbar.make(findViewById(R.id.viewFlipperSummary), "Binance synchronization error : Invalid keys", Snackbar.LENGTH_LONG)
|
||||||
|
.show();
|
||||||
|
updateAll(true);
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
Snackbar.make(findViewById(R.id.viewFlipperSummary), "Unexpected error", Snackbar.LENGTH_LONG)
|
||||||
|
.show();
|
||||||
|
Log.d("coinfolio", error);
|
||||||
|
updateAll(true);
|
||||||
|
}*/
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@ -0,0 +1,230 @@
|
|||||||
|
package com.nauk.coinfolio.Activities.HomeActivityFragments;
|
||||||
|
|
||||||
|
import android.content.Intent;
|
||||||
|
import android.graphics.Bitmap;
|
||||||
|
import android.graphics.BitmapFactory;
|
||||||
|
import android.os.AsyncTask;
|
||||||
|
import android.support.v4.app.Fragment;
|
||||||
|
import android.os.Bundle;
|
||||||
|
import android.support.v4.widget.SwipeRefreshLayout;
|
||||||
|
import android.util.Log;
|
||||||
|
import android.view.LayoutInflater;
|
||||||
|
import android.view.View;
|
||||||
|
import android.view.ViewGroup;
|
||||||
|
import android.widget.Button;
|
||||||
|
import android.widget.ImageView;
|
||||||
|
import android.widget.LinearLayout;
|
||||||
|
import android.widget.ScrollView;
|
||||||
|
import android.widget.TextView;
|
||||||
|
|
||||||
|
import com.nauk.coinfolio.Activities.CurrencySelectionActivity;
|
||||||
|
import com.nauk.coinfolio.Activities.HomeActivity;
|
||||||
|
import com.nauk.coinfolio.DataManagers.BalanceManager;
|
||||||
|
import com.nauk.coinfolio.DataManagers.CurrencyData.Currency;
|
||||||
|
import com.nauk.coinfolio.DataManagers.CurrencyData.CurrencyDetailsList;
|
||||||
|
import com.nauk.coinfolio.DataManagers.PreferencesManager;
|
||||||
|
import com.nauk.coinfolio.DataManagers.WatchlistManager;
|
||||||
|
import com.nauk.coinfolio.R;
|
||||||
|
|
||||||
|
import org.json.JSONException;
|
||||||
|
import org.json.JSONObject;
|
||||||
|
|
||||||
|
import java.io.IOException;
|
||||||
|
import java.io.InputStream;
|
||||||
|
import java.net.HttpURLConnection;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Created by Tiji on 13/04/2018.
|
||||||
|
*/
|
||||||
|
|
||||||
|
public class Watchlist extends Fragment {
|
||||||
|
|
||||||
|
private WatchlistManager watchlistManager;
|
||||||
|
private View view;
|
||||||
|
private int watchlistCounter;
|
||||||
|
private CurrencyDetailsList currencyDetailsList;
|
||||||
|
private SwipeRefreshLayout refreshLayout;
|
||||||
|
private long lastTimestamp;
|
||||||
|
private PreferencesManager preferencesManager;
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState)
|
||||||
|
{
|
||||||
|
view = inflater.inflate(R.layout.fragment_watchlist_homeactivity, container, false);
|
||||||
|
|
||||||
|
refreshLayout = view.findViewById(R.id.swiperefresh);
|
||||||
|
currencyDetailsList = new CurrencyDetailsList(getContext());
|
||||||
|
preferencesManager = new PreferencesManager(getContext());
|
||||||
|
|
||||||
|
lastTimestamp = 0;
|
||||||
|
|
||||||
|
watchlistManager = new WatchlistManager(getContext());
|
||||||
|
|
||||||
|
updateWatchlist(true);
|
||||||
|
|
||||||
|
refreshLayout.setOnRefreshListener(new SwipeRefreshLayout.OnRefreshListener() {
|
||||||
|
@Override
|
||||||
|
public void onRefresh() {
|
||||||
|
updateWatchlist(false);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
Button addWatchlistButton = view.findViewById(R.id.buttonAddWatchlist);
|
||||||
|
addWatchlistButton.setOnClickListener(new View.OnClickListener() {
|
||||||
|
@Override
|
||||||
|
public void onClick(View view) {
|
||||||
|
Intent selectionIntent = new Intent(getActivity(), CurrencySelectionActivity.class);
|
||||||
|
selectionIntent.putExtra("isWatchList", true);
|
||||||
|
startActivity(selectionIntent);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
return view;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onResume()
|
||||||
|
{
|
||||||
|
super.onResume();
|
||||||
|
|
||||||
|
updateWatchlist(preferencesManager.mustUpdate());
|
||||||
|
}
|
||||||
|
|
||||||
|
private void updateWatchlist(boolean mustUpdate)
|
||||||
|
{
|
||||||
|
if(System.currentTimeMillis()/1000 - lastTimestamp > 60 || mustUpdate)
|
||||||
|
{
|
||||||
|
if(!refreshLayout.isRefreshing())
|
||||||
|
{
|
||||||
|
refreshLayout.setRefreshing(true);
|
||||||
|
}
|
||||||
|
|
||||||
|
lastTimestamp = System.currentTimeMillis()/1000;
|
||||||
|
|
||||||
|
watchlistManager.updateWatchlist();
|
||||||
|
|
||||||
|
currencyDetailsList.update(new BalanceManager.IconCallBack() {
|
||||||
|
@Override
|
||||||
|
public void onSuccess() {
|
||||||
|
WatchlistUpdater watchlistUpdater = new WatchlistUpdater();
|
||||||
|
watchlistUpdater.execute();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if(refreshLayout.isRefreshing())
|
||||||
|
{
|
||||||
|
refreshLayout.setRefreshing(false);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void countWatchlist()
|
||||||
|
{
|
||||||
|
watchlistCounter++;
|
||||||
|
|
||||||
|
if(watchlistCounter >= watchlistManager.getWatchlist().size())
|
||||||
|
{
|
||||||
|
((LinearLayout) view.findViewById(R.id.linearLayoutWatchlist)).removeAllViews();
|
||||||
|
|
||||||
|
for(Currency currency : watchlistManager.getWatchlist())
|
||||||
|
{
|
||||||
|
View card = LayoutInflater.from(getContext()).inflate(R.layout.cardview_watchlist, null);
|
||||||
|
|
||||||
|
((TextView) card.findViewById(R.id.currencyFluctuationPercentageTextView)).setText("3%");
|
||||||
|
((TextView) card.findViewById(R.id.currencyFluctuationTextView)).setText("$3");
|
||||||
|
((TextView) card.findViewById(R.id.currencyNameTextView)).setText(currency.getName());
|
||||||
|
((TextView) card.findViewById(R.id.currencySymbolTextView)).setText(currency.getSymbol());
|
||||||
|
((ImageView) card.findViewById(R.id.currencyIcon)).setImageBitmap(currency.getIcon());
|
||||||
|
((TextView) card.findViewById(R.id.currencyValueTextView)).setText("" + currency.getValue());
|
||||||
|
|
||||||
|
card.setLayoutParams(new LinearLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT));
|
||||||
|
card.setOnClickListener(new View.OnClickListener() {
|
||||||
|
@Override
|
||||||
|
public void onClick(View view) {
|
||||||
|
Log.d("coinfolio", "Clicked !");
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
((LinearLayout) view.findViewById(R.id.linearLayoutWatchlist)).addView(card, 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
if(refreshLayout.isRefreshing())
|
||||||
|
{
|
||||||
|
refreshLayout.setRefreshing(false);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private String getIconUrl(String symbol)
|
||||||
|
{
|
||||||
|
String url;
|
||||||
|
|
||||||
|
try {
|
||||||
|
JSONObject jsonObject = new JSONObject(currencyDetailsList.getCoinInfosHashmap().get(symbol));
|
||||||
|
url = "https://www.cryptocompare.com" + jsonObject.getString("ImageUrl") + "?width=50";
|
||||||
|
} catch (NullPointerException e) {
|
||||||
|
Log.d(getContext().getResources().getString(R.string.debug), symbol + " has no icon URL");
|
||||||
|
url = null;
|
||||||
|
} catch (JSONException e) {
|
||||||
|
Log.d(getContext().getResources().getString(R.string.debug), "Url parsing error for " + symbol);
|
||||||
|
url = null;
|
||||||
|
}
|
||||||
|
|
||||||
|
return url;
|
||||||
|
}
|
||||||
|
|
||||||
|
private void getBitmapFromURL(String src, HomeActivity.IconCallBack callBack) {
|
||||||
|
Bitmap result;
|
||||||
|
|
||||||
|
try {
|
||||||
|
java.net.URL url = new java.net.URL(src);
|
||||||
|
HttpURLConnection connection = (HttpURLConnection) url
|
||||||
|
.openConnection();
|
||||||
|
connection.setDoInput(true);
|
||||||
|
connection.connect();
|
||||||
|
InputStream input = connection.getInputStream();
|
||||||
|
result = BitmapFactory.decodeStream(input);
|
||||||
|
} catch (IOException e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
result = BitmapFactory.decodeResource(this.getResources(),
|
||||||
|
R.mipmap.icon_coinfolio);
|
||||||
|
result = Bitmap.createScaledBitmap(result, 50, 50, false);
|
||||||
|
}
|
||||||
|
|
||||||
|
callBack.onSuccess(result);
|
||||||
|
}
|
||||||
|
|
||||||
|
private class WatchlistUpdater extends AsyncTask<Void, Integer, Void>
|
||||||
|
{
|
||||||
|
@Override
|
||||||
|
protected void onPreExecute()
|
||||||
|
{
|
||||||
|
watchlistCounter = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected Void doInBackground(Void... voids) {
|
||||||
|
for(Currency currency : watchlistManager.getWatchlist())
|
||||||
|
{
|
||||||
|
currency.updateHistoryMinutes(getActivity(), new Currency.CurrencyCallBack() {
|
||||||
|
@Override
|
||||||
|
public void onSuccess(final Currency sucessCurrency) {
|
||||||
|
if(getIconUrl(sucessCurrency.getSymbol()) != null)
|
||||||
|
{
|
||||||
|
getBitmapFromURL(getIconUrl(sucessCurrency.getSymbol()), new HomeActivity.IconCallBack() {
|
||||||
|
@Override
|
||||||
|
public void onSuccess(Bitmap bitmapIcon) {
|
||||||
|
sucessCurrency.setIcon(bitmapIcon);
|
||||||
|
countWatchlist();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -4,6 +4,7 @@ import android.app.DatePickerDialog;
|
|||||||
import android.content.Intent;
|
import android.content.Intent;
|
||||||
import android.os.Bundle;
|
import android.os.Bundle;
|
||||||
import android.preference.PreferenceManager;
|
import android.preference.PreferenceManager;
|
||||||
|
import android.support.v4.widget.SwipeRefreshLayout;
|
||||||
import android.support.v7.app.AppCompatActivity;
|
import android.support.v7.app.AppCompatActivity;
|
||||||
import android.util.Log;
|
import android.util.Log;
|
||||||
import android.view.View;
|
import android.view.View;
|
||||||
|
@ -121,7 +121,7 @@ public class BalanceManager {
|
|||||||
{
|
{
|
||||||
boolean isUpdated = false;
|
boolean isUpdated = false;
|
||||||
|
|
||||||
manualBalances = databaseManager.getAllCurrencyFromManualCurrency();
|
manualBalances = databaseManager.getAllCurrenciesFromManualCurrency();
|
||||||
|
|
||||||
if(binanceManagers.size() > 0)
|
if(binanceManagers.size() > 0)
|
||||||
{
|
{
|
||||||
|
@ -3,6 +3,12 @@ package com.nauk.coinfolio.DataManagers.CurrencyData;
|
|||||||
import android.graphics.Bitmap;
|
import android.graphics.Bitmap;
|
||||||
import android.os.Parcel;
|
import android.os.Parcel;
|
||||||
import android.os.Parcelable;
|
import android.os.Parcelable;
|
||||||
|
import android.util.Log;
|
||||||
|
|
||||||
|
import com.nauk.coinfolio.R;
|
||||||
|
|
||||||
|
import org.json.JSONException;
|
||||||
|
import org.json.JSONObject;
|
||||||
|
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
@ -71,6 +77,24 @@ public class Currency implements Parcelable {
|
|||||||
}, timestamp);
|
}, timestamp);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static String getIconUrl(String currencyDetails)
|
||||||
|
{
|
||||||
|
String url;
|
||||||
|
|
||||||
|
try {
|
||||||
|
JSONObject jsonObject = new JSONObject(currencyDetails);
|
||||||
|
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;
|
||||||
|
}
|
||||||
|
|
||||||
public void updateHistoryMinutes(android.content.Context context, final CurrencyCallBack callBack)
|
public void updateHistoryMinutes(android.content.Context context, final CurrencyCallBack callBack)
|
||||||
{
|
{
|
||||||
dataRetriver = new CurrencyDataRetriever(context);
|
dataRetriver = new CurrencyDataRetriever(context);
|
||||||
|
@ -19,12 +19,13 @@ import java.util.List;
|
|||||||
|
|
||||||
public class DatabaseManager extends SQLiteOpenHelper{
|
public class DatabaseManager extends SQLiteOpenHelper{
|
||||||
|
|
||||||
private static final int DATABASE_VERSION = 5;
|
private static final int DATABASE_VERSION = 6;
|
||||||
|
|
||||||
private static final String DATABASE_NAME = "Currencies.db";
|
private static final String DATABASE_NAME = "Currencies.db";
|
||||||
|
|
||||||
private static final String TABLE_MANUAL_CURRENCIES = "ManualCurrencies";
|
private static final String TABLE_MANUAL_CURRENCIES = "ManualCurrencies";
|
||||||
private static final String TABLE_EXCHANGE_KEYS = "ExchangeKeys";
|
private static final String TABLE_EXCHANGE_KEYS = "ExchangeKeys";
|
||||||
|
private static final String TABLE_WATCHLIST = "Watchlist";
|
||||||
|
|
||||||
private static final String KEY_CURRENCY_ID = "idCurrency";
|
private static final String KEY_CURRENCY_ID = "idCurrency";
|
||||||
private static final String KEY_CURRENCY_SYMBOL = "symbol";
|
private static final String KEY_CURRENCY_SYMBOL = "symbol";
|
||||||
@ -39,6 +40,11 @@ public class DatabaseManager extends SQLiteOpenHelper{
|
|||||||
private static final String KEY_EXCHANGE_PUBLIC_KEY = "publicKey";
|
private static final String KEY_EXCHANGE_PUBLIC_KEY = "publicKey";
|
||||||
private static final String KEY_EXCHANGE_SECRET_KEY = "secretKey";
|
private static final String KEY_EXCHANGE_SECRET_KEY = "secretKey";
|
||||||
|
|
||||||
|
private static final String KEY_WATCHLIST_ID = "idWatchlist";
|
||||||
|
private static final String KEY_WATCHLIST_SYMBOL = "symbol";
|
||||||
|
private static final String KEY_WATCHLIST_NAME = "name";
|
||||||
|
private static final String KEY_WATCHLIST_POSITION = "position";
|
||||||
|
|
||||||
public DatabaseManager(Context context)
|
public DatabaseManager(Context context)
|
||||||
{
|
{
|
||||||
super(context, DATABASE_NAME, null, DATABASE_VERSION);
|
super(context, DATABASE_NAME, null, DATABASE_VERSION);
|
||||||
@ -64,6 +70,13 @@ public class DatabaseManager extends SQLiteOpenHelper{
|
|||||||
+ KEY_EXCHANGE_SECRET_KEY + " TEXT"
|
+ KEY_EXCHANGE_SECRET_KEY + " TEXT"
|
||||||
+ ");");
|
+ ");");
|
||||||
|
|
||||||
|
db.execSQL("CREATE TABLE IF NOT EXISTS " + TABLE_WATCHLIST + "("
|
||||||
|
+ KEY_WATCHLIST_ID + " INTEGER PRIMARY KEY,"
|
||||||
|
+ KEY_WATCHLIST_SYMBOL + " VARCHAR(4),"
|
||||||
|
+ KEY_WATCHLIST_NAME + " TEXT,"
|
||||||
|
+ KEY_WATCHLIST_POSITION + " INTEGER"
|
||||||
|
+ ");");
|
||||||
|
|
||||||
//loadSample(db);
|
//loadSample(db);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -72,10 +85,39 @@ public class DatabaseManager extends SQLiteOpenHelper{
|
|||||||
{
|
{
|
||||||
db.execSQL("DROP TABLE IF EXISTS " + TABLE_MANUAL_CURRENCIES);
|
db.execSQL("DROP TABLE IF EXISTS " + TABLE_MANUAL_CURRENCIES);
|
||||||
db.execSQL("DROP TABLE IF EXISTS " + TABLE_EXCHANGE_KEYS);
|
db.execSQL("DROP TABLE IF EXISTS " + TABLE_EXCHANGE_KEYS);
|
||||||
|
db.execSQL("DROP TABLE IF EXISTS " + TABLE_WATCHLIST);
|
||||||
|
|
||||||
onCreate(db);
|
onCreate(db);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void addCurrencyToWatchlist(Currency currency)
|
||||||
|
{
|
||||||
|
SQLiteDatabase db = this.getWritableDatabase();
|
||||||
|
ContentValues values = new ContentValues();
|
||||||
|
|
||||||
|
values.put(KEY_WATCHLIST_SYMBOL, currency.getSymbol());
|
||||||
|
values.put(KEY_WATCHLIST_NAME, currency.getName());
|
||||||
|
|
||||||
|
db.insert(TABLE_WATCHLIST, null, values);
|
||||||
|
db.close();
|
||||||
|
}
|
||||||
|
|
||||||
|
public List<Currency> getAllCurrenciesFromWatchlist()
|
||||||
|
{
|
||||||
|
String searchQuerry = "SELECT * FROM " + TABLE_WATCHLIST;
|
||||||
|
SQLiteDatabase db = this.getWritableDatabase();
|
||||||
|
Cursor resultatList = db.rawQuery(searchQuerry, null);
|
||||||
|
|
||||||
|
List<Currency> currencyList = new ArrayList<>();
|
||||||
|
|
||||||
|
while(resultatList.moveToNext())
|
||||||
|
{
|
||||||
|
currencyList.add(new Currency(resultatList.getString(2), resultatList.getString(1)));
|
||||||
|
}
|
||||||
|
|
||||||
|
return currencyList;
|
||||||
|
}
|
||||||
|
|
||||||
public void addCurrencyToManualCurrency(String symbol, double balance, Date date, String purchasedPrice)
|
public void addCurrencyToManualCurrency(String symbol, double balance, Date date, String purchasedPrice)
|
||||||
{
|
{
|
||||||
SQLiteDatabase db = this.getWritableDatabase();
|
SQLiteDatabase db = this.getWritableDatabase();
|
||||||
@ -91,7 +133,7 @@ public class DatabaseManager extends SQLiteOpenHelper{
|
|||||||
db.close();
|
db.close();
|
||||||
}
|
}
|
||||||
|
|
||||||
public List<Currency> getAllCurrencyFromManualCurrency()
|
public List<Currency> getAllCurrenciesFromManualCurrency()
|
||||||
{
|
{
|
||||||
String searchQuerry = "SELECT * FROM " + TABLE_MANUAL_CURRENCIES;
|
String searchQuerry = "SELECT * FROM " + TABLE_MANUAL_CURRENCIES;
|
||||||
SQLiteDatabase db = this.getWritableDatabase();
|
SQLiteDatabase db = this.getWritableDatabase();
|
||||||
|
@ -6,7 +6,9 @@ import com.binance.api.client.BinanceApiClientFactory;
|
|||||||
import com.binance.api.client.BinanceApiRestClient;
|
import com.binance.api.client.BinanceApiRestClient;
|
||||||
import com.binance.api.client.domain.account.Account;
|
import com.binance.api.client.domain.account.Account;
|
||||||
import com.binance.api.client.domain.account.AssetBalance;
|
import com.binance.api.client.domain.account.AssetBalance;
|
||||||
|
import com.binance.api.client.domain.account.Order;
|
||||||
import com.binance.api.client.domain.account.Trade;
|
import com.binance.api.client.domain.account.Trade;
|
||||||
|
import com.binance.api.client.domain.account.request.OrderRequest;
|
||||||
import com.binance.api.client.exception.BinanceApiException;
|
import com.binance.api.client.exception.BinanceApiException;
|
||||||
import com.nauk.coinfolio.DataManagers.CurrencyData.Currency;
|
import com.nauk.coinfolio.DataManagers.CurrencyData.Currency;
|
||||||
|
|
||||||
|
@ -0,0 +1,37 @@
|
|||||||
|
package com.nauk.coinfolio.DataManagers;
|
||||||
|
|
||||||
|
import com.android.volley.RequestQueue;
|
||||||
|
import com.android.volley.toolbox.Volley;
|
||||||
|
import com.nauk.coinfolio.DataManagers.CurrencyData.Currency;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Created by Tiji on 13/04/2018.
|
||||||
|
*/
|
||||||
|
|
||||||
|
public class WatchlistManager {
|
||||||
|
|
||||||
|
private android.content.Context context;
|
||||||
|
private RequestQueue requestQueue;
|
||||||
|
private DatabaseManager databaseManager;
|
||||||
|
private List<Currency> watchlistCurrencies;
|
||||||
|
|
||||||
|
public WatchlistManager(android.content.Context context)
|
||||||
|
{
|
||||||
|
this.context = context;
|
||||||
|
|
||||||
|
requestQueue = Volley.newRequestQueue(context);
|
||||||
|
databaseManager = new DatabaseManager(context);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void updateWatchlist()
|
||||||
|
{
|
||||||
|
watchlistCurrencies = databaseManager.getAllCurrenciesFromWatchlist();
|
||||||
|
}
|
||||||
|
|
||||||
|
public List<Currency> getWatchlist()
|
||||||
|
{
|
||||||
|
return watchlistCurrencies;
|
||||||
|
}
|
||||||
|
}
|
47
app/src/main/java/com/nauk/coinfolio/PagerAdapter.java
Normal file
47
app/src/main/java/com/nauk/coinfolio/PagerAdapter.java
Normal file
@ -0,0 +1,47 @@
|
|||||||
|
package com.nauk.coinfolio;
|
||||||
|
|
||||||
|
import android.support.v4.app.Fragment;
|
||||||
|
import android.support.v4.app.FragmentManager;
|
||||||
|
import android.support.v4.app.FragmentStatePagerAdapter;
|
||||||
|
|
||||||
|
import com.nauk.coinfolio.Activities.HomeActivityFragments.MarketCapitalization;
|
||||||
|
import com.nauk.coinfolio.Activities.HomeActivityFragments.Summary;
|
||||||
|
import com.nauk.coinfolio.Activities.HomeActivityFragments.Watchlist;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Created by Tiji on 13/04/2018.
|
||||||
|
*/
|
||||||
|
|
||||||
|
public class PagerAdapter extends FragmentStatePagerAdapter {
|
||||||
|
|
||||||
|
private int numOfTabs;
|
||||||
|
|
||||||
|
public PagerAdapter(FragmentManager fm, int numOfTabs)
|
||||||
|
{
|
||||||
|
super(fm);
|
||||||
|
this.numOfTabs = numOfTabs;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Fragment getItem(int position) {
|
||||||
|
switch (position)
|
||||||
|
{
|
||||||
|
case 0:
|
||||||
|
Watchlist watchlist = new Watchlist();
|
||||||
|
return watchlist;
|
||||||
|
case 1:
|
||||||
|
Summary summary = new Summary();
|
||||||
|
return summary;
|
||||||
|
case 2:
|
||||||
|
MarketCapitalization marketCapitalization = new MarketCapitalization();
|
||||||
|
return marketCapitalization;
|
||||||
|
default:
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public int getCount() {
|
||||||
|
return numOfTabs;
|
||||||
|
}
|
||||||
|
}
|
@ -78,7 +78,20 @@
|
|||||||
</android.support.design.widget.CollapsingToolbarLayout>
|
</android.support.design.widget.CollapsingToolbarLayout>
|
||||||
</android.support.design.widget.AppBarLayout>
|
</android.support.design.widget.AppBarLayout>
|
||||||
|
|
||||||
<include layout="@layout/content_currency_summary"/>
|
<LinearLayout
|
||||||
|
android:id="@+id/masterLayout"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="match_parent"
|
||||||
|
app:layout_behavior="@string/appbar_scrolling_view_behavior"
|
||||||
|
android:layout_marginBottom="56dp"
|
||||||
|
android:background="@color/summary_background">
|
||||||
|
|
||||||
|
<android.support.v4.view.ViewPager
|
||||||
|
android:id="@+id/viewPager"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="match_parent"/>
|
||||||
|
|
||||||
|
</LinearLayout>
|
||||||
|
|
||||||
<android.support.design.widget.BottomNavigationView
|
<android.support.design.widget.BottomNavigationView
|
||||||
android:id="@+id/navigationSummary"
|
android:id="@+id/navigationSummary"
|
||||||
|
61
app/src/main/res/layout/fragment_marketcap_homeactivity.xml
Normal file
61
app/src/main/res/layout/fragment_marketcap_homeactivity.xml
Normal file
@ -0,0 +1,61 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<android.support.v4.widget.SwipeRefreshLayout xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
|
xmlns:app="http://schemas.android.com/apk/res-auto"
|
||||||
|
android:id="@+id/swiperefresh"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="match_parent"
|
||||||
|
app:layout_behavior="@string/appbar_scrolling_view_behavior"
|
||||||
|
android:layout_marginBottom="56dp"
|
||||||
|
android:background="@color/summary_background">
|
||||||
|
<LinearLayout android:id="@+id/layoutMarketCap"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="match_parent"
|
||||||
|
android:orientation="vertical"
|
||||||
|
xmlns:android="http://schemas.android.com/apk/res/android">
|
||||||
|
|
||||||
|
<ProgressBar
|
||||||
|
android:id="@+id/progressBarMarketCap"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
style="?android:attr/progressBarStyleLarge"
|
||||||
|
android:layout_gravity="center"
|
||||||
|
android:background="@drawable/circular_progress_bar" />
|
||||||
|
|
||||||
|
<LinearLayout
|
||||||
|
android:id="@+id/layoutProgressMarketCap"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="match_parent"
|
||||||
|
android:visibility="gone"
|
||||||
|
android:orientation="vertical">
|
||||||
|
|
||||||
|
<TextView
|
||||||
|
android:id="@+id/marketCapTextView"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:layout_marginLeft="10dp"
|
||||||
|
android:layout_marginTop="10dp"
|
||||||
|
android:layout_marginRight="10dp"
|
||||||
|
android:layout_marginBottom="5dp"
|
||||||
|
android:textSize="20dp"
|
||||||
|
android:gravity="center_horizontal"/>
|
||||||
|
|
||||||
|
<TextView
|
||||||
|
android:id="@+id/dayVolumeTotalMarketCap"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:layout_marginLeft="10dp"
|
||||||
|
android:layout_marginTop="5dp"
|
||||||
|
android:layout_marginRight="10dp"
|
||||||
|
android:layout_marginBottom="10dp"
|
||||||
|
android:textSize="18dp"
|
||||||
|
android:gravity="center_horizontal"/>
|
||||||
|
|
||||||
|
<com.github.mikephil.charting.charts.PieChart
|
||||||
|
android:id="@+id/marketCapPieChart"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="350dp"/>
|
||||||
|
|
||||||
|
</LinearLayout>
|
||||||
|
|
||||||
|
</LinearLayout>
|
||||||
|
</android.support.v4.widget.SwipeRefreshLayout>
|
49
app/src/main/res/layout/fragment_summary_homeactivity.xml
Normal file
49
app/src/main/res/layout/fragment_summary_homeactivity.xml
Normal file
@ -0,0 +1,49 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<android.support.v4.widget.SwipeRefreshLayout xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
|
xmlns:tools="http://schemas.android.com/tools"
|
||||||
|
xmlns:app="http://schemas.android.com/apk/res-auto"
|
||||||
|
android:id="@+id/swiperefresh"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="match_parent"
|
||||||
|
app:layout_behavior="@string/appbar_scrolling_view_behavior"
|
||||||
|
android:layout_marginBottom="56dp"
|
||||||
|
android:background="@color/summary_background">
|
||||||
|
|
||||||
|
<android.support.v4.widget.NestedScrollView
|
||||||
|
android:id="@+id/nestedScrollViewLayout"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="match_parent"
|
||||||
|
tools:context="com.nauk.coinfolio.Activities.HomeActivity">
|
||||||
|
<LinearLayout
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:orientation="vertical"
|
||||||
|
android:layout_marginTop="10dp">
|
||||||
|
|
||||||
|
<LinearLayout
|
||||||
|
android:id="@+id/currencyListLayout"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:orientation="vertical" />
|
||||||
|
|
||||||
|
<Button
|
||||||
|
android:id="@+id/buttonAddTransaction"
|
||||||
|
android:text="Add transaction"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:background="@drawable/button_dashed_background"
|
||||||
|
android:layout_marginLeft="10dp"
|
||||||
|
android:layout_marginRight="10dp"
|
||||||
|
android:layout_marginBottom="10dp"
|
||||||
|
android:textColor="@color/separationColor"
|
||||||
|
style="@style/Widget.AppCompat.Button.Borderless"/>
|
||||||
|
|
||||||
|
<Space
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="10dp" />
|
||||||
|
|
||||||
|
</LinearLayout>
|
||||||
|
|
||||||
|
</android.support.v4.widget.NestedScrollView>
|
||||||
|
|
||||||
|
</android.support.v4.widget.SwipeRefreshLayout>
|
56
app/src/main/res/layout/fragment_watchlist_homeactivity.xml
Normal file
56
app/src/main/res/layout/fragment_watchlist_homeactivity.xml
Normal file
@ -0,0 +1,56 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<android.support.v4.widget.SwipeRefreshLayout xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
|
xmlns:app="http://schemas.android.com/apk/res-auto"
|
||||||
|
android:id="@+id/swiperefresh"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="match_parent"
|
||||||
|
app:layout_behavior="@string/appbar_scrolling_view_behavior"
|
||||||
|
android:layout_marginBottom="56dp"
|
||||||
|
android:background="@color/summary_background">
|
||||||
|
|
||||||
|
<LinearLayout
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="match_parent"
|
||||||
|
android:orientation="vertical">
|
||||||
|
|
||||||
|
<ScrollView
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="wrap_content">
|
||||||
|
|
||||||
|
<LinearLayout android:id="@+id/linearLayoutWatchlist"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:orientation="vertical"
|
||||||
|
xmlns:android="http://schemas.android.com/apk/res/android">
|
||||||
|
|
||||||
|
<ProgressBar
|
||||||
|
android:id="@+id/progressBarWatchlist"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
style="?android:attr/progressBarStyleLarge"
|
||||||
|
android:layout_gravity="center"
|
||||||
|
android:background="@drawable/circular_progress_bar"
|
||||||
|
android:visibility="gone"/>
|
||||||
|
|
||||||
|
</LinearLayout>
|
||||||
|
|
||||||
|
</ScrollView>
|
||||||
|
|
||||||
|
<Button
|
||||||
|
android:id="@+id/buttonAddWatchlist"
|
||||||
|
android:text="Add to watchlist"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:background="@drawable/button_dashed_background"
|
||||||
|
android:layout_marginLeft="10dp"
|
||||||
|
android:layout_marginRight="10dp"
|
||||||
|
android:layout_marginBottom="10dp"
|
||||||
|
android:textColor="@color/separationColor"
|
||||||
|
style="@style/Widget.AppCompat.Button.Borderless"/>
|
||||||
|
|
||||||
|
<Space
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="10dp" />
|
||||||
|
|
||||||
|
</LinearLayout>
|
||||||
|
</android.support.v4.widget.SwipeRefreshLayout>
|
Loading…
Reference in New Issue
Block a user