commit eb9850857d5602db3f06d7719c015054cf89186a
Author: Leszek Koltunski <leszek@koltunski.pl>
Date:   Mon Jan 31 00:50:00 2022 +0100

    Refactor RubikObject in preparation for creating RubikObjects from DownloadedObjects.

diff --git a/src/main/java/org/distorted/config/ConfigScreen.java b/src/main/java/org/distorted/config/ConfigScreen.java
index 4dfb723c..ffc450d3 100644
--- a/src/main/java/org/distorted/config/ConfigScreen.java
+++ b/src/main/java/org/distorted/config/ConfigScreen.java
@@ -99,7 +99,7 @@ public class ConfigScreen
       RubikObject rObject = RubikObjectList.getObject(ordinal);
       int row = object/NUM_COLUMNS;
       ImageButton button = new ImageButton(act);
-      if( rObject!=null ) rObject.setIconTo(button);
+      if( rObject!=null ) rObject.setIconTo(act,button);
 
       button.setOnClickListener( new View.OnClickListener()
         {
diff --git a/src/main/java/org/distorted/dialogs/RubikDialogPattern.java b/src/main/java/org/distorted/dialogs/RubikDialogPattern.java
index 05a5f823..f9011cbd 100644
--- a/src/main/java/org/distorted/dialogs/RubikDialogPattern.java
+++ b/src/main/java/org/distorted/dialogs/RubikDialogPattern.java
@@ -104,7 +104,7 @@ public class RubikDialogPattern extends AppCompatDialogFragment
       int ordinal = RubikPatternList.getObject(i);
       RubikObject object = RubikObjectList.getObject(ordinal);
       ImageView imageView = new ImageView(act);
-      if( object!=null ) object.setIconTo(imageView);
+      if( object!=null ) object.setIconTo(act,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 bff0e819..c64ee8c1 100644
--- a/src/main/java/org/distorted/dialogs/RubikDialogScores.java
+++ b/src/main/java/org/distorted/dialogs/RubikDialogScores.java
@@ -116,7 +116,7 @@ public class RubikDialogScores extends AppCompatDialogFragment
       {
       RubikObject robject = RubikObjectList.getObject(object);
       ImageView imageView = new ImageView(act);
-      if( robject!=null ) robject.setIconTo(imageView);
+      if( robject!=null ) robject.setIconTo(act,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 db905be0..706754e8 100644
--- a/src/main/java/org/distorted/dialogs/RubikDialogTutorial.java
+++ b/src/main/java/org/distorted/dialogs/RubikDialogTutorial.java
@@ -103,7 +103,7 @@ public class RubikDialogTutorial extends AppCompatDialogFragment
       RubikObject object = RubikObjectList.getObject(i);
       ImageView imageView = new ImageView(act);
       imageView.setLayoutParams(paramsView);
-      if( object!=null ) object.setIconTo(imageView);
+      if( object!=null ) object.setIconTo(act,imageView);
       TabLayout.Tab tab = tabLayout.getTabAt(i);
       if(tab!=null) tab.setCustomView(imageView);
       }
diff --git a/src/main/java/org/distorted/external/RubikFiles.java b/src/main/java/org/distorted/external/RubikFiles.java
index 2f3235b8..809a043d 100644
--- a/src/main/java/org/distorted/external/RubikFiles.java
+++ b/src/main/java/org/distorted/external/RubikFiles.java
@@ -20,6 +20,8 @@
 package org.distorted.external;
 
 import java.io.File;
+import java.io.FileInputStream;
+import java.io.FileNotFoundException;
 import java.io.FileOutputStream;
 import java.io.IOException;
 import java.io.InputStream;
@@ -54,13 +56,32 @@ public class RubikFiles
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
-  public Bitmap getIcon(Context context, String name)
+  public InputStream openFile(Context context, String name)
     {
     File file = new File(context.getFilesDir(), name);
 
+    try
+      {
+      return new FileInputStream(file);
+      }
+    catch(FileNotFoundException ex)
+      {
+      // ignore
+      }
+
+    return null;
+    }
+
+///////////////////////////////////////////////////////////////////////////////////////////////////
+
+  public Bitmap getIcon(Context context, String name)
+    {
+    File dir  = context.getFilesDir();
+    File file = new File(dir, name);
+
     if( file.exists() )
       {
-      String fname = context.getFilesDir().getAbsolutePath()+"/"+name;
+      String fname = dir.getAbsolutePath()+"/"+name;
       return BitmapFactory.decodeFile(fname);
       }
 
diff --git a/src/main/java/org/distorted/objects/RubikObject.java b/src/main/java/org/distorted/objects/RubikObject.java
index 3f127280..d20207ad 100644
--- a/src/main/java/org/distorted/objects/RubikObject.java
+++ b/src/main/java/org/distorted/objects/RubikObject.java
@@ -23,6 +23,7 @@ import java.io.InputStream;
 
 import android.app.Activity;
 import android.content.res.Resources;
+import android.graphics.drawable.Drawable;
 import android.widget.ImageButton;
 import android.widget.ImageView;
 
@@ -47,6 +48,7 @@ public class RubikObject
 
   private int mMeshState;
   private int mExtrasOrdinal;
+  private Drawable mIconD;
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
@@ -70,6 +72,8 @@ public class RubikObject
 
     mObjectMinor = JsonWriter.VERSION_OBJECT_MINOR;
     mExtrasMinor = JsonWriter.VERSION_EXTRAS_MINOR;
+
+    mIconD = null;
     }
 /*
 ///////////////////////////////////////////////////////////////////////////////////////////////////
@@ -99,6 +103,13 @@ public class RubikObject
 
     }
 */
+///////////////////////////////////////////////////////////////////////////////////////////////////
+
+  private void createIconDrawable(Activity act)
+    {
+    mIconD = act.getDrawable(mIconID);
+    }
+
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
   public void setExtrasOrdinal(int ordinal)
@@ -144,16 +155,32 @@ public class RubikObject
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
-  public void setIconTo(ImageButton button)
+  public int getObjectMinor()
+    {
+    return mObjectMinor;
+    }
+
+///////////////////////////////////////////////////////////////////////////////////////////////////
+
+  public int getExtrasMinor()
+    {
+    return mExtrasMinor;
+    }
+
+///////////////////////////////////////////////////////////////////////////////////////////////////
+
+  public void setIconTo(Activity act,ImageButton button)
     {
-    button.setBackgroundResource(mIconID);
+    if( mIconD==null ) createIconDrawable(act);
+    button.setBackground(mIconD);
     }
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
-  public void setIconTo(ImageView view)
+  public void setIconTo(Activity act,ImageView view)
     {
-    view.setImageResource(mIconID);
+    if( mIconD==null ) createIconDrawable(act);
+    view.setImageDrawable(mIconD);
     }
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
@@ -205,18 +232,4 @@ public class RubikObject
     {
     return mPatterns;
     }
-
-///////////////////////////////////////////////////////////////////////////////////////////////////
-
-  public int getObjectMinor()
-    {
-    return mObjectMinor;
-    }
-
-///////////////////////////////////////////////////////////////////////////////////////////////////
-
-  public int getExtrasMinor()
-    {
-    return mExtrasMinor;
-    }
 }
diff --git a/src/main/java/org/distorted/screens/RubikScreenPlay.java b/src/main/java/org/distorted/screens/RubikScreenPlay.java
index d83e105a..f1d917fc 100644
--- a/src/main/java/org/distorted/screens/RubikScreenPlay.java
+++ b/src/main/java/org/distorted/screens/RubikScreenPlay.java
@@ -277,7 +277,7 @@ public class RubikScreenPlay extends RubikScreenBase implements RubikNetwork.Upd
       final RubikObject rObject = RubikObjectList.getObject(object);
       int row = object/NUM_COLUMNS;
       ImageButton button = new ImageButton(act);
-      if( rObject!=null ) rObject.setIconTo(button);
+      if( rObject!=null ) rObject.setIconTo(act,button);
 
       button.setOnClickListener( new View.OnClickListener()
         {
