use of com.cpjd.roblu.models.metrics.RCalculation in project Roblu by wdavies973.
the class MetricEditor method addMetricPreviewToToolbar.
/**
* Adds the metric preview to the Toolbar
*/
private void addMetricPreviewToToolbar() {
Toolbar toolbar = findViewById(R.id.toolbar);
toolbar.setBackgroundColor(rui.getPrimaryColor());
toolbar.removeAllViews();
if (metric instanceof RBoolean)
toolbar.addView(rMetricToUI.getBoolean((RBoolean) metric));
else if (metric instanceof RCounter)
toolbar.addView(rMetricToUI.getCounter((RCounter) metric));
else if (metric instanceof RSlider)
toolbar.addView(rMetricToUI.getSlider((RSlider) metric));
else if (metric instanceof RChooser)
toolbar.addView(rMetricToUI.getChooser((RChooser) metric));
else if (metric instanceof RCheckbox)
toolbar.addView(rMetricToUI.getCheckbox((RCheckbox) metric));
else if (metric instanceof RStopwatch)
toolbar.addView(rMetricToUI.getStopwatch((RStopwatch) metric, true));
else if (metric instanceof RTextfield)
toolbar.addView(rMetricToUI.getTextfield((RTextfield) metric));
else if (metric instanceof RGallery)
toolbar.addView(rMetricToUI.getGallery(true, 0, 0, ((RGallery) metric)));
else if (metric instanceof RDivider)
toolbar.addView(rMetricToUI.getDivider((RDivider) metric));
else if (metric instanceof RFieldDiagram)
toolbar.addView(rMetricToUI.getFieldDiagram(-1, (RFieldDiagram) metric));
else if (metric instanceof RCalculation)
toolbar.addView(rMetricToUI.getCalculationMetric(null, ((RCalculation) metric)));
else if (metric instanceof RFieldData)
toolbar.addView(rMetricToUI.getFieldData((RFieldData) metric));
}
use of com.cpjd.roblu.models.metrics.RCalculation in project Roblu by wdavies973.
the class TeamMetricProcessor method process.
/**
* Processes an RTeam object and sets its filterTag and relevance variables.
* -filterTag is a string representing a certain metric as defined by param method and param ID
* -relevance is used for sorting (relevance is assigned differently for the type of RMetric, but for example,
* counters with the highest value with cause that team to be sorted at the top)
*
* @param team the team to process
* @param method an int from PROCESS_METHOD that defines how an team should be processed
* @param ID the id of the metric to process, this value will be ignored if method is PIT, PREDICTIONS, or MATCHES
*/
public void process(RTeam team, int method, int ID) {
team.setCustomRelevance(0);
/*
* Helper variables
*/
StringBuilder rawData = new StringBuilder();
int occurrences = 0;
double relevance = 0;
double average = 0.0, min = 0.0, max = 0.0;
/*
* If the request method is PIT or PREDICTIONS, use the following code to
* sort the team. Note, each team will only have one value that needs to be
* analyzed, so statistics are essentially invalid
*/
if (method == PROCESS_METHOD.PIT || method == PROCESS_METHOD.PREDICTIONS) {
for (RMetric metric : team.getTabs().get(method).getMetrics()) {
if (metric.getID() != ID)
continue;
if (metric instanceof RBoolean) {
rawData.append("Boolean: ").append(metric.getTitle()).append(" is ").append(friendlyBoolean((RBoolean) metric));
if (metric.isModified() && ((RBoolean) metric).isValue())
relevance++;
} else if (metric instanceof RCounter) {
rawData.append("Counter: ").append(metric.getTitle()).append(" is ").append(friendlyCounter((RCounter) metric));
relevance += ((RCounter) metric).getValue();
} else if (metric instanceof RSlider) {
rawData.append("Slider: ").append(metric.getTitle()).append(" is ").append(friendlySlider((RSlider) metric));
relevance += ((RSlider) metric).getValue();
} else if (metric instanceof RStopwatch) {
rawData.append("Stopwatch: ").append(metric.getTitle()).append(" is ").append(friendlyStopwatch((RStopwatch) metric));
relevance += ((RStopwatch) metric).getTime();
} else if (metric instanceof RTextfield) {
rawData.append("Textfield: ").append(metric.getTitle()).append(" has ").append(((RTextfield) metric).getText().length()).append(" characters");
relevance += ((RTextfield) metric).getText().length();
} else if (metric instanceof RGallery) {
rawData.append("Gallery: ").append(metric.getTitle()).append(" contains ").append(((RGallery) metric).getImages().size()).append(" images");
relevance += ((RGallery) metric).getImages().size();
} else if (metric instanceof RCheckbox) {
rawData.append("Checkbox: ").append(metric.getTitle()).append(" values: ").append(friendlyCheckbox((RCheckbox) metric));
relevance += getCheckedAmount((RCheckbox) metric);
} else if (metric instanceof RChooser) {
rawData.append("Chooser: ").append(metric.getTitle()).append(" has value ").append(((RChooser) metric).getValues()[((RChooser) metric).getSelectedIndex()]);
}
rawData.append(" in ").append(friendlyMode(method));
team.setFilterTag("\n" + rawData.toString());
team.setCustomRelevance(relevance);
break;
}
} else /*
* If the request method is MATCHES, then the following code has to be used
* to look at each particular RTab object within the team object
*/
if (method == PROCESS_METHOD.MATCHES) {
if (team.getTabs() == null || team.getTabs().size() == 0) {
team.setFilterTag("\nThis team does not contain any matches that can be sorted.");
return;
}
/*
* This nested for loop will go through every team tab and every metric within each team tab.
* This loop should only process the RAW DATA for each metric, the overview stuff will be added at the end.
* Use StringBuilder rawData to store raw data
*/
rawData.append("\nRaw data: ");
for (int i = 2; i < team.getTabs().size(); i++) {
for (RMetric metric : team.getTabs().get(i).getMetrics()) {
// Make sure that the metric that is being processed is equal to the inputted value
if (metric.getID() != ID)
continue;
// RBoolean type
if (metric instanceof RBoolean) {
RBoolean rBoolean = (RBoolean) metric;
// if the value is modified and true, add some relevance info
if (rBoolean.isModified() && rBoolean.isValue()) {
occurrences++;
relevance++;
}
// add raw data
rawData.append(friendlyBoolean((RBoolean) metric)).append(ending(i, team.getTabs()));
} else // RCounter type
if (metric instanceof RCounter) {
double value = ((RCounter) metric).getValue();
if (i == 2)
min = value;
// Overview stats will only consider modified items
if (metric.isModified()) {
/*
* Progressively calculate the min, max, and average values
*/
if (value < min)
min = value;
if (value > max)
max = value;
average += value / (double) numModified(team.getTabs(), ID);
relevance = average;
}
// add raw data
rawData.append(friendlyCounter((RCounter) metric)).append(ending(i, team.getTabs()));
} else if (metric instanceof RCalculation) {
try {
double value = Double.parseDouble(((RCalculation) metric).getValue(team.getTabs().get(i).getMetrics()));
if (i == 2)
min = value;
// Overview stats will only consider modified items
if (metric.isModified()) {
/*
* Progressively calculate the min, max, and average values
*/
if (value < min)
min = value;
if (value > max)
max = value;
average += value / (double) numModified(team.getTabs(), ID);
relevance = average;
}
// add raw data
rawData.append(friendlyCounter((RCounter) metric)).append(ending(i, team.getTabs()));
} catch (Exception e) {
// eat it
}
} else // RSlider type
if (metric instanceof RSlider) {
int value = ((RSlider) metric).getValue();
if (i == 2)
min = value;
// Overview stats will only consider modified sliders
if (metric.isModified()) {
if (value < min)
min = value;
if (value > max)
max = value;
average += (double) value / (double) numModified(team.getTabs(), ID);
relevance = average;
}
// add raw data
rawData.append(friendlySlider((RSlider) metric)).append(ending(i, team.getTabs()));
} else // RStopwatch type
if (metric instanceof RStopwatch) {
double value = ((RStopwatch) metric).getTime();
if (i == 2)
min = value;
// Overview stats will only consider modified stopwatches
if (metric.isModified()) {
/*
* Progressively calculate the min, max, and average values
*/
if (value < min)
min = value;
if (value > max)
max = value;
average += value / (double) numModified(team.getTabs(), ID);
relevance = average;
}
// add raw data
rawData.append(friendlyStopwatch((RStopwatch) metric)).append(ending(i, team.getTabs()));
} else // RTextfield type
if (metric instanceof RTextfield) {
int value = ((RTextfield) metric).getText().length();
// Overview stats will only consider modified textfields
if (metric.isModified()) {
/*
* Progressively calculate the min, max, and average values
*/
if (value < min)
min = value;
if (value > max)
max = value;
average += (double) value / (double) numModified(team.getTabs(), ID);
relevance = average;
}
// add raw data
rawData.append(value).append(" chars").append(ending(i, team.getTabs()));
} else // RGallery type
if (metric instanceof RGallery) {
int value = ((RGallery) metric).getImages().size();
// Overview stats will only consider modified textfields
if (metric.isModified()) {
/*
* Progressively calculate the min, max, and average values
*/
if (value < min)
min = value;
if (value > max)
max = value;
average += (double) value / (double) numModified(team.getTabs(), ID);
relevance = average;
}
// add raw data
rawData.append(value).append(" images ").append(ending(i, team.getTabs()));
} else // RCheckbox type
if (metric instanceof RCheckbox) {
// add raw data
rawData.append(friendlyCheckbox((RCheckbox) metric)).append(ending(i, team.getTabs()));
relevance += getCheckedAmount((RCheckbox) metric);
} else // RChooser type
if (metric instanceof RChooser) {
if (metric.isModified())
relevance++;
// add raw data
rawData.append(((RChooser) metric).getValues()[((RChooser) metric).getSelectedIndex()]).append(ending(i, team.getTabs()));
} else // Field data
if (metric instanceof RFieldData) {
// Find the sub metric
if (((RFieldData) metric).getData() != null && ((RFieldData) metric).getData().get(inMatchTitle) != null)
rawData.append(((RFieldData) metric).getData().get(inMatchTitle).get(team.getTabs().get(i).isRedAlliance() ? 0 : 1).toString()).append(ending(i, team.getTabs()));
// Overview stats will only consider modified textfields
if (metric.isModified()) {
/*
* Progressively calculate the min, max, and average values
*/
try {
double value = Double.parseDouble(((RFieldData) metric).getData().get(inMatchTitle).get(team.getTabs().get(i).isRedAlliance() ? 0 : 1).toString());
if (i == 2)
min = value;
if (value < min)
min = value;
if (value > max)
max = value;
average += value / (double) numModified(team.getTabs(), ID);
relevance = average;
} catch (Exception e) {
// eat it
}
}
}
/*
* Now, add the overview statistics to the team if the metric has overview statistics
* available
*/
max = Utils.round(max, 2);
min = Utils.round(min, 2);
average = Utils.round(average, 2);
StringBuilder overview = new StringBuilder();
if (metric instanceof RBoolean)
overview.append("Boolean: ").append(metric.getTitle()).append(" is true in ").append(occurrences).append(" / ").append(team.getTabs().size() - 2).append(" matches");
else if (metric instanceof RCounter)
overview.append("Counter: ").append(metric.getTitle()).append(" Average: ").append(Utils.round(average, 2)).append(" Min: ").append(min).append(" Max: ").append(max);
else if (metric instanceof RCalculation)
overview.append("Calculation: ").append(metric.getTitle()).append(" Average: ").append(Utils.round(average, 2)).append(" Min: ").append(min).append(" Max: ").append(max);
else if (metric instanceof RSlider)
overview.append("Slider: ").append(metric.getTitle()).append(" Average: ").append(Utils.round(average, 2)).append(" Min: ").append(min).append(" Max: ").append(max);
else if (metric instanceof RStopwatch)
overview.append("Stopwatch: ").append(metric.getTitle()).append(" Average: ").append(Utils.round(average, 2)).append(" Min: ").append(min).append(" Max: ").append(max);
else if (metric instanceof RTextfield)
overview.append("Textfield: ").append(metric.getTitle()).append(" Average chars: ").append(Utils.round(average, 2)).append(" Min: ").append(min).append(" Max: ").append(max);
else if (metric instanceof RGallery)
overview.append("Gallery: ").append(metric.getTitle()).append(" Average images: ").append(Utils.round(average, 2)).append(" Min: ").append(min).append(" Max: ").append(max);
else if (metric instanceof RChooser)
overview.append("Chooser: ").append(metric.getTitle());
else if (metric instanceof RCheckbox)
overview.append("Checkbox: ").append(metric.getTitle());
else if (metric instanceof RFieldData) {
overview.append("Field data: ").append(inMatchTitle);
try {
// this will fail if the value isn't a number
if (average != 0 || min != 0 || max != 0)
overview.append("\nAverage: ").append(Utils.round(average, 2)).append(" Min: ").append(min).append(" Max: ").append(max);
} catch (Exception e) {
// eat it
}
}
/*
* Now append the raw data as processed above
*/
team.setFilterTag("\n" + overview.append(rawData).toString());
team.setCustomRelevance(relevance);
// exit the loop, the metric has been fully processed
break;
}
}
} else /*
* The user requested MATCH_WINS
*/
if (method == PROCESS_METHOD.OTHER && ID == PROCESS_METHOD.OTHER_METHOD.MATCH_WINS) {
for (int i = 2; i < team.getTabs().size(); i++) {
if (team.getTabs().get(i).isWon()) {
occurrences++;
relevance++;
rawData.append("W");
} else
rawData.append("L");
rawData.append(ending(i, team.getTabs()));
}
/*
* Setup overview rawData and add raw data
*/
team.setCustomRelevance(relevance);
team.setFilterTag("\n" + String.valueOf(occurrences) + " match wins\n" + rawData.toString());
} else /*
* The user requested IN_MATCH
*/
if (method == PROCESS_METHOD.OTHER && ID == PROCESS_METHOD.OTHER_METHOD.IN_MATCH) {
team.setFilter(TeamsView.SORT_TYPE.NUMERICAL);
for (int i = 2; i < team.getTabs().size(); i++) {
if (team.getTabs().get(i).getTitle().equalsIgnoreCase(inMatchTitle)) {
team.setFilterTag("\n" + rawData.append("In ").append(inMatchTitle).toString());
team.setCustomRelevance(1);
}
}
} else /*
* The user request a reset
*/
if (method == PROCESS_METHOD.OTHER && ID == PROCESS_METHOD.OTHER_METHOD.RESET) {
team.setFilterTag("");
team.setCustomRelevance(0);
}
}
use of com.cpjd.roblu.models.metrics.RCalculation 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.metrics.RCalculation in project Roblu by wdavies973.
the class MatchData method generateSheet.
@Override
public void generateSheet(XSSFSheet sheet, REvent event, RForm form, RTeam[] teams, ArrayList<RCheckout> checkouts) {
/*
* Output the headers
*/
Row row = createRow(sheet);
createCell(row, 0, "Team Number");
createCell(row, 1, "Match number");
for (int i = 0; i < form.getMatch().size(); i++) {
createCell(row, i + 2, form.getMatch().get(i).getTitle());
}
/*
* Output the data
*/
for (RCheckout checkout : checkouts) {
if (checkout.getTeam().getTabs().get(0).getTitle().equalsIgnoreCase("PIT") || checkout.getTeam().getTabs().get(0).getTitle().equalsIgnoreCase("PREDICTIONS"))
continue;
Row data = createRow(sheet);
Cell cs = data.createCell(0);
cs.setCellValue(checkout.getTeam().getNumber());
cs.setCellStyle(getStyle());
createCell(data, 1, checkout.getTeam().getTabs().get(0).getTitle().replace("Quals ", ""));
int index = 0;
for (RMetric metric : checkout.getTeam().getTabs().get(0).getMetrics()) {
if (shouldWriteMetric(checkout.getTeam(), metric)) {
if (metric instanceof RStopwatch)
createCell(data, index + 2, ((RStopwatch) metric).getLapsString());
else if (metric instanceof RCalculation)
createCell(data, index + 2, ((RCalculation) metric).getValue(checkout.getTeam().getTabs().get(0).getMetrics()));
else if (metric instanceof RFieldData)
continue;
else
createCell(data, index + 2, metric.toString());
} else
createCell(data, index + 2, "");
index++;
}
}
}
Aggregations