diff --git a/app/build.gradle b/app/build.gradle index 6d843f3..1ee1453 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -36,6 +36,7 @@ android { dependencies { //implementation 'com.github.alpbak:BoxedVerticalSeekBar:1.1.1' + implementation 'com.google.code.gson:gson:2.10' implementation 'org.jetbrains.kotlin:kotlin-stdlib:1.7.10' implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-android:1.5.2' implementation 'com.illposed.osc:javaosc-core:0.8' diff --git a/app/src/main/java/net/ddns/anderserver/touchfadersapp/ChannelStripRecyclerViewAdapter.java b/app/src/main/java/net/ddns/anderserver/touchfadersapp/ChannelStripRecyclerViewAdapter.java index dd60e89..f7dcf96 100644 --- a/app/src/main/java/net/ddns/anderserver/touchfadersapp/ChannelStripRecyclerViewAdapter.java +++ b/app/src/main/java/net/ddns/anderserver/touchfadersapp/ChannelStripRecyclerViewAdapter.java @@ -49,7 +49,7 @@ public class ChannelStripRecyclerViewAdapter extends RecyclerView.Adapter> groupedChannels = new HashMap<>(); - public ChannelStripRecyclerViewAdapter(ItemMoveCallback.StartDragListener startDragListener, Context context, int numChannels, HashMap channelLayer, ArrayList channelColours, float width) { + public ChannelStripRecyclerViewAdapter(ItemMoveCallback.StartDragListener startDragListener, Context context, int numChannels, HashMap channelLayer, HashMap layout, ArrayList channelColours, float width) { this.context = context; this.startDragListener = startDragListener; colourArray = context.getResources().getIntArray(R.array.mixer_colours); @@ -80,6 +80,9 @@ public ChannelStripRecyclerViewAdapter(ItemMoveCallback.StartDragListener startD channels.add(entry.getValue()); notifyItemInserted(entry.getKey()); } + for (Map.Entry entry : layout.entrySet()) { +// Log.i("LAYOUT", entry.getKey() + " " + entry.getValue()); + } } @NonNull @@ -725,7 +728,7 @@ public HashMap getLayout() { if (!channel.group) { layout.put(i, channel.index); } - if (channel.group && channel.groupIndex == 0) { + if (channel.group && channel.colour != 0) { Group group = new Group(); group.index = channel.index; group.name = channel.name; @@ -738,6 +741,7 @@ public HashMap getLayout() { group.channels.put(j, subchannel.index); } } + layout.put(group.index, group.toMap()); } } for (Map.Entry entry : hiddenChannels.entrySet()) { diff --git a/app/src/main/java/net/ddns/anderserver/touchfadersapp/Group.java b/app/src/main/java/net/ddns/anderserver/touchfadersapp/Group.java index 1213770..6f6a0e2 100644 --- a/app/src/main/java/net/ddns/anderserver/touchfadersapp/Group.java +++ b/app/src/main/java/net/ddns/anderserver/touchfadersapp/Group.java @@ -1,8 +1,10 @@ package net.ddns.anderserver.touchfadersapp; +import androidx.annotation.NonNull; import androidx.annotation.Nullable; import java.util.HashMap; +import java.util.Map; import java.util.Objects; public class Group { @@ -11,20 +13,36 @@ public class Group { public String name; public int colourIndex; - public int groupIndex = -1; - public HashMap channels = new HashMap<>(); + public Map channels = new HashMap<>(); + + @NonNull + @Override + public String toString() { + return "Group {" + name + ", channels: " + channels + "}"; + } @Override public boolean equals(@Nullable Object obj) { if (obj instanceof Group) { - return ((Group) obj).index == index; + Group other = (Group) obj; + if (index != other.index) return false; + return channels == other.channels; } return false; + } @Override public int hashCode() { return Objects.hash(index); } + + Map toMap() { + Map map = new HashMap<>(); + map.put("index", index); + map.put("name", name); + map.put("channels", channels); + return map; + } } diff --git a/app/src/main/java/net/ddns/anderserver/touchfadersapp/HelpActivity.java b/app/src/main/java/net/ddns/anderserver/touchfadersapp/HelpActivity.java index 599a15d..e0c124d 100644 --- a/app/src/main/java/net/ddns/anderserver/touchfadersapp/HelpActivity.java +++ b/app/src/main/java/net/ddns/anderserver/touchfadersapp/HelpActivity.java @@ -103,7 +103,7 @@ protected void onStart() { super.onStart(); width = 70; channelLayer = loadMap(); - adapter = new ChannelStripRecyclerViewAdapter(this, instanceContext, numChannels, channelLayer, channelColours, width); + adapter = new ChannelStripRecyclerViewAdapter(this, instanceContext, numChannels, channelLayer, loadLayout(), channelColours, width); adapter.setValuesChangeListener((index, points) -> { }); adapter.setFaderMuteListener(((view, index, muted) -> { @@ -208,6 +208,47 @@ private void saveMap(HashMap inputMap) { } } + private void saveLayout(HashMap inputLayout) { + SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(getApplicationContext()); + if (preferences != null) { + JSONObject json = new JSONObject(); + for (Map.Entry inputEntry : inputLayout.entrySet()) { + try { + json.put(inputEntry.getKey().toString(), inputEntry.getValue()); + } catch (JSONException e) { + e.printStackTrace(); + } + } + String jsonString = json.toString(); + preferences.edit() + .remove("channel_layout") + .putString("channel_layout", jsonString) + .apply(); + } + } + + private HashMap loadLayout() { + HashMap outputMap = new HashMap<>(); + SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(getApplicationContext()); + try { + if (preferences != null) { + String jsonString = preferences.getString("channel_layout", (new JSONObject()).toString()); + if (jsonString != null) { + JSONObject json = new JSONObject(jsonString); + Iterator keys = json.keys(); + while (keys.hasNext()) { + String key = keys.next(); + Object value = json.get(key); + outputMap.put(Integer.valueOf(key), value); + } + } + } + } catch (JSONException e) { + e.printStackTrace(); + } + return outputMap; + } + private HashMap loadMap() { HashMap outputMap = new HashMap<>(); SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(getApplicationContext()); diff --git a/app/src/main/java/net/ddns/anderserver/touchfadersapp/MainActivity.java b/app/src/main/java/net/ddns/anderserver/touchfadersapp/MainActivity.java index 9c18bfb..dfe769f 100644 --- a/app/src/main/java/net/ddns/anderserver/touchfadersapp/MainActivity.java +++ b/app/src/main/java/net/ddns/anderserver/touchfadersapp/MainActivity.java @@ -25,6 +25,10 @@ import androidx.recyclerview.widget.ItemTouchHelper; import androidx.recyclerview.widget.RecyclerView; +import com.google.gson.Gson; +import com.google.gson.GsonBuilder; +import com.google.gson.ToNumberPolicy; +import com.google.gson.reflect.TypeToken; import com.illposed.osc.OSCMessage; import com.illposed.osc.OSCMessageEvent; import com.illposed.osc.OSCMessageListener; @@ -34,6 +38,7 @@ import org.json.JSONObject; import java.io.IOException; +import java.lang.reflect.Type; import java.net.DatagramPacket; import java.net.DatagramSocket; import java.net.SocketTimeoutException; @@ -59,6 +64,8 @@ public class MainActivity extends AppCompatActivity implements ItemMoveCallback. public static final String COLOUR = "colour"; + public static final String JSON_CHANNEL_LAYOUT = "channel_layout"; + Thread udpListenerThread; boolean runUDP = true; @@ -103,7 +110,7 @@ public void onServiceConnected(ComponentName componentName, IBinder iBinder) { width = Float.parseFloat(PreferenceManager.getDefaultSharedPreferences(getApplicationContext()).getString(getResources().getString(R.string.setting_fader_width), "35")); channelLayer = loadMap(); - adapter = new ChannelStripRecyclerViewAdapter(MainActivity.this, instanceContext, numChannels, channelLayer, channelColours, width); + adapter = new ChannelStripRecyclerViewAdapter(MainActivity.this, instanceContext, numChannels, channelLayer, loadLayout(), channelColours, width); adapter.setValuesChangeListener((index, points) -> SendOSCFaderValue(index + 1, points)); adapter.setFaderMuteListener(((view, index, muted) -> SendOSCChannelMute(index + 1, muted))); recyclerView = findViewById(R.id.faderRecyclerView); @@ -329,7 +336,7 @@ protected void onStart() { } else { width = Float.parseFloat(PreferenceManager.getDefaultSharedPreferences(getApplicationContext()).getString(getResources().getString(R.string.setting_fader_width), "35")); channelLayer = loadMap(); - adapter = new ChannelStripRecyclerViewAdapter(this, instanceContext, numChannels, channelLayer, channelColours, width); + adapter = new ChannelStripRecyclerViewAdapter(this, instanceContext, numChannels, channelLayer, loadLayout(), channelColours, width); adapter.setValuesChangeListener((index, points) -> { }); adapter.setFaderMuteListener(((view, index, muted) -> { @@ -535,15 +542,20 @@ private void saveLayout(HashMap inputLayout) { JSONObject json = new JSONObject(); for (Map.Entry inputEntry : inputLayout.entrySet()) { try { - json.put(inputEntry.getKey().toString(), inputEntry.getValue()); + if (inputEntry.getValue() instanceof Group) { + Group group = (Group) inputEntry.getValue(); + json.put(inputEntry.getKey().toString(), new JSONObject(group.toMap())); + } else { + json.put(inputEntry.getKey().toString(), inputEntry.getValue()); + } } catch (JSONException e) { e.printStackTrace(); } } String jsonString = json.toString(); preferences.edit() - .remove("channel_layout") - .putString("channel_layout", jsonString) + .remove(JSON_CHANNEL_LAYOUT) + .putString(JSON_CHANNEL_LAYOUT, jsonString) .apply(); } } @@ -551,21 +563,18 @@ private void saveLayout(HashMap inputLayout) { private HashMap loadLayout() { HashMap outputMap = new HashMap<>(); SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(getApplicationContext()); - try { - if (preferences != null) { - String jsonString = preferences.getString("channel_layout", (new JSONObject()).toString()); - if (jsonString != null) { - JSONObject json = new JSONObject(jsonString); - Iterator keys = json.keys(); - while (keys.hasNext()) { - String key = keys.next(); - Object value = json.get(key); - outputMap.put(Integer.valueOf(key), value); - } + if (preferences != null) { + String jsonString = preferences.getString(JSON_CHANNEL_LAYOUT, (new JSONObject()).toString()); + if (jsonString != null) { + Gson gson = new GsonBuilder().setObjectToNumberStrategy(ToNumberPolicy.LONG_OR_DOUBLE).create(); + Type mapType = new TypeToken>() { + }.getType(); + Map map = gson.fromJson(jsonString, mapType); + for (String key : map.keySet()) { + Object value = map.get(key); + outputMap.put(Integer.valueOf(key), value); } } - } catch (JSONException e) { - e.printStackTrace(); } return outputMap; }