commit 3551a81802e700013bc6f730a10292db42657cc5
Author: Leszek Koltunski <leszek@koltunski.pl>
Date:   Thu Nov 20 12:08:11 2025 +0100

    actually use the three save modes

diff --git a/src/main/java/org/distorted/dialogs/DialogAbandon.java b/src/main/java/org/distorted/dialogs/DialogAbandon.java
new file mode 100644
index 00000000..bb3df1e6
--- /dev/null
+++ b/src/main/java/org/distorted/dialogs/DialogAbandon.java
@@ -0,0 +1,58 @@
+///////////////////////////////////////////////////////////////////////////////////////////////////
+// Copyright 2020 Leszek Koltunski                                                               //
+//                                                                                               //
+// This file is part of Magic Cube.                                                              //
+//                                                                                               //
+// Magic Cube is proprietary software licensed under an EULA which you should have received      //
+// along with the code. If not, check https://distorted.org/magic/License-Magic-Cube.html        //
+///////////////////////////////////////////////////////////////////////////////////////////////////
+
+package org.distorted.dialogs;
+
+import android.app.Dialog;
+import android.view.View;
+import android.widget.TextView;
+import androidx.fragment.app.FragmentActivity;
+import org.distorted.main.R;
+import org.distorted.play.PlayActivity;
+import org.distorted.play.ScreenList;
+
+///////////////////////////////////////////////////////////////////////////////////////////////////
+
+public class DialogAbandon extends DialogAbstract
+  {
+  public int getResource()      { return R.layout.dialog_message; }
+  public int getTitleResource() { return -1; }
+  public boolean hasArgument()  { return true; }
+  public int getPositive()      { return R.string.yes; }
+  public int getNegative()      { return R.string.no; }
+  public int getNeutral()       { return -1; }
+  public void negativeAction()  { }
+  public void neutralAction()   { }
+
+///////////////////////////////////////////////////////////////////////////////////////////////////
+
+  public void positiveAction()
+    {
+    final PlayActivity act = (PlayActivity)getContext();
+    ScreenList.goBack(act);
+
+    try
+      {
+      int elapsed = Integer.parseInt(mArgument);
+      if( act!=null && elapsed>0 ) act.rememberSolve(elapsed);
+      }
+    catch( NumberFormatException nfe )
+      {
+      android.util.Log.e("D", "DialogAbandon: number format exception: "+mArgument);
+      }
+    }
+
+///////////////////////////////////////////////////////////////////////////////////////////////////
+
+  public void prepareBody(Dialog dialog, View view, FragmentActivity act, float size)
+    {
+    TextView mess = view.findViewById(R.id.dialog_message);
+    mess.setText(R.string.abandon_solve);
+    }
+  }
diff --git a/src/main/java/org/distorted/dialogs/DialogAbstract.java b/src/main/java/org/distorted/dialogs/DialogAbstract.java
index 5383f53f..17057fa5 100644
--- a/src/main/java/org/distorted/dialogs/DialogAbstract.java
+++ b/src/main/java/org/distorted/dialogs/DialogAbstract.java
@@ -14,12 +14,10 @@ import android.content.DialogInterface;
 import android.os.Bundle;
 import android.util.DisplayMetrics;
 import android.util.TypedValue;
-import android.view.Gravity;
 import android.view.LayoutInflater;
 import android.view.View;
 import android.view.Window;
 import android.widget.Button;
-import android.widget.LinearLayout;
 import android.widget.TextView;
 
 import androidx.annotation.NonNull;
diff --git a/src/main/java/org/distorted/main/MainActivity.java b/src/main/java/org/distorted/main/MainActivity.java
index 27aa3778..ff521767 100644
--- a/src/main/java/org/distorted/main/MainActivity.java
+++ b/src/main/java/org/distorted/main/MainActivity.java
@@ -354,6 +354,7 @@ public class MainActivity extends BaseActivity implements RubikNetwork.Updatee,
       intent.putExtra("local", local );
       intent.putExtra("ordinal", ordinal );
       intent.putExtra("elapsed", elapsed);
+      intent.putExtra("savemode", mSaveMode);
 
       if( rot!=null )
         {
@@ -399,8 +400,6 @@ public class MainActivity extends BaseActivity implements RubikNetwork.Updatee,
     public void changeSaveTo(int saveMode)
       {
       mSaveMode = saveMode;
-
-      // TODO
       }
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
diff --git a/src/main/java/org/distorted/main/MainSettingsPopup.java b/src/main/java/org/distorted/main/MainSettingsPopup.java
index 40692b9b..c13dea77 100644
--- a/src/main/java/org/distorted/main/MainSettingsPopup.java
+++ b/src/main/java/org/distorted/main/MainSettingsPopup.java
@@ -34,9 +34,12 @@ public class MainSettingsPopup implements AdapterView.OnItemSelectedListener
   public static final int SORT_DIFFICULTY = 2;
   public static final int SORT_AUTHOR     = 3;
   public static final int SORT_YEAR       = 4;
-
   public static final int SORT_DEFAULT    = SORT_SHAPE;
-  public static final int SAVE_DEFAULT    = 2;  // ask
+
+  public static final int SAVE_ALWAYS     = 0;
+  public static final int SAVE_NEVER      = 1;
+  public static final int SAVE_ASK        = 2;
+  public static final int SAVE_DEFAULT    = SAVE_ASK;
 
   private static final int[] mLocation = new int[2];
 
diff --git a/src/main/java/org/distorted/play/PlayActivity.java b/src/main/java/org/distorted/play/PlayActivity.java
index dd68fe5f..ed3b94d2 100644
--- a/src/main/java/org/distorted/play/PlayActivity.java
+++ b/src/main/java/org/distorted/play/PlayActivity.java
@@ -61,6 +61,7 @@ public class PlayActivity extends BaseActivity implements DialogScores.ScoresInv
     private boolean mObjectLocal, mModeResume;
     private int mObjectOrdinal;
     private int mLevel;
+    private int mSaveMode;
     private boolean mModeFree;
     private boolean mJustStarted;
     private FirebaseAnalytics mFirebaseAnalytics;
@@ -87,6 +88,7 @@ public class PlayActivity extends BaseActivity implements DialogScores.ScoresInv
         mObjectLocal   = b.getBoolean("local");
         mObjectOrdinal = b.getInt("ordinal");
         mElapsed       = b.getInt("elapsed");
+        mSaveMode      = b.getInt("savemode");
 
         if( mElapsed>0 )
           {
@@ -290,6 +292,13 @@ public class PlayActivity extends BaseActivity implements DialogScores.ScoresInv
       }
     }
 
+///////////////////////////////////////////////////////////////////////////////////////////////////
+
+    int getSaveMode()
+      {
+      return mSaveMode;
+      }
+
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
     void OpenGLError()
diff --git a/src/main/java/org/distorted/play/ScreenSolving.java b/src/main/java/org/distorted/play/ScreenSolving.java
index 173f58ee..8d84f578 100644
--- a/src/main/java/org/distorted/play/ScreenSolving.java
+++ b/src/main/java/org/distorted/play/ScreenSolving.java
@@ -11,12 +11,14 @@ package org.distorted.play;
 
 import android.app.Activity;
 import android.content.SharedPreferences;
+import android.os.Bundle;
 import android.util.TypedValue;
 import android.view.LayoutInflater;
 import android.view.View;
 import android.widget.LinearLayout;
 import android.widget.TextView;
 
+import org.distorted.dialogs.DialogAbandon;
 import org.distorted.dialogs.DialogRememberSolve;
 import org.distorted.helpers.RubikScores;
 import org.distorted.helpers.TransparentImageButton;
@@ -25,6 +27,10 @@ import org.distorted.main.R;
 import java.util.Timer;
 import java.util.TimerTask;
 
+import static org.distorted.main.MainSettingsPopup.SAVE_ALWAYS;
+import static org.distorted.main.MainSettingsPopup.SAVE_NEVER;
+import static org.distorted.main.MainSettingsPopup.SAVE_ASK;
+
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
 public class ScreenSolving extends ScreenBase
@@ -77,20 +83,36 @@ public class ScreenSolving extends ScreenBase
     {
     LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT,LinearLayout.LayoutParams.MATCH_PARENT,1.0f);
     mBackButton = new TransparentImageButton(act,R.drawable.ui_back,params);
+    int saveMode = act.getSaveMode();
 
     mBackButton.setOnClickListener( new View.OnClickListener()
       {
       @Override
       public void onClick(View v)
         {
-        if( mMovesController.getNumMoves() > MOVES_THRESHHOLD )
+        if( saveMode==SAVE_ASK )
           {
           DialogRememberSolve abaDiag = new DialogRememberSolve();
           abaDiag.show(act.getSupportFragmentManager(), null);
           }
         else
           {
-          ScreenList.goBack(act);
+          int num = mMovesController.getNumMoves();
+
+          if( num > MOVES_THRESHHOLD )
+            {
+            Bundle bundle = new Bundle();
+            String arg = (saveMode==SAVE_NEVER ? "0" : Integer.toString(stopTimerAndGetRecord()) );
+            bundle.putString("argument", arg );
+            DialogAbandon diag = new DialogAbandon();
+            diag.setArguments(bundle);
+            diag.show( act.getSupportFragmentManager(), null);
+            }
+          else
+            {
+            if( saveMode==SAVE_ALWAYS && num>0 ) act.rememberSolve(stopTimerAndGetRecord());
+            ScreenList.goBack(act);
+            }
           }
         }
       });
