commit 5305fdc8192ec0f572dadba3bfb97463b1a5daeb
Author: Leszek Koltunski <leszek@koltunski.pl>
Date:   Tue Jan 3 15:27:27 2023 +0100

    Very important bugfix for an issue which probably has been the reason for many mysterious behaviours in the past: the JsonReader class cannot be a singleton! Convert it into a normal 'instanced' class.
    With it being a singleton there's a major issue: when we create a new TwistyObject from a JSON file (by, for example, going to PurchaseActivity) and then we come back to the old object (by, for example, going back to the main RubikActivity) - then the JsonReader inside the old object has read the new JSON file and thus many of the 'abstract' methods in the old TwistyObject (for example getShortName()) all of the sudden start returning new values!

diff --git a/src/main/java/org/distorted/config/ConfigScreenPane.java b/src/main/java/org/distorted/config/ConfigScreenPane.java
index 59ddd8e9..279a87a0 100644
--- a/src/main/java/org/distorted/config/ConfigScreenPane.java
+++ b/src/main/java/org/distorted/config/ConfigScreenPane.java
@@ -77,7 +77,7 @@ public class ConfigScreenPane
       InputStream stream = object.getObjectStream(act);
 
       mObjectOrdinal = objectOrdinal;
-      JsonReader reader = JsonReader.getInstance();
+      JsonReader reader = new JsonReader();
       String name,author;
       int year, difficulty;
 
diff --git a/src/main/java/org/distorted/dialogs/RubikDialogTutorialView.java b/src/main/java/org/distorted/dialogs/RubikDialogTutorialView.java
index 0dba2bb8..bd4f7ef0 100644
--- a/src/main/java/org/distorted/dialogs/RubikDialogTutorialView.java
+++ b/src/main/java/org/distorted/dialogs/RubikDialogTutorialView.java
@@ -69,7 +69,7 @@ public class RubikDialogTutorialView extends FrameLayout
       {
       try
         {
-        JsonReader reader = JsonReader.getInstance();
+        JsonReader reader = new JsonReader();
         reader.parseJsonTutorial(jsonStream);
         tutorials = reader.getTutorials();
         }
diff --git a/src/main/java/org/distorted/dialogs/RubikDialogUpdateView.java b/src/main/java/org/distorted/dialogs/RubikDialogUpdateView.java
index 33f4dab1..8e73ffae 100644
--- a/src/main/java/org/distorted/dialogs/RubikDialogUpdateView.java
+++ b/src/main/java/org/distorted/dialogs/RubikDialogUpdateView.java
@@ -193,7 +193,7 @@ public class RubikDialogUpdateView implements RubikNetwork.Downloadee
 
         try
           {
-          JsonReader reader = JsonReader.getInstance();
+          JsonReader reader = new JsonReader();
           reader.readNumScramblesAndPrice(act,objectName);
           mInfo.mNumScrambles = reader.getNumScrambles();
           mInfo.mPrice        = reader.getPrice();
diff --git a/src/main/java/org/distorted/helpers/MovesController.java b/src/main/java/org/distorted/helpers/MovesController.java
index d2c132e6..6dca97b5 100644
--- a/src/main/java/org/distorted/helpers/MovesController.java
+++ b/src/main/java/org/distorted/helpers/MovesController.java
@@ -202,9 +202,9 @@ public class MovesController implements MovesFinished
       if( objects.length()>0 )
         {
         String[] tokens = objects.split(" ");
-        int length = tokens.length;
+        int length = tokens.length/3;
 
-        for(int m=0; m<length/3; m++)
+        for(int m=0; m<length; m++)
           {
           String axis  = tokens[3*m  ];
           String row   = tokens[3*m+1];
diff --git a/src/main/java/org/distorted/main/RubikActivity.java b/src/main/java/org/distorted/main/RubikActivity.java
index 4fcff8c4..5d7ce217 100644
--- a/src/main/java/org/distorted/main/RubikActivity.java
+++ b/src/main/java/org/distorted/main/RubikActivity.java
@@ -83,7 +83,6 @@ public class RubikActivity extends AppCompatActivity
     public static final float DIALOG_BUTTON_SIZE  = 0.06f;
     public static final float MENU_BIG_TEXT_SIZE  = 0.05f;
     public static final float MENU_MAIN_TEXT_SIZE = 0.047f;
-    public static final float MENU_MED_TEXT_SIZE  = 0.04f;
     public static final float MENU_SMALL_TEXT_SIZE= 0.035f;
     public static final float TAB_WIDTH           = 0.100f;
     public static final float TAB_HEIGHT          = 0.100f;
diff --git a/src/main/java/org/distorted/purchase/PurchaseObjectLibInterface.java b/src/main/java/org/distorted/purchase/PurchaseObjectLibInterface.java
index 8d6ebe06..d5b521d3 100644
--- a/src/main/java/org/distorted/purchase/PurchaseObjectLibInterface.java
+++ b/src/main/java/org/distorted/purchase/PurchaseObjectLibInterface.java
@@ -11,9 +11,7 @@ package org.distorted.purchase;
 
 import com.google.firebase.crashlytics.FirebaseCrashlytics;
 
-import org.distorted.library.message.EffectMessageSender;
 import org.distorted.objectlib.BuildConfig;
-import org.distorted.objectlib.helpers.BlockController;
 import org.distorted.objectlib.helpers.ObjectLibInterface;
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
diff --git a/src/main/java/org/distorted/purchase/PurchaseScreenPane.java b/src/main/java/org/distorted/purchase/PurchaseScreenPane.java
index df05a036..46663692 100644
--- a/src/main/java/org/distorted/purchase/PurchaseScreenPane.java
+++ b/src/main/java/org/distorted/purchase/PurchaseScreenPane.java
@@ -187,7 +187,7 @@ public class PurchaseScreenPane implements ListenerOverlay
     if( mObject!=null )
       {
       InputStream stream = mObject.getObjectStream(act);
-      JsonReader reader = JsonReader.getInstance();
+      JsonReader reader = new JsonReader();
       String author, name;
       int year, difficulty;
 
diff --git a/src/main/java/org/distorted/purchase/PurchaseSurfaceView.java b/src/main/java/org/distorted/purchase/PurchaseSurfaceView.java
index ca1848bd..eda71f0a 100644
--- a/src/main/java/org/distorted/purchase/PurchaseSurfaceView.java
+++ b/src/main/java/org/distorted/purchase/PurchaseSurfaceView.java
@@ -27,15 +27,12 @@ public class PurchaseSurfaceView extends GLSurfaceView
 {
     private ObjectControl mObjectController;
     private PurchaseRenderer mRenderer;
-    private int mScreenWidth, mScreenHeight;
     private boolean mCreated;
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
     void setScreenSize(int width, int height)
       {
-      mScreenWidth = width;
-      mScreenHeight= height;
       mObjectController.setScreenSize(width,height);
       mObjectController.setObjectScale(1.00f);
 
diff --git a/src/main/java/org/distorted/screens/RubikScreenPlay.java b/src/main/java/org/distorted/screens/RubikScreenPlay.java
index 76844f93..ba6f3c7e 100644
--- a/src/main/java/org/distorted/screens/RubikScreenPlay.java
+++ b/src/main/java/org/distorted/screens/RubikScreenPlay.java
@@ -656,6 +656,6 @@ public class RubikScreenPlay extends RubikScreenBase implements RubikNetwork.Upd
 
   public void errorUpdate()
     {
-    android.util.Log.e("D", "Screen: Error receiving update");
+    android.util.Log.e("D", "RubikScreenPlay: Error receiving downloaded objects update");
     }
   }
