commit 477f9217252476f90fcc4b6ec24fe827807ace2c
Author: leszek <leszek@koltunski.pl>
Date:   Mon Nov 17 10:59:24 2025 +0100

    Progress remembering solves.

diff --git a/src/main/java/org/distorted/helpers/RubikFiles.java b/src/main/java/org/distorted/helpers/RubikFiles.java
index 47f121e1..e9faa1cc 100644
--- a/src/main/java/org/distorted/helpers/RubikFiles.java
+++ b/src/main/java/org/distorted/helpers/RubikFiles.java
@@ -135,23 +135,26 @@ public class RubikFiles
     else android.util.Log.e("D", "successfully deleted "+filename);
     }
 
+///////////////////////////////////////////////////////////////////////////////////////////////////
+
+  public void deleteFile(Context context, String name)
+    {
+    boolean success = context.deleteFile(name);
+    if( !success ) android.util.Log.e("D", "failed to delete "+name);
+    else android.util.Log.e("D", "successfully deleted "+name);
+    }
+
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
   public void deleteJsonObject(Context context, String name)
     {
-    String filename = name.toLowerCase(Locale.ENGLISH) + "_object.json";
-    boolean success = context.deleteFile(filename);
-    if( !success ) android.util.Log.e("D", "failed to delete "+filename);
-    else android.util.Log.e("D", "successfully deleted "+filename);
+    deleteFile(context,name.toLowerCase(Locale.ENGLISH) + "_object.json");
     }
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
   public void deleteJsonExtras(Context context, String name)
     {
-    String filename = name.toLowerCase(Locale.ENGLISH) + "_extras.json";
-    boolean success = context.deleteFile(filename);
-    if( !success ) android.util.Log.e("D", "failed to delete "+filename);
-    else android.util.Log.e("D", "successfully deleted "+filename);
+    deleteFile(context,name.toLowerCase(Locale.ENGLISH) + "_extras.json");
     }
   }
diff --git a/src/main/java/org/distorted/helpers/RubikRememberedSolves.java b/src/main/java/org/distorted/helpers/RubikRememberedSolves.java
index 1bbecafd..ac946844 100644
--- a/src/main/java/org/distorted/helpers/RubikRememberedSolves.java
+++ b/src/main/java/org/distorted/helpers/RubikRememberedSolves.java
@@ -25,6 +25,7 @@ import java.io.IOException;
 import java.io.InputStream;
 import java.io.InputStreamReader;
 import java.nio.charset.StandardCharsets;
+import java.util.Locale;
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
@@ -40,6 +41,13 @@ public class RubikRememberedSolves
 
     }
 
+///////////////////////////////////////////////////////////////////////////////////////////////////
+
+  private String produceFilename(String objname)
+    {
+    return objname.toLowerCase(Locale.ENGLISH)+"_solves.json";
+    }
+
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
   private String readContents(InputStream stream) throws IOException
@@ -191,7 +199,7 @@ public class RubikRememberedSolves
   public JSONArray readFile(Activity act, String objname)
     {
     RubikFiles files = RubikFiles.getInstance();
-    InputStream file = files.openFile(act,objname.toLowerCase()+"_solves.json");
+    InputStream file = files.openFile(act,produceFilename(objname));
 
     if( file==null ) return null;
 
@@ -206,11 +214,20 @@ public class RubikRememberedSolves
     return null;
     }
 
+///////////////////////////////////////////////////////////////////////////////////////////////////
+
+  public void deleteFile(Activity act, String objname)
+    {
+    String filename  = produceFilename(objname);
+    RubikFiles files = RubikFiles.getInstance();
+    files.deleteFile(act,filename);
+    }
+
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
   public void deleteSolve(Activity act, String objname, int level, long time)
     {
-    String filename  = objname.toLowerCase()+"_solves.json";
+    String filename  = produceFilename(objname);
     RubikFiles files = RubikFiles.getInstance();
     InputStream input= files.openFile(act,filename);
 
@@ -238,7 +255,7 @@ public class RubikRememberedSolves
 
   public void rememberSolve(Activity act, String objname, int level, int elapsed, Static4D rot, TwistyObject object)
     {
-    String filename  = objname.toLowerCase()+"_solves.json";
+    String filename  = produceFilename(objname);
     RubikFiles files = RubikFiles.getInstance();
     InputStream input= files.openFile(act,filename);
     String contents  = addInfo(input,level,elapsed,rot,object);
diff --git a/src/main/java/org/distorted/main/MainObjectPopup.java b/src/main/java/org/distorted/main/MainObjectPopup.java
index 5b1b10a7..043e7abf 100644
--- a/src/main/java/org/distorted/main/MainObjectPopup.java
+++ b/src/main/java/org/distorted/main/MainObjectPopup.java
@@ -24,6 +24,8 @@ import android.widget.LinearLayout;
 import android.widget.PopupWindow;
 import android.widget.TextView;
 
+import androidx.annotation.NonNull;
+
 import org.distorted.helpers.RubikRememberedSolves;
 import org.distorted.helpers.RubikScores;
 import org.distorted.library.type.Static4D;
@@ -207,12 +209,14 @@ public class MainObjectPopup
     TextView levels = layout.findViewById(R.id.objectLevels);
     levels.setTextSize(TypedValue.COMPLEX_UNIT_PX, mMenuTextSize);
 
-    setupLevelButtons(act,object,layout,width,height,padding,marginH,darkC,passedC);
+    if( object!=null )
+      setupLevelButtons(act,object,layout,width,height,padding,marginH,darkC,passedC);
     }
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
-  private void setupLevelButtons(MainActivity act, RubikObject object, View layout, int width, int height, int padding, int margin, int darkC, int passedC)
+  private void setupLevelButtons(MainActivity act, @NonNull RubikObject object, View layout, int width,
+                                 int height, int padding, int margin, int darkC, int passedC)
     {
     RubikScores scores = RubikScores.getInstance(act);
     Resources res = act.getResources();
@@ -238,7 +242,7 @@ public class MainObjectPopup
     level[7] = layout.findViewById(R.id.level7);
     level[8] = layout.findViewById(R.id.levelM);
 
-    int numScramble  = object==null ? 1 : object.getNumScramble();
+    int numScramble  = object.getNumScramble();
     int min = Math.min(numScramble,LEVELS_SHOWN);
 
     if( numScramble>=1 && numScramble<=7 )
@@ -304,6 +308,8 @@ public class MainObjectPopup
               catch(JSONException jex)
                 {
                 android.util.Log.e("D", "Exception 2 trying to parse file: "+jex.getMessage() );
+                solves.deleteFile(act,object.getLowerName());
+                act.switchToPlay(object,mObjectOrdinal,scrambles,ll,0,null,null);
                 }
               }
             else
