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 8d16654..68938d3 100644 --- a/app/src/main/java/org/timecrafters/TimeCraftersConfigurationTool/backend/Backend.java +++ b/app/src/main/java/org/timecrafters/TimeCraftersConfigurationTool/backend/Backend.java @@ -218,7 +218,7 @@ public class Backend { }; File fileList[] = directory.listFiles(filter); for (File file : fileList) { - list.add(file.getName()); + list.add(file.getName().replace(".json", "")); } return list; 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 dcee2c4..bc1f1e1 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,8 @@ package org.timecrafters.TimeCraftersConfigurationTool.dialogs; import android.os.Bundle; +import android.text.Editable; +import android.text.TextWatcher; import android.util.Log; import android.view.LayoutInflater; import android.view.View; @@ -14,11 +16,10 @@ 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"; private String configName; + private TextView nameError; @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { @@ -29,6 +30,7 @@ public class ConfigurationDialog extends TimeCraftersDialog { final TextView title = root.findViewById(R.id.dialogTitle); final EditText name = view.findViewById(R.id.name); + this.nameError = view.findViewById(R.id.name_error); final Button cancel = view.findViewById(R.id.cancel); final Button mutate = view.findViewById(R.id.mutate); @@ -40,6 +42,24 @@ public class ConfigurationDialog extends TimeCraftersDialog { } else { title.setText("Create Configuration"); } + + name.addTextChangedListener(new TextWatcher() { + @Override + public void beforeTextChanged(CharSequence s, int start, int count, int after) { + + } + + @Override + public void onTextChanged(CharSequence s, int start, int before, int count) { + validated(name.getText().toString()); + } + + @Override + public void afterTextChanged(Editable s) { + + } + }); + cancel.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { @@ -52,12 +72,18 @@ public class ConfigurationDialog extends TimeCraftersDialog { public void onClick(View v) { final String newConfigName = name.getText().toString(); - if (isValid(newConfigName)) { + if (newConfigName.equals(configName)) { + dismiss(); + return; + } + + if (validated(newConfigName)) { if (configName != null) { Backend.instance().moveConfig(configName, newConfigName); } else { Backend.instance().writeNewConfig(newConfigName); } + dismiss(); } else { // TODO: Show friendly error message @@ -69,7 +95,25 @@ public class ConfigurationDialog extends TimeCraftersDialog { return root; } - private boolean isValid(String name) { - return name.length() > 0 && name.matches("^[A-Za-z0-9\\._\\-]+$"); + private boolean validated(String name) { + String message = ""; + if (Backend.instance().configsList().contains(name)) { + message += "Name is not unique!"; + + } else if (name.length() <= 0) { + message += "Name cannot be blank!"; + + } else if (!name.matches("^[A-Za-z0-9\\._\\-]+$")) { + message += "Name can only contain alphanumeric characters, dashes, underscores, periods, and no spaces!"; + } + + if (message.length() > 0) { + nameError.setVisibility(View.VISIBLE); + nameError.setText(message); + return false; + } else { + nameError.setVisibility(View.GONE); + return true; + } } } diff --git a/app/src/main/java/org/timecrafters/TimeCraftersConfigurationTool/tacnet/PacketHandler.java b/app/src/main/java/org/timecrafters/TimeCraftersConfigurationTool/tacnet/PacketHandler.java index a0cfe9e..163b210 100755 --- a/app/src/main/java/org/timecrafters/TimeCraftersConfigurationTool/tacnet/PacketHandler.java +++ b/app/src/main/java/org/timecrafters/TimeCraftersConfigurationTool/tacnet/PacketHandler.java @@ -97,7 +97,7 @@ public class PacketHandler { Log.i(TAG, "Got request for config: " + packet.getContent()); Packet pkt; - if (Backend.instance().configsList().contains("" + configName + ".json")) { + if (Backend.instance().configsList().contains(configName)) { final String path = TAC.CONFIGS_PATH + File.separator + configName + ".json"; String content = Backend.instance().readFromFile(path); 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 9a3eb32..8141527 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 @@ -54,7 +54,6 @@ public class ConfigurationsFragment extends TimeCraftersFragment { int i = 0; for (final String configFile : Backend.instance().configsList()) { - final String config = configFile.replace(".json", ""); View view = inflater.inflate(R.layout.fragment_part_configuration, null); if (i % 2 == 0) { // even @@ -66,20 +65,20 @@ public class ConfigurationsFragment extends TimeCraftersFragment { final Button configName = view.findViewById(R.id.name); final ImageButton rename = view.findViewById(R.id.rename); final ImageButton delete = view.findViewById(R.id.delete); - configName.setText(config); + configName.setText(configFile); configName.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { - if (Backend.instance().getSettings().config.equals(config)) { + if (Backend.instance().getSettings().config.equals(configFile)) { return; } - Backend.instance().getSettings().config = config; - Backend.instance().loadConfig(config); + Backend.instance().getSettings().config = configFile; + Backend.instance().loadConfig(configFile); Backend.instance().saveSettings(); View snackbarHost = getActivity().findViewById(R.id.snackbar_host); - Snackbar.make(snackbarHost, "Loaded config: " + config, Snackbar.LENGTH_LONG).show(); + Snackbar.make(snackbarHost, "Loaded config: " + configFile, Snackbar.LENGTH_LONG).show(); } }); @@ -88,7 +87,7 @@ public class ConfigurationsFragment extends TimeCraftersFragment { public void onClick(View v) { ConfigurationDialog dialog = new ConfigurationDialog(); Bundle bundle = new Bundle(); - bundle.putString("config_name", config); + bundle.putString("config_name", configFile); dialog.setArguments(bundle); dialog.show(getFragmentManager(), null); } @@ -101,13 +100,13 @@ public class ConfigurationsFragment extends TimeCraftersFragment { Bundle bundle = new Bundle(); final String actionKey = "delete_configuration"; bundle.putString("title", "Are you sure?"); - bundle.putString("message", "Destroy configuration " + config + "?"); + bundle.putString("message", "Destroy configuration " + configFile + "?"); bundle.putString("action", actionKey); bundle.putBoolean("extreme_danger", true); Runnable action = new Runnable() { @Override public void run() { - Backend.instance().deleteConfig(config); + Backend.instance().deleteConfig(configFile); } } ; Backend.getStorage().put(actionKey, action); diff --git a/app/src/main/res/layout/dialog_configuration.xml b/app/src/main/res/layout/dialog_configuration.xml index ac76405..e78fcc5 100644 --- a/app/src/main/res/layout/dialog_configuration.xml +++ b/app/src/main/res/layout/dialog_configuration.xml @@ -21,6 +21,15 @@ android:hint="@string/variable_name" android:inputType="textPersonName" /> + +