commit 831368fd9dbe86bc060975b55d7321a7fb2c351d
Author: Leszek Koltunski <leszek@koltunski.pl>
Date:   Sat Nov 15 22:48:14 2025 +0100

    progress with remembering solves: new API to ObjectControl to create an Object with already scrambled state.

diff --git a/src/main/java/org/distorted/config/ConfigActivity.java b/src/main/java/org/distorted/config/ConfigActivity.java
index 00714592..a70dfe82 100644
--- a/src/main/java/org/distorted/config/ConfigActivity.java
+++ b/src/main/java/org/distorted/config/ConfigActivity.java
@@ -154,7 +154,7 @@ public class ConfigActivity extends BaseActivity
         InputStream meshStream = object.getMeshStream(this);
         String name            = object.getUpperName();
         InitAssets asset       = new InitAssets(jsonStream,meshStream,null);
-        control.changeIfDifferent(ordinal,name,iconMode,asset);
+        control.changeIfDifferent(ordinal,name,iconMode,asset,null);
         }
       }
 
diff --git a/src/main/java/org/distorted/info/InfoActivity.java b/src/main/java/org/distorted/info/InfoActivity.java
index 6920986a..e8b7b122 100644
--- a/src/main/java/org/distorted/info/InfoActivity.java
+++ b/src/main/java/org/distorted/info/InfoActivity.java
@@ -108,7 +108,7 @@ public class InfoActivity extends BaseActivity
         InputStream meshStream = object.getMeshStream(this);
         String name            = object.getUpperName();
         InitAssets asset       = new InitAssets(jsonStream,meshStream,null);
-        control.changeIfDifferent(ordinal,name,iconMode,asset);
+        control.changeIfDifferent(ordinal,name,iconMode,asset,null);
         }
       }
 
diff --git a/src/main/java/org/distorted/patterns/PatternActivity.java b/src/main/java/org/distorted/patterns/PatternActivity.java
index fac6d3f7..a351d381 100644
--- a/src/main/java/org/distorted/patterns/PatternActivity.java
+++ b/src/main/java/org/distorted/patterns/PatternActivity.java
@@ -203,6 +203,6 @@ public class PatternActivity extends BaseActivity
       OSInterface os = view.getInterface();
       InitAssets asset = new InitAssets(jsonStream,meshStream,os);
 
-      control.changeIfDifferent(mObjectOrdinal,name,iconMode,asset);
+      control.changeIfDifferent(mObjectOrdinal,name,iconMode,asset,null);
       }
 }
diff --git a/src/main/java/org/distorted/play/PlayActivity.java b/src/main/java/org/distorted/play/PlayActivity.java
index 048da1ef..612f1792 100644
--- a/src/main/java/org/distorted/play/PlayActivity.java
+++ b/src/main/java/org/distorted/play/PlayActivity.java
@@ -164,18 +164,18 @@ public class PlayActivity extends BaseActivity implements DialogScores.ScoresInv
       SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(this);
       restorePreferences(preferences);
 
-      ScreenList sl = mJustStarted ? (mModeFree ? ScreenList.FREE : ScreenList.SCRA) : ScreenList.getCurrentScreen();
-      ScreenList.switchScreen(this, sl);
+      if( !mModeResume )
+        {
+        ScreenList sl = mJustStarted ? (mModeFree ? ScreenList.FREE : ScreenList.SCRA) : ScreenList.getCurrentScreen();
+        ScreenList.switchScreen(this, sl);
 
-      if( !mJustStarted ) restoreMoves(preferences);
+        if( !mJustStarted ) restoreMoves(preferences);
 
-      if( !mObjectName.isEmpty() )
-        {
-        changeIfDifferent(mObjectName, mObjectLocal, mObjectOrdinal, control);
-        }
+        if( !mObjectName.isEmpty() )
+          {
+          changeIfDifferent(mObjectName, mObjectLocal, mObjectOrdinal, control, null);
+          }
 
-      if( !mModeResume )
-        {
         if( mJustStarted && !mModeFree )
           {
           control.scrambleObject(mNumScrambles);
@@ -183,9 +183,24 @@ public class PlayActivity extends BaseActivity implements DialogScores.ScoresInv
         }
       else
         {
+        ScreenList sl = mJustStarted ? (mModeFree ? ScreenList.FREE : ScreenList.SOLV) : ScreenList.getCurrentScreen();
+        ScreenList.switchScreen(this, sl);
+
+        if( !mJustStarted ) restoreMoves(preferences);
+
+        if( !mObjectName.isEmpty() )
+          {
+          changeIfDifferent(mObjectName, mObjectLocal, mObjectOrdinal, control, mQuats);
+          }
+
         control.rotateNow(mRotQuat);
-        TwistyObject object = control.getObject();
-        object.setCubitQuats(mQuats);
+        ScreenList curr = ScreenList.getCurrentScreen();
+
+        if( curr == ScreenList.SOLV )
+          {
+          ScreenSolving solving = (ScreenSolving)ScreenList.SOLV.getScreenClass();
+          solving.setElapsedAlready(mElapsed);
+          }
         }
 
       mJustStarted = false;
@@ -273,7 +288,7 @@ public class PlayActivity extends BaseActivity implements DialogScores.ScoresInv
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
-    private void changeIfDifferent(String name, boolean local, int ordinal, ObjectControl control)
+    private void changeIfDifferent(String name, boolean local, int ordinal, ObjectControl control, int[] initQuats)
       {
       if( local )
         {
@@ -281,7 +296,7 @@ public class PlayActivity extends BaseActivity implements DialogScores.ScoresInv
         int iconMode = TwistyObject.MODE_NORM;
         InputStream jsonStream = files.openFile(this, name+"_object.json");
         InitAssets asset = new InitAssets(jsonStream, null, null);
-        control.changeIfDifferent(ordinal,name,iconMode,asset);
+        control.changeIfDifferent(ordinal, name, iconMode, asset, initQuats);
         }
       else
         {
@@ -292,7 +307,7 @@ public class PlayActivity extends BaseActivity implements DialogScores.ScoresInv
         PlayView view = findViewById(R.id.playView);
         OSInterface os = view.getInterface();
         InitAssets asset = new InitAssets(jsonStream, meshStream, os);
-        control.changeIfDifferent(ordinal, name, iconMode, asset);
+        control.changeIfDifferent(ordinal, name, iconMode, asset, initQuats);
         }
       }
 
diff --git a/src/main/java/org/distorted/play/ScreenSolving.java b/src/main/java/org/distorted/play/ScreenSolving.java
index 28521e70..eaed16ef 100644
--- a/src/main/java/org/distorted/play/ScreenSolving.java
+++ b/src/main/java/org/distorted/play/ScreenSolving.java
@@ -176,6 +176,14 @@ public class ScreenSolving extends ScreenBase
     return scores.setRecord(object, mLevel, (int)mElapsed);
     }
 
+///////////////////////////////////////////////////////////////////////////////////////////////////
+
+  public void setElapsedAlready(int elapsed)
+    {
+    mElapsed = elapsed;
+    mStartTime = System.currentTimeMillis() - elapsed;
+    }
+
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
   public void resetElapsed()
diff --git a/src/main/java/org/distorted/solvers/SolverActivity.java b/src/main/java/org/distorted/solvers/SolverActivity.java
index bec93a24..c0c31b03 100644
--- a/src/main/java/org/distorted/solvers/SolverActivity.java
+++ b/src/main/java/org/distorted/solvers/SolverActivity.java
@@ -247,7 +247,7 @@ public class SolverActivity extends BaseActivity
       String name = object==null ? "NULL" : object.getUpperName();
       OSInterface os = view.getInterface();
       InitAssets asset = new InitAssets(jsonStream,meshStream,os);
-      control.changeIfDifferent(mObjectOrdinal,name,TwistyObject.MODE_NORM,asset);
+      control.changeIfDifferent(mObjectOrdinal,name,TwistyObject.MODE_NORM,asset,null);
       }
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
diff --git a/src/main/java/org/distorted/tutorials/TutorialActivity.java b/src/main/java/org/distorted/tutorials/TutorialActivity.java
index ec908eb2..97f7ee30 100644
--- a/src/main/java/org/distorted/tutorials/TutorialActivity.java
+++ b/src/main/java/org/distorted/tutorials/TutorialActivity.java
@@ -182,7 +182,7 @@ public class TutorialActivity extends BaseActivity
       TutorialSurfaceView view = findViewById(R.id.tutorialSurfaceView);
       OSInterface os = view.getInterface();
       InitAssets asset = new InitAssets(jsonStream,meshStream,os);
-      control.changeIfDifferent(ordinal,name,iconMode,asset);
+      control.changeIfDifferent(ordinal,name,iconMode,asset,null);
       }
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
