From cf3856805b54aff04bd6408427495cff5edec1da Mon Sep 17 00:00:00 2001 From: Michael Mikovsky <77305074+Astatin3@users.noreply.github.com> Date: Mon, 17 Feb 2025 22:47:39 -0700 Subject: [PATCH] Rework some UI elements --- 2024week0-1728149849985.scoutbundle | Bin 8123 -> 0 bytes TODO.md | 6 +- .../ridgescout/scoutingData/fields.java | 37 ++++---- .../ridgescout/types/input/checkboxType.java | 11 ++- .../ridgescout/types/input/dropdownType.java | 12 ++- .../ridgescout/types/input/fieldposType.java | 9 +- .../ridgescout/types/input/inputType.java | 4 +- .../ridgescout/types/input/numberType.java | 8 +- .../ridgescout/types/input/sliderType.java | 14 +-- .../ridgescout/types/input/tallyType.java | 8 +- .../ridgescout/types/input/textType.java | 10 +- .../ui/CustomSpinnerOptionsAdapter.java | 56 ----------- .../ridgescout/ui/CustomSpinnerPopup.java | 20 +--- .../ridgescout/ui/CustomSpinnerView.java | 21 +++-- .../ridgescout/ui/ToggleTitleView.java | 88 ++++++++++++++++++ .../ridgescout/ui/data/FieldEditorHelper.java | 43 ++++++--- .../ridgescout/ui/data/FieldsFragment.java | 3 +- .../ridgescout/ui/data/TeamsFragment.java | 52 +++-------- ...StatusFragment.java => EventFragment.java} | 12 +-- .../ui/scouting/MatchScoutingFragment.java | 53 ++++++----- .../ui/scouting/PitScoutingFragment.java | 42 ++++----- .../ui/scouting/ScoutingFragment.java | 27 ++---- .../ui/settings/settingsFragment.java | 2 +- .../ridgescout/ui/transfer/TBAFragment.java | 6 +- .../ridgescout/utility/DataManager.java | 20 ++-- app/src/main/res/drawable/background.png | Bin 570 -> 997 bytes app/src/main/res/layout/fragment_scouting.xml | 10 +- ...status.xml => fragment_scouting_event.xml} | 0 .../res/layout/view_custom_spinner_option.xml | 19 ---- .../res/layout/view_custom_spinner_popup.xml | 25 ----- app/src/main/res/layout/view_toggle_title.xml | 40 ++++++++ .../main/res/navigation/mobile_navigation.xml | 6 +- 32 files changed, 352 insertions(+), 312 deletions(-) delete mode 100644 2024week0-1728149849985.scoutbundle delete mode 100644 app/src/main/java/com/ridgebotics/ridgescout/ui/CustomSpinnerOptionsAdapter.java create mode 100644 app/src/main/java/com/ridgebotics/ridgescout/ui/ToggleTitleView.java rename app/src/main/java/com/ridgebotics/ridgescout/ui/scouting/{StatusFragment.java => EventFragment.java} (94%) rename app/src/main/res/layout/{fragment_scouting_status.xml => fragment_scouting_event.xml} (100%) delete mode 100644 app/src/main/res/layout/view_custom_spinner_option.xml delete mode 100644 app/src/main/res/layout/view_custom_spinner_popup.xml create mode 100644 app/src/main/res/layout/view_toggle_title.xml diff --git a/2024week0-1728149849985.scoutbundle b/2024week0-1728149849985.scoutbundle deleted file mode 100644 index 7927e5da48b03eef2f5640f3d3405761ba248dc9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8123 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 RD>YIlBOmDm0v?p?{vZ7z?}PvV diff --git a/TODO.md b/TODO.md index 296dd5c..6873cdb 100644 --- a/TODO.md +++ b/TODO.md @@ -7,14 +7,18 @@ - Test new FTP thing - UUIDs instead of names for the fields - Fix data storage crashes +- Match selector instead of list for individual team views ### In Progress: ##### Scouting: +- Make scouting UI look much better ##### Data Analysis: ##### Functionality: ### Done: ##### Scouting: +- Description for fields ##### Data Analysis: ##### Functionality: -- "Send Meta Files" button \ No newline at end of file +- "Send Meta Files" button +- Year selector \ No newline at end of file diff --git a/app/src/main/java/com/ridgebotics/ridgescout/scoutingData/fields.java b/app/src/main/java/com/ridgebotics/ridgescout/scoutingData/fields.java index 2aedf5f..1bfde04 100644 --- a/app/src/main/java/com/ridgebotics/ridgescout/scoutingData/fields.java +++ b/app/src/main/java/com/ridgebotics/ridgescout/scoutingData/fields.java @@ -23,27 +23,32 @@ public class fields { public static final inputType[][] default_match_fields = new inputType[][] { { - new fieldposType("Auto start pos", new int[]{0,0}), - new tallyType("Auto Notes", 0), - new sliderType("Auto Performance", 5, 0, 10), - new textType("Auto Comments", ""), - new tallyType("Teleop Notes", 0), - new sliderType("Teleop Performance", 5, 0, 10), - new textType("Teleop Comments", ""), - new sliderType("Overall Driving Performance", 5, 0, 10), - new textType("Overall Driving Comments", ""), - new sliderType("Score area (AMP <-> Speaker)", 5, 0, 10), - new dropdownType("End Condition", new String[]{"Nothing", "Attempted Climb", "Successful Climbed", "Climbed with multiple robots", "Climbed with trap"}, 0), - new dropdownType("Robot Condition", new String[]{"Everything was working", "Something was maybe broken", "Something was broken", "Robot was disabled for part of the match", "Missing robot (Joe Johnson)"}, 0), - new textType("Other Comments", "") + new fieldposType("Auto start pos", "Where does the robot start its auto?", new int[]{0,0}), + new tallyType("Auto Coral", "How many coral did this robot score in auto?", 0), + new tallyType("Auto Algae", "How many algae did this robot score in auto?", 0), + new sliderType("Auto Performance", "How well did you think this robot did in auto?", 5, 0, 10), + new textType("Auto Comments", "Anything interesting about auto", ""), + new tallyType("Teleop Coral", "How many coral did this robot score in teleop?", 0), + new tallyType("Teleop Algae", "How many algae did this robot score in teleop?", 0), + new checkboxType("Coral Removal", "Did the robot remove coral?", 0), + new checkboxType("L4 Scoring", "Did the robot score in Layer 4?", 0), + new checkboxType("L3 Scoring", "Did the robot score in Layer 3?", 0), + new checkboxType("L2 Scoring", "Did the robot score in Layer 3?", 0), + new checkboxType("L1 Scoring", "Did the robot score in Layer 1?", 0), + new checkboxType("Processor Scoring", "Did the robot score in the processor?", 0), + new sliderType("Teleop Performance", "How well did the robot drive around?", 5, 0, 10), + new textType("Teleop Notes", "Anything intresting about Teleop", ""), + new dropdownType("End Condition", "What was the final condition of the robot?", new String[]{"Nothing", "Park", "Attempted Shallow", "Shallow", "Attempted Deep", "Deep"}, 0), + new dropdownType("Robot Condition", "Was anything broken?", new String[]{"Everything was working", "Something was maybe broken", "Something was broken", "Robot was disabled for part of the match", "Missing robot (Joe Johnson)"}, 0), + new textType("Other Comments", "Any other comments you have", "") } }; public static final inputType[][] default_pit_fields = new inputType[][] { { - new sliderType("How good is robot", 5, 0, 10), - new sliderType("Test", 1, 0, 10), - new textType("notes", ""), + new sliderType("How good is robot", "How good, in fact, is this robot?", 5, 0, 10), + new sliderType("Test", "Testy", 1, 0, 10), + new textType("notes", "Write text about robot here", ""), } }; diff --git a/app/src/main/java/com/ridgebotics/ridgescout/types/input/checkboxType.java b/app/src/main/java/com/ridgebotics/ridgescout/types/input/checkboxType.java index 692cc22..a44e7a4 100644 --- a/app/src/main/java/com/ridgebotics/ridgescout/types/input/checkboxType.java +++ b/app/src/main/java/com/ridgebotics/ridgescout/types/input/checkboxType.java @@ -41,8 +41,8 @@ public class checkboxType extends inputType { public Object get_fallback_value(){return 0;} public checkboxType(){}; public String get_type_name(){return "Checkbox";} - public checkboxType(String name, int isChecked){ - super(name); + public checkboxType(String name, String description, int isChecked){ + super(name, description); this.default_value = isChecked; } @@ -50,6 +50,7 @@ public class checkboxType extends inputType { public byte[] encode() throws ByteBuilder.buildingException { ByteBuilder bb = new ByteBuilder(); bb.addString(name); + bb.addString(description); bb.addInt((int)default_value); return bb.build(); } @@ -58,7 +59,8 @@ public class checkboxType extends inputType { ArrayList objects = bbp.parse(); name = (String) objects.get(0).get(); - default_value = objects.get(1).get(); + description = (String) objects.get(1).get(); + default_value = objects.get(2).get(); } // public PowerSpinnerView dropdown = null; @@ -68,7 +70,7 @@ public class checkboxType extends inputType { public View createView(Context context, Function onUpdate){ checkBox = new CheckBox(context); checkBox.setText(name); - checkBox.setTextSize(24); + setViewValue(default_value); checkBox.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() { @Override @@ -110,6 +112,7 @@ public class checkboxType extends inputType { public void add_individual_view(LinearLayout parent, dataType data){ if(data.isNull()) return; CheckBox cb = new CheckBox(parent.getContext()); + cb.setTextAppearance(com.google.android.material.R.style.TextAppearance_MaterialComponents_Headline1); cb.setText(name); cb.setChecked((int) data.get() == 1); cb.setEnabled(false); diff --git a/app/src/main/java/com/ridgebotics/ridgescout/types/input/dropdownType.java b/app/src/main/java/com/ridgebotics/ridgescout/types/input/dropdownType.java index 08cd7ab..928a8fa 100644 --- a/app/src/main/java/com/ridgebotics/ridgescout/types/input/dropdownType.java +++ b/app/src/main/java/com/ridgebotics/ridgescout/types/input/dropdownType.java @@ -42,8 +42,8 @@ public class dropdownType extends inputType { public Object get_fallback_value(){return 0;} public dropdownType(){}; public String get_type_name(){return "Dropdown";} - public dropdownType(String name, String[] text_options, int defaultSelIndex){ - super(name); + public dropdownType(String name, String description, String[] text_options, int defaultSelIndex){ + super(name, description); this.text_options = text_options; this.default_value = defaultSelIndex; } @@ -52,6 +52,7 @@ public class dropdownType extends inputType { public byte[] encode() throws ByteBuilder.buildingException { ByteBuilder bb = new ByteBuilder(); bb.addString(name); + bb.addString(description); bb.addInt((int)default_value); bb.addStringArray(text_options); return bb.build(); @@ -61,8 +62,9 @@ public class dropdownType extends inputType { ArrayList objects = bbp.parse(); name = (String) objects.get(0).get(); - default_value = objects.get(1).get(); - text_options = (String[]) objects.get(2).get(); + description = (String) objects.get(1).get(); + default_value = objects.get(2).get(); + text_options = (String[]) objects.get(3).get(); } public CustomSpinnerView dropdown = null; @@ -73,7 +75,7 @@ public class dropdownType extends inputType { ArrayList iconSpinnerItems = new ArrayList<>(Arrays.asList(text_options)); dropdown.setTitle(name); - dropdown.setOptions(iconSpinnerItems); + dropdown.setOptions(iconSpinnerItems, (int) default_value); onUpdate.apply(getViewValue()); dropdown.setOnClickListener((item, index) -> onUpdate.apply(getViewValue())); diff --git a/app/src/main/java/com/ridgebotics/ridgescout/types/input/fieldposType.java b/app/src/main/java/com/ridgebotics/ridgescout/types/input/fieldposType.java index 1fccc89..51358da 100644 --- a/app/src/main/java/com/ridgebotics/ridgescout/types/input/fieldposType.java +++ b/app/src/main/java/com/ridgebotics/ridgescout/types/input/fieldposType.java @@ -40,8 +40,8 @@ public class fieldposType extends inputType { public Object get_fallback_value(){return 0;} public fieldposType(){} public String get_type_name(){return "Field Pos";} - public fieldposType(String name, int[] default_value){ - super(name); + public fieldposType(String name, String description, int[] default_value){ + super(name, description); this.default_value = default_value; } @@ -52,6 +52,7 @@ public class fieldposType extends inputType { public byte[] encode() throws ByteBuilder.buildingException { ByteBuilder bb = new ByteBuilder(); bb.addString(name); + bb.addString(description); bb.addIntArray((int[]) default_value); return bb.build(); } @@ -61,8 +62,8 @@ public class fieldposType extends inputType { ArrayList objects = bbp.parse(); name = (String) objects.get(0).get(); - default_value = objects.get(1).get(); - System.out.println("Defalt value!!!!!" + default_value); + description = (String) objects.get(1).get(); + default_value = objects.get(2).get(); } diff --git a/app/src/main/java/com/ridgebotics/ridgescout/types/input/inputType.java b/app/src/main/java/com/ridgebotics/ridgescout/types/input/inputType.java index 38e36f1..305a105 100644 --- a/app/src/main/java/com/ridgebotics/ridgescout/types/input/inputType.java +++ b/app/src/main/java/com/ridgebotics/ridgescout/types/input/inputType.java @@ -30,14 +30,16 @@ public abstract class inputType { FIELDPOS } public String name; + public String description; public Object default_value; public abstract inputTypes getInputType(); public abstract dataType.valueTypes getValueType(); public abstract Object get_fallback_value(); public abstract int get_byte_id(); public inputType(){} - public inputType(String name){ + public inputType(String name, String description){ this.name = name; + this.description = description; } public abstract String get_type_name(); diff --git a/app/src/main/java/com/ridgebotics/ridgescout/types/input/numberType.java b/app/src/main/java/com/ridgebotics/ridgescout/types/input/numberType.java index 8c869ed..b0dab60 100644 --- a/app/src/main/java/com/ridgebotics/ridgescout/types/input/numberType.java +++ b/app/src/main/java/com/ridgebotics/ridgescout/types/input/numberType.java @@ -36,8 +36,8 @@ public class numberType extends inputType { public Object get_fallback_value(){return 0;} public numberType(){} public String get_type_name(){return "Number";} - public numberType(String name, int default_value){ - super(name); + public numberType(String name, String description, int default_value){ + super(name, description); this.default_value = default_value; } @@ -48,6 +48,7 @@ public class numberType extends inputType { public byte[] encode() throws ByteBuilder.buildingException { ByteBuilder bb = new ByteBuilder(); bb.addString(name); + bb.addString(description); bb.addInt((int)default_value); return bb.build(); } @@ -56,7 +57,8 @@ public class numberType extends inputType { ArrayList objects = bbp.parse(); name = (String) objects.get(0).get(); - default_value = objects.get(1).get(); + description = (String) objects.get(1).get(); + default_value = objects.get(2).get(); } diff --git a/app/src/main/java/com/ridgebotics/ridgescout/types/input/sliderType.java b/app/src/main/java/com/ridgebotics/ridgescout/types/input/sliderType.java index d58e273..c3d443a 100644 --- a/app/src/main/java/com/ridgebotics/ridgescout/types/input/sliderType.java +++ b/app/src/main/java/com/ridgebotics/ridgescout/types/input/sliderType.java @@ -36,8 +36,8 @@ public class sliderType extends inputType { public Object get_fallback_value(){return 0;} public sliderType(){}; public String get_type_name(){return "Slider";} - public sliderType(String name, int defaultValue, int min, int max){ - super(name); + public sliderType(String name, String description, int defaultValue, int min, int max){ + super(name, description); this.default_value = defaultValue; this.min = min; this.max = max; @@ -49,6 +49,7 @@ public class sliderType extends inputType { public byte[] encode() throws ByteBuilder.buildingException { ByteBuilder bb = new ByteBuilder(); bb.addString(name); + bb.addString(description); bb.addInt((int)default_value); bb.addInt(min); bb.addInt(max); @@ -58,10 +59,11 @@ public class sliderType extends inputType { BuiltByteParser bbp = new BuiltByteParser(bytes); ArrayList objects = bbp.parse(); - name = (String) objects.get(0).get(); - default_value = objects.get(1).get(); - min = (int) objects.get(2).get(); - max = (int) objects.get(3).get(); + name = (String) objects.get(0).get(); + description = (String) objects.get(1).get(); + default_value = objects.get(2).get(); + min = (int) objects.get(3).get(); + max = (int) objects.get(4).get(); } diff --git a/app/src/main/java/com/ridgebotics/ridgescout/types/input/tallyType.java b/app/src/main/java/com/ridgebotics/ridgescout/types/input/tallyType.java index 10aaa39..ba2aac6 100644 --- a/app/src/main/java/com/ridgebotics/ridgescout/types/input/tallyType.java +++ b/app/src/main/java/com/ridgebotics/ridgescout/types/input/tallyType.java @@ -32,8 +32,8 @@ public class tallyType extends inputType { public Object get_fallback_value(){return 0;} public tallyType(){} public String get_type_name(){return "Tally";} - public tallyType(String name, int default_value){ - super(name); + public tallyType(String name, String description, int default_value){ + super(name, description); this.default_value = default_value; } @@ -44,6 +44,7 @@ public class tallyType extends inputType { public byte[] encode() throws ByteBuilder.buildingException { ByteBuilder bb = new ByteBuilder(); bb.addString(name); + bb.addString(description); bb.addInt((int)default_value); return bb.build(); } @@ -52,7 +53,8 @@ public class tallyType extends inputType { ArrayList objects = bbp.parse(); name = (String) objects.get(0).get(); - default_value = objects.get(1).get(); + description = (String) objects.get(1).get(); + default_value = objects.get(2).get(); } diff --git a/app/src/main/java/com/ridgebotics/ridgescout/types/input/textType.java b/app/src/main/java/com/ridgebotics/ridgescout/types/input/textType.java index f37b327..30247c8 100644 --- a/app/src/main/java/com/ridgebotics/ridgescout/types/input/textType.java +++ b/app/src/main/java/com/ridgebotics/ridgescout/types/input/textType.java @@ -35,8 +35,8 @@ public class textType extends inputType { public dataType.valueTypes getValueType(){return dataType.valueTypes.STRING;} public Object get_fallback_value(){return "";} public textType(){} - public textType(String name, String default_text){ - super(name); + public textType(String name, String description, String default_text){ + super(name, description); this.default_value = default_text; } public String get_type_name(){return "Text";} @@ -50,6 +50,7 @@ public class textType extends inputType { public byte[] encode() throws ByteBuilder.buildingException { ByteBuilder bb = new ByteBuilder(); bb.addString(name); + bb.addString(description); bb.addString((String) default_value); return bb.build(); } @@ -57,8 +58,9 @@ public class textType extends inputType { BuiltByteParser bbp = new BuiltByteParser(bytes); ArrayList objects = bbp.parse(); - name = (String) objects.get(0).get(); - default_value = objects.get(1).get(); + name = (String) objects.get(0).get(); + description = (String) objects.get(1).get(); + default_value = objects.get(2).get(); } diff --git a/app/src/main/java/com/ridgebotics/ridgescout/ui/CustomSpinnerOptionsAdapter.java b/app/src/main/java/com/ridgebotics/ridgescout/ui/CustomSpinnerOptionsAdapter.java deleted file mode 100644 index 5cffbb1..0000000 --- a/app/src/main/java/com/ridgebotics/ridgescout/ui/CustomSpinnerOptionsAdapter.java +++ /dev/null @@ -1,56 +0,0 @@ -package com.ridgebotics.ridgescout.ui; - -import android.view.LayoutInflater; -import android.view.View; -import android.view.ViewGroup; -import android.widget.TextView; - -import androidx.annotation.NonNull; -import androidx.recyclerview.widget.RecyclerView; - -import com.ridgebotics.ridgescout.R; - -import java.util.List; - -public class CustomSpinnerOptionsAdapter extends RecyclerView.Adapter { - private List options; - private OnItemClickListener listener; - - public interface OnItemClickListener { - void onItemClick(String option); - } - - public CustomSpinnerOptionsAdapter(List options, OnItemClickListener listener) { - this.options = options; - this.listener = listener; - } - - @NonNull - @Override - public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) { - View view = LayoutInflater.from(parent.getContext()) - .inflate(R.layout.view_custom_spinner_option, parent, false); - return new ViewHolder(view); - } - - @Override - public void onBindViewHolder(@NonNull ViewHolder holder, int position) { - String option = options.get(position); - holder.textView.setText(option); - holder.itemView.setOnClickListener(v -> listener.onItemClick(option)); - } - - @Override - public int getItemCount() { - return options.size(); - } - - static class ViewHolder extends RecyclerView.ViewHolder { - TextView textView; - - ViewHolder(View itemView) { - super(itemView); - textView = itemView.findViewById(R.id.textView); - } - } -} \ No newline at end of file diff --git a/app/src/main/java/com/ridgebotics/ridgescout/ui/CustomSpinnerPopup.java b/app/src/main/java/com/ridgebotics/ridgescout/ui/CustomSpinnerPopup.java index 4c96404..62d7aaf 100644 --- a/app/src/main/java/com/ridgebotics/ridgescout/ui/CustomSpinnerPopup.java +++ b/app/src/main/java/com/ridgebotics/ridgescout/ui/CustomSpinnerPopup.java @@ -25,10 +25,6 @@ import java.util.ArrayList; import java.util.List; public class CustomSpinnerPopup extends TableLayout { - private List options; - private OnOptionSelectedListener listener; - private RecyclerView recyclerView; - private CustomSpinnerOptionsAdapter adapter; public CustomSpinnerPopup(Context context) { super(context); @@ -42,20 +38,17 @@ public class CustomSpinnerPopup extends TableLayout { void onOptionSelected(String option); } -// private int selectedIndex = -1; -// public void setValue() - - - public CustomSpinnerPopup init(List options, OnOptionSelectedListener onOptionSelectedListener){ + public CustomSpinnerPopup init(List options, OnOptionSelectedListener onOptionSelectedListener, int defaultOption){ CheckBox[] checkBoxes = new CheckBox[options.size()]; setPadding(16, 16, 16, 16); for(int i = 0; i < options.size(); i++){ final CheckBox cb = new CheckBox(getContext()); cb.setText(options.get(i)); cb.setTextAppearance(com.google.android.material.R.style.TextAppearance_MaterialComponents_Headline5); + cb.setChecked(i == defaultOption); - addView(new MaterialDivider(getContext())); -// cb.margin + if(i > 0) + addView(new MaterialDivider(getContext())); addView(cb); checkBoxes[i] = cb; @@ -66,8 +59,6 @@ public class CustomSpinnerPopup extends TableLayout { for (CheckBox checkBox : checkBoxes) checkBox.setChecked(false); cb.setChecked(true); - - }); } @@ -119,9 +110,6 @@ public class CustomSpinnerPopup extends TableLayout { // return view; // } // - public void setOnOptionSelectedListener(OnOptionSelectedListener listener) { - this.listener = listener; - } diff --git a/app/src/main/java/com/ridgebotics/ridgescout/ui/CustomSpinnerView.java b/app/src/main/java/com/ridgebotics/ridgescout/ui/CustomSpinnerView.java index 5fb7e9a..8030755 100644 --- a/app/src/main/java/com/ridgebotics/ridgescout/ui/CustomSpinnerView.java +++ b/app/src/main/java/com/ridgebotics/ridgescout/ui/CustomSpinnerView.java @@ -39,10 +39,7 @@ public class CustomSpinnerView extends LinearLayout { init(context); } - private ViewCustomSpinnerBinding binding; - private List options; - private CustomSpinnerPopup dialog; private onClickListener onClickListener; private TextView title; @@ -61,9 +58,17 @@ public class CustomSpinnerView extends LinearLayout { this.onClickListener = listener; } - public void setOptions(List options){ + + public void setOptions(List options, String defaultOption){ + setOptions(options, options.indexOf(defaultOption)); + } + + public void setOptions(List options, int defaultOption){ this.options = options; -// dialog = CustomSpinnerPopup.newInstance(options); + this.index = defaultOption; + + if(defaultOption != -1) + this.item.setText(options.get(defaultOption)); AlertDialog.Builder builder = new AlertDialog.Builder(getContext()); @@ -76,7 +81,7 @@ public class CustomSpinnerView extends LinearLayout { onClickListener.onClick(option, options.indexOf(option)); index = options.indexOf(option); } - }); + }, index); popup.setLayoutDirection(0); builder.setView(popup); AlertDialog dialog = builder.create(); @@ -96,10 +101,12 @@ public class CustomSpinnerView extends LinearLayout { public void setOption(String option) { item.setText(option); + index = options.indexOf(option); } public void setOption(int index) { - setOption(options.get(index)); + item.setText(options.get(index)); + this.index = index; } public int getIndex(){ diff --git a/app/src/main/java/com/ridgebotics/ridgescout/ui/ToggleTitleView.java b/app/src/main/java/com/ridgebotics/ridgescout/ui/ToggleTitleView.java new file mode 100644 index 0000000..9cda503 --- /dev/null +++ b/app/src/main/java/com/ridgebotics/ridgescout/ui/ToggleTitleView.java @@ -0,0 +1,88 @@ +package com.ridgebotics.ridgescout.ui; + +import android.content.Context; +import android.util.AttributeSet; +import android.view.LayoutInflater; +import android.view.View; +import android.widget.CheckBox; +import android.widget.CompoundButton; +import android.widget.TextView; + +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; +import androidx.constraintlayout.widget.ConstraintLayout; + +import com.ridgebotics.ridgescout.R; + +public class ToggleTitleView extends ConstraintLayout { + public ToggleTitleView(@NonNull Context context, @Nullable AttributeSet attrs) { + super(context, attrs); + init(context); + } + + public ToggleTitleView(@NonNull Context context) { + super(context); + init(context); + } + + public interface OnToggleListener { + void onToggle(boolean enabled); + } + + TextView titleView; + CheckBox toggle_title_checkbox; + TextView toggle_title_description; + OnToggleListener onToggleListener; + + + private static final int default_text_color = 0xffffffff; + + public void init(Context context){ + LayoutInflater.from(context).inflate(R.layout.view_toggle_title, this, true); + + titleView = findViewById(R.id.toggle_title); + toggle_title_checkbox = findViewById(R.id.toggle_title_checkbox); + toggle_title_description = findViewById(R.id.toggle_title_description); + + toggle_title_checkbox.setOnCheckedChangeListener((compoundButton, checked) -> { + if(checked) + enable(); + else + disable(); + + onToggleListener.onToggle(!checked); + }); + } + + public void setTitle(String title){ + titleView.setText(title); + } + + public void setDescription(String description){ + toggle_title_description.setText(description); + } + + public void setOnToggleListener(OnToggleListener onToggleListener){ + this.onToggleListener = onToggleListener; + } + + public boolean enabled = true; + + public boolean isEnabled(){return enabled;} + + public void disable(){ + enabled = false; + toggle_title_checkbox.setChecked(false); + toggle_title_description.setVisibility(View.GONE); + setBackgroundColor(0xffff0000); + titleView.setTextColor(0xff000000); + } + public void enable(){ + enabled = true; + toggle_title_checkbox.setChecked(true); + toggle_title_description.setVisibility(View.VISIBLE); + setBackgroundColor(0x00000000); + titleView.setTextAppearance(com.google.android.material.R.style.TextAppearance_MaterialComponents_Headline5); +// titleView.setTextAppearance(com.google.android.material.R.style.TextAppearance_MaterialComponents_Headline5); + } +} diff --git a/app/src/main/java/com/ridgebotics/ridgescout/ui/data/FieldEditorHelper.java b/app/src/main/java/com/ridgebotics/ridgescout/ui/data/FieldEditorHelper.java index 2dea62d..fad663f 100644 --- a/app/src/main/java/com/ridgebotics/ridgescout/ui/data/FieldEditorHelper.java +++ b/app/src/main/java/com/ridgebotics/ridgescout/ui/data/FieldEditorHelper.java @@ -68,27 +68,34 @@ public class FieldEditorHelper { // } public static final parameterType[] defaultSliderParams = new parameterType[]{ + new paramString("Description", ""), new paramNumber("Min", 0), new paramNumber("Max", 10), new paramNumber("Default Value", 5) }; public static final parameterType[] defaultDropdownParams = new parameterType[]{ + new paramString("Description", ""), new paramStringArray("Default Value", new String[]{"Zero","One","Two","Three"}), new paramNumber("Default Option", 0), }; public static final parameterType[] defaultTextParams = new parameterType[]{ + new paramString("Description", ""), new paramString("Default Value", "") }; public static final parameterType[] defaultTallyParams = new parameterType[]{ + new paramString("Description", ""), new paramNumber("Default Value", 0) }; public static final parameterType[] defaultNumberParams = new parameterType[]{ + new paramString("Description", ""), new paramNumber("Default Value", 0) }; public static final parameterType[] defaultCheckboxParam = new parameterType[]{ + new paramString("Description", ""), new paramNumber("Default Value ( 1 or 0 )", 0) }; public static final parameterType[] defaultFieldPosParam = new parameterType[]{ + new paramString("Description", ""), new paramNumber("Default X", 0), new paramNumber("Default Y", 0) }; @@ -96,6 +103,7 @@ public class FieldEditorHelper { private static parameterType[] getSliderParams(sliderType s){ return new parameterType[]{ + new paramString("Description", s.description), new paramNumber("Min", s.min), new paramNumber("Max", s.max), new paramNumber("Default Value", (int) s.default_value) @@ -104,6 +112,7 @@ public class FieldEditorHelper { private static parameterType[] getDropdownParams(dropdownType s){ return new parameterType[]{ + new paramString("Description", s.description), new paramStringArray("Default Value",s.text_options), new paramNumber("Default Option", (int) s.default_value), }; @@ -111,30 +120,35 @@ public class FieldEditorHelper { private static parameterType[] getTextParams(textType s){ return new parameterType[]{ + new paramString("Description", s.description), new paramString("Default Value", (String) s.default_value) }; } private static parameterType[] getTallyParams(tallyType s){ return new parameterType[]{ + new paramString("Description", s.description), new paramNumber("Default Value", (int) s.default_value) }; } private static parameterType[] getNumberParams(numberType s){ return new parameterType[]{ + new paramString("Description", s.description), new paramNumber("Default Value", (int) s.default_value) }; } private static parameterType[] getCheckboxParam(checkboxType s){ return new parameterType[]{ + new paramString("Description", s.description), new paramNumber("Default Value ( 1 or 0 )", (int) s.default_value) }; } private static parameterType[] getFieldPosParam(fieldposType s){ return new parameterType[]{ + new paramString("Description", s.description), new paramNumber("Default X", ((int[]) s.default_value)[0]), new paramNumber("Default Y", ((int[]) s.default_value)[1]) }; @@ -143,36 +157,43 @@ public class FieldEditorHelper { public static void setSliderParams(sliderType s, parameterType[] types){ - s.min = ((paramNumber) types[0]).val; - s.max = ((paramNumber) types[1]).val; - s.default_value = ((paramNumber) types[2]).val; + s.description = ((paramString) types[0]).val; + s.min = ((paramNumber) types[1]).val; + s.max = ((paramNumber) types[2]).val; + s.default_value = ((paramNumber) types[3]).val; } public static void setDropdownParams(dropdownType s, parameterType[] types){ - s.text_options = ((paramStringArray) types[0]).val; - s.default_value = ((paramNumber) types[1]).val; + s.description = ((paramString) types[0]).val; + s.text_options = ((paramStringArray) types[1]).val; + s.default_value = ((paramNumber) types[2]).val; } public static void setTextParams(textType s, parameterType[] types){ - s.default_value = ((paramString) types[0]).val; + s.description = ((paramString) types[0]).val; + s.default_value = ((paramString) types[1]).val; } public static void setTallyParams(tallyType s, parameterType[] types){ - s.default_value = ((paramNumber) types[0]).val; + s.description = ((paramString) types[0]).val; + s.default_value = ((paramNumber) types[1]).val; } public static void setNumberParams(numberType s, parameterType[] types){ - s.default_value = ((paramNumber) types[0]).val; + s.description = ((paramString) types[0]).val; + s.default_value = ((paramNumber) types[1]).val; } public static void setCheckboxParam(checkboxType s, parameterType[] types){ - s.default_value = ((paramNumber) types[0]).val; + s.description = ((paramString) types[0]).val; + s.default_value = ((paramNumber) types[1]).val; } public static void setFieldPosParam(fieldposType s, parameterType[] types){ + s.description = ((paramString) types[0]).val; s.default_value = new int[]{ - ((paramNumber) types[0]).val, - ((paramNumber) types[1]).val + ((paramNumber) types[1]).val, + ((paramNumber) types[2]).val }; } diff --git a/app/src/main/java/com/ridgebotics/ridgescout/ui/data/FieldsFragment.java b/app/src/main/java/com/ridgebotics/ridgescout/ui/data/FieldsFragment.java index 3539603..6a681d5 100644 --- a/app/src/main/java/com/ridgebotics/ridgescout/ui/data/FieldsFragment.java +++ b/app/src/main/java/com/ridgebotics/ridgescout/ui/data/FieldsFragment.java @@ -411,9 +411,8 @@ public class FieldsFragment extends Fragment { options.add("Checkbox"); options.add("Field Position"); - dropdown.setOptions(options); + dropdown.setOptions(options, 0); dropdown.setTitle("Type"); - dropdown.setOption(0); builder.setView(dropdown); diff --git a/app/src/main/java/com/ridgebotics/ridgescout/ui/data/TeamsFragment.java b/app/src/main/java/com/ridgebotics/ridgescout/ui/data/TeamsFragment.java index 60bbab3..fc8a022 100644 --- a/app/src/main/java/com/ridgebotics/ridgescout/ui/data/TeamsFragment.java +++ b/app/src/main/java/com/ridgebotics/ridgescout/ui/data/TeamsFragment.java @@ -22,6 +22,7 @@ import androidx.annotation.NonNull; import androidx.annotation.Nullable; import androidx.fragment.app.Fragment; +import com.ridgebotics.ridgescout.ui.CustomSpinnerView; import com.ridgebotics.ridgescout.utility.AlertManager; import com.ridgebotics.ridgescout.utility.settingsManager; import com.ridgebotics.ridgescout.databinding.FragmentDataTeamsBinding; @@ -78,48 +79,23 @@ public class TeamsFragment extends Fragment { -// PowerSpinnerView dropdown = new PowerSpinnerView(getContext()); -// -// List iconSpinnerItems = new ArrayList<>(); -// -// iconSpinnerItems.add(new IconSpinnerItem("Individual")); -// iconSpinnerItems.add(new IconSpinnerItem("Compiled")); -// iconSpinnerItems.add(new IconSpinnerItem("History")); -// -// IconSpinnerAdapter iconSpinnerAdapter = new IconSpinnerAdapter(dropdown); -// dropdown.setSpinnerAdapter(iconSpinnerAdapter); -// dropdown.setItems(iconSpinnerItems); -// -// dropdown.selectItemByIndex(0); -// -// dropdown.setPadding(10,20,10,20); -// dropdown.setBackgroundColor(0xf0000000); -// dropdown.setTextColor(0xff00ff00); -// dropdown.setTextSize(15); -// dropdown.setArrowGravity(SpinnerGravity.END); -// dropdown.setArrowPadding(8); -//// dropdown.setSpinnerItemHeight(46); -// dropdown.setSpinnerPopupElevation(14); -// -// -// dropdown.selectItemByIndex(mode); -// -// -// dropdown.setOnSpinnerItemSelectedListener(new OnSpinnerItemSelectedListener() { -// @Override -// public void onItemSelected(int oldIndex, @Nullable IconSpinnerItem oldItem, int newIndex, -// IconSpinnerItem newItem) { -// -// settingsManager.setDataMode(newIndex); -// loadTeam(newIndex); -// } -// }); -// -// ll.addView(dropdown); + CustomSpinnerView dropdown = new CustomSpinnerView(getContext()); + dropdown.setTitle("Data Mode"); + List options = new ArrayList<>(); + options.add("Individual"); + options.add("Compiled"); + options.add("History"); + dropdown.setOptions(options, mode); + dropdown.setOnClickListener((item, index) -> { + System.out.println(index); + settingsManager.setDataMode(index); + loadTeam(index); + }); + ll.addView(dropdown); diff --git a/app/src/main/java/com/ridgebotics/ridgescout/ui/scouting/StatusFragment.java b/app/src/main/java/com/ridgebotics/ridgescout/ui/scouting/EventFragment.java similarity index 94% rename from app/src/main/java/com/ridgebotics/ridgescout/ui/scouting/StatusFragment.java rename to app/src/main/java/com/ridgebotics/ridgescout/ui/scouting/EventFragment.java index ceb47b8..b98aaca 100644 --- a/app/src/main/java/com/ridgebotics/ridgescout/ui/scouting/StatusFragment.java +++ b/app/src/main/java/com/ridgebotics/ridgescout/ui/scouting/EventFragment.java @@ -14,7 +14,7 @@ import androidx.annotation.NonNull; import androidx.annotation.Nullable; import androidx.fragment.app.Fragment; -import com.ridgebotics.ridgescout.databinding.FragmentScoutingStatusBinding; +import com.ridgebotics.ridgescout.databinding.FragmentScoutingEventBinding; import com.ridgebotics.ridgescout.utility.DataManager; import com.ridgebotics.ridgescout.utility.fileEditor; import com.ridgebotics.ridgescout.types.frcEvent; @@ -22,13 +22,13 @@ import com.ridgebotics.ridgescout.types.frcMatch; import java.util.Arrays; -public class StatusFragment extends Fragment { - FragmentScoutingStatusBinding binding; +public class EventFragment extends Fragment { + FragmentScoutingEventBinding binding; public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { - binding = FragmentScoutingStatusBinding.inflate(inflater, container, false); + binding = FragmentScoutingEventBinding.inflate(inflater, container, false); DataManager.reload_event(); binding.matchTable.removeAllViews(); @@ -56,7 +56,7 @@ public class StatusFragment extends Fragment { ViewGroup.LayoutParams.WRAP_CONTENT )); tv.setGravity(Gravity.CENTER_HORIZONTAL); - tv.setText("Pit Scouting"); + tv.setText("Teams"); tv.setTextSize(28); binding.matchTable.addView(tv); @@ -104,7 +104,7 @@ public class StatusFragment extends Fragment { ViewGroup.LayoutParams.WRAP_CONTENT )); tv.setGravity(Gravity.CENTER_HORIZONTAL); - tv.setText("Match Scouting"); + tv.setText("Matches"); tv.setTextSize(28); binding.matchTable.addView(tv); diff --git a/app/src/main/java/com/ridgebotics/ridgescout/ui/scouting/MatchScoutingFragment.java b/app/src/main/java/com/ridgebotics/ridgescout/ui/scouting/MatchScoutingFragment.java index e297b04..9380d6d 100644 --- a/app/src/main/java/com/ridgebotics/ridgescout/ui/scouting/MatchScoutingFragment.java +++ b/app/src/main/java/com/ridgebotics/ridgescout/ui/scouting/MatchScoutingFragment.java @@ -14,6 +14,8 @@ import androidx.annotation.NonNull; import androidx.annotation.Nullable; import androidx.fragment.app.Fragment; +import com.google.android.material.divider.MaterialDivider; +import com.ridgebotics.ridgescout.ui.ToggleTitleView; import com.ridgebotics.ridgescout.utility.settingsManager; import com.ridgebotics.ridgescout.databinding.FragmentScoutingMatchBinding; import com.ridgebotics.ridgescout.scoutingData.ScoutingDataWriter; @@ -137,7 +139,7 @@ public class MatchScoutingFragment extends Fragment { boolean edited = false; - TextView[] titles; + ToggleTitleView[] titles; AutoSaveManager asm = new AutoSaveManager(this::save); @@ -186,17 +188,22 @@ public class MatchScoutingFragment extends Fragment { asm.stop(); } - titles = new TextView[DataManager.match_latest_values.length]; + titles = new ToggleTitleView[DataManager.match_latest_values.length]; for(int i = 0 ; i < DataManager.match_latest_values.length; i++) { - final TextView tv = new TextView(getContext()); - tv.setTextAlignment(View.TEXT_ALIGNMENT_CENTER); - tv.setText(DataManager.match_latest_values[i].name); - tv.setPadding(8,8,8,8); - tv.setTextSize(24); - titles[i] = tv; + binding.MatchScoutArea.addView(new MaterialDivider(getContext())); + + + final ToggleTitleView ttv = new ToggleTitleView(getContext()); + ttv.setTitle(DataManager.match_latest_values[i].name); + ttv.setDescription(DataManager.match_latest_values[i].description); +// final TextView tv = new TextView(getContext()); +// tv.setTextAlignment(View.TEXT_ALIGNMENT_CENTER); +// tv.setText(DataManager.match_latest_values[i].name); +// tv.setPadding(8,8,8,8); +// tv.setTextSize(24); + titles[i] = ttv; - default_text_color = tv.getCurrentTextColor(); final View v = DataManager.match_latest_values[i].createView(getContext(), dataType -> { // edited = true; @@ -205,26 +212,27 @@ public class MatchScoutingFragment extends Fragment { return 0; }); - binding.MatchScoutArea.addView(tv); + binding.MatchScoutArea.addView(ttv); int fi = i; - tv.setOnClickListener(p -> { -// boolean blank = !latest_values[fi].getViewValue().isNull(); -// System.out.println(blank); + ttv.setOnToggleListener(enabled -> { if(asm.isRunning) update_asm(); - if(!DataManager.match_latest_values[fi].isBlank){ - tv.setBackgroundColor(0xffff0000); - tv.setTextColor(0xff000000); + if(enabled){ DataManager.match_latest_values[fi].nullify(); }else{ - tv.setBackgroundColor(0x00000000); - tv.setTextColor(default_text_color); DataManager.match_latest_values[fi].setViewValue(DataManager.match_latest_values[fi].default_value); } }); + ttv.setOnClickListener(p -> { +// boolean blank = !latest_values[fi].getViewValue().isNull(); + +// System.out.println(blank); + + }); + binding.MatchScoutArea.addView(v); } } @@ -328,8 +336,7 @@ public class MatchScoutingFragment extends Fragment { inputType input = DataManager.match_latest_values[i]; input.setViewValue(input.default_value); - titles[i].setBackgroundColor(0x00000000); - titles[i].setTextColor(default_text_color); + titles[i].enable(); } } @@ -351,11 +358,9 @@ public class MatchScoutingFragment extends Fragment { if(DataManager.match_latest_values[i].isBlank){ - titles[i].setBackgroundColor(0xffff0000); - titles[i].setTextColor(0xff000000); + titles[i].disable(); }else{ - titles[i].setBackgroundColor(0x00000000); - titles[i].setTextColor(default_text_color); + titles[i].enable(); } } } diff --git a/app/src/main/java/com/ridgebotics/ridgescout/ui/scouting/PitScoutingFragment.java b/app/src/main/java/com/ridgebotics/ridgescout/ui/scouting/PitScoutingFragment.java index 4975f68..0aab0fd 100644 --- a/app/src/main/java/com/ridgebotics/ridgescout/ui/scouting/PitScoutingFragment.java +++ b/app/src/main/java/com/ridgebotics/ridgescout/ui/scouting/PitScoutingFragment.java @@ -15,6 +15,8 @@ import androidx.annotation.NonNull; import androidx.annotation.Nullable; import androidx.fragment.app.Fragment; +import com.google.android.material.divider.MaterialDivider; +import com.ridgebotics.ridgescout.ui.ToggleTitleView; import com.ridgebotics.ridgescout.utility.AlertManager; import com.ridgebotics.ridgescout.utility.settingsManager; import com.ridgebotics.ridgescout.databinding.FragmentScoutingPitBinding; @@ -59,7 +61,7 @@ public class PitScoutingFragment extends Fragment { String filename; String username; - TextView[] titles; + ToggleTitleView[] titles; AutoSaveManager asm = new AutoSaveManager(this::save); @@ -133,38 +135,31 @@ public class PitScoutingFragment extends Fragment { } - private int default_text_color = 0; - private void create_fields() { if(asm.isRunning){ asm.stop(); } - titles = new TextView[pit_latest_values.length]; + titles = new ToggleTitleView[pit_latest_values.length]; for(int i = 0 ; i < pit_latest_values.length; i++) { - TextView tv = new TextView(getContext()); - tv.setTextAlignment(View.TEXT_ALIGNMENT_CENTER); - tv.setText(pit_latest_values[i].name); - tv.setTextSize(24); - tv.setPadding(8,8,8,8); - titles[i] = tv; - binding.pitScoutArea.addView(tv); + binding.pitScoutArea.addView(new MaterialDivider(getContext())); + + ToggleTitleView ttv = new ToggleTitleView(getContext()); + ttv.setTitle(pit_latest_values[i].name); + ttv.setDescription(pit_latest_values[i].description); + titles[i] = ttv; + binding.pitScoutArea.addView(ttv); - default_text_color = tv.getCurrentTextColor(); int fi = i; - tv.setOnClickListener(p -> { + ttv.setOnToggleListener(enabled -> { update_asm(); - if(!pit_latest_values[fi].isBlank){ - tv.setBackgroundColor(0xffff0000); - tv.setTextColor(0xff000000); + if(enabled){ pit_latest_values[fi].nullify(); }else{ - tv.setBackgroundColor(0x00000000); - tv.setTextColor(default_text_color); pit_latest_values[fi].setViewValue(pit_latest_values[fi].default_value); } }); @@ -187,9 +182,7 @@ public class PitScoutingFragment extends Fragment { for(int i = 0; i < pit_latest_values.length; i++){ inputType input = pit_latest_values[i]; input.setViewValue(input.default_value); - - titles[i].setBackgroundColor(0x00000000); - titles[i].setTextColor(default_text_color); + titles[i].enable(); } } @@ -199,15 +192,12 @@ public class PitScoutingFragment extends Fragment { dataType[] types = psdr.data.array; for(int i = 0; i < pit_latest_values.length; i++){ -// types[i] = latest_values[i].getViewValue(); pit_latest_values[i].setViewValue(types[i]); if(pit_latest_values[i].isBlank){ - titles[i].setBackgroundColor(0xffff0000); - titles[i].setTextColor(0xff000000); + titles[i].disable(); }else{ - titles[i].setBackgroundColor(0x00000000); - titles[i].setTextColor(default_text_color); + titles[i].enable(); } } } diff --git a/app/src/main/java/com/ridgebotics/ridgescout/ui/scouting/ScoutingFragment.java b/app/src/main/java/com/ridgebotics/ridgescout/ui/scouting/ScoutingFragment.java index 9f29e87..f483688 100644 --- a/app/src/main/java/com/ridgebotics/ridgescout/ui/scouting/ScoutingFragment.java +++ b/app/src/main/java/com/ridgebotics/ridgescout/ui/scouting/ScoutingFragment.java @@ -16,7 +16,6 @@ import androidx.annotation.Nullable; import androidx.fragment.app.Fragment; import com.ridgebotics.ridgescout.R; -import com.ridgebotics.ridgescout.utility.AlertManager; import com.ridgebotics.ridgescout.utility.settingsManager; import com.ridgebotics.ridgescout.databinding.FragmentScoutingBinding; import com.ridgebotics.ridgescout.types.frcTeam; @@ -43,7 +42,7 @@ public class ScoutingFragment extends Fragment { binding.noEventError.setVisibility(View.VISIBLE); binding.matchScoutingButton.setEnabled(false); binding.pitScoutingButton.setEnabled(false); - binding.statusButton.setEnabled(false); + binding.eventButton.setEnabled(false); is_main_page = false; return binding.getRoot(); } @@ -64,8 +63,8 @@ public class ScoutingFragment extends Fragment { findNavController(this).navigate(R.id.action_navigation_scouting_to_navigation_team_selector); }); - binding.statusButton.setOnClickListener(v -> { - findNavController(this).navigate(R.id.action_navigation_scouting_to_navigation_scouting_status); + binding.eventButton.setOnClickListener(v -> { + findNavController(this).navigate(R.id.action_navigation_scouting_to_navigation_scouting_event); }); return binding.getRoot(); @@ -81,23 +80,17 @@ public class ScoutingFragment extends Fragment { getView().setFocusableInTouchMode(true); getView().requestFocus(); - getView().setOnKeyListener(new View.OnKeyListener() { - @Override - public boolean onKey(View v, int keyCode, KeyEvent event) { + getView().setOnKeyListener((v, keyCode, event) -> { - if (event.getAction() == KeyEvent.ACTION_UP - && keyCode == KeyEvent.KEYCODE_BACK - && !is_main_page){ + if (event.getAction() == KeyEvent.ACTION_UP + && keyCode == KeyEvent.KEYCODE_BACK + && !is_main_page){ -// binding.buttons.setVisibility(View.VISIBLE); -// binding.matchScoutingView.setVisibility(View.GONE); -// binding.pitScoutingView.setVisibility(View.GONE); - is_main_page = true; + is_main_page = true; - return true; - } - return false; + return true; } + return false; }); } 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 630f64b..a51e722 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 @@ -250,7 +250,7 @@ public class settingsFragment extends Fragment { ArrayList optionsList = new ArrayList<>(Arrays.asList(options)); dropdown.setTitle(getTitle()); - dropdown.setOptions(optionsList); + dropdown.setOptions(optionsList, getValue()); dropdown.setOption(getValue()); dropdown.setOnClickListener((item, index) -> { diff --git a/app/src/main/java/com/ridgebotics/ridgescout/ui/transfer/TBAFragment.java b/app/src/main/java/com/ridgebotics/ridgescout/ui/transfer/TBAFragment.java index 5d81916..08fa460 100644 --- a/app/src/main/java/com/ridgebotics/ridgescout/ui/transfer/TBAFragment.java +++ b/app/src/main/java/com/ridgebotics/ridgescout/ui/transfer/TBAFragment.java @@ -36,13 +36,13 @@ import java.util.Comparator; import java.util.Date; public class TBAFragment extends Fragment { - private final String TBAAddress = "https://www.thebluealliance.com/api/v3/"; - private final String TBAHeader = "X-TBA-Auth-Key: tjEKSZojAU2pgbs2mBt06SKyOakVhLutj3NwuxLTxPKQPLih11aCIwRIVFXKzY4e"; + private static final String TBAAddress = "https://www.thebluealliance.com/api/v3/"; + private static final String TBAHeader = "X-TBA-Auth-Key: tjEKSZojAU2pgbs2mBt06SKyOakVhLutj3NwuxLTxPKQPLih11aCIwRIVFXKzY4e"; private android.widget.TableLayout Table; private FragmentTransferTbaBinding binding; - private static final int year = settingsManager.getYearNum(); + private final int year = settingsManager.getYearNum(); public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { diff --git a/app/src/main/java/com/ridgebotics/ridgescout/utility/DataManager.java b/app/src/main/java/com/ridgebotics/ridgescout/utility/DataManager.java index b1a0bfd..4bae7a4 100644 --- a/app/src/main/java/com/ridgebotics/ridgescout/utility/DataManager.java +++ b/app/src/main/java/com/ridgebotics/ridgescout/utility/DataManager.java @@ -30,17 +30,25 @@ public class DataManager { public static inputType[] match_latest_values; public static transferType[][] match_transferValues; public static void reload_match_fields(){ - match_values = fields.load(fields.matchFieldsFilename); - match_latest_values = match_values[match_values.length-1]; - match_transferValues = transferType.get_transfer_values(match_values); + try { + match_values = fields.load(fields.matchFieldsFilename); + match_latest_values = match_values[match_values.length - 1]; + match_transferValues = transferType.get_transfer_values(match_values); + } catch (Exception e){ + AlertManager.error(e); + } } public static inputType[][] pit_values; public static inputType[] pit_latest_values; public static transferType[][] pit_transferValues; public static void reload_pit_fields(){ - pit_values = fields.load(fields.pitsFieldsFilename); - pit_latest_values = pit_values[pit_values.length-1]; - pit_transferValues = transferType.get_transfer_values(pit_values); + try { + pit_values = fields.load(fields.pitsFieldsFilename); + pit_latest_values = pit_values[pit_values.length-1]; + pit_transferValues = transferType.get_transfer_values(pit_values); + } catch (Exception e){ + AlertManager.error(e); + } } } diff --git a/app/src/main/res/drawable/background.png b/app/src/main/res/drawable/background.png index 3ba6d818e126ebe77f227374c6613da5345b7eb7..929153bc95a7e3106fe003b1a84e96a00c157c8d 100644 GIT binary patch delta 932 zcmV;V16%yM1my>i7Ycv~1^@s6yMb?Nks&;P19C}3K~#90?cKX>;y@ID;oqyJNu;cl zGOt0Ag2shGa+5AEYu;yTZdrtcmvhc!su&5$|0f5V83S2WRWBqwe#PE_ z*yDHefx52Oi^bw2#?FKs%jNO~T8@A$%l=eV^%#Da;*1MGmSrDTeukxVSC=zh%kCaXf~T|H6u8g64Q*} zY)()sg40P+jR?+Xg|#7gnHJZC;B8%hKnsG`g%J%1-dBdCBLrC*lZ+5-ZBQyg(8bZ& zY_^?DCY$rN1cczL!+D@`fND0O0-o-5Y`m0Pu&P1_1njAgBTW z_Xz3$;Dk`u_4>R$20H%OJf(ZZ^j$j4=P6*G>&#Uux z7X(uP0MqI8UmpZ>0MHM?Bmi_rFbe?P5KIHWeFXCWa6)LFBF}#(0RX2{RzDG#&XvRN1J?&m!UpKd&W9A4L5)VcIhQ@;dfHCo) z9AIobCIz-K%N2k;#a zf&oIrgHV7_@gNW&WIPB12ptcC0Aj?05P(?mAON5lzu)h-q2eJjKwJFV+uQcmb6k&T z021OM5`dI=hyWld9s&bMi-&*!65}BdfYf*h03bOYJOfCN2af<6;=vPumU!^6Jl>3- zOeUN8e7?K&oS4Ju5zrQYpXa&QcyI`yF&-QNXpIL40Gi`rB!KpK7y)1*9tHwfiH8B# z0nPZjuGe{$ViOO{T z6*^iZTE3DR_!BBV!ihu@Kq4s+iESL4$DMoUv8y>#Z7u1Pr?Xfro)w(l`B7EX@BM!N zGMP+vZ5C=W%jNR9dmeVXU8mpgKdn})s?AbOrwfC@;Ds^~x-cG(f0c^xcLhpC=)N9* zN<`?s|0oUN0)Vm*J_Mi~g#Q9i2EwNRh3la5y}z*Xw@MJZ@=0L>vp3qUgnQ3DVjA$kD9A|wGoID}*X2!oIm0QDmz2SB|DNdizGLb3p0)Ps;T z0FNUi55QvxSpaZ9LN);0hmaKjw