commit cdd861674f56fa2e8130d4f2aeb4b5aa33aedfa0
Author: Leszek Koltunski <leszek@koltunski.pl>
Date:   Sat Nov 15 00:03:59 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 f1474220..5382835a 100644
--- a/src/main/java/org/distorted/helpers/RubikRememberedSolves.java
+++ b/src/main/java/org/distorted/helpers/RubikRememberedSolves.java
@@ -29,7 +29,7 @@ import java.nio.charset.StandardCharsets;
 
 public class RubikRememberedSolves
 {
-  private static final int MAXSOLVES = 5;
+  private static final int MAXSOLVES = 4;
   private static RubikRememberedSolves mThis;
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
@@ -101,6 +101,34 @@ public class RubikRememberedSolves
     return contents.toString();
     }
 
+///////////////////////////////////////////////////////////////////////////////////////////////////
+
+  public void deleteSolve(Activity act, String objname, int level, long time)
+    {
+    String filename  = objname.toLowerCase()+"_solves.json";
+    RubikFiles files = RubikFiles.getInstance();
+    InputStream input= files.openFile(act,filename);
+
+    if( input!=null )
+      {
+      String contents= deleteInfo(input,level,time);
+      File file      = new File(act.getFilesDir(), filename);
+
+      try( FileOutputStream fos = new FileOutputStream(file) )
+        {
+        fos.write(contents.getBytes(StandardCharsets.UTF_8));
+        }
+      catch(IOException ex)
+        {
+        android.util.Log.e("D", "deleteSolve: failed to save file "+filename+" : "+ex.getMessage());
+        }
+      }
+    else
+      {
+      android.util.Log.e("D", "deleteSolve: error: file "+filename+" not found");
+      }
+    }
+
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
   public void rememberSolve(Activity act, String objname, int level, long time, Static4D rot, int[] quats)
@@ -117,7 +145,7 @@ public class RubikRememberedSolves
       }
     catch(IOException ex)
       {
-      android.util.Log.e("D", "failed to save file "+filename+" : "+ex.getMessage());
+      android.util.Log.e("D", "rememberSolve: failed to save file "+filename+" : "+ex.getMessage());
       }
     }
 
@@ -139,6 +167,32 @@ public class RubikRememberedSolves
                                     "quats: "+quatStr );
     }
 
+///////////////////////////////////////////////////////////////////////////////////////////////////
+
+  public String deleteInfo(InputStream stream, int level, long time)
+    {
+    try
+      {
+      String contents = readContents(stream);
+      JSONArray levels = new JSONArray(contents);
+      JSONArray lvl = levels.getJSONArray(level);
+      int numSolves = lvl.length();
+
+      for(int s=0; s<numSolves; s++)
+        {
+        JSONObject obj = lvl.getJSONObject(s);
+        long tm = obj.getLong("time");
+        if( tm==time ) { lvl.remove(s); break; }
+        }
+
+      return levels.toString();
+      }
+    catch(IOException iex)    { android.util.Log.e("D", "addInfo: failed to read file: "+iex.getMessage() ); }
+    catch(JSONException jex)  { android.util.Log.e("D", "addInfo: failed to parse file: "+jex.getMessage()); }
+
+    return null;
+    }
+
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
   public String addInfo(InputStream stream, int level, long time, Static4D rot, int[] quats)
@@ -151,7 +205,7 @@ public class RubikRememberedSolves
         JSONArray levels = new JSONArray(contents);
         JSONArray lvl = levels.getJSONArray(level);
         JSONObject data = createData(time,rot,quats);
-        if( lvl.length()>MAXSOLVES ) lvl.remove(0);
+        if( lvl.length()>=MAXSOLVES ) lvl.remove(0);
         lvl.put(data);
         return levels.toString();
         }
diff --git a/src/main/java/org/distorted/main/MainSolvesPopup.java b/src/main/java/org/distorted/main/MainSolvesPopup.java
index 0d311547..a1bf0c17 100644
--- a/src/main/java/org/distorted/main/MainSolvesPopup.java
+++ b/src/main/java/org/distorted/main/MainSolvesPopup.java
@@ -9,9 +9,9 @@
 
 package org.distorted.main;
 
+import static org.distorted.main.MainObjectPopup.LEVELS_SHOWN;
+
 import android.content.Context;
-import android.content.res.Resources;
-import android.graphics.drawable.ColorDrawable;
 import android.util.TypedValue;
 import android.view.Gravity;
 import android.view.LayoutInflater;
@@ -21,6 +21,7 @@ import android.widget.LinearLayout;
 import android.widget.PopupWindow;
 import android.widget.TextView;
 
+import org.distorted.helpers.RubikRememberedSolves;
 import org.distorted.objects.RubikObject;
 import org.json.JSONArray;
 import org.json.JSONException;
@@ -146,6 +147,9 @@ public class MainSolvesPopup
         public void onClick(View v)
           {
           mLayout.removeViewAt(index);
+          int level = mLevel==LEVELS_SHOWN ? mLevel : mLevel+1;
+          RubikRememberedSolves solves = RubikRememberedSolves.getInstance();
+          solves.deleteSolve(act, mObject.getLowerName(), level, time);
           }
         });
 
diff --git a/src/main/java/org/distorted/play/PlayActivity.java b/src/main/java/org/distorted/play/PlayActivity.java
index ae0abb60..390a11d1 100644
--- a/src/main/java/org/distorted/play/PlayActivity.java
+++ b/src/main/java/org/distorted/play/PlayActivity.java
@@ -9,6 +9,8 @@
 
 package org.distorted.play;
 
+import static org.distorted.main.MainObjectPopup.LEVELS_SHOWN;
+
 import java.io.InputStream;
 
 import android.app.Activity;
@@ -307,7 +309,7 @@ public class PlayActivity extends BaseActivity implements DialogScores.ScoresInv
       ObjectControl control = getControl();
       TwistyObject object = control.getObject();
 
-      int level = mLevel+1;
+      int level = mLevel==LEVELS_SHOWN ? mLevel : mLevel+1;
       long time = System.currentTimeMillis();
       String name = object.getShortName();
       int numCubits = object.getNumCubits();
