Refactored Config inner classes into their own classes, added a dialogs for Groups, Actions, Server, and confirmations

This commit is contained in:
2020-08-21 12:12:19 -05:00
parent 8fd48d4d8d
commit ee6372a4f5
42 changed files with 1020 additions and 284 deletions

View File

@@ -2,8 +2,6 @@ package org.timecrafters.TimeCraftersConfigurationTool;
import android.Manifest;
import android.os.Bundle;
import android.util.Log;
import android.widget.Toast;
import com.google.android.material.bottomnavigation.BottomNavigationView;
@@ -16,7 +14,6 @@ import androidx.navigation.ui.AppBarConfiguration;
import androidx.navigation.ui.NavigationUI;
import org.timecrafters.TimeCraftersConfigurationTool.backend.Backend;
import org.timecrafters.TimeCraftersConfigurationTool.dialogs.Dialog;
import org.timecrafters.TimeCraftersConfigurationTool.dialogs.PermissionsRequestDialog;
import static android.content.pm.PackageManager.PERMISSION_GRANTED;

View File

@@ -2,9 +2,12 @@ package org.timecrafters.TimeCraftersConfigurationTool.backend;
import com.google.gson.Gson;
import java.io.Reader;
import java.nio.file.Files;
import java.nio.file.Paths;
import org.timecrafters.TimeCraftersConfigurationTool.backend.config.Configuration;
import org.timecrafters.TimeCraftersConfigurationTool.backend.config.Group;
import org.timecrafters.TimeCraftersConfigurationTool.backend.config.Action;
import org.timecrafters.TimeCraftersConfigurationTool.backend.config.Variable;
import org.timecrafters.TimeCraftersConfigurationTool.backend.config.Preset;
import java.util.ArrayList;
import java.util.Date;
@@ -24,11 +27,12 @@ public class Config {
ArrayList<Action> actions = new ArrayList<>();
ArrayList<Variable> variables = new ArrayList<>();
variables.add(new Variable("VarName", "Dx90.45"));
variables.add(new Variable("VarName2", "FxFx90.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));
@@ -96,129 +100,4 @@ public class Config {
this.groups = config.groups;
this.presets = config.presets;
}
public class Configuration {
public Date createdAt, updatedAt;
private int specVersion;
public int revision;
public Configuration(Date createdAt, Date updatedAt, int specVersion, int revision) {
this.createdAt = createdAt;
this.updatedAt = updatedAt;
this.specVersion = specVersion;
this.revision = revision;
}
public int getSpecVersion() { return specVersion; }
}
public class Preset {
private ArrayList<Group> groups;
private ArrayList<Action> actions;
public Preset(ArrayList<Group> groups, ArrayList<Action> actions) {
this.groups = groups;
this.actions = actions;
}
}
public class Group {
public String name;
private ArrayList<Action> actions;
public Group(String name, ArrayList<Action> actions) {
this.name = name;
this.actions = actions;
}
public ArrayList<Action> getActions() {
return actions;
}
}
public class Action {
public String name, comment;
public boolean enabled;
private ArrayList<Variable> variables;
public Action(String name, String comment, boolean enabled, ArrayList<Variable> variables) {
this.name = name;
this.comment = comment;
this.enabled = enabled;
this.variables = variables;
}
public ArrayList<Variable> getVariables() { return variables; }
}
public class Variable {
public String name;
private String value;
public Variable(String name, String value) {
this.name = name;
this.value = value;
}
public <T> T value() {
return valueOf();
}
@SuppressWarnings("unchecked")
public <T> T valueOf() {
String[] split = value.split("x");
switch (split[0]) {
case "B": {
return (T) Boolean.valueOf(split[(split.length-1)]);
}
case "D": {
return (T) Double.valueOf(split[(split.length-1)]);
}
case "F": {
return (T) Float.valueOf(split[(split.length-1)]);
}
case "I": {
return (T) Integer.valueOf(split[(split.length-1)]);
}
case "L": {
return (T) Long.valueOf(split[(split.length-1)]);
}
case "S": {
return (T) String.valueOf(split[(split.length-1)]);
}
default: {
return null;
}
}
}
public String typeOf(String value) {
String[] split = value.split("x");
switch (split[0]) {
case "B": {
return "Boolean";
}
case "D": {
return "Double";
}
case "F": {
return "Float";
}
case "I": {
return "Integer";
}
case "L": {
return "Long";
}
case "S": {
return "String";
}
default: {
return "=!UNKNOWN!=";
}
}
}
}
}

View File

@@ -0,0 +1,18 @@
package org.timecrafters.TimeCraftersConfigurationTool.backend.config;
import java.util.ArrayList;
public class Action {
public String name, comment;
public boolean enabled;
private ArrayList<Variable> variables;
public Action(String name, String comment, boolean enabled, ArrayList<Variable> variables) {
this.name = name;
this.comment = comment;
this.enabled = enabled;
this.variables = variables;
}
public ArrayList<Variable> getVariables() { return variables; }
}

View File

@@ -0,0 +1,18 @@
package org.timecrafters.TimeCraftersConfigurationTool.backend.config;
import java.util.Date;
public class Configuration {
public Date createdAt, updatedAt;
private int specVersion;
public int revision;
public Configuration(Date createdAt, Date updatedAt, int specVersion, int revision) {
this.createdAt = createdAt;
this.updatedAt = updatedAt;
this.specVersion = specVersion;
this.revision = revision;
}
public int getSpecVersion() { return specVersion; }
}

View File

@@ -0,0 +1,17 @@
package org.timecrafters.TimeCraftersConfigurationTool.backend.config;
import java.util.ArrayList;
public class Group {
public String name;
private ArrayList<Action> actions;
public Group(String name, ArrayList<Action> actions) {
this.name = name;
this.actions = actions;
}
public ArrayList<Action> getActions() {
return actions;
}
}

View File

@@ -0,0 +1,14 @@
package org.timecrafters.TimeCraftersConfigurationTool.backend.config;
import java.util.ArrayList;
public class Preset {
private ArrayList<Group> groups;
private ArrayList<Action> actions;
public Preset(ArrayList<Group> groups, ArrayList<Action> actions) {
this.groups = groups;
this.actions = actions;
}
}

View File

@@ -0,0 +1,92 @@
package org.timecrafters.TimeCraftersConfigurationTool.backend.config;
import android.util.Log;
import java.util.Arrays;
public class Variable {
public String name;
private String value;
public Variable(String name, String value) {
this.name = name;
this.value = value;
}
public String rawValue() {
return value;
}
public <T> T value() {
return valueOf(value);
}
public void setValue(String value) {
this.value = value;
}
@SuppressWarnings("unchecked")
static public <T> T valueOf(String value) {
String[] split = value.split("x", 2);
// Log.d("Variable", "valueOf split: " + Arrays.toString(split));
switch (split[0]) {
case "B": {
return (T) Boolean.valueOf(split[(split.length-1)]);
}
case "D": {
return (T) Double.valueOf(split[(split.length-1)]);
}
case "F": {
return (T) Float.valueOf(split[(split.length-1)]);
}
case "I": {
return (T) Integer.valueOf(split[(split.length-1)]);
}
case "L": {
return (T) Long.valueOf(split[(split.length-1)]);
}
case "S": {
String string = "";
int i = 0;
for(String str : split) {
if (i == 0) { i++; continue; }
string += str;
}
return (T) string;
}
default: {
return null;
}
}
}
static public String typeOf(String value) {
String[] split = value.split("x");
switch (split[0]) {
case "B": {
return "Boolean";
}
case "D": {
return "Double";
}
case "F": {
return "Float";
}
case "I": {
return "Integer";
}
case "L": {
return "Long";
}
case "S": {
return "String";
}
default: {
return "=!UNKNOWN!=";
}
}
}
}

View File

@@ -0,0 +1,99 @@
package org.timecrafters.TimeCraftersConfigurationTool.dialogs;
import android.os.Bundle;
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.Switch;
import android.widget.TextView;
import org.timecrafters.TimeCraftersConfigurationTool.R;
import org.timecrafters.TimeCraftersConfigurationTool.backend.Backend;
import org.timecrafters.TimeCraftersConfigurationTool.backend.config.Action;
import org.timecrafters.TimeCraftersConfigurationTool.backend.config.Group;
import org.timecrafters.TimeCraftersConfigurationTool.backend.config.Variable;
import org.timecrafters.TimeCraftersConfigurationTool.library.TimeCraftersDialog;
import java.util.ArrayList;
public class ActionDialog extends TimeCraftersDialog {
final String TAG = "ActionDialog";
private TextView commentTextView;
private Switch nameSwitch;
private Group group;
private Action action;
public ActionDialog() {}
public ActionDialog(Group group) {
this.group = group;
}
public ActionDialog(Action action, Switch nameSwitch, TextView commentTextView) {
this.action = action;
this.nameSwitch = nameSwitch;
this.commentTextView = commentTextView;
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
setCancelable(false);
View root = super.onCreateView(inflater, container, savedInstanceState);
final TextView title = root.findViewById(R.id.dialogTitle);
final LinearLayout view = root.findViewById(R.id.dialogContent);
view.addView(getLayoutInflater().inflate(R.layout.dialog_edit_action, null));
final EditText name = view.findViewById(R.id.name);
final EditText comment = view.findViewById(R.id.comment);
final Button cancel = view.findViewById(R.id.cancel);
final Button mutate = view.findViewById(R.id.mutate);
cancel.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
dismiss();
}
});
if (action != null) {
title.setText("Editing " + action.name);
name.setText(action.name);
comment.setText(action.comment);
mutate.setText("Update");
} else {
title.setText("Add Action");
}
mutate.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (action != null) {
action.name = name.getText().toString();
nameSwitch.setText(name.getText().toString());
commentTextView.setText(comment.getText().toString());
if (comment.getText().toString().length() > 0) {
commentTextView.setVisibility(View.VISIBLE);
} else {
commentTextView.setVisibility(View.GONE);
}
} else {
Action action = new Action(name.getText().toString(), comment.getText().toString(), true, new ArrayList<Variable>());
group.getActions().add(action);
}
Backend.instance().configChanged();
dismiss();
}
});
return root;
}
}

View File

@@ -0,0 +1,6 @@
package org.timecrafters.TimeCraftersConfigurationTool.dialogs;
import org.timecrafters.TimeCraftersConfigurationTool.library.TimeCraftersDialog;
public class ConfigurationDialog extends TimeCraftersDialog {
}

View File

@@ -0,0 +1,53 @@
package org.timecrafters.TimeCraftersConfigurationTool.dialogs;
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.TextView;
import androidx.constraintlayout.widget.ConstraintLayout;
import org.timecrafters.TimeCraftersConfigurationTool.R;
import org.timecrafters.TimeCraftersConfigurationTool.library.TimeCraftersDialog;
public class ConfirmationDialog extends TimeCraftersDialog {
private String title, message;
private Runnable action;
public ConfirmationDialog() {}
public ConfirmationDialog(String title, String message, Runnable action) {
this.title = title;
this.message = message;
this.action = action;
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View root = super.onCreateView(inflater, container, savedInstanceState);
final TextView title = root.findViewById(R.id.dialogTitle);
final ConstraintLayout titlebar = root.findViewById(R.id.titlebar);
final LinearLayout view = root.findViewById(R.id.dialogContent);
view.addView(getLayoutInflater().inflate(R.layout.dialog_confirmation, null));
final TextView messageView = root.findViewById(R.id.message);
final Button cancel = root.findViewById(R.id.cancel);
final Button confirm = root.findViewById(R.id.confirm);
titlebar.setBackgroundColor(getResources().getColor(R.color.dialogAlert));
title.setText(this.title);
messageView.setText(message);
confirm.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
dismiss();
}
});
return root;
}
}

View File

@@ -0,0 +1,76 @@
package org.timecrafters.TimeCraftersConfigurationTool.dialogs;
import android.os.Bundle;
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.backend.config.Action;
import org.timecrafters.TimeCraftersConfigurationTool.backend.config.Group;
import org.timecrafters.TimeCraftersConfigurationTool.library.TimeCraftersDialog;
import java.util.ArrayList;
public class GroupDialog extends TimeCraftersDialog {
final String TAG = "GroupDialog";
private Group group;
public GroupDialog() {}
public GroupDialog(Group group) {
this.group = group;
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
setCancelable(false);
View root = super.onCreateView(inflater, container, savedInstanceState);
final TextView title = root.findViewById(R.id.dialogTitle);
final LinearLayout view = root.findViewById(R.id.dialogContent);
view.addView(getLayoutInflater().inflate(R.layout.dialog_edit_group, null));
final EditText name = view.findViewById(R.id.name);
final Button cancel = view.findViewById(R.id.cancel);
final Button mutate = view.findViewById(R.id.mutate);
cancel.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
dismiss();
}
});
if (group != null) {
title.setText("Editing " + group.name);
name.setText(group.name);
mutate.setText(getResources().getString(R.string.dialog_update));
} else {
title.setText("Add Group");
}
mutate.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (group != null) {
group.name = name.getText().toString();
} else {
Group group = new Group(name.getText().toString(), new ArrayList<Action>());
Backend.instance().getConfig().getGroups().add(group);
}
Backend.instance().configChanged();
dismiss();
}
});
return root;
}
}

View File

@@ -1,6 +1,5 @@
package org.timecrafters.TimeCraftersConfigurationTool.dialogs;
import android.content.Context;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
@@ -9,22 +8,20 @@ import android.widget.Button;
import android.widget.LinearLayout;
import android.widget.TextView;
import androidx.annotation.NonNull;
import org.timecrafters.TimeCraftersConfigurationTool.MainActivity;
import org.timecrafters.TimeCraftersConfigurationTool.R;
import org.timecrafters.TimeCraftersConfigurationTool.backend.Backend;
import org.timecrafters.TimeCraftersConfigurationTool.backend.TAC;
import org.timecrafters.TimeCraftersConfigurationTool.library.TimeCraftersDialog;
public class PermissionsRequestDialog extends Dialog {
public class PermissionsRequestDialog extends TimeCraftersDialog {
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
setCancelable(false);
View v = super.onCreateView(inflater, container, savedInstanceState);
View root = super.onCreateView(inflater, container, savedInstanceState);
((TextView)v.findViewById(R.id.dialogTitle)).setText("Storage Permission Required");
LinearLayout view = v.findViewById(R.id.dialogContent);
((TextView)root.findViewById(R.id.dialogTitle)).setText("Storage Permission Required");
LinearLayout view = root.findViewById(R.id.dialogContent);
view.addView(getLayoutInflater().inflate(R.layout.dialog_permission_request, null));
((TextView)view.findViewById(R.id.message)).setText("Permission is required to write to external storage:\n\n" + TAC.ROOT_PATH);
@@ -48,6 +45,6 @@ public class PermissionsRequestDialog extends Dialog {
});
return v;
return root;
}
}

View File

@@ -0,0 +1,40 @@
package org.timecrafters.TimeCraftersConfigurationTool.dialogs;
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.TextView;
import androidx.constraintlayout.widget.ConstraintLayout;
import org.timecrafters.TimeCraftersConfigurationTool.R;
import org.timecrafters.TimeCraftersConfigurationTool.library.TimeCraftersDialog;
public class ServerDialog extends TimeCraftersDialog {
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
setCancelable(false);
View root = super.onCreateView(inflater, container, savedInstanceState);
final TextView title = root.findViewById(R.id.dialogTitle);
final ConstraintLayout titlebar = root.findViewById(R.id.titlebar);
final LinearLayout view = root.findViewById(R.id.dialogContent);
view.addView(getLayoutInflater().inflate(R.layout.dialog_server, null));
title.setText(getResources().getString(R.string.tacnet_server_status));
final Button stopServer = root.findViewById(R.id.stop_server);
stopServer.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
dismiss();
}
});
return root;
}
}

View File

@@ -11,6 +11,7 @@ import android.view.MenuItem;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Button;
import android.widget.CompoundButton;
import android.widget.EditText;
import android.widget.LinearLayout;
import android.widget.PopupMenu;
@@ -18,22 +19,44 @@ import android.widget.Switch;
import android.widget.TextView;
import org.timecrafters.TimeCraftersConfigurationTool.R;
import org.timecrafters.TimeCraftersConfigurationTool.backend.Backend;
import org.timecrafters.TimeCraftersConfigurationTool.backend.config.Action;
import org.timecrafters.TimeCraftersConfigurationTool.backend.config.Variable;
import org.timecrafters.TimeCraftersConfigurationTool.library.TimeCraftersDialog;
public class VariableDialog extends Dialog {
public class VariableDialog extends TimeCraftersDialog {
final String TAG = "VariableDialog";
private Action action;
private Variable variable;
private TextView nameTextView, valueTextView;
Button variableType;
EditText variableValue;
EditText variableName, variableValue;
Switch variableValueBoolean;
public VariableDialog() {
}
public VariableDialog(Action action) {
this.action = action;
}
public VariableDialog(Variable variable, TextView nameTextView, TextView valueTextView) {
this.variable = variable;
this.nameTextView = nameTextView;
this.valueTextView = valueTextView;
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
setCancelable(false);
View v = super.onCreateView(inflater, container, savedInstanceState);
View root = super.onCreateView(inflater, container, savedInstanceState);
((TextView)v.findViewById(R.id.dialogTitle)).setText("Add Variable");
LinearLayout view = v.findViewById(R.id.dialogContent);
final TextView title = root.findViewById(R.id.dialogTitle);
LinearLayout view = root.findViewById(R.id.dialogContent);
view.addView(getLayoutInflater().inflate(R.layout.dialog_edit_variable, null));
variableName = view.findViewById(R.id.variableName);
variableType = view.findViewById(R.id.variableType);
variableType.setOnClickListener(new View.OnClickListener() {
@Override
@@ -48,10 +71,8 @@ public class VariableDialog extends Dialog {
}
});
variableValue = v.findViewById(R.id.variableValue);
variableValueBoolean = v.findViewById(R.id.variableValueBoolean);
setVariableType("Double");
variableValue = root.findViewById(R.id.variableValue);
variableValueBoolean = root.findViewById(R.id.variableValueBoolean);
Button cancelButton = view.findViewById(R.id.cancel);
Button mutateButton = view.findViewById(R.id.mutate);
@@ -62,14 +83,62 @@ public class VariableDialog extends Dialog {
}
});
if (variable != null) {
title.setText("Editing " + variable.name);
mutateButton.setText(getResources().getString(R.string.dialog_update));
variableName.setText(variable.name);
setVariableType(Variable.typeOf(variable.rawValue()));
if (variableType.getText().toString().toLowerCase().equals("boolean")) {
variableValueBoolean.setChecked((boolean)variable.value());
} else {
variableValue.setText(variable.value().toString());
}
} else {
title.setText("Add Variable");
setVariableType("Double");
}
styleSwitch(variableValueBoolean, variableValueBoolean.isChecked());
variableValueBoolean.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
@Override
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
styleSwitch(buttonView, isChecked);
}
});
mutateButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
String value = "" + variableType.getText().toString().substring(0, 1) + "x";
if (variableType.getText().toString().substring(0, 1).equals("B")) {
if (variableValueBoolean.isChecked()) {
value += "true";
} else {
value += "false";
}
} else {
value += variableValue.getText().toString();
}
if (variable != null) {
variable.name = variableName.getText().toString();
Log.d(TAG, "Value: " + value);
variable.setValue(value);
nameTextView.setText(variable.name);
valueTextView.setText(variable.value().toString());
} else {
Variable variable = new Variable(variableName.getText().toString(), value);
action.getVariables().add(variable);
}
Backend.instance().configChanged();
dismiss();
}
});
return v;
return root;
}
private void showVariableTypeMenu() {

View File

@@ -1,4 +1,4 @@
package org.timecrafters.TimeCraftersConfigurationTool.dialogs;
package org.timecrafters.TimeCraftersConfigurationTool.library;
import android.graphics.Point;
import android.os.Bundle;
@@ -6,6 +6,7 @@ import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.view.Window;
import android.widget.CompoundButton;
import android.widget.ImageButton;
import androidx.annotation.Nullable;
@@ -13,7 +14,7 @@ import androidx.fragment.app.DialogFragment;
import org.timecrafters.TimeCraftersConfigurationTool.R;
public class Dialog extends DialogFragment {
public class TimeCraftersDialog extends DialogFragment {
@Override
public void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
@@ -49,4 +50,12 @@ public class Dialog extends DialogFragment {
getActivity().getWindowManager().getDefaultDisplay().getSize(point);
getDialog().getWindow().setLayout((int) (point.x * 0.8), ViewGroup.LayoutParams.WRAP_CONTENT);
}
public void styleSwitch(CompoundButton buttonView, boolean isChecked) {
if (isChecked) {
buttonView.setBackground(getResources().getDrawable(R.drawable.button));
} else {
buttonView.setBackground(getResources().getDrawable(R.drawable.dangerous_button));
}
}
}

View File

@@ -0,0 +1,38 @@
package org.timecrafters.TimeCraftersConfigurationTool.library;
import android.os.Build;
import android.view.View;
import android.widget.CompoundButton;
import android.widget.ScrollView;
import com.google.android.material.floatingactionbutton.FloatingActionButton;
import org.timecrafters.TimeCraftersConfigurationTool.R;
public class TimeCraftersFragment extends androidx.fragment.app.Fragment {
public void floatingActionButtonAutoHide(final FloatingActionButton button, final ScrollView view) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { // API Level 23 (Android 6)
view.setOnScrollChangeListener(new View.OnScrollChangeListener() {
@Override
public void onScrollChange(View v, int scrollX, int scrollY, int oldScrollX, int oldScrollY) {
final int dy = scrollY - oldScrollY;
if (dy > 0 && button.getVisibility() == View.VISIBLE) {
button.hide();
} else if (dy < 0 && button.getVisibility() == View.GONE) {
button.show();
} else if (!view.canScrollVertically(1)) {
button.show();
}
}
});
}
}
public void styleSwitch(CompoundButton buttonView, boolean isChecked) {
if (isChecked) {
buttonView.setBackground(getResources().getDrawable(R.drawable.button));
} else {
buttonView.setBackground(getResources().getDrawable(R.drawable.dangerous_button));
}
}
}

View File

@@ -4,26 +4,31 @@ import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Button;
import android.widget.CompoundButton;
import android.widget.ImageButton;
import android.widget.LinearLayout;
import android.widget.ScrollView;
import android.widget.Switch;
import android.widget.TextView;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.appcompat.app.AppCompatActivity;
import androidx.fragment.app.Fragment;
import androidx.navigation.Navigation;
import com.google.android.material.floatingactionbutton.FloatingActionButton;
import org.timecrafters.TimeCraftersConfigurationTool.R;
import org.timecrafters.TimeCraftersConfigurationTool.backend.Backend;
import org.timecrafters.TimeCraftersConfigurationTool.backend.Config;
import org.timecrafters.TimeCraftersConfigurationTool.backend.config.Action;
import org.timecrafters.TimeCraftersConfigurationTool.backend.config.Group;
import org.timecrafters.TimeCraftersConfigurationTool.dialogs.ActionDialog;
import org.timecrafters.TimeCraftersConfigurationTool.library.TimeCraftersFragment;
public class ActionsFragment extends Fragment {
public class ActionsFragment extends TimeCraftersFragment {
private Config config;
private Config.Group group;
private Group group;
private LinearLayout container;
@Nullable
@@ -31,6 +36,8 @@ public class ActionsFragment extends Fragment {
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
final View root = inflater.inflate(R.layout.fragment_actions, container, false);
this.container = root.findViewById(R.id.container);
final FloatingActionButton actionButton = root.findViewById(R.id.actionButton);
final ScrollView scrollView = root.findViewById(R.id.scrollview);
this.config = Backend.instance().getConfig();
this.group = config.getGroups().get(0);
@@ -39,18 +46,28 @@ public class ActionsFragment extends Fragment {
populateActions();
}
floatingActionButtonAutoHide(actionButton, scrollView);
actionButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
ActionDialog dialog = new ActionDialog(group);
dialog.show(getFragmentManager(), null);
}
});
return root;
}
private void populateActions() {
int i = 0;
for (final Config.Action action : group.getActions()) {
View view = View.inflate(getContext(), R.layout.fragment_part_actions, null);
Switch name = view.findViewById(R.id.name);
ImageButton edit = view.findViewById(R.id.edit);
ImageButton rename = view.findViewById(R.id.rename);
ImageButton delete = view.findViewById(R.id.delete);
TextView comment = view.findViewById(R.id.comment);
for (final Action action : group.getActions()) {
final View view = View.inflate(getContext(), R.layout.fragment_part_actions, null);
final Switch name = view.findViewById(R.id.name);
final ImageButton edit = view.findViewById(R.id.edit);
final ImageButton rename = view.findViewById(R.id.rename);
final ImageButton delete = view.findViewById(R.id.delete);
final TextView comment = view.findViewById(R.id.comment);
if (i % 2 == 0) { // even
view.setBackgroundColor(getResources().getColor(R.color.list_even));
@@ -83,16 +100,16 @@ public class ActionsFragment extends Fragment {
comment.setVisibility(View.GONE);
}
rename.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
ActionDialog dialog = new ActionDialog(action, name, comment);
dialog.show(getFragmentManager(), null);
}
});
i++;
container.addView(view);
}
}
private void styleSwitch(CompoundButton buttonView, boolean isChecked) {
if (isChecked) {
buttonView.setBackground(getResources().getDrawable(R.drawable.button));
} else {
buttonView.setBackground(getResources().getDrawable(R.drawable.dangerous_button));
}
}
}

View File

@@ -8,20 +8,25 @@ import android.view.ViewGroup;
import android.widget.Button;
import android.widget.ImageButton;
import android.widget.LinearLayout;
import android.widget.ScrollView;
import android.widget.TextView;
import androidx.annotation.NonNull;
import androidx.appcompat.app.AppCompatActivity;
import androidx.fragment.app.Fragment;
import androidx.lifecycle.ViewModelProviders;
import androidx.navigation.Navigation;
import com.google.android.material.floatingactionbutton.FloatingActionButton;
import org.timecrafters.TimeCraftersConfigurationTool.R;
import org.timecrafters.TimeCraftersConfigurationTool.backend.Backend;
import org.timecrafters.TimeCraftersConfigurationTool.backend.Config;
import org.timecrafters.TimeCraftersConfigurationTool.backend.Config.Group;
import org.timecrafters.TimeCraftersConfigurationTool.backend.config.Group;
import org.timecrafters.TimeCraftersConfigurationTool.dialogs.ConfirmationDialog;
import org.timecrafters.TimeCraftersConfigurationTool.dialogs.GroupDialog;
import org.timecrafters.TimeCraftersConfigurationTool.library.TimeCraftersFragment;
public class EditorFragment extends Fragment {
public class GroupsFragment extends TimeCraftersFragment {
final private String TAG = "EditorFragment";
@@ -34,11 +39,24 @@ public class EditorFragment extends Fragment {
ViewGroup container, Bundle savedInstanceState) {
editorViewModel =
ViewModelProviders.of(this).get(EditorViewModel.class);
final View root = inflater.inflate(R.layout.fragment_editor, container, false);
final View root = inflater.inflate(R.layout.fragment_groups, container, false);
this.configName = root.findViewById(R.id.configuration_name);
this.container = root.findViewById(R.id.container);
final FloatingActionButton actionButton = root.findViewById(R.id.actionButton);
final ScrollView scrollView = root.findViewById(R.id.scrollview);
actionButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
GroupDialog dialog = new GroupDialog();
dialog.show(getFragmentManager(), null);
}
});
floatingActionButtonAutoHide(actionButton, scrollView);
if (Backend.instance() != null)
this.config = Backend.instance().getConfig();
this.config = Backend.instance().getConfig();
if (config != null) {
configName.setVisibility(View.GONE);
((AppCompatActivity)getActivity()).getSupportActionBar().setTitle("Config: " + config.getName());
@@ -53,7 +71,7 @@ public class EditorFragment extends Fragment {
private void populateGroups() {
int i = 0;
for (Group group : config.getGroups()) {
for (final Group group : config.getGroups()) {
View view = View.inflate(getContext(), R.layout.fragment_part_groups, null);
Button name = view.findViewById(R.id.name);
ImageButton rename = view.findViewById(R.id.rename);
@@ -73,6 +91,22 @@ public class EditorFragment extends Fragment {
}
});
rename.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
GroupDialog dialog = new GroupDialog(group);
dialog.show(getFragmentManager(), null);
}
});
delete.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
ConfirmationDialog dialog = new ConfirmationDialog("Are you sure?", "Really delete " + group.name + "?", null);
dialog.show(getFragmentManager(), null);
}
});
i++;
container.addView(view);
}

View File

@@ -4,32 +4,37 @@ import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Button;
import android.widget.ImageButton;
import android.widget.LinearLayout;
import android.widget.ScrollView;
import android.widget.TextView;
import androidx.annotation.NonNull;
import androidx.appcompat.app.AppCompatActivity;
import androidx.fragment.app.Fragment;
import androidx.navigation.NavAction;
import androidx.navigation.Navigation;
import androidx.navigation.ui.NavigationUI;
import com.google.android.material.floatingactionbutton.FloatingActionButton;
import org.timecrafters.TimeCraftersConfigurationTool.R;
import org.timecrafters.TimeCraftersConfigurationTool.backend.Backend;
import org.timecrafters.TimeCraftersConfigurationTool.backend.Config;
import org.timecrafters.TimeCraftersConfigurationTool.backend.config.Action;
import org.timecrafters.TimeCraftersConfigurationTool.backend.config.Group;
import org.timecrafters.TimeCraftersConfigurationTool.backend.config.Variable;
import org.timecrafters.TimeCraftersConfigurationTool.dialogs.VariableDialog;
import org.timecrafters.TimeCraftersConfigurationTool.library.TimeCraftersFragment;
public class VariablesFragment extends Fragment {
public class VariablesFragment extends TimeCraftersFragment {
private Config config;
private LinearLayout container;
private Config.Group group;
private Config.Action action;
private Group group;
private Action action;
public View onCreateView(@NonNull LayoutInflater inflater,
ViewGroup container, Bundle savedInstanceState) {
final View root = inflater.inflate(R.layout.fragment_variables, container, false);
this.container = root.findViewById(R.id.container);
final FloatingActionButton actionButton = root.findViewById(R.id.actionButton);
final ScrollView scrollView = root.findViewById(R.id.scrollview);
this.config = Backend.instance().getConfig();
this.group = config.getGroups().get(0);
@@ -40,15 +45,24 @@ public class VariablesFragment extends Fragment {
populateVariables();
}
floatingActionButtonAutoHide(actionButton, scrollView);
actionButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
VariableDialog dialog = new VariableDialog(action);
dialog.show(getFragmentManager(), null);
}
});
return root;
}
private void populateVariables() {
int i = 0;
for (Config.Variable variable : action.getVariables()) {
for (final Variable variable : action.getVariables()) {
View view = View.inflate(getContext(), R.layout.fragment_part_variables, null);
TextView name = view.findViewById(R.id.name);
TextView value = view.findViewById(R.id.value);
final TextView name = view.findViewById(R.id.name);
final TextView value = view.findViewById(R.id.value);
ImageButton rename = view.findViewById(R.id.rename);
ImageButton delete = view.findViewById(R.id.delete);
@@ -61,6 +75,14 @@ public class VariablesFragment extends Fragment {
name.setText(variable.name);
value.setText("" + variable.value());
rename.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
VariableDialog dialog = new VariableDialog(variable, name, value);
dialog.show(getFragmentManager(), null);
}
});
i++;
container.addView(view);
}

View File

@@ -4,17 +4,16 @@ import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.fragment.app.Fragment;
import androidx.lifecycle.Observer;
import androidx.lifecycle.ViewModelProviders;
import org.timecrafters.TimeCraftersConfigurationTool.R;
import org.timecrafters.TimeCraftersConfigurationTool.library.TimeCraftersFragment;
public class SearchFragment extends Fragment {
public class SearchFragment extends TimeCraftersFragment {
private SearchViewModel searchViewModel;

View File

@@ -1,6 +1,5 @@
package org.timecrafters.TimeCraftersConfigurationTool.ui.settings;
import android.content.Intent;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
@@ -9,14 +8,14 @@ import android.widget.Button;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.fragment.app.Fragment;
import androidx.lifecycle.Observer;
import androidx.lifecycle.ViewModelProviders;
import androidx.navigation.Navigation;
import org.timecrafters.TimeCraftersConfigurationTool.R;
import org.timecrafters.TimeCraftersConfigurationTool.library.TimeCraftersFragment;
public class SettingsFragment extends Fragment {
public class SettingsFragment extends TimeCraftersFragment {
private SettingsViewModel settingsViewModel;

View File

@@ -7,23 +7,14 @@ import android.view.ViewGroup;
import android.widget.LinearLayout;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.appcompat.app.AppCompatActivity;
import androidx.fragment.app.Fragment;
import org.timecrafters.TimeCraftersConfigurationTool.R;
import org.timecrafters.TimeCraftersConfigurationTool.library.TimeCraftersFragment;
public class ConfigurationsFragment extends Fragment {
public class ConfigurationsFragment extends TimeCraftersFragment {
public View onCreateView(@NonNull LayoutInflater inflater,
ViewGroup container, Bundle savedInstanceState) {
final View root = inflater.inflate(R.layout.activity_manage_configurations, container, false);
LinearLayout v = root.findViewById(R.id.configurations);
v.setBackgroundColor(getResources().getColor(R.color.list_even));
View vv = v.inflate(getContext(), R.layout.fragment_configuration, null);
v.addView(vv);
final View root = inflater.inflate(R.layout.fragment_configuration, container, false);
return root;
}

View File

@@ -1,6 +1,6 @@
package org.timecrafters.TimeCraftersConfigurationTool.ui.settings.presets;
import androidx.fragment.app.Fragment;
import org.timecrafters.TimeCraftersConfigurationTool.library.TimeCraftersFragment;
public class PresetsFragment extends Fragment {
public class PresetsFragment extends TimeCraftersFragment {
}

View File

@@ -11,15 +11,15 @@ import android.widget.EditText;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.fragment.app.Fragment;
import androidx.lifecycle.Observer;
import androidx.lifecycle.ViewModelProviders;
import org.timecrafters.TimeCraftersConfigurationTool.R;
import org.timecrafters.TimeCraftersConfigurationTool.backend.Backend;
import org.timecrafters.TimeCraftersConfigurationTool.dialogs.VariableDialog;
import org.timecrafters.TimeCraftersConfigurationTool.dialogs.ServerDialog;
import org.timecrafters.TimeCraftersConfigurationTool.library.TimeCraftersFragment;
public class TACNETFragment extends Fragment {
public class TACNETFragment extends TimeCraftersFragment {
private static final String TAG = "TACNETFragment";
private TACNETViewModel TACNETViewModel;
@@ -69,8 +69,8 @@ public class TACNETFragment extends Fragment {
connectButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
VariableDialog dialog = new VariableDialog();
dialog.show(getFragmentManager(), null);
// ConnectDialog dialog = new ConnectDialog();
// dialog.show(getFragmentManager(), null);
Backend.instance().saveSettings();
}
});
@@ -78,7 +78,7 @@ public class TACNETFragment extends Fragment {
startServerButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
VariableDialog dialog = new VariableDialog();
ServerDialog dialog = new ServerDialog();
dialog.show(getFragmentManager(), null);
}
});

Binary file not shown.

After

Width:  |  Height:  |  Size: 241 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 199 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 276 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 388 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 498 B

View File

@@ -1,20 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="match_parent">
<ScrollView
android:layout_width="match_parent"
android:layout_height="match_parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent">
<LinearLayout
android:id="@+id/configurations"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical" />
</ScrollView>
</androidx.constraintlayout.widget.ConstraintLayout>

View File

@@ -30,9 +30,10 @@
<ImageButton
android:id="@+id/dialogCloseButton"
android:layout_width="wrap_content"
style="Da"
android:layout_width="56dp"
android:layout_height="match_parent"
android:backgroundTint="@color/colorDanger"
android:background="@drawable/dangerous_button"
android:contentDescription="@string/dialog_close"
android:src="@drawable/cross"
app:layout_constraintEnd_toEndOf="parent"

View File

@@ -0,0 +1,43 @@
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
android:orientation="vertical"
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent">
<TextView
android:id="@+id/message"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:layout_marginLeft="@dimen/button_margin_left"
android:layout_marginTop="@dimen/button_margin_top"
android:layout_marginRight="@dimen/button_margin_right"
android:gravity="center"
android:text="TextView"
android:textColor="@color/dialogLabel"
android:textSize="18sp"
android:textStyle="bold" />
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_marginTop="@dimen/dialog_button_margin"
android:orientation="horizontal">
<Button
android:id="@+id/cancel"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_weight="1"
android:text="@string/dialog_cancel" />
<Button
android:id="@+id/confirm"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_weight="1"
android:text="@string/dialog_okay"
android:background="@drawable/dangerous_button" />
</LinearLayout>
</LinearLayout>

View File

@@ -0,0 +1,59 @@
<?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:orientation="vertical" android:layout_width="match_parent"
android:layout_height="match_parent">
<TextView
android:id="@+id/textView5"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="center|center_horizontal|center_vertical"
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" />
<TextView
android:id="@+id/textView6"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="center|center_horizontal|center_vertical"
android:text="@string/comment"
android:textColor="@color/dialogLabel" />
<EditText
android:id="@+id/comment"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:ems="10"
android:hint="@string/comment"
android:inputType="textPersonName" />
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_marginTop="@dimen/dialog_button_margin"
android:orientation="horizontal">
<Button
android:id="@+id/cancel"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_weight="1"
android:text="@string/dialog_cancel" />
<Button
android:id="@+id/mutate"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_weight="1"
android:text="@string/dialog_add" />
</LinearLayout>
</LinearLayout>

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:orientation="vertical" android:layout_width="match_parent"
android:layout_height="match_parent">
<TextView
android:id="@+id/textView5"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="center|center_horizontal|center_vertical"
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="match_parent"
android:layout_marginTop="@dimen/dialog_button_margin"
android:orientation="horizontal">
<Button
android:id="@+id/cancel"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_weight="1"
android:text="@string/dialog_cancel" />
<Button
android:id="@+id/mutate"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_weight="1"
android:text="@string/dialog_add" />
</LinearLayout>
</LinearLayout>

View File

@@ -0,0 +1,126 @@
<?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:orientation="vertical" android:layout_width="match_parent"
android:layout_height="match_parent">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginLeft="@dimen/button_margin_left"
android:layout_marginRight="@dimen/button_margin_right"
android:orientation="horizontal">
<!-- labels -->
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="vertical">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_weight="1"
android:text="Client Status"
android:textColor="@color/dialogLabel"
android:textStyle="bold" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_weight="1"
android:text="Total Packets In"
android:textColor="@color/dialogLabel"
android:textStyle="bold" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_weight="1"
android:text="Total Packets Out"
android:textColor="@color/dialogLabel"
android:textStyle="bold" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_weight="1"
android:text="Total Data In"
android:textColor="@color/dialogLabel"
android:textStyle="bold" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_weight="1"
android:text="Total Data Out"
android:textColor="@color/dialogLabel"
android:textStyle="bold" />
</LinearLayout>
<!-- values -->
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginLeft="@dimen/button_margin_left"
android:orientation="vertical">
<TextView
android:id="@+id/total_data_out"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_weight="1"
android:text="0"
android:textColor="@color/dialogLabel"/>
<TextView
android:id="@+id/total_packets_in"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_weight="1"
android:text="0"
android:textColor="@color/dialogLabel"/>
<TextView
android:id="@+id/total_data_in"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_weight="1"
android:text="0"
android:textColor="@color/dialogLabel"/>
<TextView
android:id="@+id/client_status"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_weight="1"
android:text="0"
android:textColor="@color/dialogLabel"/>
<TextView
android:id="@+id/total_packets_out"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_weight="1"
android:text="0"
android:textColor="@color/dialogLabel"/>
</LinearLayout>
</LinearLayout>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_marginTop="@dimen/dialog_button_margin"
android:orientation="horizontal">
<Button
android:id="@+id/stop_server"
style="@style/DangerousButton"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_weight="1"
android:text="@string/tacnet_stop_server" />
</LinearLayout>
</LinearLayout>

View File

@@ -5,16 +5,7 @@
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
tools:context=".ui.editor.EditorFragment">
tools:context=".ui.editor.GroupsFragment">
<ScrollView
android:layout_width="match_parent"
android:layout_height="match_parent">
<LinearLayout
android:id="@+id/container"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical" />
</ScrollView>
<include layout="@layout/partial_editor"/>
</LinearLayout>

View File

@@ -3,19 +3,9 @@
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_height="match_parent"
android:orientation="vertical">
<ScrollView
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_weight="1"/>
<LinearLayout
android:id="@+id/configuration"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_weight="1"
android:orientation="vertical"></LinearLayout>
<include layout="@layout/partial_editor"/>
</LinearLayout>

View File

@@ -5,25 +5,18 @@
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
tools:context=".ui.editor.EditorFragment">
tools:context=".ui.editor.GroupsFragment">
<TextView
android:id="@+id/configuration_name"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="@color/list_even"
android:text="No configuration active"
android:text="@string/warning_no_config_active"
android:textAlignment="center"
android:layout_gravity="center_horizontal"
android:textSize="18sp" />
<ScrollView
android:layout_width="match_parent"
android:layout_height="match_parent">
<include layout="@layout/partial_editor"/>
<LinearLayout
android:id="@+id/container"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical" />
</ScrollView>
</LinearLayout>

View File

@@ -5,16 +5,7 @@
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
tools:context=".ui.editor.EditorFragment">
tools:context=".ui.editor.GroupsFragment">
<ScrollView
android:layout_width="match_parent"
android:layout_height="match_parent">
<LinearLayout
android:id="@+id/container"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical" />
</ScrollView>
<include layout="@layout/partial_editor"/>
</LinearLayout>

View File

@@ -0,0 +1,31 @@
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="match_parent">
<ScrollView
android:id="@+id/scrollview"
android:layout_width="match_parent"
android:layout_height="match_parent">
<LinearLayout
android:id="@+id/container"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical" />
</ScrollView>
<com.google.android.material.floatingactionbutton.FloatingActionButton
android:id="@+id/actionButton"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="bottom|end"
android:layout_margin="@dimen/activity_vertical_margin"
android:clickable="true"
android:src="@drawable/plus"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent" />
</androidx.constraintlayout.widget.ConstraintLayout>

View File

@@ -13,9 +13,9 @@
<fragment
android:id="@+id/navigation_editor"
android:name="org.timecrafters.TimeCraftersConfigurationTool.ui.editor.EditorFragment"
android:name="org.timecrafters.TimeCraftersConfigurationTool.ui.editor.GroupsFragment"
android:label="@string/title_editor"
tools:layout="@layout/fragment_editor" >
tools:layout="@layout/fragment_groups" >
<action
android:id="@+id/action_navigation_editor_to_actionsFragment"
app:destination="@id/actionsFragment" />

View File

@@ -32,4 +32,8 @@
<string name="variable_name">Name</string>
<string name="variable_type">Type</string>
<string name="variable_value">Value</string>
<string name="comment">Comment</string>
<string name="warning_no_config_active">No active configuration set</string>
<string name="tacnet_stop_server">Stop Server</string>
<string name="tacnet_server_status">Server Status</string>
</resources>