From e48b75863e1389992b673bb530adec9855c02bd7 Mon Sep 17 00:00:00 2001
From: Przemek Grondek <github@nerull7.info>
Date: Wed, 20 Aug 2014 11:24:55 +0200
Subject: [PATCH] Better UI

 Less actions on main thread.
---
 .../nerull7/mysqlbrowser/ElementFragment.java | 41 +++++++++++---
 .../nerull7/mysqlbrowser/EntriesFragment.java | 55 ++++++++++---------
 app/src/main/res/layout/fragment_entries.xml  | 10 ++--
 3 files changed, 69 insertions(+), 37 deletions(-)

diff --git a/app/src/main/java/info/nerull7/mysqlbrowser/ElementFragment.java b/app/src/main/java/info/nerull7/mysqlbrowser/ElementFragment.java
index 898c6ba..65e7685 100644
--- a/app/src/main/java/info/nerull7/mysqlbrowser/ElementFragment.java
+++ b/app/src/main/java/info/nerull7/mysqlbrowser/ElementFragment.java
@@ -24,10 +24,15 @@ import info.nerull7.mysqlbrowser.db.AsyncDatabaseConnector;
  *
  * Fragment for editing/adding elements
  */
-public class ElementFragment extends Fragment implements AsyncDatabaseConnector.ListReturnListener, AsyncDatabaseConnector.StringReturnListener {
+public class ElementFragment extends Fragment implements AsyncDatabaseConnector.ListReturnListener, AsyncDatabaseConnector.StringReturnListener, AsyncDatabaseConnector.OnPostExecuteListener {
     public static final String EDIT_ELEMENT = "edit_element";
     public static final String EDIT_LIST = "edit_element_list";
 
+    private static final int POST_EXECUTE_NONE = 0;
+    private static final int POST_EXECUTE_GET_FIELDS = 1;
+    private static final int POST_EXECUTE_UPDATE_ELEMENT = 2;
+    private static final int POST_EXECUTE_ADD_ELEMENT = 3;
+
     private String tableName;
     private ElementArrayAdapter listAdapter;
 
@@ -35,6 +40,8 @@ public class ElementFragment extends Fragment implements AsyncDatabaseConnector.
     private ListView listView;
 
     private List<String> values;
+    private String message;
+    private int postExecute;
 
     @Override
     public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
@@ -45,7 +52,9 @@ public class ElementFragment extends Fragment implements AsyncDatabaseConnector.
 
         initArguments();
 
+        postExecute = POST_EXECUTE_NONE;
         Static.asyncDatabaseConnector.setListReturnListener(this);
+        Static.asyncDatabaseConnector.setOnPostExecuteListener(this);
         Static.asyncDatabaseConnector.getFields(tableName);
 
         return rootView;
@@ -84,12 +93,8 @@ public class ElementFragment extends Fragment implements AsyncDatabaseConnector.
     @Override
     public void onListReturn(List<String> fields) {
         listAdapter = new ElementArrayAdapter(getActivity(), R.layout.list_item_element_simple, fields, values);
-        listView.setAdapter(listAdapter);
-//        databasesListView.setAdapter(listAdapter);
-//        databasesListView.setOnItemClickListener(this);
-        progressBar.setVisibility(View.INVISIBLE);
+        postExecute = POST_EXECUTE_GET_FIELDS;
 
-        setHasOptionsMenu(true);
     }
 
     private List<String> getNewValues(){
@@ -104,8 +109,30 @@ public class ElementFragment extends Fragment implements AsyncDatabaseConnector.
 
     @Override
     public void onStringReturn(String data) {
+        message = data;
+        postExecute = POST_EXECUTE_ADD_ELEMENT;
+    }
+
+    @Override
+    public void onPostExecute() {
+        switch (postExecute){
+            case POST_EXECUTE_GET_FIELDS:
+                listView.setAdapter(listAdapter);
+                progressBar.setVisibility(View.INVISIBLE);
+                setHasOptionsMenu(true);
+                break;
+            case POST_EXECUTE_ADD_ELEMENT:
+            case POST_EXECUTE_UPDATE_ELEMENT:
+                showInfo(message);
+                break;
+        }
+        // Clean after execute
+        postExecute = POST_EXECUTE_NONE;
+    }
+
+    private void showInfo(String info){
         final AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
-        builder.setMessage(data);
+        builder.setMessage(info);
         builder.setPositiveButton(R.string.ok, new DialogInterface.OnClickListener() {
             @Override
             public void onClick(DialogInterface dialogInterface, int i) {
diff --git a/app/src/main/java/info/nerull7/mysqlbrowser/EntriesFragment.java b/app/src/main/java/info/nerull7/mysqlbrowser/EntriesFragment.java
index f46b353..f0a6583 100644
--- a/app/src/main/java/info/nerull7/mysqlbrowser/EntriesFragment.java
+++ b/app/src/main/java/info/nerull7/mysqlbrowser/EntriesFragment.java
@@ -61,6 +61,7 @@ public class EntriesFragment extends Fragment implements AsyncDatabaseConnector.
 
     private Menu menu;
     private TableRow headerRow;
+    private int[] maxWidth;
 
     @Override
     public View onCreateView(LayoutInflater inflater, ViewGroup container,
@@ -91,12 +92,12 @@ public class EntriesFragment extends Fragment implements AsyncDatabaseConnector.
 
     private void initViewItems(View rootView){
         headerFrame = (FrameLayout) rootView.findViewById(R.id.headerFrame);
-        entriesTable = (TableLayout) rootView.findViewById(R.id.entriesTable);
         entriesScrollView = (ScrollView) rootView.findViewById(R.id.entriesScrollView);
         fakeScrollView = (CustomScrollView) rootView.findViewById(R.id.fakeScroll);
         progressBar = (ProgressBar) rootView.findViewById(R.id.loginProgressBar);
         dummyView = rootView.findViewById(R.id.dummyView);
         horizontalScrollView = (HorizontalScrollView) rootView.findViewById(R.id.horizontalScrollView);
+        entriesTable = new TableLayout(getActivity());
 
         fakeScrollView.setOnTouchEventListener(new CustomScrollView.OnTouchEventListener() {
             @Override
@@ -108,8 +109,6 @@ public class EntriesFragment extends Fragment implements AsyncDatabaseConnector.
         });
 
         layoutParams = new TableRow.LayoutParams(TableRow.LayoutParams.WRAP_CONTENT, TableRow.LayoutParams.MATCH_PARENT);
-        headerFrame.setVisibility(View.INVISIBLE);
-        entriesTable.setVisibility(View.INVISIBLE);
     }
 
     @Override
@@ -146,7 +145,9 @@ public class EntriesFragment extends Fragment implements AsyncDatabaseConnector.
 
     private void loadAnotherPage(){
         changeMenus(page);
-        entriesTable.removeAllViews(); // clean table
+        entriesScrollView.removeAllViews(); // clean table
+        entriesTable = new TableLayout(getActivity());
+        onPostExecuteListenerExecuted--;
 
         setLoading(true);
         Static.asyncDatabaseConnector.getRows(tableName, entriesLimit, page); // get new entries
@@ -208,18 +209,12 @@ public class EntriesFragment extends Fragment implements AsyncDatabaseConnector.
                 newRow.setClickable(true);
                 newRow.setOnClickListener(this);
                 entriesTable.addView(newRow);
+                syncWidthsFirstStage();
             }
         } else {
-            TextView errorMessage = new TextView(getActivity());
-            errorMessage.setText(R.string.error_no_entries);
-            errorMessage.setTypeface(null, Typeface.ITALIC);
-            errorMessage.setClickable(false);
-            entriesScrollView.removeView(entriesTable);
-            headerFrame.setVisibility(View.VISIBLE);
-            entriesScrollView.addView(errorMessage);
+            entriesTable = null;
         }
 
-        setLoading(false);
     }
 
     @Override
@@ -254,25 +249,27 @@ public class EntriesFragment extends Fragment implements AsyncDatabaseConnector.
         });
     }
 
-    private void syncWidths(){ // TODO: Merge with adding columns maybe? Loops -= 3 should be quicker
-        int maxWidth[]= new int[headerRow.getChildCount()];
-        for(int i=0;i<headerRow.getChildCount();i++){
+    private void syncWidthsFirstStage() { // TODO: Merge with adding columns maybe? Loops -= 3 should be quicker
+        maxWidth = new int[headerRow.getChildCount()];
+        for (int i = 0; i < headerRow.getChildCount(); i++) {
             TextView textView = (TextView) headerRow.getChildAt(i);
             textView.measure(View.MeasureSpec.UNSPECIFIED, View.MeasureSpec.UNSPECIFIED);
             maxWidth[i] = textView.getMeasuredWidth();
         }
 
-        for(int i=0;i<entriesTable.getChildCount();i++){
+        for (int i = 0; i < entriesTable.getChildCount(); i++) {
             TableRow tableRow = (TableRow) entriesTable.getChildAt(i);
-            for(int j=0;j<tableRow.getChildCount();j++){
+            for (int j = 0; j < tableRow.getChildCount(); j++) {
                 TextView textView = (TextView) tableRow.getChildAt(j);
                 textView.measure(View.MeasureSpec.UNSPECIFIED, View.MeasureSpec.UNSPECIFIED);
                 int width = textView.getMeasuredWidth();
-                if(width>maxWidth[j])
-                    maxWidth[j]=width;
+                if (width > maxWidth[j])
+                    maxWidth[j] = width;
             }
         }
+    }
 
+    private void syncWidthsSecondStage() {
         for(int i=0;i<headerRow.getChildCount();i++){
             TableRow entriesRow = (TableRow) entriesTable.getChildAt(0);
 
@@ -282,9 +279,6 @@ public class EntriesFragment extends Fragment implements AsyncDatabaseConnector.
             tmpEntries.setWidth(maxWidth[i]);
             tmpHeader.setWidth(maxWidth[i]);
         }
-
-//        headerFrame.setVisibility(View.VISIBLE);
-//        entriesTable.setVisibility(View.VISIBLE);
     }
 
     private void fakeScroll(){
@@ -318,9 +312,20 @@ public class EntriesFragment extends Fragment implements AsyncDatabaseConnector.
     @Override
     public void onPostExecute() {
         if(++onPostExecuteListenerExecuted==3){
-            headerFrame.addView(headerRow);
-            syncWidths();
-            fakeScroll();
+            if(entriesTable!=null) {
+                syncWidthsSecondStage();
+                fakeScroll();
+                entriesScrollView.addView(entriesTable);
+            } else {
+                TextView errorMessage = new TextView(getActivity());
+                errorMessage.setText(R.string.error_no_entries);
+                errorMessage.setTypeface(null, Typeface.ITALIC);
+                errorMessage.setClickable(false);
+                entriesScrollView.addView(errorMessage);
+            }
+            if(headerFrame.getChildCount()==0) // You can have only one child
+                headerFrame.addView(headerRow);
+            setLoading(false);
         }
     }
 }
diff --git a/app/src/main/res/layout/fragment_entries.xml b/app/src/main/res/layout/fragment_entries.xml
index 3ed823a..55f3cb8 100644
--- a/app/src/main/res/layout/fragment_entries.xml
+++ b/app/src/main/res/layout/fragment_entries.xml
@@ -26,11 +26,11 @@
                 android:id="@+id/entriesScrollView"
                 android:layout_below="@+id/headerFrame"
                 android:scrollbars="none">
-                <TableLayout
-                    android:layout_width="wrap_content"
-                    android:layout_height="wrap_content"
-                    android:id="@+id/entriesTable">
-                </TableLayout>
+                <!--<TableLayout-->
+                    <!--android:layout_width="wrap_content"-->
+                    <!--android:layout_height="wrap_content"-->
+                    <!--android:id="@+id/entriesTable">-->
+                <!--</TableLayout>-->
             </ScrollView>
         </RelativeLayout>
     </HorizontalScrollView>