commit ac722a433e3ef61da2900cfeae9c8878cb45d638
Author: Leszek Koltunski <leszek@koltunski.pl>
Date:   Sat Oct 10 00:17:45 2020 +0100

    More debugging for the case of suspicious submits.

diff --git a/src/main/java/org/distorted/effects/scramble/ScrambleEffectRotations.java b/src/main/java/org/distorted/effects/scramble/ScrambleEffectRotations.java
index 38ebc105..574d06ce 100644
--- a/src/main/java/org/distorted/effects/scramble/ScrambleEffectRotations.java
+++ b/src/main/java/org/distorted/effects/scramble/ScrambleEffectRotations.java
@@ -34,16 +34,16 @@ import java.util.Random;
 
 public class ScrambleEffectRotations extends ScrambleEffect
   {
-  private Random mRnd = new Random(0);
+  private Random mRndGen = new Random(0);
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
   private Static4D generateNewRandomPoint()
     {
-    float x = mRnd.nextFloat();
-    float y = mRnd.nextFloat();
-    float z = mRnd.nextFloat();
-    float w = mRnd.nextFloat();
+    float x = mRndGen.nextFloat();
+    float y = mRndGen.nextFloat();
+    float z = mRndGen.nextFloat();
+    float w = mRndGen.nextFloat();
 
     float len = (float)Math.sqrt(x*x + y*y + z*z + w*w);
 
@@ -59,7 +59,7 @@ public class ScrambleEffectRotations extends ScrambleEffect
     mCubeEffectPosition = new int[] {2,3};
     mCubeEffects        = new Effect[mCubeEffectPosition.length];
 
-    mRnd.setSeed(System.currentTimeMillis());
+    mRndGen.setSeed(System.currentTimeMillis());
 
     int numRandomPoints = (int)(Math.pow(numScrambles,0.7f));
 
diff --git a/src/main/java/org/distorted/main/RubikPreRender.java b/src/main/java/org/distorted/main/RubikPreRender.java
index 2cc001de..430e8420 100644
--- a/src/main/java/org/distorted/main/RubikPreRender.java
+++ b/src/main/java/org/distorted/main/RubikPreRender.java
@@ -37,6 +37,7 @@ import com.google.firebase.analytics.FirebaseAnalytics;
 import org.distorted.dialogs.RubikDialogNewRecord;
 import org.distorted.dialogs.RubikDialogSolved;
 import org.distorted.effects.BaseEffect;
+import org.distorted.effects.scramble.ScrambleEffect;
 import org.distorted.library.message.EffectListener;
 import org.distorted.objects.TwistyObject;
 import org.distorted.objects.ObjectList;
@@ -77,6 +78,8 @@ public class RubikPreRender implements EffectListener
   private long mAddRotationID, mRemoveRotationID;
   private int mCubit, mFace, mNewColor;
   private int mNearestAngle;
+  private String mDebug;
+  private long mDebugStartTime;
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
@@ -104,6 +107,8 @@ public class RubikPreRender implements EffectListener
     mScrambleObjectNum = 0;
 
     mEffectID = new long[BaseEffect.Type.LENGTH];
+
+    mDebug = "";
     }
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
@@ -338,26 +343,36 @@ public class RubikPreRender implements EffectListener
 
   private void reportRecord()
     {
-    final RubikActivity act = (RubikActivity)mView.getContext();
-    FirebaseAnalytics analytics = act.getAnalytics();
+    RubikStatePlay play = (RubikStatePlay) StateList.PLAY.getStateClass();
+    RubikScores scores = RubikScores.getInstance();
 
-    if( analytics!=null )
-      {
-      RubikStatePlay play = (RubikStatePlay) StateList.PLAY.getStateClass();
-      RubikScores scores = RubikScores.getInstance();
+    int object      = play.getObject();
+    int size        = play.getSize();
+    int level       = play.getLevel();
+    ObjectList list = ObjectList.getObject(object);
+    String name     = scores.getName();
 
-      int object      = play.getObject();
-      int size        = play.getSize();
-      int level       = play.getLevel();
-      ObjectList list = ObjectList.getObject(object);
-      String name     = scores.getName();
+    String record = list.name()+"_"+size+" level "+level+" time "+mNewRecord+" isNew: "+mIsNewRecord+" scrambleNum: "+mScrambleObjectNum;
 
-      String record = list.name()+"_"+size+" level "+level+" time "+mNewRecord+" isNew: "+mIsNewRecord;
+    if( BuildConfig.DEBUG )
+       {
+       android.util.Log.e("pre", mDebug);
+       android.util.Log.e("pre", name);
+       android.util.Log.e("pre", record);
+       }
+    else
+      {
+      final RubikActivity act = (RubikActivity)mView.getContext();
+      FirebaseAnalytics analytics = act.getAnalytics();
 
-      Bundle bundle = new Bundle();
-      bundle.putString(FirebaseAnalytics.Param.CHARACTER, name);
-      bundle.putString(FirebaseAnalytics.Param.LEVEL, record);
-      analytics.logEvent(FirebaseAnalytics.Event.LEVEL_UP, bundle);
+      if( analytics!=null )
+        {
+        Bundle bundle = new Bundle();
+        bundle.putString(FirebaseAnalytics.Param.CONTENT_TYPE, mDebug);
+        bundle.putString(FirebaseAnalytics.Param.CHARACTER, name);
+        bundle.putString(FirebaseAnalytics.Param.LEVEL, record);
+        analytics.logEvent(FirebaseAnalytics.Event.LEVEL_UP, bundle);
+        }
       }
     }
 
@@ -444,6 +459,13 @@ public class RubikPreRender implements EffectListener
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 //
+///////////////////////////////////////////////////////////////////////////////////////////////////
+
+  void rememberMove(int axis, int row, int angle)
+    {
+    mDebug += (" (m "+axis+" "+(1<<row)+" "+angle+" "+(System.currentTimeMillis()-mDebugStartTime)+")");
+    }
+
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
   void setScreenSize(int width)
@@ -570,6 +592,11 @@ public class RubikPreRender implements EffectListener
     mAddRotationRowBitmap = rowBitmap;
     mAddRotationAngle     = angle;
     mAddRotationDuration  = duration;
+
+    if( listener instanceof ScrambleEffect )
+      {
+      mDebug += (" (a "+axis+" "+rowBitmap+" "+angle+" "+(System.currentTimeMillis()-mDebugStartTime)+")");
+      }
     }
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
@@ -588,6 +615,8 @@ public class RubikPreRender implements EffectListener
       {
       mScrambleObject = true;
       mScrambleObjectNum = num;
+      mDebug = "";
+      mDebugStartTime = System.currentTimeMillis();
       }
     }
 
diff --git a/src/main/java/org/distorted/main/RubikSurfaceView.java b/src/main/java/org/distorted/main/RubikSurfaceView.java
index e7ef73c4..d91f3bca 100644
--- a/src/main/java/org/distorted/main/RubikSurfaceView.java
+++ b/src/main/java/org/distorted/main/RubikSurfaceView.java
@@ -410,6 +410,7 @@ public class RubikSurfaceView extends GLSurfaceView
       computeCurrentSpeedInInchesPerSecond();
       int angle = mPreRender.getObject().computeNearestAngle(mCurrentAngle, mCurrRotSpeed);
       mPreRender.finishRotation(angle);
+      mPreRender.rememberMove(mCurrentAxis,mCurrentRow,angle);
 
       if( angle!=0 )
         {
diff --git a/src/main/java/org/distorted/objects/TwistyObject.java b/src/main/java/org/distorted/objects/TwistyObject.java
index 28395efe..3c490cf6 100644
--- a/src/main/java/org/distorted/objects/TwistyObject.java
+++ b/src/main/java/org/distorted/objects/TwistyObject.java
@@ -69,7 +69,7 @@ public abstract class TwistyObject extends DistortedNode
   private static final float MAX_SIZE_CHANGE = 1.35f;
   private static final float MIN_SIZE_CHANGE = 0.8f;
 
-  private static boolean mCreateFromDMesh = false;
+  private static boolean mCreateFromDMesh = true;
 
   private static final Static3D CENTER = new Static3D(0,0,0);
   private static final int POST_ROTATION_MILLISEC = 500;
