commit 2971588c731b7285b9af7d874a3d9c78af2832cf
Author: Leszek Koltunski <leszek@koltunski.pl>
Date:   Thu Nov 19 00:10:42 2020 +0100

    Progress creating the Tutorial Activity.

diff --git a/src/main/java/org/distorted/dialogs/RubikDialogInfo.java b/src/main/java/org/distorted/dialogs/RubikDialogInfo.java
index b32128e1..1605e760 100644
--- a/src/main/java/org/distorted/dialogs/RubikDialogInfo.java
+++ b/src/main/java/org/distorted/dialogs/RubikDialogInfo.java
@@ -21,7 +21,6 @@ package org.distorted.dialogs;
 
 import android.app.Dialog;
 import android.content.DialogInterface;
-import android.content.Intent;
 import android.os.Bundle;
 import android.util.DisplayMetrics;
 import android.util.TypedValue;
@@ -39,7 +38,6 @@ import androidx.fragment.app.FragmentActivity;
 import org.distorted.main.R;
 import org.distorted.main.RubikActivity;
 import org.distorted.objects.TwistyObject;
-import org.distorted.tutorial.TutorialActivity;
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
@@ -75,7 +73,7 @@ public class RubikDialogInfo extends AppCompatDialogFragment
       public void onClick(DialogInterface dialog, int which)
         {
         RubikActivity ract = (RubikActivity)getContext();
-        if( ract!=null ) ract.switchTutorial();
+        if( ract!=null ) ract.switchTutorial("QMzeJobSu1M");
         }
       });
 
diff --git a/src/main/java/org/distorted/main/RubikActivity.java b/src/main/java/org/distorted/main/RubikActivity.java
index 4f29c34c..58c8c54e 100644
--- a/src/main/java/org/distorted/main/RubikActivity.java
+++ b/src/main/java/org/distorted/main/RubikActivity.java
@@ -555,10 +555,10 @@ public class RubikActivity extends AppCompatActivity
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
-    public void switchTutorial()
+    public void switchTutorial(String url)
       {
       Intent myIntent = new Intent(this, TutorialActivity.class);
-    //myIntent.putExtra("", value); //Optional parameters
+      myIntent.putExtra("url", url);
       startActivity(myIntent);
       }
 }
diff --git a/src/main/java/org/distorted/states/RubikStateBase.java b/src/main/java/org/distorted/states/RubikStateBase.java
index aaffdd94..5c602e03 100644
--- a/src/main/java/org/distorted/states/RubikStateBase.java
+++ b/src/main/java/org/distorted/states/RubikStateBase.java
@@ -23,7 +23,6 @@ import android.view.View;
 import android.widget.ImageButton;
 import android.widget.LinearLayout;
 
-import org.distorted.dialogs.RubikDialogInfo;
 import org.distorted.main.R;
 import org.distorted.main.RubikActivity;
 import org.distorted.main.RubikPreRender;
@@ -37,7 +36,7 @@ abstract class RubikStateBase extends RubikStateAbstract implements RubikPreRend
   {
   private static final int DURATION_MILLIS = 750;
 
-  private ImageButton mPrevButton, mLockButton, mInfoButton;
+  private ImageButton mPrevButton, mLockButton;
 
   private boolean mCanPrevMove;
 
@@ -133,8 +132,6 @@ abstract class RubikStateBase extends RubikStateAbstract implements RubikPreRend
     layoutLeft.addView(mPrevButton);
     setupLockButton(act,width);
     layoutMid.addView(mLockButton);
-    setupInfoButton(act,width);
-    layoutMid.addView(mInfoButton);
     layoutRight.addView(button);
 
     layoutBot.addView(layoutLeft);
@@ -159,24 +156,6 @@ abstract class RubikStateBase extends RubikStateAbstract implements RubikPreRend
       });
     }
 
-///////////////////////////////////////////////////////////////////////////////////////////////////
-
-  void setupInfoButton(final RubikActivity act, final float width)
-    {
-    int icon = RubikActivity.getDrawable(R.drawable.ui_small_info,R.drawable.ui_medium_info, R.drawable.ui_big_info, R.drawable.ui_huge_info);
-    mInfoButton = new TransparentImageButton(act, icon, width,LinearLayout.LayoutParams.MATCH_PARENT);
-
-    mInfoButton.setOnClickListener( new View.OnClickListener()
-      {
-      @Override
-      public void onClick(View v)
-        {
-        RubikDialogInfo infoDiag = new RubikDialogInfo();
-        infoDiag.show(act.getSupportFragmentManager(), null);
-        }
-      });
-    }
-
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
   void setupPrevButton(final RubikActivity act, final float width)
diff --git a/src/main/java/org/distorted/states/RubikStatePlay.java b/src/main/java/org/distorted/states/RubikStatePlay.java
index 76ca67ba..6fec1c67 100644
--- a/src/main/java/org/distorted/states/RubikStatePlay.java
+++ b/src/main/java/org/distorted/states/RubikStatePlay.java
@@ -35,6 +35,7 @@ import android.widget.PopupWindow;
 import androidx.fragment.app.FragmentManager;
 
 import org.distorted.dialogs.RubikDialogAbout;
+import org.distorted.dialogs.RubikDialogInfo;
 import org.distorted.dialogs.RubikDialogPattern;
 import org.distorted.dialogs.RubikDialogScores;
 import org.distorted.main.R;
@@ -50,7 +51,7 @@ public class RubikStatePlay extends RubikStateBase
   public  static final int DEF_OBJECT= ObjectList.CUBE.ordinal();
   public  static final int DEF_SIZE  =  3;
 
-  private static int[] BUTTON_LABELS = { R.string.scores, R.string.patterns, R.string.solver, R.string.about };
+  private static int[] BUTTON_LABELS = { R.string.scores, R.string.patterns, R.string.solver, R.string.tutorials, R.string.about };
   private static final int NUM_BUTTONS = BUTTON_LABELS.length;
 
   private ImageButton mObjButton, mMenuButton, mSolveButton;
@@ -395,7 +396,10 @@ public class RubikStatePlay extends RubikStateBase
               break;
       case 2: StateList.switchState(act, StateList.SVER);
               break;
-      case 3: RubikDialogAbout aDiag = new RubikDialogAbout();
+      case 3: RubikDialogInfo infoDiag = new RubikDialogInfo();
+              infoDiag.show(act.getSupportFragmentManager(), null);
+              break;
+      case 4: RubikDialogAbout aDiag = new RubikDialogAbout();
               aDiag.show(act.getSupportFragmentManager(), null);
               break;
       }
diff --git a/src/main/java/org/distorted/tutorial/TutorialActivity.java b/src/main/java/org/distorted/tutorial/TutorialActivity.java
index fabaed43..96298569 100644
--- a/src/main/java/org/distorted/tutorial/TutorialActivity.java
+++ b/src/main/java/org/distorted/tutorial/TutorialActivity.java
@@ -46,6 +46,8 @@ import static org.distorted.main.RubikRenderer.BRIGHTNESS;
 
 public class TutorialActivity extends AppCompatActivity
 {
+    private static final String URL = "https://www.youtube.com/embed/";
+
     public static final float DIALOG_BUTTON_SIZE  = 0.06f;
     public static final float MENU_BIG_TEXT_SIZE  = 0.05f;
 
@@ -62,8 +64,8 @@ public class TutorialActivity extends AppCompatActivity
     private FirebaseAnalytics mFirebaseAnalytics;
     private static int mScreenWidth, mScreenHeight;
     private int mCurrentApiVersion;
-    private WebView mWebView;
     private TutorialState mState;
+    private String mURL;
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
@@ -75,6 +77,10 @@ public class TutorialActivity extends AppCompatActivity
       setTheme(R.style.CustomActivityThemeNoActionBar);
       setContentView(R.layout.tutorial);
 
+      Bundle b = getIntent().getExtras();
+
+      if(b != null) mURL = b.getString("url");
+
       mIsLocked = false;
       mFirebaseAnalytics = FirebaseAnalytics.getInstance(this);
 
@@ -128,7 +134,7 @@ public class TutorialActivity extends AppCompatActivity
       paramsL.width = (int)(width*(1.0f-RATIO));
       viewL.setLayoutParams(paramsL);
 
-      LinearLayout viewR = findViewById(R.id.rightBar);
+      LinearLayout viewR = findViewById(R.id.tutorialRightBar);
       ViewGroup.LayoutParams paramsR = viewR.getLayoutParams();
       paramsR.width = (int)(width*RATIO);
       viewR.setLayoutParams(paramsR);
@@ -139,6 +145,10 @@ public class TutorialActivity extends AppCompatActivity
       if( mState==null ) mState = new TutorialState();
 
       mState.createRightPane(this,width);
+
+      WebView videoView = findViewById(R.id.tutorialVideoView);
+      TutorialWebView webView = new TutorialWebView(this,videoView);
+      webView.load(URL+mURL);
       }
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
diff --git a/src/main/java/org/distorted/tutorial/TutorialState.java b/src/main/java/org/distorted/tutorial/TutorialState.java
index 19daae06..d63941f8 100644
--- a/src/main/java/org/distorted/tutorial/TutorialState.java
+++ b/src/main/java/org/distorted/tutorial/TutorialState.java
@@ -213,7 +213,7 @@ public class TutorialState implements RubikPreRender.ActionFinishedListener
     if( mMoves==null ) mMoves = new ArrayList<>();
     else               mMoves.clear();
 
-    LinearLayout layout = act.findViewById(R.id.rightBar);
+    LinearLayout layout = act.findViewById(R.id.tutorialRightBar);
     layout.removeAllViews();
 
     setupPrevButton(act,width);
diff --git a/src/main/java/org/distorted/tutorial/TutorialSurfaceView.java b/src/main/java/org/distorted/tutorial/TutorialSurfaceView.java
index b8472b10..178a675f 100644
--- a/src/main/java/org/distorted/tutorial/TutorialSurfaceView.java
+++ b/src/main/java/org/distorted/tutorial/TutorialSurfaceView.java
@@ -1,5 +1,5 @@
 ///////////////////////////////////////////////////////////////////////////////////////////////////
-// Copyright 2019 Leszek Koltunski                                                               //
+// Copyright 2020 Leszek Koltunski                                                               //
 //                                                                                               //
 // This file is part of Magic Cube.                                                              //
 //                                                                                               //
@@ -32,11 +32,8 @@ import com.google.firebase.crashlytics.FirebaseCrashlytics;
 
 import org.distorted.library.type.Static2D;
 import org.distorted.library.type.Static4D;
-import org.distorted.main.RubikActivity;
 import org.distorted.objects.Movement;
 import org.distorted.objects.TwistyObject;
-import org.distorted.states.RubikStateSolving;
-import org.distorted.states.StateList;
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
diff --git a/src/main/java/org/distorted/tutorial/TutorialWebView.java b/src/main/java/org/distorted/tutorial/TutorialWebView.java
new file mode 100644
index 00000000..af1ee1a4
--- /dev/null
+++ b/src/main/java/org/distorted/tutorial/TutorialWebView.java
@@ -0,0 +1,124 @@
+///////////////////////////////////////////////////////////////////////////////////////////////////
+// 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.tutorial;
+
+import android.annotation.SuppressLint;
+import android.content.Context;
+import android.content.res.Resources;
+import android.webkit.WebSettings;
+import android.webkit.WebView;
+
+import org.distorted.main.R;
+
+import java.io.BufferedReader;
+import java.io.InputStream;
+import java.io.InputStreamReader;
+
+///////////////////////////////////////////////////////////////////////////////////////////////////
+
+public class TutorialWebView
+{
+    private String  mUrl;
+    private Context mContext;
+    private WebView mWebView;
+
+///////////////////////////////////////////////////////////////////////////////////////////////////
+
+    @SuppressLint("SetJavaScriptEnabled")
+    public TutorialWebView(Context context, WebView webview)
+      {
+      mWebView = webview;
+      mContext = context;
+      mWebView.setBackgroundColor(0);
+      mWebView.getSettings().setJavaScriptEnabled(true);
+      }
+
+///////////////////////////////////////////////////////////////////////////////////////////////////
+
+    public void load(String url)
+      {
+      mUrl = url;
+      String data = readFromfile(mContext);
+      data = data.replace("%1", url);
+
+android.util.Log.e("webview", "data= "+data);
+
+mWebView.getSettings().setAppCacheMaxSize( 10 * 1024 * 1024 ); // 10MB
+mWebView.getSettings().setAppCachePath(mContext.getCacheDir().getAbsolutePath() );
+mWebView.getSettings().setAllowFileAccess( true );
+mWebView.getSettings().setAppCacheEnabled( true );
+mWebView.getSettings().setCacheMode( WebSettings.LOAD_DEFAULT );
+
+      mWebView.loadData(data, "text/html", "UTF-8");
+      }
+
+///////////////////////////////////////////////////////////////////////////////////////////////////
+
+    public String readFromfile(Context context)
+      {
+      StringBuilder returnString = new StringBuilder();
+      InputStream fIn       = null;
+      InputStreamReader isr = null;
+      BufferedReader input  = null;
+
+      try
+        {
+        Resources res = context.getResources();
+        fIn = res.openRawResource(R.raw.webvideo);
+        isr = new InputStreamReader(fIn);
+        input = new BufferedReader(isr);
+        String line;
+
+        while ((line = input.readLine()) != null)
+          {
+          returnString.append(line);
+          }
+        }
+      catch (Exception e)
+        {
+        e.getMessage();
+        }
+      finally
+        {
+        try
+          {
+          if (isr   != null) isr.close();
+          if (fIn   != null) fIn.close();
+          if (input != null) input.close();
+          }
+        catch (Exception e2)
+          {
+          e2.getMessage();
+          }
+        }
+
+      return returnString.toString();
+      }
+
+///////////////////////////////////////////////////////////////////////////////////////////////////
+
+    public void reload()
+      {
+      if (mUrl!=null)
+        {
+        load(mUrl);
+        }
+      }
+}
diff --git a/src/main/res/layout/tutorial.xml b/src/main/res/layout/tutorial.xml
index 39e53f94..6d8f2013 100644
--- a/src/main/res/layout/tutorial.xml
+++ b/src/main/res/layout/tutorial.xml
@@ -8,13 +8,13 @@
     android:orientation="vertical" >
 
     <WebView
-        android:id="@+id/videoview"
+        android:id="@+id/tutorialVideoView"
         android:layout_width="match_parent"
         android:layout_height="0dp"
         android:layout_weight="1"/>
 
     <LinearLayout
-        android:id="@+id/lowerPart"
+        android:id="@+id/tutorialLowerPart"
         android:layout_width="match_parent"
         android:layout_height="0dp"
         android:layout_weight="1.2"
@@ -27,7 +27,7 @@
            android:layout_height="match_parent"/>
 
         <LinearLayout
-           android:id="@+id/rightBar"
+           android:id="@+id/tutorialRightBar"
            android:layout_width="0dp"
            android:layout_height="match_parent"
 
diff --git a/src/main/res/raw/webvideo.html b/src/main/res/raw/webvideo.html
new file mode 100644
index 00000000..42e53197
--- /dev/null
+++ b/src/main/res/raw/webvideo.html
@@ -0,0 +1,13 @@
+<!DOCTYPE html>
+<html lang="en">
+    <head>
+        <meta charset="utf-8">
+        <style>
+            iframe   { border: 0; position:fixed; width:100%; height:100%; bgcolor="#000000"; }
+            body     { margin: 0; bgcolor="#000000"; }
+        </style>
+    </head>
+    <body>
+        <iframe src="%1" frameborder="0" allowfullscreen></iframe>
+    </body>
+</html>
\ 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 ac1a0550..a2293046 100755
--- a/src/main/res/values-de/strings.xml
+++ b/src/main/res/values-de/strings.xml
@@ -34,7 +34,8 @@
     <string name="new_name_try_again">Der von Ihnen ausgewählte Name %s ist bereits vergeben. Versuchen Sie es noch einmal:</string>
     <string name="downloading">Wird heruntergeladen…</string>
     <string name="submitting">Einreichen…</string>
-    <string name="tutorial">Sehen Sie sich ein Tutorial an?</string>
+    <string name="tutorial">Sehen Sie sich ein Lernprogramm an?</string>
+    <string name="tutorials">Lernprogrammen</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 1574216b..87d1c841 100755
--- a/src/main/res/values-es/strings.xml
+++ b/src/main/res/values-es/strings.xml
@@ -35,6 +35,7 @@
     <string name="downloading">Descargando…</string>
     <string name="submitting">Enviando…</string>
     <string name="tutorial">¿Ver un tutorial?</string>
+    <string name="tutorials">Tutoriales</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 ed2a4a44..7f47a245 100755
--- a/src/main/res/values-fr/strings.xml
+++ b/src/main/res/values-fr/strings.xml
@@ -35,6 +35,7 @@
     <string name="downloading">Téléchargement…</string>
     <string name="submitting">Soumission…</string>
     <string name="tutorial">Regarder un tutoriel?</string>
+    <string name="tutorials">Tutoriels</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-it/strings.xml b/src/main/res/values-it/strings.xml
index 9b0113d0..a6676199 100755
--- a/src/main/res/values-it/strings.xml
+++ b/src/main/res/values-it/strings.xml
@@ -35,6 +35,7 @@
     <string name="downloading">Download in corso…</string>
     <string name="submitting">Invio in corso…</string>
     <string name="tutorial">Guarda un tutorial?</string>
+    <string name="tutorials">Tutorial</string>
 
     <string name="credits1">App open source sviluppata utilizzando la libreria grafica distorta. Licenza sotto <a href="https://www.gnu.org/licenses/old-licenses/gpl-2.0.en.html">GPL versione 2</a> o - a tua scelta - qualsiasi versione successiva.</string>
     <string name="credits2">Pretty Patterns di Walter Randelshofer. Vedere <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 dc477cb3..ec50d1e6 100755
--- a/src/main/res/values-ja/strings.xml
+++ b/src/main/res/values-ja/strings.xml
@@ -35,6 +35,7 @@
     <string name="downloading">ダウンロードしています…</string>
     <string name="submitting">送信しています…</string>
     <string name="tutorial">チュートリアルを見ますか？</string>
+    <string name="tutorials">チュートリアル</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 bf3245cc..610568ab 100755
--- a/src/main/res/values-ko/strings.xml
+++ b/src/main/res/values-ko/strings.xml
@@ -35,6 +35,7 @@
     <string name="downloading">다운로드 중…</string>
     <string name="submitting">제출 중…</string>
     <string name="tutorial">튜토리얼을 보시겠습니까?</string>
+    <string name="tutorials">튜토리얼</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 cb1d448a..45a27103 100644
--- a/src/main/res/values-pl/strings.xml
+++ b/src/main/res/values-pl/strings.xml
@@ -35,6 +35,7 @@
     <string name="downloading">Ściąganie…</string>
     <string name="submitting">Przesyłanie…</string>
     <string name="tutorial">Zobacz tutorial?</string>
+    <string name="tutorials">Tutoriale</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 96b04cdb..5c973e48 100755
--- a/src/main/res/values-ru/strings.xml
+++ b/src/main/res/values-ru/strings.xml
@@ -35,6 +35,7 @@
     <string name="downloading">Загрузка…</string>
     <string name="submitting">Добавляю…</string>
     <string name="tutorial">Смотрите учебник?</string>
+    <string name="tutorials">Учебники</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 cf0c6904..27e1180e 100644
--- a/src/main/res/values-zh-rCN/strings.xml
+++ b/src/main/res/values-zh-rCN/strings.xml
@@ -35,6 +35,7 @@
     <string name="downloading">正在下载……</string>
     <string name="submitting">正在提交……</string>
     <string name="tutorial">观看教程？</string>
+    <string name="tutorials">讲解</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 d1390fc6..bde45b0a 100644
--- a/src/main/res/values-zh-rTW/strings.xml
+++ b/src/main/res/values-zh-rTW/strings.xml
@@ -35,6 +35,7 @@
     <string name="downloading">正在下載……</string>
     <string name="submitting">正在傳送……</string>
     <string name="tutorial">觀看教程？</string>
+    <string name="tutorials">講解</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 996c0d89..a39f37fa 100644
--- a/src/main/res/values/strings.xml
+++ b/src/main/res/values/strings.xml
@@ -36,6 +36,7 @@
     <string name="downloading">Downloading…</string>
     <string name="submitting">Submitting…</string>
     <string name="tutorial">Watch a tutorial?</string>
+    <string name="tutorials">Tutorials</string>
 
     <string name="credits1">Open Source app developed using the Distorted graphics library. Licensed under <a href="https://www.gnu.org/licenses/old-licenses/gpl-2.0.en.html">GPL version 2</a> or - at your option - any later version.</string>
     <string name="credits2">Pretty Patterns by Walter Randelshofer. See <a href="http://www.randelshofer.ch">http://www.randelshofer.ch</a></string>
