commit 72e386ef51ddbf121a773a39d924232e8a79e3ec
Author: Leszek Koltunski <leszek@koltunski.pl>
Date:   Mon Mar 28 12:17:46 2022 +0200

    Bandaged 3x3: progress with saving.

diff --git a/src/main/java/org/distorted/bandaged/BandagedCreatorRenderer.java b/src/main/java/org/distorted/bandaged/BandagedCreatorRenderer.java
index 1e3f26bd..72f1919e 100644
--- a/src/main/java/org/distorted/bandaged/BandagedCreatorRenderer.java
+++ b/src/main/java/org/distorted/bandaged/BandagedCreatorRenderer.java
@@ -22,7 +22,9 @@ package org.distorted.bandaged;
 import javax.microedition.khronos.egl.EGLConfig;
 import javax.microedition.khronos.opengles.GL10;
 
+import android.app.Activity;
 import android.opengl.GLSurfaceView;
+import android.widget.Toast;
 
 import org.distorted.dialogs.RubikDialogSaveBandaged;
 import org.distorted.library.main.DistortedLibrary;
@@ -31,6 +33,14 @@ import org.distorted.library.main.DistortedScreen;
 
 import org.distorted.library.type.Static3D;
 import org.distorted.library.type.Static4D;
+import org.distorted.objectlib.json.JsonWriter;
+import org.distorted.objectlib.main.TwistyObject;
+import org.distorted.objectlib.objects.TwistyBandagedGeneric;
+import org.json.JSONException;
+
+import java.io.File;
+import java.io.FileNotFoundException;
+import java.io.IOException;
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
@@ -316,6 +326,116 @@ public class BandagedCreatorRenderer implements GLSurfaceView.Renderer, Distorte
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
    public void saveObject()
+     {
+     int len = POSITIONS.length;
+     int numAttached=0;
+
+     for(int i=0; i<len; i++)
+       if( mCubits[i].isAttached() ) numAttached++;
+
+     float[][] pos = new float[numAttached][];
+     int attached=0;
+
+     for(int i=0; i<len; i++)
+       if( mCubits[i].isAttached() )
+         {
+         pos[attached++] = mCubits[i].getPosition();
+         }
+
+     TwistyBandagedGeneric.setPositions(pos);
+     TwistyObject obj = new TwistyBandagedGeneric();
+     BandagedCreatorActivity act = (BandagedCreatorActivity) mView.getContext();
+
+     createObjectJson(obj,act);
+     }
+
+///////////////////////////////////////////////////////////////////////////////////////////////////
+
+   private void createObjectJson(TwistyObject object, Activity act)
+     {
+     final String name = object.getShortName()+"_object.json";
+     File file = new File(act.getFilesDir(), name);
+     String filename = file.getAbsolutePath();
+
+     try
+       {
+       JsonWriter writer = JsonWriter.getInstance();
+       String json = writer.createObjectString(object,24);
+       writer.write(filename,json);
+
+       act.runOnUiThread(new Runnable()
+         {
+         public void run()
+           {
+           String message = "Saving to \n\n"+filename+"\n\nsuccessful";
+           Toast.makeText(act,message,Toast.LENGTH_LONG).show();
+           }
+         });
+       }
+     catch(JSONException ex)
+       {
+       act.runOnUiThread(new Runnable()
+         {
+         public void run()
+           {
+           String message = "JSON Exception saving to \n\n"+filename+"\n\n failed:\n\n"+ex.getMessage();
+           Toast.makeText(act,message,Toast.LENGTH_LONG).show();
+           }
+         });
+       }
+     catch(FileNotFoundException ex)
+       {
+       act.runOnUiThread(new Runnable()
+         {
+         public void run()
+           {
+           String message = "FileNotFound exception saving to \n\n"+filename+"\n\n failed:\n\n"+ex.getMessage();
+           Toast.makeText(act,message,Toast.LENGTH_LONG).show();
+           }
+         });
+       }
+     catch(IOException ex)
+       {
+       act.runOnUiThread(new Runnable()
+         {
+         public void run()
+           {
+           String message = "IO exception saving to \n\n"+filename+"\n\n failed:\n\n"+ex.getMessage();
+           Toast.makeText(act,message,Toast.LENGTH_LONG).show();
+           }
+         });
+       }
+     }
+
+///////////////////////////////////////////////////////////////////////////////////////////////////
+/*
+   private void createIcon(TwistyObject object)
+     {
+     if( !mIconActive )
+       {
+       mIconActive = true;
+
+       ObjectControl control = getControl();
+       DistortedEffects effects = object.getObjectEffects();
+
+       Static4D defRot = ShapeHexahedron.DEFAULT_ROT;
+       Static1D halo = new Static1D(5);
+       control.rotateNow(defRot);
+       float scale = 1.15f;
+       control.scaleNow(scale);
+       Static4D color = new Static4D(0,0,0,1);
+       PostprocessEffectBorder border = new PostprocessEffectBorder(halo,color);
+       border.setHaloDepth(false);
+       effects.apply(border);
+       String objectName = object.getShortName();
+       final String name = STORAGE+objectName+".png";
+       renderer.setSaveIcon(name);
+       }
+     }
+*/
+///////////////////////////////////////////////////////////////////////////////////////////////////
+
+   public void displaySavingDialog()
      {
      BandagedCreatorActivity act = (BandagedCreatorActivity)mView.getContext();
      RubikDialogSaveBandaged saveDiag = new RubikDialogSaveBandaged();
diff --git a/src/main/java/org/distorted/bandaged/BandagedCreatorScreen.java b/src/main/java/org/distorted/bandaged/BandagedCreatorScreen.java
index 1861e172..7b92d9b9 100644
--- a/src/main/java/org/distorted/bandaged/BandagedCreatorScreen.java
+++ b/src/main/java/org/distorted/bandaged/BandagedCreatorScreen.java
@@ -73,7 +73,7 @@ public class BandagedCreatorScreen
       public void onClick(View v)
         {
         BandagedCreatorRenderer renderer = act.getRenderer();
-        if( !renderer.isBusy() ) renderer.saveObject();
+        if( !renderer.isBusy() ) renderer.displaySavingDialog();
         }
       });
     }
diff --git a/src/main/java/org/distorted/dialogs/RubikDialogSaveBandaged.java b/src/main/java/org/distorted/dialogs/RubikDialogSaveBandaged.java
index aa25303a..2abf083b 100644
--- a/src/main/java/org/distorted/dialogs/RubikDialogSaveBandaged.java
+++ b/src/main/java/org/distorted/dialogs/RubikDialogSaveBandaged.java
@@ -36,6 +36,8 @@ import androidx.appcompat.app.AlertDialog;
 import androidx.appcompat.app.AppCompatDialogFragment;
 import androidx.fragment.app.FragmentActivity;
 
+import org.distorted.bandaged.BandagedCreatorActivity;
+import org.distorted.bandaged.BandagedCreatorRenderer;
 import org.distorted.main.R;
 import org.distorted.main.RubikActivity;
 
@@ -70,7 +72,13 @@ public class RubikDialogSaveBandaged extends AppCompatDialogFragment
       @Override
       public void onClick(DialogInterface dialog, int which)
         {
+        BandagedCreatorActivity bact = (BandagedCreatorActivity)getContext();
 
+        if( bact!=null )
+          {
+          BandagedCreatorRenderer rend = bact.getRenderer();
+          rend.saveObject();
+          }
         }
       });
 
@@ -79,7 +87,7 @@ public class RubikDialogSaveBandaged extends AppCompatDialogFragment
       @Override
       public void onClick(DialogInterface dialog, int which)
         {
-
+        // empty
         }
       });
 
