diff --git a/app/build.gradle b/app/build.gradle index 600be05..2d447f7 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -6,8 +6,8 @@ android { applicationId "javinator9889.bitcoinpools" minSdkVersion 21 targetSdkVersion 27 - versionCode 9 - versionName "1.14" + versionCode 14 + versionName "1.15" testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner" } diff --git a/app/release/BitCoinPools-1.15.apk b/app/release/BitCoinPools-1.15.apk new file mode 100644 index 0000000..4a2a7c7 Binary files /dev/null and b/app/release/BitCoinPools-1.15.apk differ diff --git a/app/release/output.json b/app/release/output.json index e17f579..cda5710 100644 --- a/app/release/output.json +++ b/app/release/output.json @@ -1 +1 @@ -[{"outputType":{"type":"APK"},"apkInfo":{"type":"MAIN","splits":[],"versionCode":6},"path":"app-release.apk","properties":{"packageId":"javinator9889.bitcoinpools","split":"","minSdkVersion":"21"}}] \ No newline at end of file +[{"outputType":{"type":"APK"},"apkInfo":{"type":"MAIN","splits":[],"versionCode":14},"path":"app-release.apk","properties":{"packageId":"javinator9889.bitcoinpools","split":"","minSdkVersion":"21"}}] \ No newline at end of file diff --git a/app/src/main/java/javinator9889/bitcoinpools/BitCoinApp.java b/app/src/main/java/javinator9889/bitcoinpools/BitCoinApp.java index 72d4249..357096d 100644 --- a/app/src/main/java/javinator9889/bitcoinpools/BitCoinApp.java +++ b/app/src/main/java/javinator9889/bitcoinpools/BitCoinApp.java @@ -10,7 +10,6 @@ import android.content.pm.PackageInfo; import android.content.pm.PackageManager; import android.net.ConnectivityManager; -import android.net.Network; import android.net.NetworkInfo; import android.util.Log; diff --git a/app/src/main/java/javinator9889/bitcoinpools/FragmentViews/CardsAdapter.java b/app/src/main/java/javinator9889/bitcoinpools/FragmentViews/CardsAdapter.java index 076b6d9..73d6810 100644 --- a/app/src/main/java/javinator9889/bitcoinpools/FragmentViews/CardsAdapter.java +++ b/app/src/main/java/javinator9889/bitcoinpools/FragmentViews/CardsAdapter.java @@ -1,5 +1,6 @@ package javinator9889.bitcoinpools.FragmentViews; +import android.annotation.SuppressLint; import android.content.Context; import android.support.v7.widget.RecyclerView; import android.view.LayoutInflater; @@ -7,12 +8,15 @@ import android.view.ViewGroup; import android.widget.TextView; +import com.afollestad.materialdialogs.MaterialDialog; + import java.util.List; import javinator9889.bitcoinpools.R; /** * Created by Javinator9889 on 31/01/2018. + * Based on: https://www.androidhive.info/2016/05/android-working-with-card-view-and-recycler-view/ */ public class CardsAdapter extends RecyclerView.Adapter { @@ -20,16 +24,18 @@ public class CardsAdapter extends RecyclerView.Adapter btcData; public class MyViewHolder extends RecyclerView.ViewHolder { - public TextView title, body; + TextView title, body; + View v; - public MyViewHolder(View view) { + MyViewHolder(View view) { super(view); - title = (TextView) view.findViewById(R.id.title_text); - body = (TextView) view.findViewById(R.id.body_text); + title = view.findViewById(R.id.title_text); + body = view.findViewById(R.id.body_text); + this.v = view; } } - public CardsAdapter(Context context, List btcData) { + CardsAdapter(Context context, List btcData) { this.context = context; this.btcData = btcData; } @@ -41,10 +47,84 @@ public MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { } @Override - public void onBindViewHolder(final MyViewHolder holder, int position) { - CardsContent content = btcData.get(position); + public void onBindViewHolder(final MyViewHolder holder, @SuppressLint("RecyclerView") final int position) { + final CardsContent content = btcData.get(position); holder.title.setText(content.getTitle()); holder.body.setText(content.getBody()); + holder.v.setOnLongClickListener(new View.OnLongClickListener() { + @Override + public boolean onLongClick(View v) { + switch (position) { + case 0: + new MaterialDialog.Builder(context) + .title(context.getString(R.string.market_price)) + .content(R.string.market_price_desc, true) + .cancelable(true) + .positiveText(R.string.accept) + .build().show(); + break; + case 1: + new MaterialDialog.Builder(context) + .title(context.getString(R.string.hash_rate)) + .content(R.string.hash_rate_desc, true) + .cancelable(true) + .positiveText(R.string.accept) + .build().show(); + break; + case 2: + new MaterialDialog.Builder(context) + .title(context.getString(R.string.difficulty)) + .content(R.string.difficulty_desc, true) + .cancelable(true) + .positiveText(R.string.accept) + .build().show(); + break; + case 3: + new MaterialDialog.Builder(context) + .title(context.getString(R.string.min_blocks)) + .content(R.string.min_blocks_desc, true) + .cancelable(true) + .positiveText(R.string.accept) + .build().show(); + break; + case 4: + new MaterialDialog.Builder(context) + .title(context.getString(R.string.minutes_blocks)) + .content(R.string.minutes_blocks_desc, true) + .cancelable(true) + .positiveText(R.string.accept) + .build().show(); + break; + case 5: + new MaterialDialog.Builder(context) + .title(context.getString(R.string.total_fees)) + .content(R.string.total_fees_desc, true) + .cancelable(true) + .positiveText(R.string.accept) + .build().show(); + break; + case 6: + new MaterialDialog.Builder(context) + .title(context.getString(R.string.total_trans)) + .content(R.string.total_trans_desc, true) + .cancelable(true) + .positiveText(R.string.accept) + .build().show(); + break; + case 7: + new MaterialDialog.Builder(context) + .title(context.getString(R.string.min_benefit)) + .content(R.string.min_benefit_desc, true) + .cancelable(true) + .positiveText(R.string.accept) + .build().show(); + break; + default: + break; + } + return false; + } + }); } @Override diff --git a/app/src/main/java/javinator9889/bitcoinpools/FragmentViews/CardsContent.java b/app/src/main/java/javinator9889/bitcoinpools/FragmentViews/CardsContent.java index 6cdbfe4..5e89410 100644 --- a/app/src/main/java/javinator9889/bitcoinpools/FragmentViews/CardsContent.java +++ b/app/src/main/java/javinator9889/bitcoinpools/FragmentViews/CardsContent.java @@ -2,6 +2,7 @@ /** * Created by Javinator9889 on 31/01/2018. + * Simple class containing cards information */ public class CardsContent { diff --git a/app/src/main/java/javinator9889/bitcoinpools/FragmentViews/CustomMarkerView.java b/app/src/main/java/javinator9889/bitcoinpools/FragmentViews/CustomMarkerView.java index 1607513..4c493a1 100644 --- a/app/src/main/java/javinator9889/bitcoinpools/FragmentViews/CustomMarkerView.java +++ b/app/src/main/java/javinator9889/bitcoinpools/FragmentViews/CustomMarkerView.java @@ -24,24 +24,19 @@ public class CustomMarkerView extends MarkerView { public CustomMarkerView(Context context, int layoutResource) { super(context, layoutResource); - tvContent = (TextView) findViewById(R.id.tvContent); + tvContent = findViewById(R.id.tvContent); } // callbacks everytime the MarkerView is redrawn, can be used to update the // content (user-interface) @Override public void refreshContent(Entry e, Highlight highlight) { - if (e instanceof CandleEntry) { - CandleEntry ce = (CandleEntry) e; - tvContent.setText("" + Utils.formatNumber(ce.getHigh(), 0, true)); } else { - tvContent.setText("" + Utils.formatNumber(e.getY(), 0, true)); } - super.refreshContent(e, highlight); } diff --git a/app/src/main/java/javinator9889/bitcoinpools/FragmentViews/DatePickerFragment.java b/app/src/main/java/javinator9889/bitcoinpools/FragmentViews/DatePickerFragment.java deleted file mode 100644 index 5fdd3f1..0000000 --- a/app/src/main/java/javinator9889/bitcoinpools/FragmentViews/DatePickerFragment.java +++ /dev/null @@ -1,66 +0,0 @@ -package javinator9889.bitcoinpools.FragmentViews; - -import android.app.DatePickerDialog; -import android.app.Dialog; -import android.support.annotation.NonNull; -import android.support.v4.app.DialogFragment; -import android.os.Bundle; -import android.widget.DatePicker; -import android.widget.Toast; - -import java.util.Calendar; - -/** - * Created by Javinator9889 on 29/01/2018. - * Based on: https://android--code.blogspot.com.es/2015/08/android-datepickerdialog-set-max-date.html - */ - -public class DatePickerFragment extends DialogFragment implements DatePickerDialog.OnDateSetListener { - private int year; - private int month; - private int day; - private boolean date_set = false; - - public DatePickerFragment() { - super(); - } - - @NonNull - @Override - public Dialog onCreateDialog(Bundle savedInstanceState) { - final Calendar calendar = Calendar.getInstance(); - final Calendar limitDate = Calendar.getInstance(); - limitDate.set(2010, 7, 17); - - if (!this.date_set) { - this.year = calendar.get(Calendar.YEAR); - this.month = calendar.get(Calendar.MONTH); - this.day = calendar.get(Calendar.DAY_OF_MONTH); - this.date_set = true; - } - - DatePickerDialog dialog = new DatePickerDialog(getActivity(), this, this.year, this.month, this.day); - calendar.add(Calendar.DATE, 3); - - dialog.getDatePicker().setMaxDate(calendar.getTimeInMillis()); - dialog.getDatePicker().setMinDate(limitDate.getTimeInMillis()); - - return dialog; - } - - public void onDateSet(DatePicker view, int year, int month, int day) { - Toast.makeText(view.getContext(), "Day/Month/Year: " + day + "/" + month + "/" + year, Toast.LENGTH_LONG).show(); - this.day = day; - this.month = month; - this.year = year; - this.date_set = true; - //Tab2BTCChart.forceReload(); - } - - public String getDateFormatted() { - if (this.date_set) - return this.year + "-" + this.month + "-" + this.day; - else - return null; - } -} diff --git a/app/src/main/java/javinator9889/bitcoinpools/FragmentViews/Tab1PoolsChart.java b/app/src/main/java/javinator9889/bitcoinpools/FragmentViews/Tab1PoolsChart.java index 733336e..e0cf482 100644 --- a/app/src/main/java/javinator9889/bitcoinpools/FragmentViews/Tab1PoolsChart.java +++ b/app/src/main/java/javinator9889/bitcoinpools/FragmentViews/Tab1PoolsChart.java @@ -80,14 +80,6 @@ public View onCreateView(@NonNull LayoutInflater inflater, ViewGroup container, } } - /*@Override - public void setUserVisibleHint(boolean isVisibleToUser) { - super.setUserVisibleHint(isVisibleToUser); - if (isVisibleToUser) { - MainActivity.MAINACTIVITY_TOOLBAR.setTitle(getString(R.string.BTCP) + MARKET_PRICE_USD); - } - }*/ - @Override public void setUserVisibleHint(boolean isVisibleToUser) { super.setUserVisibleHint(isVisibleToUser); @@ -217,7 +209,7 @@ public void run() { } private void initT(View view) { - TableRow masterRow = (TableRow) view.findViewById(R.id.masterRow); + TableRow masterRow = view.findViewById(R.id.masterRow); TABLE_PARAMS = masterRow.getLayoutParams(); } diff --git a/app/src/main/java/javinator9889/bitcoinpools/FragmentViews/Tab2BTCChart.java b/app/src/main/java/javinator9889/bitcoinpools/FragmentViews/Tab2BTCChart.java index e253a1b..7ab2d91 100644 --- a/app/src/main/java/javinator9889/bitcoinpools/FragmentViews/Tab2BTCChart.java +++ b/app/src/main/java/javinator9889/bitcoinpools/FragmentViews/Tab2BTCChart.java @@ -1,22 +1,17 @@ package javinator9889.bitcoinpools.FragmentViews; import android.annotation.SuppressLint; -import android.app.Activity; import android.app.DatePickerDialog; import android.app.Dialog; +import android.content.Context; import android.content.res.Resources; import android.content.res.TypedArray; -import android.graphics.Rect; -import android.support.annotation.Nullable; -import android.support.constraint.ConstraintLayout; -import android.support.design.widget.AppBarLayout; -import android.support.v4.app.DialogFragment; -import android.content.Context; import android.graphics.Color; import android.graphics.DashPathEffect; import android.os.Bundle; import android.os.Handler; import android.support.annotation.NonNull; +import android.support.constraint.ConstraintLayout; import android.support.v4.app.Fragment; import android.support.v4.content.ContextCompat; import android.support.v7.widget.DefaultItemAnimator; @@ -25,30 +20,24 @@ import android.util.DisplayMetrics; import android.util.Log; import android.util.TypedValue; -import android.view.Display; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; -import android.view.WindowManager; import android.widget.Button; import android.widget.DatePicker; -import android.widget.Toast; +import android.widget.TextView; import com.github.mikephil.charting.charts.LineChart; import com.github.mikephil.charting.data.Entry; import com.github.mikephil.charting.data.LineData; import com.github.mikephil.charting.data.LineDataSet; -import com.github.mikephil.charting.formatter.IAxisValueFormatter; import com.github.mikephil.charting.formatter.LargeValueFormatter; import com.github.mikephil.charting.interfaces.datasets.ILineDataSet; -import com.github.mikephil.charting.utils.ViewPortHandler; import org.json.JSONException; -import java.text.DateFormat; import java.text.DecimalFormat; import java.text.DecimalFormatSymbols; -import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.Calendar; @@ -59,7 +48,6 @@ import java.util.Map; import java.util.concurrent.ExecutionException; -import javinator9889.bitcoinpools.BitCoinApp; import javinator9889.bitcoinpools.Constants; import javinator9889.bitcoinpools.JSONTools.JSONTools; import javinator9889.bitcoinpools.MainActivity; @@ -73,23 +61,18 @@ public class Tab2BTCChart extends Fragment implements DatePickerDialog.OnDateSetListener { private static Map BTCPRICE = new LinkedHashMap<>(); - private static final String API_URL = "https://api.coindesk.com/v1/bpi/historical/close.json"; //?start=2011-09-01&end=2018-01-01"; + private static final String API_URL = "https://api.coindesk.com/v1/bpi/historical/close.json"; private static String REQUEST_URL; private static LineChart DESTINATIONLINECHART; - private static final String LIMIT_DATE = "2010/07/17"; private static final String STATS_URL = "https://api.blockchain.info/stats"; @SuppressLint("StaticFieldLeak") private static Context FRAGMENT_CONTEXT; private static boolean lineChartCreated = false; - //private final DatePickerFragment dialogFragment = new DatePickerFragment(); - //https://api.blockchain.info/stats private int year; private int month; private int day; + private int writable_month; private boolean date_set = false; - private static int FINALDP; - private RecyclerView recyclerView; - private CardsAdapter adapter; private List cardsContents; public Tab2BTCChart() { @@ -97,33 +80,35 @@ public Tab2BTCChart() { @SuppressLint("SimpleDateFormat") @Override - public View onCreateView(@NonNull LayoutInflater inflater, ViewGroup container, - Bundle savedInstanceState) { - System.out.println("Inflating view"); + public View onCreateView(@NonNull LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { DisplayMetrics dp = this.getResources().getDisplayMetrics(); float dpHeight = dp.heightPixels; + View createdView = inflater.inflate(R.layout.bitcoindata, container, false); ((Button) createdView.findViewById(R.id.datebutton)).setText(R.string.latest30days); - ((Button) createdView.findViewById(R.id.datebutton)) + createdView.findViewById(R.id.datebutton) .setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { createDialog().show(); } }); + REQUEST_URL = API_URL; - System.out.println("Request URL: " + REQUEST_URL); - System.out.println("Setting up values..."); + setupValues(); + cardsContents = new ArrayList<>(); - adapter = new CardsAdapter(createdView.getContext(), cardsContents); - DESTINATIONLINECHART = (LineChart) createdView.findViewById(R.id.lineChart); - recyclerView = (RecyclerView) createdView.findViewById(R.id.recycler_view); + CardsAdapter adapter = new CardsAdapter(getContext(), cardsContents); + DESTINATIONLINECHART = createdView.findViewById(R.id.lineChart); + RecyclerView recyclerView = createdView.findViewById(R.id.recycler_view); + RecyclerView.LayoutManager layoutManager = new GridLayoutManager(createdView.getContext(), 1); recyclerView.setLayoutManager(layoutManager); recyclerView.addItemDecoration(new GridSpacingItemDecoration(2, dpToPx(10), true)); recyclerView.setItemAnimator(new DefaultItemAnimator()); recyclerView.setAdapter(adapter); + recyclerView.setNestedScrollingEnabled(false); prepareCards(); @@ -131,25 +116,20 @@ public void onClick(View v) { TypedArray a = createdView.getContext().obtainStyledAttributes(attrs); int size = a.getDimensionPixelSize(0, 0); a.recycle(); - System.out.println(size); - System.out.println("Screen height: " + dpHeight + " | AppBar height: " + size + " | Screen - AppBar: " + (dpHeight - size)); - FINALDP = (int) ((dpHeight - size)*0.7); + int FINALDP = (int) ((dpHeight - size) * 0.7); + ConstraintLayout.LayoutParams lp = (ConstraintLayout.LayoutParams) DESTINATIONLINECHART.getLayoutParams(); lp.height = FINALDP; + lp.matchConstraintMaxHeight = (int) dpHeight; DESTINATIONLINECHART.setLayoutParams(lp); DESTINATIONLINECHART.invalidate(); + FRAGMENT_CONTEXT = createdView.getContext(); + ((TextView) createdView.findViewById(R.id.longPressInfo)).setText(R.string.longclick); + return createdView; } - /*@Override - public void onActivityCreated(@Nullable Bundle savedInstanceState) { - super.onActivityCreated(savedInstanceState); - if (isAdded() && isVisible()) { - MainActivity.MAINACTIVITY_TOOLBAR.setTitle(getString(R.string.btcinfo)); - } - }*/ - private void setupValues() { net httpsResponse = new net(); httpsResponse.execute(REQUEST_URL); @@ -186,7 +166,6 @@ public void run() { CustomMarkerView mv = new CustomMarkerView(fragmentContext, R.layout.marker_view); mv.setChartView(destinationChart); destinationChart.setMarker(mv); - //MarkerView mv = new MarkerView(this, R.layout.) ArrayList values = new ArrayList<>(); int i = 0; for (Date o : BTCPRICE.keySet()) { @@ -222,13 +201,8 @@ public void run() { LineData data = new LineData(dataSets); destinationChart.setData(data); } - /*String[] svalues = new String[]{"2011", "2012", "2013", "2014", "2015", "2016", "2017", "2018"}; - YAxis left = destinationChart.getAxisLeft(); - left.setValueFormatter(new MyXAxisValueFormatter(svalues)); - left.setGranularity(1f);*/ destinationChart.getAxisLeft().setValueFormatter(new LargeValueFormatter()); destinationChart.animateX(2500); - //destinationChart.getData().setHighlightEnabled(true); destinationChart.invalidate(); lineChartCreated = true; } @@ -237,10 +211,28 @@ public void run() { @Override public void onDateSet(DatePicker view, int year, int month, int dayOfMonth) { - //Toast.makeText(view.getContext(), "Day/Month/Year: " + dayOfMonth + "/" + month + "/" + year, Toast.LENGTH_LONG).show(); - this.day = dayOfMonth; - this.month = ++month; - this.year = year; + if (year <= 2010) { + this.year = 2010; + if ((month <= 6) && (dayOfMonth < 17)) { + this.month = 6; + this.writable_month = 7; + this.day = 17; + } else if ((month < 6) && (dayOfMonth > 17)) { + this.month = 6; + this.writable_month = 7; + this.day = 17; + } else { + this.day = dayOfMonth; + this.month = month; + this.writable_month = ++month; + this.year = year; + } + } else { + this.day = dayOfMonth; + this.month = month; + this.writable_month = ++month; + this.year = year; + } this.date_set = true; String buttonText = getString(R.string.since) + " " + parseDate(); ((Button) getActivity().findViewById(R.id.datebutton)).setText(buttonText); @@ -249,10 +241,10 @@ public void onDateSet(DatePicker view, int year, int month, int dayOfMonth) { private String parseDate() { String dateParsed = this.year + "-"; - if (this.month <= 9) - dateParsed += "0" + this.month + "-"; + if (this.writable_month <= 9) + dateParsed += "0" + this.writable_month + "-"; else - dateParsed += this.month + "-"; + dateParsed += this.writable_month + "-"; if (this.day <= 9) dateParsed += "0" + this.day; else @@ -264,7 +256,7 @@ private String parseDate() { public Dialog createDialog() { final Calendar calendar = Calendar.getInstance(); final Calendar limitDate = Calendar.getInstance(); - limitDate.set(2010, 7, 17); + limitDate.set(2010, 6, 17); if (!this.date_set) { this.year = calendar.get(Calendar.YEAR); @@ -272,6 +264,7 @@ public Dialog createDialog() { this.day = calendar.get(Calendar.DAY_OF_MONTH); this.date_set = true; } + System.out.println(this.year + " " + this.month + " " + this.day); DatePickerDialog dialog = new DatePickerDialog(getActivity(), this, this.year, this.month, this.day); @@ -285,8 +278,6 @@ public Dialog createDialog() { @SuppressLint("SimpleDateFormat") public void forceReload() { - //String currentDate; - //currentDate = actualDate.format(Calendar.getInstance().getTime()); String dateParsed = parseDate(); REQUEST_URL = API_URL + "?start=" + dateParsed + "&end=" + new SimpleDateFormat("yyyy-MM-dd").format(Calendar.getInstance().getTime()); System.out.println(REQUEST_URL); @@ -309,29 +300,6 @@ public GridSpacingItemDecoration(int spanCount, int spacing, boolean includeEdge this.spacing = spacing; this.includeEdge = includeEdge; } - - /*@Override - public void getItemOffsets(Rect outRect, View view, RecyclerView parent, RecyclerView.State state) { - /*int position = parent.getChildAdapterPosition(view); // item position - int column = position % spanCount; // item column - - if (includeEdge) { - outRect.left = spacing - column * spacing / spanCount; // spacing - column * ((1f / spanCount) * spacing) - outRect.right = (column + 1) * spacing / spanCount; // (column + 1) * ((1f / spanCount) * spacing) - - if (position < spanCount) { // top edge - outRect.top = spacing; - } - outRect.bottom = spacing; // item bottom - } else { - outRect.left = column * spacing / spanCount; // column * ((1f / spanCount) * spacing) - outRect.right = spacing - (column + 1) * spacing / spanCount; // spacing - (column + 1) * ((1f / spanCount) * spacing) - if (position >= spanCount) { - outRect.top = spacing; // item top - } - }*/ - /*super.getItemOffsets(outRect, view, parent, state); - }*/ } /** @@ -355,14 +323,22 @@ private void prepareCards() { } finally { assert cardsData != null; DecimalFormat df = new DecimalFormat("#.##", new DecimalFormatSymbols(Locale.US)); - cardsContents.add(new CardsContent("Market price", "$" + df.format(cardsData.get("market_price_usd")))); - cardsContents.add(new CardsContent("Hash rate", df.format(cardsData.get("hash_rate")) + " GH/s")); - cardsContents.add(new CardsContent("Difficulty", df.format(cardsData.get("difficulty")))); - cardsContents.add(new CardsContent("Mined blocks", df.format(cardsData.get("n_blocks_mined")) + " blocks")); - cardsContents.add(new CardsContent("Minutes between blocks", df.format(cardsData.get("minutes_between_blocks")) + " minutes")); - cardsContents.add(new CardsContent("Total fees BTC", df.format(cardsData.get("total_fees_btc")) + " BTC")); - cardsContents.add(new CardsContent("Total transactions", df.format(cardsData.get("n_tx")))); - cardsContents.add(new CardsContent("Miners benefit", "$" + df.format(cardsData.get("miners_revenue_usd")))); + cardsContents.add(new CardsContent(getString(R.string.market_price), + "$" + df.format(cardsData.get("market_price_usd")))); + cardsContents.add(new CardsContent(getString(R.string.hash_rate), + df.format(cardsData.get("hash_rate")) + " GH/s")); + cardsContents.add(new CardsContent(getString(R.string.difficulty), + df.format(cardsData.get("difficulty")))); + cardsContents.add(new CardsContent(getString(R.string.min_blocks), + df.format(cardsData.get("n_blocks_mined")) + " " + getString(R.string.blocks_name))); + cardsContents.add(new CardsContent(getString(R.string.minutes_blocks), + df.format(cardsData.get("minutes_between_blocks")) + " " + getString(R.string.minutes_name))); + cardsContents.add(new CardsContent(getString(R.string.total_fees), + df.format(cardsData.get("total_fees_btc")) + " BTC")); + cardsContents.add(new CardsContent(getString(R.string.total_trans), + df.format(cardsData.get("n_tx")))); + cardsContents.add(new CardsContent(getString(R.string.min_benefit), + "$" + df.format(cardsData.get("miners_revenue_usd")))); } } } diff --git a/app/src/main/java/javinator9889/bitcoinpools/JSONTools/JSONTools.java b/app/src/main/java/javinator9889/bitcoinpools/JSONTools/JSONTools.java index 71ff7ec..3943553 100644 --- a/app/src/main/java/javinator9889/bitcoinpools/JSONTools/JSONTools.java +++ b/app/src/main/java/javinator9889/bitcoinpools/JSONTools/JSONTools.java @@ -5,7 +5,6 @@ import org.json.JSONException; import org.json.JSONObject; -import java.text.DateFormat; import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.Collections; @@ -76,27 +75,10 @@ public static HashMap convert2DateHashMap(JSONObject object) { public static Map sortDateByValue(Map unsortMap) { - /*// 1. Convert Map to List of Map - List> list = - new LinkedList<>(unsortMap.entrySet()); - - Collections.sort(list, new Comparator>() { - public int compare(Map.Entry o1, Map.Entry o2) { - return (o1.getValue()).compareTo(o2.getValue()); - } - }); - - // 3. Loop the sorted list and put it into a new insertion order Map LinkedHashMap - Map sortedMap = new LinkedHashMap<>(); - for (Map.Entry entry : list) { - sortedMap.put(entry.getKey(), entry.getValue()); - } - return sortedMap;*/ - DateFormat df = new SimpleDateFormat("dd-MM-yyyy"); +// DateFormat df = new SimpleDateFormat("dd-MM-yyyy", Locale.US); Map m1 = new TreeMap<>(unsortMap); Map returnMap = new LinkedHashMap<>(); for (Map.Entry entry : m1.entrySet()) { - //System.out.println(df.format(entry.getKey())); returnMap.put(entry.getKey(), entry.getValue()); } return returnMap; diff --git a/app/src/main/java/javinator9889/bitcoinpools/License.java b/app/src/main/java/javinator9889/bitcoinpools/License.java index 4fbf2a1..36a3a06 100644 --- a/app/src/main/java/javinator9889/bitcoinpools/License.java +++ b/app/src/main/java/javinator9889/bitcoinpools/License.java @@ -39,6 +39,10 @@ protected void onCreate(Bundle savedInstanceState) { .withAutoDetect(true) .withAboutDescription(getString(R.string.bitcoindesc)) .withLicenseDialog(true) + .withLibraries("ACRA") + .withLibraryModification("ACRA", Libs.LibraryFields.LIBRARY_DESCRIPTION, getString(R.string.library_acra_libraryDescription)) + .withLibraryModification("ACRA", Libs.LibraryFields.LIBRARY_REPOSITORY_LINK, "https://github.com/ACRA/acra") + .withLibraryModification("ACRA", Libs.LibraryFields.LICENSE_NAME, "Apache Version 2.0") .supportFragment(); FragmentManager fragmentManager = getSupportFragmentManager(); diff --git a/app/src/main/java/javinator9889/bitcoinpools/MainActivity.java b/app/src/main/java/javinator9889/bitcoinpools/MainActivity.java index f16046f..f2179da 100644 --- a/app/src/main/java/javinator9889/bitcoinpools/MainActivity.java +++ b/app/src/main/java/javinator9889/bitcoinpools/MainActivity.java @@ -5,12 +5,9 @@ import android.content.Intent; import android.content.SharedPreferences; import android.content.pm.PackageManager; -import android.graphics.Typeface; import android.os.Build; import android.os.Bundle; import android.support.annotation.NonNull; -import android.support.annotation.Nullable; -import android.support.design.widget.AppBarLayout; import android.support.design.widget.TabLayout; import android.support.v4.app.ActivityCompat; import android.support.v4.app.Fragment; @@ -18,59 +15,25 @@ import android.support.v4.app.FragmentPagerAdapter; import android.support.v4.view.ViewPager; import android.support.v7.app.AppCompatActivity; +import android.support.v7.widget.Toolbar; import android.util.Log; import android.view.View; -import android.view.ViewGroup; -import android.view.ViewTreeObserver; -import android.widget.TableLayout; -import android.widget.TableRow; -import android.widget.TextView; import android.widget.Toast; -import android.support.v7.widget.Toolbar; import com.afollestad.materialdialogs.DialogAction; import com.afollestad.materialdialogs.MaterialDialog; import com.getbase.floatingactionbutton.FloatingActionButton; import com.getbase.floatingactionbutton.FloatingActionsMenu; -import com.github.mikephil.charting.charts.PieChart; -import com.github.mikephil.charting.components.Description; -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.utils.ColorTemplate; - -import org.json.JSONException; import java.math.BigDecimal; -import java.text.DateFormat; -import java.text.ParseException; -import java.text.SimpleDateFormat; -import java.util.ArrayList; -import java.util.Date; -import java.util.Iterator; -import java.util.LinkedHashMap; -import java.util.List; -import java.util.Map; -import java.util.concurrent.ExecutionException; import javinator9889.bitcoinpools.AppUpdaterManager.CheckUpdates; import javinator9889.bitcoinpools.FragmentViews.Tab1PoolsChart; import javinator9889.bitcoinpools.FragmentViews.Tab2BTCChart; -import javinator9889.bitcoinpools.JSONTools.JSONTools; -import javinator9889.bitcoinpools.NetTools.net; public class MainActivity extends AppCompatActivity implements View.OnClickListener { - public static int APPBAR_HEIGHT = 0; - private static Map RETRIEVED_DATA = new LinkedHashMap<>(); - private static float MARKET_PRICE_USD; - private static ViewGroup.LayoutParams TABLE_PARAMS; - private Thread rdThread; - private Thread mpuThread; - private Toolbar toolbar; - private TabLayout tabLayout; - private ViewPager viewPager; - private SectionsPagerAdapter mSectionsPagerAdapter; + @SuppressLint("StaticFieldLeak") public static Toolbar MAINACTIVITY_TOOLBAR; @Override @@ -106,63 +69,37 @@ protected void onCreate(Bundle savedInstanceState) { Log.d(Constants.LOG.MATAG, Constants.LOG.INIT_VALUES); checkPermissions(); - initMPU(); - /*initRD(); - initT();*/ CheckUpdates ck = new CheckUpdates(Constants.GITHUB_USER, Constants.GITHUB_REPO); - try { - mpuThread.join(); - } catch (InterruptedException e) { - Log.e(Constants.LOG.MATAG, Constants.LOG.JOIN_ERROR); - } finally { - printValues(); - //setTitle(getString(R.string.BTCP) + MARKET_PRICE_USD); - - final FloatingActionsMenu mainButton = (FloatingActionsMenu) findViewById(R.id.menu_fab); - final FloatingActionButton licenseButton = (FloatingActionButton) findViewById(R.id.license); - final FloatingActionButton closeButton = (FloatingActionButton) findViewById(R.id.close); - final FloatingActionButton settingsButton = (FloatingActionButton) findViewById(R.id.settings); - final FloatingActionButton refreshButton = (FloatingActionButton) findViewById(R.id.update); - //final PieChart chart = (PieChart) findViewById(R.id.chart); - mSectionsPagerAdapter = new SectionsPagerAdapter(getSupportFragmentManager()); - //final Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar); - MAINACTIVITY_TOOLBAR = (Toolbar) findViewById(R.id.toolbar); - //toolbar.setTitle(getString(R.string.BTCP) + MARKET_PRICE_USD); - setSupportActionBar(MAINACTIVITY_TOOLBAR); - //getSupportActionBar().setDisplayHomeAsUpEnabled(true); + final FloatingActionsMenu mainButton = findViewById(R.id.menu_fab); + final FloatingActionButton licenseButton = findViewById(R.id.license); + final FloatingActionButton closeButton = findViewById(R.id.close); + final FloatingActionButton settingsButton = findViewById(R.id.settings); + final FloatingActionButton refreshButton = findViewById(R.id.update); - viewPager = (ViewPager) findViewById(R.id.viewContainer); - viewPager.setAdapter(mSectionsPagerAdapter); - //setupViewPager(viewPager); + SectionsPagerAdapter mSectionsPagerAdapter = new SectionsPagerAdapter(getSupportFragmentManager()); + MAINACTIVITY_TOOLBAR = findViewById(R.id.toolbar); + setSupportActionBar(MAINACTIVITY_TOOLBAR); - tabLayout = (TabLayout) findViewById(R.id.tabs); - setupTabs(tabLayout); - viewPager.addOnPageChangeListener(new TabLayout.TabLayoutOnPageChangeListener(tabLayout)); - tabLayout.addOnTabSelectedListener(new TabLayout.ViewPagerOnTabSelectedListener(viewPager)); - //tabLayout.setupWithViewPager(viewPager); - //setupTabIcons(); + ViewPager viewPager = findViewById(R.id.viewContainer); + viewPager.setAdapter(mSectionsPagerAdapter); - //viewPager.invalidate(); - /*final ViewPager pager = (ViewPager) findViewById(R.id.tabs);*/ + TabLayout tabLayout = findViewById(R.id.tabs); + setupTabs(tabLayout); + viewPager.addOnPageChangeListener(new TabLayout.TabLayoutOnPageChangeListener(tabLayout)); + tabLayout.addOnTabSelectedListener(new TabLayout.ViewPagerOnTabSelectedListener(viewPager)); - //pager.setAdapter(getSupportFragmentManager()); + Log.d(Constants.LOG.MATAG, Constants.LOG.CREATING_CHART); + mainButton.bringToFront(); + mainButton.invalidate(); - Log.d(Constants.LOG.MATAG, Constants.LOG.CREATING_CHART); - /*createPieChart(chart); - createTable((TableLayout) findViewById(R.id.poolstable));*/ - mainButton.bringToFront(); - mainButton.invalidate(); + Log.d(Constants.LOG.MATAG, Constants.LOG.LISTENING); + licenseButton.setOnClickListener(this); + closeButton.setOnClickListener(this); + settingsButton.setOnClickListener(this); + refreshButton.setOnClickListener(this); - Log.d(Constants.LOG.MATAG, Constants.LOG.LISTENING); - licenseButton.setOnClickListener(this); - closeButton.setOnClickListener(this); - settingsButton.setOnClickListener(this); - refreshButton.setOnClickListener(this); - //APPBAR = (AppBarLayout) findViewById(R.id.appbar); - - ck.checkForUpdates(this, getString(R.string.updateAvailable), getString(R.string.updateDescrip), getString(R.string.updateNow), getString(R.string.updateLater), getString(R.string.updatePage)); - } + ck.checkForUpdates(this, getString(R.string.updateAvailable), getString(R.string.updateDescrip), getString(R.string.updateNow), getString(R.string.updateLater), getString(R.string.updatePage)); } else { new MaterialDialog.Builder(this) .title(R.string.noConnectionTitle) @@ -188,146 +125,6 @@ private void refresh() { MainActivity.this.finish(); } - private void initMPU() { - mpuThread = new Thread() { - public void run() { - Log.d(Constants.LOG.MATAG, Constants.LOG.LOADING_MPU); - net market = new net(); - market.execute(Constants.STATS_URL); - try { - MARKET_PRICE_USD = round((float) market.get().getDouble(Constants.MARKET_NAME), 2); - } catch (InterruptedException | ExecutionException | JSONException e) { - Log.e(Constants.LOG.MATAG, Constants.LOG.MARKET_PRICE_ERROR + e.getMessage()); - MARKET_PRICE_USD = 0; - } - } - }; - mpuThread.setName("mpu_thread"); - mpuThread.start(); - } - - private void initRD() { - rdThread = new Thread() { - public void run() { - int days = BitCoinApp.getSharedPreferences().getInt(Constants.SHARED_PREFERENCES.DAYS_TO_CHECK, 1); - Log.d(Constants.LOG.MATAG, Constants.LOG.LOADING_RD); - String url = Constants.POOLS_URL + days + "days"; - net httpsResponse = new net(); - httpsResponse.execute(url); - try { - RETRIEVED_DATA = JSONTools.sortByValue(JSONTools.convert2HashMap(httpsResponse.get())); - } catch (InterruptedException | ExecutionException e) { - RETRIEVED_DATA = null; - Log.e(Constants.LOG.MATAG, Constants.LOG.DATA_ERROR + e.getMessage()); - } - } - }; - rdThread.setName("rd_thread"); - rdThread.start(); - } - - /*private void initT() { - TableRow masterRow = (TableRow) findViewById(R.id.masterRow); - TABLE_PARAMS = masterRow.getLayoutParams(); - }*/ - - private void createPieChart(final PieChart destinationChart) { - Thread pieChartThread = new Thread() { - public void run() { - Log.d(Constants.LOG.MATAG, Constants.LOG.LOADING_CHART); - List values = new ArrayList<>(); - List> entryList = new ArrayList<>(RETRIEVED_DATA.entrySet()); - Map.Entry getEntry; - int count = 0; - for (int i = entryList.size() - 1; (i >= 0) && (count < 10); --i) { - getEntry = entryList.get(i); - Log.i(Constants.LOG.MATAG, "Accessing at: " + i + " | Key: " + getEntry.getKey() + " | Value: " + getEntry.getValue()); - values.add(new PieEntry(getEntry.getValue(), getEntry.getKey())); - ++count; - } - PieDataSet data = new PieDataSet(values, "Latest 24h BTC pools"); - data.setColors(ColorTemplate.MATERIAL_COLORS); - data.setValueTextSize(10f); - - destinationChart.setData(new PieData(data)); - destinationChart.setUsePercentValues(true); - destinationChart.setEntryLabelColor(ColorTemplate.rgb("#000000")); - Description description = new Description(); - description.setText(getString(R.string.porcent)); - destinationChart.setDescription(description); - destinationChart.getLegend().setEnabled(false); - destinationChart.invalidate(); - } - }; - try { - rdThread.join(); - } catch (InterruptedException e) { - Log.e(Constants.LOG.MATAG, Constants.LOG.JOIN_ERROR + rdThread.getName()); - } finally { - pieChartThread.setName("chart_thread"); - pieChartThread.start(); - } - } - - /*private void createTable(final TableLayout destinationTable) { - Thread tableThread = new Thread() { - public void run() { - Log.d(Constants.LOG.MATAG, Constants.LOG.LOADING_TABLE); - List> entryList = new ArrayList<>(RETRIEVED_DATA.entrySet()); - Map.Entry getEntry; - int count = 1; - - TableRow fetchTableRow = findViewById(R.id.masterRow); - TextView firstPool = new TextView(MainActivity.this); - TextView firstBlock = new TextView(MainActivity.this); - - getEntry = entryList.get(entryList.size() - 1); - - firstPool.setText(getEntry.getKey()); - firstPool.setTypeface(Typeface.DEFAULT_BOLD); - firstPool.setTextSize(16f); - - firstBlock.setText(String.valueOf(getEntry.getValue())); - firstBlock.setTypeface(Typeface.MONOSPACE); - firstBlock.setTextSize(16f); - - fetchTableRow.addView(firstPool); - fetchTableRow.addView(firstBlock); - for (int i = entryList.size() - 2; (i >= 0) && (count <= 10); --i) { - TextView poolName = new TextView(MainActivity.this); - TextView poolBlock = new TextView(MainActivity.this); - TableRow tableRow = new TableRow(MainActivity.this); - - getEntry = entryList.get(i); - poolName.setText(getEntry.getKey()); - poolBlock.setText(String.valueOf(getEntry.getValue())); - - poolName.setTypeface(Typeface.DEFAULT_BOLD); - poolName.setTextSize(16f); - - poolBlock.setTypeface(Typeface.MONOSPACE); - poolBlock.setTextSize(16f); - - tableRow.setLayoutParams(TABLE_PARAMS); - tableRow.addView(poolName); - tableRow.addView(poolBlock); - - destinationTable.addView(tableRow); - ++count; - } - destinationTable.invalidate(); - } - }; - try { - rdThread.join(); - } catch (InterruptedException e) { - Log.e(Constants.LOG.MATAG, Constants.LOG.JOIN_ERROR + rdThread.getName()); - } finally { - tableThread.setName("table_thread"); - tableThread.start(); - } - }*/ - /** * Based on: https://stackoverflow.com/questions/8911356/whats-the-best-practice-to-round-a-float-to-2-decimals */ @@ -385,51 +182,9 @@ private void closeApp() { this.onBackPressed(); } - /*private void setupViewPager(ViewPager viewPager) { - ViewPagerAdapter adapter = new ViewPagerAdapter(getSupportFragmentManager()); - adapter.addFragment(new PoolsView(), "ONE"); - adapter.addFragment(new TwoFragment(), "TWO"); - //adapter.addFragment(new ThreeFragment(), "THREE"); - viewPager.setAdapter(adapter); - }*/ - - /*class ViewPagerAdapter extends FragmentPagerAdapter { - private final List mFragmentList = new ArrayList<>(); - private final List mFragmentTitleList = new ArrayList<>(); - - public ViewPagerAdapter(FragmentManager manager) { - super(manager); - } - - @Override - public Fragment getItem(int position) { - return mFragmentList.get(position); - } - - @Override - public int getCount() { - return mFragmentList.size(); - } - - public void addFragment(Fragment fragment, String title) { - mFragmentList.add(fragment); - mFragmentTitleList.add(title); - } - - @Override - public CharSequence getPageTitle(int position) { - return mFragmentTitleList.get(position); - } - }*/ - - private void setupTabIcons() { - tabLayout.getTabAt(0).setIcon(R.drawable.ic_poll_white_24dp); - tabLayout.getTabAt(1).setIcon(R.drawable.ic_attach_money_white_24dp); - } - private void setupTabs(TabLayout destinationTab) { - destinationTab.addTab(destinationTab.newTab().setText("Tab 1 - test").setIcon(R.drawable.ic_poll_white_24dp)); - destinationTab.addTab(destinationTab.newTab().setText("Tab 2 - test").setIcon(R.drawable.ic_attach_money_white_24dp)); + destinationTab.addTab(destinationTab.newTab().setText(R.string.poolsChart).setIcon(R.drawable.ic_poll_white_24dp)); + destinationTab.addTab(destinationTab.newTab().setText(R.string.bitcoinChart).setIcon(R.drawable.ic_attach_money_white_24dp)); } /** @@ -438,7 +193,7 @@ private void setupTabs(TabLayout destinationTab) { */ public class SectionsPagerAdapter extends FragmentPagerAdapter { - public SectionsPagerAdapter(FragmentManager fm) { + SectionsPagerAdapter(FragmentManager fm) { super(fm); } @@ -462,27 +217,7 @@ public int getCount() { // Show 3 total pages. return 2; } - } - private void printValues() { - String url = "https://api.coindesk.com/v1/bpi/historical/close.json?start=2011-09-01&end=2018-01-01"; - net httpsResponse = new net(); - httpsResponse.execute(url); - Map newData = new LinkedHashMap<>(); - try { - newData = JSONTools.sortDateByValue(JSONTools.convert2DateHashMap(httpsResponse.get().getJSONObject("bpi"))); - } catch (InterruptedException | ExecutionException | JSONException e) { - newData = null; - Log.e(Constants.LOG.MATAG, Constants.LOG.DATA_ERROR + e.getMessage()); - } - /*assert newData != null; - System.out.println(newData.toString()); - System.out.println(newData.entrySet().toString()); - Iterator it = newData.keySet().iterator(); - DateFormat df = new SimpleDateFormat("yyyy-MM-dd"); - while (it.hasNext()) { - System.out.println(df.format(it.next())); - }*/ } } diff --git a/app/src/main/res/layout/activity_main.xml b/app/src/main/res/layout/activity_main.xml index b62689f..c706722 100644 --- a/app/src/main/res/layout/activity_main.xml +++ b/app/src/main/res/layout/activity_main.xml @@ -63,127 +63,24 @@ app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toBottomOf="@+id/appbar" /> - - + app:layout_constraintHorizontal_bias="1.0" + app:layout_constraintStart_toStartOf="parent"> + + diff --git a/app/src/main/res/layout/btcdata.xml b/app/src/main/res/layout/btcdata.xml deleted file mode 100644 index ce96f17..0000000 --- a/app/src/main/res/layout/btcdata.xml +++ /dev/null @@ -1,48 +0,0 @@ - - - - - - - -