commit ca292407b5d92eb90af170c5d980d2a8fc9724a1
Author: Leszek Koltunski <leszek@koltunski.pl>
Date:   Sun Apr 5 22:53:14 2020 +0100

    Progress with the 3x3x3 Solver.

diff --git a/src/main/java/org/distorted/dialogs/RubikDialogSolverError.java b/src/main/java/org/distorted/dialogs/RubikDialogSolverError.java
new file mode 100644
index 00000000..3b884ce6
--- /dev/null
+++ b/src/main/java/org/distorted/dialogs/RubikDialogSolverError.java
@@ -0,0 +1,95 @@
+///////////////////////////////////////////////////////////////////////////////////////////////////
+// Copyright 2020 Leszek Koltunski                                                               //
+//                                                                                               //
+// This file is part of Magic Cube.                                                              //
+//                                                                                               //
+// Magic Cube is free software: you can redistribute it and/or modify                            //
+// it under the terms of the GNU General Public License as published by                          //
+// the Free Software Foundation, either version 2 of the License, or                             //
+// (at your option) any later version.                                                           //
+//                                                                                               //
+// Magic Cube is distributed in the hope that it will be useful,                                 //
+// but WITHOUT ANY WARRANTY; without even the implied warranty of                                //
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the                                 //
+// GNU General Public License for more details.                                                  //
+//                                                                                               //
+// You should have received a copy of the GNU General Public License                             //
+// along with Magic Cube.  If not, see <http://www.gnu.org/licenses/>.                           //
+///////////////////////////////////////////////////////////////////////////////////////////////////
+
+package org.distorted.dialogs;
+
+import android.app.Dialog;
+import android.content.DialogInterface;
+import android.os.Bundle;
+import android.support.annotation.NonNull;
+import android.support.v4.app.FragmentActivity;
+import android.support.v7.app.AlertDialog;
+import android.support.v7.app.AppCompatDialogFragment;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.Window;
+import android.view.WindowManager;
+import android.widget.TextView;
+
+import org.distorted.main.R;
+
+///////////////////////////////////////////////////////////////////////////////////////////////////
+
+public class RubikDialogSolverError extends AppCompatDialogFragment
+  {
+  @Override
+  public void onStart()
+    {
+    super.onStart();
+
+    Window window = getDialog().getWindow();
+    window.setFlags(WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL,
+                    WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL);
+    window.clearFlags(WindowManager.LayoutParams.FLAG_DIM_BEHIND);
+    }
+
+///////////////////////////////////////////////////////////////////////////////////////////////////
+
+  @NonNull
+  @Override
+  public Dialog onCreateDialog(Bundle savedInstanceState)
+    {
+    FragmentActivity act = getActivity();
+    LayoutInflater inflater = act.getLayoutInflater();
+    AlertDialog.Builder builder = new AlertDialog.Builder(act);
+
+    TextView tv = (TextView) inflater.inflate(R.layout.dialog_title, null);
+    tv.setText(R.string.error);
+    builder.setCustomTitle(tv);
+
+    builder.setCancelable(true);
+    builder.setPositiveButton( R.string.ok, new DialogInterface.OnClickListener()
+      {
+      @Override
+      public void onClick(DialogInterface dialog, int which)
+        {
+
+        }
+      });
+
+    Bundle args = getArguments();
+    String errorStr;
+
+    try
+      {
+      errorStr = args.getString("error");
+      }
+    catch(Exception e)
+      {
+      errorStr = "Error";
+      }
+
+    final View view = inflater.inflate(R.layout.dialog_solver_error, null);
+    TextView text = view.findViewById(R.id.solver_error);
+    text.setText(errorStr);
+    builder.setView(view);
+
+    return builder.create();
+    }
+  }
diff --git a/src/main/java/org/distorted/objects/RubikObject.java b/src/main/java/org/distorted/objects/RubikObject.java
index cbd3f6a3..03550aaa 100644
--- a/src/main/java/org/distorted/objects/RubikObject.java
+++ b/src/main/java/org/distorted/objects/RubikObject.java
@@ -312,7 +312,7 @@ public abstract class RubikObject extends DistortedNode
 
     for(int i=0; i<numColors; i++)
       {
-      createFaceTexture(canvas,paint,i, i*TEXTURE_HEIGHT, 0, TEXTURE_HEIGHT);
+      createFaceTexture(canvas, paint, i, i*TEXTURE_HEIGHT, 0, TEXTURE_HEIGHT);
       }
 
     mTexture.setTexture(bitmap);
diff --git a/src/main/java/org/distorted/objects/RubikObjectMovement.java b/src/main/java/org/distorted/objects/RubikObjectMovement.java
index 59e19234..10fc89e9 100644
--- a/src/main/java/org/distorted/objects/RubikObjectMovement.java
+++ b/src/main/java/org/distorted/objects/RubikObjectMovement.java
@@ -288,7 +288,7 @@ public abstract class RubikObjectMovement
 
   public int getTouchedFace()
     {
-    return mLastTouchedAxis*mNumFacesPerAxis + mLastTouchedLR;
+    return mNumFacesPerAxis==2 ? 2*mLastTouchedAxis + 1 - mLastTouchedLR : mLastTouchedAxis;
     }
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
diff --git a/src/main/java/org/distorted/states/RubikStateSolver.java b/src/main/java/org/distorted/states/RubikStateSolver.java
index 41aa2536..1b904eb5 100644
--- a/src/main/java/org/distorted/states/RubikStateSolver.java
+++ b/src/main/java/org/distorted/states/RubikStateSolver.java
@@ -26,6 +26,7 @@ import android.graphics.Canvas;
 import android.graphics.Paint;
 import android.graphics.PorterDuff;
 import android.graphics.drawable.Drawable;
+import android.os.Bundle;
 import android.support.v4.content.ContextCompat;
 import android.util.DisplayMetrics;
 import android.view.View;
@@ -33,6 +34,7 @@ import android.widget.Button;
 import android.widget.ImageButton;
 import android.widget.LinearLayout;
 
+import org.distorted.dialogs.RubikDialogSolverError;
 import org.distorted.main.R;
 import org.distorted.main.RubikActivity;
 import org.distorted.main.RubikPostRender;
@@ -98,6 +100,8 @@ public class RubikStateSolver extends RubikStateAbstract
 	    else
 	      result = org.distorted.solvers.cube3.Search.solution(mCubeString, 24, 20);
 
+      mSolving = false;
+
 	    if (result.contains("Error"))
 	      {
 	      switch (result.charAt(result.length() - 1))
@@ -113,7 +117,11 @@ public class RubikStateSolver extends RubikStateAbstract
 		      case '9': result = res.getString(R.string.error9); break;
 		      }
 
-	      // TODO: pop up an error dialog.
+        RubikDialogSolverError dialog = new RubikDialogSolverError();
+        Bundle bundle = new Bundle();
+        bundle.putString("error", result );
+        dialog.setArguments(bundle);
+        dialog.show( mAct.getSupportFragmentManager(), null);
 	      }
 	    else
         {
@@ -169,11 +177,10 @@ public class RubikStateSolver extends RubikStateAbstract
     }
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
+// TODO
 
   private void setSolved( RubikActivity act, int numMoves, String moves)
     {
-    mSolving = false;
-
     RubikState.switchState(act,RubikState.SOLU);
     }
 
diff --git a/src/main/res/layout/dialog_solver_error.xml b/src/main/res/layout/dialog_solver_error.xml
new file mode 100644
index 00000000..8a2f2e93
--- /dev/null
+++ b/src/main/res/layout/dialog_solver_error.xml
@@ -0,0 +1,30 @@
+<?xml version="1.0" encoding="utf-8"?>
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+    android:layout_width="match_parent"
+    android:layout_height="match_parent"
+    android:gravity="center_horizontal"
+    android:orientation="vertical">
+
+    <LinearLayout
+        android:layout_width="fill_parent"
+        android:layout_height="fill_parent"
+        android:gravity="center|fill_horizontal"
+        android:layout_marginLeft="10dp"
+        android:layout_marginRight="10dp"
+        android:layout_marginTop="0dp"
+        android:background="@color/grey"
+        android:orientation="vertical">
+
+        <TextView
+            android:id="@+id/solver_error"
+            android:layout_width="match_parent"
+            android:layout_height="match_parent"
+            android:gravity="center"
+            android:textSize="24sp"
+            android:layout_marginTop="10dp"
+            android:layout_marginLeft="10dp"
+            android:layout_marginRight="10dp"
+            android:layout_marginBottom="10dp"/>
+
+    </LinearLayout>
+</LinearLayout>
\ No newline at end of file
diff --git a/src/main/res/values/strings.xml b/src/main/res/values/strings.xml
index 539d64dc..6e279fa8 100644
--- a/src/main/res/values/strings.xml
+++ b/src/main/res/values/strings.xml
@@ -6,6 +6,7 @@
     <string name="solve">Solve</string>
     <string name="exit">Exit</string>
     <string name="play">Play</string>
+    <string name="error">Error</string>
     <string name="effects">Effects</string>
     <string name="scores">High Scores</string>
     <string name="patterns">Pretty Patterns</string>
