commit 7464b39315a4e9c269961580f5e1d0ddfddb198c
Author: leszek <leszek@koltunski.pl>
Date:   Sat Dec 21 20:58:57 2024 +0100

    Beginning of support for more than one solver per object.

diff --git a/src/main/java/org/distorted/objects/RubikObject.java b/src/main/java/org/distorted/objects/RubikObject.java
index 0e98b414..45235429 100644
--- a/src/main/java/org/distorted/objects/RubikObject.java
+++ b/src/main/java/org/distorted/objects/RubikObject.java
@@ -39,7 +39,7 @@ public class RubikObject
   private final int mIconID;
   private final String[][] mPatterns;
   private final int mPrice;
-  private final int mSolverOrdinal;
+  private final int[] mSolverOrdinals;
   private final int mObjectOrdinal;
   private final boolean mIsLocal;
   private final int mCategory, mYear;
@@ -81,7 +81,7 @@ public class RubikObject
     int patternOrdinal  = RubikPatternList.getOrdinal(mObjectIndex);
     mPatterns = RubikPatternList.getPatterns(patternOrdinal);
 
-    mSolverOrdinal = SolvingList.getSolverOrdinal(mObjectOrdinal);
+    mSolverOrdinals= SolvingList.getSolverOrdinals(mObjectOrdinal);
     mExtrasOrdinal = -1;
 
     mObjectVersion = meta.objectVersion();
@@ -110,7 +110,7 @@ public class RubikObject
 
     mPatterns      = null;
     mExtrasOrdinal = -1;
-    mSolverOrdinal = -1;
+    mSolverOrdinals= null;
     mObjectOrdinal = -1;
     mIsLocal       = true;
 
@@ -355,14 +355,7 @@ public class RubikObject
 
   public boolean hasSolver()
     {
-    return mSolverOrdinal>=0;
-    }
-
-///////////////////////////////////////////////////////////////////////////////////////////////////
-
-  public int getSolverOrdinal()
-    {
-    return mSolverOrdinal;
+    return mSolverOrdinals!=null;
     }
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
diff --git a/src/main/java/org/distorted/solvers/SolvingList.java b/src/main/java/org/distorted/solvers/SolvingList.java
index 0663dd38..36e57c19 100644
--- a/src/main/java/org/distorted/solvers/SolvingList.java
+++ b/src/main/java/org/distorted/solvers/SolvingList.java
@@ -27,6 +27,8 @@ public enum SolvingList
 {
   CUBE2          (CUBE_2.ordinal(), SolverTablebaseCUBE2.class, R.string.solver_cube2_title, R.string.solver_cube2_description, true),
   CUBE3_KOCIEMBA (CUBE_3.ordinal(), SolverKociembaCUBE3.class , R.string.solver_cube3_title, R.string.solver_cube3_description, true),
+  //CUBE3_FAKE     (CUBE_3.ordinal(), SolverKociembaCUBE3.class , R.string.solver_cube3_title, R.string.solver_cube3_description, true),
+
   CU232          (CU_232.ordinal(), SolverTablebaseCU232.class, R.string.solver_cu232_title, R.string.solver_cu232_description, true),
   CU323          (CU_323.ordinal(), SolverTablebaseCU323.class, R.string.solver_cu323_title, R.string.solver_cu323_description, true),
   PYRAMINX       (PYRA_3.ordinal(), SolverTablebasePYRA3.class, R.string.solver_pyra3_title, R.string.solver_pyra3_description, true),
@@ -70,12 +72,24 @@ public enum SolvingList
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
-  public static int getSolverOrdinal(int objectOrdinal)
+  public static int[] getSolverOrdinals(int objectOrdinal)
     {
+    int num = 0;
+
     for(int o=0; o<NUM_OBJECTS; o++)
-      if( objects[o].mObjectOrdinal==objectOrdinal ) return o;
+      if( objects[o].mObjectOrdinal==objectOrdinal ) num++;
 
-    return -1;
+    if( num>0 )
+      {
+      int[] ret = new int[num];
+      int index = 0;
+
+      for(int o=0; o<NUM_OBJECTS; o++)
+        if( objects[o].mObjectOrdinal==objectOrdinal ) ret[index++] = o;
+
+      return ret;
+      }
+    return null;
     }
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
diff --git a/src/main/java/org/distorted/solverui/ScreenSolver.java b/src/main/java/org/distorted/solverui/ScreenSolver.java
index 03c6a38e..4b2ed167 100644
--- a/src/main/java/org/distorted/solverui/ScreenSolver.java
+++ b/src/main/java/org/distorted/solverui/ScreenSolver.java
@@ -55,7 +55,7 @@ public class ScreenSolver extends ScreenAbstract
   private int mNumColors;
   private float mBitmapSize;
   private WeakReference<SolverActivity> mWeakAct;
-  private SolvingList mList;
+  private int mObjectOrdinal;
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
@@ -78,11 +78,9 @@ public class ScreenSolver extends ScreenAbstract
     mWeakAct = new WeakReference<>(act);
     mSolving = false;
 
-    int solverIndex= act.getSolverOrdinal();
-    mList = SolvingList.getSolver(solverIndex);
-    int currentObject = mList.getObjectOrdinal();
+    mObjectOrdinal = act.getObjectOrdinal();
     control.solveOnly();
-    generateFaceColors(currentObject);
+    generateFaceColors(mObjectOrdinal);
 
     final float BUTTON_RATIO = 0.75f;
     int sizeV = (int)(heigh*MainActivity.RATIO_BAR*BUTTON_RATIO);
@@ -239,6 +237,38 @@ public class ScreenSolver extends ScreenAbstract
     return color;
     }
 
+///////////////////////////////////////////////////////////////////////////////////////////////////
+
+  private boolean pressSolve(SolverActivity act)
+    {
+    int[] solverOrdinals = SolvingList.getSolverOrdinals(mObjectOrdinal);
+
+    if( solverOrdinals!=null  )
+      {
+      int len = solverOrdinals.length;
+
+      if( len==1 ) // just one solver - simply launch it and start finding the solution
+        {
+        SolvingList list = SolvingList.getSolver(solverOrdinals[0]);
+        TwistyObject object = act.getObject();
+        SolvingThread solver = new SolvingThread( act.getInterface(), act.getResources(), object, list );
+        solver.start();
+        return true;
+        }
+      else  // more than one solver - launch a choosing dialog
+        {
+        // TODO
+        android.util.Log.e("D", len+" solvers found for object "+mObjectOrdinal);
+        return false;
+        }
+      }
+    else  // no solvers? Impossible!
+      {
+      android.util.Log.e("D", "No solvers found for object "+mObjectOrdinal);
+      return false;
+      }
+    }
+
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
   private void setupColorButtons(final SolverActivity act, final float width)
@@ -304,13 +334,7 @@ public class ScreenSolver extends ScreenAbstract
       @Override
       public void onClick(View v)
         {
-        if( !mSolving )
-          {
-          mSolving = true;
-          TwistyObject object = act.getObject();
-          SolvingThread solver = new SolvingThread( act.getInterface(), act.getResources(), object, mList );
-          solver.start();
-          }
+        if( !mSolving && pressSolve(act) ) mSolving = true;
         }
       });
     }
diff --git a/src/main/java/org/distorted/solverui/SolverActivity.java b/src/main/java/org/distorted/solverui/SolverActivity.java
index 967db199..eb063b85 100644
--- a/src/main/java/org/distorted/solverui/SolverActivity.java
+++ b/src/main/java/org/distorted/solverui/SolverActivity.java
@@ -29,7 +29,6 @@ import org.distorted.objectlib.main.TwistyObject;
 import org.distorted.objects.RubikObject;
 import org.distorted.objects.RubikObjectList;
 import org.distorted.os.OSInterface;
-import org.distorted.solvers.SolvingList;
 
 import java.io.InputStream;
 
@@ -46,7 +45,6 @@ public class SolverActivity extends BaseActivity
     private static final int ACTIVITY_NUMBER = 4;
     private static final float RATIO_INSET= 0.09f;
 
-    private int mSolverOrdinal;
     private int mObjectOrdinal;
     private boolean mDisplayMessageDialog;
 
@@ -61,8 +59,6 @@ public class SolverActivity extends BaseActivity
 
       Bundle b = getIntent().getExtras();
       mObjectOrdinal = b!=null ? b.getInt("obj") : 0;
-      RubikObject object = RubikObjectList.getObject(mObjectOrdinal);
-      mSolverOrdinal = object==null ? -1 : object.getSolverOrdinal();
       mDisplayMessageDialog = true;
 
       computeScreenDimensions();
@@ -211,13 +207,6 @@ public class SolverActivity extends BaseActivity
       return view.getObjectControl();
       }
 
-///////////////////////////////////////////////////////////////////////////////////////////////////
-
-    public int getSolverOrdinal()
-      {
-      return mSolverOrdinal;
-      }
-
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
     public int getObjectOrdinal()
