Autocomplete Feature für Kursnamen hinzugefügt (eigene API, da von DHBW nicht bereitg...
authorpk910 <philipp@pk910.de>
Wed, 9 Mar 2016 13:54:57 +0000 (14:54 +0100)
committerpk910 <philipp@pk910.de>
Wed, 9 Mar 2016 13:54:57 +0000 (14:54 +0100)
app/src/main/java/de/dhbwloe/campusapp/coursenames/CourseName.java [new file with mode: 0644]
app/src/main/java/de/dhbwloe/campusapp/coursenames/CourseNameManager.java [new file with mode: 0644]
app/src/main/java/de/dhbwloe/campusapp/coursenames/CourseNameManagerInterface.java [new file with mode: 0644]
app/src/main/java/de/dhbwloe/campusapp/database/DatabaseManager.java
app/src/main/java/de/dhbwloe/campusapp/fragments/FirstRun.java
app/src/main/java/de/dhbwloe/campusapp/fragments/Settings.java
app/src/main/java/de/dhbwloe/campusapp/fragments/SplashScreen.java
app/src/main/java/de/dhbwloe/campusapp/network/JsonRequestHelper.java [new file with mode: 0644]
app/src/main/res/layout/fragment_first_run.xml
app/src/main/res/layout/fragment_settings.xml

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 (file)
index 0000000..3d3545c
--- /dev/null
@@ -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 (file)
index 0000000..546238b
--- /dev/null
@@ -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<CourseNameManagerInterface> aCallbackInterfaces = new ArrayList<CourseNameManagerInterface>();
+    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 (file)
index 0000000..890d8a1
--- /dev/null
@@ -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);
+
+}
index d042bd0810a3e4b6fc1f121b96deb1b2477ce56b..628d78f88ff9728d0437e61b025539c68c44e029 100644 (file)
@@ -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<CourseName> courseNames = new ArrayList<CourseName>();
+        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)
index 1267e5b7ed806304325775133432f407e3fdab25..3e723802fa04501ddcc9c534a282e9f8758e9dbb 100644 (file)
  * along with this program. If not, see <http://www.gnu.org/licenses/>.
  */
 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<String> adapter = new ArrayAdapter<String>(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;
index f59d2237469d7b54b03f8cc887bb35d0a7d082e5..e34eb72cf9203fdda130a42fe21c0656e169077d 100644 (file)
  * along with this program. If not, see <http://www.gnu.org/licenses/>.
  */
 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<String> adapter = new ArrayAdapter<String>(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);
-
         }
     }
 }
index e94ddb3712e8f608efc7b184365a1a377364ad51..445a6082260f6b92f7efb724ab65c31d5e1b65cb 100644 (file)
@@ -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 (file)
index 0000000..54e8f09
--- /dev/null
@@ -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);
+
+}
index 436457e07006d09ca8c1759c86364b05c3541571..e190f5db8b0378399f7f72cad14f6fe9a0e0c057 100644 (file)
             android:layout_centerHorizontal="true"
             android:layout_below="@+id/textView20">
 
-            <EditText
+            <AutoCompleteTextView
                 android:layout_width="150dp"
                 android:layout_height="wrap_content"
                 android:id="@+id/courseInput"
                 android:layout_gravity="center_horizontal"
-                android:layout_alignWithParentIfMissing="false" />
+                android:layout_alignWithParentIfMissing="false"
+                android:imeOptions="actionDone"
+                android:singleLine="true"/>
 
             <Button
                 android:layout_width="wrap_content"
index 5de3aed0ba954560dd509bdeb7f8f87b4f8fcb54..cd5f5b81702bc05462a7278604bd489928dd3dc3 100644 (file)
                     android:layout_alignBottom="@+id/courseNameInput"
                     android:layout_marginBottom="8dp" />
 
-                <EditText
+                <AutoCompleteTextView
                     android:layout_width="150dp"
                     android:layout_height="wrap_content"
                     android:id="@+id/courseNameInput"
                     android:layout_alignParentTop="true"
                     android:layout_alignParentRight="true"
-                    android:layout_alignParentEnd="true" />
+                    android:layout_alignParentEnd="true"
+                    android:imeOptions="actionDone"
+                    android:singleLine="true" />
 
                 <TextView
                     android:layout_width="wrap_content"
                     android:id="@+id/textView33"
                     android:layout_alignParentTop="false"
                     android:layout_alignParentLeft="true"
-                    android:layout_alignParentStart="true"
+                    android:layout_alignParentStart="false"
                     android:layout_marginBottom="8dp"
                     android:layout_alignBottom="@+id/mensaRoleInput" />