diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 39f66fe..f6b00ce 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -34,6 +34,10 @@ android:name=".ElementActivity" android:label="@string/title_activity_element" > </activity> + <activity + android:name=".SQLActivity" + android:label="@string/title_activity_sql"> + </activity> </application> <uses-permission android:name="android.permission.INTERNET" /> diff --git a/app/src/main/java/info/nerull7/mysqlbrowser/ListActivity.java b/app/src/main/java/info/nerull7/mysqlbrowser/ListActivity.java index e2863fd..c88c75f 100644 --- a/app/src/main/java/info/nerull7/mysqlbrowser/ListActivity.java +++ b/app/src/main/java/info/nerull7/mysqlbrowser/ListActivity.java @@ -33,7 +33,7 @@ public class ListActivity extends Activity { @Override public boolean onCreateOptionsMenu(Menu menu) { - getMenuInflater().inflate(R.menu.main, menu); + getMenuInflater().inflate(R.menu.logged, menu); return true; } @@ -47,6 +47,8 @@ public class ListActivity extends Activity { if (id == R.id.action_settings) { Static.startSettings(this); return true; + } else if (id == R.id.action_sql){ + Static.startSQL(this); } return super.onOptionsItemSelected(item); } diff --git a/app/src/main/java/info/nerull7/mysqlbrowser/SQLActivity.java b/app/src/main/java/info/nerull7/mysqlbrowser/SQLActivity.java new file mode 100644 index 0000000..396ce94 --- /dev/null +++ b/app/src/main/java/info/nerull7/mysqlbrowser/SQLActivity.java @@ -0,0 +1,22 @@ +package info.nerull7.mysqlbrowser; + +import android.app.Activity; +import android.os.Bundle; + +/** + * Created by nerull7 on 30.09.14. + */ +public class SQLActivity extends Activity { + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.activity_sql); + + if (savedInstanceState == null) { + getFragmentManager().beginTransaction() + .add(R.id.container, new SQLFragment()) + .commit(); + } + } + +} diff --git a/app/src/main/java/info/nerull7/mysqlbrowser/SQLFragment.java b/app/src/main/java/info/nerull7/mysqlbrowser/SQLFragment.java new file mode 100644 index 0000000..0ba7079 --- /dev/null +++ b/app/src/main/java/info/nerull7/mysqlbrowser/SQLFragment.java @@ -0,0 +1,72 @@ +package info.nerull7.mysqlbrowser; + +import android.app.Activity; +import android.app.Fragment; +import android.content.Context; +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.EditText; + +/** + * Created by nerull7 on 30.09.14. + */ +public class SQLFragment extends Fragment{ + private EditText sqlEditText; + private InputMethodManager inputMethodManager; + + @Override + public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { + View rootView = inflater.inflate(R.layout.fragment_sql, container, false); + sqlEditText = (EditText) rootView.findViewById(R.id.sqlQueryText); + setHasOptionsMenu(true); + return rootView; + } + + @Override + public void onStart() { + super.onStart(); + inputMethodManager = (InputMethodManager) getActivity().getSystemService(Context.INPUT_METHOD_SERVICE); + inputMethodManager.showSoftInput(sqlEditText, InputMethodManager.SHOW_FORCED); + sqlEditText.requestFocus(); + } + + @Override + public boolean onOptionsItemSelected(MenuItem item) { + switch (item.getItemId()){ + case R.id.action_execute: + actionExecute(); + break; + case R.id.action_cancel: + actionCancel(); + break; + } + return super.onOptionsItemSelected(item); + } + + + @Override + public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) { + inflater.inflate(R.menu.sql, menu); + super.onCreateOptionsMenu(menu, inflater); + } + + private void actionCancel(){ + inputMethodManager.hideSoftInputFromWindow(sqlEditText.getWindowToken(), 0); + getActivity().finish(); + } + + private void actionExecute(){ + String sqlQuery = String.valueOf(sqlEditText.getText()); + Log.d("SQLQUERY", sqlQuery); + + Static.asyncDatabaseConnector.setOnPostExecuteListener(null); + Static.asyncDatabaseConnector.executeSQL(null /*FIXME*/, sqlQuery); + } +} diff --git a/app/src/main/java/info/nerull7/mysqlbrowser/Static.java b/app/src/main/java/info/nerull7/mysqlbrowser/Static.java index 6e59148..01d7d35 100644 --- a/app/src/main/java/info/nerull7/mysqlbrowser/Static.java +++ b/app/src/main/java/info/nerull7/mysqlbrowser/Static.java @@ -51,4 +51,9 @@ public class Static { builder.create(); builder.show(); } + + public static void startSQL(Context context) { + Intent intent = new Intent(context, SQLActivity.class); + context.startActivity(intent); + } } diff --git a/app/src/main/java/info/nerull7/mysqlbrowser/db/AsyncDatabaseConnector.java b/app/src/main/java/info/nerull7/mysqlbrowser/db/AsyncDatabaseConnector.java index 277dbb7..42a8e04 100644 --- a/app/src/main/java/info/nerull7/mysqlbrowser/db/AsyncDatabaseConnector.java +++ b/app/src/main/java/info/nerull7/mysqlbrowser/db/AsyncDatabaseConnector.java @@ -2,6 +2,7 @@ package info.nerull7.mysqlbrowser.db; import android.content.res.Resources; import android.os.AsyncTask; +import android.util.Log; import org.json.JSONArray; import org.json.JSONException; @@ -37,6 +38,7 @@ public class AsyncDatabaseConnector { public static final String ACTION_ADD_ELEMENT = "addelement"; public static final String ACTION_UPDATE_ELEMENT = "updateelement"; public static final String ACTION_REMOVE_ELEMENT = "removeelement"; + public static final String ACTION_SQL_QUERY = "query"; private String login; private String password; @@ -339,6 +341,44 @@ public class AsyncDatabaseConnector { downloader.execute(request); } + public void executeSQL(String database, String query){ + ArrayList<String> args = new ArrayList(); + ArrayList<String> values = new ArrayList(); + final Request request; + + if(database!=null){ + args.add("d"); + values.add(database); + } + args.add("q"); + values.add(query); + + request = actionUrlBuilder(ACTION_SQL_QUERY, args, values); + + Downloader downloader = new Downloader(new Downloader.OnFinishedListener() { + @Override + public void onFinished(String data, String error) { + String []response = data.split("\n"); + + List<String>headerList = null; + try { + headerList = parseListFromJSON(response[1]); + } catch (JSONException e) { e.printStackTrace(); } + if(listReturnListener!=null) { + listReturnListener.onListReturn(headerList); + } + + List<List<String>> dataMatrix = null; + try { + dataMatrix = parseMatrixFromJSON(response[2]); + } catch (JSONException e) { e.printStackTrace(); } + if(matrixReturnListener!=null) + matrixReturnListener.onMatrixReturn(dataMatrix); + } + }, onPostExecuteListener, resources); + downloader.execute(request); + } + public void setBooleanReturnListener(BooleanReturnListener booleanReturnListener){ this.booleanReturnListener = booleanReturnListener; } @@ -468,14 +508,14 @@ public class AsyncDatabaseConnector { reader = new BufferedReader(new InputStreamReader(in)); String line; while ((line = reader.readLine()) != null) { - streamOutput += line; + streamOutput += line + '\n'; } } finally { if (reader != null) { reader.close(); } } - return streamOutput; + return streamOutput.substring(0, streamOutput.length()-1); // Remove last \n } @Override diff --git a/app/src/main/res/drawable-hdpi/ic_action_file_upload.png b/app/src/main/res/drawable-hdpi/ic_action_file_upload.png new file mode 100644 index 0000000..4910c3a Binary files /dev/null and b/app/src/main/res/drawable-hdpi/ic_action_file_upload.png differ diff --git a/app/src/main/res/drawable-mdpi/ic_action_file_upload.png b/app/src/main/res/drawable-mdpi/ic_action_file_upload.png new file mode 100644 index 0000000..8374b8d Binary files /dev/null and b/app/src/main/res/drawable-mdpi/ic_action_file_upload.png differ diff --git a/app/src/main/res/drawable-xhdpi/ic_action_file_upload.png b/app/src/main/res/drawable-xhdpi/ic_action_file_upload.png new file mode 100644 index 0000000..702ea4e Binary files /dev/null and b/app/src/main/res/drawable-xhdpi/ic_action_file_upload.png differ diff --git a/app/src/main/res/drawable-xxhdpi/ic_action_file_upload.png b/app/src/main/res/drawable-xxhdpi/ic_action_file_upload.png new file mode 100644 index 0000000..8e78556 Binary files /dev/null and b/app/src/main/res/drawable-xxhdpi/ic_action_file_upload.png differ diff --git a/app/src/main/res/layout/activity_sql.xml b/app/src/main/res/layout/activity_sql.xml new file mode 100644 index 0000000..43ab1db --- /dev/null +++ b/app/src/main/res/layout/activity_sql.xml @@ -0,0 +1,7 @@ +<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:tools="http://schemas.android.com/tools" + android:id="@+id/container" + android:layout_width="match_parent" + android:layout_height="match_parent" + tools:context="info.nerull7.mysqlbrowser.ListActivity" + tools:ignore="MergeRootFrame" /> diff --git a/app/src/main/res/layout/fragment_sql.xml b/app/src/main/res/layout/fragment_sql.xml new file mode 100644 index 0000000..1298338 --- /dev/null +++ b/app/src/main/res/layout/fragment_sql.xml @@ -0,0 +1,24 @@ +<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:tools="http://schemas.android.com/tools" + android:layout_width="match_parent" + android:layout_height="match_parent" + tools:context="info.nerull7.mysqlbrowser.DatabaseFragment"> + + + <EditText + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:inputType="textMultiLine" + android:ems="10" + android:id="@+id/sqlQueryText" + android:layout_alignParentTop="true" + android:layout_alignParentLeft="true" + android:layout_alignParentStart="true" + android:layout_alignParentBottom="true" + android:layout_alignParentRight="true" + android:layout_alignParentEnd="true" + android:gravity="left|top" + android:hint="@string/hint_sql_query" > + <requestFocus/> + </EditText> +</RelativeLayout> diff --git a/app/src/main/res/menu/logged.xml b/app/src/main/res/menu/logged.xml new file mode 100644 index 0000000..5d31f08 --- /dev/null +++ b/app/src/main/res/menu/logged.xml @@ -0,0 +1,12 @@ +<?xml version="1.0" encoding="utf-8"?> + +<menu xmlns:android="http://schemas.android.com/apk/res/android"> + <item android:id="@+id/action_settings" + android:title="@string/action_settings" + android:orderInCategory="100" + android:showAsAction="never" /> + <item android:id="@+id/action_sql" + android:title="@string/sql_query" + android:orderInCategory="200" + android:showAsAction="never" /> +</menu> \ No newline at end of file diff --git a/app/src/main/res/menu/sql.xml b/app/src/main/res/menu/sql.xml new file mode 100644 index 0000000..5bc3b39 --- /dev/null +++ b/app/src/main/res/menu/sql.xml @@ -0,0 +1,15 @@ +<?xml version="1.0" encoding="utf-8"?> + +<menu xmlns:android="http://schemas.android.com/apk/res/android" > + + <item android:id="@+id/action_execute" + android:title="@string/action_execute" + android:showAsAction="always" + android:icon="@drawable/ic_action_file_upload"/> + + <item android:id="@+id/action_cancel" + android:title="@string/action_cancel" + android:showAsAction="always" + android:icon="@drawable/ic_action_delete"/> + +</menu> \ No newline at end of file diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index ec32bc1..d4c83cb 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -53,5 +53,10 @@ <string name="save_credentials">Save credentials</string> <string name="connector_url">Connector URL</string> <string name="no_connection">No Internet Connection</string> + <string name="sql_query">SQL Query</string> + <string name="title_activity_sql">SQL Query</string> + <string name="hint_sql_query">SQL Query</string> + <string name="action_cancel">Cancel</string> + <string name="action_execute">Execute</string> </resources>