Add comments to classes and update TODO

This commit is contained in:
Michael Mikovsky
2025-04-21 12:06:37 -06:00
parent 50419e284c
commit 36801e2f9b
85 changed files with 281 additions and 365 deletions
+17 -10
View File
@@ -1,24 +1,31 @@
### TODO: ### TODO:
##### Scouting: ##### Scouting:
- Make an easier way to make game-specific UI elements
##### Data Analysis: ##### Data Analysis:
- Statbotics intigration??? - Add analysis for the rest of the data types besides Tally
- Add a "scout note" system for scouters to contribute to the scouting report?
- Make data that has been marked for rescouting not processed in either by team or by type analysis.
##### Functionality: ##### Functionality:
- Test new FTP thing - Rewrite FTP transfer to be over HTTP requests
- UUIDs instead of names for the fields - - Potentially using a python server or some other pre-existing file transfer over HTTP
- Fix data storage crashes - Delete file menu
- Match selector instead of list for individual team views - Make "Sync meta files" option only block uploading fields specifically.
##### UI:
- Update docs and README.md with new features
- Improve file status indicator for scouting
- - The autosave timeout can be significantly reduced, so the save indicator is not a necessity
- - A new system for the rescout indicator should be used.
- Improve UI elements for scouting data by team
- Field button in settings overlaps with other elements in some devices
### In Progress: ### In Progress:
##### Scouting: ##### Scouting:
- Make scouting UI look much better
##### Data Analysis: ##### Data Analysis:
##### Functionality: ##### Functionality:
##### UI:
### Done: ### Done:
##### Scouting: ##### Scouting:
- Make practice mode
- Description for fields
##### Data Analysis: ##### Data Analysis:
##### Functionality: ##### Functionality:
- "Send Meta Files" button ##### UI:
- Year selector
@@ -24,6 +24,9 @@ import com.ridgebotics.ridgescout.utility.SettingsManager;
import java.util.Objects; import java.util.Objects;
import java.util.TimeZone; import java.util.TimeZone;
// Entrypoint for the scouting app.
// Configures stuff like the nav menu
// Also has some extra functions like a better back stack or a way to suppress the back button.
public class MainActivity extends AppCompatActivity { public class MainActivity extends AppCompatActivity {
@@ -37,19 +40,21 @@ public class MainActivity extends AppCompatActivity {
@Override @Override
protected void onCreate(Bundle savedInstanceState) { protected void onCreate(Bundle savedInstanceState) {
// Load shared prefrences
SettingsManager.prefs = this.getSharedPreferences( SettingsManager.prefs = this.getSharedPreferences(
"com.ridgebotics.ridgescout", Context.MODE_PRIVATE); "com.ridgebotics.ridgescout", Context.MODE_PRIVATE);
// Load default match fields
if(!FileEditor.fileExist(Fields.matchFieldsFilename)){ if(!FileEditor.fileExist(Fields.matchFieldsFilename)){
Fields.save(Fields.matchFieldsFilename, Fields.default_match_fields); Fields.save(Fields.matchFieldsFilename, Fields.default_match_fields);
} }
// Load default pit fields
if(!FileEditor.fileExist(Fields.pitsFieldsFilename)){ if(!FileEditor.fileExist(Fields.pitsFieldsFilename)){
Fields.save(Fields.pitsFieldsFilename, Fields.default_pit_fields); Fields.save(Fields.pitsFieldsFilename, Fields.default_pit_fields);
} }
// get time zone for FTP file transfer
TimeZone.setDefault(TimeZone.getTimeZone("UTC")); TimeZone.setDefault(TimeZone.getTimeZone("UTC"));
AlertManager.init(this); AlertManager.init(this);
@@ -16,6 +16,8 @@ import com.ridgebotics.ridgescout.utility.ByteBuilder;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.UUID; import java.util.UUID;
// The mechanism to load, save, and create the fields based off of the raw types from ScoutingDataWriter.java
public class Fields { public class Fields {
// public static ScoutingVersion sv = new ScoutingVersion(); // public static ScoutingVersion sv = new ScoutingVersion();
@@ -2,7 +2,7 @@ package com.ridgebotics.ridgescout.scoutingData;
import com.ridgebotics.ridgescout.scoutingData.transfer.TransferType; import com.ridgebotics.ridgescout.scoutingData.transfer.TransferType;
import com.ridgebotics.ridgescout.types.ScoutingArray; import com.ridgebotics.ridgescout.types.ScoutingArray;
import com.ridgebotics.ridgescout.types.data.DataType; import com.ridgebotics.ridgescout.types.data.RawDataType;
import com.ridgebotics.ridgescout.types.data.IntArrType; import com.ridgebotics.ridgescout.types.data.IntArrType;
import com.ridgebotics.ridgescout.types.data.StringType; import com.ridgebotics.ridgescout.types.data.StringType;
import com.ridgebotics.ridgescout.types.input.FieldType; import com.ridgebotics.ridgescout.types.input.FieldType;
@@ -12,17 +12,17 @@ import com.ridgebotics.ridgescout.utility.FileEditor;
import com.ridgebotics.ridgescout.utility.BuiltByteParser; import com.ridgebotics.ridgescout.utility.BuiltByteParser;
import com.ridgebotics.ridgescout.utility.ByteBuilder; import com.ridgebotics.ridgescout.utility.ByteBuilder;
import java.io.IOException;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Arrays; import java.util.Arrays;
import java.util.Collections;
import java.util.List; import java.util.List;
// Mostly an extension of Fields.java. Saves the raw data from each Field Type.
public class ScoutingDataWriter { public class ScoutingDataWriter {
// private static final int int_type_id = 255; // private static final int int_type_id = 255;
// private static final int string_type_id = 254; // private static final int string_type_id = 254;
public static boolean save(int version, String username, String filename, DataType[] data){ public static boolean save(int version, String username, String filename, RawDataType[] data){
ByteBuilder bb = new ByteBuilder(); ByteBuilder bb = new ByteBuilder();
try { try {
bb.addInt(version); bb.addInt(version);
@@ -64,7 +64,7 @@ public class ScoutingDataWriter {
try { try {
ArrayList<BuiltByteParser.parsedObject> objects = bbp.parse(); ArrayList<BuiltByteParser.parsedObject> objects = bbp.parse();
DataType[] dataTypes = new DataType[objects.size()-2]; RawDataType[] rawDataTypes = new RawDataType[objects.size()-2];
int version = ((int)objects.get(0).get()); int version = ((int)objects.get(0).get());
@@ -80,24 +80,24 @@ public class ScoutingDataWriter {
for(int i = 0; i < values[version].length; i++){ for(int i = 0; i < values[version].length; i++){
switch (objects.get(i+2).getType()){ switch (objects.get(i+2).getType()){
case 1: // Int case 1: // Int
dataTypes[i] = IntType.newNull(values[version][i].UUID); rawDataTypes[i] = IntType.newNull(values[version][i].UUID);
dataTypes[i].forceSetValue(objects.get(i+2).get()); rawDataTypes[i].forceSetValue(objects.get(i+2).get());
System.out.println("Loaded INT: " + values[version][i].name + " (" + values[version][i].UUID + ") " + ", ("+ dataTypes[i].get() +")"); System.out.println("Loaded INT: " + values[version][i].name + " (" + values[version][i].UUID + ") " + ", ("+ rawDataTypes[i].get() +")");
break; break;
case 2: // String case 2: // String
dataTypes[i] = StringType.newNull(values[version][i].UUID); rawDataTypes[i] = StringType.newNull(values[version][i].UUID);
dataTypes[i].forceSetValue(objects.get(i+2).get()); rawDataTypes[i].forceSetValue(objects.get(i+2).get());
System.out.println("Loaded STR: " + values[version][i].name + " (" + values[version][i].UUID + ") " + ", ("+ dataTypes[i].get() +")"); System.out.println("Loaded STR: " + values[version][i].name + " (" + values[version][i].UUID + ") " + ", ("+ rawDataTypes[i].get() +")");
break; break;
case 3: // Int array case 3: // Int array
dataTypes[i] = IntArrType.newNull(values[version][i].UUID); rawDataTypes[i] = IntArrType.newNull(values[version][i].UUID);
dataTypes[i].forceSetValue(objects.get(i+2).get()); rawDataTypes[i].forceSetValue(objects.get(i+2).get());
System.out.println("Loaded intARR: " + values[version][i].name + " (" + values[version][i].UUID + ") " + ", ("+ Arrays.toString((int[])dataTypes[i].get()) +")"); System.out.println("Loaded intARR: " + values[version][i].name + " (" + values[version][i].UUID + ") " + ", ("+ Arrays.toString((int[]) rawDataTypes[i].get()) +")");
break; break;
} }
} }
ScoutingArray msa = new ScoutingArray(version, dataTypes, values, transferValues); ScoutingArray msa = new ScoutingArray(version, rawDataTypes, values, transferValues);
msa.update(); msa.update();
ParsedScoutingDataResult psda = new ParsedScoutingDataResult(); ParsedScoutingDataResult psda = new ParsedScoutingDataResult();
@@ -1,5 +1,6 @@
package com.ridgebotics.ridgescout.scoutingData.transfer; package com.ridgebotics.ridgescout.scoutingData.transfer;
// Transfer type if a field was created
public class CreateTransferType extends TransferType { public class CreateTransferType extends TransferType {
public transferValue getType() {return transferValue.CREATE;} public transferValue getType() {return transferValue.CREATE;}
public CreateTransferType(String UUID){ public CreateTransferType(String UUID){
@@ -1,5 +1,6 @@
package com.ridgebotics.ridgescout.scoutingData.transfer; package com.ridgebotics.ridgescout.scoutingData.transfer;
// Transfer type if a field directly transfers
public class DirectTransferType extends TransferType { public class DirectTransferType extends TransferType {
public transferValue getType() {return transferValue.DIRECT;} public transferValue getType() {return transferValue.DIRECT;}
public DirectTransferType(String UUID){ public DirectTransferType(String UUID){
@@ -2,6 +2,10 @@ package com.ridgebotics.ridgescout.scoutingData.transfer;
import com.ridgebotics.ridgescout.types.input.FieldType; import com.ridgebotics.ridgescout.types.input.FieldType;
// The "Transfer Types" system, a component in the loading of scouting data.
// Dictates how the
// For example, a field can be created in one version, and how the app updates it is by obtaining it's transfer value, in this case being "create".
public abstract class TransferType { public abstract class TransferType {
public enum transferValue { public enum transferValue {
DIRECT, DIRECT,
@@ -22,6 +26,7 @@ public abstract class TransferType {
return null; return null;
} }
//Inputs:
public static TransferType[][] get_transfer_values(FieldType[][] values) { public static TransferType[][] get_transfer_values(FieldType[][] values) {
TransferType[][] output = new TransferType[values.length][]; TransferType[][] output = new TransferType[values.length][];
for(int a = 1; a < values.length; a++){ for(int a = 1; a < values.length; a++){
@@ -3,19 +3,20 @@ package com.ridgebotics.ridgescout.types;
import com.ridgebotics.ridgescout.scoutingData.transfer.CreateTransferType; import com.ridgebotics.ridgescout.scoutingData.transfer.CreateTransferType;
import com.ridgebotics.ridgescout.scoutingData.transfer.DirectTransferType; import com.ridgebotics.ridgescout.scoutingData.transfer.DirectTransferType;
import com.ridgebotics.ridgescout.scoutingData.transfer.TransferType; import com.ridgebotics.ridgescout.scoutingData.transfer.TransferType;
import com.ridgebotics.ridgescout.types.data.DataType; import com.ridgebotics.ridgescout.types.data.RawDataType;
import com.ridgebotics.ridgescout.types.data.IntType; import com.ridgebotics.ridgescout.types.data.IntType;
import com.ridgebotics.ridgescout.types.data.StringType; import com.ridgebotics.ridgescout.types.data.StringType;
import com.ridgebotics.ridgescout.types.input.FieldType; import com.ridgebotics.ridgescout.types.input.FieldType;
// A wrapper class for the stuff going on in Fields.java and ScoutingDataWriter.java.
public class ScoutingArray { public class ScoutingArray {
public int version; public int version;
public DataType[] array; public RawDataType[] array;
public FieldType[][] values; public FieldType[][] values;
public int latest_version_num; public int latest_version_num;
public TransferType[][] transfer_values; public TransferType[][] transfer_values;
public ScoutingArray(int version, DataType[] array, FieldType[][] values, TransferType[][] transfer_values){ public ScoutingArray(int version, RawDataType[] array, FieldType[][] values, TransferType[][] transfer_values){
this.version = version; this.version = version;
this.array = array; this.array = array;
this.values = values; this.values = values;
@@ -23,13 +24,13 @@ public class ScoutingArray {
this.transfer_values = transfer_values; this.transfer_values = transfer_values;
} }
public ScoutingArray(int version, DataType[] array, FieldType[][] values){ public ScoutingArray(int version, RawDataType[] array, FieldType[][] values){
this(version, array, values, TransferType.get_transfer_values(values)); this(version, array, values, TransferType.get_transfer_values(values));
} }
public void update(){ public void update(){
while(version<latest_version_num){ while(version<latest_version_num){
DataType[] new_values = new DataType[transfer_values[version].length]; RawDataType[] new_values = new RawDataType[transfer_values[version].length];
for(int i = 0; i < transfer_values[version].length; i++){ for(int i = 0; i < transfer_values[version].length; i++){
TransferType tv = transfer_values[version][i]; TransferType tv = transfer_values[version][i];
switch (tv.getType()){ switch (tv.getType()){
@@ -56,8 +57,8 @@ public class ScoutingArray {
return null; return null;
} }
private DataType get_data_type_by_UUID(String UUID){ private RawDataType get_data_type_by_UUID(String UUID){
for(DataType dt : array){ for(RawDataType dt : array){
if(dt.getUUID().equals(UUID)){ if(dt.getUUID().equals(UUID)){
return dt; return dt;
} }
@@ -65,7 +66,7 @@ public class ScoutingArray {
return null; return null;
} }
private DataType direct_transfer(DirectTransferType tv){ private RawDataType direct_transfer(DirectTransferType tv){
return get_data_type_by_UUID(tv.UUID); return get_data_type_by_UUID(tv.UUID);
} }
@@ -75,7 +76,7 @@ public class ScoutingArray {
// return dt; // return dt;
// } // }
private DataType create_transfer(CreateTransferType tv){ private RawDataType create_transfer(CreateTransferType tv){
FieldType it = get_input_type_by_UUID(version+1, tv.UUID); FieldType it = get_input_type_by_UUID(version+1, tv.UUID);
switch (it.getValueType()){ switch (it.getValueType()){
case NUM: case NUM:
@@ -9,6 +9,7 @@ import java.util.ArrayList;
import java.util.Arrays; import java.util.Arrays;
import java.util.Objects; import java.util.Objects;
// Basically just holds a byte array and a filename, and then us just encoded.
public class ScoutingFile { public class ScoutingFile {
public static final int typecode = 255; public static final int typecode = 255;
public String filename; public String filename;
@@ -1,6 +1,8 @@
package com.ridgebotics.ridgescout.types.data; package com.ridgebotics.ridgescout.types.data;
public class IntArrType extends DataType {
// Int array raw data type
public class IntArrType extends RawDataType {
public static final int[] nullval = new int[]{255, 255}; public static final int[] nullval = new int[]{255, 255};
// public static final int unselectedval = 1; // public static final int unselectedval = 1;
@@ -1,6 +1,7 @@
package com.ridgebotics.ridgescout.types.data; package com.ridgebotics.ridgescout.types.data;
public class IntType extends DataType { // Number raw data type
public class IntType extends RawDataType {
public static final int nullval = 255; public static final int nullval = 255;
// public static final int unselectedval = 1; // public static final int unselectedval = 1;
@@ -1,6 +1,7 @@
package com.ridgebotics.ridgescout.types.data; package com.ridgebotics.ridgescout.types.data;
public abstract class DataType { // Abstract class for raw data types for use in fields.
public abstract class RawDataType {
public enum valueTypes { public enum valueTypes {
NUM, NUM,
NUMARR, NUMARR,
@@ -26,7 +27,7 @@ public abstract class DataType {
public String getUUID() {return UUID;} public String getUUID() {return UUID;}
public DataType(String UUID){ public RawDataType(String UUID){
this.UUID = UUID; this.UUID = UUID;
} }
} }
@@ -1,6 +1,7 @@
package com.ridgebotics.ridgescout.types.data; package com.ridgebotics.ridgescout.types.data;
public class StringType extends DataType { // String raw data type
public class StringType extends RawDataType {
public static final String nullval = "null"; public static final String nullval = "null";
// public static final String unselectedval = "■"; // public static final String unselectedval = "■";
@@ -12,6 +12,8 @@ import java.util.ArrayList;
import java.util.List; import java.util.List;
import java.util.stream.IntStream; import java.util.stream.IntStream;
// Class to contain data for an entire event.
// Easily encoded and decoded to binary format.
public class frcEvent { public class frcEvent {
public static final int typecode = 254; public static final int typecode = 254;
@@ -9,6 +9,8 @@ import com.ridgebotics.ridgescout.utility.ByteBuilder;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Arrays; import java.util.Arrays;
// Class to contain data for the six teams numbers in a single match
// Easily encoded and decoded to binary format.
public class frcMatch { public class frcMatch {
public static final int typecode = 253; public static final int typecode = 253;
public frcMatch(){} public frcMatch(){}
@@ -16,6 +16,8 @@ import java.util.Arrays;
import java.util.HashMap; import java.util.HashMap;
import java.util.Map; import java.util.Map;
// Class to contain data for a team, in an event.
// Easily encoded and decoded to binary format.
public class frcTeam { public class frcTeam {
public static final int typecode = 252; public static final int typecode = 252;
private static final int[] DEFAULT_COLOR_ARR = new int[]{64,64,64}; private static final int[] DEFAULT_COLOR_ARR = new int[]{64,64,64};
@@ -23,7 +23,7 @@ import com.github.mikephil.charting.data.LineDataSet;
import com.github.mikephil.charting.data.PieData; import com.github.mikephil.charting.data.PieData;
import com.github.mikephil.charting.data.PieDataSet; import com.github.mikephil.charting.data.PieDataSet;
import com.github.mikephil.charting.data.PieEntry; import com.github.mikephil.charting.data.PieEntry;
import com.ridgebotics.ridgescout.types.data.DataType; import com.ridgebotics.ridgescout.types.data.RawDataType;
import com.ridgebotics.ridgescout.types.data.IntType; import com.ridgebotics.ridgescout.types.data.IntType;
import com.ridgebotics.ridgescout.utility.BuiltByteParser; import com.ridgebotics.ridgescout.utility.BuiltByteParser;
import com.ridgebotics.ridgescout.utility.ByteBuilder; import com.ridgebotics.ridgescout.utility.ByteBuilder;
@@ -36,7 +36,7 @@ import java.util.function.Function;
public class CheckboxType extends FieldType { public class CheckboxType extends FieldType {
public int get_byte_id() {return checkboxType;} public int get_byte_id() {return checkboxType;}
public inputTypes getInputType(){return inputTypes.CHECKBOX;} public inputTypes getInputType(){return inputTypes.CHECKBOX;}
public DataType.valueTypes getValueType(){return DataType.valueTypes.NUM;} public RawDataType.valueTypes getValueType(){return RawDataType.valueTypes.NUM;}
public Object get_fallback_value(){return 0;} public Object get_fallback_value(){return 0;}
public CheckboxType(){}; public CheckboxType(){};
public String get_type_name(){return "Checkbox";} public String get_type_name(){return "Checkbox";}
@@ -58,7 +58,7 @@ public class CheckboxType extends FieldType {
public CheckBox checkBox = null; public CheckBox checkBox = null;
public View createView(Context context, Function<DataType, Integer> onUpdate){ public View createView(Context context, Function<RawDataType, Integer> onUpdate){
checkBox = new CheckBox(context); checkBox = new CheckBox(context);
checkBox.setTextAppearance(com.google.android.material.R.style.TextAppearance_MaterialComponents_Headline6); checkBox.setTextAppearance(com.google.android.material.R.style.TextAppearance_MaterialComponents_Headline6);
checkBox.setText(name); checkBox.setText(name);
@@ -85,7 +85,7 @@ public class CheckboxType extends FieldType {
isBlank = true; isBlank = true;
checkBox.setVisibility(View.GONE); checkBox.setVisibility(View.GONE);
} }
public DataType getViewValue(){ public RawDataType getViewValue(){
if(checkBox == null) return null; if(checkBox == null) return null;
if(checkBox.getVisibility() == View.GONE) return new IntType(name, IntType.nullval); if(checkBox.getVisibility() == View.GONE) return new IntType(name, IntType.nullval);
return new IntType(name, checkBox.isChecked() ? 1 : 0); return new IntType(name, checkBox.isChecked() ? 1 : 0);
@@ -96,7 +96,7 @@ public class CheckboxType extends FieldType {
public void add_individual_view(LinearLayout parent, DataType data){ public void add_individual_view(LinearLayout parent, RawDataType data){
if(data.isNull()) return; if(data.isNull()) return;
CheckBox cb = new CheckBox(parent.getContext()); CheckBox cb = new CheckBox(parent.getContext());
cb.setTextAppearance(com.google.android.material.R.style.TextAppearance_MaterialComponents_Headline6); cb.setTextAppearance(com.google.android.material.R.style.TextAppearance_MaterialComponents_Headline6);
@@ -107,7 +107,7 @@ public class CheckboxType extends FieldType {
} }
public void add_compiled_view(LinearLayout parent, DataType[] data){ public void add_compiled_view(LinearLayout parent, RawDataType[] data){
PieChart chart = new PieChart(parent.getContext()); PieChart chart = new PieChart(parent.getContext());
FrameLayout.LayoutParams layout = new FrameLayout.LayoutParams( FrameLayout.LayoutParams layout = new FrameLayout.LayoutParams(
ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT,
@@ -147,7 +147,7 @@ public class CheckboxType extends FieldType {
public void add_history_view(LinearLayout parent, DataType[] data){ public void add_history_view(LinearLayout parent, RawDataType[] data){
LineChart chart = new LineChart(parent.getContext()); LineChart chart = new LineChart(parent.getContext());
FrameLayout.LayoutParams layout = new FrameLayout.LayoutParams( FrameLayout.LayoutParams layout = new FrameLayout.LayoutParams(
ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT,
@@ -207,11 +207,11 @@ public class CheckboxType extends FieldType {
parent.addView(chart); parent.addView(chart);
} }
public void addDataToTable(TableLayout parent, Map<Integer, List<DataType>> data){ public void addDataToTable(TableLayout parent, Map<Integer, List<RawDataType>> data){
} }
public String toString(DataType data){ public String toString(RawDataType data){
return (int) data.get() == 1 ? "true" : "false"; return (int) data.get() == 1 ? "true" : "false";
} }
} }
@@ -15,9 +15,9 @@ import android.widget.LinearLayout;
import android.widget.TableLayout; import android.widget.TableLayout;
import android.widget.TextView; import android.widget.TextView;
import com.ridgebotics.ridgescout.types.data.DataType; import com.ridgebotics.ridgescout.types.data.RawDataType;
import com.ridgebotics.ridgescout.types.data.IntType; import com.ridgebotics.ridgescout.types.data.IntType;
import com.ridgebotics.ridgescout.ui.CustomSpinnerView; import com.ridgebotics.ridgescout.ui.views.CustomSpinnerView;
import com.ridgebotics.ridgescout.utility.BuiltByteParser; import com.ridgebotics.ridgescout.utility.BuiltByteParser;
import com.ridgebotics.ridgescout.utility.ByteBuilder; import com.ridgebotics.ridgescout.utility.ByteBuilder;
import com.github.mikephil.charting.charts.LineChart; import com.github.mikephil.charting.charts.LineChart;
@@ -40,7 +40,7 @@ public class DropdownType extends FieldType {
public String[] text_options; public String[] text_options;
public int get_byte_id() {return dropdownType;} public int get_byte_id() {return dropdownType;}
public inputTypes getInputType(){return inputTypes.DROPDOWN;} public inputTypes getInputType(){return inputTypes.DROPDOWN;}
public DataType.valueTypes getValueType(){return DataType.valueTypes.NUM;} public RawDataType.valueTypes getValueType(){return RawDataType.valueTypes.NUM;}
public Object get_fallback_value(){return 0;} public Object get_fallback_value(){return 0;}
public DropdownType(){}; public DropdownType(){};
public String get_type_name(){return "Dropdown";} public String get_type_name(){return "Dropdown";}
@@ -62,7 +62,7 @@ public class DropdownType extends FieldType {
public CustomSpinnerView dropdown = null; public CustomSpinnerView dropdown = null;
public View createView(Context context, Function<DataType, Integer> onUpdate){ public View createView(Context context, Function<RawDataType, Integer> onUpdate){
dropdown = new CustomSpinnerView(context); dropdown = new CustomSpinnerView(context);
ArrayList<String> iconSpinnerItems = new ArrayList<>(Arrays.asList(text_options)); ArrayList<String> iconSpinnerItems = new ArrayList<>(Arrays.asList(text_options));
@@ -92,7 +92,7 @@ public class DropdownType extends FieldType {
isBlank = true; isBlank = true;
dropdown.setVisibility(View.GONE); dropdown.setVisibility(View.GONE);
} }
public DataType getViewValue(){ public RawDataType getViewValue(){
if(dropdown == null) return null; if(dropdown == null) return null;
if(dropdown.getVisibility() == View.GONE) return new IntType(name, IntType.nullval); if(dropdown.getVisibility() == View.GONE) return new IntType(name, IntType.nullval);
return new IntType(name, dropdown.getIndex()); return new IntType(name, dropdown.getIndex());
@@ -103,7 +103,7 @@ public class DropdownType extends FieldType {
public void add_individual_view(LinearLayout parent, DataType data){ public void add_individual_view(LinearLayout parent, RawDataType data){
if(data.isNull()) return; if(data.isNull()) return;
TextView tv = new TextView(parent.getContext()); TextView tv = new TextView(parent.getContext());
tv.setLayoutParams(new FrameLayout.LayoutParams( tv.setLayoutParams(new FrameLayout.LayoutParams(
@@ -139,7 +139,7 @@ public class DropdownType extends FieldType {
return colors; return colors;
} }
public void add_compiled_view(LinearLayout parent, DataType[] data){ public void add_compiled_view(LinearLayout parent, RawDataType[] data){
PieChart chart = new PieChart(parent.getContext()); PieChart chart = new PieChart(parent.getContext());
FrameLayout.LayoutParams layout = new FrameLayout.LayoutParams( FrameLayout.LayoutParams layout = new FrameLayout.LayoutParams(
ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT,
@@ -173,7 +173,7 @@ public class DropdownType extends FieldType {
public void add_history_view(LinearLayout parent, DataType[] data){ public void add_history_view(LinearLayout parent, RawDataType[] data){
LineChart chart = new LineChart(parent.getContext()); LineChart chart = new LineChart(parent.getContext());
FrameLayout.LayoutParams layout = new FrameLayout.LayoutParams( FrameLayout.LayoutParams layout = new FrameLayout.LayoutParams(
ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT,
@@ -239,11 +239,11 @@ public class DropdownType extends FieldType {
parent.addView(chart); parent.addView(chart);
} }
public void addDataToTable(TableLayout parent, Map<Integer, List<DataType>> data){ public void addDataToTable(TableLayout parent, Map<Integer, List<RawDataType>> data){
} }
public String toString(DataType data){ public String toString(RawDataType data){
return text_options[(int) data.get()]; return text_options[(int) data.get()];
} }
} }
@@ -5,7 +5,7 @@ import android.view.View;
import android.widget.LinearLayout; import android.widget.LinearLayout;
import android.widget.TableLayout; import android.widget.TableLayout;
import com.ridgebotics.ridgescout.types.data.DataType; import com.ridgebotics.ridgescout.types.data.RawDataType;
import com.ridgebotics.ridgescout.utility.BuiltByteParser; import com.ridgebotics.ridgescout.utility.BuiltByteParser;
import com.ridgebotics.ridgescout.utility.ByteBuilder; import com.ridgebotics.ridgescout.utility.ByteBuilder;
@@ -14,7 +14,9 @@ import java.util.List;
import java.util.Map; import java.util.Map;
import java.util.function.Function; import java.util.function.Function;
// Abstract class for fields.
public abstract class FieldType { public abstract class FieldType {
// Define what the IDS are for each type
public static final int slider_type_id = 255; public static final int slider_type_id = 255;
public static final int dropdownType = 254; public static final int dropdownType = 254;
public static final int notesType = 253; public static final int notesType = 253;
@@ -37,7 +39,7 @@ public abstract class FieldType {
public String description; public String description;
public Object default_value; public Object default_value;
public abstract inputTypes getInputType(); public abstract inputTypes getInputType();
public abstract DataType.valueTypes getValueType(); public abstract RawDataType.valueTypes getValueType();
public abstract Object get_fallback_value(); public abstract Object get_fallback_value();
public abstract int get_byte_id(); public abstract int get_byte_id();
public FieldType(){} public FieldType(){}
@@ -80,24 +82,24 @@ public abstract class FieldType {
// public abstract dataType[] getConfig(); // public abstract dataType[] getConfig();
// public abstract void setConfig(dataType[] config); // public abstract void setConfig(dataType[] config);
public abstract View createView(Context context, Function<DataType, Integer> onUpdate); public abstract View createView(Context context, Function<RawDataType, Integer> onUpdate);
public boolean isBlank = false; public boolean isBlank = false;
public abstract void nullify(); public abstract void nullify();
public void setViewValue(DataType type){setViewValue(type.get());} public void setViewValue(RawDataType type){setViewValue(type.get());}
public abstract void setViewValue(Object value); public abstract void setViewValue(Object value);
public abstract DataType getViewValue(); public abstract RawDataType getViewValue();
public abstract void add_individual_view(LinearLayout parent, DataType data); public abstract void add_individual_view(LinearLayout parent, RawDataType data);
public abstract void add_compiled_view(LinearLayout parent, DataType[] data); public abstract void add_compiled_view(LinearLayout parent, RawDataType[] data);
public abstract void add_history_view(LinearLayout parent, DataType[] data); public abstract void add_history_view(LinearLayout parent, RawDataType[] data);
public abstract void addDataToTable(TableLayout parent, Map<Integer, List<DataType>> data); public abstract void addDataToTable(TableLayout parent, Map<Integer, List<RawDataType>> data);
public abstract String toString(DataType data); public abstract String toString(RawDataType data);
} }
@@ -1,6 +1,5 @@
package com.ridgebotics.ridgescout.types.input; package com.ridgebotics.ridgescout.types.input;
import static com.ridgebotics.ridgescout.utility.Colors.background_color;
import static com.ridgebotics.ridgescout.utility.Colors.chart_background; import static com.ridgebotics.ridgescout.utility.Colors.chart_background;
import static com.ridgebotics.ridgescout.utility.Colors.chart_text; import static com.ridgebotics.ridgescout.utility.Colors.chart_text;
import static com.ridgebotics.ridgescout.utility.Colors.dropdown_value_text_1; import static com.ridgebotics.ridgescout.utility.Colors.dropdown_value_text_1;
@@ -8,7 +7,6 @@ import static com.ridgebotics.ridgescout.utility.Colors.dropdown_value_text_2;
import static com.ridgebotics.ridgescout.utility.Colors.fieldpos_data; import static com.ridgebotics.ridgescout.utility.Colors.fieldpos_data;
import android.content.Context; import android.content.Context;
import android.graphics.Color;
import android.view.View; import android.view.View;
import android.view.ViewGroup; import android.view.ViewGroup;
import android.widget.FrameLayout; import android.widget.FrameLayout;
@@ -20,10 +18,10 @@ import com.github.mikephil.charting.components.Legend;
import com.github.mikephil.charting.data.Entry; import com.github.mikephil.charting.data.Entry;
import com.github.mikephil.charting.data.LineData; import com.github.mikephil.charting.data.LineData;
import com.github.mikephil.charting.data.LineDataSet; import com.github.mikephil.charting.data.LineDataSet;
import com.ridgebotics.ridgescout.types.data.DataType; import com.ridgebotics.ridgescout.types.data.RawDataType;
import com.ridgebotics.ridgescout.types.data.IntArrType; import com.ridgebotics.ridgescout.types.data.IntArrType;
import com.ridgebotics.ridgescout.ui.scouting.FieldPosView; import com.ridgebotics.ridgescout.ui.views.FieldPosView;
import com.ridgebotics.ridgescout.ui.scouting.MultiFieldPosView; import com.ridgebotics.ridgescout.ui.views.MultiFieldPosView;
import com.ridgebotics.ridgescout.utility.BuiltByteParser; import com.ridgebotics.ridgescout.utility.BuiltByteParser;
import com.ridgebotics.ridgescout.utility.ByteBuilder; import com.ridgebotics.ridgescout.utility.ByteBuilder;
@@ -35,7 +33,7 @@ import java.util.function.Function;
public class FieldposType extends FieldType { public class FieldposType extends FieldType {
public int get_byte_id() {return fieldposType;} public int get_byte_id() {return fieldposType;}
public inputTypes getInputType(){return inputTypes.FIELDPOS;} public inputTypes getInputType(){return inputTypes.FIELDPOS;}
public DataType.valueTypes getValueType(){return DataType.valueTypes.NUM;} public RawDataType.valueTypes getValueType(){return RawDataType.valueTypes.NUM;}
public Object get_fallback_value(){return 0;} public Object get_fallback_value(){return 0;}
public FieldposType(){} public FieldposType(){}
public String get_type_name(){return "Field Pos";} public String get_type_name(){return "Field Pos";}
@@ -62,7 +60,7 @@ public class FieldposType extends FieldType {
public FieldPosView field = null; public FieldPosView field = null;
public View createView(Context context, Function<DataType, Integer> onUpdate){ public View createView(Context context, Function<RawDataType, Integer> onUpdate){
field = new FieldPosView(context, pos -> { field = new FieldPosView(context, pos -> {
onUpdate.apply(new IntArrType(name, pos)); onUpdate.apply(new IntArrType(name, pos));
}); });
@@ -90,7 +88,7 @@ public class FieldposType extends FieldType {
isBlank = true; isBlank = true;
field.setVisibility(View.GONE); field.setVisibility(View.GONE);
} }
public DataType getViewValue(){ public RawDataType getViewValue(){
if(field == null) return null; if(field == null) return null;
if(field.getVisibility() == View.GONE) return IntArrType.newNull(name); if(field.getVisibility() == View.GONE) return IntArrType.newNull(name);
return new IntArrType(name, field.getPos()); return new IntArrType(name, field.getPos());
@@ -98,7 +96,7 @@ public class FieldposType extends FieldType {
public void add_individual_view(LinearLayout parent, DataType data){ public void add_individual_view(LinearLayout parent, RawDataType data){
if(data.isNull()) return; if(data.isNull()) return;
FieldPosView fp = new FieldPosView(parent.getContext()); FieldPosView fp = new FieldPosView(parent.getContext());
@@ -141,7 +139,7 @@ public class FieldposType extends FieldType {
return entries; return entries;
} }
private static int findMin(DataType[] data){ private static int findMin(RawDataType[] data){
int min = (int)data[0].get(); int min = (int)data[0].get();
for(int i = 1; i < data.length; i++) for(int i = 1; i < data.length; i++)
if((int)data[i].get() < min) if((int)data[i].get() < min)
@@ -149,7 +147,7 @@ public class FieldposType extends FieldType {
return min; return min;
} }
private static int findMax(DataType[] data){ private static int findMax(RawDataType[] data){
int max = (int)data[0].get(); int max = (int)data[0].get();
for(int i = 1; i < data.length; i++) for(int i = 1; i < data.length; i++)
if((int)data[i].get() > max) if((int)data[i].get() > max)
@@ -157,7 +155,7 @@ public class FieldposType extends FieldType {
return max; return max;
} }
public void add_compiled_view(LinearLayout parent, DataType[] data){ public void add_compiled_view(LinearLayout parent, RawDataType[] data){
MultiFieldPosView mfp = new MultiFieldPosView(parent.getContext()); MultiFieldPosView mfp = new MultiFieldPosView(parent.getContext());
for(int i = 0; i < data.length; i++){ for(int i = 0; i < data.length; i++){
if(data[i].isNull()) continue; if(data[i].isNull()) continue;
@@ -166,7 +164,7 @@ public class FieldposType extends FieldType {
parent.addView(mfp); parent.addView(mfp);
} }
public void add_history_view(LinearLayout parent, DataType[] data){ public void add_history_view(LinearLayout parent, RawDataType[] data){
LineChart chart = new LineChart(parent.getContext()); LineChart chart = new LineChart(parent.getContext());
FrameLayout.LayoutParams layout = new FrameLayout.LayoutParams( FrameLayout.LayoutParams layout = new FrameLayout.LayoutParams(
ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT,
@@ -223,11 +221,11 @@ public class FieldposType extends FieldType {
parent.addView(chart); parent.addView(chart);
} }
public void addDataToTable(TableLayout parent, Map<Integer, List<DataType>> data){ public void addDataToTable(TableLayout parent, Map<Integer, List<RawDataType>> data){
} }
public String toString(DataType data){ public String toString(RawDataType data){
int[] intarr = (int[]) data.get(); int[] intarr = (int[]) data.get();
return "[" + intarr[0] + "," + intarr[1] + "]"; return "[" + intarr[0] + "," + intarr[1] + "]";
} }
@@ -2,7 +2,6 @@ package com.ridgebotics.ridgescout.types.input;
import static android.text.InputType.TYPE_CLASS_NUMBER; import static android.text.InputType.TYPE_CLASS_NUMBER;
import static com.ridgebotics.ridgescout.utility.Colors.background_color;
import static com.ridgebotics.ridgescout.utility.Colors.chart_background; import static com.ridgebotics.ridgescout.utility.Colors.chart_background;
import static com.ridgebotics.ridgescout.utility.Colors.chart_text; import static com.ridgebotics.ridgescout.utility.Colors.chart_text;
import static com.ridgebotics.ridgescout.utility.Colors.dropdown_value_text_1; import static com.ridgebotics.ridgescout.utility.Colors.dropdown_value_text_1;
@@ -10,7 +9,6 @@ import static com.ridgebotics.ridgescout.utility.Colors.dropdown_value_text_2;
import static com.ridgebotics.ridgescout.utility.Colors.number_data; import static com.ridgebotics.ridgescout.utility.Colors.number_data;
import android.content.Context; import android.content.Context;
import android.graphics.Color;
import android.text.Editable; import android.text.Editable;
import android.text.TextWatcher; import android.text.TextWatcher;
import android.view.Gravity; import android.view.Gravity;
@@ -27,7 +25,7 @@ import com.github.mikephil.charting.components.Legend;
import com.github.mikephil.charting.data.Entry; import com.github.mikephil.charting.data.Entry;
import com.github.mikephil.charting.data.LineData; import com.github.mikephil.charting.data.LineData;
import com.github.mikephil.charting.data.LineDataSet; import com.github.mikephil.charting.data.LineDataSet;
import com.ridgebotics.ridgescout.types.data.DataType; import com.ridgebotics.ridgescout.types.data.RawDataType;
import com.ridgebotics.ridgescout.types.data.IntType; import com.ridgebotics.ridgescout.types.data.IntType;
import com.ridgebotics.ridgescout.utility.BuiltByteParser; import com.ridgebotics.ridgescout.utility.BuiltByteParser;
import com.ridgebotics.ridgescout.utility.ByteBuilder; import com.ridgebotics.ridgescout.utility.ByteBuilder;
@@ -40,7 +38,7 @@ import java.util.function.Function;
public class NumberType extends FieldType { public class NumberType extends FieldType {
public int get_byte_id() {return numberType;} public int get_byte_id() {return numberType;}
public inputTypes getInputType(){return inputTypes.NUMBER;} public inputTypes getInputType(){return inputTypes.NUMBER;}
public DataType.valueTypes getValueType(){return DataType.valueTypes.NUM;} public RawDataType.valueTypes getValueType(){return RawDataType.valueTypes.NUM;}
public Object get_fallback_value(){return 0;} public Object get_fallback_value(){return 0;}
public NumberType(){} public NumberType(){}
public String get_type_name(){return "Number";} public String get_type_name(){return "Number";}
@@ -66,7 +64,7 @@ public class NumberType extends FieldType {
public EditText num = null; public EditText num = null;
public View createView(Context context, Function<DataType, Integer> onUpdate){ public View createView(Context context, Function<RawDataType, Integer> onUpdate){
num = new EditText(context); num = new EditText(context);
num.setInputType(TYPE_CLASS_NUMBER); num.setInputType(TYPE_CLASS_NUMBER);
num.addTextChangedListener(new TextWatcher() { num.addTextChangedListener(new TextWatcher() {
@@ -97,7 +95,7 @@ public class NumberType extends FieldType {
isBlank = true; isBlank = true;
num.setVisibility(View.GONE); num.setVisibility(View.GONE);
} }
public DataType getViewValue(){ public RawDataType getViewValue(){
if(num == null) return null; if(num == null) return null;
if(num.getVisibility() == View.GONE) return IntType.newNull(name); if(num.getVisibility() == View.GONE) return IntType.newNull(name);
return new IntType(name, safeToInt(num.getText().toString())); return new IntType(name, safeToInt(num.getText().toString()));
@@ -118,7 +116,7 @@ public class NumberType extends FieldType {
public void add_individual_view(LinearLayout parent, DataType data){ public void add_individual_view(LinearLayout parent, RawDataType data){
if(data.isNull()) return; if(data.isNull()) return;
TextView tv = new TextView(parent.getContext()); TextView tv = new TextView(parent.getContext());
@@ -165,7 +163,7 @@ public class NumberType extends FieldType {
return entries; return entries;
} }
private static int findMin(DataType[] data){ private static int findMin(RawDataType[] data){
int min = (int)data[0].get(); int min = (int)data[0].get();
for(int i = 1; i < data.length; i++) for(int i = 1; i < data.length; i++)
if((int)data[i].get() < min) if((int)data[i].get() < min)
@@ -173,7 +171,7 @@ public class NumberType extends FieldType {
return min; return min;
} }
private static int findMax(DataType[] data){ private static int findMax(RawDataType[] data){
int max = (int)data[0].get(); int max = (int)data[0].get();
for(int i = 1; i < data.length; i++) for(int i = 1; i < data.length; i++)
if((int)data[i].get() > max) if((int)data[i].get() > max)
@@ -181,7 +179,7 @@ public class NumberType extends FieldType {
return max; return max;
} }
public void add_compiled_view(LinearLayout parent, DataType[] data){ public void add_compiled_view(LinearLayout parent, RawDataType[] data){
LineChart chart = new LineChart(parent.getContext()); LineChart chart = new LineChart(parent.getContext());
FrameLayout.LayoutParams layout = new FrameLayout.LayoutParams( FrameLayout.LayoutParams layout = new FrameLayout.LayoutParams(
ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT,
@@ -260,7 +258,7 @@ public class NumberType extends FieldType {
public void add_history_view(LinearLayout parent, DataType[] data){ public void add_history_view(LinearLayout parent, RawDataType[] data){
LineChart chart = new LineChart(parent.getContext()); LineChart chart = new LineChart(parent.getContext());
FrameLayout.LayoutParams layout = new FrameLayout.LayoutParams( FrameLayout.LayoutParams layout = new FrameLayout.LayoutParams(
ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT,
@@ -318,11 +316,11 @@ public class NumberType extends FieldType {
parent.addView(chart); parent.addView(chart);
} }
public void addDataToTable(TableLayout parent, Map<Integer, List<DataType>> data){ public void addDataToTable(TableLayout parent, Map<Integer, List<RawDataType>> data){
} }
public String toString(DataType data){ public String toString(RawDataType data){
return String.valueOf((int) data.get()); return String.valueOf((int) data.get());
} }
} }
@@ -7,7 +7,6 @@ import static com.ridgebotics.ridgescout.utility.Colors.dropdown_value_text_2;
import static com.ridgebotics.ridgescout.utility.Colors.slider_data; import static com.ridgebotics.ridgescout.utility.Colors.slider_data;
import android.content.Context; import android.content.Context;
import android.graphics.Color;
import android.view.View; import android.view.View;
import android.view.ViewGroup; import android.view.ViewGroup;
import android.widget.FrameLayout; import android.widget.FrameLayout;
@@ -16,7 +15,7 @@ import android.widget.TableLayout;
import androidx.annotation.NonNull; import androidx.annotation.NonNull;
import com.ridgebotics.ridgescout.types.data.DataType; import com.ridgebotics.ridgescout.types.data.RawDataType;
import com.ridgebotics.ridgescout.types.data.IntType; import com.ridgebotics.ridgescout.types.data.IntType;
import com.ridgebotics.ridgescout.utility.AlertManager; import com.ridgebotics.ridgescout.utility.AlertManager;
import com.ridgebotics.ridgescout.utility.BuiltByteParser; import com.ridgebotics.ridgescout.utility.BuiltByteParser;
@@ -39,7 +38,7 @@ public class SliderType extends FieldType {
public int max; public int max;
public int get_byte_id() {return slider_type_id;} public int get_byte_id() {return slider_type_id;}
public inputTypes getInputType(){return inputTypes.SLIDER;} public inputTypes getInputType(){return inputTypes.SLIDER;}
public DataType.valueTypes getValueType(){return DataType.valueTypes.NUM;} public RawDataType.valueTypes getValueType(){return RawDataType.valueTypes.NUM;}
public Object get_fallback_value(){return 0;} public Object get_fallback_value(){return 0;}
public SliderType(){}; public SliderType(){};
public String get_type_name(){return "Slider";} public String get_type_name(){return "Slider";}
@@ -69,7 +68,7 @@ public class SliderType extends FieldType {
public Slider slider = null; public Slider slider = null;
public View createView(Context context, Function<DataType, Integer> onUpdate){ public View createView(Context context, Function<RawDataType, Integer> onUpdate){
slider = new Slider(context); slider = new Slider(context);
setViewValue(default_value); setViewValue(default_value);
slider.setStepSize((float) 1 / (max-min)); slider.setStepSize((float) 1 / (max-min));
@@ -104,7 +103,7 @@ public class SliderType extends FieldType {
slider.setVisibility(View.VISIBLE); slider.setVisibility(View.VISIBLE);
} }
public DataType getViewValue(){ public RawDataType getViewValue(){
if(slider == null) return null; if(slider == null) return null;
if(slider.getVisibility() == View.GONE) return IntType.newNull(name); if(slider.getVisibility() == View.GONE) return IntType.newNull(name);
return new IntType(name, min + (int) (slider.getValue() * (max-min))); return new IntType(name, min + (int) (slider.getValue() * (max-min)));
@@ -119,7 +118,7 @@ public class SliderType extends FieldType {
public void add_individual_view(LinearLayout parent, DataType data){ public void add_individual_view(LinearLayout parent, RawDataType data){
if(data.isNull()) return; if(data.isNull()) return;
Slider slider = new Slider(parent.getContext()); Slider slider = new Slider(parent.getContext());
@@ -173,7 +172,7 @@ public class SliderType extends FieldType {
return entries; return entries;
} }
public void add_compiled_view(LinearLayout parent, DataType[] data){ public void add_compiled_view(LinearLayout parent, RawDataType[] data){
LineChart chart = new LineChart(parent.getContext()); LineChart chart = new LineChart(parent.getContext());
FrameLayout.LayoutParams layout = new FrameLayout.LayoutParams( FrameLayout.LayoutParams layout = new FrameLayout.LayoutParams(
ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT,
@@ -249,7 +248,7 @@ public class SliderType extends FieldType {
public void add_history_view(LinearLayout parent, DataType[] data){ public void add_history_view(LinearLayout parent, RawDataType[] data){
LineChart chart = new LineChart(parent.getContext()); LineChart chart = new LineChart(parent.getContext());
FrameLayout.LayoutParams layout = new FrameLayout.LayoutParams( FrameLayout.LayoutParams layout = new FrameLayout.LayoutParams(
ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT,
@@ -304,11 +303,11 @@ public class SliderType extends FieldType {
parent.addView(chart); parent.addView(chart);
} }
public void addDataToTable(TableLayout parent, Map<Integer, List<DataType>> data){ public void addDataToTable(TableLayout parent, Map<Integer, List<RawDataType>> data){
} }
public String toString(DataType data){ public String toString(RawDataType data){
return String.valueOf((int) data.get()); return String.valueOf((int) data.get());
} }
} }
@@ -7,7 +7,6 @@ import static com.ridgebotics.ridgescout.utility.Colors.dropdown_value_text_2;
import static com.ridgebotics.ridgescout.utility.Colors.tally_data; import static com.ridgebotics.ridgescout.utility.Colors.tally_data;
import android.content.Context; import android.content.Context;
import android.graphics.Color;
import android.view.Gravity; import android.view.Gravity;
import android.view.View; import android.view.View;
import android.view.ViewGroup; import android.view.ViewGroup;
@@ -17,12 +16,12 @@ import android.widget.TableLayout;
import android.widget.TableRow; import android.widget.TableRow;
import android.widget.TextView; import android.widget.TextView;
import com.ridgebotics.ridgescout.types.data.DataType; import com.ridgebotics.ridgescout.types.data.RawDataType;
import com.ridgebotics.ridgescout.types.data.IntType; import com.ridgebotics.ridgescout.types.data.IntType;
import com.ridgebotics.ridgescout.ui.CandlestickHeader; import com.ridgebotics.ridgescout.ui.views.CandlestickHeader;
import com.ridgebotics.ridgescout.ui.CandlestickView; import com.ridgebotics.ridgescout.ui.views.CandlestickView;
import com.ridgebotics.ridgescout.ui.data.DataProcessing; import com.ridgebotics.ridgescout.ui.data.DataProcessing;
import com.ridgebotics.ridgescout.ui.scouting.TallyCounterView; import com.ridgebotics.ridgescout.ui.views.TallyCounterView;
import com.ridgebotics.ridgescout.utility.BuiltByteParser; import com.ridgebotics.ridgescout.utility.BuiltByteParser;
import com.ridgebotics.ridgescout.utility.ByteBuilder; import com.ridgebotics.ridgescout.utility.ByteBuilder;
import com.github.mikephil.charting.charts.LineChart; import com.github.mikephil.charting.charts.LineChart;
@@ -40,7 +39,7 @@ import java.util.function.Function;
public class TallyType extends FieldType { public class TallyType extends FieldType {
public int get_byte_id() {return tallyType;} public int get_byte_id() {return tallyType;}
public inputTypes getInputType(){return inputTypes.TALLY;} public inputTypes getInputType(){return inputTypes.TALLY;}
public DataType.valueTypes getValueType(){return DataType.valueTypes.NUM;} public RawDataType.valueTypes getValueType(){return RawDataType.valueTypes.NUM;}
public Object get_fallback_value(){return 0;} public Object get_fallback_value(){return 0;}
public TallyType(){} public TallyType(){}
public String get_type_name(){return "Tally";} public String get_type_name(){return "Tally";}
@@ -66,7 +65,7 @@ public class TallyType extends FieldType {
public TallyCounterView tally = null; public TallyCounterView tally = null;
public View createView(Context context, Function<DataType, Integer> onUpdate){ public View createView(Context context, Function<RawDataType, Integer> onUpdate){
tally = new TallyCounterView(context); tally = new TallyCounterView(context);
tally.setOnCountChangedListener(n -> onUpdate.apply(getViewValue())); tally.setOnCountChangedListener(n -> onUpdate.apply(getViewValue()));
@@ -91,7 +90,7 @@ public class TallyType extends FieldType {
isBlank = true; isBlank = true;
tally.setVisibility(View.GONE); tally.setVisibility(View.GONE);
} }
public DataType getViewValue(){ public RawDataType getViewValue(){
if(tally == null) return null; if(tally == null) return null;
if(tally.getVisibility() == View.GONE) return IntType.newNull(name); if(tally.getVisibility() == View.GONE) return IntType.newNull(name);
return new IntType(name, tally.getValue()); return new IntType(name, tally.getValue());
@@ -102,7 +101,7 @@ public class TallyType extends FieldType {
public void add_individual_view(LinearLayout parent, DataType data){ public void add_individual_view(LinearLayout parent, RawDataType data){
if(data.isNull()) return; if(data.isNull()) return;
TextView tv = new TextView(parent.getContext()); TextView tv = new TextView(parent.getContext());
@@ -149,7 +148,7 @@ public class TallyType extends FieldType {
return entries; return entries;
} }
private static int findMin(DataType[] data){ private static int findMin(RawDataType[] data){
int min = (int)data[0].get(); int min = (int)data[0].get();
for(int i = 1; i < data.length; i++) for(int i = 1; i < data.length; i++)
if((int)data[i].get() < min) if((int)data[i].get() < min)
@@ -157,7 +156,7 @@ public class TallyType extends FieldType {
return min; return min;
} }
private static int findMax(DataType[] data){ private static int findMax(RawDataType[] data){
int max = (int)data[0].get(); int max = (int)data[0].get();
for(int i = 1; i < data.length; i++) for(int i = 1; i < data.length; i++)
if((int)data[i].get() > max) if((int)data[i].get() > max)
@@ -165,7 +164,7 @@ public class TallyType extends FieldType {
return max; return max;
} }
public void add_compiled_view(LinearLayout parent, DataType[] data){ public void add_compiled_view(LinearLayout parent, RawDataType[] data){
LineChart chart = new LineChart(parent.getContext()); LineChart chart = new LineChart(parent.getContext());
FrameLayout.LayoutParams layout = new FrameLayout.LayoutParams( FrameLayout.LayoutParams layout = new FrameLayout.LayoutParams(
ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT,
@@ -244,7 +243,7 @@ public class TallyType extends FieldType {
public void add_history_view(LinearLayout parent, DataType[] data){ public void add_history_view(LinearLayout parent, RawDataType[] data){
LineChart chart = new LineChart(parent.getContext()); LineChart chart = new LineChart(parent.getContext());
FrameLayout.LayoutParams layout = new FrameLayout.LayoutParams( FrameLayout.LayoutParams layout = new FrameLayout.LayoutParams(
ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT,
@@ -302,7 +301,7 @@ public class TallyType extends FieldType {
parent.addView(chart); parent.addView(chart);
} }
public void addDataToTable(TableLayout parent, Map<Integer, List<DataType>> data){ public void addDataToTable(TableLayout parent, Map<Integer, List<RawDataType>> data){
int[] tmp_abs_bounds = DataProcessing.getNumberBounds(data); int[] tmp_abs_bounds = DataProcessing.getNumberBounds(data);
int absmin = tmp_abs_bounds[0]; int absmin = tmp_abs_bounds[0];
int absmax = tmp_abs_bounds[1]; int absmax = tmp_abs_bounds[1];
@@ -361,7 +360,7 @@ public class TallyType extends FieldType {
} }
} }
public String toString(DataType data){ public String toString(RawDataType data){
return String.valueOf((int) data.get()); return String.valueOf((int) data.get());
} }
} }
@@ -7,7 +7,6 @@ import static com.ridgebotics.ridgescout.utility.Colors.dropdown_value_text_2;
import static com.ridgebotics.ridgescout.utility.Colors.text_data; import static com.ridgebotics.ridgescout.utility.Colors.text_data;
import android.content.Context; import android.content.Context;
import android.graphics.Color;
import android.text.Editable; import android.text.Editable;
import android.text.TextWatcher; import android.text.TextWatcher;
import android.view.Gravity; import android.view.Gravity;
@@ -19,7 +18,7 @@ import android.widget.LinearLayout;
import android.widget.TableLayout; import android.widget.TableLayout;
import android.widget.TextView; import android.widget.TextView;
import com.ridgebotics.ridgescout.types.data.DataType; import com.ridgebotics.ridgescout.types.data.RawDataType;
import com.ridgebotics.ridgescout.types.data.StringType; import com.ridgebotics.ridgescout.types.data.StringType;
import com.ridgebotics.ridgescout.utility.SentimentAnalysis; import com.ridgebotics.ridgescout.utility.SentimentAnalysis;
import com.ridgebotics.ridgescout.utility.BuiltByteParser; import com.ridgebotics.ridgescout.utility.BuiltByteParser;
@@ -39,7 +38,7 @@ public class TextType extends FieldType {
public int get_byte_id() {return notesType;} public int get_byte_id() {return notesType;}
public inputTypes getInputType(){return inputTypes.NOTES_INPUT;} public inputTypes getInputType(){return inputTypes.NOTES_INPUT;}
public DataType.valueTypes getValueType(){return DataType.valueTypes.STRING;} public RawDataType.valueTypes getValueType(){return RawDataType.valueTypes.STRING;}
public Object get_fallback_value(){return "<no-notes>";} public Object get_fallback_value(){return "<no-notes>";}
public TextType(){} public TextType(){}
public TextType(String UUID, String name, String description, String default_text){ public TextType(String UUID, String name, String description, String default_text){
@@ -76,7 +75,7 @@ public class TextType extends FieldType {
public EditText text = null; public EditText text = null;
public View createView(Context context, Function<DataType, Integer> onUpdate){ public View createView(Context context, Function<RawDataType, Integer> onUpdate){
text = new EditText(context); text = new EditText(context);
text.setText((String)default_value); text.setText((String)default_value);
text.addTextChangedListener(new TextWatcher() { text.addTextChangedListener(new TextWatcher() {
@@ -102,7 +101,7 @@ public class TextType extends FieldType {
isBlank = true; isBlank = true;
text.setVisibility(View.GONE); text.setVisibility(View.GONE);
} }
public DataType getViewValue(){ public RawDataType getViewValue(){
if(text == null) return null; if(text == null) return null;
if(text.getVisibility() == View.GONE) return new StringType(name, StringType.nullval); if(text.getVisibility() == View.GONE) return new StringType(name, StringType.nullval);
return new StringType(name, text.getText().toString()); return new StringType(name, text.getText().toString());
@@ -111,7 +110,7 @@ public class TextType extends FieldType {
public void add_individual_view(LinearLayout parent, DataType data){ public void add_individual_view(LinearLayout parent, RawDataType data){
if(data.isNull()) return; if(data.isNull()) return;
TextView tv = new TextView(parent.getContext()); TextView tv = new TextView(parent.getContext());
tv.setLayoutParams(new FrameLayout.LayoutParams( tv.setLayoutParams(new FrameLayout.LayoutParams(
@@ -141,7 +140,7 @@ public class TextType extends FieldType {
TextView positive_text; TextView positive_text;
public void add_compiled_view(LinearLayout parent, DataType[] data) { public void add_compiled_view(LinearLayout parent, RawDataType[] data) {
positive_mean = 0; positive_mean = 0;
count = 0; count = 0;
@@ -170,7 +169,7 @@ public class TextType extends FieldType {
} }
public void add_history_view(LinearLayout parent, DataType[] data){ public void add_history_view(LinearLayout parent, RawDataType[] data){
LineChart chart = new LineChart(parent.getContext()); LineChart chart = new LineChart(parent.getContext());
FrameLayout.LayoutParams layout = new FrameLayout.LayoutParams( FrameLayout.LayoutParams layout = new FrameLayout.LayoutParams(
ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT,
@@ -229,11 +228,11 @@ public class TextType extends FieldType {
} }
public void addDataToTable(TableLayout parent, Map<Integer, List<DataType>> data){ public void addDataToTable(TableLayout parent, Map<Integer, List<RawDataType>> data){
} }
public String toString(DataType data){ public String toString(RawDataType data){
return String.valueOf(data.get()); return String.valueOf(data.get());
} }
} }
@@ -1,94 +0,0 @@
package com.ridgebotics.ridgescout.ui;
import static com.ridgebotics.ridgescout.utility.DataManager.evcode;
import static com.ridgebotics.ridgescout.utility.DataManager.event;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TableLayout;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.fragment.app.Fragment;
import com.ridgebotics.ridgescout.databinding.FragmentTeamSelectorBinding;
import com.ridgebotics.ridgescout.types.frcTeam;
import com.ridgebotics.ridgescout.utility.AlertManager;
import com.ridgebotics.ridgescout.utility.DataManager;
import java.util.Arrays;
public class TeamSelectorFragment extends Fragment {
private FragmentTeamSelectorBinding binding;
private static boolean pits_mode;
public static void setPits_mode(boolean mode){
pits_mode = mode;
}
private static onTeamSelected onSelect = new onTeamSelected() {@Override public void onSelect(TeamSelectorFragment self, frcTeam team) {}};
public interface onTeamSelected {
void onSelect(TeamSelectorFragment self, frcTeam team);
}
public static void setOnSelect(onTeamSelected tmponSelect){
onSelect = tmponSelect;
}
@Override
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container,
@Nullable Bundle savedInstanceState) {
binding = FragmentTeamSelectorBinding.inflate(inflater, container, false);
// event = fileEditor.g
DataManager.reload_event();
if(evcode == null || evcode.equals("unset")){
AlertManager.addSimpleError("You somehow have not loaded an event!");
return binding.getRoot();
}
load_teams();
return binding.getRoot();
}
public void load_teams(){
int[] teamNums = new int[event.teams.size()];
for(int i = 0 ; i < event.teams.size(); i++){
teamNums[i] = event.teams.get(i).teamNumber;
}
Arrays.sort(teamNums);
TableLayout table = new TableLayout(getContext());
table.setStretchAllColumns(true);
binding.teams.addView(table);
for(int i = 0; i < event.teams.size(); i++){
frcTeam team = null;
for(int a = 0 ; a < event.teams.size(); a++){
if(event.teams.get(a).teamNumber == teamNums[i]){
team = event.teams.get(a);
break;
}
}
assert team != null;
TeamListOption teamRow = new TeamListOption(getContext());
table.addView(teamRow);
teamRow.fromTeam(team);
frcTeam finalTeam = team;
teamRow.setOnClickListener(v -> {
onSelect.onSelect(this, finalTeam);
});
}
}
}
@@ -3,7 +3,6 @@ package com.ridgebotics.ridgescout.ui.data;
import static android.view.View.GONE; import static android.view.View.GONE;
import static android.view.View.VISIBLE; import static android.view.View.VISIBLE;
import static androidx.navigation.fragment.FragmentKt.findNavController;
import static com.ridgebotics.ridgescout.utility.Colors.datafragment_option_1; import static com.ridgebotics.ridgescout.utility.Colors.datafragment_option_1;
import static com.ridgebotics.ridgescout.utility.Colors.datafragment_option_2; import static com.ridgebotics.ridgescout.utility.Colors.datafragment_option_2;
@@ -20,12 +19,10 @@ import android.view.ViewGroup;
import androidx.annotation.NonNull; import androidx.annotation.NonNull;
import androidx.annotation.Nullable; import androidx.annotation.Nullable;
import androidx.fragment.app.Fragment; import androidx.fragment.app.Fragment;
import androidx.fragment.app.FragmentTransaction;
import com.ridgebotics.ridgescout.R;
import com.ridgebotics.ridgescout.types.frcTeam; import com.ridgebotics.ridgescout.types.frcTeam;
import com.ridgebotics.ridgescout.ui.FieldBorderedRow; import com.ridgebotics.ridgescout.ui.views.FieldBorderedRow;
import com.ridgebotics.ridgescout.ui.TeamListOption; import com.ridgebotics.ridgescout.ui.views.TeamListOption;
import com.ridgebotics.ridgescout.utility.DataManager; import com.ridgebotics.ridgescout.utility.DataManager;
import com.ridgebotics.ridgescout.utility.SettingsManager; import com.ridgebotics.ridgescout.utility.SettingsManager;
import com.ridgebotics.ridgescout.databinding.FragmentDataBinding; import com.ridgebotics.ridgescout.databinding.FragmentDataBinding;
@@ -33,6 +30,9 @@ import com.ridgebotics.ridgescout.databinding.FragmentDataBinding;
import java.util.Arrays; import java.util.Arrays;
import java.util.List; import java.util.List;
// Fragment for the menu of the data tab.
// Shows either by field type or by team.
// This is held in a sub-fragment under DataParentFragment
public class DataFragment extends Fragment { public class DataFragment extends Fragment {
private FragmentDataBinding binding; private FragmentDataBinding binding;
@@ -4,17 +4,11 @@ package com.ridgebotics.ridgescout.ui.data;
import static android.content.Context.CLIPBOARD_SERVICE; import static android.content.Context.CLIPBOARD_SERVICE;
import static android.view.View.GONE; import static android.view.View.GONE;
import static android.view.View.VISIBLE; import static android.view.View.VISIBLE;
import static androidx.core.content.ContextCompat.getSystemService;
import static androidx.navigation.fragment.FragmentKt.findNavController;
import static com.ridgebotics.ridgescout.utility.Colors.datafragment_option_1;
import static com.ridgebotics.ridgescout.utility.Colors.datafragment_option_2;
import static com.ridgebotics.ridgescout.utility.DataManager.evcode; import static com.ridgebotics.ridgescout.utility.DataManager.evcode;
import static com.ridgebotics.ridgescout.utility.DataManager.event; import static com.ridgebotics.ridgescout.utility.DataManager.event;
import static com.ridgebotics.ridgescout.utility.DataManager.match_latest_values;
import android.content.ClipData; import android.content.ClipData;
import android.content.ClipboardManager; import android.content.ClipboardManager;
import android.content.Context;
import android.os.Bundle; import android.os.Bundle;
import android.text.Editable; import android.text.Editable;
import android.text.TextWatcher; import android.text.TextWatcher;
@@ -31,17 +25,15 @@ import com.ridgebotics.ridgescout.R;
import com.ridgebotics.ridgescout.databinding.FragmentDataParentBinding; import com.ridgebotics.ridgescout.databinding.FragmentDataParentBinding;
import com.ridgebotics.ridgescout.types.frcMatch; import com.ridgebotics.ridgescout.types.frcMatch;
import com.ridgebotics.ridgescout.types.frcTeam; import com.ridgebotics.ridgescout.types.frcTeam;
import com.ridgebotics.ridgescout.ui.FieldBorderedRow;
import com.ridgebotics.ridgescout.ui.TeamListOption;
import com.ridgebotics.ridgescout.utility.AlertManager; import com.ridgebotics.ridgescout.utility.AlertManager;
import com.ridgebotics.ridgescout.utility.AutoSaveManager; import com.ridgebotics.ridgescout.utility.AutoSaveManager;
import com.ridgebotics.ridgescout.utility.DataManager; import com.ridgebotics.ridgescout.utility.DataManager;
import com.ridgebotics.ridgescout.utility.SettingsManager; import com.ridgebotics.ridgescout.utility.SettingsManager;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Arrays;
import java.util.List; import java.util.List;
// Holds the scouting data editor aswell as the sub-fragment for the scouting data browser
public class DataParentFragment extends Fragment { public class DataParentFragment extends Fragment {
private FragmentDataParentBinding binding; private FragmentDataParentBinding binding;
@@ -1,20 +1,21 @@
package com.ridgebotics.ridgescout.ui.data; package com.ridgebotics.ridgescout.ui.data;
import com.ridgebotics.ridgescout.types.data.DataType; import com.ridgebotics.ridgescout.types.data.RawDataType;
import java.util.Arrays; import java.util.Arrays;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
// Helper class for scouting data by fields.
public class DataProcessing { public class DataProcessing {
public static int[] getNumberBounds(Map<Integer, List<DataType>> data){ public static int[] getNumberBounds(Map<Integer, List<RawDataType>> data){
int min = Integer.MAX_VALUE; int min = Integer.MAX_VALUE;
int max = Integer.MIN_VALUE; int max = Integer.MIN_VALUE;
for(Integer teamNum : data.keySet()){ for(Integer teamNum : data.keySet()){
List<DataType> teamData = data.get(teamNum); List<RawDataType> teamData = data.get(teamNum);
int[] locBounds = getNumberBounds(teamData); int[] locBounds = getNumberBounds(teamData);
@@ -26,13 +27,13 @@ public class DataProcessing {
return new int[]{min, max}; return new int[]{min, max};
} }
public static int[] getNumberBounds(List<DataType> data){ public static int[] getNumberBounds(List<RawDataType> data){
int min = Integer.MAX_VALUE; int min = Integer.MAX_VALUE;
int max = Integer.MIN_VALUE; int max = Integer.MIN_VALUE;
if(data == null) return new int[]{min, max}; if(data == null) return new int[]{min, max};
for(int i = 0; i < data.size(); i++){ for(int i = 0; i < data.size(); i++){
DataType dataPoint = data.get(i); RawDataType dataPoint = data.get(i);
// if(dataPoint == null) continue; // if(dataPoint == null) continue;
int num = (int) dataPoint.get(); int num = (int) dataPoint.get();
if(num > max) max = num; if(num > max) max = num;
@@ -44,7 +45,7 @@ public class DataProcessing {
//https://stackoverflow.com/questions/42381759/finding-first-quartile-and-third-quartile-in-integer-array-using-java#63891545 //https://stackoverflow.com/questions/42381759/finding-first-quartile-and-third-quartile-in-integer-array-using-java#63891545
public static float[] getQuartiles(List<DataType> data) { public static float[] getQuartiles(List<RawDataType> data) {
float ans[] = new float[3]; float ans[] = new float[3];
float[] val = new float[data.size()]; float[] val = new float[data.size()];
@@ -20,7 +20,7 @@ import androidx.fragment.app.Fragment;
import com.ridgebotics.ridgescout.databinding.FragmentDataFieldDataBinding; import com.ridgebotics.ridgescout.databinding.FragmentDataFieldDataBinding;
import com.ridgebotics.ridgescout.scoutingData.ScoutingDataWriter; import com.ridgebotics.ridgescout.scoutingData.ScoutingDataWriter;
import com.ridgebotics.ridgescout.types.data.DataType; import com.ridgebotics.ridgescout.types.data.RawDataType;
import com.ridgebotics.ridgescout.utility.AlertManager; import com.ridgebotics.ridgescout.utility.AlertManager;
import com.ridgebotics.ridgescout.utility.FileEditor; import com.ridgebotics.ridgescout.utility.FileEditor;
@@ -29,6 +29,7 @@ import java.util.HashMap;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
// Fragment for viewing the data of a specfic field.
public class FieldDataFragment extends Fragment { public class FieldDataFragment extends Fragment {
private FragmentDataFieldDataBinding binding; private FragmentDataFieldDataBinding binding;
@@ -52,13 +53,13 @@ public class FieldDataFragment extends Fragment {
Thread t = new Thread(() -> { Thread t = new Thread(() -> {
Map<Integer, List<DataType>> data = new HashMap<>(); Map<Integer, List<RawDataType>> data = new HashMap<>();
for (int teamIndex = 0; teamIndex < event.teams.size(); teamIndex++) { for (int teamIndex = 0; teamIndex < event.teams.size(); teamIndex++) {
int teamNum = event.teams.get(teamIndex).teamNumber; int teamNum = event.teams.get(teamIndex).teamNumber;
List<String> filenames = new ArrayList<>(List.of(FileEditor.getMatchesByTeamNum(evcode, event.teams.get(teamIndex).teamNumber))); List<String> filenames = new ArrayList<>(List.of(FileEditor.getMatchesByTeamNum(evcode, event.teams.get(teamIndex).teamNumber)));
filenames.removeAll(rescout_list); filenames.removeAll(rescout_list);
ArrayList<DataType> teamData = new ArrayList<>(); ArrayList<RawDataType> teamData = new ArrayList<>();
for (int i = 0; i < filenames.size(); i++) { for (int i = 0; i < filenames.size(); i++) {
try { try {
@@ -26,7 +26,7 @@ import com.ridgebotics.ridgescout.utility.AlertManager;
import com.ridgebotics.ridgescout.utility.SettingsManager; import com.ridgebotics.ridgescout.utility.SettingsManager;
import com.ridgebotics.ridgescout.databinding.FragmentDataTeamsBinding; import com.ridgebotics.ridgescout.databinding.FragmentDataTeamsBinding;
import com.ridgebotics.ridgescout.scoutingData.ScoutingDataWriter; import com.ridgebotics.ridgescout.scoutingData.ScoutingDataWriter;
import com.ridgebotics.ridgescout.types.data.DataType; import com.ridgebotics.ridgescout.types.data.RawDataType;
import com.ridgebotics.ridgescout.types.frcTeam; import com.ridgebotics.ridgescout.types.frcTeam;
import com.ridgebotics.ridgescout.utility.DataManager; import com.ridgebotics.ridgescout.utility.DataManager;
import com.ridgebotics.ridgescout.utility.FileEditor; import com.ridgebotics.ridgescout.utility.FileEditor;
@@ -34,6 +34,7 @@ import com.ridgebotics.ridgescout.utility.FileEditor;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
// Fragment for viewing the data of a team.
public class TeamsFragment extends Fragment { public class TeamsFragment extends Fragment {
FragmentDataTeamsBinding binding; FragmentDataTeamsBinding binding;
@@ -279,7 +280,7 @@ public class TeamsFragment extends Fragment {
public void add_compiled_views(String[] files){ public void add_compiled_views(String[] files){
DataType[][] data = new DataType[match_latest_values.length][files.length]; RawDataType[][] data = new RawDataType[match_latest_values.length][files.length];
for (int i = 0; i < files.length; i++) { for (int i = 0; i < files.length; i++) {
try { try {
ScoutingDataWriter.ParsedScoutingDataResult psda = ScoutingDataWriter.load(files[i], match_values, match_transferValues); ScoutingDataWriter.ParsedScoutingDataResult psda = ScoutingDataWriter.load(files[i], match_values, match_transferValues);
@@ -314,7 +315,7 @@ public class TeamsFragment extends Fragment {
public void add_history_views(String[] files){ public void add_history_views(String[] files){
DataType[][] data = new DataType[match_latest_values.length][files.length]; RawDataType[][] data = new RawDataType[match_latest_values.length][files.length];
for (int i = 0; i < files.length; i++) { for (int i = 0; i < files.length; i++) {
try { try {
ScoutingDataWriter.ParsedScoutingDataResult psda = ScoutingDataWriter.load(files[i], match_values, match_transferValues); ScoutingDataWriter.ParsedScoutingDataResult psda = ScoutingDataWriter.load(files[i], match_values, match_transferValues);
@@ -23,7 +23,7 @@ import androidx.fragment.app.Fragment;
import com.ridgebotics.ridgescout.databinding.FragmentScoutingEventBinding; import com.ridgebotics.ridgescout.databinding.FragmentScoutingEventBinding;
import com.ridgebotics.ridgescout.types.frcTeam; import com.ridgebotics.ridgescout.types.frcTeam;
import com.ridgebotics.ridgescout.ui.CustomSpinnerView; import com.ridgebotics.ridgescout.ui.views.CustomSpinnerView;
import com.ridgebotics.ridgescout.utility.DataManager; import com.ridgebotics.ridgescout.utility.DataManager;
import com.ridgebotics.ridgescout.utility.FileEditor; import com.ridgebotics.ridgescout.utility.FileEditor;
import com.ridgebotics.ridgescout.types.frcEvent; import com.ridgebotics.ridgescout.types.frcEvent;
@@ -34,6 +34,7 @@ import java.util.ArrayList;
import java.util.Arrays; import java.util.Arrays;
import java.util.List; import java.util.List;
// Fragment to show the status of scouting, aswell as adding or removing matches and teams manually.
public class EventFragment extends Fragment { public class EventFragment extends Fragment {
FragmentScoutingEventBinding binding; FragmentScoutingEventBinding binding;
@@ -19,11 +19,11 @@ import androidx.annotation.Nullable;
import androidx.fragment.app.Fragment; import androidx.fragment.app.Fragment;
import com.google.android.material.divider.MaterialDivider; import com.google.android.material.divider.MaterialDivider;
import com.ridgebotics.ridgescout.ui.ToggleTitleView; import com.ridgebotics.ridgescout.ui.views.ToggleTitleView;
import com.ridgebotics.ridgescout.utility.SettingsManager; import com.ridgebotics.ridgescout.utility.SettingsManager;
import com.ridgebotics.ridgescout.databinding.FragmentScoutingMatchBinding; import com.ridgebotics.ridgescout.databinding.FragmentScoutingMatchBinding;
import com.ridgebotics.ridgescout.scoutingData.ScoutingDataWriter; import com.ridgebotics.ridgescout.scoutingData.ScoutingDataWriter;
import com.ridgebotics.ridgescout.types.data.DataType; import com.ridgebotics.ridgescout.types.data.RawDataType;
import com.ridgebotics.ridgescout.types.frcMatch; import com.ridgebotics.ridgescout.types.frcMatch;
import com.ridgebotics.ridgescout.types.frcTeam; import com.ridgebotics.ridgescout.types.frcTeam;
import com.ridgebotics.ridgescout.types.input.FieldType; import com.ridgebotics.ridgescout.types.input.FieldType;
@@ -32,6 +32,7 @@ import com.ridgebotics.ridgescout.utility.AutoSaveManager;
import com.ridgebotics.ridgescout.utility.DataManager; import com.ridgebotics.ridgescout.utility.DataManager;
import com.ridgebotics.ridgescout.utility.FileEditor; import com.ridgebotics.ridgescout.utility.FileEditor;
// Fragment for match scouting data editing.
public class MatchScoutingFragment extends Fragment { public class MatchScoutingFragment extends Fragment {
private FragmentScoutingMatchBinding binding; private FragmentScoutingMatchBinding binding;
@@ -347,7 +348,7 @@ public class MatchScoutingFragment extends Fragment {
public void get_fields(){ public void get_fields(){
ScoutingDataWriter.ParsedScoutingDataResult psdr = ScoutingDataWriter.load(filename, DataManager.match_values, DataManager.match_transferValues); ScoutingDataWriter.ParsedScoutingDataResult psdr = ScoutingDataWriter.load(filename, DataManager.match_values, DataManager.match_transferValues);
DataType[] types = psdr.data.array; RawDataType[] types = psdr.data.array;
fileUsernames = psdr.username; fileUsernames = psdr.username;
@@ -369,7 +370,7 @@ public class MatchScoutingFragment extends Fragment {
public void save_fields(){ public void save_fields(){
DataType[] types = new DataType[DataManager.match_latest_values.length]; RawDataType[] types = new RawDataType[DataManager.match_latest_values.length];
for(int i = 0; i < DataManager.match_latest_values.length; i++){ for(int i = 0; i < DataManager.match_latest_values.length; i++){
types[i] = DataManager.match_latest_values[i].getViewValue(); types[i] = DataManager.match_latest_values[i].getViewValue();
@@ -19,12 +19,12 @@ import androidx.annotation.Nullable;
import androidx.fragment.app.Fragment; import androidx.fragment.app.Fragment;
import com.google.android.material.divider.MaterialDivider; import com.google.android.material.divider.MaterialDivider;
import com.ridgebotics.ridgescout.ui.ToggleTitleView; import com.ridgebotics.ridgescout.ui.views.ToggleTitleView;
import com.ridgebotics.ridgescout.utility.AlertManager; import com.ridgebotics.ridgescout.utility.AlertManager;
import com.ridgebotics.ridgescout.utility.SettingsManager; import com.ridgebotics.ridgescout.utility.SettingsManager;
import com.ridgebotics.ridgescout.databinding.FragmentScoutingPitBinding; import com.ridgebotics.ridgescout.databinding.FragmentScoutingPitBinding;
import com.ridgebotics.ridgescout.scoutingData.ScoutingDataWriter; import com.ridgebotics.ridgescout.scoutingData.ScoutingDataWriter;
import com.ridgebotics.ridgescout.types.data.DataType; import com.ridgebotics.ridgescout.types.data.RawDataType;
import com.ridgebotics.ridgescout.types.frcTeam; import com.ridgebotics.ridgescout.types.frcTeam;
import com.ridgebotics.ridgescout.types.input.FieldType; import com.ridgebotics.ridgescout.types.input.FieldType;
import com.ridgebotics.ridgescout.utility.AutoSaveManager; import com.ridgebotics.ridgescout.utility.AutoSaveManager;
@@ -34,6 +34,7 @@ import com.ridgebotics.ridgescout.utility.FileEditor;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.function.Function; import java.util.function.Function;
// Fragment for pit scouting data editing
public class PitScoutingFragment extends Fragment { public class PitScoutingFragment extends Fragment {
FragmentScoutingPitBinding binding; FragmentScoutingPitBinding binding;
@@ -77,13 +78,13 @@ public class PitScoutingFragment extends Fragment {
AutoSaveManager asm = new AutoSaveManager(this::save, AUTO_SAVE_DELAY); AutoSaveManager asm = new AutoSaveManager(this::save, AUTO_SAVE_DELAY);
ArrayList<DataType> dataTypes; ArrayList<RawDataType> rawDataTypes;
public void save(){ public void save(){
edited = false; edited = false;
enableRescoutButton(); enableRescoutButton();
DataType[] types = new DataType[pit_latest_values.length]; RawDataType[] types = new RawDataType[pit_latest_values.length];
for(int i = 0; i < pit_latest_values.length; i++){ for(int i = 0; i < pit_latest_values.length; i++){
types[i] = pit_latest_values[i].getViewValue(); types[i] = pit_latest_values[i].getViewValue();
@@ -201,9 +202,9 @@ public class PitScoutingFragment extends Fragment {
} }
}); });
View v = pit_latest_values[i].createView(getContext(), new Function<DataType, Integer>() { View v = pit_latest_values[i].createView(getContext(), new Function<RawDataType, Integer>() {
@Override @Override
public Integer apply(DataType dataType) { public Integer apply(RawDataType dataType) {
// edited = true; // edited = true;
if(asm.isRunning) if(asm.isRunning)
update_asm(); update_asm();
@@ -226,7 +227,7 @@ public class PitScoutingFragment extends Fragment {
public void get_fields(){ public void get_fields(){
ScoutingDataWriter.ParsedScoutingDataResult psdr = ScoutingDataWriter.load(filename, pit_values, pit_transferValues); ScoutingDataWriter.ParsedScoutingDataResult psdr = ScoutingDataWriter.load(filename, pit_values, pit_transferValues);
DataType[] types = psdr.data.array; RawDataType[] types = psdr.data.array;
fileUsernames = psdr.username; fileUsernames = psdr.username;
@@ -3,7 +3,6 @@ package com.ridgebotics.ridgescout.ui.scouting;
import static com.ridgebotics.ridgescout.utility.Colors.color_found; import static com.ridgebotics.ridgescout.utility.Colors.color_found;
import static com.ridgebotics.ridgescout.utility.Colors.color_not_found; import static com.ridgebotics.ridgescout.utility.Colors.color_not_found;
import static com.ridgebotics.ridgescout.utility.Colors.color_rescout; import static com.ridgebotics.ridgescout.utility.Colors.color_rescout;
import static com.ridgebotics.ridgescout.utility.Colors.rescout_color;
import static com.ridgebotics.ridgescout.utility.DataManager.evcode; import static com.ridgebotics.ridgescout.utility.DataManager.evcode;
import static com.ridgebotics.ridgescout.utility.DataManager.event; import static com.ridgebotics.ridgescout.utility.DataManager.event;
@@ -19,21 +18,17 @@ import androidx.fragment.app.Fragment;
import com.ridgebotics.ridgescout.databinding.FragmentTeamSelectorBinding; import com.ridgebotics.ridgescout.databinding.FragmentTeamSelectorBinding;
import com.ridgebotics.ridgescout.types.frcTeam; import com.ridgebotics.ridgescout.types.frcTeam;
import com.ridgebotics.ridgescout.ui.TeamListOption; import com.ridgebotics.ridgescout.ui.views.TeamListOption;
import com.ridgebotics.ridgescout.utility.AlertManager; import com.ridgebotics.ridgescout.utility.AlertManager;
import com.ridgebotics.ridgescout.utility.DataManager; import com.ridgebotics.ridgescout.utility.DataManager;
import com.ridgebotics.ridgescout.utility.FileEditor; import com.ridgebotics.ridgescout.utility.FileEditor;
import java.util.Arrays; import java.util.Arrays;
// Fragment for choosing which team to pit scout
public class PitSelectorFragment extends Fragment { public class PitSelectorFragment extends Fragment {
private FragmentTeamSelectorBinding binding; private FragmentTeamSelectorBinding binding;
private static boolean pits_mode;
public static void setPits_mode(boolean mode){
pits_mode = mode;
}
private static onTeamSelected onSelect = new onTeamSelected() {@Override public void onSelect(PitSelectorFragment self, frcTeam team) {}}; private static onTeamSelected onSelect = new onTeamSelected() {@Override public void onSelect(PitSelectorFragment self, frcTeam team) {}};
public interface onTeamSelected { public interface onTeamSelected {
@@ -30,6 +30,7 @@ import com.ridgebotics.ridgescout.utility.DataManager;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Set; import java.util.Set;
// Main dashbord page
public class ScoutingFragment extends Fragment { public class ScoutingFragment extends Fragment {
private FragmentScoutingBinding binding; private FragmentScoutingBinding binding;
@@ -23,6 +23,7 @@ import com.ridgebotics.ridgescout.utility.AlertManager;
import java.lang.reflect.Field; import java.lang.reflect.Field;
import java.util.UUID; import java.util.UUID;
// Class to help with fields editor fragment, containing the defaults for each field.
public class FieldEditorHelper { public class FieldEditorHelper {
private enum parameterTypeEnum { private enum parameterTypeEnum {
paramNumber, paramNumber,
@@ -8,7 +8,6 @@ import android.app.Activity;
import android.app.AlertDialog; import android.app.AlertDialog;
import android.os.Bundle; import android.os.Bundle;
import android.view.LayoutInflater; import android.view.LayoutInflater;
import android.view.MotionEvent;
import android.view.View; import android.view.View;
import android.view.ViewGroup; import android.view.ViewGroup;
import android.widget.Button; import android.widget.Button;
@@ -26,14 +25,15 @@ import com.ridgebotics.ridgescout.R;
import com.ridgebotics.ridgescout.databinding.FragmentSettingsFieldsBinding; import com.ridgebotics.ridgescout.databinding.FragmentSettingsFieldsBinding;
import com.ridgebotics.ridgescout.scoutingData.Fields; import com.ridgebotics.ridgescout.scoutingData.Fields;
import com.ridgebotics.ridgescout.types.input.FieldType; import com.ridgebotics.ridgescout.types.input.FieldType;
import com.ridgebotics.ridgescout.ui.CustomSpinnerView; import com.ridgebotics.ridgescout.ui.views.CustomSpinnerView;
import com.ridgebotics.ridgescout.ui.FieldDisplay; import com.ridgebotics.ridgescout.ui.views.FieldDisplay;
import com.ridgebotics.ridgescout.utility.AlertManager; import com.ridgebotics.ridgescout.utility.AlertManager;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Collections; import java.util.Collections;
import java.util.List; import java.util.List;
// Fragment that shows the field editor.
public class FieldsFragment extends Fragment { public class FieldsFragment extends Fragment {
FragmentSettingsFieldsBinding binding; FragmentSettingsFieldsBinding binding;
@@ -18,7 +18,6 @@ import static com.ridgebotics.ridgescout.utility.SettingsManager.prefs;
import android.app.AlertDialog; import android.app.AlertDialog;
import android.content.Context; import android.content.Context;
import android.content.DialogInterface;
import android.os.Bundle; import android.os.Bundle;
import android.text.Editable; import android.text.Editable;
import android.text.InputType; import android.text.InputType;
@@ -43,8 +42,8 @@ import com.google.android.material.textfield.TextInputLayout;
import com.ridgebotics.ridgescout.R; import com.ridgebotics.ridgescout.R;
import com.ridgebotics.ridgescout.databinding.FragmentSettingsBinding; import com.ridgebotics.ridgescout.databinding.FragmentSettingsBinding;
import com.ridgebotics.ridgescout.scoutingData.Fields; import com.ridgebotics.ridgescout.scoutingData.Fields;
import com.ridgebotics.ridgescout.ui.CustomSpinnerView; import com.ridgebotics.ridgescout.ui.views.CustomSpinnerView;
import com.ridgebotics.ridgescout.ui.scouting.TallyCounterView; import com.ridgebotics.ridgescout.ui.views.TallyCounterView;
import com.ridgebotics.ridgescout.utility.DataManager; import com.ridgebotics.ridgescout.utility.DataManager;
import com.ridgebotics.ridgescout.utility.FileEditor; import com.ridgebotics.ridgescout.utility.FileEditor;
@@ -53,7 +52,7 @@ import java.util.Arrays;
import java.util.HashMap; import java.util.HashMap;
import java.util.List; import java.util.List;
// Fragment to edit settings, aswell as redirect to the fields editor.
public class SettingsFragment extends Fragment { public class SettingsFragment extends Fragment {
private FragmentSettingsBinding binding; private FragmentSettingsBinding binding;
@@ -9,13 +9,14 @@ import static com.ridgebotics.ridgescout.utility.SharePrompt.shareContent;
import android.content.Context; import android.content.Context;
import com.ridgebotics.ridgescout.scoutingData.ScoutingDataWriter; import com.ridgebotics.ridgescout.scoutingData.ScoutingDataWriter;
import com.ridgebotics.ridgescout.types.data.DataType; import com.ridgebotics.ridgescout.types.data.RawDataType;
import com.ridgebotics.ridgescout.types.frcMatch; import com.ridgebotics.ridgescout.types.frcMatch;
import com.ridgebotics.ridgescout.types.frcTeam; import com.ridgebotics.ridgescout.types.frcTeam;
import com.ridgebotics.ridgescout.types.input.FieldType; import com.ridgebotics.ridgescout.types.input.FieldType;
import com.ridgebotics.ridgescout.utility.DataManager; import com.ridgebotics.ridgescout.utility.DataManager;
import com.ridgebotics.ridgescout.utility.FileEditor; import com.ridgebotics.ridgescout.utility.FileEditor;
// Static class to export matches to a string.
public class CSVExport { public class CSVExport {
private static String[] alliances = {"red", "blue"}; private static String[] alliances = {"red", "blue"};
@@ -62,7 +63,7 @@ public class CSVExport {
try { try {
String tempData = ""; String tempData = "";
ScoutingDataWriter.ParsedScoutingDataResult psdr = ScoutingDataWriter.load(filename, DataManager.match_values, DataManager.match_transferValues); ScoutingDataWriter.ParsedScoutingDataResult psdr = ScoutingDataWriter.load(filename, DataManager.match_values, DataManager.match_transferValues);
DataType[] matchData = psdr.data.array; RawDataType[] matchData = psdr.data.array;
FieldType[] types = psdr.data.values[psdr.data.values.length-1]; FieldType[] types = psdr.data.values[psdr.data.values.length-1];
for (int i = 0; i < types.length; i++) { for (int i = 0; i < types.length; i++) {
tempData += (safeCSV(types[i].toString(matchData[i])) + ","); tempData += (safeCSV(types[i].toString(matchData[i])) + ",");
@@ -114,7 +115,7 @@ public class CSVExport {
try { try {
String tempData = ""; String tempData = "";
ScoutingDataWriter.ParsedScoutingDataResult psdr = ScoutingDataWriter.load(filename, DataManager.pit_values, DataManager.pit_transferValues); ScoutingDataWriter.ParsedScoutingDataResult psdr = ScoutingDataWriter.load(filename, DataManager.pit_values, DataManager.pit_transferValues);
DataType[] teamData = psdr.data.array; RawDataType[] teamData = psdr.data.array;
FieldType[] types = psdr.data.values[psdr.data.values.length-1]; FieldType[] types = psdr.data.values[psdr.data.values.length-1];
for (int i = 0; i < types.length; i++) { for (int i = 0; i < types.length; i++) {
tempData += (safeCSV(types[i].toString(teamData[i])) + ","); tempData += (safeCSV(types[i].toString(teamData[i])) + ",");
@@ -1,6 +1,5 @@
package com.ridgebotics.ridgescout.ui.transfer; package com.ridgebotics.ridgescout.ui.transfer;
//import static com.ridgebotics.ridgescout.utility.DataManager.evcode;
import static com.ridgebotics.ridgescout.utility.DataManager.evcode; import static com.ridgebotics.ridgescout.utility.DataManager.evcode;
import static com.ridgebotics.ridgescout.utility.FileEditor.baseDir; import static com.ridgebotics.ridgescout.utility.FileEditor.baseDir;
@@ -27,6 +26,7 @@ import java.util.List;
import java.util.Map; import java.util.Map;
import java.util.Set; import java.util.Set;
// Class to synchronise data over FTP.
public class FTPSync extends Thread { public class FTPSync extends Thread {
public static final String remoteBasePath = "/RidgeScout/"; public static final String remoteBasePath = "/RidgeScout/";
public static final String timestampsFilename = "timestamps"; public static final String timestampsFilename = "timestamps";
@@ -20,28 +20,8 @@ import java.io.InputStream;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
// Class to create the share and receive popups to transfer scouting data.
public class FileBundle { public class FileBundle {
private static final Intent FILE_SELECT_CODE = new Intent();
public static void send(String[] files, Context c){
try {
ByteBuilder b = new ByteBuilder();
for(int i = 0; i < files.length; i++){
if(!FileEditor.fileExist(files[i])) continue;
// byte[] data = fileEditor.readFile(files[i]);
ScoutingFile f = new ScoutingFile(files[i]);
b.addRaw(ScoutingFile.typecode, f.encode());
}
byte[] data = b.build();
send(data, c);
} catch (ByteBuilder.buildingException e) {
AlertManager.error(e);
}
}
public static void send(byte[] data, Context c){ public static void send(byte[] data, Context c){
String filename = DataManager.getevcode() + "-" + System.currentTimeMillis() + ".scoutbundle"; String filename = DataManager.getevcode() + "-" + System.currentTimeMillis() + ".scoutbundle";
SharePrompt.shareContent(c, filename, data, "application/ridgescout"); SharePrompt.shareContent(c, filename, data, "application/ridgescout");
@@ -29,6 +29,7 @@ import java.util.ArrayList;
import java.util.Arrays; import java.util.Arrays;
import java.util.List; import java.util.List;
// Class to show a file browseer
public class FileSelectorFragment extends Fragment { public class FileSelectorFragment extends Fragment {
private static on_file_select onSelect = files -> {}; private static on_file_select onSelect = files -> {};
@@ -41,6 +41,7 @@ import org.json.JSONObject;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Arrays; import java.util.Arrays;
// Class to download data from a specific event and encode it.
public class TBAEventFragment extends Fragment { public class TBAEventFragment extends Fragment {
private TableLayout Table; private TableLayout Table;
@@ -21,7 +21,7 @@ import androidx.fragment.app.Fragment;
import com.ridgebotics.ridgescout.R; import com.ridgebotics.ridgescout.R;
import com.ridgebotics.ridgescout.databinding.FragmentTransferTbaBinding; import com.ridgebotics.ridgescout.databinding.FragmentTransferTbaBinding;
import com.ridgebotics.ridgescout.ui.TBAEventOption; import com.ridgebotics.ridgescout.ui.views.TBAEventOption;
import com.ridgebotics.ridgescout.utility.AlertManager; import com.ridgebotics.ridgescout.utility.AlertManager;
import com.ridgebotics.ridgescout.utility.RequestTask; import com.ridgebotics.ridgescout.utility.RequestTask;
import com.ridgebotics.ridgescout.utility.SettingsManager; import com.ridgebotics.ridgescout.utility.SettingsManager;
@@ -37,6 +37,7 @@ import java.util.Calendar;
import java.util.Date; import java.util.Date;
import java.util.List; import java.util.List;
// Class to select an event from TBA and redirect to TBAEventFragment.java.
public class TBASelectorFragment extends Fragment { public class TBASelectorFragment extends Fragment {
private android.widget.TableLayout Table; private android.widget.TableLayout Table;
@@ -19,6 +19,7 @@ import com.ridgebotics.ridgescout.databinding.FragmentTransferBinding;
import com.ridgebotics.ridgescout.ui.transfer.bluetooth.BluetoothSenderFragment; import com.ridgebotics.ridgescout.ui.transfer.bluetooth.BluetoothSenderFragment;
import com.ridgebotics.ridgescout.ui.transfer.codes.CodeGeneratorView; import com.ridgebotics.ridgescout.ui.transfer.codes.CodeGeneratorView;
// Class to do transference.
public class TransferFragment extends Fragment { public class TransferFragment extends Fragment {
private FragmentTransferBinding binding; private FragmentTransferBinding binding;
@@ -11,6 +11,7 @@ import androidx.fragment.app.Fragment;
import com.ridgebotics.ridgescout.databinding.FragmentTransferSelectorBinding; import com.ridgebotics.ridgescout.databinding.FragmentTransferSelectorBinding;
// The transfer method selector
public class TransferSelectorFragment extends Fragment { public class TransferSelectorFragment extends Fragment {
// Declaring three blank funcs in one line lol // Declaring three blank funcs in one line lol
@@ -20,11 +20,10 @@ import java.util.ArrayList;
import java.util.List; import java.util.List;
import java.util.UUID; import java.util.UUID;
// Helper class for bluetooth reciever.
public class BluetoothReceiver { public class BluetoothReceiver {
private static final UUID MY_UUID = UUID.fromString("00001101-0000-1000-8000-00805F9B34FB"); private static final UUID MY_UUID = UUID.fromString("00001101-0000-1000-8000-00805F9B34FB");
private static final String NAME = "BluetoothReceiverApp"; private static final String NAME = "BluetoothReceiverApp";
private static final int REQUEST_ENABLE_BT = 1;
private static final int REQUEST_PERMISSIONS = 2;
private Context context; private Context context;
private BluetoothAdapter bluetoothAdapter; private BluetoothAdapter bluetoothAdapter;
@@ -22,6 +22,7 @@ import java.util.ArrayList;
import java.util.List; import java.util.List;
import java.util.zip.DataFormatException; import java.util.zip.DataFormatException;
// Class to receive bluetooth transmissions from other devices
public class BluetoothReceiverFragment extends Fragment { public class BluetoothReceiverFragment extends Fragment {
private BluetoothReceiver bluetoothReceiver; private BluetoothReceiver bluetoothReceiver;
private Button startListeningButton; private Button startListeningButton;
@@ -21,10 +21,9 @@ import java.util.List;
import java.util.Set; import java.util.Set;
import java.util.UUID; import java.util.UUID;
// Helper class with sending bluetooth scouting data
public class BluetoothSender { public class BluetoothSender {
private static final UUID MY_UUID = UUID.fromString("00001101-0000-1000-8000-00805F9B34FB"); private static final UUID MY_UUID = UUID.fromString("00001101-0000-1000-8000-00805F9B34FB");
private static final int REQUEST_ENABLE_BT = 1;
private static final int REQUEST_PERMISSIONS = 2;
private Context context; private Context context;
private BluetoothAdapter bluetoothAdapter; private BluetoothAdapter bluetoothAdapter;
@@ -23,6 +23,7 @@ import java.io.IOException;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Set; import java.util.Set;
// Class to send scouting data over bluetooth.
public class BluetoothSenderFragment extends Fragment { public class BluetoothSenderFragment extends Fragment {
private BluetoothSender bluetoothSender; private BluetoothSender bluetoothSender;
private ListView deviceListView; private ListView deviceListView;
@@ -30,6 +30,7 @@ import java.util.EnumMap;
import java.util.Map; import java.util.Map;
import java.util.Random; import java.util.Random;
// Class to show the code transfer thing.
public class CodeGeneratorView extends Fragment { public class CodeGeneratorView extends Fragment {
private ImageView qrImage; private ImageView qrImage;
private SeekBar qrSpeedSlider; private SeekBar qrSpeedSlider;
@@ -17,6 +17,7 @@ import android.view.View;
import androidx.annotation.NonNull; import androidx.annotation.NonNull;
// Shows the progress of receiving data over codes.
public class CodeOverlayView extends View { public class CodeOverlayView extends View {
PointF[] points; PointF[] points;
@@ -20,6 +20,7 @@ import java.util.HashMap;
import java.util.Map; import java.util.Map;
import java.util.function.Function; import java.util.function.Function;
// Background task for code scanning, to not slow down the scanner.
public class CodeScanTask extends AsyncTask<String, String, String>{ public class CodeScanTask extends AsyncTask<String, String, String>{
private Function<String, String> resultFunction = null; private Function<String, String> resultFunction = null;
private Bitmap image; private Bitmap image;
@@ -47,7 +47,7 @@ import java.util.concurrent.ExecutionException;
import java.util.concurrent.ExecutorService; import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors; import java.util.concurrent.Executors;
//public class scannerView extends androidx.appcompat.widget.AppCompatImageView { // Recieves data from the camera, scanning codes.
public class CodeScannerView extends Fragment { public class CodeScannerView extends Fragment {
private CodeOverlayView CodeOverlayView; private CodeOverlayView CodeOverlayView;
private Handler uiHandler; private Handler uiHandler;
@@ -1,14 +1,9 @@
package com.ridgebotics.ridgescout.ui; package com.ridgebotics.ridgescout.ui.views;
import android.content.Context; import android.content.Context;
import android.graphics.Canvas; import android.graphics.Canvas;
import android.graphics.Color; import android.graphics.Color;
import android.graphics.ColorMatrixColorFilter;
import android.graphics.LinearGradient;
import android.graphics.Matrix;
import android.graphics.Paint; import android.graphics.Paint;
import android.graphics.RectF;
import android.graphics.Shader;
import android.util.AttributeSet; import android.util.AttributeSet;
import android.view.View; import android.view.View;
import android.view.ViewTreeObserver; import android.view.ViewTreeObserver;
@@ -18,6 +13,7 @@ import java.util.Iterator;
import java.util.List; import java.util.List;
import java.util.Random; import java.util.Random;
// Unused. AI-generated dynamic wallpaper for 2025 season.
public class BackgroundView extends View { public class BackgroundView extends View {
private List<Circle> circles; private List<Circle> circles;
private Paint whitePaint; private Paint whitePaint;
@@ -1,14 +1,14 @@
package com.ridgebotics.ridgescout.ui; package com.ridgebotics.ridgescout.ui.views;
import static com.ridgebotics.ridgescout.utility.Colors.candlestick_color; import static com.ridgebotics.ridgescout.utility.Colors.candlestick_color;
import android.content.Context; import android.content.Context;
import android.graphics.Canvas; import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint; import android.graphics.Paint;
import android.util.AttributeSet; import android.util.AttributeSet;
import android.view.View; import android.view.View;
// Shows the scale for a candlestick chart.
public class CandlestickHeader extends View { public class CandlestickHeader extends View {
private float absoluteMin = 0; private float absoluteMin = 0;
@@ -1,20 +1,20 @@
package com.ridgebotics.ridgescout.ui; package com.ridgebotics.ridgescout.ui.views;
import static com.ridgebotics.ridgescout.utility.Colors.candlestick_color; import static com.ridgebotics.ridgescout.utility.Colors.candlestick_color;
import android.content.Context; import android.content.Context;
import android.graphics.Canvas; import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint; import android.graphics.Paint;
import android.graphics.RectF; import android.graphics.RectF;
import android.util.AttributeSet; import android.util.AttributeSet;
import android.view.View; import android.view.View;
import com.ridgebotics.ridgescout.types.data.DataType; import com.ridgebotics.ridgescout.types.data.RawDataType;
import com.ridgebotics.ridgescout.ui.data.DataProcessing; import com.ridgebotics.ridgescout.ui.data.DataProcessing;
import java.util.List; import java.util.List;
// A single candlestick chart row.
public class CandlestickView extends View { public class CandlestickView extends View {
// Data points // Data points
@@ -181,7 +181,7 @@ public class CandlestickView extends View {
public int teamNum; public int teamNum;
public void fromTeamData(List<DataType> teamData, Integer teamNum, float absmin, float absmax){ public void fromTeamData(List<RawDataType> teamData, Integer teamNum, float absmin, float absmax){
this.teamNum = teamNum; this.teamNum = teamNum;
int[] tmp_loc_bounds = DataProcessing.getNumberBounds(teamData); int[] tmp_loc_bounds = DataProcessing.getNumberBounds(teamData);
int locmin = tmp_loc_bounds[0]; int locmin = tmp_loc_bounds[0];
@@ -1,29 +1,17 @@
package com.ridgebotics.ridgescout.ui; package com.ridgebotics.ridgescout.ui.views;
import android.content.Context; import android.content.Context;
import android.os.Bundle;
import android.util.AttributeSet; import android.util.AttributeSet;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Button;
import android.widget.CheckBox; import android.widget.CheckBox;
import android.widget.LinearLayout;
import android.widget.TableLayout; import android.widget.TableLayout;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable; import androidx.annotation.Nullable;
import androidx.fragment.app.DialogFragment;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;
import com.google.android.material.appbar.MaterialToolbar;
import com.google.android.material.divider.MaterialDivider; import com.google.android.material.divider.MaterialDivider;
import com.ridgebotics.ridgescout.R;
import java.util.ArrayList;
import java.util.List; import java.util.List;
// The notification view of a Custom dropdown notification
public class CustomSpinnerPopup extends TableLayout { public class CustomSpinnerPopup extends TableLayout {
public CustomSpinnerPopup(Context context) { public CustomSpinnerPopup(Context context) {
@@ -1,4 +1,4 @@
package com.ridgebotics.ridgescout.ui; package com.ridgebotics.ridgescout.ui.views;
import static android.app.PendingIntent.getActivity; import static android.app.PendingIntent.getActivity;
@@ -16,6 +16,7 @@ import com.ridgebotics.ridgescout.R;
import java.util.List; import java.util.List;
// The dropdown element of a custom spinner view.
public class CustomSpinnerView extends LinearLayout { public class CustomSpinnerView extends LinearLayout {
public interface onClickListener { public interface onClickListener {
@@ -1,4 +1,4 @@
package com.ridgebotics.ridgescout.ui; package com.ridgebotics.ridgescout.ui.views;
import android.content.Context; import android.content.Context;
import android.graphics.Color; import android.graphics.Color;
@@ -1,4 +1,4 @@
package com.ridgebotics.ridgescout.ui; package com.ridgebotics.ridgescout.ui.views;
import android.content.Context; import android.content.Context;
import android.graphics.Color; import android.graphics.Color;
@@ -9,17 +9,14 @@ import android.view.LayoutInflater;
import android.view.View; import android.view.View;
import android.widget.Button; import android.widget.Button;
import android.widget.LinearLayout; import android.widget.LinearLayout;
import android.widget.TextView;
import androidx.annotation.Nullable; import androidx.annotation.Nullable;
import androidx.constraintlayout.widget.ConstraintLayout; import androidx.constraintlayout.widget.ConstraintLayout;
import com.ridgebotics.ridgescout.R; import com.ridgebotics.ridgescout.R;
import com.ridgebotics.ridgescout.types.data.DataType;
import com.ridgebotics.ridgescout.types.input.FieldType; import com.ridgebotics.ridgescout.types.input.FieldType;
import java.util.function.Function; // Shows a display of the view in the view editor.
public class FieldDisplay extends ConstraintLayout { public class FieldDisplay extends ConstraintLayout {
public FieldDisplay(Context context, @Nullable AttributeSet attrs) { public FieldDisplay(Context context, @Nullable AttributeSet attrs) {
super(context, attrs); super(context, attrs);
@@ -36,7 +33,6 @@ public class FieldDisplay extends ConstraintLayout {
public Button editButton; public Button editButton;
// private View fieldView; // private View fieldView;
private LinearLayout buttonBox;
private ConstraintLayout box; private ConstraintLayout box;
public View coloredBackground; public View coloredBackground;
private LinearLayout fieldDisplayBox; private LinearLayout fieldDisplayBox;
@@ -50,7 +46,6 @@ public class FieldDisplay extends ConstraintLayout {
editButton = findViewById(R.id.button_edit); editButton = findViewById(R.id.button_edit);
buttonBox = findViewById(R.id.buttons);
} }
private ToggleTitleView toggleTitleView; private ToggleTitleView toggleTitleView;
@@ -1,4 +1,4 @@
package com.ridgebotics.ridgescout.ui.scouting; package com.ridgebotics.ridgescout.ui.views;
import android.annotation.SuppressLint; import android.annotation.SuppressLint;
import android.content.Context; import android.content.Context;
@@ -15,6 +15,7 @@ import android.widget.ImageView;
import com.ridgebotics.ridgescout.R; import com.ridgebotics.ridgescout.R;
import com.ridgebotics.ridgescout.utility.SettingsManager; import com.ridgebotics.ridgescout.utility.SettingsManager;
// Custom view to display a field position.
public class FieldPosView extends FrameLayout { public class FieldPosView extends FrameLayout {
private int x = -1; private int x = -1;
private int y = -1; private int y = -1;
@@ -1,14 +1,11 @@
package com.ridgebotics.ridgescout.ui.scouting; package com.ridgebotics.ridgescout.ui.views;
import android.annotation.SuppressLint; import android.annotation.SuppressLint;
import android.content.Context; import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.Canvas; import android.graphics.Canvas;
import android.graphics.Color; import android.graphics.Color;
import android.graphics.Paint; import android.graphics.Paint;
import android.graphics.drawable.Drawable;
import android.util.AttributeSet; import android.util.AttributeSet;
import android.view.MotionEvent;
import android.widget.FrameLayout; import android.widget.FrameLayout;
import android.widget.ImageView; import android.widget.ImageView;
@@ -1,14 +1,12 @@
package com.ridgebotics.ridgescout.ui; package com.ridgebotics.ridgescout.ui.views;
import android.content.Context; import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.Color; import android.graphics.Color;
import android.graphics.PorterDuff; import android.graphics.PorterDuff;
import android.graphics.drawable.Drawable; import android.graphics.drawable.Drawable;
import android.util.AttributeSet; import android.util.AttributeSet;
import android.view.LayoutInflater; import android.view.LayoutInflater;
import android.view.View; import android.view.View;
import android.widget.ImageView;
import android.widget.LinearLayout; import android.widget.LinearLayout;
import android.widget.TextView; import android.widget.TextView;
@@ -16,8 +14,8 @@ import androidx.annotation.Nullable;
import androidx.constraintlayout.widget.ConstraintLayout; import androidx.constraintlayout.widget.ConstraintLayout;
import com.ridgebotics.ridgescout.R; import com.ridgebotics.ridgescout.R;
import com.ridgebotics.ridgescout.types.frcTeam;
// Class for custom view displaying an event in the TBASelector.java
public class TBAEventOption extends LinearLayout { public class TBAEventOption extends LinearLayout {
public TBAEventOption(Context context, @Nullable AttributeSet attrs) { public TBAEventOption(Context context, @Nullable AttributeSet attrs) {
super(context, attrs); super(context, attrs);
@@ -1,4 +1,4 @@
package com.ridgebotics.ridgescout.ui.scouting; package com.ridgebotics.ridgescout.ui.views;
import android.content.Context; import android.content.Context;
import android.util.AttributeSet; import android.util.AttributeSet;
@@ -9,6 +9,7 @@ import android.widget.TextView;
import com.ridgebotics.ridgescout.R; import com.ridgebotics.ridgescout.R;
// Unused. This would be almost the same as the Fieldpos field, except it would support multiple positions.
public class TallyCounterView extends LinearLayout { public class TallyCounterView extends LinearLayout {
private int count = 0; private int count = 0;
private TextView countDisplay; private TextView countDisplay;
@@ -1,4 +1,4 @@
package com.ridgebotics.ridgescout.ui; package com.ridgebotics.ridgescout.ui.views;
import android.content.Context; import android.content.Context;
import android.graphics.Bitmap; import android.graphics.Bitmap;
@@ -18,6 +18,7 @@ import androidx.constraintlayout.widget.ConstraintLayout;
import com.ridgebotics.ridgescout.R; import com.ridgebotics.ridgescout.R;
import com.ridgebotics.ridgescout.types.frcTeam; import com.ridgebotics.ridgescout.types.frcTeam;
// A view for displaying information about a team.
public class TeamCard extends LinearLayout { public class TeamCard extends LinearLayout {
public TeamCard(Context context, @Nullable AttributeSet attrs) { public TeamCard(Context context, @Nullable AttributeSet attrs) {
super(context, attrs); super(context, attrs);
@@ -1,4 +1,4 @@
package com.ridgebotics.ridgescout.ui; package com.ridgebotics.ridgescout.ui.views;
import android.content.Context; import android.content.Context;
import android.graphics.Bitmap; import android.graphics.Bitmap;
@@ -18,6 +18,7 @@ import androidx.constraintlayout.widget.ConstraintLayout;
import com.ridgebotics.ridgescout.R; import com.ridgebotics.ridgescout.R;
import com.ridgebotics.ridgescout.types.frcTeam; import com.ridgebotics.ridgescout.types.frcTeam;
// A view that acts as a row specifically to display a team and their icon in a list formmt.
public class TeamListOption extends LinearLayout { public class TeamListOption extends LinearLayout {
public TeamListOption(Context context, @Nullable AttributeSet attrs) { public TeamListOption(Context context, @Nullable AttributeSet attrs) {
super(context, attrs); super(context, attrs);
@@ -1,4 +1,4 @@
package com.ridgebotics.ridgescout.ui; package com.ridgebotics.ridgescout.ui.views;
import static com.ridgebotics.ridgescout.utility.Colors.toggletitle_black_background; import static com.ridgebotics.ridgescout.utility.Colors.toggletitle_black_background;
import static com.ridgebotics.ridgescout.utility.Colors.toggletitle_no_background; import static com.ridgebotics.ridgescout.utility.Colors.toggletitle_no_background;
@@ -9,7 +9,6 @@ import android.util.AttributeSet;
import android.view.LayoutInflater; import android.view.LayoutInflater;
import android.view.View; import android.view.View;
import android.widget.CheckBox; import android.widget.CheckBox;
import android.widget.CompoundButton;
import android.widget.TextView; import android.widget.TextView;
import androidx.annotation.NonNull; import androidx.annotation.NonNull;
@@ -18,6 +17,7 @@ import androidx.constraintlayout.widget.ConstraintLayout;
import com.ridgebotics.ridgescout.R; import com.ridgebotics.ridgescout.R;
// The enable and disable button for match and pit scouting
public class ToggleTitleView extends ConstraintLayout { public class ToggleTitleView extends ConstraintLayout {
public ToggleTitleView(@NonNull Context context, @Nullable AttributeSet attrs) { public ToggleTitleView(@NonNull Context context, @Nullable AttributeSet attrs) {
super(context, attrs); super(context, attrs);
@@ -1,5 +1,6 @@
package com.ridgebotics.ridgescout.utility; package com.ridgebotics.ridgescout.utility;
import android.annotation.SuppressLint;
import android.app.Activity; import android.app.Activity;
import android.app.AlertDialog; import android.app.AlertDialog;
import android.content.Context; import android.content.Context;
@@ -11,7 +12,9 @@ import java.io.StringWriter;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
// Class to cause alerts and popups
public class AlertManager { public class AlertManager {
@SuppressLint("StaticFieldLeak")
public static Context context; public static Context context;
public static void init(Context c){ public static void init(Context c){
@@ -3,6 +3,8 @@ package com.ridgebotics.ridgescout.utility;
import android.os.Handler; import android.os.Handler;
import android.os.Looper; import android.os.Looper;
// Class to run a save function after a timeout of not calling the update function has been reached.
// Used for auto-saving in pit and match scouting.
public class AutoSaveManager { public class AutoSaveManager {
public static final long AUTO_SAVE_DELAY = 2000; // 2 seconds public static final long AUTO_SAVE_DELAY = 2000; // 2 seconds
@@ -5,6 +5,7 @@ import static com.ridgebotics.ridgescout.utility.FileEditor.lengthHeaderBytes;
import java.nio.charset.StandardCharsets; import java.nio.charset.StandardCharsets;
import java.util.ArrayList; import java.util.ArrayList;
// Class to decode the raw types from any of the scouting files
public class BuiltByteParser { public class BuiltByteParser {
public static final Integer boolType = 0; public static final Integer boolType = 0;
public static final Integer intType = 1; public static final Integer intType = 1;
@@ -5,6 +5,7 @@ import static com.ridgebotics.ridgescout.utility.FileEditor.lengthHeaderBytes;
import java.nio.charset.StandardCharsets; import java.nio.charset.StandardCharsets;
import java.util.ArrayList; import java.util.ArrayList;
// Class to encode the raw types from any of the scouting files
public class ByteBuilder { public class ByteBuilder {
public static final int bool_id = 0; public static final int bool_id = 0;
public static final int int_id = 1; public static final int int_id = 1;
@@ -2,6 +2,7 @@ package com.ridgebotics.ridgescout.utility;
import android.graphics.Color; import android.graphics.Color;
// Constants for most of the colors in the entire app.
public class Colors { public class Colors {
// Lists and stuff // Lists and stuff
public static final int color_found = 0x7f00ff00; public static final int color_found = 0x7f00ff00;
@@ -63,7 +64,7 @@ public class Colors {
// fileselector // fileselector
public static final int fileselector_selected_color = 0x5000ff00; public static final int fileselector_selected_color = 0x5000ff00;
public static final int fileselector_unselected_color = 0x5000ff00; public static final int fileselector_unselected_color = 0x50006600;
// TBA // TBA
public static final int tba_previous = 0x30FF0000; public static final int tba_previous = 0x30FF0000;
@@ -9,6 +9,7 @@ import java.util.ArrayList;
import java.util.Arrays; import java.util.Arrays;
import java.util.List; import java.util.List;
// Static class to hold loaded data, for ease of access.
public class DataManager { public class DataManager {
public static String evcode; public static String evcode;
public static frcEvent event; public static frcEvent event;
@@ -25,6 +25,7 @@ import java.util.zip.DataFormatException;
import java.util.zip.Deflater; import java.util.zip.Deflater;
import java.util.zip.Inflater; import java.util.zip.Inflater;
// Helper class for binary editing
public final class FileEditor { public final class FileEditor {
public final static String baseDir = "/data/data/com.ridgebotics.ridgescout/"; public final static String baseDir = "/data/data/com.ridgebotics.ridgescout/";
public static final byte internalDataVersion = 0x01; public static final byte internalDataVersion = 0x01;
@@ -15,6 +15,8 @@ import java.util.function.Function;
import javax.net.ssl.HttpsURLConnection; import javax.net.ssl.HttpsURLConnection;
// Class to retrieve team icon from TBA
// https://stackoverflow.com/questions/37510411/download-an-image-into-bitmap-file-in-android // https://stackoverflow.com/questions/37510411/download-an-image-into-bitmap-file-in-android
public class ImageRequestTask extends AsyncTask<String, Void, Bitmap> { public class ImageRequestTask extends AsyncTask<String, Void, Bitmap> {
@@ -6,6 +6,7 @@ import java.util.ArrayList;
import java.util.Comparator; import java.util.Comparator;
import java.util.List; import java.util.List;
// Literally just sorting json
public class JSONUtil { public class JSONUtil {
public static JSONArray sort(JSONArray array, Comparator c){ public static JSONArray sort(JSONArray array, Comparator c){
List asList = new ArrayList(array.length()); List asList = new ArrayList(array.length());
@@ -12,6 +12,8 @@ import java.util.function.Function;
import javax.net.ssl.HttpsURLConnection; import javax.net.ssl.HttpsURLConnection;
// Class to send an http request
// Used for TBA
public class RequestTask extends AsyncTask<String, String, String> { public class RequestTask extends AsyncTask<String, String, String> {
private Function<String, String> resultFunction = null; private Function<String, String> resultFunction = null;
@@ -7,6 +7,8 @@ import org.tensorflow.lite.task.text.nlclassifier.NLClassifier;
import java.util.List; import java.util.List;
// Class that runs a sentiment analysis model of a string
// This would be very cool if it was useful at all.
public class SentimentAnalysis { public class SentimentAnalysis {
private static NLClassifier textClassifier; private static NLClassifier textClassifier;
@@ -7,6 +7,7 @@ import java.util.HashMap;
import java.util.Map; import java.util.Map;
import java.util.UUID; import java.util.UUID;
// Helper class for loading settings from android SharedPreferences
public class SettingsManager { public class SettingsManager {
public static SharedPreferences prefs; public static SharedPreferences prefs;
public static SharedPreferences.Editor editor; public static SharedPreferences.Editor editor;
@@ -10,6 +10,7 @@ import java.io.File;
import java.io.FileOutputStream; import java.io.FileOutputStream;
import java.io.IOException; import java.io.IOException;
// Class to cause the share popup.
public class SharePrompt { public class SharePrompt {
public static void shareContent(Context context, String fileName, String content, String mimeType) { public static void shareContent(Context context, String fileName, String content, String mimeType) {
shareContent(context, fileName, content.getBytes(), mimeType); shareContent(context, fileName, content.getBytes(), mimeType);
+1 -1
View File
@@ -36,7 +36,7 @@
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="match_parent"> android:layout_height="match_parent">
<com.ridgebotics.ridgescout.ui.CustomSpinnerView <com.ridgebotics.ridgescout.ui.views.CustomSpinnerView
android:id="@+id/data_type_dropdown" android:id="@+id/data_type_dropdown"
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content"
@@ -19,12 +19,12 @@
app:layout_constraintStart_toStartOf="parent" app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"> app:layout_constraintTop_toTopOf="parent">
<com.ridgebotics.ridgescout.ui.CustomSpinnerView <com.ridgebotics.ridgescout.ui.views.CustomSpinnerView
android:id="@+id/data_type_spinner" android:id="@+id/data_type_spinner"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" /> android:layout_height="wrap_content" />
<com.ridgebotics.ridgescout.ui.TeamCard <com.ridgebotics.ridgescout.ui.views.TeamCard
android:id="@+id/data_team_card" android:id="@+id/data_team_card"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
@@ -38,7 +38,7 @@
</androidx.constraintlayout.widget.ConstraintLayout> </androidx.constraintlayout.widget.ConstraintLayout>
<com.ridgebotics.ridgescout.ui.TeamCard <com.ridgebotics.ridgescout.ui.views.TeamCard
android:id="@+id/match_team_card" android:id="@+id/match_team_card"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" /> android:layout_height="wrap_content" />
@@ -73,7 +73,7 @@
</androidx.constraintlayout.widget.ConstraintLayout> </androidx.constraintlayout.widget.ConstraintLayout>
<com.ridgebotics.ridgescout.ui.TeamCard <com.ridgebotics.ridgescout.ui.views.TeamCard
android:id="@+id/pits_team_card" android:id="@+id/pits_team_card"
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content"