commit ad9e8bb356edd3adcdc6d15e9d396ab83ddeaf3a
Author: Leszek Koltunski <leszek@koltunski.pl>
Date:   Wed Feb 19 01:08:58 2020 +0000

    Beginnings of the 'Solving' state.

diff --git a/src/main/java/org/distorted/magic/RubikRenderer.java b/src/main/java/org/distorted/magic/RubikRenderer.java
index 96a3a375..fdaf4ac2 100644
--- a/src/main/java/org/distorted/magic/RubikRenderer.java
+++ b/src/main/java/org/distorted/magic/RubikRenderer.java
@@ -204,8 +204,6 @@ public class RubikRenderer implements GLSurfaceView.Renderer, EffectListener
      mSetQuatAccumulated = true;
      }
 
-///////////////////////////////////////////////////////////////////////////////////////////////////
-// PUBLIC API
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 // various things are done here delayed, 'after the next render' as not to be done mid-render and
 // cause artifacts.
@@ -328,6 +326,8 @@ public class RubikRenderer implements GLSurfaceView.Renderer, EffectListener
         }
       }
 
+///////////////////////////////////////////////////////////////////////////////////////////////////
+// PUBLIC API
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
    public void effectFinished(final long effectID)
@@ -345,6 +345,20 @@ public class RubikRenderer implements GLSurfaceView.Renderer, EffectListener
            mCanRotate   = true;
            mCanDrag     = true;
            mCanUI       = true;
+
+           if( i==BaseEffect.Type.SCRAMBLE.ordinal() )
+             {
+             final RubikActivity act = (RubikActivity)mView.getContext();
+
+             act.runOnUiThread(new Runnable()
+               {
+               @Override
+               public void run()
+                 {
+                 RubikState.switchState( act, RubikState.SOLV);
+                 }
+               });
+             }
            break;
            }
          }
diff --git a/src/main/java/org/distorted/uistate/RubikState.java b/src/main/java/org/distorted/uistate/RubikState.java
index 21d96191..b08e0894 100644
--- a/src/main/java/org/distorted/uistate/RubikState.java
+++ b/src/main/java/org/distorted/uistate/RubikState.java
@@ -26,8 +26,9 @@ import org.distorted.magic.RubikActivity;
 
 public enum RubikState
   {
-  MAIN ( null , new RubikStateMain() ),
-  PLAY ( MAIN , new RubikStatePlay() ),
+  MAIN ( null , new RubikStateMain()    ),
+  PLAY ( MAIN , new RubikStatePlay()    ),
+  SOLV ( PLAY , new RubikStateSolving() ),
   ;
 
   public static final int LENGTH = values().length;
@@ -56,6 +57,13 @@ public enum RubikState
     return sizes[ordinal];
     }
 
+///////////////////////////////////////////////////////////////////////////////////////////////////
+
+  public static RubikState getCurrentState()
+    {
+    return mCurrentState;
+    }
+
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
   public static void savePreferences(SharedPreferences.Editor editor)
@@ -75,7 +83,7 @@ public enum RubikState
 
   public static void goBack(RubikActivity act)
     {
-    switchState(act, mCurrentState.getBack() );
+    switchState(act, mCurrentState.mBack );
     }
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
@@ -109,13 +117,6 @@ public enum RubikState
     mClass = clazz;
     }
 
-///////////////////////////////////////////////////////////////////////////////////////////////////
-
-  public RubikState getBack()
-    {
-    return mBack;
-    }
-
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
   public RubikStateAbstract getStateClass()
diff --git a/src/main/java/org/distorted/uistate/RubikStateMain.java b/src/main/java/org/distorted/uistate/RubikStateMain.java
index 67240914..2266e519 100644
--- a/src/main/java/org/distorted/uistate/RubikStateMain.java
+++ b/src/main/java/org/distorted/uistate/RubikStateMain.java
@@ -23,9 +23,9 @@ import android.content.SharedPreferences;
 import android.support.v4.app.FragmentManager;
 import android.util.DisplayMetrics;
 import android.view.LayoutInflater;
-import android.view.View;
 import android.widget.Button;
 import android.widget.LinearLayout;
+import android.widget.TextView;
 
 import org.distorted.dialog.RubikDialogMain;
 import org.distorted.magic.R;
@@ -70,8 +70,9 @@ public class RubikStateMain extends RubikStateAbstract
     // TOP ////////////////////////////
     LinearLayout layoutTop = act.findViewById(R.id.mainTitle);
     layoutTop.removeAllViews();
-    final View viewTop = inflater.inflate(R.layout.main_title, null);
-    layoutTop.addView(viewTop);
+    final TextView text = (TextView)inflater.inflate(R.layout.upper_text, null);
+    text.setText(R.string.app_name);
+    layoutTop.addView(text);
 
     // BOT ////////////////////////////
     LinearLayout layoutBot = act.findViewById(R.id.mainBar);
diff --git a/src/main/java/org/distorted/uistate/RubikStateSolving.java b/src/main/java/org/distorted/uistate/RubikStateSolving.java
new file mode 100644
index 00000000..bc767c87
--- /dev/null
+++ b/src/main/java/org/distorted/uistate/RubikStateSolving.java
@@ -0,0 +1,98 @@
+///////////////////////////////////////////////////////////////////////////////////////////////////
+// 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.uistate;
+
+import android.content.SharedPreferences;
+import android.util.DisplayMetrics;
+import android.view.LayoutInflater;
+import android.widget.Button;
+import android.widget.LinearLayout;
+import android.widget.TextView;
+
+import org.distorted.magic.R;
+import org.distorted.magic.RubikActivity;
+
+import static android.view.View.INVISIBLE;
+
+///////////////////////////////////////////////////////////////////////////////////////////////////
+
+public class RubikStateSolving extends RubikStateAbstract
+  {
+  public void leaveState(RubikActivity act)
+    {
+
+    }
+
+///////////////////////////////////////////////////////////////////////////////////////////////////
+
+  public void enterState(RubikActivity act)
+    {
+    LayoutInflater inflater = act.getLayoutInflater();
+
+    // TOP ////////////////////////////
+    LinearLayout layoutTop = act.findViewById(R.id.mainTitle);
+    layoutTop.removeAllViews();
+    final TextView text = (TextView)inflater.inflate(R.layout.upper_text, null);
+    text.setText(R.string.ready);
+    layoutTop.addView(text);
+
+    // BOT ////////////////////////////
+    LinearLayout layoutBot = act.findViewById(R.id.mainBar);
+    layoutBot.removeAllViews();
+
+    DisplayMetrics metrics = act.getResources().getDisplayMetrics();
+    float scale = metrics.density;
+    int size = (int)(60*scale +0.5f);
+    int padding = (int)(5*scale + 0.5f);
+    LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT,size,0.5f);
+
+    Button buttonL = new Button(act);
+    buttonL.setLayoutParams(params);
+    buttonL.setId(BUTTON_ID_BACK);
+    buttonL.setPadding(padding,0,padding,0);
+    buttonL.setText(R.string.back);
+    buttonL.setOnClickListener(act);
+    layoutBot.addView(buttonL);
+
+    Button buttonR = new Button(act);
+    buttonR.setLayoutParams(params);
+    buttonR.setId(BUTTON_ID_BACK);
+    buttonR.setPadding(padding,0,padding,0);
+    buttonR.setText(R.string.back);
+    buttonR.setOnClickListener(act);
+    layoutBot.addView(buttonR);
+
+    buttonL.setVisibility(INVISIBLE);
+    }
+
+///////////////////////////////////////////////////////////////////////////////////////////////////
+
+  public void savePreferences(SharedPreferences.Editor editor)
+    {
+
+    }
+
+///////////////////////////////////////////////////////////////////////////////////////////////////
+
+  public void restorePreferences(SharedPreferences preferences)
+    {
+
+    }
+  }
diff --git a/src/main/res/layout/main_title.xml b/src/main/res/layout/main_title.xml
deleted file mode 100644
index f8fc1480..00000000
--- a/src/main/res/layout/main_title.xml
+++ /dev/null
@@ -1,7 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<TextView xmlns:android="http://schemas.android.com/apk/res/android"
-        android:layout_width="fill_parent"
-        android:layout_height="50dp"
-        android:textAlignment="center"
-        android:textSize="30sp"
-        android:text="@string/app_name"/>
diff --git a/src/main/res/layout/upper_text.xml b/src/main/res/layout/upper_text.xml
new file mode 100644
index 00000000..944e8a13
--- /dev/null
+++ b/src/main/res/layout/upper_text.xml
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8"?>
+<TextView xmlns:android="http://schemas.android.com/apk/res/android"
+        android:layout_width="fill_parent"
+        android:layout_height="50dp"
+        android:textAlignment="center"
+        android:textSize="30sp"/>
diff --git a/src/main/res/values/strings.xml b/src/main/res/values/strings.xml
index 54891260..7c016297 100644
--- a/src/main/res/values/strings.xml
+++ b/src/main/res/values/strings.xml
@@ -12,6 +12,7 @@
     <string name="back">Back</string>
     <string name="save">SAVE</string>
     <string name="ok">OK</string>
+    <string name="ready">Ready?</string>
     <string name="sizechange_effect">Size Change Effect</string>
     <string name="solve_effect">Solve Effect</string>
     <string name="scramble_effect">Scramble Effect</string>
