commit c715128d34fcb345b4d6ca7b79f9318a3bdb6435
Author: Leszek Koltunski <leszek@koltunski.pl>
Date:   Tue Mar 31 22:49:59 2020 +0100

    Pretty Patterns Dialog: remember the positions of scrollbars.

diff --git a/src/main/java/org/distorted/dialog/RubikDialogPattern.java b/src/main/java/org/distorted/dialog/RubikDialogPattern.java
index ceb0aec0..e629664a 100644
--- a/src/main/java/org/distorted/dialog/RubikDialogPattern.java
+++ b/src/main/java/org/distorted/dialog/RubikDialogPattern.java
@@ -131,9 +131,9 @@ public class RubikDialogPattern extends AppCompatDialogFragment
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
-  public void rememberCategories()
+  public void rememberState()
     {
-    mPagerAdapter.rememberCategories();
+    mPagerAdapter.rememberState();
     }
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
diff --git a/src/main/java/org/distorted/dialog/RubikDialogPatternPagerAdapter.java b/src/main/java/org/distorted/dialog/RubikDialogPatternPagerAdapter.java
index 2ff36574..cbe6b230 100644
--- a/src/main/java/org/distorted/dialog/RubikDialogPatternPagerAdapter.java
+++ b/src/main/java/org/distorted/dialog/RubikDialogPatternPagerAdapter.java
@@ -52,14 +52,15 @@ class RubikDialogPatternPagerAdapter extends PagerAdapter
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
-  void rememberCategories()
+  void rememberState()
     {
     RubikPattern pattern = RubikPattern.getInstance();
 
     for(int i=0; i<mNumTabs; i++)
       {
       int cat = mViews[i].getCurrentCategory();
-      pattern.rememberCategory(i,cat);
+      int pos = mViews[i].getCurrentScrollPos();
+      pattern.rememberState(i,cat,pos);
       }
     }
 
diff --git a/src/main/java/org/distorted/dialog/RubikDialogPatternView.java b/src/main/java/org/distorted/dialog/RubikDialogPatternView.java
index 84d5d805..793e9001 100644
--- a/src/main/java/org/distorted/dialog/RubikDialogPatternView.java
+++ b/src/main/java/org/distorted/dialog/RubikDialogPatternView.java
@@ -29,6 +29,7 @@ import android.widget.ArrayAdapter;
 import android.widget.Button;
 import android.widget.FrameLayout;
 import android.widget.LinearLayout;
+import android.widget.ScrollView;
 import android.widget.Spinner;
 
 import org.distorted.magic.R;
@@ -43,6 +44,7 @@ import org.distorted.uistate.RubikStatePattern;
 public class RubikDialogPatternView extends FrameLayout implements AdapterView.OnItemSelectedListener
   {
   private LinearLayout mLayout;
+  private ScrollView mScroll;
   private RubikDialogPattern mDialog;
   private int mTab, mPos;
 
@@ -70,6 +72,7 @@ public class RubikDialogPatternView extends FrameLayout implements AdapterView.O
     mTab = position;
     View tab = inflate( act, R.layout.dialog_pattern_tab, null);
     mLayout = tab.findViewById(R.id.tabLayout);
+    mScroll = tab.findViewById(R.id.tabScrollView);
 
     String[] categories = createCategories();
 
@@ -134,6 +137,7 @@ public class RubikDialogPatternView extends FrameLayout implements AdapterView.O
 
     final String[] patterns = createPatterns(category);
     int len = patterns.length;
+    final RubikPattern pattern = RubikPattern.getInstance();
 
     mLayout.removeAllViews();
 
@@ -150,12 +154,11 @@ public class RubikDialogPatternView extends FrameLayout implements AdapterView.O
         public void onClick(View view)
           {
           int[] sizes = RubikObjectList.CUBE.getSizes();
-          RubikPattern pattern = RubikPattern.getInstance();
-          int[][] moves = pattern.getMoves(mTab, category, ii);
+          int[][] moves = pattern.reInitialize(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.rememberState();
           mDialog.dismiss();
           }
         });
@@ -171,6 +174,27 @@ public class RubikDialogPatternView extends FrameLayout implements AdapterView.O
     return mPos;
     }
 
+///////////////////////////////////////////////////////////////////////////////////////////////////
+
+  int getCurrentScrollPos()
+    {
+    return mScroll.getScrollY();
+    }
+
+///////////////////////////////////////////////////////////////////////////////////////////////////
+
+  @Override
+  protected void onLayout(boolean changed, int left, int top, int right, int bottom)
+    {
+    super.onLayout(changed,left,top,right,bottom);
+
+    if( !changed )
+      {
+      final RubikPattern pattern = RubikPattern.getInstance();
+      mScroll.setScrollY( pattern.recallScrollPos(mTab) );
+      }
+    }
+
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
   @Override
diff --git a/src/main/java/org/distorted/patterns/RubikPattern.java b/src/main/java/org/distorted/patterns/RubikPattern.java
index cf8f5803..4594366f 100644
--- a/src/main/java/org/distorted/patterns/RubikPattern.java
+++ b/src/main/java/org/distorted/patterns/RubikPattern.java
@@ -36,6 +36,8 @@ public class RubikPattern
 
   private int[] numCategories   = new int[NUM_CUBES];
   private int[] currentCategory = new int[NUM_CUBES];
+  private int[] currentScrollPos= new int[NUM_CUBES];
+
   private Vector<Category>[] mCategories;
   private static RubikPattern mThis;
 
@@ -138,12 +140,12 @@ public class RubikPattern
 
   /////////////////////////////////////////////////////////////
 
-    int[][] getMoves(int pattern)
+    int[][] reInitialize(int pattern)
       {
       if( pattern>=0 && pattern<numPatterns )
         {
         Pattern p = patterns.elementAt(pattern);
-        if( p!=null ) return p.getMoves();
+        if( p!=null ) return p.reInitialize();
         }
 
       return null;
@@ -314,7 +316,7 @@ public class RubikPattern
 
   /////////////////////////////////////////////////////////////
 
-    int[][] getMoves()
+    int[][] reInitialize()
       {
       if( !mInitialized )
         {
@@ -323,6 +325,7 @@ public class RubikPattern
         moveStr = null;
         }
 
+      mCanRotate = true;
       curMove = numMove;
       return moves;
       }
@@ -415,11 +418,12 @@ public class RubikPattern
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
-  public void rememberCategory(int size,int num)
+  public void rememberState(int size,int num, int scrollPos)
     {
     if( size>=0 && size<NUM_CUBES )
       {
       currentCategory[size] = num;
+      currentScrollPos[size]= scrollPos;
       }
     }
 
@@ -430,6 +434,13 @@ public class RubikPattern
     return size>=0 && size<NUM_CUBES ? currentCategory[size] : 0;
     }
 
+///////////////////////////////////////////////////////////////////////////////////////////////////
+
+  public int recallScrollPos(int size)
+    {
+    return size>=0 && size<NUM_CUBES ? currentScrollPos[size] : 0;
+    }
+
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
   public String getPatternName(int size, int cat, int pat)
@@ -506,12 +517,12 @@ public class RubikPattern
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
-  public int[][] getMoves(int size, int cat, int pat)
+  public int[][] reInitialize(int size, int cat, int pat)
     {
     if( size>=0 && size<NUM_CUBES && cat>=0 && cat< numCategories[size] )
       {
       Category c = mCategories[size].elementAt(cat);
-      if( c!=null ) return c.getMoves(pat);
+      if( c!=null ) return c.reInitialize(pat);
       }
 
     return null;
diff --git a/src/main/java/org/distorted/uistate/RubikStatePattern.java b/src/main/java/org/distorted/uistate/RubikStatePattern.java
index 019501e7..ef24392f 100644
--- a/src/main/java/org/distorted/uistate/RubikStatePattern.java
+++ b/src/main/java/org/distorted/uistate/RubikStatePattern.java
@@ -167,7 +167,7 @@ public class RubikStatePattern extends RubikStateAbstract
           }
         else
           {
-          diag.rememberCategories();
+          diag.rememberState();
           diag.dismiss();
           RubikState.goBack(act);
           }
