commit 9f00648149057e0330f9d26ed978a7fe2703a0ef
Author: Leszek Koltunski <leszek@koltunski.pl>
Date:   Wed Jun 30 14:17:38 2021 +0200

    Add a 'give up' dialog - if one made at least 10 moves when solving and presses a 'back' button, one needs to confirm.

diff --git a/src/main/java/org/distorted/dialogs/RubikDialogAbandon.java b/src/main/java/org/distorted/dialogs/RubikDialogAbandon.java
new file mode 100644
index 00000000..422e15db
--- /dev/null
+++ b/src/main/java/org/distorted/dialogs/RubikDialogAbandon.java
@@ -0,0 +1,104 @@
+///////////////////////////////////////////////////////////////////////////////////////////////////
+// Copyright 2020 Leszek Koltunski                                                               //
+//                                                                                               //
+// This file is part of Magic Cube.                                                              //
+//                                                                                               //
+// Magic Cube is free software: you can redistribute it and/or modify                            //
+// it under the terms of the GNU General Public License as published by                          //
+// the Free Software Foundation, either version 2 of the License, or                             //
+// (at your option) any later version.                                                           //
+//                                                                                               //
+// Magic Cube is distributed in the hope that it will be useful,                                 //
+// but WITHOUT ANY WARRANTY; without even the implied warranty of                                //
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the                                 //
+// GNU General Public License for more details.                                                  //
+//                                                                                               //
+// You should have received a copy of the GNU General Public License                             //
+// along with Magic Cube.  If not, see <http://www.gnu.org/licenses/>.                           //
+///////////////////////////////////////////////////////////////////////////////////////////////////
+
+package org.distorted.dialogs;
+
+import android.app.Dialog;
+import android.content.DialogInterface;
+import android.os.Bundle;
+import android.util.DisplayMetrics;
+import android.util.TypedValue;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.Window;
+import android.widget.Button;
+
+import androidx.annotation.NonNull;
+import androidx.appcompat.app.AlertDialog;
+import androidx.appcompat.app.AppCompatDialogFragment;
+import androidx.fragment.app.FragmentActivity;
+
+import org.distorted.main.R;
+import org.distorted.main.RubikActivity;
+import org.distorted.screens.ScreenList;
+
+///////////////////////////////////////////////////////////////////////////////////////////////////
+
+public class RubikDialogAbandon extends AppCompatDialogFragment
+  {
+  @NonNull
+  @Override
+  public Dialog onCreateDialog(Bundle savedInstanceState)
+    {
+    final RubikActivity ract = (RubikActivity)getContext();
+
+    FragmentActivity act = getActivity();
+    LayoutInflater inflater = act.getLayoutInflater();
+    AlertDialog.Builder builder = new AlertDialog.Builder(act);
+
+    DisplayMetrics displaymetrics = new DisplayMetrics();
+    act.getWindowManager().getDefaultDisplay().getMetrics(displaymetrics);
+    final float butSize  = displaymetrics.widthPixels * RubikActivity.DIALOG_BUTTON_SIZE;
+
+    final View view = inflater.inflate(R.layout.abandon_solve, null);
+    builder.setView(view);
+    builder.setCancelable(true);
+
+    builder.setPositiveButton( R.string.yes, new DialogInterface.OnClickListener()
+      {
+      @Override
+      public void onClick(DialogInterface dialog, int which)
+        {
+        ScreenList.goBack(ract);
+        }
+      });
+
+    builder.setNegativeButton( R.string.no, new DialogInterface.OnClickListener()
+      {
+      @Override
+      public void onClick(DialogInterface dialog, int which)
+        {
+        // empty
+        }
+      });
+
+    final Dialog dialog = builder.create();
+    dialog.setCanceledOnTouchOutside(false);
+    Window window = dialog.getWindow();
+
+    if( window!=null )
+      {
+      window.getDecorView().setSystemUiVisibility(RubikActivity.FLAGS);
+      }
+
+    dialog.setOnShowListener(new DialogInterface.OnShowListener()
+      {
+      @Override
+      public void onShow(DialogInterface dialog)
+        {
+        Button btnPositive = ((AlertDialog)dialog).getButton(Dialog.BUTTON_POSITIVE);
+        btnPositive.setTextSize(TypedValue.COMPLEX_UNIT_PX, butSize);
+        Button btnNegative = ((AlertDialog)dialog).getButton(Dialog.BUTTON_NEGATIVE);
+        btnNegative.setTextSize(TypedValue.COMPLEX_UNIT_PX, butSize);
+        }
+      });
+
+    return dialog;
+    }
+  }
diff --git a/src/main/java/org/distorted/helpers/MovesAndLockController.java b/src/main/java/org/distorted/helpers/MovesAndLockController.java
index 972c0b34..5ba9bdea 100644
--- a/src/main/java/org/distorted/helpers/MovesAndLockController.java
+++ b/src/main/java/org/distorted/helpers/MovesAndLockController.java
@@ -232,7 +232,7 @@ public class MovesAndLockController implements MovesFinished
 
   public void addMove(TwistyActivity act, int axis, int row, int angle)
     {
-    if( mMoves.isEmpty()) changeBackMove(act,true);
+    if( mMoves.isEmpty() ) changeBackMove(act,true);
     mMoves.add(new Move(axis,row,angle));
     }
 
@@ -252,6 +252,13 @@ public class MovesAndLockController implements MovesFinished
     changeBackMove(act,false);
     }
 
+///////////////////////////////////////////////////////////////////////////////////////////////////
+
+  public int getNumMoves()
+    {
+    return mMoves.size();
+    }
+
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
   public void setupPrevButton(final TwistyActivity act, final float width)
diff --git a/src/main/java/org/distorted/screens/RubikScreenBase.java b/src/main/java/org/distorted/screens/RubikScreenBase.java
index be4ab6d7..bccea3be 100644
--- a/src/main/java/org/distorted/screens/RubikScreenBase.java
+++ b/src/main/java/org/distorted/screens/RubikScreenBase.java
@@ -37,6 +37,8 @@ abstract class RubikScreenBase extends RubikScreenAbstract
 
   void createBottomPane(final RubikActivity act, float width, ImageButton button)
     {
+    mController.clearMoves(act);
+
     LinearLayout layoutBot = act.findViewById(R.id.lowerBar);
     layoutBot.removeAllViews();
 
diff --git a/src/main/java/org/distorted/screens/RubikScreenSolving.java b/src/main/java/org/distorted/screens/RubikScreenSolving.java
index 8f665113..a926b64a 100644
--- a/src/main/java/org/distorted/screens/RubikScreenSolving.java
+++ b/src/main/java/org/distorted/screens/RubikScreenSolving.java
@@ -27,6 +27,7 @@ import android.widget.ImageButton;
 import android.widget.LinearLayout;
 import android.widget.TextView;
 
+import org.distorted.dialogs.RubikDialogAbandon;
 import org.distorted.helpers.TransparentImageButton;
 import org.distorted.main.R;
 import org.distorted.main.RubikActivity;
@@ -40,6 +41,8 @@ import java.util.TimerTask;
 
 public class RubikScreenSolving extends RubikScreenBase
   {
+  private static final int MOVES_THRESHHOLD = 10;
+
   private TextView mTime;
   private Timer mTimer;
   private long mStartTime;
@@ -98,7 +101,15 @@ public class RubikScreenSolving extends RubikScreenBase
       @Override
       public void onClick(View v)
         {
-        ScreenList.goBack(act);
+        if( mController.getNumMoves() > MOVES_THRESHHOLD )
+          {
+          RubikDialogAbandon abaDiag = new RubikDialogAbandon();
+          abaDiag.show(act.getSupportFragmentManager(), null);
+          }
+        else
+          {
+          ScreenList.goBack(act);
+          }
         }
       });
     }
diff --git a/src/main/res/layout/abandon_solve.xml b/src/main/res/layout/abandon_solve.xml
new file mode 100644
index 00000000..afc04019
--- /dev/null
+++ b/src/main/res/layout/abandon_solve.xml
@@ -0,0 +1,22 @@
+<?xml version="1.0" encoding="utf-8"?>
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+    android:layout_width="fill_parent"
+    android:layout_height="fill_parent"
+    android:layout_marginLeft="10dp"
+    android:layout_marginTop="0dp"
+    android:layout_marginRight="10dp"
+    android:background="@color/grey"
+    android:gravity="center|fill_horizontal">
+
+    <TextView
+        android:id="@+id/privacy_string"
+        android:layout_width="match_parent"
+        android:layout_height="match_parent"
+        android:layout_marginLeft="10dp"
+        android:layout_marginTop="10dp"
+        android:layout_marginRight="10dp"
+        android:layout_marginBottom="10dp"
+        android:gravity="center"
+        android:text="@string/abandon_solve"
+        android:textSize="24sp" />
+</LinearLayout>
diff --git a/src/main/res/values-de/strings.xml b/src/main/res/values-de/strings.xml
index 5b4ab396..a68b1df1 100755
--- a/src/main/res/values-de/strings.xml
+++ b/src/main/res/values-de/strings.xml
@@ -39,6 +39,7 @@
     <string name="solver">3x3x3 Löser</string>
     <string name="tutorials">Lernprogrammen</string>
     <string name="about">Über die App</string>
+    <string name="abandon_solve">Gib auf</string>
 
     <string name="credits1">Open Source App, die mit der Distorted Graphics Library entwickelt wurde. Lizenziert unter <a href="https://www.gnu.org/licenses/old-licenses/gpl-2.0.en.html">GPL Version 2</a> oder wie gewünscht einer späteren Version.</string>
     <string name="credits2">Hübsche Muster von Walter Randelshofer. Sehen Sie <a href="http://www.randelshofer.ch">http://www.randelshofer.ch</a></string>
diff --git a/src/main/res/values-es/strings.xml b/src/main/res/values-es/strings.xml
index cb4442ea..037a83cc 100755
--- a/src/main/res/values-es/strings.xml
+++ b/src/main/res/values-es/strings.xml
@@ -39,6 +39,7 @@
     <string name="solver">Solucionador</string>
     <string name="tutorials">Tutoriales</string>
     <string name="about">Acerca de</string>
+    <string name="abandon_solve">Abandonar</string>
 
     <string name="credits1">Aplicación de código abierto desarrollada con la biblioteca de gráficos de Distorted. Con licencia <a href="https://www.gnu.org/licenses/old-licenses/gpl-2.0.en.html">GPL versión 2</a> o, a tu elección, cualquier versión posterior.</string>
     <string name="credits2">Pretty Patterns por Walter Randelshofer. Mira <a href="http://www.randelshofer.ch">http://www.randelshofer.ch</a></string>
diff --git a/src/main/res/values-fr/strings.xml b/src/main/res/values-fr/strings.xml
index 2828dd85..881fb184 100755
--- a/src/main/res/values-fr/strings.xml
+++ b/src/main/res/values-fr/strings.xml
@@ -39,6 +39,7 @@
     <string name="solver">Solutionneur</string>
     <string name="tutorials">Tutoriels</string>
     <string name="about">À propos de</string>
+    <string name="abandon_solve">Abandonner</string>
 
     <string name="credits1">Appli Open Source développée à l\'aide de la bibliothèque graphique Distorted. Sous licence <a href="https://www.gnu.org/licenses/old-licenses/gpl-2.0.en.html">GPL version 2</a> ou - à votre choix - toute version ultérieure.</string>
     <string name="credits2">Pretty Patterns par Walter Randelshofer. Voir <a href="http://www.randelshofer.ch">http://www.randelshofer.ch</a></string>
diff --git a/src/main/res/values-ja/strings.xml b/src/main/res/values-ja/strings.xml
index a67bbaf2..a929a0e8 100755
--- a/src/main/res/values-ja/strings.xml
+++ b/src/main/res/values-ja/strings.xml
@@ -39,6 +39,7 @@
     <string name="solver">3x3x3 ソルバー</string>
     <string name="tutorials">チュートリアル</string>
     <string name="about">アプリについて</string>
+    <string name="abandon_solve">あきらめる</string>
 
     <string name="credits1">ディストートグラフィックのライブラリを使用して開発されたオープンソースアプリ。<a href="https://www.gnu.org/licenses/old-licenses/gpl-2.0.en.html">GPL バージョン 2</a>でライセンスされているか、または-オプション-それ以降のすべてのバージョン。</string>
     <string name="credits2">Pretty Patterns 沿って Walter Randelshofer. 見る <a href="http://www.randelshofer.ch">http://www.randelshofer.ch</a></string>
diff --git a/src/main/res/values-ko/strings.xml b/src/main/res/values-ko/strings.xml
index a364e86c..d95fd49b 100755
--- a/src/main/res/values-ko/strings.xml
+++ b/src/main/res/values-ko/strings.xml
@@ -39,6 +39,7 @@
     <string name="solver">3x3x3 해결사</string>
     <string name="tutorials">튜토리얼</string>
     <string name="about">정보</string>
+    <string name="abandon_solve">포기</string>
 
     <string name="credits1">왜곡된 그래픽 라이브러리를 사용하여 개발된 오픈 소스 앱. <a href="https://www.gnu.org/licenses/old-licenses/gpl-2.0.en.html">GPL 버전 2</a> 또는 귀하의 선택에 따라 최신 버전으로 라이센스가 부여됩니다.</string>
     <string name="credits2">Pretty Patterns 으로 Walter Randelshofer. 보다 <a href="http://www.randelshofer.ch">http://www.randelshofer.ch</a></string>
diff --git a/src/main/res/values-pl/strings.xml b/src/main/res/values-pl/strings.xml
index a4a648fe..b8f353bc 100644
--- a/src/main/res/values-pl/strings.xml
+++ b/src/main/res/values-pl/strings.xml
@@ -39,6 +39,7 @@
     <string name="solver">Rozwiązywacz</string>
     <string name="tutorials">Tutoriale</string>
     <string name="about">O aplikacji</string>
+    <string name="abandon_solve">Zrezygnuj</string>
 
     <string name="credits1">Aplikacja open-source napisana wykorzystując bibliotekę Distorted. Licencja: <a href="https://www.gnu.org/licenses/old-licenses/gpl-2.0.en.html">GPL wersja 2</a> albo jakakolwiek poźniejsza.</string>
     <string name="credits2">Piękne Wzory Waltera Randelshofera. Zobacz <a href="http://www.randelshofer.ch">http://www.randelshofer.ch</a></string>
diff --git a/src/main/res/values-ru/strings.xml b/src/main/res/values-ru/strings.xml
index 63410ab2..ad0d404a 100755
--- a/src/main/res/values-ru/strings.xml
+++ b/src/main/res/values-ru/strings.xml
@@ -39,6 +39,7 @@
     <string name="solver">Решебник 3х3х3</string>
     <string name="tutorials">Учебники</string>
     <string name="about">О нас</string>
+    <string name="abandon_solve">Сдаться</string>
 
     <string name="credits1">Приложение с открытым исходным кодом, разработанное с использованием библиотеки графики Искажений. Лицензируется согласно <a href="https://www.gnu.org/licenses/old-licenses/gpl-2.0.en.html">версии 2 GPL</a> или любой более поздней версии по вашему выбору.</string>
     <string name="credits2">Pretty Patterns по Walter Randelshofer. Смотри <a href="http://www.randelshofer.ch">http://www.randelshofer.ch</a></string>
diff --git a/src/main/res/values-zh-rCN/strings.xml b/src/main/res/values-zh-rCN/strings.xml
index 067cdb81..aea4021f 100644
--- a/src/main/res/values-zh-rCN/strings.xml
+++ b/src/main/res/values-zh-rCN/strings.xml
@@ -39,6 +39,7 @@
     <string name="solver">3x3x3求解器</string>
     <string name="tutorials">讲解</string>
     <string name="about">关于</string>
+    <string name="abandon_solve">放弃</string>
 
     <string name="credits1">此应用程式原始码开发使用Distorted图型库。根据<a href="https://www.gnu.org/licenses/old-licenses/gpl-2.0.en.html">通用公共许可版本2</a>或者任何更新版本（根据您的选择）进行许可。</string>
     <string name="credits2">Pretty Patterns by Werner Randelshofer. 請看 <a href="http://www.randelshofer.ch">http://www.randelshofer.ch</a></string>
diff --git a/src/main/res/values-zh-rTW/strings.xml b/src/main/res/values-zh-rTW/strings.xml
index 677ded1d..12db4195 100644
--- a/src/main/res/values-zh-rTW/strings.xml
+++ b/src/main/res/values-zh-rTW/strings.xml
@@ -39,6 +39,7 @@
     <string name="solver">3x3x3求解器</string>
     <string name="tutorials">講解</string>
     <string name="about">關於</string>
+    <string name="abandon_solve">放棄</string>
 
     <string name="credits1">此應用程式原始碼開發使用Distorted圖型庫。根據<a href="https://www.gnu.org/licenses/old-licenses/gpl-2.0.en.html">通用公共許可版本2</a>或者任何更新版本（根據您的選擇）進行許可。</string>
     <string name="credits2">Pretty Patterns by Werner Randelshofer. 請看 <a href="http://www.randelshofer.ch">http://www.randelshofer.ch</a></string>
diff --git a/src/main/res/values/strings.xml b/src/main/res/values/strings.xml
index 02cc6c23..b8125f84 100644
--- a/src/main/res/values/strings.xml
+++ b/src/main/res/values/strings.xml
@@ -50,6 +50,7 @@
     <string name="privacy_policy_text" translatable="false">Please see and accept our <a href="https://distorted.org/redmine/projects/magic-cube/wiki/Privacy_policy">Privacy Policy</a></string>
     <string name="accept" translatable="false">Accept</string>
     <string name="decline" translatable="false">Decline</string>
+    <string name="abandon_solve">Give up</string>
 
     <string name="opengl_error" translatable="false">Error</string>
     <string name="opengl_error_text" translatable="false">This device does not support OpenGL 3.0</string>
