From d183e3c913df2100344919c506302b88b46472d5 Mon Sep 17 00:00:00 2001 From: astatin3 Date: Wed, 26 Jun 2024 22:33:05 -0600 Subject: [PATCH] Start work on match scouting ui --- .../ScoutingDataVersion/fields.java | 2 +- .../SettingsVersionStack/latestSettings.java | 2 +- .../SettingsVersionStack/sv1.java | 51 +++++++ .../ui/scouting/matchScoutingView.java | 138 +++++++++++++++++- .../ui/scouting/pitScoutingView.java | 12 ++ .../ui/scouting/scoutingFragment.java | 11 +- .../ui/settings/settingsFragment.java | 48 ++++++ app/src/main/res/layout/fragment_scouting.xml | 119 ++++++++++++++- app/src/main/res/layout/fragment_settings.xml | 110 +++++++++----- 9 files changed, 448 insertions(+), 45 deletions(-) create mode 100644 app/src/main/java/com/astatin3/scoutingapp2025/SettingsVersionStack/sv1.java create mode 100644 app/src/main/java/com/astatin3/scoutingapp2025/ui/scouting/pitScoutingView.java diff --git a/app/src/main/java/com/astatin3/scoutingapp2025/ScoutingDataVersion/fields.java b/app/src/main/java/com/astatin3/scoutingapp2025/ScoutingDataVersion/fields.java index cbdd6f9..c845db7 100644 --- a/app/src/main/java/com/astatin3/scoutingapp2025/ScoutingDataVersion/fields.java +++ b/app/src/main/java/com/astatin3/scoutingapp2025/ScoutingDataVersion/fields.java @@ -7,7 +7,7 @@ import com.astatin3.scoutingapp2025.fileEditor; import java.util.ArrayList; public class fields { - private static ScoutingVersion sv = new ScoutingVersion(); + public static ScoutingVersion sv = new ScoutingVersion(); public static final String fieldsFilename = "data.fields"; public static ScoutingVersion.inputType[][] values = new ScoutingVersion.inputType[][]{}; diff --git a/app/src/main/java/com/astatin3/scoutingapp2025/SettingsVersionStack/latestSettings.java b/app/src/main/java/com/astatin3/scoutingapp2025/SettingsVersionStack/latestSettings.java index c6de01e..41fb72f 100644 --- a/app/src/main/java/com/astatin3/scoutingapp2025/SettingsVersionStack/latestSettings.java +++ b/app/src/main/java/com/astatin3/scoutingapp2025/SettingsVersionStack/latestSettings.java @@ -1,7 +1,7 @@ package com.astatin3.scoutingapp2025.SettingsVersionStack; public class latestSettings { - public static sv0 settings = new sv0(); + public static sv1 settings = new sv1(); public static void update(){ settings.init_settings(); settings.update(); diff --git a/app/src/main/java/com/astatin3/scoutingapp2025/SettingsVersionStack/sv1.java b/app/src/main/java/com/astatin3/scoutingapp2025/SettingsVersionStack/sv1.java new file mode 100644 index 0000000..a9846db --- /dev/null +++ b/app/src/main/java/com/astatin3/scoutingapp2025/SettingsVersionStack/sv1.java @@ -0,0 +1,51 @@ +package com.astatin3.scoutingapp2025.SettingsVersionStack; + +public class sv1 extends sv0 { + @Override + public int getVersion() { + return 0; + } + @Override + public void update(){ + int file_version = get_file_version(); + if(file_version == getVersion()) { + return; + }else if(file_version < getVersion()){ + super.update(); + } + set_file_version(getVersion()); + } + + @Override + public void defaultSettings() { + writeTag("username", "Username"); + writeTag("selected_event_code", "unset"); +// writeTag("practice_mode", "false"); + writeTag("wifi_mode", "false"); + + writeTag("match_num", "0"); + writeTag("alliance_pos", "red-1"); + } + + public int get_match_num(){ + return Integer.parseInt(readTag("match_num")); + } + + public void set_match_num(int num){ + writeTag("match_num", String.valueOf(num)); + } + + @Override + public void set_evcode(String evcode){ + set_match_num(0); + writeTag("selected_event_code", evcode); + } + + public String get_alliance_pos(){ + return readTag("alliance_pos"); + } + + public void set_alliance_pos(String pos){ + writeTag("alliance_pos", pos); + } +} diff --git a/app/src/main/java/com/astatin3/scoutingapp2025/ui/scouting/matchScoutingView.java b/app/src/main/java/com/astatin3/scoutingapp2025/ui/scouting/matchScoutingView.java index 3e851b8..f6eae1f 100644 --- a/app/src/main/java/com/astatin3/scoutingapp2025/ui/scouting/matchScoutingView.java +++ b/app/src/main/java/com/astatin3/scoutingapp2025/ui/scouting/matchScoutingView.java @@ -1,12 +1,148 @@ package com.astatin3.scoutingapp2025.ui.scouting; +import static com.astatin3.scoutingapp2025.ScoutingDataVersion.fields.sv; + import android.content.Context; +import android.util.AttributeSet; +import android.view.View; +import android.widget.RelativeLayout; +import android.widget.TextView; import androidx.annotation.NonNull; import androidx.constraintlayout.widget.ConstraintLayout; +import com.astatin3.scoutingapp2025.ScoutingDataVersion.ScoutingVersion; +import com.astatin3.scoutingapp2025.ScoutingDataVersion.fields; +import com.astatin3.scoutingapp2025.SettingsVersionStack.latestSettings; +import com.astatin3.scoutingapp2025.databinding.FragmentScoutingBinding; +import com.astatin3.scoutingapp2025.fileEditor; +import com.astatin3.scoutingapp2025.types.frcEvent; +import com.astatin3.scoutingapp2025.types.frcMatch; +import com.astatin3.scoutingapp2025.types.frcTeam; + public class matchScoutingView extends ConstraintLayout { - public matchScoutingView(@NonNull Context context) { + public matchScoutingView(Context context) { super(context); } + public matchScoutingView(Context context, AttributeSet attributeSet){ + super(context, attributeSet); + } + + FragmentScoutingBinding binding; + String alliance_position; + String evcode; + int cur_match_num; + frcEvent event; + + public void init(FragmentScoutingBinding tmp_binding){ + binding = tmp_binding; + + alliance_position = latestSettings.settings.get_alliance_pos(); + evcode = latestSettings.settings.get_evcode(); + event = frcEvent.decode(fileEditor.readFile(evcode + ".eventdata")); + + binding.eventcode.setText(evcode); + binding.alliancePosText.setText(alliance_position); + + cur_match_num = latestSettings.settings.get_match_num(); + update_match_num(); + + binding.nextButton.setOnClickListener(v -> { + latestSettings.settings.set_match_num(cur_match_num+1); + cur_match_num += 1; + update_match_num(); + }); + + binding.backButton.setOnClickListener(v -> { + latestSettings.settings.set_match_num(cur_match_num-1); + cur_match_num -= 1; + update_match_num(); + }); + } + + private void update_match_num(){ +// cur_match_num = latestSettings.settings.get_match_num(); + + binding.matchnum.setText(String.valueOf(cur_match_num+1)); + + System.out.println(cur_match_num); + + if(cur_match_num <= 0){ + binding.backButton.setVisibility(View.GONE); + }else{ + binding.backButton.setVisibility(View.VISIBLE); + } + + if(cur_match_num >= event.matches.size()-1){ + binding.nextButton.setVisibility(View.GONE); + }else{ + binding.nextButton.setVisibility(View.VISIBLE); + } + + update_scouting_data(); + } + + public void update_scouting_data(){ + frcMatch match = event.matches.get(cur_match_num); + + // Get team number + String[] split = alliance_position.split("-"); + Integer team_num = null; + + switch (split[0]){ + case "red": + team_num = match.redAlliance[Integer.parseInt(split[1])-1]; + break; + case "blue": + team_num = match.blueAlliance[Integer.parseInt(split[1])-1]; + break; + } + + binding.barTeamNum.setText(String.valueOf(team_num)); + + frcTeam team = null; + for(int i=0; i < event.teams.size(); i++){ + frcTeam tmpteam = event.teams.get(i); + if(tmpteam.teamNumber == team_num){ + team = tmpteam; + break; + } + } + + binding.teamName.setText(team.teamName); + binding.teamDescription.setText(team.getDescription()); + + fields.load(); + ScoutingVersion.inputType[] values = fields.values[fields.values.length-1]; + + int prev_text = binding.teamDescription.getId(); + + for(int i = 0 ; i < values.length; i++){ + TextView tv = new TextView(getContext()); + +// RelativeLayout.LayoutParams params = new RelativeLayout.LayoutParams(RelativeLayout.LayoutParams.WRAP_CONTENT, RelativeLayout.LayoutParams.WRAP_CONTENT); +//// params.addRule(RelativeLayout.ALIGN_PARENT_LEFT, RelativeLayout.TRUE); +// params.addRule(RelativeLayout.ALIGN_LEFT, prev_text); +// tv.setLayoutParams(params); + + + String text = "Fallback"; + switch (values[i].getInputType()){ + case SLIDER: + text = "Slider"; + break; + case DROPDOWN: + text = "Dropdown"; + break; + case NOTES_INPUT: + text = "Notes"; + break; + } + System.out.println(text); + tv.setText(text); + + binding.MatchScoutArea.addView(tv); + prev_text = tv.getId(); + } + } } diff --git a/app/src/main/java/com/astatin3/scoutingapp2025/ui/scouting/pitScoutingView.java b/app/src/main/java/com/astatin3/scoutingapp2025/ui/scouting/pitScoutingView.java new file mode 100644 index 0000000..7c0db50 --- /dev/null +++ b/app/src/main/java/com/astatin3/scoutingapp2025/ui/scouting/pitScoutingView.java @@ -0,0 +1,12 @@ +package com.astatin3.scoutingapp2025.ui.scouting; + +import android.content.Context; + +import androidx.annotation.NonNull; +import androidx.constraintlayout.widget.ConstraintLayout; + +public class pitScoutingView extends ConstraintLayout { + public pitScoutingView(@NonNull Context context) { + super(context); + } +} diff --git a/app/src/main/java/com/astatin3/scoutingapp2025/ui/scouting/scoutingFragment.java b/app/src/main/java/com/astatin3/scoutingapp2025/ui/scouting/scoutingFragment.java index 7815f12..f8e9783 100644 --- a/app/src/main/java/com/astatin3/scoutingapp2025/ui/scouting/scoutingFragment.java +++ b/app/src/main/java/com/astatin3/scoutingapp2025/ui/scouting/scoutingFragment.java @@ -28,20 +28,23 @@ public class scoutingFragment extends Fragment { binding = FragmentScoutingBinding.inflate(inflater, container, false); View root = binding.getRoot(); + binding.buttons.setVisibility(View.VISIBLE); + binding.matchScoutingView.setVisibility(View.GONE); + if(latestSettings.settings.get_evcode().equals("unset")){ binding.noEventError.setVisibility(View.VISIBLE); binding.buttons.setVisibility(View.GONE); } binding.matchScoutingButton.setOnClickListener(v -> { + binding.buttons.setVisibility(View.GONE); + binding.matchScoutingView.setVisibility(View.VISIBLE); + binding.matchScoutingView.init(binding); + // byte[] bytes = fields.save(); // System.out.println(bytes.length); // System.out.println(fields.load(bytes)[0].length); - System.out.println(fields.load()); - - fields.test(); - // fields.test(); // ByteBuilder bb = new ByteBuilder(); diff --git a/app/src/main/java/com/astatin3/scoutingapp2025/ui/settings/settingsFragment.java b/app/src/main/java/com/astatin3/scoutingapp2025/ui/settings/settingsFragment.java index 608a191..4b3e71e 100644 --- a/app/src/main/java/com/astatin3/scoutingapp2025/ui/settings/settingsFragment.java +++ b/app/src/main/java/com/astatin3/scoutingapp2025/ui/settings/settingsFragment.java @@ -108,6 +108,53 @@ public class settingsFragment extends Fragment { + + + + + + PowerSpinnerView alliance_pos_spinnerView = binding.alliancePosDropdown; + + List alliance_pos_iconSpinnerItems = new ArrayList<>(); + + String target_alliance_pos = latestSettings.settings.get_alliance_pos(); + int alliance_pos_target_index = -1; + + String[] alliance_pos_list = new String[]{"red-1", "red-2", "red-3", + "blue-1", "blue-2", "blue-3"}; + + for(int i = 0; i < alliance_pos_list.length; i++){ + if(alliance_pos_list[i].equals(target_alliance_pos)){ + alliance_pos_target_index = i; + } + alliance_pos_iconSpinnerItems.add(new IconSpinnerItem(alliance_pos_list[i])); + } + + IconSpinnerAdapter alliance_pos_iconSpinnerAdapter = new IconSpinnerAdapter(alliance_pos_spinnerView); + alliance_pos_spinnerView.setSpinnerAdapter(alliance_pos_iconSpinnerAdapter); + alliance_pos_spinnerView.setItems(alliance_pos_iconSpinnerItems); + alliance_pos_spinnerView.setLifecycleOwner(this); + + if(alliance_pos_target_index != -1){ + alliance_pos_spinnerView.selectItemByIndex(alliance_pos_target_index); + } + + alliance_pos_spinnerView.setOnSpinnerItemSelectedListener(new OnSpinnerItemSelectedListener() { + @Override + public void onItemSelected(int oldIndex, @Nullable IconSpinnerItem oldItem, int newIndex, + IconSpinnerItem newItem) { + latestSettings.settings.set_alliance_pos(newItem.getText().toString()); + } + }); + + + + + + + + + // // CheckBox practice_mode = binding.practiceMode; // practice_mode.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() { @@ -155,6 +202,7 @@ public class settingsFragment extends Fragment { spinnerView.clearSelectedItem(); // practice_mode.setChecked(latestSettings.settings.get_practice_mode()); wifi_mode.setChecked(latestSettings.settings.get_wifi_mode()); + alliance_pos_spinnerView.selectItemByIndex(0); }); alert.setNegativeButton("Cancel", null); diff --git a/app/src/main/res/layout/fragment_scouting.xml b/app/src/main/res/layout/fragment_scouting.xml index 9045cba..9697126 100644 --- a/app/src/main/res/layout/fragment_scouting.xml +++ b/app/src/main/res/layout/fragment_scouting.xml @@ -28,10 +28,12 @@ android:layout_width="match_parent" android:layout_height="match_parent" android:layout_marginBottom="48dp" + android:visibility="gone" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" - app:layout_constraintTop_toTopOf="parent"> + app:layout_constraintTop_toTopOf="parent" + tools:visibility="gone">