From 890b879ef9fbf7a5c0d327a0cfb011d3a90dc22b Mon Sep 17 00:00:00 2001 From: Michael Mikovsky <77305074+Astatin3@users.noreply.github.com> Date: Fri, 25 Jul 2025 12:51:01 -0600 Subject: [PATCH] Solve random things --- README.md | 17 ++++- .../ui/scouting/PitScoutingFragment.java | 15 ++-- .../ui/scouting/ScoutingFragment.java | 5 +- .../ridgescout/ui/transfer/FTPSync.java | 2 +- .../ridgescout/ui/transfer/HttpSync.java | 3 +- .../ui/views/CustomSpinnerView.java | 4 +- .../ui/views/MatchScoutingIndicator.java | 43 +++++++++-- .../ui/views/PitScoutingIndicator.java | 75 +++++++++++++++++++ .../ridgescout/utility/Colors.java | 8 +- .../ridgescout/utility/ImageRequestTask.java | 19 ++++- .../res/layout/fragment_scouting_match.xml | 2 +- .../main/res/layout/fragment_scouting_pit.xml | 52 +++---------- .../res/layout/fragment_team_selector.xml | 3 +- .../main/res/layout/view_custom_spinner.xml | 16 ++-- .../layout/view_match_scouting_indicator.xml | 20 ++--- .../layout/view_pit_scouting_indicator.xml | 55 ++++++++++++++ .../main/res/layout/view_tally_counter.xml | 2 + app/src/main/res/layout/view_team_option.xml | 2 +- gradle/libs.versions.toml | 2 +- gradle/wrapper/gradle-wrapper.properties | 2 +- 20 files changed, 255 insertions(+), 92 deletions(-) create mode 100644 app/src/main/java/com/ridgebotics/ridgescout/ui/views/PitScoutingIndicator.java create mode 100644 app/src/main/res/layout/view_pit_scouting_indicator.xml diff --git a/README.md b/README.md index 0c6383c..77390f2 100644 --- a/README.md +++ b/README.md @@ -28,9 +28,24 @@ - Statbotics intgration - Scout error estimation using OPR-like calculation - - Would most likely require Statbotics - +https://www.thebluealliance.com/avatars ### Screenshots |Match scouting interface|Field editor|Teams data viewer| |-|-|-| |![Screenshot1](https://github.com/Team4388/ScoutingApp2025/blob/main/metadata/en-US/images/phoneScreenshots/1.png?raw=true)|![Screenshot2](https://github.com/Team4388/ScoutingApp2025/blob/main/metadata/en-US/images/phoneScreenshots/2.png?raw=true)|![Screenshot3](https://github.com/Team4388/ScoutingApp2025/blob/main/metadata/en-US/images/phoneScreenshots/3.png?raw=true)| + + \ No newline at end of file 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 6c1c194..65dd2ec 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 @@ -20,6 +20,7 @@ import androidx.annotation.Nullable; import androidx.fragment.app.Fragment; import com.google.android.material.divider.MaterialDivider; +import com.ridgebotics.ridgescout.ui.views.PitScoutingIndicator; import com.ridgebotics.ridgescout.ui.views.ToggleTitleView; import com.ridgebotics.ridgescout.utility.AlertManager; import com.ridgebotics.ridgescout.utility.SettingsManager; @@ -76,7 +77,6 @@ public class PitScoutingFragment extends Fragment { String fileUsernames = ""; ToggleTitleView[] titles; - AutoSaveManager asm = new AutoSaveManager(this::save, AUTO_SAVE_DELAY); ArrayList rawDataTypes; @@ -99,7 +99,7 @@ public class PitScoutingFragment extends Fragment { } public void set_indicator_color(int color){ - binding.pitFileIndicator.setBackgroundColor(color); + binding.pitIndicator.setColor(color); } public void update_asm(){ @@ -114,10 +114,9 @@ public class PitScoutingFragment extends Fragment { public void loadTeam(){ // clear_fields(); - binding.pitFileIndicator.setVisibility(View.VISIBLE); binding.pitsTeamCard.setVisibility(View.VISIBLE); - binding.pitBarTeamNum.setText(String.valueOf(team.teamNumber)); - binding.pitUsername.setText(SettingsManager.getUsername()); + binding.pitIndicator.setTeamNum(team.teamNumber); + binding.pitIndicator.setUsername(SettingsManager.getUsername()); binding.pitsTeamCard.fromTeam(team); filename = evcode + "-" + team.teamNumber + ".pitscoutdata"; @@ -146,7 +145,7 @@ public class PitScoutingFragment extends Fragment { } } - binding.pitFileIndicator.bringToFront(); + binding.pitIndicator.bringToFront(); asm.start(); @@ -154,7 +153,7 @@ public class PitScoutingFragment extends Fragment { private void enableRescoutButton(){ set_indicator_color(rescout ? rescout_color : saved_color); - binding.pitFileIndicator.setOnLongClickListener(v -> { + binding.pitIndicator.setOnLongClickListener(v -> { rescout = !rescout; if(rescout){ set_indicator_color(rescout_color); @@ -171,7 +170,7 @@ public class PitScoutingFragment extends Fragment { } private void disableRescoutButton(){ - binding.pitFileIndicator.setOnLongClickListener(null); + binding.pitIndicator.setOnLongClickListener(null); } 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 47532e0..05c25e3 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 @@ -128,10 +128,11 @@ public class ScoutingFragment extends Fragment { int matchNum = SettingsManager.getMatchNum(); int nextMatch = -1; + int teamNum = SettingsManager.getTeamNum(); try { - nextMatch = event.getNextTeamMatch(SettingsManager.getTeamNum(), matchNum).matchIndex; + nextMatch = event.getNextTeamMatch(teamNum, matchNum).matchIndex; } catch (Exception e){ - AlertManager.error(e); + AlertManager.error("Sorry, in event ("+evcode+"), your team number ("+teamNum+") wasn't found!", e); } binding.textNextMatch.setText("Our next match: Match " + nextMatch); 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 d042ebe..2186b9f 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 @@ -28,7 +28,7 @@ import java.util.List; import java.util.Map; import java.util.Set; -// This is now deprecated +// This is now deprecated. use HTTPSync // Class to synchronise data over FTP. public class FTPSync extends Thread { public static final String remoteBasePath = "/RidgeScout/"; diff --git a/app/src/main/java/com/ridgebotics/ridgescout/ui/transfer/HttpSync.java b/app/src/main/java/com/ridgebotics/ridgescout/ui/transfer/HttpSync.java index f70b35b..2c86c79 100644 --- a/app/src/main/java/com/ridgebotics/ridgescout/ui/transfer/HttpSync.java +++ b/app/src/main/java/com/ridgebotics/ridgescout/ui/transfer/HttpSync.java @@ -30,8 +30,7 @@ import java.util.Map; import java.util.Objects; import java.util.concurrent.atomic.AtomicBoolean; -// This is now deprsicated -// Class to syncronise data over FTP. +// Class to synchronise data over HTTP. public class HttpSync extends Thread { public static final String timestampsFilename = "timestamps"; diff --git a/app/src/main/java/com/ridgebotics/ridgescout/ui/views/CustomSpinnerView.java b/app/src/main/java/com/ridgebotics/ridgescout/ui/views/CustomSpinnerView.java index e6297d9..07d9568 100644 --- a/app/src/main/java/com/ridgebotics/ridgescout/ui/views/CustomSpinnerView.java +++ b/app/src/main/java/com/ridgebotics/ridgescout/ui/views/CustomSpinnerView.java @@ -78,7 +78,7 @@ public class CustomSpinnerView extends LinearLayout { CustomSpinnerPopup popup = new CustomSpinnerPopup(getContext()).init(options, option -> { // dialog.(); if(!isEnabled()) return; - item.setText(option); + item.setText("▼ " + option); index = options.indexOf(option); if(onClickListener != null) { onClickListener.onClick(option, options.indexOf(option)); @@ -105,7 +105,7 @@ public class CustomSpinnerView extends LinearLayout { } public void setOption(String option) { - item.setText(option); + item.setText("▼ " + option); index = options.indexOf(option); } diff --git a/app/src/main/java/com/ridgebotics/ridgescout/ui/views/MatchScoutingIndicator.java b/app/src/main/java/com/ridgebotics/ridgescout/ui/views/MatchScoutingIndicator.java index 8571d85..28a9fd2 100644 --- a/app/src/main/java/com/ridgebotics/ridgescout/ui/views/MatchScoutingIndicator.java +++ b/app/src/main/java/com/ridgebotics/ridgescout/ui/views/MatchScoutingIndicator.java @@ -1,6 +1,7 @@ package com.ridgebotics.ridgescout.ui.views; import android.content.Context; +import android.content.res.Configuration; import android.graphics.Bitmap; import android.graphics.Color; import android.graphics.PorterDuff; @@ -54,6 +55,20 @@ public class MatchScoutingIndicator extends RelativeLayout { match_indicator_bar_team_num = findViewById(R.id.match_indicator_bar_team_num); box = findViewById(R.id.file_indicator_box); coloredBackground = findViewById(R.id.match_indicator_background); + + int currentNightMode = getContext().getResources().getConfiguration().uiMode & Configuration.UI_MODE_NIGHT_MASK; + switch (currentNightMode) { + case Configuration.UI_MODE_NIGHT_NO: + // Night mode is not active on device + match_indicator_back_button.setColorFilter(Color.BLACK, PorterDuff.Mode.SRC_IN); + match_indicator_next_button.setColorFilter(Color.BLACK, PorterDuff.Mode.SRC_IN); + break; + case Configuration.UI_MODE_NIGHT_YES: + // Night mode is active on device + match_indicator_back_button.setColorFilter(Color.WHITE, PorterDuff.Mode.SRC_IN); + match_indicator_next_button.setColorFilter(Color.WHITE, PorterDuff.Mode.SRC_IN); + break; + } } public void setUsername(String username){ @@ -73,19 +88,31 @@ public class MatchScoutingIndicator extends RelativeLayout { } public void setColor(int color){ - Drawable drawable = box.getBackground(); - drawable.mutate(); - drawable.setColorFilter(color, PorterDuff.Mode.SRC_ATOP); + // Set color of main background rectangle + Drawable box_drawable = box.getBackground(); + box_drawable.mutate(); + box_drawable.setColorFilter(color, PorterDuff.Mode.SRC_ATOP); float[] hsv = new float[3]; Color.colorToHSV(color,hsv); + int background_color = Color.HSVToColor(220, new float[]{ + hsv[0], + Math.min(hsv[1], 0.75f), + Math.min(hsv[2], 0.5f) + }); + + // Set color of main background rectangle, slightly dimmer coloredBackground.setBackgroundColor( - Color.HSVToColor(220, new float[]{ - hsv[0], - Math.min(hsv[1], 0.75f), - Math.min(hsv[2], 0.5f) - }) + background_color ); + + Drawable left_drawable = match_indicator_back_button.getBackground(); + left_drawable.mutate(); + left_drawable.setColorFilter(color, PorterDuff.Mode.SRC_ATOP); + + Drawable right_drawable = match_indicator_next_button.getBackground(); + right_drawable.mutate(); + right_drawable.setColorFilter(color, PorterDuff.Mode.SRC_ATOP); } } diff --git a/app/src/main/java/com/ridgebotics/ridgescout/ui/views/PitScoutingIndicator.java b/app/src/main/java/com/ridgebotics/ridgescout/ui/views/PitScoutingIndicator.java new file mode 100644 index 0000000..34bed4b --- /dev/null +++ b/app/src/main/java/com/ridgebotics/ridgescout/ui/views/PitScoutingIndicator.java @@ -0,0 +1,75 @@ +package com.ridgebotics.ridgescout.ui.views; + +import android.content.Context; +import android.content.res.Configuration; +import android.graphics.Color; +import android.graphics.PorterDuff; +import android.graphics.drawable.Drawable; +import android.util.AttributeSet; +import android.view.LayoutInflater; +import android.view.View; +import android.widget.ImageButton; +import android.widget.RelativeLayout; +import android.widget.TextView; + +import androidx.annotation.Nullable; +import androidx.constraintlayout.widget.ConstraintLayout; + +import com.ridgebotics.ridgescout.R; + +// A view for displaying information about a team. +public class PitScoutingIndicator extends RelativeLayout { + public PitScoutingIndicator(Context context, @Nullable AttributeSet attrs) { + super(context, attrs); + init(context); + } + + public PitScoutingIndicator(Context context) { + super(context); + init(context); + } + + public TextView pit_indicator_username; + public TextView pit_indicator_team_num; + private ConstraintLayout box; + private View coloredBackground; + + public void init(Context context) { + LayoutInflater.from(context).inflate(R.layout.view_pit_scouting_indicator, this, true); + pit_indicator_username = findViewById(R.id.pit_indicator_username); + pit_indicator_team_num = findViewById(R.id.pit_indicator_teamnum); + + box = findViewById(R.id.pit_indicator_box); + coloredBackground = findViewById(R.id.pit_indicator_background); + + } + + public void setUsername(String username){ + pit_indicator_username.setText(username); + } + + public void setTeamNum(int teamNum) { + pit_indicator_team_num.setText(String.valueOf(teamNum)); + } + + public void setColor(int color){ + // Set color of main background rectangle + Drawable box_drawable = box.getBackground(); + box_drawable.mutate(); + box_drawable.setColorFilter(color, PorterDuff.Mode.SRC_ATOP); + + float[] hsv = new float[3]; + Color.colorToHSV(color,hsv); + + int background_color = Color.HSVToColor(220, new float[]{ + hsv[0], + Math.min(hsv[1], 0.75f), + Math.min(hsv[2], 0.5f) + }); + + // Set color of main background rectangle, slightly dimmer + coloredBackground.setBackgroundColor( + background_color + ); + } +} diff --git a/app/src/main/java/com/ridgebotics/ridgescout/utility/Colors.java b/app/src/main/java/com/ridgebotics/ridgescout/utility/Colors.java index a75682c..a621b9a 100644 --- a/app/src/main/java/com/ridgebotics/ridgescout/utility/Colors.java +++ b/app/src/main/java/com/ridgebotics/ridgescout/utility/Colors.java @@ -6,7 +6,7 @@ import android.graphics.Color; public class Colors { // Lists and stuff public static final int color_found = 0x7f00ff00; - public static final int color_rescout = 0x7f0000ff; + public static final int color_rescout = 0xff007fff; public static final int color_not_found = 0x7f7f0000; @@ -14,9 +14,9 @@ public class Colors { public static final int unfocused_background_color = 0x50118811; - public static final int unsaved_color = 0x60ff0000; - public static final int saved_color = 0x6000ff00; - public static final int rescout_color = 0x600000ff; + public static final int unsaved_color = 0xffaa0000; + public static final int saved_color = 0xff00aa00; + public static final int rescout_color = 0xff007fff; // Data graphs diff --git a/app/src/main/java/com/ridgebotics/ridgescout/utility/ImageRequestTask.java b/app/src/main/java/com/ridgebotics/ridgescout/utility/ImageRequestTask.java index 485debb..4bc54f8 100644 --- a/app/src/main/java/com/ridgebotics/ridgescout/utility/ImageRequestTask.java +++ b/app/src/main/java/com/ridgebotics/ridgescout/utility/ImageRequestTask.java @@ -25,11 +25,24 @@ public class ImageRequestTask extends AsyncTask { try { URL url = new URL(src); HttpURLConnection connection = (HttpURLConnection) url.openConnection(); + // We do a little bit of spoofing + connection.setRequestProperty("User-Agent", "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.11 (KHTML, like Gecko) Chrome/23.0.1271.95 Safari/537.11"); connection.setDoInput(true); connection.connect(); - InputStream input = connection.getInputStream(); - return BitmapFactory.decodeStream(input); - } catch (FileNotFoundException e) { + + int code = connection.getResponseCode(); + switch (code) { + case 200: + InputStream input = connection.getInputStream(); + return BitmapFactory.decodeStream(input); + case 403: +// AlertManager.error("Got 403, Going to https://www.thebluealliance.com/avatars may fix this"); + return null; + default: + AlertManager.error("Error downloading image " + src, "Got response code: " + code); + return null; + } + } catch (FileNotFoundException e){ return null; } catch (IOException e){ AlertManager.error("Error downloading image " + src, e); diff --git a/app/src/main/res/layout/fragment_scouting_match.xml b/app/src/main/res/layout/fragment_scouting_match.xml index 21e688a..d35da9f 100644 --- a/app/src/main/res/layout/fragment_scouting_match.xml +++ b/app/src/main/res/layout/fragment_scouting_match.xml @@ -45,7 +45,7 @@ android:layout_width="match_parent" android:layout_height="match_parent" android:text="Scouting Notice" - android:textAppearance="@style/TextAppearance.MaterialComponents.Subtitle1"> + android:textAppearance="@style/TextAppearance.MaterialComponents.Subtitle1"/> diff --git a/app/src/main/res/layout/fragment_scouting_pit.xml b/app/src/main/res/layout/fragment_scouting_pit.xml index 05a3038..73166af 100644 --- a/app/src/main/res/layout/fragment_scouting_pit.xml +++ b/app/src/main/res/layout/fragment_scouting_pit.xml @@ -4,54 +4,27 @@ android:layout_height="match_parent" xmlns:app="http://schemas.android.com/apk/res-auto"> - - - - - - - - - - + app:layout_constraintTop_toTopOf="parent" /> + app:layout_constraintEnd_toEndOf="parent" + app:layout_constraintStart_toStartOf="parent" + app:layout_constraintTop_toTopOf="parent"> + android:paddingTop="60dp"> + android:orientation="horizontal" + android:padding="10dp"> - + android:text="Scouting Notice" + android:textAppearance="@style/TextAppearance.MaterialComponents.Subtitle1"> diff --git a/app/src/main/res/layout/fragment_team_selector.xml b/app/src/main/res/layout/fragment_team_selector.xml index 1febad5..7b8aa74 100644 --- a/app/src/main/res/layout/fragment_team_selector.xml +++ b/app/src/main/res/layout/fragment_team_selector.xml @@ -14,8 +14,7 @@ android:id="@+id/teams" android:layout_width="match_parent" android:layout_height="match_parent" - android:orientation="vertical" - android:paddingTop="48dp" /> + android:orientation="vertical" /> \ No newline at end of file diff --git a/app/src/main/res/layout/view_custom_spinner.xml b/app/src/main/res/layout/view_custom_spinner.xml index e4ebe62..3fc681d 100644 --- a/app/src/main/res/layout/view_custom_spinner.xml +++ b/app/src/main/res/layout/view_custom_spinner.xml @@ -8,9 +8,12 @@ + android:overlapAnchor="false" + android:text="▼ Options" + android:textSize="24sp" /> @@ -28,9 +32,9 @@ android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginStart="9dp" - android:layout_marginTop="-5dp" + android:layout_marginTop="-6dp" android:paddingLeft="3dp" android:paddingRight="3dp" android:text="Test" - android:textAppearance="@style/TextAppearance.MaterialComponents.Subtitle1"/> + android:textAppearance="@style/TextAppearance.MaterialComponents.Subtitle1" /> diff --git a/app/src/main/res/layout/view_match_scouting_indicator.xml b/app/src/main/res/layout/view_match_scouting_indicator.xml index 98ebcf2..b209ade 100644 --- a/app/src/main/res/layout/view_match_scouting_indicator.xml +++ b/app/src/main/res/layout/view_match_scouting_indicator.xml @@ -11,7 +11,6 @@ android:layout_height="wrap_content" android:layout_margin="5dp" android:background="@drawable/border" - android:padding="3dp" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toTopOf="parent"> @@ -23,16 +22,18 @@ 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" /> @@ -42,9 +43,10 @@ android:layout_width="50dp" android:layout_height="50dp" android:scaleType="fitCenter" + android:contentDescription="Next" android:src="@drawable/triangle_right" android:text="Next" - android:background="@color/zxing_transparent" + android:background="@drawable/border" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintTop_toTopOf="parent" /> @@ -53,24 +55,24 @@ android:id="@+id/match_indicator_alliance_pos_text" android:layout_width="wrap_content" android:layout_height="wrap_content" - android:layout_marginEnd="4dp" + android:layout_marginEnd="58dp" android:text="Temp" - android:textAppearance="@style/TextAppearance.MaterialComponents.Subtitle1" android:textAlignment="center" + android:textAppearance="@style/TextAppearance.MaterialComponents.Subtitle1" app:layout_constraintBottom_toBottomOf="parent" - app:layout_constraintEnd_toStartOf="@+id/match_indicator_next_button" + app:layout_constraintEnd_toEndOf="@+id/match_indicator_next_button" app:layout_constraintTop_toTopOf="parent" /> + + + + + + + + + + + + diff --git a/app/src/main/res/layout/view_tally_counter.xml b/app/src/main/res/layout/view_tally_counter.xml index 65a66de..b08bf6b 100644 --- a/app/src/main/res/layout/view_tally_counter.xml +++ b/app/src/main/res/layout/view_tally_counter.xml @@ -17,6 +17,8 @@ android:layout_height="wrap_content" android:layout_weight="1" android:gravity="center" + android:text="0" + android:textAppearance="@style/TextAppearance.MaterialComponents.Headline6" android:textSize="24sp" />