commit 33499c563525c7b62b0aadd1f222abd8453ccc73
Author: Leszek Koltunski <leszek@koltunski.pl>
Date:   Tue Feb 18 13:08:09 2020 +0000

    Major rearrangement of the UI.

diff --git a/src/main/java/org/distorted/magic/RubikActivity.java b/src/main/java/org/distorted/magic/RubikActivity.java
index ddc9029f..a84e5a5e 100644
--- a/src/main/java/org/distorted/magic/RubikActivity.java
+++ b/src/main/java/org/distorted/magic/RubikActivity.java
@@ -19,17 +19,21 @@
 
 package org.distorted.magic;
 
+import android.content.SharedPreferences;
 import android.os.Bundle;
+import android.preference.PreferenceManager;
+import android.support.v4.app.FragmentManager;
 import android.support.v7.app.AppCompatActivity;
 import android.view.View;
 
+import org.distorted.effect.BaseEffect;
 import org.distorted.library.main.DistortedLibrary;
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
 public class RubikActivity extends AppCompatActivity implements View.OnClickListener
 {
-    private RubikDialogMain mMain;
+    RubikState mCurrentState;
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
@@ -40,13 +44,10 @@ public class RubikActivity extends AppCompatActivity implements View.OnClickList
       setTheme(R.style.CustomActivityThemeNoActionBar);
       setContentView(R.layout.main);
 
-      RubikSurfaceView view = findViewById(R.id.rubikSurfaceView);
-      view.enterMainState(this);
-
       if( savedState==null )
         {
-        mMain = new RubikDialogMain();
-        mMain.show(getSupportFragmentManager(), null);
+        RubikDialogMain diag = new RubikDialogMain();
+        diag.show(getSupportFragmentManager(), RubikDialogMain.getDialogTag() );
         }
       }
 
@@ -59,7 +60,7 @@ public class RubikActivity extends AppCompatActivity implements View.OnClickList
       view.onPause();
       DistortedLibrary.onPause();
       RubikScoresDownloader.onPause();
-      view.savePreferences();
+      savePreferences();
       super.onPause();
       }
 
@@ -71,7 +72,8 @@ public class RubikActivity extends AppCompatActivity implements View.OnClickList
       super.onResume();
       RubikSurfaceView view = findViewById(R.id.rubikSurfaceView);
       view.onResume();
-      view.restorePreferences();
+      restorePreferences();
+      view.enterState(this, mCurrentState);
       }
     
 ///////////////////////////////////////////////////////////////////////////////////////////////////
@@ -105,14 +107,60 @@ public class RubikActivity extends AppCompatActivity implements View.OnClickList
 
       if( id == RubikSurfaceView.BUTTON_ID_BACK )
         {
-        RubikSurfaceView view = findViewById(R.id.rubikSurfaceView);
-        view.enterMainState(this);
-        mMain.show(getSupportFragmentManager(), null);
+        mCurrentState = mCurrentState.getBack();
+
+        if( mCurrentState!=null )
+          {
+          RubikSurfaceView view = findViewById(R.id.rubikSurfaceView);
+          view.enterState(this, mCurrentState);
+
+          RubikDialogMain diag = new RubikDialogMain();
+          diag.show(getSupportFragmentManager(), RubikDialogMain.getDialogTag() );
+          }
+        else
+          {
+          mCurrentState = RubikState.MAIN;
+          finish();
+          }
         }
-      if( id == RubikSurfaceView.BUTTON_ID_EXIT )
+      }
+
+///////////////////////////////////////////////////////////////////////////////////////////////////
+
+    private void savePreferences()
+      {
+      SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(this);
+      SharedPreferences.Editor editor = preferences.edit();
+
+      for (int i = 0; i< BaseEffect.Type.LENGTH; i++)
+        {
+        BaseEffect.Type.getType(i).savePreferences(editor);
+        }
+
+      editor.putInt("state", mCurrentState.ordinal() );
+
+      RubikSurfaceView view = findViewById(R.id.rubikSurfaceView);
+      view.savePreferences(editor);
+
+      editor.apply();
+      }
+
+///////////////////////////////////////////////////////////////////////////////////////////////////
+
+    private void restorePreferences()
+      {
+      SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(this);
+
+      for (int i=0; i< BaseEffect.Type.LENGTH; i++)
         {
-        finish();
+        BaseEffect.Type.getType(i).restorePreferences(preferences);
         }
+
+      int stateOrdinal = preferences.getInt("state", RubikState.MAIN.ordinal() );
+      mCurrentState = RubikState.getState(stateOrdinal);
+
+      RubikSurfaceView view = findViewById(R.id.rubikSurfaceView);
+      view.restorePreferences(preferences);
       }
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
@@ -121,9 +169,21 @@ public class RubikActivity extends AppCompatActivity implements View.OnClickList
 
     public void Play(View v)
       {
-      mMain.dismiss();
+      FragmentManager mana = getSupportFragmentManager();
+      RubikDialogMain diag = (RubikDialogMain) mana.findFragmentByTag(RubikDialogMain.getDialogTag());
+
+      if( diag!=null )
+        {
+        diag.dismiss();
+        }
+      else
+        {
+        android.util.Log.e("act", "cannot find main dialog!");
+        }
+
+      mCurrentState = RubikState.PLAY;
       RubikSurfaceView view = findViewById(R.id.rubikSurfaceView);
-      view.enterPlayState(this);
+      view.enterState(this,mCurrentState);
       }
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
diff --git a/src/main/java/org/distorted/magic/RubikDialogMain.java b/src/main/java/org/distorted/magic/RubikDialogMain.java
index 69a452ae..9dd4624b 100644
--- a/src/main/java/org/distorted/magic/RubikDialogMain.java
+++ b/src/main/java/org/distorted/magic/RubikDialogMain.java
@@ -59,4 +59,11 @@ public class RubikDialogMain extends AppCompatDialogFragment
 
     return builder.create();
     }
+
+///////////////////////////////////////////////////////////////////////////////////////////////////
+
+  static String getDialogTag()
+    {
+    return "DialogMain";
+    }
   }
\ No newline at end of file
diff --git a/src/main/java/org/distorted/magic/RubikState.java b/src/main/java/org/distorted/magic/RubikState.java
new file mode 100644
index 00000000..b091dc09
--- /dev/null
+++ b/src/main/java/org/distorted/magic/RubikState.java
@@ -0,0 +1,66 @@
+///////////////////////////////////////////////////////////////////////////////////////////////////
+// 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.magic;
+
+///////////////////////////////////////////////////////////////////////////////////////////////////
+
+public enum RubikState
+  {
+  MAIN ( null ),
+  PLAY ( MAIN ),
+  ;
+
+  static final int LENGTH = values().length;
+  private final RubikState mBack;
+  private static final RubikState[] sizes;
+
+  static
+    {
+    int i = 0;
+    sizes = new RubikState[LENGTH];
+
+    for(RubikState size: RubikState.values())
+      {
+      sizes[i] = size;
+      i++;
+      }
+    }
+
+///////////////////////////////////////////////////////////////////////////////////////////////////
+
+  static RubikState getState(int ordinal)
+    {
+    return sizes[ordinal];
+    }
+
+///////////////////////////////////////////////////////////////////////////////////////////////////
+
+  RubikState(RubikState back)
+    {
+    mBack = back;
+    }
+
+///////////////////////////////////////////////////////////////////////////////////////////////////
+
+  RubikState getBack()
+    {
+    return mBack;
+    }
+  }
\ No newline at end of file
diff --git a/src/main/java/org/distorted/magic/RubikSurfaceView.java b/src/main/java/org/distorted/magic/RubikSurfaceView.java
index b7c66e9c..13988e1d 100644
--- a/src/main/java/org/distorted/magic/RubikSurfaceView.java
+++ b/src/main/java/org/distorted/magic/RubikSurfaceView.java
@@ -26,7 +26,6 @@ import android.content.pm.ConfigurationInfo;
 import android.graphics.PorterDuff;
 import android.graphics.drawable.Drawable;
 import android.opengl.GLSurfaceView;
-import android.preference.PreferenceManager;
 import android.support.v4.content.ContextCompat;
 import android.util.AttributeSet;
 import android.util.DisplayMetrics;
@@ -39,7 +38,6 @@ import android.widget.ImageButton;
 import android.widget.LinearLayout;
 
 import org.distorted.component.HorizontalNumberPicker;
-import org.distorted.effect.BaseEffect;
 import org.distorted.library.type.Static2D;
 import org.distorted.library.type.Static4D;
 import org.distorted.object.RubikCube;
@@ -50,7 +48,6 @@ import org.distorted.object.RubikCubeMovement;
 public class RubikSurfaceView extends GLSurfaceView
 {
     public static final int BUTTON_ID_BACK= 1023;
-    public static final int BUTTON_ID_EXIT= 1022;
 
     public static final int MIN_SCRAMBLE =  1;
     public static final int DEF_SCRAMBLE =  1;
@@ -91,34 +88,15 @@ public class RubikSurfaceView extends GLSurfaceView
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
-    void savePreferences()
+    void savePreferences(SharedPreferences.Editor editor)
       {
-      RubikActivity act = (RubikActivity)getContext();
-      SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(act);
-      SharedPreferences.Editor editor = preferences.edit();
-
-      for (int i = 0; i< BaseEffect.Type.LENGTH; i++)
-        {
-        BaseEffect.Type.getType(i).savePreferences(editor);
-        }
-
       editor.putInt("scramble", mScrambleValue );
-
-      editor.apply();
       }
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
-    void restorePreferences()
+    void restorePreferences(SharedPreferences preferences)
       {
-      RubikActivity act = (RubikActivity)getContext();
-      SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(act);
-
-      for (int i=0; i< BaseEffect.Type.LENGTH; i++)
-        {
-        BaseEffect.Type.getType(i).restorePreferences(preferences);
-        }
-
       mScrambleValue= preferences.getInt("scramble", DEF_SCRAMBLE);
       }
 
@@ -280,7 +258,18 @@ public class RubikSurfaceView extends GLSurfaceView
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
-    void enterMainState(RubikActivity act)
+    void enterState(RubikActivity act, RubikState state)
+      {
+      switch(state)
+        {
+        case MAIN: enterMainState(act); break;
+        case PLAY: enterPlayState(act); break;
+        }
+      }
+
+///////////////////////////////////////////////////////////////////////////////////////////////////
+
+    private void enterMainState(RubikActivity act)
       {
       LayoutInflater inflater = act.getLayoutInflater();
 
@@ -302,7 +291,7 @@ public class RubikSurfaceView extends GLSurfaceView
 
       Button buttonL = new Button(act);
       buttonL.setLayoutParams(params);
-      buttonL.setId(BUTTON_ID_EXIT);
+      buttonL.setId(BUTTON_ID_BACK);
       buttonL.setPadding(padding,0,padding,0);
       buttonL.setText(R.string.back);
       buttonL.setOnClickListener(act);
@@ -310,7 +299,7 @@ public class RubikSurfaceView extends GLSurfaceView
 
       Button buttonR = new Button(act);
       buttonR.setLayoutParams(params);
-      buttonR.setId(BUTTON_ID_EXIT);
+      buttonR.setId(BUTTON_ID_BACK);
       buttonR.setPadding(padding,0,padding,0);
       buttonR.setText(R.string.exit);
       buttonR.setOnClickListener(act);
@@ -321,7 +310,7 @@ public class RubikSurfaceView extends GLSurfaceView
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
-    void enterPlayState(RubikActivity act)
+    private void enterPlayState(RubikActivity act)
       {
       LayoutInflater inflater = act.getLayoutInflater();
 
