commit e3c74c0fa924d8eb9e43c4a7ed9d71a4fb877311
Author: Leszek Koltunski <leszek@koltunski.pl>
Date:   Sat Jun 20 20:38:06 2020 +0100

    Improvements to the UI - make it proportional regardless of the physical screen size. (Part 1)

diff --git a/src/main/java/org/distorted/main/RubikActivity.java b/src/main/java/org/distorted/main/RubikActivity.java
index 8351ea6d..01ad9a1e 100644
--- a/src/main/java/org/distorted/main/RubikActivity.java
+++ b/src/main/java/org/distorted/main/RubikActivity.java
@@ -23,6 +23,8 @@ import android.content.SharedPreferences;
 import android.os.Bundle;
 import android.preference.PreferenceManager;
 import androidx.appcompat.app.AppCompatActivity;
+
+import android.util.DisplayMetrics;
 import android.view.View;
 
 import com.google.firebase.analytics.FirebaseAnalytics;
@@ -30,7 +32,6 @@ import com.google.firebase.analytics.FirebaseAnalytics;
 import org.distorted.dialogs.RubikDialogAbout;
 import org.distorted.dialogs.RubikDialogError;
 import org.distorted.dialogs.RubikDialogScores;
-import org.distorted.dialogs.RubikDialogEffects;
 import org.distorted.effects.BaseEffect;
 import org.distorted.library.main.DistortedLibrary;
 
@@ -45,8 +46,12 @@ import org.distorted.states.RubikStatePlay;
 
 public class RubikActivity extends AppCompatActivity
 {
+    public static final float BUTTON_TEXT_SIZE = 0.05f;
+    public static final float TITLE_TEXT_SIZE = 0.05f;
+
     private boolean mJustStarted;
     private FirebaseAnalytics mFirebaseAnalytics;
+    private float mScreenWidth;
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
@@ -59,6 +64,12 @@ public class RubikActivity extends AppCompatActivity
 
       mJustStarted = true;
       mFirebaseAnalytics = FirebaseAnalytics.getInstance(this);
+
+      DisplayMetrics displaymetrics = new DisplayMetrics();
+      getWindowManager().getDefaultDisplay().getMetrics(displaymetrics);
+      mScreenWidth=displaymetrics.widthPixels;
+
+      android.util.Log.e("act", "screenWidth="+mScreenWidth);
       }
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
@@ -207,6 +218,13 @@ public class RubikActivity extends AppCompatActivity
       return pre.getObject();
       }
 
+///////////////////////////////////////////////////////////////////////////////////////////////////
+
+    public float getScreenWidthInPixels()
+      {
+      return mScreenWidth;
+      }
+
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
     public RubikPreRender getPreRender()
diff --git a/src/main/java/org/distorted/states/RubikStateDone.java b/src/main/java/org/distorted/states/RubikStateDone.java
index c47205fd..bdbf59b5 100644
--- a/src/main/java/org/distorted/states/RubikStateDone.java
+++ b/src/main/java/org/distorted/states/RubikStateDone.java
@@ -21,6 +21,7 @@ package org.distorted.states;
 
 import android.content.SharedPreferences;
 import android.util.DisplayMetrics;
+import android.util.TypedValue;
 import android.view.LayoutInflater;
 import android.view.View;
 import android.widget.Button;
@@ -43,6 +44,10 @@ public class RubikStateDone extends RubikStateAbstract
 
   void enterState(final RubikActivity act)
     {
+    float width = act.getScreenWidthInPixels();
+    float buttonSize = width*RubikActivity.BUTTON_TEXT_SIZE;
+    float titleSize = width*RubikActivity.TITLE_TEXT_SIZE;
+
     LayoutInflater inflater = act.getLayoutInflater();
     DisplayMetrics metrics = act.getResources().getDisplayMetrics();
     float scale = metrics.density;
@@ -51,6 +56,7 @@ public class RubikStateDone extends RubikStateAbstract
     LinearLayout layoutTop = act.findViewById(R.id.upperBar);
     layoutTop.removeAllViews();
     TextView label = (TextView)inflater.inflate(R.layout.upper_text, null);
+    label.setTextSize(TypedValue.COMPLEX_UNIT_PX, titleSize);
     label.setText(R.string.solved);
     layoutTop.addView(label);
 
@@ -67,6 +73,7 @@ public class RubikStateDone extends RubikStateAbstract
     Button back = new Button(act);
     back.setLayoutParams(params);
     back.setPadding(padding,0,padding,0);
+    back.setTextSize(TypedValue.COMPLEX_UNIT_PX, buttonSize);
     back.setText(R.string.back);
 
     back.setOnClickListener( new View.OnClickListener()
diff --git a/src/main/java/org/distorted/states/RubikStateMain.java b/src/main/java/org/distorted/states/RubikStateMain.java
index 0daf4065..04b94564 100644
--- a/src/main/java/org/distorted/states/RubikStateMain.java
+++ b/src/main/java/org/distorted/states/RubikStateMain.java
@@ -22,6 +22,7 @@ package org.distorted.states;
 import android.content.SharedPreferences;
 import androidx.fragment.app.FragmentManager;
 import android.util.DisplayMetrics;
+import android.util.TypedValue;
 import android.view.LayoutInflater;
 import android.view.View;
 import android.widget.Button;
@@ -76,6 +77,10 @@ public class RubikStateMain extends RubikStateAbstract
 
   void enterState(final RubikActivity act)
     {
+    float width = act.getScreenWidthInPixels();
+    float buttonSize = width*RubikActivity.BUTTON_TEXT_SIZE;
+    float titleSize = width*RubikActivity.TITLE_TEXT_SIZE;
+
     FragmentManager mana = act.getSupportFragmentManager();
     RubikDialogMain diag = (RubikDialogMain) mana.findFragmentByTag(RubikDialogMain.getDialogTag());
 
@@ -91,6 +96,8 @@ public class RubikStateMain extends RubikStateAbstract
     LinearLayout layoutTop = act.findViewById(R.id.upperBar);
     layoutTop.removeAllViews();
     final TextView text = (TextView)inflater.inflate(R.layout.upper_text, null);
+
+    text.setTextSize(TypedValue.COMPLEX_UNIT_PX, titleSize);
     text.setText(R.string.app_name);
     layoutTop.addView(text);
 
@@ -108,6 +115,7 @@ public class RubikStateMain extends RubikStateAbstract
     Button buttonR = new Button(act);
     buttonR.setLayoutParams(params);
     buttonR.setPadding(padding,0,padding,0);
+    buttonR.setTextSize(TypedValue.COMPLEX_UNIT_PX, buttonSize);
     buttonR.setText(R.string.exit);
 
     buttonR.setOnClickListener( new View.OnClickListener()
diff --git a/src/main/java/org/distorted/states/RubikStatePattern.java b/src/main/java/org/distorted/states/RubikStatePattern.java
index 8ed85ed8..614b7c74 100644
--- a/src/main/java/org/distorted/states/RubikStatePattern.java
+++ b/src/main/java/org/distorted/states/RubikStatePattern.java
@@ -23,6 +23,7 @@ import android.content.SharedPreferences;
 import android.os.Bundle;
 import androidx.fragment.app.FragmentManager;
 import android.util.DisplayMetrics;
+import android.util.TypedValue;
 import android.view.Gravity;
 import android.view.LayoutInflater;
 import android.view.View;
@@ -49,6 +50,7 @@ public class RubikStatePattern extends RubikStateAbstract
   private TextView mMovesText;
   private int mNumMoves;
   private int mPatternOrdinal, mCategory, mPattern;
+  private float mButtonSize, mTitleSize;
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
@@ -79,6 +81,10 @@ public class RubikStatePattern extends RubikStateAbstract
 
   void enterState(final RubikActivity act)
     {
+    float width = act.getScreenWidthInPixels();
+    mButtonSize = width*RubikActivity.BUTTON_TEXT_SIZE;
+    mTitleSize  = width*RubikActivity.TITLE_TEXT_SIZE;
+
     RubikStatePlay play = (RubikStatePlay)RubikState.PLAY.getStateClass();
     int obj  = play.getObject();
     int size = play.getSize();
@@ -101,6 +107,7 @@ public class RubikStatePattern extends RubikStateAbstract
     LinearLayout layoutTop = act.findViewById(R.id.upperBar);
     layoutTop.removeAllViews();
     mText = (TextView)inflater.inflate(R.layout.upper_pattern_text, null);
+    mText.setTextSize(TypedValue.COMPLEX_UNIT_PX, mTitleSize);
     mText.setText(R.string.patterns);
     layoutTop.addView(mText);
 
@@ -158,6 +165,7 @@ public class RubikStatePattern extends RubikStateAbstract
     mBackButton = new Button(act);
     mBackButton.setLayoutParams(backParams);
     mBackButton.setPadding(padding,0,padding,0);
+    mBackButton.setTextSize(TypedValue.COMPLEX_UNIT_PX, mButtonSize);
     mBackButton.setText(R.string.back);
 
     mBackButton.setOnClickListener( new View.OnClickListener()
@@ -245,6 +253,7 @@ public class RubikStatePattern extends RubikStateAbstract
     mMovesText.setLayoutParams(params);
     mMovesText.setPadding(padding,0,padding,0);
     mMovesText.setGravity(Gravity.CENTER);
+    mMovesText.setTextSize(TypedValue.COMPLEX_UNIT_PX, mButtonSize);
     mMovesText.setText(act.getString(R.string.mo_placeholder,0,0));
     }
 
diff --git a/src/main/java/org/distorted/states/RubikStatePlay.java b/src/main/java/org/distorted/states/RubikStatePlay.java
index 5cc3a675..769545f5 100644
--- a/src/main/java/org/distorted/states/RubikStatePlay.java
+++ b/src/main/java/org/distorted/states/RubikStatePlay.java
@@ -24,6 +24,7 @@ import android.content.SharedPreferences;
 import android.graphics.drawable.BitmapDrawable;
 import android.os.Build;
 import android.util.DisplayMetrics;
+import android.util.TypedValue;
 import android.view.Gravity;
 import android.view.LayoutInflater;
 import android.view.View;
@@ -33,6 +34,8 @@ import android.widget.Button;
 import android.widget.ImageButton;
 import android.widget.LinearLayout;
 import android.widget.PopupWindow;
+import android.widget.TextView;
+
 import androidx.appcompat.widget.AppCompatSpinner;
 
 import org.distorted.dialogs.RubikDialogEffects;
@@ -58,6 +61,7 @@ public class RubikStatePlay extends RubikStateAbstract implements AdapterView.On
   private AppCompatSpinner mLevelSpinner;
   private ArrayAdapter<String> mSpinnerAdapter;
   private int mLevelValue;
+  private float mButtonSize, mTitleSize;
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
@@ -73,6 +77,10 @@ public class RubikStatePlay extends RubikStateAbstract implements AdapterView.On
     DisplayMetrics metrics = act.getResources().getDisplayMetrics();
     final float scale = metrics.density;
 
+    float width = act.getScreenWidthInPixels();
+    mButtonSize = width*RubikActivity.BUTTON_TEXT_SIZE;
+    mTitleSize  = width*RubikActivity.TITLE_TEXT_SIZE;
+
     // TOP ////////////////////////////
     LinearLayout layoutTop = act.findViewById(R.id.upperBar);
     layoutTop.removeAllViews();
@@ -185,6 +193,7 @@ public class RubikStatePlay extends RubikStateAbstract implements AdapterView.On
     mPlayButton = new Button(act);
     mPlayButton.setLayoutParams(backParams);
     mPlayButton.setPadding(padding,0,padding,0);
+    mPlayButton.setTextSize(TypedValue.COMPLEX_UNIT_PX, mButtonSize);
     mPlayButton.setText(R.string.play);
 
     mPlayButton.setOnClickListener( new View.OnClickListener()
@@ -228,6 +237,8 @@ public class RubikStatePlay extends RubikStateAbstract implements AdapterView.On
     mSolveButton = new Button(act);
     mSolveButton.setLayoutParams(backParams);
     mSolveButton.setPadding(padding,0,padding,0);
+    mSolveButton.setTextSize(TypedValue.COMPLEX_UNIT_PX, mButtonSize);
+
     mSolveButton.setText(R.string.solve);
 
     mSolveButton.setOnClickListener( new View.OnClickListener()
@@ -249,6 +260,7 @@ public class RubikStatePlay extends RubikStateAbstract implements AdapterView.On
     mBackButton = new Button(act);
     mBackButton.setLayoutParams(backParams);
     mBackButton.setPadding(padding,0,padding,0);
+    mBackButton.setTextSize(TypedValue.COMPLEX_UNIT_PX, mButtonSize);
     mBackButton.setText(R.string.back);
 
     mBackButton.setOnClickListener( new View.OnClickListener()
@@ -415,6 +427,7 @@ public class RubikStatePlay extends RubikStateAbstract implements AdapterView.On
 
   public void onItemSelected(AdapterView<?> parent, View view, int pos, long id)
     {
+    ((TextView) parent.getChildAt(0)).setTextSize(TypedValue.COMPLEX_UNIT_PX, mButtonSize);
     mLevelValue = pos+1;
     }
 
diff --git a/src/main/java/org/distorted/states/RubikStateReady.java b/src/main/java/org/distorted/states/RubikStateReady.java
index a628fc94..579d13e6 100644
--- a/src/main/java/org/distorted/states/RubikStateReady.java
+++ b/src/main/java/org/distorted/states/RubikStateReady.java
@@ -21,6 +21,7 @@ package org.distorted.states;
 
 import android.content.SharedPreferences;
 import android.util.DisplayMetrics;
+import android.util.TypedValue;
 import android.view.LayoutInflater;
 import android.view.View;
 import android.widget.Button;
@@ -43,6 +44,10 @@ public class RubikStateReady extends RubikStateAbstract
 
   void enterState(final RubikActivity act)
     {
+    float width = act.getScreenWidthInPixels();
+    float buttonSize = width*RubikActivity.BUTTON_TEXT_SIZE;
+    float titleSize  = width*RubikActivity.TITLE_TEXT_SIZE;
+
     LayoutInflater inflater = act.getLayoutInflater();
     DisplayMetrics metrics = act.getResources().getDisplayMetrics();
     float scale = metrics.density;
@@ -51,6 +56,7 @@ public class RubikStateReady extends RubikStateAbstract
     LinearLayout layoutTop = act.findViewById(R.id.upperBar);
     layoutTop.removeAllViews();
     TextView label = (TextView)inflater.inflate(R.layout.upper_text, null);
+    label.setTextSize(TypedValue.COMPLEX_UNIT_PX, titleSize);
     label.setText(R.string.ready);
     layoutTop.addView(label);
 
@@ -67,6 +73,7 @@ public class RubikStateReady extends RubikStateAbstract
     Button back = new Button(act);
     back.setLayoutParams(params);
     back.setPadding(padding,0,padding,0);
+    back.setTextSize(TypedValue.COMPLEX_UNIT_PX, buttonSize);
     back.setText(R.string.back);
 
     back.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 df845f6a..c96c3dfd 100644
--- a/src/main/java/org/distorted/states/RubikStateSolution.java
+++ b/src/main/java/org/distorted/states/RubikStateSolution.java
@@ -21,6 +21,7 @@ package org.distorted.states;
 
 import android.content.SharedPreferences;
 import android.util.DisplayMetrics;
+import android.util.TypedValue;
 import android.view.Gravity;
 import android.view.LayoutInflater;
 import android.view.View;
@@ -47,6 +48,7 @@ public class RubikStateSolution extends RubikStateAbstract implements RubikPreRe
   private int[][] mMoves;
   private int mCurrMove, mNumMoves;
   private boolean mCanRotate;
+  private float mButtonSize, mTitleSize;
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
@@ -60,6 +62,10 @@ public class RubikStateSolution extends RubikStateAbstract implements RubikPreRe
 
   void enterState(final RubikActivity act)
     {
+    float width = act.getScreenWidthInPixels();
+    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();
@@ -69,6 +75,7 @@ public class RubikStateSolution extends RubikStateAbstract implements RubikPreRe
     layoutTop.removeAllViews();
 
     final TextView text = (TextView)inflater.inflate(R.layout.upper_text, null);
+    text.setTextSize(TypedValue.COMPLEX_UNIT_PX, mTitleSize);
     text.setText(R.string.solution);
     layoutTop.addView(text);
 
@@ -148,6 +155,7 @@ public class RubikStateSolution extends RubikStateAbstract implements RubikPreRe
     mMovesText.setLayoutParams(params);
     mMovesText.setPadding(padding,0,padding,0);
     mMovesText.setGravity(Gravity.CENTER);
+    mMovesText.setTextSize(TypedValue.COMPLEX_UNIT_PX, mButtonSize);
     mMovesText.setText(act.getString(R.string.mo_placeholder,mCurrMove,mNumMoves));
     }
 
@@ -160,6 +168,7 @@ public class RubikStateSolution extends RubikStateAbstract implements RubikPreRe
     mBackButton = new Button(act);
     mBackButton.setLayoutParams(backParams);
     mBackButton.setPadding(padding,0,padding,0);
+    mBackButton.setTextSize(TypedValue.COMPLEX_UNIT_PX, mButtonSize);
     mBackButton.setText(R.string.back);
 
     mBackButton.setOnClickListener( new View.OnClickListener()
diff --git a/src/main/java/org/distorted/states/RubikStateSolver.java b/src/main/java/org/distorted/states/RubikStateSolver.java
index 15f1a48c..2dbb8081 100644
--- a/src/main/java/org/distorted/states/RubikStateSolver.java
+++ b/src/main/java/org/distorted/states/RubikStateSolver.java
@@ -28,6 +28,7 @@ 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;
 import android.widget.ImageButton;
@@ -57,6 +58,7 @@ public class RubikStateSolver extends RubikStateAbstract
   private int mCurrentColor;
   private int[] mFaceColors;
   private int mNumFaces;
+  private float mTitleSize, mButtonSize;
 
   private RubikObjectList mCurrentObject;
   private int mCurrentObjectSize;
@@ -74,6 +76,10 @@ public class RubikStateSolver extends RubikStateAbstract
 
   void enterState(final RubikActivity act)
     {
+    float width = act.getScreenWidthInPixels();
+    mButtonSize = width*RubikActivity.BUTTON_TEXT_SIZE;
+    mTitleSize  = width*RubikActivity.TITLE_TEXT_SIZE;
+
     mWeakAct = new WeakReference<>(act);
 
     mSolving = false;
@@ -187,6 +193,7 @@ public class RubikStateSolver extends RubikStateAbstract
     mSolveButton = new Button(act);
     mSolveButton.setLayoutParams(backParams);
     mSolveButton.setPadding(padding,0,padding,0);
+    mSolveButton.setTextSize(TypedValue.COMPLEX_UNIT_PX, mButtonSize);
     mSolveButton.setText(R.string.solve);
 
     mSolveButton.setOnClickListener( new View.OnClickListener()
@@ -215,6 +222,7 @@ public class RubikStateSolver extends RubikStateAbstract
     mBackButton = new Button(act);
     mBackButton.setLayoutParams(backParams);
     mBackButton.setPadding(padding,0,padding,0);
+    mBackButton.setTextSize(TypedValue.COMPLEX_UNIT_PX, mButtonSize);
     mBackButton.setText(R.string.back);
 
     mBackButton.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 f57fcfad..37200154 100644
--- a/src/main/java/org/distorted/states/RubikStateSolving.java
+++ b/src/main/java/org/distorted/states/RubikStateSolving.java
@@ -21,6 +21,7 @@ package org.distorted.states;
 
 import android.content.SharedPreferences;
 import android.util.DisplayMetrics;
+import android.util.TypedValue;
 import android.view.LayoutInflater;
 import android.view.View;
 import android.widget.Button;
@@ -85,6 +86,10 @@ public class RubikStateSolving extends RubikStateAbstract implements RubikPreRen
 
   void enterState(final RubikActivity act)
     {
+    float width = act.getScreenWidthInPixels();
+    float buttonSize = width*RubikActivity.BUTTON_TEXT_SIZE;
+    float titleSize  = width*RubikActivity.TITLE_TEXT_SIZE;
+
     mCanPrevMove = true;
 
     startCounting(act);
@@ -101,6 +106,7 @@ public class RubikStateSolving extends RubikStateAbstract implements RubikPreRen
     layoutTop.removeAllViews();
     mTime = (TextView)inflater.inflate(R.layout.upper_text, null);
     int elapsed = (int)mElapsed/1000;
+    mTime.setTextSize(TypedValue.COMPLEX_UNIT_PX, titleSize);
     mTime.setText(act.getString(R.string.tm_placeholder,elapsed/60,elapsed%60));
     layoutTop.addView(mTime);
 
@@ -120,6 +126,7 @@ public class RubikStateSolving extends RubikStateAbstract implements RubikPreRen
     Button back = new Button(act);
     back.setLayoutParams(params);
     back.setPadding(padding,0,padding,0);
+    back.setTextSize(TypedValue.COMPLEX_UNIT_PX, buttonSize);
     back.setText(R.string.back);
 
     back.setOnClickListener( new View.OnClickListener()
diff --git a/src/main/res/layout/main.xml b/src/main/res/layout/main.xml
index 57573104..f35d36d4 100644
--- a/src/main/res/layout/main.xml
+++ b/src/main/res/layout/main.xml
@@ -7,7 +7,8 @@
     <LinearLayout
         android:id="@+id/upperBar"
         android:layout_width="fill_parent"
-        android:layout_height="60dp"
+        android:layout_height="0dp"
+        android:layout_weight="0.1"
         android:gravity="center"
         android:orientation="horizontal">
     </LinearLayout>
@@ -20,7 +21,8 @@
 
     <LinearLayout
         android:layout_width="match_parent"
-        android:layout_height="60dp"
+        android:layout_height="0dp"
+        android:layout_weight="0.1"
         android:orientation="horizontal">
 
         <LinearLayout
