commit 83018ac42c060669d32b0d7554ca9db0e156f64c
Author: Leszek Koltunski <leszek@koltunski.pl>
Date:   Wed Jul 27 15:36:05 2022 +0200

    Correct the MAX level in the leaderboard.

diff --git a/src/main/java/org/distorted/dialogs/RubikDialogScoresPagerAdapter.java b/src/main/java/org/distorted/dialogs/RubikDialogScoresPagerAdapter.java
index 17c3f824..50242996 100644
--- a/src/main/java/org/distorted/dialogs/RubikDialogScoresPagerAdapter.java
+++ b/src/main/java/org/distorted/dialogs/RubikDialogScoresPagerAdapter.java
@@ -40,9 +40,11 @@ class RubikDialogScoresPagerAdapter extends PagerAdapter implements RubikNetwork
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
-  private void addSection(int tab, int level, int lastLevel, final RubikDialogScoresView view, final String[] country, final String[] name, final float[] time)
+  private void addSection(int tab, int level, final RubikDialogScoresView view, final String[] country, final String[] name, final float[] time)
     {
-    String title = level==lastLevel-1 ?
+    if( level>RubikScreenPlay.LEVELS_SHOWN ) level=RubikScreenPlay.LEVELS_SHOWN;
+
+    String title = level==RubikScreenPlay.LEVELS_SHOWN ?
                    mAct.getString(R.string.levelM) :
                    mAct.getString(R.string.lv_placeholder,level+1);
 
@@ -69,22 +71,24 @@ class RubikDialogScoresPagerAdapter extends PagerAdapter implements RubikNetwork
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
-  private void getNext(int currentTab, int[] toDoTab, int[] maxTab, int[] lastTab)
+  private void getNext(int currentTab, int[] toDoTab, int[] lastTab)
     {
-    if( toDoTab[currentTab]<maxTab[currentTab] )
+    int MAX = RubikScreenPlay.LEVELS_SHOWN+1;
+
+    if( toDoTab[currentTab]<MAX )
       {
       mToDoTab = currentTab;
-      mToDoLvl = toDoTab[currentTab]<maxTab[currentTab]-1 ? toDoTab[currentTab] : lastTab[currentTab]-1;
+      mToDoLvl = toDoTab[currentTab]<MAX-1 ? toDoTab[currentTab] : lastTab[currentTab]-1;
       toDoTab[currentTab]++;
       }
     else
       {
       for(int tab=0; tab<mNumTabs; tab++)
         {
-        if( toDoTab[tab]<maxTab[tab] )
+        if( toDoTab[tab]<MAX )
           {
           mToDoTab = tab;
-          mToDoLvl = toDoTab[tab]<maxTab[tab]-1 ? toDoTab[tab] : lastTab[tab]-1;
+          mToDoLvl = toDoTab[tab]<MAX-1 ? toDoTab[tab] : lastTab[tab]-1;
           toDoTab[tab]++;
           break;
           }
@@ -98,27 +102,22 @@ class RubikDialogScoresPagerAdapter extends PagerAdapter implements RubikNetwork
     {
     prepareView();
 
-    int MAX = RubikScreenPlay.LEVELS_SHOWN+1;
     int toDo=0;
     int[] toDoTab = new int[mNumTabs];
-    int[] maxTab  = new int[mNumTabs];
     int[] lastTab = new int[mNumTabs];
 
     for(int i=0; i<mNumTabs; i++)
       {
       lastTab[i]= RubikObjectList.getDBLevel(i);
-      maxTab[i] = Math.min(lastTab[i],MAX);
       toDoTab[i]= 0;
-
-      toDo += maxTab[i];
+      toDo += (RubikScreenPlay.LEVELS_SHOWN+1);
       }
 
     while( toDo>0 )
       {
       toDo--;
-      getNext(mViewPager.getCurrentItem(),toDoTab,maxTab,lastTab);
-      addSection( mToDoTab,mToDoLvl, lastTab[mToDoTab], mViews[mToDoTab],
-                  country[mToDoTab][mToDoLvl],name[mToDoTab][mToDoLvl],time[mToDoTab][mToDoLvl]);
+      getNext(mViewPager.getCurrentItem(), toDoTab, lastTab);
+      addSection( mToDoTab, mToDoLvl, mViews[mToDoTab], country[mToDoTab][mToDoLvl], name[mToDoTab][mToDoLvl], time[mToDoTab][mToDoLvl]);
       }
     }
 
diff --git a/src/main/java/org/distorted/external/RubikScores.java b/src/main/java/org/distorted/external/RubikScores.java
index c69b297e..f2f93d41 100644
--- a/src/main/java/org/distorted/external/RubikScores.java
+++ b/src/main/java/org/distorted/external/RubikScores.java
@@ -238,7 +238,7 @@ public class RubikScores
 
   public synchronized boolean setRecord(int object, int level, long record)
     {
-    int key = mapKey(object,level)-1; // -1 - historical reasons; previous versions saved it like this.
+    int key = mapKey(object,level);
     MapValue oldValue = mMap.get(key);
 
     if( oldValue==null )
diff --git a/src/main/java/org/distorted/main/RubikActivity.java b/src/main/java/org/distorted/main/RubikActivity.java
index 9dc889ec..504144e9 100644
--- a/src/main/java/org/distorted/main/RubikActivity.java
+++ b/src/main/java/org/distorted/main/RubikActivity.java
@@ -127,8 +127,16 @@ public class RubikActivity extends AppCompatActivity
       cutoutHack();
       computeBarHeights();
 
-      RubikInAppMessanging listener = new RubikInAppMessanging();
-      FirebaseInAppMessaging.getInstance().addClickListener(listener);
+      Thread thread = new Thread()
+        {
+        public void run()
+          {
+          RubikInAppMessanging listener = new RubikInAppMessanging();
+          FirebaseInAppMessaging.getInstance().addClickListener(listener);
+          }
+        };
+
+      thread.start();
       }
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
diff --git a/src/main/java/org/distorted/objects/RubikObjectList.java b/src/main/java/org/distorted/objects/RubikObjectList.java
index 90ab2799..03d0e89c 100644
--- a/src/main/java/org/distorted/objects/RubikObjectList.java
+++ b/src/main/java/org/distorted/objects/RubikObjectList.java
@@ -152,6 +152,8 @@ public class RubikObjectList
 // those got remembered in the server-side DB already, so we need to keep using them. This function
 // provides a map between 'maxScramble' of an object and its 'dbLevel'. All new objects will have
 // those two values the same.
+//
+// all of those need to be > RubikStatePlay.LEVELS_SHOWN.
 
   public static int getDBLevel(int ordinal)
     {
@@ -170,8 +172,8 @@ public class RubikObjectList
     if( ordinal== ObjectSignatures.SKEW_3 ) return 17;
     if( ordinal== ObjectSignatures.REX_3  ) return 16;
     if( ordinal== ObjectSignatures.MIRR_3 ) return 16;
-    if( ordinal== ObjectSignatures.IVY_2  ) return  8;
-    if( ordinal== ObjectSignatures.DIN4_3 ) return  7;
+    if( ordinal== ObjectSignatures.IVY_2  ) return  9;
+    if( ordinal== ObjectSignatures.DIN4_3 ) return  9;
 
     // in 1.9.6 & 1.9.7 there is a bug with downloadable objects (in this very function!):
     // All of those have DBLevel equal to CUBE_3's DBlevel (in 1.9.7!), i.e. 17.
diff --git a/src/main/java/org/distorted/screens/RubikScreenPlay.java b/src/main/java/org/distorted/screens/RubikScreenPlay.java
index b73c601c..eaf81b3e 100644
--- a/src/main/java/org/distorted/screens/RubikScreenPlay.java
+++ b/src/main/java/org/distorted/screens/RubikScreenPlay.java
@@ -509,17 +509,15 @@ public class RubikScreenPlay extends RubikScreenBase implements RubikNetwork.Upd
   private void setupLevelColors(RubikActivity act)
     {
     int currObject = RubikObjectList.getCurrObject();
-    int dbLevel = RubikObjectList.getDBLevel(currObject);
     RubikScores scores = RubikScores.getInstance();
     Resources res = act.getResources();
     ColorStateList colorG = ColorStateList.valueOf(res.getColor(R.color.green));
     ColorStateList colorD = ColorStateList.valueOf(res.getColor(R.color.dark_grey));
 
-    for(int i=0; i<=LEVELS_SHOWN; i++)
+    for(int level=0; level<=LEVELS_SHOWN; level++)
       {
-      int level = i<LEVELS_SHOWN ? i : dbLevel;
       boolean isSolved = scores.isSolved(currObject,level);
-      mLevel[i].setBackgroundTintList( isSolved ? colorG : colorD);
+      mLevel[level].setBackgroundTintList( isSolved ? colorG : colorD);
       }
     }
 
diff --git a/src/main/java/org/distorted/screens/RubikScreenSolving.java b/src/main/java/org/distorted/screens/RubikScreenSolving.java
index 7a5e9873..ee8622c4 100644
--- a/src/main/java/org/distorted/screens/RubikScreenSolving.java
+++ b/src/main/java/org/distorted/screens/RubikScreenSolving.java
@@ -177,7 +177,7 @@ public class RubikScreenSolving extends RubikScreenBase
 
       RubikScreenPlay play = (RubikScreenPlay) ScreenList.PLAY.getScreenClass();
       int object = RubikObjectList.getCurrObject();
-      int level = play.getLevel();
+      int level = play.getLevel()-1;
       boolean isNew = mScores.setRecord(object, level, mElapsed);
 
       return isNew ? mElapsed : -mElapsed;
