commit 19e20990cf714fd0f42cd0b27ceae04a66cac031
Author: Leszek Koltunski <leszek@koltunski.pl>
Date:   Thu Nov 20 00:16:31 2025 +0100

    Make it possible to control when to save solves:
    
    - always
    - never
    - aks each time

diff --git a/src/main/java/org/distorted/main/MainActivity.java b/src/main/java/org/distorted/main/MainActivity.java
index 9da09658..27aa3778 100644
--- a/src/main/java/org/distorted/main/MainActivity.java
+++ b/src/main/java/org/distorted/main/MainActivity.java
@@ -63,6 +63,7 @@ public class MainActivity extends BaseActivity implements RubikNetwork.Updatee,
     private int mCurrentObject;
     private MainScrollGrid mGrid;
     private int mSortMode;
+    private int mSaveMode;
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
@@ -209,6 +210,7 @@ public class MainActivity extends BaseActivity implements RubikNetwork.Updatee,
 
       editor.putString("appVersion", mCurrVersion );
       editor.putInt("sortMode", mSortMode);
+      editor.putInt("saveMode", mSaveMode);
 
       RubikObjectList.savePreferences(editor);
       editor.apply();
@@ -221,6 +223,7 @@ public class MainActivity extends BaseActivity implements RubikNetwork.Updatee,
       SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(this);
       mOldVersion = preferences.getString("appVersion","");
       mSortMode = preferences.getInt("sortMode", MainSettingsPopup.SORT_DEFAULT);
+      mSaveMode = preferences.getInt("saveMode", MainSettingsPopup.SAVE_DEFAULT);
 
       RubikObjectList.restorePreferences(this,preferences,justStarted);
       RubikScores scores = RubikScores.getInstance(this);
@@ -383,14 +386,23 @@ public class MainActivity extends BaseActivity implements RubikNetwork.Updatee,
     public void onSettings(View v)
       {
       int sw = (int)(345*mDensity + 0.5f);
-      int sh = (int)(188*mDensity + 0.5f);
+      int sh = (int)(255*mDensity + 0.5f);
 
       int vw = v.getWidth();
 
-      MainSettingsPopup popup = new MainSettingsPopup(this,mSortMode,mCurrentTheme,sw,sh);
+      MainSettingsPopup popup = new MainSettingsPopup(this,mSortMode,mCurrentTheme,mSaveMode,sw,sh);
       popup.displayPopup(this,v,((vw-sw)/2),0);
       }
 
+///////////////////////////////////////////////////////////////////////////////////////////////////
+
+    public void changeSaveTo(int saveMode)
+      {
+      mSaveMode = saveMode;
+
+      // TODO
+      }
+
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
     public void onUpdates(View v)
diff --git a/src/main/java/org/distorted/main/MainSettingsPopup.java b/src/main/java/org/distorted/main/MainSettingsPopup.java
index d408a5bf..40692b9b 100644
--- a/src/main/java/org/distorted/main/MainSettingsPopup.java
+++ b/src/main/java/org/distorted/main/MainSettingsPopup.java
@@ -36,6 +36,7 @@ public class MainSettingsPopup implements AdapterView.OnItemSelectedListener
   public static final int SORT_YEAR       = 4;
 
   public static final int SORT_DEFAULT    = SORT_SHAPE;
+  public static final int SAVE_DEFAULT    = 2;  // ask
 
   private static final int[] mLocation = new int[2];
 
@@ -46,6 +47,8 @@ public class MainSettingsPopup implements AdapterView.OnItemSelectedListener
   private String[] mSortNames;
   private int mCurrTheme;
   private String[] mThemeNames;
+  private int mCurrSave;
+  private String[] mSaveNames;
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 // this is supposed to prevent showing the navigational bar when we show the drop down list,
@@ -83,7 +86,7 @@ public class MainSettingsPopup implements AdapterView.OnItemSelectedListener
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
-  MainSettingsPopup(MainActivity act, int sortMethod, int themeValue, int popupWidth, int popupHeight)
+  MainSettingsPopup(MainActivity act, int sortMethod, int themeValue, int saveValue, int popupWidth, int popupHeight)
     {
     mAct = new WeakReference<>(act);
 
@@ -110,6 +113,7 @@ public class MainSettingsPopup implements AdapterView.OnItemSelectedListener
     title.setBackground(new ColorDrawable(d));
     mPopup.setElevation(100);
 
+    /////// SORT ////////////////////////////////////////////////////
     Spinner sortSpinner  = layout.findViewById(R.id.sortMethod);
     sortSpinner.setOnItemSelectedListener(this);
 
@@ -122,6 +126,7 @@ public class MainSettingsPopup implements AdapterView.OnItemSelectedListener
 
     if( sortMethod>=0 && sortMethod<mSortNames.length ) sortSpinner.setSelection(sortMethod);
 
+    /////// THEME ///////////////////////////////////////////////////
     Spinner themeSpinner  = layout.findViewById(R.id.themeValue);
     themeSpinner.setOnItemSelectedListener(this);
 
@@ -133,6 +138,19 @@ public class MainSettingsPopup implements AdapterView.OnItemSelectedListener
     themeSpinner.setAdapter(themeAdapter);
 
     if( themeValue>=0 && themeValue<mThemeNames.length ) themeSpinner.setSelection(themeValue);
+
+    /////// SAVE ////////////////////////////////////////////////////
+    Spinner saveSpinner  = layout.findViewById(R.id.saveValue);
+    saveSpinner.setOnItemSelectedListener(this);
+
+    mCurrSave = saveValue;
+    buildSaveOptions(act);
+
+    ArrayAdapter<String> saveAdapter = new ArrayAdapter<>(act, R.layout.settings_spinner_item, mSaveNames);
+    saveAdapter.setDropDownViewResource(R.layout.settings_spinner_item);
+    saveSpinner.setAdapter(saveAdapter);
+
+    if( saveValue>=0 && saveValue<mSaveNames.length ) saveSpinner.setSelection(saveValue);
     }
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
@@ -163,6 +181,18 @@ public class MainSettingsPopup implements AdapterView.OnItemSelectedListener
     mThemeNames[4] = res.getString(R.string.theme_orange);
     }
 
+///////////////////////////////////////////////////////////////////////////////////////////////////
+
+  private void buildSaveOptions(MainActivity act)
+    {
+    Resources res = act.getResources();
+    mSaveNames = new String[3];
+
+    mSaveNames[0] = res.getString(R.string.save_always);
+    mSaveNames[1] = res.getString(R.string.save_never);
+    mSaveNames[2] = res.getString(R.string.save_ask);
+    }
+
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 // work around lame bugs in Android's version <= 10 pop-up and split-screen modes
 
@@ -231,6 +261,13 @@ public class MainSettingsPopup implements AdapterView.OnItemSelectedListener
       mAct = null;
       act.changeThemeTo(pos);
       }
+    if( parent.getId()==R.id.saveValue && mCurrSave!=pos )
+      {
+      mPopup.dismiss();
+      mCurrSave = pos;
+      MainActivity act = mAct.get();
+      act.changeSaveTo(pos);
+      }
     }
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
diff --git a/src/main/res/layout/settings_popup.xml b/src/main/res/layout/settings_popup.xml
index 425a2cc6..1bc230fd 100644
--- a/src/main/res/layout/settings_popup.xml
+++ b/src/main/res/layout/settings_popup.xml
@@ -17,7 +17,7 @@
    <GridLayout
         android:layout_width="match_parent"
         android:layout_height="wrap_content"
-        android:rowCount="2"
+        android:rowCount="3"
         android:columnCount="2">
 
         <TextView
@@ -64,5 +64,27 @@
             android:layout_marginBottom="10dp"
             android:popupBackground="?darkC"/>
 
+        <TextView
+            android:id="@+id/saveText"
+            android:layout_marginStart="10dp"
+            android:layout_marginEnd="15dp"
+            android:layout_marginTop="10dp"
+            android:layout_marginBottom="10dp"
+            android:layout_width="wrap_content"
+            android:layout_height="match_parent"
+            android:text="@string/saves"
+            android:textSize="24sp"
+            android:gravity="start|center_vertical"/>
+
+        <Spinner
+            android:id="@+id/saveValue"
+            android:layout_width="wrap_content"
+            android:layout_height="match_parent"
+            android:layout_marginStart="15dp"
+            android:layout_marginEnd="10dp"
+            android:layout_marginTop="10dp"
+            android:layout_marginBottom="10dp"
+            android:popupBackground="?darkC"/>
+
    </GridLayout>
 </LinearLayout>
\ No newline at end of file
diff --git a/src/main/res/layout/settings_popup_android25.xml b/src/main/res/layout/settings_popup_android25.xml
index d238df62..3220d158 100644
--- a/src/main/res/layout/settings_popup_android25.xml
+++ b/src/main/res/layout/settings_popup_android25.xml
@@ -66,5 +66,28 @@
             android:spinnerMode="dialog"
             android:gravity="start|center_vertical"/>
 
+        <TextView
+            android:id="@+id/saveText"
+            android:layout_marginStart="10dp"
+            android:layout_marginEnd="15dp"
+            android:layout_marginTop="10dp"
+            android:layout_marginBottom="10dp"
+            android:layout_width="wrap_content"
+            android:layout_height="match_parent"
+            android:text="@string/saves"
+            android:textSize="24sp"
+            android:gravity="start|center_vertical"/>
+
+        <Spinner
+            android:id="@+id/saveValue"
+            android:layout_width="wrap_content"
+            android:layout_height="match_parent"
+            android:layout_marginStart="15dp"
+            android:layout_marginEnd="10dp"
+            android:layout_marginTop="10dp"
+            android:layout_marginBottom="10dp"
+            android:spinnerMode="dialog"
+            android:gravity="start|center_vertical"/>
+
    </GridLayout>
 </LinearLayout>
\ No newline at end of file
diff --git a/src/main/res/values-de/strings.xml b/src/main/res/values-de/strings.xml
index 049c5281..04f094aa 100755
--- a/src/main/res/values-de/strings.xml
+++ b/src/main/res/values-de/strings.xml
@@ -60,6 +60,10 @@
     <string name="interrupt">Unterbrechen</string>
     <string name="sort_by">Ordnung</string>
     <string name="settings_title">Einstellungen</string>
+    <string name="saves">Speichern</string>
+    <string name="save_ask">Nachfragen</string>
+    <string name="save_always">Immer</string>
+    <string name="save_never">Nie</string>
 
     <string name="object_solver">Löser</string>
     <string name="object_pattern">Muster</string>
diff --git a/src/main/res/values-es/strings.xml b/src/main/res/values-es/strings.xml
index b591b96d..10dd70d1 100755
--- a/src/main/res/values-es/strings.xml
+++ b/src/main/res/values-es/strings.xml
@@ -60,6 +60,10 @@
     <string name="interrupt">Interrumpirlo</string>
     <string name="sort_by">Ordenar</string>
     <string name="settings_title">Ajustes</string>
+    <string name="saves">Guardar</string>
+    <string name="save_ask">Preguntar</string>
+    <string name="save_always">Siempre</string>
+    <string name="save_never">Nunca</string>
 
     <string name="object_solver">Solucionador</string>
     <string name="object_pattern">Patrones</string>
diff --git a/src/main/res/values-fr/strings.xml b/src/main/res/values-fr/strings.xml
index 4d828503..480da188 100755
--- a/src/main/res/values-fr/strings.xml
+++ b/src/main/res/values-fr/strings.xml
@@ -59,6 +59,10 @@
     <string name="interrupt">Interrompre</string>
     <string name="sort_by">Trier par</string>
     <string name="settings_title">Paramètres</string>
+    <string name="saves">Enreg.</string>
+    <string name="save_ask">Demander</string>
+    <string name="save_always">Toujours</string>
+    <string name="save_never">Jamais</string>
 
     <string name="object_solver">Solveur</string>
     <string name="object_pattern">Motifs</string>
diff --git a/src/main/res/values-ja/strings.xml b/src/main/res/values-ja/strings.xml
index 7e5fa952..c9a7797d 100755
--- a/src/main/res/values-ja/strings.xml
+++ b/src/main/res/values-ja/strings.xml
@@ -60,6 +60,10 @@
     <string name="interrupt">割り込み</string>
     <string name="sort_by">並べ替え</string>
     <string name="settings_title">設定</string>
+    <string name="saves">保存</string>
+    <string name="save_ask">確認する</string>
+    <string name="save_always">常に</string>
+    <string name="save_never">しない</string>
 
     <string name="object_solver">ソルバー</string>
     <string name="object_pattern">パターン</string>
diff --git a/src/main/res/values-ko/strings.xml b/src/main/res/values-ko/strings.xml
index 27a2812b..8c78b107 100755
--- a/src/main/res/values-ko/strings.xml
+++ b/src/main/res/values-ko/strings.xml
@@ -60,6 +60,10 @@
     <string name="interrupt">방해하다</string>
     <string name="sort_by">정렬 기준</string>
     <string name="settings_title">설정</string>
+    <string name="saves">저장</string>
+    <string name="save_ask">매번 묻기</string>
+    <string name="save_always">항상</string>
+    <string name="save_never">절대 안 함</string>
 
     <string name="object_solver">솔버</string>
     <string name="object_pattern">패턴</string>
diff --git a/src/main/res/values-pl/strings.xml b/src/main/res/values-pl/strings.xml
index a55672b1..f0dafbad 100644
--- a/src/main/res/values-pl/strings.xml
+++ b/src/main/res/values-pl/strings.xml
@@ -60,6 +60,10 @@
     <string name="interrupt">Przerwij</string>
     <string name="sort_by">Sortuj po</string>
     <string name="settings_title">Ustawienia</string>
+    <string name="saves">Zapisz</string>
+    <string name="save_ask">Pytaj</string>
+    <string name="save_always">Zawsze</string>
+    <string name="save_never">Nigdy</string>
 
     <string name="object_solver">Rozwiązywacz</string>
     <string name="object_pattern">Wzory</string>
diff --git a/src/main/res/values-ru/strings.xml b/src/main/res/values-ru/strings.xml
index d317d62d..3861d35b 100755
--- a/src/main/res/values-ru/strings.xml
+++ b/src/main/res/values-ru/strings.xml
@@ -60,6 +60,10 @@
     <string name="interrupt">Прерви</string>
     <string name="sort_by">Группа по</string>
     <string name="settings_title">Настройки</string>
+    <string name="saves">Сохранить</string>
+    <string name="save_ask">Спрашивать</string>
+    <string name="save_always">Всегда</string>
+    <string name="save_never">Никогда</string>
 
     <string name="object_solver">Решатель</string>
     <string name="object_pattern">Узоры</string>
diff --git a/src/main/res/values-zh-rCN/strings.xml b/src/main/res/values-zh-rCN/strings.xml
index 991e1c9d..ca8ad57c 100644
--- a/src/main/res/values-zh-rCN/strings.xml
+++ b/src/main/res/values-zh-rCN/strings.xml
@@ -59,6 +59,10 @@
     <string name="interrupt">打断</string>
     <string name="sort_by">排序方式</string>
     <string name="settings_title">设置</string>
+    <string name="saves">保存</string>
+    <string name="save_ask">询问</string>
+    <string name="save_always">始终</string>
+    <string name="save_never">从不</string>
 
     <string name="object_solver">求解器</string>
     <string name="object_pattern">图案</string>
diff --git a/src/main/res/values-zh-rTW/strings.xml b/src/main/res/values-zh-rTW/strings.xml
index 3ab50916..2b67a68e 100644
--- a/src/main/res/values-zh-rTW/strings.xml
+++ b/src/main/res/values-zh-rTW/strings.xml
@@ -59,6 +59,10 @@
     <string name="interrupt">打斷</string>
     <string name="sort_by">排序方式</string>
     <string name="settings_title">設定</string>
+    <string name="saves">儲存</string>
+    <string name="save_ask">詢問</string>
+    <string name="save_always">總是</string>
+    <string name="save_never">從不</string>
 
     <string name="object_solver">求解器</string>
     <string name="object_pattern">圖案</string>
diff --git a/src/main/res/values/strings.xml b/src/main/res/values/strings.xml
index fa7a9f49..22e0eeed 100644
--- a/src/main/res/values/strings.xml
+++ b/src/main/res/values/strings.xml
@@ -64,6 +64,10 @@
     <string name="resume">Resume</string>
     <string name="old_solve">Old Solve</string>
     <string name="new_solve">New Solve</string>
+    <string name="saves">Save</string>
+    <string name="save_ask">Ask</string>
+    <string name="save_always">Always</string>
+    <string name="save_never">Never</string>
 
     <string name="stars">Stars</string>
     <string name="scores">High Scores</string>
