--- /dev/null
+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");
+ }
+
+}
--- /dev/null
+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);
+ }
+}
--- /dev/null
+package de.dhbwloe.campusapp.coursenames;
+
+/**
+ * Created by pk910 on 09.03.2016.
+ */
+public interface CourseNameManagerInterface {
+
+ public void onCourseNamesSynchronized();
+ public void onCourseNamesFailed(String errorMessage);
+
+}
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;
*/
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;
}
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
}
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)
* 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.
}
});
+ 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;
* 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() {
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;
}
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);
if(overrideNavigation) {
AppContext.getNavigationManager().navigatePage("Splashscreen", null, false);
-
}
}
}
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;
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);
}
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;
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);
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));
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);
else
break;
return;
- case 5:
+ case 6:
String lastMPMSyncStr = AppContext.getDatabaseManager().getRuntimeCache("LastMPSync");
long lastMPMSync;
if(lastMPMSyncStr != null)
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)
else
break;
return;
- case 8:
+ case 9:
String lastStuvSyncStr = AppContext.getDatabaseManager().getRuntimeCache("LastStuvSync");
long lastStuvSync;
if(lastStuvSyncStr != null)
--- /dev/null
+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);
+
+}
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"
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" />