From 8344b387492fb19f2f24478aa240af60cd2c6903 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Nicol=C3=A1s=20S=C3=A1nchez?= Date: Wed, 12 Mar 2025 10:15:56 -0300 Subject: [PATCH] . --- .../com/example/dcav2gui/EarnerInterface.java | 138 ++++++++++++++++++ .../dcav2gui/ui/earners/EarnFragment.java | 62 +++++++- .../ui/earners/EarnerCardAdapter.java | 2 +- app/src/main/res/menu/earner_popup_menu.xml | 4 + 4 files changed, 204 insertions(+), 2 deletions(-) diff --git a/app/src/main/java/com/example/dcav2gui/EarnerInterface.java b/app/src/main/java/com/example/dcav2gui/EarnerInterface.java index 285d1bd..fa19d2d 100644 --- a/app/src/main/java/com/example/dcav2gui/EarnerInterface.java +++ b/app/src/main/java/com/example/dcav2gui/EarnerInterface.java @@ -2,6 +2,12 @@ package com.example.dcav2gui; import static com.example.dcav2gui.MainActivity.globalSettings; +import android.app.AlertDialog; +import android.content.Context; +import android.os.Handler; +import android.os.Looper; +import android.widget.Toast; + import com.example.dcav2gui.ui.earners.EarnerData; import com.google.gson.Gson; import com.google.gson.JsonElement; @@ -24,6 +30,118 @@ public class EarnerInterface { private static final String API_KEY = globalSettings.earnApiKey; private static final OkHttpClient httpClient = new OkHttpClient(); + + public static void sendRequestGlobalData(Context context) { + new Thread(() -> { + try { + EarnerGlobalData result = getEarnerGlobalData(true); + new Handler(Looper.getMainLooper()).post(() -> showSimpleDialog("Global data", result.toString(), context)); + } catch (IOException e) { + e.printStackTrace(); + new Handler(Looper.getMainLooper()).post(() -> Toast.makeText(context, "Failed to get global status", Toast.LENGTH_SHORT).show()); + } + }).start(); + } + + public static void sendRequestTotalBalance(String exchange, Context context) { + new Thread(() -> { + try { + JsonObject result = getTotalBalance(exchange, true); + String dialogTitle = "Balances"; + String dialogMessage = "Trading balance: " + result.get("trading_balance").getAsString() + + " | Earning balance " + result.get("earning_balance").getAsString(); + new Handler(Looper.getMainLooper()).post(() -> showSimpleDialog(dialogTitle, dialogMessage, context)); + } catch (IOException e) { + e.printStackTrace(); + new Handler(Looper.getMainLooper()).post(() -> Toast.makeText(context, "Failed to get total balance", Toast.LENGTH_SHORT).show()); + } + }).start(); + } + + public static void sendRequestGetStepSize(String exchange, Context context) { + new Thread(() -> { + try { + JsonObject result = getStepSize(exchange, true); + new Handler(Looper.getMainLooper()).post(() -> showJsonDialog(result, context)); + } catch (IOException e) { + e.printStackTrace(); + new Handler(Looper.getMainLooper()).post(() -> Toast.makeText(context, "Failed to get step size", Toast.LENGTH_SHORT).show()); + } + }).start(); + } + + public static void sendRequestGetPercentage(String exchange, Context context) { + new Thread(() -> { + try { + JsonObject result = getPercentage(exchange, true); + new Handler(Looper.getMainLooper()).post(() -> showJsonDialog(result, context)); + } catch (IOException e) { + e.printStackTrace(); + new Handler(Looper.getMainLooper()).post(() -> Toast.makeText(context, "Failed to get percentage", Toast.LENGTH_SHORT).show()); + } + }).start(); + } + + public static void sendRequestLastSubscription(String exchange, Context context) { + new Thread(() -> { + try { + JsonObject result = getLastSubscription(exchange, true); + new Handler(Looper.getMainLooper()).post(() -> showJsonDialog(result, context)); + } catch (IOException e) { + e.printStackTrace(); + new Handler(Looper.getMainLooper()).post(() -> Toast.makeText(context, "Failed to get last subscription", Toast.LENGTH_SHORT).show()); + } + }).start(); + } + + public static void sendRequestLastRedemption(String exchange, Context context) { + new Thread(() -> { + try { + JsonObject result = getLastRedemption(exchange, true); + new Handler(Looper.getMainLooper()).post(() -> showJsonDialog(result, context)); + } catch (IOException e) { + e.printStackTrace(); + new Handler(Looper.getMainLooper()).post(() -> Toast.makeText(context, "Failed to get last redemption", Toast.LENGTH_SHORT).show()); + } + }).start(); + } + + public static void sendRequestGetTimeBetweenSubscriptions(String exchange, Context context) { + new Thread(() -> { + try { + JsonObject result = getTimeBetweenSubscriptions(exchange, true); + new Handler(Looper.getMainLooper()).post(() -> showJsonDialog(result, context)); + } catch (IOException e) { + e.printStackTrace(); + new Handler(Looper.getMainLooper()).post(() -> Toast.makeText(context, "Failed to get last redemption", Toast.LENGTH_SHORT).show()); + } + }).start(); + } + + public static void sendRequestGetTimeBetweenRedemptions(String exchange, Context context) { + new Thread(() -> { + try { + JsonObject result = getTimeBetweenRedemptions(exchange, true); + new Handler(Looper.getMainLooper()).post(() -> showJsonDialog(result, context)); + } catch (IOException e) { + e.printStackTrace(); + new Handler(Looper.getMainLooper()).post(() -> Toast.makeText(context, "Failed to get last redemption", Toast.LENGTH_SHORT).show()); + } + }).start(); + } + + public static void sendRequestGetMinimumAmountInTradingAccount(String exchange, Context context) { + new Thread(() -> { + try { + JsonObject result = getMinimumAmountInTradingAccount(exchange, true); + new Handler(Looper.getMainLooper()).post(() -> showJsonDialog(result, context)); + } catch (IOException e) { + e.printStackTrace(); + new Handler(Looper.getMainLooper()).post(() -> Toast.makeText(context, "Failed to get last redemption", Toast.LENGTH_SHORT).show()); + } + }).start(); + } + public static EarnerGlobalData getEarnerGlobalData(boolean retry) throws IOException { double uptime = 0.0; List earnerList = new ArrayList<>(); @@ -555,6 +673,26 @@ public class EarnerInterface { } + public static void showSimpleDialog(String title, String message, Context context) { + AlertDialog.Builder builder = new AlertDialog.Builder(context); + + builder.setTitle(title); + builder.setMessage(message); + builder.setPositiveButton("OK", null); + builder.show(); + } + + public static void showJsonDialog(JsonObject result, Context context) { + AlertDialog.Builder builder = new AlertDialog.Builder(context); + + for (String key: result.keySet()) { + builder.setTitle(key); + builder.setMessage(result.get(key).getAsString()); + } + builder.setPositiveButton("OK", null); + builder.show(); + } + public static class EarnerGlobalData { private final double uptime; private final List earnerList; diff --git a/app/src/main/java/com/example/dcav2gui/ui/earners/EarnFragment.java b/app/src/main/java/com/example/dcav2gui/ui/earners/EarnFragment.java index 02b9e7c..ab971f8 100644 --- a/app/src/main/java/com/example/dcav2gui/ui/earners/EarnFragment.java +++ b/app/src/main/java/com/example/dcav2gui/ui/earners/EarnFragment.java @@ -2,8 +2,10 @@ package com.example.dcav2gui.ui.earners; import android.os.Bundle; import android.view.LayoutInflater; +import android.view.MenuItem; import android.view.View; import android.view.ViewGroup; +import android.widget.PopupMenu; import android.widget.TextView; import androidx.annotation.NonNull; @@ -13,11 +15,13 @@ import androidx.lifecycle.ViewModelProvider; import com.example.dcav2gui.EarnerInterface; import com.example.dcav2gui.R; +import com.example.dcav2gui.WorkerInterface; import com.example.dcav2gui.databinding.FragmentEarnersBinding; +import com.example.dcav2gui.ui.exchanges.adapters.WorkerCardAdapter; import java.io.IOException; -public class EarnFragment extends Fragment { +public class EarnFragment extends Fragment implements EarnerCardAdapter.OnCardLongClickListener { private EarnerCardAdapter earnerCardAdapter; private TextView statusBar; @@ -31,6 +35,7 @@ public class EarnFragment extends Fragment { statusBar = root.findViewById(R.id.earners_status_bar); EarnerViewModel earnerViewModel = new ViewModelProvider(this).get(EarnerViewModel.class); earnerCardAdapter = new EarnerCardAdapter(binding.earnersCardsContainer); + earnerCardAdapter.setOnCardLongClickListener(this); earnerViewModel.getEarnerData().observe(getViewLifecycleOwner(), new Observer() { @Override @@ -44,4 +49,59 @@ public class EarnFragment extends Fragment { return root; } + + @Override + public void onCardLongClick(String exchange, View view) { + if (view != null) { + PopupMenu popupMenu = new PopupMenu(getContext(), view); + popupMenu.getMenuInflater().inflate(R.menu.earner_popup_menu, popupMenu.getMenu()); + popupMenu.setOnMenuItemClickListener(new PopupMenu.OnMenuItemClickListener() { + @Override + public boolean onMenuItemClick(MenuItem item) { + if (item.getItemId() == R.id.earnerMenuGlobalStatus) { + EarnerInterface.sendRequestGlobalData(getContext()); + return true; + } else if (item.getItemId() == R.id.earnerMenuTotalBalance) { + EarnerInterface.sendRequestTotalBalance(exchange, getContext()); + return true; + } else if (item.getItemId() == R.id.earnerMenuGetStepSize) { + EarnerInterface.sendRequestGetStepSize(exchange, getContext()); + return true; + } else if (item.getItemId() == R.id.earnerMenuSetStepSize) { + return true; + } else if (item.getItemId() == R.id.earnerMenuLastSubscription) { + EarnerInterface.sendRequestLastSubscription(exchange, getContext()); + return true; + } else if (item.getItemId() == R.id.earnerMenuLastRedemption) { + EarnerInterface.sendRequestLastRedemption(exchange, getContext()); + return true; + } else if (item.getItemId() == R.id.earnerMenuTogglePause) { + return true; + } else if (item.getItemId() == R.id.earnerMenuGetPercentage) { + EarnerInterface.sendRequestGetPercentage(exchange, getContext()); + return true; + } else if (item.getItemId() == R.id.earnerMenuSetPercentage) { + return true; + } else if (item.getItemId() == R.id.earnerMenuGetTimeBetweenSubscriptions) { + EarnerInterface.sendRequestGetTimeBetweenSubscriptions(exchange, getContext()); + return true; + } else if (item.getItemId() == R.id.earnerMenuSetTimeBetweenSubscriptions) { + return true; + } else if (item.getItemId() == R.id.earnerMenuGetTimeBetweenRedemptions) { + EarnerInterface.sendRequestGetTimeBetweenRedemptions(exchange, getContext()); + return true; + } else if (item.getItemId() == R.id.earnerMenuSetTimeBetweenRedemptions) { + return true; + } else if (item.getItemId() == R.id.earnerMenuGetMinimumAmountInTradingAccount) { + EarnerInterface.sendRequestGetMinimumAmountInTradingAccount(exchange, getContext()); + return true; + } else if (item.getItemId() == R.id.earnerMenuSetMinimumAmountInTradingAccount) { + return true; + } + return false; + } + }); + popupMenu.show(); + } + } } diff --git a/app/src/main/java/com/example/dcav2gui/ui/earners/EarnerCardAdapter.java b/app/src/main/java/com/example/dcav2gui/ui/earners/EarnerCardAdapter.java index 9f4772b..6befe91 100644 --- a/app/src/main/java/com/example/dcav2gui/ui/earners/EarnerCardAdapter.java +++ b/app/src/main/java/com/example/dcav2gui/ui/earners/EarnerCardAdapter.java @@ -34,7 +34,7 @@ public class EarnerCardAdapter { public interface OnCardLongClickListener { - void onCardLongClick(String pair, View v); + void onCardLongClick(String exchange, View v); } private EarnerCardAdapter.OnCardLongClickListener onCardLongClickListener; diff --git a/app/src/main/res/menu/earner_popup_menu.xml b/app/src/main/res/menu/earner_popup_menu.xml index 28cb87e..05ebb8a 100644 --- a/app/src/main/res/menu/earner_popup_menu.xml +++ b/app/src/main/res/menu/earner_popup_menu.xml @@ -15,6 +15,8 @@ + +