Improve TBA event downloading

This commit is contained in:
Michael Mikovsky
2025-04-01 12:41:37 -06:00
parent 3f4a2309b3
commit 6c38147c6d
12 changed files with 501 additions and 171 deletions
@@ -9,6 +9,8 @@ import androidx.annotation.NonNull;
import com.ridgebotics.ridgescout.utility.AlertManager; import com.ridgebotics.ridgescout.utility.AlertManager;
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.ridgebotics.ridgescout.utility.settingsManager;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
import java.util.stream.IntStream; import java.util.stream.IntStream;
@@ -35,6 +37,10 @@ public class frcEvent {
bb.addRaw(frcMatch.typecode, match.encode()); bb.addRaw(frcMatch.typecode, match.encode());
} }
if(settingsManager.getEVCode().equals("unset")){
settingsManager.setEVCode(eventCode);
}
return bb.build(); return bb.build();
} catch (ByteBuilder.buildingException e) { } catch (ByteBuilder.buildingException e) {
AlertManager.error(e); AlertManager.error(e);
@@ -0,0 +1,92 @@
package com.ridgebotics.ridgescout.ui;
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.Color;
import android.graphics.PorterDuff;
import android.graphics.drawable.Drawable;
import android.util.AttributeSet;
import android.view.LayoutInflater;
import android.view.View;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.TextView;
import androidx.annotation.Nullable;
import androidx.constraintlayout.widget.ConstraintLayout;
import com.ridgebotics.ridgescout.R;
import com.ridgebotics.ridgescout.types.frcTeam;
public class TBAEventOption extends LinearLayout {
public TBAEventOption(Context context, @Nullable AttributeSet attrs) {
super(context, attrs);
init(context);
}
public TBAEventOption(Context context) {
super(context);
init(context);
}
private TextView eventCode;
private TextView eventName;
private TextView eventType;
private ConstraintLayout box;
private View coloredBackground;
public void init(Context context) {
LayoutInflater.from(context).inflate(R.layout.view_tba_event, this, true);
eventCode = findViewById(R.id.tba_event_code);
eventName = findViewById(R.id.tba_event_name);
eventType = findViewById(R.id.tba_event_type);
box = findViewById(R.id.tba_event_box);
coloredBackground = findViewById(R.id.tba_event_background);
}
public void setCode(String code){
eventCode.setText(String.valueOf(code));
}
public void setName(String name){
eventName.setText(name);
}
public void setType(String name){
eventType.setText(name);
}
// public void fromTeam(frcTeam team){
// setTeamNumber(team.teamNumber);
// setTeamName(team.teamName);
//
// if(team.bitmap != null) {
// setTeamLogo(team.bitmap);
// }else{
// hideLogo();
// }
//
// setColor(team.getTeamColor());
// }
public void setColor(int color){
Drawable drawable = box.getBackground();
drawable.mutate();
drawable.setColorFilter(color, PorterDuff.Mode.SRC_ATOP);
float[] hsv = new float[3];
Color.colorToHSV(color,hsv);
coloredBackground.setBackgroundColor(
Color.HSVToColor(127, new float[]{
hsv[0],
Math.min(hsv[1], 0.75f),
Math.min(hsv[2], 0.5f)
})
);
}
}
@@ -74,8 +74,7 @@ public class FieldDataFragment extends Fragment {
if (psda.data.array[fieldIndex] != null && psda.data.array[fieldIndex].get() != null) if (psda.data.array[fieldIndex] != null && psda.data.array[fieldIndex].get() != null)
data[teamIndex].add(psda.data.array[fieldIndex]); data[teamIndex].add(psda.data.array[fieldIndex]);
} catch (Exception e) { } catch (Exception e) {
e.printStackTrace(); AlertManager.error("Failure to load file " + filenames.get(i), e);
AlertManager.addSimpleError("Failure to load file " + filenames.get(i));
} }
} }
} }
@@ -270,8 +270,7 @@ public class TeamsFragment extends Fragment {
match_latest_values[i].add_individual_view(binding.matchArea, psda.data.array[i]); match_latest_values[i].add_individual_view(binding.matchArea, psda.data.array[i]);
} }
}catch (Exception e){ }catch (Exception e){
e.printStackTrace(); AlertManager.error("Failure to load file " + files[matchIndex], e);
AlertManager.alert("Warning!", "Failure to load file " + files[matchIndex]);
} }
} }
@@ -291,8 +290,7 @@ public class TeamsFragment extends Fragment {
data[a][i] = psda.data.array[a]; data[a][i] = psda.data.array[a];
} }
} catch (Exception e){ } catch (Exception e){
e.printStackTrace(); AlertManager.error("Failure to load file " + files[i], e);
AlertManager.alert("Warning!", "Failure to load file " + files[i]);
} }
} }
@@ -327,8 +325,7 @@ public class TeamsFragment extends Fragment {
data[a][i] = psda.data.array[a]; data[a][i] = psda.data.array[a];
} }
}catch (Exception e){ }catch (Exception e){
e.printStackTrace(); AlertManager.error("Failure to load file " + files[i], e);
AlertManager.alert("Warning!", "Failure to load file " + files[i]);
} }
} }
@@ -83,6 +83,13 @@ public class FileSelectorFragment extends Fragment {
boolean sel = !selected_arr[fi]; boolean sel = !selected_arr[fi];
selected_arr[fi] = sel; selected_arr[fi] = sel;
tr.setBackgroundColor(sel ? background_color : unselected_background_color);
((CheckBox) tr.getChildAt(0)).setChecked(sel);
});
checkBox.setOnClickListener(view -> {
boolean sel = !selected_arr[fi];
selected_arr[fi] = sel;
tr.setBackgroundColor(sel ? background_color : unselected_background_color); tr.setBackgroundColor(sel ? background_color : unselected_background_color);
((CheckBox) tr.getChildAt(0)).setChecked(sel); ((CheckBox) tr.getChildAt(0)).setChecked(sel);
}); });
@@ -1,7 +1,10 @@
package com.ridgebotics.ridgescout.ui.transfer; package com.ridgebotics.ridgescout.ui.transfer;
import static androidx.navigation.fragment.FragmentKt.findNavController;
import static com.ridgebotics.ridgescout.utility.fileEditor.TBAAddress;
import static com.ridgebotics.ridgescout.utility.fileEditor.TBAHeader;
import android.app.ProgressDialog; import android.app.ProgressDialog;
import android.graphics.Bitmap;
import android.os.Bundle; import android.os.Bundle;
import android.view.Gravity; import android.view.Gravity;
import android.view.LayoutInflater; import android.view.LayoutInflater;
@@ -16,15 +19,17 @@ import androidx.annotation.NonNull;
import androidx.annotation.Nullable; import androidx.annotation.Nullable;
import androidx.fragment.app.Fragment; import androidx.fragment.app.Fragment;
import com.ridgebotics.ridgescout.R;
import com.ridgebotics.ridgescout.databinding.FragmentTransferTbaBinding; import com.ridgebotics.ridgescout.databinding.FragmentTransferTbaBinding;
import com.ridgebotics.ridgescout.utility.AlertManager;
import com.ridgebotics.ridgescout.utility.ImageRequestTask;
import com.ridgebotics.ridgescout.utility.RequestTask;
import com.ridgebotics.ridgescout.types.frcEvent; import com.ridgebotics.ridgescout.types.frcEvent;
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.utility.fileEditor; import com.ridgebotics.ridgescout.ui.TBAEventOption;
import com.ridgebotics.ridgescout.utility.AlertManager;
import com.ridgebotics.ridgescout.utility.ImageRequestTask;
import com.ridgebotics.ridgescout.utility.JSONUtil; import com.ridgebotics.ridgescout.utility.JSONUtil;
import com.ridgebotics.ridgescout.utility.RequestTask;
import com.ridgebotics.ridgescout.utility.fileEditor;
import com.ridgebotics.ridgescout.utility.settingsManager; import com.ridgebotics.ridgescout.utility.settingsManager;
import org.json.JSONArray; import org.json.JSONArray;
@@ -37,46 +42,64 @@ import java.util.Arrays;
import java.util.Calendar; import java.util.Calendar;
import java.util.Comparator; import java.util.Comparator;
import java.util.Date; import java.util.Date;
import java.util.function.Function;
public class TBAFragment extends Fragment { public class TBAEventFragment extends Fragment {
private static final String TBAAddress = "https://www.thebluealliance.com/api/v3/";
private static final String TBAHeader = "X-TBA-Auth-Key: tjEKSZojAU2pgbs2mBt06SKyOakVhLutj3NwuxLTxPKQPLih11aCIwRIVFXKzY4e";
private android.widget.TableLayout Table; private TableLayout Table;
private FragmentTransferTbaBinding binding; private FragmentTransferTbaBinding binding;
private final int year = settingsManager.getYearNum(); private final int year = settingsManager.getYearNum();
private ProgressDialog loadingDialog; private ProgressDialog loadingDialog;
private static JSONObject eventData = null;
public static void setEventData(JSONObject j){
eventData = j;
}
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container,
@Nullable Bundle savedInstanceState) { @Nullable Bundle savedInstanceState) {
binding = FragmentTransferTbaBinding.inflate(inflater, container, false); binding = FragmentTransferTbaBinding.inflate(inflater, container, false);
final String matchKey;
try {
matchKey = eventData.getString("key");
} catch (JSONException e) {
AlertManager.error("Failed loading event key!", e);
return binding.getRoot();
}
Table = binding.matchTable; Table = binding.matchTable;
Table.setStretchAllColumns(true); Table.setStretchAllColumns(true);
TableRow tr = new TableRow(getContext()); startLoading("Loading Teams and Matches...");
addTableText(tr, "Loading Events..."); Table.removeAllViews();
Table.addView(tr); Table.setStretchAllColumns(true);
Table.bringToFront();
startLoading("Loading Events..."); TableRow tr1 = new TableRow(getContext());
addTableText(tr1, "Downloading Teams...");
Table.addView(tr1);
final RequestTask rq = new RequestTask(); final RequestTask rq = new RequestTask();
rq.onResult(s -> { rq.onResult(teamsStr -> {
if(s == null || s.isEmpty()) { TableRow tr11 = new TableRow(getContext());
AlertManager.addSimpleError("Could not fetch event!"); addTableText(tr11, "Downloading Matches...");
AlertManager.updateErrors(); Table.addView(tr11);
final RequestTask rq1 = new RequestTask();
rq1.onResult(matchesStr -> {
matchTable(matchesStr, teamsStr, eventData);
stopLoading(); stopLoading();
return null; return null;
} });
eventTable(s); rq1.execute((TBAAddress + "event/" + matchKey + "/matches"), TBAHeader);
return null; return null;
}); });
rq.execute(TBAAddress + "events/"+year, TBAHeader); rq.execute((TBAAddress + "event/" + matchKey + "/teams"), TBAHeader);
return binding.getRoot(); return binding.getRoot();
} }
@@ -89,129 +112,6 @@ public class TBAFragment extends Fragment {
tr.addView(text); tr.addView(text);
} }
public void eventTable(String dataString){
Table.removeAllViews();
Table.setStretchAllColumns(true);
Table.bringToFront();
Date currentTime = Calendar.getInstance().getTime();
try {
JSONArray data = new JSONArray(dataString);
Table.setStretchAllColumns(true);
Table.bringToFront();
boolean toggle = false;
for(int i=0;i<data.length();i++){
TableRow tr = new TableRow(getContext());
TableLayout.LayoutParams rowParams = new TableLayout.LayoutParams(
TableRow.LayoutParams.WRAP_CONTENT,
TableRow.LayoutParams.WRAP_CONTENT
);
rowParams.setMargins(20,20,20,20);
tr.setLayoutParams(rowParams);
tr.setPadding(20,20,20,20);
tr.setBackgroundColor(0x30000000);
JSONObject j = data.getJSONObject(i);
String matchKey = j.getString("key");
String name = j.getString("short_name");
// Sometimes, a short name is not present on TBA Events
if(name.isEmpty()){
name = j.getString("name");
}
TextView tv = new TextView(getContext());
tv.setGravity(Gravity.CENTER_VERTICAL);
tv.setTextSize(12);
tv.setText(j.getString("key"));
tr.addView(tv);
tv = new TextView(getContext());
tv.setTextSize(18);
tv.setText(name);
tr.addView(tv);
SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");
try {
Date startDate = format.parse(j.getString("start_date"));
Date endDate = format.parse(j.getString("end_date"));
if(currentTime.after(endDate)){
tr.setBackgroundColor(0x30FF0000);
}else if(currentTime.before(startDate)){
tr.setBackgroundColor(0x3000FF00);
}else if(currentTime.after(startDate) && currentTime.before(endDate)){
tr.setBackgroundColor(0x30FFFF00);
}
} catch (Exception e) {
AlertManager.error("Failed finding start and end dates!", e);
stopLoading();
}
tr.setOnClickListener(v -> {
startLoading("Loading Teams and Matches...");
Table.removeAllViews();
Table.setStretchAllColumns(true);
Table.bringToFront();
TableRow tr1 = new TableRow(getContext());
addTableText(tr1, "Downloading Teams...");
Table.addView(tr1);
final RequestTask rq = new RequestTask();
rq.onResult(teamsStr -> {
TableRow tr11 = new TableRow(getContext());
addTableText(tr11, "Downloading Matches...");
Table.addView(tr11);
final RequestTask rq1 = new RequestTask();
rq1.onResult(matchesStr -> {
matchTable(matchesStr, teamsStr, j);
stopLoading();
return null;
});
rq1.execute((TBAAddress + "event/" + matchKey + "/matches"), TBAHeader);
return null;
});
rq.execute((TBAAddress + "event/" + matchKey + "/teams"), TBAHeader);
});
// tr.addView(cl);
Table.addView(tr, rowParams);
toggle = !toggle;
}
stopLoading();
}catch (JSONException j){
AlertManager.error("Failed Downloading", j);
stopLoading();
}
}
static class matchComparator implements Comparator<JSONObject>
{
public int compare(JSONObject a, JSONObject b)
{
try {
return a.getInt("match_number") - b.getInt("match_number");
}catch (JSONException j){
return 0;
}
}
}
public void matchTable(String matchesString, String teamsString, JSONObject eventData){ public void matchTable(String matchesString, String teamsString, JSONObject eventData){
Table.removeAllViews(); Table.removeAllViews();
Table.setStretchAllColumns(true); Table.setStretchAllColumns(true);
@@ -493,8 +393,6 @@ public class TBAFragment extends Fragment {
matchName = eventData.getString("name"); matchName = eventData.getString("name");
} }
startLoading("Saving teams");
ArrayList<frcTeam> teams = new ArrayList<>(); ArrayList<frcTeam> teams = new ArrayList<>();
for (int i = 0; i < teamData.length(); i++) { for (int i = 0; i < teamData.length(); i++) {
frcTeam teamObj = new frcTeam(); frcTeam teamObj = new frcTeam();
@@ -532,6 +430,8 @@ public class TBAFragment extends Fragment {
fileEditor.setEvent(event); fileEditor.setEvent(event);
AlertManager.toast("Saved!"); AlertManager.toast("Saved!");
getActivity().runOnUiThread(() -> findNavController(this).navigate(R.id.action_navigation_tba_event_to_navigation_transfer));
stopLoading(); stopLoading();
}catch(Exception j) { }catch(Exception j) {
@@ -0,0 +1,230 @@
package com.ridgebotics.ridgescout.ui.transfer;
import static androidx.navigation.fragment.FragmentKt.findNavController;
import static com.ridgebotics.ridgescout.utility.fileEditor.TBAAddress;
import static com.ridgebotics.ridgescout.utility.fileEditor.TBAHeader;
import android.app.ProgressDialog;
import android.os.Bundle;
import android.view.Gravity;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Button;
import android.widget.TableRow;
import android.widget.TextView;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.fragment.app.Fragment;
import com.ridgebotics.ridgescout.R;
import com.ridgebotics.ridgescout.databinding.FragmentTransferTbaBinding;
import com.ridgebotics.ridgescout.ui.TBAEventOption;
import com.ridgebotics.ridgescout.utility.AlertManager;
import com.ridgebotics.ridgescout.utility.ImageRequestTask;
import com.ridgebotics.ridgescout.utility.RequestTask;
import com.ridgebotics.ridgescout.types.frcEvent;
import com.ridgebotics.ridgescout.types.frcMatch;
import com.ridgebotics.ridgescout.types.frcTeam;
import com.ridgebotics.ridgescout.utility.fileEditor;
import com.ridgebotics.ridgescout.utility.JSONUtil;
import com.ridgebotics.ridgescout.utility.settingsManager;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Calendar;
import java.util.Collections;
import java.util.Comparator;
import java.util.Date;
import java.util.List;
public class TBASelectorFragment extends Fragment {
private android.widget.TableLayout Table;
private FragmentTransferTbaBinding binding;
private final int year = settingsManager.getYearNum();
private ProgressDialog loadingDialog;
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container,
@Nullable Bundle savedInstanceState) {
binding = FragmentTransferTbaBinding.inflate(inflater, container, false);
Table = binding.matchTable;
Table.setStretchAllColumns(true);
TableRow tr = new TableRow(getContext());
addTableText(tr, "Loading Events...");
Table.addView(tr);
startLoading("Loading Events...");
final RequestTask rq = new RequestTask();
rq.onResult(s -> {
if(s == null || s.isEmpty()) {
AlertManager.error("Could not fetch event!");
stopLoading();
return null;
}
eventTable(s);
return null;
});
rq.execute(TBAAddress + "events/"+year, TBAHeader);
return binding.getRoot();
}
private void addTableText(TableRow tr, String textStr){
TextView text = new TextView(getContext());
text.setTextSize(18);
text.setTextAlignment(View.TEXT_ALIGNMENT_CENTER); // Text align center
text.setText(textStr);
tr.addView(text);
}
public static int getEventTypeWeight(String type){
switch(type){
case "Preseason": return -3;
case "District": return -2;
case "Regional": return -1;
case "District Championship Division": return 0;
case "District Championship": return 1;
case "Championship Divison": return 2;
case "Championship Finals": return 3;
case "Offseason": return 4;
}
return 0;
}
public void eventTable(String dataString){
Table.removeAllViews();
Table.setStretchAllColumns(true);
Table.bringToFront();
SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");
Date currentTime = Calendar.getInstance().getTime();
try {
JSONArray events = new JSONArray(dataString);
List<JSONObject> data = new ArrayList<>();
for(int i = 0; i < events.length(); i++){
data.add(events.getJSONObject(i));
}
// Sort events by date, and then type
data.sort((a, b) -> {
try {
// return (int) (currentTime.getTime() - format.parse(a.getString("start_date")).getTime())
// -
// (int) (currentTime.getTime() - format.parse(b.getString("start_date")).getTime());
int diff = format.parse(a.getString("start_date")).compareTo(format.parse(b.getString("start_date"))) * 10;
if(diff == 0){
diff = getEventTypeWeight(a.getString("event_type_string")) - getEventTypeWeight(b.getString("event_type_string"));
}
return diff;
} catch (ParseException | JSONException e) {
AlertManager.error(e);
return 0;
}
});
boolean toggle = false;
for(int i=0;i<data.size();i++){
JSONObject j = data.get(i);
TBAEventOption row = new TBAEventOption(getContext());
// TableRow tr = new TableRow(getContext());
// TableLayout.LayoutParams rowParams = new TableLayout.LayoutParams(
// TableRow.LayoutParams.WRAP_CONTENT,
// TableRow.LayoutParams.WRAP_CONTENT
// );
// rowParams.setMargins(20,20,20,20);
// tr.setLayoutParams(rowParams);
// tr.setPadding(20,20,20,20);
row.setBackgroundColor(0x30000000);
String name = j.getString("short_name");
// Sometimes, a short name is not present on TBA Events
if(name.isEmpty()){
name = j.getString("name");
}
String eventType = j.getString("event_type_string");
if(eventType.equals("District") || eventType.equals("Regional"))
eventType = "Week " + (j.getInt("week")+1) + " " + eventType;
row.setName(name);
row.setCode(j.getString("key"));
row.setType(eventType);
try {
Date startDate = format.parse(j.getString("start_date"));
Date endDate = format.parse(j.getString("end_date"));
if(currentTime.after(endDate)){
row.setColor(0x30FF0000);
}else if(currentTime.before(startDate)){
row.setColor(0x3000FF00);
}else if(currentTime.after(startDate) && currentTime.before(endDate)){
row.setColor(0x30FFFF00);
}
} catch (Exception e) {
AlertManager.error("Failed finding start and end dates!", e);
stopLoading();
}
row.setOnClickListener(v -> {
TBAEventFragment.setEventData(j);
findNavController(this).navigate(R.id.action_navigation_tba_selector_to_navigation_tba_event);
});
// tr.addView(cl);
Table.addView(row);
toggle = !toggle;
}
stopLoading();
}catch (JSONException j){
AlertManager.error("Failed Downloading", j);
stopLoading();
}
}
private void startLoading(String title){
getActivity().runOnUiThread(() -> {
if(loadingDialog != null && loadingDialog.isShowing())
loadingDialog.dismiss();
loadingDialog = ProgressDialog.show(getActivity(), title, "Please wait...");
});
}
private void stopLoading(){
getActivity().runOnUiThread(() -> {
if (loadingDialog != null)
loadingDialog.cancel();
loadingDialog = null;
});
}
}
@@ -57,7 +57,7 @@ public class TransferFragment extends Fragment {
}); });
binding.TBAButton.setOnClickListener(v -> { binding.TBAButton.setOnClickListener(v -> {
findNavController(this).navigate(R.id.action_navigation_transfer_to_navigation_tba); findNavController(this).navigate(R.id.action_navigation_transfer_to_navigation_tba_selector);
}); });
@@ -14,7 +14,7 @@ public class DataManager {
public static String evcode; public static String evcode;
public static frcEvent event; public static frcEvent event;
public static void reload_event(){ public static void reload_event(){
if(event != null) return; // if(event != null) return;
evcode = getevcode(); evcode = getevcode();
if(evcode.equals("unset")) return; if(evcode.equals("unset")) return;
@@ -36,6 +36,11 @@ public final class fileEditor {
public static final byte internalDataVersion = 0x01; public static final byte internalDataVersion = 0x01;
public static final int maxCompressedBlockSize = 4096; public static final int maxCompressedBlockSize = 4096;
public static final int lengthHeaderBytes = 3; public static final int lengthHeaderBytes = 3;
public static final String TBAAddress = "https://www.thebluealliance.com/api/v3/";
public static final String TBAHeader = "X-TBA-Auth-Key: tjEKSZojAU2pgbs2mBt06SKyOakVhLutj3NwuxLTxPKQPLih11aCIwRIVFXKzY4e";
// private TimeZone localTimeZone = TimeZone.getDefault(); // private TimeZone localTimeZone = TimeZone.getDefault();
@@ -405,7 +410,7 @@ public final class fileEditor {
} }
}); });
} catch (Exception e){ } catch (Exception e){
e.printStackTrace(); AlertManager.error(e);
} }
@@ -0,0 +1,69 @@
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="wrap_content"
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools">
<androidx.constraintlayout.widget.ConstraintLayout
android:id="@+id/tba_event_box"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_alignParentEnd="true"
android:layout_margin="5dp"
android:background="@drawable/border"
android:orientation="horizontal"
tools:ignore="UselessParent">
<View
android:id="@+id/tba_event_background"
android:layout_width="match_parent"
android:layout_height="0dp"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<TextView
android:id="@+id/tba_event_name"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_margin="15dp"
android:overlapAnchor="false"
android:text="Colorado"
android:textAppearance="@style/TextAppearance.MaterialComponents.Headline6"
app:autoSizeTextType="uniform"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<TextView
android:id="@+id/tba_event_code"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="16dp"
android:paddingLeft="3dp"
android:paddingRight="3dp"
android:text="2025code"
android:textAppearance="@style/TextAppearance.MaterialComponents.Subtitle1"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<TextView
android:id="@+id/tba_event_type"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:paddingLeft="3dp"
android:paddingRight="5dp"
android:text="Week 4 Regional"
android:textAppearance="@style/TextAppearance.MaterialComponents.Caption"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintTop_toTopOf="parent" />
</androidx.constraintlayout.widget.ConstraintLayout>
</RelativeLayout>
@@ -39,6 +39,33 @@
tools:layout="@layout/fragment_scouting_match"> tools:layout="@layout/fragment_scouting_match">
</fragment> </fragment>
<fragment
android:id="@+id/navigation_tba_selector"
android:name="com.ridgebotics.ridgescout.ui.transfer.TBASelectorFragment"
tools:layout="@layout/fragment_transfer_tba">
<action
android:id="@+id/action_navigation_tba_selector_to_navigation_tba_event"
app:destination="@id/navigation_tba_event"
app:enterAnim="@anim/enter_anim"
app:exitAnim="@anim/exit_anim"
app:popEnterAnim="@anim/pop_enter_anim"
app:popExitAnim="@anim/pop_exit_anim" />
</fragment>
<fragment
android:id="@+id/navigation_tba_event"
android:name="com.ridgebotics.ridgescout.ui.transfer.TBAEventFragment"
tools:layout="@layout/fragment_transfer_tba">
<action
android:id="@+id/action_navigation_tba_event_to_navigation_transfer"
app:destination="@id/navigation_transfer"
app:enterAnim="@anim/enter_anim"
app:exitAnim="@anim/exit_anim"
app:popEnterAnim="@anim/pop_enter_anim"
app:popExitAnim="@anim/pop_exit_anim" />
</fragment>
<fragment <fragment
android:id="@+id/navigation_scouting_pit_selector" android:id="@+id/navigation_scouting_pit_selector"
@@ -77,7 +104,11 @@
app:popExitAnim="@anim/pop_exit_anim"/> app:popExitAnim="@anim/pop_exit_anim"/>
<action <action
android:id="@+id/action_navigation_data_to_navigation_data_field_data" android:id="@+id/action_navigation_data_to_navigation_data_field_data"
app:destination="@id/navigation_data_field_data" /> app:destination="@id/navigation_data_field_data"
app:enterAnim="@anim/enter_anim"
app:exitAnim="@anim/exit_anim"
app:popEnterAnim="@anim/pop_enter_anim"
app:popExitAnim="@anim/pop_exit_anim" />
</fragment> </fragment>
<fragment <fragment
@@ -120,13 +151,6 @@
android:name="com.ridgebotics.ridgescout.ui.transfer.TransferFragment" android:name="com.ridgebotics.ridgescout.ui.transfer.TransferFragment"
android:label="@string/title_transfer" android:label="@string/title_transfer"
tools:layout="@layout/fragment_transfer"> tools:layout="@layout/fragment_transfer">
<action
android:id="@+id/action_navigation_transfer_to_navigation_tba"
app:destination="@id/navigation_tba"
app:enterAnim="@anim/enter_anim"
app:exitAnim="@anim/exit_anim"
app:popEnterAnim="@anim/pop_enter_anim"
app:popExitAnim="@anim/pop_exit_anim" />
<action <action
android:id="@+id/action_navigation_transfer_to_navigation_file_selector" android:id="@+id/action_navigation_transfer_to_navigation_file_selector"
app:destination="@id/navigation_file_selector" app:destination="@id/navigation_file_selector"
@@ -141,6 +165,13 @@
app:exitAnim="@anim/exit_anim" app:exitAnim="@anim/exit_anim"
app:popEnterAnim="@anim/pop_enter_anim" app:popEnterAnim="@anim/pop_enter_anim"
app:popExitAnim="@anim/pop_exit_anim" /> app:popExitAnim="@anim/pop_exit_anim" />
<action
android:id="@+id/action_navigation_transfer_to_navigation_tba_selector"
app:destination="@id/navigation_tba_selector"
app:enterAnim="@anim/enter_anim"
app:exitAnim="@anim/exit_anim"
app:popEnterAnim="@anim/pop_enter_anim"
app:popExitAnim="@anim/pop_exit_anim" />
</fragment> </fragment>
<fragment <fragment
@@ -214,12 +245,6 @@
tools:layout="@layout/fragment_transfer_bluetooth_receiver"> tools:layout="@layout/fragment_transfer_bluetooth_receiver">
</fragment> </fragment>
<fragment
android:id="@+id/navigation_tba"
android:name="com.ridgebotics.ridgescout.ui.transfer.TBAFragment"
tools:layout="@layout/fragment_transfer_tba">
</fragment>