use of com.cpjd.roblu.models.metrics.RDivider in project Roblu by wdavies973.
the class MetricEditor method onItemSelected.
/**
* Called when the user selects a metric type
* @param adapterView the adapter containing all the choices
* @param view the view that was tapped
* @param i the position of the view
* @param l id of the view
*/
@Override
public void onItemSelected(AdapterView<?> adapterView, View view, int i, long l) {
((TextView) adapterView.getChildAt(0)).setTextColor(rui.getText());
/*
* User selected a new metric, let's create it
*/
String stringOfSelected = METRIC_TYPES[i];
if (stringOfSelected.equals(METRIC_TYPES[0])) {
metric = new RBoolean(0, "Boolean", false);
} else if (stringOfSelected.equals(METRIC_TYPES[1])) {
metric = new RCounter(0, "Counter", 1, 0);
} else if (stringOfSelected.equals(METRIC_TYPES[2])) {
metric = new RSlider(0, "Slider", 0, 100, 0);
} else if (stringOfSelected.equals(METRIC_TYPES[3])) {
metric = new RChooser(0, "Chooser", null, 0);
} else if (stringOfSelected.equals(METRIC_TYPES[4])) {
metric = new RCheckbox(0, "Checkbox", null);
} else if (stringOfSelected.equals(METRIC_TYPES[5])) {
metric = new RStopwatch(0, "Stopwatch", 0);
} else if (stringOfSelected.equals(METRIC_TYPES[6])) {
metric = new RTextfield(0, "Text field", "");
} else if (stringOfSelected.equals(METRIC_TYPES[7])) {
metric = new RGallery(0, "Gallery");
} else if (stringOfSelected.equalsIgnoreCase(METRIC_TYPES[8])) {
metric = new RDivider(0, "Divider");
} else if (stringOfSelected.equals(METRIC_TYPES[9])) {
metric = new RFieldDiagram(0, R.drawable.field2018, null);
} else if (stringOfSelected.equals(METRIC_TYPES[10])) {
metric = new RCalculation(0, "Custom calculation");
} else if (stringOfSelected.equals(METRIC_TYPES[11])) {
metric = new RFieldData(0, "Match data");
}
metric.setModified(true);
addMetricPreviewToToolbar();
buildConfigLayout();
}
use of com.cpjd.roblu.models.metrics.RDivider in project Roblu by wdavies973.
the class Overview method onCreateView.
@Override
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.overview_tab, container, false);
Bundle bundle = this.getArguments();
layout = view.findViewById(R.id.overview_layout);
REvent event = (REvent) getArguments().getSerializable("event");
RTeam team = new IO(getActivity()).loadTeam(event.getID(), TeamViewer.team.getID());
rMetricToUI = new RMetricToUI(getActivity(), new IO(getActivity()).loadSettings().getRui(), true);
try {
/*
* Do statistics generation, this will generate graphs for certain metrics
*/
// Stores pie chart values, with the sub linked hash map <item,occurrences>, this will need to be processed later into a percent
LinkedHashMap<String, LinkedHashMap<String, Double>> pieValues = new LinkedHashMap<>();
// Stores line chart values, with the sub linked hash map <matchName,value>
LinkedHashMap<String, LinkedHashMap<String, Double>> lineValues = new LinkedHashMap<>();
// This isn't directly related, more of a side project
ArrayList<RGallery> galleries = new ArrayList<>();
for (RTab tab : team.getTabs()) {
// Rule out disallowed tabs
if (tab.getTitle().equalsIgnoreCase("PIT"))
continue;
// Start processing metrics
for (RMetric metric : tab.getMetrics()) {
if (metric instanceof RGallery) {
galleries.add((RGallery) metric);
}
if (!metric.isModified())
continue;
// Pie graph metrics, scan these here
if (metric instanceof RBoolean) {
LinkedHashMap<String, Double> temp = pieValues.get(metric.getTitle());
if (temp == null)
temp = new LinkedHashMap<>();
String key = ((RBoolean) metric).isValue() ? "Yes" : "No";
if (temp.get(key) == null)
temp.put(key, 1.0);
else
temp.put(key, temp.get(key) + 1);
pieValues.put(metric.getTitle(), temp);
} else if (metric instanceof RCheckbox) {
if (((RCheckbox) metric).getValues() != null) {
for (Object key : ((RCheckbox) metric).getValues().keySet()) {
LinkedHashMap<String, Double> temp = pieValues.get(metric.getTitle());
if (temp == null)
temp = new LinkedHashMap<>();
if (temp.get(key.toString()) == null)
temp.put(key.toString(), 1.0);
else
temp.put(key.toString(), temp.get(key.toString()) + 1);
pieValues.put(metric.getTitle(), temp);
}
}
} else if (metric instanceof RChooser) {
LinkedHashMap<String, Double> temp = pieValues.get(metric.getTitle());
if (temp == null)
temp = new LinkedHashMap<>();
if (temp.get(metric.toString()) == null)
temp.put(metric.toString(), 1.0);
else
temp.put(metric.toString(), temp.get(metric.toString()) + 1);
pieValues.put(metric.getTitle(), temp);
} else // Line chart metrics
if (metric instanceof RCounter || metric instanceof RSlider || metric instanceof RStopwatch || metric instanceof RCalculation) {
LinkedHashMap<String, Double> temp = lineValues.get(metric.getTitle());
if (temp == null)
temp = new LinkedHashMap<>();
temp.put(tab.getTitle(), Double.parseDouble(metric.toString()));
lineValues.put(metric.getTitle(), temp);
}
}
}
// Add the divider metrics by position, -1 if no metric after it, or at the end
ArrayList<RDivider> addedDividers = new ArrayList<>();
/*
* Add the charts!
*/
for (Object key : lineValues.keySet()) {
if (lineValues.get(key.toString()).size() >= 2) {
loop: for (RTab tab : team.getTabs()) {
for (int i = 0; i < tab.getMetrics().size(); i++) {
if (tab.getMetrics().get(i).getTitle().equals(key.toString())) {
// See if there is a RDivider hiding above this metric
for (int j = i; j >= 0; j--) {
if (tab.getMetrics().get(j) instanceof RDivider && !addedDividers.contains(tab.getMetrics().get(j))) {
layout.addView(rMetricToUI.getDivider((RDivider) tab.getMetrics().get(j)));
addedDividers.add((RDivider) tab.getMetrics().get(j));
break loop;
}
}
}
}
}
layout.addView(rMetricToUI.generateLineChart(key.toString(), lineValues.get(key.toString())));
}
}
// Process the pie charts
for (Object key : pieValues.keySet()) {
if (pieValues.get(key.toString()).size() <= 1)
continue;
int metricID = 0;
loop: for (RTab tab : team.getTabs()) {
for (int i = 0; i < tab.getMetrics().size(); i++) {
if (tab.getMetrics().get(i).getTitle().equals(key.toString())) {
metricID = tab.getMetrics().get(i).getID();
// See if there is a RDivider hiding above this metric
for (int j = i; j >= 0; j--) {
if (tab.getMetrics().get(j) instanceof RDivider && !addedDividers.contains(tab.getMetrics().get(j))) {
layout.addView(rMetricToUI.getDivider((RDivider) tab.getMetrics().get(j)));
addedDividers.add((RDivider) tab.getMetrics().get(j));
break loop;
}
}
}
}
}
for (Object key2 : pieValues.get(key.toString()).keySet()) {
if (numModified(team.getTabs(), metricID) != 0)
pieValues.get(key.toString()).put(key2.toString(), pieValues.get(key.toString()).get(key2.toString()) / (double) numModified(team.getTabs(), metricID));
}
layout.addView(rMetricToUI.generatePieChart(key.toString(), pieValues.get(key.toString())));
}
/*
* Find the image with the most entropy, and add
* it as the "featured" image
*/
galleryLoop: for (int j = galleries.size() - 1; j >= 0; j--) {
if (galleries.get(j).getImages() != null && galleries.get(j).getImages().size() > 0) {
for (int i = galleries.get(j).getImages().size() - 1; i >= 0; i--) {
try {
layout.addView(rMetricToUI.getImageView("Featured image", BitmapFactory.decodeByteArray(galleries.get(j).getImages().get(i), 0, galleries.get(j).getImages().get(i).length)));
break galleryLoop;
} catch (Exception e) {
Log.d("RBS", "Failed to load featured image: " + e.getMessage());
}
}
}
}
} catch (Exception e) {
Log.d("RBS", "Failed to generate graphs for this team profile.");
}
/*
* Attempt to download TBA info for this team
*/
if (!team.hasTBAInfo()) {
if (event.getKey() != null && event.getKey().length() >= 4)
new TBATeamInfoTask(view.getContext(), team.getNumber(), event.getKey().substring(0, 4), this);
} else {
// TBA info card
layout.addView(rMetricToUI.getInfoField("TBA.com information", TeamViewer.team.getTbaInfo(), TeamViewer.team.getWebsite(), TeamViewer.team.getNumber()), 0);
if (TeamViewer.team.getImage() != null) {
// Image view
Bitmap bitmap = BitmapFactory.decodeByteArray(TeamViewer.team.getImage(), 0, TeamViewer.team.getImage().length);
layout.addView(rMetricToUI.getImageView("Robot", bitmap));
}
}
/*
* Add UI cards to the layout
*/
// "Other" card
layout.addView(rMetricToUI.getInfoField("Other", "Last edited: " + Utils.convertTime(team.getLastEdit()) + "\nSize on disk: " + new IO(view.getContext()).getTeamSize(bundle.getInt("eventID"), team.getID()) + " KB", "", 0));
return view;
}
use of com.cpjd.roblu.models.metrics.RDivider 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.RDivider in project Roblu by wdavies973.
the class PredefinedFormSelector method processForm.
/**
* Converst the form into an RForm reference
* @param name the file name
* @return an RForm instance
*/
private RForm processForm(int index, String name) {
RForm form = new RForm(null, null);
ArrayList<RMetric> metrics = new ArrayList<>();
try {
AssetManager am = getAssets();
InputStream is = am.open("predefinedForms" + File.separator + name);
BufferedReader br = new BufferedReader(new InputStreamReader(is));
String line;
int ID = 0;
while ((line = br.readLine()) != null) {
if (line.startsWith("Title")) {
items[index] = line.split(":")[1];
continue;
} else if (line.startsWith("Description")) {
sub_items[index] = line.split(":")[1];
continue;
}
switch(line) {
case "PIT":
continue;
case "MATCH":
form.setPit(new ArrayList<>(metrics));
metrics.clear();
continue;
case "DEFAULTS":
metrics.add(new RTextfield(0, "Team name", false, true, ""));
metrics.add(new RTextfield(1, "Team number", true, true, ""));
ID = 2;
break;
}
/*
* Process file
*/
String regex = "(?<!\\\\)" + Pattern.quote(",");
String[] tokens = line.split(regex);
for (int i = 0; i < tokens.length; i++) {
tokens[i] = tokens[i].replaceAll("\\\\,", ",");
}
switch(tokens[0]) {
case "counter":
metrics.add(new RCounter(ID, tokens[1], Integer.parseInt(tokens[2]), Integer.parseInt(tokens[3])));
ID++;
break;
case "divider":
metrics.add(new RDivider(ID, tokens[1]));
ID++;
break;
case "chooser":
metrics.add(new RChooser(ID, tokens[1], tokens[2].split(":"), Integer.parseInt(tokens[3])));
ID++;
break;
case "slider":
metrics.add(new RSlider(ID, tokens[1], Integer.parseInt(tokens[2]), Integer.parseInt(tokens[3]), Integer.parseInt(tokens[4])));
ID++;
break;
case "checkbox":
LinkedHashMap<String, Boolean> temp = new LinkedHashMap<>();
for (String s : tokens[2].split(":")) temp.put(s, false);
metrics.add(new RCheckbox(ID, tokens[1], temp));
ID++;
break;
case "textfield":
metrics.add(new RTextfield(ID, tokens[1], ""));
ID++;
break;
case "stopwatch":
metrics.add(new RStopwatch(ID, tokens[1], Double.parseDouble(tokens[2])));
ID++;
break;
case "boolean":
metrics.add(new RBoolean(ID, tokens[1], Boolean.parseBoolean(tokens[2])));
ID++;
break;
case "gallery":
metrics.add(new RGallery(ID, tokens[1]));
ID++;
break;
}
}
form.setMatch(metrics);
Log.d("RBS", "Form created successfully with " + form.getPit().size() + " pit metrics and " + form.getMatch().size() + " match metrics");
return form;
} catch (IOException e) {
Log.d("RBS", "Failed to process form: " + e.getMessage());
return null;
}
}
use of com.cpjd.roblu.models.metrics.RDivider in project Roblu by wdavies973.
the class CustomSort method onCreate.
@Override
public void onCreate(Bundle saveInstanceState) {
super.onCreate(saveInstanceState);
setContentView(R.layout.activity_customsort);
/*
* Load the form and remove the team NAME and NUMBER metrics (since the user can sort by
* this already without using CustomSort). Good news is that we know the form will ALWAYS
* keep the team NAME and NUMBER as ID 0 and 1 respectively.
*/
RForm form = new IO(getApplicationContext()).loadForm(getIntent().getIntExtra("eventID", 0));
for (int i = 0; i < form.getPit().size(); i++) {
if (form.getPit().get(i).getID() == 0 || form.getPit().get(i).getID() == 1 || form.getPit().get(i) instanceof RDivider || form.getPit().get(i) instanceof RFieldDiagram) {
form.getPit().remove(i);
i--;
}
}
// Remove dividers - they are useless for sorting
for (int i = 0; i < form.getMatch().size(); i++) {
if (form.getMatch().get(i) instanceof RDivider || form.getMatch().get(i) instanceof RFieldDiagram) {
form.getMatch().remove(i);
i--;
}
}
/*
* Setup UI
*/
// Toolbar
Toolbar toolbar = findViewById(R.id.toolbar);
setSupportActionBar(toolbar);
if (getSupportActionBar() != null) {
getSupportActionBar().setTitle("Custom sort");
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
}
// Setup tabs
TabLayout tabLayout = findViewById(R.id.tab_layout);
tabLayout.setTabGravity(TabLayout.GRAVITY_FILL);
tabLayout.setBackgroundColor(new IO(getApplicationContext()).loadSettings().getRui().getPrimaryColor());
// Setup the adapter - the back-end to the UI (manages all the MetricFragments)
MetricSortAdapter adapter = new MetricSortAdapter(getSupportFragmentManager(), form, getIntent().getIntExtra("eventID", 0));
ViewPager pager = findViewById(R.id.pager);
pager.addOnPageChangeListener(this);
pager.setAdapter(adapter);
tabLayout.setupWithViewPager(pager);
// Sync UI with user preferences
new UIHandler(this, toolbar).update();
}
Aggregations