commit ea036986ede0d75d0318da546d41a808975a1382
Author: Leszek Koltunski <leszek@koltunski.pl>
Date:   Thu Jan 19 01:28:13 2023 +0100

    Block rotating layes of not free objects in the Tutorial Activity.

diff --git a/src/main/java/org/distorted/helpers/TransparentImageButton.java b/src/main/java/org/distorted/helpers/TransparentImageButton.java
index 7fcaf6f3..1de4e81b 100644
--- a/src/main/java/org/distorted/helpers/TransparentImageButton.java
+++ b/src/main/java/org/distorted/helpers/TransparentImageButton.java
@@ -47,4 +47,18 @@ public class TransparentImageButton extends MaterialButton
     context.getTheme().resolveAttribute(android.R.attr.selectableItemBackgroundBorderless, outValue, true);
     setBackgroundResource(outValue.resourceId);
     }
+
+///////////////////////////////////////////////////////////////////////////////////////////////////
+
+  public TransparentImageButton(Context context, LinearLayout.LayoutParams params)
+    {
+    super(context);
+
+    setLayoutParams(params);
+    setPadding(0,0,0,0);
+
+    TypedValue outValue = new TypedValue();
+    context.getTheme().resolveAttribute(android.R.attr.selectableItemBackgroundBorderless, outValue, true);
+    setBackgroundResource(outValue.resourceId);
+    }
 }
diff --git a/src/main/java/org/distorted/tutorials/TutorialActivity.java b/src/main/java/org/distorted/tutorials/TutorialActivity.java
index b0852ccf..4fb5758b 100644
--- a/src/main/java/org/distorted/tutorials/TutorialActivity.java
+++ b/src/main/java/org/distorted/tutorials/TutorialActivity.java
@@ -43,7 +43,6 @@ public class TutorialActivity extends AppCompatActivity
     private static final int ACTIVITY_NUMBER = 1;
     public static final float BAR_RATIO = 0.17f;
     public static final float DIALOG_BUTTON_SIZE  = 0.06f;
-    public static final float MENU_BIG_TEXT_SIZE  = 0.05f;
 
     public static final int FLAGS =  View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION
                                    | View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
@@ -57,6 +56,7 @@ public class TutorialActivity extends AppCompatActivity
     private String mURL;
     private int mObjectOrdinal;
     private TutorialWebView mWebView;
+    private boolean mIsFree;
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
@@ -68,12 +68,16 @@ public class TutorialActivity extends AppCompatActivity
       setTheme(R.style.MaterialThemeNoActionBar);
       setContentView(R.layout.tutorial);
 
+      mIsFree = true;
+
       Bundle b = getIntent().getExtras();
 
       if(b != null)
         {
         mURL           = b.getString("url");
         mObjectOrdinal = b.getInt("obj");
+        RubikObject obj= RubikObjectList.getObject(mObjectOrdinal);
+        mIsFree = (obj!=null && obj.isFree());
         }
 
       DisplayMetrics displaymetrics = new DisplayMetrics();
@@ -181,7 +185,7 @@ public class TutorialActivity extends AppCompatActivity
       paramsR.width = (int)(width*BAR_RATIO);
       viewR.setLayoutParams(paramsR);
 
-      if( mScreen==null ) mScreen = new TutorialScreen();
+      if( mScreen==null ) mScreen = new TutorialScreen(mIsFree);
 
       mScreen.createRightPane(this);
 
@@ -247,6 +251,13 @@ public class TutorialActivity extends AppCompatActivity
       return mScreenHeight;
       }
 
+///////////////////////////////////////////////////////////////////////////////////////////////////
+
+    public boolean getIsFree()
+      {
+      return mIsFree;
+      }
+
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
     public ObjectControl getControl()
diff --git a/src/main/java/org/distorted/tutorials/TutorialScreen.java b/src/main/java/org/distorted/tutorials/TutorialScreen.java
index 9e7726da..98ed0432 100644
--- a/src/main/java/org/distorted/tutorials/TutorialScreen.java
+++ b/src/main/java/org/distorted/tutorials/TutorialScreen.java
@@ -26,8 +26,47 @@ import org.distorted.helpers.TransparentImageButton;
 public class TutorialScreen
 {
   private TransparentImageButton mSolveButton, mScrambleButton, mBackButton;
+  private TransparentImageButton mLockButton, mEmptyButton1, mEmptyButton2, mEmptyButton3;
   private final LockController mLockController;
   private final MovesController mMovesController;
+  private final boolean mFree;
+
+///////////////////////////////////////////////////////////////////////////////////////////////////
+
+  private void setupLockButton(final TutorialActivity act)
+    {
+    int icon = RubikActivity.getDrawable(R.drawable.ui_small_locked_red,R.drawable.ui_medium_locked_red, R.drawable.ui_big_locked_red, R.drawable.ui_huge_locked_red);
+    LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT,LinearLayout.LayoutParams.MATCH_PARENT,1.0f);
+    mLockButton = new TransparentImageButton(act, icon, TransparentImageButton.GRAVITY_MIDDLE, params);
+    mLockButton.setClickable(false);
+    }
+
+///////////////////////////////////////////////////////////////////////////////////////////////////
+
+  private void setupEmptyButton1(final TutorialActivity act)
+    {
+    LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT,LinearLayout.LayoutParams.MATCH_PARENT,1.0f);
+    mEmptyButton1 = new TransparentImageButton(act, params);
+    mEmptyButton1.setClickable(false);
+    }
+
+///////////////////////////////////////////////////////////////////////////////////////////////////
+
+  private void setupEmptyButton2(final TutorialActivity act)
+    {
+    LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT,LinearLayout.LayoutParams.MATCH_PARENT,1.0f);
+    mEmptyButton2 = new TransparentImageButton(act, params);
+    mEmptyButton2.setClickable(false);
+    }
+
+///////////////////////////////////////////////////////////////////////////////////////////////////
+
+  private void setupEmptyButton3(final TutorialActivity act)
+    {
+    LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT,LinearLayout.LayoutParams.MATCH_PARENT,1.0f);
+    mEmptyButton3 = new TransparentImageButton(act, params);
+    mEmptyButton3.setClickable(false);
+    }
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
@@ -94,17 +133,31 @@ public class TutorialScreen
     LinearLayout layout = act.findViewById(R.id.tutorialRightBar);
     layout.removeAllViews();
 
-    ObjectControl control = act.getControl();
-    mMovesController.setupButton(act,control);
-    mLockController.setupButton(act,control);
-    setupSolveButton(act);
-    setupScrambleButton(act);
-    setupBackButton(act);
+    if( mFree )
+      {
+      ObjectControl control = act.getControl();
+      mMovesController.setupButton(act,control);
+      mLockController.setupButton(act,control);
+      setupSolveButton(act);
+      setupScrambleButton(act);
+      layout.addView(mSolveButton);
+      layout.addView(mScrambleButton);
+      layout.addView(mMovesController.getButton());
+      layout.addView(mLockController.getButton());
+      }
+    else
+      {
+      setupLockButton(act);
+      setupEmptyButton1(act);
+      setupEmptyButton2(act);
+      setupEmptyButton3(act);
+      layout.addView(mLockButton);
+      layout.addView(mEmptyButton1);
+      layout.addView(mEmptyButton2);
+      layout.addView(mEmptyButton3);
+      }
 
-    layout.addView(mSolveButton);
-    layout.addView(mScrambleButton);
-    layout.addView(mMovesController.getButton());
-    layout.addView(mLockController.getButton());
+    setupBackButton(act);
     layout.addView(mBackButton);
     }
 
@@ -118,8 +171,9 @@ public class TutorialScreen
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 // PUBLIC API
 
-  public TutorialScreen()
+  public TutorialScreen(boolean free)
     {
+    mFree = free;
     mLockController = new LockController();
     mMovesController = new MovesController();
     }
diff --git a/src/main/java/org/distorted/tutorials/TutorialSurfaceView.java b/src/main/java/org/distorted/tutorials/TutorialSurfaceView.java
index 0aa62f4d..f7489a3d 100644
--- a/src/main/java/org/distorted/tutorials/TutorialSurfaceView.java
+++ b/src/main/java/org/distorted/tutorials/TutorialSurfaceView.java
@@ -7,6 +7,7 @@
 
 package org.distorted.tutorials;
 
+import android.annotation.SuppressLint;
 import android.app.ActivityManager;
 import android.content.Context;
 import android.content.pm.ConfigurationInfo;
@@ -21,6 +22,7 @@ import org.distorted.objectlib.main.ObjectControl;
 import org.distorted.objectlib.main.TwistyObjectNode;
 
 import static org.distorted.objectlib.main.ObjectControl.MODE_ROTATE;
+import static org.distorted.objectlib.main.ObjectControl.MODE_DRAG;
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
@@ -30,6 +32,7 @@ public class TutorialSurfaceView extends GLSurfaceView
     private TutorialRenderer mRenderer;
     private int mScreenWidth, mScreenHeight;
     private boolean mCreated;
+    private int mTouchMode;
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
@@ -47,6 +50,9 @@ public class TutorialSurfaceView extends GLSurfaceView
         mObjectController.createNode(width,height);
         TwistyObjectNode objectNode = mObjectController.getNode();
         mRenderer.getScreen().attach(objectNode);
+
+        TutorialActivity act = (TutorialActivity) getContext();
+        mTouchMode = act.getIsFree() ? MODE_ROTATE : MODE_DRAG;
         }
       }
 
@@ -73,6 +79,7 @@ public class TutorialSurfaceView extends GLSurfaceView
       super(context,attrs);
 
       mCreated = false;
+      mTouchMode = MODE_ROTATE;
 
       if(!isInEditMode())
         {
@@ -129,10 +136,11 @@ public class TutorialSurfaceView extends GLSurfaceView
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
+    @SuppressLint("ClickableViewAccessibility")
     @Override
     public boolean onTouchEvent(MotionEvent event)
       {
-      return mObjectController.onTouchEvent(event,MODE_ROTATE);
+      return mObjectController.onTouchEvent(event,mTouchMode);
       }
 }
 
