commit a6d3b1582dcb866251730ec574efd37899599280
Author: Leszek Koltunski <leszek@koltunski.pl>
Date:   Thu Mar 26 18:58:03 2020 +0000

    Progress with Pretty Patterns.

diff --git a/src/main/java/org/distorted/dialog/RubikDialogPatternView.java b/src/main/java/org/distorted/dialog/RubikDialogPatternView.java
index a563c05d..46b65c95 100644
--- a/src/main/java/org/distorted/dialog/RubikDialogPatternView.java
+++ b/src/main/java/org/distorted/dialog/RubikDialogPatternView.java
@@ -73,19 +73,17 @@ public class RubikDialogPatternView extends FrameLayout
     {
     DisplayMetrics metrics = act.getResources().getDisplayMetrics();
     final float scale = metrics.density;
-    int len = categories.length;
     int margin = (int)(3*scale + 0.5f);
     LinearLayout.LayoutParams bParams = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT,LinearLayout.LayoutParams.WRAP_CONTENT);
     bParams.setMargins(margin, margin, margin, margin);
 
     final RubikActivity ract = (RubikActivity)getContext();
 
-    for(int i=0; i<len; i++)
+    for(String category: categories)
       {
-      final int fi = i;
       Button button = new Button(act);
       button.setLayoutParams(bParams);
-      button.setText(categories[i]);
+      button.setText(category);
 
       button.setOnClickListener( new View.OnClickListener()
         {
diff --git a/src/main/java/org/distorted/magic/RubikActivity.java b/src/main/java/org/distorted/magic/RubikActivity.java
index 905716ac..8c5f5029 100644
--- a/src/main/java/org/distorted/magic/RubikActivity.java
+++ b/src/main/java/org/distorted/magic/RubikActivity.java
@@ -36,12 +36,11 @@ import org.distorted.scores.RubikScores;
 import org.distorted.scores.RubikScoresDownloader;
 import org.distorted.object.RubikObjectList;
 import org.distorted.uistate.RubikState;
-import org.distorted.uistate.RubikStateAbstract;
 import org.distorted.uistate.RubikStatePlay;
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
-public class RubikActivity extends AppCompatActivity implements View.OnClickListener
+public class RubikActivity extends AppCompatActivity
 {
     private boolean mJustStarted;
 
@@ -114,17 +113,6 @@ public class RubikActivity extends AppCompatActivity implements View.OnClickList
       super.onDestroy();
       }
 
-///////////////////////////////////////////////////////////////////////////////////////////////////
-
-    @Override
-    public void onClick(View v)
-      {
-      if( v.getId() == RubikStateAbstract.BUTTON_ID_BACK )
-        {
-        RubikState.goBack(this);
-        }
-      }
-
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
     private void savePreferences()
@@ -173,6 +161,16 @@ public class RubikActivity extends AppCompatActivity implements View.OnClickList
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 // PUBLIC API
+///////////////////////////////////////////////////////////////////////////////////////////////////
+
+    public void setCanRotate(boolean can)
+      {
+      RubikSurfaceView view = findViewById(R.id.rubikSurfaceView);
+      RubikRenderer renderer = view.getRenderer();
+
+      renderer.setCanRotate(can);
+      }
+
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
     public void changeObject(int object, int size)
@@ -181,7 +179,12 @@ public class RubikActivity extends AppCompatActivity implements View.OnClickList
       int objectSize = obj.getSizes()[size];
 
       RubikSurfaceView view = findViewById(R.id.rubikSurfaceView);
-      view.getRenderer().createObject(obj,objectSize);
+      RubikRenderer renderer = view.getRenderer();
+
+      if( renderer.canDrag() )
+        {
+        renderer.createObject(obj,objectSize);
+        }
       }
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
diff --git a/src/main/java/org/distorted/magic/RubikRenderer.java b/src/main/java/org/distorted/magic/RubikRenderer.java
index b40d1f27..93236598 100644
--- a/src/main/java/org/distorted/magic/RubikRenderer.java
+++ b/src/main/java/org/distorted/magic/RubikRenderer.java
@@ -163,7 +163,7 @@ public class RubikRenderer implements GLSurfaceView.Renderer, EffectListener
 
    boolean createObject(RubikObjectList object, int size)
      {
-     if( mCanDrag && mCanRotate && (object!=mNextObject || mNextSize!=size) && size>0 )
+     if( (object!=mNextObject || mNextSize!=size) && size>0 )
        {
        mChangeObject = true;
        mNextObject = object;
@@ -195,6 +195,13 @@ public class RubikRenderer implements GLSurfaceView.Renderer, EffectListener
        }
      }
 
+///////////////////////////////////////////////////////////////////////////////////////////////////
+
+   void setCanRotate(boolean can)
+     {
+     mCanRotate = can;
+     }
+
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
    boolean canRotate()
diff --git a/src/main/java/org/distorted/magic/RubikSurfaceView.java b/src/main/java/org/distorted/magic/RubikSurfaceView.java
index 421ca84b..16b6c1f7 100644
--- a/src/main/java/org/distorted/magic/RubikSurfaceView.java
+++ b/src/main/java/org/distorted/magic/RubikSurfaceView.java
@@ -162,21 +162,33 @@ public class RubikSurfaceView extends GLSurfaceView
 
     private void setUpDragOrRotate(float x, float y)
       {
-      Static4D touchPoint1 = new Static4D(x, y, 0, 0);
-      Static4D rotatedTouchPoint1= rotateVectorByInvertedQuat(touchPoint1, mQuatAccumulated);
-      Static4D rotatedCamera= rotateVectorByInvertedQuat(CAMERA_POINT, mQuatAccumulated);
+      boolean rota = mRenderer.canRotate();
+      boolean drag = mRenderer.canDrag();
 
-      if( mMovement!=null && mMovement.faceTouched(rotatedTouchPoint1,rotatedCamera) )
+      if( !rota && drag )
         {
-        mDragging           = false;
-        mBeginningRotation  = mRenderer.canRotate();
+        mDragging           = true;
+        mBeginningRotation  = false;
         mContinuingRotation = false;
         }
       else
         {
-        mDragging           = mRenderer.canDrag();
-        mBeginningRotation  = false;
-        mContinuingRotation = false;
+        Static4D touchPoint1 = new Static4D(x, y, 0, 0);
+        Static4D rotatedTouchPoint1= rotateVectorByInvertedQuat(touchPoint1, mQuatAccumulated);
+        Static4D rotatedCamera= rotateVectorByInvertedQuat(CAMERA_POINT, mQuatAccumulated);
+
+        if( mMovement!=null && mMovement.faceTouched(rotatedTouchPoint1,rotatedCamera) )
+          {
+          mDragging           = false;
+          mBeginningRotation  = rota;
+          mContinuingRotation = false;
+          }
+        else
+          {
+          mDragging           = drag;
+          mBeginningRotation  = false;
+          mContinuingRotation = false;
+          }
         }
       }
 
diff --git a/src/main/java/org/distorted/uistate/RubikState.java b/src/main/java/org/distorted/uistate/RubikState.java
index 610ea2f6..5879a3e1 100644
--- a/src/main/java/org/distorted/uistate/RubikState.java
+++ b/src/main/java/org/distorted/uistate/RubikState.java
@@ -37,7 +37,7 @@ public enum RubikState
   private final RubikStateAbstract mClass;
   private static final RubikState[] sizes;
 
-  private static RubikState mCurrState, mPrevState;
+  private static RubikState mCurrState;
 
   static
     {
@@ -70,7 +70,6 @@ public enum RubikState
   public static void savePreferences(SharedPreferences.Editor editor)
     {
     editor.putInt("curr_state", mCurrState.ordinal() );
-    editor.putInt("prev_state", mPrevState.ordinal() );
     }
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
@@ -78,10 +77,7 @@ public enum RubikState
   public static void restorePreferences(SharedPreferences preferences)
     {
     int currState = preferences.getInt("curr_state", RubikState.MAIN.ordinal() );
-    int prevState = preferences.getInt("prev_state", RubikState.MAIN.ordinal() );
-
     mCurrState = getState(currState);
-    mPrevState = getState(prevState);
     }
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
@@ -95,7 +91,7 @@ public enum RubikState
 
   public static void setState(RubikActivity act)
     {
-    mCurrState.enterState(act,mPrevState);
+    mCurrState.enterState(act);
     }
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
@@ -105,8 +101,7 @@ public enum RubikState
     if( next!=null )
       {
       if( mCurrState!=null ) mCurrState.leaveState(act);
-      next.enterState(act,mCurrState);
-      mPrevState = mCurrState;
+      next.enterState(act);
       mCurrState = next;
       }
     else
@@ -139,8 +134,8 @@ public enum RubikState
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
-  public void enterState(RubikActivity act, RubikState prevState)
+  public void enterState(RubikActivity act)
     {
-    mClass.enterState(act,prevState);
+    mClass.enterState(act);
     }
   }
\ No newline at end of file
diff --git a/src/main/java/org/distorted/uistate/RubikStateAbstract.java b/src/main/java/org/distorted/uistate/RubikStateAbstract.java
index 1d5912ef..b5c047a7 100644
--- a/src/main/java/org/distorted/uistate/RubikStateAbstract.java
+++ b/src/main/java/org/distorted/uistate/RubikStateAbstract.java
@@ -26,9 +26,9 @@ import org.distorted.magic.RubikActivity;
 
 public abstract class RubikStateAbstract
   {
-  public static final int BUTTON_ID_BACK  = 1023;
+  static final int BUTTON_ID_BACK  = 1023;
 
-  abstract void enterState(RubikActivity act, RubikState prev);
+  abstract void enterState(RubikActivity act);
   abstract void leaveState(RubikActivity act);
   public abstract void savePreferences(SharedPreferences.Editor editor);
   public abstract void restorePreferences(SharedPreferences preferences);
diff --git a/src/main/java/org/distorted/uistate/RubikStateMain.java b/src/main/java/org/distorted/uistate/RubikStateMain.java
index 879797c9..2cf97818 100644
--- a/src/main/java/org/distorted/uistate/RubikStateMain.java
+++ b/src/main/java/org/distorted/uistate/RubikStateMain.java
@@ -23,12 +23,12 @@ 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.dialog.RubikDialogPattern;
 import org.distorted.magic.R;
 import org.distorted.magic.RubikActivity;
 
@@ -53,7 +53,7 @@ public class RubikStateMain extends RubikStateAbstract
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
-  void enterState(RubikActivity act, RubikState prev)
+  void enterState(final RubikActivity act)
     {
     FragmentManager mana = act.getSupportFragmentManager();
     RubikDialogMain diag = (RubikDialogMain) mana.findFragmentByTag(RubikDialogMain.getDialogTag());
@@ -64,12 +64,6 @@ public class RubikStateMain extends RubikStateAbstract
       diag2.show( mana, RubikDialogMain.getDialogTag() );
       }
 
-    if( prev==RubikState.PATT )
-      {
-      RubikDialogPattern diag2 = new RubikDialogPattern();
-      diag2.show( mana, RubikDialogPattern.getDialogTag() );
-      }
-
     LayoutInflater inflater = act.getLayoutInflater();
 
     // TOP ////////////////////////////
@@ -95,7 +89,16 @@ public class RubikStateMain extends RubikStateAbstract
     buttonR.setId(BUTTON_ID_BACK);
     buttonR.setPadding(padding,0,padding,0);
     buttonR.setText(R.string.exit);
-    buttonR.setOnClickListener(act);
+
+    buttonR.setOnClickListener( new View.OnClickListener()
+      {
+      @Override
+      public void onClick(View v)
+        {
+        RubikState.goBack(act);
+        }
+      });
+
     layoutRight.addView(buttonR);
     }
 
diff --git a/src/main/java/org/distorted/uistate/RubikStatePattern.java b/src/main/java/org/distorted/uistate/RubikStatePattern.java
index 9253a503..f3eafa06 100644
--- a/src/main/java/org/distorted/uistate/RubikStatePattern.java
+++ b/src/main/java/org/distorted/uistate/RubikStatePattern.java
@@ -20,12 +20,15 @@
 package org.distorted.uistate;
 
 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.RubikDialogPattern;
 import org.distorted.magic.R;
 import org.distorted.magic.RubikActivity;
 
@@ -46,13 +49,15 @@ public class RubikStatePattern extends RubikStateAbstract
 
   void leaveState(RubikActivity act)
     {
-
+    act.setCanRotate(true);
     }
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
-  void enterState(RubikActivity act, RubikState prev)
+  void enterState(final RubikActivity act)
     {
+    act.setCanRotate(false);
+
     LayoutInflater inflater = act.getLayoutInflater();
 
     // TOP ////////////////////////////
@@ -78,7 +83,20 @@ public class RubikStatePattern extends RubikStateAbstract
     button.setId(BUTTON_ID_BACK);
     button.setPadding(padding,0,padding,0);
     button.setText(R.string.back);
-    button.setOnClickListener(act);
+
+    button.setOnClickListener( new View.OnClickListener()
+      {
+      @Override
+      public void onClick(View v)
+        {
+        RubikState.goBack(act);
+
+        FragmentManager mana = act.getSupportFragmentManager();
+        RubikDialogPattern diag = new RubikDialogPattern();
+        diag.show( mana, RubikDialogPattern.getDialogTag() );
+        }
+      });
+
     layoutRight.addView(button);
     }
 
diff --git a/src/main/java/org/distorted/uistate/RubikStatePlay.java b/src/main/java/org/distorted/uistate/RubikStatePlay.java
index 613fc0fc..83edba92 100644
--- a/src/main/java/org/distorted/uistate/RubikStatePlay.java
+++ b/src/main/java/org/distorted/uistate/RubikStatePlay.java
@@ -65,7 +65,7 @@ public class RubikStatePlay extends RubikStateAbstract
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
-  void enterState(final RubikActivity act, RubikState prev)
+  void enterState(final RubikActivity act)
     {
     LayoutInflater inflater = act.getLayoutInflater();
 
@@ -141,7 +141,15 @@ public class RubikStatePlay extends RubikStateAbstract
     mBackButton.setId(BUTTON_ID_BACK);
     mBackButton.setPadding(padding,0,padding,0);
     mBackButton.setText(R.string.back);
-    mBackButton.setOnClickListener(act);
+
+    mBackButton.setOnClickListener( new View.OnClickListener()
+      {
+      @Override
+      public void onClick(View v)
+        {
+        RubikState.goBack(act);
+        }
+      });
     }
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
diff --git a/src/main/java/org/distorted/uistate/RubikStateSolving.java b/src/main/java/org/distorted/uistate/RubikStateSolving.java
index 641bab52..67bb656b 100644
--- a/src/main/java/org/distorted/uistate/RubikStateSolving.java
+++ b/src/main/java/org/distorted/uistate/RubikStateSolving.java
@@ -22,6 +22,7 @@ package org.distorted.uistate;
 import android.content.SharedPreferences;
 import android.util.DisplayMetrics;
 import android.view.LayoutInflater;
+import android.view.View;
 import android.widget.Button;
 import android.widget.LinearLayout;
 import android.widget.TextView;
@@ -60,7 +61,7 @@ public class RubikStateSolving extends RubikStateAbstract
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
-  void enterState(RubikActivity act, RubikState prev)
+  void enterState(final RubikActivity act)
     {
     LayoutInflater inflater = act.getLayoutInflater();
 
@@ -87,7 +88,16 @@ public class RubikStateSolving extends RubikStateAbstract
     mBack.setId(BUTTON_ID_BACK);
     mBack.setPadding(padding,0,padding,0);
     mBack.setText(R.string.back);
-    mBack.setOnClickListener(act);
+
+    mBack.setOnClickListener( new View.OnClickListener()
+      {
+      @Override
+      public void onClick(View v)
+        {
+        RubikState.goBack(act);
+        }
+      });
+
     layoutRight.addView(mBack);
     }
 
