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:
- 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.
- The app is designed to handle updates to the fields on the fly, without loosing any 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 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.
- Dynamic displays based off of the diffrent fields.
- Dynamic displays based on the different fields.
- Data transfer including 2D codes, Bluetooth, and File Bundle.
- Exporting using CSV.
- Deployment on F-Droid
@@ -22,10 +22,9 @@
#### Things that are yet to be implemented:
- 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:
- Statbotics intgration
- Statbotics integration
- Scout error estimation using OPR-like calculation
- - Would most likely require Statbotics
https://www.thebluealliance.com/avatars
BIN
View File
Binary file not shown.
+3 -3
View File
@@ -16,7 +16,7 @@ android {
dependenciesInfo {
// Disables dependency metadata when building APKs.
includeInApk = false
// Disables dependency metadata when building Android App Bundles.
// Disables dependency metadata when building Android App Bundles.5
includeInBundle = false
}
@@ -25,8 +25,8 @@ android {
applicationId = "com.ridgebotics.ridgescout"
minSdk = 24
targetSdk = 34
versionCode = 11 // **IMPORTANT** Increment this before releasing on github
versionName = "1.4"// **IMPORTANT** Change this before releasing on github (<Year num since 2024>.<Update Version>)
versionCode = 12 // **IMPORTANT** Increment this before releasing on github
versionName = "2.0"// **IMPORTANT** Change this before releasing on github (<Year num since 2024>.<Update Version>)
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()
.padding(20)
.size(18)
.align_center()
.align_left()
.build());
}
@@ -121,7 +121,7 @@ public class NumberType extends FieldType {
if(data.isNull()) return;
parent.addView(new TextViewBuilder(parent.getContext(), String.valueOf((int) data.get()))
.layout_match_wrap()
.align_center()
.align_left()
.size(24)
.build());
}
@@ -106,7 +106,7 @@ public class TallyType extends FieldType {
if(data.isNull()) return;
parent.addView(new TextViewBuilder(parent.getContext(), String.valueOf((int) data.get()))
.layout_match_wrap()
.align_center()
.align_left()
.size(24)
.build());
}
@@ -115,7 +115,7 @@ public class TextType extends FieldType {
if(data.isNull()) return;
parent.addView(new TextViewBuilder(parent.getContext(), (String) data.get())
.layout_match_wrap()
.align_center()
.align_left()
.size(18)
.build());
}
@@ -11,6 +11,7 @@ import static com.ridgebotics.ridgescout.utility.DataManager.pit_transferValues;
import static com.ridgebotics.ridgescout.utility.DataManager.pit_values;
import android.content.Intent;
import android.graphics.Paint;
import android.net.Uri;
import android.os.Bundle;
import android.view.Gravity;
@@ -221,19 +222,18 @@ public class TeamsFragment extends Fragment {
ScoutingDataWriter.ParsedScoutingDataResult psda = ScoutingDataWriter.load(files[matchIndex], match_values, match_transferValues);
binding.matchArea.addView(
new TextViewBuilder(getContext(), "M" + (match_num) + " " + split[2] + "-" + split[3] + " by " + psda.username)
.align_center()
.size(30)
.padding(0,0,40,5)
.build()
);
TextView title = new TextViewBuilder(getContext(),
"M" + (match_num) + " " + split[2] + "-" + split[3] + " by " + psda.username)
.align_center()
.size(30)
.padding(0, 0, 40, 5)
.build();
title.setPaintFlags(title.getPaintFlags() | Paint.UNDERLINE_TEXT_FLAG);
binding.matchArea.addView(title);
for (int i = 0; i < psda.data.array.length; i++) {
TextViewBuilder tv = new TextViewBuilder(getContext(), match_latest_values[i].name)
.align_center()
.align_left()
.size(25);
if (psda.data.array[i].isNull()) {
@@ -282,6 +282,7 @@ public class TeamsFragment extends Fragment {
.build()
);
if(data[i] != null)
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++){
binding.matchArea.addView(
new TextViewBuilder(getContext(), match_latest_values[i].name)
TextView tv = new TextViewBuilder(getContext(), match_latest_values[i].name)
.align_center()
.size(30)
.padding(0,0,20,5)
.build()
);
.build();
tv.setPaintFlags(tv.getPaintFlags() | Paint.UNDERLINE_TEXT_FLAG);
binding.matchArea.addView(tv);
if(data[i] != null)
match_latest_values[i].add_history_view(binding.matchArea, data[i]);
@@ -157,28 +157,35 @@ public class ScoutingFragment extends Fragment {
private void updateDashboard() {
binding.textName.setText("Welcome, " + SettingsManager.getUsername() + "!");
int curMatchNum = SettingsManager.getMatchNum();
int nextMatch;
int teamNum = SettingsManager.getTeamNum();
try {
nextMatch = event.getNextTeamMatch(teamNum, curMatchNum).matchIndex;
} catch (Exception e){
AlertManager.error("Sorry, in event ("+evcode+"), your team number ("+teamNum+") wasn't found!", e);
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)
.body1()
.build());
if(event.matches.size() == 0) {
binding.textMatchAlliance.setText("No Matches!");
} else {
int teamNum = SettingsManager.getTeamNum();
int curMatchNum = SettingsManager.getMatchNum();
int informedBy = event.getMostInformedBy(teamNum, curMatchNum);
binding.textMatchAlliance.setText("Match: " + (curMatchNum+1) + ", " + SettingsManager.getAllyPos());
int nextMatch;
try {
nextMatch = event.getNextTeamMatch(teamNum, curMatchNum).matchIndex;
} catch (Exception e){
AlertManager.error("Sorry, in event ("+evcode+"), your team number ("+teamNum+") wasn't found!", e);
return;
}
binding.infoBox.addView(new TextViewBuilder(getContext(), "Most informed by: Match " + informedBy)
.body1()
.build());
binding.infoBox.addView(new TextViewBuilder(getContext(), "Our next match: Match " + nextMatch)
.body1()
.build());
int informedBy = event.getMostInformedBy(teamNum, curMatchNum);
binding.infoBox.addView(new TextViewBuilder(getContext(), "Most informed by: Match " + informedBy)
.body1()
.build());
}
}
}
@@ -152,6 +152,8 @@ public class SettingsFragment extends Fragment {
manager.addItem(new CheckboxSettingsItem(EnableQuickAllianceChangeKey, "Enable quick alliance swap", null));
manager.addItem(new DropdownSettingsItem(FieldImageKey, "Field Image", new String[]{
"2026",
"2026 (Flipped)",
"2025",
"2025 (Flipped)"
}));
@@ -165,12 +165,12 @@ public class TBASelectorFragment extends Fragment {
try {
Date startDate = format.parse(j.getString("start_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);
}else if(currentTime.before(startDate)){
row.setColor(tba_next);
}else if(currentTime.after(startDate) && currentTime.before(endDate)){
row.setColor(tba_current);
}
} catch (Exception e) {
AlertManager.error("Failed finding start and end dates!", e);
@@ -81,6 +81,12 @@ public class FieldPosView extends FrameLayout {
case "2025 (Flipped)":
setImageResource(R.drawable.field_2025_flipped);
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;
// TBA
public static final int tba_previous = 0x30FF0000;
public static final int tba_current = 0x50ff0000;
public static final int tba_next = 0x30FFFF00;
public static final int tba_previous = Color.argb(30, 64,64,64);
public static final int tba_current = 0x7f00ff00;
public static final int tba_next = Color.argb(30, 192,192,192);
public static final int tba_red = 0x50ff0000;
public static final int tba_blue = 0x500000ff;
public static final int tba_toggle_background = 0x30000000;
@@ -46,8 +46,8 @@ public class SettingsManager {
hm.put(UnameKey, "Username");
hm.put(SelEVCodeKey, "unset");
hm.put(WifiModeKey, false);
hm.put(YearNumKey, 2025);
hm.put(FieldImageKey, "2025");
hm.put(YearNumKey, 2026);
hm.put(FieldImageKey, "2026");
hm.put(MatchNumKey, 0);
hm.put(AllyPosKey, "red-1");
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:text="Pit Data"
android:textAlignment="center"
android:textSize="24sp"
android:textSize="35sp"
app:layout_constraintTop_toBottomOf="@+id/team_description2"
tools:layout_editor_absoluteX="0dp" />
@@ -73,6 +73,11 @@
app:layout_constraintStart_toStartOf="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>
<TextView
@@ -81,7 +86,7 @@
android:layout_height="wrap_content"
android:text="Match Data"
android:textAlignment="center"
android:textSize="24sp"
android:textSize="35sp"
app:layout_constraintTop_toBottomOf="@+id/team_description2"
tools:layout_editor_absoluteX="0dp" />
@@ -139,9 +144,13 @@
app:layout_constraintStart_toStartOf="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>
</ScrollView>
+1 -1
View File
@@ -1,5 +1,5 @@
[versions]
agp = "8.13.0"
agp = "8.13.2"
junit = "4.13.2"
junitVersion = "1.1.5"
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()
mavenCentral()
maven ( url = "https://jitpack.io" )
jcenter()
}
}