commit 7b7d65ce30fc8b629e4aca178aa648c71b3e1793
Author: Leszek Koltunski <leszek@koltunski.pl>
Date:   Sun May 3 16:43:09 2020 +0100

    - bump version to 1.1.2
    - fix one crasher observed in the field ( we need to adjust the Levels Spinner in Play state if Object changed in Pattern or Solver states )

diff --git a/build.gradle b/build.gradle
index e872dbd3..7a53b1f4 100644
--- a/build.gradle
+++ b/build.gradle
@@ -15,8 +15,8 @@ android {
         applicationId "org.distorted.magic"
         minSdkVersion 21
         targetSdkVersion 29
-        versionCode 3
-        versionName "1.1.1"
+        versionCode 4
+        versionName "1.1.2"
     }
 
     buildTypes {
@@ -35,8 +35,8 @@ android {
 
 dependencies {
     implementation fileTree(dir: 'libs', include: ['*.jar'])
-    implementation 'com.google.firebase:firebase-analytics:17.3.0'
-    implementation 'com.google.firebase:firebase-crashlytics:17.0.0-beta04'
+    implementation 'com.google.firebase:firebase-analytics:17.4.0'
+    implementation 'com.google.firebase:firebase-crashlytics:17.0.0'
 
     api project(':distorted-library')
     implementation 'androidx.appcompat:appcompat:1.1.0'
diff --git a/src/main/java/org/distorted/main/RubikActivity.java b/src/main/java/org/distorted/main/RubikActivity.java
index 0cc1bea9..e4a7fa9d 100644
--- a/src/main/java/org/distorted/main/RubikActivity.java
+++ b/src/main/java/org/distorted/main/RubikActivity.java
@@ -112,7 +112,7 @@ public class RubikActivity extends AppCompatActivity
         RubikObjectList obj = RubikObjectList.getObject(RubikStatePlay.DEF_OBJECT);
         int s = RubikStatePlay.DEF_SIZE;
 
-        play.setObjectAndSize(obj,s);
+        play.setObjectAndSize(this,obj,s);
         view.getPostRender().changeObject(obj,s);
         }
       }
diff --git a/src/main/java/org/distorted/states/RubikStatePattern.java b/src/main/java/org/distorted/states/RubikStatePattern.java
index 4228346c..0280ee8c 100644
--- a/src/main/java/org/distorted/states/RubikStatePattern.java
+++ b/src/main/java/org/distorted/states/RubikStatePattern.java
@@ -66,7 +66,7 @@ public class RubikStatePattern extends RubikStateAbstract
     RubikObjectList object = RubikPatternList.getObject(mPatternOrdinal);
     int size = RubikPatternList.getSize(mPatternOrdinal);
 
-    if( !play.setObjectAndSize(object,size) )
+    if( !play.setObjectAndSize(act,object,size) )
       {
       int objectPlay= play.getObject();
       int sizePlay  = play.getSize();
diff --git a/src/main/java/org/distorted/states/RubikStatePlay.java b/src/main/java/org/distorted/states/RubikStatePlay.java
index 94c2209d..0afd7170 100644
--- a/src/main/java/org/distorted/states/RubikStatePlay.java
+++ b/src/main/java/org/distorted/states/RubikStatePlay.java
@@ -281,19 +281,7 @@ public class RubikStatePlay extends RubikStateAbstract implements AdapterView.On
               mObject = obj;
               mSize   = sizes[size];
               act.changeObject(list,sizes[size]);
-
-              int sizeIndex = RubikObjectList.getSizeIndex(mObject,mSize);
-              int maxLevel  = RubikObjectList.getMaxLevel(mObject, sizeIndex);
-              String[] levels = new String[maxLevel];
-
-              for(int i=0; i<maxLevel; i++)
-                {
-                levels[i] = act.getString(R.string.lv_placeholder,i+1);
-                }
-
-              mSpinnerAdapter = new ArrayAdapter<>(act,android.R.layout.simple_spinner_item, levels);
-              mSpinnerAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
-              mLevelSpinner.setAdapter(mSpinnerAdapter);
+              adjustSpinner(act);
               }
 
             mPopup.dismiss();
@@ -337,24 +325,48 @@ public class RubikStatePlay extends RubikStateAbstract implements AdapterView.On
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
-  public boolean setObjectAndSize(RubikObjectList obj, int size)
+  public boolean setObjectAndSize(RubikActivity act, RubikObjectList obj, int size)
     {
-    boolean success = false;
+    if( mObject!=obj.ordinal() || mSize != size )
+      {
+      boolean success = false;
 
-    for( int s: obj.getSizes() )
-      if( s==size )
+      for( int s: obj.getSizes() )
+        if( s==size )
+          {
+          success = true;
+          break;
+          }
+
+      if( success )
         {
-        success = true;
-        break;
+        mObject = obj.ordinal();
+        mSize   = size;
+        adjustSpinner(act);
         }
 
-    if( success )
+      return success;
+      }
+
+    return true;
+    }
+
+///////////////////////////////////////////////////////////////////////////////////////////////////
+
+  private void adjustSpinner(RubikActivity act)
+    {
+    int sizeIndex = RubikObjectList.getSizeIndex(mObject,mSize);
+    int maxLevel  = RubikObjectList.getMaxLevel(mObject, sizeIndex);
+    String[] levels = new String[maxLevel];
+
+    for(int i=0; i<maxLevel; i++)
       {
-      mObject = obj.ordinal();
-      mSize   = size;
+      levels[i] = act.getString(R.string.lv_placeholder,i+1);
       }
 
-    return success;
+    mSpinnerAdapter = new ArrayAdapter<>(act,android.R.layout.simple_spinner_item, levels);
+    mSpinnerAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
+    mLevelSpinner.setAdapter(mSpinnerAdapter);
     }
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
diff --git a/src/main/java/org/distorted/states/RubikStateSolver.java b/src/main/java/org/distorted/states/RubikStateSolver.java
index 95aaff2b..0b9433ae 100644
--- a/src/main/java/org/distorted/states/RubikStateSolver.java
+++ b/src/main/java/org/distorted/states/RubikStateSolver.java
@@ -83,7 +83,7 @@ public class RubikStateSolver extends RubikStateAbstract
 
     act.setupObject(mCurrentObject, mCurrentObjectSize, null);
     RubikStatePlay play = (RubikStatePlay)RubikState.PLAY.getStateClass();
-    play.setObjectAndSize(mCurrentObject, mCurrentObjectSize);
+    play.setObjectAndSize(act, mCurrentObject, mCurrentObjectSize);
 
     mFaceColors = RubikObjectList.retFaceColors(mCurrentObject);
     mNumFaces   = mFaceColors!=null ? mFaceColors.length : 0;
