7 Commits

Author SHA1 Message Date
Daniel Carta 5ddc032be9 Update to 2026
Updates app to 2026, also a few minor UI fixes.
2026-02-10 10:23:05 -07:00
Daniel Carta e6073ded49 Update README.md 2025-11-04 12:03:29 -07:00
Daniel Carta 7503cefa09 Update Screenshots
Changed old screenshots to new ones
2025-11-04 12:01:58 -07:00
Michael Mikovsky 3b4737e6bc Change version 2025-10-08 20:37:30 -06:00
Michael Mikovsky 76d28e46cd Update version to 2.1 2025-10-08 20:27:05 -06:00
Michael Mikovsky 73308f2acc Fix TBA Event coloring 2025-10-08 20:23:11 -06:00
Michael Mikovsky c18a93cb1a Change dashboard if there are no matches 2025-10-08 20:06:25 -06:00
30 changed files with 81 additions and 58 deletions
Vendored
BIN
View File
Binary file not shown.
+4 -5
View File
@@ -11,10 +11,10 @@
#### Here is an overview of the main features currently included in the app: #### Here is an overview of the main features currently included in the app:
- This project is written for Android! No need for some kind of janky laptop charging setup. - This project is written for Android! No need for some kind of janky laptop charging setup.
- Similar to ScoutingPASS, there are many diffrent types of fields that can be used to collect data. - Similar to ScoutingPASS, many different types of fields can be used to collect data.
- The app is designed to handle updates to the fields on the fly, without loosing any data! - The app is designed to handle updates to the fields on the fly, without losing any data!
- Unlike other scouting solutions, scouters can disable any field they did not measure, and disabled fields will not be included in any calculations. - Unlike other scouting solutions, scouters can disable any field they did not measure, and disabled fields will not be included in any calculations.
- Dynamic displays based off of the diffrent fields. - Dynamic displays based on the different fields.
- Data transfer including 2D codes, Bluetooth, and File Bundle. - Data transfer including 2D codes, Bluetooth, and File Bundle.
- Exporting using CSV. - Exporting using CSV.
- Deployment on F-Droid - Deployment on F-Droid
@@ -22,10 +22,9 @@
#### Things that are yet to be implemented: #### Things that are yet to be implemented:
- A page that lets users cross-compare scouting data between teams. (Compare) - A page that lets users cross-compare scouting data between teams. (Compare)
- A page that lets scouters more easily make reports to the drive team before a match starts (Report)
#### Things that may or may not be implemented: #### Things that may or may not be implemented:
- Statbotics intgration - Statbotics integration
- Scout error estimation using OPR-like calculation - Scout error estimation using OPR-like calculation
- - Would most likely require Statbotics - - Would most likely require Statbotics
https://www.thebluealliance.com/avatars https://www.thebluealliance.com/avatars
BIN
View File
Binary file not shown.
+3 -3
View File
@@ -16,7 +16,7 @@ android {
dependenciesInfo { dependenciesInfo {
// Disables dependency metadata when building APKs. // Disables dependency metadata when building APKs.
includeInApk = false includeInApk = false
// Disables dependency metadata when building Android App Bundles. // Disables dependency metadata when building Android App Bundles.5
includeInBundle = false includeInBundle = false
} }
@@ -25,8 +25,8 @@ android {
applicationId = "com.ridgebotics.ridgescout" applicationId = "com.ridgebotics.ridgescout"
minSdk = 24 minSdk = 24
targetSdk = 34 targetSdk = 34
versionCode = 11 // **IMPORTANT** Increment this before releasing on github versionCode = 12 // **IMPORTANT** Increment this before releasing on github
versionName = "1.4"// **IMPORTANT** Change this before releasing on github (<Year num since 2024>.<Update Version>) versionName = "2.0"// **IMPORTANT** Change this before releasing on github (<Year num since 2024>.<Update Version>)
testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner" testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner"
} }
BIN
View File
Binary file not shown.
BIN
View File
Binary file not shown.
@@ -112,7 +112,7 @@ public class DropdownType extends FieldType {
.layout_match_wrap() .layout_match_wrap()
.padding(20) .padding(20)
.size(18) .size(18)
.align_center() .align_left()
.build()); .build());
} }
@@ -121,7 +121,7 @@ public class NumberType extends FieldType {
if(data.isNull()) return; if(data.isNull()) return;
parent.addView(new TextViewBuilder(parent.getContext(), String.valueOf((int) data.get())) parent.addView(new TextViewBuilder(parent.getContext(), String.valueOf((int) data.get()))
.layout_match_wrap() .layout_match_wrap()
.align_center() .align_left()
.size(24) .size(24)
.build()); .build());
} }
@@ -106,7 +106,7 @@ public class TallyType extends FieldType {
if(data.isNull()) return; if(data.isNull()) return;
parent.addView(new TextViewBuilder(parent.getContext(), String.valueOf((int) data.get())) parent.addView(new TextViewBuilder(parent.getContext(), String.valueOf((int) data.get()))
.layout_match_wrap() .layout_match_wrap()
.align_center() .align_left()
.size(24) .size(24)
.build()); .build());
} }
@@ -115,7 +115,7 @@ public class TextType extends FieldType {
if(data.isNull()) return; if(data.isNull()) return;
parent.addView(new TextViewBuilder(parent.getContext(), (String) data.get()) parent.addView(new TextViewBuilder(parent.getContext(), (String) data.get())
.layout_match_wrap() .layout_match_wrap()
.align_center() .align_left()
.size(18) .size(18)
.build()); .build());
} }
@@ -11,6 +11,7 @@ import static com.ridgebotics.ridgescout.utility.DataManager.pit_transferValues;
import static com.ridgebotics.ridgescout.utility.DataManager.pit_values; import static com.ridgebotics.ridgescout.utility.DataManager.pit_values;
import android.content.Intent; import android.content.Intent;
import android.graphics.Paint;
import android.net.Uri; import android.net.Uri;
import android.os.Bundle; import android.os.Bundle;
import android.view.Gravity; import android.view.Gravity;
@@ -221,19 +222,18 @@ public class TeamsFragment extends Fragment {
ScoutingDataWriter.ParsedScoutingDataResult psda = ScoutingDataWriter.load(files[matchIndex], match_values, match_transferValues); ScoutingDataWriter.ParsedScoutingDataResult psda = ScoutingDataWriter.load(files[matchIndex], match_values, match_transferValues);
binding.matchArea.addView( TextView title = new TextViewBuilder(getContext(),
new TextViewBuilder(getContext(), "M" + (match_num) + " " + split[2] + "-" + split[3] + " by " + psda.username) "M" + (match_num) + " " + split[2] + "-" + split[3] + " by " + psda.username)
.align_center() .align_center()
.size(30) .size(30)
.padding(0, 0, 40, 5) .padding(0, 0, 40, 5)
.build() .build();
title.setPaintFlags(title.getPaintFlags() | Paint.UNDERLINE_TEXT_FLAG);
); binding.matchArea.addView(title);
for (int i = 0; i < psda.data.array.length; i++) { for (int i = 0; i < psda.data.array.length; i++) {
TextViewBuilder tv = new TextViewBuilder(getContext(), match_latest_values[i].name) TextViewBuilder tv = new TextViewBuilder(getContext(), match_latest_values[i].name)
.align_center() .align_left()
.size(25); .size(25);
if (psda.data.array[i].isNull()) { if (psda.data.array[i].isNull()) {
@@ -282,6 +282,7 @@ public class TeamsFragment extends Fragment {
.build() .build()
); );
if(data[i] != null) if(data[i] != null)
match_latest_values[i].add_compiled_view(binding.matchArea, data[i]); match_latest_values[i].add_compiled_view(binding.matchArea, data[i]);
} }
@@ -307,13 +308,13 @@ public class TeamsFragment extends Fragment {
for(int i = 0; i < match_latest_values.length; i++){ for(int i = 0; i < match_latest_values.length; i++){
binding.matchArea.addView( TextView tv = new TextViewBuilder(getContext(), match_latest_values[i].name)
new TextViewBuilder(getContext(), match_latest_values[i].name)
.align_center() .align_center()
.size(30) .size(30)
.padding(0,0,20,5) .padding(0,0,20,5)
.build() .build();
); tv.setPaintFlags(tv.getPaintFlags() | Paint.UNDERLINE_TEXT_FLAG);
binding.matchArea.addView(tv);
if(data[i] != null) if(data[i] != null)
match_latest_values[i].add_history_view(binding.matchArea, data[i]); match_latest_values[i].add_history_view(binding.matchArea, data[i]);
@@ -157,9 +157,17 @@ public class ScoutingFragment extends Fragment {
private void updateDashboard() { private void updateDashboard() {
binding.textName.setText("Welcome, " + SettingsManager.getUsername() + "!"); binding.textName.setText("Welcome, " + SettingsManager.getUsername() + "!");
int curMatchNum = SettingsManager.getMatchNum(); binding.textRescoutIndicator.setText("Things to rescout: " + DataManager.rescout_list.size());
int nextMatch;
if(event.matches.size() == 0) {
binding.textMatchAlliance.setText("No Matches!");
} else {
int teamNum = SettingsManager.getTeamNum(); int teamNum = SettingsManager.getTeamNum();
int curMatchNum = SettingsManager.getMatchNum();
binding.textMatchAlliance.setText("Match: " + (curMatchNum+1) + ", " + SettingsManager.getAllyPos());
int nextMatch;
try { try {
nextMatch = event.getNextTeamMatch(teamNum, curMatchNum).matchIndex; nextMatch = event.getNextTeamMatch(teamNum, curMatchNum).matchIndex;
} catch (Exception e){ } catch (Exception e){
@@ -167,8 +175,6 @@ public class ScoutingFragment extends Fragment {
return; return;
} }
binding.textMatchAlliance.setText("Match: " + (curMatchNum+1) + ", " + SettingsManager.getAllyPos());
binding.textRescoutIndicator.setText("Things to rescout: " + DataManager.rescout_list.size());
binding.infoBox.addView(new TextViewBuilder(getContext(), "Our next match: Match " + nextMatch) binding.infoBox.addView(new TextViewBuilder(getContext(), "Our next match: Match " + nextMatch)
.body1() .body1()
@@ -182,3 +188,4 @@ public class ScoutingFragment extends Fragment {
.build()); .build());
} }
} }
}
@@ -152,6 +152,8 @@ public class SettingsFragment extends Fragment {
manager.addItem(new CheckboxSettingsItem(EnableQuickAllianceChangeKey, "Enable quick alliance swap", null)); manager.addItem(new CheckboxSettingsItem(EnableQuickAllianceChangeKey, "Enable quick alliance swap", null));
manager.addItem(new DropdownSettingsItem(FieldImageKey, "Field Image", new String[]{ manager.addItem(new DropdownSettingsItem(FieldImageKey, "Field Image", new String[]{
"2026",
"2026 (Flipped)",
"2025", "2025",
"2025 (Flipped)" "2025 (Flipped)"
})); }));
@@ -165,12 +165,12 @@ public class TBASelectorFragment extends Fragment {
try { try {
Date startDate = format.parse(j.getString("start_date")); Date startDate = format.parse(j.getString("start_date"));
Date endDate = format.parse(j.getString("end_date")); Date endDate = format.parse(j.getString("end_date"));
if(currentTime.after(endDate)){ if(currentTime.after(startDate) && currentTime.before(endDate)) {
row.setColor(tba_current);
} else if(currentTime.after(endDate)){
row.setColor(tba_previous); row.setColor(tba_previous);
}else if(currentTime.before(startDate)){ }else if(currentTime.before(startDate)){
row.setColor(tba_next); row.setColor(tba_next);
}else if(currentTime.after(startDate) && currentTime.before(endDate)){
row.setColor(tba_current);
} }
} catch (Exception e) { } catch (Exception e) {
AlertManager.error("Failed finding start and end dates!", e); AlertManager.error("Failed finding start and end dates!", e);
@@ -81,6 +81,12 @@ public class FieldPosView extends FrameLayout {
case "2025 (Flipped)": case "2025 (Flipped)":
setImageResource(R.drawable.field_2025_flipped); setImageResource(R.drawable.field_2025_flipped);
break; break;
case "2026":
setImageResource(R.drawable.field_2026);
break;
case "2026 (Flipped)":
setImageResource(R.drawable.field_2026_flipped);
break;
} }
} }
@@ -67,9 +67,9 @@ public class Colors {
public static final int fileselector_unselected_color = 0x50006600; public static final int fileselector_unselected_color = 0x50006600;
// TBA // TBA
public static final int tba_previous = 0x30FF0000; public static final int tba_previous = Color.argb(30, 64,64,64);
public static final int tba_current = 0x50ff0000; public static final int tba_current = 0x7f00ff00;
public static final int tba_next = 0x30FFFF00; public static final int tba_next = Color.argb(30, 192,192,192);
public static final int tba_red = 0x50ff0000; public static final int tba_red = 0x50ff0000;
public static final int tba_blue = 0x500000ff; public static final int tba_blue = 0x500000ff;
public static final int tba_toggle_background = 0x30000000; public static final int tba_toggle_background = 0x30000000;
@@ -46,8 +46,8 @@ public class SettingsManager {
hm.put(UnameKey, "Username"); hm.put(UnameKey, "Username");
hm.put(SelEVCodeKey, "unset"); hm.put(SelEVCodeKey, "unset");
hm.put(WifiModeKey, false); hm.put(WifiModeKey, false);
hm.put(YearNumKey, 2025); hm.put(YearNumKey, 2026);
hm.put(FieldImageKey, "2025"); hm.put(FieldImageKey, "2026");
hm.put(MatchNumKey, 0); hm.put(MatchNumKey, 0);
hm.put(AllyPosKey, "red-1"); hm.put(AllyPosKey, "red-1");
hm.put(DataModeKey, 0); hm.put(DataModeKey, 0);
BIN
View File
Binary file not shown.
Binary file not shown.

After

Width:  |  Height:  |  Size: 636 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 954 KiB

@@ -60,7 +60,7 @@
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:text="Pit Data" android:text="Pit Data"
android:textAlignment="center" android:textAlignment="center"
android:textSize="24sp" android:textSize="35sp"
app:layout_constraintTop_toBottomOf="@+id/team_description2" app:layout_constraintTop_toBottomOf="@+id/team_description2"
tools:layout_editor_absoluteX="0dp" /> tools:layout_editor_absoluteX="0dp" />
@@ -73,6 +73,11 @@
app:layout_constraintStart_toStartOf="parent" app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"> app:layout_constraintTop_toTopOf="parent">
<View
android:id="@+id/divider3"
android:layout_width="match_parent"
android:layout_height="12dp"
android:background="?android:attr/listDivider" />
</LinearLayout> </LinearLayout>
<TextView <TextView
@@ -81,7 +86,7 @@
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:text="Match Data" android:text="Match Data"
android:textAlignment="center" android:textAlignment="center"
android:textSize="24sp" android:textSize="35sp"
app:layout_constraintTop_toBottomOf="@+id/team_description2" app:layout_constraintTop_toBottomOf="@+id/team_description2"
tools:layout_editor_absoluteX="0dp" /> tools:layout_editor_absoluteX="0dp" />
@@ -139,9 +144,13 @@
app:layout_constraintStart_toStartOf="parent" app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"> app:layout_constraintTop_toTopOf="parent">
<View
android:id="@+id/divider2"
android:layout_width="match_parent"
android:layout_height="1dp"
android:background="?android:attr/listDivider" />
</LinearLayout> </LinearLayout>
</LinearLayout> </LinearLayout>
</ScrollView> </ScrollView>
+1 -1
View File
@@ -1,5 +1,5 @@
[versions] [versions]
agp = "8.13.0" agp = "8.13.2"
junit = "4.13.2" junit = "4.13.2"
junitVersion = "1.1.5" junitVersion = "1.1.5"
espressoCore = "3.5.1" espressoCore = "3.5.1"
BIN
View File
Binary file not shown.
BIN
View File
Binary file not shown.
BIN
View File
Binary file not shown.
Binary file not shown.
Binary file not shown.

Before

Width:  |  Height:  |  Size: 128 KiB

After

Width:  |  Height:  |  Size: 493 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 158 KiB

After

Width:  |  Height:  |  Size: 434 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 162 KiB

After

Width:  |  Height:  |  Size: 454 KiB

-1
View File
@@ -17,7 +17,6 @@ dependencyResolutionManagement {
google() google()
mavenCentral() mavenCentral()
maven ( url = "https://jitpack.io" ) maven ( url = "https://jitpack.io" )
jcenter()
} }
} }