commit f3563327c12a44f87871c370c0f5390cb991dac1
Author: Leszek Koltunski <leszek@koltunski.pl>
Date:   Sun Apr 3 19:20:44 2022 +0200

    Bandaged 3x3: solve and scramble buttons.

diff --git a/src/main/java/org/distorted/bandaged/BandagedPlayActivity.java b/src/main/java/org/distorted/bandaged/BandagedPlayActivity.java
index 120f76f7..cc740e99 100644
--- a/src/main/java/org/distorted/bandaged/BandagedPlayActivity.java
+++ b/src/main/java/org/distorted/bandaged/BandagedPlayActivity.java
@@ -22,6 +22,7 @@ package org.distorted.bandaged;
 import android.os.Build;
 import android.os.Bundle;
 import android.util.DisplayMetrics;
+import android.view.DisplayCutout;
 import android.view.View;
 import android.view.ViewGroup;
 import android.view.WindowManager;
@@ -46,10 +47,10 @@ public class BandagedPlayActivity extends AppCompatActivity
 {
     private static final int ACTIVITY_NUMBER = 4;
     private static final float RATIO_BAR  = 0.10f;
+    private static final float RATIO_INSET= 0.09f;
 
     public static final float DIALOG_BUTTON_SIZE  = 0.06f;
     public static final float MENU_BIG_TEXT_SIZE  = 0.05f;
-    public static final float BUTTON_TEXT_SIZE    = 0.05f;
 
     public static final int FLAGS =  View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION
                                    | View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
@@ -62,7 +63,7 @@ public class BandagedPlayActivity extends AppCompatActivity
     private int mCurrentApiVersion;
     private BandagedPlayScreen mScreen;
     private String mObjectName;
-    private int mHeightBar;
+    private int mHeightLowerBar, mHeightUpperBar;
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
@@ -96,13 +97,20 @@ public class BandagedPlayActivity extends AppCompatActivity
 
     private void computeBarHeights()
       {
-      int barHeight = (int)(mScreenHeight*RATIO_BAR);
-      mHeightBar = barHeight;
-
-      LinearLayout layout = findViewById(R.id.lowerBar);
-      ViewGroup.LayoutParams params = layout.getLayoutParams();
-      params.height = barHeight;
-      layout.setLayoutParams(params);
+      float height = mScreenHeight;
+      int barHeight = (int)(height*RATIO_BAR);
+      mHeightLowerBar = barHeight;
+      mHeightUpperBar = barHeight;
+
+      LinearLayout layoutTop = findViewById(R.id.upperBar);
+      LinearLayout layoutBot = findViewById(R.id.lowerBar);
+
+      ViewGroup.LayoutParams paramsTop = layoutTop.getLayoutParams();
+      paramsTop.height = mHeightUpperBar;
+      layoutTop.setLayoutParams(paramsTop);
+      ViewGroup.LayoutParams paramsBot = layoutBot.getLayoutParams();
+      paramsBot.height = mHeightLowerBar;
+      layoutBot.setLayoutParams(paramsBot);
       }
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
@@ -131,6 +139,26 @@ public class BandagedPlayActivity extends AppCompatActivity
         }
       }
 
+///////////////////////////////////////////////////////////////////////////////////////////////////
+
+    @Override
+    public void onAttachedToWindow()
+      {
+      super.onAttachedToWindow();
+
+      if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P)
+        {
+        DisplayCutout cutout = getWindow().getDecorView().getRootWindowInsets().getDisplayCutout();
+        int insetHeight = cutout!=null ? cutout.getSafeInsetTop() : 0;
+
+        LinearLayout layoutHid = findViewById(R.id.hiddenBar);
+        ViewGroup.LayoutParams paramsHid = layoutHid.getLayoutParams();
+        paramsHid.height = (int)(insetHeight*RATIO_INSET);
+        layoutHid.setLayoutParams(paramsHid);
+        mHeightUpperBar += paramsHid.height;
+        }
+      }
+
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 // do not avoid cutouts
 
@@ -177,7 +205,7 @@ public class BandagedPlayActivity extends AppCompatActivity
       view.onResume();
 
       if( mScreen==null ) mScreen = new BandagedPlayScreen();
-      mScreen.onAttachedToWindow(this,mObjectName);
+      mScreen.onAttachedToWindow(this);
 
       if( mObjectName.length()>0 )
         {
@@ -240,7 +268,7 @@ public class BandagedPlayActivity extends AppCompatActivity
 
     public int getHeightBar()
       {
-      return mHeightBar;
+      return mHeightLowerBar;
       }
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
diff --git a/src/main/java/org/distorted/bandaged/BandagedPlayScreen.java b/src/main/java/org/distorted/bandaged/BandagedPlayScreen.java
index 737e48c4..3bee8bf7 100644
--- a/src/main/java/org/distorted/bandaged/BandagedPlayScreen.java
+++ b/src/main/java/org/distorted/bandaged/BandagedPlayScreen.java
@@ -34,12 +34,11 @@ import org.distorted.objectlib.main.ObjectControl;
 
 public class BandagedPlayScreen
 {
+  private static final int NUM_SCRAMBLES = 24;
+
   private TransparentImageButton mBackButton, mScrambleButton, mSolveButton;
   private final LockController mLockController;
   protected MovesController mMovesController;
-  private String mObjectName;
-  private int mBarHeight;
-  private float mButtonSize;
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
@@ -71,13 +70,46 @@ public class BandagedPlayScreen
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
-  void onAttachedToWindow(final BandagedPlayActivity act, final String objectName)
+  private void setupSolveButton(final BandagedPlayActivity act)
     {
-    int width = act.getScreenWidthInPixels();
-    mBarHeight = act.getHeightBar();
-    mButtonSize = width*BandagedPlayActivity.BUTTON_TEXT_SIZE;
+    int icon = BandagedPlayActivity.getDrawable(R.drawable.ui_small_cube_solve,R.drawable.ui_medium_cube_solve, R.drawable.ui_big_cube_solve, R.drawable.ui_huge_cube_solve);
+    LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT,LinearLayout.LayoutParams.MATCH_PARENT,1.0f);
+    mSolveButton = new TransparentImageButton(act, icon, TransparentImageButton.GRAVITY_MIDDLE,params);
+
+    mSolveButton.setOnClickListener( new View.OnClickListener()
+      {
+      @Override
+      public void onClick(View v)
+        {
+        act.getControl().solveObject();
+        mMovesController.clearMoves(act);
+        }
+      });
+    }
+
+///////////////////////////////////////////////////////////////////////////////////////////////////
 
-    mObjectName = objectName;
+  private void setupScrambleButton(final BandagedPlayActivity act)
+    {
+    int icon = BandagedPlayActivity.getDrawable(R.drawable.ui_small_cube_scramble,R.drawable.ui_medium_cube_scramble, R.drawable.ui_big_cube_scramble, R.drawable.ui_huge_cube_scramble);
+    LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT,LinearLayout.LayoutParams.MATCH_PARENT,1.0f);
+    mScrambleButton = new TransparentImageButton(act, icon, TransparentImageButton.GRAVITY_MIDDLE, params);
+
+    mScrambleButton.setOnClickListener( new View.OnClickListener()
+      {
+      @Override
+      public void onClick(View v)
+        {
+        act.getControl().scrambleObject(NUM_SCRAMBLES);
+        }
+      });
+    }
+
+///////////////////////////////////////////////////////////////////////////////////////////////////
+
+  void onAttachedToWindow(final BandagedPlayActivity act)
+    {
+    int width = act.getScreenWidthInPixels();
 
     LinearLayout.LayoutParams paramsL = new LinearLayout.LayoutParams(width/4, LinearLayout.LayoutParams.MATCH_PARENT);
     LinearLayout.LayoutParams paramsM = new LinearLayout.LayoutParams(width/2, LinearLayout.LayoutParams.MATCH_PARENT);
@@ -99,11 +131,30 @@ public class BandagedPlayScreen
 
     layoutRight.addView(mBackButton);
 
-    LinearLayout layout = act.findViewById(R.id.lowerBar);
-    layout.removeAllViews();
-    layout.addView(layoutLeft);
-    layout.addView(layoutMid);
-    layout.addView(layoutRight);
+    LinearLayout layoutLower = act.findViewById(R.id.lowerBar);
+    layoutLower.removeAllViews();
+    layoutLower.addView(layoutLeft);
+    layoutLower.addView(layoutMid);
+    layoutLower.addView(layoutRight);
+
+    setupScrambleButton(act);
+    setupSolveButton(act);
+
+    LinearLayout layoutUpper = act.findViewById(R.id.upperBar);
+
+    LinearLayout layoutLeftU = new LinearLayout(act);
+    layoutLeftU.setLayoutParams(paramsL);
+    LinearLayout layoutMidU  = new LinearLayout(act);
+    layoutMidU.setLayoutParams(paramsM);
+    LinearLayout layoutRightU= new LinearLayout(act);
+    layoutRightU.setLayoutParams(paramsR);
+
+    layoutLeftU.addView(mSolveButton);
+    layoutRightU.addView(mScrambleButton);
+
+    layoutUpper.addView(layoutLeftU);
+    layoutUpper.addView(layoutMidU);
+    layoutUpper.addView(layoutRightU);
     }
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
