commit 988e3d33810d44720ea8c68c28e5e44760edbf3c
Author: leszek <leszek@koltunski.pl>
Date:   Wed Mar 13 13:30:15 2024 +0100

    Objects can support or not changing colors of their stickers.

diff --git a/src/main/java/org/distorted/config/ConfigActivity.java b/src/main/java/org/distorted/config/ConfigActivity.java
index 4c08bf87..89fd778a 100644
--- a/src/main/java/org/distorted/config/ConfigActivity.java
+++ b/src/main/java/org/distorted/config/ConfigActivity.java
@@ -47,6 +47,7 @@ public class ConfigActivity extends AppCompatActivity
     private ConfigScreenPane mPane;
     private int mCurrentApiVersion;
     private int mObjectOrdinal;
+    private boolean mSupportsAdjColors;
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
@@ -156,32 +157,37 @@ public class ConfigActivity extends AppCompatActivity
       ConfigSurfaceView view = findViewById(R.id.configSurfaceView);
       view.onResume();
       String key ="";
+      mSupportsAdjColors = false;
 
       if( mObjectOrdinal>=0 && mObjectOrdinal< RubikObjectList.getNumObjects() )
         {
         RubikObject object = RubikObjectList.getObject(mObjectOrdinal);
         changeIfDifferent(object,mObjectOrdinal,view.getObjectControl());
-        if( object!=null ) key = object.getUpperName();
+
+        if( object!=null )
+          {
+          key = object.getUpperName();
+          mSupportsAdjColors = object.supportsAdjustableColors();
+          }
         }
 
       SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(this);
-      restorePreferences(preferences);
+      OSInterface os = view.getInterface();
+      os.setPreferences(preferences);
+
+      restorePreferences();
 
       if( mScreen==null ) mScreen = new ConfigScreen();
       mScreen.onAttachedToWindow(this,mObjectOrdinal);
 
-      ObjectControl control = view.getObjectControl();
-      OSInterface os = view.getInterface();
-      TwistyObject obj = control.getObject();
-
-      mPane = new ConfigScreenPane(this,key,os);
+      mPane = new ConfigScreenPane(this,key,os,mSupportsAdjColors);
       }
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
     void repaintPuzzleFace(int cubit, int face)
       {
-      if( mPane!=null )
+      if( mPane!=null && mSupportsAdjColors )
         {
         int color  = mPane.getCurrentColor();
         ConfigSurfaceView view = findViewById(R.id.configSurfaceView);
@@ -239,11 +245,9 @@ public class ConfigActivity extends AppCompatActivity
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
-    private void restorePreferences(SharedPreferences preferences)
+    private void restorePreferences()
       {
       ConfigSurfaceView view = findViewById(R.id.configSurfaceView);
-      OSInterface os = view.getInterface();
-      os.setPreferences(preferences);
       view.getObjectControl().restoreStickers();
       }
 
diff --git a/src/main/java/org/distorted/config/ConfigScreenPane.java b/src/main/java/org/distorted/config/ConfigScreenPane.java
index 9289b711..aa4d1a88 100644
--- a/src/main/java/org/distorted/config/ConfigScreenPane.java
+++ b/src/main/java/org/distorted/config/ConfigScreenPane.java
@@ -117,6 +117,25 @@ public class ConfigScreenPane
     markButton(mRow,mCol);
     }
 
+///////////////////////////////////////////////////////////////////////////////////////////////////
+
+  private View createColorSection(final ConfigActivity act, int width, int height, boolean supports)
+    {
+    if( supports )
+      {
+      createColorGrid(act,width,height);
+      return mGrid;
+      }
+    else
+      {
+      float textSize = height*TEXT_RATIO;
+      TextView text = new TextView(act);
+      text.setTextSize(TypedValue.COMPLEX_UNIT_PX, textSize);
+      text.setText(R.string.config_no_support);
+      return text;
+      }
+    }
+
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
   private View createView(final Activity act, final int row, final int col)
@@ -144,16 +163,19 @@ public class ConfigScreenPane
 
   private void markButton(int row, int col)
     {
-    int index = mRow*COLORS[0].length + mCol;
-    ImageButton button = (ImageButton)mGrid.getChildAt(index);
-    button.setImageResource(0);
+    if( mGrid!=null )
+      {
+      int index = mRow*COLORS[0].length + mCol;
+      ImageButton button = (ImageButton)mGrid.getChildAt(index);
+      button.setImageResource(0);
 
-    mRow = row;
-    mCol = col;
+      mRow = row;
+      mCol = col;
 
-    index = mRow*COLORS[0].length + mCol;
-    button = (ImageButton)mGrid.getChildAt(index);
-    button.setImageResource(R.drawable.check);
+      index = mRow*COLORS[0].length + mCol;
+      button = (ImageButton)mGrid.getChildAt(index);
+      button.setImageResource(R.drawable.check);
+      }
     }
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
@@ -177,7 +199,7 @@ public class ConfigScreenPane
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
-  ConfigScreenPane(final ConfigActivity act, String key, OSInterface os)
+  ConfigScreenPane(final ConfigActivity act, String key, OSInterface os, boolean supportsAdjColors)
     {
     mRow = 0;
     mCol = 0;
@@ -268,8 +290,8 @@ public class ConfigScreenPane
 
     configLayoutL.setLayoutParams(paramsLayoutL);
 
-    createColorGrid(act, width, height);
+    View view = createColorSection(act, width, height, supportsAdjColors);
     configLayoutL.removeAllViews();
-    configLayoutL.addView(mGrid);
+    configLayoutL.addView(view);
     }
 }
diff --git a/src/main/java/org/distorted/dialogs/RubikDialogUpdateView.java b/src/main/java/org/distorted/dialogs/RubikDialogUpdateView.java
index c695b732..3ed88519 100644
--- a/src/main/java/org/distorted/dialogs/RubikDialogUpdateView.java
+++ b/src/main/java/org/distorted/dialogs/RubikDialogUpdateView.java
@@ -206,6 +206,7 @@ public class RubikDialogUpdateView implements RubikNetwork.Downloadee
           int category        = reader.getCategory();
           int year            = reader.getYearOfInvention();
           String author       = reader.getAuthor();
+          boolean adjColors   = reader.getAdjustableColors();
 
           if( SHOW_DOWNLOADED_DEBUG ) android.util.Log.e("D", "Read from JSON numScrambles="+mInfo.mNumScrambles+" price="+mInfo.mPrice);
 
@@ -224,7 +225,7 @@ public class RubikDialogUpdateView implements RubikNetwork.Downloadee
             if( SHOW_DOWNLOADED_DEBUG ) android.util.Log.e("D", "1");
 
             boolean success = RubikObjectList.addDownloadedObject(act, mInfo.mObjectShortName, mInfo.mNumScrambles, mInfo.mPrice, mInfo.mObjectMinorVersion,
-                                                                  mInfo.mExtrasMinorVersion, mIconSaved, oSuccess, eSuccess, diff, category, year, author);
+                                                                  mInfo.mExtrasMinorVersion, mIconSaved, oSuccess, eSuccess, diff, category, year, author,adjColors);
             if( success )
               {
               if( SHOW_DOWNLOADED_DEBUG ) android.util.Log.e("D", "2");
diff --git a/src/main/java/org/distorted/objects/RubikObject.java b/src/main/java/org/distorted/objects/RubikObject.java
index 41cacf5e..80c2bd80 100644
--- a/src/main/java/org/distorted/objects/RubikObject.java
+++ b/src/main/java/org/distorted/objects/RubikObject.java
@@ -45,6 +45,7 @@ public class RubikObject
   private final int mCategory, mYear;
   private final float mDifficulty;
   private final String mAuthor;
+  private final boolean mAdjColors;
 
   private boolean mIsFree;
   private int mJsonID, mMeshID, mExtrasID;
@@ -73,6 +74,7 @@ public class RubikObject
     mYear        = meta.getYearOfInvention();
     mAuthor      = meta.getAuthor();
     mIsLocal     = false;
+    mAdjColors   = meta.supportsAdjustableStickerColors();
 
     int patternOrdinal  = RubikPatternList.getOrdinal(mObjectOrdinal);
     mPatterns = RubikPatternList.getPatterns(patternOrdinal);
@@ -101,6 +103,7 @@ public class RubikObject
     mCategory      = object.category;
     mYear          = object.year;
     mAuthor        = object.author;
+    mAdjColors     = object.adjColors;
 
     mPatterns      = null;
     mExtrasOrdinal = -1;
@@ -231,6 +234,13 @@ public class RubikObject
     return mExtrasVersion;
     }
 
+///////////////////////////////////////////////////////////////////////////////////////////////////
+
+  public boolean supportsAdjustableColors()
+    {
+    return mAdjColors;
+    }
+
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
   public void setIconTo(Activity act,ImageButton button)
diff --git a/src/main/java/org/distorted/objects/RubikObjectList.java b/src/main/java/org/distorted/objects/RubikObjectList.java
index 0a00d94f..d30d0e2b 100644
--- a/src/main/java/org/distorted/objects/RubikObjectList.java
+++ b/src/main/java/org/distorted/objects/RubikObjectList.java
@@ -37,14 +37,14 @@ public class RubikObjectList
   public static class DownloadedObject
     {
     String shortName;
-    boolean icon,object,extras;
+    boolean icon,object,extras,adjColors;
     int numScrambles, objectVersion, extrasVersion, price;
     int category, year;
     float difficulty;
     String author;
 
     DownloadedObject(String sName, int scrambles, int pr, int oVersion, int eVersion, boolean i,
-                     boolean o, boolean e, float diff, int cat, int y, String a)
+                     boolean o, boolean e, float diff, int cat, int y, String a, boolean c)
       {
       shortName     = sName;
       numScrambles  = scrambles;
@@ -55,6 +55,7 @@ public class RubikObjectList
       category      = cat;
       year          = y;
       author        = a;
+      adjColors     = c;
 
       icon   = i;
       object = o;
@@ -194,7 +195,8 @@ public class RubikObjectList
 // PUBLIC API
 
   public static boolean addDownloadedObject(Context context, String shortName, int numScrambles, int price, int objectVersion,
-                                         int extrasVersion, boolean icon, boolean object, boolean extras, float diff, int category, int year, String author)
+                                         int extrasVersion, boolean icon, boolean object, boolean extras, float diff,
+                                         int category, int year, String author, boolean adjColors)
     {
     if( SHOW_DOWNLOADED_DEBUG ) android.util.Log.e("D", "New downloaded object "+shortName+" icon="+icon+" object="+object+" extras="+extras);
 
@@ -221,7 +223,7 @@ public class RubikObjectList
     if( !object ) objectVersion=-1;
     if( !extras ) extrasVersion=-1;
 
-    DownloadedObject obj = new DownloadedObject(shortName,numScrambles,price,objectVersion,extrasVersion,icon,object,extras,diff,category,year,author);
+    DownloadedObject obj = new DownloadedObject(shortName,numScrambles,price,objectVersion,extrasVersion,icon,object,extras,diff,category,year,author,adjColors);
     if ( internalAddDownloadedObject(obj) )
       {
       if( SHOW_DOWNLOADED_DEBUG ) android.util.Log.e("D", "Adding new downloaded object "+shortName+" icon="+obj.icon+" object="+obj.object+" extras="+obj.extras);
@@ -327,6 +329,8 @@ public class RubikObjectList
         downloadedObjects.append(object.author.replace(' ','_'));
         downloadedObjects.append(' ');
         downloadedObjects.append(object.price);
+        downloadedObjects.append(' ');
+        downloadedObjects.append(object.adjColors ? "1":"0");
         }
 
       String objects = downloadedObjects.toString();
@@ -379,6 +383,7 @@ public class RubikObjectList
           String extr = parts[6];
 
           int price=0,category=0,year=0;
+          boolean supportsAdjColors=true;
           float diff=0.0f;
           String author="";
 
@@ -396,6 +401,11 @@ public class RubikObjectList
             else if( c=='f' ) price = ListObjects.DEFAULT_PRICE_OF_OLD_OBJECTS;
             else              price = Integer.parseInt(parts[11]);
             }
+          if( length>=13 )
+            {
+            char s = parts[12].charAt(0);
+            supportsAdjColors = (s=='1');
+            }
 
           int scrambles = Integer.parseInt(scra);
           int oVersion  = Integer.parseInt(objV);
@@ -405,7 +415,7 @@ public class RubikObjectList
           boolean bObje = obje.equals("1");
           boolean bExtr = extr.equals("1");
 
-          addDownloadedObject(context,name,scrambles,price,oVersion,eVersion,bIcon,bObje,bExtr,diff,category,year,author);
+          addDownloadedObject(context,name,scrambles,price,oVersion,eVersion,bIcon,bObje,bExtr,diff,category,year,author,supportsAdjColors);
           }
         }
       }
diff --git a/src/main/res/values-de/strings.xml b/src/main/res/values-de/strings.xml
index ebaa5cab..8b876b04 100755
--- a/src/main/res/values-de/strings.xml
+++ b/src/main/res/values-de/strings.xml
@@ -88,6 +88,7 @@
     <string name="config_stickers">Aufkleber</string>
     <string name="config_border">Ränder</string>
     <string name="config_corner">Ecken</string>
+    <string name="config_no_support">Das aktuelle Puzzle unterstützt keine Farbanpassung.</string>
 
     <string name="sort_classic">klassisch</string>
     <string name="sort_shape">form</string>
diff --git a/src/main/res/values-es/strings.xml b/src/main/res/values-es/strings.xml
index 35d1a1be..a296bb23 100755
--- a/src/main/res/values-es/strings.xml
+++ b/src/main/res/values-es/strings.xml
@@ -88,6 +88,7 @@
     <string name="config_stickers">Pegatinas</string>
     <string name="config_border">Bordes</string>
     <string name="config_corner">Esquinas</string>
+    <string name="config_no_support">El cubo actual no admite el ajuste de colores.</string>
 
     <string name="sort_classic">clásico</string>
     <string name="sort_shape">forma</string>
diff --git a/src/main/res/values-fr/strings.xml b/src/main/res/values-fr/strings.xml
index f1c4ec5f..3f7ad1db 100755
--- a/src/main/res/values-fr/strings.xml
+++ b/src/main/res/values-fr/strings.xml
@@ -88,6 +88,7 @@
     <string name="config_stickers">Autocollants</string>
     <string name="config_border">Bordures</string>
     <string name="config_corner">Coins</string>
+    <string name="config_no_support">Le cube actuel ne prend pas en charge le réglage des couleurs.</string>
 
     <string name="sort_classic">classique</string>
     <string name="sort_shape">forme</string>
diff --git a/src/main/res/values-ja/strings.xml b/src/main/res/values-ja/strings.xml
index 605b84b3..85f1bd98 100755
--- a/src/main/res/values-ja/strings.xml
+++ b/src/main/res/values-ja/strings.xml
@@ -88,6 +88,7 @@
     <string name="config_stickers">ステッカー</string>
     <string name="config_border">枠線</string>
     <string name="config_corner">角</string>
+    <string name="config_no_support">現在のキューブは色の調整をサポートしていません。</string>
 
     <string name="sort_classic">古典学</string>
     <string name="sort_shape">形</string>
diff --git a/src/main/res/values-ko/strings.xml b/src/main/res/values-ko/strings.xml
index 827d6a08..ed0189ec 100755
--- a/src/main/res/values-ko/strings.xml
+++ b/src/main/res/values-ko/strings.xml
@@ -88,6 +88,7 @@
     <string name="config_stickers">스티커</string>
     <string name="config_border">테두리</string>
     <string name="config_corner">모서리</string>
+    <string name="config_no_support">현재 큐브는 색상 조정을 지원하지 않습니다.</string>
 
     <string name="sort_classic">전통적인</string>
     <string name="sort_shape">모양</string>
diff --git a/src/main/res/values-pl/strings.xml b/src/main/res/values-pl/strings.xml
index 5fba10ff..d79c5783 100644
--- a/src/main/res/values-pl/strings.xml
+++ b/src/main/res/values-pl/strings.xml
@@ -88,6 +88,7 @@
     <string name="config_stickers">Naklejki</string>
     <string name="config_border">Brzegi</string>
     <string name="config_corner">Rogi</string>
+    <string name="config_no_support">Bieżąca kostka nie wspomaga zmieniania kolorów.</string>
 
     <string name="sort_classic">klasycznie</string>
     <string name="sort_shape">kształt</string>
diff --git a/src/main/res/values-ru/strings.xml b/src/main/res/values-ru/strings.xml
index 6e0fe9ab..14bfaef2 100755
--- a/src/main/res/values-ru/strings.xml
+++ b/src/main/res/values-ru/strings.xml
@@ -88,6 +88,7 @@
     <string name="config_stickers">Наклейки</string>
     <string name="config_border">Границы</string>
     <string name="config_corner">Углы</string>
+    <string name="config_no_support">Текущий куб не поддерживает настройку цветов.</string>
 
     <string name="sort_classic">классик</string>
     <string name="sort_shape">форма</string>
diff --git a/src/main/res/values-zh-rCN/strings.xml b/src/main/res/values-zh-rCN/strings.xml
index d2f9e3d6..cabfdd57 100644
--- a/src/main/res/values-zh-rCN/strings.xml
+++ b/src/main/res/values-zh-rCN/strings.xml
@@ -88,6 +88,7 @@
     <string name="config_stickers">贴纸</string>
     <string name="config_border">边框</string>
     <string name="config_corner">角</string>
+    <string name="config_no_support">目前拼图不支持调整颜色。</string>
 
     <string name="sort_classic">經典的</string>
     <string name="sort_shape">形狀</string>
diff --git a/src/main/res/values-zh-rTW/strings.xml b/src/main/res/values-zh-rTW/strings.xml
index 55c2061f..83db0f1a 100644
--- a/src/main/res/values-zh-rTW/strings.xml
+++ b/src/main/res/values-zh-rTW/strings.xml
@@ -88,6 +88,7 @@
     <string name="config_stickers">貼紙</string>
     <string name="config_border">邊框</string>
     <string name="config_corner">角</string>
+    <string name="config_no_support">目前拼圖不支援調整顏色。</string>
 
     <string name="sort_classic">经典的</string>
     <string name="sort_shape">形状</string>
diff --git a/src/main/res/values/strings.xml b/src/main/res/values/strings.xml
index 6475b119..ed31da2e 100644
--- a/src/main/res/values/strings.xml
+++ b/src/main/res/values/strings.xml
@@ -112,6 +112,7 @@
     <string name="config_stickers">Stickers</string>
     <string name="config_border">Borders</string>
     <string name="config_corner">Corners</string>
+    <string name="config_no_support">Current puzzle does not support adjusting colors.</string>
 
     <string name="sort_classic">classic</string>
     <string name="sort_shape">shape</string>
