From 07c68d5662c054871f498c94108c7fd22a5897b7 Mon Sep 17 00:00:00 2001 From: Julia Kim Date: Sat, 24 Jan 2026 09:58:57 -0800 Subject: [PATCH 1/3] merge down merge down changes from main --- app/src/main/assets/input_data/Comments.csv | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/assets/input_data/Comments.csv b/app/src/main/assets/input_data/Comments.csv index 29160f3..9c4ef89 100644 --- a/app/src/main/assets/input_data/Comments.csv +++ b/app/src/main/assets/input_data/Comments.csv @@ -2,7 +2,7 @@ Id,isActive,Description 1,TRUE,Robot climbed noticeably faster than others 2,TRUE,Robot climbed noticeably slower than others 3,TRUE,Climb didn't count -4,TRUE,Evaded defense well +4,FALSE,Evaded defense well 5,TRUE,Ineffective defense 6,TRUE,Played really good defense 7,TRUE,Robot didn't contribute much (no auto - low scoring - no defense) From e3114a8c6c320aa81fb9450d6eb1e750de92f451 Mon Sep 17 00:00:00 2001 From: Julia Kim Date: Thu, 29 Jan 2026 21:11:14 -0800 Subject: [PATCH 2/3] initial push --- .idea/deploymentTargetSelector.xml | 3 + .../scouting_app/activities/PostMatch.java | 169 +++++++++- .../scouting_app/config/Constants.java | 11 +- .../team3663/scouting_app/config/Globals.java | 9 + .../team3663/scouting_app/data/Accuracy.java | 82 +++++ .../scouting_app/data/ClimbLevel.java | 76 +++++ .../scouting_app/data/ClimbPosition.java | 79 +++++ .../utility/achievements/Achievements.java | 1 + app/src/main/res/layout/post_match.xml | 309 +++++++++++++++--- .../main/res/values/strings_post_match.xml | 18 +- 10 files changed, 691 insertions(+), 66 deletions(-) create mode 100644 app/src/main/java/com/team3663/scouting_app/data/Accuracy.java create mode 100644 app/src/main/java/com/team3663/scouting_app/data/ClimbLevel.java create mode 100644 app/src/main/java/com/team3663/scouting_app/data/ClimbPosition.java diff --git a/.idea/deploymentTargetSelector.xml b/.idea/deploymentTargetSelector.xml index 1033d15..6e7d638 100644 --- a/.idea/deploymentTargetSelector.xml +++ b/.idea/deploymentTargetSelector.xml @@ -16,6 +16,9 @@ + + \ No newline at end of file diff --git a/app/src/main/java/com/team3663/scouting_app/activities/PostMatch.java b/app/src/main/java/com/team3663/scouting_app/activities/PostMatch.java index 9b252bb..8c04dae 100644 --- a/app/src/main/java/com/team3663/scouting_app/activities/PostMatch.java +++ b/app/src/main/java/com/team3663/scouting_app/activities/PostMatch.java @@ -3,6 +3,10 @@ import android.annotation.SuppressLint; import android.content.Intent; import android.os.Bundle; +import android.view.View; +import android.widget.AdapterView; +import android.widget.ArrayAdapter; +import android.widget.Toast; import androidx.activity.EdgeToEdge; import androidx.appcompat.app.AlertDialog; @@ -20,6 +24,7 @@ import java.util.ArrayList; import java.util.Arrays; import java.util.Collections; +import java.util.Objects; public class PostMatch extends AppCompatActivity { // ============================================================================================= @@ -30,6 +35,12 @@ public class PostMatch extends AppCompatActivity { //Creating an array list for the Comments ArrayList CommentList = new ArrayList<>(); ArrayList CommentArray = Globals.CommentList.getDescriptionList(); + ArrayList Accuracy = Globals.AccuracyTypeList.getDescriptionList(); + ArrayList ClimbLevel = Globals.ClimbLevelList.getDescriptionList(); + ArrayList ClimbPosition = Globals.ClimbPositionList.getDescriptionList(); + String accuracyValue = Globals.CurrentAccuracy; + String climbLevelValue = Globals.CurrentClimbLevel; + String climbPositionValue = Globals.CurrentClimbPosition; @SuppressLint({"SetTextI18n", "MissingInflatedId"}) @Override @@ -47,6 +58,9 @@ protected void onCreate(Bundle in_savedInstanceState) { // Initialize activity components initDidLeave(); initComments(); + initAccuracy(); + initClimbLevel(); + initClimbPosition(); initReset(); initSubmit(); initStats(); @@ -133,6 +147,129 @@ private void initComments() { }); } + // ============================================================================================= + // Function: initAccuracy + // Description: Initialize the Accuracy field + // Parameters: void + // Output: void + // ============================================================================================= + private void initAccuracy() { + ArrayAdapter adp_Accuracy = new ArrayAdapter<>(this, R.layout.cpr_spinner, Accuracy); + adp_Accuracy.setDropDownViewResource(R.layout.cpr_spinner_item); + postMatchBinding.spinnerAccuracy.setAdapter(adp_Accuracy); + + // Set starting selection + int start_Pos = 0; + for (int i = 0; i < Accuracy.size(); i++) { + if (Accuracy.get(i).equals(Globals.AccuracyTypeList.getAccuracyDescription(Globals.CurrentAccuracy))) { + start_Pos = i; + break; + } + } + postMatchBinding.spinnerAccuracy.setSelection(start_Pos); + + postMatchBinding.spinnerAccuracy.setOnItemSelectedListener( + new AdapterView.OnItemSelectedListener() { + + @Override + public void onItemSelected(AdapterView adapterView, View view, int i, long l) { + + String newAccuracy = Globals.AccuracyTypeList.getAccuracyValue(postMatchBinding.spinnerAccuracy.getSelectedItem().toString()); + + if (!Objects.equals(newAccuracy, Globals.CurrentAccuracy)) { + Globals.CurrentAccuracy = newAccuracy; + } + } + + @Override + public void onNothingSelected(AdapterView adapterView) { + Globals.CurrentAccuracy = "-1"; + } + }); + } + + // ============================================================================================= + // Function: initClimbLevel + // Description: Initialize the Climb Level field + // Parameters: void + // Output: void + // ============================================================================================= + private void initClimbLevel() { + ArrayAdapter adp_ClimbLevel = new ArrayAdapter<>(this, R.layout.cpr_spinner, ClimbLevel); + adp_ClimbLevel.setDropDownViewResource(R.layout.cpr_spinner_item); + postMatchBinding.spinnerClimbLevel.setAdapter(adp_ClimbLevel); + + // Set starting selection + int start_Pos = 0; + for (int i = 0; i < ClimbLevel.size(); i++) { + if (ClimbLevel.get(i).equals(Globals.ClimbLevelList.getClimbLevelDescription(Globals.CurrentClimbLevel))) { + start_Pos = i; + break; + } + } + postMatchBinding.spinnerClimbLevel.setSelection(start_Pos); + + postMatchBinding.spinnerClimbLevel.setOnItemSelectedListener( + new AdapterView.OnItemSelectedListener() { + + @Override + public void onItemSelected(AdapterView adapterView, View view, int i, long l) { + + String newClimbLevel = Globals.ClimbLevelList.getClimbLevelValue(postMatchBinding.spinnerClimbLevel.getSelectedItem().toString()); + + if (!Objects.equals(newClimbLevel, Globals.CurrentClimbLevel)) { + Globals.CurrentClimbLevel = newClimbLevel; + } + } + + @Override + public void onNothingSelected(AdapterView adapterView) { + Globals.CurrentClimbLevel = "-1"; + } + }); + } + + + // ============================================================================================= + // Function: initClimbPosition + // Description: Initialize the field + // Parameters: void + // Output: void + // ============================================================================================= + private void initClimbPosition() { + ArrayAdapter adp_ClimbPosition = new ArrayAdapter<>(this, R.layout.cpr_spinner, ClimbPosition); + adp_ClimbPosition.setDropDownViewResource(R.layout.cpr_spinner_item); + postMatchBinding.spinnerClimbPosition.setAdapter(adp_ClimbPosition); + + // Set starting selection + int start_Pos = 0; + for (int i = 0; i < ClimbPosition.size(); i++) { + if (ClimbPosition.get(i).equals(Globals.ClimbPositionList.getClimbPositionDescription(Globals.CurrentClimbPosition))) { + start_Pos = i; + break; + } + } + postMatchBinding.spinnerClimbPosition.setSelection(start_Pos); + + // Set up a listener to handle any changes to the dropdown + postMatchBinding.spinnerClimbPosition.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() { + @Override + public void onItemSelected(AdapterView adapterView, View view, int i, long l) { + + String newClimbPosition = Globals.ClimbPositionList.getClimbPositionValue(postMatchBinding.spinnerClimbPosition.getSelectedItem().toString()); + + if (!Objects.equals(newClimbPosition, Globals.CurrentClimbPosition)) { + Globals.CurrentClimbPosition = newClimbPosition; + } + } + + @Override + public void onNothingSelected(AdapterView adapterView) { + Globals.CurrentClimbPosition = "-1"; + } + }); + } + // ============================================================================================= // Function: initDidLeave // Description: Initialize the Did Leave field @@ -197,6 +334,23 @@ private void initSubmit() { if (comment_sep_ID.length() > 0) comment_sep_ID = new StringBuilder(comment_sep_ID.substring(1)); Globals.EventLogger.LogData(Constants.Logger.LOGKEY_COMMENTS, comment_sep_ID.toString()); + if (Constants.PostMatch.ACCURACY.equals(Globals.CurrentAccuracy) || + Constants.PostMatch.CLIMB_LEVEL.equals(Globals.CurrentClimbLevel) || + Constants.PostMatch.CLIMB_POSITION.equals(Globals.CurrentClimbPosition)) { + + Toast.makeText(this, R.string.post_missing_data, Toast.LENGTH_SHORT).show(); + return; + } else { + // Log all the spinner data + Globals.EventLogger.LogData(Constants.Logger.LOGKEY_ACCURACY, String.valueOf(Globals.CurrentAccuracy)); + Globals.EventLogger.LogData(Constants.Logger.LOGKEY_CLIMB_LEVEL, String.valueOf(Globals.CurrentClimbLevel)); + Globals.EventLogger.LogData(Constants.Logger.LOGKEY_CLIMB_POSITION, String.valueOf(Globals.CurrentClimbPosition)); + } + + if () { + + } + Intent GoToSubmitData = new Intent(PostMatch.this, SubmitData.class); startActivity(GoToSubmitData); } @@ -211,6 +365,7 @@ private void initSubmit() { .startsWith(Constants.Achievements.EVENT_TYPE_FINAL)) Achievements.data_FinalType++; finish(); + }); } @@ -221,19 +376,9 @@ private void initSubmit() { // Output: void // ============================================================================================= private void initStats() { - StringBuilder statsCoral = new StringBuilder(); - StringBuilder statsAlgae = new StringBuilder(); - - for (int i = 4; i >0; --i) { - statsCoral.append("Placed L").append(i).append(": ").append(Achievements.data_match_CoralLevel[i]).append("\n"); - } - statsCoral.append("Dropped: ").append(Achievements.data_match_CoralDropped); - - statsAlgae.append("Net: ").append(Achievements.data_match_AlgaeInNet).append("\n") - .append("Processor: ").append(Achievements.data_match_AlgaeInProcessor); + String statsFuel = "Fuel: " + Achievements.data_match_FuelShot; - postMatchBinding.textStatsCoral.setText(statsCoral.toString()); - postMatchBinding.textStatsAlgae.setText(statsAlgae.toString()); + postMatchBinding.textStatsFuel.setText(statsFuel); //use achievement data } } \ No newline at end of file diff --git a/app/src/main/java/com/team3663/scouting_app/config/Constants.java b/app/src/main/java/com/team3663/scouting_app/config/Constants.java index ab3f459..ee07442 100644 --- a/app/src/main/java/com/team3663/scouting_app/config/Constants.java +++ b/app/src/main/java/com/team3663/scouting_app/config/Constants.java @@ -9,7 +9,7 @@ public class Constants { public static class Logger { // Logger Keys - Data File is written in order of the FILE_HEADER array - public static final String[] LOGKEY_DATA_FILE_HEADER = new String[]{"Shadow", "Team", "TeamScouting", "Scouter", "DidPlay", "StartGamePiece", "DidLeaveStart", "Comments", "Achievements", "StartOffset", "Start"}; + public static final String[] LOGKEY_DATA_FILE_HEADER = new String[]{"Shadow", "Team", "TeamScouting", "Scouter", "DidPlay", "StartGamePiece", "DidLeaveStart", "Accuracy", "ClimbLevel", "ClimbPosition", "Comments", "Achievements", "StartOffset", "Start"}; public static final String LOGKEY_SHADOW_MODE = "Shadow"; public static final String LOGKEY_ACHIEVEMENT = "Achievements"; public static final String LOGKEY_MATCH_TYPE = "MatchType"; @@ -19,6 +19,9 @@ public static class Logger { public static final String LOGKEY_SCOUTER = "Scouter"; public static final String LOGKEY_DID_LEAVE_START = "DidLeaveStart"; public static final String LOGKEY_START_WITH_GAME_PIECE = "StartGamePiece"; + public static final String LOGKEY_ACCURACY = "Accuracy"; + public static final String LOGKEY_CLIMB_LEVEL = "ClimbLevel"; + public static final String LOGKEY_CLIMB_POSITION = "ClimbPosition"; public static final String LOGKEY_COMMENTS = "Comments"; public static final String LOGKEY_START_TIME_OFFSET = "StartOffset"; public static final String LOGKEY_START_TIME = "Start"; @@ -62,6 +65,12 @@ public static class Match { public static final int SEEKBAR_MAX = 60; } + public static class PostMatch { + public static final String ACCURACY = "-1"; + public static final String CLIMB_LEVEL = "-1"; + public static final String CLIMB_POSITION = "-1"; + } + public static class Data { public static final String PRIVATE_BASE_DIR = "input_data"; public static final String PUBLIC_BASE_DIR = "CPR-Scouting"; diff --git a/app/src/main/java/com/team3663/scouting_app/config/Globals.java b/app/src/main/java/com/team3663/scouting_app/config/Globals.java index 6aa40d7..02a98eb 100644 --- a/app/src/main/java/com/team3663/scouting_app/config/Globals.java +++ b/app/src/main/java/com/team3663/scouting_app/config/Globals.java @@ -5,6 +5,9 @@ import androidx.documentfile.provider.DocumentFile; +import com.team3663.scouting_app.data.Accuracy; +import com.team3663.scouting_app.data.ClimbLevel; +import com.team3663.scouting_app.data.ClimbPosition; import com.team3663.scouting_app.data.MatchTypes; import com.team3663.scouting_app.utility.Logger; import com.team3663.scouting_app.data.Colors; @@ -22,6 +25,12 @@ public class Globals { public static Competitions CompetitionList = new Competitions(); public static MatchTypes MatchTypeList = new MatchTypes(); public static Matches MatchList = new Matches(); + public static Accuracy AccuracyTypeList = new Accuracy(); + public static String CurrentAccuracy = Constants.PostMatch.ACCURACY; + public static ClimbLevel ClimbLevelList = new ClimbLevel(); + public static String CurrentClimbLevel = Constants.PostMatch.CLIMB_LEVEL; + public static ClimbPosition ClimbPositionList = new ClimbPosition(); + public static String CurrentClimbPosition = Constants.PostMatch.CLIMB_POSITION; public static Devices DeviceList = new Devices(); public static Events EventList = new Events(); public static Comments CommentList = new Comments(); diff --git a/app/src/main/java/com/team3663/scouting_app/data/Accuracy.java b/app/src/main/java/com/team3663/scouting_app/data/Accuracy.java new file mode 100644 index 0000000..da05dd5 --- /dev/null +++ b/app/src/main/java/com/team3663/scouting_app/data/Accuracy.java @@ -0,0 +1,82 @@ +package com.team3663.scouting_app.data; + +import java.util.ArrayList; +import java.util.Objects; + +// ============================================================================================= +// Class: Accuracy +// Description: Defines a structure/class to hold the information for all Accuracy values +// ============================================================================================= + +public class Accuracy { + + private final ArrayList Accuracy_list; + + public Accuracy() { + Accuracy_list = new ArrayList<>(); + + // Add accuracy values into the list + addAccuracyRow("-1",""); + addClimbLevelRow("None", "None"); + addClimbLevelRow("L1", "L1"); + addClimbLevelRow("L2", "L2"); + addClimbLevelRow("L3", "L3"); + } + + // Add a row + public void addClimbLevelRow(String in_value, String in_description) { + climbLevel_list.add(new ClimbLevelRow(in_value, in_description)); + } + + // Return the size + public int size() { + return climbLevel_list.size(); + } + + public ArrayList getDescriptionList() { + ArrayList descriptions = new ArrayList<>(); + for (ClimbLevel.ClimbLevelRow clr : climbLevel_list) { + descriptions.add(clr.description); + } + return descriptions; + } + + public String getClimbLevelValue(String in_description) { + for (ClimbLevel.ClimbLevelRow clr : climbLevel_list) { + if (Objects.equals(clr.description, in_description)) { + return clr.value; + } + } + return ""; + } + + public String getClimbLevelDescription(String in_value) { + for (ClimbLevel.ClimbLevelRow clr : climbLevel_list) { + if (Objects.equals(clr.value, in_value)) { + return clr.description; + } + } + return ""; + } + + // Member Function: Empties out the list + public void clear() {climbLevel_list.clear();} + + // ============================================================================================= + // Class: ClimbPositionRow + // Description: Defines a structure/class to hold the information for each climb position + // ============================================================================================= + private static class ClimbLevelRow { + private final String value; + private final String description; + + public ClimbLevelRow(String in_value, String in_description) { + value = in_value; + description = in_description; + } + } +} diff --git a/app/src/main/java/com/team3663/scouting_app/data/ClimbPosition.java b/app/src/main/java/com/team3663/scouting_app/data/ClimbPosition.java new file mode 100644 index 0000000..e91b4c4 --- /dev/null +++ b/app/src/main/java/com/team3663/scouting_app/data/ClimbPosition.java @@ -0,0 +1,79 @@ +package com.team3663.scouting_app.data; + +import java.util.ArrayList; +import java.util.Objects; + +// ============================================================================================= +// Class: ClimbPosition +// Description: Defines a structure/class to hold the information for all robot Climb Position values +// ============================================================================================= + +public class ClimbPosition { + + private final ArrayList climbPosition_list; + + public ClimbPosition() { + climbPosition_list = new ArrayList<>(); + + // Add climb position values into the list + addClimbPositionRow("-1","