Add a simple, JSON-based serialization mechanism.
This commit is contained in:
parent
be7eacddb7
commit
cb5b087af1
@ -16,6 +16,18 @@ import com.codigoparallevar.minicards.parts.Placeholder;
|
|||||||
import com.codigoparallevar.minicards.parts.buttons.RoundButton;
|
import com.codigoparallevar.minicards.parts.buttons.RoundButton;
|
||||||
import com.codigoparallevar.minicards.parts.types.Position;
|
import com.codigoparallevar.minicards.parts.types.Position;
|
||||||
|
|
||||||
|
import org.json.JSONArray;
|
||||||
|
import org.json.JSONException;
|
||||||
|
import org.json.JSONObject;
|
||||||
|
|
||||||
|
import java.io.File;
|
||||||
|
import java.io.FileInputStream;
|
||||||
|
import java.io.FileNotFoundException;
|
||||||
|
import java.io.FileOutputStream;
|
||||||
|
import java.io.FileReader;
|
||||||
|
import java.io.IOException;
|
||||||
|
import java.io.OutputStream;
|
||||||
|
import java.io.UnsupportedEncodingException;
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
|
|
||||||
class PartCanvasView extends View {
|
class PartCanvasView extends View {
|
||||||
@ -35,13 +47,62 @@ class PartCanvasView extends View {
|
|||||||
@Nullable
|
@Nullable
|
||||||
private MotionMode.Type motionMode;
|
private MotionMode.Type motionMode;
|
||||||
|
|
||||||
|
@NonNull
|
||||||
|
private String name = "default";
|
||||||
private final static float touchTimeForLongTouchInMillis = 500;
|
private final static float touchTimeForLongTouchInMillis = 500;
|
||||||
|
|
||||||
public PartCanvasView(Context context) {
|
public PartCanvasView(Context context) {
|
||||||
super(context);
|
super(context);
|
||||||
this.setBackgroundColor(Color.rgb(4, 69, 99));
|
this.setBackgroundColor(Color.rgb(4, 69, 99));
|
||||||
parts.add(new Placeholder(50, 50, 750, 500));
|
|
||||||
parts.add(new RoundButton(500, 1200, 80, 100));
|
if (!loadState()){
|
||||||
|
parts.add(new Placeholder(50, 50, 750, 500));
|
||||||
|
parts.add(new RoundButton(500, 1200, 80, 100));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private boolean loadState(){
|
||||||
|
File filesDir = getContext().getFilesDir();
|
||||||
|
File file = new File(filesDir + "/" + name);
|
||||||
|
FileReader fileIn = null;
|
||||||
|
try {
|
||||||
|
fileIn = new FileReader(file);
|
||||||
|
char[] data = new char[(int) file.length()];
|
||||||
|
fileIn.read(data);
|
||||||
|
JSONArray jsonParts = new JSONArray(new String(data ));
|
||||||
|
for (int i = 0; i < jsonParts.length(); i++){
|
||||||
|
deserializeObject(jsonParts.getJSONObject(i));
|
||||||
|
}
|
||||||
|
} catch (IOException e) {
|
||||||
|
parts.clear();
|
||||||
|
Log.w("PartCanvasView", e.getMessage());
|
||||||
|
return false;
|
||||||
|
} catch (JSONException e) {
|
||||||
|
parts.clear();
|
||||||
|
Log.w("PartCanvasView", e.getMessage());
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
try {
|
||||||
|
fileIn.close();
|
||||||
|
} catch (IOException e) {
|
||||||
|
Log.w("PartCanvasView", e.getMessage());
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
private void deserializeObject(JSONObject jsonObject) throws JSONException {
|
||||||
|
String type = jsonObject.getString("_type");
|
||||||
|
if(type.equals(RoundButton.class.getName())) {
|
||||||
|
parts.add(RoundButton.deserialize(jsonObject.getJSONObject("_data")));
|
||||||
|
}
|
||||||
|
else if (type.equals(Placeholder.class.getName())) {
|
||||||
|
parts.add(Placeholder.deserialize(jsonObject.getJSONObject("_data")));
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
throw new JSONException("Expected known class, found " + type);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@ -110,6 +171,11 @@ class PartCanvasView extends View {
|
|||||||
motionMode = null;
|
motionMode = null;
|
||||||
selectedPart = null;
|
selectedPart = null;
|
||||||
}
|
}
|
||||||
|
try {
|
||||||
|
saveState();
|
||||||
|
} catch (IOException e) {
|
||||||
|
Log.w("PartCanvasView", e.getMessage());
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case MotionEvent.ACTION_MOVE:
|
case MotionEvent.ACTION_MOVE:
|
||||||
@ -137,6 +203,33 @@ class PartCanvasView extends View {
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private void saveState() throws IOException {
|
||||||
|
File filesDir = getContext().getFilesDir();
|
||||||
|
FileOutputStream fileOut = new FileOutputStream(filesDir + "/" + name);
|
||||||
|
|
||||||
|
byte[] serialized = serializeState();
|
||||||
|
fileOut.write(serialized);
|
||||||
|
|
||||||
|
fileOut.close();
|
||||||
|
}
|
||||||
|
|
||||||
|
private byte[] serializeState() throws IOException {
|
||||||
|
JSONArray partArray = new JSONArray();
|
||||||
|
for (Part part : parts) {
|
||||||
|
JSONObject serializedPart = new JSONObject();
|
||||||
|
try {
|
||||||
|
serializedPart.put("_type", part.getClass().getName());
|
||||||
|
serializedPart.put("_data", part.serialize());
|
||||||
|
} catch (JSONException e) {
|
||||||
|
throw new IOException(e.getMessage(), e.getCause());
|
||||||
|
}
|
||||||
|
|
||||||
|
partArray.put(serializedPart);
|
||||||
|
}
|
||||||
|
|
||||||
|
return partArray.toString().getBytes("UTF-8");
|
||||||
|
}
|
||||||
|
|
||||||
@Nullable
|
@Nullable
|
||||||
private MotionMode.Type getMotionMode(boolean canWait) {
|
private MotionMode.Type getMotionMode(boolean canWait) {
|
||||||
if (selectedPart == null){
|
if (selectedPart == null){
|
||||||
|
@ -2,6 +2,9 @@ package com.codigoparallevar.minicards.parts;
|
|||||||
|
|
||||||
import android.graphics.Canvas;
|
import android.graphics.Canvas;
|
||||||
|
|
||||||
|
import org.json.JSONException;
|
||||||
|
import org.json.JSONObject;
|
||||||
|
|
||||||
public interface Part {
|
public interface Part {
|
||||||
int getLeft();
|
int getLeft();
|
||||||
int getRight();
|
int getRight();
|
||||||
@ -13,4 +16,6 @@ public interface Part {
|
|||||||
void move(int x, int y);
|
void move(int x, int y);
|
||||||
|
|
||||||
void touched();
|
void touched();
|
||||||
|
|
||||||
|
JSONObject serialize() throws JSONException;
|
||||||
}
|
}
|
||||||
|
@ -5,6 +5,9 @@ import android.graphics.Color;
|
|||||||
import android.graphics.Paint;
|
import android.graphics.Paint;
|
||||||
import android.util.Log;
|
import android.util.Log;
|
||||||
|
|
||||||
|
import org.json.JSONException;
|
||||||
|
import org.json.JSONObject;
|
||||||
|
|
||||||
public class Placeholder implements Part {
|
public class Placeholder implements Part {
|
||||||
private int _left;
|
private int _left;
|
||||||
private int _top;
|
private int _top;
|
||||||
@ -73,4 +76,25 @@ public class Placeholder implements Part {
|
|||||||
public void touched() {
|
public void touched() {
|
||||||
Log.d("Placeholder", "Placeholder touched");
|
Log.d("Placeholder", "Placeholder touched");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public JSONObject serialize() throws JSONException {
|
||||||
|
JSONObject serialized = new JSONObject();
|
||||||
|
|
||||||
|
serialized.put("left", _left);
|
||||||
|
serialized.put("top", _top);
|
||||||
|
serialized.put("right", _right);
|
||||||
|
serialized.put("bottom", _bottom);
|
||||||
|
|
||||||
|
return serialized;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static Part deserialize(JSONObject data) throws JSONException {
|
||||||
|
int left = data.getInt("left");
|
||||||
|
int top = data.getInt("top");
|
||||||
|
int right = data.getInt("right");
|
||||||
|
int bottom = data.getInt("bottom");
|
||||||
|
|
||||||
|
return new Placeholder(left, top, right, bottom);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -7,6 +7,9 @@ import android.util.Log;
|
|||||||
|
|
||||||
import com.codigoparallevar.minicards.parts.Part;
|
import com.codigoparallevar.minicards.parts.Part;
|
||||||
|
|
||||||
|
import org.json.JSONException;
|
||||||
|
import org.json.JSONObject;
|
||||||
|
|
||||||
public class RoundButton implements Part {
|
public class RoundButton implements Part {
|
||||||
|
|
||||||
|
|
||||||
@ -66,4 +69,27 @@ public class RoundButton implements Part {
|
|||||||
public void touched() {
|
public void touched() {
|
||||||
Log.d("RoundButton", "Round button touched");
|
Log.d("RoundButton", "Round button touched");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public JSONObject serialize() throws JSONException {
|
||||||
|
JSONObject serialized = new JSONObject();
|
||||||
|
|
||||||
|
serialized.put("x_center", _xCenter);
|
||||||
|
serialized.put("y_center", _yCenter);
|
||||||
|
serialized.put("inner_radius", _innerRadius);
|
||||||
|
serialized.put("outer_radius", _outerRadius);
|
||||||
|
serialized.put("outer_radius_thickness", _outerRadiusThickness);
|
||||||
|
|
||||||
|
return serialized;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static Part deserialize(JSONObject data) throws JSONException {
|
||||||
|
int xCenter = data.getInt("x_center");
|
||||||
|
int yCenter = data.getInt("y_center");
|
||||||
|
|
||||||
|
int innerRadius = data.getInt("inner_radius");
|
||||||
|
int outerRadius = data.getInt("outer_radius");
|
||||||
|
|
||||||
|
return new RoundButton(xCenter, yCenter, innerRadius, outerRadius);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user