From: pk910 Date: Sun, 21 Feb 2016 20:41:20 +0000 (+0100) Subject: alpha 0.0.1 X-Git-Url: http://git.pk910.de/?p=DHBWCampusApp.git;a=commitdiff_plain;h=9a28e7b4c1520f629721693a04b4978fec9692e7 alpha 0.0.1 --- diff --git a/app/build.gradle b/app/build.gradle index 6414d6d..f86b286 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -33,7 +33,7 @@ android { dependencies { compile fileTree(dir: 'libs', include: ['*.jar']) - testCompile 'junit:junit:4.12' + testCompile 'junit:junit:4.11' compile 'org.mnode.ical4j:ical4j:1.0.5' compile 'backport-util-concurrent:backport-util-concurrent:3.1' compile 'commons-codec:commons-codec:1.8' @@ -44,6 +44,10 @@ dependencies { compile 'com.android.support:appcompat-v7:23.1.1' compile 'com.android.support:design:23.1.1' compile 'com.android.support:support-v4:23.1.1' + compile 'com.squareup.okhttp3:mockwebserver:3.1.2' + compile 'com.squareup.mimecraft:mimecraft:1.1.1' + compile 'com.android.support:cardview-v7:23.1.1' + compile 'com.android.support:recyclerview-v7:23.1.1' } @@ -58,3 +62,10 @@ dependencies { + + + + + + + diff --git a/app/src/main/java/de/dhbwloe/campusapp/CampusAppContext.java b/app/src/main/java/de/dhbwloe/campusapp/CampusAppContext.java index 89cbc7c..11d3999 100644 --- a/app/src/main/java/de/dhbwloe/campusapp/CampusAppContext.java +++ b/app/src/main/java/de/dhbwloe/campusapp/CampusAppContext.java @@ -14,7 +14,6 @@ import de.dhbwloe.campusapp.fragments.FirstRun; import de.dhbwloe.campusapp.fragments.Impressum; import de.dhbwloe.campusapp.fragments.Mensa; import de.dhbwloe.campusapp.fragments.MensaCard; -import de.dhbwloe.campusapp.fragments.MensaWochenplan; import de.dhbwloe.campusapp.fragments.News; import de.dhbwloe.campusapp.fragments.PopupFragment; import de.dhbwloe.campusapp.fragments.SplashScreen; @@ -167,4 +166,9 @@ public class CampusAppContext { return oContextVariables; } + public String getResString(int id) { + String str = oMainActivity.getResources().getString(id); + return str; + } + } diff --git a/app/src/main/java/de/dhbwloe/campusapp/CampusAppFragment.java b/app/src/main/java/de/dhbwloe/campusapp/CampusAppFragment.java index e0aead8..4707a73 100644 --- a/app/src/main/java/de/dhbwloe/campusapp/CampusAppFragment.java +++ b/app/src/main/java/de/dhbwloe/campusapp/CampusAppFragment.java @@ -4,6 +4,8 @@ import android.os.Bundle; import android.support.v4.app.Fragment; import android.view.View; +import java.lang.reflect.Field; + import de.dhbwloe.campusapp.search.SearchIndices; /** @@ -23,4 +25,20 @@ public abstract class CampusAppFragment extends Fragment { return new SearchIndices[0]; } + @Override + public void onDetach() { + super.onDetach(); + + try { + Field childFragmentManager = Fragment.class.getDeclaredField("mChildFragmentManager"); + childFragmentManager.setAccessible(true); + childFragmentManager.set(this, null); + + } catch (NoSuchFieldException e) { + throw new RuntimeException(e); + } catch (IllegalAccessException e) { + throw new RuntimeException(e); + } + } + } diff --git a/app/src/main/java/de/dhbwloe/campusapp/Tools.java b/app/src/main/java/de/dhbwloe/campusapp/Tools.java index 02c8d7a..168446e 100644 --- a/app/src/main/java/de/dhbwloe/campusapp/Tools.java +++ b/app/src/main/java/de/dhbwloe/campusapp/Tools.java @@ -1,5 +1,9 @@ package de.dhbwloe.campusapp; +import android.view.View; +import android.view.ViewGroup; +import android.widget.AdapterView; + import java.security.MessageDigest; import java.security.NoSuchAlgorithmException; @@ -51,4 +55,19 @@ public class Tools { return decrypted; } + public static void removeAllChildViews(ViewGroup viewGroup) { + for (int i = 0; i < viewGroup.getChildCount(); i++) { + View child = viewGroup.getChildAt(i); + if (child instanceof ViewGroup) { + if (child instanceof AdapterView) { + viewGroup.removeView(child); + return; + } + removeAllChildViews(((ViewGroup) child)); + } else { + viewGroup.removeView(child); + } + } + } + } 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 ccf9a04..fed7eac 100644 --- a/app/src/main/java/de/dhbwloe/campusapp/database/DatabaseManager.java +++ b/app/src/main/java/de/dhbwloe/campusapp/database/DatabaseManager.java @@ -6,6 +6,7 @@ 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; @@ -31,7 +32,7 @@ import de.dhbwloe.campusapp.vorlesungen.CourseGroup; */ public class DatabaseManager { private static final String DATABASE_NAME = "DHBWLoe.CampusApp.DEV"; - private static final int DATABASE_VERSION = 1; + private static final int DATABASE_VERSION = 2; private CampusAppContext AppContext; private SQLiteDatabase database; private NewsDatabaseHelper newsDBHelper; @@ -67,7 +68,8 @@ public class DatabaseManager { if(version < DATABASE_VERSION) upgradeTables(version, DATABASE_VERSION); - + //database.execSQL("DELETE FROM CourseCalendar"); + //database.execSQL("DELETE FROM CourseCalendarEvent"); } private void upgradeTables(int oldVersion, int newVersion) { @@ -162,10 +164,14 @@ public class DatabaseManager { } if(oldVersion < 2 && newVersion >= 2) { // Version 2 + database.execSQL("ALTER TABLE CourseCalendarEvent ADD EventType INT;"); + } + if(oldVersion < 3 && newVersion >= 3) { + // Version 3 } - database.execSQL("UPDATE Version SET Version = "+Integer.toString(newVersion)); + database.execSQL("UPDATE Version SET Version = " + Integer.toString(newVersion)); } public void addSearchIndices(SearchIndices[] indices) { @@ -356,11 +362,11 @@ public class DatabaseManager { return nfcCardData; } - public void updateCourseCalendar(CourseEvent event) { + public void updateCourseCalendar(CourseEvent event, Component cevent) { openDatabase(); if(vorlesungsplanDBHelper == null) vorlesungsplanDBHelper = new VorlesungsplanDatabaseHelper(AppContext, database); - vorlesungsplanDBHelper.updateCourseCalendar(event); + vorlesungsplanDBHelper.updateCourseCalendar(event, cevent); } public CourseEvent[] getCourseCalendarEvents(String coursename, long timeFrom, long timeTo) { @@ -370,6 +376,13 @@ public class DatabaseManager { return vorlesungsplanDBHelper.getCourseCalendarEvents(coursename, timeFrom, timeTo); } + public CourseEvent[] getCourseCalendarTimetable(String coursename, long timeFrom, int days) { + openDatabase(); + if(vorlesungsplanDBHelper == null) + vorlesungsplanDBHelper = new VorlesungsplanDatabaseHelper(AppContext, database); + return vorlesungsplanDBHelper.getCourseCalendarTimetable(coursename, timeFrom, days); + } + public CourseGroup getCourseGroup(int courseGroupId) { openDatabase(); if(vorlesungsplanDBHelper == null) @@ -391,6 +404,13 @@ public class DatabaseManager { return vorlesungsplanDBHelper.addCourseGroup(coursename, groupname); } + public CourseGroup[] getCourseGroups(String coursename, Date notBefore) { + openDatabase(); + if(vorlesungsplanDBHelper == null) + vorlesungsplanDBHelper = new VorlesungsplanDatabaseHelper(AppContext, database); + return vorlesungsplanDBHelper.getCourseGroups(coursename, notBefore); + } + public void updateMensaTagesplan(MensaTagesplan plan) { openDatabase(); if(mensaplanDBHelper == null) diff --git a/app/src/main/java/de/dhbwloe/campusapp/database/VorlesungsplanDatabaseHelper.java b/app/src/main/java/de/dhbwloe/campusapp/database/VorlesungsplanDatabaseHelper.java index e38b87d..f4d5c8a 100644 --- a/app/src/main/java/de/dhbwloe/campusapp/database/VorlesungsplanDatabaseHelper.java +++ b/app/src/main/java/de/dhbwloe/campusapp/database/VorlesungsplanDatabaseHelper.java @@ -3,18 +3,25 @@ package de.dhbwloe.campusapp.database; import android.content.ContentValues; import android.database.Cursor; import android.database.sqlite.SQLiteDatabase; +import android.os.Bundle; 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.PeriodList; import net.fortuna.ical4j.model.Recur; import net.fortuna.ical4j.model.parameter.Value; import net.fortuna.ical4j.model.property.RRule; import java.text.ParseException; +import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.Date; +import java.util.Iterator; +import java.util.List; +import java.util.TimeZone; import de.dhbwloe.campusapp.CampusAppContext; import de.dhbwloe.campusapp.vorlesungen.CourseEvent; @@ -33,7 +40,7 @@ public class VorlesungsplanDatabaseHelper { } - public void updateCourseCalendar(CourseEvent event) { + public void updateCourseCalendar(CourseEvent event, Component cevent) { boolean isExisting = false; String[] whereArgs = new String[] { event.getCourseName(), @@ -63,7 +70,7 @@ public class VorlesungsplanDatabaseHelper { updateValues.put("CourseGroupId", event.getCourseGroup().getGroupId()); database.update("CourseCalendar", updateValues, "CourseName = ? AND UniqueId = ?", whereArgs); - updateCourseCalendarEventTable(event, true); + updateCourseCalendarEventTable(event, true, cevent); } catch(Exception e) { e.printStackTrace(); } @@ -85,7 +92,7 @@ public class VorlesungsplanDatabaseHelper { long id = database.insertOrThrow("CourseCalendar", null, indexValues); event.setEventId((int) id); - updateCourseCalendarEventTable(event, false); + updateCourseCalendarEventTable(event, false, cevent); } catch(Exception e) { e.printStackTrace(); } @@ -93,61 +100,39 @@ public class VorlesungsplanDatabaseHelper { } - private void updateCourseCalendarEventTable(CourseEvent event, boolean clear) { + private void updateCourseCalendarEventTable(CourseEvent dbevent, boolean clear, Component event) { if(clear) { String[] whereArgs = { - Integer.toString(event.getEventId()) + Integer.toString(dbevent.getEventId()) }; database.rawQuery("DELETE FROM CourseCalendarEvent WHERE EventId = ?", whereArgs); } - String rrule = event.getRecurRule(); - String exdates = event.getExcludeDates(); + SimpleDateFormat dateFormat = new SimpleDateFormat("yyyyMMdd'T'hhmmss"); + Date startDate = new Date((dbevent.getEventFrom())*1000); + Date endDate = new Date(startDate.getTime() + ((long)86400 * 365)*1000); + Period period = new Period(new DateTime(startDate), new DateTime(endDate)); + PeriodList recurrances = event.calculateRecurrenceSet(period); + + Log.i("DBM", "Update events table for " + dbevent.getUniqueId() + " ("+dbevent.getEventTitle()+")"); + Log.i("DBM", "events: " + recurrances.size()); + + for (Iterator iter = recurrances.iterator(); iter.hasNext();) { + Period eventper = iter.next(); - if(rrule != null && rrule.length() > 0) { - try { - Log.i("DBM", "RRule: " + rrule); - RRule rule = new RRule(rrule); - Recur recur = rule.getRecur(); - Date startDate = new Date((event.getEventFrom())*1000); - Date endDate = new Date(startDate.getTime() + (86400 * 365)*1000); - - DateTime startDateTime = new DateTime(startDate); - DateList dates = recur.getDates(startDateTime, new Period(startDateTime, new DateTime(endDate)), Value.DATE); - - Log.i("DBM", "Update events table for " + event.getUniqueId()); - Log.i("DBM", "events: " +dates.size()); - - for(int i = 0; i < dates.size(); i++) { - net.fortuna.ical4j.model.Date date = (net.fortuna.ical4j.model.Date) dates.get(i); - long eventStartTime = date.getTime() / 1000; - long eventEndTime = (eventStartTime + (event.getEventTo() - event.getEventFrom())) / 1000; - - try { - ContentValues indexValues = new ContentValues(); - indexValues.put("EventId", event.getEventId()); - indexValues.put("EventFrom", eventStartTime); - indexValues.put("EventTo", eventEndTime); - database.insertOrThrow("CourseCalendarEvent", null, indexValues); - } catch(Exception e) { - e.printStackTrace(); - } - } - - } catch (ParseException e) { - } - } else { try { + Log.i("DBM Add", dateFormat.format(eventper.getStart()) + " - " + dateFormat.format(eventper.getEnd())); + ContentValues indexValues = new ContentValues(); - indexValues.put("EventId", event.getEventId()); - indexValues.put("EventFrom", event.getEventFrom()); - indexValues.put("EventTo", event.getEventTo()); + indexValues.put("EventId", dbevent.getEventId()); + indexValues.put("EventFrom", eventper.getStart().getTime() / 1000); + indexValues.put("EventTo", eventper.getEnd().getTime() / 1000); + indexValues.put("EventType", dbevent.getCourseTypeId()); database.insertOrThrow("CourseCalendarEvent", null, indexValues); } catch(Exception e) { - e.printStackTrace(); + //e.printStackTrace(); } } - } public CourseEvent[] getCourseCalendarEvents(String coursename, long timeFrom, long timeTo) { @@ -156,7 +141,16 @@ public class VorlesungsplanDatabaseHelper { Long.toString(timeFrom), Long.toString(timeTo) }; - Cursor resultSet = database.rawQuery("SELECT Id, CourseName, UniqueId, SequenceId, EventFrom, EventTo, EventTitle, EventLocation, EventStatus, RecurRule, ExcludeDates, CourseGroupId FROM CourseCalendar WHERE CourseName = ? AND EventTo >= ? AND EventFrom <= ?", whereArgs); + Cursor resultSet = database.rawQuery( + "SELECT " + + "Id, CourseName, UniqueId, SequenceId, CourseCalendarEvent.EventFrom, CourseCalendarEvent.EventTo, EventTitle, EventLocation, EventStatus, RecurRule, ExcludeDates, CourseGroupId, EventType " + + "FROM " + + "CourseCalendarEvent " + + "LEFT JOIN " + + "CourseCalendar ON CourseCalendar.Id = CourseCalendarEvent.EventId "+ + "WHERE " + + "CourseName = ? AND CourseCalendarEvent.EventTo >= ? AND CourseCalendarEvent.EventFrom <= ? ", + whereArgs); ArrayList events = new ArrayList(); if(resultSet.moveToFirst()) { int[] columnIndexes = { @@ -171,7 +165,8 @@ public class VorlesungsplanDatabaseHelper { resultSet.getColumnIndex("EventStatus"), resultSet.getColumnIndex("RecurRule"), resultSet.getColumnIndex("ExcludeDates"), - resultSet.getColumnIndex("CourseGroupId") + resultSet.getColumnIndex("CourseGroupId"), + resultSet.getColumnIndex("EventType") }; do { int groupId = resultSet.getInt(columnIndexes[11]); @@ -180,9 +175,12 @@ public class VorlesungsplanDatabaseHelper { group = CourseGroup.GetCourseGroupById(AppContext.getDatabaseManager(), groupId); else group = null; + + int eventType = resultSet.getInt(columnIndexes[12]); + CourseEvent event = new CourseEvent(resultSet.getInt(columnIndexes[0]), resultSet.getString(columnIndexes[1]), resultSet.getString(columnIndexes[2]), resultSet.getInt(columnIndexes[3]), resultSet.getLong(columnIndexes[4]), resultSet.getLong(columnIndexes[5]), resultSet.getString(columnIndexes[6]), resultSet.getString(columnIndexes[7]), - resultSet.getString(columnIndexes[8]), resultSet.getString(columnIndexes[9]), resultSet.getString(columnIndexes[10]), group); + resultSet.getString(columnIndexes[8]), resultSet.getString(columnIndexes[9]), resultSet.getString(columnIndexes[10]), group, eventType); events.add(event); } while (resultSet.moveToNext()); @@ -194,6 +192,98 @@ public class VorlesungsplanDatabaseHelper { return eventsArr; } + public CourseEvent[] getCourseCalendarTimetable(String coursename, long timeFrom, int days) { + String[] whereArgs; + whereArgs = new String[] { + coursename, + Long.toString(timeFrom), + Integer.toString(days) + }; + ArrayList events = new ArrayList(); + + Cursor resultSet = database.rawQuery( + "SELECT " + + "COUNT(*) as EventCount, " + + "strftime('%Y%m%d', datetime(CourseCalendarEvent.EventTo, 'unixepoch')) as DayId " + + "FROM "+ + "CourseCalendarEvent " + + "LEFT JOIN CourseCalendar ON CourseCalendar.Id = CourseCalendarEvent.EventId " + + "WHERE " + + "CourseCalendar.CourseName = ? AND " + + "CourseCalendarEvent.EventTo >= ? " + + "GROUP BY DayId " + + "ORDER BY DayId ASC " + + "LIMIT ? ", + whereArgs); + if(resultSet.moveToFirst()) { + do { + int eventCount = resultSet.getInt(0); + int dayId = resultSet.getInt(1); + + if(eventCount == 0) + continue; + + whereArgs = new String[] { + Integer.toString(dayId), + coursename + }; + + Cursor resultSet2 = database.rawQuery( + "SELECT " + + "CourseCalendar.Id, CourseCalendar.CourseName, CourseCalendar.UniqueId, CourseCalendar.SequenceId, " + + "CourseCalendarEvent.EventFrom, CourseCalendarEvent.EventTo, CourseCalendar.EventTitle, CourseCalendar.EventLocation, " + + "CourseCalendar.EventStatus, CourseCalendar.RecurRule, CourseCalendar.ExcludeDates, CourseCalendar.CourseGroupId, EventType, " + + "strftime('%Y%m%d', datetime(CourseCalendarEvent.EventTo, 'unixepoch')) as DayId " + + "FROM " + + "CourseCalendarEvent " + + "LEFT JOIN CourseCalendar ON CourseCalendarEvent.EventId = CourseCalendar.Id " + + "WHERE DayId = ? AND " + + "CourseCalendar.CourseName = ? " + + "ORDER BY CourseCalendarEvent.EventFrom ASC", + whereArgs); + + int[] columnIndexes = { + resultSet2.getColumnIndex("Id"), + resultSet2.getColumnIndex("CourseName"), + resultSet2.getColumnIndex("UniqueId"), + resultSet2.getColumnIndex("SequenceId"), + resultSet2.getColumnIndex("EventFrom"), + resultSet2.getColumnIndex("EventTo"), + resultSet2.getColumnIndex("EventTitle"), + resultSet2.getColumnIndex("EventLocation"), + resultSet2.getColumnIndex("EventStatus"), + resultSet2.getColumnIndex("RecurRule"), + resultSet2.getColumnIndex("ExcludeDates"), + resultSet2.getColumnIndex("CourseGroupId"), + resultSet2.getColumnIndex("EventType") + }; + resultSet2.moveToFirst(); + do { + int groupId = resultSet2.getInt(columnIndexes[11]); + CourseGroup group; + if(groupId > 0) + group = CourseGroup.GetCourseGroupById(AppContext.getDatabaseManager(), groupId); + else + group = null; + int eventType = resultSet2.getInt(columnIndexes[12]); + CourseEvent event = new CourseEvent(resultSet2.getInt(columnIndexes[0]), resultSet2.getString(columnIndexes[1]), resultSet2.getString(columnIndexes[2]), resultSet2.getInt(columnIndexes[3]), + resultSet2.getLong(columnIndexes[4]), resultSet2.getLong(columnIndexes[5]), resultSet2.getString(columnIndexes[6]), resultSet2.getString(columnIndexes[7]), + resultSet2.getString(columnIndexes[8]), resultSet2.getString(columnIndexes[9]), resultSet2.getString(columnIndexes[10]), group, eventType); + + events.add(event); + } while (resultSet2.moveToNext()); + resultSet2.close(); + } while (resultSet.moveToNext()); + resultSet.close(); + } + + CourseEvent[] eventsArr = new CourseEvent[events.size()]; + eventsArr = events.toArray(eventsArr); + return eventsArr; + } + + + public CourseGroup getCourseGroup(int courseGroupId) { CourseGroup coursegroup = null; String[] whereArgs = new String[] { @@ -242,4 +332,92 @@ public class VorlesungsplanDatabaseHelper { return null; } + public CourseGroup[] getCourseGroups(String coursename, Date notBefore) { + String[] whereArgs; + whereArgs = new String[] { + coursename + }; + ArrayList groups = new ArrayList(); + + /* + Cursor resultSet = database.rawQuery( + "SELECT CourseCalendarGroup.GroupId, CourseCalendarGroup.CourseName, CourseCalendarGroup.GroupName, t1.FirstEvent, t1.LastEvent, t1.EventCount FROM " + + "CourseCalendarGroup, ( " + + "SELECT CourseCalendar.CourseGroupId, MIN(CourseCalendarEvent.EventFrom) as FirstEvent, MAX(CourseCalendarEvent.EventTo) as LastEvent, COUNT(*) as EventCount " + + "FROM CourseCalendarEvent " + + "LEFT JOIN CourseCalendar ON CourseCalendar.Id = CourseCalendarEvent.EventId " + + "GROUP BY CourseCalendar.CourseGroupId " + + ") as t1 " + + "WHERE " + + "CourseCalendarGroup.GroupId = t1.CourseGroupId AND " + + "CourseName = ? AND t1.LastEvent > ? " + + "ORDER BY FirstEvent ASC", + whereArgs); + */ + Cursor resultSet = database.rawQuery( + "SELECT " + + "CourseCalendarGroup.GroupId, CourseCalendarGroup.CourseName, CourseCalendarGroup.GroupName, " + + "MIN(CourseCalendarEvent.EventFrom) as FirstEvent, " + + "MAX(" + + "CASE WHEN CourseCalendarEvent.EventType IN (0, 1) " + + "THEN CourseCalendarEvent.EventFrom " + + "ELSE 0 " + + "END) as LastEvent, " + + "MAX(CourseCalendarEvent.EventFrom) as LastEventFilter, " + + "COUNT(*) as EventCount, " + + "MIN(" + + "CASE WHEN CourseCalendarEvent.EventFrom < strftime('%s', 'now') " + + "THEN (strftime('%s', 'now')+(86400*365*5)+CourseCalendarEvent.EventFrom) " + + "ELSE CourseCalendarEvent.EventFrom " + + "END) as NextEvent, " + + "MIN(" + + "CASE WHEN CourseCalendarEvent.EventFrom < strftime('%s', 'now') OR CourseCalendarEvent.EventType NOT IN (2) " + + "THEN (strftime('%s', 'now')+(86400*365*5)+CourseCalendarEvent.EventFrom) " + + "ELSE CourseCalendarEvent.EventFrom " + + "END) as NextKlausurEvent, " + + "MIN(CASE WHEN CourseCalendarEvent.EventFrom <= strftime('%s', 'now') THEN 1 ELSE 0 END) as EventCompleted " + + "FROM " + + "CourseCalendarEvent " + + "LEFT JOIN CourseCalendar ON CourseCalendar.Id = CourseCalendarEvent.EventId " + + "LEFT JOIN CourseCalendarGroup ON CourseCalendarGroup.GroupId = CourseCalendar.CourseGroupId " + + "WHERE " + + "CourseCalendar.CourseName = ? " + + "GROUP BY CourseCalendarGroup.GroupId, CourseCalendarGroup.CourseName, CourseCalendarGroup.GroupName " + + "HAVING LastEventFilter > " + Long.toString((notBefore == null ? 0L : notBefore.getTime()/1000)) + " " + + "ORDER BY EventCompleted DESC, NextEvent ASC ", + whereArgs); + if(resultSet.moveToFirst()) { + int[] columnIndexes = { + resultSet.getColumnIndex("GroupId"), + resultSet.getColumnIndex("CourseName"), + resultSet.getColumnIndex("GroupName"), + resultSet.getColumnIndex("FirstEvent"), + resultSet.getColumnIndex("LastEvent"), + resultSet.getColumnIndex("EventCount"), + resultSet.getColumnIndex("NextEvent"), + resultSet.getColumnIndex("EventCompleted"), + resultSet.getColumnIndex("NextKlausurEvent"), + }; + do { + CourseGroup coursegroup = new CourseGroup(resultSet.getInt(columnIndexes[0]), resultSet.getString(columnIndexes[1]), resultSet.getString(columnIndexes[2])); + Bundle extraData = coursegroup.getExtraData(); + + extraData.putLong("FirstEvent", resultSet.getLong(columnIndexes[3])); + extraData.putLong("LastEvent", resultSet.getLong(columnIndexes[4])); + extraData.putInt("EventCount", resultSet.getInt(columnIndexes[5])); + extraData.putLong("NextEvent", resultSet.getLong(columnIndexes[6])); + extraData.putLong("NextKlausurEvent", resultSet.getLong(columnIndexes[8])); + extraData.putBoolean("EventCompleted", (resultSet.getInt(columnIndexes[7]) == 1)); + + groups.add(coursegroup); + + } while (resultSet.moveToNext()); + resultSet.close(); + } + + CourseGroup[] groupsArr = new CourseGroup[groups.size()]; + groupsArr = groups.toArray(groupsArr); + return groupsArr; + } + } diff --git a/app/src/main/java/de/dhbwloe/campusapp/fragments/Dashboard.java b/app/src/main/java/de/dhbwloe/campusapp/fragments/Dashboard.java index 5bea0bc..79d1f65 100644 --- a/app/src/main/java/de/dhbwloe/campusapp/fragments/Dashboard.java +++ b/app/src/main/java/de/dhbwloe/campusapp/fragments/Dashboard.java @@ -3,6 +3,10 @@ package de.dhbwloe.campusapp.fragments; import de.dhbwloe.campusapp.CampusAppFragment; import android.os.Bundle; +import android.support.v4.app.Fragment; +import android.support.v4.app.FragmentTransaction; +import android.support.v7.widget.CardView; +import android.view.InflateException; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; @@ -11,6 +15,7 @@ import de.dhbwloe.campusapp.R; import de.dhbwloe.campusapp.search.SearchIndices; public class Dashboard extends CampusAppFragment { + private static View view; /* implement this for search results ;) */ public static SearchIndices[] GetSearchIndices() { return new SearchIndices[] { @@ -28,15 +33,30 @@ public class Dashboard extends CampusAppFragment { @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); + + AppContext.getDatabaseManager().setRuntimeCache("CourseName", "tif13a"); } @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { - View view = inflater.inflate(R.layout.fragment_dashboard, container, false); + if (view != null) { + ViewGroup parent = (ViewGroup) view.getParent(); + if (parent != null) + parent.removeView(view); + } + + try { + view = inflater.inflate(R.layout.fragment_dashboard, container, false); + } catch (InflateException e) { + } AppContext.setTitle("Dashboard"); - + String kursTag = AppContext.getDatabaseManager().getRuntimeCache("CourseName"); + if(kursTag == null || kursTag.isEmpty()) { + CardView timetable = (CardView) view.findViewById(R.id.card_timetable); + timetable.setVisibility(View.GONE); + } return view; } diff --git a/app/src/main/java/de/dhbwloe/campusapp/fragments/DashboardMensa.java b/app/src/main/java/de/dhbwloe/campusapp/fragments/DashboardMensa.java new file mode 100644 index 0000000..2d473a5 --- /dev/null +++ b/app/src/main/java/de/dhbwloe/campusapp/fragments/DashboardMensa.java @@ -0,0 +1,104 @@ +package de.dhbwloe.campusapp.fragments; + + +import android.os.Bundle; +import android.support.v4.app.Fragment; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.widget.LinearLayout; +import android.widget.RelativeLayout; +import android.widget.TextView; + +import java.text.SimpleDateFormat; +import java.util.Calendar; +import java.util.Date; + +import de.dhbwloe.campusapp.CampusAppContext; +import de.dhbwloe.campusapp.CampusAppFragment; +import de.dhbwloe.campusapp.R; +import de.dhbwloe.campusapp.mensaplan.MensaTagesplan; + +/** + * A simple {@link Fragment} subclass. + */ +public class DashboardMensa extends CampusAppFragment { + private View view; + + public DashboardMensa() { + // Required empty public constructor + } + + + @Override + public View onCreateView(LayoutInflater inflater, ViewGroup container, + Bundle savedInstanceState) { + view = inflater.inflate(R.layout.fragment_dashboard_mensa, container, false); + refreshMensaMenue(); + return view; + } + + + private void refreshMensaMenue() { + if(AppContext == null) + AppContext = CampusAppContext.getInstance(); + Calendar cal = Calendar.getInstance(); + cal.setTime(new Date()); + cal.set(Calendar.HOUR_OF_DAY, 0); + cal.set(Calendar.MINUTE, 0); + cal.set(Calendar.SECOND, 0); + cal.set(Calendar.MILLISECOND, 0); + long now = (new Date()).getTime() / 1000; + long mensaCloseTime = (3600 * 13); // 13 uhr + long timeFrom = cal.getTime().getTime() / 1000; + if(now > timeFrom + mensaCloseTime) + timeFrom += 86400; + long timeTo = timeFrom + (86400 * 3) + 86399; // +3days for weekend + + MensaTagesplan[] dayplans = AppContext.getDatabaseManager().getMensaTagesplan(timeFrom, timeTo); + if(dayplans.length == 0) { + + return; + } + MensaTagesplan dayplan = dayplans[0]; + TextView dateTextView = (TextView) view.findViewById(R.id.menuDate); + dateTextView.setText(getDateText(dayplan.getPlanDate(), now)); + + LinearLayout menueContainer = (LinearLayout) view.findViewById(R.id.menuList); + menueContainer.removeAllViews(); + + MensaTagesplan cmenue = dayplan; + int i = 0; + LayoutInflater li = LayoutInflater.from(AppContext.getMainActivity()); + do { + RelativeLayout menu = (RelativeLayout) li.inflate(R.layout.fragment_dashboard_mensa_menu, null, false); + menueContainer.addView(menu); + + TextView menuName = (TextView) menu.findViewById(R.id.menuName); + TextView menuPrice = (TextView) menu.findViewById(R.id.menuPrice); + + menuName.setText(cmenue.getName()); + double price = cmenue.getStudentPrice(); + menuPrice.setText(Double.toString(price)); + } while(i < dayplans.length && (cmenue = dayplans[++i]) != null && cmenue.getPlanDate() == dayplan.getPlanDate()); + } + + private String getDateText(long date, long now) { + String datetext; + if(now < date+86400) + datetext = AppContext.getResString(R.string.dashboard_calendar_today); + else if(now < date + (86400*2)) + datetext = AppContext.getResString(R.string.dashboard_calendar_tomorrow); + else { + int weekdayResIds[] = new int[] { R.string.week_sunday, R.string.week_monday, R.string.week_tuesday, R.string.week_wednesday, R.string.week_thursday, R.string.week_friday, R.string.week_saturday }; + Calendar cal = Calendar.getInstance(); + cal.setTime(new Date(date * 1000)); + int dow = cal.get(Calendar.DAY_OF_WEEK); + SimpleDateFormat dateFormat = new SimpleDateFormat("dd.MM"); + + datetext = AppContext.getResString(weekdayResIds[dow]) + ", " + dateFormat.format(cal.getTime()); + } + return datetext; + } + +} diff --git a/app/src/main/java/de/dhbwloe/campusapp/fragments/DashboardNewsDhbw.java b/app/src/main/java/de/dhbwloe/campusapp/fragments/DashboardNewsDhbw.java new file mode 100644 index 0000000..3f1c3c2 --- /dev/null +++ b/app/src/main/java/de/dhbwloe/campusapp/fragments/DashboardNewsDhbw.java @@ -0,0 +1,31 @@ +package de.dhbwloe.campusapp.fragments; + + +import android.os.Bundle; +import android.support.v4.app.Fragment; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; + +import de.dhbwloe.campusapp.CampusAppFragment; +import de.dhbwloe.campusapp.R; + +/** + * A simple {@link Fragment} subclass. + */ +public class DashboardNewsDhbw extends CampusAppFragment { + + + public DashboardNewsDhbw() { + // Required empty public constructor + } + + + @Override + public View onCreateView(LayoutInflater inflater, ViewGroup container, + Bundle savedInstanceState) { + // Inflate the layout for this fragment + return inflater.inflate(R.layout.fragment_dashboard_news_dhbw, container, false); + } + +} diff --git a/app/src/main/java/de/dhbwloe/campusapp/fragments/DashboardNewsStuv.java b/app/src/main/java/de/dhbwloe/campusapp/fragments/DashboardNewsStuv.java new file mode 100644 index 0000000..73d83ec --- /dev/null +++ b/app/src/main/java/de/dhbwloe/campusapp/fragments/DashboardNewsStuv.java @@ -0,0 +1,31 @@ +package de.dhbwloe.campusapp.fragments; + + +import android.os.Bundle; +import android.support.v4.app.Fragment; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; + +import de.dhbwloe.campusapp.CampusAppFragment; +import de.dhbwloe.campusapp.R; + +/** + * A simple {@link Fragment} subclass. + */ +public class DashboardNewsStuv extends CampusAppFragment { + + + public DashboardNewsStuv() { + // Required empty public constructor + } + + + @Override + public View onCreateView(LayoutInflater inflater, ViewGroup container, + Bundle savedInstanceState) { + // Inflate the layout for this fragment + return inflater.inflate(R.layout.fragment_dashboard_news_stuv, container, false); + } + +} diff --git a/app/src/main/java/de/dhbwloe/campusapp/fragments/DashboardVorlesungsplan.java b/app/src/main/java/de/dhbwloe/campusapp/fragments/DashboardVorlesungsplan.java new file mode 100644 index 0000000..e67b364 --- /dev/null +++ b/app/src/main/java/de/dhbwloe/campusapp/fragments/DashboardVorlesungsplan.java @@ -0,0 +1,229 @@ +package de.dhbwloe.campusapp.fragments; + + +import android.os.Build; +import android.os.Bundle; +import android.support.v4.app.Fragment; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.widget.AdapterView; +import android.widget.RelativeLayout; +import android.widget.TextView; + +import java.text.SimpleDateFormat; +import java.util.ArrayList; +import java.util.Calendar; +import java.util.Date; +import java.util.List; + +import de.dhbwloe.campusapp.CampusAppContext; +import de.dhbwloe.campusapp.CampusAppFragment; +import de.dhbwloe.campusapp.R; +import de.dhbwloe.campusapp.Tools; +import de.dhbwloe.campusapp.vorlesungen.CourseEvent; + +/** + * A simple {@link Fragment} subclass. + */ +public class DashboardVorlesungsplan extends CampusAppFragment { + private static int lastGeneratedViewId = 572000; + private View view; + private List events1 = new ArrayList(); + private List events2 = new ArrayList(); + private String courseName; + + public DashboardVorlesungsplan() { + // Required empty public constructor + } + + + @Override + public View onCreateView(LayoutInflater inflater, ViewGroup container, + Bundle savedInstanceState) { + view = inflater.inflate(R.layout.fragment_dashboard_timetable, container, false); + String kursTag = AppContext.getDatabaseManager().getRuntimeCache("CourseName"); + if(kursTag == null || kursTag.isEmpty()) { + return null; + } + courseName = kursTag; + return view; + } + + @Override + public void onResume() { + super.onResume(); + if(courseName != null) + loadViewData(); + } + + private int getDayId(long time) { + Date date = new Date(time * 1000); + return getDayId(date); + } + private int getDayId(Date date) { + SimpleDateFormat dateFormat = new SimpleDateFormat("yyyyMMdd"); + return Integer.parseInt(dateFormat.format(date)); + } + + private void loadViewData() { + if(AppContext == null) + AppContext = CampusAppContext.getInstance(); + long now = (new Date()).getTime() / 1000; + long tomorrow = now + 86400; + + CourseEvent events[] = AppContext.getDatabaseManager().getCourseCalendarTimetable(courseName, now, 2); + events1.clear(); + events2.clear(); + if(events.length > 0) { + int firstDayId = getDayId(events[0].getEventTo()); + for (int i = 0; i < events.length; i++) { + if (i == 0 || getDayId(events[i].getEventTo()) == firstDayId) + events1.add(events[i]); + else + events2.add(events[i]); + } + } + + RelativeLayout container; + + container = (RelativeLayout)view.findViewById(R.id.date1Overview); + buildDayView(container, events1); + container.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + Bundle args = new Bundle(); + if (events1.size() > 0) { + long date = events1.get(0).getEventTo(); + args.putLong("date", date); + } + AppContext.getNavigationManager().navigatePage("Vorlesungsplan", args); + } + }); + + container = (RelativeLayout)view.findViewById(R.id.date2Overview); + buildDayView(container, events2); + container.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + Bundle args = new Bundle(); + if (events1.size() > 0) { + long date = events2.get(0).getEventTo(); + args.putLong("date", date); + } + AppContext.getNavigationManager().navigatePage("Vorlesungsplan", args); + } + }); + + int todayDayId = getDayId(now); + int tomorrowDayId = getDayId(tomorrow); + Date date; + + TextView date1 = (TextView) view.findViewById(R.id.dateView1); + if(events1.size() > 0) { + date = new Date(events1.get(0).getEventTo() * 1000); + date1.setText(getDateText(date, todayDayId, tomorrowDayId)); + } else + date1.setText(""); + + TextView date2 = (TextView) view.findViewById(R.id.dateView2); + if(events2.size() > 0) { + date = new Date(events2.get(0).getEventTo() * 1000); + date2.setText(getDateText(date, todayDayId, tomorrowDayId)); + } else + date2.setText(""); + } + + private void buildDayView(RelativeLayout container, List events) { + container.removeAllViews(); + + Date date; + TextView leftCol, rightCol = null; + RelativeLayout.LayoutParams params; + SimpleDateFormat dateFormat = new SimpleDateFormat("HH:mm"); + int firstLeftColId = 0; + + if(events.size() > 0) { + leftCol = new TextView(AppContext.getMainActivity()); + params = new RelativeLayout.LayoutParams(RelativeLayout.LayoutParams.WRAP_CONTENT, + RelativeLayout.LayoutParams.WRAP_CONTENT); + params.setMargins(8, 4, 0, 0); + leftCol.setLayoutParams(params); + leftCol.setId(generateViewId()); + firstLeftColId = leftCol.getId(); + container.addView(leftCol); + } else { + leftCol = null; + } + + for(int i = 0; i < events.size(); i++) { + CourseEvent event = events.get(i); + date = new Date(event.getEventFrom()*1000); + leftCol.setText(dateFormat.format(date)); + + rightCol = new TextView(AppContext.getMainActivity()); + rightCol.setId(generateViewId()); + params = new RelativeLayout.LayoutParams(RelativeLayout.LayoutParams.WRAP_CONTENT, + RelativeLayout.LayoutParams.WRAP_CONTENT); + params.setMargins(12, 12, 0, 0); + /* + android:layout_alignTop="@+id/date1time2" + android:layout_toRightOf="@+id/date1time1" + android:layout_toEndOf="@+id/date1time1" + */ + params.addRule(RelativeLayout.ALIGN_TOP, leftCol.getId()); + params.addRule(RelativeLayout.RIGHT_OF, firstLeftColId); + params.addRule(RelativeLayout.END_OF, firstLeftColId); + rightCol.setLayoutParams(params); + + String coursetitle = ""; + if(event.getCourseType() == CourseEvent.CourseType.COURSETYPE_KLAUSUR) + coursetitle += AppContext.getResString(R.string.dashboard_calendar_klausur); + coursetitle += event.getEventShortTitle(); + rightCol.setText(coursetitle); + + + leftCol = new TextView(AppContext.getMainActivity()); + leftCol.setId(generateViewId()); + params = new RelativeLayout.LayoutParams(RelativeLayout.LayoutParams.WRAP_CONTENT, + RelativeLayout.LayoutParams.WRAP_CONTENT); + params.setMargins(8, -8, 0, 0); + params.addRule(RelativeLayout.BELOW, rightCol.getId()); + leftCol.setLayoutParams(params); + + date = new Date(event.getEventTo()*1000); + leftCol.setText(dateFormat.format(date)); + + + container.addView(rightCol); + container.addView(leftCol); + } + } + + private String getDateText(Date eventDate, int todayDayId, int tomorrowDayId) { + int date1DayId = getDayId(eventDate); + String datetext; + if(date1DayId == todayDayId) + datetext = AppContext.getResString(R.string.dashboard_calendar_today); + else if(date1DayId == tomorrowDayId) + datetext = AppContext.getResString(R.string.dashboard_calendar_tomorrow); + else { + int weekdayResIds[] = new int[] { R.string.week_sunday, R.string.week_monday, R.string.week_tuesday, R.string.week_wednesday, R.string.week_thursday, R.string.week_friday, R.string.week_saturday }; + Calendar cal = Calendar.getInstance(); + cal.setTime(eventDate); + int dow = cal.get(Calendar.DAY_OF_WEEK); + SimpleDateFormat dateFormat = new SimpleDateFormat("dd.MM"); + + datetext = AppContext.getResString(weekdayResIds[dow]) + ", " + dateFormat.format(eventDate); + } + return datetext; + } + + private int generateViewId() { + if (Build.VERSION.SDK_INT >= 17) + return View.generateViewId(); + else + return lastGeneratedViewId++; + } + +} diff --git a/app/src/main/java/de/dhbwloe/campusapp/fragments/Mensa.java b/app/src/main/java/de/dhbwloe/campusapp/fragments/Mensa.java index ccc7785..2d641de 100644 --- a/app/src/main/java/de/dhbwloe/campusapp/fragments/Mensa.java +++ b/app/src/main/java/de/dhbwloe/campusapp/fragments/Mensa.java @@ -15,6 +15,7 @@ import android.view.ViewGroup; import java.text.SimpleDateFormat; import java.util.ArrayList; +import java.util.Calendar; import java.util.Date; import java.util.List; @@ -41,7 +42,6 @@ public class Mensa extends CampusAppFragment { private TabLayout tabLayout; private ViewPager viewPager; - private boolean viewDayplan; private long viewDate; @Override @@ -56,34 +56,10 @@ public class Mensa extends CampusAppFragment { long date; if(showdate != null && !showdate.isEmpty() && (date = Long.parseLong(showdate)) > 0) { viewDate = date; - viewDayplan = true; - viewmodeSet = true; - } - if(!viewmodeSet) { - String viewmode = arguments.getString("viewmode"); - if(viewmode != null && !viewmode.isEmpty()) { - if(viewmode.equalsIgnoreCase("day")) - viewDayplan = true; - else - viewDayplan = false; - viewmodeSet = true; - } - } - } - if(!viewmodeSet) { - String lastViewmode = AppContext.getDatabaseManager().getRuntimeCache("MensaplanViewMode"); - if(lastViewmode != null && !lastViewmode.isEmpty()) { - if(lastViewmode.equalsIgnoreCase("day")) - viewDayplan = true; - else - viewDayplan = false; - viewmodeSet = true; } } - if(!viewmodeSet) - viewDayplan = true; - AppContext.setTitle("Mensa "+(viewDayplan ? "Tagesplan" : "Wochenplan")); + AppContext.setTitle("Mensa Speiseplan"); /* toolbar = (Toolbar) view.findViewById(R.id.toolbar); @@ -106,14 +82,30 @@ public class Mensa extends CampusAppFragment { long[] showDates; long now = (new Date()).getTime()/1000; - if(viewDayplan) - showDates = AppContext.getDatabaseManager().getDaysWithPlanData(now - (30 * 86400), now + (30 * 86400)); - else - showDates = AppContext.getDatabaseManager().getDaysWithPlanData(now - (365 * 86400), now + (30 * 86400)); + if(viewDate < now) + now = viewDate; + + int weekdayResIds[] = new int[] { R.string.week_monday_short, R.string.week_tuesday_short, R.string.week_wednesday_short, R.string.week_thursday_short, R.string.week_friday_short, R.string.week_saturday_short, R.string.week_sunday_short }; + Calendar cal = Calendar.getInstance(); + cal.setTime(new Date(now * 1000)); + cal.set(Calendar.HOUR_OF_DAY, 0); + cal.set(Calendar.MINUTE, 0); + cal.set(Calendar.SECOND, 0); + cal.set(Calendar.MILLISECOND, 0); + long midnight = cal.getTimeInMillis() / 1000; + int dow = cal.get(Calendar.DAY_OF_WEEK); + dow -= 2; + if(dow < 0) // monday should be 0! + dow += 7; + long subTimeToWeekStart = (86400 * dow); + long showDateFrom = midnight - subTimeToWeekStart; + + showDates = AppContext.getDatabaseManager().getDaysWithPlanData(showDateFrom, now + (30 * 86400)); int activeItem = -1; long activeItemDiff = -1; Bundle args = getArguments(); + int lastWeekday = 0; for(int i = 0; i < showDates.length; i++) { long date = showDates[i]; Bundle bundle = new Bundle(); @@ -121,10 +113,12 @@ public class Mensa extends CampusAppFragment { bundle.putAll(args); String title; SimpleDateFormat sdf; - if(viewDayplan) - sdf = new SimpleDateFormat("dd.MM."); - else - sdf = new SimpleDateFormat("WW"); + + cal.setTime(new Date(date * 1000)); + int weekday = cal.get(Calendar.DAY_OF_WEEK); + weekday -= 2; // monday should be 0! + if(weekday < 0) + weekday += 7; if(viewDate > 0) { long diff = Math.abs(viewDate - date); @@ -134,16 +128,21 @@ public class Mensa extends CampusAppFragment { } } - title = sdf.format(new Date(date * 1000)); + if(lastWeekday > weekday) { + adapter.addFragment(null, null); + } + lastWeekday = weekday; + + title = AppContext.getResString(weekdayResIds[weekday]); bundle.putLong("date", date); adapter.addFragment(bundle, title); } viewPager.setAdapter(adapter); viewPager.setCurrentItem(activeItem); - if(viewDayplan) { - MensaTagesplan tagesplan = (MensaTagesplan)adapter.getItem(activeItem); - tagesplan.onSetActive(); - } + + MensaTagesplan tagesplan = (MensaTagesplan)adapter.getItem(activeItem); + tagesplan.onSetActive(); + viewPager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() { @Override @@ -153,10 +152,8 @@ public class Mensa extends CampusAppFragment { @Override public void onPageSelected(int position) { - if(viewDayplan) { - MensaTagesplan tagesplan = (MensaTagesplan)adapter.getItem(position); - tagesplan.onSetActive(); - } + MensaTagesplan tagesplan = (MensaTagesplan)adapter.getItem(position); + tagesplan.onSetActive(); } @Override @@ -184,10 +181,8 @@ public class Mensa extends CampusAppFragment { } if(mFragmentList.get(position) != null) return mFragmentList.get(position); - if(viewDayplan) - fragment = new MensaTagesplan(); - else - fragment = new MensaWochenplan(); + fragment = new MensaTagesplan(); + fragment.setArguments(mFragmentDataList.get(position)); mFragmentList.set(position, fragment); return fragment; @@ -199,6 +194,14 @@ public class Mensa extends CampusAppFragment { } public void addFragment(Bundle fragmentdata, String title) { + if(title == null) { + Bundle bnd = new Bundle(); + bnd.putBoolean("parentIsMensaFragment", true); + mFragmentDataList.add(bnd); + mFragmentTitleList.add(""); + return; + } + fragmentdata.putBoolean("parentIsMensaFragment", true); mFragmentDataList.add(fragmentdata); mFragmentTitleList.add(title); diff --git a/app/src/main/java/de/dhbwloe/campusapp/fragments/MensaTagesplan.java b/app/src/main/java/de/dhbwloe/campusapp/fragments/MensaTagesplan.java index 1d1022a..0a6f53c 100644 --- a/app/src/main/java/de/dhbwloe/campusapp/fragments/MensaTagesplan.java +++ b/app/src/main/java/de/dhbwloe/campusapp/fragments/MensaTagesplan.java @@ -16,6 +16,7 @@ import java.util.ArrayList; import java.util.Calendar; import java.util.Date; +import de.dhbwloe.campusapp.CampusAppContext; import de.dhbwloe.campusapp.CampusAppFragment; import de.dhbwloe.campusapp.R; @@ -26,9 +27,13 @@ public class MensaTagesplan extends CampusAppFragment { private ArrayList tagesplanMenueItems = new ArrayList<>(); private Date viewPlanDate; private boolean setActiveOnLoad = false; + private boolean redirectPage = true; public void onSetActive() { + if(AppContext == null) + AppContext = CampusAppContext.getInstance(); if(viewPlanDate == null) { + AppContext.setTitle(""); setActiveOnLoad = true; return; } @@ -40,6 +45,9 @@ public class MensaTagesplan extends CampusAppFragment { Bundle args = getArguments(); Date planDay = null; if(args != null) { + boolean mensaparent = args.getBoolean("parentIsMensaFragment"); + if(mensaparent) + redirectPage = false; long plandate = args.getLong("date"); if(plandate > 0) { planDay = new Date(plandate * 1000); @@ -70,7 +78,11 @@ public class MensaTagesplan extends CampusAppFragment { View view = inflater.inflate(R.layout.fragment_mensa_tagesplan, container, false); if(viewPlanDate == null) { - AppContext.getNavigationManager().navigatePage("Mensa", null, false); // silent redirect + if(redirectPage) + AppContext.getNavigationManager().navigatePage("Mensa", null, false); // silent redirect + else { + return inflater.inflate(R.layout.fragment_mensa_weekend, container, false); + } return null; } if(setActiveOnLoad) { diff --git a/app/src/main/java/de/dhbwloe/campusapp/fragments/MensaWochenplan.java b/app/src/main/java/de/dhbwloe/campusapp/fragments/MensaWochenplan.java deleted file mode 100644 index 35917f0..0000000 --- a/app/src/main/java/de/dhbwloe/campusapp/fragments/MensaWochenplan.java +++ /dev/null @@ -1,31 +0,0 @@ -package de.dhbwloe.campusapp.fragments; - - -import android.os.Bundle; -import android.support.v4.app.Fragment; -import android.support.v4.app.FragmentActivity; -import android.view.LayoutInflater; -import android.view.View; -import android.view.ViewGroup; - -import de.dhbwloe.campusapp.CampusAppFragment; -import de.dhbwloe.campusapp.R; -import de.dhbwloe.campusapp.search.SearchIndices; - -/** - * A simple {@link Fragment} subclass. - */ -public class MensaWochenplan extends CampusAppFragment { - - @Override - public View onCreateView(LayoutInflater inflater, ViewGroup container, - Bundle savedInstanceState) { - View view = inflater.inflate(R.layout.fragment_mensa_wochenplan, container, false); - AppContext.setTitle("Mensa Wochenplan: "); - - - - return view; - } - -} diff --git a/app/src/main/java/de/dhbwloe/campusapp/fragments/Vorlesungsplan.java b/app/src/main/java/de/dhbwloe/campusapp/fragments/Vorlesungsplan.java index caf8c88..6428e63 100644 --- a/app/src/main/java/de/dhbwloe/campusapp/fragments/Vorlesungsplan.java +++ b/app/src/main/java/de/dhbwloe/campusapp/fragments/Vorlesungsplan.java @@ -2,11 +2,21 @@ package de.dhbwloe.campusapp.fragments; import android.os.Bundle; +import android.support.design.widget.TabLayout; import android.support.v4.app.Fragment; +import android.support.v4.app.FragmentManager; +import android.support.v4.app.FragmentPagerAdapter; +import android.support.v4.view.ViewPager; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; +import java.text.SimpleDateFormat; +import java.util.ArrayList; +import java.util.Calendar; +import java.util.Date; +import java.util.List; + import de.dhbwloe.campusapp.CampusAppFragment; import de.dhbwloe.campusapp.R; import de.dhbwloe.campusapp.search.SearchIndices; @@ -15,6 +25,10 @@ import de.dhbwloe.campusapp.search.SearchIndices; * A simple {@link Fragment} subclass. */ public class Vorlesungsplan extends CampusAppFragment { + public interface VorlesungsplanFragment { + void setActive(); + } + /* implement this for search results ;) */ public static SearchIndices[] GetSearchIndices() { return new SearchIndices[] { @@ -25,6 +39,13 @@ public class Vorlesungsplan extends CampusAppFragment { setDescription("Vorlesungsplan dienes Kurses"); addKeyWord("vorlesung, vorlesungen, plan, vorlesungsplan, stundenplan, termin, termine, kursplan, blockplan, block, zeit, zeiten"); }}, + new SearchIndices("Vorlesungsplan", true) {{ + setUpdateTime(1); + setTarget("#Vorlesungsplan#view=exams"); + setTitle("Vorlesungsplan"); + setDescription("Klausurübersicht dienes Kurses"); + addKeyWord("klausuren, prüfungen, exams, termine, zeitpunkt, plan, ergebnisse"); + }}, }; } @@ -34,7 +55,75 @@ public class Vorlesungsplan extends CampusAppFragment { View view = inflater.inflate(R.layout.fragment_vorlesungsplan, container, false); AppContext.setTitle("Vorlesungsplan"); + ViewPager pager = (ViewPager) view.findViewById(R.id.viewpager); + setupViewPager(pager); + + TabLayout tabLayout = (TabLayout) view.findViewById(R.id.tabs); + tabLayout.setupWithViewPager(pager); + return view; } + private void setupViewPager(ViewPager viewPager) { + final ViewPagerAdapter adapter = new ViewPagerAdapter(getChildFragmentManager()); + + adapter.addFragment(new VorlesungsplanUpcoming(), AppContext.getResString(R.string.vorlesungsplan_upcoming)); + adapter.addFragment(new VorlesungsplanGroups(), AppContext.getResString(R.string.vorlesungsplan_groups)); + adapter.addFragment(new VorlesungsplanExams(), AppContext.getResString(R.string.vorlesungsplan_exams)); + + viewPager.setAdapter(adapter); + viewPager.setCurrentItem(0); + + VorlesungsplanFragment fragment = (VorlesungsplanFragment)adapter.getItem(0); + fragment.setActive(); + + + viewPager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() { + @Override + public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) { + + } + + @Override + public void onPageSelected(int position) { + VorlesungsplanFragment fragment = (VorlesungsplanFragment)adapter.getItem(position); + fragment.setActive(); + } + + @Override + public void onPageScrollStateChanged(int state) { + + } + }); + } + + class ViewPagerAdapter extends FragmentPagerAdapter { + private final List mFragmentList = new ArrayList<>(); + private final List mFragmentTitleList = new ArrayList<>(); + + public ViewPagerAdapter(FragmentManager manager) { + super(manager); + } + + @Override + public Fragment getItem(int position) { + return mFragmentList.get(position); + } + + @Override + public int getCount() { + return mFragmentList.size(); + } + + public void addFragment(Fragment fragment, String title) { + mFragmentList.add(fragment); + mFragmentTitleList.add(title); + } + + @Override + public CharSequence getPageTitle(int position) { + return mFragmentTitleList.get(position); + } + } + } diff --git a/app/src/main/java/de/dhbwloe/campusapp/fragments/VorlesungsplanExams.java b/app/src/main/java/de/dhbwloe/campusapp/fragments/VorlesungsplanExams.java new file mode 100644 index 0000000..9dc6c02 --- /dev/null +++ b/app/src/main/java/de/dhbwloe/campusapp/fragments/VorlesungsplanExams.java @@ -0,0 +1,36 @@ +package de.dhbwloe.campusapp.fragments; + + +import android.os.Bundle; +import android.support.v4.app.Fragment; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; + +import de.dhbwloe.campusapp.CampusAppFragment; +import de.dhbwloe.campusapp.R; + +/** + * A simple {@link Fragment} subclass. + */ +public class VorlesungsplanExams extends CampusAppFragment implements Vorlesungsplan.VorlesungsplanFragment { + + + public VorlesungsplanExams() { + // Required empty public constructor + } + + + @Override + public View onCreateView(LayoutInflater inflater, ViewGroup container, + Bundle savedInstanceState) { + // Inflate the layout for this fragment + return inflater.inflate(R.layout.fragment_vorlesungsplan_exams, container, false); + } + + @Override + public void setActive() { + + } + +} diff --git a/app/src/main/java/de/dhbwloe/campusapp/fragments/VorlesungsplanGroups.java b/app/src/main/java/de/dhbwloe/campusapp/fragments/VorlesungsplanGroups.java new file mode 100644 index 0000000..a685709 --- /dev/null +++ b/app/src/main/java/de/dhbwloe/campusapp/fragments/VorlesungsplanGroups.java @@ -0,0 +1,109 @@ +package de.dhbwloe.campusapp.fragments; + + +import android.os.Bundle; +import android.support.v4.app.Fragment; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.widget.CheckBox; +import android.widget.CompoundButton; +import android.widget.ListView; + +import java.util.ArrayList; +import java.util.Date; + +import de.dhbwloe.campusapp.CampusAppFragment; +import de.dhbwloe.campusapp.R; +import de.dhbwloe.campusapp.vorlesungen.CourseGroup; + +/** + * A simple {@link Fragment} subclass. + */ +public class VorlesungsplanGroups extends CampusAppFragment implements Vorlesungsplan.VorlesungsplanFragment { + private String coursename; + private View view; + private VorlesungsplanGroupsListAdapter listAdapter; + private ArrayList listItems = new ArrayList(); + private boolean showOldCourses = false; + + public VorlesungsplanGroups() { + // Required empty public constructor + } + + + @Override + public View onCreateView(LayoutInflater inflater, ViewGroup container, + Bundle savedInstanceState) { + String kursTag = AppContext.getDatabaseManager().getRuntimeCache("CourseName"); + if(kursTag == null || kursTag.isEmpty()) + return null; + coursename = kursTag; + + view = inflater.inflate(R.layout.fragment_vorlesungsplan_groups, container, false); + + ListView listView = (ListView) view.findViewById(R.id.listView); + listAdapter = new VorlesungsplanGroupsListAdapter(view.getContext(), R.layout.fragment_vorlesungsplan_groups_course, listItems); + listView.setAdapter(listAdapter); + + CheckBox showOldChkBox = (CheckBox) view.findViewById(R.id.showOldCourses); + showOldChkBox.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() { + @Override + public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { + showOldCourses = isChecked; + updateCoursesList(); + } + }); + + return view; + } + + @Override + public void setActive() { + + } + + + @Override + public void onResume() { + super.onResume(); + if(coursename != null) + updateCoursesList(); + } + + private void updateCoursesList() { + Date notBefore; + if(showOldCourses) + notBefore = null; + else + notBefore = new Date(); + + CourseGroup[] groups = AppContext.getDatabaseManager().getCourseGroups(coursename, notBefore); + listItems.clear(); + for(CourseGroup group : groups) { + Bundle extraData = group.getExtraData(); + long nextKlausur = extraData.getLong("NextKlausurEvent"); + long lastEvent = extraData.getLong("LastEvent"); + + // wenn nextKlausur über 5 jahrevon LastEvent entfernt liegt gibt es in diesem kurs KEINE Klausur. + // der fiktive Wert musste zur technischen funktionalität der Datenbankabfrage eingefügt werden. + if(nextKlausur - lastEvent > (86400 * 365 * 5)) + nextKlausur = 0; + + VorlesungsplanGroupsListItem item = new VorlesungsplanGroupsListItem( + group.getGroupId(), + coursename, + group.getGroupName(), + extraData.getLong("FirstEvent"), + lastEvent, + extraData.getInt("EventCount"), + extraData.getLong("NextEvent"), + nextKlausur + ); + listItems.add(item); + } + if(listAdapter != null) + listAdapter.notifyDataSetChanged(); + } + +} diff --git a/app/src/main/java/de/dhbwloe/campusapp/fragments/VorlesungsplanGroupsListAdapter.java b/app/src/main/java/de/dhbwloe/campusapp/fragments/VorlesungsplanGroupsListAdapter.java new file mode 100644 index 0000000..d7c5010 --- /dev/null +++ b/app/src/main/java/de/dhbwloe/campusapp/fragments/VorlesungsplanGroupsListAdapter.java @@ -0,0 +1,77 @@ +package de.dhbwloe.campusapp.fragments; + +import android.content.Context; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.widget.ArrayAdapter; +import android.widget.LinearLayout; +import android.widget.TextView; + +import java.util.ArrayList; + +import de.dhbwloe.campusapp.CampusAppContext; +import de.dhbwloe.campusapp.R; + +/** + * Created by pk910 on 20.02.2016. + */ +public class VorlesungsplanGroupsListAdapter extends ArrayAdapter { + private Context context; + private int layoutResourceId; + private ArrayList data = new ArrayList(); + + public VorlesungsplanGroupsListAdapter(Context context, int layoutResourceId, ArrayList data) { + super(context, layoutResourceId, data); + this.layoutResourceId = layoutResourceId; + this.context = context; + this.data = data; + } + + @Override + public View getView(int position, View convertView, ViewGroup parent) { + View row = convertView; + RecordHolder holder = null; + + if (row == null) { + LayoutInflater inflater = (LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); + row = inflater.inflate(layoutResourceId, parent, false); + + holder = new RecordHolder(row); + row.setTag(holder); + } else { + holder = (RecordHolder) row.getTag(); + } + + final VorlesungsplanGroupsListAdapter that = this; + final VorlesungsplanGroupsListItem item = data.get(position); + + holder.groupName.setText(item.getGroupName()); + holder.nextEvent.setText(item.getNextEvent()); + holder.lastEvent.setText(item.getLastEvent()); + + String klausurDate = item.getNextKlausurEvent(); + if(klausurDate == null) + klausurDate = CampusAppContext.getInstance().getResString(R.string.vorlesungsplan_groups_noklausur); + + holder.klausurEvent.setText(klausurDate); + + return row; + } + + static class RecordHolder { + TextView groupName; + TextView nextEvent; + TextView lastEvent; + TextView klausurEvent; + TextView klausurName; + + public RecordHolder(View view) { + this.groupName = (TextView) view.findViewById(R.id.courseTitle); + this.nextEvent = (TextView) view.findViewById(R.id.nextEvent); + this.lastEvent = (TextView) view.findViewById(R.id.lastEvent); + this.klausurEvent = (TextView) view.findViewById(R.id.klausurEvent); + this.klausurName = (TextView) view.findViewById(R.id.klausurName); + } + } +} diff --git a/app/src/main/java/de/dhbwloe/campusapp/fragments/VorlesungsplanGroupsListItem.java b/app/src/main/java/de/dhbwloe/campusapp/fragments/VorlesungsplanGroupsListItem.java new file mode 100644 index 0000000..01d6ee7 --- /dev/null +++ b/app/src/main/java/de/dhbwloe/campusapp/fragments/VorlesungsplanGroupsListItem.java @@ -0,0 +1,68 @@ +package de.dhbwloe.campusapp.fragments; + +import java.text.SimpleDateFormat; +import java.util.Date; + +/** + * Created by pk910 on 20.02.2016. + */ +public class VorlesungsplanGroupsListItem { + private int groupId; + private String courseName; + private String groupName; + private long firstEvent, lastEvent, nextEvent, nextKlausurEvent; + private int eventCount; + + public VorlesungsplanGroupsListItem(int groupid, String coursename, String groupname, long firstevent, long lastevent, int eventcount, long nextevent, long nextklausur) { + groupId = groupid; + courseName = coursename; + groupName = groupname; + firstEvent = firstevent; + lastEvent = lastevent; + eventCount = eventcount; + nextEvent = nextevent; + nextKlausurEvent = nextklausur; + } + + public int getGroupId() { + return groupId; + } + + public String getCourseName() { + return courseName; + } + + public String getGroupName() { + return groupName; + } + + public String getFirstEvent() { + SimpleDateFormat dateFormat = new SimpleDateFormat("dd.MM.yyyy HH:mm"); + Date date = new Date(firstEvent*1000); + return dateFormat.format(date); + } + + public String getLastEvent() { + SimpleDateFormat dateFormat = new SimpleDateFormat("dd.MM.yyyy HH:mm"); + Date date = new Date(lastEvent*1000); + return dateFormat.format(date); + } + + public String getNextEvent() { + SimpleDateFormat dateFormat = new SimpleDateFormat("dd.MM.yyyy HH:mm"); + Date date = new Date(nextEvent*1000); + return dateFormat.format(date); + } + + public String getNextKlausurEvent() { + if(nextKlausurEvent == 0) + return null; + SimpleDateFormat dateFormat = new SimpleDateFormat("dd.MM.yyyy HH:mm"); + Date date = new Date(nextKlausurEvent*1000); + return dateFormat.format(date); + } + + public int getEventCount() { + return eventCount; + } +} diff --git a/app/src/main/java/de/dhbwloe/campusapp/fragments/VorlesungsplanUpcoming.java b/app/src/main/java/de/dhbwloe/campusapp/fragments/VorlesungsplanUpcoming.java new file mode 100644 index 0000000..29bbee5 --- /dev/null +++ b/app/src/main/java/de/dhbwloe/campusapp/fragments/VorlesungsplanUpcoming.java @@ -0,0 +1,96 @@ +package de.dhbwloe.campusapp.fragments; + + +import android.os.Bundle; +import android.support.v4.app.Fragment; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.widget.ListView; + +import java.text.SimpleDateFormat; +import java.util.ArrayList; +import java.util.Date; + +import de.dhbwloe.campusapp.CampusAppContext; +import de.dhbwloe.campusapp.CampusAppFragment; +import de.dhbwloe.campusapp.R; +import de.dhbwloe.campusapp.vorlesungen.CourseEvent; + +/** + * A simple {@link Fragment} subclass. + */ +public class VorlesungsplanUpcoming extends CampusAppFragment implements Vorlesungsplan.VorlesungsplanFragment { + private View view; + private String courseName; + private ArrayList upcomingDays = new ArrayList(); + private VorlesungsplanUpcomingDayListAdapter upcomingDaysAdapter; + + public VorlesungsplanUpcoming() { + // Required empty public constructor + } + + + @Override + public View onCreateView(LayoutInflater inflater, ViewGroup container, + Bundle savedInstanceState) { + view = inflater.inflate(R.layout.fragment_vorlesungsplan_upcoming, container, false); + + String kursTag = AppContext.getDatabaseManager().getRuntimeCache("CourseName"); + if(kursTag == null || kursTag.isEmpty()) { + return null; + } + courseName = kursTag; + + ListView listView = (ListView) view.findViewById(R.id.listView); + upcomingDaysAdapter = new VorlesungsplanUpcomingDayListAdapter(view.getContext(), R.layout.fragment_vorlesungsplan_upcoming_day, upcomingDays); + listView.setAdapter(upcomingDaysAdapter); + + return view; + } + + @Override + public void setActive() { + + } + + @Override + public void onResume() { + super.onResume(); + if(courseName != null) + refreshUpcomingEvents(); + } + + private int getDayId(long time) { + Date date = new Date(time * 1000); + return getDayId(date); + } + private int getDayId(Date date) { + SimpleDateFormat dateFormat = new SimpleDateFormat("yyyyMMdd"); + return Integer.parseInt(dateFormat.format(date)); + } + + private void refreshUpcomingEvents() { + if(AppContext == null) + AppContext = CampusAppContext.getInstance(); + long now = (new Date()).getTime() / 1000; + + CourseEvent events[] = AppContext.getDatabaseManager().getCourseCalendarTimetable(courseName, now, 365); + int lastDayId = 0; + VorlesungsplanUpcomingDayListItem lastDayItem = null; + upcomingDays.clear(); + for(int i = 0; i < events.length; i++) { + int dayId = getDayId(events[i].getEventTo()); + if(dayId > lastDayId) { + lastDayItem = new VorlesungsplanUpcomingDayListItem(events[i].getEventTo()); + upcomingDays.add(lastDayItem); + lastDayId = dayId; + } + lastDayItem.addCourseEvent(events[i]); + } + if(upcomingDaysAdapter != null) { + upcomingDaysAdapter.notifyDataSetChanged(); + } + } + +} diff --git a/app/src/main/java/de/dhbwloe/campusapp/fragments/VorlesungsplanUpcomingCourseListItem.java b/app/src/main/java/de/dhbwloe/campusapp/fragments/VorlesungsplanUpcomingCourseListItem.java new file mode 100644 index 0000000..e706e3f --- /dev/null +++ b/app/src/main/java/de/dhbwloe/campusapp/fragments/VorlesungsplanUpcomingCourseListItem.java @@ -0,0 +1,42 @@ +package de.dhbwloe.campusapp.fragments; + +import android.content.Context; +import android.view.LayoutInflater; +import android.view.View; +import android.widget.TextView; + +import java.text.SimpleDateFormat; +import java.util.Date; + +import de.dhbwloe.campusapp.CampusAppContext; +import de.dhbwloe.campusapp.R; +import de.dhbwloe.campusapp.vorlesungen.CourseEvent; + +/** + * Created by pk910 on 20.02.2016. + */ +public class VorlesungsplanUpcomingCourseListItem { + private CourseEvent event; + + public VorlesungsplanUpcomingCourseListItem(CourseEvent event) { + this.event = event; + } + + public void updateContainerView(View view) { + + SimpleDateFormat dateFormat = new SimpleDateFormat("HH:mm"); + TextView timeFrom = (TextView) view.findViewById(R.id.timeFrom); + TextView timeTo = (TextView) view.findViewById(R.id.timeTo); + TextView location = (TextView) view.findViewById(R.id.location); + TextView courseTitle = (TextView) view.findViewById(R.id.courseTitle); + + Date dateFrom = (new Date(event.getEventFrom() * 1000)); + timeFrom.setText(dateFormat.format(dateFrom)); + + Date dateTo = (new Date(event.getEventTo() * 1000)); + timeTo.setText(dateFormat.format(dateTo)); + + location.setText(event.getEventLocation()); + courseTitle.setText(event.getEventTitle()); + } +} diff --git a/app/src/main/java/de/dhbwloe/campusapp/fragments/VorlesungsplanUpcomingDayListAdapter.java b/app/src/main/java/de/dhbwloe/campusapp/fragments/VorlesungsplanUpcomingDayListAdapter.java new file mode 100644 index 0000000..90916f7 --- /dev/null +++ b/app/src/main/java/de/dhbwloe/campusapp/fragments/VorlesungsplanUpcomingDayListAdapter.java @@ -0,0 +1,65 @@ +package de.dhbwloe.campusapp.fragments; + +import android.content.Context; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.widget.ArrayAdapter; +import android.widget.LinearLayout; +import android.widget.ListView; +import android.widget.RelativeLayout; +import android.widget.TextView; + +import java.util.ArrayList; + +import de.dhbwloe.campusapp.R; + +/** + * Created by pk910 on 20.02.2016. + */ +public class VorlesungsplanUpcomingDayListAdapter extends ArrayAdapter { + private Context context; + private int layoutResourceId; + private ArrayList data = new ArrayList(); + + public VorlesungsplanUpcomingDayListAdapter(Context context, int layoutResourceId, ArrayList data) { + super(context, layoutResourceId, data); + this.layoutResourceId = layoutResourceId; + this.context = context; + this.data = data; + } + + @Override + public View getView(int position, View convertView, ViewGroup parent) { + View row = convertView; + RecordHolder holder = null; + + if (row == null) { + LayoutInflater inflater = (LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); + row = inflater.inflate(layoutResourceId, parent, false); + + holder = new RecordHolder(row); + row.setTag(holder); + } else { + holder = (RecordHolder) row.getTag(); + } + + final VorlesungsplanUpcomingDayListAdapter that = this; + final VorlesungsplanUpcomingDayListItem item = data.get(position); + + item.addCourseEventsToContainer(holder.container); + holder.cardDate.setText(item.getFormatedDate()); + + return row; + } + + static class RecordHolder { + TextView cardDate; + LinearLayout container; + + public RecordHolder(View view) { + this.cardDate = (TextView) view.findViewById(R.id.cardDate); + this.container = (LinearLayout) view.findViewById(R.id.cardCourses); + } + } +} diff --git a/app/src/main/java/de/dhbwloe/campusapp/fragments/VorlesungsplanUpcomingDayListItem.java b/app/src/main/java/de/dhbwloe/campusapp/fragments/VorlesungsplanUpcomingDayListItem.java new file mode 100644 index 0000000..d8d1104 --- /dev/null +++ b/app/src/main/java/de/dhbwloe/campusapp/fragments/VorlesungsplanUpcomingDayListItem.java @@ -0,0 +1,72 @@ +package de.dhbwloe.campusapp.fragments; + +import android.content.Context; +import android.view.LayoutInflater; +import android.view.View; +import android.widget.LinearLayout; +import android.widget.ListView; +import android.widget.RelativeLayout; +import android.widget.TextView; + +import java.text.SimpleDateFormat; +import java.util.ArrayList; +import java.util.Calendar; +import java.util.Date; + +import de.dhbwloe.campusapp.CampusAppContext; +import de.dhbwloe.campusapp.R; +import de.dhbwloe.campusapp.Tools; +import de.dhbwloe.campusapp.vorlesungen.CourseEvent; + +/** + * Created by pk910 on 20.02.2016. + */ +public class VorlesungsplanUpcomingDayListItem { + private long cardDate; + private ArrayList courses = new ArrayList(); + + public VorlesungsplanUpcomingDayListItem(long date) { + cardDate = date; + } + + public void addCourseEventsToContainer(LinearLayout container) { + int courseEntries = container.getChildCount(); + + CampusAppContext AppContext = CampusAppContext.getInstance(); + LayoutInflater inflater = (LayoutInflater) AppContext.getMainActivity().getSystemService(Context.LAYOUT_INFLATER_SERVICE); + while(courseEntries < courses.size()) { + View view = inflater.inflate(R.layout.fragment_vorlesungsplan_upcoming_course, null); + container.addView(view); + courseEntries++; + } + + int i; + for(i = 0; i < courses.size(); i++) { + View child = container.getChildAt(i); + courses.get(i).updateContainerView(child); + child.setVisibility(View.VISIBLE); + } + for(;i < courseEntries; i++) { + View child = container.getChildAt(i); + child.setVisibility(View.GONE); + } + } + + public String getFormatedDate() { + SimpleDateFormat dateFormat = new SimpleDateFormat("dd.MM."); + Date date = new Date(cardDate * 1000); + + int weekdayResIds[] = new int[] { R.string.week_saturday, R.string.week_sunday, R.string.week_monday, R.string.week_tuesday, R.string.week_wednesday, R.string.week_thursday, R.string.week_friday }; + Calendar cal = Calendar.getInstance(); + cal.setTime(date); + int dow = cal.get(Calendar.DAY_OF_WEEK); + + return CampusAppContext.getInstance().getResString(weekdayResIds[dow]) + ", " + dateFormat.format(date); + } + + public void addCourseEvent(CourseEvent event) { + VorlesungsplanUpcomingCourseListItem courseItem = new VorlesungsplanUpcomingCourseListItem(event); + courses.add(courseItem); + } + +} diff --git a/app/src/main/java/de/dhbwloe/campusapp/fragments/WifiSettings.java b/app/src/main/java/de/dhbwloe/campusapp/fragments/WifiSettings.java index a9bd972..1ce7001 100644 --- a/app/src/main/java/de/dhbwloe/campusapp/fragments/WifiSettings.java +++ b/app/src/main/java/de/dhbwloe/campusapp/fragments/WifiSettings.java @@ -12,6 +12,7 @@ import android.content.res.Resources; import android.net.ConnectivityManager; import android.net.NetworkInfo; import android.net.wifi.ScanResult; +import android.net.wifi.SupplicantState; import android.net.wifi.WifiConfiguration; import android.net.wifi.WifiEnterpriseConfig; import android.net.wifi.WifiInfo; @@ -44,6 +45,8 @@ import de.dhbwloe.campusapp.CampusAppContext; import de.dhbwloe.campusapp.CampusAppFragment; import de.dhbwloe.campusapp.R; import de.dhbwloe.campusapp.search.SearchIndices; +import de.dhbwloe.campusapp.wifi.WifiConfigurationManager; +import de.dhbwloe.campusapp.wifi.WifiNetworkSettings; /** * A simple {@link Fragment} subclass. @@ -62,88 +65,56 @@ public class WifiSettings extends CampusAppFragment { }; } - private enum WifiNetworkAuthenticationTypes { - WIFI_AUTHTYPE_NONE, - WIFI_AUTHTYPE_WEP, - WIFI_AUTHTYPE_WPA, - WIFI_AUTHTYPE_WPA_ENTERPRISE, - }; - - private class WifiNetworkSettingsSet { - String name; - String ssid; - WifiNetworkAuthenticationTypes authType; - int[] authAlgorithms; - int eapMethod; - int phase2Method; - - String caCertStr; - String caName; - - String usernameSuffix; - String username; - String password; - - TabLayout.Tab tab; - boolean isInScanResult = false; - - public WifiNetworkSettingsSet(String name, String ssid, WifiNetworkAuthenticationTypes authType) { - this.name = name; - this.ssid = ssid; - this.authType = authType; - } - - public WifiNetworkSettingsSet setWpaEnterprise(int[] authAlgorithms, int eapMethod, int phase2Method, String username) { - this.authAlgorithms = authAlgorithms; - this.eapMethod = eapMethod; - this.phase2Method = phase2Method; - this.username = username; - return this; - } - - public WifiNetworkSettingsSet setPassword(String password) { - this.password = password; - return this; - } - - public WifiNetworkSettingsSet setCACertificate(String caname, String certificate) { - this.caName = caname; - this.caCertStr = certificate; - return this; - } - - public WifiNetworkSettingsSet setUserSuffix(String suffix) { - this.usernameSuffix = suffix; - return this; - } - - public void setAuthData(String username, String password) { - this.username = username; - this.password = password; - } - - public void setAuthData(String password) { - this.password = password; - } - - public X509Certificate generateCertificate() throws CertificateException, IOException { - byte[] decoded = Base64.decode(caCertStr.replaceAll("-----BEGIN CERTIFICATE-----", "").replaceAll("-----END CERTIFICATE-----", ""), Base64.DEFAULT); - return (X509Certificate) CertificateFactory.getInstance("X.509").generateCertificate(new ByteArrayInputStream(decoded)); - } - } - private View view; private TabLayout tablayout; - private WifiNetworkSettingsSet[] wifiPresets; + private WifiNetworkSettings[] wifiPresets; private WifiManager wifiManager; + private WifiConfigurationManager wifiConfigManager; private ConnectivityManager connectivityManager; private int selectedNetworkIndex = 0; private boolean networkScanned = false; private BroadcastReceiver wifiStateReceiver = new BroadcastReceiver() { @Override - public void onReceive(Context arg0, Intent arg1) { - NetworkInfo networkInfo = (NetworkInfo) arg1.getParcelableExtra(ConnectivityManager.EXTRA_NETWORK_INFO); - if (networkInfo.getType() == ConnectivityManager.TYPE_WIFI) { + public void onReceive(Context arg0, Intent intent) { + String action = intent.getAction(); + if(action.equals(WifiManager.SUPPLICANT_STATE_CHANGED_ACTION)){ + WifiInfo myWifiInfo = wifiManager.getConnectionInfo(); + + WifiNetworkSettings settings = null; + for(int i = 0; i < wifiPresets.length; i++) { + if(wifiPresets[i].getSSID().equalsIgnoreCase(myWifiInfo.getSSID())) { + settings = wifiPresets[i]; + break; + } + } + + SupplicantState supl_state=((SupplicantState)intent.getParcelableExtra(WifiManager.EXTRA_NEW_STATE)); + switch(supl_state){ + case ASSOCIATING: + settings.isAssociating = true; + settings.isAssociated = false; + settings.isAuthenticated = false; + settings.isDisconnected = false; + break; + case ASSOCIATED: + settings.isAssociated = true; + break; + case COMPLETED: + settings.isAuthenticated = true; + break; + case DISCONNECTED: + settings.isAssociated = false; + settings.isAssociating = false; + settings.isDisconnected = true; + break; + default: + break; + } + updateWifiState(); + } + + NetworkInfo networkInfo = (NetworkInfo) intent.getParcelableExtra(ConnectivityManager.EXTRA_NETWORK_INFO); + if (networkInfo != null && networkInfo.getType() == ConnectivityManager.TYPE_WIFI) { updateWifiState(); } } @@ -155,120 +126,18 @@ public class WifiSettings extends CampusAppFragment { } }; - private void loadDhbwWifiDefinitions() { - int numOfNetworks = 3; - int i = 0; - wifiPresets = new WifiNetworkSettingsSet[numOfNetworks]; - - wifiPresets[i++] = (new WifiNetworkSettingsSet("dhbw-secure", "dhbw-secure", WifiNetworkAuthenticationTypes.WIFI_AUTHTYPE_WPA_ENTERPRISE)). - setWpaEnterprise( - new int[] {WifiConfiguration.KeyMgmt.WPA_EAP, WifiConfiguration.KeyMgmt.IEEE8021X}, - WifiEnterpriseConfig.Eap.PEAP, - WifiEnterpriseConfig.Phase2.MSCHAPV2, - null - ).setCACertificate("Deutsche Telekom Root CA 2", "-----BEGIN CERTIFICATE-----\n" + - "MIIDnzCCAoegAwIBAgIBJjANBgkqhkiG9w0BAQUFADBxMQswCQYDVQQGEwJERTEc\n" + - "MBoGA1UEChMTRGV1dHNjaGUgVGVsZWtvbSBBRzEfMB0GA1UECxMWVC1UZWxlU2Vj\n" + - "IFRydXN0IENlbnRlcjEjMCEGA1UEAxMaRGV1dHNjaGUgVGVsZWtvbSBSb290IENB\n" + - "IDIwHhcNOTkwNzA5MTIxMTAwWhcNMTkwNzA5MjM1OTAwWjBxMQswCQYDVQQGEwJE\n" + - "RTEcMBoGA1UEChMTRGV1dHNjaGUgVGVsZWtvbSBBRzEfMB0GA1UECxMWVC1UZWxl\n" + - "U2VjIFRydXN0IENlbnRlcjEjMCEGA1UEAxMaRGV1dHNjaGUgVGVsZWtvbSBSb290\n" + - "IENBIDIwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCrC6M14IspFLEU\n" + - "ha88EOQ5bzVdSq7d6mGNlUn0b2SjGmBmpKlAIoTZ1KXleJMOaAGtuU1cOs7TuKhC\n" + - "QN/Po7qCWWqSG6wcmtoIKyUn+WkjR/Hg6yx6m/UTAtB+NHzCnjwAWav12gz1Mjwr\n" + - "rFDa1sPeg5TKqAyZMg4ISFZbavva4VhYAUlfckE8FQYBjl2tqriTtM2e66foai1S\n" + - "NNs671x1Udrb8zH57nGYMsRUFUQM+ZtV7a3fGAigo4aKSe5TBY8ZTNXeWHmb0moc\n" + - "QqvF1afPaA+W5OFhmHZhyJF81j4A4pFQh+GdCuatl9Idxjp9y7zaAzTVjlsB9WoH\n" + - "txa2bkp/AgMBAAGjQjBAMB0GA1UdDgQWBBQxw3kbuvVT1xfgiXotF2wKsyudMzAP\n" + - "BgNVHRMECDAGAQH/AgEFMA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQUFAAOC\n" + - "AQEAlGRZrTlk5ynrE/5aw4sTV8gEJPB0d8Bg42f76Ymmg7+Wgnxu1MM9756Abrsp\n" + - "tJh6sTtU6zkXR34ajgv8HzFZMQSyzhfzLMdiNlXiItiJVbSYSKpk+tYcNthEeFpa\n" + - "IzpXl/V6ME+un2pMSyuOoAPjPuCp1NJ70rOo4nI8rZ7/gFnkm0W09juwzTkZmDLl\n" + - "6iFhkOQxIY40sfcvNUqFENrnijchvllj4PKFiDFT1FQUhXB59C4Gdyd1Lx+4ivn+\n" + - "xbrYNuSD7Odlt79jWvNGr4GUN9RBjNYj1h7P9WgbRGOiWrqnNVmh5XAFmw4jV5mU\n" + - "Cm26OWMohpLzGITY+9HPBVZkVw==\n" + - "-----END CERTIFICATE-----"); - - wifiPresets[i++] = (new WifiNetworkSettingsSet("dhbw-wlan", "dhbw-wlan", WifiNetworkAuthenticationTypes.WIFI_AUTHTYPE_NONE)); - - wifiPresets[i++] = (new WifiNetworkSettingsSet("eduroam", "eduroam", WifiNetworkAuthenticationTypes.WIFI_AUTHTYPE_WPA_ENTERPRISE)). - setWpaEnterprise( - new int[] {WifiConfiguration.KeyMgmt.WPA_EAP, WifiConfiguration.KeyMgmt.IEEE8021X}, - WifiEnterpriseConfig.Eap.PEAP, - WifiEnterpriseConfig.Phase2.MSCHAPV2, - null - ).setCACertificate("Deutsche Telekom Root CA 2", "-----BEGIN CERTIFICATE-----\n" + - "MIIDnzCCAoegAwIBAgIBJjANBgkqhkiG9w0BAQUFADBxMQswCQYDVQQGEwJERTEc\n" + - "MBoGA1UEChMTRGV1dHNjaGUgVGVsZWtvbSBBRzEfMB0GA1UECxMWVC1UZWxlU2Vj\n" + - "IFRydXN0IENlbnRlcjEjMCEGA1UEAxMaRGV1dHNjaGUgVGVsZWtvbSBSb290IENB\n" + - "IDIwHhcNOTkwNzA5MTIxMTAwWhcNMTkwNzA5MjM1OTAwWjBxMQswCQYDVQQGEwJE\n" + - "RTEcMBoGA1UEChMTRGV1dHNjaGUgVGVsZWtvbSBBRzEfMB0GA1UECxMWVC1UZWxl\n" + - "U2VjIFRydXN0IENlbnRlcjEjMCEGA1UEAxMaRGV1dHNjaGUgVGVsZWtvbSBSb290\n" + - "IENBIDIwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCrC6M14IspFLEU\n" + - "ha88EOQ5bzVdSq7d6mGNlUn0b2SjGmBmpKlAIoTZ1KXleJMOaAGtuU1cOs7TuKhC\n" + - "QN/Po7qCWWqSG6wcmtoIKyUn+WkjR/Hg6yx6m/UTAtB+NHzCnjwAWav12gz1Mjwr\n" + - "rFDa1sPeg5TKqAyZMg4ISFZbavva4VhYAUlfckE8FQYBjl2tqriTtM2e66foai1S\n" + - "NNs671x1Udrb8zH57nGYMsRUFUQM+ZtV7a3fGAigo4aKSe5TBY8ZTNXeWHmb0moc\n" + - "QqvF1afPaA+W5OFhmHZhyJF81j4A4pFQh+GdCuatl9Idxjp9y7zaAzTVjlsB9WoH\n" + - "txa2bkp/AgMBAAGjQjBAMB0GA1UdDgQWBBQxw3kbuvVT1xfgiXotF2wKsyudMzAP\n" + - "BgNVHRMECDAGAQH/AgEFMA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQUFAAOC\n" + - "AQEAlGRZrTlk5ynrE/5aw4sTV8gEJPB0d8Bg42f76Ymmg7+Wgnxu1MM9756Abrsp\n" + - "tJh6sTtU6zkXR34ajgv8HzFZMQSyzhfzLMdiNlXiItiJVbSYSKpk+tYcNthEeFpa\n" + - "IzpXl/V6ME+un2pMSyuOoAPjPuCp1NJ70rOo4nI8rZ7/gFnkm0W09juwzTkZmDLl\n" + - "6iFhkOQxIY40sfcvNUqFENrnijchvllj4PKFiDFT1FQUhXB59C4Gdyd1Lx+4ivn+\n" + - "xbrYNuSD7Odlt79jWvNGr4GUN9RBjNYj1h7P9WgbRGOiWrqnNVmh5XAFmw4jV5mU\n" + - "Cm26OWMohpLzGITY+9HPBVZkVw==\n" + - "-----END CERTIFICATE-----"). - setUserSuffix("@dhbw-loerrach.de"); - } - - - @TargetApi(18) - private void connectToWiFi(WifiNetworkSettingsSet settings) { - WifiConfiguration wifiConfig = new WifiConfiguration(); - wifiConfig.SSID = settings.ssid; - for(int i = 0; i < settings.authAlgorithms.length; i++) - wifiConfig.allowedKeyManagement.set(settings.authAlgorithms[i]); - - switch(settings.authType) { - case WIFI_AUTHTYPE_NONE: - break; - case WIFI_AUTHTYPE_WEP: - // not supported by our app - break; - case WIFI_AUTHTYPE_WPA: - - break; - case WIFI_AUTHTYPE_WPA_ENTERPRISE: - WifiEnterpriseConfig enterpriseConfig = new WifiEnterpriseConfig(); - String username = settings.username; - if(settings.usernameSuffix != null) - username += settings.usernameSuffix; - enterpriseConfig.setIdentity(username); - enterpriseConfig.setPassword(settings.password); - enterpriseConfig.setEapMethod(settings.eapMethod); - enterpriseConfig.setPhase2Method(settings.phase2Method); - try { - enterpriseConfig.setCaCertificate(settings.generateCertificate()); - } catch (CertificateException e) { - } catch (IOException e) { - } - wifiConfig.enterpriseConfig = enterpriseConfig; - break; - } - int networkId = wifiManager.addNetwork(wifiConfig); - wifiManager.enableNetwork(networkId, true); - } - - @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); - loadDhbwWifiDefinitions(); + + wifiPresets = WifiNetworkSettings.LoadNetworkSettingPresets(AppContext); + wifiManager = (WifiManager)AppContext.getMainActivity().getSystemService(AppContext.getMainActivity().WIFI_SERVICE); connectivityManager = (ConnectivityManager) AppContext.getMainActivity().getSystemService(Activity.CONNECTIVITY_SERVICE); + + wifiConfigManager = new WifiConfigurationManager(wifiManager); } private void updateSelectedNetworkInformation() { @@ -277,7 +146,7 @@ public class WifiSettings extends CampusAppFragment { if(selectedNetworkIndex >= wifiPresets.length) return; - WifiNetworkSettingsSet settings = wifiPresets[selectedNetworkIndex]; + WifiNetworkSettings settings = wifiPresets[selectedNetworkIndex]; TextView ssidInfoView = (TextView) view.findViewById(R.id.ssidInfo); TextView securityInfoView = (TextView) view.findViewById(R.id.securityInfo); TextView eapInfoView = (TextView) view.findViewById(R.id.eapInfo); @@ -292,7 +161,7 @@ public class WifiSettings extends CampusAppFragment { RelativeLayout insecureNetWarning = (RelativeLayout) view.findViewById(R.id.insecureNetWarning); - ssidInfoView.setText(settings.ssid); + ssidInfoView.setText(settings.getSSID()); eapInfoRow.setVisibility(View.GONE); phase2InfoRow.setVisibility(View.GONE); @@ -300,7 +169,7 @@ public class WifiSettings extends CampusAppFragment { pskInfoRow.setVisibility(View.GONE); insecureNetWarning.setVisibility(View.GONE); - switch(settings.authType) { + switch(settings.getAuthType()) { case WIFI_AUTHTYPE_NONE: securityInfoView.setText(R.string.wifiopts_security_open); @@ -325,9 +194,9 @@ public class WifiSettings extends CampusAppFragment { break; } - if(settings.authType == WifiNetworkAuthenticationTypes.WIFI_AUTHTYPE_WPA_ENTERPRISE) { + if(settings.getAuthType() == WifiNetworkSettings.WifiNetworkAuthenticationTypes.WIFI_AUTHTYPE_WPA_ENTERPRISE) { int eapStringId = 0; - switch(settings.eapMethod) { + switch(settings.getEapMethod()) { case WifiEnterpriseConfig.Eap.PEAP: eapStringId = R.string.wifiopts_eap_peap; break; @@ -347,7 +216,7 @@ public class WifiSettings extends CampusAppFragment { eapInfoView.setText(""); int phase2StringId = 0; - switch(settings.phase2Method) { + switch(settings.getPhase2Method()) { case WifiEnterpriseConfig.Phase2.MSCHAPV2: phase2StringId = R.string.wifiopts_phase2_mschapv2; break; @@ -360,7 +229,7 @@ public class WifiSettings extends CampusAppFragment { else phase2InfoView.setText(""); - cacertInfoView.setText(settings.caName); + cacertInfoView.setText(settings.getCAName()); } else { } @@ -370,15 +239,62 @@ public class WifiSettings extends CampusAppFragment { private void updateWifiState() { NetworkInfo myNetworkInfo = connectivityManager.getNetworkInfo(ConnectivityManager.TYPE_WIFI); WifiInfo myWifiInfo = wifiManager.getConnectionInfo(); + String ssid = (myWifiInfo != null ? myWifiInfo.getSSID() : null); + if(ssid == null) + return; + + WifiNetworkSettings settings = null; + for(int i = 0; i < wifiPresets.length; i++) { + if(wifiPresets[i].getSSID().equalsIgnoreCase(ssid)) { + settings = wifiPresets[i]; + break; + } + } + if(settings == null) + return; + + if(settings.isTryConnecting) { + boolean success = false; + if(settings.isDisconnected) { + settings.failedAuthentication = true; + settings.isTryConnecting = false; + } else if(settings.isAssociated) { + settings.isTryConnecting = false; + success = true; + } + if(!settings.isTryConnecting) { + // success + // TODO: continue + } + } + Resources resources = AppContext.getMainActivity().getResources(); String status; if(myNetworkInfo.isConnectedOrConnecting()) { int statusId = (myNetworkInfo.isConnected() ? R.string.wifisettings_status_connected : R.string.wifisettings_status_connecting); - String ssid = myWifiInfo.getSSID(); + ssid = ssid.replace("\"", ""); status = String.format(resources.getString(statusId), ssid); + + + + + //if(networkConnecting && wifiPresets[connectingNetworkIndex].getSSID().equalsIgnoreCase(ssid)) { + + /* + + wifiConfigManager.finalizeConnection(wifiPresets[connectingNetworkIndex], myNetworkInfo, myWifiInfo, new WifiConfigurationManager.WifiConfigurationComplete() { + @Override + public void onWifiConfigurationComplete(WifiNetworkSettings settings, String response) { + networkConnecting = false; + connectingNetworkIndex = 0; + updateWifiConnectButton(); + } + }); + */ + //} } else { status = resources.getString(R.string.wifisettings_status_disconnected); } @@ -394,7 +310,7 @@ public class WifiSettings extends CampusAppFragment { for(int i = 0; i < wifiPresets.length; i++) { boolean networkFound = false; for(ScanResult result : scanResultList) { - if(result.SSID != null && result.SSID.equalsIgnoreCase(wifiPresets[i].ssid)) { + if(result.SSID != null && result.SSID.equalsIgnoreCase(wifiPresets[i].getSSID())) { networkFound = true; break; } @@ -407,7 +323,7 @@ public class WifiSettings extends CampusAppFragment { private void updateWifiConnectButton() { if(selectedNetworkIndex >= wifiPresets.length) return; - WifiNetworkSettingsSet preset = wifiPresets[selectedNetworkIndex]; + WifiNetworkSettings preset = wifiPresets[selectedNetworkIndex]; boolean buttonEnabled = false; int buttonTextId = 0; @@ -416,8 +332,10 @@ public class WifiSettings extends CampusAppFragment { if(!wifiManager.isWifiEnabled()) { buttonTextId = R.string.wifisettings_connect_button_disabled; - } else if(networkInfo.isConnectedOrConnecting() && wifiInfo.getSSID() != null && wifiInfo.getSSID().equalsIgnoreCase(preset.ssid)) { + } else if(networkInfo.isConnectedOrConnecting() && wifiInfo.getSSID() != null && wifiInfo.getSSID().equalsIgnoreCase(preset.getSSID())) { buttonTextId = R.string.wifisettings_connect_button_ready; + } else if(preset.isTryConnecting) { + buttonTextId = R.string.wifisettings_connect_button_connecting; } else if(!networkScanned) { buttonTextId = R.string.wifisettings_connect_button_scan; } else if(!preset.isInScanResult) { @@ -445,7 +363,7 @@ public class WifiSettings extends CampusAppFragment { tablayout.removeAllTabs(); for(int i = 0; i < wifiPresets.length; i++) { TabLayout.Tab tab = tablayout.newTab(); - tab.setText(wifiPresets[i].name); + tab.setText(wifiPresets[i].getName()); tablayout.addTab(tab); } tablayout.setOnTabSelectedListener(new TabLayout.OnTabSelectedListener() { @@ -468,9 +386,7 @@ public class WifiSettings extends CampusAppFragment { connectBtn.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { - Button connectBtn = (Button) v; - connectBtn.setEnabled(false); - WifiNetworkSettingsSet settings = wifiPresets[selectedNetworkIndex]; + WifiNetworkSettings settings = wifiPresets[selectedNetworkIndex]; if(!settings.isInScanResult) { networkScanned = false; wifiManager.startScan(); @@ -478,24 +394,24 @@ public class WifiSettings extends CampusAppFragment { return; } + + EditText usernameEdt = (EditText) view.findViewById(R.id.wifiUsername); EditText passwordEdt = (EditText) view.findViewById(R.id.wifiPassword); String username = usernameEdt.getText().toString(); String password = passwordEdt.getText().toString(); - if (Build.VERSION.SDK_INT < 18) { - // connectToDHWiFi not supported! - // do something else? - } else if (username.length() > 0 && password.length() > 0) { - + if (username.length() > 0 && password.length() > 0) { if(settings != null) { + settings.isTryConnecting = true; settings.setAuthData(username, password); - connectToWiFi(settings); + + wifiConfigManager.connect(settings); } - } - connectBtn.setEnabled(true); + updateWifiConnectButton(); + } } }); @@ -512,7 +428,10 @@ public class WifiSettings extends CampusAppFragment { if(AppContext == null) AppContext = CampusAppContext.getInstance(); - AppContext.getMainActivity().registerReceiver(this.wifiStateReceiver, new IntentFilter(ConnectivityManager.CONNECTIVITY_ACTION)); + IntentFilter filter = new IntentFilter(); + filter.addAction(ConnectivityManager.CONNECTIVITY_ACTION); + filter.addAction(WifiManager.SUPPLICANT_STATE_CHANGED_ACTION); + AppContext.getMainActivity().registerReceiver(this.wifiStateReceiver, new IntentFilter(filter)); AppContext.getMainActivity().registerReceiver(this.wifiScanReceiver, new IntentFilter(WifiManager.SCAN_RESULTS_AVAILABLE_ACTION)); networkScanned = false; diff --git a/app/src/main/java/de/dhbwloe/campusapp/vorlesungen/CalendarManager.java b/app/src/main/java/de/dhbwloe/campusapp/vorlesungen/CalendarManager.java index fae9148..e7b03cb 100644 --- a/app/src/main/java/de/dhbwloe/campusapp/vorlesungen/CalendarManager.java +++ b/app/src/main/java/de/dhbwloe/campusapp/vorlesungen/CalendarManager.java @@ -83,7 +83,7 @@ public class CalendarManager extends IscRequestHelper { timeFrom = now - (86400 * 5); timeTo = now + (86400 * 7 * 4); } else { - timeFrom = now - (86400 * 365 * 3); + timeFrom = now - (86400 * 365 * 4); timeTo = now + (86400 * 365 * 4); } CourseEvent[] events = AppContext.getDatabaseManager().getCourseCalendarEvents(sCourseName, timeFrom, timeTo); @@ -213,7 +213,7 @@ public class CalendarManager extends IscRequestHelper { } } - dbEvent.update(AppContext.getDatabaseManager()); + dbEvent.update(AppContext.getDatabaseManager(), event); Log.i("CMSync", "Update Event: "+dbEvent.getUniqueId()); } diff --git a/app/src/main/java/de/dhbwloe/campusapp/vorlesungen/CourseEvent.java b/app/src/main/java/de/dhbwloe/campusapp/vorlesungen/CourseEvent.java index 71a49ca..0e5a1cb 100644 --- a/app/src/main/java/de/dhbwloe/campusapp/vorlesungen/CourseEvent.java +++ b/app/src/main/java/de/dhbwloe/campusapp/vorlesungen/CourseEvent.java @@ -1,24 +1,38 @@ package de.dhbwloe.campusapp.vorlesungen; +import net.fortuna.ical4j.model.Component; + +import java.util.regex.Matcher; +import java.util.regex.Pattern; + import de.dhbwloe.campusapp.database.DatabaseManager; /** * Created by pk910 on 20.01.2016. */ -public class CourseEvent { +public class CourseEvent implements Comparable { + public enum CourseType { + COURSETYPE_NORMAL, + COURSETYPE_SPECIAL, + COURSETYPE_KLAUSUR, + } + private int iEventId; private String sCourseName; private String sUniqueId; private int iSequenceId; private long iEventFrom, iEventTo; - private String sEventTitle, sEventLocation, sEventStatus; + private String sEventTitle, sEventTitleShort, sEventTitleAuthor, sEventLocation, sEventStatus; private String sRecurRule, sExcludeDates; private CourseGroup oCourseGroup; + private CourseType oCourseType = null; private boolean bMustUpdate = false; private boolean bIsNew = false; - public CourseEvent(int id, String coursename, String uniqueid, int sequenceid, long eventfrom, long eventto, String title, String location, String status, String rrule, String exdates, CourseGroup group) { + private boolean bIsKlausurPraesi = false; + + public CourseEvent(int id, String coursename, String uniqueid, int sequenceid, long eventfrom, long eventto, String title, String location, String status, String rrule, String exdates, CourseGroup group, int eventtype) { iEventId = id; sCourseName = coursename; sUniqueId = uniqueid; @@ -32,8 +46,14 @@ public class CourseEvent { sExcludeDates = exdates; oCourseGroup = group; - if(group != null) + if(group != null) { group.addCourseEvent(this); + try { + oCourseType = CourseType.values()[eventtype]; + } catch(Exception e) {} + } + + ParseEventTitle(); } public CourseEvent(String coursename, String uniqueid, int sequenceid, boolean isNew) { @@ -44,6 +64,37 @@ public class CourseEvent { bMustUpdate = isNew; } + public void ParseEventTitle() { + Pattern pattern = Pattern.compile("^((Klausur|Tutorium|Pr(ä|ae)sentation)[ :]+)?(.*?)( - ([a-zA-Z., -]+))?$"); + Matcher m = pattern.matcher(sEventTitle); + CourseType oldtype = oCourseType; + boolean typeisset = (oCourseType != null); + if (m.matches()) { + String eventType = m.group(2); + if (!typeisset && eventType != null && !eventType.isEmpty()) { + if(eventType.equalsIgnoreCase("Klausur")) + oCourseType = CourseType.COURSETYPE_KLAUSUR; + else if(eventType.equalsIgnoreCase("Präsentation") || eventType.equalsIgnoreCase("Praesentation")) { + oCourseType = CourseType.COURSETYPE_KLAUSUR; + bIsKlausurPraesi = true; + } else if(eventType.equalsIgnoreCase("Tutorium")) + oCourseType = CourseType.COURSETYPE_SPECIAL; + + typeisset = true; + } + sEventTitleShort = m.group(4); + sEventTitleAuthor = m.group(6); + } else { + sEventTitleShort = sEventTitle; + sEventTitleAuthor = ""; + } + if(!typeisset) + oCourseType = CourseType.COURSETYPE_NORMAL; + + if(oldtype != oCourseType) + bMustUpdate = true; + } + public void setEventId(int id) { iEventId = id; } @@ -57,11 +108,11 @@ public class CourseEvent { bMustUpdate = false; } - public void update(DatabaseManager dbm) { + public void update(DatabaseManager dbm, Component event) { if(!bMustUpdate) return; - dbm.updateCourseCalendar(this); + dbm.updateCourseCalendar(this, event); resetUpdateFlag(); } @@ -69,6 +120,22 @@ public class CourseEvent { return oCourseGroup; } + public void setCourseType(CourseType type) { + oCourseType = type; + } + + public CourseType getCourseType() { + return oCourseType; + } + + public int getCourseTypeId() { + for(int i = 0; i < CourseType.values().length; i++) { + if(oCourseType == CourseType.values()[i]) + return i; + } + return 0; + } + public void setCourseGroup(CourseGroup group) { group.addCourseEvent(this); oCourseGroup = group; @@ -108,11 +175,18 @@ public class CourseEvent { return sEventTitle; } public String getGroupTitle() { - return sEventTitle; // maybe cut prof name? + return sEventTitleShort + (sEventTitleAuthor == null ? "" : " - " + sEventTitleAuthor); + } + public String getEventShortTitle() { + return sEventTitleShort; + } + public String getEventDozent() { + return sEventTitleAuthor; } public void setEventTitle(String sEventTitle) { this.sEventTitle = sEventTitle; + ParseEventTitle(); bMustUpdate = true; } @@ -164,4 +238,13 @@ public class CourseEvent { this.sExcludeDates = exrules; bMustUpdate = true; } + + public boolean getIsKlausurPraesi() { + return bIsKlausurPraesi; + } + + @Override + public int compareTo(CourseEvent another) { + return (int)(another.getEventFrom() - iEventFrom); + } } diff --git a/app/src/main/java/de/dhbwloe/campusapp/vorlesungen/CourseGroup.java b/app/src/main/java/de/dhbwloe/campusapp/vorlesungen/CourseGroup.java index 06475c1..181f61b 100644 --- a/app/src/main/java/de/dhbwloe/campusapp/vorlesungen/CourseGroup.java +++ b/app/src/main/java/de/dhbwloe/campusapp/vorlesungen/CourseGroup.java @@ -1,8 +1,13 @@ package de.dhbwloe.campusapp.vorlesungen; +import android.os.Bundle; import android.provider.ContactsContract; +import java.lang.reflect.Array; import java.util.ArrayList; +import java.util.Arrays; +import java.util.regex.Matcher; +import java.util.regex.Pattern; import de.dhbwloe.campusapp.database.DatabaseManager; @@ -17,6 +22,8 @@ public class CourseGroup { private boolean bIsNew = false; private ArrayList events = new ArrayList(); + private Bundle extraData = new Bundle(); + public static CourseGroup GetCourseGroupById(DatabaseManager dbm, int id) { for(CourseGroup group : CourseGroups) { if(group.iCourseGroupId == id) @@ -61,6 +68,14 @@ public class CourseGroup { return (CourseEvent[])this.events.toArray(); } + public CourseEvent[] getOrderedCourseEvents() { + CourseEvent[] events = getCourseEvents(); + + Arrays.sort(events); + + return events; + } + public int getGroupId() { return iCourseGroupId; } @@ -72,4 +87,12 @@ public class CourseGroup { return ret; } + public Bundle getExtraData() { + return extraData; + } + + public String getGroupName() { + return sCourseGroupName; + } + } diff --git a/app/src/main/java/de/dhbwloe/campusapp/wifi/SecureLoginManager.java b/app/src/main/java/de/dhbwloe/campusapp/wifi/SecureLoginManager.java new file mode 100644 index 0000000..d98c626 --- /dev/null +++ b/app/src/main/java/de/dhbwloe/campusapp/wifi/SecureLoginManager.java @@ -0,0 +1,220 @@ +package de.dhbwloe.campusapp.wifi; + +import android.app.DownloadManager; +import android.net.NetworkInfo; +import android.net.SSLCertificateSocketFactory; +import android.net.SSLSessionCache; +import android.net.wifi.WifiInfo; +import android.os.AsyncTask; +import android.util.Log; + +import java.io.BufferedReader; +import java.io.BufferedWriter; +import java.io.IOException; +import java.io.InputStreamReader; +import java.io.OutputStream; +import java.io.OutputStreamWriter; +import java.io.UnsupportedEncodingException; +import java.net.HttpURLConnection; +import java.net.URL; +import java.net.URLConnection; +import java.net.URLEncoder; +import java.security.KeyManagementException; +import java.security.NoSuchAlgorithmException; +import java.util.ArrayList; +import java.util.List; +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +import javax.net.ssl.HttpsURLConnection; +import javax.net.ssl.KeyManager; +import javax.net.ssl.SSLContext; +import javax.net.ssl.SSLSocket; +import javax.net.ssl.SSLSocketFactory; +import javax.net.ssl.TrustManager; + +import cz.msebera.android.httpclient.HttpVersion; +import cz.msebera.android.httpclient.NameValuePair; +import cz.msebera.android.httpclient.client.HttpClient; +import cz.msebera.android.httpclient.client.methods.HttpPost; +import cz.msebera.android.httpclient.conn.ClientConnectionManager; +import cz.msebera.android.httpclient.conn.scheme.PlainSocketFactory; +import cz.msebera.android.httpclient.conn.scheme.Scheme; +import cz.msebera.android.httpclient.conn.scheme.SchemeRegistry; +import cz.msebera.android.httpclient.impl.client.DefaultHttpClient; +import cz.msebera.android.httpclient.impl.conn.tsccm.ThreadSafeClientConnManager; +import cz.msebera.android.httpclient.message.BasicNameValuePair; +import cz.msebera.android.httpclient.params.BasicHttpParams; +import cz.msebera.android.httpclient.params.HttpParams; +import cz.msebera.android.httpclient.params.HttpProtocolParams; +import cz.msebera.android.httpclient.protocol.HTTP; +import de.dhbwloe.campusapp.CampusAppContext; + +/** + * Created by pk910 on 08.02.2016. + */ +public class SecureLoginManager extends AsyncTask { + private static final String SECURELOGIN_URL = "https://securelogin1.dhbw-loerrach.de/cgi-bin/login"; + private static final int SECURELOGIN_TIMEOUT = 20000; + private static final int SECURELOGIN_HANDSHAKE_TIMEOUT = 10000; + private static String SECURELOGIN_FAILED_REGEX = "Authentication failed"; + private static String SECURELOGIN_SUCCESS_REGEX = "User Authenticated"; + + public interface SecureLoginResult { + void onSecureLoginFailed(String errMsg); + void onSecureLoginSuccess(); + } + + private CampusAppContext AppContext; + private SecureLoginTask task; + private String responseString; + + @Override + protected SecureLoginTask doInBackground(SecureLoginTask... params) { + task = params[0]; + if (AppContext == null) + AppContext = CampusAppContext.getInstance(); + + task.responseReceived = false; + task.responseString = null; + + //build login post request: + //https://securelogin1.dhbw-loerrach.de/cgi-bin/login + // user=***censored*** + // password=***censored*** + // cmd=authenticate + // Login=Log+In + + /* Dear DHBW Tech Guys + * Go and replace these fucking outdated and insecure SSL implementation for your "secure"login page! + * 3DES_EDE_CBC + * + * Ok, after ~3 days android ssl library analysis, i've finnaly made it communicating with an 3DES Endpoint. + * Dear DHBW Tech Guys, gu fuck yourself! If you don't know why, continue (^.^) + */ + + //SSLSocket socket = null; + StringBuilder responseString = new StringBuilder(); + try { + SSLContext sslContext = SSLContext.getInstance("TLS"); + SecureLoginTrustManager loginTrustManager = new SecureLoginTrustManager(); + sslContext.init(null, new TrustManager[]{loginTrustManager}, null); + SSLSocketFactory innerSslSocketPactory = SSLCertificateSocketFactory.getInsecure(SECURELOGIN_HANDSHAKE_TIMEOUT, new SSLSessionCache(AppContext.getMainActivity())); + SSLSocketFactory sslSocketFactory = new SecureLoginSocketFactory(sslContext, innerSslSocketPactory); + + //SSLSocket socket = (SSLSocket) sslSocketFactory.createSocket("securelogin1.dhbw-loerrach.de", 443); + //socket.startHandshake(); + + Log.i("SecureLogin", "HTTPS INITIALIZED"); + + URL url = new URL(SECURELOGIN_URL); + URLConnection conn = url.openConnection(); + if (conn instanceof HttpsURLConnection) { + ((HttpsURLConnection)conn).setSSLSocketFactory(sslSocketFactory); + ((HttpsURLConnection )conn).setRequestMethod("POST"); + ((HttpsURLConnection)conn).setHostnameVerifier(org.apache.http.conn.ssl.SSLSocketFactory.ALLOW_ALL_HOSTNAME_VERIFIER); + } else { + ((HttpURLConnection) conn).setRequestMethod("POST"); + } + conn.setConnectTimeout(SECURELOGIN_TIMEOUT); + conn.setReadTimeout(SECURELOGIN_TIMEOUT); + + conn.setDoInput(true); + conn.setDoOutput(true); + + List postData = new ArrayList(); + postData.add(new BasicNameValuePair("cmd", "authenticate")); + postData.add(new BasicNameValuePair("Login", "Log+In")); + postData.add(new BasicNameValuePair("user", task.settings.username)); + postData.add(new BasicNameValuePair("password", task.settings.password)); + + OutputStream os = conn.getOutputStream(); + BufferedWriter writer = new BufferedWriter( + new OutputStreamWriter(os, "UTF-8")); + String postString = encodePostData(postData); + writer.write(postString); + writer.flush(); + writer.close(); + os.close(); + + conn.connect(); + + int responseCode; + if (conn instanceof HttpsURLConnection) + responseCode = ((HttpsURLConnection)conn).getResponseCode(); + else + responseCode = ((HttpURLConnection)conn).getResponseCode(); + + if (responseCode == HttpsURLConnection.HTTP_OK) { + task.responseReceived = true; + String line; + BufferedReader br=new BufferedReader(new InputStreamReader(conn.getInputStream())); + while ((line=br.readLine()) != null) { + responseString.append(line); + } + } else { + task.responseError = "HTTP " + Integer.toString(responseCode); + } + + } catch (Exception e) { + task.responseError = e.getMessage(); + } + + task.responseString = responseString.toString(); + + return task; + } + + @Override + protected void onPreExecute() { + super.onPreExecute(); + + } + + @Override + protected void onPostExecute(SecureLoginTask task) { + super.onPostExecute(task); + + boolean success = false; + String error = null; + + if(task.responseReceived) { + Pattern p1 = Pattern.compile(SECURELOGIN_SUCCESS_REGEX); + Pattern p2 = Pattern.compile(SECURELOGIN_FAILED_REGEX); + + Matcher m1 = p1.matcher(task.responseString); + Matcher m2 = p2.matcher(task.responseString); + + if(m1.find()) + success = true; + else if(m2.find()) + error = "Incorrect username or password code entered. Please try again."; + else + error = "An unknown error occured!"; + } else if(task.responseError != null) { + error = task.responseError; + } + if(success) + task.loginCallback.onSecureLoginSuccess(); + else + task.loginCallback.onSecureLoginFailed(error); + } + + private String encodePostData(List params) throws UnsupportedEncodingException { + StringBuilder result = new StringBuilder(); + boolean first = true; + + for (NameValuePair pair : params) { + if (first) + first = false; + else + result.append("&"); + + result.append(URLEncoder.encode(pair.getName(), "UTF-8")); + result.append("="); + result.append(URLEncoder.encode(pair.getValue(), "UTF-8")); + } + + return result.toString(); + } +} diff --git a/app/src/main/java/de/dhbwloe/campusapp/wifi/SecureLoginSocketFactory.java b/app/src/main/java/de/dhbwloe/campusapp/wifi/SecureLoginSocketFactory.java new file mode 100644 index 0000000..74f06f9 --- /dev/null +++ b/app/src/main/java/de/dhbwloe/campusapp/wifi/SecureLoginSocketFactory.java @@ -0,0 +1,95 @@ +package de.dhbwloe.campusapp.wifi; + +import android.util.Log; + +import java.io.IOException; +import java.net.InetAddress; +import java.net.Socket; +import java.net.UnknownHostException; +import java.security.KeyManagementException; +import java.security.NoSuchAlgorithmException; +import java.security.SecureRandom; +import java.security.cert.CertificateException; +import java.security.cert.X509Certificate; + +import javax.net.ssl.SSLContext; +import javax.net.ssl.SSLSocket; +import javax.net.ssl.SSLSocketFactory; +import javax.net.ssl.TrustManager; + +public class SecureLoginSocketFactory extends SSLSocketFactory { + private static final String ENABLED_PROTOCOLS[] = { + "TLSv1", "TLSv1.1", "TLSv1.2" + }; + private static final String ENABLED_CIPHERS[] = { + "TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA", + "TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA", + "TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA", + "TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA", + "TLS_DHE_RSA_WITH_AES_128_CBC_SHA", + "TLS_DHE_RSA_WITH_AES_256_CBC_SHA", + "TLS_DHE_DSS_WITH_AES_128_CBC_SHA", + "TLS_ECDHE_RSA_WITH_RC4_128_SHA", + "TLS_ECDHE_ECDSA_WITH_RC4_128_SHA", + "TLS_RSA_WITH_AES_128_CBC_SHA", + "TLS_RSA_WITH_AES_256_CBC_SHA", + "SSL_RSA_WITH_3DES_EDE_CBC_SHA", + "SSL_RSA_WITH_RC4_128_SHA", + "SSL_RSA_WITH_RC4_128_MD5", + }; + + private SSLSocketFactory socketFactory; + public SSLContext context; + + public SecureLoginSocketFactory(SSLContext context, SSLSocketFactory innerSslSocketFactory) { + super(); + this.context = context; + this.socketFactory = innerSslSocketFactory; + } + + @Override + public String[] getDefaultCipherSuites() { + return socketFactory.getDefaultCipherSuites(); + } + + @Override + public String[] getSupportedCipherSuites() { + return socketFactory.getSupportedCipherSuites(); + } + + @Override + public Socket createSocket(Socket s, String host, int port, boolean autoClose) throws IOException { + return enableTLSOnSocket(socketFactory.createSocket(s, host, port, autoClose)); + } + + @Override + public Socket createSocket(String host, int port) throws IOException, UnknownHostException { + return enableTLSOnSocket(socketFactory.createSocket(host, port)); + } + + @Override + public Socket createSocket(String host, int port, InetAddress localHost, int localPort) throws IOException, UnknownHostException { + return enableTLSOnSocket(socketFactory.createSocket(host, port, localHost, localPort)); + } + + @Override + public Socket createSocket(InetAddress host, int port) throws IOException { + return enableTLSOnSocket(socketFactory.createSocket(host, port)); + } + + @Override + public Socket createSocket(InetAddress address, int port, InetAddress localAddress, int localPort) throws IOException { + return enableTLSOnSocket(socketFactory.createSocket(address, port, localAddress, localPort)); + } + + private Socket enableTLSOnSocket(Socket socket) { + if(socket != null && (socket instanceof SSLSocket)) { + SSLSocket sslSocket = ((SSLSocket) socket); + + sslSocket.setEnabledCipherSuites(ENABLED_CIPHERS); + sslSocket.setEnabledProtocols(ENABLED_PROTOCOLS); + } + return socket; + } + +} \ No newline at end of file diff --git a/app/src/main/java/de/dhbwloe/campusapp/wifi/SecureLoginTask.java b/app/src/main/java/de/dhbwloe/campusapp/wifi/SecureLoginTask.java new file mode 100644 index 0000000..2e7f7a5 --- /dev/null +++ b/app/src/main/java/de/dhbwloe/campusapp/wifi/SecureLoginTask.java @@ -0,0 +1,20 @@ +package de.dhbwloe.campusapp.wifi; + +import android.net.NetworkInfo; +import android.net.wifi.WifiInfo; +import android.net.wifi.WifiManager; + +/** + * Created by pk910 on 08.02.2016. + */ +public class SecureLoginTask { + public WifiNetworkSettings settings; + public NetworkInfo networkInfo; + public WifiInfo wifiInfo; + + public boolean responseReceived; + public String responseString; + public String responseError; + + public SecureLoginManager.SecureLoginResult loginCallback; +} diff --git a/app/src/main/java/de/dhbwloe/campusapp/wifi/SecureLoginTrustManager.java b/app/src/main/java/de/dhbwloe/campusapp/wifi/SecureLoginTrustManager.java new file mode 100644 index 0000000..9c0b545 --- /dev/null +++ b/app/src/main/java/de/dhbwloe/campusapp/wifi/SecureLoginTrustManager.java @@ -0,0 +1,31 @@ +package de.dhbwloe.campusapp.wifi; + +import java.security.cert.CertificateException; +import java.security.cert.X509Certificate; + +/** + * Created by pk910 on 12.02.2016. + */ +public class SecureLoginTrustManager implements javax.net.ssl.X509TrustManager { + private static final X509Certificate[] _AcceptedIssuers = new X509Certificate[] {}; + + public void checkClientTrusted(X509Certificate[] arg0, String arg1) + throws CertificateException { + } + + public void checkServerTrusted(X509Certificate[] arg0, String arg1) + throws CertificateException { + } + + public boolean isClientTrusted(X509Certificate[] chain) { + return (true); + } + + public boolean isServerTrusted(X509Certificate[] chain) { + return (true); + } + + public X509Certificate[] getAcceptedIssuers() { + return (_AcceptedIssuers); + } +} diff --git a/app/src/main/java/de/dhbwloe/campusapp/wifi/WifiConfigurationManager.java b/app/src/main/java/de/dhbwloe/campusapp/wifi/WifiConfigurationManager.java new file mode 100644 index 0000000..a58f128 --- /dev/null +++ b/app/src/main/java/de/dhbwloe/campusapp/wifi/WifiConfigurationManager.java @@ -0,0 +1,72 @@ +package de.dhbwloe.campusapp.wifi; + +import android.annotation.TargetApi; +import android.net.NetworkInfo; +import android.net.wifi.WifiConfiguration; +import android.net.wifi.WifiEnterpriseConfig; +import android.net.wifi.WifiInfo; +import android.net.wifi.WifiManager; +import android.os.Build; + +import java.io.IOException; +import java.security.cert.CertificateException; + +/** + * Created by pk910 on 08.02.2016. + */ +public class WifiConfigurationManager { + public interface WifiConfigurationComplete { + public void onWifiConfigurationComplete(WifiNetworkSettings settings, String response); + } + + private WifiManager wifiManager; + + public WifiConfigurationManager(WifiManager wifiManager) { + this.wifiManager = wifiManager; + } + + public void connect(WifiNetworkSettings settings) { + if (Build.VERSION.SDK_INT >= 18) { + connectToWiFi(settings); + } + } + + + @TargetApi(18) + private void connectToWiFi(WifiNetworkSettings settings) { + WifiConfiguration wifiConfig = new WifiConfiguration(); + wifiConfig.SSID = settings.ssid; + for(int i = 0; i < settings.authAlgorithms.length; i++) + wifiConfig.allowedKeyManagement.set(settings.authAlgorithms[i]); + + switch(settings.authType) { + case WIFI_AUTHTYPE_NONE: + break; + case WIFI_AUTHTYPE_WEP: + // not supported by our app + break; + case WIFI_AUTHTYPE_WPA: + + break; + case WIFI_AUTHTYPE_WPA_ENTERPRISE: + WifiEnterpriseConfig enterpriseConfig = new WifiEnterpriseConfig(); + String username = settings.username; + if(settings.usernameSuffix != null) + username += settings.usernameSuffix; + enterpriseConfig.setIdentity(username); + enterpriseConfig.setPassword(settings.password); + enterpriseConfig.setEapMethod(settings.eapMethod); + enterpriseConfig.setPhase2Method(settings.phase2Method); + try { + enterpriseConfig.setCaCertificate(settings.generateCertificate()); + } catch (CertificateException e) { + } catch (IOException e) { + } + wifiConfig.enterpriseConfig = enterpriseConfig; + break; + } + int networkId = wifiManager.addNetwork(wifiConfig); + wifiManager.enableNetwork(networkId, true); + } + +} diff --git a/app/src/main/java/de/dhbwloe/campusapp/wifi/WifiNetworkSettings.java b/app/src/main/java/de/dhbwloe/campusapp/wifi/WifiNetworkSettings.java new file mode 100644 index 0000000..3c1ba68 --- /dev/null +++ b/app/src/main/java/de/dhbwloe/campusapp/wifi/WifiNetworkSettings.java @@ -0,0 +1,264 @@ +package de.dhbwloe.campusapp.wifi; + +import android.net.wifi.WifiConfiguration; +import android.net.wifi.WifiEnterpriseConfig; +import android.support.design.widget.TabLayout; +import android.util.Base64; + +import java.io.ByteArrayInputStream; +import java.io.IOException; +import java.security.cert.CertificateException; +import java.security.cert.CertificateFactory; +import java.security.cert.X509Certificate; +import java.util.ArrayList; + +import de.dhbwloe.campusapp.CampusAppContext; + +/** + * Created by pk910 on 08.02.2016. + */ +public class WifiNetworkSettings { + public static WifiNetworkSettings[] LoadNetworkSettingPresets(CampusAppContext context) { + ArrayList presets = new ArrayList(); + + presets.add((new WifiNetworkSettings("dhbw-secure", "dhbw-secure", WifiNetworkAuthenticationTypes.WIFI_AUTHTYPE_WPA_ENTERPRISE)). + setWpaEnterprise( + new int[]{WifiConfiguration.KeyMgmt.WPA_EAP, WifiConfiguration.KeyMgmt.IEEE8021X}, + WifiEnterpriseConfig.Eap.PEAP, + WifiEnterpriseConfig.Phase2.MSCHAPV2, + null + ).setCACertificate("Deutsche Telekom Root CA 2", "-----BEGIN CERTIFICATE-----\n" + + "MIIDnzCCAoegAwIBAgIBJjANBgkqhkiG9w0BAQUFADBxMQswCQYDVQQGEwJERTEc\n" + + "MBoGA1UEChMTRGV1dHNjaGUgVGVsZWtvbSBBRzEfMB0GA1UECxMWVC1UZWxlU2Vj\n" + + "IFRydXN0IENlbnRlcjEjMCEGA1UEAxMaRGV1dHNjaGUgVGVsZWtvbSBSb290IENB\n" + + "IDIwHhcNOTkwNzA5MTIxMTAwWhcNMTkwNzA5MjM1OTAwWjBxMQswCQYDVQQGEwJE\n" + + "RTEcMBoGA1UEChMTRGV1dHNjaGUgVGVsZWtvbSBBRzEfMB0GA1UECxMWVC1UZWxl\n" + + "U2VjIFRydXN0IENlbnRlcjEjMCEGA1UEAxMaRGV1dHNjaGUgVGVsZWtvbSBSb290\n" + + "IENBIDIwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCrC6M14IspFLEU\n" + + "ha88EOQ5bzVdSq7d6mGNlUn0b2SjGmBmpKlAIoTZ1KXleJMOaAGtuU1cOs7TuKhC\n" + + "QN/Po7qCWWqSG6wcmtoIKyUn+WkjR/Hg6yx6m/UTAtB+NHzCnjwAWav12gz1Mjwr\n" + + "rFDa1sPeg5TKqAyZMg4ISFZbavva4VhYAUlfckE8FQYBjl2tqriTtM2e66foai1S\n" + + "NNs671x1Udrb8zH57nGYMsRUFUQM+ZtV7a3fGAigo4aKSe5TBY8ZTNXeWHmb0moc\n" + + "QqvF1afPaA+W5OFhmHZhyJF81j4A4pFQh+GdCuatl9Idxjp9y7zaAzTVjlsB9WoH\n" + + "txa2bkp/AgMBAAGjQjBAMB0GA1UdDgQWBBQxw3kbuvVT1xfgiXotF2wKsyudMzAP\n" + + "BgNVHRMECDAGAQH/AgEFMA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQUFAAOC\n" + + "AQEAlGRZrTlk5ynrE/5aw4sTV8gEJPB0d8Bg42f76Ymmg7+Wgnxu1MM9756Abrsp\n" + + "tJh6sTtU6zkXR34ajgv8HzFZMQSyzhfzLMdiNlXiItiJVbSYSKpk+tYcNthEeFpa\n" + + "IzpXl/V6ME+un2pMSyuOoAPjPuCp1NJ70rOo4nI8rZ7/gFnkm0W09juwzTkZmDLl\n" + + "6iFhkOQxIY40sfcvNUqFENrnijchvllj4PKFiDFT1FQUhXB59C4Gdyd1Lx+4ivn+\n" + + "xbrYNuSD7Odlt79jWvNGr4GUN9RBjNYj1h7P9WgbRGOiWrqnNVmh5XAFmw4jV5mU\n" + + "Cm26OWMohpLzGITY+9HPBVZkVw==\n" + + "-----END CERTIFICATE-----")); + + presets.add((new WifiNetworkSettings("dhbw-wlan", "dhbw-wlan", WifiNetworkAuthenticationTypes.WIFI_AUTHTYPE_NONE)). + setDHSecureLogin(new SecureLoginManager()).setCACertificate("DHBW CA - G01", "-----BEGIN CERTIFICATE-----\n" + + "MIIFSjCCBDKgAwIBAgIHF6/20DYr2jANBgkqhkiG9w0BAQsFADBaMQswCQYDVQQG\n" + + "EwJERTETMBEGA1UEChMKREZOLVZlcmVpbjEQMA4GA1UECxMHREZOLVBLSTEkMCIG\n" + + "A1UEAxMbREZOLVZlcmVpbiBQQ0EgR2xvYmFsIC0gRzAxMB4XDTE0MDYwNTE0MDU1\n" + + "MloXDTE5MDcwOTIzNTkwMFowcjELMAkGA1UEBhMCREUxLDAqBgNVBAoTI0R1YWxl\n" + + "IEhvY2hzY2h1bGUgQmFkZW4tV3VlcnR0ZW1iZXJnMRYwFAYDVQQDEw1ESEJXIENB\n" + + "IC0gRzAxMR0wGwYJKoZIhvcNAQkBFg5wa2lAZGhidy12cy5kZTCCASIwDQYJKoZI\n" + + "hvcNAQEBBQADggEPADCCAQoCggEBALtoqHrbNRjuRdIh20VPATXIitkVgIva+HcA\n" + + "Q7qA87lsm6v28DSasCPgx+TnGoUduGucA7fA7UhtWGqmU5cbJ5Ucsra0XBwqbOEN\n" + + "u7GIBVcK7vUac67Ny+9TEqB/mtKz4nU/G8TlpX5hotMDg4H46SvtIvtSz1RJ2BVs\n" + + "ssssubz3zI/W5Y6qqfRhZGLzrqmZYYlfCc/sn0jOkElgomAzzt4rmKRq8CsX3bYJ\n" + + "ImeUaEHXU5QgTEZLgA9olse54r6N2O+cM4y/eDK9q9RaWdjNKTDsRq/sILlgUIaO\n" + + "XcxzBa3pOhQ7zRb5amGiTIxWb2Szzy+Ka1XO9BseTFCcot8BAO8CAwEAAaOCAfsw\n" + + "ggH3MBIGA1UdEwEB/wQIMAYBAf8CAQEwDgYDVR0PAQH/BAQDAgEGMBEGA1UdIAQK\n" + + "MAgwBgYEVR0gADAdBgNVHQ4EFgQUjOlwcWC4U59ExpdeQh/tKHK9Dn4wHwYDVR0j\n" + + "BBgwFoAUSbfGz+g9H3/qRHsTKffxCnA+3mQwGQYDVR0RBBIwEIEOcGtpQGRoYnct\n" + + "dnMuZGUwgYgGA1UdHwSBgDB+MD2gO6A5hjdodHRwOi8vY2RwMS5wY2EuZGZuLmRl\n" + + "L2dsb2JhbC1yb290LWNhL3B1Yi9jcmwvY2FjcmwuY3JsMD2gO6A5hjdodHRwOi8v\n" + + "Y2RwMi5wY2EuZGZuLmRlL2dsb2JhbC1yb290LWNhL3B1Yi9jcmwvY2FjcmwuY3Js\n" + + "MIHXBggrBgEFBQcBAQSByjCBxzAzBggrBgEFBQcwAYYnaHR0cDovL29jc3AucGNh\n" + + "LmRmbi5kZS9PQ1NQLVNlcnZlci9PQ1NQMEcGCCsGAQUFBzAChjtodHRwOi8vY2Rw\n" + + "MS5wY2EuZGZuLmRlL2dsb2JhbC1yb290LWNhL3B1Yi9jYWNlcnQvY2FjZXJ0LmNy\n" + + "dDBHBggrBgEFBQcwAoY7aHR0cDovL2NkcDIucGNhLmRmbi5kZS9nbG9iYWwtcm9v\n" + + "dC1jYS9wdWIvY2FjZXJ0L2NhY2VydC5jcnQwDQYJKoZIhvcNAQELBQADggEBAMS9\n" + + "5ypdDi/q3AeBOfzj3A3PZaQaLumKxvVeA2xy8j8XtwWpPeG99QwtqeKlJ3+OCuwT\n" + + "eRtkWxnsm0eonLYI2rSL8y94LUoM0kj4GiHbRqL4eqPJKCwoQeTWxkeW/2fmZPtn\n" + + "u9zBDAWFDgMtK9iiIOzp9FlNljHKJH1EdaWJD/Gv/5+ElNZpFDZ/oz/kosyvLeWZ\n" + + "EiA3U8/LDPFPlxe+gVqmr7+tzo88/C6i3NZSaUJ3qkaWSxx+xx/sNXoHX22msHwN\n" + + "SqnBQinCotrRO3WgZVDvhN3/eHZ8Zj7z6re7x/qlIGsKDVGxidWjGQDF2jp8O5Rp\n" + + "uD3s1d70097Es++KwAg=\n" + + "-----END CERTIFICATE-----\n")); + + presets.add((new WifiNetworkSettings("dhbw-802.1x", "dhbw-802.1x", WifiNetworkAuthenticationTypes.WIFI_AUTHTYPE_WPA_ENTERPRISE)). + setWpaEnterprise( + new int[]{WifiConfiguration.KeyMgmt.WPA_EAP, WifiConfiguration.KeyMgmt.IEEE8021X}, + WifiEnterpriseConfig.Eap.PEAP, + WifiEnterpriseConfig.Phase2.GTC, + null + ).setCACertificate("Deutsche Telekom Root CA 2", "-----BEGIN CERTIFICATE-----\n" + + "MIIDnzCCAoegAwIBAgIBJjANBgkqhkiG9w0BAQUFADBxMQswCQYDVQQGEwJERTEc\n" + + "MBoGA1UEChMTRGV1dHNjaGUgVGVsZWtvbSBBRzEfMB0GA1UECxMWVC1UZWxlU2Vj\n" + + "IFRydXN0IENlbnRlcjEjMCEGA1UEAxMaRGV1dHNjaGUgVGVsZWtvbSBSb290IENB\n" + + "IDIwHhcNOTkwNzA5MTIxMTAwWhcNMTkwNzA5MjM1OTAwWjBxMQswCQYDVQQGEwJE\n" + + "RTEcMBoGA1UEChMTRGV1dHNjaGUgVGVsZWtvbSBBRzEfMB0GA1UECxMWVC1UZWxl\n" + + "U2VjIFRydXN0IENlbnRlcjEjMCEGA1UEAxMaRGV1dHNjaGUgVGVsZWtvbSBSb290\n" + + "IENBIDIwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCrC6M14IspFLEU\n" + + "ha88EOQ5bzVdSq7d6mGNlUn0b2SjGmBmpKlAIoTZ1KXleJMOaAGtuU1cOs7TuKhC\n" + + "QN/Po7qCWWqSG6wcmtoIKyUn+WkjR/Hg6yx6m/UTAtB+NHzCnjwAWav12gz1Mjwr\n" + + "rFDa1sPeg5TKqAyZMg4ISFZbavva4VhYAUlfckE8FQYBjl2tqriTtM2e66foai1S\n" + + "NNs671x1Udrb8zH57nGYMsRUFUQM+ZtV7a3fGAigo4aKSe5TBY8ZTNXeWHmb0moc\n" + + "QqvF1afPaA+W5OFhmHZhyJF81j4A4pFQh+GdCuatl9Idxjp9y7zaAzTVjlsB9WoH\n" + + "txa2bkp/AgMBAAGjQjBAMB0GA1UdDgQWBBQxw3kbuvVT1xfgiXotF2wKsyudMzAP\n" + + "BgNVHRMECDAGAQH/AgEFMA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQUFAAOC\n" + + "AQEAlGRZrTlk5ynrE/5aw4sTV8gEJPB0d8Bg42f76Ymmg7+Wgnxu1MM9756Abrsp\n" + + "tJh6sTtU6zkXR34ajgv8HzFZMQSyzhfzLMdiNlXiItiJVbSYSKpk+tYcNthEeFpa\n" + + "IzpXl/V6ME+un2pMSyuOoAPjPuCp1NJ70rOo4nI8rZ7/gFnkm0W09juwzTkZmDLl\n" + + "6iFhkOQxIY40sfcvNUqFENrnijchvllj4PKFiDFT1FQUhXB59C4Gdyd1Lx+4ivn+\n" + + "xbrYNuSD7Odlt79jWvNGr4GUN9RBjNYj1h7P9WgbRGOiWrqnNVmh5XAFmw4jV5mU\n" + + "Cm26OWMohpLzGITY+9HPBVZkVw==\n" + + "-----END CERTIFICATE-----")); + + presets.add((new WifiNetworkSettings("eduroam", "eduroam", WifiNetworkAuthenticationTypes.WIFI_AUTHTYPE_WPA_ENTERPRISE)). + setWpaEnterprise( + new int[] {WifiConfiguration.KeyMgmt.WPA_EAP, WifiConfiguration.KeyMgmt.IEEE8021X}, + WifiEnterpriseConfig.Eap.PEAP, + WifiEnterpriseConfig.Phase2.MSCHAPV2, + null + ).setCACertificate("Deutsche Telekom Root CA 2", "-----BEGIN CERTIFICATE-----\n" + + "MIIDnzCCAoegAwIBAgIBJjANBgkqhkiG9w0BAQUFADBxMQswCQYDVQQGEwJERTEc\n" + + "MBoGA1UEChMTRGV1dHNjaGUgVGVsZWtvbSBBRzEfMB0GA1UECxMWVC1UZWxlU2Vj\n" + + "IFRydXN0IENlbnRlcjEjMCEGA1UEAxMaRGV1dHNjaGUgVGVsZWtvbSBSb290IENB\n" + + "IDIwHhcNOTkwNzA5MTIxMTAwWhcNMTkwNzA5MjM1OTAwWjBxMQswCQYDVQQGEwJE\n" + + "RTEcMBoGA1UEChMTRGV1dHNjaGUgVGVsZWtvbSBBRzEfMB0GA1UECxMWVC1UZWxl\n" + + "U2VjIFRydXN0IENlbnRlcjEjMCEGA1UEAxMaRGV1dHNjaGUgVGVsZWtvbSBSb290\n" + + "IENBIDIwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCrC6M14IspFLEU\n" + + "ha88EOQ5bzVdSq7d6mGNlUn0b2SjGmBmpKlAIoTZ1KXleJMOaAGtuU1cOs7TuKhC\n" + + "QN/Po7qCWWqSG6wcmtoIKyUn+WkjR/Hg6yx6m/UTAtB+NHzCnjwAWav12gz1Mjwr\n" + + "rFDa1sPeg5TKqAyZMg4ISFZbavva4VhYAUlfckE8FQYBjl2tqriTtM2e66foai1S\n" + + "NNs671x1Udrb8zH57nGYMsRUFUQM+ZtV7a3fGAigo4aKSe5TBY8ZTNXeWHmb0moc\n" + + "QqvF1afPaA+W5OFhmHZhyJF81j4A4pFQh+GdCuatl9Idxjp9y7zaAzTVjlsB9WoH\n" + + "txa2bkp/AgMBAAGjQjBAMB0GA1UdDgQWBBQxw3kbuvVT1xfgiXotF2wKsyudMzAP\n" + + "BgNVHRMECDAGAQH/AgEFMA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQUFAAOC\n" + + "AQEAlGRZrTlk5ynrE/5aw4sTV8gEJPB0d8Bg42f76Ymmg7+Wgnxu1MM9756Abrsp\n" + + "tJh6sTtU6zkXR34ajgv8HzFZMQSyzhfzLMdiNlXiItiJVbSYSKpk+tYcNthEeFpa\n" + + "IzpXl/V6ME+un2pMSyuOoAPjPuCp1NJ70rOo4nI8rZ7/gFnkm0W09juwzTkZmDLl\n" + + "6iFhkOQxIY40sfcvNUqFENrnijchvllj4PKFiDFT1FQUhXB59C4Gdyd1Lx+4ivn+\n" + + "xbrYNuSD7Odlt79jWvNGr4GUN9RBjNYj1h7P9WgbRGOiWrqnNVmh5XAFmw4jV5mU\n" + + "Cm26OWMohpLzGITY+9HPBVZkVw==\n" + + "-----END CERTIFICATE-----"). + setUserSuffix("@dhbw-loerrach.de")); + + WifiNetworkSettings[] presetsArr = new WifiNetworkSettings[presets.size()]; + presetsArr = presets.toArray(presetsArr); + return presetsArr; + } + + public enum WifiNetworkAuthenticationTypes { + WIFI_AUTHTYPE_NONE, + WIFI_AUTHTYPE_WEP, + WIFI_AUTHTYPE_WPA, + WIFI_AUTHTYPE_WPA_ENTERPRISE, + }; + + String name; + String ssid; + WifiNetworkAuthenticationTypes authType; + int[] authAlgorithms = new int[0]; + int eapMethod; + int phase2Method; + + String caCertStr; + String caName; + + SecureLoginManager performDHSecureLogin; + String usernameSuffix; + String username; + String password; + + public TabLayout.Tab tab; + public boolean isInScanResult = false; + public boolean isTryConnecting = false; + public boolean isAssociating = false; + public boolean isAssociated = false; + public boolean isAuthenticated = false; + public boolean isDisconnected = false; + public boolean failedAuthentication = false; + + public WifiNetworkSettings(String name, String ssid, WifiNetworkAuthenticationTypes authType) { + this.name = name; + this.ssid = ssid; + this.authType = authType; + switch(authType) { + case WIFI_AUTHTYPE_NONE: + case WIFI_AUTHTYPE_WEP: + this.authAlgorithms = new int[] { WifiConfiguration.KeyMgmt.NONE }; + break; + case WIFI_AUTHTYPE_WPA: + this.authAlgorithms = new int[] { WifiConfiguration.KeyMgmt.WPA_PSK }; + break; + } + } + + public WifiNetworkSettings setWpaEnterprise(int[] authAlgorithms, int eapMethod, int phase2Method, String username) { + this.authAlgorithms = authAlgorithms; + this.eapMethod = eapMethod; + this.phase2Method = phase2Method; + this.username = username; + return this; + } + + public WifiNetworkSettings setPassword(String password) { + this.password = password; + return this; + } + + public WifiNetworkSettings setCACertificate(String caname, String certificate) { + this.caName = caname; + this.caCertStr = certificate; + return this; + } + + public WifiNetworkSettings setUserSuffix(String suffix) { + this.usernameSuffix = suffix; + return this; + } + + public WifiNetworkSettings setDHSecureLogin(SecureLoginManager secureLogin) { + this.performDHSecureLogin = secureLogin; + return this; + } + + public void setAuthData(String username, String password) { + this.username = username; + this.password = password; + } + + public void setAuthData(String password) { + this.password = password; + } + + public X509Certificate generateCertificate() throws CertificateException, IOException { + byte[] decoded = Base64.decode(caCertStr.replaceAll("-----BEGIN CERTIFICATE-----", "").replaceAll("-----END CERTIFICATE-----", ""), Base64.DEFAULT); + return (X509Certificate) CertificateFactory.getInstance("X.509").generateCertificate(new ByteArrayInputStream(decoded)); + } + + + + public String getName() { + return name; + } + + public String getSSID() { + return ssid; + } + + public WifiNetworkSettings.WifiNetworkAuthenticationTypes getAuthType() { + return authType; + } + + public int getEapMethod() { + return eapMethod; + } + public int getPhase2Method() { + return phase2Method; + } + + public String getCAName() { + return caName; + } + +} diff --git a/app/src/main/res/drawable/dhbw_mensa.jpg b/app/src/main/res/drawable/dhbw_mensa.jpg new file mode 100644 index 0000000..4d04fc4 Binary files /dev/null and b/app/src/main/res/drawable/dhbw_mensa.jpg differ diff --git a/app/src/main/res/drawable/header_dhbw.png b/app/src/main/res/drawable/header_dhbw.png new file mode 100644 index 0000000..30ca9c6 Binary files /dev/null and b/app/src/main/res/drawable/header_dhbw.png differ diff --git a/app/src/main/res/drawable/header_kalender.jpg b/app/src/main/res/drawable/header_kalender.jpg new file mode 100644 index 0000000..c7f94b0 Binary files /dev/null and b/app/src/main/res/drawable/header_kalender.jpg differ diff --git a/app/src/main/res/drawable/header_stuv.png b/app/src/main/res/drawable/header_stuv.png new file mode 100644 index 0000000..d4fcaa4 Binary files /dev/null and b/app/src/main/res/drawable/header_stuv.png differ diff --git a/app/src/main/res/drawable/platzhalter.png b/app/src/main/res/drawable/platzhalter.png new file mode 100644 index 0000000..d501e0c Binary files /dev/null and b/app/src/main/res/drawable/platzhalter.png differ diff --git a/app/src/main/res/layout-land/fragment_dashboard.xml b/app/src/main/res/layout-land/fragment_dashboard.xml new file mode 100644 index 0000000..994876f --- /dev/null +++ b/app/src/main/res/layout-land/fragment_dashboard.xml @@ -0,0 +1,184 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/app/src/main/res/layout/fragment_dashboard.xml b/app/src/main/res/layout/fragment_dashboard.xml index d6f19a5..4f0d324 100644 --- a/app/src/main/res/layout/fragment_dashboard.xml +++ b/app/src/main/res/layout/fragment_dashboard.xml @@ -1,9 +1,177 @@ - + tools:context=".fragments.Dashboard" + android:orientation="vertical"> - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/app/src/main/res/layout/fragment_dashboard_mensa.xml b/app/src/main/res/layout/fragment_dashboard_mensa.xml new file mode 100644 index 0000000..f576b61 --- /dev/null +++ b/app/src/main/res/layout/fragment_dashboard_mensa.xml @@ -0,0 +1,28 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_dashboard_mensa_menu.xml b/app/src/main/res/layout/fragment_dashboard_mensa_menu.xml new file mode 100644 index 0000000..d1e388a --- /dev/null +++ b/app/src/main/res/layout/fragment_dashboard_mensa_menu.xml @@ -0,0 +1,41 @@ + + + + + + + + + diff --git a/app/src/main/res/layout/fragment_dashboard_news_dhbw.xml b/app/src/main/res/layout/fragment_dashboard_news_dhbw.xml new file mode 100644 index 0000000..38df6d2 --- /dev/null +++ b/app/src/main/res/layout/fragment_dashboard_news_dhbw.xml @@ -0,0 +1,13 @@ + + + + + + diff --git a/app/src/main/res/layout/fragment_dashboard_news_stuv.xml b/app/src/main/res/layout/fragment_dashboard_news_stuv.xml new file mode 100644 index 0000000..a7900dc --- /dev/null +++ b/app/src/main/res/layout/fragment_dashboard_news_stuv.xml @@ -0,0 +1,13 @@ + + + + + + diff --git a/app/src/main/res/layout/fragment_dashboard_timetable.xml b/app/src/main/res/layout/fragment_dashboard_timetable.xml new file mode 100644 index 0000000..eed0b1c --- /dev/null +++ b/app/src/main/res/layout/fragment_dashboard_timetable.xml @@ -0,0 +1,78 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/app/src/main/res/layout/fragment_mensa.xml b/app/src/main/res/layout/fragment_mensa.xml index db3775d..310a1a6 100644 --- a/app/src/main/res/layout/fragment_mensa.xml +++ b/app/src/main/res/layout/fragment_mensa.xml @@ -1,7 +1,16 @@ - + android:layout_height="match_parent" + android:orientation="vertical"> + + - + diff --git a/app/src/main/res/layout/fragment_mensa_weekend.xml b/app/src/main/res/layout/fragment_mensa_weekend.xml new file mode 100644 index 0000000..261db52 --- /dev/null +++ b/app/src/main/res/layout/fragment_mensa_weekend.xml @@ -0,0 +1,14 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_mensa_wochenplan.xml b/app/src/main/res/layout/fragment_mensa_wochenplan.xml deleted file mode 100644 index 5e4cdd7..0000000 --- a/app/src/main/res/layout/fragment_mensa_wochenplan.xml +++ /dev/null @@ -1,13 +0,0 @@ - - - - - - diff --git a/app/src/main/res/layout/fragment_vorlesungsplan.xml b/app/src/main/res/layout/fragment_vorlesungsplan.xml index 69d2dce..a87634b 100644 --- a/app/src/main/res/layout/fragment_vorlesungsplan.xml +++ b/app/src/main/res/layout/fragment_vorlesungsplan.xml @@ -1,13 +1,36 @@ - - - + + + + + + + + app:layout_behavior="@string/appbar_scrolling_view_behavior" /> - + diff --git a/app/src/main/res/layout/fragment_vorlesungsplan_exams.xml b/app/src/main/res/layout/fragment_vorlesungsplan_exams.xml new file mode 100644 index 0000000..b7fe84e --- /dev/null +++ b/app/src/main/res/layout/fragment_vorlesungsplan_exams.xml @@ -0,0 +1,13 @@ + + + + + + diff --git a/app/src/main/res/layout/fragment_vorlesungsplan_groups.xml b/app/src/main/res/layout/fragment_vorlesungsplan_groups.xml new file mode 100644 index 0000000..68df9fe --- /dev/null +++ b/app/src/main/res/layout/fragment_vorlesungsplan_groups.xml @@ -0,0 +1,21 @@ + + + + + + + + diff --git a/app/src/main/res/layout/fragment_vorlesungsplan_groups_course.xml b/app/src/main/res/layout/fragment_vorlesungsplan_groups_course.xml new file mode 100644 index 0000000..723f68e --- /dev/null +++ b/app/src/main/res/layout/fragment_vorlesungsplan_groups_course.xml @@ -0,0 +1,85 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_vorlesungsplan_upcoming.xml b/app/src/main/res/layout/fragment_vorlesungsplan_upcoming.xml new file mode 100644 index 0000000..e9bd178 --- /dev/null +++ b/app/src/main/res/layout/fragment_vorlesungsplan_upcoming.xml @@ -0,0 +1,15 @@ + + + + + + diff --git a/app/src/main/res/layout/fragment_vorlesungsplan_upcoming_course.xml b/app/src/main/res/layout/fragment_vorlesungsplan_upcoming_course.xml new file mode 100644 index 0000000..8515792 --- /dev/null +++ b/app/src/main/res/layout/fragment_vorlesungsplan_upcoming_course.xml @@ -0,0 +1,73 @@ + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_vorlesungsplan_upcoming_day.xml b/app/src/main/res/layout/fragment_vorlesungsplan_upcoming_day.xml new file mode 100644 index 0000000..848160e --- /dev/null +++ b/app/src/main/res/layout/fragment_vorlesungsplan_upcoming_day.xml @@ -0,0 +1,35 @@ + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/values/colors.xml b/app/src/main/res/values/colors.xml index 3ab3e9c..8f539c4 100644 --- a/app/src/main/res/values/colors.xml +++ b/app/src/main/res/values/colors.xml @@ -3,4 +3,9 @@ #3F51B5 #303F9F #FF4081 + + #8D0011 + #E3001B + #7E878E + #5F6D78 diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index de4d73f..1557a8b 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -7,6 +7,35 @@ Settings + Montag + Dienstag + Mittwoch + Donnerstag + Freitag + Samstag + Sonntag + + Mo + Di + Mi + Do + Fr + Sa + So + + + Vorlesungsplan + Heute + Morgen + + Klausur: + + Hoch die Hände, Wochenende! + + Nächste Kurse + Kursübersicht + Klausurübersicht + Die DHBW Lörrach bietet den Studenten verschiedene Möglichkeiten Geräte mit dem W-LAN zu verbinden. Mithilfe dieser App kannst du dein Gerät dazu konfigurieren sich unter berücksichtigung sicherheitsrelevanter Überprüfungen mit dem dhbw-secure Netzwerk zu verbinden. SSID: Security: @@ -34,6 +63,7 @@ Scanning... WLAN Adapter deaktiviert Verbunden! + Verbinde... Settings @@ -106,4 +136,12 @@ Dein Guthaben: PSK: Achtung: Dieses Netzwerk ist potentiell unsicher! + Mensaplan + Vergangene Vorlesungen anzeigen + Nächste Vorlesung: + Letzte Vorlesung: + - keine - + - keine - + Klausur: + Präsentation: