mirror of
https://github.com/TimeCrafters/TimeCraftersConfigurationTool.git
synced 2025-12-16 05:22:35 +00:00
More implementation work
This commit is contained in:
@@ -6,6 +6,9 @@ import com.google.gson.Gson;
|
|||||||
import com.google.gson.GsonBuilder;
|
import com.google.gson.GsonBuilder;
|
||||||
import com.google.gson.internal.LinkedTreeMap;
|
import com.google.gson.internal.LinkedTreeMap;
|
||||||
|
|
||||||
|
import org.timecrafters.TimeCraftersConfigurationTool.backend.config.Configuration;
|
||||||
|
import org.timecrafters.TimeCraftersConfigurationTool.backend.config.Group;
|
||||||
|
import org.timecrafters.TimeCraftersConfigurationTool.backend.config.Preset;
|
||||||
import org.timecrafters.TimeCraftersConfigurationTool.serializers.SettingsDeserializer;
|
import org.timecrafters.TimeCraftersConfigurationTool.serializers.SettingsDeserializer;
|
||||||
import org.timecrafters.TimeCraftersConfigurationTool.serializers.SettingsSerializer;
|
import org.timecrafters.TimeCraftersConfigurationTool.serializers.SettingsSerializer;
|
||||||
|
|
||||||
@@ -15,6 +18,7 @@ import java.io.File;
|
|||||||
import java.io.FileNotFoundException;
|
import java.io.FileNotFoundException;
|
||||||
import java.io.FileReader;
|
import java.io.FileReader;
|
||||||
import java.io.FileWriter;
|
import java.io.FileWriter;
|
||||||
|
import java.io.FilenameFilter;
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
import java.nio.file.Files;
|
import java.nio.file.Files;
|
||||||
import java.nio.file.Path;
|
import java.nio.file.Path;
|
||||||
@@ -100,7 +104,52 @@ public class Backend {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public void writeNewConfig(String name) {
|
public void writeNewConfig(String name) {
|
||||||
// TODO: Implement
|
String path = "" + TAC.CONFIGS_PATH + File.separator + name;
|
||||||
|
File file = new File(path);
|
||||||
|
|
||||||
|
Configuration configuration = new Configuration(new Date(), new Date(), TAC.CONFIG_SPEC_VERSION, 0);
|
||||||
|
ArrayList<Group> groups = new ArrayList<>();
|
||||||
|
ArrayList<Preset> presets = new ArrayList<>();
|
||||||
|
Config config = new Config(configuration, groups, presets);
|
||||||
|
|
||||||
|
Gson gson = new Gson();
|
||||||
|
|
||||||
|
try {
|
||||||
|
FileWriter fileWriter = new FileWriter(file);
|
||||||
|
fileWriter.write(gsonForConfig().toJson(config));
|
||||||
|
fileWriter.close();
|
||||||
|
} catch (IOException error) {
|
||||||
|
/* TODO */
|
||||||
|
Log.d(TAG, "writeNewConfig: IO Error: " + error.toString());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public ArrayList<String> configsList() {
|
||||||
|
ArrayList<String> list = new ArrayList<>();
|
||||||
|
|
||||||
|
File directory = new File(TAC.CONFIGS_PATH);
|
||||||
|
FilenameFilter filter = new FilenameFilter() {
|
||||||
|
@Override
|
||||||
|
public boolean accept(File dir, String name) {
|
||||||
|
return name.endsWith(".json");
|
||||||
|
}
|
||||||
|
};
|
||||||
|
File fileList[] = directory.listFiles(filter);
|
||||||
|
for (File file : fileList) {
|
||||||
|
Log.d(TAG, "configsList: " + file.getName());
|
||||||
|
list.add(file.getName());
|
||||||
|
}
|
||||||
|
|
||||||
|
return list;
|
||||||
|
}
|
||||||
|
|
||||||
|
// TODO: Write De/serializers for config
|
||||||
|
private Gson gsonForConfig() {
|
||||||
|
// return new GsonBuilder()
|
||||||
|
// .registerTypeAdapter(Config.class, new ConfigSerializer())
|
||||||
|
// .registerTypeAdapter(COnfig.class, new ConfigDeserializer())
|
||||||
|
// .create();
|
||||||
|
return new GsonBuilder().create();
|
||||||
}
|
}
|
||||||
|
|
||||||
public void settingsChanged() {
|
public void settingsChanged() {
|
||||||
|
|||||||
@@ -17,52 +17,12 @@ public class Config {
|
|||||||
private ArrayList<Group> groups;
|
private ArrayList<Group> groups;
|
||||||
private ArrayList<Preset> presets;
|
private ArrayList<Preset> presets;
|
||||||
|
|
||||||
// DELETE ME
|
// TODO: DELETE ME
|
||||||
public Config() {
|
public Config() {
|
||||||
this.name = "DEBUG ONLY";
|
this.name = "DEBUG ONLY";
|
||||||
this.configuration = new Configuration(new Date(), new Date(), 0, 32);
|
this.configuration = new Configuration(new Date(), new Date(), 0, 32);
|
||||||
groups = new ArrayList<>();
|
groups = new ArrayList<>();
|
||||||
presets = new ArrayList<>();
|
presets = new ArrayList<>();
|
||||||
|
|
||||||
ArrayList<Action> actions = new ArrayList<>();
|
|
||||||
ArrayList<Variable> variables = new ArrayList<>();
|
|
||||||
variables.add(new Variable("VarName", "Dx90.45"));
|
|
||||||
variables.add(new Variable("VarName2", "Fx90.45"));
|
|
||||||
variables.add(new Variable("VarName3", "Dx90.45"));
|
|
||||||
variables.add(new Variable("distance", "Ix90"));
|
|
||||||
variables.add(new Variable("variable", "Dx90.45"));
|
|
||||||
variables.add(new Variable("tea_time", "SxThe Tea Party was quite enjoyable."));
|
|
||||||
variables.add(new Variable("tea_time", "SxThe x Tea x Party was x quite x enjoyable."));
|
|
||||||
|
|
||||||
actions.add(new Action("DriverOne", "This is a comment", true, variables));
|
|
||||||
actions.add(new Action("DriverTwo", "", true, variables));
|
|
||||||
actions.add(new Action("DriverAlt", "This is also is a comment", true, variables));
|
|
||||||
actions.add(new Action("DriverOne", "This is a comment", true, variables));
|
|
||||||
actions.add(new Action("DriverTwo", "", true, variables));
|
|
||||||
actions.add(new Action("DriverAlt", "This is also is a comment", true, variables));
|
|
||||||
actions.add(new Action("DriverOne", "This is a comment", true, variables));
|
|
||||||
actions.add(new Action("DriverTwo", "", true, variables));
|
|
||||||
actions.add(new Action("DriverAlt", "This is also is a comment", true, variables));
|
|
||||||
actions.add(new Action("DriverOne", "This is a comment", true, variables));
|
|
||||||
actions.add(new Action("DriverTwo", "", true, variables));
|
|
||||||
actions.add(new Action("DriverAlt", "This is also is a comment", true, variables));
|
|
||||||
|
|
||||||
groups.add(new Group("TeleOp", actions));
|
|
||||||
groups.add(new Group("BlueLeftA", actions));
|
|
||||||
groups.add(new Group("TeleOp", actions));
|
|
||||||
groups.add(new Group("BlueLeftA", actions));
|
|
||||||
groups.add(new Group("TeleOp", actions));
|
|
||||||
groups.add(new Group("BlueLeftA", actions));
|
|
||||||
groups.add(new Group("TeleOp", actions));
|
|
||||||
groups.add(new Group("BlueLeftA", actions));
|
|
||||||
groups.add(new Group("TeleOp", actions));
|
|
||||||
groups.add(new Group("BlueLeftA", actions));
|
|
||||||
groups.add(new Group("TeleOp", actions));
|
|
||||||
groups.add(new Group("BlueLeftA", actions));
|
|
||||||
groups.add(new Group("TeleOp", actions));
|
|
||||||
groups.add(new Group("BlueLeftA", actions));
|
|
||||||
groups.add(new Group("TeleOp", actions));
|
|
||||||
groups.add(new Group("BlueLeftA", actions));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -1,6 +1,63 @@
|
|||||||
package org.timecrafters.TimeCraftersConfigurationTool.dialogs;
|
package org.timecrafters.TimeCraftersConfigurationTool.dialogs;
|
||||||
|
|
||||||
|
import android.os.Bundle;
|
||||||
|
import android.util.Log;
|
||||||
|
import android.view.LayoutInflater;
|
||||||
|
import android.view.View;
|
||||||
|
import android.view.ViewGroup;
|
||||||
|
import android.widget.Button;
|
||||||
|
import android.widget.EditText;
|
||||||
|
import android.widget.LinearLayout;
|
||||||
|
import android.widget.TextView;
|
||||||
|
|
||||||
|
import org.timecrafters.TimeCraftersConfigurationTool.R;
|
||||||
|
import org.timecrafters.TimeCraftersConfigurationTool.backend.Backend;
|
||||||
import org.timecrafters.TimeCraftersConfigurationTool.library.TimeCraftersDialog;
|
import org.timecrafters.TimeCraftersConfigurationTool.library.TimeCraftersDialog;
|
||||||
|
|
||||||
|
import java.util.regex.Pattern;
|
||||||
|
|
||||||
public class ConfigurationDialog extends TimeCraftersDialog {
|
public class ConfigurationDialog extends TimeCraftersDialog {
|
||||||
|
private static final String TAG = "ConfigurationDialog";
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
|
||||||
|
View root = super.onCreateView(inflater, container, savedInstanceState);
|
||||||
|
|
||||||
|
final LinearLayout view = root.findViewById(R.id.dialogContent);
|
||||||
|
view.addView(getLayoutInflater().inflate(R.layout.dialog_configuration, null));
|
||||||
|
|
||||||
|
final TextView title = root.findViewById(R.id.dialogTitle);
|
||||||
|
final EditText name = view.findViewById(R.id.name);
|
||||||
|
final Button cancel = view.findViewById(R.id.cancel);
|
||||||
|
final Button mutate = view.findViewById(R.id.mutate);
|
||||||
|
|
||||||
|
title.setText("Create Configuration");
|
||||||
|
cancel.setOnClickListener(new View.OnClickListener() {
|
||||||
|
@Override
|
||||||
|
public void onClick(View v) {
|
||||||
|
dismiss();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
// mutate.setText(getResources().getString(R.string.dialog_update));
|
||||||
|
mutate.setOnClickListener(new View.OnClickListener() {
|
||||||
|
@Override
|
||||||
|
public void onClick(View v) {
|
||||||
|
String configName = name.getText().toString();
|
||||||
|
|
||||||
|
if (isValid(configName)) {
|
||||||
|
Backend.instance().writeNewConfig(configName);
|
||||||
|
dismiss();
|
||||||
|
} else {
|
||||||
|
Log.d(TAG, "onClick: InValid");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
return root;
|
||||||
|
}
|
||||||
|
|
||||||
|
private boolean isValid(String name) {
|
||||||
|
return name.length() > 0 && name.matches("^[A-Za-z0-9\\._\\-]+$");
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -11,6 +11,7 @@ import android.widget.TextView;
|
|||||||
import androidx.constraintlayout.widget.ConstraintLayout;
|
import androidx.constraintlayout.widget.ConstraintLayout;
|
||||||
|
|
||||||
import org.timecrafters.TimeCraftersConfigurationTool.R;
|
import org.timecrafters.TimeCraftersConfigurationTool.R;
|
||||||
|
import org.timecrafters.TimeCraftersConfigurationTool.backend.Backend;
|
||||||
import org.timecrafters.TimeCraftersConfigurationTool.library.TimeCraftersDialog;
|
import org.timecrafters.TimeCraftersConfigurationTool.library.TimeCraftersDialog;
|
||||||
|
|
||||||
public class ServerDialog extends TimeCraftersDialog {
|
public class ServerDialog extends TimeCraftersDialog {
|
||||||
@@ -31,6 +32,7 @@ public class ServerDialog extends TimeCraftersDialog {
|
|||||||
stopServer.setOnClickListener(new View.OnClickListener() {
|
stopServer.setOnClickListener(new View.OnClickListener() {
|
||||||
@Override
|
@Override
|
||||||
public void onClick(View v) {
|
public void onClick(View v) {
|
||||||
|
// TODO: Halt server
|
||||||
dismiss();
|
dismiss();
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|||||||
@@ -40,7 +40,7 @@ public class ActionsFragment extends TimeCraftersFragment {
|
|||||||
final ScrollView scrollView = root.findViewById(R.id.scrollview);
|
final ScrollView scrollView = root.findViewById(R.id.scrollview);
|
||||||
|
|
||||||
this.config = Backend.instance().getConfig();
|
this.config = Backend.instance().getConfig();
|
||||||
this.group = config.getGroups().get(0);
|
this.group = config.getGroups().get(getArguments().getInt("group_index"));
|
||||||
if (config != null) {
|
if (config != null) {
|
||||||
((AppCompatActivity)getActivity()).getSupportActionBar().setTitle("Group: " + group.name);
|
((AppCompatActivity)getActivity()).getSupportActionBar().setTitle("Group: " + group.name);
|
||||||
|
|
||||||
@@ -90,7 +90,10 @@ public class ActionsFragment extends TimeCraftersFragment {
|
|||||||
edit.setOnClickListener(new View.OnClickListener() {
|
edit.setOnClickListener(new View.OnClickListener() {
|
||||||
@Override
|
@Override
|
||||||
public void onClick(View v) {
|
public void onClick(View v) {
|
||||||
Navigation.findNavController(v).navigate(R.id.variablesFragment);
|
Bundle bundle = new Bundle();
|
||||||
|
bundle.putInt("group_index", getArguments().getInt("group_index"));
|
||||||
|
bundle.putInt("action_index", group.getActions().indexOf(action));
|
||||||
|
Navigation.findNavController(v).navigate(R.id.variablesFragment, bundle);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|||||||
@@ -87,7 +87,9 @@ public class GroupsFragment extends TimeCraftersFragment {
|
|||||||
name.setOnClickListener(new View.OnClickListener() {
|
name.setOnClickListener(new View.OnClickListener() {
|
||||||
@Override
|
@Override
|
||||||
public void onClick(View v) {
|
public void onClick(View v) {
|
||||||
Navigation.findNavController(v).navigate(R.id.actionsFragment);
|
Bundle bundle = new Bundle();
|
||||||
|
bundle.putInt("group_index", config.getGroups().indexOf(group));
|
||||||
|
Navigation.findNavController(v).navigate(R.id.actionsFragment, bundle);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|||||||
@@ -37,8 +37,8 @@ public class VariablesFragment extends TimeCraftersFragment {
|
|||||||
final ScrollView scrollView = root.findViewById(R.id.scrollview);
|
final ScrollView scrollView = root.findViewById(R.id.scrollview);
|
||||||
|
|
||||||
this.config = Backend.instance().getConfig();
|
this.config = Backend.instance().getConfig();
|
||||||
this.group = config.getGroups().get(0);
|
this.group = config.getGroups().get(getArguments().getInt("group_index"));
|
||||||
this.action = group.getActions().get(0);
|
this.action = group.getActions().get(getArguments().getInt("action_index"));
|
||||||
if (config != null) {
|
if (config != null) {
|
||||||
((AppCompatActivity)getActivity()).getSupportActionBar().setTitle("Action: " + action.name);
|
((AppCompatActivity)getActivity()).getSupportActionBar().setTitle("Action: " + action.name);
|
||||||
|
|
||||||
|
|||||||
@@ -4,17 +4,43 @@ import android.os.Bundle;
|
|||||||
import android.view.LayoutInflater;
|
import android.view.LayoutInflater;
|
||||||
import android.view.View;
|
import android.view.View;
|
||||||
import android.view.ViewGroup;
|
import android.view.ViewGroup;
|
||||||
|
import android.widget.Button;
|
||||||
import android.widget.LinearLayout;
|
import android.widget.LinearLayout;
|
||||||
|
import android.widget.ScrollView;
|
||||||
|
|
||||||
import androidx.annotation.NonNull;
|
import androidx.annotation.NonNull;
|
||||||
|
|
||||||
|
import com.google.android.material.floatingactionbutton.FloatingActionButton;
|
||||||
|
|
||||||
import org.timecrafters.TimeCraftersConfigurationTool.R;
|
import org.timecrafters.TimeCraftersConfigurationTool.R;
|
||||||
|
import org.timecrafters.TimeCraftersConfigurationTool.backend.Backend;
|
||||||
|
import org.timecrafters.TimeCraftersConfigurationTool.dialogs.ConfigurationDialog;
|
||||||
import org.timecrafters.TimeCraftersConfigurationTool.library.TimeCraftersFragment;
|
import org.timecrafters.TimeCraftersConfigurationTool.library.TimeCraftersFragment;
|
||||||
|
|
||||||
public class ConfigurationsFragment extends TimeCraftersFragment {
|
public class ConfigurationsFragment extends TimeCraftersFragment {
|
||||||
public View onCreateView(@NonNull LayoutInflater inflater,
|
public View onCreateView(@NonNull LayoutInflater inflater,
|
||||||
ViewGroup container, Bundle savedInstanceState) {
|
ViewGroup container, Bundle savedInstanceState) {
|
||||||
final View root = inflater.inflate(R.layout.fragment_configuration, container, false);
|
final View root = inflater.inflate(R.layout.fragment_configuration, container, false);
|
||||||
|
final ScrollView scrollview = root.findViewById(R.id.scrollview);
|
||||||
|
final LinearLayout configsContainer = root.findViewById(R.id.container);
|
||||||
|
final FloatingActionButton actionButton = root.findViewById(R.id.actionButton);
|
||||||
|
|
||||||
|
floatingActionButtonAutoHide(actionButton, scrollview);
|
||||||
|
actionButton.setOnClickListener(new View.OnClickListener() {
|
||||||
|
@Override
|
||||||
|
public void onClick(View v) {
|
||||||
|
ConfigurationDialog dialog = new ConfigurationDialog();
|
||||||
|
dialog.show(getFragmentManager(), null);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
for (String config : Backend.instance().configsList()) {
|
||||||
|
View view = inflater.inflate(R.layout.fragment_part_configuration, null);
|
||||||
|
Button configName = view.findViewById(R.id.name);
|
||||||
|
configName.setText(config);
|
||||||
|
|
||||||
|
configsContainer.addView(view);
|
||||||
|
}
|
||||||
|
|
||||||
return root;
|
return root;
|
||||||
}
|
}
|
||||||
|
|||||||
43
app/src/main/res/layout/dialog_configuration.xml
Normal file
43
app/src/main/res/layout/dialog_configuration.xml
Normal file
@@ -0,0 +1,43 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
|
xmlns:tools="http://schemas.android.com/tools"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:orientation="vertical">
|
||||||
|
|
||||||
|
<TextView
|
||||||
|
android:id="@+id/textView8"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:gravity="center"
|
||||||
|
android:text="@string/variable_name"
|
||||||
|
android:textColor="@color/dialogLabel" />
|
||||||
|
|
||||||
|
<EditText
|
||||||
|
android:id="@+id/name"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:ems="10"
|
||||||
|
android:hint="@string/variable_name"
|
||||||
|
android:inputType="textPersonName" />
|
||||||
|
|
||||||
|
<LinearLayout
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:layout_marginTop="@dimen/dialog_button_margin">
|
||||||
|
|
||||||
|
<Button
|
||||||
|
android:id="@+id/cancel"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:layout_weight="0.5"
|
||||||
|
android:text="@string/dialog_cancel" />
|
||||||
|
|
||||||
|
<Button
|
||||||
|
android:id="@+id/mutate"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:layout_weight="0.5"
|
||||||
|
android:text="@string/dialog_add" />
|
||||||
|
</LinearLayout>
|
||||||
|
</LinearLayout>
|
||||||
Reference in New Issue
Block a user