diff --git a/app/src/main/java/com/simplemobiletools/draw/MyCanvas.java b/app/src/main/java/com/simplemobiletools/draw/MyCanvas.java index fc9f0c6..92b7b52 100644 --- a/app/src/main/java/com/simplemobiletools/draw/MyCanvas.java +++ b/app/src/main/java/com/simplemobiletools/draw/MyCanvas.java @@ -94,6 +94,10 @@ public class MyCanvas extends View { return bitmap; } + public Map getPaths() { + return mPaths; + } + @Override protected void onDraw(Canvas canvas) { super.onDraw(canvas); diff --git a/app/src/main/java/com/simplemobiletools/draw/MyPath.java b/app/src/main/java/com/simplemobiletools/draw/MyPath.java index ec3fa6b..df70de8 100644 --- a/app/src/main/java/com/simplemobiletools/draw/MyPath.java +++ b/app/src/main/java/com/simplemobiletools/draw/MyPath.java @@ -2,6 +2,11 @@ package com.simplemobiletools.draw; import android.graphics.Path; +import com.simplemobiletools.draw.actions.Action; +import com.simplemobiletools.draw.actions.Line; +import com.simplemobiletools.draw.actions.Move; +import com.simplemobiletools.draw.actions.Quad; + import java.io.IOException; import java.io.ObjectInputStream; import java.io.Serializable; @@ -45,54 +50,7 @@ class MyPath extends Path implements Serializable { super.quadTo(x1, y1, x2, y2); } - private interface Action extends Serializable { - void perform(Path path); - } - - private static final class Move implements Action { - - private final float x, y; - - Move(float x, float y) { - this.x = x; - this.y = y; - } - - @Override - public void perform(Path path) { - path.moveTo(x, y); - } - } - - private static final class Line implements Action { - - private final float x, y; - - Line(float x, float y) { - this.x = x; - this.y = y; - } - - @Override - public void perform(Path path) { - path.lineTo(x, y); - } - } - - private static final class Quad implements Action { - - private final float x1, y1, x2, y2; - - private Quad(float x1, float y1, float x2, float y2) { - this.x1 = x1; - this.y1 = y1; - this.x2 = x2; - this.y2 = y2; - } - - @Override - public void perform(Path path) { - path.quadTo(x1, y1, x2, y2); - } + List getActions() { + return actions; } } diff --git a/app/src/main/java/com/simplemobiletools/draw/Svg.java b/app/src/main/java/com/simplemobiletools/draw/Svg.java new file mode 100644 index 0000000..4928089 --- /dev/null +++ b/app/src/main/java/com/simplemobiletools/draw/Svg.java @@ -0,0 +1,69 @@ +package com.simplemobiletools.draw; + +import android.graphics.drawable.ColorDrawable; + +import com.simplemobiletools.draw.actions.Action; + +import java.io.BufferedWriter; +import java.io.File; +import java.io.FileOutputStream; +import java.io.IOException; +import java.io.OutputStreamWriter; +import java.io.Writer; +import java.util.Map; + +public class Svg { + + public static void saveSvg(File output, MyCanvas canvas) + throws Exception { + // This might throw ClassCastException + int backgroundColor = ((ColorDrawable) canvas.getBackground()).getColor(); + + // This might throw IOException + FileOutputStream out = new FileOutputStream(output); + BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(out)); + writeSvg(writer, backgroundColor, canvas.getPaths(), canvas.getWidth(), canvas.getHeight()); + writer.close(); + } + + private static void writeSvg(Writer writer, int backgroundColor, + Map paths, int width, int height) + throws IOException { + writer.write(""); + + // Background color (use a rect) + writer.write(""); + + // Write the paths + for (Map.Entry entry : paths.entrySet()) { + writePath(writer, entry.getKey(), entry.getValue()); + } + writer.write(""); + } + + private static void writePath(Writer writer, MyPath path, PaintOptions options) + throws IOException { + + writer.write(""); + } +} diff --git a/app/src/main/java/com/simplemobiletools/draw/actions/Action.java b/app/src/main/java/com/simplemobiletools/draw/actions/Action.java new file mode 100644 index 0000000..cad7a63 --- /dev/null +++ b/app/src/main/java/com/simplemobiletools/draw/actions/Action.java @@ -0,0 +1,12 @@ +package com.simplemobiletools.draw.actions; + +import android.graphics.Path; + +import java.io.IOException; +import java.io.Serializable; +import java.io.Writer; + +public interface Action extends Serializable { + void perform(Path path); + void perform(Writer writer) throws IOException; +} diff --git a/app/src/main/java/com/simplemobiletools/draw/actions/Line.java b/app/src/main/java/com/simplemobiletools/draw/actions/Line.java new file mode 100644 index 0000000..e5ca3d6 --- /dev/null +++ b/app/src/main/java/com/simplemobiletools/draw/actions/Line.java @@ -0,0 +1,29 @@ +package com.simplemobiletools.draw.actions; + +import android.graphics.Path; + +import java.io.IOException; +import java.io.Writer; + +public final class Line implements Action { + + private final float x, y; + + public Line(float x, float y) { + this.x = x; + this.y = y; + } + + @Override + public void perform(Path path) { + path.lineTo(x, y); + } + + @Override + public void perform(Writer writer) throws IOException { + writer.write("L"); + writer.write(String.valueOf(x)); + writer.write(","); + writer.write(String.valueOf(y)); + } +} diff --git a/app/src/main/java/com/simplemobiletools/draw/actions/Move.java b/app/src/main/java/com/simplemobiletools/draw/actions/Move.java new file mode 100644 index 0000000..69923ba --- /dev/null +++ b/app/src/main/java/com/simplemobiletools/draw/actions/Move.java @@ -0,0 +1,30 @@ +package com.simplemobiletools.draw.actions; + + +import android.graphics.Path; + +import java.io.IOException; +import java.io.Writer; + +public final class Move implements Action { + + private final float x, y; + + public Move(float x, float y) { + this.x = x; + this.y = y; + } + + @Override + public void perform(Path path) { + path.moveTo(x, y); + } + + @Override + public void perform(Writer writer) throws IOException { + writer.write('M'); + writer.write(String.valueOf(x)); + writer.write(','); + writer.write(String.valueOf(y)); + } +} diff --git a/app/src/main/java/com/simplemobiletools/draw/actions/Quad.java b/app/src/main/java/com/simplemobiletools/draw/actions/Quad.java new file mode 100644 index 0000000..28d53ff --- /dev/null +++ b/app/src/main/java/com/simplemobiletools/draw/actions/Quad.java @@ -0,0 +1,35 @@ +package com.simplemobiletools.draw.actions; + +import android.graphics.Path; + +import java.io.IOException; +import java.io.Writer; + +public final class Quad implements Action { + + private final float x1, y1, x2, y2; + + public Quad(float x1, float y1, float x2, float y2) { + this.x1 = x1; + this.y1 = y1; + this.x2 = x2; + this.y2 = y2; + } + + @Override + public void perform(Path path) { + path.quadTo(x1, y1, x2, y2); + } + + @Override + public void perform(Writer writer) throws IOException { + writer.write('Q'); + writer.write(String.valueOf(x1)); + writer.write(','); + writer.write(String.valueOf(y1)); + writer.write(' '); + writer.write(String.valueOf(x2)); + writer.write(','); + writer.write(String.valueOf(y2)); + } +} diff --git a/app/src/main/java/com/simplemobiletools/draw/activities/MainActivity.java b/app/src/main/java/com/simplemobiletools/draw/activities/MainActivity.java index ca4069f..f94792f 100644 --- a/app/src/main/java/com/simplemobiletools/draw/activities/MainActivity.java +++ b/app/src/main/java/com/simplemobiletools/draw/activities/MainActivity.java @@ -19,12 +19,14 @@ import android.view.MenuItem; import android.view.View; import android.widget.EditText; import android.widget.ImageView; +import android.widget.RadioGroup; import android.widget.SeekBar; import android.widget.Toast; import com.simplemobiletools.draw.Config; import com.simplemobiletools.draw.MyCanvas; import com.simplemobiletools.draw.R; +import com.simplemobiletools.draw.Svg; import com.simplemobiletools.draw.Utils; import java.io.ByteArrayOutputStream; @@ -50,6 +52,7 @@ public class MainActivity extends SimpleActivity implements MyCanvas.PathsChange @BindView(R.id.stroke_width_bar) SeekBar mStrokeWidthBar; private String curFileName; + private int curExtensionId; private int color; private float strokeWidth; @@ -163,6 +166,11 @@ public class MainActivity extends SimpleActivity implements MyCanvas.PathsChange final EditText fileNameET = (EditText) saveFileView.findViewById(R.id.file_name); fileNameET.setText(curFileName); + + final RadioGroup fileExtensionRG = (RadioGroup) saveFileView.findViewById(R.id.extension_radio_group); + if (curExtensionId != 0) { + fileExtensionRG.check(curExtensionId); + } builder.setView(saveFileView); builder.setPositiveButton(R.string.ok, null); @@ -174,10 +182,18 @@ public class MainActivity extends SimpleActivity implements MyCanvas.PathsChange @Override public void onClick(View v) { final String fileName = fileNameET.getText().toString().trim(); - if (!fileName.isEmpty()) { - if (saveFile(fileName + ".png")) { + final String extension; + switch (fileExtensionRG.getCheckedRadioButtonId()) { + default: + case R.id.extension_radio_png: extension = ".png"; break; + case R.id.extension_radio_svg: extension = ".svg"; break; + } + + if (saveFile(fileName, extension)) { curFileName = fileName; + curExtensionId = fileExtensionRG.getCheckedRadioButtonId(); + Utils.showToast(getApplicationContext(), R.string.saving_ok); alertDialog.dismiss(); } else { @@ -190,7 +206,7 @@ public class MainActivity extends SimpleActivity implements MyCanvas.PathsChange }); } - private boolean saveFile(final String fileName) { + private boolean saveFile(final String fileName, final String extension) { final String path = Environment.getExternalStorageDirectory().toString(); final File directory = new File(path, SAVE_FOLDER_NAME); if (!directory.exists()) { @@ -199,24 +215,41 @@ public class MainActivity extends SimpleActivity implements MyCanvas.PathsChange } } - final Bitmap bitmap = mMyCanvas.getBitmap(); - FileOutputStream out = null; - try { - final File file = new File(directory, fileName); - out = new FileOutputStream(file); - bitmap.compress(Bitmap.CompressFormat.PNG, 100, out); - MediaScannerConnection.scanFile(getApplicationContext(), new String[]{file.getAbsolutePath()}, null, null); - } catch (Exception e) { - Log.e(TAG, "MainActivity SaveFile " + e.getMessage()); - return false; - } finally { - try { - if (out != null) { - out.close(); + final File file = new File(directory, fileName+extension); + switch (extension) { + case ".png": + final Bitmap bitmap = mMyCanvas.getBitmap(); + FileOutputStream out = null; + try { + out = new FileOutputStream(file); + bitmap.compress(Bitmap.CompressFormat.PNG, 100, out); + MediaScannerConnection.scanFile(getApplicationContext(), + new String[]{file.getAbsolutePath()}, null, null); + } catch (Exception e) { + Log.e(TAG, "MainActivity SaveFile (.png) " + e.getMessage()); + return false; + } finally { + try { + if (out != null) { + out.close(); + } + } catch (IOException e) { + Log.e(TAG, "MainActivity SaveFile (.png) 2 " + e.getMessage()); + } } - } catch (IOException e) { - Log.e(TAG, "MainActivity SaveFile 2 " + e.getMessage()); - } + break; + + case ".svg": + try { + Svg.saveSvg(file, mMyCanvas); + } catch (Exception e) { + Log.e(TAG, "MainActivity SaveFile (.svg) " + e.getMessage()); + return false; + } + break; + + default: + return false; } return true; diff --git a/app/src/main/res/layout/save_file.xml b/app/src/main/res/layout/save_file.xml index d9ba347..2348403 100644 --- a/app/src/main/res/layout/save_file.xml +++ b/app/src/main/res/layout/save_file.xml @@ -17,18 +17,26 @@ android:layout_height="wrap_content" android:layout_below="@+id/file_name_label" android:layout_marginBottom="@dimen/activity_margin" - android:layout_toLeftOf="@+id/file_extension" android:singleLine="true"/> - + + + + + +