commit 3f372405054a6445ca20f0fc1bd362fe9c1cf1e2
Author: Leszek Koltunski <leszek@koltunski.pl>
Date:   Wed Jun 9 13:04:46 2021 +0200

    Backing moves: constant angle speed.

diff --git a/src/main/java/org/distorted/main/RubikPreRender.java b/src/main/java/org/distorted/main/RubikPreRender.java
index 2ca08ce5..7ce9b468 100644
--- a/src/main/java/org/distorted/main/RubikPreRender.java
+++ b/src/main/java/org/distorted/main/RubikPreRender.java
@@ -97,8 +97,7 @@ public class RubikPreRender implements EffectController
     mSolveObject          = false;
     mScrambleObject       = false;
 
-    mCanRotate = true;
-    mCanPlay   = true;
+    unblockEverything();
 
     mOldObject = null;
     mNewObject = null;
@@ -146,18 +145,15 @@ public class RubikPreRender implements EffectController
 
   private void doEffectNow(BaseEffect.Type type)
     {
-    int index = type.ordinal();
-
     try
       {
+      int index = type.ordinal();
       mEffectID[index] = type.startEffect(mView.getRenderer().getScreen(),this);
       }
     catch( Exception ex )
       {
       android.util.Log.e("renderer", "exception starting effect: "+ex.getMessage());
-
-      mCanPlay   = true;
-      mCanRotate = true;
+      unblockEverything();
       }
     }
 
@@ -188,14 +184,12 @@ public class RubikPreRender implements EffectController
           }
         }
 
-      mCanRotate = true;
-      mCanPlay   = true;
+      unblockEverything();
       doEffectNow( BaseEffect.Type.WIN );
       }
     else
       {
-      mCanRotate = true;
-      mCanPlay   = true;
+      unblockEverything();
       }
 
     mIsSolved = solved;
@@ -234,8 +228,7 @@ public class RubikPreRender implements EffectController
 
     if( mAddRotationID==0 ) // failed to add effect - should never happen
       {
-      mCanRotate = true;
-      mCanPlay   = true;
+      unblockEverything();
       }
     }
 
@@ -244,14 +237,12 @@ public class RubikPreRender implements EffectController
   private void finishRotationNow()
     {
     mFinishRotation = false;
-    mCanRotate      = false;
-    mCanPlay        = false;
+    blockEverything();
     mRotationFinishedID = mNewObject.finishRotationNow(this, mNearestAngle);
 
     if( mRotationFinishedID==0 ) // failed to add effect - should never happen
       {
-      mCanRotate = true;
-      mCanPlay   = true;
+      unblockEverything();
       }
     }
 
@@ -263,8 +254,7 @@ public class RubikPreRender implements EffectController
 
     if ( mNewObject==null || mNewObject.getObjectList()!=mNextObject || mNewObject.getNumLayers()!=mNextSize)
       {
-      mCanRotate= false;
-      mCanPlay  = false;
+      blockEverything();
       createObjectNow(mNextObject, mNextSize, null);
       doEffectNow( BaseEffect.Type.SIZECHANGE );
       }
@@ -278,8 +268,7 @@ public class RubikPreRender implements EffectController
 
     if ( mNewObject==null || mNewObject.getObjectList()!=mNextObject || mNewObject.getNumLayers()!=mNextSize)
       {
-      mCanRotate= false;
-      mCanPlay  = false;
+      blockEverything();
       createObjectNow(mNextObject, mNextSize, mNextMoves);
       doEffectNow( BaseEffect.Type.SIZECHANGE );
       }
@@ -294,9 +283,8 @@ public class RubikPreRender implements EffectController
   private void scrambleObjectNow()
     {
     mScrambleObject = false;
-    mCanRotate      = false;
-    mCanPlay        = false;
     mIsSolved       = false;
+    blockEverything();
     RubikScores.getInstance().incrementNumPlays();
     doEffectNow( BaseEffect.Type.SCRAMBLE );
     }
@@ -306,8 +294,7 @@ public class RubikPreRender implements EffectController
   private void solveObjectNow()
     {
     mSolveObject = false;
-    mCanRotate   = false;
-    mCanPlay     = false;
+    blockEverything();
     doEffectNow( BaseEffect.Type.SOLVE );
     }
 
@@ -697,8 +684,7 @@ public class RubikPreRender implements EffectController
         {
         if( effectID == mEffectID[i] )
           {
-          mCanRotate = true;
-          mCanPlay   = true;
+          unblockEverything();
 
           if( i==BaseEffect.Type.SCRAMBLE.ordinal() )
             {
diff --git a/src/main/java/org/distorted/screens/RubikScreenBase.java b/src/main/java/org/distorted/screens/RubikScreenBase.java
index 2c3b30cc..21624bf8 100644
--- a/src/main/java/org/distorted/screens/RubikScreenBase.java
+++ b/src/main/java/org/distorted/screens/RubikScreenBase.java
@@ -34,10 +34,9 @@ import java.util.ArrayList;
 
 abstract class RubikScreenBase extends RubikScreenAbstract implements RubikPreRender.ActionFinishedListener
   {
-  private static final int DURATION_MILLIS = 750;
+  private static final int REVOLUTION_MILLIS = 2000;
 
   private ImageButton mPrevButton, mLockButton;
-
   private boolean mCanPrevMove;
 
   private static class Move
@@ -65,18 +64,15 @@ abstract class RubikScreenBase extends RubikScreenAbstract implements RubikPreRe
       if( numMoves>0 )
         {
         RubikScreenBase.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);
+        int duration= (int)(Math.abs(angle/360.0f)*REVOLUTION_MILLIS);
 
         if( angle!=0 )
           {
           mCanPrevMove = false;
-          pre.addRotation(this, axis, row, -angle, numRot*DURATION_MILLIS);
+          pre.addRotation(this, axis, row, -angle, duration);
           }
         else
           {
