use of com.cpjd.roblu.models.RTab in project Roblu by wdavies973.
the class MyMatches method onCreate.
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// setup ui stuff
setContentView(R.layout.mymatches);
Toolbar toolbar = findViewById(R.id.toolbar);
setSupportActionBar(toolbar);
if (getSupportActionBar() != null)
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
// access the eventID, if no eventID is passed in to this class, the app will crash
eventID = getIntent().getIntExtra("eventID", 0);
// load the number from settings
int number = new IO(getApplicationContext()).loadSettings().getTeamNumber();
if (number == 0) {
// the user hasn't changed their number yet, and since no team is #0, we have to stop the activity
Toast.makeText(getApplicationContext(), "No team number found. Set it in settings.", Toast.LENGTH_LONG).show();
setResult(Constants.CANCELLED);
finish();
return;
}
/*
* we have a reference to the team's number but not the team'd ID (we need the team's ID to load).
*
* so the problem here is that there is a potential for the user to have created multiple teams with
* their own team number (not likely, but possible). Currently, this code will just load the first
* team that matches our number that it comes across, but you could modify this code to do a "smart select"
* that looks of data contained within each team (num of matches, size, last edit, etc.). for now, the first
* team we come across should be fine and work 99% of the time
*/
RTeam[] local = new IO(getApplicationContext()).loadTeams(eventID);
RTeam myTeam = null;
for (RTeam team : local) {
// search through locally stored teams until we find one that matches our number
if (team.getNumber() == number) {
myTeam = team;
break;
}
}
if (myTeam == null) {
// team will be null if it was not contained in the event, if no team, force close this activity
Toast.makeText(getApplicationContext(), "Your team is missing from event, please add it", Toast.LENGTH_LONG).show();
setResult(Constants.CANCELLED);
finish();
return;
}
if (myTeam.getTabs() == null || myTeam.getTabs().size() <= 2) {
// we found a team, but it doesn't contain any matches, so we can't load "my matches", force close
Toast.makeText(getApplicationContext(), "Team does not contain any match data, please add some.", Toast.LENGTH_LONG).show();
setResult(Constants.CANCELLED);
finish();
return;
}
// for more on verification, visit the RTeam class, basically, to be safe, we want to sync the form and the team before we play around with any of them
myTeam.verify(new IO(getApplicationContext()).loadForm(eventID));
// next, we need to split apart the RTab array within our team, we want one RCheckout model per match
// we'll use this array for storing info, one RChecklist per match
ArrayList<RCheckout> toSave = new ArrayList<>();
for (int i = 0; i < myTeam.getTabs().size(); i++) {
// we don't care about pit or predictions tabs, so skip them since they are always at index 0 & 1
if (i < 2)
continue;
// create a new team with only one tab, wrap it in a checkout, and add it to our array
RTeam team = new RTeam(myTeam.getName(), myTeam.getNumber(), myTeam.getID());
team.addTab(myTeam.getTabs().get(i));
toSave.add(new RCheckout(team));
}
// next, we need to look through our local teams list again and search for other teams in the same match as us, then we can add them to the either the teammates or opponents array
for (RCheckout checkout : toSave) {
ArrayList<RTeam> teammates = new ArrayList<>();
ArrayList<RTeam> opponents = new ArrayList<>();
for (RTeam team : local) {
for (RTab tab : team.getTabs()) {
if (tab.getTitle().equalsIgnoreCase(checkout.getTeam().getTabs().get(0).getTitle())) {
if (checkout.getTeam().getTabs().get(0).isRedAlliance() == tab.isRedAlliance())
teammates.add(team);
else
opponents.add(team);
}
}
}
checkout.getTeam().getTabs().get(0).setTeammates(teammates);
checkout.getTeam().getTabs().get(0).setOpponents(opponents);
}
// we've got everything we need, let's load it into the UI
rv = findViewById(R.id.recycler);
// manages the layout loading
LinearLayoutManager linearLayoutManager = new LinearLayoutManager(getApplicationContext());
linearLayoutManager.setOrientation(LinearLayoutManager.VERTICAL);
rv.setLayoutManager(linearLayoutManager);
adapter = new CheckoutsViewAdapter(getApplicationContext(), new IO(getApplicationContext()).loadSettings());
adapter.setCheckouts(toSave);
adapter.setListener(this);
rv.setAdapter(adapter);
// prevents a weird rendering issues
((SimpleItemAnimator) rv.getItemAnimator()).setSupportsChangeAnimations(false);
// don't forget to sync our activity ui with the RUI settings
new UIHandler(this, toolbar).update();
}
use of com.cpjd.roblu.models.RTab in project Roblu by wdavies973.
the class SyncHelper method mergeCheckout.
/**
* Merges the checkout with the active event.
* Creates new team / match if they don't already exist
* @param checkout the checkout to merge
*/
public void mergeCheckout(RCheckout checkout) {
// Verify the target checkout, to make sure it's in sync with the local form
checkout.getTeam().verify(form);
// Check to see if there is a local team matching this checkout
RTeam team = io.loadTeam(activeEvent.getID(), checkout.getTeam().getID());
// The team was found, so do a merge
if (team != null) {
team.verify(form);
boolean shouldOverrideLastEdited = false;
for (RTab downloadedTab : checkout.getTeam().getTabs()) {
boolean matchLocated = false;
for (RTab localTab : team.getTabs()) {
localTab.setWon(downloadedTab.isWon());
// Found the match, start merging
if (localTab.getTitle().equalsIgnoreCase(downloadedTab.getTitle())) {
/*
* Copy over the edit tabs
*/
if (downloadedTab.getEdits() != null)
localTab.setEdits(downloadedTab.getEdits());
for (RMetric downloadedMetric : downloadedTab.getMetrics()) {
if (!(downloadedMetric instanceof RCalculation) && !(downloadedMetric instanceof RFieldData) && downloadedMetric.isModified())
shouldOverrideLastEdited = true;
for (RMetric localMetric : localTab.getMetrics()) {
// Found the metric, determine if a merge needs to occur
if (downloadedMetric.getID() == localMetric.getID()) {
// Ignore imports from this metric
if (downloadedMetric instanceof RFieldData)
break;
/*
* We have to deal with one special case scenario - the gallery.
* The gallery should never be overrided, just added to
*/
if (downloadedMetric instanceof RGallery && localMetric instanceof RGallery) {
if (((RGallery) localMetric).getPictureIDs() == null)
((RGallery) localMetric).setPictureIDs(new ArrayList<Integer>());
if (((RGallery) downloadedMetric).getImages() != null) {
// Add images to the current gallery
for (int i = 0; i < ((RGallery) downloadedMetric).getImages().size(); i++) {
((RGallery) localMetric).getPictureIDs().add(io.savePicture(activeEvent.getID(), ((RGallery) downloadedMetric).getImages().get(i)));
}
}
// Don't forget to clear the pictures from memory after they've been merged
((RGallery) downloadedMetric).setImages(null);
break;
}
// If the local metric is already edited, keep whichever data is newest
if (localMetric.isModified()) {
if (checkout.getTeam().getLastEdit() >= team.getLastEdit()) {
int replaceIndex = localTab.getMetrics().indexOf(localMetric);
localTab.getMetrics().set(replaceIndex, downloadedMetric);
}
} else // Otherwise, just do a straight override
{
int replaceIndex = localTab.getMetrics().indexOf(localMetric);
localTab.getMetrics().set(replaceIndex, downloadedMetric);
}
break;
}
}
}
matchLocated = true;
break;
}
}
if (!matchLocated) {
// Add as a new match if a merge wasn't performed
team.addTab(checkout.getTeam().getTabs().get(0));
Collections.sort(team.getTabs());
}
}
if (shouldOverrideLastEdited)
team.setLastEdit(checkout.getTeam().getLastEdit());
} else // The team was not found locally, create a new one
{
Log.d("RBS", "Team was not found, creating a new one.");
team = new RTeam(checkout.getTeam().getName(), checkout.getTeam().getNumber(), checkout.getTeam().getID());
team.setLastEdit(checkout.getTeam().getLastEdit());
team.verify(form);
if (checkout.getTeam().getTabs().size() > 1) {
// this means the downloaded team was a PIT tab, so override the new team's tabs
team.setTabs(checkout.getTeam().getTabs());
} else {
// otherwise just add them
team.addTab(checkout.getTeam().getTabs().get(0));
}
}
// Save the team
io.saveTeam(activeEvent.getID(), team);
// Request a UI refresh
Utils.requestTeamViewerRefresh(context, team.getID());
Log.d("RBS-Service", "Merged the team: " + checkout.getTeam().getName());
}
use of com.cpjd.roblu.models.RTab in project Roblu by wdavies973.
the class FieldData method generateSheet.
@Override
public void generateSheet(XSSFSheet sheet, REvent event, RForm form, RTeam[] teams, ArrayList<RCheckout> checkouts) {
Row one = createRow(sheet);
createCell(one, 0, "Team#");
createCell(one, 1, "Match#");
// Find a random RFieldData reference
RFieldData fieldData = null;
try {
mainLoop: for (RTab tab : teams[0].getTabs()) {
if (tab.getTitle().equalsIgnoreCase("PIT") || tab.getTitle().equalsIgnoreCase("PREDICTIONS"))
continue;
for (RMetric metric2 : tab.getMetrics()) {
if (metric2 instanceof RFieldData) {
fieldData = (RFieldData) metric2;
break mainLoop;
}
}
}
} catch (Exception e) {
// }
}
// Copy the metrics over
int index = 2;
for (Object key : fieldData.getData().keySet()) {
createCell(one, index, key.toString());
index++;
}
// Start copying data
for (RCheckout checkout : checkouts) {
if (!checkout.getTeam().getTabs().get(0).getTitle().startsWith("Quals"))
continue;
Row row = createRow(sheet);
createCell(row, 0, String.valueOf(checkout.getTeam().getNumber()));
createCell(row, 1, checkout.getTeam().getTabs().get(0).getTitle());
index = 0;
mainLoop: for (RTab tab : checkout.getTeam().getTabs()) {
for (RMetric metric2 : tab.getMetrics()) {
if (metric2 instanceof RFieldData) {
try {
for (Object key : ((RFieldData) metric2).getData().keySet()) {
createCell(row, index + 2, ((RFieldData) metric2).getData().get(key).get(tab.isRedAlliance() ? 0 : 1).toString());
index++;
}
break mainLoop;
} catch (Exception e) {
}
}
}
}
}
}
Aggregations