commit f6a9c5381acc9c59a2c60966d2e17e48798ced04
Author: Leszek Koltunski <leszek@koltunski.pl>
Date:   Sat Jul 4 22:41:19 2020 +0100

    Introduce three sizes of UI images: small, medium, large.

diff --git a/src/main/java/org/distorted/main/RubikActivity.java b/src/main/java/org/distorted/main/RubikActivity.java
index 01590efe..7cfb59e9 100644
--- a/src/main/java/org/distorted/main/RubikActivity.java
+++ b/src/main/java/org/distorted/main/RubikActivity.java
@@ -45,6 +45,7 @@ public class RubikActivity extends AppCompatActivity
 {
     public static final float PADDING          = 0.01f;
     public static final float MARGIN           = 0.004f;
+    public static final float LARGE_MARGIN     = 0.025f;
     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;
@@ -56,7 +57,7 @@ public class RubikActivity extends AppCompatActivity
 
     private boolean mJustStarted;
     private FirebaseAnalytics mFirebaseAnalytics;
-    private int mScreenWidth, mScreenHeight;
+    private static int mScreenWidth, mScreenHeight;
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
@@ -298,6 +299,39 @@ public class RubikActivity extends AppCompatActivity
       pre.setupObject(object,size,moves);
       }
 
+///////////////////////////////////////////////////////////////////////////////////////////////////
+
+    public static int getDrawableSize()
+      {
+      if( mScreenHeight<1000 )
+        {
+        //android.util.Log.e("view", "returning small, mScrH="+mScreenHeight);
+        return 0;
+        }
+      if( mScreenHeight<1600 )
+        {
+        //android.util.Log.e("view", "returning medium, mScrH="+mScreenHeight);
+        return 1;
+        }
+
+      //android.util.Log.e("view", "returning big, mScrH="+mScreenHeight);
+      return 2;
+      }
+
+///////////////////////////////////////////////////////////////////////////////////////////////////
+
+    public static int getDrawable(int small, int medium, int big)
+      {
+      int size = getDrawableSize();
+
+      switch(size)
+        {
+        case 0 : return small;
+        case 1 : return medium;
+        default: return big;
+        }
+      }
+
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
     public boolean isVertical()
diff --git a/src/main/java/org/distorted/objects/RubikObjectList.java b/src/main/java/org/distorted/objects/RubikObjectList.java
index f6344474..31dc1f5f 100644
--- a/src/main/java/org/distorted/objects/RubikObjectList.java
+++ b/src/main/java/org/distorted/objects/RubikObjectList.java
@@ -26,6 +26,7 @@ import org.distorted.library.main.DistortedTexture;
 import org.distorted.library.mesh.MeshRectangles;
 import org.distorted.library.type.Static4D;
 import org.distorted.main.R;
+import org.distorted.main.RubikActivity;
 
 import java.lang.reflect.Field;
 
@@ -35,10 +36,10 @@ public enum RubikObjectList
   {
   CUBE (
          new int[][] {
-                       {2 , 12, R.drawable.ui_small_cube2, R.raw.cube2} ,
-                       {3 , 16, R.drawable.ui_small_cube3, R.raw.cube3} ,
-                       {4 , 20, R.drawable.ui_small_cube4, R.raw.cube4} ,
-                       {5 , 24, R.drawable.ui_small_cube5, R.raw.cube5}
+                       {2 , 12, R.raw.cube2, R.drawable.ui_small_cube2, R.drawable.ui_medium_cube2, R.drawable.ui_big_cube2} ,
+                       {3 , 16, R.raw.cube3, R.drawable.ui_small_cube3, R.drawable.ui_medium_cube3, R.drawable.ui_big_cube3} ,
+                       {4 , 20, R.raw.cube4, R.drawable.ui_small_cube4, R.drawable.ui_medium_cube4, R.drawable.ui_big_cube4} ,
+                       {5 , 24, R.raw.cube5, R.drawable.ui_small_cube5, R.drawable.ui_medium_cube5, R.drawable.ui_big_cube5}
                      },
          RubikCube.class,
          new RubikCubeMovement()
@@ -46,9 +47,9 @@ public enum RubikObjectList
 
   PYRA (
          new int[][] {
-                       {3 , 10, R.drawable.ui_small_pyra3, R.raw.pyra3} ,
-                       {4 , 15, R.drawable.ui_small_pyra4, R.raw.pyra4} ,
-                       {5 , 20, R.drawable.ui_small_pyra5, R.raw.pyra5}
+                       {3 , 10, R.raw.pyra3, R.drawable.ui_small_pyra3, R.drawable.ui_medium_pyra3, R.drawable.ui_big_pyra3} ,
+                       {4 , 15, R.raw.pyra4, R.drawable.ui_small_pyra4, R.drawable.ui_medium_pyra4, R.drawable.ui_big_pyra4} ,
+                       {5 , 20, R.raw.pyra5, R.drawable.ui_small_pyra5, R.drawable.ui_medium_pyra5, R.drawable.ui_big_pyra5}
                      },
          RubikPyraminx.class,
          new RubikPyraminxMovement()
@@ -60,7 +61,7 @@ public enum RubikObjectList
   public static final int MAX_LEVEL;
   public static final int MAX_OBJECT_SIZE;
 
-  private final int[] mObjectSizes, mMaxLevels, mIconIDs, mResourceIDs;
+  private final int[] mObjectSizes, mMaxLevels, mSmallIconIDs, mMediumIconIDs, mBigIconIDs, mResourceIDs;
   private final Class<? extends RubikObject> mObjectClass;
   private final RubikObjectMovement mObjectMovementClass;
   private static final RubikObjectList[] objects;
@@ -275,17 +276,21 @@ public enum RubikObjectList
     {
     int length = info.length;
 
-    mObjectSizes= new int[length];
-    mMaxLevels  = new int[length];
-    mIconIDs    = new int[length];
-    mResourceIDs= new int[length];
+    mObjectSizes  = new int[length];
+    mMaxLevels    = new int[length];
+    mResourceIDs  = new int[length];
+    mSmallIconIDs = new int[length];
+    mMediumIconIDs= new int[length];
+    mBigIconIDs   = new int[length];
 
     for(int i=0; i<length; i++)
       {
-      mObjectSizes[i] = info[i][0];
-      mMaxLevels[i]   = info[i][1];
-      mIconIDs[i]     = info[i][2];
-      mResourceIDs[i] = info[i][3];
+      mObjectSizes[i]  = info[i][0];
+      mMaxLevels[i]    = info[i][1];
+      mResourceIDs[i]  = info[i][2];
+      mSmallIconIDs[i] = info[i][3];
+      mMediumIconIDs[i]= info[i][4];
+      mBigIconIDs[i]   = info[i][5];
       }
 
     mObjectClass         = object;
@@ -310,7 +315,14 @@ public enum RubikObjectList
 
   public int[] getIconIDs()
     {
-    return mIconIDs;
+    int size = RubikActivity.getDrawableSize();
+
+    switch(size)
+      {
+      case 0 : return mSmallIconIDs;
+      case 1 : return mMediumIconIDs;
+      default: return mBigIconIDs;
+      }
     }
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
diff --git a/src/main/java/org/distorted/states/RubikStatePattern.java b/src/main/java/org/distorted/states/RubikStatePattern.java
index c344f78f..3fdf2dbc 100644
--- a/src/main/java/org/distorted/states/RubikStatePattern.java
+++ b/src/main/java/org/distorted/states/RubikStatePattern.java
@@ -203,6 +203,7 @@ public class RubikStatePattern extends RubikStateAbstract
     {
     int padding = (int)(width*RubikActivity.PADDING);
     int margin  = (int)(width*RubikActivity.MARGIN);
+    int icon = RubikActivity.getDrawable(R.drawable.ui_small_left,R.drawable.ui_medium_left, R.drawable.ui_big_left);
 
     LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(0,LinearLayout.LayoutParams.MATCH_PARENT,1.0f);
     params.topMargin    = margin;
@@ -213,7 +214,7 @@ public class RubikStatePattern extends RubikStateAbstract
     mPrevButton = new ImageButton(act);
     mPrevButton.setLayoutParams(params);
     mPrevButton.setPadding(padding,0,padding,0);
-    mPrevButton.setImageResource(R.drawable.ui_small_left);
+    mPrevButton.setImageResource(icon);
 
     mPrevButton.setOnClickListener( new View.OnClickListener()
       {
@@ -235,6 +236,7 @@ public class RubikStatePattern extends RubikStateAbstract
     {
     int padding = (int)(width*RubikActivity.PADDING);
     int margin  = (int)(width*RubikActivity.MARGIN);
+    int icon = RubikActivity.getDrawable(R.drawable.ui_small_right,R.drawable.ui_medium_right, R.drawable.ui_big_right);
 
     LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(0,LinearLayout.LayoutParams.MATCH_PARENT, 1.0f);
     params.topMargin    = margin;
@@ -245,7 +247,7 @@ public class RubikStatePattern extends RubikStateAbstract
     mNextButton = new ImageButton(act);
     mNextButton.setLayoutParams(params);
     mNextButton.setPadding(padding,0,padding,0);
-    mNextButton.setImageResource(R.drawable.ui_small_right);
+    mNextButton.setImageResource(icon);
 
     mNextButton.setOnClickListener( new View.OnClickListener()
       {
diff --git a/src/main/java/org/distorted/states/RubikStatePlay.java b/src/main/java/org/distorted/states/RubikStatePlay.java
index bc7ceca4..097e06c8 100644
--- a/src/main/java/org/distorted/states/RubikStatePlay.java
+++ b/src/main/java/org/distorted/states/RubikStatePlay.java
@@ -102,8 +102,6 @@ public class RubikStatePlay extends RubikStateAbstract implements AdapterView.On
 
   void enterState(final RubikActivity act)
     {
-    DisplayMetrics metrics = act.getResources().getDisplayMetrics();
-
     float width = act.getScreenWidthInPixels();
     mMenuTextSize = width*RubikActivity.MENU_MEDIUM_TEXT_SIZE;
     mButtonSize   = width*RubikActivity.BUTTON_TEXT_SIZE;
@@ -153,6 +151,7 @@ public class RubikStatePlay extends RubikStateAbstract implements AdapterView.On
     {
     int padding = (int)(width*RubikActivity.PADDING);
     int margin  = (int)(width*RubikActivity.MARGIN);
+    int icon = RubikActivity.getDrawable(R.drawable.ui_small_cube_menu,R.drawable.ui_medium_cube_menu, R.drawable.ui_big_cube_menu);
 
     LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT,LinearLayout.LayoutParams.MATCH_PARENT, 1.2f);
     params.topMargin    = margin;
@@ -163,7 +162,7 @@ public class RubikStatePlay extends RubikStateAbstract implements AdapterView.On
     mObjButton = new ImageButton(act);
     mObjButton.setLayoutParams(params);
     mObjButton.setPadding(padding,0,padding,0);
-    mObjButton.setImageResource(R.drawable.ui_small_cube_menu);
+    mObjButton.setImageResource(icon);
 
     mObjButton.setOnClickListener( new View.OnClickListener()
       {
@@ -197,6 +196,8 @@ public class RubikStatePlay extends RubikStateAbstract implements AdapterView.On
     {
     int padding = (int)(width*RubikActivity.PADDING);
     int margin  = (int)(width*RubikActivity.MARGIN);
+    int spin = RubikActivity.getDrawable(R.drawable.ui_small_spinner,R.drawable.ui_big_spinner, R.drawable.ui_big_spinner);
+
     LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT,LinearLayout.LayoutParams.MATCH_PARENT, 1.0f);
     params.topMargin    = margin;
     params.bottomMargin = margin;
@@ -206,7 +207,7 @@ public class RubikStatePlay extends RubikStateAbstract implements AdapterView.On
     mLevelSpinner = new AppCompatSpinner(act);
     mLevelSpinner.setLayoutParams(params);
     mLevelSpinner.setPadding(padding,0,padding,0);
-    mLevelSpinner.setBackgroundResource(R.drawable.ui_small_spinner);
+    mLevelSpinner.setBackgroundResource(spin);
     mLevelSpinner.setTextAlignment(View.TEXT_ALIGNMENT_CENTER);
 
     mLevelSpinner.setOnItemSelectedListener(this);
@@ -272,6 +273,8 @@ public class RubikStatePlay extends RubikStateAbstract implements AdapterView.On
     {
     int padding = (int)(width*RubikActivity.PADDING);
     int margin  = (int)(width*RubikActivity.MARGIN);
+    int icon = RubikActivity.getDrawable(R.drawable.ui_small_menu,R.drawable.ui_medium_menu, R.drawable.ui_big_menu);
+
     LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT, LinearLayout.LayoutParams.MATCH_PARENT);
     params.topMargin    = margin;
     params.bottomMargin = margin;
@@ -281,7 +284,7 @@ public class RubikStatePlay extends RubikStateAbstract implements AdapterView.On
     mMenuButton = new ImageButton(act);
     mMenuButton.setLayoutParams(params);
     mMenuButton.setPadding(padding,0,padding,0);
-    mMenuButton.setImageResource(R.drawable.ui_small_menu);
+    mMenuButton.setImageResource(icon);
 
     final int barHeight = act.getScreenHeightInPixels()/10;
 
@@ -306,6 +309,8 @@ public class RubikStatePlay extends RubikStateAbstract implements AdapterView.On
     int padding  = (int)(width*RubikActivity.PADDING);
     int margin   = (int)(width*RubikActivity.MARGIN);
     int widthBut = (int)(width/6);
+    int icon = RubikActivity.getDrawable(R.drawable.ui_small_cube_solve,R.drawable.ui_medium_cube_solve, R.drawable.ui_big_cube_solve);
+
     LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(widthBut, LinearLayout.LayoutParams.MATCH_PARENT);
     params.topMargin    = margin;
     params.bottomMargin = margin;
@@ -315,7 +320,7 @@ public class RubikStatePlay extends RubikStateAbstract implements AdapterView.On
     mSolveButton = new ImageButton(act);
     mSolveButton.setLayoutParams(params);
     mSolveButton.setPadding(padding,0,padding,0);
-    mSolveButton.setImageResource(R.drawable.ui_small_cube_solve);
+    mSolveButton.setImageResource(icon);
 
     mSolveButton.setOnClickListener( new View.OnClickListener()
       {
@@ -335,6 +340,8 @@ public class RubikStatePlay extends RubikStateAbstract implements AdapterView.On
     int padding  = (int)(width*RubikActivity.PADDING);
     int margin   = (int)(width*RubikActivity.MARGIN);
     int widthBut = (int)(width/6);
+    int icon = RubikActivity.getDrawable(R.drawable.ui_small_cube_back,R.drawable.ui_medium_cube_back, R.drawable.ui_big_cube_back);
+
     LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(widthBut, LinearLayout.LayoutParams.MATCH_PARENT);
     params.topMargin    = margin;
     params.bottomMargin = margin;
@@ -344,7 +351,7 @@ public class RubikStatePlay extends RubikStateAbstract implements AdapterView.On
     mPrevButton = new ImageButton(act);
     mPrevButton.setLayoutParams(params);
     mPrevButton.setPadding(padding,0,padding,0);
-    mPrevButton.setImageResource(R.drawable.ui_small_cube_back);
+    mPrevButton.setImageResource(icon);
 
     mPrevButton.setOnClickListener( new View.OnClickListener()
       {
@@ -368,12 +375,16 @@ public class RubikStatePlay extends RubikStateAbstract implements AdapterView.On
     mObjectPopup = new PopupWindow(act);
     mObjectPopup.setContentView(layout);
     mObjectPopup.setFocusable(true);
-    int margin = (int)(width*RubikActivity.PADDING);
+    int margin = (int)(width*RubikActivity.LARGE_MARGIN);
+    int icon = RubikActivity.getDrawable(R.drawable.ui_small_cube2,R.drawable.ui_medium_cube2, R.drawable.ui_big_cube2);
 
-    BitmapDrawable bd = (BitmapDrawable) act.getResources().getDrawable(R.drawable.ui_small_cube2);
+    BitmapDrawable bd = (BitmapDrawable) act.getResources().getDrawable(icon);
     int cubeWidth  = bd.getIntrinsicWidth();
     mObjectLayoutWidth = (int)(cubeWidth + 2*margin + 0.5f);
 
+    LinearLayout.LayoutParams p = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.WRAP_CONTENT,LinearLayout.LayoutParams.WRAP_CONTENT);
+    p.setMargins(margin, margin, margin, margin);
+
     for(int object=0; object<RubikObjectList.NUM_OBJECTS; object++)
       {
       final RubikObjectList list = RubikObjectList.getObject(object);
@@ -386,9 +397,6 @@ public class RubikStatePlay extends RubikStateAbstract implements AdapterView.On
         {
         final int size = i;
 
-        LinearLayout.LayoutParams p = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.WRAP_CONTENT,LinearLayout.LayoutParams.WRAP_CONTENT);
-        p.setMargins(margin, margin, margin, margin);
-
         ImageButton button = new ImageButton(act);
         button.setLayoutParams(p);
 
diff --git a/src/main/java/org/distorted/states/RubikStateReady.java b/src/main/java/org/distorted/states/RubikStateReady.java
index 734c36b2..a6b79f7b 100644
--- a/src/main/java/org/distorted/states/RubikStateReady.java
+++ b/src/main/java/org/distorted/states/RubikStateReady.java
@@ -104,12 +104,13 @@ public class RubikStateReady extends RubikStateAbstract
     {
     int padding = (int)(width*RubikActivity.PADDING);
     int widthBut= (int)(width/6);
+    int icon = RubikActivity.getDrawable(R.drawable.ui_small_cube_back,R.drawable.ui_medium_cube_back, R.drawable.ui_big_cube_back);
 
     LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(widthBut,LinearLayout.LayoutParams.MATCH_PARENT);
     mPrevButton = new ImageButton(act);
     mPrevButton.setLayoutParams(params);
     mPrevButton.setPadding(padding,0,padding,0);
-    mPrevButton.setImageResource(R.drawable.ui_small_cube_back);
+    mPrevButton.setImageResource(icon);
 
     mPrevButton.setOnClickListener( new View.OnClickListener()
       {
diff --git a/src/main/java/org/distorted/states/RubikStateSolution.java b/src/main/java/org/distorted/states/RubikStateSolution.java
index 89e2cfaa..b5145fc1 100644
--- a/src/main/java/org/distorted/states/RubikStateSolution.java
+++ b/src/main/java/org/distorted/states/RubikStateSolution.java
@@ -100,6 +100,8 @@ public class RubikStateSolution extends RubikStateAbstract implements RubikPreRe
     {
     int padding = (int)(width*RubikActivity.PADDING);
     int margin  = (int)(width*RubikActivity.MARGIN);
+    int icon = RubikActivity.getDrawable(R.drawable.ui_small_left,R.drawable.ui_medium_left, R.drawable.ui_big_left);
+
     LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(0,LinearLayout.LayoutParams.MATCH_PARENT,1.0f);
     params.topMargin    = margin;
     params.bottomMargin = margin;
@@ -109,7 +111,7 @@ public class RubikStateSolution extends RubikStateAbstract implements RubikPreRe
     mPrevButton = new ImageButton(act);
     mPrevButton.setLayoutParams(params);
     mPrevButton.setPadding(padding,0,padding,0);
-    mPrevButton.setImageResource(R.drawable.ui_small_left);
+    mPrevButton.setImageResource(icon);
 
     mPrevButton.setOnClickListener( new View.OnClickListener()
       {
@@ -129,6 +131,8 @@ public class RubikStateSolution extends RubikStateAbstract implements RubikPreRe
     {
     int padding = (int)(width*RubikActivity.PADDING);
     int margin  = (int)(width*RubikActivity.MARGIN);
+    int icon = RubikActivity.getDrawable(R.drawable.ui_small_right,R.drawable.ui_medium_right, R.drawable.ui_big_right);
+
     LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(0,LinearLayout.LayoutParams.MATCH_PARENT, 1.0f);
     params.topMargin    = margin;
     params.bottomMargin = margin;
@@ -138,7 +142,7 @@ public class RubikStateSolution extends RubikStateAbstract implements RubikPreRe
     mNextButton = new ImageButton(act);
     mNextButton.setLayoutParams(params);
     mNextButton.setPadding(padding,0,padding,0);
-    mNextButton.setImageResource(R.drawable.ui_small_right);
+    mNextButton.setImageResource(icon);
 
     mNextButton.setOnClickListener( new View.OnClickListener()
       {
diff --git a/src/main/java/org/distorted/states/RubikStateSolving.java b/src/main/java/org/distorted/states/RubikStateSolving.java
index b07558c2..5de1dcdb 100644
--- a/src/main/java/org/distorted/states/RubikStateSolving.java
+++ b/src/main/java/org/distorted/states/RubikStateSolving.java
@@ -150,6 +150,7 @@ public class RubikStateSolving extends RubikStateAbstract implements RubikPreRen
     int padding = (int)(width*RubikActivity.PADDING);
     int margin  = (int)(width*RubikActivity.MARGIN);
     int widthBut= (int)(width/6);
+    int icon = RubikActivity.getDrawable(R.drawable.ui_small_cube_back,R.drawable.ui_medium_cube_back, R.drawable.ui_big_cube_back);
 
     LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(widthBut,LinearLayout.LayoutParams.MATCH_PARENT);
     params.topMargin    = margin;
@@ -160,7 +161,7 @@ public class RubikStateSolving extends RubikStateAbstract implements RubikPreRen
     mPrevButton = new ImageButton(act);
     mPrevButton.setLayoutParams(params);
     mPrevButton.setPadding(padding,0,padding,0);
-    mPrevButton.setImageResource(R.drawable.ui_small_cube_back);
+    mPrevButton.setImageResource(icon);
 
     mPrevButton.setOnClickListener( new View.OnClickListener()
       {
