commit 69b6638689d89e268e218f930d3dfc9e5b4e2eb8
Author: Leszek Koltunski <leszek@koltunski.pl>
Date:   Mon Jul 4 23:46:21 2022 +0200

    Mark the 'Free Play' with green or red dot.

diff --git a/src/main/java/org/distorted/objects/RubikObjectList.java b/src/main/java/org/distorted/objects/RubikObjectList.java
index 3475e6df..024f45f8 100644
--- a/src/main/java/org/distorted/objects/RubikObjectList.java
+++ b/src/main/java/org/distorted/objects/RubikObjectList.java
@@ -415,6 +415,14 @@ public class RubikObjectList
     return mObject;
     }
 
+///////////////////////////////////////////////////////////////////////////////////////////////////
+
+  public static String getCurrentName()
+    {
+    RubikObject object = mObjects.get(mObject);
+    return object==null ? "" : object.getUpperName();
+    }
+
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
   public static RubikObject getObject(int ordinal)
diff --git a/src/main/java/org/distorted/screens/RubikScreenPlay.java b/src/main/java/org/distorted/screens/RubikScreenPlay.java
index a2c700e7..a5128f61 100644
--- a/src/main/java/org/distorted/screens/RubikScreenPlay.java
+++ b/src/main/java/org/distorted/screens/RubikScreenPlay.java
@@ -91,6 +91,7 @@ public class RubikScreenPlay extends RubikScreenBase implements RubikNetwork.Upd
   private int mBottomHeight;
   private float mScreenWidth;
   private WeakReference<RubikActivity> mWeakAct;
+  private String mObjectsPlayed;
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
@@ -492,6 +493,7 @@ public class RubikScreenPlay extends RubikScreenBase implements RubikNetwork.Upd
   public void savePreferences(SharedPreferences.Editor editor)
     {
     editor.putInt("play_LevelValue", mLevelValue );
+    editor.putString("play_objectsPlayed", mObjectsPlayed );
 
     if( mObjectPopup!=null )
       {
@@ -512,11 +514,28 @@ public class RubikScreenPlay extends RubikScreenBase implements RubikNetwork.Upd
       }
     }
 
+///////////////////////////////////////////////////////////////////////////////////////////////////
+
+  private void addToPlayedObjects()
+    {
+    String name = RubikObjectList.getCurrentName();
+    if( !mObjectsPlayed.contains(name) ) mObjectsPlayed += (" "+name);
+    }
+
+///////////////////////////////////////////////////////////////////////////////////////////////////
+
+  private boolean hasBeenPlayed()
+    {
+    String name = RubikObjectList.getCurrentName();
+    return mObjectsPlayed.contains(name);
+    }
+
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
   public void restorePreferences(SharedPreferences preferences)
     {
-    mLevelValue = preferences.getInt("play_LevelValue", 0);
+    mLevelValue    = preferences.getInt("play_LevelValue", 0);
+    mObjectsPlayed = preferences.getString("play_objectsPlayed", "");
     }
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
@@ -586,7 +605,8 @@ public class RubikScreenPlay extends RubikScreenBase implements RubikNetwork.Upd
         {
         int level = i<numLevel-1 ? i : dbLevel;
         Button button = (Button)mPlayLayout.getChildAt(i);
-        int icon = scores.isSolved(currObject, level-1) ? R.drawable.ui_solved : R.drawable.ui_notsolved;
+        boolean isSolved = i>0 ? scores.isSolved(currObject, level-1) : hasBeenPlayed();
+        int icon = isSolved ? R.drawable.ui_solved : R.drawable.ui_notsolved;
         button.setCompoundDrawablesWithIntrinsicBounds(icon,0,0,0);
         }
       }
@@ -650,8 +670,9 @@ public class RubikScreenPlay extends RubikScreenBase implements RubikNetwork.Upd
               mShouldReactToEndOfScrambling = true;
               control.scrambleObject(scrambles);
               }
-             else
+            else
               {
+              addToPlayedObjects();
               ScreenList.switchScreen(act, ScreenList.FREE);
               }
             }
