From fbdd2206c0b4c9b50ceac17e1069aab6954c0ba8 Mon Sep 17 00:00:00 2001 From: Michael Mikovsky <77305074+Astatin3@users.noreply.github.com> Date: Tue, 25 Mar 2025 11:50:16 -0600 Subject: [PATCH] Move fields to settings, add setting for match number --- .../ridgescout/ui/data/DataFragment.java | 23 +-- .../ui/scouting/TallyCounterView.java | 20 ++- .../{data => settings}/FieldEditorHelper.java | 2 +- .../ui/{data => settings}/FieldsFragment.java | 4 +- .../ui/settings/settingsFragment.java | 135 +++++++++++++++++- .../ridgescout/ui/transfer/FTPSync.java | 6 - app/src/main/res/layout/fragment_data.xml | 41 ------ .../layout/fragment_data_fields_chooser.xml | 29 ---- app/src/main/res/layout/fragment_settings.xml | 42 ++++++ .../main/res/navigation/mobile_navigation.xml | 20 +-- 10 files changed, 204 insertions(+), 118 deletions(-) rename app/src/main/java/com/ridgebotics/ridgescout/ui/{data => settings}/FieldEditorHelper.java (99%) rename app/src/main/java/com/ridgebotics/ridgescout/ui/{data => settings}/FieldsFragment.java (99%) delete mode 100644 app/src/main/res/layout/fragment_data_fields_chooser.xml diff --git a/app/src/main/java/com/ridgebotics/ridgescout/ui/data/DataFragment.java b/app/src/main/java/com/ridgebotics/ridgescout/ui/data/DataFragment.java index ea99e09..609af03 100644 --- a/app/src/main/java/com/ridgebotics/ridgescout/ui/data/DataFragment.java +++ b/app/src/main/java/com/ridgebotics/ridgescout/ui/data/DataFragment.java @@ -16,9 +16,9 @@ import androidx.fragment.app.Fragment; import com.ridgebotics.ridgescout.R; import com.ridgebotics.ridgescout.scoutingData.fields; +import com.ridgebotics.ridgescout.ui.settings.FieldsFragment; import com.ridgebotics.ridgescout.utility.settingsManager; import com.ridgebotics.ridgescout.databinding.FragmentDataBinding; -import com.ridgebotics.ridgescout.types.frcTeam; import com.ridgebotics.ridgescout.ui.TeamSelectorFragment; import com.ridgebotics.ridgescout.utility.fileEditor; import com.ridgebotics.ridgescout.types.frcEvent; @@ -37,33 +37,16 @@ public class DataFragment extends Fragment { String evcode = settingsManager.getEVCode(); - binding.fieldsButton.setOnClickListener(v -> { - binding.fieldsButton.setEnabled(false); - binding.fieldsButtons.setVisibility(VISIBLE); - }); - - binding.fieldsMatchesButton.setOnClickListener(v -> { - FieldsFragment.set_filename(fields.matchFieldsFilename); - findNavController(this).navigate(R.id.action_navigation_data_to_navigation_data_fields); - }); - - binding.fieldsPitsButton.setOnClickListener(v -> { - FieldsFragment.set_filename(fields.pitsFieldsFilename); - findNavController(this).navigate(R.id.action_navigation_data_to_navigation_data_fields); - }); - if(evcode.equals("unset")){ binding.noEventError.setVisibility(VISIBLE); - binding.buttons.setVisibility(VISIBLE); - binding.teamsButton.setEnabled(false); - binding.fieldsButton.setVisibility(VISIBLE); +// binding.teamsButton.setEnabled(false); return root; } - frcEvent event = frcEvent.decode(fileEditor.readFile(evcode + ".eventdata")); +// frcEvent event = frcEvent.decode(fileEditor.readFile(evcode + ".eventdata")); binding.teamsButton.setOnClickListener(v -> { TeamSelectorFragment.setPits_mode(false); diff --git a/app/src/main/java/com/ridgebotics/ridgescout/ui/scouting/TallyCounterView.java b/app/src/main/java/com/ridgebotics/ridgescout/ui/scouting/TallyCounterView.java index 792aa0a..4a7a49b 100644 --- a/app/src/main/java/com/ridgebotics/ridgescout/ui/scouting/TallyCounterView.java +++ b/app/src/main/java/com/ridgebotics/ridgescout/ui/scouting/TallyCounterView.java @@ -15,6 +15,8 @@ public class TallyCounterView extends LinearLayout { private Button minusButton; private Button plusButton; private OnCountChangedListener onCountChangedListener; + private int min = 0; + private int max = -1; public interface OnCountChangedListener { void onCountChanged(int newCount); @@ -45,20 +47,26 @@ public class TallyCounterView extends LinearLayout { updateDisplay(); minusButton.setOnClickListener(v -> { - if(count > 0) { + if(count > min) { count--; updateDisplay(); } }); plusButton.setOnClickListener(v -> { - count++; - updateDisplay(); + if(max == -1 || count < max){ + count++; + updateDisplay(); + } }); } private void updateDisplay() { countDisplay.setText(String.valueOf(count)); + + minusButton.setEnabled(count > min); + plusButton.setEnabled(max == -1 || count < max); + if (onCountChangedListener != null) { onCountChangedListener.onCountChanged(count); } @@ -69,6 +77,12 @@ public class TallyCounterView extends LinearLayout { updateDisplay(); } + public void setBounds(int min, int max){ + this.min = min; + this.max = max; + updateDisplay(); + } + public int getValue() { return count; } diff --git a/app/src/main/java/com/ridgebotics/ridgescout/ui/data/FieldEditorHelper.java b/app/src/main/java/com/ridgebotics/ridgescout/ui/settings/FieldEditorHelper.java similarity index 99% rename from app/src/main/java/com/ridgebotics/ridgescout/ui/data/FieldEditorHelper.java rename to app/src/main/java/com/ridgebotics/ridgescout/ui/settings/FieldEditorHelper.java index fad663f..6631804 100644 --- a/app/src/main/java/com/ridgebotics/ridgescout/ui/data/FieldEditorHelper.java +++ b/app/src/main/java/com/ridgebotics/ridgescout/ui/settings/FieldEditorHelper.java @@ -1,4 +1,4 @@ -package com.ridgebotics.ridgescout.ui.data; +package com.ridgebotics.ridgescout.ui.settings; import static android.text.InputType.TYPE_CLASS_NUMBER; diff --git a/app/src/main/java/com/ridgebotics/ridgescout/ui/data/FieldsFragment.java b/app/src/main/java/com/ridgebotics/ridgescout/ui/settings/FieldsFragment.java similarity index 99% rename from app/src/main/java/com/ridgebotics/ridgescout/ui/data/FieldsFragment.java rename to app/src/main/java/com/ridgebotics/ridgescout/ui/settings/FieldsFragment.java index e3ec678..f1b9eaf 100644 --- a/app/src/main/java/com/ridgebotics/ridgescout/ui/data/FieldsFragment.java +++ b/app/src/main/java/com/ridgebotics/ridgescout/ui/settings/FieldsFragment.java @@ -1,4 +1,4 @@ -package com.ridgebotics.ridgescout.ui.data; +package com.ridgebotics.ridgescout.ui.settings; import android.annotation.SuppressLint; import android.app.Activity; @@ -242,7 +242,7 @@ public class FieldsFragment extends Fragment { if(fields.save(filename, newValues)) AlertManager.toast("Saved"); - Navigation.findNavController((Activity) getContext(), R.id.nav_host_fragment_activity_main).navigate(R.id.action_navigation_data_fields_to_navigation_data); + Navigation.findNavController((Activity) getContext(), R.id.nav_host_fragment_activity_main).navigate(R.id.action_navigation_data_fields_to_navigation_settings); }); alert.setNegativeButton("Cancel", null); alert.setCancelable(true); diff --git a/app/src/main/java/com/ridgebotics/ridgescout/ui/settings/settingsFragment.java b/app/src/main/java/com/ridgebotics/ridgescout/ui/settings/settingsFragment.java index 6e294d1..3b6f028 100644 --- a/app/src/main/java/com/ridgebotics/ridgescout/ui/settings/settingsFragment.java +++ b/app/src/main/java/com/ridgebotics/ridgescout/ui/settings/settingsFragment.java @@ -1,7 +1,10 @@ package com.ridgebotics.ridgescout.ui.settings; +import static android.view.View.VISIBLE; +import static androidx.navigation.fragment.FragmentKt.findNavController; import static com.ridgebotics.ridgescout.utility.settingsManager.AllyPosKey; import static com.ridgebotics.ridgescout.utility.settingsManager.CustomEventsKey; +import static com.ridgebotics.ridgescout.utility.settingsManager.MatchNumKey; import static com.ridgebotics.ridgescout.utility.settingsManager.SelEVCodeKey; import static com.ridgebotics.ridgescout.utility.settingsManager.UnameKey; import static com.ridgebotics.ridgescout.utility.settingsManager.WifiModeKey; @@ -15,6 +18,7 @@ import android.os.Bundle; import android.text.Editable; import android.text.InputType; import android.text.TextWatcher; +import android.view.Gravity; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; @@ -29,9 +33,13 @@ import com.google.android.material.card.MaterialCardView; import com.google.android.material.checkbox.MaterialCheckBox; import com.google.android.material.textfield.TextInputEditText; import com.google.android.material.textfield.TextInputLayout; +import com.ridgebotics.ridgescout.R; import com.ridgebotics.ridgescout.databinding.FragmentSettingsBinding; +import com.ridgebotics.ridgescout.scoutingData.fields; import com.ridgebotics.ridgescout.ui.CustomSpinnerPopup; import com.ridgebotics.ridgescout.ui.CustomSpinnerView; +import com.ridgebotics.ridgescout.ui.scouting.TallyCounterView; +import com.ridgebotics.ridgescout.utility.DataManager; import com.ridgebotics.ridgescout.utility.fileEditor; import com.ridgebotics.ridgescout.utility.settingsManager; @@ -50,8 +58,30 @@ public class settingsFragment extends Fragment { binding = FragmentSettingsBinding.inflate(inflater, container, false); View root = binding.getRoot(); + reloadSettings(); + + binding.fieldsButton.setOnClickListener(v -> { + binding.fieldsButton.setEnabled(false); + binding.fieldsButtons.setVisibility(VISIBLE); + }); + + binding.fieldsMatchesButton.setOnClickListener(v -> { + FieldsFragment.set_filename(fields.matchFieldsFilename); + findNavController(this).navigate(R.id.action_navigation_settings_to_navigation_data_fields); + }); + + binding.fieldsPitsButton.setOnClickListener(v -> { + FieldsFragment.set_filename(fields.pitsFieldsFilename); + findNavController(this).navigate(R.id.action_navigation_settings_to_navigation_data_fields); + }); + + + return root; + } + + private void reloadSettings(){ String[] alliance_pos_list = new String[]{"red-1", "red-2", "red-3", - "blue-1", "blue-2", "blue-3"}; + "blue-1", "blue-2", "blue-3"}; SettingsManager manager = new SettingsManager(getContext()); @@ -70,16 +100,32 @@ public class settingsFragment extends Fragment { manager.addItem(new NumberSettingsItem(YearNumKey, "Year", 0, 9999)); manager.addItem(new DropdownSettingsItem(AllyPosKey, "Alliance Pos", alliance_pos_list)); - manager.addItem(new DropdownSettingsItem(SelEVCodeKey, "Event Code", fileEditor.getEventList().toArray(new String[0]))); + + int max = 0; + boolean hasEvent = false; + + if(!DataManager.getevcode().equals("unset")){ + DataManager.reload_event(); + max = DataManager.event.matches.size(); + hasEvent = true; + } + + TallySettingsItem matchNum = new TallySettingsItem(MatchNumKey, "Match Number", max); + matchNum.setEnabled(hasEvent); + manager.addItem(matchNum); + + DropdownSettingsItem eventCode = new DropdownSettingsItem(SelEVCodeKey, "Event Code", fileEditor.getEventList().toArray(new String[0])); + eventCode.reloadOnChange(true); + manager.addItem(eventCode); + manager.addItem(new StringSettingsItem(UnameKey, "Username")); + binding.SettingsTable.removeAllViews(); manager.getView(binding.SettingsTable); - - - return root; } + @Override public void onDestroyView() { super.onDestroyView(); @@ -103,6 +149,7 @@ public class settingsFragment extends Fragment { private String key; private String title; private T defaultValue; + public View view; public SettingsItem(String key, String title, T defaultValue) { this.key = key; @@ -110,6 +157,14 @@ public class settingsFragment extends Fragment { this.defaultValue = defaultValue; } + private boolean reloadOnChange = false; + public void reloadOnChange(boolean enabled){ + reloadOnChange = enabled; + } + public boolean isReloadOnChange(){ + return reloadOnChange; + } + public abstract View createView(Context context); public abstract T getValue(); @@ -146,6 +201,7 @@ public class settingsFragment extends Fragment { @Override public void afterTextChanged(Editable s) { getEditor().putString(getKey(), s.toString()).apply(); + if(isReloadOnChange()) reloadSettings(); } @Override @@ -205,6 +261,7 @@ public class settingsFragment extends Fragment { } catch (NumberFormatException e) { editText.setText(String.valueOf(getDefaultValue())); } + if(isReloadOnChange()) reloadSettings(); } @Override @@ -225,6 +282,66 @@ public class settingsFragment extends Fragment { } } + public class TallySettingsItem extends SettingsItem { + private int max; + + public TallySettingsItem(String key, String title, int max) { + super(key, title, prefs.getInt(key, (int) defaults.get(key))); + this.max = max; + } + + TallyCounterView tally; + private boolean enabled; + + @Override + public void setEnabled(boolean enabled){ + this.enabled = enabled; + if(tally != null) + tally.setEnabled(enabled); + } + + @Override + public View createView(Context context) { + LinearLayout ll = new LinearLayout(getContext()); + ll.setOrientation(LinearLayout.VERTICAL); + + tally = new TallyCounterView(getContext()); + + int value = getValue()+1; + if(value >= max){ + value = max; + getEditor().putInt(getKey(), max-1).apply(); + } + + tally.setValue(value); + tally.setBounds(1, max); + + tally.setOnCountChangedListener(count -> { + getEditor().putInt(getKey(), count-1).apply(); + if(isReloadOnChange()) reloadSettings(); + }); + tally.setEnabled(enabled); + + TextView tv = new TextView(getContext()); + tv.setText(getTitle()); + tv.setTextAppearance(com.google.android.material.R.style.TextAppearance_MaterialComponents_Headline6); + tv.setGravity(Gravity.CENTER); + ll.addView(tv); + + ll.addView(tally); + + + + + return ll; + } + + @Override + public Integer getValue() { + return prefs.getInt(getKey(), (int) defaults.get(getKey())); + } + } + public class DropdownSettingsItem extends SettingsItem { private String[] options; @@ -257,6 +374,7 @@ public class settingsFragment extends Fragment { dropdown.setOnClickListener((item, index) -> { getEditor().putString(getKey(), item).apply(); + if(isReloadOnChange()) reloadSettings(); }); return dropdown; @@ -297,6 +415,7 @@ public class settingsFragment extends Fragment { for (SettingsItem item : controlledItems) { item.setEnabled(isChecked); } + if(isReloadOnChange()) reloadSettings(); }); for (SettingsItem item : controlledItems) { @@ -337,7 +456,11 @@ public class settingsFragment extends Fragment { itemContainer.setOrientation(LinearLayout.VERTICAL); itemContainer.setPadding(32, 0, 32, 8); - itemContainer.addView(item.createView(context)); + View view = item.createView(context); + itemContainer.addView(view); + + item.view = view; + views.add(itemContainer); } diff --git a/app/src/main/java/com/ridgebotics/ridgescout/ui/transfer/FTPSync.java b/app/src/main/java/com/ridgebotics/ridgescout/ui/transfer/FTPSync.java index e724047..ff4e75b 100644 --- a/app/src/main/java/com/ridgebotics/ridgescout/ui/transfer/FTPSync.java +++ b/app/src/main/java/com/ridgebotics/ridgescout/ui/transfer/FTPSync.java @@ -4,7 +4,6 @@ package com.ridgebotics.ridgescout.ui.transfer; import static com.ridgebotics.ridgescout.utility.DataManager.evcode; import static com.ridgebotics.ridgescout.utility.fileEditor.baseDir; -import com.ridgebotics.ridgescout.ui.data.FieldEditorHelper; import com.ridgebotics.ridgescout.utility.AlertManager; import com.ridgebotics.ridgescout.utility.BuiltByteParser; import com.ridgebotics.ridgescout.utility.ByteBuilder; @@ -13,25 +12,20 @@ import com.ridgebotics.ridgescout.utility.settingsManager; import org.apache.commons.net.ftp.FTP; import org.apache.commons.net.ftp.FTPClient; -import org.apache.commons.net.ftp.FTPCmd; import org.apache.commons.net.ftp.FTPFile; -import org.apache.commons.net.ftp.FTPReply; import java.io.File; import java.io.FileInputStream; -import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; import java.net.InetAddress; import java.util.Arrays; -import java.util.Calendar; import java.util.Date; import java.util.HashMap; import java.util.Iterator; import java.util.List; import java.util.Map; import java.util.Set; -import java.util.TimeZone; public class FTPSync extends Thread { public static final String remoteBasePath = "/RidgeScout/"; diff --git a/app/src/main/res/layout/fragment_data.xml b/app/src/main/res/layout/fragment_data.xml index 33c2348..aa8cf79 100644 --- a/app/src/main/res/layout/fragment_data.xml +++ b/app/src/main/res/layout/fragment_data.xml @@ -27,17 +27,6 @@ app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toTopOf="parent"> -