commit 9d4c38ebf2555109068a49fd8bbaeb0645361129
Author: Leszek Koltunski <leszek@koltunski.pl>
Date:   Sat May 1 00:26:05 2021 +0200

    Include info about renderer and version in the submit packet.

diff --git a/src/main/java/org/distorted/network/RubikNetwork.java b/src/main/java/org/distorted/network/RubikNetwork.java
index 66424db4..99a9fd02 100644
--- a/src/main/java/org/distorted/network/RubikNetwork.java
+++ b/src/main/java/org/distorted/network/RubikNetwork.java
@@ -56,6 +56,11 @@ public class RubikNetwork implements Runnable
   private static final int DEBUG      = 2;
   private static final int IDLE       = 3;
 
+  private static final int REND_ADRENO = 0;
+  private static final int REND_MALI   = 1;
+  private static final int REND_POWER  = 2;
+  private static final int REND_OTHER  = 3;
+
   private final String[] hex = {
     "%00", "%01", "%02", "%03", "%04", "%05", "%06", "%07",
     "%08", "%09", "%0a", "%0b", "%0c", "%0d", "%0e", "%0f",
@@ -249,6 +254,60 @@ public class RubikNetwork implements Runnable
       }
     }
 
+///////////////////////////////////////////////////////////////////////////////////////////////////
+
+  private int getRendererType(String renderer)
+    {
+    if( renderer.contains("Adreno")  ) return REND_ADRENO;
+    if( renderer.contains("Mali")    ) return REND_MALI;
+    if( renderer.contains("PowerVR") ) return REND_POWER;
+
+    return REND_OTHER;
+    }
+
+///////////////////////////////////////////////////////////////////////////////////////////////////
+
+  private String parseRenderer(final int type, String renderer)
+    {
+    if( type==REND_ADRENO || type==REND_POWER )
+      {
+      int lastSpace = renderer.lastIndexOf(' ');
+      String ret = renderer.substring(lastSpace+1);
+      return URLencode(ret);
+      }
+
+    if( type==REND_MALI )
+      {
+      int firstHyphen = renderer.indexOf('-');
+      String ret = renderer.substring(firstHyphen+1);
+      return URLencode(ret);
+      }
+
+    return "other";
+    }
+
+///////////////////////////////////////////////////////////////////////////////////////////////////
+
+  private String parseVersion(final int type, String version)
+    {
+    switch(type)
+      {
+      case REND_ADRENO: int aMonkey = version.indexOf('@');
+                        int aDot = version.indexOf('.', aMonkey);
+                        String ret1 = aDot>=3 ? version.substring(aDot-3,aDot) : "";
+                        return URLencode(ret1);
+      case REND_MALI  : int mV1 = version.indexOf("v1");
+                        int mHyphen = version.indexOf('-', mV1);
+                        String ret2 = mHyphen>mV1+3 && mV1>=0 ? version.substring(mV1+3,mHyphen) : "";
+                        return URLencode(ret2);
+      case REND_POWER : int pMonkey = version.indexOf('@');
+                        int pSpace  = version.lastIndexOf(' ');
+                        String ret3 = pSpace>=0 && pMonkey>pSpace+1 ? version.substring(pSpace+1,pMonkey) : "";
+                        return URLencode(ret3);
+      default         : return "";
+      }
+    }
+
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
   private String URLencode(String s)
@@ -422,8 +481,16 @@ public class RubikNetwork implements Runnable
     long epoch = System.currentTimeMillis();
     String salt = "cuboid";
 
+    String renderer = DistortedLibrary.getDriverRenderer();
+    String version  = DistortedLibrary.getDriverVersion();
+
+    int type = getRendererType(renderer);
+    renderer = parseRenderer(type,renderer);
+    version  = parseVersion(type,version);
+
     String url1="https://distorted.org/magic/cgi-bin/submit.cgi";
     String url2 = "n="+name+"&v="+veri+"&r="+numRuns+"&p="+numPlay+"&i="+deviceID+"&e="+mVersion+"d";
+    url2 += "&d="+renderer+"&s="+version;
     url2 += reclist+"&c="+country+"&f="+epoch+"&oo="+ ObjectList.getObjectList();
     url2 += "&min=0&max="+MAX_LEVEL+"&lo="+MAX_PLACES;
     String hash = computeHash( url2, salt.getBytes() );
