From 39c30d4096d6ed5accf79fcd99503f8d88402413 Mon Sep 17 00:00:00 2001 From: Cyberarm Date: Sat, 22 Aug 2020 08:25:08 -0500 Subject: [PATCH] More implementation work --- .../backend/Backend.java | 51 ++++++++++++++++- .../backend/Config.java | 42 +------------- .../dialogs/ConfigurationDialog.java | 57 +++++++++++++++++++ .../dialogs/ServerDialog.java | 2 + .../ui/editor/ActionsFragment.java | 7 ++- .../ui/editor/GroupsFragment.java | 4 +- .../ui/editor/VariablesFragment.java | 4 +- .../ConfigurationsFragment.java | 26 +++++++++ .../main/res/layout/dialog_configuration.xml | 43 ++++++++++++++ 9 files changed, 189 insertions(+), 47 deletions(-) create mode 100644 app/src/main/res/layout/dialog_configuration.xml diff --git a/app/src/main/java/org/timecrafters/TimeCraftersConfigurationTool/backend/Backend.java b/app/src/main/java/org/timecrafters/TimeCraftersConfigurationTool/backend/Backend.java index cdccf8f..449f5c8 100644 --- a/app/src/main/java/org/timecrafters/TimeCraftersConfigurationTool/backend/Backend.java +++ b/app/src/main/java/org/timecrafters/TimeCraftersConfigurationTool/backend/Backend.java @@ -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 groups = new ArrayList<>(); + ArrayList 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 configsList() { + ArrayList 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() { diff --git a/app/src/main/java/org/timecrafters/TimeCraftersConfigurationTool/backend/Config.java b/app/src/main/java/org/timecrafters/TimeCraftersConfigurationTool/backend/Config.java index eb60ef8..5fabe53 100644 --- a/app/src/main/java/org/timecrafters/TimeCraftersConfigurationTool/backend/Config.java +++ b/app/src/main/java/org/timecrafters/TimeCraftersConfigurationTool/backend/Config.java @@ -17,52 +17,12 @@ public class Config { private ArrayList groups; private ArrayList 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 actions = new ArrayList<>(); - ArrayList 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)); } diff --git a/app/src/main/java/org/timecrafters/TimeCraftersConfigurationTool/dialogs/ConfigurationDialog.java b/app/src/main/java/org/timecrafters/TimeCraftersConfigurationTool/dialogs/ConfigurationDialog.java index f9e0e1a..8da833a 100644 --- a/app/src/main/java/org/timecrafters/TimeCraftersConfigurationTool/dialogs/ConfigurationDialog.java +++ b/app/src/main/java/org/timecrafters/TimeCraftersConfigurationTool/dialogs/ConfigurationDialog.java @@ -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\\._\\-]+$"); + } } diff --git a/app/src/main/java/org/timecrafters/TimeCraftersConfigurationTool/dialogs/ServerDialog.java b/app/src/main/java/org/timecrafters/TimeCraftersConfigurationTool/dialogs/ServerDialog.java index 1b75fc4..48975f8 100644 --- a/app/src/main/java/org/timecrafters/TimeCraftersConfigurationTool/dialogs/ServerDialog.java +++ b/app/src/main/java/org/timecrafters/TimeCraftersConfigurationTool/dialogs/ServerDialog.java @@ -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(); } }); diff --git a/app/src/main/java/org/timecrafters/TimeCraftersConfigurationTool/ui/editor/ActionsFragment.java b/app/src/main/java/org/timecrafters/TimeCraftersConfigurationTool/ui/editor/ActionsFragment.java index 2e74000..af4240b 100644 --- a/app/src/main/java/org/timecrafters/TimeCraftersConfigurationTool/ui/editor/ActionsFragment.java +++ b/app/src/main/java/org/timecrafters/TimeCraftersConfigurationTool/ui/editor/ActionsFragment.java @@ -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); } }); diff --git a/app/src/main/java/org/timecrafters/TimeCraftersConfigurationTool/ui/editor/GroupsFragment.java b/app/src/main/java/org/timecrafters/TimeCraftersConfigurationTool/ui/editor/GroupsFragment.java index 7294e30..700e90a 100644 --- a/app/src/main/java/org/timecrafters/TimeCraftersConfigurationTool/ui/editor/GroupsFragment.java +++ b/app/src/main/java/org/timecrafters/TimeCraftersConfigurationTool/ui/editor/GroupsFragment.java @@ -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); } }); diff --git a/app/src/main/java/org/timecrafters/TimeCraftersConfigurationTool/ui/editor/VariablesFragment.java b/app/src/main/java/org/timecrafters/TimeCraftersConfigurationTool/ui/editor/VariablesFragment.java index 50d19ab..120a801 100644 --- a/app/src/main/java/org/timecrafters/TimeCraftersConfigurationTool/ui/editor/VariablesFragment.java +++ b/app/src/main/java/org/timecrafters/TimeCraftersConfigurationTool/ui/editor/VariablesFragment.java @@ -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); diff --git a/app/src/main/java/org/timecrafters/TimeCraftersConfigurationTool/ui/settings/configurations/ConfigurationsFragment.java b/app/src/main/java/org/timecrafters/TimeCraftersConfigurationTool/ui/settings/configurations/ConfigurationsFragment.java index e7c078d..af065df 100644 --- a/app/src/main/java/org/timecrafters/TimeCraftersConfigurationTool/ui/settings/configurations/ConfigurationsFragment.java +++ b/app/src/main/java/org/timecrafters/TimeCraftersConfigurationTool/ui/settings/configurations/ConfigurationsFragment.java @@ -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; } diff --git a/app/src/main/res/layout/dialog_configuration.xml b/app/src/main/res/layout/dialog_configuration.xml new file mode 100644 index 0000000..ac76405 --- /dev/null +++ b/app/src/main/res/layout/dialog_configuration.xml @@ -0,0 +1,43 @@ + + + + + + + + + +