Upgrade controller

This commit is contained in:
Tungstend 2024-09-20 20:17:06 +08:00
parent ae2d325340
commit d20cec2f13
17 changed files with 177 additions and 56 deletions

View File

@ -1,9 +1,11 @@
{ {
"id": "00000000",
"name": "Default", "name": "Default",
"version": "1.1.0", "version": "1.2.0",
"versionCode": 1,
"author": "Tungsten", "author": "Tungsten",
"description": "Default controller of Fold Craft Launcher.", "description": "Default controller of Fold Craft Launcher.",
"controllerVersion": 10, "controllerVersion": 20,
"buttonStyles": [ "buttonStyles": [
{ {
"name": "Default", "name": "Default",

View File

@ -543,7 +543,7 @@ public class GameMenu implements MenuCallback, View.OnClickListener {
}); });
editModeProperty.set(isSimulated()); editModeProperty.set(isSimulated());
controllerProperty.set(Controllers.findControllerByName(activity.getIntent().getExtras().getString("controller"))); controllerProperty.set(Controllers.findControllerById(activity.getIntent().getExtras().getString("controller")));
baseLayout = findViewById(R.id.base_layout); baseLayout = findViewById(R.id.base_layout);
touchPad = findViewById(R.id.touch_pad); touchPad = findViewById(R.id.touch_pad);

View File

@ -53,7 +53,7 @@ public class SelectControllerDialog extends FCLDialog implements View.OnClickLis
this.selectedController.set(selectedController); this.selectedController.set(selectedController);
} }
public SelectControllerDialog(@NonNull Context context, String name, Callback callback) { public SelectControllerDialog(@NonNull Context context, String id, Callback callback) {
super(context); super(context);
this.callback = callback; this.callback = callback;
setContentView(R.layout.dialog_select_controller); setContentView(R.layout.dialog_select_controller);
@ -64,7 +64,7 @@ public class SelectControllerDialog extends FCLDialog implements View.OnClickLis
boolean set = true; boolean set = true;
for (Controller controller : Controllers.getControllers()) { for (Controller controller : Controllers.getControllers()) {
if (controller.getName().equals(name)) { if (controller.getId().equals(id)) {
setSelectedController(controller); setSelectedController(controller);
set = false; set = false;
} }

View File

@ -49,12 +49,27 @@ import java.lang.reflect.Type;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
import java.util.Optional; import java.util.Optional;
import java.util.UUID;
import java.util.stream.Collectors; import java.util.stream.Collectors;
import java.util.stream.Stream; import java.util.stream.Stream;
@JsonAdapter(Controller.Serializer.class) @JsonAdapter(Controller.Serializer.class)
public class Controller implements Cloneable, Observable { public class Controller implements Cloneable, Observable {
private final SimpleStringProperty id;
public StringProperty idProperty() {
return id;
}
public String getId() {
return id.get();
}
public void setId(String id) {
this.id.set(id);
}
private final SimpleStringProperty name; private final SimpleStringProperty name;
public StringProperty nameProperty() { public StringProperty nameProperty() {
@ -83,6 +98,20 @@ public class Controller implements Cloneable, Observable {
this.version.set(version); this.version.set(version);
} }
private final SimpleIntegerProperty versionCode;
public IntegerProperty versionCodeProperty() {
return versionCode;
}
public int getVersionCode() {
return versionCode.get();
}
public void setVersionCode(int versionCode) {
this.versionCode.set(versionCode);
}
private final SimpleStringProperty author; private final SimpleStringProperty author;
public StringProperty authorProperty() { public StringProperty authorProperty() {
@ -132,28 +161,38 @@ public class Controller implements Cloneable, Observable {
} }
public Controller(String name) { public Controller(String name) {
this(name, ""); this(generateRandomId(), name);
} }
public Controller(String name, String version) { public Controller(String id, String name) {
this(name, version, ""); this(id, name, "");
} }
public Controller(String name, String version, String author) { public Controller(String id, String name, String version) {
this(name, version, author, ""); this(id, name, version, 1);
} }
public Controller(String name, String version, String author, String description) { public Controller(String id, String name, String version, int versionCode) {
this(name, version, author, description, Constants.CONTROLLER_VERSION); this(id, name, version, versionCode, "");
} }
public Controller(String name, String version, String author, String description, int controllerVersion) { public Controller(String id, String name, String version, int versionCode, String author) {
this(name, version, author, description, controllerVersion, FXCollections.observableArrayList(new ArrayList<>())); this(id, name, version, versionCode, author, "");
} }
public Controller(String name, String version, String author, String description, int controllerVersion, ObservableList<ControlViewGroup> viewGroups) { public Controller(String id, String name, String version, int versionCode, String author, String description) {
this(id, name, version, versionCode, author, description, Constants.CONTROLLER_VERSION);
}
public Controller(String id, String name, String version, int versionCode, String author, String description, int controllerVersion) {
this(id, name, version, versionCode, author, description, controllerVersion, FXCollections.observableArrayList(new ArrayList<>()));
}
public Controller(String id, String name, String version, int versionCode, String author, String description, int controllerVersion, ObservableList<ControlViewGroup> viewGroups) {
this.id = new SimpleStringProperty(this, "id", id);
this.name = new SimpleStringProperty(this, "name", name); this.name = new SimpleStringProperty(this, "name", name);
this.version = new SimpleStringProperty(this, "version", version); this.version = new SimpleStringProperty(this, "version", version);
this.versionCode = new SimpleIntegerProperty(this, "versionCode", versionCode);
this.author = new SimpleStringProperty(this, "author", author); this.author = new SimpleStringProperty(this, "author", author);
this.description = new SimpleStringProperty(this, "description", description); this.description = new SimpleStringProperty(this, "description", description);
this.viewGroups = viewGroups; this.viewGroups = viewGroups;
@ -163,6 +202,10 @@ public class Controller implements Cloneable, Observable {
addPropertyChangedListener(onInvalidating(this::invalidate)); addPropertyChangedListener(onInvalidating(this::invalidate));
} }
public static String generateRandomId() {
return UUID.randomUUID().toString().substring(0, 8);
}
public void addViewGroup(ControlViewGroup viewGroup) { public void addViewGroup(ControlViewGroup viewGroup) {
boolean exist = false; boolean exist = false;
for (ControlViewGroup group : viewGroups()) { for (ControlViewGroup group : viewGroups()) {
@ -200,8 +243,10 @@ public class Controller implements Cloneable, Observable {
@Override @Override
public String toString() { public String toString() {
return new ToStringBuilder(this) return new ToStringBuilder(this)
.append("id", getId())
.append("name", getName()) .append("name", getName())
.append("version", getVersion()) .append("version", getVersion())
.append("versionCode", getVersionCode())
.append("author", getAuthor()) .append("author", getAuthor())
.append("description", getDescription()) .append("description", getDescription())
.append("controllerVersion", getControllerVersion()) .append("controllerVersion", getControllerVersion())
@ -209,8 +254,10 @@ public class Controller implements Cloneable, Observable {
} }
private void addPropertyChangedListener(InvalidationListener listener) { private void addPropertyChangedListener(InvalidationListener listener) {
id.addListener(listener);
name.addListener(listener); name.addListener(listener);
version.addListener(listener); version.addListener(listener);
versionCode.addListener(listener);
author.addListener(listener); author.addListener(listener);
description.addListener(listener); description.addListener(listener);
viewGroups.addListener(listener); viewGroups.addListener(listener);
@ -242,13 +289,13 @@ public class Controller implements Cloneable, Observable {
public Controller clone() { public Controller clone() {
ObservableList<ControlViewGroup> viewGroups = FXCollections.observableArrayList(new ArrayList<>()); ObservableList<ControlViewGroup> viewGroups = FXCollections.observableArrayList(new ArrayList<>());
viewGroups.addAll(viewGroups().stream().map(ControlViewGroup::clone).collect(Collectors.toList())); viewGroups.addAll(viewGroups().stream().map(ControlViewGroup::clone).collect(Collectors.toList()));
return new Controller(getName() + "_clone", getVersion(), getAuthor(), getDescription(), getControllerVersion(), viewGroups); return new Controller(generateRandomId(), getName() + "_clone", getVersion(), getVersionCode(), getAuthor(), getDescription(), getControllerVersion(), viewGroups);
} }
// function // function
public String getFileName() { public String getFileName() {
return getName() + ".json"; return getId() + ".json";
} }
public void saveToDisk() throws IOException { public void saveToDisk() throws IOException {
@ -259,23 +306,27 @@ public class Controller implements Cloneable, Observable {
FileUtils.writeText(new File(FCLPath.CONTROLLER_DIR, getFileName()), str); FileUtils.writeText(new File(FCLPath.CONTROLLER_DIR, getFileName()), str);
} }
public void rename(String newName) throws IOException { public void changeId(String newId) throws IOException {
FileUtils.copyFile(new File(FCLPath.CONTROLLER_DIR, getFileName()), new File(FCLPath.CONTROLLER_DIR, newName + ".json")); renameFile(getFileName(), newId + ".json");
new File(FCLPath.CONTROLLER_DIR, getFileName()).delete(); setId(newId);
setName(newName); }
public void renameFile(String oldFileName, String newFileName) throws IOException {
FileUtils.copyFile(new File(FCLPath.CONTROLLER_DIR, oldFileName), new File(FCLPath.CONTROLLER_DIR, newFileName));
new File(FCLPath.CONTROLLER_DIR, oldFileName).delete();
} }
public void upgrade() { public void upgrade() {
this.controllerVersion.set(Constants.CONTROLLER_VERSION); this.controllerVersion.set(Constants.CONTROLLER_VERSION);
} }
public static void showUpgradeDialog(Context context, String name) { public static void showUpgradeDialog(Context context, String name, String id) {
Schedulers.androidUIThread().execute(() -> { Schedulers.androidUIThread().execute(() -> {
FCLAlertDialog.Builder builder = new FCLAlertDialog.Builder(context); FCLAlertDialog.Builder builder = new FCLAlertDialog.Builder(context);
builder.setCancelable(false); builder.setCancelable(false);
builder.setAlertLevel(FCLAlertDialog.AlertLevel.INFO); builder.setAlertLevel(FCLAlertDialog.AlertLevel.INFO);
builder.setMessage(String.format(context.getString(R.string.control_upgrade), name)); builder.setMessage(String.format(context.getString(R.string.control_upgrade), name));
builder.setPositiveButton(() -> Controllers.findControllerByName(name).upgrade()); builder.setPositiveButton(() -> Controllers.findControllerById(id).upgrade());
builder.setNegativeButton(null); builder.setNegativeButton(null);
builder.create().show(); builder.create().show();
}); });
@ -301,8 +352,10 @@ public class Controller implements Cloneable, Observable {
Gson gson = new GsonBuilder().setPrettyPrinting().create(); Gson gson = new GsonBuilder().setPrettyPrinting().create();
JsonObject jsonObject = new JsonObject(); JsonObject jsonObject = new JsonObject();
jsonObject.addProperty("id", src.getId());
jsonObject.addProperty("name", src.getName()); jsonObject.addProperty("name", src.getName());
jsonObject.addProperty("version", src.getVersion()); jsonObject.addProperty("version", src.getVersion());
jsonObject.addProperty("versionCode", src.getVersionCode());
jsonObject.addProperty("author", src.getAuthor()); jsonObject.addProperty("author", src.getAuthor());
jsonObject.addProperty("description", src.getDescription()); jsonObject.addProperty("description", src.getDescription());
jsonObject.addProperty("controllerVersion", src.getControllerVersion()); jsonObject.addProperty("controllerVersion", src.getControllerVersion());
@ -321,8 +374,10 @@ public class Controller implements Cloneable, Observable {
JsonObject obj = (JsonObject) json; JsonObject obj = (JsonObject) json;
Gson gson = new GsonBuilder().setPrettyPrinting().create(); Gson gson = new GsonBuilder().setPrettyPrinting().create();
String id = Optional.ofNullable(obj.get("id")).map(JsonElement::getAsString).orElse(generateRandomId());
String name = Optional.ofNullable(obj.get("name")).map(JsonElement::getAsString).orElse("Error"); String name = Optional.ofNullable(obj.get("name")).map(JsonElement::getAsString).orElse("Error");
String version = Optional.ofNullable(obj.get("version")).map(JsonElement::getAsString).orElse(""); String version = Optional.ofNullable(obj.get("version")).map(JsonElement::getAsString).orElse("");
int versionCode = Optional.ofNullable(obj.get("versionCode")).map(JsonElement::getAsInt).orElse(1);
String author = Optional.ofNullable(obj.get("author")).map(JsonElement::getAsString).orElse(""); String author = Optional.ofNullable(obj.get("author")).map(JsonElement::getAsString).orElse("");
String description = Optional.ofNullable(obj.get("description")).map(JsonElement::getAsString).orElse(""); String description = Optional.ofNullable(obj.get("description")).map(JsonElement::getAsString).orElse("");
@ -341,10 +396,10 @@ public class Controller implements Cloneable, Observable {
ObservableList<ControlViewGroup> viewGroups = FXCollections.observableList(gson.fromJson(Optional.ofNullable(obj.get("viewGroups")).map(JsonElement::getAsJsonArray).orElse(new JsonArray()), new TypeToken<ArrayList<ControlViewGroup>>(){}.getType())); ObservableList<ControlViewGroup> viewGroups = FXCollections.observableList(gson.fromJson(Optional.ofNullable(obj.get("viewGroups")).map(JsonElement::getAsJsonArray).orElse(new JsonArray()), new TypeToken<ArrayList<ControlViewGroup>>(){}.getType()));
if (controllerVersion < Constants.CONTROLLER_VERSION) { if (controllerVersion < Constants.CONTROLLER_VERSION) {
showUpgradeDialog(FCLPath.CONTEXT, name); showUpgradeDialog(FCLPath.CONTEXT, name, id);
} }
return new Controller(name, version, author, description, controllerVersion, viewGroups); return new Controller(id, name, version, versionCode, author, description, controllerVersion, viewGroups);
} }
} }

View File

@ -41,7 +41,7 @@ public class Controllers {
if (controllers.isEmpty()) { if (controllers.isEmpty()) {
try { try {
if (DEFAULT_CONTROLLER == null) { if (DEFAULT_CONTROLLER == null) {
String str = IOUtils.readFullyAsString(Controllers.class.getResourceAsStream("/assets/controllers/Default.json")); String str = IOUtils.readFullyAsString(Controllers.class.getResourceAsStream("/assets/controllers/00000000.json"));
DEFAULT_CONTROLLER = new GsonBuilder() DEFAULT_CONTROLLER = new GsonBuilder()
.registerTypeAdapterFactory(new JavaFxPropertyTypeAdapterFactory(true, true)) .registerTypeAdapterFactory(new JavaFxPropertyTypeAdapterFactory(true, true))
.setPrettyPrinting() .setPrettyPrinting()
@ -74,7 +74,7 @@ public class Controllers {
if (files != null) { if (files != null) {
ArrayList<String> fileNames = (ArrayList<String>) controllers.stream().map(Controller::getFileName).collect(Collectors.toList()); ArrayList<String> fileNames = (ArrayList<String>) controllers.stream().map(Controller::getFileName).collect(Collectors.toList());
for (File file : files) { for (File file : files) {
if (file.isDirectory() || !fileNames.contains(file.getName())) { if (((file.isDirectory() && !file.getName().equals("styles")) || !fileNames.contains(file.getName())) && !file.getName().endsWith(".bak")) {
file.delete(); file.delete();
} }
} }
@ -101,9 +101,7 @@ public class Controllers {
checkControllers(); checkControllers();
initialized = true; initialized = true;
CALLBACKS.forEach(callback -> { CALLBACKS.forEach(callback -> Schedulers.androidUIThread().execute(callback));
Schedulers.androidUIThread().execute(callback);
});
CALLBACKS.clear(); CALLBACKS.clear();
} }
@ -118,6 +116,9 @@ public class Controllers {
.registerTypeAdapterFactory(new JavaFxPropertyTypeAdapterFactory(true, true)) .registerTypeAdapterFactory(new JavaFxPropertyTypeAdapterFactory(true, true))
.setPrettyPrinting() .setPrettyPrinting()
.create().fromJson(str, Controller.class); .create().fromJson(str, Controller.class);
if (!json.getName().equals(controller.getFileName())) {
controller.renameFile(json.getName(), controller.getFileName());
}
list.add(controller); list.add(controller);
} catch (IOException e) { } catch (IOException e) {
Logging.LOG.log(Level.WARNING, "Can't read file: " + json.getAbsolutePath(), e.getMessage()); Logging.LOG.log(Level.WARNING, "Can't read file: " + json.getAbsolutePath(), e.getMessage());
@ -152,9 +153,9 @@ public class Controllers {
controllers.remove(controller); controllers.remove(controller);
} }
public static Controller findControllerByName(String name) { public static Controller findControllerById(String id) {
checkControllers(); checkControllers();
return controllers.stream().filter(it -> it.getName().equals(name)).findFirst().orElse(controllers.get(0)); return controllers.stream().filter(it -> it.getId().equals(id)).findFirst().orElse(controllers.get(0));
} }
public static void addCallback(Runnable callback) { public static void addCallback(Runnable callback) {

View File

@ -310,7 +310,7 @@ public final class VersionSetting implements Cloneable {
VKDriverSystemProperty.set(vulkanDriverSystem); VKDriverSystemProperty.set(vulkanDriverSystem);
} }
private final StringProperty controllerProperty = new SimpleStringProperty(this, "controller", "Default"); private final StringProperty controllerProperty = new SimpleStringProperty(this, "controller", "00000000");
public StringProperty controllerProperty() { public StringProperty controllerProperty() {
return controllerProperty; return controllerProperty;
@ -362,11 +362,11 @@ public final class VersionSetting implements Cloneable {
Controllers.addCallback(() -> { Controllers.addCallback(() -> {
Controllers.checkControllers(); Controllers.checkControllers();
Controller controller = Controllers.getControllers().stream() Controller controller = Controllers.getControllers().stream()
.filter(it -> it.getName().equals(getController())) .filter(it -> it.getId().equals(getController()))
.findFirst() .findFirst()
.orElse(Controllers.getControllers().get(0)); .orElse(Controllers.getControllers().get(0));
setController(controller.getName()); setController(controller.getId());
}); });
} }
@ -465,7 +465,7 @@ public final class VersionSetting implements Cloneable {
vs.setNotCheckJVM(Optional.ofNullable(obj.get("notCheckJVM")).map(JsonElement::getAsBoolean).orElse(false)); vs.setNotCheckJVM(Optional.ofNullable(obj.get("notCheckJVM")).map(JsonElement::getAsBoolean).orElse(false));
vs.setBeGesture(Optional.ofNullable(obj.get("beGesture")).map(JsonElement::getAsBoolean).orElse(false)); vs.setBeGesture(Optional.ofNullable(obj.get("beGesture")).map(JsonElement::getAsBoolean).orElse(false));
vs.setVKDriverSystem(Optional.ofNullable(obj.get("vulkanDriverSystem")).map(JsonElement::getAsBoolean).orElse(false)); vs.setVKDriverSystem(Optional.ofNullable(obj.get("vulkanDriverSystem")).map(JsonElement::getAsBoolean).orElse(false));
vs.setController(Optional.ofNullable(obj.get("controller")).map(JsonElement::getAsString).orElse("Default")); vs.setController(Optional.ofNullable(obj.get("controller")).map(JsonElement::getAsString).orElse("00000000"));
vs.setRenderer(FCLConfig.Renderer.values()[Optional.ofNullable(obj.get("renderer")).map(JsonElement::getAsInt).orElse(FCLConfig.Renderer.RENDERER_GL4ES.ordinal())]); vs.setRenderer(FCLConfig.Renderer.values()[Optional.ofNullable(obj.get("renderer")).map(JsonElement::getAsInt).orElse(FCLConfig.Renderer.RENDERER_GL4ES.ordinal())]);
vs.setIsolateGameDir(Optional.ofNullable(obj.get("isolateGameDir")).map(JsonElement::getAsBoolean).orElse(false)); vs.setIsolateGameDir(Optional.ofNullable(obj.get("isolateGameDir")).map(JsonElement::getAsBoolean).orElse(false));

View File

@ -1,5 +1,6 @@
package com.tungsten.fcl.ui.controller; package com.tungsten.fcl.ui.controller;
import android.annotation.SuppressLint;
import android.content.Context; import android.content.Context;
import android.view.View; import android.view.View;
import android.widget.Toast; import android.widget.Toast;
@ -8,7 +9,7 @@ import androidx.annotation.NonNull;
import com.tungsten.fcl.R; import com.tungsten.fcl.R;
import com.tungsten.fcl.setting.Controller; import com.tungsten.fcl.setting.Controller;
import com.tungsten.fcl.setting.Controllers; import com.tungsten.fclcore.util.StringUtils;
import com.tungsten.fclcore.util.platform.OperatingSystem; import com.tungsten.fclcore.util.platform.OperatingSystem;
import com.tungsten.fcllibrary.component.dialog.FCLDialog; import com.tungsten.fcllibrary.component.dialog.FCLDialog;
import com.tungsten.fcllibrary.component.view.FCLButton; import com.tungsten.fcllibrary.component.view.FCLButton;
@ -17,9 +18,6 @@ import com.tungsten.fcllibrary.component.view.FCLEditText;
import com.tungsten.fcllibrary.component.view.FCLLinearLayout; import com.tungsten.fcllibrary.component.view.FCLLinearLayout;
import com.tungsten.fcllibrary.component.view.FCLTextView; import com.tungsten.fcllibrary.component.view.FCLTextView;
import java.util.List;
import java.util.stream.Collectors;
public class ControllerInfoDialog extends FCLDialog implements View.OnClickListener { public class ControllerInfoDialog extends FCLDialog implements View.OnClickListener {
private final boolean create; private final boolean create;
@ -29,12 +27,14 @@ public class ControllerInfoDialog extends FCLDialog implements View.OnClickListe
private FCLEditText editName; private FCLEditText editName;
private FCLEditText editVersion; private FCLEditText editVersion;
private FCLEditText editVersionCode;
private FCLEditText editAuthor; private FCLEditText editAuthor;
private FCLEditText editDescription; private FCLEditText editDescription;
private FCLButton positive; private FCLButton positive;
private FCLButton negative; private FCLButton negative;
@SuppressLint("SetTextI18n")
public ControllerInfoDialog(@NonNull Context context, boolean create, Controller controller, Callback callback) { public ControllerInfoDialog(@NonNull Context context, boolean create, Controller controller, Callback callback) {
super(context); super(context);
this.create = create; this.create = create;
@ -50,11 +50,15 @@ public class ControllerInfoDialog extends FCLDialog implements View.OnClickListe
FCLLinearLayout moreInfoLayout = findViewById(R.id.more_info_layout); FCLLinearLayout moreInfoLayout = findViewById(R.id.more_info_layout);
editVersion = findViewById(R.id.version); editVersion = findViewById(R.id.version);
editVersionCode = findViewById(R.id.version_code);
editAuthor = findViewById(R.id.author); editAuthor = findViewById(R.id.author);
editDescription = findViewById(R.id.description); editDescription = findViewById(R.id.description);
editVersionCode.setIntegerFilter(1);
editName.setText(controller.getName()); editName.setText(controller.getName());
editVersion.setText(controller.getVersion()); editVersion.setText(controller.getVersion());
editVersionCode.setText(controller.getVersionCode() + "");
editAuthor.setText(controller.getAuthor()); editAuthor.setText(controller.getAuthor());
editDescription.setText(controller.getDescription()); editDescription.setText(controller.getDescription());
@ -72,17 +76,17 @@ public class ControllerInfoDialog extends FCLDialog implements View.OnClickListe
@Override @Override
public void onClick(View view) { public void onClick(View view) {
if (view == positive) { if (view == positive) {
List<String> nameList = Controllers.getControllers().stream().map(Controller::getName).collect(Collectors.toList());
if (!create) {
nameList.remove(controller.getName());
}
if (!OperatingSystem.isNameValid(editName.getText().toString()) || editName.getText().toString().equals("Error")) { if (!OperatingSystem.isNameValid(editName.getText().toString()) || editName.getText().toString().equals("Error")) {
Toast.makeText(getContext(), getContext().getString(R.string.control_info_name_invalid), Toast.LENGTH_SHORT).show(); Toast.makeText(getContext(), getContext().getString(R.string.control_info_name_invalid), Toast.LENGTH_SHORT).show();
} else if (nameList.contains(editName.getText().toString())) {
Toast.makeText(getContext(), getContext().getString(R.string.control_info_name_exist), Toast.LENGTH_SHORT).show();
} else { } else {
Controller controller = new Controller(editName.getText().toString(), String id = this.controller.getId();
if (!editAuthor.getText().toString().equals(this.controller.getAuthor())) {
id = Controller.generateRandomId();
}
Controller controller = new Controller(id,
editName.getText().toString(),
editVersion.getText().toString(), editVersion.getText().toString(),
Integer.parseInt(StringUtils.isBlank(editVersionCode.getText().toString()) ? "1" : editVersionCode.getText().toString()),
editAuthor.getText().toString(), editAuthor.getText().toString(),
editDescription.getText().toString(), editDescription.getText().toString(),
this.controller.getControllerVersion()); this.controller.getControllerVersion());

View File

@ -42,7 +42,6 @@ import com.tungsten.fcllibrary.component.view.FCLUILayout;
import java.io.File; import java.io.File;
import java.io.IOException; import java.io.IOException;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.function.Consumer;
import java.util.logging.Level; import java.util.logging.Level;
public class ControllerUI extends FCLCommonUI implements View.OnClickListener { public class ControllerUI extends FCLCommonUI implements View.OnClickListener {
@ -154,17 +153,20 @@ public class ControllerUI extends FCLCommonUI implements View.OnClickListener {
} }
public void changeControllerInfo(Controller old, Controller newValue) { public void changeControllerInfo(Controller old, Controller newValue) {
old.setName(newValue.getName());
old.setVersion(newValue.getVersion()); old.setVersion(newValue.getVersion());
old.setVersionCode(newValue.getVersionCode());
old.setAuthor(newValue.getAuthor()); old.setAuthor(newValue.getAuthor());
old.setDescription(newValue.getDescription()); old.setDescription(newValue.getDescription());
if (!old.getName().equals(newValue.getName())) { if (!old.getId().equals(newValue.getId())) {
try { try {
old.rename(newValue.getName()); old.changeId(newValue.getId());
} catch (IOException e) { } catch (IOException e) {
Logging.LOG.log(Level.SEVERE, "Failed to rename controller!", e.getMessage()); Logging.LOG.log(Level.SEVERE, "Failed to change controller id!", e.getMessage());
} }
} }
refreshProperty.set(!refreshProperty.get()); refreshProperty.set(!refreshProperty.get());
} }
@ -225,7 +227,7 @@ public class ControllerUI extends FCLCommonUI implements View.OnClickListener {
if (view == editController) { if (view == editController) {
Intent intent = new Intent(getContext(), ControllerActivity.class); Intent intent = new Intent(getContext(), ControllerActivity.class);
Bundle bundle = new Bundle(); Bundle bundle = new Bundle();
bundle.putString("controller", getSelectedController().getName()); bundle.putString("controller", getSelectedController().getId());
intent.putExtras(bundle); intent.putExtras(bundle);
getActivity().startActivity(intent); getActivity().startActivity(intent);
} }

View File

@ -394,9 +394,7 @@ public class VersionSettingPage extends FCLCommonPage implements ManageUI.Versio
onDeleteIcon(); onDeleteIcon();
} }
if (view == controllerButton) { if (view == controllerButton) {
SelectControllerDialog dialog = new SelectControllerDialog(getContext(), lastVersionSetting.getController(), controller -> { SelectControllerDialog dialog = new SelectControllerDialog(getContext(), lastVersionSetting.getController(), controller -> lastVersionSetting.setController(controller.getId()));
lastVersionSetting.setController(controller.getName());
});
dialog.show(); dialog.show();
} }
} }

View File

@ -2,7 +2,7 @@ package com.tungsten.fcl.util;
public class Constants { public class Constants {
public static final int CONTROLLER_VERSION = 10; public static final int CONTROLLER_VERSION = 20;
public static final int MIN_CONTROLLER_VERSION = 0; public static final int MIN_CONTROLLER_VERSION = 0;

View File

@ -88,6 +88,32 @@
</androidx.appcompat.widget.LinearLayoutCompat> </androidx.appcompat.widget.LinearLayoutCompat>
<androidx.appcompat.widget.LinearLayoutCompat
android:layout_marginTop="5dp"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal">
<com.tungsten.fcllibrary.component.view.FCLTextView
android:layout_weight="1"
android:singleLine="true"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:text="@string/control_info_version_code"
android:layout_gravity="center"/>
<com.tungsten.fcllibrary.component.view.FCLEditText
android:singleLine="true"
android:textSize="14sp"
android:inputType="number"
android:hint="@string/input_hint_not_empty"
android:id="@+id/version_code"
android:layout_width="250dp"
android:layout_height="wrap_content"
android:layout_gravity="center"/>
</androidx.appcompat.widget.LinearLayoutCompat>
<androidx.appcompat.widget.LinearLayoutCompat <androidx.appcompat.widget.LinearLayoutCompat
android:layout_marginTop="5dp" android:layout_marginTop="5dp"
android:layout_width="match_parent" android:layout_width="match_parent"

View File

@ -158,6 +158,7 @@
<string name="control_info_name_exist">کنترل کننده از قبل وجود دارد ، لطفاً نام را تغییر دهید!</string> <string name="control_info_name_exist">کنترل کننده از قبل وجود دارد ، لطفاً نام را تغییر دهید!</string>
<string name="control_info_name_invalid">نام نامعتبر</string> <string name="control_info_name_invalid">نام نامعتبر</string>
<string name="control_info_version">نسخه:</string> <string name="control_info_version">نسخه:</string>
<string name="control_info_version_code">کد نسخه:</string>
<string name="control_list">لیست کنترل کننده</string> <string name="control_list">لیست کنترل کننده</string>
<string name="control_select">کنترلر را انتخاب کنید</string> <string name="control_select">کنترلر را انتخاب کنید</string>
<string name="control_share">کنترل کننده</string> <string name="control_share">کنترل کننده</string>

View File

@ -158,6 +158,7 @@
<string name="control_info_name_exist">O controle já existe, por favor mude o nome!</string> <string name="control_info_name_exist">O controle já existe, por favor mude o nome!</string>
<string name="control_info_name_invalid">Nome Inválido</string> <string name="control_info_name_invalid">Nome Inválido</string>
<string name="control_info_version">Versão: </string> <string name="control_info_version">Versão: </string>
<string name="control_info_version_code">Código da versão:</string>
<string name="control_list">Lista de Controles</string> <string name="control_list">Lista de Controles</string>
<string name="control_select">Selecionar Controle</string> <string name="control_select">Selecionar Controle</string>
<string name="control_share">Compartilhar</string> <string name="control_share">Compartilhar</string>

View File

@ -158,6 +158,7 @@
<string name="control_info_name_exist">Контроллер уже существует, измените имя!</string> <string name="control_info_name_exist">Контроллер уже существует, измените имя!</string>
<string name="control_info_name_invalid">Неверное имя</string> <string name="control_info_name_invalid">Неверное имя</string>
<string name="control_info_version">Версия: </string> <string name="control_info_version">Версия: </string>
<string name="control_info_version_code">Код версии:</string>
<string name="control_list">Список контроллеров</string> <string name="control_list">Список контроллеров</string>
<string name="control_select">Выберите контроллер</string> <string name="control_select">Выберите контроллер</string>
<string name="control_share">Поделиться контроллером</string> <string name="control_share">Поделиться контроллером</string>

View File

@ -139,6 +139,7 @@
<string name="control_info_name_exist">该布局已存在,请换一个名字!</string> <string name="control_info_name_exist">该布局已存在,请换一个名字!</string>
<string name="control_info_name_invalid">无效的名称</string> <string name="control_info_name_invalid">无效的名称</string>
<string name="control_info_version">版本:</string> <string name="control_info_version">版本:</string>
<string name="control_info_version_code">版本号:</string>
<string name="control_list">布局列表</string> <string name="control_list">布局列表</string>
<string name="control_select">选择布局</string> <string name="control_select">选择布局</string>
<string name="control_share">分享布局</string> <string name="control_share">分享布局</string>

View File

@ -160,6 +160,7 @@
<string name="control_info_name_exist">The controller already exist, please change the name!</string> <string name="control_info_name_exist">The controller already exist, please change the name!</string>
<string name="control_info_name_invalid">Invalid Name</string> <string name="control_info_name_invalid">Invalid Name</string>
<string name="control_info_version">Version: </string> <string name="control_info_version">Version: </string>
<string name="control_info_version_code">Version Code: </string>
<string name="control_list">Controller List</string> <string name="control_list">Controller List</string>
<string name="control_select">Select Controller</string> <string name="control_select">Select Controller</string>
<string name="control_share">Share Controller</string> <string name="control_share">Share Controller</string>

View File

@ -6,6 +6,8 @@ import android.content.res.TypedArray;
import android.graphics.Color; import android.graphics.Color;
import android.os.Build; import android.os.Build;
import android.text.Editable; import android.text.Editable;
import android.text.InputFilter;
import android.text.Spanned;
import android.text.TextWatcher; import android.text.TextWatcher;
import android.util.AttributeSet; import android.util.AttributeSet;
@ -24,6 +26,8 @@ import com.tungsten.fclcore.task.Schedulers;
import com.tungsten.fcllibrary.R; import com.tungsten.fcllibrary.R;
import com.tungsten.fcllibrary.component.theme.ThemeEngine; import com.tungsten.fcllibrary.component.theme.ThemeEngine;
import java.util.regex.Pattern;
public class FCLEditText extends AppCompatEditText { public class FCLEditText extends AppCompatEditText {
private boolean autoTint; private boolean autoTint;
@ -121,6 +125,30 @@ public class FCLEditText extends AppCompatEditText {
}); });
} }
private static final class SignedIntegerFilter implements InputFilter {
private final Pattern pattern;
SignedIntegerFilter(int min) {
pattern = Pattern.compile("^" + (min < 0 ? "-?" : "") + "[0-9]*$");
}
@Override
public CharSequence filter(CharSequence source, int start, int end, Spanned dest, int dstart, int dend) {
StringBuilder builder = new StringBuilder(dest);
builder.insert(dstart, source);
if (!pattern.matcher(builder.toString()).matches()) {
return "";
}
return source;
}
}
public void setIntegerFilter(int min) {
setFilters(new InputFilter[]{
new SignedIntegerFilter(min)
});
}
public FCLEditText(@NonNull Context context) { public FCLEditText(@NonNull Context context) {
super(context); super(context);
autoTint = false; autoTint = false;