commit dd874ae8162c049e881561e02d03d60507e1135c
Author: Leszek Koltunski <leszek@koltunski.pl>
Date:   Fri Nov 5 10:41:40 2021 +0100

    Convert the theme to be a MaterialTheme and the TransparentImageButton to be a MaterialButton - the first forced by the second, and the second because a MaterialButton gives us control over the location of the icon in top of it. We need that because of the new 'solve/scramble' split-button in the lower right of the Play screen.

diff --git a/src/main/java/org/distorted/helpers/LockController.java b/src/main/java/org/distorted/helpers/LockController.java
index 3112ea3f..ade05930 100644
--- a/src/main/java/org/distorted/helpers/LockController.java
+++ b/src/main/java/org/distorted/helpers/LockController.java
@@ -24,7 +24,6 @@ import java.util.TimerTask;
 
 import android.app.Activity;
 import android.view.View;
-import android.widget.ImageButton;
 import android.widget.LinearLayout;
 
 import org.distorted.main.R;
@@ -37,7 +36,7 @@ public class LockController
   {
   private static final int LOCK_TIME = 300;
 
-  private ImageButton mLockButton;
+  private TransparentImageButton mLockButton;
   private long mLockTime;
   private Timer mTimer;
   private boolean mTimerRunning;
@@ -57,7 +56,7 @@ public class LockController
     {
     control.toggleLock();
     boolean locked = control.retLocked();
-    mLockButton.setImageResource(getLockIcon(locked,false));
+    mLockButton.setIconResource(getLockIcon(locked,false));
     }
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
@@ -100,7 +99,7 @@ public class LockController
       public void run()
         {
         if( mLockButton!=null )
-          mLockButton.setImageResource(getLockIcon(locked,red));
+          mLockButton.setIconResource(getLockIcon(locked,red));
         }
       });
     }
@@ -151,11 +150,11 @@ public class LockController
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
-  public void setupButton(final Activity act, ObjectControl control, final float width)
+  public void setupButton(final Activity act, ObjectControl control)
     {
     boolean locked = control.retLocked();
     final int icon = getLockIcon(locked,false);
-    mLockButton = new TransparentImageButton(act, icon, width,LinearLayout.LayoutParams.MATCH_PARENT);
+    mLockButton = new TransparentImageButton(act, icon, LinearLayout.LayoutParams.MATCH_PARENT,TransparentImageButton.GRAVITY_MIDDLE);
 
     mLockButton.setOnClickListener( new View.OnClickListener()
       {
@@ -177,14 +176,14 @@ public class LockController
       public void run()
         {
         if( mLockButton!=null )
-          mLockButton.setImageResource(getLockIcon(locked,false));
+          mLockButton.setIconResource(getLockIcon(locked,false));
         }
       });
     }
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
-  public ImageButton getButton()
+  public TransparentImageButton getButton()
     {
     return mLockButton;
     }
diff --git a/src/main/java/org/distorted/helpers/MovesController.java b/src/main/java/org/distorted/helpers/MovesController.java
index 415c67b1..45d5e955 100644
--- a/src/main/java/org/distorted/helpers/MovesController.java
+++ b/src/main/java/org/distorted/helpers/MovesController.java
@@ -23,7 +23,6 @@ import java.util.ArrayList;
 
 import android.app.Activity;
 import android.view.View;
-import android.widget.ImageButton;
 import android.widget.LinearLayout;
 
 import org.distorted.objectlib.helpers.MovesFinished;
@@ -54,7 +53,7 @@ public class MovesController implements MovesFinished
   private final ArrayList<Move> mMoves;
   private boolean mCanPrevMove;
   private ObjectControl mControl;
-  private ImageButton mPrevButton;
+  private TransparentImageButton mPrevButton;
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 // PUBLIC API
@@ -126,7 +125,7 @@ public class MovesController implements MovesFinished
       public void run()
         {
         if( mPrevButton!=null )
-          mPrevButton.setImageResource(getPrevIcon(on));
+          mPrevButton.setIconResource(getPrevIcon(on));
         }
       });
     }
@@ -164,10 +163,10 @@ public class MovesController implements MovesFinished
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
-  public void setupButton(final Activity act, ObjectControl control, final float width)
+  public void setupButton(final Activity act, ObjectControl control)
     {
     final int icon = getPrevIcon( !mMoves.isEmpty() );
-    mPrevButton = new TransparentImageButton(act, icon, width, LinearLayout.LayoutParams.MATCH_PARENT);
+    mPrevButton = new TransparentImageButton(act, icon, LinearLayout.LayoutParams.MATCH_PARENT, TransparentImageButton.GRAVITY_MIDDLE);
 
     mPrevButton.setOnClickListener( new View.OnClickListener()
       {
@@ -181,7 +180,7 @@ public class MovesController implements MovesFinished
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
-  public ImageButton getButton()
+  public TransparentImageButton getButton()
     {
     return mPrevButton;
     }
diff --git a/src/main/java/org/distorted/helpers/TransparentImageButton.java b/src/main/java/org/distorted/helpers/TransparentImageButton.java
index fd7348a6..0ac0f64b 100644
--- a/src/main/java/org/distorted/helpers/TransparentImageButton.java
+++ b/src/main/java/org/distorted/helpers/TransparentImageButton.java
@@ -24,30 +24,36 @@ import android.content.Context;
 import android.util.TypedValue;
 import android.widget.LinearLayout;
 
-import org.distorted.main.RubikActivity;
+import com.google.android.material.button.MaterialButton;
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
 @SuppressLint("ViewConstructor")
-public class TransparentImageButton extends androidx.appcompat.widget.AppCompatImageButton
+public class TransparentImageButton extends MaterialButton
 {
-  public TransparentImageButton(Context context, int icon, float scrWidth, int butWidth)
+  public static final int GRAVITY_START  = 0;
+  public static final int GRAVITY_MIDDLE = 1;
+  public static final int GRAVITY_END    = 2;
+
+///////////////////////////////////////////////////////////////////////////////////////////////////
+
+  public TransparentImageButton(Context context, int icon, int butWidth, int gravity)
       {
       super(context);
 
-      final int padding = (int)(scrWidth*RubikActivity.PADDING);
-      final int margin  = (int)(scrWidth*RubikActivity.MARGIN);
-
       LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(butWidth,LinearLayout.LayoutParams.MATCH_PARENT,1.0f);
 
-      params.topMargin    = margin;
-      params.bottomMargin = margin;
-      params.leftMargin   = margin;
-      params.rightMargin  = margin;
-
       setLayoutParams(params);
-      setPadding(padding,0,padding,0);
-      setImageResource(icon);
+      setPadding(0,0,0,0);
+      setIconResource(icon);
+      setIconTint(null);
+
+      switch(gravity)
+        {
+        case GRAVITY_START : setIconGravity(MaterialButton.ICON_GRAVITY_START     ); break;
+        case GRAVITY_MIDDLE: setIconGravity(MaterialButton.ICON_GRAVITY_TEXT_START); break;
+        case GRAVITY_END   : setIconGravity(MaterialButton.ICON_GRAVITY_END       ); break;
+        }
 
       TypedValue outValue = new TypedValue();
       context.getTheme().resolveAttribute(android.R.attr.selectableItemBackgroundBorderless, outValue, true);
diff --git a/src/main/java/org/distorted/main/RubikActivity.java b/src/main/java/org/distorted/main/RubikActivity.java
index e4acfe18..382d015e 100644
--- a/src/main/java/org/distorted/main/RubikActivity.java
+++ b/src/main/java/org/distorted/main/RubikActivity.java
@@ -108,7 +108,7 @@ public class RubikActivity extends AppCompatActivity
       super.onCreate(savedState);
       DistortedLibrary.onCreate(0);
 
-      setTheme(R.style.CustomActivityThemeNoActionBar);
+      setTheme(R.style.MaterialThemeNoActionBar);
       setContentView(R.layout.main);
 
       mJustStarted = true;
diff --git a/src/main/java/org/distorted/main/RubikObjectLibInterface.java b/src/main/java/org/distorted/main/RubikObjectLibInterface.java
index e26fbb87..4cb7d05a 100644
--- a/src/main/java/org/distorted/main/RubikObjectLibInterface.java
+++ b/src/main/java/org/distorted/main/RubikObjectLibInterface.java
@@ -216,17 +216,22 @@ public class RubikObjectLibInterface implements ObjectLibInterface
 
   public void onScrambleEffectFinished()
     {
-    RubikActivity act = mAct.get();
-    RubikScores.getInstance().incrementNumPlays();
+    RubikScreenPlay play = (RubikScreenPlay) ScreenList.PLAY.getScreenClass();
 
-    act.runOnUiThread(new Runnable()
+    if( play.shouldReactToEndOfScrambling() )
       {
-      @Override
-      public void run()
+      RubikActivity act = mAct.get();
+      RubikScores.getInstance().incrementNumPlays();
+
+      act.runOnUiThread(new Runnable()
+        {
+        @Override
+        public void run()
         {
         ScreenList.switchScreen( act, ScreenList.READ);
         }
-      });
+        });
+      }
     }
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
diff --git a/src/main/java/org/distorted/screens/RubikScreenBase.java b/src/main/java/org/distorted/screens/RubikScreenBase.java
index 301518b4..dfd24a2f 100644
--- a/src/main/java/org/distorted/screens/RubikScreenBase.java
+++ b/src/main/java/org/distorted/screens/RubikScreenBase.java
@@ -20,9 +20,9 @@
 package org.distorted.screens;
 
 import android.app.Activity;
-import android.widget.ImageButton;
 import android.widget.LinearLayout;
 
+import org.distorted.helpers.TransparentImageButton;
 import org.distorted.main.RubikActivity;
 import org.distorted.objectlib.main.ObjectControl;
 
@@ -39,7 +39,7 @@ abstract class RubikScreenBase extends RubikScreenAbstract
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
-  void createBottomPane(final RubikActivity act, float width, ImageButton button)
+  void createBottomPane(final RubikActivity act, TransparentImageButton left, TransparentImageButton right)
     {
     mMovesController.clearMoves(act);
 
@@ -56,11 +56,13 @@ abstract class RubikScreenBase extends RubikScreenAbstract
     layoutRight.setLayoutParams(params);
 
     ObjectControl control = act.getControl();
-    mMovesController.setupButton(act,control,width);
+    mMovesController.setupButton(act,control);
     layoutLeft.addView(mMovesController.getButton());
-    mLockController.setupButton(act,control,width);
+    mLockController.setupButton(act,control);
     layoutMid.addView(mLockController.getButton());
-    layoutRight.addView(button);
+
+    if( left !=null ) layoutRight.addView(left);
+    if( right!=null ) layoutRight.addView(right);
 
     layoutBot.addView(layoutLeft);
     layoutBot.addView(layoutMid);
diff --git a/src/main/java/org/distorted/screens/RubikScreenDone.java b/src/main/java/org/distorted/screens/RubikScreenDone.java
index 565d1f2e..9b294389 100644
--- a/src/main/java/org/distorted/screens/RubikScreenDone.java
+++ b/src/main/java/org/distorted/screens/RubikScreenDone.java
@@ -23,7 +23,6 @@ import android.content.SharedPreferences;
 import android.util.TypedValue;
 import android.view.LayoutInflater;
 import android.view.View;
-import android.widget.ImageButton;
 import android.widget.LinearLayout;
 import android.widget.TextView;
 
@@ -39,7 +38,7 @@ import org.distorted.main.RubikActivity;
 
 public class RubikScreenDone extends RubikScreenAbstract
   {
-  private ImageButton mBackButton;
+  private TransparentImageButton mBackButton;
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
@@ -76,7 +75,7 @@ public class RubikScreenDone extends RubikScreenAbstract
     LinearLayout layoutRight = new LinearLayout(act);
     layoutRight.setLayoutParams(paramsR);
 
-    setupBackButton(act,width);
+    setupBackButton(act);
 
     layoutRight.addView(mBackButton);
     layoutBot.addView(layoutLeft);
@@ -85,10 +84,10 @@ public class RubikScreenDone extends RubikScreenAbstract
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
-  private void setupBackButton(final RubikActivity act, final float width)
+  private void setupBackButton(final RubikActivity act)
     {
     int icon = RubikActivity.getDrawable(R.drawable.ui_small_back,R.drawable.ui_medium_back, R.drawable.ui_big_back, R.drawable.ui_huge_back);
-    mBackButton = new TransparentImageButton(act, icon, width, LinearLayout.LayoutParams.MATCH_PARENT);
+    mBackButton = new TransparentImageButton(act, icon, LinearLayout.LayoutParams.MATCH_PARENT, TransparentImageButton.GRAVITY_MIDDLE);
 
     mBackButton.setOnClickListener( new View.OnClickListener()
       {
diff --git a/src/main/java/org/distorted/screens/RubikScreenPattern.java b/src/main/java/org/distorted/screens/RubikScreenPattern.java
index 0b81f93a..af154fbb 100644
--- a/src/main/java/org/distorted/screens/RubikScreenPattern.java
+++ b/src/main/java/org/distorted/screens/RubikScreenPattern.java
@@ -25,7 +25,6 @@ import android.util.TypedValue;
 import android.view.Gravity;
 import android.view.LayoutInflater;
 import android.view.View;
-import android.widget.ImageButton;
 import android.widget.LinearLayout;
 import android.widget.TextView;
 
@@ -44,7 +43,7 @@ import org.distorted.patterns.RubikPatternList;
 public class RubikScreenPattern extends RubikScreenAbstract
   {
   private TextView mText;
-  private ImageButton mPrevButton, mNextButton, mBackButton;
+  private TransparentImageButton mPrevButton, mNextButton, mBackButton;
   private TextView mMovesText;
   private int mNumMoves;
   private int mPatternOrdinal, mCategory, mPattern;
@@ -91,8 +90,8 @@ public class RubikScreenPattern extends RubikScreenAbstract
     LinearLayout layoutBot = act.findViewById(R.id.lowerBar);
     layoutBot.removeAllViews();
 
-    setupPrevButton(act,width);
-    setupNextButton(act,width);
+    setupPrevButton(act);
+    setupNextButton(act);
     setupTextView(act,width);
 
     setTrioState(false);
@@ -112,7 +111,7 @@ public class RubikScreenPattern extends RubikScreenAbstract
     layoutLeft.addView(mMovesText);
     layoutLeft.addView(mNextButton);
 
-    setupBackButton(act,width);
+    setupBackButton(act);
 
     layoutRight.addView(mBackButton);
 
@@ -142,10 +141,10 @@ public class RubikScreenPattern extends RubikScreenAbstract
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
-  private void setupBackButton(final RubikActivity act, final float width)
+  private void setupBackButton(final RubikActivity act)
     {
     final int icon = RubikActivity.getDrawable(R.drawable.ui_small_back,R.drawable.ui_medium_back, R.drawable.ui_big_back, R.drawable.ui_huge_back);
-    mBackButton = new TransparentImageButton(act, icon, width, LinearLayout.LayoutParams.MATCH_PARENT);
+    mBackButton = new TransparentImageButton(act, icon, LinearLayout.LayoutParams.MATCH_PARENT, TransparentImageButton.GRAVITY_MIDDLE);
 
     mBackButton.setOnClickListener( new View.OnClickListener()
       {
@@ -161,10 +160,10 @@ public class RubikScreenPattern extends RubikScreenAbstract
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
-  private void setupPrevButton(final RubikActivity act, final float width)
+  private void setupPrevButton(final RubikActivity act)
     {
     int icon = RubikActivity.getDrawable(R.drawable.ui_small_left,R.drawable.ui_medium_left, R.drawable.ui_big_left, R.drawable.ui_huge_left);
-    mPrevButton = new TransparentImageButton(act,icon,width,0);
+    mPrevButton = new TransparentImageButton(act,icon,0,TransparentImageButton.GRAVITY_MIDDLE);
 
     mPrevButton.setOnClickListener( new View.OnClickListener()
       {
@@ -182,10 +181,10 @@ public class RubikScreenPattern extends RubikScreenAbstract
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
-  private void setupNextButton(final RubikActivity act, final float width)
+  private void setupNextButton(final RubikActivity act)
     {
     int icon = RubikActivity.getDrawable(R.drawable.ui_small_right,R.drawable.ui_medium_right, R.drawable.ui_big_right, R.drawable.ui_huge_right);
-    mNextButton = new TransparentImageButton(act,icon,width,0);
+    mNextButton = new TransparentImageButton(act,icon,0,TransparentImageButton.GRAVITY_MIDDLE);
 
     mNextButton.setOnClickListener( new View.OnClickListener()
       {
diff --git a/src/main/java/org/distorted/screens/RubikScreenPlay.java b/src/main/java/org/distorted/screens/RubikScreenPlay.java
index 8f74fa25..939ae7a9 100644
--- a/src/main/java/org/distorted/screens/RubikScreenPlay.java
+++ b/src/main/java/org/distorted/screens/RubikScreenPlay.java
@@ -69,7 +69,7 @@ public class RubikScreenPlay extends RubikScreenBase
   private static final float LAST_BUTTON = 1.5f;
   private static final int[] mLocation = new int[2];
 
-  private ImageButton mObjButton, mMenuButton, mSolveButton;
+  private TransparentImageButton mObjButton, mMenuButton, mSolveButton, mScrambleButton;
   private Button mPlayButton;
   private PopupWindow mObjectPopup, mMenuPopup, mPlayPopup;
   private ObjectType mObject = DEF_OBJECT;
@@ -79,6 +79,7 @@ public class RubikScreenPlay extends RubikScreenBase
   private int mColCount, mRowCount, mMaxRowCount;
   private LinearLayout mPlayLayout;
   private int mUpperBarHeight;
+  private boolean mShouldReactToEndOfScrambling;
 
   static
     {
@@ -128,8 +129,9 @@ public class RubikScreenPlay extends RubikScreenBase
     setupPlayButton(act,width);
     layoutTop.addView(mPlayButton);
 
-    setupSolveButton(act,width);
-    createBottomPane(act,width,mSolveButton);
+    setupSolveButton(act);
+    setupScrambleButton(act);
+    createBottomPane(act,mSolveButton,mScrambleButton);
     }
 
 //////////////////////////////////////////////////////////////////////////////////////////////////
@@ -139,7 +141,7 @@ public class RubikScreenPlay extends RubikScreenBase
     final int margin  = (int)(width*RubikActivity.MARGIN);
     final int icon = RubikActivity.getDrawable(R.drawable.ui_small_cube_menu,R.drawable.ui_medium_cube_menu, R.drawable.ui_big_cube_menu, R.drawable.ui_huge_cube_menu);
 
-    mObjButton = new TransparentImageButton(act, icon, width,LinearLayout.LayoutParams.MATCH_PARENT);
+    mObjButton = new TransparentImageButton(act, icon, LinearLayout.LayoutParams.MATCH_PARENT, TransparentImageButton.GRAVITY_MIDDLE);
 
     mObjButton.setOnClickListener( new View.OnClickListener()
       {
@@ -206,7 +208,7 @@ public class RubikScreenPlay extends RubikScreenBase
     final int margin = (int)(width*RubikActivity.MARGIN);
     final int icon = RubikActivity.getDrawable(R.drawable.ui_small_menu,R.drawable.ui_medium_menu, R.drawable.ui_big_menu, R.drawable.ui_huge_menu);
 
-    mMenuButton = new TransparentImageButton(act, icon, width,LinearLayout.LayoutParams.MATCH_PARENT);
+    mMenuButton = new TransparentImageButton(act, icon, LinearLayout.LayoutParams.MATCH_PARENT, TransparentImageButton.GRAVITY_MIDDLE);
 
     mMenuButton.setOnClickListener( new View.OnClickListener()
       {
@@ -398,10 +400,10 @@ public class RubikScreenPlay extends RubikScreenBase
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
-  void setupSolveButton(final RubikActivity act, final float width)
+  void setupSolveButton(final RubikActivity act)
     {
-    int icon = RubikActivity.getDrawable(R.drawable.ui_small_cube_solve,R.drawable.ui_medium_cube_solve, R.drawable.ui_big_cube_solve, R.drawable.ui_huge_cube_solve);
-    mSolveButton = new TransparentImageButton(act, icon, width,LinearLayout.LayoutParams.MATCH_PARENT);
+    int icon = RubikActivity.getDrawable(R.drawable.ui_small_cube_solve_new,R.drawable.ui_medium_cube_solve_new, R.drawable.ui_big_cube_solve_new, R.drawable.ui_huge_cube_solve_new);
+    mSolveButton = new TransparentImageButton(act, icon, LinearLayout.LayoutParams.MATCH_PARENT, TransparentImageButton.GRAVITY_END);
 
     mSolveButton.setOnClickListener( new View.OnClickListener()
       {
@@ -414,6 +416,26 @@ public class RubikScreenPlay extends RubikScreenBase
       });
     }
 
+///////////////////////////////////////////////////////////////////////////////////////////////////
+
+  private void setupScrambleButton(final RubikActivity act)
+    {
+    int icon = RubikActivity.getDrawable(R.drawable.ui_small_cube_scramble_new,R.drawable.ui_medium_cube_scramble_new, R.drawable.ui_big_cube_scramble_new, R.drawable.ui_huge_cube_scramble_new);
+    mScrambleButton = new TransparentImageButton(act, icon, LinearLayout.LayoutParams.MATCH_PARENT, TransparentImageButton.GRAVITY_START);
+
+    mScrambleButton.setOnClickListener( new View.OnClickListener()
+      {
+      @Override
+      public void onClick(View v)
+        {
+        RubikScreenPlay play = (RubikScreenPlay) ScreenList.PLAY.getScreenClass();
+        int numScrambles = play.getObject().getNumScramble();
+        mShouldReactToEndOfScrambling = false;
+        act.getControl().scrambleObject(numScrambles);
+        }
+      });
+    }
+
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
   public void savePreferences(SharedPreferences.Editor editor)
@@ -590,6 +612,7 @@ public class RubikScreenPlay extends RubikScreenBase
             {
             if( mPlayPopup!=null ) mPlayPopup.dismiss();
             mLevelValue = level;
+            mShouldReactToEndOfScrambling = true;
             control.scrambleObject(scrambles);
             }
           }
@@ -633,6 +656,13 @@ public class RubikScreenPlay extends RubikScreenBase
     return mLevelValue;
     }
 
+///////////////////////////////////////////////////////////////////////////////////////////////////
+
+  public boolean shouldReactToEndOfScrambling()
+    {
+    return mShouldReactToEndOfScrambling;
+    }
+
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
   public ObjectType getObject()
diff --git a/src/main/java/org/distorted/screens/RubikScreenReady.java b/src/main/java/org/distorted/screens/RubikScreenReady.java
index 08091fe4..6655e45b 100644
--- a/src/main/java/org/distorted/screens/RubikScreenReady.java
+++ b/src/main/java/org/distorted/screens/RubikScreenReady.java
@@ -23,7 +23,6 @@ import android.content.SharedPreferences;
 import android.util.TypedValue;
 import android.view.LayoutInflater;
 import android.view.View;
-import android.widget.ImageButton;
 import android.widget.LinearLayout;
 import android.widget.TextView;
 
@@ -35,7 +34,7 @@ import org.distorted.main.RubikActivity;
 
 public class RubikScreenReady extends RubikScreenBase
   {
-  private ImageButton mBackButton;
+  private TransparentImageButton mBackButton;
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
@@ -60,16 +59,16 @@ public class RubikScreenReady extends RubikScreenBase
     label.setText(R.string.ready);
     layoutTop.addView(label);
 
-    setupBackButton(act,width);
-    createBottomPane(act,width,mBackButton);
+    setupBackButton(act);
+    createBottomPane(act,mBackButton,null);
     }
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
-  private void setupBackButton(final RubikActivity act, final float width)
+  private void setupBackButton(final RubikActivity act)
     {
     int icon = RubikActivity.getDrawable(R.drawable.ui_small_back,R.drawable.ui_medium_back, R.drawable.ui_big_back, R.drawable.ui_huge_back);
-    mBackButton = new TransparentImageButton(act, icon, width, LinearLayout.LayoutParams.MATCH_PARENT);
+    mBackButton = new TransparentImageButton(act, icon, LinearLayout.LayoutParams.MATCH_PARENT, TransparentImageButton.GRAVITY_MIDDLE);
 
     mBackButton.setOnClickListener( new View.OnClickListener()
       {
diff --git a/src/main/java/org/distorted/screens/RubikScreenSolution.java b/src/main/java/org/distorted/screens/RubikScreenSolution.java
index 9a7be7c1..63bb7835 100644
--- a/src/main/java/org/distorted/screens/RubikScreenSolution.java
+++ b/src/main/java/org/distorted/screens/RubikScreenSolution.java
@@ -24,7 +24,6 @@ import android.util.TypedValue;
 import android.view.Gravity;
 import android.view.LayoutInflater;
 import android.view.View;
-import android.widget.ImageButton;
 import android.widget.LinearLayout;
 import android.widget.TextView;
 
@@ -42,7 +41,7 @@ public class RubikScreenSolution extends RubikScreenAbstract implements MovesFin
   {
   private static final int MILLIS_PER_DEGREE = 6;
 
-  private ImageButton mPrevButton, mNextButton, mBackButton;
+  private TransparentImageButton mPrevButton, mNextButton, mBackButton;
   private TextView mMovesText;
   private int[][] mMoves;
   private int mCurrMove, mNumMoves;
@@ -91,15 +90,15 @@ public class RubikScreenSolution extends RubikScreenAbstract implements MovesFin
     LinearLayout layoutRight = new LinearLayout(act);
     layoutRight.setLayoutParams(paramsR);
 
-    setupPrevButton(act,width);
-    setupNextButton(act,width);
+    setupPrevButton(act);
+    setupNextButton(act);
     setupTextView(act,width);
 
     layoutLeft.addView(mPrevButton);
     layoutLeft.addView(mMovesText);
     layoutLeft.addView(mNextButton);
 
-    setupBackButton(act,width);
+    setupBackButton(act);
 
     layoutRight.addView(mBackButton);
 
@@ -110,10 +109,10 @@ public class RubikScreenSolution extends RubikScreenAbstract implements MovesFin
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
-  private void setupPrevButton(final RubikActivity act, final float width)
+  private void setupPrevButton(final RubikActivity act)
     {
     int icon = RubikActivity.getDrawable(R.drawable.ui_small_left,R.drawable.ui_medium_left, R.drawable.ui_big_left, R.drawable.ui_huge_left);
-    mPrevButton = new TransparentImageButton(act,icon,width,0);
+    mPrevButton = new TransparentImageButton(act,icon,0,TransparentImageButton.GRAVITY_MIDDLE);
 
     mPrevButton.setOnClickListener( new View.OnClickListener()
       {
@@ -129,10 +128,10 @@ public class RubikScreenSolution extends RubikScreenAbstract implements MovesFin
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
-  private void setupNextButton(final RubikActivity act, final float width)
+  private void setupNextButton(final RubikActivity act)
     {
     int icon = RubikActivity.getDrawable(R.drawable.ui_small_right,R.drawable.ui_medium_right, R.drawable.ui_big_right, R.drawable.ui_huge_right);
-    mNextButton = new TransparentImageButton(act,icon,width,0);
+    mNextButton = new TransparentImageButton(act,icon,0,TransparentImageButton.GRAVITY_MIDDLE);
 
     mNextButton.setOnClickListener( new View.OnClickListener()
       {
@@ -169,10 +168,10 @@ public class RubikScreenSolution extends RubikScreenAbstract implements MovesFin
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
-  private void setupBackButton(final RubikActivity act, final float width)
+  private void setupBackButton(final RubikActivity act)
     {
     final int icon = RubikActivity.getDrawable(R.drawable.ui_small_back,R.drawable.ui_medium_back, R.drawable.ui_big_back, R.drawable.ui_huge_back);
-    mBackButton = new TransparentImageButton(act, icon, width, LinearLayout.LayoutParams.MATCH_PARENT);
+    mBackButton = new TransparentImageButton(act, icon, LinearLayout.LayoutParams.MATCH_PARENT, TransparentImageButton.GRAVITY_MIDDLE);
 
     mBackButton.setOnClickListener( new View.OnClickListener()
       {
diff --git a/src/main/java/org/distorted/screens/RubikScreenSolver.java b/src/main/java/org/distorted/screens/RubikScreenSolver.java
index 441fcba0..7328ae90 100644
--- a/src/main/java/org/distorted/screens/RubikScreenSolver.java
+++ b/src/main/java/org/distorted/screens/RubikScreenSolver.java
@@ -50,7 +50,7 @@ public class RubikScreenSolver extends RubikScreenAbstract
   {
   private static Bitmap[] mBitmap;
   private ImageButton[] mColorButton;
-  private ImageButton mBackButton, mSolveButton;
+  private TransparentImageButton mBackButton, mSolveButton;
   private boolean mSolving;
   private int mCurrentColor;
   private int[] mFaceColors;
@@ -118,8 +118,8 @@ public class RubikScreenSolver extends RubikScreenAbstract
     LinearLayout layoutBot = act.findViewById(R.id.lowerBar);
     layoutBot.removeAllViews();
 
-    setupSolveButton(act,width);
-    setupBackButton(act,width);
+    setupSolveButton(act);
+    setupBackButton(act);
 
     layoutLeft.addView(mSolveButton);
     layoutRight.addView(mBackButton);
@@ -209,10 +209,10 @@ public class RubikScreenSolver extends RubikScreenAbstract
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
-  private void setupSolveButton(final RubikActivity act, final float width)
+  private void setupSolveButton(final RubikActivity act)
     {
     final int icon = RubikActivity.getDrawable(R.drawable.ui_small_solve,R.drawable.ui_medium_solve, R.drawable.ui_big_solve, R.drawable.ui_huge_solve);
-    mSolveButton = new TransparentImageButton(act,icon,width, LinearLayout.LayoutParams.MATCH_PARENT);
+    mSolveButton = new TransparentImageButton(act,icon,LinearLayout.LayoutParams.MATCH_PARENT,TransparentImageButton.GRAVITY_MIDDLE);
 
     mSolveButton.setOnClickListener( new View.OnClickListener()
       {
@@ -232,10 +232,10 @@ public class RubikScreenSolver extends RubikScreenAbstract
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
-  private void setupBackButton(final RubikActivity act, final float width)
+  private void setupBackButton(final RubikActivity act)
     {
     final int icon = RubikActivity.getDrawable(R.drawable.ui_small_back,R.drawable.ui_medium_back, R.drawable.ui_big_back, R.drawable.ui_huge_back);
-    mBackButton = new TransparentImageButton(act, icon, width, LinearLayout.LayoutParams.MATCH_PARENT);
+    mBackButton = new TransparentImageButton(act, icon, LinearLayout.LayoutParams.MATCH_PARENT, TransparentImageButton.GRAVITY_MIDDLE);
 
     mBackButton.setOnClickListener( new View.OnClickListener()
       {
diff --git a/src/main/java/org/distorted/screens/RubikScreenSolving.java b/src/main/java/org/distorted/screens/RubikScreenSolving.java
index 6b45bcbe..11e30978 100644
--- a/src/main/java/org/distorted/screens/RubikScreenSolving.java
+++ b/src/main/java/org/distorted/screens/RubikScreenSolving.java
@@ -26,7 +26,6 @@ import android.content.SharedPreferences;
 import android.util.TypedValue;
 import android.view.LayoutInflater;
 import android.view.View;
-import android.widget.ImageButton;
 import android.widget.LinearLayout;
 import android.widget.TextView;
 
@@ -49,7 +48,7 @@ public class RubikScreenSolving extends RubikScreenBase
   private boolean mRunning;
   private final RubikScores mScores;
   private long mElapsed;
-  private ImageButton mBackButton;
+  private TransparentImageButton mBackButton;
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
@@ -85,16 +84,16 @@ public class RubikScreenSolving extends RubikScreenBase
     mTime.setText(act.getString(R.string.tm_placeholder,elapsed/60,elapsed%60));
     layoutTop.addView(mTime);
 
-    setupBackButton(act,width);
-    createBottomPane(act,width,mBackButton);
+    setupBackButton(act);
+    createBottomPane(act,mBackButton,null);
     }
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
-  private void setupBackButton(final RubikActivity act, final float width)
+  private void setupBackButton(final RubikActivity act)
     {
     int icon = RubikActivity.getDrawable(R.drawable.ui_small_back,R.drawable.ui_medium_back, R.drawable.ui_big_back, R.drawable.ui_huge_back);
-    mBackButton = new TransparentImageButton(act, icon, width, LinearLayout.LayoutParams.MATCH_PARENT);
+    mBackButton = new TransparentImageButton(act, icon, LinearLayout.LayoutParams.MATCH_PARENT, TransparentImageButton.GRAVITY_MIDDLE);
 
     mBackButton.setOnClickListener( new View.OnClickListener()
       {
diff --git a/src/main/java/org/distorted/tutorials/TutorialActivity.java b/src/main/java/org/distorted/tutorials/TutorialActivity.java
index f1ccdf26..1524a215 100644
--- a/src/main/java/org/distorted/tutorials/TutorialActivity.java
+++ b/src/main/java/org/distorted/tutorials/TutorialActivity.java
@@ -75,7 +75,7 @@ public class TutorialActivity extends AppCompatActivity
       {
       super.onCreate(savedState);
       DistortedLibrary.onCreate(1);
-      setTheme(R.style.CustomActivityThemeNoActionBar);
+      setTheme(R.style.MaterialThemeNoActionBar);
       setContentView(R.layout.tutorial);
 
       Bundle b = getIntent().getExtras();
@@ -139,7 +139,7 @@ public class TutorialActivity extends AppCompatActivity
 
       if( mState==null ) mState = new TutorialScreen();
 
-      mState.createRightPane(this,width);
+      mState.createRightPane(this);
 
       WebView videoView = findViewById(R.id.tutorialVideoView);
       mWebView = new TutorialWebView(videoView);
diff --git a/src/main/java/org/distorted/tutorials/TutorialScreen.java b/src/main/java/org/distorted/tutorials/TutorialScreen.java
index cf36fc69..9ca90c7e 100644
--- a/src/main/java/org/distorted/tutorials/TutorialScreen.java
+++ b/src/main/java/org/distorted/tutorials/TutorialScreen.java
@@ -21,12 +21,10 @@ package org.distorted.tutorials;
 
 import android.app.Activity;
 import android.view.View;
-import android.widget.ImageButton;
 import android.widget.LinearLayout;
 
 import org.distorted.helpers.MovesController;
 import org.distorted.objectlib.main.ObjectControl;
-import org.distorted.objectlib.main.ObjectType;
 
 import org.distorted.helpers.LockController;
 import org.distorted.main.R;
@@ -39,16 +37,16 @@ import org.distorted.helpers.TransparentImageButton;
 
 public class TutorialScreen
 {
-  private ImageButton mSolveButton, mScrambleButton, mBackButton;
+  private TransparentImageButton mSolveButton, mScrambleButton, mBackButton;
   private final LockController mLockController;
   private final MovesController mMovesController;
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
-  private void setupSolveButton(final TutorialActivity act, final float width)
+  private void setupSolveButton(final TutorialActivity act)
     {
     int icon = RubikActivity.getDrawable(R.drawable.ui_small_cube_solve,R.drawable.ui_medium_cube_solve, R.drawable.ui_big_cube_solve, R.drawable.ui_huge_cube_solve);
-    mSolveButton = new TransparentImageButton(act, icon, width, LinearLayout.LayoutParams.MATCH_PARENT);
+    mSolveButton = new TransparentImageButton(act, icon, LinearLayout.LayoutParams.MATCH_PARENT, TransparentImageButton.GRAVITY_MIDDLE);
 
     mSolveButton.setOnClickListener( new View.OnClickListener()
       {
@@ -63,10 +61,10 @@ public class TutorialScreen
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
-  private void setupScrambleButton(final TutorialActivity act, final float width)
+  private void setupScrambleButton(final TutorialActivity act)
     {
     int icon = RubikActivity.getDrawable(R.drawable.ui_small_cube_scramble,R.drawable.ui_medium_cube_scramble, R.drawable.ui_big_cube_scramble, R.drawable.ui_huge_cube_scramble);
-    mScrambleButton = new TransparentImageButton(act, icon, width,LinearLayout.LayoutParams.MATCH_PARENT);
+    mScrambleButton = new TransparentImageButton(act, icon, LinearLayout.LayoutParams.MATCH_PARENT, TransparentImageButton.GRAVITY_MIDDLE);
 
     mScrambleButton.setOnClickListener( new View.OnClickListener()
       {
@@ -82,10 +80,10 @@ public class TutorialScreen
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
-  private void setupBackButton(final TutorialActivity act, final float width)
+  private void setupBackButton(final TutorialActivity act)
     {
     int icon = RubikActivity.getDrawable(R.drawable.ui_small_smallback,R.drawable.ui_medium_smallback, R.drawable.ui_big_smallback, R.drawable.ui_huge_smallback);
-    mBackButton = new TransparentImageButton(act, icon, width, LinearLayout.LayoutParams.MATCH_PARENT);
+    mBackButton = new TransparentImageButton(act, icon, LinearLayout.LayoutParams.MATCH_PARENT, TransparentImageButton.GRAVITY_MIDDLE);
 
     mBackButton.setOnClickListener( new View.OnClickListener()
       {
@@ -101,21 +99,21 @@ public class TutorialScreen
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
-  void createRightPane(final TutorialActivity act, float width)
+  void createRightPane(final TutorialActivity act)
     {
     LinearLayout layout = act.findViewById(R.id.tutorialRightBar);
     layout.removeAllViews();
 
     ObjectControl control = act.getControl();
-    mMovesController.setupButton(act,control, width);
-    mLockController.setupButton(act,control,width);
-    setupSolveButton(act,width);
-    setupScrambleButton(act,width);
-    setupBackButton(act,width);
+    mMovesController.setupButton(act,control);
+    mLockController.setupButton(act,control);
+    setupSolveButton(act);
+    setupScrambleButton(act);
+    setupBackButton(act);
 
     layout.addView(mSolveButton);
-    layout.addView(mMovesController.getButton());
     layout.addView(mScrambleButton);
+    layout.addView(mMovesController.getButton());
     layout.addView(mLockController.getButton());
     layout.addView(mBackButton);
     }
diff --git a/src/main/res/drawable-nodpi/ui_big_cube_scramble.png b/src/main/res/drawable-nodpi/ui_big_cube_scramble.png
index 887d8f2f..54328d09 100644
Binary files a/src/main/res/drawable-nodpi/ui_big_cube_scramble.png and b/src/main/res/drawable-nodpi/ui_big_cube_scramble.png differ
diff --git a/src/main/res/drawable-nodpi/ui_huge_cube_scramble.png b/src/main/res/drawable-nodpi/ui_huge_cube_scramble.png
index df46cd71..f2b5750c 100644
Binary files a/src/main/res/drawable-nodpi/ui_huge_cube_scramble.png and b/src/main/res/drawable-nodpi/ui_huge_cube_scramble.png differ
diff --git a/src/main/res/drawable-nodpi/ui_medium_cube_scramble.png b/src/main/res/drawable-nodpi/ui_medium_cube_scramble.png
index b2ab231e..c2387ff0 100644
Binary files a/src/main/res/drawable-nodpi/ui_medium_cube_scramble.png and b/src/main/res/drawable-nodpi/ui_medium_cube_scramble.png differ
diff --git a/src/main/res/drawable-nodpi/ui_small_cube_scramble.png b/src/main/res/drawable-nodpi/ui_small_cube_scramble.png
index 9e6b2a3d..4b486c46 100644
Binary files a/src/main/res/drawable-nodpi/ui_small_cube_scramble.png and b/src/main/res/drawable-nodpi/ui_small_cube_scramble.png differ
diff --git a/src/main/res/values/styles.xml b/src/main/res/values/styles.xml
index a0eef02b..bef622b0 100644
--- a/src/main/res/values/styles.xml
+++ b/src/main/res/values/styles.xml
@@ -15,4 +15,11 @@
         <item name="android:windowContentOverlay">@null</item>
     </style>
 
+   <style name="MaterialThemeNoActionBar" parent="@style/Theme.MaterialComponents.NoActionBar">
+        <item name="android:windowNoTitle">true</item>
+        <item name="android:windowActionBar">false</item>
+        <item name="android:windowFullscreen">true</item>
+        <item name="android:windowContentOverlay">@null</item>
+    </style>
+
 </resources>
