More implementation work

This commit is contained in:
2020-08-22 08:25:08 -05:00
parent ee6372a4f5
commit 39c30d4096
9 changed files with 189 additions and 47 deletions

View File

@@ -6,6 +6,9 @@ import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
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.SettingsSerializer;
@@ -15,6 +18,7 @@ import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.FilenameFilter;
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
@@ -100,7 +104,52 @@ public class Backend {
}
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() {

View File

@@ -17,52 +17,12 @@ public class Config {
private ArrayList<Group> groups;
private ArrayList<Preset> presets;
// DELETE ME
// TODO: DELETE ME
public Config() {
this.name = "DEBUG ONLY";
this.configuration = new Configuration(new Date(), new Date(), 0, 32);
groups = 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));
}

View File

@@ -1,6 +1,63 @@
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 java.util.regex.Pattern;
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\\._\\-]+$");
}
}

View File

@@ -11,6 +11,7 @@ import android.widget.TextView;
import androidx.constraintlayout.widget.ConstraintLayout;
import org.timecrafters.TimeCraftersConfigurationTool.R;
import org.timecrafters.TimeCraftersConfigurationTool.backend.Backend;
import org.timecrafters.TimeCraftersConfigurationTool.library.TimeCraftersDialog;
public class ServerDialog extends TimeCraftersDialog {
@@ -31,6 +32,7 @@ public class ServerDialog extends TimeCraftersDialog {
stopServer.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
// TODO: Halt server
dismiss();
}
});

View File

@@ -40,7 +40,7 @@ public class ActionsFragment extends TimeCraftersFragment {
final ScrollView scrollView = root.findViewById(R.id.scrollview);
this.config = Backend.instance().getConfig();
this.group = config.getGroups().get(0);
this.group = config.getGroups().get(getArguments().getInt("group_index"));
if (config != null) {
((AppCompatActivity)getActivity()).getSupportActionBar().setTitle("Group: " + group.name);
@@ -90,7 +90,10 @@ public class ActionsFragment extends TimeCraftersFragment {
edit.setOnClickListener(new View.OnClickListener() {
@Override
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);
}
});

View File

@@ -87,7 +87,9 @@ public class GroupsFragment extends TimeCraftersFragment {
name.setOnClickListener(new View.OnClickListener() {
@Override
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);
}
});

View File

@@ -37,8 +37,8 @@ public class VariablesFragment extends TimeCraftersFragment {
final ScrollView scrollView = root.findViewById(R.id.scrollview);
this.config = Backend.instance().getConfig();
this.group = config.getGroups().get(0);
this.action = group.getActions().get(0);
this.group = config.getGroups().get(getArguments().getInt("group_index"));
this.action = group.getActions().get(getArguments().getInt("action_index"));
if (config != null) {
((AppCompatActivity)getActivity()).getSupportActionBar().setTitle("Action: " + action.name);

View File

@@ -4,17 +4,43 @@ import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Button;
import android.widget.LinearLayout;
import android.widget.ScrollView;
import androidx.annotation.NonNull;
import com.google.android.material.floatingactionbutton.FloatingActionButton;
import org.timecrafters.TimeCraftersConfigurationTool.R;
import org.timecrafters.TimeCraftersConfigurationTool.backend.Backend;
import org.timecrafters.TimeCraftersConfigurationTool.dialogs.ConfigurationDialog;
import org.timecrafters.TimeCraftersConfigurationTool.library.TimeCraftersFragment;
public class ConfigurationsFragment extends TimeCraftersFragment {
public View onCreateView(@NonNull LayoutInflater inflater,
ViewGroup container, Bundle savedInstanceState) {
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;
}

View 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>