commit 314e9ff09d778bc95beb0c1d1f3098b4600cbb32
Author: Leszek Koltunski <leszek@koltunski.pl>
Date:   Sun Jan 30 23:48:29 2022 +0100

    Refactor RubikObject in preparation for creating RubikObjects from DownloadedObjects.

diff --git a/src/main/java/org/distorted/config/ConfigActivity.java b/src/main/java/org/distorted/config/ConfigActivity.java
index 7aee272c..393ed944 100644
--- a/src/main/java/org/distorted/config/ConfigActivity.java
+++ b/src/main/java/org/distorted/config/ConfigActivity.java
@@ -19,6 +19,8 @@
 
 package org.distorted.config;
 
+import java.io.InputStream;
+
 import android.os.Build;
 import android.os.Bundle;
 import android.util.DisplayMetrics;
@@ -26,22 +28,16 @@ import android.view.View;
 import android.view.ViewGroup;
 import android.view.WindowManager;
 import android.widget.LinearLayout;
-
 import androidx.appcompat.app.AppCompatActivity;
-
 import com.google.firebase.analytics.FirebaseAnalytics;
 
-import org.distorted.dialogs.RubikDialogError;
-import org.distorted.dmesh.ObjectMesh;
-import org.distorted.jsons.ObjectJson;
 import org.distorted.library.main.DistortedLibrary;
-import org.distorted.main.R;
 import org.distorted.objectlib.main.ObjectControl;
+import org.distorted.main.R;
+import org.distorted.dialogs.RubikDialogError;
 import org.distorted.objects.RubikObject;
 import org.distorted.objects.RubikObjectList;
 
-import java.io.InputStream;
-
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
 public class ConfigActivity extends AppCompatActivity
@@ -211,15 +207,12 @@ public class ConfigActivity extends AppCompatActivity
       {
       if( object!=null )
         {
-        int jsonID = object.getJsonID();
-        int meshID = object.getMeshID();
-
-        int meshState = object.getMeshState();
+        int ordinal            = object.getOrdinal();
+        int meshState          = object.getMeshState();
+        InputStream jsonStream = object.getObjectStream(this);
+        InputStream meshStream = object.getMeshStream(this);
 
-        InputStream jsonStream = ObjectJson.getObjectStream(jsonID,this);
-        InputStream meshStream = ObjectMesh.getMeshStream(meshID,this);
-
-        control.changeIfDifferent(object.getOrdinal(),meshState,jsonStream,meshStream);
+        control.changeIfDifferent(ordinal,meshState,jsonStream,meshStream);
         }
       }
 
@@ -245,15 +238,12 @@ public class ConfigActivity extends AppCompatActivity
         ConfigSurfaceView view = findViewById(R.id.configSurfaceView);
         ObjectControl control = view.getObjectControl();
 
-        int jsonID = object.getJsonID();
-        int meshID = object.getMeshID();
-
-        int meshState = object.getMeshState();
-
-        InputStream jsonStream = ObjectJson.getObjectStream(jsonID,this);
-        InputStream meshStream = ObjectMesh.getMeshStream(meshID,this);
+        int ordinal            = object.getOrdinal();
+        int meshState          = object.getMeshState();
+        InputStream jsonStream = object.getObjectStream(this);
+        InputStream meshStream = object.getMeshStream(this);
 
-        control.changeObject(object.getOrdinal(),meshState,jsonStream,meshStream);
+        control.changeObject(ordinal,meshState,jsonStream,meshStream);
         }
       }
 
diff --git a/src/main/java/org/distorted/config/ConfigScreen.java b/src/main/java/org/distorted/config/ConfigScreen.java
index dc999418..4dfb723c 100644
--- a/src/main/java/org/distorted/config/ConfigScreen.java
+++ b/src/main/java/org/distorted/config/ConfigScreen.java
@@ -96,12 +96,11 @@ public class ConfigScreen
     for(int object=0; object<numObjects; object++)
       {
       final int ordinal = object;
-      RubikObject rubikObject = RubikObjectList.getObject(ordinal);
-      int icons = rubikObject.getIconID();
+      RubikObject rObject = RubikObjectList.getObject(ordinal);
       int row = object/NUM_COLUMNS;
-
       ImageButton button = new ImageButton(act);
-      button.setBackgroundResource(icons);
+      if( rObject!=null ) rObject.setIconTo(button);
+
       button.setOnClickListener( new View.OnClickListener()
         {
         @Override
diff --git a/src/main/java/org/distorted/config/ConfigScreenPane.java b/src/main/java/org/distorted/config/ConfigScreenPane.java
index ec4162ee..c9ea489e 100644
--- a/src/main/java/org/distorted/config/ConfigScreenPane.java
+++ b/src/main/java/org/distorted/config/ConfigScreenPane.java
@@ -28,7 +28,6 @@ import android.widget.RadioButton;
 import android.widget.RadioGroup;
 import android.widget.TextView;
 
-import org.distorted.jsons.ObjectJson;
 import org.distorted.main.R;
 import org.distorted.objectlib.json.JsonReader;
 import org.distorted.objects.RubikObject;
@@ -76,8 +75,7 @@ public class ConfigScreenPane
     mObjectOrdinal = objectOrdinal;
 
     RubikObject object = RubikObjectList.getObject(objectOrdinal);
-    int jsonID = object.getJsonID();
-    InputStream stream = ObjectJson.getObjectStream(jsonID,act);
+    InputStream stream = object.getObjectStream(act);
     reader.parseJsonFileMetadata(stream);
 
     String name = reader.getObjectName();
diff --git a/src/main/java/org/distorted/dialogs/RubikDialogPattern.java b/src/main/java/org/distorted/dialogs/RubikDialogPattern.java
index 1c08afd9..05a5f823 100644
--- a/src/main/java/org/distorted/dialogs/RubikDialogPattern.java
+++ b/src/main/java/org/distorted/dialogs/RubikDialogPattern.java
@@ -103,10 +103,8 @@ public class RubikDialogPattern extends AppCompatDialogFragment
       {
       int ordinal = RubikPatternList.getObject(i);
       RubikObject object = RubikObjectList.getObject(ordinal);
-      int iconID  = object==null ? 0 : object.getIconID();
-
       ImageView imageView = new ImageView(act);
-      imageView.setImageResource(iconID);
+      if( object!=null ) object.setIconTo(imageView);
       imageView.setLayoutParams(paramsView);
       TabLayout.Tab tab = tabLayout.getTabAt(i);
       if(tab!=null) tab.setCustomView(imageView);
diff --git a/src/main/java/org/distorted/dialogs/RubikDialogScores.java b/src/main/java/org/distorted/dialogs/RubikDialogScores.java
index 6f7d2c1a..bff0e819 100644
--- a/src/main/java/org/distorted/dialogs/RubikDialogScores.java
+++ b/src/main/java/org/distorted/dialogs/RubikDialogScores.java
@@ -115,9 +115,8 @@ public class RubikDialogScores extends AppCompatDialogFragment
     for (int object=0; object<numObjects; object++)
       {
       RubikObject robject = RubikObjectList.getObject(object);
-      int iconID = robject==null ? 0 : robject.getIconID();
       ImageView imageView = new ImageView(act);
-      imageView.setImageResource(iconID);
+      if( robject!=null ) robject.setIconTo(imageView);
       imageView.setLayoutParams(paramsView);
       TabLayout.Tab tab = tabLayout.getTabAt(object);
       if(tab!=null) tab.setCustomView(imageView);
diff --git a/src/main/java/org/distorted/dialogs/RubikDialogTutorial.java b/src/main/java/org/distorted/dialogs/RubikDialogTutorial.java
index be965ce1..db905be0 100644
--- a/src/main/java/org/distorted/dialogs/RubikDialogTutorial.java
+++ b/src/main/java/org/distorted/dialogs/RubikDialogTutorial.java
@@ -101,10 +101,9 @@ public class RubikDialogTutorial extends AppCompatDialogFragment
     for(int i=0; i<numObjects; i++)
       {
       RubikObject object = RubikObjectList.getObject(i);
-      int iconID = object.getIconID();
       ImageView imageView = new ImageView(act);
       imageView.setLayoutParams(paramsView);
-      imageView.setImageResource(iconID);
+      if( object!=null ) object.setIconTo(imageView);
       TabLayout.Tab tab = tabLayout.getTabAt(i);
       if(tab!=null) tab.setCustomView(imageView);
       }
diff --git a/src/main/java/org/distorted/dialogs/RubikDialogTutorialView.java b/src/main/java/org/distorted/dialogs/RubikDialogTutorialView.java
index 55939f2c..6247f76a 100644
--- a/src/main/java/org/distorted/dialogs/RubikDialogTutorialView.java
+++ b/src/main/java/org/distorted/dialogs/RubikDialogTutorialView.java
@@ -70,7 +70,9 @@ public class RubikDialogTutorialView extends FrameLayout
     {
     super(act);
 
-    InputStream jsonStream = RubikObjectList.getExtrasStream(position,act);
+    int objectOrdinal = RubikObjectList.getObjectOrdinal(position);
+    RubikObject robject = RubikObjectList.getObject(objectOrdinal);
+    InputStream jsonStream = robject==null ? null : robject.getExtrasStream(act);
     String[][] tutorials=null;
 
     if( jsonStream!=null )
@@ -95,8 +97,6 @@ public class RubikDialogTutorialView extends FrameLayout
       int colorB = getResources().getColor(R.color.light_grey);
       int colorT = getResources().getColor(R.color.white);
 
-      int objectOrdinal = RubikObjectList.getObjectOrdinal(position);
-
       for (String[] tutorial : tutorials)
         {
         String coun = tutorial[0];
diff --git a/src/main/java/org/distorted/main/RubikActivity.java b/src/main/java/org/distorted/main/RubikActivity.java
index dc946271..4c36e131 100644
--- a/src/main/java/org/distorted/main/RubikActivity.java
+++ b/src/main/java/org/distorted/main/RubikActivity.java
@@ -493,9 +493,9 @@ public class RubikActivity extends AppCompatActivity
       {
       RubikObject object = RubikObjectList.getObject(ordinal);
       int meshState = object!=null ? object.getMeshState() : MESH_NICE;
+      InputStream jsonStream = object==null ? null : object.getObjectStream(this);
+      InputStream meshStream = object==null ? null : object.getMeshStream(this);
 
-      InputStream jsonStream = ObjectJson.getObjectStream(this,ordinal);
-      InputStream meshStream = ObjectMesh.getMeshStream(this,ordinal);
       control.changeIfDifferent(ordinal,meshState,jsonStream,meshStream);
       }
 
diff --git a/src/main/java/org/distorted/objects/RubikObject.java b/src/main/java/org/distorted/objects/RubikObject.java
index 80261a5c..badeecfa 100644
--- a/src/main/java/org/distorted/objects/RubikObject.java
+++ b/src/main/java/org/distorted/objects/RubikObject.java
@@ -19,6 +19,13 @@
 
 package org.distorted.objects;
 
+import java.io.InputStream;
+
+import android.app.Activity;
+import android.content.res.Resources;
+import android.widget.ImageButton;
+import android.widget.ImageView;
+
 import org.distorted.dmesh.ObjectMesh;
 import org.distorted.jsons.ObjectJson;
 import org.distorted.objectlib.json.JsonWriter;
@@ -37,19 +44,20 @@ public class RubikObject
   private final int mJsonID, mMeshID, mExtrasID;
   private final int mIconID;
   private final String[][] mPatterns;
+  private final int mObjectMinor, mExtrasMinor;
 
   private int mMeshState;
   private int mExtrasOrdinal;
-  private int mObjectMinor, mExtrasMinor;
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
   RubikObject(ObjectType type)
     {
-    mIconID      = type.getIconID();
     mName        = type.name();
     mNumScramble = type.getNumScramble();
     mOrdinal     = type.ordinal();
+
+    mIconID      = type.getIconID();
     mJsonID      = ObjectJson.getObjectJsonID(mOrdinal);
     mMeshID      = ObjectMesh.getMeshID(mOrdinal);
     mExtrasID    = ObjectJson.getExtrasJsonID(mOrdinal);
@@ -63,7 +71,37 @@ public class RubikObject
     mObjectMinor = JsonWriter.VERSION_OBJECT_MINOR;
     mExtrasMinor = JsonWriter.VERSION_EXTRAS_MINOR;
     }
+/*
+///////////////////////////////////////////////////////////////////////////////////////////////////
+
+  RubikObject(RubikObjectList.DownloadedObject object)
+    {
+    mName = object.shortName;
+
+    mNumScramble = type.getNumScramble();
+    mOrdinal     = type.ordinal();
+
+    mObjectMinor = ?
+    mExtrasMinor = ?
+
+    mIconID      = type.getIconID();
+    mJsonID      = ObjectJson.getObjectJsonID(mOrdinal);
+    mExtrasID    = ObjectJson.getExtrasJsonID(mOrdinal);
+
+    mMeshID   = 0;
+    mPatterns = null;
+
+    mMeshState = MESH_NICE;
+    mExtrasOrdinal = -1;
+    }
 
+///////////////////////////////////////////////////////////////////////////////////////////////////
+
+  public void updateObject(RubikObjectList.DownloadedObject object)
+    {
+
+    }
+*/
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
   public void setExtrasOrdinal(int ordinal)
@@ -116,30 +154,59 @@ public class RubikObject
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
-  public int getIconID()
+  public void setIconTo(ImageButton button)
+    {
+    button.setBackgroundResource(mIconID);
+    }
+
+///////////////////////////////////////////////////////////////////////////////////////////////////
+
+  public void setIconTo(ImageView view)
+    {
+    view.setImageResource(mIconID);
+    }
+
+///////////////////////////////////////////////////////////////////////////////////////////////////
+
+  public InputStream getObjectStream(Activity act)
     {
-    return mIconID;
+    if( mJsonID!=0 )
+      {
+      Resources res = act.getResources();
+      return res.openRawResource(mJsonID);
+      }
+    return null;
     }
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
-  public int getJsonID()
+  public InputStream getMeshStream(Activity act)
     {
-    return mJsonID;
+    if( mMeshID!=0 )
+      {
+      Resources res = act.getResources();
+      return res.openRawResource(mMeshID);
+      }
+    return null;
     }
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
-  public int getMeshID()
+  public InputStream getExtrasStream(Activity act)
     {
-    return mMeshID;
+    if( mExtrasID!=0 )
+      {
+      Resources res = act.getResources();
+      return res.openRawResource(mExtrasID);
+      }
+    return null;
     }
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
-  public int getExtrasJsonID()
+  public boolean hasExtras()
     {
-    return mExtrasID;
+    return mExtrasID!=0;
     }
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
diff --git a/src/main/java/org/distorted/objects/RubikObjectList.java b/src/main/java/org/distorted/objects/RubikObjectList.java
index 006def66..dab5a428 100644
--- a/src/main/java/org/distorted/objects/RubikObjectList.java
+++ b/src/main/java/org/distorted/objects/RubikObjectList.java
@@ -19,13 +19,10 @@
 
 package org.distorted.objects;
 
-import java.io.InputStream;
 import java.util.ArrayList;
 
-import android.app.Activity;
 import android.content.SharedPreferences;
 
-import org.distorted.jsons.ObjectJson;
 import org.distorted.main.RubikActivity;
 import org.distorted.objectlib.main.ObjectConstants;
 import org.distorted.objectlib.main.ObjectType;
@@ -48,7 +45,7 @@ public class RubikObjectList
   private static ArrayList<RubikObject> mObjects;
   private static int mObject = DEF_OBJECT;
 
-  private static class DownloadedObject
+  public static class DownloadedObject
     {
     String shortName;
     boolean icon,object,extras;
@@ -101,7 +98,7 @@ public class RubikObjectList
       mObjects.add(obj);
       mNumObjects++;
 
-      if( obj.getExtrasJsonID()!=0 )
+      if( obj.hasExtras() )
         {
         obj.setExtrasOrdinal(mNumExtras);
         mNumExtras++;
@@ -113,7 +110,31 @@ public class RubikObjectList
 
   private static void internalAddDownloadedObject(DownloadedObject object)
     {
+    /*
+    boolean existsAlready = false;
+    String name = object.shortName;
+
+    for(RubikObject ro : mObjects )
+      if( ro.getName().equals(name) )
+        {
+        ro.updateObject(object);
+        existsAlready = true;
+        break;
+        }
+
+    if( !existsAlready )
+      {
+      RubikObject obj = new RubikObject(object);
+      mObjects.add(obj);
+      mNumObjects++;
 
+      if( obj.getExtrasJsonID()!=0 )
+        {
+        obj.setExtrasOrdinal(mNumExtras);
+        mNumExtras++;
+        }
+      }
+     */
     }
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
@@ -356,22 +377,6 @@ public class RubikObjectList
     return mNumExtras;
     }
 
-///////////////////////////////////////////////////////////////////////////////////////////////////
-
-  public static InputStream getExtrasStream(int extrasOrdinal, Activity act)
-    {
-    int objectOrdinal = getObjectOrdinal(extrasOrdinal);
-    RubikObject object= getObject(objectOrdinal);
-
-    if( object!=null )
-      {
-      int jsonID = object.getExtrasJsonID();
-      return ObjectJson.getExtrasStream(jsonID,act);
-      }
-
-    return null;
-    }
-
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
   public static int getObjectOrdinal(int extrasOrdinal)
diff --git a/src/main/java/org/distorted/screens/RubikScreenPlay.java b/src/main/java/org/distorted/screens/RubikScreenPlay.java
index d24645a8..d83e105a 100644
--- a/src/main/java/org/distorted/screens/RubikScreenPlay.java
+++ b/src/main/java/org/distorted/screens/RubikScreenPlay.java
@@ -273,13 +273,12 @@ public class RubikScreenPlay extends RubikScreenBase implements RubikNetwork.Upd
 
     for(int object=0; object<numObjects; object++)
       {
-      final RubikObject robject = RubikObjectList.getObject(object);
-      int icons = robject==null ? 0 : robject.getIconID();
+      final int ordinal = object;
+      final RubikObject rObject = RubikObjectList.getObject(object);
       int row = object/NUM_COLUMNS;
-      final int ordinal = robject==null ? 0 : robject.getOrdinal();
-
       ImageButton button = new ImageButton(act);
-      button.setBackgroundResource(icons);
+      if( rObject!=null ) rObject.setIconTo(button);
+
       button.setOnClickListener( new View.OnClickListener()
         {
         @Override
diff --git a/src/main/java/org/distorted/tutorials/TutorialActivity.java b/src/main/java/org/distorted/tutorials/TutorialActivity.java
index 8ce2b405..9e464398 100644
--- a/src/main/java/org/distorted/tutorials/TutorialActivity.java
+++ b/src/main/java/org/distorted/tutorials/TutorialActivity.java
@@ -232,9 +232,9 @@ public class TutorialActivity extends AppCompatActivity
       {
       RubikObject object = RubikObjectList.getObject(ordinal);
       int meshState = object!=null ? object.getMeshState() : MESH_NICE;
+      InputStream jsonStream = object==null ? null : object.getObjectStream(this);
+      InputStream meshStream = object==null ? null : object.getMeshStream(this);
 
-      InputStream jsonStream = ObjectJson.getObjectStream(this,ordinal);
-      InputStream meshStream = ObjectMesh.getMeshStream(this,ordinal);
       control.changeIfDifferent(ordinal,meshState,jsonStream,meshStream);
       }
 
