Move fields to settings, add setting for match number

This commit is contained in:
Michael Mikovsky
2025-03-25 11:50:16 -06:00
parent 71ef386075
commit fbdd2206c0
10 changed files with 204 additions and 118 deletions
@@ -16,9 +16,9 @@ import androidx.fragment.app.Fragment;
import com.ridgebotics.ridgescout.R;
import com.ridgebotics.ridgescout.scoutingData.fields;
import com.ridgebotics.ridgescout.ui.settings.FieldsFragment;
import com.ridgebotics.ridgescout.utility.settingsManager;
import com.ridgebotics.ridgescout.databinding.FragmentDataBinding;
import com.ridgebotics.ridgescout.types.frcTeam;
import com.ridgebotics.ridgescout.ui.TeamSelectorFragment;
import com.ridgebotics.ridgescout.utility.fileEditor;
import com.ridgebotics.ridgescout.types.frcEvent;
@@ -37,33 +37,16 @@ public class DataFragment extends Fragment {
String evcode = settingsManager.getEVCode();
binding.fieldsButton.setOnClickListener(v -> {
binding.fieldsButton.setEnabled(false);
binding.fieldsButtons.setVisibility(VISIBLE);
});
binding.fieldsMatchesButton.setOnClickListener(v -> {
FieldsFragment.set_filename(fields.matchFieldsFilename);
findNavController(this).navigate(R.id.action_navigation_data_to_navigation_data_fields);
});
binding.fieldsPitsButton.setOnClickListener(v -> {
FieldsFragment.set_filename(fields.pitsFieldsFilename);
findNavController(this).navigate(R.id.action_navigation_data_to_navigation_data_fields);
});
if(evcode.equals("unset")){
binding.noEventError.setVisibility(VISIBLE);
binding.buttons.setVisibility(VISIBLE);
binding.teamsButton.setEnabled(false);
binding.fieldsButton.setVisibility(VISIBLE);
// binding.teamsButton.setEnabled(false);
return root;
}
frcEvent event = frcEvent.decode(fileEditor.readFile(evcode + ".eventdata"));
// frcEvent event = frcEvent.decode(fileEditor.readFile(evcode + ".eventdata"));
binding.teamsButton.setOnClickListener(v -> {
TeamSelectorFragment.setPits_mode(false);
@@ -15,6 +15,8 @@ public class TallyCounterView extends LinearLayout {
private Button minusButton;
private Button plusButton;
private OnCountChangedListener onCountChangedListener;
private int min = 0;
private int max = -1;
public interface OnCountChangedListener {
void onCountChanged(int newCount);
@@ -45,20 +47,26 @@ public class TallyCounterView extends LinearLayout {
updateDisplay();
minusButton.setOnClickListener(v -> {
if(count > 0) {
if(count > min) {
count--;
updateDisplay();
}
});
plusButton.setOnClickListener(v -> {
count++;
updateDisplay();
if(max == -1 || count < max){
count++;
updateDisplay();
}
});
}
private void updateDisplay() {
countDisplay.setText(String.valueOf(count));
minusButton.setEnabled(count > min);
plusButton.setEnabled(max == -1 || count < max);
if (onCountChangedListener != null) {
onCountChangedListener.onCountChanged(count);
}
@@ -69,6 +77,12 @@ public class TallyCounterView extends LinearLayout {
updateDisplay();
}
public void setBounds(int min, int max){
this.min = min;
this.max = max;
updateDisplay();
}
public int getValue() {
return count;
}
@@ -1,4 +1,4 @@
package com.ridgebotics.ridgescout.ui.data;
package com.ridgebotics.ridgescout.ui.settings;
import static android.text.InputType.TYPE_CLASS_NUMBER;
@@ -1,4 +1,4 @@
package com.ridgebotics.ridgescout.ui.data;
package com.ridgebotics.ridgescout.ui.settings;
import android.annotation.SuppressLint;
import android.app.Activity;
@@ -242,7 +242,7 @@ public class FieldsFragment extends Fragment {
if(fields.save(filename, newValues))
AlertManager.toast("Saved");
Navigation.findNavController((Activity) getContext(), R.id.nav_host_fragment_activity_main).navigate(R.id.action_navigation_data_fields_to_navigation_data);
Navigation.findNavController((Activity) getContext(), R.id.nav_host_fragment_activity_main).navigate(R.id.action_navigation_data_fields_to_navigation_settings);
});
alert.setNegativeButton("Cancel", null);
alert.setCancelable(true);
@@ -1,7 +1,10 @@
package com.ridgebotics.ridgescout.ui.settings;
import static android.view.View.VISIBLE;
import static androidx.navigation.fragment.FragmentKt.findNavController;
import static com.ridgebotics.ridgescout.utility.settingsManager.AllyPosKey;
import static com.ridgebotics.ridgescout.utility.settingsManager.CustomEventsKey;
import static com.ridgebotics.ridgescout.utility.settingsManager.MatchNumKey;
import static com.ridgebotics.ridgescout.utility.settingsManager.SelEVCodeKey;
import static com.ridgebotics.ridgescout.utility.settingsManager.UnameKey;
import static com.ridgebotics.ridgescout.utility.settingsManager.WifiModeKey;
@@ -15,6 +18,7 @@ import android.os.Bundle;
import android.text.Editable;
import android.text.InputType;
import android.text.TextWatcher;
import android.view.Gravity;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
@@ -29,9 +33,13 @@ import com.google.android.material.card.MaterialCardView;
import com.google.android.material.checkbox.MaterialCheckBox;
import com.google.android.material.textfield.TextInputEditText;
import com.google.android.material.textfield.TextInputLayout;
import com.ridgebotics.ridgescout.R;
import com.ridgebotics.ridgescout.databinding.FragmentSettingsBinding;
import com.ridgebotics.ridgescout.scoutingData.fields;
import com.ridgebotics.ridgescout.ui.CustomSpinnerPopup;
import com.ridgebotics.ridgescout.ui.CustomSpinnerView;
import com.ridgebotics.ridgescout.ui.scouting.TallyCounterView;
import com.ridgebotics.ridgescout.utility.DataManager;
import com.ridgebotics.ridgescout.utility.fileEditor;
import com.ridgebotics.ridgescout.utility.settingsManager;
@@ -50,8 +58,30 @@ public class settingsFragment extends Fragment {
binding = FragmentSettingsBinding.inflate(inflater, container, false);
View root = binding.getRoot();
reloadSettings();
binding.fieldsButton.setOnClickListener(v -> {
binding.fieldsButton.setEnabled(false);
binding.fieldsButtons.setVisibility(VISIBLE);
});
binding.fieldsMatchesButton.setOnClickListener(v -> {
FieldsFragment.set_filename(fields.matchFieldsFilename);
findNavController(this).navigate(R.id.action_navigation_settings_to_navigation_data_fields);
});
binding.fieldsPitsButton.setOnClickListener(v -> {
FieldsFragment.set_filename(fields.pitsFieldsFilename);
findNavController(this).navigate(R.id.action_navigation_settings_to_navigation_data_fields);
});
return root;
}
private void reloadSettings(){
String[] alliance_pos_list = new String[]{"red-1", "red-2", "red-3",
"blue-1", "blue-2", "blue-3"};
"blue-1", "blue-2", "blue-3"};
SettingsManager manager = new SettingsManager(getContext());
@@ -70,16 +100,32 @@ public class settingsFragment extends Fragment {
manager.addItem(new NumberSettingsItem(YearNumKey, "Year", 0, 9999));
manager.addItem(new DropdownSettingsItem(AllyPosKey, "Alliance Pos", alliance_pos_list));
manager.addItem(new DropdownSettingsItem(SelEVCodeKey, "Event Code", fileEditor.getEventList().toArray(new String[0])));
int max = 0;
boolean hasEvent = false;
if(!DataManager.getevcode().equals("unset")){
DataManager.reload_event();
max = DataManager.event.matches.size();
hasEvent = true;
}
TallySettingsItem matchNum = new TallySettingsItem(MatchNumKey, "Match Number", max);
matchNum.setEnabled(hasEvent);
manager.addItem(matchNum);
DropdownSettingsItem eventCode = new DropdownSettingsItem(SelEVCodeKey, "Event Code", fileEditor.getEventList().toArray(new String[0]));
eventCode.reloadOnChange(true);
manager.addItem(eventCode);
manager.addItem(new StringSettingsItem(UnameKey, "Username"));
binding.SettingsTable.removeAllViews();
manager.getView(binding.SettingsTable);
return root;
}
@Override
public void onDestroyView() {
super.onDestroyView();
@@ -103,6 +149,7 @@ public class settingsFragment extends Fragment {
private String key;
private String title;
private T defaultValue;
public View view;
public SettingsItem(String key, String title, T defaultValue) {
this.key = key;
@@ -110,6 +157,14 @@ public class settingsFragment extends Fragment {
this.defaultValue = defaultValue;
}
private boolean reloadOnChange = false;
public void reloadOnChange(boolean enabled){
reloadOnChange = enabled;
}
public boolean isReloadOnChange(){
return reloadOnChange;
}
public abstract View createView(Context context);
public abstract T getValue();
@@ -146,6 +201,7 @@ public class settingsFragment extends Fragment {
@Override
public void afterTextChanged(Editable s) {
getEditor().putString(getKey(), s.toString()).apply();
if(isReloadOnChange()) reloadSettings();
}
@Override
@@ -205,6 +261,7 @@ public class settingsFragment extends Fragment {
} catch (NumberFormatException e) {
editText.setText(String.valueOf(getDefaultValue()));
}
if(isReloadOnChange()) reloadSettings();
}
@Override
@@ -225,6 +282,66 @@ public class settingsFragment extends Fragment {
}
}
public class TallySettingsItem extends SettingsItem<Integer> {
private int max;
public TallySettingsItem(String key, String title, int max) {
super(key, title, prefs.getInt(key, (int) defaults.get(key)));
this.max = max;
}
TallyCounterView tally;
private boolean enabled;
@Override
public void setEnabled(boolean enabled){
this.enabled = enabled;
if(tally != null)
tally.setEnabled(enabled);
}
@Override
public View createView(Context context) {
LinearLayout ll = new LinearLayout(getContext());
ll.setOrientation(LinearLayout.VERTICAL);
tally = new TallyCounterView(getContext());
int value = getValue()+1;
if(value >= max){
value = max;
getEditor().putInt(getKey(), max-1).apply();
}
tally.setValue(value);
tally.setBounds(1, max);
tally.setOnCountChangedListener(count -> {
getEditor().putInt(getKey(), count-1).apply();
if(isReloadOnChange()) reloadSettings();
});
tally.setEnabled(enabled);
TextView tv = new TextView(getContext());
tv.setText(getTitle());
tv.setTextAppearance(com.google.android.material.R.style.TextAppearance_MaterialComponents_Headline6);
tv.setGravity(Gravity.CENTER);
ll.addView(tv);
ll.addView(tally);
return ll;
}
@Override
public Integer getValue() {
return prefs.getInt(getKey(), (int) defaults.get(getKey()));
}
}
public class DropdownSettingsItem extends SettingsItem<String> {
private String[] options;
@@ -257,6 +374,7 @@ public class settingsFragment extends Fragment {
dropdown.setOnClickListener((item, index) -> {
getEditor().putString(getKey(), item).apply();
if(isReloadOnChange()) reloadSettings();
});
return dropdown;
@@ -297,6 +415,7 @@ public class settingsFragment extends Fragment {
for (SettingsItem<?> item : controlledItems) {
item.setEnabled(isChecked);
}
if(isReloadOnChange()) reloadSettings();
});
for (SettingsItem<?> item : controlledItems) {
@@ -337,7 +456,11 @@ public class settingsFragment extends Fragment {
itemContainer.setOrientation(LinearLayout.VERTICAL);
itemContainer.setPadding(32, 0, 32, 8);
itemContainer.addView(item.createView(context));
View view = item.createView(context);
itemContainer.addView(view);
item.view = view;
views.add(itemContainer);
}
@@ -4,7 +4,6 @@ package com.ridgebotics.ridgescout.ui.transfer;
import static com.ridgebotics.ridgescout.utility.DataManager.evcode;
import static com.ridgebotics.ridgescout.utility.fileEditor.baseDir;
import com.ridgebotics.ridgescout.ui.data.FieldEditorHelper;
import com.ridgebotics.ridgescout.utility.AlertManager;
import com.ridgebotics.ridgescout.utility.BuiltByteParser;
import com.ridgebotics.ridgescout.utility.ByteBuilder;
@@ -13,25 +12,20 @@ import com.ridgebotics.ridgescout.utility.settingsManager;
import org.apache.commons.net.ftp.FTP;
import org.apache.commons.net.ftp.FTPClient;
import org.apache.commons.net.ftp.FTPCmd;
import org.apache.commons.net.ftp.FTPFile;
import org.apache.commons.net.ftp.FTPReply;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.net.InetAddress;
import java.util.Arrays;
import java.util.Calendar;
import java.util.Date;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.TimeZone;
public class FTPSync extends Thread {
public static final String remoteBasePath = "/RidgeScout/";
-41
View File
@@ -27,17 +27,6 @@
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent">
<Button
android:id="@+id/fieldsButton"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Fields"
android:textSize="34sp"
app:layout_constraintBottom_toTopOf="@+id/teamsButton"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<Button
android:id="@+id/teamsButton"
android:layout_width="wrap_content"
@@ -49,35 +38,5 @@
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@id/fieldsButton" />
<LinearLayout
android:id="@+id/fieldsButtons"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="1dp"
android:gravity="center"
android:orientation="horizontal"
android:visibility="gone"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/fieldsButton"
tools:visibility="visible">
<Button
android:id="@+id/fieldsPitsButton"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_margin="5dp"
android:text="Pits"
android:textSize="34sp" />
<Button
android:id="@+id/fieldsMatchesButton"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_margin="5dp"
android:text="Matches"
android:textSize="34sp" />
</LinearLayout>
</androidx.constraintlayout.widget.ConstraintLayout>
</androidx.constraintlayout.widget.ConstraintLayout>
@@ -1,29 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
xmlns:app="http://schemas.android.com/apk/res-auto">
<Button
android:id="@+id/matchScoutingButton"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Matches"
android:textSize="34sp"
app:layout_constraintBottom_toTopOf="@id/pitScoutingButton"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<Button
android:id="@+id/pitScoutingButton"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Pits"
android:textSize="34sp"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@id/matchScoutingButton" />
</androidx.constraintlayout.widget.ConstraintLayout>
@@ -7,6 +7,7 @@
tools:context=".ui.settings.settingsFragment">
<ScrollView
android:id="@+id/scrollView2"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_marginBottom="60dp"
@@ -27,4 +28,45 @@
</ScrollView>
<Button
android:id="@+id/fieldsButton"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Fields"
android:textSize="34sp"
app:layout_constraintBottom_toBottomOf="@+id/scrollView2"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent" />
<LinearLayout
android:id="@+id/fieldsButtons"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="1dp"
android:gravity="center"
android:orientation="horizontal"
android:visibility="gone"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintBottom_toTopOf="@+id/fieldsButton"
tools:visibility="visible">
<Button
android:id="@+id/fieldsPitsButton"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_margin="5dp"
android:text="Pits"
android:textSize="34sp" />
<Button
android:id="@+id/fieldsMatchesButton"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_margin="5dp"
android:text="Matches"
android:textSize="34sp" />
</LinearLayout>
</androidx.constraintlayout.widget.ConstraintLayout>
@@ -81,13 +81,6 @@
app:exitAnim="@anim/exit_anim"
app:popEnterAnim="@anim/pop_enter_anim"
app:popExitAnim="@anim/pop_exit_anim" />
<action
android:id="@+id/action_navigation_data_to_navigation_data_fields"
app:destination="@id/navigation_data_fields"
app:enterAnim="@anim/enter_anim"
app:exitAnim="@anim/exit_anim"
app:popEnterAnim="@anim/pop_enter_anim"
app:popExitAnim="@anim/pop_exit_anim" />
</fragment>
<fragment
@@ -104,11 +97,11 @@
<fragment
android:id="@+id/navigation_data_fields"
android:name="com.ridgebotics.ridgescout.ui.data.FieldsFragment"
android:name="com.ridgebotics.ridgescout.ui.settings.FieldsFragment"
tools:layout="@layout/fragment_data_fields">
<action
android:id="@+id/action_navigation_data_fields_to_navigation_data"
app:destination="@id/navigation_data"
android:id="@+id/action_navigation_data_fields_to_navigation_settings"
app:destination="@id/navigation_settings"
app:enterAnim="@anim/enter_anim"
app:exitAnim="@anim/exit_anim"
app:popEnterAnim="@anim/pop_enter_anim"
@@ -232,6 +225,13 @@
android:name="com.ridgebotics.ridgescout.ui.settings.settingsFragment"
android:label="@string/title_settings"
tools:layout="@layout/fragment_settings">
<action
android:id="@+id/action_navigation_settings_to_navigation_data_fields"
app:destination="@id/navigation_data_fields"
app:enterAnim="@anim/enter_anim"
app:exitAnim="@anim/exit_anim"
app:popEnterAnim="@anim/pop_enter_anim"
app:popExitAnim="@anim/pop_exit_anim" />
</fragment>