commit 88a3e9726f756d067620b16973d6d7bd2f023737
Author: Leszek Koltunski <leszek@koltunski.pl>
Date:   Fri Oct 1 23:27:00 2021 +0200

    Move more code to objectlib.

diff --git a/src/main/java/org/distorted/control/RubikControl.java b/src/main/java/org/distorted/control/RubikControl.java
index 57fb7b31..77cbf2c4 100644
--- a/src/main/java/org/distorted/control/RubikControl.java
+++ b/src/main/java/org/distorted/control/RubikControl.java
@@ -19,7 +19,7 @@
 
 package org.distorted.control;
 
-import org.distorted.helpers.BlockController;
+import org.distorted.objectlib.helpers.BlockController;
 import org.distorted.library.main.DistortedNode;
 import org.distorted.library.main.DistortedScreen;
 import org.distorted.library.message.EffectListener;
diff --git a/src/main/java/org/distorted/effects/EffectController.java b/src/main/java/org/distorted/effects/EffectController.java
index 885119e7..a93b6806 100644
--- a/src/main/java/org/distorted/effects/EffectController.java
+++ b/src/main/java/org/distorted/effects/EffectController.java
@@ -21,7 +21,7 @@ package org.distorted.effects;
 
 import org.distorted.library.message.EffectListener;
 import org.distorted.objectlib.main.TwistyObject;
-import org.distorted.helpers.MovesFinished;
+import org.distorted.objectlib.helpers.MovesFinished;
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
diff --git a/src/main/java/org/distorted/effects/scramble/ScrambleEffect.java b/src/main/java/org/distorted/effects/scramble/ScrambleEffect.java
index ccd79844..bcccb0b9 100644
--- a/src/main/java/org/distorted/effects/scramble/ScrambleEffect.java
+++ b/src/main/java/org/distorted/effects/scramble/ScrambleEffect.java
@@ -32,7 +32,7 @@ import org.distorted.objectlib.main.TwistyObject;
 
 import org.distorted.effects.BaseEffect;
 import org.distorted.effects.EffectController;
-import org.distorted.helpers.MovesFinished;
+import org.distorted.objectlib.helpers.MovesFinished;
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
diff --git a/src/main/java/org/distorted/helpers/BlockController.java b/src/main/java/org/distorted/helpers/BlockController.java
deleted file mode 100644
index a36e54be..00000000
--- a/src/main/java/org/distorted/helpers/BlockController.java
+++ /dev/null
@@ -1,276 +0,0 @@
-///////////////////////////////////////////////////////////////////////////////////////////////////
-// Copyright 2021 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.helpers;
-
-import com.google.firebase.crashlytics.FirebaseCrashlytics;
-
-import java.lang.ref.WeakReference;
-import java.util.Timer;
-import java.util.TimerTask;
-
-import org.distorted.library.message.EffectMessageSender;
-import org.distorted.main.BuildConfig;
-
-///////////////////////////////////////////////////////////////////////////////////////////////////
-
-public class BlockController
-  {
-  public static final int RUBIK_PLACE_0 =0;
-  public static final int RUBIK_PLACE_1 =1;
-  public static final int RUBIK_PLACE_2 =2;
-  public static final int RUBIK_PLACE_3 =3;
-  public static final int RUBIK_PLACE_4 =4;
-  public static final int TUTORIAL_PLACE_0 =10;
-  public static final int TUTORIAL_PLACE_1 =11;
-  public static final int TUTORIAL_PLACE_2 =12;
-  public static final int TUTORIAL_PLACE_3 =13;
-  public static final int TUTORIAL_PLACE_4 =14;
-  public static final int CONTROL_PLACE_0 =20;
-  public static final int CONTROL_PLACE_1 =21;
-  public static final int MOVES_PLACE_0 =30;
-
-  private static final long THRESHHOLD_0 =  3000;
-  private static final long THRESHHOLD_1 = 25000;
-  private static final long THRESHHOLD_2 =  5000;
-  private static final long THRESHHOLD_3 = 45000;
-
-  private static long mPauseTime, mResumeTime;
-
-  private long mTouchBlockTime, mUIBlockTime;
-  private int mLastTouchPlace, mLastUIPlace;
-
-  private final WeakReference<TwistyActivity> mAct;
-
-///////////////////////////////////////////////////////////////////////////////////////////////////
-
-  public static void onPause()
-    {
-    mPauseTime = System.currentTimeMillis();
-    }
-
-///////////////////////////////////////////////////////////////////////////////////////////////////
-
-  public static void onResume()
-    {
-    mResumeTime = System.currentTimeMillis();
-    }
-
-///////////////////////////////////////////////////////////////////////////////////////////////////
-
-  public BlockController(TwistyActivity act)
-    {
-    mAct = new WeakReference<>(act);
-
-    Timer timer = new Timer();
-
-    timer.scheduleAtFixedRate(new TimerTask()
-      {
-      @Override
-      public void run()
-        {
-        act.runOnUiThread(new Runnable()
-          {
-          @Override
-          public void run()
-            {
-            checkingThread();
-            }
-          });
-        }
-      }, 0, 1000);
-    }
-
-///////////////////////////////////////////////////////////////////////////////////////////////////
-// RUBIK_PLACE_3 and TUTORIAL_PLACE_3 are scrambles, those can take up to 20 seconds.
-// RUBIK_PLACE_4 and TUTORIAL_PLACE_4 are solves, those can (maybe) sometimes take more than 3 seconds.
-// CONTROL_PLACE_* are the visual tutorials, could take up to 45 seconds.
-
-  private long getThreshhold(int last)
-    {
-    switch(last)
-      {
-      case RUBIK_PLACE_3   :
-      case TUTORIAL_PLACE_3: return THRESHHOLD_1;
-      case RUBIK_PLACE_4   :
-      case TUTORIAL_PLACE_4: return THRESHHOLD_2;
-      case CONTROL_PLACE_0 :
-      case CONTROL_PLACE_1 : return THRESHHOLD_3;
-      default              : return THRESHHOLD_0;
-      }
-    }
-
-///////////////////////////////////////////////////////////////////////////////////////////////////
-
-  private void checkingThread()
-    {
-    long now = System.currentTimeMillis();
-    long touchThreshhold = getThreshhold(mLastTouchPlace);
-    long touchBlocked = now-mTouchBlockTime;
-
-    if( mTouchBlockTime>mPauseTime && touchBlocked>touchThreshhold )
-      {
-      boolean running = EffectMessageSender.isRunning();
-
-      if( !running )
-        {
-        reportThreadProblem();
-        EffectMessageSender.restartThread();
-        }
-      else
-        {
-        TwistyActivity act = mAct.get();
-        boolean reallyBlocked = true;
-
-        if( act!=null )
-          {
-          TwistyPreRender pre = act.getTwistyPreRender();
-          if( pre!=null )
-            {
-            reallyBlocked = pre.isTouchBlocked();
-            pre.unblockTouch();
-            }
-          }
-
-        reportTouchProblem(touchBlocked, reallyBlocked);
-        }
-      }
-
-    long uiThreshhold = getThreshhold(mLastUIPlace);
-    long uiBlocked = now-mUIBlockTime;
-
-    if( mUIBlockTime>mPauseTime && uiBlocked>uiThreshhold )
-      {
-      boolean running = EffectMessageSender.isRunning();
-
-      if( !running )
-        {
-        reportThreadProblem();
-        EffectMessageSender.restartThread();
-        }
-      else
-        {
-        TwistyActivity act = mAct.get();
-        boolean reallyBlocked = true;
-
-        if( act!=null )
-          {
-          TwistyPreRender pre = act.getTwistyPreRender();
-          if( pre!=null )
-            {
-            reallyBlocked = !pre.isUINotBlocked();
-            pre.unblockUI();
-            }
-          }
-
-        reportUIProblem(uiBlocked, reallyBlocked);
-        }
-      }
-    }
-
-///////////////////////////////////////////////////////////////////////////////////////////////////
-
-  private void reportUIProblem(long time, boolean reallyBlocked)
-    {
-    String error = "UI BLOCK "+mLastUIPlace+" blocked for "+time+" milliseconds ("+reallyBlocked+")";
-
-    if( BuildConfig.DEBUG )
-       {
-       android.util.Log.e("D", error);
-       }
-    else
-      {
-      Exception ex = new Exception(error);
-      FirebaseCrashlytics crashlytics = FirebaseCrashlytics.getInstance();
-      crashlytics.setCustomKey("pause" , mPauseTime );
-      crashlytics.setCustomKey("resume", mResumeTime );
-      crashlytics.recordException(ex);
-      }
-    }
-
-///////////////////////////////////////////////////////////////////////////////////////////////////
-
-  private void reportTouchProblem(long time, boolean reallyBlocked)
-    {
-    String error = "TOUCH BLOCK "+mLastTouchPlace+" blocked for "+time+" milliseconds ("+reallyBlocked+")";
-
-    if( BuildConfig.DEBUG )
-       {
-       android.util.Log.e("D", error);
-       }
-    else
-      {
-      Exception ex = new Exception(error);
-      FirebaseCrashlytics crashlytics = FirebaseCrashlytics.getInstance();
-      crashlytics.setCustomKey("pause" , mPauseTime );
-      crashlytics.setCustomKey("resume", mResumeTime );
-      crashlytics.recordException(ex);
-      }
-    }
-
-///////////////////////////////////////////////////////////////////////////////////////////////////
-
-  private void reportThreadProblem()
-    {
-    String error = EffectMessageSender.reportState();
-
-    if( BuildConfig.DEBUG )
-       {
-       android.util.Log.e("D", error);
-       }
-    else
-      {
-      Exception ex = new Exception(error);
-      FirebaseCrashlytics crashlytics = FirebaseCrashlytics.getInstance();
-      crashlytics.setCustomKey("pause" , mPauseTime );
-      crashlytics.setCustomKey("resume", mResumeTime );
-      crashlytics.recordException(ex);
-      }
-    }
-
-///////////////////////////////////////////////////////////////////////////////////////////////////
-
-  public void touchBlocked(int place)
-    {
-    mTouchBlockTime = System.currentTimeMillis();
-    mLastTouchPlace = place;
-    }
-
-///////////////////////////////////////////////////////////////////////////////////////////////////
-
-  public void uiBlocked(int place)
-    {
-    mUIBlockTime = System.currentTimeMillis();
-    mLastUIPlace = place;
-    }
-
-///////////////////////////////////////////////////////////////////////////////////////////////////
-
-  public void touchUnblocked()
-    {
-    mTouchBlockTime = 0;
-    }
-
-///////////////////////////////////////////////////////////////////////////////////////////////////
-
-  public void uiUnblocked()
-    {
-    mUIBlockTime = 0;
-    }
-  }
diff --git a/src/main/java/org/distorted/helpers/MovesAndLockController.java b/src/main/java/org/distorted/helpers/MovesAndLockController.java
index 9264b03e..2b3bf3b5 100644
--- a/src/main/java/org/distorted/helpers/MovesAndLockController.java
+++ b/src/main/java/org/distorted/helpers/MovesAndLockController.java
@@ -29,6 +29,10 @@ import android.widget.LinearLayout;
 
 import org.distorted.main.R;
 import org.distorted.main.RubikActivity;
+import org.distorted.objectlib.helpers.BlockController;
+import org.distorted.objectlib.helpers.MovesFinished;
+import org.distorted.objectlib.helpers.TwistyActivity;
+import org.distorted.objectlib.helpers.TwistyPreRender;
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
diff --git a/src/main/java/org/distorted/helpers/MovesFinished.java b/src/main/java/org/distorted/helpers/MovesFinished.java
deleted file mode 100644
index e6bbb7c0..00000000
--- a/src/main/java/org/distorted/helpers/MovesFinished.java
+++ /dev/null
@@ -1,27 +0,0 @@
-///////////////////////////////////////////////////////////////////////////////////////////////////
-// Copyright 2021 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.helpers;
-
-///////////////////////////////////////////////////////////////////////////////////////////////////
-
-public interface MovesFinished
-  {
-  void onActionFinished(long effectID);
-  }
diff --git a/src/main/java/org/distorted/helpers/TwistyActivity.java b/src/main/java/org/distorted/helpers/TwistyActivity.java
deleted file mode 100644
index 16773f5f..00000000
--- a/src/main/java/org/distorted/helpers/TwistyActivity.java
+++ /dev/null
@@ -1,85 +0,0 @@
-///////////////////////////////////////////////////////////////////////////////////////////////////
-// Copyright 2021 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.helpers;
-
-import androidx.appcompat.app.AppCompatActivity;
-
-import org.distorted.screens.ScreenList;
-
-///////////////////////////////////////////////////////////////////////////////////////////////////
-
-abstract public class TwistyActivity extends AppCompatActivity
-  {
-  boolean mIsLocked, mRemLocked;
-
-///////////////////////////////////////////////////////////////////////////////////////////////////
-
-  public abstract TwistyPreRender getTwistyPreRender();
-
-///////////////////////////////////////////////////////////////////////////////////////////////////
-
-  public boolean retLocked()
-      {
-      return mIsLocked;
-      }
-
-///////////////////////////////////////////////////////////////////////////////////////////////////
-
-  public void toggleLock()
-      {
-      mIsLocked = !mIsLocked;
-      }
-
-///////////////////////////////////////////////////////////////////////////////////////////////////
-
-  public void unlock()
-    {
-    mIsLocked = false;
-    }
-
-///////////////////////////////////////////////////////////////////////////////////////////////////
-
-  public boolean isLocked()
-    {
-    ScreenList state = ScreenList.getCurrentScreen();
-
-    if( state== ScreenList.PLAY || state== ScreenList.READ || state== ScreenList.SOLV )
-      {
-      return mIsLocked;
-      }
-
-    return false;
-    }
-
-///////////////////////////////////////////////////////////////////////////////////////////////////
-
-  public void setLock()
-    {
-    mRemLocked = mIsLocked;
-    mIsLocked = true;
-    }
-
-///////////////////////////////////////////////////////////////////////////////////////////////////
-
-  public void unsetLock()
-    {
-    mIsLocked = mRemLocked;
-    }
-  }
diff --git a/src/main/java/org/distorted/helpers/TwistyPreRender.java b/src/main/java/org/distorted/helpers/TwistyPreRender.java
deleted file mode 100644
index 94b2bb93..00000000
--- a/src/main/java/org/distorted/helpers/TwistyPreRender.java
+++ /dev/null
@@ -1,35 +0,0 @@
-///////////////////////////////////////////////////////////////////////////////////////////////////
-// Copyright 2021 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.helpers;
-
-///////////////////////////////////////////////////////////////////////////////////////////////////
-
-public interface TwistyPreRender
-  {
-  boolean isTouchBlocked();
-  boolean isUINotBlocked();
-  void blockTouch(int place);
-  void unblockTouch();
-  void blockEverything(int place);
-  void unblockEverything();
-  void unblockUI();
-  void addRotation(MovesFinished listener, int axis, int rowBitmap, int angle, long duration);
-  void solveObject();
-  }
diff --git a/src/main/java/org/distorted/main/RubikActivity.java b/src/main/java/org/distorted/main/RubikActivity.java
index 270fc7ec..b48a5e95 100644
--- a/src/main/java/org/distorted/main/RubikActivity.java
+++ b/src/main/java/org/distorted/main/RubikActivity.java
@@ -41,13 +41,13 @@ import org.distorted.library.type.Static4D;
 
 import org.distorted.objectlib.main.TwistyObject;
 import org.distorted.objectlib.main.ObjectType;
+import org.distorted.objectlib.helpers.BlockController;
+import org.distorted.objectlib.helpers.TwistyPreRender;
 
 import org.distorted.dialogs.RubikDialogError;
 import org.distorted.dialogs.RubikDialogPrivacy;
 import org.distorted.effects.BaseEffect;
-import org.distorted.helpers.BlockController;
-import org.distorted.helpers.TwistyActivity;
-import org.distorted.helpers.TwistyPreRender;
+import org.distorted.objectlib.helpers.TwistyActivity;
 import org.distorted.network.RubikScores;
 import org.distorted.network.RubikNetwork;
 import org.distorted.screens.ScreenList;
@@ -499,6 +499,20 @@ public class RubikActivity extends TwistyActivity
       pre.changeObject(newObject);
       }
 
+///////////////////////////////////////////////////////////////////////////////////////////////////
+
+  public boolean isLocked()
+    {
+    ScreenList state = ScreenList.getCurrentScreen();
+
+    if( state== ScreenList.PLAY || state== ScreenList.READ || state== ScreenList.SOLV )
+      {
+      return retLocked();
+      }
+
+    return false;
+    }
+
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
     public void setupObject(ObjectType object, int[][] moves)
diff --git a/src/main/java/org/distorted/main/RubikPreRender.java b/src/main/java/org/distorted/main/RubikPreRender.java
index ad894339..d03d7c96 100644
--- a/src/main/java/org/distorted/main/RubikPreRender.java
+++ b/src/main/java/org/distorted/main/RubikPreRender.java
@@ -42,9 +42,9 @@ import org.distorted.dialogs.RubikDialogSolved;
 import org.distorted.effects.BaseEffect;
 import org.distorted.effects.EffectController;
 import org.distorted.effects.scramble.ScrambleEffect;
-import org.distorted.helpers.BlockController;
-import org.distorted.helpers.MovesFinished;
-import org.distorted.helpers.TwistyPreRender;
+import org.distorted.objectlib.helpers.BlockController;
+import org.distorted.objectlib.helpers.MovesFinished;
+import org.distorted.objectlib.helpers.TwistyPreRender;
 import org.distorted.network.RubikScores;
 import org.distorted.screens.RubikScreenPlay;
 import org.distorted.screens.ScreenList;
@@ -459,7 +459,11 @@ public class RubikPreRender implements EffectController, TwistyPreRender
 
   void setScreenSize(int width)
     {
-    if( mNewObject!=null ) mNewObject.recomputeScaleFactor(width);
+    if( mNewObject!=null )
+      {
+      mNewObject.createTexture();
+      mNewObject.recomputeScaleFactor(width);
+      }
     mScreenWidth = width;
     }
 
diff --git a/src/main/java/org/distorted/patterns/RubikPattern.java b/src/main/java/org/distorted/patterns/RubikPattern.java
index c15e32c8..81966869 100644
--- a/src/main/java/org/distorted/patterns/RubikPattern.java
+++ b/src/main/java/org/distorted/patterns/RubikPattern.java
@@ -22,7 +22,7 @@ package org.distorted.patterns;
 import java.util.ArrayList;
 import java.util.List;
 
-import org.distorted.helpers.MovesFinished;
+import org.distorted.objectlib.helpers.MovesFinished;
 import org.distorted.main.RubikPreRender;
 
 import static org.distorted.patterns.RubikPatternList.NUM_OBJECTS;
diff --git a/src/main/java/org/distorted/screens/RubikScreenBase.java b/src/main/java/org/distorted/screens/RubikScreenBase.java
index bccea3be..19c6ba64 100644
--- a/src/main/java/org/distorted/screens/RubikScreenBase.java
+++ b/src/main/java/org/distorted/screens/RubikScreenBase.java
@@ -23,7 +23,7 @@ import android.widget.ImageButton;
 import android.widget.LinearLayout;
 
 import org.distorted.helpers.MovesAndLockController;
-import org.distorted.helpers.TwistyActivity;
+import org.distorted.objectlib.helpers.TwistyActivity;
 import org.distorted.main.R;
 import org.distorted.main.RubikActivity;
 
diff --git a/src/main/java/org/distorted/screens/RubikScreenSolution.java b/src/main/java/org/distorted/screens/RubikScreenSolution.java
index 9d1bfa1a..2284a1bf 100644
--- a/src/main/java/org/distorted/screens/RubikScreenSolution.java
+++ b/src/main/java/org/distorted/screens/RubikScreenSolution.java
@@ -30,7 +30,7 @@ import android.widget.TextView;
 
 import org.distorted.objectlib.main.TwistyObject;
 
-import org.distorted.helpers.MovesFinished;
+import org.distorted.objectlib.helpers.MovesFinished;
 import org.distorted.helpers.TransparentImageButton;
 import org.distorted.main.R;
 import org.distorted.main.RubikActivity;
diff --git a/src/main/java/org/distorted/tutorials/TutorialActivity.java b/src/main/java/org/distorted/tutorials/TutorialActivity.java
index 172457dc..5c60cfff 100644
--- a/src/main/java/org/distorted/tutorials/TutorialActivity.java
+++ b/src/main/java/org/distorted/tutorials/TutorialActivity.java
@@ -36,10 +36,11 @@ import org.distorted.objectlib.main.ObjectType;
 import org.distorted.objectlib.main.TwistyObject;
 
 import org.distorted.dialogs.RubikDialogError;
-import org.distorted.helpers.BlockController;
-import org.distorted.helpers.TwistyActivity;
-import org.distorted.helpers.TwistyPreRender;
+import org.distorted.objectlib.helpers.BlockController;
+import org.distorted.objectlib.helpers.TwistyActivity;
+import org.distorted.objectlib.helpers.TwistyPreRender;
 import org.distorted.main.R;
+import org.distorted.screens.ScreenList;
 
 import static org.distorted.main.RubikRenderer.BRIGHTNESS;
 
@@ -286,6 +287,13 @@ public class TutorialActivity extends TwistyActivity
       return view.getPreRender();
       }
 
+///////////////////////////////////////////////////////////////////////////////////////////////////
+
+  public boolean isLocked()
+    {
+    return retLocked();
+    }
+
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
     public static int getDrawableSize()
diff --git a/src/main/java/org/distorted/tutorials/TutorialPreRender.java b/src/main/java/org/distorted/tutorials/TutorialPreRender.java
index 21bad76b..b06c84b8 100644
--- a/src/main/java/org/distorted/tutorials/TutorialPreRender.java
+++ b/src/main/java/org/distorted/tutorials/TutorialPreRender.java
@@ -24,12 +24,12 @@ import android.content.res.Resources;
 
 import org.distorted.objectlib.main.ObjectType;
 import org.distorted.objectlib.main.TwistyObject;
+import org.distorted.objectlib.helpers.BlockController;
+import org.distorted.objectlib.helpers.MovesFinished;
+import org.distorted.objectlib.helpers.TwistyPreRender;
 
 import org.distorted.effects.BaseEffect;
 import org.distorted.effects.EffectController;
-import org.distorted.helpers.BlockController;
-import org.distorted.helpers.MovesFinished;
-import org.distorted.helpers.TwistyPreRender;
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
@@ -262,7 +262,12 @@ public class TutorialPreRender implements EffectController, TwistyPreRender
 
   void setScreenSize(int width)
     {
-    if( mNewObject!=null ) mNewObject.recomputeScaleFactor(width);
+    if( mNewObject!=null )
+      {
+      mNewObject.createTexture();
+      mNewObject.recomputeScaleFactor(width);
+      }
+
     mScreenWidth = width;
     }
 
diff --git a/src/main/java/org/distorted/tutorials/TutorialState.java b/src/main/java/org/distorted/tutorials/TutorialState.java
index 9eb339bc..acc60f44 100644
--- a/src/main/java/org/distorted/tutorials/TutorialState.java
+++ b/src/main/java/org/distorted/tutorials/TutorialState.java
@@ -26,8 +26,8 @@ import android.widget.LinearLayout;
 import org.distorted.objectlib.main.ObjectType;
 
 import org.distorted.helpers.MovesAndLockController;
-import org.distorted.helpers.TwistyActivity;
-import org.distorted.helpers.TwistyPreRender;
+import org.distorted.objectlib.helpers.TwistyActivity;
+import org.distorted.objectlib.helpers.TwistyPreRender;
 import org.distorted.main.R;
 import org.distorted.main.RubikActivity;
 import org.distorted.screens.RubikScreenPlay;
