commit 1d9b05003ceda9f4644304f768bef5ff03d69577
Author: Leszek Koltunski <leszek@koltunski.pl>
Date:   Sat Nov 15 01:10:07 2025 +0100

    progress with remembering solves.

diff --git a/src/main/java/org/distorted/helpers/RubikRememberedSolves.java b/src/main/java/org/distorted/helpers/RubikRememberedSolves.java
index 5382835a..66315d92 100644
--- a/src/main/java/org/distorted/helpers/RubikRememberedSolves.java
+++ b/src/main/java/org/distorted/helpers/RubikRememberedSolves.java
@@ -66,6 +66,36 @@ public class RubikRememberedSolves
     return data;
     }
 
+///////////////////////////////////////////////////////////////////////////////////////////////////
+
+  public long getTime(JSONObject object) throws JSONException
+    {
+    return object.getLong("time");
+    }
+
+///////////////////////////////////////////////////////////////////////////////////////////////////
+
+  public Static4D getRotQuat(JSONObject object) throws JSONException
+    {
+    float r0 = (float)object.getDouble("rot0");
+    float r1 = (float)object.getDouble("rot1");
+    float r2 = (float)object.getDouble("rot2");
+    float r3 = (float)object.getDouble("rot3");
+
+    return new Static4D(r0,r1,r2,r3);
+    }
+
+///////////////////////////////////////////////////////////////////////////////////////////////////
+
+  public int[] getQuats(JSONObject object) throws JSONException
+    {
+    JSONArray quats = object.getJSONArray("quats");
+    int len = quats.length();
+    int[] ret = new int[len];
+    for(int i=0; i<len; i++)  ret[i] = quats.getInt(i);
+    return ret;
+    }
+
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
   public JSONArray readFile(Activity act, String objname)
diff --git a/src/main/java/org/distorted/main/MainActivity.java b/src/main/java/org/distorted/main/MainActivity.java
index 99387f72..d2f50294 100644
--- a/src/main/java/org/distorted/main/MainActivity.java
+++ b/src/main/java/org/distorted/main/MainActivity.java
@@ -40,6 +40,7 @@ import org.distorted.dialogs.DialogUpdates;
 import org.distorted.helpers.RubikNetwork;
 import org.distorted.helpers.RubikScores;
 import org.distorted.helpers.RubikUpdates;
+import org.distorted.library.type.Static4D;
 import org.distorted.messaging.RubikInAppMessanging;
 import org.distorted.objects.RubikObject;
 import org.distorted.objects.RubikObjectList;
@@ -337,7 +338,7 @@ public class MainActivity extends BaseActivity implements RubikNetwork.Updatee,
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
-    public void switchToPlay(RubikObject object, int ordinal, int scrambles, int level)
+    public void switchToPlay(RubikObject object, int ordinal, int scrambles, int level, long time, Static4D rot, int[] quats)
       {
       boolean local = object.isLocal();
       String name = local ? object.getLowerName() : object.getUpperName();
@@ -348,6 +349,19 @@ public class MainActivity extends BaseActivity implements RubikNetwork.Updatee,
       intent.putExtra("scrambles", scrambles);
       intent.putExtra("local", local );
       intent.putExtra("ordinal", ordinal );
+      intent.putExtra("time", time);
+
+      if( rot!=null )
+        {
+        intent.putExtra("rot0", rot.get0() );
+        intent.putExtra("rot1", rot.get0() );
+        intent.putExtra("rot2", rot.get0() );
+        intent.putExtra("rot3", rot.get0() );
+        }
+      if( quats!=null )
+        {
+        intent.putExtra("quats", quats);
+        }
 
       startActivity(intent);
       }
diff --git a/src/main/java/org/distorted/main/MainObjectPopup.java b/src/main/java/org/distorted/main/MainObjectPopup.java
index 122ce7ed..18928726 100644
--- a/src/main/java/org/distorted/main/MainObjectPopup.java
+++ b/src/main/java/org/distorted/main/MainObjectPopup.java
@@ -286,7 +286,7 @@ public class MainObjectPopup
             MainSolvesPopup popup = new MainSolvesPopup(act,object,mObjectOrdinal,scrambles,ll,json,height);
             popup.show(v);
             }
-          else act.switchToPlay(object,mObjectOrdinal,scrambles,ll);
+          else act.switchToPlay(object,mObjectOrdinal,scrambles,ll,0,null,null);
           }
         });
       }
diff --git a/src/main/java/org/distorted/main/MainSolvesPopup.java b/src/main/java/org/distorted/main/MainSolvesPopup.java
index a1bf0c17..ea2e4376 100644
--- a/src/main/java/org/distorted/main/MainSolvesPopup.java
+++ b/src/main/java/org/distorted/main/MainSolvesPopup.java
@@ -22,6 +22,7 @@ import android.widget.PopupWindow;
 import android.widget.TextView;
 
 import org.distorted.helpers.RubikRememberedSolves;
+import org.distorted.library.type.Static4D;
 import org.distorted.objects.RubikObject;
 import org.json.JSONArray;
 import org.json.JSONException;
@@ -79,14 +80,17 @@ public class MainSolvesPopup
     LinearLayout.LayoutParams pT = new LinearLayout.LayoutParams( LinearLayout.LayoutParams.MATCH_PARENT, textH );
 
     int numSolves = array.length();
+    RubikRememberedSolves solves = RubikRememberedSolves.getInstance();
 
     try
       {
       for(int s=0; s<numSolves; s++)
         {
         JSONObject object = array.getJSONObject(s);
-        long time = object.getLong("time");
-        View pane = createOldPane(act, s, time, pL, pT);
+        long time = solves.getTime(object);
+        Static4D rotQuat = solves.getRotQuat(object);
+        int[] quats = solves.getQuats(object);
+        View pane = createOldPane(act, s, time, rotQuat, quats, pL, pT);
         mLayout.addView(pane);
         }
       }
@@ -117,7 +121,7 @@ public class MainSolvesPopup
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
-  private View createOldPane(MainActivity act, int index, long time, LinearLayout.LayoutParams pView, LinearLayout.LayoutParams pText)
+  private View createOldPane(MainActivity act, int index, long time, Static4D rot, int[] quats, LinearLayout.LayoutParams pView, LinearLayout.LayoutParams pText)
     {
     View view = act.getLayoutInflater().inflate(R.layout.dialog_solve_old_pane, null);
     TextView title = view.findViewById(R.id.solves_pane_title);
@@ -161,7 +165,8 @@ public class MainSolvesPopup
         @Override
         public void onClick(View v)
           {
-          android.util.Log.e("D", "RESUME");
+          mPopup.dismiss();
+          act.switchToPlay(mObject,mObjectOrdinal,mNumScrambles,mLevel, time, rot, quats);
           }
         });
 
@@ -190,7 +195,7 @@ public class MainSolvesPopup
         public void onClick(View v)
           {
           mPopup.dismiss();
-          act.switchToPlay(mObject,mObjectOrdinal,mNumScrambles,mLevel);
+          act.switchToPlay(mObject,mObjectOrdinal,mNumScrambles,mLevel,0,null,null);
           }
         });
 
diff --git a/src/main/java/org/distorted/play/PlayActivity.java b/src/main/java/org/distorted/play/PlayActivity.java
index 390a11d1..21aa6869 100644
--- a/src/main/java/org/distorted/play/PlayActivity.java
+++ b/src/main/java/org/distorted/play/PlayActivity.java
@@ -53,6 +53,9 @@ public class PlayActivity extends BaseActivity implements DialogScores.ScoresInv
 
     private String mObjectName;
     private int mNumScrambles;
+    private long mTime;
+    private Static4D mRotQuat;
+    private int[] mQuats;
     private boolean mObjectLocal;
     private int mObjectOrdinal;
     private int mLevel;
@@ -81,6 +84,17 @@ public class PlayActivity extends BaseActivity implements DialogScores.ScoresInv
         mNumScrambles  = b.getInt("scrambles");
         mObjectLocal   = b.getBoolean("local");
         mObjectOrdinal = b.getInt("ordinal");
+        mTime          = b.getLong("time");
+
+        if( mTime>0 )
+          {
+          float r0 = b.getFloat("rot0");
+          float r1 = b.getFloat("rot1");
+          float r2 = b.getFloat("rot2");
+          float r3 = b.getFloat("rot3");
+          mRotQuat = new Static4D(r0,r1,r2,r3);
+          mQuats = b.getIntArray("quqts");
+          }
         }
       else
         {
@@ -89,6 +103,9 @@ public class PlayActivity extends BaseActivity implements DialogScores.ScoresInv
         mNumScrambles = 0;
         mObjectLocal = true;
         mObjectOrdinal = 0;
+        mTime = 0;
+        mRotQuat = null;
+        mQuats = null;
         }
 
       mModeFree = (mLevel<0);
