From 283af19d923fea15a53bd35c02dfc28c9e4a4784 Mon Sep 17 00:00:00 2001
From: Przemek Grondek <github@nerull7.info>
Date: Tue, 7 Oct 2014 00:19:52 +0200
Subject: [PATCH] Bug fix  Missing new values in edit when they out of view 
 SQL Query better view with IME

---
 app/src/main/AndroidManifest.xml              |  6 ++-
 .../mysqlbrowser/ElementArrayAdapter.java     | 48 +++++++++++++------
 .../nerull7/mysqlbrowser/ElementFragment.java | 34 ++++++++-----
 app/src/main/res/layout/fragment_element.xml  |  3 +-
 4 files changed, 62 insertions(+), 29 deletions(-)

diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml
index 5876902..b31c3ff 100644
--- a/app/src/main/AndroidManifest.xml
+++ b/app/src/main/AndroidManifest.xml
@@ -32,11 +32,13 @@
         </activity>
         <activity
             android:name=".ElementActivity"
-            android:label="@string/title_activity_element" >
+            android:label="@string/title_activity_element"
+            android:windowSoftInputMode="adjustPan">
         </activity>
         <activity
             android:name=".SQLActivity"
-            android:label="@string/title_activity_sql">
+            android:label="@string/title_activity_sql"
+            android:windowSoftInputMode="adjustResize">
         </activity>
     </application>
 
diff --git a/app/src/main/java/info/nerull7/mysqlbrowser/ElementArrayAdapter.java b/app/src/main/java/info/nerull7/mysqlbrowser/ElementArrayAdapter.java
index 9004c95..adc23ba 100644
--- a/app/src/main/java/info/nerull7/mysqlbrowser/ElementArrayAdapter.java
+++ b/app/src/main/java/info/nerull7/mysqlbrowser/ElementArrayAdapter.java
@@ -1,13 +1,14 @@
 package info.nerull7.mysqlbrowser;
 
 import android.content.Context;
+import android.view.KeyEvent;
 import android.view.LayoutInflater;
 import android.view.View;
 import android.view.ViewGroup;
 import android.widget.ArrayAdapter;
-import android.widget.EditText;
 import android.widget.TextView;
 
+import java.util.ArrayList;
 import java.util.List;
 
 /**
@@ -21,33 +22,52 @@ public class ElementArrayAdapter extends ArrayAdapter<String> {
 
     public ElementArrayAdapter(Context context, int resource, List<String> fields) {
         super(context, resource, fields);
-        this.context = context;
-        this.fields = fields;
-        layout = resource;
-        values = null;
+        init(context, resource, fields);
+        values = new ArrayList<String>();
+        for(String field: fields){
+            values.add("");
+        }
     }
 
     public ElementArrayAdapter(Context context, int resource, List<String> fields, List<String> values) {
-        this(context, resource, fields);
-        this.values = values;
+        super(context, resource, fields);
+        init(context, resource, fields);
+        this.values = new ArrayList<String>();
+        this.values.addAll(values); // Copy
+    }
+
+    private void init(Context context, int resource, List<String> fields){
+        this.context = context;
+        this.fields = fields;
+        layout = resource;
     }
 
     @Override
-    public View getView(int position, View convertView, ViewGroup parent) {
+    public View getView(final int position, View convertView, ViewGroup parent) {
         LayoutInflater layoutInflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
-        View rowView = layoutInflater.inflate(layout, parent, false);
+        final View rowView = layoutInflater.inflate(layout, parent, false);
 
         TextView textView = (TextView) rowView.findViewById(R.id.textFieldName);
         textView.setText(fields.get(position));
-        if(values != null){
-            TextView textFieldName = (TextView) rowView.findViewById(R.id.editFieldValue);
-            textFieldName.setText(values.get(position));
-        }
-
+        TextView textFieldName = (TextView) rowView.findViewById(R.id.editFieldValue);
+        textFieldName.setText(values.get(position));
+        textFieldName.setOnFocusChangeListener(new View.OnFocusChangeListener() {
+            @Override
+            public void onFocusChange(View v, boolean hasFocus) {
+                if (!hasFocus) {
+                    String tmp = String.valueOf(((TextView) v).getText());
+                    values.set(position, tmp);
+                }
+            }
+        });
         return rowView;
     }
 
     public List<String> getFieldArray(){
         return fields;
     }
+
+    public List<String> getValues() {
+        return values;
+    }
 }
diff --git a/app/src/main/java/info/nerull7/mysqlbrowser/ElementFragment.java b/app/src/main/java/info/nerull7/mysqlbrowser/ElementFragment.java
index a26c459..6b84366 100644
--- a/app/src/main/java/info/nerull7/mysqlbrowser/ElementFragment.java
+++ b/app/src/main/java/info/nerull7/mysqlbrowser/ElementFragment.java
@@ -2,17 +2,22 @@ package info.nerull7.mysqlbrowser;
 
 import android.app.AlertDialog;
 import android.app.Fragment;
+import android.content.Context;
 import android.content.DialogInterface;
 import android.os.Bundle;
+import android.util.Log;
 import android.view.LayoutInflater;
 import android.view.Menu;
 import android.view.MenuInflater;
 import android.view.MenuItem;
 import android.view.View;
 import android.view.ViewGroup;
+import android.view.inputmethod.InputMethodManager;
+import android.widget.AbsListView;
 import android.widget.EditText;
 import android.widget.ListView;
 import android.widget.ProgressBar;
+import android.widget.RelativeLayout;
 
 import java.util.ArrayList;
 import java.util.List;
@@ -50,6 +55,21 @@ public class ElementFragment extends Fragment implements AsyncDatabaseConnector.
         progressBar = (ProgressBar) rootView.findViewById(R.id.progressBar);
         listView = (ListView) rootView.findViewById(R.id.listView);
 
+        listView.setOnScrollListener(new AbsListView.OnScrollListener() {
+            @Override
+            public void onScrollStateChanged(AbsListView view, int scrollState) {
+                if(scrollState==SCROLL_STATE_TOUCH_SCROLL) {
+                    listView.requestFocus();
+                    InputMethodManager inputMethodManager = (InputMethodManager) getActivity().getSystemService(Context.INPUT_METHOD_SERVICE);
+                    inputMethodManager.hideSoftInputFromWindow(listView.getWindowToken(), InputMethodManager.HIDE_NOT_ALWAYS);
+                }
+            }
+
+            @Override
+            public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) {
+            }
+        });
+        listView.setItemsCanFocus(true);
         initArguments();
 
         postExecute = POST_EXECUTE_NONE;
@@ -64,9 +84,9 @@ public class ElementFragment extends Fragment implements AsyncDatabaseConnector.
         List<String> fields = listAdapter.getFieldArray();
         Static.asyncDatabaseConnector.setStringReturnListener(this);
         if(getArguments().getBoolean(EDIT_ELEMENT))
-            Static.asyncDatabaseConnector.updateElement(tableName, fields, values, getNewValues());
+            Static.asyncDatabaseConnector.updateElement(tableName, fields, values, listAdapter.getValues());
         else
-            Static.asyncDatabaseConnector.addNewElement(tableName, fields, getNewValues());
+            Static.asyncDatabaseConnector.addNewElement(tableName, fields, listAdapter.getValues());
     }
 
     private void actionRemove(){
@@ -137,16 +157,6 @@ public class ElementFragment extends Fragment implements AsyncDatabaseConnector.
 
     }
 
-    private List<String> getNewValues(){
-        List<String> newValues = new ArrayList<String>();
-
-        for(int i=0; i<listView.getChildCount();i++){
-            EditText editText = (EditText) listView.getChildAt(i).findViewById(R.id.editFieldValue);
-            newValues.add(String.valueOf(editText.getText()));
-        }
-        return newValues;
-    }
-
     @Override
     public void onStringReturn(String data) {
         message = data;
diff --git a/app/src/main/res/layout/fragment_element.xml b/app/src/main/res/layout/fragment_element.xml
index 3e9e223..c57f312 100644
--- a/app/src/main/res/layout/fragment_element.xml
+++ b/app/src/main/res/layout/fragment_element.xml
@@ -18,6 +18,7 @@
         android:id="@+id/listView"
         android:layout_below="@+id/progressBar"
         android:layout_alignParentLeft="true"
-        android:layout_alignParentStart="true" />
+        android:layout_alignParentStart="true"
+        android:descendantFocusability="afterDescendants"/>
 
 </RelativeLayout>
\ No newline at end of file