commit 6f2a942eb835dc8dbd980bcbc5e0122a52176764
Author: Leszek Koltunski <leszek@koltunski.pl>
Date:   Tue Mar 31 21:36:53 2020 +0100

    Bugfixes for Pretty Patterns

diff --git a/src/main/java/org/distorted/dialog/RubikDialogPattern.java b/src/main/java/org/distorted/dialog/RubikDialogPattern.java
index 0237a386..ceb0aec0 100644
--- a/src/main/java/org/distorted/dialog/RubikDialogPattern.java
+++ b/src/main/java/org/distorted/dialog/RubikDialogPattern.java
@@ -69,7 +69,7 @@ public class RubikDialogPattern extends AppCompatDialogFragment
 
     LayoutInflater layoutInflater = act.getLayoutInflater();
     TextView tv = (TextView) layoutInflater.inflate(R.layout.dialog_title, null);
-    tv.setText(R.string.patterns);
+    tv.setText(R.string.choose_pattern);
     builder.setCustomTitle(tv);
 
     Bundle args = getArguments();
diff --git a/src/main/java/org/distorted/dialog/RubikDialogPatternView.java b/src/main/java/org/distorted/dialog/RubikDialogPatternView.java
index dc181a39..84d5d805 100644
--- a/src/main/java/org/distorted/dialog/RubikDialogPatternView.java
+++ b/src/main/java/org/distorted/dialog/RubikDialogPatternView.java
@@ -149,12 +149,12 @@ public class RubikDialogPatternView extends FrameLayout implements AdapterView.O
         @Override
         public void onClick(View view)
           {
-          RubikStatePattern state = (RubikStatePattern) RubikState.PATT.getStateClass();
-          state.setPattern(act, mTab, category, ii);
           int[] sizes = RubikObjectList.CUBE.getSizes();
           RubikPattern pattern = RubikPattern.getInstance();
           int[][] moves = pattern.getMoves(mTab, category, ii);
           act.changeObject(RubikObjectList.CUBE,sizes[mTab],moves);
+          RubikStatePattern state = (RubikStatePattern) RubikState.PATT.getStateClass();
+          state.setPattern(act, mTab, category, ii);
           mDialog.rememberCategories();
           mDialog.dismiss();
           }
diff --git a/src/main/java/org/distorted/patterns/RubikPattern.java b/src/main/java/org/distorted/patterns/RubikPattern.java
index c702545e..cf8f5803 100644
--- a/src/main/java/org/distorted/patterns/RubikPattern.java
+++ b/src/main/java/org/distorted/patterns/RubikPattern.java
@@ -154,20 +154,21 @@ public class RubikPattern
 
   private static class Pattern implements RubikPostRender.ActionFinishedListener
     {
-    private String name;
+    private String nameStr, moveStr;
     private int[][] moves;
     private int curMove;
     private int numMove;
     private boolean mCanRotate;
+    private boolean mInitialized;
 
   /////////////////////////////////////////////////////////////
 
     Pattern(String n, String m)
       {
-      name=n;
-      moves= movesParser(m);
-      curMove=numMove;
-      mCanRotate = true;
+      nameStr = n;
+      moveStr = m;
+      mCanRotate   = true;
+      mInitialized = false;
       }
 
   /////////////////////////////////////////////////////////////
@@ -175,6 +176,7 @@ public class RubikPattern
     private int[][] movesParser(String moves)
       {
       numMove = moves.length()/4;
+      curMove=numMove;
 
       int digit0, digit1, digit2;
       int[][] result = new int[numMove][3];
@@ -197,13 +199,20 @@ public class RubikPattern
 
     String getName()
       {
-      return name;
+      return nameStr;
       }
 
   /////////////////////////////////////////////////////////////
 
     int getNumMove()
       {
+      if( !mInitialized )
+        {
+        mInitialized = true;
+        moves = movesParser(moveStr);
+        moveStr = null;
+        }
+
       return numMove;
       }
 
@@ -211,6 +220,13 @@ public class RubikPattern
 
     int getCurMove()
       {
+      if( !mInitialized )
+        {
+        mInitialized = true;
+        moves = movesParser(moveStr);
+        moveStr = null;
+        }
+
       return curMove;
       }
 
@@ -218,6 +234,13 @@ public class RubikPattern
 
     void makeMove(RubikPostRender post)
       {
+      if( !mInitialized )
+        {
+        mInitialized = true;
+        moves = movesParser(moveStr);
+        moveStr = null;
+        }
+
       curMove++;
       RubikObject object = post.getObject();
 
@@ -252,6 +275,13 @@ public class RubikPattern
 
     void backMove(RubikPostRender post)
       {
+      if( !mInitialized )
+        {
+        mInitialized = true;
+        moves = movesParser(moveStr);
+        moveStr = null;
+        }
+
       curMove--;
       RubikObject object = post.getObject();
 
@@ -286,6 +316,14 @@ public class RubikPattern
 
     int[][] getMoves()
       {
+      if( !mInitialized )
+        {
+        mInitialized = true;
+        moves = movesParser(moveStr);
+        moveStr = null;
+        }
+
+      curMove = numMove;
       return moves;
       }
 
diff --git a/src/main/java/org/distorted/uistate/RubikStatePattern.java b/src/main/java/org/distorted/uistate/RubikStatePattern.java
index 47fe3f8a..019501e7 100644
--- a/src/main/java/org/distorted/uistate/RubikStatePattern.java
+++ b/src/main/java/org/distorted/uistate/RubikStatePattern.java
@@ -163,7 +163,6 @@ public class RubikStatePattern extends RubikStateAbstract
         if( diag==null )
           {
           mText.setTextSize(DEFAULT_TEXT_SIZE);
-          mText.setText(R.string.patterns);
           showDialog(mana);
           }
         else
diff --git a/src/main/res/values/strings.xml b/src/main/res/values/strings.xml
index a29451c8..eb85c632 100644
--- a/src/main/res/values/strings.xml
+++ b/src/main/res/values/strings.xml
@@ -9,6 +9,7 @@
     <string name="effects">Effects</string>
     <string name="scores">High Scores</string>
     <string name="patterns">Pretty Patterns</string>
+    <string name="choose_pattern">Choose a Pattern</string>
     <string name="solver">3x3x3 Solver</string>
     <string name="about">About</string>
     <string name="solved">Solved</string>
