commit 84d746d797da6e0c9f78f6691132d187528dc560
Author: Leszek Koltunski <leszek@koltunski.pl>
Date:   Tue Feb 1 13:30:28 2022 +0100

    Downloaded Objects more or less work now.

diff --git a/src/main/java/org/distorted/dialogs/RubikDialogTutorial.java b/src/main/java/org/distorted/dialogs/RubikDialogTutorial.java
index 706754e8..57a4cd39 100644
--- a/src/main/java/org/distorted/dialogs/RubikDialogTutorial.java
+++ b/src/main/java/org/distorted/dialogs/RubikDialogTutorial.java
@@ -100,7 +100,8 @@ public class RubikDialogTutorial extends AppCompatDialogFragment
 
     for(int i=0; i<numObjects; i++)
       {
-      RubikObject object = RubikObjectList.getObject(i);
+      int oOrdinal = RubikObjectList.getObjectOrdinal(i);
+      RubikObject object = RubikObjectList.getObject(oOrdinal);
       ImageView imageView = new ImageView(act);
       imageView.setLayoutParams(paramsView);
       if( object!=null ) object.setIconTo(act,imageView);
diff --git a/src/main/java/org/distorted/dialogs/RubikDialogTutorialView.java b/src/main/java/org/distorted/dialogs/RubikDialogTutorialView.java
index 6247f76a..b3c1d95c 100644
--- a/src/main/java/org/distorted/dialogs/RubikDialogTutorialView.java
+++ b/src/main/java/org/distorted/dialogs/RubikDialogTutorialView.java
@@ -188,7 +188,7 @@ public class RubikDialogTutorialView extends FrameLayout
 
         Bundle bundle = new Bundle();
         bundle.putString(FirebaseAnalytics.Param.CONTENT_TYPE, message);
-        bundle.putString(FirebaseAnalytics.Param.ITEM_NAME, object==null ? "NULL" : object.getName() );
+        bundle.putString(FirebaseAnalytics.Param.ITEM_NAME, object==null ? "NULL" : object.getLowerName() );
         analytics.logEvent(FirebaseAnalytics.Event.TUTORIAL_BEGIN, bundle);
         }
       }
diff --git a/src/main/java/org/distorted/dialogs/RubikDialogUpdateView.java b/src/main/java/org/distorted/dialogs/RubikDialogUpdateView.java
index 2cbe325f..3c8c0b58 100644
--- a/src/main/java/org/distorted/dialogs/RubikDialogUpdateView.java
+++ b/src/main/java/org/distorted/dialogs/RubikDialogUpdateView.java
@@ -36,7 +36,10 @@ import org.distorted.external.RubikFiles;
 import org.distorted.main.R;
 import org.distorted.external.RubikNetwork;
 import org.distorted.external.RubikUpdates;
+import org.distorted.objectlib.json.JsonReader;
 import org.distorted.objects.RubikObjectList;
+import org.distorted.screens.RubikScreenPlay;
+import org.distorted.screens.ScreenList;
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
@@ -121,6 +124,8 @@ public class RubikDialogUpdateView implements RubikNetwork.Downloadee
       Activity act = mAct.get();
       RubikFiles files = RubikFiles.getInstance();
       mIconSaved = files.saveIcon(act,mInfo.mIcon, name);
+
+      android.util.Log.e("D", "Saving icon "+name+" to a file "+mIconSaved);
       }
     }
 
@@ -156,6 +161,14 @@ public class RubikDialogUpdateView implements RubikNetwork.Downloadee
         String name = mInfo.mObjectShortName + "_object.json";
         Activity act = mAct.get();
         oSuccess = files.saveFile(act,mInfo.mObjectStream, name);
+
+        android.util.Log.e("D", "Saving JSON "+name+" to a file "+oSuccess);
+
+        JsonReader reader = JsonReader.getInstance();
+        reader.parseJsonFileMetadata(act,name);
+        mInfo.mNumScrambles = reader.getNumScrambles();
+
+        android.util.Log.e("D", "Read from JSON numScrambles="+mInfo.mNumScrambles);
         }
 
       if( mInfo.mExtrasStream!=null )
@@ -163,18 +176,25 @@ public class RubikDialogUpdateView implements RubikNetwork.Downloadee
         String name = mInfo.mObjectShortName + "_extras.json";
         Activity act = mAct.get();
         eSuccess = files.saveFile(act,mInfo.mExtrasStream, name);
+
+        android.util.Log.e("D", "Saving Extras "+name+" to a file "+eSuccess);
         }
 
       if( mIconSaved || oSuccess || eSuccess )
         {
         mBar.setProgress(75);
         mDescription.setText(R.string.configuring);
-        RubikObjectList.addDownloadedObject(mInfo.mObjectShortName,mIconSaved,oSuccess,eSuccess);
-        mBar.setProgress(100);
-        mDescription.setText(R.string.success);
+        RubikObjectList.addDownloadedObject(mInfo.mObjectShortName,mInfo.mNumScrambles, mInfo.mObjectMinorVersion,
+                                            mInfo.mExtrasMinorVersion, mIconSaved, oSuccess, eSuccess);
 
         RubikNetwork network = RubikNetwork.getInstance();
         network.updateDone(mInfo.mObjectShortName);
+
+        RubikScreenPlay play = (RubikScreenPlay)ScreenList.PLAY.getScreenClass();
+        play.recreatePopup();
+
+        mBar.setProgress(100);
+        mDescription.setText(R.string.success);
         }
       else
         {
diff --git a/src/main/java/org/distorted/external/RubikFiles.java b/src/main/java/org/distorted/external/RubikFiles.java
index 809a043d..e0ac4032 100644
--- a/src/main/java/org/distorted/external/RubikFiles.java
+++ b/src/main/java/org/distorted/external/RubikFiles.java
@@ -66,7 +66,7 @@ public class RubikFiles
       }
     catch(FileNotFoundException ex)
       {
-      // ignore
+      android.util.Log.e("D", "file "+name+" not found: "+ex.getMessage());
       }
 
     return null;
diff --git a/src/main/java/org/distorted/external/RubikNetwork.java b/src/main/java/org/distorted/external/RubikNetwork.java
index b39aae02..52fd3090 100644
--- a/src/main/java/org/distorted/external/RubikNetwork.java
+++ b/src/main/java/org/distorted/external/RubikNetwork.java
@@ -713,6 +713,8 @@ public class RubikNetwork
           String url = mUpdates.getCompletedURL(c);
           icon = downloadIcon(url);
           downloaded = true;
+
+          android.util.Log.e("D", "Downloading icon "+url);
           }
         if( icon!=null )
           {
@@ -736,6 +738,8 @@ public class RubikNetwork
           String url = mUpdates.getStartedURL(s);
           icon = downloadIcon(url);
           downloaded = true;
+
+          android.util.Log.e("D", "Downloading icon "+url);
           }
         if( icon!=null )
           {
@@ -754,6 +758,8 @@ public class RubikNetwork
 
     try
       {
+      android.util.Log.e("D", "Downloading JSON "+url);
+
       java.net.URL connectURL = new URL(url);
       HttpURLConnection conn = (HttpURLConnection) connectURL.openConnection();
       conn.setDoInput(true);
diff --git a/src/main/java/org/distorted/external/RubikScores.java b/src/main/java/org/distorted/external/RubikScores.java
index ae792841..ab35cbfe 100644
--- a/src/main/java/org/distorted/external/RubikScores.java
+++ b/src/main/java/org/distorted/external/RubikScores.java
@@ -168,7 +168,7 @@ public class RubikScores
 
         if( object!=null )
           {
-          builderObj.append(object.getName());
+          builderObj.append(object.getUpperName());
           builderLvl.append(key%MULT);
           builderTim.append(value.record);
           }
@@ -346,7 +346,7 @@ public class RubikScores
 
         if( obj!=null && value!=null && value.record<NO_RECORD )
           {
-          builder.append(obj.getName());
+          builder.append(obj.getUpperName());
           builder.append("=");
           builder.append(value.record);
           builder.append(",");
diff --git a/src/main/java/org/distorted/external/RubikUpdates.java b/src/main/java/org/distorted/external/RubikUpdates.java
index 380af597..9a772521 100644
--- a/src/main/java/org/distorted/external/RubikUpdates.java
+++ b/src/main/java/org/distorted/external/RubikUpdates.java
@@ -41,6 +41,8 @@ public class RubikUpdates
     public final int mIconPresent;
     public final boolean mUpdateObject;
     public final boolean mUpdateExtras;
+
+    public int mNumScrambles;
     public Bitmap mIcon;
     public InputStream mObjectStream;
     public InputStream mExtrasStream;
@@ -59,6 +61,7 @@ public class RubikUpdates
       mUpdateExtras       = updateE;
 
       mIcon = null;
+      mNumScrambles = 0;
       }
     }
 
@@ -115,18 +118,34 @@ public class RubikUpdates
       int objOrdinal = RubikObjectList.getOrdinal(shortName.toUpperCase());
       boolean updateO=true, updateE=true;
 
+android.util.Log.e("D", "downloaded object "+shortName+" oMinor="+oMinor+" eMinor="+eMinor);
+
       if( objOrdinal>=0 )
         {
         int localObjectMinor = RubikObjectList.getLocalObjectMinor(objOrdinal);
         int localExtrasMinor = RubikObjectList.getLocalExtrasMinor(objOrdinal);
         updateO = localObjectMinor<oMinor;
         updateE = localExtrasMinor<eMinor;
+
+
+android.util.Log.e("D", "object exists locally, localObjectMinor="+localObjectMinor+" localExtrasMinor="+localExtrasMinor);
+
         }
       if( updateO || updateE )
         {
         UpdateInfo info = new UpdateInfo(shortName,longName,description,oMinor,eMinor,oPercent,oIcon,updateO,updateE);
-        if(oPercent>=100) mCompleted.add(info);
-        else              mStarted.add(info);
+        if(oPercent>=100)
+          {
+android.util.Log.e("D", "object added to completed");
+
+          mCompleted.add(info);
+          }
+        else
+          {
+android.util.Log.e("D", "object added to started");
+
+          mStarted.add(info);
+          }
         }
       }
     }
diff --git a/src/main/java/org/distorted/main/RubikActivity.java b/src/main/java/org/distorted/main/RubikActivity.java
index 4c36e131..db4d212c 100644
--- a/src/main/java/org/distorted/main/RubikActivity.java
+++ b/src/main/java/org/distorted/main/RubikActivity.java
@@ -459,7 +459,7 @@ public class RubikActivity extends AppCompatActivity
       if( reportChange && oldObject!=null )
         {
         RubikObject robject = RubikObjectList.getObject(newObject);
-        String newName = robject==null ? "NULL" : robject.getName();
+        String newName = robject==null ? "NULL" : robject.getUpperName();
         float fps = view.getRenderer().getFPS();
         fps = (int)(fps+0.5f);
         StringBuilder name = new StringBuilder();
diff --git a/src/main/java/org/distorted/main/RubikObjectLibInterface.java b/src/main/java/org/distorted/main/RubikObjectLibInterface.java
index 48d1aef0..0d72d29c 100644
--- a/src/main/java/org/distorted/main/RubikObjectLibInterface.java
+++ b/src/main/java/org/distorted/main/RubikObjectLibInterface.java
@@ -105,7 +105,7 @@ public class RubikObjectLibInterface implements ObjectLibInterface
     int level   = play.getLevel();
     String name = scores.getName();
     RubikObject obj = RubikObjectList.getObject(object);
-    String objName = obj==null ? "NULL" : obj.getName();
+    String objName = obj==null ? "NULL" : obj.getUpperName();
 
     String record = objName+" level "+level+" time "+mNewRecord+" isNew: "+mIsNewRecord+" scrambleNum: "+scrambleNum;
 
diff --git a/src/main/java/org/distorted/objects/RubikObject.java b/src/main/java/org/distorted/objects/RubikObject.java
index d20207ad..b098b2d0 100644
--- a/src/main/java/org/distorted/objects/RubikObject.java
+++ b/src/main/java/org/distorted/objects/RubikObject.java
@@ -23,11 +23,14 @@ import java.io.InputStream;
 
 import android.app.Activity;
 import android.content.res.Resources;
+import android.graphics.Bitmap;
+import android.graphics.drawable.BitmapDrawable;
 import android.graphics.drawable.Drawable;
 import android.widget.ImageButton;
 import android.widget.ImageView;
 
 import org.distorted.dmesh.ObjectMesh;
+import org.distorted.external.RubikFiles;
 import org.distorted.jsons.ObjectJson;
 import org.distorted.objectlib.json.JsonWriter;
 import org.distorted.objectlib.main.ObjectType;
@@ -39,13 +42,13 @@ import static org.distorted.objectlib.main.TwistyObject.MESH_NICE;
 
 public class RubikObject
 {
-  private final String mName;
-  private final int mNumScramble;
-  private final int mJsonID, mMeshID, mExtrasID;
+  private final String mLowerName, mUpperName;
   private final int mIconID;
   private final String[][] mPatterns;
-  private final int mObjectMinor, mExtrasMinor;
 
+  private int mJsonID, mMeshID, mExtrasID;
+  private int mObjectMinor, mExtrasMinor;
+  private int mNumScramble;
   private int mMeshState;
   private int mExtrasOrdinal;
   private Drawable mIconD;
@@ -56,7 +59,8 @@ public class RubikObject
     {
     int ordinal= type.ordinal();
 
-    mName        = type.name();
+    mUpperName   = type.name();
+    mLowerName   = type.name().toLowerCase();
     mNumScramble = type.getNumScramble();
 
     mIconID      = type.getIconID();
@@ -75,39 +79,73 @@ public class RubikObject
 
     mIconD = null;
     }
-/*
+
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
   RubikObject(RubikObjectList.DownloadedObject object)
     {
-    mName          = object.shortName;
-    mMeshID        = 0;
+    android.util.Log.e("D", "new downloaded RubikObject "+object.shortName+" added");
+
+
+    mLowerName     = object.shortName;
+    mUpperName     = object.shortName.toUpperCase();
+    mNumScramble   = object.numScrambles;
+    mObjectMinor   = object.objectMinor;
+    mExtrasMinor   = object.extrasMinor;
+
     mPatterns      = null;
     mMeshState     = MESH_NICE;
     mExtrasOrdinal = -1;
 
-
-
-    mNumScramble = type.getNumScramble();
-    mObjectMinor = ?
-    mExtrasMinor = ?
-    mIconID      = type.getIconID();
-    mJsonID      = ObjectJson.getObjectJsonID(mOrdinal);
-    mExtrasID    = ObjectJson.getExtrasJsonID(mOrdinal);
+    mMeshID        =  0;
+    mIconID        = -1;
+    mJsonID        = -1;
+    mExtrasID      = -1;
     }
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
-  public void updateObject(RubikObjectList.DownloadedObject object)
+  public boolean updateObject(RubikObjectList.DownloadedObject object)
     {
+    boolean changed = false;
 
+    if( object.objectMinor>JsonWriter.VERSION_OBJECT_MINOR )
+      {
+      android.util.Log.e("D", "Updating RubikObject's "+object.shortName+" main JSON");
+
+      mObjectMinor = object.objectMinor;
+      mNumScramble = object.numScrambles;
+      mMeshID =  0;
+      mJsonID = -1;
+      changed = true;
+      }
+
+    if( object.extrasMinor>JsonWriter.VERSION_EXTRAS_MINOR )
+      {
+      android.util.Log.e("D", "Updating RubikObject's "+object.shortName+" extras JSON");
+
+      mExtrasMinor = object.extrasMinor;
+      mExtrasID = -1;
+      changed = true;
+      }
+
+    return changed;
     }
-*/
+
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
   private void createIconDrawable(Activity act)
     {
-    mIconD = act.getDrawable(mIconID);
+    if( mIconID>0 )
+      {
+      mIconD = act.getDrawable(mIconID);
+      }
+    else
+      {
+      RubikFiles files = RubikFiles.getInstance();
+      Bitmap bmp = files.getIcon(act,mLowerName+".png");
+      mIconD = new BitmapDrawable(act.getResources(), bmp);
+      }
     }
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
@@ -141,9 +179,16 @@ public class RubikObject
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 // PUBLIC API
 
-  public String getName()
+  public String getLowerName()
+    {
+    return mLowerName;
+    }
+
+///////////////////////////////////////////////////////////////////////////////////////////////////
+
+  public String getUpperName()
     {
-    return mName;
+    return mUpperName;
     }
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
@@ -187,11 +232,17 @@ public class RubikObject
 
   public InputStream getObjectStream(Activity act)
     {
-    if( mJsonID!=0 )
+    if( mJsonID>0 )
       {
       Resources res = act.getResources();
       return res.openRawResource(mJsonID);
       }
+    if( mJsonID<0 )
+      {
+      RubikFiles files = RubikFiles.getInstance();
+      return files.openFile(act,mLowerName+"_object.json");
+      }
+
     return null;
     }
 
@@ -199,11 +250,12 @@ public class RubikObject
 
   public InputStream getMeshStream(Activity act)
     {
-    if( mMeshID!=0 )
+    if( mMeshID>0 )
       {
       Resources res = act.getResources();
       return res.openRawResource(mMeshID);
       }
+
     return null;
     }
 
@@ -211,11 +263,17 @@ public class RubikObject
 
   public InputStream getExtrasStream(Activity act)
     {
-    if( mExtrasID!=0 )
+    if( mExtrasID>0 )
       {
       Resources res = act.getResources();
       return res.openRawResource(mExtrasID);
       }
+    if( mExtrasID<0 )
+      {
+      RubikFiles files = RubikFiles.getInstance();
+      return files.openFile(act,mLowerName+"_extras.json");
+      }
+
     return null;
     }
 
diff --git a/src/main/java/org/distorted/objects/RubikObjectList.java b/src/main/java/org/distorted/objects/RubikObjectList.java
index dab5a428..05f815dd 100644
--- a/src/main/java/org/distorted/objects/RubikObjectList.java
+++ b/src/main/java/org/distorted/objects/RubikObjectList.java
@@ -49,10 +49,16 @@ public class RubikObjectList
     {
     String shortName;
     boolean icon,object,extras;
+    int numScrambles, objectMinor, extrasMinor;
 
-    DownloadedObject(String sName, boolean i, boolean o, boolean e)
+    DownloadedObject(String sName, int scrambles, int oMinor, int eMinor, boolean i, boolean o, boolean e)
       {
       shortName = sName;
+
+      numScrambles= scrambles;
+      objectMinor = oMinor;
+      extrasMinor = eMinor;
+
       icon   = i;
       object = o;
       extras = e;
@@ -98,43 +104,56 @@ public class RubikObjectList
       mObjects.add(obj);
       mNumObjects++;
 
+android.util.Log.e("D", "creating local object "+type.name() );
+
       if( obj.hasExtras() )
         {
+        android.util.Log.e("D", "has extras "+mNumExtras );
+
+
         obj.setExtrasOrdinal(mNumExtras);
         mNumExtras++;
+        }
+      else
+        {
+        android.util.Log.e("D", "no extras");
+
         }
       }
     }
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
-  private static void internalAddDownloadedObject(DownloadedObject object)
+  private static boolean internalAddDownloadedObject(DownloadedObject object)
     {
-    /*
-    boolean existsAlready = false;
     String name = object.shortName;
 
     for(RubikObject ro : mObjects )
-      if( ro.getName().equals(name) )
+      if( ro.getLowerName().equals(name) )
         {
-        ro.updateObject(object);
-        existsAlready = true;
-        break;
+        return ro.updateObject(object);
         }
 
-    if( !existsAlready )
+    RubikObject obj = new RubikObject(object);
+    mObjects.add(obj);
+    mNumObjects++;
+
+
+android.util.Log.e("D", "creating downloaded object "+obj.getUpperName() );
+
+    if( obj.hasExtras() )
       {
-      RubikObject obj = new RubikObject(object);
-      mObjects.add(obj);
-      mNumObjects++;
+      android.util.Log.e("D", "has extras "+mNumExtras );
 
-      if( obj.getExtrasJsonID()!=0 )
-        {
-        obj.setExtrasOrdinal(mNumExtras);
-        mNumExtras++;
-        }
+      obj.setExtrasOrdinal(mNumExtras);
+      mNumExtras++;
+      }
+    else
+      {
+      android.util.Log.e("D", "no extras");
       }
-     */
+
+    return true;
     }
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
@@ -167,7 +186,8 @@ public class RubikObjectList
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
-  public static void addDownloadedObject(String shortName, boolean icon, boolean object, boolean extras)
+  public static void addDownloadedObject(String shortName, int numScrambles, int objectMinor, int extrasMinor,
+                                         boolean icon, boolean object, boolean extras)
     {
     for( DownloadedObject obj : mDownloadedObjects )
       {
@@ -177,16 +197,18 @@ public class RubikObjectList
         obj.object|= object;
         obj.extras|= extras;
 
-        android.util.Log.e("D", "UPDATING "+shortName);
+        android.util.Log.e("D", "Updating downloaded object "+shortName);
 
         return;
         }
       }
 
-    DownloadedObject extra = new DownloadedObject(shortName,icon,object,extras);
-    mDownloadedObjects.add(extra);
-
-    internalAddDownloadedObject(extra);
+    DownloadedObject extra = new DownloadedObject(shortName,numScrambles,objectMinor,extrasMinor,icon,object,extras);
+    if ( internalAddDownloadedObject(extra) )
+      {
+      android.util.Log.e("D", "Adding new downloaded object "+shortName);
+      mDownloadedObjects.add(extra);
+      }
     }
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
@@ -208,7 +230,7 @@ public class RubikObjectList
   public static void savePreferences(SharedPreferences.Editor editor)
     {
     RubikObject obj = getObject(mObject);
-    if( obj!=null ) editor.putString("rol_objName", obj.getName() );
+    if( obj!=null ) editor.putString("rol_objName", obj.getUpperName() );
 
     int numDownloaded = mDownloadedObjects.size();
 
@@ -223,6 +245,12 @@ public class RubikObjectList
         DownloadedObject object = mDownloadedObjects.get(i);
         downloadedObjects.append(object.shortName);
         downloadedObjects.append(' ');
+        downloadedObjects.append(object.numScrambles);
+        downloadedObjects.append(' ');
+        downloadedObjects.append(object.objectMinor);
+        downloadedObjects.append(' ');
+        downloadedObjects.append(object.extrasMinor);
+        downloadedObjects.append(' ');
         downloadedObjects.append(object.icon   ? "1":"0");
         downloadedObjects.append(' ');
         downloadedObjects.append(object.object ? "1":"0");
@@ -230,7 +258,10 @@ public class RubikObjectList
         downloadedObjects.append(object.extras ? "1":"0");
         }
 
-      editor.putString("rol_downloaded", downloadedObjects.toString() );
+      String objects = downloadedObjects.toString();
+android.util.Log.e("D", "saving: "+objects);
+
+      editor.putString("rol_downloaded", objects );
       }
     }
 
@@ -244,7 +275,7 @@ public class RubikObjectList
 
       if( obj!=null )
         {
-        String name = obj.getName();
+        String name = obj.getUpperName();
         editor.putInt("rol_"+name, obj.getMeshState() );
         }
       }
@@ -255,7 +286,7 @@ public class RubikObjectList
   public static void restorePreferences(SharedPreferences preferences)
     {
     RubikObject object = getObject(DEF_OBJECT);
-    String defName = object==null ? "CUBE_3" : object.getName();
+    String defName = object==null ? "CUBE_3" : object.getUpperName();
     String objName= preferences.getString("rol_objName",defName);
     mObject = getOrdinal(objName);
 
@@ -273,20 +304,25 @@ public class RubikObjectList
         {
         String[] parts = dObj.split(" ");
 
-        if( parts.length==4 )
+        if( parts.length==7 )
           {
           String name = parts[0];
-          String icon = parts[1];
-          String obje = parts[2];
-          String extr = parts[3];
+          String scra = parts[1];
+          String objM = parts[2];
+          String extM = parts[3];
+          String icon = parts[4];
+          String obje = parts[5];
+          String extr = parts[6];
+
+          int scrambles = Integer.parseInt(scra);
+          int oMinor    = Integer.parseInt(objM);
+          int eMinor    = Integer.parseInt(extM);
 
           boolean bIcon = icon.equals("1");
           boolean bObje = obje.equals("1");
           boolean bExtr = extr.equals("1");
 
-          android.util.Log.e("D", "adding: "+name);
-
-          addDownloadedObject(name,bIcon,bObje,bExtr);
+          addDownloadedObject(name,scrambles,oMinor,eMinor,bIcon,bObje,bExtr);
           }
         }
       }
@@ -302,7 +338,7 @@ public class RubikObjectList
 
       if( obj!=null )
         {
-        String name  = obj.getName();
+        String name  = obj.getUpperName();
         int meshState= preferences.getInt("rol_"+name,MESH_NICE);
         obj.setMeshState(meshState);
         }
@@ -353,11 +389,12 @@ public class RubikObjectList
     {
     if( mThis==null ) mThis = new RubikObjectList();
 
+    String lowerName = name.toLowerCase();
+
     for(int i=0; i<mNumObjects; i++)
       {
       RubikObject obj = mObjects.get(i);
-
-      if( obj.getName().equals(name) ) return i;
+      if( obj.getLowerName().equals(lowerName) ) return i;
       }
 
     return -1;
diff --git a/src/main/java/org/distorted/screens/RubikScreenPlay.java b/src/main/java/org/distorted/screens/RubikScreenPlay.java
index f1d917fc..b5ccb75b 100644
--- a/src/main/java/org/distorted/screens/RubikScreenPlay.java
+++ b/src/main/java/org/distorted/screens/RubikScreenPlay.java
@@ -698,6 +698,13 @@ public class RubikScreenPlay extends RubikScreenBase implements RubikNetwork.Upd
     return mLevelValue;
     }
 
+///////////////////////////////////////////////////////////////////////////////////////////////////
+
+  public void recreatePopup()
+    {
+    mObjectPopup = null;
+    }
+
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
   public boolean shouldReactToEndOfScrambling()
