From 17d3a2ce93fd3ba1ec692dea601f246ef8e068b2 Mon Sep 17 00:00:00 2001 From: pk910 Date: Wed, 9 Mar 2016 14:54:57 +0100 Subject: [PATCH] =?utf8?q?Autocomplete=20Feature=20f=C3=BCr=20Kursnamen=20?= =?utf8?q?hinzugef=C3=BCgt=20(eigene=20API,=20da=20von=20DHBW=20nicht=20be?= =?utf8?q?reitgestellt)?= MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit --- .../campusapp/coursenames/CourseName.java | 33 ++++++ .../coursenames/CourseNameManager.java | 98 ++++++++++++++++ .../CourseNameManagerInterface.java | 11 ++ .../campusapp/database/DatabaseManager.java | 106 ++++++++++++++++-- .../dhbwloe/campusapp/fragments/FirstRun.java | 20 +++- .../dhbwloe/campusapp/fragments/Settings.java | 42 ++++++- .../campusapp/fragments/SplashScreen.java | 52 ++++++++- .../campusapp/network/JsonRequestHelper.java | 75 +++++++++++++ .../main/res/layout/fragment_first_run.xml | 6 +- app/src/main/res/layout/fragment_settings.xml | 8 +- 10 files changed, 423 insertions(+), 28 deletions(-) create mode 100644 app/src/main/java/de/dhbwloe/campusapp/coursenames/CourseName.java create mode 100644 app/src/main/java/de/dhbwloe/campusapp/coursenames/CourseNameManager.java create mode 100644 app/src/main/java/de/dhbwloe/campusapp/coursenames/CourseNameManagerInterface.java create mode 100644 app/src/main/java/de/dhbwloe/campusapp/network/JsonRequestHelper.java diff --git a/app/src/main/java/de/dhbwloe/campusapp/coursenames/CourseName.java b/app/src/main/java/de/dhbwloe/campusapp/coursenames/CourseName.java new file mode 100644 index 0000000..3d3545c --- /dev/null +++ b/app/src/main/java/de/dhbwloe/campusapp/coursenames/CourseName.java @@ -0,0 +1,33 @@ +package de.dhbwloe.campusapp.coursenames; + +/** + * Created by pk910 on 09.03.2016. + */ +public class CourseName { + private String sCourseName; + private String sStatus; + private long iLastUpdate; + + public CourseName(String name, String status, long update) { + sCourseName = name; + sStatus = status; + iLastUpdate = update; + } + + public String getName() { + return sCourseName; + } + + public String getStatus() { + return sStatus; + } + + public long getLastUpdate() { + return iLastUpdate; + } + + public boolean isActiveCourse() { + return !sStatus.equalsIgnoreCase("Finished"); + } + +} diff --git a/app/src/main/java/de/dhbwloe/campusapp/coursenames/CourseNameManager.java b/app/src/main/java/de/dhbwloe/campusapp/coursenames/CourseNameManager.java new file mode 100644 index 0000000..546238b --- /dev/null +++ b/app/src/main/java/de/dhbwloe/campusapp/coursenames/CourseNameManager.java @@ -0,0 +1,98 @@ +package de.dhbwloe.campusapp.coursenames; + +import org.json.JSONArray; +import org.json.JSONException; +import org.json.JSONObject; + +import java.net.URLEncoder; +import java.util.ArrayList; + +import de.dhbwloe.campusapp.CampusAppContext; +import de.dhbwloe.campusapp.network.JsonRequestHelper; + +/** + * Created by pk910 on 09.03.2016. + */ +public class CourseNameManager extends JsonRequestHelper { + private static final String COURSENAMES_API_HOST = "http://dev.pk910.de/DHBWCampusCourses"; + + private ArrayList aCallbackInterfaces = new ArrayList(); + private boolean bSyncRequestRunning; + + public void synchronizeCourseNames(CourseNameManagerInterface callback) { + aCallbackInterfaces.add(callback); + if(bSyncRequestRunning) + return; + + bSyncRequestRunning = true; + + String courseNamesSyncUrl = COURSENAMES_API_HOST + "?action=sync"; + CourseName lastName = CampusAppContext.getInstance().getDatabaseManager().getLatestCourseName(); + if(lastName != null) + courseNamesSyncUrl += "&time="+Long.toString(lastName.getLastUpdate()); + requestJsonFromWeb(courseNamesSyncUrl); + } + + public void addCourseName(String courseName) { + String courseNamesAddUrl = "?action=add&course="+ URLEncoder.encode(courseName); + JsonRequestHelper addCourseReqHelper = new JsonRequestHelper() { + @Override + protected void onJsonReceived(JSONObject json) { + /* unused - no JSON Response from action=add */ + } + + @Override + protected void onJsonReceived(JSONArray json) { + /* unused - no JSON Response from action=add */ + } + + @Override + protected void onTextReceived(String response) { + + } + + @Override + protected void onJsonRequestFail(int statusCode, String errorMessage) { + + } + }; + } + + + @Override + protected void onJsonReceived(JSONObject json) { + /* unused - we'll receive text (error) or a JSON array of results. */ + } + + @Override + protected void onJsonReceived(JSONArray json) { + for(int i = 0; i < json.length(); i++) { + try { + JSONObject courseNameEntry = json.getJSONObject(i); + + String courseName = courseNameEntry.getString("name"); + String courseStatus = courseNameEntry.getString("status"); + long courseUpdate = courseNameEntry.getLong("lastupdate"); + + CourseName course = new CourseName(courseName, courseStatus, courseUpdate); + CampusAppContext.getInstance().getDatabaseManager().addCourseName(course); + } catch (JSONException e) { + e.printStackTrace(); + } + } + for(CourseNameManagerInterface callback : aCallbackInterfaces) + callback.onCourseNamesSynchronized(); + } + + @Override + protected void onTextReceived(String response) { + for(CourseNameManagerInterface callback : aCallbackInterfaces) + callback.onCourseNamesFailed(response); + } + + @Override + protected void onJsonRequestFail(int statusCode, String errorMessage) { + for(CourseNameManagerInterface callback : aCallbackInterfaces) + callback.onCourseNamesFailed(errorMessage); + } +} diff --git a/app/src/main/java/de/dhbwloe/campusapp/coursenames/CourseNameManagerInterface.java b/app/src/main/java/de/dhbwloe/campusapp/coursenames/CourseNameManagerInterface.java new file mode 100644 index 0000000..890d8a1 --- /dev/null +++ b/app/src/main/java/de/dhbwloe/campusapp/coursenames/CourseNameManagerInterface.java @@ -0,0 +1,11 @@ +package de.dhbwloe.campusapp.coursenames; + +/** + * Created by pk910 on 09.03.2016. + */ +public interface CourseNameManagerInterface { + + public void onCourseNamesSynchronized(); + public void onCourseNamesFailed(String errorMessage); + +} diff --git a/app/src/main/java/de/dhbwloe/campusapp/database/DatabaseManager.java b/app/src/main/java/de/dhbwloe/campusapp/database/DatabaseManager.java index d042bd0..628d78f 100644 --- a/app/src/main/java/de/dhbwloe/campusapp/database/DatabaseManager.java +++ b/app/src/main/java/de/dhbwloe/campusapp/database/DatabaseManager.java @@ -18,23 +18,14 @@ import android.app.Activity; import android.content.ContentValues; import android.database.Cursor; import android.database.sqlite.SQLiteDatabase; -import android.util.Log; import net.fortuna.ical4j.model.Component; -import net.fortuna.ical4j.model.DateList; -import net.fortuna.ical4j.model.DateTime; -import net.fortuna.ical4j.model.Period; -import net.fortuna.ical4j.model.Recur; -import net.fortuna.ical4j.model.parameter.Value; -import net.fortuna.ical4j.model.property.RRule; - -import java.lang.reflect.Array; -import java.text.ParseException; + import java.util.ArrayList; import java.util.Date; -import java.util.ListIterator; import de.dhbwloe.campusapp.CampusAppContext; +import de.dhbwloe.campusapp.coursenames.CourseName; import de.dhbwloe.campusapp.mensaplan.MensaTagesplan; import de.dhbwloe.campusapp.news.NewsItem; import de.dhbwloe.campusapp.search.SearchIndices; @@ -46,7 +37,7 @@ import de.dhbwloe.campusapp.vorlesungen.CourseGroup; */ public class DatabaseManager { private static final String DATABASE_NAME = "DHBWLoe.CampusApp.db"; - private static final int DATABASE_VERSION = 2; // Datenbank Version - muss bei strukturellen Anpassungen erhöht werden + private static final int DATABASE_VERSION = 3; // Datenbank Version - muss bei strukturellen Anpassungen erhöht werden private CampusAppContext AppContext; private SQLiteDatabase database; @@ -189,6 +180,15 @@ public class DatabaseManager { } if(oldVersion < 3 && newVersion >= 3) { // Version 3 + database.execSQL("CREATE TABLE IF NOT EXISTS CourseNames " + + "(" + + "CourseName TEXT, " + + "Status TEXT, " + + "LastUpdate INT" + + ");"); + } + if(oldVersion < 4 && newVersion >= 4) { + // Version 4 } @@ -386,6 +386,88 @@ public class DatabaseManager { return nfcCardData; } + public CourseName[] getCourseNames() { + openDatabase(); + String value = null; + Cursor resultSet; + resultSet = database.rawQuery("SELECT CourseName, Status, LastUpdate FROM CourseNames ORDER BY CourseName ASC", null); + + ArrayList courseNames = new ArrayList(); + if(resultSet.moveToFirst()) { + do { + CourseName cname = new CourseName(resultSet.getString(0), resultSet.getString(1), resultSet.getLong(2)); + courseNames.add(cname); + } while (resultSet.moveToNext()); + } + resultSet.close(); + CourseName[] resultsArr = new CourseName[courseNames.size()]; + resultsArr = courseNames.toArray(resultsArr); + return resultsArr; + } + + public CourseName getLatestCourseName() { + openDatabase(); + CourseName lastCourse = null; + Cursor resultSet; + resultSet = database.rawQuery("SELECT CourseName, Status, LastUpdate FROM CourseNames ORDER BY LastUpdate DESC LIMIT 1", null); + + if(resultSet.moveToFirst()) { + lastCourse = new CourseName(resultSet.getString(0), resultSet.getString(1), resultSet.getLong(2)); + } + resultSet.close(); + return lastCourse; + } + + public void addCourseName(CourseName courseName) { + openDatabase(); + String[] whereArgs = new String[] { + courseName.getName() + }; + Cursor resultSet = database.rawQuery("SELECT CourseName FROM CourseNames WHERE CourseName = ?", whereArgs); + if(resultSet.moveToFirst()) { + if(courseName.isActiveCourse()) { + try { + ContentValues updateValues = new ContentValues(); + updateValues.put("Status", courseName.getStatus()); + updateValues.put("LastUpdate", courseName.getLastUpdate()); + + database.update("CourseNames", updateValues, "CourseName = ?", whereArgs); + } catch (Exception e) { + e.printStackTrace(); + } + } else { + database.delete("CourseNames", "CourseName = ?", whereArgs); + } + } else if(courseName.isActiveCourse()) { + try { + ContentValues indexValues = new ContentValues(); + indexValues.put("CourseName", courseName.getName()); + indexValues.put("Status", courseName.getStatus()); + indexValues.put("LastUpdate", courseName.getLastUpdate()); + + database.insertOrThrow("CourseNames", null, indexValues); + } catch(Exception e) { + e.printStackTrace(); + } + } + resultSet.close(); + } + + public boolean haveCourseName(String courseName) { + openDatabase(); + String[] whereArgs = new String[] { + courseName + }; + Cursor resultSet = database.rawQuery("SELECT CourseName FROM CourseNames WHERE CourseName = ?", whereArgs); + boolean result; + if(resultSet.moveToFirst()) { + result = true; + } else { + result = false; + } + return result; + } + public void updateCourseCalendar(CourseEvent event, Component cevent) { openDatabase(); if(vorlesungsplanDBHelper == null) diff --git a/app/src/main/java/de/dhbwloe/campusapp/fragments/FirstRun.java b/app/src/main/java/de/dhbwloe/campusapp/fragments/FirstRun.java index 1267e5b..3e72380 100644 --- a/app/src/main/java/de/dhbwloe/campusapp/fragments/FirstRun.java +++ b/app/src/main/java/de/dhbwloe/campusapp/fragments/FirstRun.java @@ -14,16 +14,21 @@ * along with this program. If not, see . */ package de.dhbwloe.campusapp.fragments; +import android.content.Context; import android.os.Bundle; import android.support.v4.app.Fragment; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; +import android.view.inputmethod.InputMethodManager; +import android.widget.ArrayAdapter; +import android.widget.AutoCompleteTextView; import android.widget.Button; import android.widget.EditText; import de.dhbwloe.campusapp.CampusAppFragment; import de.dhbwloe.campusapp.R; +import de.dhbwloe.campusapp.coursenames.CourseName; /** * A simple {@link Fragment} subclass. @@ -55,16 +60,29 @@ public class FirstRun extends CampusAppFragment { } }); + AutoCompleteTextView courseInput = (AutoCompleteTextView )view.findViewById(R.id.courseInput); + CourseName names[] = AppContext.getDatabaseManager().getCourseNames(); + String courseNames[] = new String[names.length]; + for(int i = 0; i < names.length; i++) { + courseNames[i] = names[i].getName(); + } + + ArrayAdapter adapter = new ArrayAdapter(AppContext.getMainActivity(), android.R.layout.simple_list_item_1, courseNames); + courseInput.setAdapter(adapter); + return view; } private void startApp() { AppContext.getDatabaseManager().setRuntimeCache("AppStartCounter", "1"); AppContext.getNavigationManager().navigatePage("SplashScreen", null, false); + + InputMethodManager imm = (InputMethodManager)AppContext.getMainActivity().getSystemService(Context.INPUT_METHOD_SERVICE); + imm.hideSoftInputFromWindow(view.getWindowToken(), 0); } private boolean setCourse() { - EditText courseInput = (EditText)view.findViewById(R.id.courseInput); + AutoCompleteTextView courseInput = (AutoCompleteTextView )view.findViewById(R.id.courseInput); String courseName = courseInput.getText().toString(); if(courseName.length() <= 3) return false; diff --git a/app/src/main/java/de/dhbwloe/campusapp/fragments/Settings.java b/app/src/main/java/de/dhbwloe/campusapp/fragments/Settings.java index f59d223..e34eb72 100644 --- a/app/src/main/java/de/dhbwloe/campusapp/fragments/Settings.java +++ b/app/src/main/java/de/dhbwloe/campusapp/fragments/Settings.java @@ -14,22 +14,30 @@ * along with this program. If not, see . */ package de.dhbwloe.campusapp.fragments; +import android.content.Context; import android.os.Bundle; import android.support.v4.app.Fragment; +import android.view.KeyEvent; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; +import android.view.inputmethod.EditorInfo; +import android.view.inputmethod.InputMethodManager; +import android.widget.ArrayAdapter; +import android.widget.AutoCompleteTextView; import android.widget.EditText; import android.widget.Spinner; +import android.widget.TextView; import de.dhbwloe.campusapp.CampusAppFragment; import de.dhbwloe.campusapp.R; +import de.dhbwloe.campusapp.coursenames.CourseName; /** * A simple {@link Fragment} subclass. */ public class Settings extends CampusAppFragment { - private EditText courseNameInput; + private AutoCompleteTextView courseNameInput; private Spinner mensaRoleInput; public Settings() { @@ -42,9 +50,36 @@ public class Settings extends CampusAppFragment { Bundle savedInstanceState) { oFragmentView = inflater.inflate(R.layout.fragment_settings, container, false); - courseNameInput = (EditText) oFragmentView.findViewById(R.id.courseNameInput); + courseNameInput = (AutoCompleteTextView) oFragmentView.findViewById(R.id.courseNameInput); mensaRoleInput = (Spinner) oFragmentView.findViewById(R.id.mensaRoleInput); + courseNameInput.setImeOptions(EditorInfo.IME_ACTION_DONE); + courseNameInput.setOnEditorActionListener( + new EditText.OnEditorActionListener() { + @Override + public boolean onEditorAction(TextView v, int actionId, KeyEvent event) { + if (actionId == EditorInfo.IME_ACTION_SEARCH || + actionId == EditorInfo.IME_ACTION_DONE || + event.getAction() == KeyEvent.ACTION_DOWN && + event.getKeyCode() == KeyEvent.KEYCODE_ENTER) { + + InputMethodManager imm = (InputMethodManager)AppContext.getMainActivity().getSystemService(Context.INPUT_METHOD_SERVICE); + imm.hideSoftInputFromWindow(v.getWindowToken(), 0); + return true; + } + return false; + } + }); + + CourseName names[] = AppContext.getDatabaseManager().getCourseNames(); + String courseNames[] = new String[names.length]; + for(int i = 0; i < names.length; i++) { + courseNames[i] = names[i].getName(); + } + + ArrayAdapter adapter = new ArrayAdapter(AppContext.getMainActivity(), android.R.layout.simple_list_item_1, courseNames); + courseNameInput.setAdapter(adapter); + return oFragmentView; } @@ -82,7 +117,7 @@ public class Settings extends CampusAppFragment { String mensaRoleName = AppContext.getDatabaseManager().getRuntimeCache("MensaRole"); if (mensaRoleName == null || mensaRoleName.isEmpty()) - mensaRoleName = ""; + mensaRoleName = "0"; String newMensaRoleName = Integer.toString(mensaRoleInput.getSelectedItemPosition()); if(!mensaRoleName.equalsIgnoreCase(newMensaRoleName)) { AppContext.getDatabaseManager().setRuntimeCache("MensaRole", newMensaRoleName); @@ -91,7 +126,6 @@ public class Settings extends CampusAppFragment { if(overrideNavigation) { AppContext.getNavigationManager().navigatePage("Splashscreen", null, false); - } } } diff --git a/app/src/main/java/de/dhbwloe/campusapp/fragments/SplashScreen.java b/app/src/main/java/de/dhbwloe/campusapp/fragments/SplashScreen.java index e94ddb3..445a608 100644 --- a/app/src/main/java/de/dhbwloe/campusapp/fragments/SplashScreen.java +++ b/app/src/main/java/de/dhbwloe/campusapp/fragments/SplashScreen.java @@ -34,6 +34,8 @@ import de.dhbwloe.campusapp.CampusApp; import de.dhbwloe.campusapp.CampusAppContext; import de.dhbwloe.campusapp.CampusAppFragment; import de.dhbwloe.campusapp.R; +import de.dhbwloe.campusapp.coursenames.CourseNameManager; +import de.dhbwloe.campusapp.coursenames.CourseNameManagerInterface; import de.dhbwloe.campusapp.mensaplan.MensaplanManager; import de.dhbwloe.campusapp.mensaplan.MensaplanManagerInterface; import de.dhbwloe.campusapp.news.NewsManager; @@ -111,6 +113,34 @@ public class SplashScreen extends CampusAppFragment { AppContext.addDefaultSearchIndexes(); break; case 3: + String lastCNSyncStr = AppContext.getDatabaseManager().getRuntimeCache("LastCNSync"); + long lastCNSync; + if(lastCNSyncStr != null) + lastCNSync = Long.parseLong(lastCNSyncStr); + else + lastCNSync = 0; + + CourseNameManager cnm = new CourseNameManager(); + + if(lastCNSync == 0 || now - lastCNSync > (86400 * 7)) { //sync every 7 days + cnm.synchronizeCourseNames(new CourseNameManagerInterface() { + @Override + public void onCourseNamesSynchronized() { + long now = (new Date()).getTime() / 1000; + AppContext.getDatabaseManager().setRuntimeCache("LastCNSync", Long.toString(now)); + timerHandler.postDelayed(timerRunnable, 100); + } + + @Override + public void onCourseNamesFailed(String errorMessage) { + timerHandler.postDelayed(timerRunnable, 100); + } + }); + } + else + break; + return; + case 4: String startCounter = AppContext.getDatabaseManager().getRuntimeCache("AppStartCounter"); if(startCounter == null || Integer.parseInt(startCounter) == 0) { AppContext.getNavigationManager().navigatePage("FirstRun", null, false); @@ -118,7 +148,7 @@ public class SplashScreen extends CampusAppFragment { } AppContext.getDatabaseManager().setRuntimeCache("AppStartCounter", Integer.toString(Integer.parseInt(startCounter) + 1)); break; - case 4: + case 5: String lastVLMFullSyncStr = AppContext.getDatabaseManager().getRuntimeCache("LastVLMFullSync"); String lastVLMPartialSyncStr = AppContext.getDatabaseManager().getRuntimeCache("LastVLMPartialSync"); long lastVLMFullSync, lastVLMPartialSync; @@ -131,7 +161,7 @@ public class SplashScreen extends CampusAppFragment { else lastVLMPartialSync = 0; - String kursTag = AppContext.getDatabaseManager().getRuntimeCache("CourseName"); + final String kursTag = AppContext.getDatabaseManager().getRuntimeCache("CourseName"); if(kursTag == null || kursTag.isEmpty()) break; CalendarManager vpm = new CalendarManager(AppContext, kursTag); @@ -140,6 +170,11 @@ public class SplashScreen extends CampusAppFragment { vpm.performFullSynchronisation(new CalendarManagerInterface() { @Override public void onCalendarUpdateDone() { + if(!AppContext.getDatabaseManager().haveCourseName(kursTag)) { + CourseNameManager cnm = new CourseNameManager(); + cnm.addCourseName(kursTag); + } + long now = (new Date()).getTime() / 1000; AppContext.getDatabaseManager().setRuntimeCache("LastVLMFullSync", Long.toString(now)); AppContext.getDatabaseManager().setRuntimeCache("LastVLMPartialSync", Long.toString(now)); @@ -168,6 +203,11 @@ public class SplashScreen extends CampusAppFragment { vpm.performFastSynchronisation(new CalendarManagerInterface() { @Override public void onCalendarUpdateDone() { + if(!AppContext.getDatabaseManager().haveCourseName(kursTag)) { + CourseNameManager cnm = new CourseNameManager(); + cnm.addCourseName(kursTag); + } + long now = (new Date()).getTime()/1000; AppContext.getDatabaseManager().setRuntimeCache("LastVLMPartialSync", Long.toString(now)); timerHandler.postDelayed(timerRunnable, 100); @@ -193,7 +233,7 @@ public class SplashScreen extends CampusAppFragment { else break; return; - case 5: + case 6: String lastMPMSyncStr = AppContext.getDatabaseManager().getRuntimeCache("LastMPSync"); long lastMPMSync; if(lastMPMSyncStr != null) @@ -221,9 +261,9 @@ public class SplashScreen extends CampusAppFragment { else break; return; - case 6: case 7: - final String syncSource = (progressCounter == 6 ? "DHBW" : "STUV"); + case 8: + final String syncSource = (progressCounter == 7 ? "DHBW" : "STUV"); String lastNewsSyncStr = AppContext.getDatabaseManager().getRuntimeCache("LastNewsSync_"+syncSource); long lastNewsSync; if(lastNewsSyncStr != null) @@ -251,7 +291,7 @@ public class SplashScreen extends CampusAppFragment { else break; return; - case 8: + case 9: String lastStuvSyncStr = AppContext.getDatabaseManager().getRuntimeCache("LastStuvSync"); long lastStuvSync; if(lastStuvSyncStr != null) diff --git a/app/src/main/java/de/dhbwloe/campusapp/network/JsonRequestHelper.java b/app/src/main/java/de/dhbwloe/campusapp/network/JsonRequestHelper.java new file mode 100644 index 0000000..54e8f09 --- /dev/null +++ b/app/src/main/java/de/dhbwloe/campusapp/network/JsonRequestHelper.java @@ -0,0 +1,75 @@ +package de.dhbwloe.campusapp.network; + +import android.util.Log; + +import com.loopj.android.http.AsyncHttpClient; +import com.loopj.android.http.AsyncHttpResponseHandler; + +import org.json.JSONArray; +import org.json.JSONException; +import org.json.JSONObject; + +import java.util.List; + +import cz.msebera.android.httpclient.Header; + +/** + * Created by pk910 on 09.03.2016. + */ +public abstract class JsonRequestHelper { + + protected void requestJsonFromWeb(String url) { + AsyncHttpClient client = new AsyncHttpClient(); + + Log.i("HTTPClient", "Request: " + url); + client.get(url, new AsyncHttpResponseHandler() { + @Override + public void onStart() { + } + + @Override + public void onSuccess(int statusCode, Header[] headers, byte[] response) { + String recvStr = new String(response); + JSONObject jsonObj = null; + JSONArray jsonArr = null; + try { + jsonObj = new JSONObject(recvStr); + } catch (JSONException e) { + e.printStackTrace(); + } + try { + jsonArr = new JSONArray(recvStr); + } catch (JSONException e) { + e.printStackTrace(); + } + if(jsonObj != null) + onJsonReceived(jsonObj); + else if(jsonArr != null) + onJsonReceived(jsonArr); + else + onTextReceived(recvStr); + } + + @Override + public void onFailure(int statusCode, Header[] headers, byte[] errorResponse, Throwable e) { + String error = null; + try { + error = new String(errorResponse, "US-ASCII"); + } catch (Exception e1) { + } + Log.i("HTTPClient", " Error: " + statusCode + " - " + error); + onJsonRequestFail(statusCode, error); + } + + @Override + public void onRetry(int retryNo) { + } + }); + } + + protected abstract void onJsonReceived(JSONObject json); + protected abstract void onJsonReceived(JSONArray json); + protected abstract void onTextReceived(String response); + protected abstract void onJsonRequestFail(int statusCode, String errorMessage); + +} diff --git a/app/src/main/res/layout/fragment_first_run.xml b/app/src/main/res/layout/fragment_first_run.xml index 436457e..e190f5d 100644 --- a/app/src/main/res/layout/fragment_first_run.xml +++ b/app/src/main/res/layout/fragment_first_run.xml @@ -29,12 +29,14 @@ android:layout_centerHorizontal="true" android:layout_below="@+id/textView20"> - + android:layout_alignWithParentIfMissing="false" + android:imeOptions="actionDone" + android:singleLine="true"/>