commit 0594c61f517536f7044373ad0828fbd5ea2ed3b2
Author: Leszek Koltunski <leszek@koltunski.pl>
Date:   Thu Jun 10 00:31:54 2021 +0200

    Backing moves: constant angle speed (part 2).

diff --git a/src/main/java/org/distorted/main/RubikPreRender.java b/src/main/java/org/distorted/main/RubikPreRender.java
index 7ce9b468..72ccd2ed 100644
--- a/src/main/java/org/distorted/main/RubikPreRender.java
+++ b/src/main/java/org/distorted/main/RubikPreRender.java
@@ -59,7 +59,7 @@ public class RubikPreRender implements EffectController
   private boolean mFinishRotation, mRemoveRotation, mRemovePatternRotation, mAddRotation,
                   mSetQuat, mChangeObject, mSetupObject, mSolveObject, mScrambleObject,
                   mInitializeObject, mSetTextureMap, mResetAllTextureMaps;
-  private boolean mCanRotate, mCanPlay;
+  private boolean mUIBlocked, mTouchBlocked;
   private boolean mIsSolved;
   private ObjectList mNextObject;
   private int mNextSize;
@@ -531,32 +531,46 @@ public class RubikPreRender implements EffectController
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
-  boolean canRotate()
+  boolean isTouchBlocked()
     {
-    return mCanRotate;
+    return mTouchBlocked;
     }
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
-  public boolean canPlay()
+  public boolean isUINotBlocked()
     {
-    return mCanPlay;
+    return !mUIBlocked;
     }
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
   public void blockEverything()
     {
-    mCanRotate = false;
-    mCanPlay   = false;
+    mUIBlocked   = true;
+    mTouchBlocked= true;
+    }
+
+///////////////////////////////////////////////////////////////////////////////////////////////////
+
+  public void blockTouch()
+    {
+    mTouchBlocked= true;
     }
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
   public void unblockEverything()
     {
-    mCanRotate = true;
-    mCanPlay   = true;
+    mUIBlocked   = false;
+    mTouchBlocked= false;
+    }
+
+///////////////////////////////////////////////////////////////////////////////////////////////////
+
+  public void unblockTouch()
+    {
+    mTouchBlocked= false;
     }
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
@@ -616,7 +630,7 @@ public class RubikPreRender implements EffectController
 
   public void scrambleObject(int num)
     {
-    if( mCanPlay )
+    if( !mUIBlocked )
       {
       mScrambleObject = true;
       mScrambleObjectNum = num;
@@ -629,7 +643,7 @@ public class RubikPreRender implements EffectController
 
   public void solveObject()
     {
-    if( mCanPlay )
+    if( !mUIBlocked )
       {
       mSolveObject = true;
       }
diff --git a/src/main/java/org/distorted/main/RubikSurfaceView.java b/src/main/java/org/distorted/main/RubikSurfaceView.java
index 7a750887..8b193323 100644
--- a/src/main/java/org/distorted/main/RubikSurfaceView.java
+++ b/src/main/java/org/distorted/main/RubikSurfaceView.java
@@ -321,7 +321,7 @@ public class RubikSurfaceView extends GLSurfaceView
 
           if( mode==MODE_ROTATE )
             {
-            mBeginningRotation= mPreRender.canRotate();
+            mBeginningRotation= !mPreRender.isTouchBlocked();
             }
           else if( mode==MODE_REPLACE )
             {
diff --git a/src/main/java/org/distorted/patterns/RubikPattern.java b/src/main/java/org/distorted/patterns/RubikPattern.java
index cbe70a0c..54ff65bf 100644
--- a/src/main/java/org/distorted/patterns/RubikPattern.java
+++ b/src/main/java/org/distorted/patterns/RubikPattern.java
@@ -30,21 +30,21 @@ import static org.distorted.patterns.RubikPatternList.NUM_OBJECTS;
 
 public class RubikPattern
 {
-  private static final int DURATION_MILLIS = 750;
+  private static final int MILLIS_PER_DEGREE = 6;
 
-  private int[] numCategories    = new int[NUM_OBJECTS];
-  private int[] currentCategory  = new int[NUM_OBJECTS];
-  private int[] currentVisiblePos= new int[NUM_OBJECTS];
-  private int[] currentExpanded  = new int[NUM_OBJECTS];
+  private final int[] numCategories    = new int[NUM_OBJECTS];
+  private final int[] currentCategory  = new int[NUM_OBJECTS];
+  private final int[] currentVisiblePos= new int[NUM_OBJECTS];
+  private final int[] currentExpanded  = new int[NUM_OBJECTS];
 
-  private List<List<Category>> mCategories;
+  private final List<List<Category>> mCategories;
   private static RubikPattern mThis;
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
   private static class Category
     {
-    private String[] mLines;
+    private final String[] mLines;
     private int numPatterns;
     private ArrayList<Pattern> mPatterns;
     private boolean mInitialized;
@@ -270,12 +270,12 @@ public class RubikPattern
 		      int bareAngle = moves[curMove-1][2];
 		      int basicAngle= pre.getObject().getBasicAngle()[axis];
           int angle     = bareAngle*(360/basicAngle);
-          int numRot    = Math.abs(bareAngle);
+          int duration  = Math.abs(angle)*MILLIS_PER_DEGREE;
 
           if( angle!=0 )
             {
             mCanRotate = false;
-            pre.addRotation(this, axis, rowBitmap, angle, numRot*DURATION_MILLIS);
+            pre.addRotation(this, axis, rowBitmap, angle, duration);
             }
           else
             {
@@ -311,12 +311,12 @@ public class RubikPattern
 		      int bareAngle = moves[curMove][2];
 		      int basicAngle= pre.getObject().getBasicAngle()[axis];
           int angle     = bareAngle*(360/basicAngle);
-          int numRot    = Math.abs(bareAngle);
+          int duration  = Math.abs(angle)*MILLIS_PER_DEGREE;
 
           if( angle!=0 )
             {
             mCanRotate = false;
-            pre.addRotation(this, axis, rowBitmap, -angle, numRot*DURATION_MILLIS);
+            pre.addRotation(this, axis, rowBitmap, -angle, duration);
             }
           else
             {
diff --git a/src/main/java/org/distorted/screens/RubikScreenBase.java b/src/main/java/org/distorted/screens/RubikScreenBase.java
index 21624bf8..467493dc 100644
--- a/src/main/java/org/distorted/screens/RubikScreenBase.java
+++ b/src/main/java/org/distorted/screens/RubikScreenBase.java
@@ -26,7 +26,6 @@ import android.widget.LinearLayout;
 import org.distorted.main.R;
 import org.distorted.main.RubikActivity;
 import org.distorted.main.RubikPreRender;
-import org.distorted.objects.TwistyObject;
 
 import java.util.ArrayList;
 
@@ -34,10 +33,11 @@ import java.util.ArrayList;
 
 abstract class RubikScreenBase extends RubikScreenAbstract implements RubikPreRender.ActionFinishedListener
   {
-  private static final int REVOLUTION_MILLIS = 2000;
+  private static final int MILLIS_PER_DEGREE = 6;
 
   private ImageButton mPrevButton, mLockButton;
   private boolean mCanPrevMove;
+  private RubikPreRender mPre;
 
   private static class Move
     {
@@ -67,11 +67,13 @@ abstract class RubikScreenBase extends RubikScreenAbstract implements RubikPreRe
         int axis  = move.mAxis;
         int row   = (1<<move.mRow);
         int angle = move.mAngle;
-        int duration= (int)(Math.abs(angle/360.0f)*REVOLUTION_MILLIS);
+        int duration= Math.abs(angle)*MILLIS_PER_DEGREE;
 
         if( angle!=0 )
           {
           mCanPrevMove = false;
+          mPre = pre;
+          pre.blockTouch();
           pre.addRotation(this, axis, row, -angle, duration);
           }
         else
@@ -198,5 +200,6 @@ abstract class RubikScreenBase extends RubikScreenAbstract implements RubikPreRe
   public void onActionFinished(final long effectID)
     {
     mCanPrevMove = true;
+    mPre.unblockTouch();
     }
   }
diff --git a/src/main/java/org/distorted/screens/RubikScreenPlay.java b/src/main/java/org/distorted/screens/RubikScreenPlay.java
index 0d26310e..4569b23a 100644
--- a/src/main/java/org/distorted/screens/RubikScreenPlay.java
+++ b/src/main/java/org/distorted/screens/RubikScreenPlay.java
@@ -33,7 +33,6 @@ import android.widget.ImageButton;
 import android.widget.LinearLayout;
 import android.widget.PopupWindow;
 
-import org.distorted.control.RubikControl;
 import org.distorted.dialogs.RubikDialogAbout;
 import org.distorted.dialogs.RubikDialogPattern;
 import org.distorted.dialogs.RubikDialogScores;
@@ -126,7 +125,7 @@ public class RubikScreenPlay extends RubikScreenBase
       @Override
       public void onClick(View view)
         {
-        if( act.getPreRender().canPlay() )
+        if(act.getPreRender().isUINotBlocked())
           {
           if( mObjectPopup==null )
             {
@@ -163,7 +162,7 @@ public class RubikScreenPlay extends RubikScreenBase
       @Override
       public void onClick(View view)
         {
-        if( act.getPreRender().canPlay() )
+        if(act.getPreRender().isUINotBlocked())
           {
           if( mPlayPopup==null )
             {
@@ -204,7 +203,7 @@ public class RubikScreenPlay extends RubikScreenBase
       @Override
       public void onClick(View view)
         {
-        if( act.getPreRender().canPlay() )
+        if(act.getPreRender().isUINotBlocked())
           {
           if( mMenuPopup==null )
             {
@@ -286,7 +285,7 @@ public class RubikScreenPlay extends RubikScreenBase
           @Override
           public void onClick(View v)
             {
-            if( act.getPreRender().canPlay() && ScreenList.getCurrentScreen()== ScreenList.PLAY )
+            if( act.getPreRender().isUINotBlocked() && ScreenList.getCurrentScreen()== ScreenList.PLAY )
               {
               mObject = obj;
               mSize   = sizes[index];
@@ -566,7 +565,7 @@ public class RubikScreenPlay extends RubikScreenBase
           {
           RubikPreRender pre = act.getPreRender();
 
-          if( pre.canPlay() )
+          if(pre.isUINotBlocked())
             {
             mPlayPopup.dismiss();
             mLevelValue = scrambles;
diff --git a/src/main/java/org/distorted/screens/RubikScreenSolution.java b/src/main/java/org/distorted/screens/RubikScreenSolution.java
index 9b5ece51..5fc2ccd9 100644
--- a/src/main/java/org/distorted/screens/RubikScreenSolution.java
+++ b/src/main/java/org/distorted/screens/RubikScreenSolution.java
@@ -38,7 +38,7 @@ import org.distorted.patterns.RubikPattern;
 
 public class RubikScreenSolution extends RubikScreenAbstract implements RubikPreRender.ActionFinishedListener
   {
-  private static final int DURATION_MILLIS = 750;
+  private static final int MILLIS_PER_DEGREE = 6;
 
   private ImageButton mPrevButton, mNextButton, mBackButton;
   private TextView mMovesText;
@@ -202,12 +202,12 @@ public class RubikScreenSolution extends RubikScreenAbstract implements RubikPre
 		    int bareAngle = mMoves[mCurrMove-1][2];
 		    int basicAngle= pre.getObject().getBasicAngle()[axis];
         int angle     = bareAngle*(360/basicAngle);
-        int numRot    = Math.abs(bareAngle);
+        int duration  = Math.abs(angle)*MILLIS_PER_DEGREE;
 
         if( angle!=0 )
           {
           mCanRotate = false;
-          pre.addRotation(this, axis, rowBitmap, angle, numRot*DURATION_MILLIS);
+          pre.addRotation(this, axis, rowBitmap, angle, duration);
           }
         else
           {
@@ -241,12 +241,12 @@ public class RubikScreenSolution extends RubikScreenAbstract implements RubikPre
 		    int bareAngle = mMoves[mCurrMove][2];
         int basicAngle= pre.getObject().getBasicAngle()[axis];
         int angle     = bareAngle*(360/basicAngle);
-        int numRot    = Math.abs(bareAngle);
+        int duration  = Math.abs(angle)*MILLIS_PER_DEGREE;
 
         if( angle!=0 )
           {
           mCanRotate = false;
-          pre.addRotation(this, axis, rowBitmap, -angle, numRot*DURATION_MILLIS);
+          pre.addRotation(this, axis, rowBitmap, -angle, duration);
           }
         else
           {
diff --git a/src/main/java/org/distorted/tutorials/TutorialState.java b/src/main/java/org/distorted/tutorials/TutorialState.java
index 79f476b8..63016e61 100644
--- a/src/main/java/org/distorted/tutorials/TutorialState.java
+++ b/src/main/java/org/distorted/tutorials/TutorialState.java
@@ -27,7 +27,6 @@ import org.distorted.main.R;
 import org.distorted.main.RubikActivity;
 import org.distorted.main.RubikPreRender;
 import org.distorted.objects.ObjectList;
-import org.distorted.objects.TwistyObject;
 import org.distorted.screens.RubikScreenPlay;
 import org.distorted.screens.ScreenList;
 import org.distorted.screens.TransparentImageButton;
@@ -38,7 +37,7 @@ import java.util.ArrayList;
 
 public class TutorialState implements RubikPreRender.ActionFinishedListener
 {
-  private static final int DURATION_MILLIS = 750;
+  private static final int MILLIS_PER_DEGREE = 6;
 
   private ImageButton mPrevButton, mLockButton, mSolveButton, mScrambleButton, mBackButton;
 
@@ -68,19 +67,16 @@ public class TutorialState implements RubikPreRender.ActionFinishedListener
 
       if( numMoves>0 )
         {
-        Move move = mMoves.remove(numMoves-1);
-        TwistyObject object = pre.getObject();
-
-        int axis  = move.mAxis;
-        int row   = (1<<move.mRow);
-        int angle = move.mAngle;
-        int basic = object.getBasicAngle()[axis];
-        int numRot= Math.abs(angle*basic/360);
+        Move move   = mMoves.remove(numMoves-1);
+        int axis    = move.mAxis;
+        int row     = (1<<move.mRow);
+        int angle   = move.mAngle;
+        int duration= Math.abs(angle)*MILLIS_PER_DEGREE;
 
         if( angle!=0 )
           {
           mCanPrevMove = false;
-          pre.addRotation(this, axis, row, -angle, numRot*DURATION_MILLIS);
+          pre.addRotation(this, axis, row, -angle, duration);
           }
         else
           {
