commit 6e3fcb916c0fb6c0c52314afb132db54eb6cf28b
Author: Leszek Koltunski <leszek@koltunski.pl>
Date:   Thu Jan 6 22:39:22 2022 +0100

    Remove 3 out of 4 object icons.

diff --git a/src/main/java/org/distorted/config/ConfigScreen.java b/src/main/java/org/distorted/config/ConfigScreen.java
index 29529cf7..7c680ecc 100644
--- a/src/main/java/org/distorted/config/ConfigScreen.java
+++ b/src/main/java/org/distorted/config/ConfigScreen.java
@@ -19,8 +19,6 @@
 
 package org.distorted.config;
 
-import android.content.res.Resources;
-import android.graphics.drawable.BitmapDrawable;
 import android.os.Build;
 import android.util.TypedValue;
 import android.view.Gravity;
@@ -46,7 +44,7 @@ import static android.view.View.inflate;
 
 public class ConfigScreen
 {
-  private static final int NUM_COLUMNS = 4;
+  private static final int NUM_COLUMNS = 5;
   private static final int[] mLocation = new int[2];
 
   private TransparentImageButton mBackButton, mObjectButton, mPrevButton, mNextButton;
@@ -63,11 +61,7 @@ public class ConfigScreen
 
   private void setupObjectWindow(final ConfigActivity act, final float width, final float height)
     {
-    int icon = RubikActivity.getDrawable(R.drawable.cube_2s,R.drawable.cube_2m, R.drawable.cube_2b, R.drawable.cube_2h);
-
-    Resources res = act.getResources();
-    BitmapDrawable bd = (BitmapDrawable)res.getDrawable(icon);
-    int cubeWidth = bd.getIntrinsicWidth();
+    int cubeWidth = (int)(width/9);
     int margin = (int)(width*RubikActivity.LARGE_MARGIN);
     mObjectSize = (int)(cubeWidth + 2*margin + 0.5f);
     mMaxRowCount = (int)((height-mBarHeight)/mObjectSize);
@@ -103,8 +97,7 @@ public class ConfigScreen
       {
       final int ordinal = object;
       RubikObject rubikObject = RubikObjectList.getObject(ordinal);
-      int iconSize = RubikActivity.getDrawableSize();
-      int icons = rubikObject.getIconID(iconSize);
+      int icons = rubikObject.getIconID();
       int row = object/NUM_COLUMNS;
 
       ImageButton button = new ImageButton(act);
@@ -132,6 +125,9 @@ public class ConfigScreen
       params.leftMargin   = margin;
       params.rightMargin  = margin;
 
+      params.width = cubeWidth;
+      params.height= cubeWidth;
+
       nextInRow[row]++;
 
       objectGrid.addView(button, params);
@@ -183,7 +179,7 @@ public class ConfigScreen
           int rowCount = Math.min(mMaxRowCount,mRowCount);
           View popupView = mObjectPopup.getContentView();
           popupView.setSystemUiVisibility(RubikActivity.FLAGS);
-          displayPopup(act,view,mObjectPopup,mObjectSize*mColCount,mObjectSize*rowCount,margin,margin);
+          displayPopup(act,view,mObjectPopup,mObjectSize*mColCount,mObjectSize*rowCount+4*margin,margin,margin);
           }
         }
       });
diff --git a/src/main/java/org/distorted/dialogs/RubikDialogPattern.java b/src/main/java/org/distorted/dialogs/RubikDialogPattern.java
index 092063db..1c08afd9 100644
--- a/src/main/java/org/distorted/dialogs/RubikDialogPattern.java
+++ b/src/main/java/org/distorted/dialogs/RubikDialogPattern.java
@@ -33,6 +33,7 @@ import android.util.DisplayMetrics;
 import android.util.TypedValue;
 import android.view.LayoutInflater;
 import android.view.View;
+import android.view.ViewGroup;
 import android.view.Window;
 import android.view.WindowManager;
 import android.widget.Button;
@@ -64,8 +65,12 @@ public class RubikDialogPattern extends AppCompatDialogFragment
 
     DisplayMetrics displaymetrics = new DisplayMetrics();
     act.getWindowManager().getDefaultDisplay().getMetrics(displaymetrics);
-    final float titleSize= displaymetrics.widthPixels * RubikActivity.MENU_BIG_TEXT_SIZE;
-    final float okSize   = displaymetrics.widthPixels * RubikActivity.DIALOG_BUTTON_SIZE;
+
+    int scrWidth = displaymetrics.widthPixels;
+    final float titleSize= scrWidth*RubikActivity.MENU_BIG_TEXT_SIZE;
+    final float okSize   = scrWidth*RubikActivity.DIALOG_BUTTON_SIZE;
+    final int   tabHeight= (int)(scrWidth*RubikActivity.TAB_HEIGHT);
+    final int   tabWidth = (int)(scrWidth*RubikActivity.TAB_WIDTH);
 
     LayoutInflater layoutInflater = act.getLayoutInflater();
     TextView tv = (TextView) layoutInflater.inflate(R.layout.dialog_title, null);
@@ -92,15 +97,17 @@ public class RubikDialogPattern extends AppCompatDialogFragment
     tabLayout.setupWithViewPager(viewPager);
     viewPager.setCurrentItem(getPatternOrdinal());
 
+    ViewGroup.LayoutParams paramsView = new ViewGroup.LayoutParams( tabWidth,tabHeight );
+
     for(int i=0; i< RubikPatternList.NUM_OBJECTS; i++)
       {
-      int ordinal  = RubikPatternList.getObject(i);
+      int ordinal = RubikPatternList.getObject(i);
       RubikObject object = RubikObjectList.getObject(ordinal);
-      int iconSize= RubikActivity.getDrawableSize();
-      int iconID  = object==null ? 0 : object.getIconID(iconSize);
+      int iconID  = object==null ? 0 : object.getIconID();
 
       ImageView imageView = new ImageView(act);
       imageView.setImageResource(iconID);
+      imageView.setLayoutParams(paramsView);
       TabLayout.Tab tab = tabLayout.getTabAt(i);
       if(tab!=null) tab.setCustomView(imageView);
       }
diff --git a/src/main/java/org/distorted/dialogs/RubikDialogScores.java b/src/main/java/org/distorted/dialogs/RubikDialogScores.java
index bb2680b0..6f7d2c1a 100644
--- a/src/main/java/org/distorted/dialogs/RubikDialogScores.java
+++ b/src/main/java/org/distorted/dialogs/RubikDialogScores.java
@@ -33,6 +33,7 @@ import android.util.DisplayMetrics;
 import android.util.TypedValue;
 import android.view.LayoutInflater;
 import android.view.View;
+import android.view.ViewGroup;
 import android.view.Window;
 import android.widget.Button;
 import android.widget.ImageView;
@@ -60,8 +61,12 @@ public class RubikDialogScores extends AppCompatDialogFragment
 
     DisplayMetrics displaymetrics = new DisplayMetrics();
     act.getWindowManager().getDefaultDisplay().getMetrics(displaymetrics);
-    final float titleSize= displaymetrics.widthPixels * RubikActivity.MENU_BIG_TEXT_SIZE;
-    final float okSize   = displaymetrics.widthPixels * RubikActivity.DIALOG_BUTTON_SIZE;
+
+    int scrWidth = displaymetrics.widthPixels;
+    final float titleSize= scrWidth*RubikActivity.MENU_BIG_TEXT_SIZE;
+    final float okSize   = scrWidth*RubikActivity.DIALOG_BUTTON_SIZE;
+    final int   tabHeight= (int)(scrWidth*RubikActivity.TAB_HEIGHT);
+    final int   tabWidth = (int)(scrWidth*RubikActivity.TAB_WIDTH);
 
     LayoutInflater layoutInflater = act.getLayoutInflater();
     TextView tv = (TextView) layoutInflater.inflate(R.layout.dialog_title, null);
@@ -104,15 +109,16 @@ public class RubikDialogScores extends AppCompatDialogFragment
     tabLayout.setupWithViewPager(viewPager);
 
     viewPager.setCurrentItem(curTab);
-    int iconSize = RubikActivity.getDrawableSize();
     int numObjects = RubikObjectList.getNumObjects();
+    ViewGroup.LayoutParams paramsView = new ViewGroup.LayoutParams( tabWidth,tabHeight );
 
     for (int object=0; object<numObjects; object++)
       {
       RubikObject robject = RubikObjectList.getObject(object);
-      int iconID = robject==null ? 0 : robject.getIconID(iconSize);
+      int iconID = robject==null ? 0 : robject.getIconID();
       ImageView imageView = new ImageView(act);
       imageView.setImageResource(iconID);
+      imageView.setLayoutParams(paramsView);
       TabLayout.Tab tab = tabLayout.getTabAt(object);
       if(tab!=null) tab.setCustomView(imageView);
       }
diff --git a/src/main/java/org/distorted/dialogs/RubikDialogTutorial.java b/src/main/java/org/distorted/dialogs/RubikDialogTutorial.java
index eea5a3d0..1161eac3 100644
--- a/src/main/java/org/distorted/dialogs/RubikDialogTutorial.java
+++ b/src/main/java/org/distorted/dialogs/RubikDialogTutorial.java
@@ -27,6 +27,7 @@ import android.util.DisplayMetrics;
 import android.util.TypedValue;
 import android.view.LayoutInflater;
 import android.view.View;
+import android.view.ViewGroup;
 import android.view.Window;
 import android.view.WindowManager;
 import android.widget.Button;
@@ -44,8 +45,6 @@ import com.google.android.material.tabs.TabLayout;
 import org.distorted.main.R;
 import org.distorted.main.RubikActivity;
 import org.distorted.objects.RubikObjectList;
-import org.distorted.screens.RubikScreenPlay;
-import org.distorted.screens.ScreenList;
 import org.distorted.tutorials.TutorialList;
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
@@ -65,8 +64,11 @@ public class RubikDialogTutorial extends AppCompatDialogFragment
 
     DisplayMetrics displaymetrics = new DisplayMetrics();
     act.getWindowManager().getDefaultDisplay().getMetrics(displaymetrics);
-    final float titleSize= displaymetrics.widthPixels * RubikActivity.MENU_BIG_TEXT_SIZE;
-    final float okSize   = displaymetrics.widthPixels * RubikActivity.DIALOG_BUTTON_SIZE;
+    int scrWidth = displaymetrics.widthPixels;
+    final float titleSize= scrWidth*RubikActivity.MENU_BIG_TEXT_SIZE;
+    final float okSize   = scrWidth*RubikActivity.DIALOG_BUTTON_SIZE;
+    final int   tabHeight= (int)(scrWidth*RubikActivity.TAB_HEIGHT);
+    final int   tabWidth = (int)(scrWidth*RubikActivity.TAB_WIDTH);
 
     LayoutInflater layoutInflater = act.getLayoutInflater();
     TextView tv = (TextView) layoutInflater.inflate(R.layout.dialog_title, null);
@@ -93,11 +95,14 @@ public class RubikDialogTutorial extends AppCompatDialogFragment
     tabLayout.setupWithViewPager(viewPager);
     viewPager.setCurrentItem(getTutorialOrdinal());
 
+    ViewGroup.LayoutParams paramsView = new ViewGroup.LayoutParams( tabWidth,tabHeight );
+
     for(int i=0; i<TutorialList.NUM_OBJECTS; i++)
       {
       TutorialList list = TutorialList.getObject(i);
       int iconID        = list.getIconID();
       ImageView imageView = new ImageView(act);
+      imageView.setLayoutParams(paramsView);
       imageView.setImageResource(iconID);
       TabLayout.Tab tab = tabLayout.getTabAt(i);
       if(tab!=null) tab.setCustomView(imageView);
diff --git a/src/main/java/org/distorted/main/RubikActivity.java b/src/main/java/org/distorted/main/RubikActivity.java
index 8be28f14..de100515 100644
--- a/src/main/java/org/distorted/main/RubikActivity.java
+++ b/src/main/java/org/distorted/main/RubikActivity.java
@@ -84,6 +84,8 @@ public class RubikActivity extends AppCompatActivity
     public static final float MENU_BIG_TEXT_SIZE  = 0.05f;
     public static final float MENU_MED_TEXT_SIZE  = 0.04f;
     public static final float MENU_SMALL_TEXT_SIZE= 0.035f;
+    public static final float TAB_WIDTH           = 0.100f;
+    public static final float TAB_HEIGHT          = 0.100f;
 
     public static final int FLAGS =  View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION
                                    | View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
diff --git a/src/main/java/org/distorted/objects/RubikObject.java b/src/main/java/org/distorted/objects/RubikObject.java
index 7e4c908a..269d0046 100644
--- a/src/main/java/org/distorted/objects/RubikObject.java
+++ b/src/main/java/org/distorted/objects/RubikObject.java
@@ -30,13 +30,11 @@ import static org.distorted.objectlib.main.TwistyObject.MESH_NICE;
 
 public class RubikObject
 {
-  private static final int NUM = 4;
-
   private final String mName;
   private final int mNumScramble;
   private final int mOrdinal;
   private final int mJsonID, mMeshID;
-  private final int[] mIconID;
+  private final int mIconID;
   private final String[][] mPatterns;
 
   private int mMeshState;
@@ -45,9 +43,7 @@ public class RubikObject
 
   RubikObject(ObjectType type)
     {
-    mIconID = new int[NUM];
-    for(int i=0; i<NUM; i++) mIconID[i] = type.getIconID(i);
-
+    mIconID      = type.getIconID();
     mName        = type.name();
     mNumScramble = type.getNumScramble();
     mOrdinal     = type.ordinal();
@@ -84,9 +80,9 @@ public class RubikObject
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
-  public int getIconID(int size)
+  public int getIconID()
     {
-    return size>=0 && size<NUM ? mIconID[size] : 0;
+    return mIconID;
     }
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
diff --git a/src/main/java/org/distorted/screens/RubikScreenPlay.java b/src/main/java/org/distorted/screens/RubikScreenPlay.java
index b3771e0c..c711a115 100644
--- a/src/main/java/org/distorted/screens/RubikScreenPlay.java
+++ b/src/main/java/org/distorted/screens/RubikScreenPlay.java
@@ -55,7 +55,7 @@ import static android.view.View.inflate;
 
 public class RubikScreenPlay extends RubikScreenBase
   {
-  public static final int NUM_COLUMNS  = 4;
+  public static final int NUM_COLUMNS  = 5;
   public static final int LEVELS_SHOWN = 10;
 
   private static final int[] BUTTON_LABELS = { R.string.scores,
@@ -78,6 +78,7 @@ public class RubikScreenPlay extends RubikScreenBase
   private int mColCount, mRowCount, mMaxRowCount;
   private int mUpperBarHeight;
   private boolean mShouldReactToEndOfScrambling;
+  private int mBottomHeight;
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
@@ -124,6 +125,7 @@ public class RubikScreenPlay extends RubikScreenBase
   private void setupObjectButton(final RubikActivity act, final float width)
     {
     final int margin  = (int)(width*RubikActivity.MARGIN);
+    final int lMargin = (int)(width*RubikActivity.LARGE_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);
     LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT,LinearLayout.LayoutParams.MATCH_PARENT,1.0f);
     mObjButton = new TransparentImageButton(act, icon, TransparentImageButton.GRAVITY_MIDDLE, params);
@@ -145,7 +147,7 @@ public class RubikScreenPlay extends RubikScreenBase
           int rowCount = Math.min(mMaxRowCount,mRowCount);
           View popupView = mObjectPopup.getContentView();
           popupView.setSystemUiVisibility(RubikActivity.FLAGS);
-          displayPopup(act,view,mObjectPopup,mObjectSize*mColCount,mObjectSize*rowCount,margin,margin);
+          displayPopup(act,view,mObjectPopup,mObjectSize*mColCount,mObjectSize*rowCount+mBottomHeight+2*lMargin,margin,margin);
           }
         }
       });
@@ -222,11 +224,7 @@ public class RubikScreenPlay extends RubikScreenBase
 
   private void setupObjectWindow(final RubikActivity act, final float width, final float height)
     {
-    int icon = RubikActivity.getDrawable(R.drawable.cube_2s,R.drawable.cube_2m, R.drawable.cube_2b, R.drawable.cube_2h);
-
-    Resources res = act.getResources();
-    BitmapDrawable bd = (BitmapDrawable)res.getDrawable(icon);
-    int cubeWidth = bd.getIntrinsicWidth();
+    int cubeWidth = (int)(width/9);
     int margin = (int)(width*RubikActivity.LARGE_MARGIN);
     mObjectSize = (int)(cubeWidth + 2*margin + 0.5f);
     mMaxRowCount = (int)((height-1.8f*mUpperBarHeight)/mObjectSize);
@@ -241,7 +239,7 @@ public class RubikScreenPlay extends RubikScreenBase
     objectGrid.setRowCount(mRowCount);
 
     LinearLayout bottomLayout = view.findViewById(R.id.bottomLayout);
-    setupBottomLayout(act,bottomLayout,2*mObjectSize);
+    setupBottomLayout(act,bottomLayout,(NUM_COLUMNS-2)*mObjectSize);
 
     mObjectPopup = new PopupWindow(act);
     mObjectPopup.setFocusable(true);
@@ -264,8 +262,7 @@ public class RubikScreenPlay extends RubikScreenBase
     for(int object=0; object<numObjects; object++)
       {
       final RubikObject robject = RubikObjectList.getObject(object);
-      int iconSize = RubikActivity.getDrawableSize();
-      int icons = robject==null ? 0 : robject.getIconID(iconSize);
+      int icons = robject==null ? 0 : robject.getIconID();
       int row = object/NUM_COLUMNS;
       final int ordinal = robject==null ? 0 : robject.getOrdinal();
 
@@ -294,6 +291,9 @@ public class RubikScreenPlay extends RubikScreenBase
       params.leftMargin   = margin;
       params.rightMargin  = margin;
 
+      params.width = cubeWidth;
+      params.height= cubeWidth;
+
       nextInRow[row]++;
 
       objectGrid.addView(button, params);
@@ -317,6 +317,10 @@ public class RubikScreenPlay extends RubikScreenBase
 
     buttonNul.setWidth(width);
 
+    Resources res = act.getResources();
+    BitmapDrawable bd = (BitmapDrawable)res.getDrawable(iconD);
+    mBottomHeight = bd.getIntrinsicHeight();
+
     TypedValue outValue = new TypedValue();
     act.getTheme().resolveAttribute(android.R.attr.selectableItemBackgroundBorderless, outValue, true);
     buttonTut.setBackgroundResource(outValue.resourceId);
diff --git a/src/main/java/org/distorted/tutorials/TutorialList.java b/src/main/java/org/distorted/tutorials/TutorialList.java
index 81fc3cfe..bf5dd320 100644
--- a/src/main/java/org/distorted/tutorials/TutorialList.java
+++ b/src/main/java/org/distorted/tutorials/TutorialList.java
@@ -551,8 +551,7 @@ public enum TutorialList
   public int getIconID()
     {
     RubikObject object = RubikObjectList.getObject(mObject);
-    int iconSize = RubikActivity.getDrawableSize();
-    return object==null ? 0 : object.getIconID(iconSize);
+    return object==null ? 0 : object.getIconID();
     }
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
