commit 054fbee110aba0a73e0d84fa734213c77480f1fe
Author: Leszek Koltunski <leszek@koltunski.pl>
Date:   Mon Jul 6 12:51:01 2020 +0100

    Reinvent the Pattern Dialog (Part 2)

diff --git a/src/main/java/org/distorted/dialogs/RubikDialogPatternListAdapter.java b/src/main/java/org/distorted/dialogs/RubikDialogPatternListAdapter.java
index 6f91ee8d..3e78c76d 100644
--- a/src/main/java/org/distorted/dialogs/RubikDialogPatternListAdapter.java
+++ b/src/main/java/org/distorted/dialogs/RubikDialogPatternListAdapter.java
@@ -26,6 +26,7 @@ import android.view.ViewGroup;
 import android.widget.BaseExpandableListAdapter;
 import android.widget.TextView;
 
+import org.distorted.main.RubikActivity;
 import org.distorted.patterns.RubikPattern;
 import org.distorted.main.R;
 
@@ -34,14 +35,15 @@ import org.distorted.main.R;
 class RubikDialogPatternListAdapter extends BaseExpandableListAdapter
   {
   private Context mContext;
-  private int mTab;
+  private int mTab, mWidth;
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
-  public RubikDialogPatternListAdapter(Context context, int tab)
+  public RubikDialogPatternListAdapter(Context context, int tab, int width)
     {
     mContext = context;
     mTab     = tab;
+    mWidth   = width;
     }
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
@@ -74,10 +76,11 @@ class RubikDialogPatternListAdapter extends BaseExpandableListAdapter
       view = infalInflater.inflate(R.layout.dialog_pattern_child_item, null);
       }
 
-    TextView sequence = view.findViewById(R.id.sequence);
-    sequence.setText(mContext.getString(R.string.sq_placeholder,childPosition+1));
-    TextView childItem = view.findViewById(R.id.childItem);
+    int size = (int)(mWidth* RubikActivity.PATTERN_CHILD_TEXT);
+
+    TextView childItem = view.findViewById(R.id.child);
     childItem.setText(childName);
+    childItem.setTextSize(size);
 
     return view;
     }
@@ -130,8 +133,17 @@ class RubikDialogPatternListAdapter extends BaseExpandableListAdapter
       view = inf.inflate(R.layout.dialog_pattern_group_item, null);
       }
 
+    int size = (int)(mWidth* RubikActivity.PATTERN_GROUP_TEXT);
+
     TextView heading = view.findViewById(R.id.heading);
     heading.setText(groupName);
+    heading.setTextSize(size);
+
+    RubikPattern pattern = RubikPattern.getInstance();
+    int numPatterns = pattern.getNumPatterns(mTab,groupPosition);
+    TextView counter = view.findViewById(R.id.counter);
+    counter.setText(String.format("%d", numPatterns));
+    counter.setTextSize(size);
 
     return view;
     }
diff --git a/src/main/java/org/distorted/dialogs/RubikDialogPatternPagerAdapter.java b/src/main/java/org/distorted/dialogs/RubikDialogPatternPagerAdapter.java
index 2170ca3e..f469b6a5 100644
--- a/src/main/java/org/distorted/dialogs/RubikDialogPatternPagerAdapter.java
+++ b/src/main/java/org/distorted/dialogs/RubikDialogPatternPagerAdapter.java
@@ -60,8 +60,9 @@ class RubikDialogPatternPagerAdapter extends PagerAdapter
     for(int i=0; i<mNumTabs; i++)
       {
       int cat = mViews[i].getCurrentCategory();
-      int pos = mViews[i].getCurrentScrollPos();
-      pattern.rememberState(i,cat,pos);
+      int pos = mViews[i].getCurrentVisiblePos();
+      int exp = mViews[i].getExpanded();
+      pattern.rememberState(i,cat,pos,exp);
       }
     }
 
diff --git a/src/main/java/org/distorted/dialogs/RubikDialogPatternView.java b/src/main/java/org/distorted/dialogs/RubikDialogPatternView.java
index 04be3e9a..7ead1624 100644
--- a/src/main/java/org/distorted/dialogs/RubikDialogPatternView.java
+++ b/src/main/java/org/distorted/dialogs/RubikDialogPatternView.java
@@ -68,14 +68,24 @@ public class RubikDialogPatternView extends FrameLayout
 
     mTab = position;
     mDialog = dialog;
-    mExpandedGroup = -1;
+
+    RubikPattern pattern = RubikPattern.getInstance();
+    mExpandedGroup = pattern.recallExpanded(position);
 
     View tab = inflate( act, R.layout.dialog_pattern_tab, null);
 
     mListView = tab.findViewById(R.id.patternListView);
-    mListAdapter = new RubikDialogPatternListAdapter(act,mTab);
+    mListAdapter = new RubikDialogPatternListAdapter(act,mTab, ract.getScreenHeightInPixels());
     mListView.setAdapter(mListAdapter);
 
+    if( mExpandedGroup>=0 )
+      {
+      mListView.expandGroup(mExpandedGroup);
+      }
+
+    int visible = pattern.recallVisiblePos(mTab);
+    mListView.setSelectionFromTop(visible,0);
+
     mListView.setOnChildClickListener(new ExpandableListView.OnChildClickListener()
       {
       @Override
@@ -126,23 +136,15 @@ public class RubikDialogPatternView extends FrameLayout
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
-  int getCurrentScrollPos()
+  int getCurrentVisiblePos()
     {
-    return 0;//mScroll.getScrollY();
+    return mListView.getFirstVisiblePosition();
     }
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
-  @Override
-  protected void onLayout(boolean changed, int left, int top, int right, int bottom)
+  int getExpanded()
     {
-    super.onLayout(changed,left,top,right,bottom);
-/*
-    if( !changed )
-      {
-      final RubikPattern pattern = RubikPattern.getInstance();
-      mScroll.setScrollY( pattern.recallScrollPos(mTab) );
-      }
- */
+    return mExpandedGroup;
     }
   }
diff --git a/src/main/java/org/distorted/main/RubikActivity.java b/src/main/java/org/distorted/main/RubikActivity.java
index bcd71712..22fc5245 100644
--- a/src/main/java/org/distorted/main/RubikActivity.java
+++ b/src/main/java/org/distorted/main/RubikActivity.java
@@ -43,13 +43,15 @@ import org.distorted.states.RubikStatePlay;
 
 public class RubikActivity extends AppCompatActivity
 {
-    public static final float PADDING          = 0.01f;
-    public static final float MARGIN           = 0.004f;
-    public static final float LARGE_MARGIN     = 0.025f;
-    public static final float BUTTON_TEXT_SIZE = 0.05f;
-    public static final float TITLE_TEXT_SIZE  = 0.06f;
-    public static final float BITMAP_TEXT_SIZE = 0.09f;
-    public static final float MENU_ITEM_SIZE   = 0.12f;
+    public static final float PADDING             = 0.01f;
+    public static final float MARGIN              = 0.004f;
+    public static final float LARGE_MARGIN        = 0.025f;
+    public static final float BUTTON_TEXT_SIZE    = 0.05f;
+    public static final float TITLE_TEXT_SIZE     = 0.06f;
+    public static final float BITMAP_TEXT_SIZE    = 0.09f;
+    public static final float MENU_ITEM_SIZE      = 0.12f;
+    public static final float PATTERN_GROUP_TEXT  = 0.012f;
+    public static final float PATTERN_CHILD_TEXT  = 0.008f;
 
     public static final float MENU_BIG_TEXT_SIZE   = 0.05f;
     public static final float MENU_MEDIUM_TEXT_SIZE= 0.04f;
diff --git a/src/main/java/org/distorted/patterns/RubikPattern.java b/src/main/java/org/distorted/patterns/RubikPattern.java
index f45e9b53..a63514f1 100644
--- a/src/main/java/org/distorted/patterns/RubikPattern.java
+++ b/src/main/java/org/distorted/patterns/RubikPattern.java
@@ -32,9 +32,10 @@ public class RubikPattern
 {
   private static final int DURATION_MILLIS = 750;
 
-  private int[] numCategories   = new int[NUM_OBJECTS];
-  private int[] currentCategory = new int[NUM_OBJECTS];
-  private int[] currentScrollPos= new int[NUM_OBJECTS];
+  private int[] numCategories    = new int[NUM_OBJECTS];
+  private int[] currentCategory  = new int[NUM_OBJECTS];
+  private int[] currentVisiblePos= new int[NUM_OBJECTS];
+  private int[] currentExpanded  = new int[NUM_OBJECTS];
 
   private List<List<Category>> mCategories;
   private static RubikPattern mThis;
@@ -361,6 +362,8 @@ public class RubikPattern
 
       mCategories.add(list);
       numCategories[i]=patStrings.length;
+
+      currentExpanded[i] = -1;
       }
     }
 
@@ -418,12 +421,13 @@ public class RubikPattern
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
-  public void rememberState(int tab, int cat, int scrollPos)
+  public void rememberState(int tab, int cat, int scrollPos, int expanded)
     {
     if( tab>=0 && tab<NUM_OBJECTS )
       {
-      currentCategory[tab] = cat;
-      currentScrollPos[tab]= scrollPos;
+      currentCategory[tab]  = cat;
+      currentVisiblePos[tab]= scrollPos;
+      currentExpanded[tab]  = expanded;
       }
     }
 
@@ -436,9 +440,16 @@ public class RubikPattern
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
-  public int recallScrollPos(int tab)
+  public int recallVisiblePos(int tab)
+    {
+    return tab>=0 && tab<NUM_OBJECTS ? currentVisiblePos[tab] : 0;
+    }
+
+///////////////////////////////////////////////////////////////////////////////////////////////////
+
+  public int recallExpanded(int tab)
     {
-    return tab>=0 && tab<NUM_OBJECTS ? currentScrollPos[tab] : 0;
+    return tab>=0 && tab<NUM_OBJECTS ? currentExpanded[tab] : -1;
     }
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
diff --git a/src/main/res/layout/dialog_pattern_child_item.xml b/src/main/res/layout/dialog_pattern_child_item.xml
index a7c70bf9..395c16f7 100644
--- a/src/main/res/layout/dialog_pattern_child_item.xml
+++ b/src/main/res/layout/dialog_pattern_child_item.xml
@@ -1,24 +1,15 @@
 <?xml version="1.0" encoding="utf-8"?>
-<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
-    android:layout_width="match_parent"
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+    android:layout_width="fill_parent"
     android:layout_height="match_parent"
-    android:orientation="vertical">
+    android:orientation="vertical" >
 
     <TextView
-        android:id="@+id/sequence"
+        android:id="@+id/child"
         android:layout_width="wrap_content"
         android:layout_height="wrap_content"
-        android:layout_alignParentLeft="true"
-        android:layout_alignParentTop="true"
-        android:paddingLeft="35sp"
-        />
+        android:layout_marginTop="5sp"
+        android:layout_marginBottom="5sp"
+        android:paddingLeft="35sp"/>
 
-    <TextView
-        android:id="@+id/childItem"
-        android:layout_width="wrap_content"
-        android:layout_height="wrap_content"
-        android:layout_alignParentTop="true"
-        android:layout_toRightOf="@id/sequence"
-        />
-
-</RelativeLayout>
\ No newline at end of file
+</LinearLayout>
\ No newline at end of file
diff --git a/src/main/res/layout/dialog_pattern_group_item.xml b/src/main/res/layout/dialog_pattern_group_item.xml
index 56dd3397..f60e1ece 100644
--- a/src/main/res/layout/dialog_pattern_group_item.xml
+++ b/src/main/res/layout/dialog_pattern_group_item.xml
@@ -1,14 +1,29 @@
 <?xml version="1.0" encoding="utf-8"?>
-<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
     android:layout_width="fill_parent"
     android:layout_height="match_parent"
-    android:orientation="vertical" >
+    android:orientation="horizontal">
 
     <TextView
         android:id="@+id/heading"
         android:layout_width="wrap_content"
         android:layout_height="wrap_content"
+        android:layout_alignParentLeft="true"
+        android:layout_alignParentTop="true"
+        android:gravity="left"
         android:paddingLeft="35sp"
-        android:textStyle="bold" />
+        android:textStyle="bold"
+        />
 
-</LinearLayout>
\ No newline at end of file
+    <TextView
+        android:id="@+id/counter"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:layout_alignParentRight="true"
+        android:gravity="right"
+        android:layout_toRightOf="@id/heading"
+        android:paddingRight="10sp"
+        android:textStyle="bold"
+        />
+
+</RelativeLayout>
diff --git a/src/main/res/layout/dialog_pattern_tab.xml b/src/main/res/layout/dialog_pattern_tab.xml
index fed5d465..49e13d68 100644
--- a/src/main/res/layout/dialog_pattern_tab.xml
+++ b/src/main/res/layout/dialog_pattern_tab.xml
@@ -2,8 +2,8 @@
 <ExpandableListView xmlns:android="http://schemas.android.com/apk/res/android"
     android:id="@+id/patternListView"
     android:background="@color/grey"
-    android:paddingLeft="10dp"
-    android:paddingRight="10dp"
+    android:paddingLeft="0dp"
+    android:paddingRight="0dp"
     android:paddingTop="10dp"
     android:paddingBottom="10dp"
     android:layout_width="fill_parent"
