commit 769d7b9f8ca883714d686b089d0110ef6903fbc6
Author: Leszek Koltunski <leszek@koltunski.pl>
Date:   Wed Mar 25 22:42:09 2020 +0000

    Bugfixes.

diff --git a/src/main/java/org/distorted/effect/scramble/ScrambleEffect.java b/src/main/java/org/distorted/effect/scramble/ScrambleEffect.java
index e2c13340..a7d3e2cd 100644
--- a/src/main/java/org/distorted/effect/scramble/ScrambleEffect.java
+++ b/src/main/java/org/distorted/effect/scramble/ScrambleEffect.java
@@ -97,9 +97,9 @@ public abstract class ScrambleEffect extends BaseEffect implements EffectListene
 // the time a single quarter-turn takes!
 //
 // Only works for
-// basicAngle==4, i.e. something whose rotations are by 90 degrees (RubikCube) or
+// basicAngle==4, i.e. something whose rotations are by  90 degrees (RubikCube) or
 // basicAngle==3, i.e. something whose rotations are by 120 degrees (a Pyramix) or
-// basicAngle==2, i.e. something whose rotations are by 180 degrees (is there something like that?)
+// basicAngle==2, i.e. something whose rotations are by 180 degrees (e.g. a 3x2x1 'Bunny')
 
   private void createBaseEffects(int duration, int numScrambles)
     {
@@ -124,7 +124,7 @@ public abstract class ScrambleEffect extends BaseEffect implements EffectListene
     }
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
-// only works if basicAngle<=4, i.e. wont work for something whose basic rotations are by no less
+// only works if basicAngle<=4, i.e. won't work for something whose basic rotations are by less
 // than 90 degrees.
 
   private void addNewScramble()
@@ -168,7 +168,7 @@ public abstract class ScrambleEffect extends BaseEffect implements EffectListene
     }
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
-// only works for basicAngle==4, i.e. RubikCube or basicAngle==3, i.e. a Pyramix.
+// only works for basicAngle<=4.
 
   private int randomizeAngle()
     {
diff --git a/src/main/java/org/distorted/effect/win/WinEffect.java b/src/main/java/org/distorted/effect/win/WinEffect.java
index 58d7e400..49cf3180 100644
--- a/src/main/java/org/distorted/effect/win/WinEffect.java
+++ b/src/main/java/org/distorted/effect/win/WinEffect.java
@@ -48,7 +48,7 @@ public abstract class WinEffect extends BaseEffect implements EffectListener
     }
 
   private static final int NUM_EFFECTS = Type.values().length;
-  private static final int FAKE_EFFECT_ID = -2;
+  private static final int FAKE_EFFECT_ID = -4;
   private static final Type[] types;
 
   static
diff --git a/src/main/java/org/distorted/magic/RubikActivity.java b/src/main/java/org/distorted/magic/RubikActivity.java
index ace9252f..94b75aef 100644
--- a/src/main/java/org/distorted/magic/RubikActivity.java
+++ b/src/main/java/org/distorted/magic/RubikActivity.java
@@ -118,35 +118,12 @@ public class RubikActivity extends AppCompatActivity implements View.OnClickList
     @Override
     public void onClick(View v)
       {
-      switch(v.getId())
+      if( v.getId() == RubikStateAbstract.BUTTON_ID_BACK )
         {
-        case RubikStateAbstract.BUTTON_ID_OBJECT: RubikStatePlay play = (RubikStatePlay)RubikState.PLAY.getStateClass();
-                                                  play.bringUpPopup(this,v);
-                                                  break;
-        case RubikStateAbstract.BUTTON_ID_BACK:   RubikState.goBack(this);
-                                                  break;
+        RubikState.goBack(this);
         }
       }
 
-///////////////////////////////////////////////////////////////////////////////////////////////////
-
-    public void changeObject(int object, int size)
-      {
-      RubikObjectList obj = RubikObjectList.getObject(object);
-      int objectSize = obj.getSizes()[size];
-
-      RubikSurfaceView view = findViewById(R.id.rubikSurfaceView);
-      view.getRenderer().createObject(obj,objectSize);
-      }
-
-///////////////////////////////////////////////////////////////////////////////////////////////////
-
-    public boolean isVertical()
-      {
-      RubikSurfaceView view = findViewById(R.id.rubikSurfaceView);
-      return view.isVertical();
-      }
-
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
     private void savePreferences()
@@ -195,6 +172,25 @@ public class RubikActivity extends AppCompatActivity implements View.OnClickList
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 // PUBLIC API
+///////////////////////////////////////////////////////////////////////////////////////////////////
+
+    public void changeObject(int object, int size)
+      {
+      RubikObjectList obj = RubikObjectList.getObject(object);
+      int objectSize = obj.getSizes()[size];
+
+      RubikSurfaceView view = findViewById(R.id.rubikSurfaceView);
+      view.getRenderer().createObject(obj,objectSize);
+      }
+
+///////////////////////////////////////////////////////////////////////////////////////////////////
+
+    public boolean isVertical()
+      {
+      RubikSurfaceView view = findViewById(R.id.rubikSurfaceView);
+      return view.isVertical();
+      }
+
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
     public void Play(View v)
diff --git a/src/main/java/org/distorted/scores/RubikScores.java b/src/main/java/org/distorted/scores/RubikScores.java
index 5141a59e..a4789fe0 100644
--- a/src/main/java/org/distorted/scores/RubikScores.java
+++ b/src/main/java/org/distorted/scores/RubikScores.java
@@ -296,7 +296,6 @@ public class RubikScores
     }
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
-// TODO
 
   public void setName(String newName)
     {
diff --git a/src/main/java/org/distorted/uistate/RubikStatePlay.java b/src/main/java/org/distorted/uistate/RubikStatePlay.java
index c46d247b..ff5900b6 100644
--- a/src/main/java/org/distorted/uistate/RubikStatePlay.java
+++ b/src/main/java/org/distorted/uistate/RubikStatePlay.java
@@ -79,32 +79,15 @@ public class RubikStatePlay extends RubikStateAbstract
     // BOT ////////////////////////////
     DisplayMetrics metrics = act.getResources().getDisplayMetrics();
     final float scale = metrics.density;
-    int padding = (int)(3*scale + 0.5f);
 
-    if( mObjButton==null )
-      {
-      LinearLayout.LayoutParams objectParams = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.WRAP_CONTENT,LinearLayout.LayoutParams.MATCH_PARENT);
-      mObjButton = new ImageButton(act);
-      mObjButton.setLayoutParams(objectParams);
-      mObjButton.setId(BUTTON_ID_OBJECT);
-      mObjButton.setPadding(padding,0,padding,0);
-      mObjButton.setImageResource(R.drawable.cube_menu);
-      mObjButton.setOnClickListener(act);
-      }
+    if( mObjButton==null ) setupObjectButton(act,scale);
+
     LinearLayout layoutLeft = act.findViewById(R.id.mainBarLeft);
     layoutLeft.removeAllViews();
     layoutLeft.addView(mObjButton);
 
-    if( mBackButton==null )
-      {
-      LinearLayout.LayoutParams backParams = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT,LinearLayout.LayoutParams.MATCH_PARENT);
-      mBackButton = new Button(act);
-      mBackButton.setLayoutParams(backParams);
-      mBackButton.setId(BUTTON_ID_BACK);
-      mBackButton.setPadding(padding,0,padding,0);
-      mBackButton.setText(R.string.back);
-      mBackButton.setOnClickListener(act);
-      }
+    if( mBackButton==null ) setupBackButton(act,scale);
+
     LinearLayout layoutRight = act.findViewById(R.id.mainBarRight);
     layoutRight.removeAllViews();
     layoutRight.addView(mBackButton);
@@ -114,75 +97,108 @@ public class RubikStatePlay extends RubikStateAbstract
     mPicker.setMax(MAX_SCRAMBLE);
     mPicker.setValue(mPickerValue);
 
-    if( mPopup==null )
-      {
-      LayoutInflater layoutInflater = (LayoutInflater)act.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
-      final View layout = layoutInflater.inflate(R.layout.popup_objects, null);
-      mLayout = layout.findViewById(R.id.popup);
-
-      mPopup = new PopupWindow(act);
-      mPopup.setContentView(layout);
-      mPopup.setFocusable(true);
-      int margin = (int)(5*scale + 0.5f);
-
-      BitmapDrawable bd = (BitmapDrawable) act.getResources().getDrawable(R.drawable.cube2);
-      int cubeWidth  = bd.getIntrinsicWidth();
-      int cubeHeight = bd.getIntrinsicHeight();
+    if( mPopup==null ) setupPopupWindow(act, scale);
+    }
 
-      mLayoutWidth = (int)(cubeWidth + 2*margin + 0.5f);
-      mLayoutHeight= (int)(cubeHeight+ 2*margin + 0.5f);
+///////////////////////////////////////////////////////////////////////////////////////////////////
 
-      for(int object=0; object<RubikObjectList.NUM_OBJECTS; object++)
+  private void setupObjectButton(final RubikActivity act, final float scale)
+    {
+    int padding = (int)(3*scale + 0.5f);
+    LinearLayout.LayoutParams objectParams = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.WRAP_CONTENT,LinearLayout.LayoutParams.MATCH_PARENT);
+    mObjButton = new ImageButton(act);
+    mObjButton.setLayoutParams(objectParams);
+    mObjButton.setId(BUTTON_ID_OBJECT);
+    mObjButton.setPadding(padding,0,padding,0);
+    mObjButton.setImageResource(R.drawable.cube_menu);
+
+    mObjButton.setOnClickListener( new View.OnClickListener()
+      {
+      @Override
+      public void onClick(View view)
         {
-        RubikObjectList list = RubikObjectList.getObject(object);
-        int[] sizes = list.getSizes();
-        int[] icons = list.getIconIDs();
-        int len = sizes.length;
-        final int obj = object;
+        int total = RubikObjectList.getTotal();
+        boolean vertical = act.isVertical();
+        mLayout.setOrientation(vertical ? LinearLayout.VERTICAL:LinearLayout.HORIZONTAL);
 
-        for(int i=0; i<len; i++)
-          {
-          final int size = i;
+        int height = view.getHeight();
+        int width  = view.getWidth();
+        int laywid = mLayoutWidth * (vertical? 1:total);
+        int layhei = mLayoutHeight* (vertical? total:1);
 
-          LinearLayout.LayoutParams p = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.WRAP_CONTENT,LinearLayout.LayoutParams.WRAP_CONTENT);
-          p.setMargins(margin, margin, margin, margin);
+        mPopup.showAsDropDown(view, (width-laywid)/2, -height-layhei, Gravity.LEFT);
+        }
+      });
+    }
 
-          ImageButton button = new ImageButton(act);
-          button.setLayoutParams(p);
+///////////////////////////////////////////////////////////////////////////////////////////////////
 
-          button.setBackgroundResource(icons[i]);
-          button.setOnClickListener( new View.OnClickListener()
-            {
-            @Override
-            public void onClick(View v)
-              {
-              mObject = obj;
-              mSize   = size;
-              act.changeObject(obj,size);
-              mPopup.dismiss();
-              }
-            });
-
-          mLayout.addView(button);
-          }
-        }
-      }
+  private void setupBackButton(final RubikActivity act, final float scale)
+    {
+    int padding = (int)(3*scale + 0.5f);
+    LinearLayout.LayoutParams backParams = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT,LinearLayout.LayoutParams.MATCH_PARENT);
+    mBackButton = new Button(act);
+    mBackButton.setLayoutParams(backParams);
+    mBackButton.setId(BUTTON_ID_BACK);
+    mBackButton.setPadding(padding,0,padding,0);
+    mBackButton.setText(R.string.back);
+    mBackButton.setOnClickListener(act);
     }
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
-  public void bringUpPopup(RubikActivity act, View view)
+  private void setupPopupWindow(final RubikActivity act, final float scale)
     {
-    int total = RubikObjectList.getTotal();
-    boolean vertical = act.isVertical();
-    mLayout.setOrientation(vertical ? LinearLayout.VERTICAL:LinearLayout.HORIZONTAL);
+    LayoutInflater layoutInflater = (LayoutInflater)act.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
+    final View layout = layoutInflater.inflate(R.layout.popup_objects, null);
+    mLayout = layout.findViewById(R.id.popup);
+
+    mPopup = new PopupWindow(act);
+    mPopup.setContentView(layout);
+    mPopup.setFocusable(true);
+    int margin = (int)(5*scale + 0.5f);
+
+    BitmapDrawable bd = (BitmapDrawable) act.getResources().getDrawable(R.drawable.cube2);
+    int cubeWidth  = bd.getIntrinsicWidth();
+    int cubeHeight = bd.getIntrinsicHeight();
+
+    mLayoutWidth = (int)(cubeWidth + 2*margin + 0.5f);
+    mLayoutHeight= (int)(cubeHeight+ 2*margin + 0.5f);
 
-    int height = view.getHeight();
-    int width  = view.getWidth();
-    int laywid = mLayoutWidth * (vertical? 1:total);
-    int layhei = mLayoutHeight* (vertical? total:1);
+    for(int object=0; object<RubikObjectList.NUM_OBJECTS; object++)
+      {
+      RubikObjectList list = RubikObjectList.getObject(object);
+      int[] sizes = list.getSizes();
+      int[] icons = list.getIconIDs();
+      int len = sizes.length;
+      final int obj = object;
+
+      for(int i=0; i<len; i++)
+        {
+        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);
 
-    mPopup.showAsDropDown(view, (width-laywid)/2, -height-layhei, Gravity.LEFT);
+        button.setBackgroundResource(icons[i]);
+        button.setOnClickListener( new View.OnClickListener()
+          {
+          @Override
+          public void onClick(View v)
+            {
+            mObject = obj;
+            mSize   = size;
+            act.changeObject(obj,size);
+            mPopup.dismiss();
+            }
+          });
+
+        mLayout.addView(button);
+        }
+      }
     }
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
