commit 93a1c3642f176e848f2b4b5a38f11cbfc8ff40a4
Author: Leszek Koltunski <leszek@koltunski.pl>
Date:   Sat Jan 21 01:02:05 2023 +0100

    Introduce RubikDialogSolvers.

diff --git a/src/main/java/org/distorted/dialogs/RubikDialogSolverView.java b/src/main/java/org/distorted/dialogs/RubikDialogSolverView.java
new file mode 100644
index 00000000..42f3a2ec
--- /dev/null
+++ b/src/main/java/org/distorted/dialogs/RubikDialogSolverView.java
@@ -0,0 +1,74 @@
+///////////////////////////////////////////////////////////////////////////////////////////////////
+// Copyright 2023 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.util.TypedValue;
+import android.view.View;
+import android.widget.Button;
+import android.widget.ImageView;
+import android.widget.LinearLayout;
+import android.widget.TextView;
+
+import org.distorted.main.R;
+import org.distorted.main.RubikActivity;
+import org.distorted.objects.RubikObject;
+import org.distorted.objects.RubikObjectList;
+import org.distorted.screens.ScreenList;
+
+///////////////////////////////////////////////////////////////////////////////////////////////////
+
+public class RubikDialogSolverView
+  {
+  private final View mView;
+
+///////////////////////////////////////////////////////////////////////////////////////////////////
+
+  public RubikDialogSolverView(final RubikActivity act, final RubikDialogSolvers dialog, int object, int title, int desc, boolean implemented, int padding, int fontSize,
+                               LinearLayout.LayoutParams pView, LinearLayout.LayoutParams pText, LinearLayout.LayoutParams pButt )
+    {
+    mView = act.getLayoutInflater().inflate(R.layout.dialog_solvers_pane, null);
+    mView.setLayoutParams(pView);
+    mView.setPadding(padding,padding,padding,padding);
+
+    TextView titleView = mView.findViewById(R.id.solvers_pane_title);
+    titleView.setText(title);
+    TextView descView = mView.findViewById(R.id.solvers_pane_description);
+    descView.setText(desc);
+
+    titleView.setLayoutParams(pText);
+    descView.setLayoutParams(pText);
+
+    ImageView icon = mView.findViewById(R.id.solvers_pane_image);
+    RubikObject robject = RubikObjectList.getObject(object);
+    if( robject!=null ) robject.setIconTo(act,icon);
+
+    Button button = mView.findViewById(R.id.solvers_pane_button);
+
+    button.setOnClickListener( new View.OnClickListener()
+      {
+      @Override
+      public void onClick(View v)
+        {
+        dialog.dismiss();
+        ScreenList.switchScreen(act, ScreenList.SVER);
+        }
+      });
+
+    button.setTextSize(TypedValue.COMPLEX_UNIT_PX, fontSize);
+    button.setLayoutParams(pButt);
+    }
+
+///////////////////////////////////////////////////////////////////////////////////////////////////
+
+  public View getView()
+    {
+    return mView;
+    }
+  }
diff --git a/src/main/java/org/distorted/dialogs/RubikDialogSolvers.java b/src/main/java/org/distorted/dialogs/RubikDialogSolvers.java
new file mode 100644
index 00000000..df5022e0
--- /dev/null
+++ b/src/main/java/org/distorted/dialogs/RubikDialogSolvers.java
@@ -0,0 +1,93 @@
+///////////////////////////////////////////////////////////////////////////////////////////////////
+// Copyright 2022 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.LinearLayout;
+import android.widget.TextView;
+
+import androidx.fragment.app.FragmentActivity;
+
+import org.distorted.main.R;
+import org.distorted.main.RubikActivity;
+import org.distorted.solvers.ImplementedSolversList;
+
+///////////////////////////////////////////////////////////////////////////////////////////////////
+
+public class RubikDialogSolvers extends RubikDialogAbstract
+  {
+  public int getResource()      { return R.layout.dialog_scrollable_panes; }
+  public int getTitleResource() { return R.string.solver; }
+  public boolean hasArgument()  { return false; }
+  public int getPositive()      { return R.string.ok; }
+  public int getNegative()      { return -1; }
+
+///////////////////////////////////////////////////////////////////////////////////////////////////
+
+  public void positiveAction()
+    {
+
+    }
+
+///////////////////////////////////////////////////////////////////////////////////////////////////
+
+  public void negativeAction()
+    {
+
+    }
+
+///////////////////////////////////////////////////////////////////////////////////////////////////
+
+  public void prepareBody(Dialog dialog, View view, FragmentActivity act, float size)
+    {
+    int minH  = (int)(mHeight*0.25f);
+    int margin= (int)(mHeight*0.01f);
+    int sizeH = (int)(mHeight*0.14f);
+    int textH = (int)(sizeH*0.27f);
+    int buttH = (int)(sizeH*0.35f);
+    int padd  = (int)(mHeight*0.01f);
+    int font  = (int)(mHeight*0.02f);
+
+    LinearLayout layout= view.findViewById(R.id.updates_main_layout);
+    TextView text  = view.findViewById(R.id.updates_message);
+    text.setVisibility(View.GONE);
+
+    layout.setMinimumHeight(minH);
+    view.setMinimumHeight(minH);
+
+    LinearLayout.LayoutParams pV = new LinearLayout.LayoutParams( LinearLayout.LayoutParams.MATCH_PARENT, sizeH );
+    pV.setMargins(margin, margin, margin, 0);
+    LinearLayout.LayoutParams pT = new LinearLayout.LayoutParams( LinearLayout.LayoutParams.MATCH_PARENT, textH );
+    LinearLayout.LayoutParams pB = new LinearLayout.LayoutParams( LinearLayout.LayoutParams.MATCH_PARENT, buttH );
+
+    int num = ImplementedSolversList.NUM_OBJECTS;
+    RubikActivity ract = (RubikActivity) getContext();
+
+    for(int i=0; i<num; i++)
+      {
+      ImplementedSolversList solver = ImplementedSolversList.getSolver(i);
+      int object = solver.getObject();
+      int title  = solver.getTitle();
+      int description = solver.getDescription();
+      boolean implemented = solver.isImplemented();
+
+      RubikDialogSolverView pane = new RubikDialogSolverView(ract,this,object,title,description,implemented, padd, font, pV,pT,pB);
+      layout.addView(pane.getView());
+      }
+    }
+
+///////////////////////////////////////////////////////////////////////////////////////////////////
+
+  public static String getDialogTag()
+    {
+    return "DialogSolvers";
+    }
+  }
diff --git a/src/main/java/org/distorted/dialogs/RubikDialogUpdates.java b/src/main/java/org/distorted/dialogs/RubikDialogUpdates.java
index 5e2d830b..cece5533 100644
--- a/src/main/java/org/distorted/dialogs/RubikDialogUpdates.java
+++ b/src/main/java/org/distorted/dialogs/RubikDialogUpdates.java
@@ -35,7 +35,7 @@ public class RubikDialogUpdates extends RubikDialogAbstract implements RubikNetw
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
-  public int getResource()      { return R.layout.dialog_updates; }
+  public int getResource()      { return R.layout.dialog_scrollable_panes; }
   public int getTitleResource() { return R.string.updates; }
   public boolean hasArgument()  { return false; }
   public int getPositive()      { return R.string.ok; }
diff --git a/src/main/java/org/distorted/screens/RubikScreenPlay.java b/src/main/java/org/distorted/screens/RubikScreenPlay.java
index 75c30a5c..d182b818 100644
--- a/src/main/java/org/distorted/screens/RubikScreenPlay.java
+++ b/src/main/java/org/distorted/screens/RubikScreenPlay.java
@@ -30,6 +30,7 @@ import android.widget.PopupWindow;
 import android.widget.RelativeLayout;
 import android.widget.TextView;
 
+import org.distorted.dialogs.RubikDialogSolvers;
 import org.distorted.dialogs.RubikDialogStarsStatus;
 import org.distorted.dialogs.RubikDialogUpdates;
 import org.distorted.external.RubikNetwork;
@@ -380,6 +381,19 @@ public class RubikScreenPlay extends RubikScreenBase implements RubikNetwork.Upd
       stars.setVisibility(GONE);
       }
 
+    Button solver = layout.findViewById(R.id.menuSolver);
+    solver.setTextSize(TypedValue.COMPLEX_UNIT_PX, mMenuTextSize);
+    solver.setOnClickListener( new View.OnClickListener()
+        {
+        @Override
+        public void onClick(View v)
+          {
+          mMenuPopup.dismiss();
+          RubikDialogSolvers solvers = new RubikDialogSolvers();
+          solvers.show(act.getSupportFragmentManager(), RubikDialogSolvers.getDialogTag() );
+          }
+        });
+
     Button highScores = layout.findViewById(R.id.menuHighScores);
     highScores.setTextSize(TypedValue.COMPLEX_UNIT_PX, mMenuTextSize);
     highScores.setOnClickListener( new View.OnClickListener()
@@ -409,18 +423,6 @@ public class RubikScreenPlay extends RubikScreenBase implements RubikNetwork.Upd
           }
         });
 
-    Button solver = layout.findViewById(R.id.menuSolver);
-    solver.setTextSize(TypedValue.COMPLEX_UNIT_PX, mMenuTextSize);
-    solver.setOnClickListener( new View.OnClickListener()
-        {
-        @Override
-        public void onClick(View v)
-          {
-          mMenuPopup.dismiss();
-          ScreenList.switchScreen(act, ScreenList.SVER);
-          }
-        });
-
     Button tutorials = layout.findViewById(R.id.menuTutorials);
     tutorials.setTextSize(TypedValue.COMPLEX_UNIT_PX, mMenuTextSize);
     tutorials.setOnClickListener( new View.OnClickListener()
diff --git a/src/main/java/org/distorted/screens/RubikScreenSolver.java b/src/main/java/org/distorted/screens/RubikScreenSolver.java
index 05f3a4ed..1132362d 100644
--- a/src/main/java/org/distorted/screens/RubikScreenSolver.java
+++ b/src/main/java/org/distorted/screens/RubikScreenSolver.java
@@ -24,6 +24,7 @@ import android.widget.ImageButton;
 import android.widget.LinearLayout;
 
 import org.distorted.objectlib.main.ObjectControl;
+import org.distorted.objectlib.main.ObjectSignatures;
 import org.distorted.objectlib.main.TwistyObject;
 
 import org.distorted.dialogs.RubikDialogSolverError;
@@ -73,7 +74,7 @@ public class RubikScreenSolver extends RubikScreenAbstract
     mWeakAct = new WeakReference<>(act);
     mSolving = false;
 
-    int currentObject= ImplementedSolversList.getObject(0);
+    int currentObject= ObjectSignatures.CUBE_3;//ImplementedSolversList.getObject(0); //TODO
     act.changeIfDifferent(currentObject,control);
     control.solveOnly();
 
diff --git a/src/main/java/org/distorted/solvers/ImplementedSolversList.java b/src/main/java/org/distorted/solvers/ImplementedSolversList.java
index 449d48d0..276cd1ff 100644
--- a/src/main/java/org/distorted/solvers/ImplementedSolversList.java
+++ b/src/main/java/org/distorted/solvers/ImplementedSolversList.java
@@ -9,18 +9,24 @@
 
 package org.distorted.solvers;
 
+import org.distorted.main.R;
 import org.distorted.objectlib.main.ObjectSignatures;
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
 public enum ImplementedSolversList
 {
-  CUBE3 (ObjectSignatures.CUBE_3),
+  CUBE3_KOCIEMBA (ObjectSignatures.CUBE_3, R.string.solver_cube3_title, R.string.solver_cube3_description, true),
+  PYRAMINX       (ObjectSignatures.PYRA_3, R.string.solver_pyra3_title, R.string.solver_pyra3_description, false),
+  IVY            (ObjectSignatures.IVY_2 , R.string.solver_ivy_title, R.string.solver_ivy_description, false),
   ;
 
   public static final int NUM_OBJECTS = values().length;
 
   private final int mObject;
+  private final int mTitle;
+  private final int mDescription;
+  private final boolean mImplemented;
 
   private static final ImplementedSolversList[] objects;
 
@@ -37,15 +43,46 @@ public enum ImplementedSolversList
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
-  public static int getObject(int ordinal)
+  public static ImplementedSolversList getSolver(int ordinal)
     {
-    return objects[ordinal].mObject;
+    return objects[ordinal];
     }
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
-  ImplementedSolversList(int object)
+  ImplementedSolversList(int object, int title, int descripton, boolean implemented)
     {
-    mObject= object;
+    mObject      = object;
+    mTitle       = title;
+    mDescription = descripton;
+    mImplemented = implemented;
+    }
+
+///////////////////////////////////////////////////////////////////////////////////////////////////
+
+  public int getObject()
+    {
+    return mObject;
+    }
+
+///////////////////////////////////////////////////////////////////////////////////////////////////
+
+  public int getTitle()
+    {
+    return mTitle;
+    }
+
+///////////////////////////////////////////////////////////////////////////////////////////////////
+
+  public int getDescription()
+    {
+    return mDescription;
+    }
+
+///////////////////////////////////////////////////////////////////////////////////////////////////
+
+  public boolean isImplemented()
+    {
+    return mImplemented;
     }
 }
diff --git a/src/main/res/layout/dialog_scrollable_panes.xml b/src/main/res/layout/dialog_scrollable_panes.xml
new file mode 100644
index 00000000..f01de2c4
--- /dev/null
+++ b/src/main/res/layout/dialog_scrollable_panes.xml
@@ -0,0 +1,25 @@
+<?xml version="1.0" encoding="utf-8"?>
+<ScrollView xmlns:android="http://schemas.android.com/apk/res/android"
+    android:id="@+id/updates_scroll"
+    android:layout_width="match_parent"
+    android:layout_height="match_parent"
+    android:paddingLeft="10dp"
+    android:paddingRight="10dp">
+
+    <LinearLayout
+        android:id="@+id/updates_main_layout"
+        android:layout_width="match_parent"
+        android:layout_height="wrap_content"
+        android:background="@color/black"
+        android:paddingBottom="8dp"
+        android:orientation="vertical">
+
+        <TextView
+            android:id="@+id/updates_message"
+            android:layout_width="match_parent"
+            android:layout_height="match_parent"
+            android:gravity="center"/>
+
+    </LinearLayout>
+
+</ScrollView>
\ No newline at end of file
diff --git a/src/main/res/layout/dialog_solvers_pane.xml b/src/main/res/layout/dialog_solvers_pane.xml
new file mode 100644
index 00000000..a8bbcc52
--- /dev/null
+++ b/src/main/res/layout/dialog_solvers_pane.xml
@@ -0,0 +1,57 @@
+<?xml version="1.0" encoding="utf-8"?>
+<LinearLayout
+	xmlns:android="http://schemas.android.com/apk/res/android"
+	android:layout_width="match_parent"
+	android:layout_height="wrap_content"
+	android:background="@color/medium_grey"
+	android:padding="8dp"
+	android:orientation="horizontal">
+
+    <LinearLayout
+   		android:layout_width="0dp"
+ 		android:layout_height="match_parent"
+ 		android:orientation="horizontal"
+ 		android:layout_weight="0.5">
+
+   	    <ImageView
+   	        android:id="@+id/solvers_pane_image"
+   	        android:scaleType="fitCenter"
+   		    android:layout_width="match_parent"
+   		    android:layout_height="match_parent"/>
+    </LinearLayout>
+
+   	<LinearLayout
+   		android:layout_width="0dp"
+ 		android:layout_height="match_parent"
+ 		android:orientation="vertical"
+ 		android:layout_marginStart="8dp"
+ 		android:layout_weight="1.0">
+
+		<TextView
+    		android:id="@+id/solvers_pane_title"
+    		android:gravity="top|start"
+    		android:layout_width="match_parent"
+    		android:layout_height="wrap_content"
+    		android:singleLine="true"
+    		android:textStyle="bold"/>
+
+        <TextView
+    		android:id="@+id/solvers_pane_description"
+    		android:gravity="top|start"
+    		android:layout_width="wrap_content"
+    		android:layout_height="wrap_content"
+    		android:singleLine="true"/>
+
+    	<Button
+             android:id="@+id/solvers_pane_button"
+             android:layout_width="match_parent"
+             android:layout_height="wrap_content"
+             android:backgroundTint="@color/black"
+             android:minHeight="0dp"
+             android:minWidth="0dp"
+             android:insetTop="0dp"
+             android:insetBottom="0dp"
+             android:text="@string/use_solver"/>
+
+ 	</LinearLayout>
+</LinearLayout>
\ No newline at end of file
diff --git a/src/main/res/layout/dialog_updates.xml b/src/main/res/layout/dialog_updates.xml
deleted file mode 100644
index f01de2c4..00000000
--- a/src/main/res/layout/dialog_updates.xml
+++ /dev/null
@@ -1,25 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<ScrollView xmlns:android="http://schemas.android.com/apk/res/android"
-    android:id="@+id/updates_scroll"
-    android:layout_width="match_parent"
-    android:layout_height="match_parent"
-    android:paddingLeft="10dp"
-    android:paddingRight="10dp">
-
-    <LinearLayout
-        android:id="@+id/updates_main_layout"
-        android:layout_width="match_parent"
-        android:layout_height="wrap_content"
-        android:background="@color/black"
-        android:paddingBottom="8dp"
-        android:orientation="vertical">
-
-        <TextView
-            android:id="@+id/updates_message"
-            android:layout_width="match_parent"
-            android:layout_height="match_parent"
-            android:gravity="center"/>
-
-    </LinearLayout>
-
-</ScrollView>
\ 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 c8d7d579..96381527 100755
--- a/src/main/res/values-de/strings.xml
+++ b/src/main/res/values-de/strings.xml
@@ -43,6 +43,11 @@
     <string name="settings">Scramble-Einstellungen</string>
     <string name="depth">Tiefe</string>
     <string name="animation">Animation</string>
+    <string name="updates">Aktualisierungen</string>
+    <string name="no_updates">Nicht gefunden</string>
+    <string name="install">Installieren</string>
+    <string name="abandon_solve">Give up</string>
+    <string name="use_solver">Benutze</string>
 
     <string name="stars">Sterne</string>
     <string name="scores">Highscores</string>
@@ -52,10 +57,6 @@
     <string name="tutorials">Lernprogrammen</string>
     <string name="about">Über die App</string>
     <string name="bandaged">Bandaged</string>
-    <string name="updates">Aktualisierungen</string>
-    <string name="no_updates">Nicht gefunden</string>
-    <string name="install">Installieren</string>
-    <string name="abandon_solve">Gib auf</string>
 
     <string name="buy_one">Diesen Würfel freischalten</string>
     <string name="buy_all">Alle Würfel freischalten</string>
diff --git a/src/main/res/values-es/strings.xml b/src/main/res/values-es/strings.xml
index f31ffd55..3322f4a0 100755
--- a/src/main/res/values-es/strings.xml
+++ b/src/main/res/values-es/strings.xml
@@ -43,6 +43,11 @@
     <string name="settings">Ajustes del revuelto</string>
     <string name="depth">Profundidad</string>
     <string name="animation">Animación</string>
+    <string name="updates">Actualizaciones</string>
+    <string name="no_updates">Extraviado</string>
+    <string name="install">Instalar</string>
+    <string name="abandon_solve">Abandonar</string>
+    <string name="use_solver">Utilizar</string>
 
     <string name="stars">Estrellas</string>
     <string name="scores">Leaderboard</string>
@@ -52,10 +57,6 @@
     <string name="tutorials">Tutoriales</string>
     <string name="about">Acerca de</string>
     <string name="bandaged">Bandaged</string>
-    <string name="updates">Actualizaciones</string>
-    <string name="no_updates">Extraviado</string>
-    <string name="install">Instalar</string>
-    <string name="abandon_solve">Abandonar</string>
 
     <string name="buy_one">Desbloquear este cubo</string>
     <string name="buy_all">Desbloquear todos los cubos</string>
diff --git a/src/main/res/values-fr/strings.xml b/src/main/res/values-fr/strings.xml
index 3df1569d..9de066c5 100755
--- a/src/main/res/values-fr/strings.xml
+++ b/src/main/res/values-fr/strings.xml
@@ -43,6 +43,11 @@
     <string name="settings">Paramètres de brouillage</string>
     <string name="depth">Profondeur</string>
     <string name="animation">Animation</string>
+    <string name="updates">Mises à jour</string>
+    <string name="no_updates">Pas trouvé</string>
+    <string name="install">Installer</string>
+    <string name="abandon_solve">Abandonner</string>
+    <string name="use_solver">Utiliser</string>
 
     <string name="stars">Étoiles</string>
     <string name="scores">Meilleurs scores</string>
@@ -52,10 +57,6 @@
     <string name="tutorials">Tutoriels</string>
     <string name="about">À propos de</string>
     <string name="bandaged">Bandaged</string>
-    <string name="updates">Mises à jour</string>
-    <string name="no_updates">Pas trouvé</string>
-    <string name="install">Installer</string>
-    <string name="abandon_solve">Abandonner</string>
 
     <string name="buy_one">Déverrouiller ce cube</string>
     <string name="buy_all">Débloquer tous les cubes</string>
diff --git a/src/main/res/values-ja/strings.xml b/src/main/res/values-ja/strings.xml
index ca5ba78d..3848304b 100755
--- a/src/main/res/values-ja/strings.xml
+++ b/src/main/res/values-ja/strings.xml
@@ -43,6 +43,11 @@
     <string name="settings">スクランブルの設定</string>
     <string name="depth">深さ</string>
     <string name="animation">効果</string>
+    <string name="updates">更新</string>
+    <string name="no_updates">見つかりません</string>
+    <string name="install">インストール</string>
+    <string name="abandon_solve">あきらめる</string>
+    <string name="use_solver">使用する</string>
 
     <string name="stars">星</string>
     <string name="scores">ハイスコア</string>
@@ -52,10 +57,7 @@
     <string name="tutorials">チュートリアル</string>
     <string name="about">アプリについて</string>
     <string name="bandaged">包帯</string>
-    <string name="updates">更新</string>
-    <string name="no_updates">見つかりません</string>
-    <string name="install">インストール</string>
-    <string name="abandon_solve">あきらめる</string>
+
 
     <string name="buy_one">このパズルのロックを解除する</string>
     <string name="buy_all">すべてのパズルを解除する</string>
diff --git a/src/main/res/values-ko/strings.xml b/src/main/res/values-ko/strings.xml
index c53ef9d9..46b2ede1 100755
--- a/src/main/res/values-ko/strings.xml
+++ b/src/main/res/values-ko/strings.xml
@@ -43,6 +43,11 @@
     <string name="settings">스크램블 설정</string>
     <string name="depth">깊이</string>
     <string name="animation">효과</string>
+    <string name="updates">업데이트</string>
+    <string name="no_updates">업데이트가 없습니다</string>
+    <string name="install">설치</string>
+    <string name="abandon_solve">포기</string>
+    <string name="use_solver">사용</string>
 
     <string name="stars">별</string>
     <string name="scores">고득점</string>
@@ -52,10 +57,6 @@
     <string name="tutorials">튜토리얼</string>
     <string name="about">정보</string>
     <string name="bandaged">밴디지</string>
-    <string name="updates">업데이트</string>
-    <string name="no_updates">업데이트가 없습니다</string>
-    <string name="install">설치</string>
-    <string name="abandon_solve">포기</string>
 
     <string name="buy_one">이 큐브 잠금 해제</string>
     <string name="buy_all">모든 큐브 잠금 해제</string>
diff --git a/src/main/res/values-pl/strings.xml b/src/main/res/values-pl/strings.xml
index 3640ab2d..9897020d 100644
--- a/src/main/res/values-pl/strings.xml
+++ b/src/main/res/values-pl/strings.xml
@@ -43,6 +43,11 @@
     <string name="settings">Ustawienia Mieszania</string>
     <string name="depth">Głębokość</string>
     <string name="animation">Animacja</string>
+    <string name="updates">Aktualizacje</string>
+    <string name="no_updates">Nie znaleziono</string>
+    <string name="install">Zainstaluj</string>
+    <string name="abandon_solve">Zrezygnuj</string>
+    <string name="use_solver">Użyj</string>
 
     <string name="stars">Gwiazdki</string>
     <string name="scores">Lista najlepszych</string>
@@ -52,10 +57,6 @@
     <string name="tutorials">Tutoriale</string>
     <string name="about">O aplikacji</string>
     <string name="bandaged">Bandaged</string>
-    <string name="updates">Aktualizacje</string>
-    <string name="no_updates">Nie znaleziono</string>
-    <string name="install">Zainstaluj</string>
-    <string name="abandon_solve">Zrezygnuj</string>
 
     <string name="buy_one">Odblokuj tą kostkę</string>
     <string name="buy_all">Odblokuj wszystkie kostki</string>
diff --git a/src/main/res/values-ru/strings.xml b/src/main/res/values-ru/strings.xml
index 7125a176..b865818b 100755
--- a/src/main/res/values-ru/strings.xml
+++ b/src/main/res/values-ru/strings.xml
@@ -43,6 +43,11 @@
     <string name="settings">Настройки скрэмбла</string>
     <string name="depth">Глубина</string>
     <string name="animation">Эффект</string>
+    <string name="updates">Обновления</string>
+    <string name="no_updates">Не найдено</string>
+    <string name="install">Установите</string>
+    <string name="abandon_solve">Сдаться</string>
+    <string name="use_solver">Попробуй</string>
 
     <string name="stars">Звезды</string>
     <string name="scores">Высокие баллы</string>
@@ -52,10 +57,6 @@
     <string name="tutorials">Учебники</string>
     <string name="about">О нас</string>
     <string name="bandaged">Bandaged</string>
-    <string name="updates">Обновления</string>
-    <string name="no_updates">Не найдено</string>
-    <string name="install">Установите</string>
-    <string name="abandon_solve">Сдаться</string>
 
     <string name="buy_one">Разблокируйте этот куб</string>
     <string name="buy_all">Разблокируйте все кубы</string>
diff --git a/src/main/res/values-zh-rCN/strings.xml b/src/main/res/values-zh-rCN/strings.xml
index 16610bd3..d87eef4f 100644
--- a/src/main/res/values-zh-rCN/strings.xml
+++ b/src/main/res/values-zh-rCN/strings.xml
@@ -43,6 +43,11 @@
     <string name="settings">乱码设置</string>
     <string name="depth">深度</string>
     <string name="animation">动画</string>
+    <string name="updates">更新</string>
+    <string name="no_updates">未找到更新</string>
+    <string name="install">安装</string>
+    <string name="abandon_solve">放弃</string>
+    <string name="use_solver">尝试</string>
 
     <string name="stars">星星</string>
     <string name="scores">高分</string>
@@ -52,10 +57,6 @@
     <string name="tutorials">讲解</string>
     <string name="about">关于</string>
     <string name="bandaged">捆绑魔方</string>
-    <string name="updates">更新</string>
-    <string name="no_updates">未找到更新</string>
-    <string name="install">安装</string>
-    <string name="abandon_solve">放弃</string>
 
     <string name="buy_one">解锁这个立方体</string>
     <string name="buy_all">解锁所有立方体</string>
diff --git a/src/main/res/values-zh-rTW/strings.xml b/src/main/res/values-zh-rTW/strings.xml
index 7e5ac4be..9ae43b3a 100644
--- a/src/main/res/values-zh-rTW/strings.xml
+++ b/src/main/res/values-zh-rTW/strings.xml
@@ -43,6 +43,11 @@
     <string name="settings">加擾設置</string>
     <string name="depth">深度</string>
     <string name="animation">動畫</string>
+    <string name="updates">更新</string>
+    <string name="no_updates">未找到更新</string>
+    <string name="install">安裝</string>
+    <string name="abandon_solve">放棄</string>
+    <string name="use_solver">嘗試</string>
 
     <string name="stars">星星</string>
     <string name="scores">高分</string>
@@ -52,10 +57,6 @@
     <string name="tutorials">講解</string>
     <string name="about">關於</string>
     <string name="bandaged">捆绑魔方</string>
-    <string name="updates">更新</string>
-    <string name="no_updates">未找到更新</string>
-    <string name="install">安裝</string>
-    <string name="abandon_solve">放棄</string>
 
     <string name="buy_one">解鎖這個立方體</string>
     <string name="buy_all">解鎖所有立方體</string>
diff --git a/src/main/res/values/strings.xml b/src/main/res/values/strings.xml
index 6ea0a28e..7ab4f885 100644
--- a/src/main/res/values/strings.xml
+++ b/src/main/res/values/strings.xml
@@ -45,6 +45,11 @@
     <string name="settings">Scramble Settings</string>
     <string name="depth">Depth</string>
     <string name="animation">Animation</string>
+    <string name="updates">Updates</string>
+    <string name="no_updates">No update found</string>
+    <string name="install">Install</string>
+    <string name="abandon_solve">Give up</string>
+    <string name="use_solver">Try</string>
 
     <string name="stars">Stars</string>
     <string name="scores">High Scores</string>
@@ -54,9 +59,6 @@
     <string name="tutorials">Tutorials</string>
     <string name="about">About</string>
     <string name="bandaged">Bandaged</string>
-    <string name="updates">Updates</string>
-    <string name="no_updates">No update found</string>
-    <string name="install">Install</string>
 
     <string name="buy_one">Unlock this cube</string>
     <string name="buy_all">Unlock all cubes</string>
@@ -84,7 +86,6 @@
     <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="config_details">Details</string>
     <string name="config_name">Name</string>
@@ -115,6 +116,13 @@
     <string name="color_red">red</string>
     <string name="color_orange">orange</string>
 
+    <string name="solver_cube3_title" translatable="false">Kociemba 3x3 Solver</string>
+    <string name="solver_cube3_description" translatable="false">A near-perfect, instantaneous, two-phase 3x3x3 solver. Author: Herbert Kociemba.</string>
+    <string name="solver_pyra3_title" translatable="false">Pyraminx Solver</string>
+    <string name="solver_pyra3_description" translatable="false">A perfect, instantaneous, tablebase-based Pyraminx solver. Author: Leszek Koltunski.</string>
+    <string name="solver_ivy_title" translatable="false">Ivy Solver</string>
+    <string name="solver_ivy_description" translatable="false">A perfect, instantaneous, tablebase-based Ivy Cube solver. Author: Leszek Koltunski.</string>
+
     <string name="ns_placeholder" translatable="false">+%1$d</string>
     <string name="sq_placeholder" translatable="false">%1$2d.</string>
     <string name="mo_placeholder" translatable="false">%1$d/%2$d</string>
