commit 7654a99d28f1a21aac75d6cc4011e21a50e3bcb9
Author: Leszek Koltunski <leszek@koltunski.pl>
Date:   Mon Jan 2 23:07:55 2023 +0100

    Purchase Pane: further progress.

diff --git a/src/main/java/org/distorted/external/RubikScores.java b/src/main/java/org/distorted/external/RubikScores.java
index 29a803ef..765785c9 100644
--- a/src/main/java/org/distorted/external/RubikScores.java
+++ b/src/main/java/org/distorted/external/RubikScores.java
@@ -408,6 +408,13 @@ public class RubikScores
     editor.putInt("scores_numStars", mNumStars );
     }
 
+///////////////////////////////////////////////////////////////////////////////////////////////////
+
+  public synchronized void savePreferencesMinimal(SharedPreferences.Editor editor)
+    {
+    editor.putInt("scores_numStars", mNumStars );
+    }
+
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
   public synchronized void restorePreferences(SharedPreferences preferences)
diff --git a/src/main/java/org/distorted/objects/RubikObjectList.java b/src/main/java/org/distorted/objects/RubikObjectList.java
index 3e14940d..7f5b17fc 100644
--- a/src/main/java/org/distorted/objects/RubikObjectList.java
+++ b/src/main/java/org/distorted/objects/RubikObjectList.java
@@ -369,6 +369,14 @@ public class RubikObjectList
       }
     }
 
+///////////////////////////////////////////////////////////////////////////////////////////////////
+
+  public static void savePreferencesMinimal(SharedPreferences.Editor editor)
+    {
+    RubikObject obj = getObject(mObject);
+    if( obj!=null ) editor.putString("rol_objName", obj.getUpperName() );
+    }
+
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
   public static void restorePreferences(Context context, SharedPreferences preferences, boolean justStarted)
diff --git a/src/main/java/org/distorted/overlays/OverlayStars.java b/src/main/java/org/distorted/overlays/OverlayStars.java
index 486c2e45..3bdd4e24 100644
--- a/src/main/java/org/distorted/overlays/OverlayStars.java
+++ b/src/main/java/org/distorted/overlays/OverlayStars.java
@@ -84,7 +84,7 @@ public class OverlayStars extends OverlayGeneric implements EffectListener
       float heighS = mRandom.nextFloat()*mHeight*0.2f;
       float heighM = (mRandom.nextFloat()-0.5f)*mHeight*0.2f;
 
-      Static3D pointS = new Static3D(widthS,mHeight*0.55f+heighS,0);
+      Static3D pointS = new Static3D(widthS,mHeight*0.60f+heighS,0);
       Static3D pointM = new Static3D(widthM,mHeight*0.25f+heighM,0);
       Static3D pointE = new Static3D(0,0,0);
       Static3D pointF = new Static3D(0,0,-10000);
diff --git a/src/main/java/org/distorted/purchase/PurchaseActivity.java b/src/main/java/org/distorted/purchase/PurchaseActivity.java
index bf37df60..20cea9bd 100644
--- a/src/main/java/org/distorted/purchase/PurchaseActivity.java
+++ b/src/main/java/org/distorted/purchase/PurchaseActivity.java
@@ -9,8 +9,10 @@
 
 package org.distorted.purchase;
 
+import android.content.SharedPreferences;
 import android.os.Build;
 import android.os.Bundle;
+import android.preference.PreferenceManager;
 import android.util.DisplayMetrics;
 import android.view.View;
 import android.view.ViewGroup;
@@ -19,6 +21,7 @@ import android.view.WindowManager;
 import androidx.appcompat.app.AppCompatActivity;
 
 import org.distorted.dialogs.RubikDialogError;
+import org.distorted.external.RubikScores;
 import org.distorted.library.main.DistortedLibrary;
 import org.distorted.main.R;
 import org.distorted.objectlib.main.ObjectControl;
@@ -165,6 +168,7 @@ public class PurchaseActivity extends AppCompatActivity
       PurchaseSurfaceView view = findViewById(R.id.purchaseSurfaceView);
       view.onPause();
       DistortedLibrary.onPause(ACTIVITY_NUMBER);
+      savePreferences();
       }
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
@@ -196,6 +200,22 @@ public class PurchaseActivity extends AppCompatActivity
       DistortedLibrary.onDestroy(ACTIVITY_NUMBER);
       }
 
+
+///////////////////////////////////////////////////////////////////////////////////////////////////
+
+    private void savePreferences()
+      {
+      SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(this);
+      SharedPreferences.Editor editor = preferences.edit();
+      RubikScores scores = RubikScores.getInstance();
+
+      scores.savePreferencesMinimal(editor);
+      RubikObjectList.savePreferencesMinimal(editor);
+
+      boolean success = editor.commit();
+      if( !success ) android.util.Log.e("D", "Failed to save preferences");
+      }
+
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
     void OpenGLError()
@@ -252,6 +272,13 @@ public class PurchaseActivity extends AppCompatActivity
       return view.getRenderer();
       }
 
+///////////////////////////////////////////////////////////////////////////////////////////////////
+
+    void blockUI()
+      {
+      mScreen.blockUI();
+      }
+
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
     public static int getDrawableSize()
diff --git a/src/main/java/org/distorted/purchase/PurchaseRenderer.java b/src/main/java/org/distorted/purchase/PurchaseRenderer.java
index abe1ccec..6981fc61 100644
--- a/src/main/java/org/distorted/purchase/PurchaseRenderer.java
+++ b/src/main/java/org/distorted/purchase/PurchaseRenderer.java
@@ -12,12 +12,11 @@ package org.distorted.purchase;
 import android.opengl.GLSurfaceView;
 
 import org.distorted.library.effect.EffectType;
-import org.distorted.library.effect.VertexEffectQuaternion;
-import org.distorted.library.effect.VertexEffectRotate;
+import org.distorted.library.effect.PostprocessEffectGlow;
 import org.distorted.library.main.DistortedLibrary;
 import org.distorted.library.main.DistortedScreen;
-import org.distorted.objectlib.effects.BaseEffect;
 import org.distorted.objectlib.main.ObjectControl;
+import org.distorted.overlays.OverlayStars;
 
 import javax.microedition.khronos.egl.EGLConfig;
 import javax.microedition.khronos.opengles.GL10;
@@ -77,9 +76,8 @@ public class PurchaseRenderer implements GLSurfaceView.Renderer, DistortedLibrar
    public void onSurfaceCreated(GL10 glUnused, EGLConfig config)
       {
       DistortedLibrary.setMax(EffectType.VERTEX, ObjectControl.MAX_QUATS+1);
-      VertexEffectRotate.enable();
-      VertexEffectQuaternion.enable();
-      BaseEffect.Type.enableEffects();
+      OverlayStars.enableEffects();
+      PostprocessEffectGlow.enable();
 
       DistortedLibrary.onSurfaceCreated(mView.getContext(),this,1);
       DistortedLibrary.setCull(true);
diff --git a/src/main/java/org/distorted/purchase/PurchaseScreen.java b/src/main/java/org/distorted/purchase/PurchaseScreen.java
index 58fe3397..945b6e35 100644
--- a/src/main/java/org/distorted/purchase/PurchaseScreen.java
+++ b/src/main/java/org/distorted/purchase/PurchaseScreen.java
@@ -22,6 +22,14 @@ import org.distorted.objectlib.main.ObjectControl;
 public class PurchaseScreen
 {
   private TransparentImageButton mBackButton;
+  private boolean mBlocked;
+
+///////////////////////////////////////////////////////////////////////////////////////////////////
+
+  void blockUI()
+    {
+    mBlocked = true;
+    }
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
@@ -36,9 +44,12 @@ public class PurchaseScreen
       @Override
       public void onClick(View v)
         {
-        ObjectControl control = act.getControl();
-        if( control!=null ) control.unblockEverything();
-        act.finish();
+        if( !mBlocked )
+          {
+          ObjectControl control = act.getControl();
+          if( control!=null ) control.unblockEverything();
+          act.finish();
+          }
         }
       });
     }
@@ -47,6 +58,7 @@ public class PurchaseScreen
 
   void onAttachedToWindow(final PurchaseActivity act, final int ordinal)
     {
+    mBlocked = false;
     int width = act.getScreenWidthInPixels();
 
     LinearLayout.LayoutParams paramsL = new LinearLayout.LayoutParams(width/4, LinearLayout.LayoutParams.MATCH_PARENT);
diff --git a/src/main/java/org/distorted/purchase/PurchaseScreenPane.java b/src/main/java/org/distorted/purchase/PurchaseScreenPane.java
index 181d19dc..df05a036 100644
--- a/src/main/java/org/distorted/purchase/PurchaseScreenPane.java
+++ b/src/main/java/org/distorted/purchase/PurchaseScreenPane.java
@@ -25,16 +25,19 @@ import org.distorted.external.RubikScores;
 import org.distorted.library.main.DistortedScreen;
 import org.distorted.main.R;
 import org.distorted.objectlib.json.JsonReader;
+import org.distorted.objectlib.main.ObjectControl;
 import org.distorted.objects.RubikObject;
 import org.distorted.objects.RubikObjectList;
 import org.distorted.overlays.DataStars;
+import org.distorted.overlays.ListenerOverlay;
 import org.distorted.overlays.OverlayStars;
 
 import java.io.InputStream;
+import java.lang.ref.WeakReference;
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
-public class PurchaseScreenPane
+public class PurchaseScreenPane implements ListenerOverlay
 {
   public static final int UNLOCK_ALL_PRICE = 500;
 
@@ -51,6 +54,7 @@ public class PurchaseScreenPane
   public  static final float PADDING_RATIO = 0.025f;
   private static final float TEXT_RATIO    = 0.050f;
 
+  private final WeakReference<PurchaseActivity> mAct;
   private RubikObject mObject;
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
@@ -84,14 +88,15 @@ public class PurchaseScreenPane
 
   private void showSuccess(PurchaseActivity act, RubikObject object)
     {
+    act.blockUI();
     RubikScores scores = RubikScores.getInstance();
     int totStars = scores.getNumStars();
     int price = object==null ? UNLOCK_ALL_PRICE:object.getPrice();
     PurchaseRenderer renderer = act.getRenderer();
     DistortedScreen screen = renderer.getScreen();
     OverlayStars stars = new OverlayStars();
-    DataStars data = new DataStars(totStars,-price,act.getResources());
-    stars.startOverlay(screen,null,data);
+    DataStars data = new DataStars(totStars+price,-price,act.getResources());
+    stars.startOverlay(screen,this,data);
     }
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
@@ -220,6 +225,7 @@ public class PurchaseScreenPane
 
   PurchaseScreenPane(final PurchaseActivity act)
     {
+    mAct = new WeakReference<>(act);
     int width = act.getScreenWidthInPixels();
     float textSize = width*TEXT_RATIO;
     int margin = (int)(width*PADDING_RATIO);
@@ -267,4 +273,21 @@ public class PurchaseScreenPane
 
     setUpButtons(act,oneLayout,allLayout);
     }
+
+///////////////////////////////////////////////////////////////////////////////////////////////////
+
+  public void overlayFinished(long id)
+    {
+    PurchaseActivity act = mAct.get();
+
+    if( act!=null )
+      {
+      String upperName = mObject.getUpperName();
+      int ordinal = RubikObjectList.getOrdinal(upperName);
+      RubikObjectList.setCurrObject(ordinal);
+      ObjectControl control = act.getControl();
+      if( control!=null ) control.unblockEverything();
+      act.finish();
+      }
+    }
 }
