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" />
+
+