commit 0c233a9af175ed54d455991574e7f932b88737ca
Author: Leszek Koltunski <leszek@koltunski.pl>
Date:   Tue Nov 15 13:06:59 2022 +0100

    Partly merge the 'iap' branch.

diff --git a/src/main/java/org/distorted/external/RubikScores.java b/src/main/java/org/distorted/external/RubikScores.java
index d27b6d61..f63d14ae 100644
--- a/src/main/java/org/distorted/external/RubikScores.java
+++ b/src/main/java/org/distorted/external/RubikScores.java
@@ -21,6 +21,7 @@ import com.google.firebase.crashlytics.FirebaseCrashlytics;
 import org.distorted.main.BuildConfig;
 import org.distorted.objects.RubikObject;
 import org.distorted.objects.RubikObjectList;
+import org.distorted.screens.RubikScreenPlay;
 
 import static org.distorted.objectlib.main.ObjectType.MAX_SCRAMBLES;
 
@@ -29,6 +30,10 @@ import static org.distorted.objectlib.main.ObjectType.MAX_SCRAMBLES;
 
 public class RubikScores
   {
+  public static final int RECORD_FIRST   = 0;
+  public static final int RECORD_NEW     = 1;
+  public static final int RECORD_NOT_NEW = 2;
+
   public static final int MAX_RECORD = 10;
   public static final int MULT = 1000000;
   public static final long NO_RECORD = Long.MAX_VALUE;
@@ -40,6 +45,7 @@ public class RubikScores
   private int mNumPlays;
   private int mNumWins;
   private int mDeviceID;
+  private int mNumStars;
 
   private static class MapValue
     {
@@ -70,6 +76,7 @@ public class RubikScores
     mNumRuns = -1;
     mDeviceID= -1;
     mNumWins =  0;
+    mNumStars=  0;
     }
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
@@ -228,6 +235,20 @@ public class RubikScores
     return mNumWins;
     }
 
+///////////////////////////////////////////////////////////////////////////////////////////////////
+
+  public void changeNumStars(int stars)
+    {
+    mNumStars += stars;
+    }
+
+///////////////////////////////////////////////////////////////////////////////////////////////////
+
+  public int getNumStars()
+    {
+    return mNumStars;
+    }
+
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
   public void setName(String newName)
@@ -237,7 +258,7 @@ public class RubikScores
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
-  public synchronized boolean setRecord(int object, int level, long record)
+  public synchronized int setRecord(int object, int level, long record)
     {
     int key = mapKey(object,level);
     MapValue oldValue = mMap.get(key);
@@ -246,7 +267,7 @@ public class RubikScores
       {
       MapValue value = new MapValue(record,0);
       mMap.put(key,value);
-      return true;
+      return RECORD_FIRST;
       }
 
     long oldRecord = oldValue.record;
@@ -255,11 +276,12 @@ public class RubikScores
       {
       MapValue value = new MapValue(record,0);
       mMap.put(key,value);
-      return true;
+      return RECORD_NEW;
       }
 
-    return false;
+    return RECORD_NOT_NEW;
     }
+
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
   public synchronized long getRecord(int object, int level)
@@ -355,6 +377,8 @@ public class RubikScores
     editor.putInt("scores_numRuns" , mNumRuns );
     editor.putInt("scores_deviceid", mDeviceID);
     editor.putInt("scores_review"  , mNumWins );
+    editor.putInt("scores_review"  , mNumWins );   // legacy name
+    editor.putInt("scores_numStars", mNumStars );
     }
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
@@ -425,12 +449,28 @@ public class RubikScores
     mNumRuns        = preferences.getInt("scores_numRuns" , 0);
     mDeviceID       = preferences.getInt("scores_deviceid",-1);
     mNumWins        = preferences.getInt("scores_review"  , 0);
+    mNumStars       = preferences.getInt("scores_numStars", 0);
 
     if( mDeviceID==-1 ) mDeviceID = privateGetDeviceID();
 
     if( thereWasError ) recordDBError(errorStr);
     }
 
+///////////////////////////////////////////////////////////////////////////////////////////////////
+
+  public int numberOfSolvedMAXes()
+    {
+    int numObjects = RubikObjectList.getNumObjects();
+    int ret=0, level = RubikScreenPlay.LEVELS_SHOWN;
+
+    for(int obj=0; obj<numObjects; obj++)
+      {
+      if( isSolved(obj,level) ) ret++;
+      }
+
+    return ret;
+    }
+
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
   public void recordDBError(String message)
diff --git a/src/main/java/org/distorted/screens/RubikScreenSolving.java b/src/main/java/org/distorted/screens/RubikScreenSolving.java
index ee8622c4..39bd7cf2 100644
--- a/src/main/java/org/distorted/screens/RubikScreenSolving.java
+++ b/src/main/java/org/distorted/screens/RubikScreenSolving.java
@@ -167,25 +167,28 @@ public class RubikScreenSolving extends RubikScreenBase
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
-  public long getRecord()
+  public long stopTimerAndGetRecord()
     {
     if( mRunning )
       {
       stopCounting();
-
       mElapsed = System.currentTimeMillis()-mStartTime;
-
-      RubikScreenPlay play = (RubikScreenPlay) ScreenList.PLAY.getScreenClass();
-      int object = RubikObjectList.getCurrObject();
-      int level = play.getLevel()-1;
-      boolean isNew = mScores.setRecord(object, level, mElapsed);
-
-      return isNew ? mElapsed : -mElapsed;
+      return mElapsed;
       }
 
     return 0;
     }
 
+///////////////////////////////////////////////////////////////////////////////////////////////////
+
+  public int setRecord()
+    {
+    RubikScreenPlay play = (RubikScreenPlay) ScreenList.PLAY.getScreenClass();
+    int object = RubikObjectList.getCurrObject();
+    int level = play.getLevel()-1;
+    return mScores.setRecord(object, level, mElapsed);
+    }
+
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
   public void resetElapsed()
