commit 7480fbab572a9de35081f0deb729485afdf2a8d4
Author: Leszek Koltunski <leszek@koltunski.pl>
Date:   Tue Sep 6 15:05:03 2022 +0200

    Progress with marking objects as free.

diff --git a/src/main/java/org/distorted/main/RubikActivity.java b/src/main/java/org/distorted/main/RubikActivity.java
index 723f4868..51563927 100644
--- a/src/main/java/org/distorted/main/RubikActivity.java
+++ b/src/main/java/org/distorted/main/RubikActivity.java
@@ -253,7 +253,7 @@ public class RubikActivity extends AppCompatActivity
       DistortedLibrary.onResume(ACTIVITY_NUMBER);
       RubikSurfaceView view = findViewById(R.id.rubikSurfaceView);
       view.onResume();
-      restorePreferences();
+      restorePreferences(mJustStarted);
 
       ScreenList.setScreen(this);
       unblockEverything();
@@ -339,19 +339,20 @@ public class RubikActivity extends AppCompatActivity
         solv.saveMovePreferences(KEY_SOLV,editor);
         }
 
-      editor.apply();
+      boolean success = editor.commit();
+      if( !success ) android.util.Log.e("D", "Failed to save preferences");
       }
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
-    private void restorePreferences()
+    private void restorePreferences(boolean justStarted)
       {
       SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(this);
 
       mPolicyAccepted = preferences.getBoolean("policyAccepted", false);
       String oldVersion = preferences.getString("appVersion","");
 
-      RubikObjectList.restorePreferences(this,preferences);
+      RubikObjectList.restorePreferences(this,preferences,justStarted);
 
       for (int i=0; i<BaseEffect.Type.LENGTH; i++)
         {
diff --git a/src/main/java/org/distorted/objects/RubikObjectList.java b/src/main/java/org/distorted/objects/RubikObjectList.java
index 519f3cbc..49deaa93 100644
--- a/src/main/java/org/distorted/objects/RubikObjectList.java
+++ b/src/main/java/org/distorted/objects/RubikObjectList.java
@@ -222,6 +222,21 @@ public class RubikObjectList
       }
     }
 
+///////////////////////////////////////////////////////////////////////////////////////////////////
+
+  public static boolean allAlreadyBought()
+    {
+    return mFreeBoughtObjects.equals("*");
+    }
+
+///////////////////////////////////////////////////////////////////////////////////////////////////
+
+  public static boolean objectAlreadyBought(String shortName)
+    {
+    RubikObject o = getObject(shortName);
+    return ( o!=null && o.isFree() );
+    }
+
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
   public static void buyAll()
@@ -244,7 +259,8 @@ public class RubikObjectList
     if( o!=null && !o.isFree() )
       {
       o.markFree();
-      mFreeBoughtObjects += (","+shortName);
+      String add = mFreeBoughtObjects.length()==0 ? shortName : (","+shortName);
+      mFreeBoughtObjects += add;
       return true;
       }
 
@@ -260,7 +276,8 @@ public class RubikObjectList
     if( o!=null && !o.isFree() )
       {
       o.markFree();
-      mFreeSolvedObjects += (","+shortName);
+      String add = mFreeSolvedObjects.length()==0 ? shortName : (","+shortName);
+      mFreeSolvedObjects += add;
       return true;
       }
 
@@ -317,7 +334,7 @@ public class RubikObjectList
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
-  public static void restorePreferences(Context context, SharedPreferences preferences)
+  public static void restorePreferences(Context context, SharedPreferences preferences, boolean justStarted)
     {
     if( mThis==null ) mThis = new RubikObjectList();
 
@@ -364,22 +381,36 @@ public class RubikObjectList
     mObject = getOrdinal(objName);
     if( mObject<0 || mObject>=mNumObjects ) mObject = DEF_OBJECT;
 
-    mFreeSolvedObjects = preferences.getString("rol_freeSolved", "");
-    mFreeBoughtObjects = preferences.getString("rol_freeBought", "");
-
-    if( mFreeBoughtObjects.length()>0 )
+    if( justStarted )
       {
-      if( mFreeBoughtObjects.charAt(0)=='*' )
+      mFreeSolvedObjects = preferences.getString("rol_freeSolved", "");
+      mFreeBoughtObjects = preferences.getString("rol_freeBought", "");
+
+      if( mFreeBoughtObjects.length()>0 )
         {
-        for(int i=0; i<mNumObjects; i++)
+        if( mFreeBoughtObjects.charAt(0)=='*' )
+          {
+          for(int i=0; i<mNumObjects; i++)
+            {
+            RubikObject o = mObjects.get(i);
+            o.markFree();
+            }
+          }
+        else
           {
-          RubikObject o = mObjects.get(i);
-          o.markFree();
+          String[] objs = mFreeBoughtObjects.split(",");
+
+          for( String obj : objs )
+            {
+            RubikObject o = getObject(obj);
+            if( o!=null ) o.markFree();
+            }
           }
         }
-      else
+
+      if( mFreeSolvedObjects.length()>0 )
         {
-        String[] objs = mFreeBoughtObjects.split(",");
+        String[] objs = mFreeSolvedObjects.split(",");
 
         for( String obj : objs )
           {
@@ -388,17 +419,6 @@ public class RubikObjectList
           }
         }
       }
-
-    if( mFreeSolvedObjects.length()>0 )
-      {
-      String[] objs = mFreeSolvedObjects.split(",");
-
-      for( String obj : objs )
-        {
-        RubikObject o = getObject(obj);
-        if( o!=null ) o.markFree();
-        }
-      }
     }
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
diff --git a/src/main/java/org/distorted/purchase/PurchaseScreenPane.java b/src/main/java/org/distorted/purchase/PurchaseScreenPane.java
index 3a1ab62e..15b721aa 100644
--- a/src/main/java/org/distorted/purchase/PurchaseScreenPane.java
+++ b/src/main/java/org/distorted/purchase/PurchaseScreenPane.java
@@ -10,6 +10,8 @@
 package org.distorted.purchase;
 
 import android.util.TypedValue;
+import android.view.View;
+import android.widget.Button;
 import android.widget.ImageView;
 import android.widget.LinearLayout;
 import android.widget.TextView;
@@ -38,15 +40,86 @@ public class PurchaseScreenPane
   public  static final float PADDING_RATIO = 0.025f;
   private static final float TEXT_RATIO    = 0.050f;
 
+  private RubikObject mObject;
+
+///////////////////////////////////////////////////////////////////////////////////////////////////
+// TODO
+
+  private boolean buyOne(String shortName)
+    {
+    return true;
+    }
+
+///////////////////////////////////////////////////////////////////////////////////////////////////
+// TODO
+
+  private boolean buyAll()
+    {
+    return true;
+    }
+
+///////////////////////////////////////////////////////////////////////////////////////////////////
+
+  private void oneButtonClicked()
+    {
+    if( mObject!=null )
+      {
+      String shortName = mObject.getUpperName();
+
+      if( !RubikObjectList.objectAlreadyBought(shortName) && buyOne(shortName) )
+        {
+        android.util.Log.e("D", "buying "+shortName);
+
+        RubikObjectList.buyObject(shortName);
+        }
+      }
+    }
+
+///////////////////////////////////////////////////////////////////////////////////////////////////
+
+  private void allButtonClicked()
+    {
+    if( !RubikObjectList.allAlreadyBought() && buyAll() )
+      {
+      RubikObjectList.buyAll();
+      }
+    }
+
+///////////////////////////////////////////////////////////////////////////////////////////////////
+
+  private void setUpButtons(LinearLayout one, LinearLayout all)
+    {
+    Button butO = one.findViewById(R.id.purchaseButtonOne);
+    Button butA = all.findViewById(R.id.purchaseButtonAll);
+
+    butO.setOnClickListener( new View.OnClickListener()
+      {
+      @Override
+      public void onClick(View v)
+        {
+        oneButtonClicked();
+        }
+      });
+
+    butA.setOnClickListener( new View.OnClickListener()
+      {
+      @Override
+      public void onClick(View v)
+        {
+        allButtonClicked();
+        }
+      });
+    }
+
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
   void updatePane(PurchaseActivity act, int objectOrdinal)
     {
-    RubikObject object = RubikObjectList.getObject(objectOrdinal);
+    mObject = RubikObjectList.getObject(objectOrdinal);
 
-    if( object!=null )
+    if( mObject!=null )
       {
-      InputStream stream = object.getObjectStream(act);
+      InputStream stream = mObject.getObjectStream(act);
       JsonReader reader = JsonReader.getInstance();
       String author, name;
       int year, difficulty;
@@ -128,5 +201,7 @@ public class PurchaseScreenPane
     text.setTextSize(TypedValue.COMPLEX_UNIT_PX, textSize);
     text = allLayout.findViewById(R.id.purchaseTextAll);
     text.setTextSize(TypedValue.COMPLEX_UNIT_PX, textSize);
+
+    setUpButtons(oneLayout,allLayout);
     }
 }
