diff --git a/app/src/main/java/com/limelight/binding/input/virtual_controller/AnalogStick.java b/app/src/main/java/com/limelight/binding/input/virtual_controller/AnalogStick.java index 655755d4..233e391b 100644 --- a/app/src/main/java/com/limelight/binding/input/virtual_controller/AnalogStick.java +++ b/app/src/main/java/com/limelight/binding/input/virtual_controller/AnalogStick.java @@ -164,8 +164,8 @@ public class AnalogStick extends VirtualControllerElement { } } - public AnalogStick(VirtualController controller, Context context) { - super(controller, context); + public AnalogStick(VirtualController controller, Context context, int elementId) { + super(controller, context, elementId); // reset stick position position_stick_x = getWidth() / 2; position_stick_y = getHeight() / 2; diff --git a/app/src/main/java/com/limelight/binding/input/virtual_controller/DigitalButton.java b/app/src/main/java/com/limelight/binding/input/virtual_controller/DigitalButton.java index 6447be84..4614f42d 100644 --- a/app/src/main/java/com/limelight/binding/input/virtual_controller/DigitalButton.java +++ b/app/src/main/java/com/limelight/binding/input/virtual_controller/DigitalButton.java @@ -120,8 +120,8 @@ public class DigitalButton extends VirtualControllerElement { } } - public DigitalButton(VirtualController controller, int layer, Context context) { - super(controller, context); + public DigitalButton(VirtualController controller, int elementId, int layer, Context context) { + super(controller, context, elementId); this.layer = layer; } diff --git a/app/src/main/java/com/limelight/binding/input/virtual_controller/DigitalPad.java b/app/src/main/java/com/limelight/binding/input/virtual_controller/DigitalPad.java index 1cd0c300..db30d574 100644 --- a/app/src/main/java/com/limelight/binding/input/virtual_controller/DigitalPad.java +++ b/app/src/main/java/com/limelight/binding/input/virtual_controller/DigitalPad.java @@ -27,7 +27,7 @@ public class DigitalPad extends VirtualControllerElement { private final Paint paint = new Paint(); public DigitalPad(VirtualController controller, Context context) { - super(controller, context); + super(controller, context, EID_DPAD); } public void addDigitalPadListener(DigitalPadListener listener) { diff --git a/app/src/main/java/com/limelight/binding/input/virtual_controller/LeftAnalogStick.java b/app/src/main/java/com/limelight/binding/input/virtual_controller/LeftAnalogStick.java index c1c5c2f2..c8d0d5b6 100644 --- a/app/src/main/java/com/limelight/binding/input/virtual_controller/LeftAnalogStick.java +++ b/app/src/main/java/com/limelight/binding/input/virtual_controller/LeftAnalogStick.java @@ -10,7 +10,7 @@ import com.limelight.nvstream.input.ControllerPacket; public class LeftAnalogStick extends AnalogStick { public LeftAnalogStick(final VirtualController controller, final Context context) { - super(controller, context); + super(controller, context, EID_LS); addAnalogStickListener(new AnalogStick.AnalogStickListener() { @Override diff --git a/app/src/main/java/com/limelight/binding/input/virtual_controller/LeftTrigger.java b/app/src/main/java/com/limelight/binding/input/virtual_controller/LeftTrigger.java index 5db70f7f..ba717275 100644 --- a/app/src/main/java/com/limelight/binding/input/virtual_controller/LeftTrigger.java +++ b/app/src/main/java/com/limelight/binding/input/virtual_controller/LeftTrigger.java @@ -8,7 +8,7 @@ import android.content.Context; public class LeftTrigger extends DigitalButton { public LeftTrigger(final VirtualController controller, final int layer, final Context context) { - super(controller, layer, context); + super(controller, EID_LT, layer, context); addDigitalButtonListener(new DigitalButton.DigitalButtonListener() { @Override public void onClick() { diff --git a/app/src/main/java/com/limelight/binding/input/virtual_controller/RightAnalogStick.java b/app/src/main/java/com/limelight/binding/input/virtual_controller/RightAnalogStick.java index b6cf83fd..91e5937e 100644 --- a/app/src/main/java/com/limelight/binding/input/virtual_controller/RightAnalogStick.java +++ b/app/src/main/java/com/limelight/binding/input/virtual_controller/RightAnalogStick.java @@ -10,7 +10,7 @@ import com.limelight.nvstream.input.ControllerPacket; public class RightAnalogStick extends AnalogStick { public RightAnalogStick(final VirtualController controller, final Context context) { - super(controller, context); + super(controller, context, EID_RS); addAnalogStickListener(new AnalogStick.AnalogStickListener() { @Override diff --git a/app/src/main/java/com/limelight/binding/input/virtual_controller/RightTrigger.java b/app/src/main/java/com/limelight/binding/input/virtual_controller/RightTrigger.java index 4ad3496a..790ce383 100644 --- a/app/src/main/java/com/limelight/binding/input/virtual_controller/RightTrigger.java +++ b/app/src/main/java/com/limelight/binding/input/virtual_controller/RightTrigger.java @@ -8,7 +8,7 @@ import android.content.Context; public class RightTrigger extends DigitalButton { public RightTrigger(final VirtualController controller, final int layer, final Context context) { - super(controller, layer, context); + super(controller, EID_RT, layer, context); addDigitalButtonListener(new DigitalButton.DigitalButtonListener() { @Override public void onClick() { diff --git a/app/src/main/java/com/limelight/binding/input/virtual_controller/VirtualController.java b/app/src/main/java/com/limelight/binding/input/virtual_controller/VirtualController.java index 62caa92c..b5d334da 100644 --- a/app/src/main/java/com/limelight/binding/input/virtual_controller/VirtualController.java +++ b/app/src/main/java/com/limelight/binding/input/virtual_controller/VirtualController.java @@ -68,6 +68,7 @@ public class VirtualController { if (currentMode == ControllerMode.Configuration) { currentMode = ControllerMode.Active; + VirtualControllerConfigurationLoader.saveProfile(VirtualController.this, context); message = "Exiting configuration mode"; } else { currentMode = ControllerMode.Configuration; @@ -124,7 +125,11 @@ public class VirtualController { params.topMargin = 15; relative_layout.addView(buttonConfigure, params); + // Start with the default layout VirtualControllerConfigurationLoader.createDefaultLayout(this, context); + + // Apply user preferences onto the default layout + VirtualControllerConfigurationLoader.loadFromPreferences(this, context); } public ControllerMode getControllerMode() { diff --git a/app/src/main/java/com/limelight/binding/input/virtual_controller/VirtualControllerConfigurationLoader.java b/app/src/main/java/com/limelight/binding/input/virtual_controller/VirtualControllerConfigurationLoader.java index 7a40ee9d..4e024893 100644 --- a/app/src/main/java/com/limelight/binding/input/virtual_controller/VirtualControllerConfigurationLoader.java +++ b/app/src/main/java/com/limelight/binding/input/virtual_controller/VirtualControllerConfigurationLoader.java @@ -4,14 +4,19 @@ package com.limelight.binding.input.virtual_controller; +import android.app.Activity; import android.content.Context; +import android.content.SharedPreferences; import android.util.DisplayMetrics; import com.limelight.nvstream.input.ControllerPacket; import com.limelight.preferences.PreferenceConfiguration; +import org.json.JSONException; +import org.json.JSONObject; + public class VirtualControllerConfigurationLoader { - private static final String PROFILE_PATH = "profiles"; + public static final String OSC_PREFERENCE = "OSC"; private static int getPercent( int percent, @@ -59,6 +64,7 @@ public class VirtualControllerConfigurationLoader { } private static DigitalButton createDigitalButton( + final int elementId, final int keyShort, final int keyLong, final int layer, @@ -66,7 +72,7 @@ public class VirtualControllerConfigurationLoader { final int icon, final VirtualController controller, final Context context) { - DigitalButton button = new DigitalButton(controller, layer, context); + DigitalButton button = new DigitalButton(controller, elementId, layer, context); button.setText(text); button.setIcon(icon); @@ -162,6 +168,7 @@ public class VirtualControllerConfigurationLoader { ); controller.addElement(createDigitalButton( + VirtualControllerElement.EID_A, ControllerPacket.A_FLAG, 0, 1, "A", -1, controller, context), getPercent(BUTTON_BASE_X, screen.widthPixels) + getPercent(BUTTON_WIDTH, screen.widthPixels), getPercent(BUTTON_BASE_Y, screen.heightPixels) + 2 * getPercent(BUTTON_HEIGHT, screen.heightPixels), @@ -170,6 +177,7 @@ public class VirtualControllerConfigurationLoader { ); controller.addElement(createDigitalButton( + VirtualControllerElement.EID_B, ControllerPacket.B_FLAG, 0, 1, "B", -1, controller, context), getPercent(BUTTON_BASE_X, screen.widthPixels) + 2 * getPercent(BUTTON_WIDTH, screen.widthPixels), getPercent(BUTTON_BASE_Y, screen.heightPixels) + getPercent(BUTTON_HEIGHT, screen.heightPixels), @@ -178,6 +186,7 @@ public class VirtualControllerConfigurationLoader { ); controller.addElement(createDigitalButton( + VirtualControllerElement.EID_X, ControllerPacket.X_FLAG, 0, 1, "X", -1, controller, context), getPercent(BUTTON_BASE_X, screen.widthPixels), getPercent(BUTTON_BASE_Y, screen.heightPixels) + getPercent(BUTTON_HEIGHT, screen.heightPixels), @@ -186,6 +195,7 @@ public class VirtualControllerConfigurationLoader { ); controller.addElement(createDigitalButton( + VirtualControllerElement.EID_Y, ControllerPacket.Y_FLAG, 0, 1, "Y", -1, controller, context), getPercent(BUTTON_BASE_X, screen.widthPixels) + getPercent(BUTTON_WIDTH, screen.widthPixels), getPercent(BUTTON_BASE_Y, screen.heightPixels), @@ -210,6 +220,7 @@ public class VirtualControllerConfigurationLoader { ); controller.addElement(createDigitalButton( + VirtualControllerElement.EID_LB, ControllerPacket.LB_FLAG, 0, 1, "LB", -1, controller, context), getPercent(BUTTON_BASE_X, screen.widthPixels), getPercent(BUTTON_BASE_Y, screen.heightPixels) + 2 * getPercent(BUTTON_HEIGHT, screen.heightPixels), @@ -218,6 +229,7 @@ public class VirtualControllerConfigurationLoader { ); controller.addElement(createDigitalButton( + VirtualControllerElement.EID_RB, ControllerPacket.RB_FLAG, 0, 1, "RB", -1, controller, context), getPercent(BUTTON_BASE_X, screen.widthPixels) + 2 * getPercent(BUTTON_WIDTH, screen.widthPixels), getPercent(BUTTON_BASE_Y, screen.heightPixels) + 2 * getPercent(BUTTON_HEIGHT, screen.heightPixels), @@ -240,6 +252,7 @@ public class VirtualControllerConfigurationLoader { ); controller.addElement(createDigitalButton( + VirtualControllerElement.EID_BACK, ControllerPacket.BACK_FLAG, 0, 2, "BACK", -1, controller, context), getPercent(40, screen.widthPixels), getPercent(90, screen.heightPixels), @@ -248,6 +261,7 @@ public class VirtualControllerConfigurationLoader { ); controller.addElement(createDigitalButton( + VirtualControllerElement.EID_START, ControllerPacket.PLAY_FLAG, 0, 3, "START", -1, controller, context), getPercent(40, screen.widthPixels) + getPercent(10, screen.widthPixels), getPercent(90, screen.heightPixels), @@ -257,6 +271,7 @@ public class VirtualControllerConfigurationLoader { } else { controller.addElement(createDigitalButton( + VirtualControllerElement.EID_LSB, ControllerPacket.LS_CLK_FLAG, 0, 1, "L3", -1, controller, context), getPercent(2, screen.widthPixels), getPercent(80, screen.heightPixels), @@ -265,6 +280,7 @@ public class VirtualControllerConfigurationLoader { ); controller.addElement(createDigitalButton( + VirtualControllerElement.EID_RSB, ControllerPacket.RS_CLK_FLAG, 0, 1, "R3", -1, controller, context), getPercent(89, screen.widthPixels), getPercent(80, screen.heightPixels), @@ -274,34 +290,39 @@ public class VirtualControllerConfigurationLoader { } } - /* - NOT IMPLEMENTED YET, - this should later be used to store and load a profile for the virtual controller - public static void saveProfile(final String name, - final VirtualController controller, + public static void saveProfile(final VirtualController controller, final Context context) { + SharedPreferences.Editor prefEditor = context.getSharedPreferences(OSC_PREFERENCE, Activity.MODE_PRIVATE).edit(); - SharedPreferences preferences = context.getSharedPreferences(PROFILE_PATH + "/" + - name, Activity.MODE_PRIVATE); - - JSONArray elementConfigurations = new JSONArray(); for (VirtualControllerElement element : controller.getElements()) { - JSONObject elementConfiguration = new JSONObject(); + String prefKey = ""+element.elementId; try { - elementConfiguration.put("TYPE", element.getClass().getName()); - elementConfiguration.put("CONFIGURATION", element.getConfiguration()); - elementConfigurations.put(elementConfiguration); - } catch (Exception e) { + prefEditor.putString(prefKey, element.getConfiguration().toString()); + } catch (JSONException e) { e.printStackTrace(); } } - SharedPreferences.Editor editor= preferences.edit(); - editor.putString("ELEMENTS", elementConfigurations.toString()); + prefEditor.apply(); } - public static void loadFromPreferences(final VirtualController controller) { + public static void loadFromPreferences(final VirtualController controller, final Context context) { + SharedPreferences pref = context.getSharedPreferences(OSC_PREFERENCE, Activity.MODE_PRIVATE); + for (VirtualControllerElement element : controller.getElements()) { + String prefKey = ""+element.elementId; + + String jsonConfig = pref.getString(prefKey, null); + if (jsonConfig != null) { + try { + element.loadConfiguration(new JSONObject(jsonConfig)); + } catch (JSONException e) { + e.printStackTrace(); + + // Remove the corrupt element from the preferences + pref.edit().remove(prefKey).apply(); + } + } + } } - */ } \ No newline at end of file diff --git a/app/src/main/java/com/limelight/binding/input/virtual_controller/VirtualControllerElement.java b/app/src/main/java/com/limelight/binding/input/virtual_controller/VirtualControllerElement.java index aa220577..e026b35b 100644 --- a/app/src/main/java/com/limelight/binding/input/virtual_controller/VirtualControllerElement.java +++ b/app/src/main/java/com/limelight/binding/input/virtual_controller/VirtualControllerElement.java @@ -14,10 +14,30 @@ import android.view.MotionEvent; import android.view.View; import android.widget.RelativeLayout; +import org.json.JSONException; +import org.json.JSONObject; + public abstract class VirtualControllerElement extends View { protected static boolean _PRINT_DEBUG_INFORMATION = false; + public static final int EID_DPAD = 1; + public static final int EID_LT = 2; + public static final int EID_RT = 3; + public static final int EID_LB = 4; + public static final int EID_RB = 5; + public static final int EID_A = 6; + public static final int EID_B = 7; + public static final int EID_X = 8; + public static final int EID_Y = 9; + public static final int EID_BACK = 10; + public static final int EID_START = 11; + public static final int EID_LS = 12; + public static final int EID_RS = 13; + public static final int EID_LSB = 14; + public static final int EID_RSB = 15; + protected VirtualController virtualController; + protected final int elementId; private final Paint paint = new Paint(); @@ -40,10 +60,11 @@ public abstract class VirtualControllerElement extends View { private Mode currentMode = Mode.Normal; - protected VirtualControllerElement(VirtualController controller, Context context) { + protected VirtualControllerElement(VirtualController controller, Context context, int elementId) { super(context); this.virtualController = controller; + this.elementId = elementId; } protected void moveElement(int pressed_x, int pressed_y, int x, int y) { @@ -278,13 +299,28 @@ public abstract class VirtualControllerElement extends View { return getWidth() > getHeight() ? getHeight() : getWidth(); } - /** - public JSONObject getConfiguration () { - JSONObject configuration = new JSONObject(); - return configuration; - } - public void loadConfiguration (JSONObject configuration) { - } - */ + public JSONObject getConfiguration() throws JSONException { + JSONObject configuration = new JSONObject(); + + RelativeLayout.LayoutParams layoutParams = (RelativeLayout.LayoutParams) getLayoutParams(); + + configuration.put("LEFT", layoutParams.leftMargin); + configuration.put("TOP", layoutParams.topMargin); + configuration.put("WIDTH", layoutParams.width); + configuration.put("HEIGHT", layoutParams.height); + + return configuration; + } + + public void loadConfiguration(JSONObject configuration) throws JSONException { + RelativeLayout.LayoutParams layoutParams = (RelativeLayout.LayoutParams) getLayoutParams(); + + layoutParams.leftMargin = configuration.getInt("LEFT"); + layoutParams.topMargin = configuration.getInt("TOP"); + layoutParams.width = configuration.getInt("WIDTH"); + layoutParams.height = configuration.getInt("HEIGHT"); + + requestLayout(); + } }