Persist OSC configuration between launches

This commit is contained in:
Cameron Gutman 2018-02-25 13:07:07 -08:00
parent bbec3402d9
commit 75057f2d39
10 changed files with 100 additions and 38 deletions

View File

@ -164,8 +164,8 @@ public class AnalogStick extends VirtualControllerElement {
} }
} }
public AnalogStick(VirtualController controller, Context context) { public AnalogStick(VirtualController controller, Context context, int elementId) {
super(controller, context); super(controller, context, elementId);
// reset stick position // reset stick position
position_stick_x = getWidth() / 2; position_stick_x = getWidth() / 2;
position_stick_y = getHeight() / 2; position_stick_y = getHeight() / 2;

View File

@ -120,8 +120,8 @@ public class DigitalButton extends VirtualControllerElement {
} }
} }
public DigitalButton(VirtualController controller, int layer, Context context) { public DigitalButton(VirtualController controller, int elementId, int layer, Context context) {
super(controller, context); super(controller, context, elementId);
this.layer = layer; this.layer = layer;
} }

View File

@ -27,7 +27,7 @@ public class DigitalPad extends VirtualControllerElement {
private final Paint paint = new Paint(); private final Paint paint = new Paint();
public DigitalPad(VirtualController controller, Context context) { public DigitalPad(VirtualController controller, Context context) {
super(controller, context); super(controller, context, EID_DPAD);
} }
public void addDigitalPadListener(DigitalPadListener listener) { public void addDigitalPadListener(DigitalPadListener listener) {

View File

@ -10,7 +10,7 @@ import com.limelight.nvstream.input.ControllerPacket;
public class LeftAnalogStick extends AnalogStick { public class LeftAnalogStick extends AnalogStick {
public LeftAnalogStick(final VirtualController controller, final Context context) { public LeftAnalogStick(final VirtualController controller, final Context context) {
super(controller, context); super(controller, context, EID_LS);
addAnalogStickListener(new AnalogStick.AnalogStickListener() { addAnalogStickListener(new AnalogStick.AnalogStickListener() {
@Override @Override

View File

@ -8,7 +8,7 @@ import android.content.Context;
public class LeftTrigger extends DigitalButton { public class LeftTrigger extends DigitalButton {
public LeftTrigger(final VirtualController controller, final int layer, final Context context) { 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() { addDigitalButtonListener(new DigitalButton.DigitalButtonListener() {
@Override @Override
public void onClick() { public void onClick() {

View File

@ -10,7 +10,7 @@ import com.limelight.nvstream.input.ControllerPacket;
public class RightAnalogStick extends AnalogStick { public class RightAnalogStick extends AnalogStick {
public RightAnalogStick(final VirtualController controller, final Context context) { public RightAnalogStick(final VirtualController controller, final Context context) {
super(controller, context); super(controller, context, EID_RS);
addAnalogStickListener(new AnalogStick.AnalogStickListener() { addAnalogStickListener(new AnalogStick.AnalogStickListener() {
@Override @Override

View File

@ -8,7 +8,7 @@ import android.content.Context;
public class RightTrigger extends DigitalButton { public class RightTrigger extends DigitalButton {
public RightTrigger(final VirtualController controller, final int layer, final Context context) { 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() { addDigitalButtonListener(new DigitalButton.DigitalButtonListener() {
@Override @Override
public void onClick() { public void onClick() {

View File

@ -68,6 +68,7 @@ public class VirtualController {
if (currentMode == ControllerMode.Configuration) { if (currentMode == ControllerMode.Configuration) {
currentMode = ControllerMode.Active; currentMode = ControllerMode.Active;
VirtualControllerConfigurationLoader.saveProfile(VirtualController.this, context);
message = "Exiting configuration mode"; message = "Exiting configuration mode";
} else { } else {
currentMode = ControllerMode.Configuration; currentMode = ControllerMode.Configuration;
@ -124,7 +125,11 @@ public class VirtualController {
params.topMargin = 15; params.topMargin = 15;
relative_layout.addView(buttonConfigure, params); relative_layout.addView(buttonConfigure, params);
// Start with the default layout
VirtualControllerConfigurationLoader.createDefaultLayout(this, context); VirtualControllerConfigurationLoader.createDefaultLayout(this, context);
// Apply user preferences onto the default layout
VirtualControllerConfigurationLoader.loadFromPreferences(this, context);
} }
public ControllerMode getControllerMode() { public ControllerMode getControllerMode() {

View File

@ -4,14 +4,19 @@
package com.limelight.binding.input.virtual_controller; package com.limelight.binding.input.virtual_controller;
import android.app.Activity;
import android.content.Context; import android.content.Context;
import android.content.SharedPreferences;
import android.util.DisplayMetrics; import android.util.DisplayMetrics;
import com.limelight.nvstream.input.ControllerPacket; import com.limelight.nvstream.input.ControllerPacket;
import com.limelight.preferences.PreferenceConfiguration; import com.limelight.preferences.PreferenceConfiguration;
import org.json.JSONException;
import org.json.JSONObject;
public class VirtualControllerConfigurationLoader { public class VirtualControllerConfigurationLoader {
private static final String PROFILE_PATH = "profiles"; public static final String OSC_PREFERENCE = "OSC";
private static int getPercent( private static int getPercent(
int percent, int percent,
@ -59,6 +64,7 @@ public class VirtualControllerConfigurationLoader {
} }
private static DigitalButton createDigitalButton( private static DigitalButton createDigitalButton(
final int elementId,
final int keyShort, final int keyShort,
final int keyLong, final int keyLong,
final int layer, final int layer,
@ -66,7 +72,7 @@ public class VirtualControllerConfigurationLoader {
final int icon, final int icon,
final VirtualController controller, final VirtualController controller,
final Context context) { final Context context) {
DigitalButton button = new DigitalButton(controller, layer, context); DigitalButton button = new DigitalButton(controller, elementId, layer, context);
button.setText(text); button.setText(text);
button.setIcon(icon); button.setIcon(icon);
@ -162,6 +168,7 @@ public class VirtualControllerConfigurationLoader {
); );
controller.addElement(createDigitalButton( controller.addElement(createDigitalButton(
VirtualControllerElement.EID_A,
ControllerPacket.A_FLAG, 0, 1, "A", -1, controller, context), ControllerPacket.A_FLAG, 0, 1, "A", -1, controller, context),
getPercent(BUTTON_BASE_X, screen.widthPixels) + getPercent(BUTTON_WIDTH, screen.widthPixels), getPercent(BUTTON_BASE_X, screen.widthPixels) + getPercent(BUTTON_WIDTH, screen.widthPixels),
getPercent(BUTTON_BASE_Y, screen.heightPixels) + 2 * getPercent(BUTTON_HEIGHT, screen.heightPixels), getPercent(BUTTON_BASE_Y, screen.heightPixels) + 2 * getPercent(BUTTON_HEIGHT, screen.heightPixels),
@ -170,6 +177,7 @@ public class VirtualControllerConfigurationLoader {
); );
controller.addElement(createDigitalButton( controller.addElement(createDigitalButton(
VirtualControllerElement.EID_B,
ControllerPacket.B_FLAG, 0, 1, "B", -1, controller, context), ControllerPacket.B_FLAG, 0, 1, "B", -1, controller, context),
getPercent(BUTTON_BASE_X, screen.widthPixels) + 2 * getPercent(BUTTON_WIDTH, screen.widthPixels), getPercent(BUTTON_BASE_X, screen.widthPixels) + 2 * getPercent(BUTTON_WIDTH, screen.widthPixels),
getPercent(BUTTON_BASE_Y, screen.heightPixels) + getPercent(BUTTON_HEIGHT, screen.heightPixels), getPercent(BUTTON_BASE_Y, screen.heightPixels) + getPercent(BUTTON_HEIGHT, screen.heightPixels),
@ -178,6 +186,7 @@ public class VirtualControllerConfigurationLoader {
); );
controller.addElement(createDigitalButton( controller.addElement(createDigitalButton(
VirtualControllerElement.EID_X,
ControllerPacket.X_FLAG, 0, 1, "X", -1, controller, context), ControllerPacket.X_FLAG, 0, 1, "X", -1, controller, context),
getPercent(BUTTON_BASE_X, screen.widthPixels), getPercent(BUTTON_BASE_X, screen.widthPixels),
getPercent(BUTTON_BASE_Y, screen.heightPixels) + getPercent(BUTTON_HEIGHT, screen.heightPixels), getPercent(BUTTON_BASE_Y, screen.heightPixels) + getPercent(BUTTON_HEIGHT, screen.heightPixels),
@ -186,6 +195,7 @@ public class VirtualControllerConfigurationLoader {
); );
controller.addElement(createDigitalButton( controller.addElement(createDigitalButton(
VirtualControllerElement.EID_Y,
ControllerPacket.Y_FLAG, 0, 1, "Y", -1, controller, context), ControllerPacket.Y_FLAG, 0, 1, "Y", -1, controller, context),
getPercent(BUTTON_BASE_X, screen.widthPixels) + getPercent(BUTTON_WIDTH, screen.widthPixels), getPercent(BUTTON_BASE_X, screen.widthPixels) + getPercent(BUTTON_WIDTH, screen.widthPixels),
getPercent(BUTTON_BASE_Y, screen.heightPixels), getPercent(BUTTON_BASE_Y, screen.heightPixels),
@ -210,6 +220,7 @@ public class VirtualControllerConfigurationLoader {
); );
controller.addElement(createDigitalButton( controller.addElement(createDigitalButton(
VirtualControllerElement.EID_LB,
ControllerPacket.LB_FLAG, 0, 1, "LB", -1, controller, context), ControllerPacket.LB_FLAG, 0, 1, "LB", -1, controller, context),
getPercent(BUTTON_BASE_X, screen.widthPixels), getPercent(BUTTON_BASE_X, screen.widthPixels),
getPercent(BUTTON_BASE_Y, screen.heightPixels) + 2 * getPercent(BUTTON_HEIGHT, screen.heightPixels), getPercent(BUTTON_BASE_Y, screen.heightPixels) + 2 * getPercent(BUTTON_HEIGHT, screen.heightPixels),
@ -218,6 +229,7 @@ public class VirtualControllerConfigurationLoader {
); );
controller.addElement(createDigitalButton( controller.addElement(createDigitalButton(
VirtualControllerElement.EID_RB,
ControllerPacket.RB_FLAG, 0, 1, "RB", -1, controller, context), ControllerPacket.RB_FLAG, 0, 1, "RB", -1, controller, context),
getPercent(BUTTON_BASE_X, screen.widthPixels) + 2 * getPercent(BUTTON_WIDTH, screen.widthPixels), getPercent(BUTTON_BASE_X, screen.widthPixels) + 2 * getPercent(BUTTON_WIDTH, screen.widthPixels),
getPercent(BUTTON_BASE_Y, screen.heightPixels) + 2 * getPercent(BUTTON_HEIGHT, screen.heightPixels), getPercent(BUTTON_BASE_Y, screen.heightPixels) + 2 * getPercent(BUTTON_HEIGHT, screen.heightPixels),
@ -240,6 +252,7 @@ public class VirtualControllerConfigurationLoader {
); );
controller.addElement(createDigitalButton( controller.addElement(createDigitalButton(
VirtualControllerElement.EID_BACK,
ControllerPacket.BACK_FLAG, 0, 2, "BACK", -1, controller, context), ControllerPacket.BACK_FLAG, 0, 2, "BACK", -1, controller, context),
getPercent(40, screen.widthPixels), getPercent(40, screen.widthPixels),
getPercent(90, screen.heightPixels), getPercent(90, screen.heightPixels),
@ -248,6 +261,7 @@ public class VirtualControllerConfigurationLoader {
); );
controller.addElement(createDigitalButton( controller.addElement(createDigitalButton(
VirtualControllerElement.EID_START,
ControllerPacket.PLAY_FLAG, 0, 3, "START", -1, controller, context), ControllerPacket.PLAY_FLAG, 0, 3, "START", -1, controller, context),
getPercent(40, screen.widthPixels) + getPercent(10, screen.widthPixels), getPercent(40, screen.widthPixels) + getPercent(10, screen.widthPixels),
getPercent(90, screen.heightPixels), getPercent(90, screen.heightPixels),
@ -257,6 +271,7 @@ public class VirtualControllerConfigurationLoader {
} }
else { else {
controller.addElement(createDigitalButton( controller.addElement(createDigitalButton(
VirtualControllerElement.EID_LSB,
ControllerPacket.LS_CLK_FLAG, 0, 1, "L3", -1, controller, context), ControllerPacket.LS_CLK_FLAG, 0, 1, "L3", -1, controller, context),
getPercent(2, screen.widthPixels), getPercent(2, screen.widthPixels),
getPercent(80, screen.heightPixels), getPercent(80, screen.heightPixels),
@ -265,6 +280,7 @@ public class VirtualControllerConfigurationLoader {
); );
controller.addElement(createDigitalButton( controller.addElement(createDigitalButton(
VirtualControllerElement.EID_RSB,
ControllerPacket.RS_CLK_FLAG, 0, 1, "R3", -1, controller, context), ControllerPacket.RS_CLK_FLAG, 0, 1, "R3", -1, controller, context),
getPercent(89, screen.widthPixels), getPercent(89, screen.widthPixels),
getPercent(80, screen.heightPixels), getPercent(80, screen.heightPixels),
@ -274,34 +290,39 @@ public class VirtualControllerConfigurationLoader {
} }
} }
/* public static void saveProfile(final VirtualController controller,
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,
final Context context) { 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()) { for (VirtualControllerElement element : controller.getElements()) {
JSONObject elementConfiguration = new JSONObject(); String prefKey = ""+element.elementId;
try { try {
elementConfiguration.put("TYPE", element.getClass().getName()); prefEditor.putString(prefKey, element.getConfiguration().toString());
elementConfiguration.put("CONFIGURATION", element.getConfiguration()); } catch (JSONException e) {
elementConfigurations.put(elementConfiguration);
} catch (Exception e) {
e.printStackTrace(); e.printStackTrace();
} }
} }
SharedPreferences.Editor editor= preferences.edit(); prefEditor.apply();
editor.putString("ELEMENTS", elementConfigurations.toString());
} }
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();
}
}
}
} }
*/
} }

View File

@ -14,10 +14,30 @@ import android.view.MotionEvent;
import android.view.View; import android.view.View;
import android.widget.RelativeLayout; import android.widget.RelativeLayout;
import org.json.JSONException;
import org.json.JSONObject;
public abstract class VirtualControllerElement extends View { public abstract class VirtualControllerElement extends View {
protected static boolean _PRINT_DEBUG_INFORMATION = false; 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 VirtualController virtualController;
protected final int elementId;
private final Paint paint = new Paint(); private final Paint paint = new Paint();
@ -40,10 +60,11 @@ public abstract class VirtualControllerElement extends View {
private Mode currentMode = Mode.Normal; private Mode currentMode = Mode.Normal;
protected VirtualControllerElement(VirtualController controller, Context context) { protected VirtualControllerElement(VirtualController controller, Context context, int elementId) {
super(context); super(context);
this.virtualController = controller; this.virtualController = controller;
this.elementId = elementId;
} }
protected void moveElement(int pressed_x, int pressed_y, int x, int y) { 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(); 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();
}
} }