commit ad0c8e0e06f7ce7b2607e7287b09abe92df7e016
Author: Leszek Koltunski <leszek@koltunski.pl>
Date:   Fri Jun 26 13:22:41 2020 +0100

    Make the margins and paddings proportional to screen size.

diff --git a/src/main/java/org/distorted/main/RubikActivity.java b/src/main/java/org/distorted/main/RubikActivity.java
index b79912ae..01590efe 100644
--- a/src/main/java/org/distorted/main/RubikActivity.java
+++ b/src/main/java/org/distorted/main/RubikActivity.java
@@ -43,6 +43,8 @@ import org.distorted.states.RubikStatePlay;
 
 public class RubikActivity extends AppCompatActivity
 {
+    public static final float PADDING          = 0.01f;
+    public static final float MARGIN           = 0.004f;
     public static final float BUTTON_TEXT_SIZE = 0.05f;
     public static final float TITLE_TEXT_SIZE  = 0.06f;
     public static final float BITMAP_TEXT_SIZE = 0.09f;
diff --git a/src/main/java/org/distorted/states/RubikStateDone.java b/src/main/java/org/distorted/states/RubikStateDone.java
index bdbf59b5..e394efcb 100644
--- a/src/main/java/org/distorted/states/RubikStateDone.java
+++ b/src/main/java/org/distorted/states/RubikStateDone.java
@@ -49,8 +49,6 @@ public class RubikStateDone extends RubikStateAbstract
     float titleSize = width*RubikActivity.TITLE_TEXT_SIZE;
 
     LayoutInflater inflater = act.getLayoutInflater();
-    DisplayMetrics metrics = act.getResources().getDisplayMetrics();
-    float scale = metrics.density;
 
     // TOP ////////////////////////////
     LinearLayout layoutTop = act.findViewById(R.id.upperBar);
@@ -67,8 +65,14 @@ public class RubikStateDone extends RubikStateAbstract
     LinearLayout layoutRight = act.findViewById(R.id.mainBarRight);
     layoutRight.removeAllViews();
 
-    int padding = (int)(5*scale + 0.5f);
+    int padding = (int)(width*RubikActivity.PADDING);
+    int margin  = (int)(width*RubikActivity.MARGIN);
+
     LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT,LinearLayout.LayoutParams.MATCH_PARENT);
+    params.topMargin    = margin;
+    params.bottomMargin = margin;
+    params.leftMargin   = margin;
+    params.rightMargin  = margin;
 
     Button back = new Button(act);
     back.setLayoutParams(params);
diff --git a/src/main/java/org/distorted/states/RubikStatePattern.java b/src/main/java/org/distorted/states/RubikStatePattern.java
index 614b7c74..d9fd2960 100644
--- a/src/main/java/org/distorted/states/RubikStatePattern.java
+++ b/src/main/java/org/distorted/states/RubikStatePattern.java
@@ -113,11 +113,10 @@ public class RubikStatePattern extends RubikStateAbstract
 
     // BOT ////////////////////////////
     DisplayMetrics metrics = act.getResources().getDisplayMetrics();
-    final float scale = metrics.density;
 
-    setupPrevButton(act,scale);
-    setupNextButton(act,scale);
-    setupTextView(act,scale);
+    setupPrevButton(act,width);
+    setupNextButton(act,width);
+    setupTextView(act,width);
 
     setTrioState(false);
 
@@ -127,7 +126,7 @@ public class RubikStatePattern extends RubikStateAbstract
     layoutLeft.addView(mMovesText);
     layoutLeft.addView(mNextButton);
 
-    setupBackButton(act,scale);
+    setupBackButton(act,width);
 
     LinearLayout layoutRight = act.findViewById(R.id.mainBarRight);
     layoutRight.removeAllViews();
@@ -158,12 +157,19 @@ public class RubikStatePattern extends RubikStateAbstract
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
-  private void setupBackButton(final RubikActivity act, final float scale)
+  private void setupBackButton(final RubikActivity act, final float width)
     {
-    int padding = (int)(3*scale + 0.5f);
-    LinearLayout.LayoutParams backParams = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT,LinearLayout.LayoutParams.MATCH_PARENT);
+    int padding = (int)(width*RubikActivity.PADDING);
+    int margin  = (int)(width*RubikActivity.MARGIN);
+
+    LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT,LinearLayout.LayoutParams.MATCH_PARENT);
+    params.topMargin    = margin;
+    params.bottomMargin = margin;
+    params.leftMargin   = margin;
+    params.rightMargin  = margin;
+
     mBackButton = new Button(act);
-    mBackButton.setLayoutParams(backParams);
+    mBackButton.setLayoutParams(params);
     mBackButton.setPadding(padding,0,padding,0);
     mBackButton.setTextSize(TypedValue.COMPLEX_UNIT_PX, mButtonSize);
     mBackButton.setText(R.string.back);
@@ -193,10 +199,17 @@ public class RubikStatePattern extends RubikStateAbstract
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
-  private void setupPrevButton(final RubikActivity act, final float scale)
+  private void setupPrevButton(final RubikActivity act, final float width)
     {
-    int padding = (int)(3*scale + 0.5f);
+    int padding = (int)(width*RubikActivity.PADDING);
+    int margin  = (int)(width*RubikActivity.MARGIN);
+
     LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(0,LinearLayout.LayoutParams.MATCH_PARENT,1.0f);
+    params.topMargin    = margin;
+    params.bottomMargin = margin;
+    params.leftMargin   = margin;
+    params.rightMargin  = margin;
+
     mPrevButton = new ImageButton(act);
     mPrevButton.setLayoutParams(params);
     mPrevButton.setPadding(padding,0,padding,0);
@@ -218,10 +231,17 @@ public class RubikStatePattern extends RubikStateAbstract
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
-  private void setupNextButton(final RubikActivity act, final float scale)
+  private void setupNextButton(final RubikActivity act, final float width)
     {
-    int padding = (int)( 3*scale + 0.5f);
+    int padding = (int)(width*RubikActivity.PADDING);
+    int margin  = (int)(width*RubikActivity.MARGIN);
+
     LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(0,LinearLayout.LayoutParams.MATCH_PARENT, 1.0f);
+    params.topMargin    = margin;
+    params.bottomMargin = margin;
+    params.leftMargin   = margin;
+    params.rightMargin  = margin;
+
     mNextButton = new ImageButton(act);
     mNextButton.setLayoutParams(params);
     mNextButton.setPadding(padding,0,padding,0);
@@ -243,10 +263,16 @@ public class RubikStatePattern extends RubikStateAbstract
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
-  private void setupTextView(final RubikActivity act, final float scale)
+  private void setupTextView(final RubikActivity act, final float width)
     {
-    int padding = (int)( 3*scale + 0.5f);
+    int padding = (int)(width*RubikActivity.PADDING);
+    int margin  = (int)(width*RubikActivity.MARGIN);
+
     LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(0,LinearLayout.LayoutParams.MATCH_PARENT,2.0f);
+    params.topMargin    = margin;
+    params.bottomMargin = margin;
+    params.leftMargin   = margin;
+    params.rightMargin  = margin;
 
     mMovesText = new TextView(act);
     mMovesText.setTextSize(20);
diff --git a/src/main/java/org/distorted/states/RubikStatePlay.java b/src/main/java/org/distorted/states/RubikStatePlay.java
index ad26e6af..c97d6d26 100644
--- a/src/main/java/org/distorted/states/RubikStatePlay.java
+++ b/src/main/java/org/distorted/states/RubikStatePlay.java
@@ -103,7 +103,6 @@ public class RubikStatePlay extends RubikStateAbstract implements AdapterView.On
   void enterState(final RubikActivity act)
     {
     DisplayMetrics metrics = act.getResources().getDisplayMetrics();
-    final float scale = metrics.density;
 
     float width = act.getScreenWidthInPixels();
     mMenuTextSize = width*RubikActivity.MENU_MEDIUM_TEXT_SIZE;
@@ -120,42 +119,49 @@ public class RubikStatePlay extends RubikStateAbstract implements AdapterView.On
     LinearLayout layoutTop = act.findViewById(R.id.upperBar);
     layoutTop.removeAllViews();
 
-    setupObjectButton(act,scale);
+    setupObjectButton(act,width);
     layoutTop.addView(mObjButton);
-    setupLevelSpinner(act,scale);
+    setupLevelSpinner(act,width);
     layoutTop.addView(mLevelSpinner);
-    setupPlayButton(act,scale);
+    setupPlayButton(act,width);
     layoutTop.addView(mPlayButton);
 
-    setupObjectWindow(act, scale);
+    setupObjectWindow(act,width);
 
     // BOT ////////////////////////////
 
     LinearLayout layoutLeft = act.findViewById(R.id.mainBarLeft);
     layoutLeft.removeAllViews();
 
-    setupPrevButton(act,scale,width);
+    setupPrevButton(act,width);
     layoutLeft.addView(mPrevButton);
-    setupSolveButton(act,scale,width);
+    setupSolveButton(act,width);
     layoutLeft.addView(mSolveButton);
 
     LinearLayout layoutRight = act.findViewById(R.id.mainBarRight);
     layoutRight.removeAllViews();
 
-    setupMenuButton(act,scale);
+    setupMenuButton(act,width);
     layoutRight.addView(mMenuButton);
 
-    setupMenuWindow(act, scale, width);
+    setupMenuWindow(act,width);
     }
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
-  private void setupObjectButton(final RubikActivity act, final float scale)
+  private void setupObjectButton(final RubikActivity act, final float width)
     {
-    int padding = (int)(3*scale + 0.5f);
-    LinearLayout.LayoutParams objectParams = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT,LinearLayout.LayoutParams.MATCH_PARENT, 1.2f);
+    int padding = (int)(width*RubikActivity.PADDING);
+    int margin  = (int)(width*RubikActivity.MARGIN);
+
+    LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT,LinearLayout.LayoutParams.MATCH_PARENT, 1.2f);
+    params.topMargin    = margin;
+    params.bottomMargin = margin;
+    params.leftMargin   = margin;
+    params.rightMargin  = margin;
+
     mObjButton = new ImageButton(act);
-    mObjButton.setLayoutParams(objectParams);
+    mObjButton.setLayoutParams(params);
     mObjButton.setPadding(padding,0,padding,0);
     mObjButton.setImageResource(R.drawable.cube_menu);
 
@@ -187,18 +193,18 @@ public class RubikStatePlay extends RubikStateAbstract implements AdapterView.On
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
-  private void setupLevelSpinner(final RubikActivity act, final float scale)
+  private void setupLevelSpinner(final RubikActivity act, final float width)
     {
-    int padding = (int)(scale* 10 + 0.5f);
-    int margin  = (int)(scale*  3 + 0.5f);
-    LinearLayout.LayoutParams spinnerLayoutParams = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT,LinearLayout.LayoutParams.MATCH_PARENT, 1.0f);
-    spinnerLayoutParams.topMargin    = margin;
-    spinnerLayoutParams.bottomMargin = margin;
-    spinnerLayoutParams.leftMargin   = margin;
-    spinnerLayoutParams.rightMargin  = margin;
+    int padding = (int)(width*RubikActivity.PADDING);
+    int margin  = (int)(width*RubikActivity.MARGIN);
+    LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT,LinearLayout.LayoutParams.MATCH_PARENT, 1.0f);
+    params.topMargin    = margin;
+    params.bottomMargin = margin;
+    params.leftMargin   = margin;
+    params.rightMargin  = margin;
 
     mLevelSpinner = new AppCompatSpinner(act);
-    mLevelSpinner.setLayoutParams(spinnerLayoutParams);
+    mLevelSpinner.setLayoutParams(params);
     mLevelSpinner.setPadding(padding,0,padding,0);
     mLevelSpinner.setBackgroundResource(R.drawable.spinner);
     mLevelSpinner.setTextAlignment(View.TEXT_ALIGNMENT_CENTER);
@@ -234,12 +240,18 @@ public class RubikStatePlay extends RubikStateAbstract implements AdapterView.On
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
-  private void setupPlayButton(final RubikActivity act, final float scale)
+  private void setupPlayButton(final RubikActivity act, final float width)
     {
-    int padding = (int)(3*scale + 0.5f);
-    LinearLayout.LayoutParams backParams = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT,LinearLayout.LayoutParams.MATCH_PARENT, 1.2f);
+    int padding = (int)(width*RubikActivity.PADDING);
+    int margin  = (int)(width*RubikActivity.MARGIN);
+    LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT,LinearLayout.LayoutParams.MATCH_PARENT, 1.2f);
+    params.topMargin    = margin;
+    params.bottomMargin = margin;
+    params.leftMargin   = margin;
+    params.rightMargin  = margin;
+
     mPlayButton = new Button(act);
-    mPlayButton.setLayoutParams(backParams);
+    mPlayButton.setLayoutParams(params);
     mPlayButton.setPadding(padding,0,padding,0);
     mPlayButton.setTextSize(TypedValue.COMPLEX_UNIT_PX, mButtonSize);
     mPlayButton.setText(R.string.play);
@@ -256,12 +268,18 @@ public class RubikStatePlay extends RubikStateAbstract implements AdapterView.On
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
-  private void setupMenuButton(final RubikActivity act, final float scale)
+  private void setupMenuButton(final RubikActivity act, final float width)
     {
-    int padding = (int)(3*scale + 0.5f);
-    LinearLayout.LayoutParams objectParams = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT, LinearLayout.LayoutParams.MATCH_PARENT);
+    int padding = (int)(width*RubikActivity.PADDING);
+    int margin  = (int)(width*RubikActivity.MARGIN);
+    LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT, LinearLayout.LayoutParams.MATCH_PARENT);
+    params.topMargin    = margin;
+    params.bottomMargin = margin;
+    params.leftMargin   = margin;
+    params.rightMargin  = margin;
+
     mMenuButton = new ImageButton(act);
-    mMenuButton.setLayoutParams(objectParams);
+    mMenuButton.setLayoutParams(params);
     mMenuButton.setPadding(padding,0,padding,0);
     mMenuButton.setImageResource(R.drawable.menu);
 
@@ -283,13 +301,19 @@ public class RubikStatePlay extends RubikStateAbstract implements AdapterView.On
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
-  private void setupSolveButton(final RubikActivity act, final float scale, final float width)
+  private void setupSolveButton(final RubikActivity act, final float width)
     {
-    int padding = (int)(3*scale + 0.5f);
+    int padding  = (int)(width*RubikActivity.PADDING);
+    int margin   = (int)(width*RubikActivity.MARGIN);
     int widthBut = (int)(width/6);
-    LinearLayout.LayoutParams backParams = new LinearLayout.LayoutParams(widthBut, LinearLayout.LayoutParams.MATCH_PARENT);
+    LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(widthBut, LinearLayout.LayoutParams.MATCH_PARENT);
+    params.topMargin    = margin;
+    params.bottomMargin = margin;
+    params.leftMargin   = margin;
+    params.rightMargin  = margin;
+
     mSolveButton = new ImageButton(act);
-    mSolveButton.setLayoutParams(backParams);
+    mSolveButton.setLayoutParams(params);
     mSolveButton.setPadding(padding,0,padding,0);
     mSolveButton.setImageResource(R.drawable.cube_solve);
 
@@ -306,13 +330,19 @@ public class RubikStatePlay extends RubikStateAbstract implements AdapterView.On
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
-  private void setupPrevButton(final RubikActivity act, final float scale, final float width)
+  private void setupPrevButton(final RubikActivity act, final float width)
     {
-    int padding = (int)(3*scale + 0.5f);
+    int padding  = (int)(width*RubikActivity.PADDING);
+    int margin   = (int)(width*RubikActivity.MARGIN);
     int widthBut = (int)(width/6);
-    LinearLayout.LayoutParams backParams = new LinearLayout.LayoutParams(widthBut, LinearLayout.LayoutParams.MATCH_PARENT);
+    LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(widthBut, LinearLayout.LayoutParams.MATCH_PARENT);
+    params.topMargin    = margin;
+    params.bottomMargin = margin;
+    params.leftMargin   = margin;
+    params.rightMargin  = margin;
+
     mPrevButton = new ImageButton(act);
-    mPrevButton.setLayoutParams(backParams);
+    mPrevButton.setLayoutParams(params);
     mPrevButton.setPadding(padding,0,padding,0);
     mPrevButton.setImageResource(R.drawable.cube_back);
 
@@ -329,7 +359,7 @@ public class RubikStatePlay extends RubikStateAbstract implements AdapterView.On
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
-  private void setupObjectWindow(final RubikActivity act, final float scale)
+  private void setupObjectWindow(final RubikActivity act, final float width)
     {
     LayoutInflater layoutInflater = (LayoutInflater)act.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
     final View layout = layoutInflater.inflate(R.layout.popup_objects, null);
@@ -338,7 +368,7 @@ public class RubikStatePlay extends RubikStateAbstract implements AdapterView.On
     mObjectPopup = new PopupWindow(act);
     mObjectPopup.setContentView(layout);
     mObjectPopup.setFocusable(true);
-    int margin = (int)(5*scale + 0.5f);
+    int margin = (int)(width*RubikActivity.PADDING);
 
     BitmapDrawable bd = (BitmapDrawable) act.getResources().getDrawable(R.drawable.cube2);
     int cubeWidth  = bd.getIntrinsicWidth();
@@ -388,7 +418,7 @@ public class RubikStatePlay extends RubikStateAbstract implements AdapterView.On
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
-  private void setupMenuWindow(final RubikActivity act, final float scale, final float width)
+  private void setupMenuWindow(final RubikActivity act, final float width)
     {
     LayoutInflater layoutInflater = (LayoutInflater)act.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
     final View layout = layoutInflater.inflate(R.layout.popup_objects, null);
@@ -397,17 +427,19 @@ public class RubikStatePlay extends RubikStateAbstract implements AdapterView.On
     mMenuPopup = new PopupWindow(act);
     mMenuPopup.setContentView(layout);
     mMenuPopup.setFocusable(true);
-    int margin = (int)(3*scale + 0.5f);
-    int padding= (int)(7*scale + 0.5f);
+    int margin  = (int)(width*RubikActivity.MARGIN);
+    int padding = (int)(width*RubikActivity.PADDING);
 
-    LinearLayout.LayoutParams p = new LinearLayout.LayoutParams( (int)width/2 - 2*padding, (int)mMenuItemSize);
-    p.setMargins(margin, margin/2, margin, margin/2);
+    LinearLayout.LayoutParams p0 = new LinearLayout.LayoutParams( (int)width/2 - 2*padding, (int)mMenuItemSize);
+    p0.setMargins(margin, 0, margin, margin);
+    LinearLayout.LayoutParams p1 = new LinearLayout.LayoutParams( (int)width/2 - 2*padding, (int)mMenuItemSize);
+    p1.setMargins(margin, margin, margin, margin);
 
     for(int i=0; i<NUM_BUTTONS; i++)
       {
       final int but = i;
       Button button = new Button(act);
-      button.setLayoutParams(p);
+      button.setLayoutParams(i==0 ? p1:p0);
       button.setText(BUTTON_LABELS[i]);
       button.setTextSize(TypedValue.COMPLEX_UNIT_PX, mMenuTextSize);
 
@@ -424,7 +456,7 @@ public class RubikStatePlay extends RubikStateAbstract implements AdapterView.On
       mMenuLayout.addView(button);
       }
 
-    mMenuLayoutHeight= (int)(NUM_BUTTONS*(mMenuItemSize+margin));
+    mMenuLayoutHeight= (int)(margin + NUM_BUTTONS*(mMenuItemSize+margin));
     }
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
diff --git a/src/main/java/org/distorted/states/RubikStateReady.java b/src/main/java/org/distorted/states/RubikStateReady.java
index 2b10a821..9de22b81 100644
--- a/src/main/java/org/distorted/states/RubikStateReady.java
+++ b/src/main/java/org/distorted/states/RubikStateReady.java
@@ -20,7 +20,6 @@
 package org.distorted.states;
 
 import android.content.SharedPreferences;
-import android.util.DisplayMetrics;
 import android.util.TypedValue;
 import android.view.LayoutInflater;
 import android.view.View;
@@ -54,8 +53,6 @@ public class RubikStateReady extends RubikStateAbstract
     float titleSize  = width*RubikActivity.TITLE_TEXT_SIZE;
 
     LayoutInflater inflater = act.getLayoutInflater();
-    DisplayMetrics metrics = act.getResources().getDisplayMetrics();
-    float scale = metrics.density;
 
     // TOP ////////////////////////////
     LinearLayout layoutTop = act.findViewById(R.id.upperBar);
@@ -69,14 +66,19 @@ public class RubikStateReady extends RubikStateAbstract
     LinearLayout layoutLeft = act.findViewById(R.id.mainBarLeft);
     layoutLeft.removeAllViews();
 
-    setupPrevMoveButtom(act,scale,width);
+    setupPrevMoveButtom(act,width);
     layoutLeft.addView(mPrevButton);
 
     LinearLayout layoutRight = act.findViewById(R.id.mainBarRight);
     layoutRight.removeAllViews();
 
-    int padding = (int)(5*scale + 0.5f);
+    int padding = (int)(width*RubikActivity.PADDING);
+    int margin  = (int)(width*RubikActivity.MARGIN);
     LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT,LinearLayout.LayoutParams.MATCH_PARENT);
+    params.topMargin    = margin;
+    params.bottomMargin = margin;
+    params.leftMargin   = margin;
+    params.rightMargin  = margin;
 
     Button back = new Button(act);
     back.setLayoutParams(params);
@@ -98,9 +100,9 @@ public class RubikStateReady extends RubikStateAbstract
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
-  private void setupPrevMoveButtom(final RubikActivity act, float scale, float width)
+  private void setupPrevMoveButtom(final RubikActivity act, float width)
     {
-    int padding = (int)( 3*scale + 0.5f);
+    int padding = (int)(width*RubikActivity.PADDING);
     int widthBut= (int)(width/6);
 
     LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(widthBut,LinearLayout.LayoutParams.MATCH_PARENT);
diff --git a/src/main/java/org/distorted/states/RubikStateSolution.java b/src/main/java/org/distorted/states/RubikStateSolution.java
index c96c3dfd..e10ecf27 100644
--- a/src/main/java/org/distorted/states/RubikStateSolution.java
+++ b/src/main/java/org/distorted/states/RubikStateSolution.java
@@ -20,7 +20,6 @@
 package org.distorted.states;
 
 import android.content.SharedPreferences;
-import android.util.DisplayMetrics;
 import android.util.TypedValue;
 import android.view.Gravity;
 import android.view.LayoutInflater;
@@ -66,8 +65,6 @@ public class RubikStateSolution extends RubikStateAbstract implements RubikPreRe
     mButtonSize = width*RubikActivity.BUTTON_TEXT_SIZE;
     mTitleSize  = width*RubikActivity.TITLE_TEXT_SIZE;
 
-    DisplayMetrics metrics = act.getResources().getDisplayMetrics();
-    final float scale = metrics.density;
     LayoutInflater inflater = act.getLayoutInflater();
 
     // TOP ////////////////////////////
@@ -80,9 +77,9 @@ public class RubikStateSolution extends RubikStateAbstract implements RubikPreRe
     layoutTop.addView(text);
 
     // BOT ////////////////////////////
-    setupPrevButton(act,scale);
-    setupNextButton(act,scale);
-    setupTextView(act,scale);
+    setupPrevButton(act,width);
+    setupNextButton(act,width);
+    setupTextView(act,width);
 
     LinearLayout layoutLeft = act.findViewById(R.id.mainBarLeft);
     layoutLeft.removeAllViews();
@@ -90,7 +87,7 @@ public class RubikStateSolution extends RubikStateAbstract implements RubikPreRe
     layoutLeft.addView(mMovesText);
     layoutLeft.addView(mNextButton);
 
-    setupBackButton(act,scale);
+    setupBackButton(act,width);
 
     LinearLayout layoutRight = act.findViewById(R.id.mainBarRight);
     layoutRight.removeAllViews();
@@ -99,10 +96,16 @@ public class RubikStateSolution extends RubikStateAbstract implements RubikPreRe
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
-  private void setupPrevButton(final RubikActivity act, final float scale)
+  private void setupPrevButton(final RubikActivity act, final float width)
     {
-    int padding = (int)(3*scale + 0.5f);
+    int padding = (int)(width*RubikActivity.PADDING);
+    int margin  = (int)(width*RubikActivity.MARGIN);
     LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(0,LinearLayout.LayoutParams.MATCH_PARENT,1.0f);
+    params.topMargin    = margin;
+    params.bottomMargin = margin;
+    params.leftMargin   = margin;
+    params.rightMargin  = margin;
+
     mPrevButton = new ImageButton(act);
     mPrevButton.setLayoutParams(params);
     mPrevButton.setPadding(padding,0,padding,0);
@@ -122,10 +125,16 @@ public class RubikStateSolution extends RubikStateAbstract implements RubikPreRe
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
-  private void setupNextButton(final RubikActivity act, final float scale)
+  private void setupNextButton(final RubikActivity act, final float width)
     {
-    int padding = (int)( 3*scale + 0.5f);
+    int padding = (int)(width*RubikActivity.PADDING);
+    int margin  = (int)(width*RubikActivity.MARGIN);
     LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(0,LinearLayout.LayoutParams.MATCH_PARENT, 1.0f);
+    params.topMargin    = margin;
+    params.bottomMargin = margin;
+    params.leftMargin   = margin;
+    params.rightMargin  = margin;
+
     mNextButton = new ImageButton(act);
     mNextButton.setLayoutParams(params);
     mNextButton.setPadding(padding,0,padding,0);
@@ -145,10 +154,15 @@ public class RubikStateSolution extends RubikStateAbstract implements RubikPreRe
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
-  private void setupTextView(final RubikActivity act, final float scale)
+  private void setupTextView(final RubikActivity act, final float width)
     {
-    int padding = (int)( 3*scale + 0.5f);
+    int padding = (int)(width*RubikActivity.PADDING);
+    int margin  = (int)(width*RubikActivity.MARGIN);
     LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(0,LinearLayout.LayoutParams.MATCH_PARENT,2.0f);
+    params.topMargin    = margin;
+    params.bottomMargin = margin;
+    params.leftMargin   = margin;
+    params.rightMargin  = margin;
 
     mMovesText = new TextView(act);
     mMovesText.setTextSize(20);
@@ -161,12 +175,18 @@ public class RubikStateSolution extends RubikStateAbstract implements RubikPreRe
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
-  private void setupBackButton(final RubikActivity act, final float scale)
+  private void setupBackButton(final RubikActivity act, final float width)
     {
-    int padding = (int)(3*scale + 0.5f);
-    LinearLayout.LayoutParams backParams = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT,LinearLayout.LayoutParams.MATCH_PARENT);
+    int padding = (int)(width*RubikActivity.PADDING);
+    int margin  = (int)(width*RubikActivity.MARGIN);
+    LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT,LinearLayout.LayoutParams.MATCH_PARENT);
+    params.topMargin    = margin;
+    params.bottomMargin = margin;
+    params.leftMargin   = margin;
+    params.rightMargin  = margin;
+
     mBackButton = new Button(act);
-    mBackButton.setLayoutParams(backParams);
+    mBackButton.setLayoutParams(params);
     mBackButton.setPadding(padding,0,padding,0);
     mBackButton.setTextSize(TypedValue.COMPLEX_UNIT_PX, mButtonSize);
     mBackButton.setText(R.string.back);
diff --git a/src/main/java/org/distorted/states/RubikStateSolver.java b/src/main/java/org/distorted/states/RubikStateSolver.java
index 2f3272e5..e4a538ba 100644
--- a/src/main/java/org/distorted/states/RubikStateSolver.java
+++ b/src/main/java/org/distorted/states/RubikStateSolver.java
@@ -27,7 +27,6 @@ import android.graphics.PorterDuff;
 import android.graphics.drawable.Drawable;
 import android.os.Bundle;
 import androidx.core.content.ContextCompat;
-import android.util.DisplayMetrics;
 import android.util.TypedValue;
 import android.view.View;
 import android.widget.Button;
@@ -93,9 +92,6 @@ public class RubikStateSolver extends RubikStateAbstract
     mFaceColors = RubikObjectList.retFaceColors(mCurrentObject);
     mNumFaces   = mFaceColors!=null ? mFaceColors.length : 0;
 
-    DisplayMetrics metrics = act.getResources().getDisplayMetrics();
-    final float scale = metrics.density;
-
     // TOP ////////////////////////////
     LinearLayout layoutTop = act.findViewById(R.id.upperBar);
     layoutTop.removeAllViews();
@@ -103,20 +99,20 @@ public class RubikStateSolver extends RubikStateAbstract
     if( mNumFaces>0 )
       {
       setupBitmaps();
-      setupColorButtons(act,scale);
+      setupColorButtons(act,width);
       markButton(act);
       }
 
     for(ImageButton button: mColorButton) layoutTop.addView(button);
 
     // BOT ////////////////////////////
-    setupSolveButton(act,scale);
+    setupSolveButton(act,width);
 
     LinearLayout layoutLeft = act.findViewById(R.id.mainBarLeft);
     layoutLeft.removeAllViews();
     layoutLeft.addView(mSolveButton);
 
-    setupBackButton(act,scale);
+    setupBackButton(act,width);
 
     LinearLayout layoutRight = act.findViewById(R.id.mainBarRight);
     layoutRight.removeAllViews();
@@ -156,17 +152,23 @@ public class RubikStateSolver extends RubikStateAbstract
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
-  private void setupColorButtons(final RubikActivity act, final float scale)
+  private void setupColorButtons(final RubikActivity act, final float width)
     {
     mColorButton = new ImageButton[mNumFaces];
+    int padding = (int)(width*RubikActivity.PADDING);
+    int margin  = (int)(width*RubikActivity.MARGIN);
 
     for(int i=0; i<mNumFaces; i++)
       {
       final int ii = i;
-      int padding = (int)(3*scale + 0.5f);
-      LinearLayout.LayoutParams objectParams = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.WRAP_CONTENT,LinearLayout.LayoutParams.MATCH_PARENT, 1.0f);
+      LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.WRAP_CONTENT,LinearLayout.LayoutParams.MATCH_PARENT, 1.0f);
+      params.topMargin    = margin;
+      params.bottomMargin = margin;
+      params.leftMargin   = margin;
+      params.rightMargin  = margin;
+
       mColorButton[i] = new ImageButton(act);
-      mColorButton[i].setLayoutParams(objectParams);
+      mColorButton[i].setLayoutParams(params);
       mColorButton[i].setPadding(padding,0,padding,0);
       mColorButton[i].setImageBitmap(mBitmap[i]);
 
@@ -184,12 +186,18 @@ public class RubikStateSolver extends RubikStateAbstract
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
-  private void setupSolveButton(final RubikActivity act, final float scale)
+  private void setupSolveButton(final RubikActivity act, final float width)
     {
-    int padding = (int)(3*scale + 0.5f);
-    LinearLayout.LayoutParams backParams = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT,LinearLayout.LayoutParams.MATCH_PARENT);
+    int padding = (int)(width*RubikActivity.PADDING);
+    int margin   = (int)(width*RubikActivity.MARGIN);
+    LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT,LinearLayout.LayoutParams.MATCH_PARENT);
+    params.topMargin    = margin;
+    params.bottomMargin = margin;
+    params.leftMargin   = margin;
+    params.rightMargin  = margin;
+
     mSolveButton = new Button(act);
-    mSolveButton.setLayoutParams(backParams);
+    mSolveButton.setLayoutParams(params);
     mSolveButton.setPadding(padding,0,padding,0);
     mSolveButton.setTextSize(TypedValue.COMPLEX_UNIT_PX, mButtonSize);
     mSolveButton.setText(R.string.solve);
@@ -213,12 +221,18 @@ public class RubikStateSolver extends RubikStateAbstract
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
-  private void setupBackButton(final RubikActivity act, final float scale)
+  private void setupBackButton(final RubikActivity act, final float width)
     {
-    int padding = (int)(3*scale + 0.5f);
-    LinearLayout.LayoutParams backParams = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT,LinearLayout.LayoutParams.MATCH_PARENT);
+    int padding = (int)(width*RubikActivity.PADDING);
+    int margin  = (int)(width*RubikActivity.MARGIN);
+    LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT,LinearLayout.LayoutParams.MATCH_PARENT);
+    params.topMargin    = margin;
+    params.bottomMargin = margin;
+    params.leftMargin   = margin;
+    params.rightMargin  = margin;
+
     mBackButton = new Button(act);
-    mBackButton.setLayoutParams(backParams);
+    mBackButton.setLayoutParams(params);
     mBackButton.setPadding(padding,0,padding,0);
     mBackButton.setTextSize(TypedValue.COMPLEX_UNIT_PX, mButtonSize);
     mBackButton.setText(R.string.back);
diff --git a/src/main/java/org/distorted/states/RubikStateSolving.java b/src/main/java/org/distorted/states/RubikStateSolving.java
index 0e3e35ab..37e6c440 100644
--- a/src/main/java/org/distorted/states/RubikStateSolving.java
+++ b/src/main/java/org/distorted/states/RubikStateSolving.java
@@ -20,7 +20,6 @@
 package org.distorted.states;
 
 import android.content.SharedPreferences;
-import android.util.DisplayMetrics;
 import android.util.TypedValue;
 import android.view.LayoutInflater;
 import android.view.View;
@@ -98,8 +97,6 @@ public class RubikStateSolving extends RubikStateAbstract implements RubikPreRen
     else               mMoves.clear();
 
     LayoutInflater inflater = act.getLayoutInflater();
-    DisplayMetrics metrics = act.getResources().getDisplayMetrics();
-    float scale = metrics.density;
 
     // TOP ////////////////////////////
     LinearLayout layoutTop = act.findViewById(R.id.upperBar);
@@ -114,14 +111,19 @@ public class RubikStateSolving extends RubikStateAbstract implements RubikPreRen
     LinearLayout layoutLeft = act.findViewById(R.id.mainBarLeft);
     layoutLeft.removeAllViews();
 
-    setupPrevMoveButtom(act,scale,width);
+    setupPrevMoveButtom(act,width);
     layoutLeft.addView(mPrevButton);
 
     LinearLayout layoutRight = act.findViewById(R.id.mainBarRight);
     layoutRight.removeAllViews();
 
-    int padding = (int)(5*scale + 0.5f);
+    int padding = (int)(width*RubikActivity.PADDING);
+    int margin  = (int)(width*RubikActivity.MARGIN);
     LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT,LinearLayout.LayoutParams.MATCH_PARENT);
+    params.topMargin    = margin;
+    params.bottomMargin = margin;
+    params.leftMargin   = margin;
+    params.rightMargin  = margin;
 
     Button back = new Button(act);
     back.setLayoutParams(params);
@@ -143,12 +145,18 @@ public class RubikStateSolving extends RubikStateAbstract implements RubikPreRen
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
-  private void setupPrevMoveButtom(final RubikActivity act, float scale, float width)
+  private void setupPrevMoveButtom(final RubikActivity act, float width)
     {
-    int padding = (int)( 3*scale + 0.5f);
+    int padding = (int)(width*RubikActivity.PADDING);
+    int margin  = (int)(width*RubikActivity.MARGIN);
     int widthBut= (int)(width/6);
 
     LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(widthBut,LinearLayout.LayoutParams.MATCH_PARENT);
+    params.topMargin    = margin;
+    params.bottomMargin = margin;
+    params.leftMargin   = margin;
+    params.rightMargin  = margin;
+
     mPrevButton = new ImageButton(act);
     mPrevButton.setLayoutParams(params);
     mPrevButton.setPadding(padding,0,padding,0);
