From 5179b30cc08430b42259269840408309f0860c59 Mon Sep 17 00:00:00 2001 From: ObjectiveTruth Date: Sun, 14 Aug 2016 16:44:17 -0400 Subject: [PATCH 01/53] Added an Analytics ignore list So that events don't get logged on my testing phones --- .../uoitlibrarybooking/app/AppModule.java | 15 ++++++++++++++- .../common/constants/Analytics.java | 10 ++++++++++ 2 files changed, 24 insertions(+), 1 deletion(-) create mode 100644 app/src/main/java/com/objectivetruth/uoitlibrarybooking/common/constants/Analytics.java diff --git a/app/src/main/java/com/objectivetruth/uoitlibrarybooking/app/AppModule.java b/app/src/main/java/com/objectivetruth/uoitlibrarybooking/app/AppModule.java index 424c67b..58ad3e3 100644 --- a/app/src/main/java/com/objectivetruth/uoitlibrarybooking/app/AppModule.java +++ b/app/src/main/java/com/objectivetruth/uoitlibrarybooking/app/AppModule.java @@ -1,6 +1,7 @@ package com.objectivetruth.uoitlibrarybooking.app; import android.content.SharedPreferences; +import android.os.Build; import android.preference.PreferenceManager; import com.google.android.gms.analytics.GoogleAnalytics; import com.google.android.gms.analytics.Tracker; @@ -8,9 +9,11 @@ import com.objectivetruth.uoitlibrarybooking.R; import dagger.Module; import dagger.Provides; +import timber.log.Timber; import javax.inject.Singleton; +import static com.objectivetruth.uoitlibrarybooking.common.constants.Analytics.SERIALS_TO_IGNORE_FOR_ANALYTICS; import static com.objectivetruth.uoitlibrarybooking.common.constants.SHARED_PREFERENCES_KEYS.UUID; @Module @@ -37,7 +40,7 @@ SharedPreferences.Editor providesSharedPreferencesEditor(SharedPreferences share @Singleton Tracker providesGoogleAnalyticsTracker(SharedPreferences defaultSharedPreferences) { GoogleAnalytics analytics = GoogleAnalytics.getInstance(mApplication); - if(BuildConfig.DEBUG){ + if(BuildConfig.DEBUG || isSerialInIgnoreList(Build.SERIAL)){ // Will just log the information without actually sending it analytics.setDryRun(true); } @@ -51,4 +54,14 @@ Tracker providesGoogleAnalyticsTracker(SharedPreferences defaultSharedPreference googleAnalyticsTracker.set("&cid", usersUUID); return googleAnalyticsTracker; } + + private boolean isSerialInIgnoreList(String thisDeviceSerial) { + for (String s: SERIALS_TO_IGNORE_FOR_ANALYTICS) { + if(s.contentEquals(thisDeviceSerial)) { + Timber.i("Serial: " + thisDeviceSerial + " is in the analytics ignore list, disabling Google Analytics"); + return true; + } + } + return false; + } } diff --git a/app/src/main/java/com/objectivetruth/uoitlibrarybooking/common/constants/Analytics.java b/app/src/main/java/com/objectivetruth/uoitlibrarybooking/common/constants/Analytics.java new file mode 100644 index 0000000..c27e5a4 --- /dev/null +++ b/app/src/main/java/com/objectivetruth/uoitlibrarybooking/common/constants/Analytics.java @@ -0,0 +1,10 @@ +package com.objectivetruth.uoitlibrarybooking.common.constants; + + +public class Analytics { + public static final String[] SERIALS_TO_IGNORE_FOR_ANALYTICS = { + "004a3a3ea0928559", + "HT58WSY00626", + "836f484f53504942" + }; +} From 9227570925c8e72f7b319daed4844e6ad0bba85c Mon Sep 17 00:00:00 2001 From: ObjectiveTruth Date: Sun, 14 Aug 2016 18:55:56 -0400 Subject: [PATCH 02/53] Skeleton created for future calendar interactions --- .../uoitlibrarybooking/app/AppComponent.java | 4 ++++ .../uoitlibrarybooking/app/AppModule.java | 4 ++-- .../common/constants/Analytics.java | 6 +++--- .../uoitlibrarybooking/data/DataModule.java | 18 ++++++++++++++++-- .../data/models/BookingInteractionModel.java | 13 +++++++++++++ .../BookingInteractionWebService.java | 14 ++++++++++++++ .../calendarmodel/CalendarWebService.java | 7 ++++--- .../data/models/usermodel/UserWebService.java | 5 ++--- 8 files changed, 58 insertions(+), 13 deletions(-) create mode 100644 app/src/main/java/com/objectivetruth/uoitlibrarybooking/data/models/BookingInteractionModel.java create mode 100644 app/src/main/java/com/objectivetruth/uoitlibrarybooking/data/models/bookinginteractionmodel/BookingInteractionWebService.java diff --git a/app/src/main/java/com/objectivetruth/uoitlibrarybooking/app/AppComponent.java b/app/src/main/java/com/objectivetruth/uoitlibrarybooking/app/AppComponent.java index eb25c4b..543b847 100644 --- a/app/src/main/java/com/objectivetruth/uoitlibrarybooking/app/AppComponent.java +++ b/app/src/main/java/com/objectivetruth/uoitlibrarybooking/app/AppComponent.java @@ -3,6 +3,8 @@ import com.objectivetruth.uoitlibrarybooking.ActivityRoomInteraction; import com.objectivetruth.uoitlibrarybooking.MainActivity; import com.objectivetruth.uoitlibrarybooking.data.DataModule; +import com.objectivetruth.uoitlibrarybooking.data.models.bookinginteractionmodel.BookingInteractionWebService; +import com.objectivetruth.uoitlibrarybooking.data.models.calendarmodel.CalendarWebService; import com.objectivetruth.uoitlibrarybooking.data.models.usermodel.UserWebService; import com.objectivetruth.uoitlibrarybooking.userinterface.calendar.Calendar; import com.objectivetruth.uoitlibrarybooking.userinterface.calendar.grid.Grid; @@ -23,6 +25,8 @@ public interface AppComponent { void inject(MyAccount myAccount); void inject(LoginFragment loginFragment); void inject(UserWebService userWebService); + void inject(BookingInteractionWebService bookingInteractionWebService); + void inject(CalendarWebService calendarWebService); void inject(MyAccountLoaded myAccountLoaded); void inject(Grid grid); } diff --git a/app/src/main/java/com/objectivetruth/uoitlibrarybooking/app/AppModule.java b/app/src/main/java/com/objectivetruth/uoitlibrarybooking/app/AppModule.java index 58ad3e3..b272abb 100644 --- a/app/src/main/java/com/objectivetruth/uoitlibrarybooking/app/AppModule.java +++ b/app/src/main/java/com/objectivetruth/uoitlibrarybooking/app/AppModule.java @@ -40,7 +40,7 @@ SharedPreferences.Editor providesSharedPreferencesEditor(SharedPreferences share @Singleton Tracker providesGoogleAnalyticsTracker(SharedPreferences defaultSharedPreferences) { GoogleAnalytics analytics = GoogleAnalytics.getInstance(mApplication); - if(BuildConfig.DEBUG || isSerialInIgnoreList(Build.SERIAL)){ + if(BuildConfig.DEBUG || _isSerialInIgnoreList(Build.SERIAL)){ // Will just log the information without actually sending it analytics.setDryRun(true); } @@ -55,7 +55,7 @@ Tracker providesGoogleAnalyticsTracker(SharedPreferences defaultSharedPreference return googleAnalyticsTracker; } - private boolean isSerialInIgnoreList(String thisDeviceSerial) { + private boolean _isSerialInIgnoreList(String thisDeviceSerial) { for (String s: SERIALS_TO_IGNORE_FOR_ANALYTICS) { if(s.contentEquals(thisDeviceSerial)) { Timber.i("Serial: " + thisDeviceSerial + " is in the analytics ignore list, disabling Google Analytics"); diff --git a/app/src/main/java/com/objectivetruth/uoitlibrarybooking/common/constants/Analytics.java b/app/src/main/java/com/objectivetruth/uoitlibrarybooking/common/constants/Analytics.java index c27e5a4..4666895 100644 --- a/app/src/main/java/com/objectivetruth/uoitlibrarybooking/common/constants/Analytics.java +++ b/app/src/main/java/com/objectivetruth/uoitlibrarybooking/common/constants/Analytics.java @@ -3,8 +3,8 @@ public class Analytics { public static final String[] SERIALS_TO_IGNORE_FOR_ANALYTICS = { - "004a3a3ea0928559", - "HT58WSY00626", - "836f484f53504942" + "004a3a3ea0928559", // Nexus 4 + "HT58WSY00626", // HTC 360 + "836f484f53504942" // Note 5 }; } diff --git a/app/src/main/java/com/objectivetruth/uoitlibrarybooking/data/DataModule.java b/app/src/main/java/com/objectivetruth/uoitlibrarybooking/data/DataModule.java index 7960f2b..291c3e8 100644 --- a/app/src/main/java/com/objectivetruth/uoitlibrarybooking/data/DataModule.java +++ b/app/src/main/java/com/objectivetruth/uoitlibrarybooking/data/DataModule.java @@ -4,8 +4,10 @@ import com.android.volley.toolbox.Volley; import com.objectivetruth.uoitlibrarybooking.app.UOITLibraryBookingApp; import com.objectivetruth.uoitlibrarybooking.app.networking.OkHttp3Stack; +import com.objectivetruth.uoitlibrarybooking.data.models.BookingInteractionModel; import com.objectivetruth.uoitlibrarybooking.data.models.CalendarModel; import com.objectivetruth.uoitlibrarybooking.data.models.UserModel; +import com.objectivetruth.uoitlibrarybooking.data.models.bookinginteractionmodel.BookingInteractionWebService; import com.objectivetruth.uoitlibrarybooking.data.models.calendarmodel.CalendarWebService; import com.objectivetruth.uoitlibrarybooking.data.models.usermodel.UserWebService; import dagger.Module; @@ -35,8 +37,20 @@ UserModel providesUserModel(UserWebService userWebService) { @Provides @Singleton - CalendarWebService providesCalendarWebService(RequestQueue requestQueue) { - return new CalendarWebService(mApplication, requestQueue); + BookingInteractionModel providesBookingInteractionModel(BookingInteractionWebService bookingInteractionWebService) { + return new BookingInteractionModel(mApplication, bookingInteractionWebService); + } + + @Provides + @Singleton + BookingInteractionWebService providesBookingInteractionWebService() { + return new BookingInteractionWebService(mApplication); + } + + @Provides + @Singleton + CalendarWebService providesCalendarWebService() { + return new CalendarWebService(mApplication); } @Provides diff --git a/app/src/main/java/com/objectivetruth/uoitlibrarybooking/data/models/BookingInteractionModel.java b/app/src/main/java/com/objectivetruth/uoitlibrarybooking/data/models/BookingInteractionModel.java new file mode 100644 index 0000000..f55eea6 --- /dev/null +++ b/app/src/main/java/com/objectivetruth/uoitlibrarybooking/data/models/BookingInteractionModel.java @@ -0,0 +1,13 @@ +package com.objectivetruth.uoitlibrarybooking.data.models; + +import com.objectivetruth.uoitlibrarybooking.app.UOITLibraryBookingApp; +import com.objectivetruth.uoitlibrarybooking.data.models.bookinginteractionmodel.BookingInteractionWebService; + +public class BookingInteractionModel { + private BookingInteractionWebService bookingInteractionWebService; + + public BookingInteractionModel(UOITLibraryBookingApp mApplication, + BookingInteractionWebService bookingInteractionWebService) { + this.bookingInteractionWebService = bookingInteractionWebService; + } +} diff --git a/app/src/main/java/com/objectivetruth/uoitlibrarybooking/data/models/bookinginteractionmodel/BookingInteractionWebService.java b/app/src/main/java/com/objectivetruth/uoitlibrarybooking/data/models/bookinginteractionmodel/BookingInteractionWebService.java new file mode 100644 index 0000000..28d84e4 --- /dev/null +++ b/app/src/main/java/com/objectivetruth/uoitlibrarybooking/data/models/bookinginteractionmodel/BookingInteractionWebService.java @@ -0,0 +1,14 @@ +package com.objectivetruth.uoitlibrarybooking.data.models.bookinginteractionmodel; + +import com.android.volley.RequestQueue; +import com.objectivetruth.uoitlibrarybooking.app.UOITLibraryBookingApp; + +import javax.inject.Inject; + +public class BookingInteractionWebService { + @Inject RequestQueue requestQueue; + + public BookingInteractionWebService(UOITLibraryBookingApp mApplication) { + mApplication.getComponent().inject(this); + } +} diff --git a/app/src/main/java/com/objectivetruth/uoitlibrarybooking/data/models/calendarmodel/CalendarWebService.java b/app/src/main/java/com/objectivetruth/uoitlibrarybooking/data/models/calendarmodel/CalendarWebService.java index fe12490..5d4377d 100644 --- a/app/src/main/java/com/objectivetruth/uoitlibrarybooking/data/models/calendarmodel/CalendarWebService.java +++ b/app/src/main/java/com/objectivetruth/uoitlibrarybooking/data/models/calendarmodel/CalendarWebService.java @@ -11,6 +11,7 @@ import rx.functions.FuncN; import timber.log.Timber; +import javax.inject.Inject; import java.io.UnsupportedEncodingException; import java.net.URLEncoder; import java.util.ArrayList; @@ -19,12 +20,12 @@ import java.util.concurrent.ExecutionException; public class CalendarWebService { - RequestQueue requestQueue; + @Inject RequestQueue requestQueue; final private static String UOIT_LIBRARY_MAIN_CALENDAR_URL = "https://rooms.library.dc-uoit.ca/dc_studyrooms/calendar.aspx"; - public CalendarWebService(UOITLibraryBookingApp mApplication, RequestQueue requestQueue) { - this.requestQueue = requestQueue; + public CalendarWebService(UOITLibraryBookingApp mApplication) { + mApplication.getComponent().inject(this); } public Observable getRawInitialWebPageObs() { diff --git a/app/src/main/java/com/objectivetruth/uoitlibrarybooking/data/models/usermodel/UserWebService.java b/app/src/main/java/com/objectivetruth/uoitlibrarybooking/data/models/usermodel/UserWebService.java index 9d4fa24..db19d9d 100644 --- a/app/src/main/java/com/objectivetruth/uoitlibrarybooking/data/models/usermodel/UserWebService.java +++ b/app/src/main/java/com/objectivetruth/uoitlibrarybooking/data/models/usermodel/UserWebService.java @@ -1,6 +1,5 @@ package com.objectivetruth.uoitlibrarybooking.data.models.usermodel; -import android.app.Application; import android.support.v4.util.Pair; import com.android.volley.AuthFailureError; import com.android.volley.Request; @@ -24,8 +23,8 @@ public class UserWebService { final private static String UOIT_LIBRARY_SIGNIN_URL = "https://rooms.library.dc-uoit.ca/uoit_studyrooms/myreservations.aspx"; - public UserWebService(Application mApplication) { - ((UOITLibraryBookingApp) mApplication).getComponent().inject(this); + public UserWebService(UOITLibraryBookingApp mApplication) { + mApplication.getComponent().inject(this); } public Observable getRawInitialSignInWebPageObs() { From fb33e89293b0f7c2e4b5671cf3200df3f171da09 Mon Sep 17 00:00:00 2001 From: ObjectiveTruth Date: Sun, 14 Aug 2016 19:49:02 -0400 Subject: [PATCH 03/53] Added additional fields to TimeCell Supports the new activity interactions --- .../models/calendarmodel/CalendarParser.java | 86 +++++++++++++++++-- .../data/models/calendarmodel/TimeCell.java | 29 +++++-- 2 files changed, 104 insertions(+), 11 deletions(-) diff --git a/app/src/main/java/com/objectivetruth/uoitlibrarybooking/data/models/calendarmodel/CalendarParser.java b/app/src/main/java/com/objectivetruth/uoitlibrarybooking/data/models/calendarmodel/CalendarParser.java index 3f10a0c..df6e4e7 100644 --- a/app/src/main/java/com/objectivetruth/uoitlibrarybooking/data/models/calendarmodel/CalendarParser.java +++ b/app/src/main/java/com/objectivetruth/uoitlibrarybooking/data/models/calendarmodel/CalendarParser.java @@ -192,16 +192,22 @@ static private CalendarDay _getMoreDayDataByParsingRawClickableDayData(CalendarD // Finds partially booked time slots else if(currentTableDataElement.contains("Incomplete reservation")){ int hrefStart = currentTableDataElement.indexOf("href="); - timeCellToBeAdded.hrefSource = - currentTableDataElement.substring(hrefStart).split("\"")[1].replace(" ", "%20").replace("&", "&"); + String anchorHREF = currentTableDataElement.substring(hrefStart).split("\"")[1].replace("&", "&"); + timeCellToBeAdded.param_room = _extractRoomParamFromAnchorHREF(anchorHREF); + timeCellToBeAdded.param_get_link = _extractGETLinkParamFromAnchorHREF(anchorHREF); + timeCellToBeAdded.param_starttime = _extractStartTimeParamFromAnchorHREF(anchorHREF); + timeCellToBeAdded.param_next = _extractNextParamFromAnchorHREF(anchorHREF); timeCellToBeAdded.timeCellType = TimeCellType.BOOKING_COMPETING; } // Finds Completely OPEN time slots else if(currentTableDataElement.contains("book.aspx")){ int hrefStart = currentTableDataElement.indexOf("href="); - timeCellToBeAdded.hrefSource = - currentTableDataElement.substring(hrefStart).split("\"")[1].replace(" ", "%20").replace("&", "&"); + String anchorHREF = currentTableDataElement.substring(hrefStart).split("\"")[1].replace("&", "&"); + timeCellToBeAdded.param_room = _extractRoomParamFromAnchorHREF(anchorHREF); + timeCellToBeAdded.param_get_link = _extractGETLinkParamFromAnchorHREF(anchorHREF); + timeCellToBeAdded.param_starttime = _extractStartTimeParamFromAnchorHREF(anchorHREF); + timeCellToBeAdded.param_next = _extractNextParamFromAnchorHREF(anchorHREF); timeCellToBeAdded.timeCellType = TimeCellType.BOOKING_OPEN; } @@ -218,8 +224,12 @@ else if(currentTableDataElement.contains(">\"<")){ // Finds fully booked rooms. Can still join or leave if you're in that booking but can't start a new one else if(currentTableDataElement.contains("viewleaveorjoin.aspx")){ int hrefStart = currentTableDataElement.indexOf("href="); - timeCellToBeAdded.hrefSource = - currentTableDataElement.substring(hrefStart).split("\"")[1].replace(" ", "%20").replace("&", "&"); + String anchorHREF = currentTableDataElement.substring(hrefStart).split("\"")[1].replace("&", "&"); + timeCellToBeAdded.param_room = _extractRoomParamFromAnchorHREF(anchorHREF); + timeCellToBeAdded.param_get_link = _extractGETLinkParamFromAnchorHREF(anchorHREF); + timeCellToBeAdded.param_starttime = _extractStartTimeParamFromAnchorHREF(anchorHREF); + timeCellToBeAdded.param_next = _extractNextParamFromAnchorHREF(anchorHREF); + beginningWord = currentTableDataElement.indexOf("color:Black;\">"); endWord = currentTableDataElement.lastIndexOf(""); timeCellToBeAdded.groupNameForWhenFullyBookedRoom = @@ -288,4 +298,68 @@ static private String _getTimeStringOrRoomNameFromString(String subject) { String webPageSearchString = "font-size:8pt;\">"; return findStringFromStringBetweenSearchTerms(subject, webPageSearchString, ""); } + + /** + * Extracts the get link parameter. Assumes this format + * temp.aspx?starttime=4:00 PM&room=LIB309&next=book + * @param anchorHREF + * @return + */ + static private String _extractGETLinkParamFromAnchorHREF(String anchorHREF) { + return anchorHREF.split("\\?")[0]; + } + + /** + * Extracts the starttime query parameter. Assumes this format + * temp.aspx?starttime=4:00 PM&room=LIB309&next=book + * @param anchorHREF + * @return + */ + static private String _extractStartTimeParamFromAnchorHREF(String anchorHREF) { + String STARTTIME_QUERY_PARAM_NAME = "starttime"; + String[] queryParams = anchorHREF.split("\\?")[1].split("&"); + for(String s: queryParams) { + String[] arrayWithBothSidesOfTheEqualSign = s.split("="); + if(arrayWithBothSidesOfTheEqualSign[0].contentEquals(STARTTIME_QUERY_PARAM_NAME)) { + return arrayWithBothSidesOfTheEqualSign[1]; + } + } + return ""; + } + + /** + * Extracts the room query parameter. Assumes this format + * temp.aspx?starttime=4:00 PM&room=LIB309&next=book + * @param anchorHREF + * @return + */ + static private String _extractRoomParamFromAnchorHREF(String anchorHREF) { + String ROOM_QUERY_PARAM_NAME = "room"; + String[] queryParams = anchorHREF.split("\\?")[1].split("&"); + for(String s: queryParams) { + String[] arrayWithBothSidesOfTheEqualSign = s.split("="); + if(arrayWithBothSidesOfTheEqualSign[0].contentEquals(ROOM_QUERY_PARAM_NAME)) { + return arrayWithBothSidesOfTheEqualSign[1]; + } + } + return ""; + } + + /** + * Extracts the next query parameter. Assumes this format + * temp.aspx?starttime=4:00 PM&room=LIB309&next=book + * @param anchorHREF + * @return + */ + static private String _extractNextParamFromAnchorHREF(String anchorHREF) { + String NEXT_QUERY_PARAM_NAME = "next"; + String[] queryParams = anchorHREF.split("\\?")[1].split("&"); + for(String s: queryParams) { + String[] arrayWithBothSidesOfTheEqualSign = s.split("="); + if(arrayWithBothSidesOfTheEqualSign[0].contentEquals(NEXT_QUERY_PARAM_NAME)) { + return arrayWithBothSidesOfTheEqualSign[1]; + } + } + return ""; + } } diff --git a/app/src/main/java/com/objectivetruth/uoitlibrarybooking/data/models/calendarmodel/TimeCell.java b/app/src/main/java/com/objectivetruth/uoitlibrarybooking/data/models/calendarmodel/TimeCell.java index b4cfe2a..5894807 100644 --- a/app/src/main/java/com/objectivetruth/uoitlibrarybooking/data/models/calendarmodel/TimeCell.java +++ b/app/src/main/java/com/objectivetruth/uoitlibrarybooking/data/models/calendarmodel/TimeCell.java @@ -5,9 +5,13 @@ public class TimeCell implements Parcelable { public TimeCellType timeCellType; - public String hrefSource; public String groupNameForWhenFullyBookedRoom; public String timeStringOrRoomName; + // Used when doing the interactions with the server + public String param_next; + public String param_get_link; + public String param_starttime; + public String param_room; @Override public String toString() { @@ -15,8 +19,17 @@ public String toString() { returnString += "timeCellType: "; if(notNull(timeCellType)) {returnString += timeCellType.name() + ", ";} else {returnString += "NULL, ";} - returnString += "hrefSource: "; - if(notNull(hrefSource)) {returnString += hrefSource + ", ";} else {returnString += "NULL, ";} + returnString += "param_get_link: "; + if(notNull(param_get_link)) {returnString += param_get_link + ", ";} else {returnString += "NULL, ";} + + returnString += "param_next: "; + if(notNull(param_next)) {returnString += param_next + ", ";} else {returnString += "NULL, ";} + + returnString += "param_starttime: "; + if(notNull(param_starttime)) {returnString += param_starttime + ", ";} else {returnString += "NULL, ";} + + returnString += "param_room: "; + if(notNull(param_room)) {returnString += param_room + ", ";} else {returnString += "NULL, ";} returnString += "groupNameForWhenFullyBookedRoom: "; if(notNull(groupNameForWhenFullyBookedRoom)) @@ -40,7 +53,10 @@ public int describeContents() { @Override public void writeToParcel(Parcel dest, int flags) { dest.writeInt(this.timeCellType == null ? -1 : this.timeCellType.ordinal()); - dest.writeString(this.hrefSource); + dest.writeString(this.param_next); + dest.writeString(this.param_get_link); + dest.writeString(this.param_starttime); + dest.writeString(this.param_room); dest.writeString(this.groupNameForWhenFullyBookedRoom); dest.writeString(this.timeStringOrRoomName); } @@ -51,7 +67,10 @@ public TimeCell() { protected TimeCell(Parcel in) { int tmpTimeCellType = in.readInt(); this.timeCellType = tmpTimeCellType == -1 ? null : TimeCellType.values()[tmpTimeCellType]; - this.hrefSource = in.readString(); + this.param_next = in.readString(); + this.param_get_link = in.readString(); + this.param_starttime = in.readString(); + this.param_room = in.readString(); this.groupNameForWhenFullyBookedRoom = in.readString(); this.timeStringOrRoomName = in.readString(); } From 19d558e819886cfdd2798c8695b4a71a12e4179a Mon Sep 17 00:00:00 2001 From: ObjectiveTruth Date: Sun, 14 Aug 2016 21:45:08 -0400 Subject: [PATCH 04/53] System for creating new screens that take full screen --- .../ActivityRoomInteraction.java | 2 +- .../uoitlibrarybooking/MainActivity.java | 41 ++++++++++++++----- .../common/ScreenRequest.java | 4 ++ .../BookingInteraction.java | 25 +++++++++++ .../userinterface/calendar/grid/Grid.java | 3 +- .../calendar/grid/common/GridAdapter.java | 33 ++++++++++++--- .../userinterface/common/ActivityBase.java | 8 +++- .../{activity_main.xml => app_root.xml} | 0 ...n_book.xml => bookinginteraction_book.xml} | 0 9 files changed, 97 insertions(+), 19 deletions(-) create mode 100644 app/src/main/java/com/objectivetruth/uoitlibrarybooking/common/ScreenRequest.java create mode 100644 app/src/main/java/com/objectivetruth/uoitlibrarybooking/userinterface/BookingInteraction/BookingInteraction.java rename app/src/main/res/layout/{activity_main.xml => app_root.xml} (100%) rename app/src/main/res/layout/{interaction_book.xml => bookinginteraction_book.xml} (100%) diff --git a/app/src/main/java/com/objectivetruth/uoitlibrarybooking/ActivityRoomInteraction.java b/app/src/main/java/com/objectivetruth/uoitlibrarybooking/ActivityRoomInteraction.java index 0ffcbc2..bbd8c3b 100644 --- a/app/src/main/java/com/objectivetruth/uoitlibrarybooking/ActivityRoomInteraction.java +++ b/app/src/main/java/com/objectivetruth/uoitlibrarybooking/ActivityRoomInteraction.java @@ -135,7 +135,7 @@ protected void onCreate(Bundle savedInstanceState) { else if(bundleExtras.getString("type").equalsIgnoreCase("createbooking")){ Timber.i("CreateBooking SubRoutine Executing..."); - setContentView(R.layout.interaction_book); + setContentView(R.layout.bookinginteraction_book); TextView roomNumberTextView = (TextView) findViewById(R.id.interaction_book_room_number); diff --git a/app/src/main/java/com/objectivetruth/uoitlibrarybooking/MainActivity.java b/app/src/main/java/com/objectivetruth/uoitlibrarybooking/MainActivity.java index f0d84c0..b72abfd 100644 --- a/app/src/main/java/com/objectivetruth/uoitlibrarybooking/MainActivity.java +++ b/app/src/main/java/com/objectivetruth/uoitlibrarybooking/MainActivity.java @@ -11,10 +11,13 @@ import android.preference.PreferenceManager; import android.support.v7.app.AppCompatActivity; import android.view.MenuItem; -import com.google.android.gms.analytics.Tracker; import com.objectivetruth.uoitlibrarybooking.app.UOITLibraryBookingApp; +import com.objectivetruth.uoitlibrarybooking.common.ScreenRequest; +import com.objectivetruth.uoitlibrarybooking.userinterface.BookingInteraction.BookingInteraction; import com.objectivetruth.uoitlibrarybooking.userinterface.calendar.whatsnew.WhatsNewDialog; import com.objectivetruth.uoitlibrarybooking.userinterface.common.ActivityBase; +import rx.functions.Action1; +import rx.subjects.PublishSubject; import timber.log.Timber; import javax.inject.Inject; @@ -24,15 +27,13 @@ public class MainActivity extends ActivityBase { - final static private String ACTIVITY_TITLE = "Calendar"; - public static final String GROUP_CODE_DIALOGFRAGMENT_TAG = "groupCodeInfoDiaFrag"; AppCompatActivity mActivity = this; public static CookieManager cookieManager; private boolean isFirstLoadThisSession = false; + private PublishSubject screenRequestPublishSubject; @Inject SharedPreferences mDefaultSharedPreferences; @Inject SharedPreferences.Editor mDefaultSharedPreferencesEditor; - @Inject Tracker googleAnalyticsTracker; @Override protected void onCreate(Bundle savedInstanceState) { @@ -41,17 +42,12 @@ protected void onCreate(Bundle savedInstanceState) { ((UOITLibraryBookingApp) getApplication()).getComponent().inject(this); - setContentView(R.layout.activity_main); + setContentView(R.layout.app_root); initializeAllMainFragmentsAndPreloadToView(); setupToolbar(R.id.toolbar); setupDrawer(R.id.drawer_layout); } - @Override - protected String getActivityTitle() { - return ACTIVITY_TITLE; - } - @Override protected void onPostCreate(Bundle savedInstanceState) { super.onPostCreate(savedInstanceState); @@ -214,4 +210,29 @@ public boolean isNetworkAvailable(Context ctx){ return false; } } + + /** + * Can be used to request a Screen change from the MainActivity + * @return + */ + public PublishSubject getMainActivityRouterPublishSubject() { + if(screenRequestPublishSubject == null || screenRequestPublishSubject.hasCompleted()) { + screenRequestPublishSubject = PublishSubject.create(); + _bindScreenRequestPublishSubjectToRouter(screenRequestPublishSubject); + return screenRequestPublishSubject; + }else { + return screenRequestPublishSubject; + } + } + + private void _bindScreenRequestPublishSubjectToRouter(PublishSubject screenRequestPublishSubject) { + screenRequestPublishSubject.subscribe(new Action1() { + @Override + public void call(ScreenRequest screenRequest) { + addHidingOfAllCurrentFragmentsToTransaction(getSupportFragmentManager().beginTransaction()) + .add(R.id.mainactivity_content_frame, BookingInteraction.newInstance()) + .commit(); + } + }); + } } diff --git a/app/src/main/java/com/objectivetruth/uoitlibrarybooking/common/ScreenRequest.java b/app/src/main/java/com/objectivetruth/uoitlibrarybooking/common/ScreenRequest.java new file mode 100644 index 0000000..bee3c32 --- /dev/null +++ b/app/src/main/java/com/objectivetruth/uoitlibrarybooking/common/ScreenRequest.java @@ -0,0 +1,4 @@ +package com.objectivetruth.uoitlibrarybooking.common; + +public class ScreenRequest { +} diff --git a/app/src/main/java/com/objectivetruth/uoitlibrarybooking/userinterface/BookingInteraction/BookingInteraction.java b/app/src/main/java/com/objectivetruth/uoitlibrarybooking/userinterface/BookingInteraction/BookingInteraction.java new file mode 100644 index 0000000..4076ae9 --- /dev/null +++ b/app/src/main/java/com/objectivetruth/uoitlibrarybooking/userinterface/BookingInteraction/BookingInteraction.java @@ -0,0 +1,25 @@ +package com.objectivetruth.uoitlibrarybooking.userinterface.BookingInteraction; + +import android.os.Bundle; +import android.support.annotation.Nullable; +import android.support.v4.app.Fragment; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import com.objectivetruth.uoitlibrarybooking.R; + +public class BookingInteraction extends Fragment { + + @Nullable + @Override + public View onCreateView(LayoutInflater inflater, + @Nullable ViewGroup container, + @Nullable Bundle savedInstanceState) { + + return inflater.inflate(R.layout.bookinginteraction_book, container, false); + } + + public static BookingInteraction newInstance() { + return new BookingInteraction(); + } +} diff --git a/app/src/main/java/com/objectivetruth/uoitlibrarybooking/userinterface/calendar/grid/Grid.java b/app/src/main/java/com/objectivetruth/uoitlibrarybooking/userinterface/calendar/grid/Grid.java index 6226ed0..4b9efa7 100644 --- a/app/src/main/java/com/objectivetruth/uoitlibrarybooking/userinterface/calendar/grid/Grid.java +++ b/app/src/main/java/com/objectivetruth/uoitlibrarybooking/userinterface/calendar/grid/Grid.java @@ -6,6 +6,7 @@ import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; +import com.objectivetruth.uoitlibrarybooking.MainActivity; import com.objectivetruth.uoitlibrarybooking.R; import com.objectivetruth.uoitlibrarybooking.app.UOITLibraryBookingApp; import com.objectivetruth.uoitlibrarybooking.data.models.CalendarModel; @@ -42,7 +43,7 @@ public View onCreateView(LayoutInflater inflater, Timber.v(calendarDay.toString()); TableFixHeaders _mTableFixheaders = (TableFixHeaders) gridView.findViewById(R.id.calendar_page_grid); - gridAdapter = new GridAdapter(getActivity(), calendarDay); + gridAdapter = new GridAdapter((MainActivity) getActivity(), calendarDay); _mTableFixheaders.setAdapter(gridAdapter); _mTableFixheaders.setScrollAtTopGridBehaviourSubject(calendarModel.getScrollAtTopOfGridBehaviourSubject()); diff --git a/app/src/main/java/com/objectivetruth/uoitlibrarybooking/userinterface/calendar/grid/common/GridAdapter.java b/app/src/main/java/com/objectivetruth/uoitlibrarybooking/userinterface/calendar/grid/common/GridAdapter.java index 99bdff6..d9f08d0 100644 --- a/app/src/main/java/com/objectivetruth/uoitlibrarybooking/userinterface/calendar/grid/common/GridAdapter.java +++ b/app/src/main/java/com/objectivetruth/uoitlibrarybooking/userinterface/calendar/grid/common/GridAdapter.java @@ -1,14 +1,16 @@ package com.objectivetruth.uoitlibrarybooking.userinterface.calendar.grid.common; -import android.content.Context; import android.support.annotation.Nullable; import android.view.View; import android.view.ViewGroup; import android.widget.TextView; +import com.objectivetruth.uoitlibrarybooking.MainActivity; import com.objectivetruth.uoitlibrarybooking.R; +import com.objectivetruth.uoitlibrarybooking.common.ScreenRequest; import com.objectivetruth.uoitlibrarybooking.data.models.calendarmodel.CalendarDay; import com.objectivetruth.uoitlibrarybooking.data.models.calendarmodel.TimeCell; import com.objectivetruth.uoitlibrarybooking.userinterface.calendar.grid.tablefixheaders.FixedTableAdapter; +import timber.log.Timber; import java.util.Random; @@ -18,11 +20,13 @@ public class GridAdapter extends FixedTableAdapter { private int _width_of_cell_in_pixels; private int _height_of_cell_in_pixels; private CalendarDay calendarDay; + private MainActivity mainActivity; - public GridAdapter(Context context, CalendarDay calendarDay) { - super(context); - _width_of_cell_in_pixels = context.getResources().getDimensionPixelSize(R.dimen.table_width); - _height_of_cell_in_pixels = context.getResources().getDimensionPixelSize(R.dimen.table_height); + public GridAdapter(MainActivity mainActivity, CalendarDay calendarDay) { + super(mainActivity); + this.mainActivity = mainActivity; + _width_of_cell_in_pixels = mainActivity.getResources().getDimensionPixelSize(R.dimen.table_width); + _height_of_cell_in_pixels = mainActivity.getResources().getDimensionPixelSize(R.dimen.table_height); this.calendarDay = calendarDay; } @@ -97,6 +101,9 @@ public View getView(int row, int column, View recycleView, ViewGroup parent) { TimeCell currentTimeCellForThisViewCall = calendarDay.timeCells.get(_convertRowAndColumnToTimeCellIndex(row, column)); + holder.textViewOnly.setOnClickListener(new TimeCellOnClickListener(currentTimeCellForThisViewCall, + mainActivity)); + switch(currentTimeCellForThisViewCall.timeCellType) { case TABLE_COLUMN_HEADER: holder.textViewOnly.setText(currentTimeCellForThisViewCall.timeStringOrRoomName); break; @@ -182,4 +189,20 @@ private TimeCell _getTimeCellWithGroupNameAboutThisOne(int row, int column) { private boolean _isTopLeftCell(int row, int column) { return (row < 0 && column < 0); } + + private static class TimeCellOnClickListener implements View.OnClickListener { + private TimeCell timeCell; + MainActivity mainActivity; + + TimeCellOnClickListener(TimeCell timeCell, MainActivity mainActivity) { + this.timeCell = timeCell; + this.mainActivity = mainActivity; + } + + @Override + public void onClick(View view) { + Timber.i("Clicked: " + timeCell.param_get_link); + mainActivity.getMainActivityRouterPublishSubject().onNext(new ScreenRequest()); + } + } } diff --git a/app/src/main/java/com/objectivetruth/uoitlibrarybooking/userinterface/common/ActivityBase.java b/app/src/main/java/com/objectivetruth/uoitlibrarybooking/userinterface/common/ActivityBase.java index cd22ad4..803596e 100644 --- a/app/src/main/java/com/objectivetruth/uoitlibrarybooking/userinterface/common/ActivityBase.java +++ b/app/src/main/java/com/objectivetruth/uoitlibrarybooking/userinterface/common/ActivityBase.java @@ -18,6 +18,7 @@ import com.objectivetruth.uoitlibrarybooking.BuildConfig; import com.objectivetruth.uoitlibrarybooking.R; import com.objectivetruth.uoitlibrarybooking.statelessutilities.Triple; +import com.objectivetruth.uoitlibrarybooking.userinterface.BookingInteraction.BookingInteraction; import com.objectivetruth.uoitlibrarybooking.userinterface.about.About; import com.objectivetruth.uoitlibrarybooking.userinterface.calendar.Calendar; import com.objectivetruth.uoitlibrarybooking.userinterface.guidelinespolicies.GuidelinesAndPolicies; @@ -31,7 +32,6 @@ import static com.objectivetruth.uoitlibrarybooking.common.constants.FragmentTags.*; public abstract class ActivityBase extends AppCompatActivity { - protected abstract String getActivityTitle(); private ActionBarDrawerToggle _mDrawerToggle; private DrawerLayout _mDrawerLayout; private HashMap stringFragmentHashMap = new HashMap(); @@ -81,7 +81,6 @@ protected void setupToolbar(int toolbarLayoutIdToLoad) { if(getSupportActionBar() != null) { // enable ActionBar app icon to behave as any action menu item to toggle nav drawer getSupportActionBar().setDisplayHomeAsUpEnabled(true); - getSupportActionBar().setTitle(getActivityTitle()); } } @@ -127,6 +126,7 @@ protected void initializeAllMainFragmentsAndPreloadToView() { GuidelinesAndPolicies guidelinesAndPoliciesFrag = GuidelinesAndPolicies.newInstance(); About aboutFrag = About.newInstance(); MyAccount myAccountFrag = MyAccount.newInstance(); + BookingInteraction bookingInteractions = BookingInteraction.newInstance(); stringFragmentHashMap.put(CALENDAR_FRAGMENT_TAG, calendarFrag); stringFragmentHashMap.put(GUIDELINES_POLICIES_FRAGMENT_TAG, guidelinesAndPoliciesFrag); @@ -314,6 +314,10 @@ protected ActionBarDrawerToggle getActionBarDrawerToggle() { } } + protected FragmentTransaction addHidingOfAllCurrentFragmentsToTransaction(FragmentTransaction fragmentTransaction) { + return _addHideAllVisibleFragmentsToFragmentTransaction(stringFragmentHashMap, fragmentTransaction); + } + @Override protected void onStart() { super.onStart(); diff --git a/app/src/main/res/layout/activity_main.xml b/app/src/main/res/layout/app_root.xml similarity index 100% rename from app/src/main/res/layout/activity_main.xml rename to app/src/main/res/layout/app_root.xml diff --git a/app/src/main/res/layout/interaction_book.xml b/app/src/main/res/layout/bookinginteraction_book.xml similarity index 100% rename from app/src/main/res/layout/interaction_book.xml rename to app/src/main/res/layout/bookinginteraction_book.xml From 456d8d5bce3188c5efaac33cf40e1e5d47ca4460 Mon Sep 17 00:00:00 2001 From: ObjectiveTruth Date: Sun, 14 Aug 2016 23:00:54 -0400 Subject: [PATCH 05/53] Booking Interactions works as expected --- .../uoitlibrarybooking/MainActivity.java | 27 +++--- .../BookingInteraction.java | 82 ++++++++++++++++++- .../calendar/grid/common/GridAdapter.java | 3 +- .../userinterface/common/ActivityBase.java | 21 ++++- .../res/layout/bookinginteraction_book.xml | 63 +------------- app/src/main/res/values/stringArray.xml | 9 +- 6 files changed, 122 insertions(+), 83 deletions(-) diff --git a/app/src/main/java/com/objectivetruth/uoitlibrarybooking/MainActivity.java b/app/src/main/java/com/objectivetruth/uoitlibrarybooking/MainActivity.java index b72abfd..e42f13b 100644 --- a/app/src/main/java/com/objectivetruth/uoitlibrarybooking/MainActivity.java +++ b/app/src/main/java/com/objectivetruth/uoitlibrarybooking/MainActivity.java @@ -9,10 +9,11 @@ import android.net.NetworkInfo; import android.os.Bundle; import android.preference.PreferenceManager; +import android.support.v4.app.FragmentTransaction; import android.support.v7.app.AppCompatActivity; import android.view.MenuItem; import com.objectivetruth.uoitlibrarybooking.app.UOITLibraryBookingApp; -import com.objectivetruth.uoitlibrarybooking.common.ScreenRequest; +import com.objectivetruth.uoitlibrarybooking.data.models.calendarmodel.TimeCell; import com.objectivetruth.uoitlibrarybooking.userinterface.BookingInteraction.BookingInteraction; import com.objectivetruth.uoitlibrarybooking.userinterface.calendar.whatsnew.WhatsNewDialog; import com.objectivetruth.uoitlibrarybooking.userinterface.common.ActivityBase; @@ -31,7 +32,7 @@ public class MainActivity extends ActivityBase { AppCompatActivity mActivity = this; public static CookieManager cookieManager; private boolean isFirstLoadThisSession = false; - private PublishSubject screenRequestPublishSubject; + private PublishSubject bookingInteractionRequestPublishSubject; @Inject SharedPreferences mDefaultSharedPreferences; @Inject SharedPreferences.Editor mDefaultSharedPreferencesEditor; @@ -215,22 +216,24 @@ public boolean isNetworkAvailable(Context ctx){ * Can be used to request a Screen change from the MainActivity * @return */ - public PublishSubject getMainActivityRouterPublishSubject() { - if(screenRequestPublishSubject == null || screenRequestPublishSubject.hasCompleted()) { - screenRequestPublishSubject = PublishSubject.create(); - _bindScreenRequestPublishSubjectToRouter(screenRequestPublishSubject); - return screenRequestPublishSubject; + public PublishSubject getMainActivityRouterPublishSubject() { + if(bookingInteractionRequestPublishSubject == null || bookingInteractionRequestPublishSubject.hasCompleted()) { + bookingInteractionRequestPublishSubject = PublishSubject.create(); + _bindScreenRequestPublishSubjectToRouter(bookingInteractionRequestPublishSubject); + return bookingInteractionRequestPublishSubject; }else { - return screenRequestPublishSubject; + return bookingInteractionRequestPublishSubject; } } - private void _bindScreenRequestPublishSubjectToRouter(PublishSubject screenRequestPublishSubject) { - screenRequestPublishSubject.subscribe(new Action1() { + private void _bindScreenRequestPublishSubjectToRouter(PublishSubject screenRequestPublishSubject) { + screenRequestPublishSubject.subscribe(new Action1() { @Override - public void call(ScreenRequest screenRequest) { + public void call(TimeCell timeCell) { addHidingOfAllCurrentFragmentsToTransaction(getSupportFragmentManager().beginTransaction()) - .add(R.id.mainactivity_content_frame, BookingInteraction.newInstance()) + .add(R.id.mainactivity_content_frame, BookingInteraction.newInstance(timeCell)) + .setTransition(FragmentTransaction.TRANSIT_FRAGMENT_FADE) + .addToBackStack(null) .commit(); } }); diff --git a/app/src/main/java/com/objectivetruth/uoitlibrarybooking/userinterface/BookingInteraction/BookingInteraction.java b/app/src/main/java/com/objectivetruth/uoitlibrarybooking/userinterface/BookingInteraction/BookingInteraction.java index 4076ae9..3645428 100644 --- a/app/src/main/java/com/objectivetruth/uoitlibrarybooking/userinterface/BookingInteraction/BookingInteraction.java +++ b/app/src/main/java/com/objectivetruth/uoitlibrarybooking/userinterface/BookingInteraction/BookingInteraction.java @@ -3,12 +3,18 @@ import android.os.Bundle; import android.support.annotation.Nullable; import android.support.v4.app.Fragment; +import android.support.v7.app.ActionBar; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; +import android.widget.*; +import com.objectivetruth.uoitlibrarybooking.MainActivity; import com.objectivetruth.uoitlibrarybooking.R; +import com.objectivetruth.uoitlibrarybooking.data.models.calendarmodel.TimeCell; public class BookingInteraction extends Fragment { + private static final String BOOKING_INTERACTION_TITLE = "Booking"; + private TimeCell timeCell; @Nullable @Override @@ -16,10 +22,80 @@ public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { - return inflater.inflate(R.layout.bookinginteraction_book, container, false); + View view = inflater.inflate(R.layout.bookinginteraction_book, container, false); + _setTitle(BOOKING_INTERACTION_TITLE); + + TextView roomNumberTextView = (TextView) view.findViewById(R.id.interaction_book_room_number); + if(roomNumberTextView != null) {roomNumberTextView.setText(timeCell.param_room.toUpperCase());} + + TextView dateField = (TextView) view.findViewById(R.id.book_date_actual); + if(dateField != null) {dateField.setText(timeCell.param_starttime);} + + TextView errorTextView = (TextView) view.findViewById(R.id.book_error_message_actual); + + + EditText groupNameEditText = (EditText) view.findViewById(R.id.book_group_name_actual); + + ImageButton commentImageButton = (ImageButton) view.findViewById(R.id.comment_button); + + EditText groupCodeEditText = (EditText) view.findViewById(R.id.book_group_code_actual); + + Button titleButton = (Button) view.findViewById(R.id.book_room_number_actual); + + ImageButton groupCodeInfoImageButton = (ImageButton) view.findViewById(R.id.info_group_code); + + + Spinner durationSpinner = (Spinner) view.findViewById(R.id.book_spinner_duration); + ArrayAdapter durationAdapter = ArrayAdapter.createFromResource(getActivity(), + R.array.duration, android.R.layout.simple_spinner_item); + durationAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); + durationSpinner.setAdapter(durationAdapter); + durationSpinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener(){ + + @Override + public void onItemSelected(AdapterView adapter, View view, + int position, long id) { + String[] timeToDecimal = new String[]{"0.5", "1.0", "1.5", "2"}; + String durationSpinnerValue = timeToDecimal[position]; + } + + @Override + public void onNothingSelected(AdapterView adapter) { } + }); + durationSpinner.setSelection(1); + + + return view; + } + + @Override + public void onStart() { + super.onStart(); + ((MainActivity) getActivity()).setDrawerState(false); + } + + @Override + public void onStop() { + ((MainActivity) getActivity()).setDrawerState(true); + super.onStop(); + } + + public static BookingInteraction newInstance(TimeCell timeCell) { + BookingInteraction fragment = new BookingInteraction(); + fragment.timeCell = timeCell; + return fragment; + } + + @Override + public void onCreate(@Nullable Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setHasOptionsMenu(true); } - public static BookingInteraction newInstance() { - return new BookingInteraction(); + private void _setTitle(String title) { + ActionBar actionBar = ((MainActivity) getActivity()).getSupportActionBar(); + if(actionBar != null) { + actionBar.setTitle(title); + } } } diff --git a/app/src/main/java/com/objectivetruth/uoitlibrarybooking/userinterface/calendar/grid/common/GridAdapter.java b/app/src/main/java/com/objectivetruth/uoitlibrarybooking/userinterface/calendar/grid/common/GridAdapter.java index d9f08d0..4328300 100644 --- a/app/src/main/java/com/objectivetruth/uoitlibrarybooking/userinterface/calendar/grid/common/GridAdapter.java +++ b/app/src/main/java/com/objectivetruth/uoitlibrarybooking/userinterface/calendar/grid/common/GridAdapter.java @@ -6,7 +6,6 @@ import android.widget.TextView; import com.objectivetruth.uoitlibrarybooking.MainActivity; import com.objectivetruth.uoitlibrarybooking.R; -import com.objectivetruth.uoitlibrarybooking.common.ScreenRequest; import com.objectivetruth.uoitlibrarybooking.data.models.calendarmodel.CalendarDay; import com.objectivetruth.uoitlibrarybooking.data.models.calendarmodel.TimeCell; import com.objectivetruth.uoitlibrarybooking.userinterface.calendar.grid.tablefixheaders.FixedTableAdapter; @@ -202,7 +201,7 @@ private static class TimeCellOnClickListener implements View.OnClickListener { @Override public void onClick(View view) { Timber.i("Clicked: " + timeCell.param_get_link); - mainActivity.getMainActivityRouterPublishSubject().onNext(new ScreenRequest()); + mainActivity.getMainActivityRouterPublishSubject().onNext(timeCell); } } } diff --git a/app/src/main/java/com/objectivetruth/uoitlibrarybooking/userinterface/common/ActivityBase.java b/app/src/main/java/com/objectivetruth/uoitlibrarybooking/userinterface/common/ActivityBase.java index 803596e..da66d31 100644 --- a/app/src/main/java/com/objectivetruth/uoitlibrarybooking/userinterface/common/ActivityBase.java +++ b/app/src/main/java/com/objectivetruth/uoitlibrarybooking/userinterface/common/ActivityBase.java @@ -18,7 +18,6 @@ import com.objectivetruth.uoitlibrarybooking.BuildConfig; import com.objectivetruth.uoitlibrarybooking.R; import com.objectivetruth.uoitlibrarybooking.statelessutilities.Triple; -import com.objectivetruth.uoitlibrarybooking.userinterface.BookingInteraction.BookingInteraction; import com.objectivetruth.uoitlibrarybooking.userinterface.about.About; import com.objectivetruth.uoitlibrarybooking.userinterface.calendar.Calendar; import com.objectivetruth.uoitlibrarybooking.userinterface.guidelinespolicies.GuidelinesAndPolicies; @@ -126,7 +125,6 @@ protected void initializeAllMainFragmentsAndPreloadToView() { GuidelinesAndPolicies guidelinesAndPoliciesFrag = GuidelinesAndPolicies.newInstance(); About aboutFrag = About.newInstance(); MyAccount myAccountFrag = MyAccount.newInstance(); - BookingInteraction bookingInteractions = BookingInteraction.newInstance(); stringFragmentHashMap.put(CALENDAR_FRAGMENT_TAG, calendarFrag); stringFragmentHashMap.put(GUIDELINES_POLICIES_FRAGMENT_TAG, guidelinesAndPoliciesFrag); @@ -351,4 +349,23 @@ private void _closeNavDrawer() { _mDrawerLayout.closeDrawer(GravityCompat.START); } } + + public void setDrawerState(boolean isEnabled) { + if ( isEnabled ) { + _mDrawerLayout.setDrawerLockMode(DrawerLayout.LOCK_MODE_UNLOCKED); + getActionBarDrawerToggle().setDrawerIndicatorEnabled(true); + if(getSupportActionBar() != null) { + getSupportActionBar().setDisplayHomeAsUpEnabled(true); + } + getActionBarDrawerToggle().syncState(); + } + else { + _mDrawerLayout.setDrawerLockMode(DrawerLayout.LOCK_MODE_LOCKED_CLOSED); + getActionBarDrawerToggle().setDrawerIndicatorEnabled(false); + if(getSupportActionBar() != null) { + getSupportActionBar().setDisplayHomeAsUpEnabled(false); + } + getActionBarDrawerToggle().syncState(); + } + } } diff --git a/app/src/main/res/layout/bookinginteraction_book.xml b/app/src/main/res/layout/bookinginteraction_book.xml index 23f612d..1d3b103 100644 --- a/app/src/main/res/layout/bookinginteraction_book.xml +++ b/app/src/main/res/layout/bookinginteraction_book.xml @@ -1,29 +1,3 @@ - - - @@ -124,8 +95,7 @@ android:layout_toRightOf="@+id/book_group_name_actual" />--> - + - - - - - - \ No newline at end of file diff --git a/app/src/main/res/values/stringArray.xml b/app/src/main/res/values/stringArray.xml index 638d716..eecd719 100644 --- a/app/src/main/res/values/stringArray.xml +++ b/app/src/main/res/values/stringArray.xml @@ -24,11 +24,10 @@ - How long? - 30 min. - 1 hr. - 1:30 hr. - 2:00 hr. + 30 minutes + 1 hour + 1 hour and 30 minutes + 2 hours From 51f25b5fdc4053597cdb5ea1d615c038e90cc4f6 Mon Sep 17 00:00:00 2001 From: ObjectiveTruth Date: Sun, 14 Aug 2016 23:33:52 -0400 Subject: [PATCH 06/53] Issue with Coming back from App Death :ghost: Booking gets overlayed over the others --- .../BookingInteraction.java | 23 ++++++++++++++++--- 1 file changed, 20 insertions(+), 3 deletions(-) diff --git a/app/src/main/java/com/objectivetruth/uoitlibrarybooking/userinterface/BookingInteraction/BookingInteraction.java b/app/src/main/java/com/objectivetruth/uoitlibrarybooking/userinterface/BookingInteraction/BookingInteraction.java index 3645428..3e472a5 100644 --- a/app/src/main/java/com/objectivetruth/uoitlibrarybooking/userinterface/BookingInteraction/BookingInteraction.java +++ b/app/src/main/java/com/objectivetruth/uoitlibrarybooking/userinterface/BookingInteraction/BookingInteraction.java @@ -14,6 +14,7 @@ public class BookingInteraction extends Fragment { private static final String BOOKING_INTERACTION_TITLE = "Booking"; + private static final String TIME_CELL_BUNDLE_KEY = "TIME_CELL_BUNDLE_KEY"; private TimeCell timeCell; @Nullable @@ -46,6 +47,12 @@ public View onCreateView(LayoutInflater inflater, Spinner durationSpinner = (Spinner) view.findViewById(R.id.book_spinner_duration); + _setupDurationSpinner(durationSpinner); + + return view; + } + + private void _setupDurationSpinner(Spinner durationSpinner) { ArrayAdapter durationAdapter = ArrayAdapter.createFromResource(getActivity(), R.array.duration, android.R.layout.simple_spinner_item); durationAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); @@ -63,9 +70,6 @@ public void onItemSelected(AdapterView adapter, View view, public void onNothingSelected(AdapterView adapter) { } }); durationSpinner.setSelection(1); - - - return view; } @Override @@ -90,6 +94,19 @@ public static BookingInteraction newInstance(TimeCell timeCell) { public void onCreate(@Nullable Bundle savedInstanceState) { super.onCreate(savedInstanceState); setHasOptionsMenu(true); + if(savedInstanceState != null) { + _loadPreviousStateIfAvailable(savedInstanceState); + } + } + + @Override + public void onSaveInstanceState(Bundle outState) { + super.onSaveInstanceState(outState); + outState.putParcelable(TIME_CELL_BUNDLE_KEY, timeCell); + } + + private void _loadPreviousStateIfAvailable(Bundle inState) { + timeCell = inState.getParcelable(TIME_CELL_BUNDLE_KEY); } private void _setTitle(String title) { From b1a6a65c75efa6cea92fd2eb2f8495e80006691f Mon Sep 17 00:00:00 2001 From: ObjectiveTruth Date: Mon, 15 Aug 2016 16:23:21 -0400 Subject: [PATCH 07/53] Added testing of the calendarParser --- .../data/models/CalendarModel.java | 3 +- .../data/models/CalendarModelTest.java | 65 +++++++++++++++++-- 2 files changed, 60 insertions(+), 8 deletions(-) diff --git a/app/src/main/java/com/objectivetruth/uoitlibrarybooking/data/models/CalendarModel.java b/app/src/main/java/com/objectivetruth/uoitlibrarybooking/data/models/CalendarModel.java index 3791713..043fa9a 100644 --- a/app/src/main/java/com/objectivetruth/uoitlibrarybooking/data/models/CalendarModel.java +++ b/app/src/main/java/com/objectivetruth/uoitlibrarybooking/data/models/CalendarModel.java @@ -233,7 +233,8 @@ public Observable call(CalendarData calendarData) { // Pass it through if there's no days if(calendarData == null) {return Observable.just(null);} - return Observable.just(_addComputedHashCodeToCalendarData(calendarData)); + CalendarData output = _addComputedHashCodeToCalendarData(calendarData); + return Observable.just(output); } }) diff --git a/app/src/test/java/com/objectivetruth/uoitlibrarybooking/data/models/CalendarModelTest.java b/app/src/test/java/com/objectivetruth/uoitlibrarybooking/data/models/CalendarModelTest.java index 505c992..0b60417 100644 --- a/app/src/test/java/com/objectivetruth/uoitlibrarybooking/data/models/CalendarModelTest.java +++ b/app/src/test/java/com/objectivetruth/uoitlibrarybooking/data/models/CalendarModelTest.java @@ -3,10 +3,7 @@ import android.content.Context; import android.content.SharedPreferences; import com.objectivetruth.uoitlibrarybooking.app.UOITLibraryBookingApp; -import com.objectivetruth.uoitlibrarybooking.data.models.calendarmodel.CalendarDataRefreshState; -import com.objectivetruth.uoitlibrarybooking.data.models.calendarmodel.CalendarWebService; -import com.objectivetruth.uoitlibrarybooking.data.models.calendarmodel.RefreshActivateEvent; -import com.objectivetruth.uoitlibrarybooking.data.models.calendarmodel.ScrollAtTopOfGridEvent; +import com.objectivetruth.uoitlibrarybooking.data.models.calendarmodel.*; import org.apache.commons.io.FileUtils; import org.junit.Before; import org.junit.Test; @@ -27,8 +24,7 @@ import static org.hamcrest.CoreMatchers.is; import static org.junit.Assert.assertNull; import static org.junit.Assert.assertThat; -import static org.mockito.Matchers.anyString; -import static org.mockito.Matchers.eq; +import static org.mockito.Matchers.*; public class CalendarModelTest { private SharedPreferences sharedPreferencesMock; @@ -48,7 +44,9 @@ public void setUp() throws Exception { testSubscriber = new TestSubscriber<>(); Mockito.when(sharedPreferencesMock.edit()).thenReturn(sharedPreferencesEditorMock); - Mockito.when(sharedPreferencesEditorMock.putString(CALENDAR_DATA_JSON, nullJSON)) + Mockito.when(sharedPreferencesEditorMock.putString(eq(CALENDAR_DATA_JSON), eq(nullJSON))) + .thenReturn(sharedPreferencesEditorMock); + Mockito.when(sharedPreferencesEditorMock.putString(eq(CALENDAR_DATA_JSON), anyString())) .thenReturn(sharedPreferencesEditorMock); Mockito.when(applicationMock.getSharedPreferences(CALENDAR_SHARED_PREFERENCES_NAME, Context.MODE_PRIVATE)) .thenReturn(sharedPreferencesMock); @@ -142,6 +140,34 @@ public void whenRefreshEventCompletesSuccessfullyReturnsSuccessWithCalendarData( assertNull(currentState.calendarData); } + @Test + public void whenRefreshEventCompletesSuccessfullyWithMockDataReturnsSuccessWithCalendarDataParsedCorrectly() throws + InterruptedException, ExecutionException, TimeoutException { + // Shared Prefs returns null if its the first time the app loads and has no default data + Mockito.when(sharedPreferencesMock.getString(eq(CALENDAR_DATA_JSON), anyString())) + .thenReturn(null); + Mockito.when(calendarWebServiceMock.getRawInitialWebPageObs()) + .thenReturn(Observable.just(_getRawInitialWebpageWithONEDaysAvailableFromTestResources())); + Mockito.when(calendarWebServiceMock.getRawClickableDatesWebPagesObs(any(CalendarData.class))) + .thenReturn(Observable.just( + new String[]{_getRawClickableDateHalfClosedHalfOpenFromTestResources()})); + + CalendarModel calendarModel = new CalendarModel(applicationMock, calendarWebServiceMock); + // Activate a refresh + calendarModel.getRefreshActivatePublishSubject().onNext(new RefreshActivateEvent()); + Thread.sleep(100); + + CalendarDataRefreshState currentState = + calendarModel.getCalendarDataRefreshObservable().first() + .toBlocking().toFuture().get(300, TimeUnit.MILLISECONDS); + + // The hash represents the entire object's contents, so comparing we know the object is the same + int TEST_DATA_HASH = -1135169745; + assertThat(currentState.type, is(SUCCESS)); + assertNull(currentState.exception); + assertThat(currentState.calendarData.computedHashCode, is(TEST_DATA_HASH)); + } + @Test public void whenNoGridScrollingOccursReturnsDefaultState() throws Exception { // Shared Prefs returns null if its the first time the app loads and has no default data @@ -192,4 +218,29 @@ private String _getRawInitialWebpageWithNoDaysAvailableFromTestResources() { return null; } } + + private String _getRawInitialWebpageWithONEDaysAvailableFromTestResources() { + String delim = File.separator; + String noDaysAvailableFileLocation = ".." + delim + "app" + delim + "src" + delim + + "testResources" + delim + "server_responses" + delim + "1_day_available.aspx"; + try { + return FileUtils.readFileToString(new File(noDaysAvailableFileLocation), "UTF-8"); + } catch (IOException e) { + e.printStackTrace(); + return null; + } + } + + private String _getRawClickableDateHalfClosedHalfOpenFromTestResources() { + String delim = File.separator; + String noDaysAvailableFileLocation = ".." + delim + "app" + delim + "src" + delim + + "testResources" + delim + "server_responses" + delim + "clickabledate" + delim + + "half_closed_half_open_8am-330pm.aspx"; + try { + return FileUtils.readFileToString(new File(noDaysAvailableFileLocation), "UTF-8"); + } catch (IOException e) { + e.printStackTrace(); + return null; + } + } } From c3d486d88b765a1d15db0235ba5a7b6a774c92a2 Mon Sep 17 00:00:00 2001 From: ObjectiveTruth Date: Mon, 15 Aug 2016 16:33:17 -0400 Subject: [PATCH 08/53] Added more time for processing tests (was failing) --- .../uoitlibrarybooking/data/models/CalendarModelTest.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/test/java/com/objectivetruth/uoitlibrarybooking/data/models/CalendarModelTest.java b/app/src/test/java/com/objectivetruth/uoitlibrarybooking/data/models/CalendarModelTest.java index 0b60417..e514028 100644 --- a/app/src/test/java/com/objectivetruth/uoitlibrarybooking/data/models/CalendarModelTest.java +++ b/app/src/test/java/com/objectivetruth/uoitlibrarybooking/data/models/CalendarModelTest.java @@ -155,7 +155,7 @@ public void whenRefreshEventCompletesSuccessfullyWithMockDataReturnsSuccessWithC CalendarModel calendarModel = new CalendarModel(applicationMock, calendarWebServiceMock); // Activate a refresh calendarModel.getRefreshActivatePublishSubject().onNext(new RefreshActivateEvent()); - Thread.sleep(100); + Thread.sleep(300); CalendarDataRefreshState currentState = calendarModel.getCalendarDataRefreshObservable().first() From 1ebd832900d219e593a85d97c6ab666286666e58 Mon Sep 17 00:00:00 2001 From: ObjectiveTruth Date: Mon, 15 Aug 2016 16:38:43 -0400 Subject: [PATCH 09/53] Minor changes to increase CircleCI speed --- circle.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/circle.yml b/circle.yml index 894b5f5..9425667 100644 --- a/circle.yml +++ b/circle.yml @@ -35,7 +35,7 @@ dependencies: - cp app/debug.keystore ~/.android/ cache_directories: - /usr/local/android-sdk-linux/tools - - /usr/local/android-sdk-linux/build-tools/24.0.0 + - /usr/local/android-sdk-linux/build-tools/24.0.1 - /usr/local/android-sdk-linux/extras/android/m2repository - /usr/local/android-sdk-linux/extras/google/m2repository - /usr/local/android-sdk-linux/extras/google/google_play_services @@ -61,7 +61,7 @@ test: # ============== # Run unit tests - - ./gradlew jacocoTestDebugUnitTestReport: + - ./gradlew jacocoTestDebugUnitTestReport --info: timeout: 900 # Mount SD card into Linux From 6247476835855a6cfb12effc4bef3c997b4989c5 Mon Sep 17 00:00:00 2001 From: ObjectiveTruth Date: Mon, 15 Aug 2016 21:26:29 -0400 Subject: [PATCH 10/53] Fixed an issue where Booking interaction wasn't loading on app coma state The reason is that the drawer is handled fine, and before, the assumption was that the drawer would govern everything, so it was handled. However now there's non-drawer screens which handle their own transaction state and backstack. In this case this is a bit of a hack. Hopefully if it continues there migth be a need to refactor this all so theres only 1 root to the app. Instead of using the drawer as the root --- .../uoitlibrarybooking/MainActivity.java | 2 +- .../BookingInteraction.java | 13 ++++++++ .../userinterface/common/ActivityBase.java | 31 +++++++++++++++---- 3 files changed, 39 insertions(+), 7 deletions(-) diff --git a/app/src/main/java/com/objectivetruth/uoitlibrarybooking/MainActivity.java b/app/src/main/java/com/objectivetruth/uoitlibrarybooking/MainActivity.java index e42f13b..c276ff8 100644 --- a/app/src/main/java/com/objectivetruth/uoitlibrarybooking/MainActivity.java +++ b/app/src/main/java/com/objectivetruth/uoitlibrarybooking/MainActivity.java @@ -55,7 +55,7 @@ protected void onPostCreate(Bundle savedInstanceState) { if(isFirstLoadThisSession) { _goToScreenByMenuID(R.id.drawer_menu_item_calendar); - }else{ + }else if(areOnlyDrawerRelatedScreensShowing()){ _goToScreenByMenuID(getLastMenuItemIDRequested()); } diff --git a/app/src/main/java/com/objectivetruth/uoitlibrarybooking/userinterface/BookingInteraction/BookingInteraction.java b/app/src/main/java/com/objectivetruth/uoitlibrarybooking/userinterface/BookingInteraction/BookingInteraction.java index 3e472a5..f1d19c2 100644 --- a/app/src/main/java/com/objectivetruth/uoitlibrarybooking/userinterface/BookingInteraction/BookingInteraction.java +++ b/app/src/main/java/com/objectivetruth/uoitlibrarybooking/userinterface/BookingInteraction/BookingInteraction.java @@ -1,5 +1,6 @@ package com.objectivetruth.uoitlibrarybooking.userinterface.BookingInteraction; +import android.content.Context; import android.os.Bundle; import android.support.annotation.Nullable; import android.support.v4.app.Fragment; @@ -84,6 +85,18 @@ public void onStop() { super.onStop(); } + @Override + public void onAttach(Context context) { + super.onAttach(context); + ((MainActivity) getActivity()).setIsNonDrawerScreenShowing(true); + } + + @Override + public void onDetach() { + super.onDetach(); + ((MainActivity) getActivity()).setIsNonDrawerScreenShowing(false); + } + public static BookingInteraction newInstance(TimeCell timeCell) { BookingInteraction fragment = new BookingInteraction(); fragment.timeCell = timeCell; diff --git a/app/src/main/java/com/objectivetruth/uoitlibrarybooking/userinterface/common/ActivityBase.java b/app/src/main/java/com/objectivetruth/uoitlibrarybooking/userinterface/common/ActivityBase.java index da66d31..23e758c 100644 --- a/app/src/main/java/com/objectivetruth/uoitlibrarybooking/userinterface/common/ActivityBase.java +++ b/app/src/main/java/com/objectivetruth/uoitlibrarybooking/userinterface/common/ActivityBase.java @@ -37,8 +37,10 @@ public abstract class ActivityBase extends AppCompatActivity { private int _lastMenuItemIDRequested; private boolean _isFirstTimeSelectDrawerItem = true; private NavigationView navigationView; - private String LAST_MENU_ITEM_ID_REQUESTED_BUNDLE_KEY = "LAST_MENU_ITEM_ID_REQUESTED"; - private String MAIN_FRAGMENT_TAGS_BUNDLE_KEY = "MAIN_FRAGMENT_TAGS_BUNDLE_KEY"; + private String BUNDLE_KEY_LAST_MENU_ITEM_ID_REQUESTED = "LAST_MENU_ITEM_ID_REQUESTED"; + private String BUNDLE_KEY_MAIN_FRAGMENT_TAGS = "BUNDLE_KEY_MAIN_FRAGMENT_TAGS"; + private String BUNDLE_KEY_IS_A_NON_DRAWER_SCREEN_SHOWING = "BUNDLE_KEY_IS_A_NON_DRAWER_SCREEN_SHOWING"; + private boolean _isANonDrawerScreenShowing = false; private boolean isFirstLoadThisSession = false; @Override @@ -84,9 +86,10 @@ protected void setupToolbar(int toolbarLayoutIdToLoad) { } private void _restorePreviousInstanceInformation(Bundle savedInstanceState) { - _lastMenuItemIDRequested = savedInstanceState.getInt(LAST_MENU_ITEM_ID_REQUESTED_BUNDLE_KEY); + _lastMenuItemIDRequested = savedInstanceState.getInt(BUNDLE_KEY_LAST_MENU_ITEM_ID_REQUESTED); + _isANonDrawerScreenShowing = savedInstanceState.getBoolean(BUNDLE_KEY_IS_A_NON_DRAWER_SCREEN_SHOWING); - String[] previousFragmentTags = savedInstanceState.getStringArray(MAIN_FRAGMENT_TAGS_BUNDLE_KEY); + String[] previousFragmentTags = savedInstanceState.getStringArray(BUNDLE_KEY_MAIN_FRAGMENT_TAGS); stringFragmentHashMap = new HashMap(); // Android destroyed the previous HashMap. Must rebuild for(String fragTag: previousFragmentTags) { stringFragmentHashMap.put(fragTag, null); @@ -155,8 +158,24 @@ protected void onSaveInstanceState(Bundle outState) { super.onSaveInstanceState(outState); String[] mainFragmentTags = _stringSetToStringArray(stringFragmentHashMap.keySet()); - outState.putInt (LAST_MENU_ITEM_ID_REQUESTED_BUNDLE_KEY, _lastMenuItemIDRequested); - outState.putStringArray(MAIN_FRAGMENT_TAGS_BUNDLE_KEY, mainFragmentTags); + outState.putInt (BUNDLE_KEY_LAST_MENU_ITEM_ID_REQUESTED, _lastMenuItemIDRequested); + outState.putBoolean(BUNDLE_KEY_IS_A_NON_DRAWER_SCREEN_SHOWING, _isANonDrawerScreenShowing); + outState.putStringArray(BUNDLE_KEY_MAIN_FRAGMENT_TAGS, mainFragmentTags); + } + + /** + * Tells the Activity that a non-drawer related screen is currently showing, this will give it a hint that + * it should NOT track the last item being shown. This is important for when app comma happens (everything is fully + * destroyed and needs to be created). This is because the other screen will handle the backstack itself. + * @see com.objectivetruth.uoitlibrarybooking.userinterface.BookingInteraction.BookingInteraction + * @param isANonDrawerScreenShowing + */ + public void setIsNonDrawerScreenShowing(boolean isANonDrawerScreenShowing) { + _isANonDrawerScreenShowing = isANonDrawerScreenShowing; + } + + protected boolean areOnlyDrawerRelatedScreensShowing() { + return !_isANonDrawerScreenShowing; } private String[] _stringSetToStringArray(Set strings) { From 588544ec874fc60b8f01558356daa17b8d310e17 Mon Sep 17 00:00:00 2001 From: ObjectiveTruth Date: Mon, 15 Aug 2016 22:17:55 -0400 Subject: [PATCH 11/53] Added Basic booking fragment --- .../BookingInteraction/Book.java | 91 +++++++++++++++++++ .../BookingInteraction.java | 55 ++--------- .../res/layout/bookinginteraction_root.xml | 7 ++ 3 files changed, 107 insertions(+), 46 deletions(-) create mode 100644 app/src/main/java/com/objectivetruth/uoitlibrarybooking/userinterface/BookingInteraction/Book.java create mode 100644 app/src/main/res/layout/bookinginteraction_root.xml diff --git a/app/src/main/java/com/objectivetruth/uoitlibrarybooking/userinterface/BookingInteraction/Book.java b/app/src/main/java/com/objectivetruth/uoitlibrarybooking/userinterface/BookingInteraction/Book.java new file mode 100644 index 0000000..ba6dc1b --- /dev/null +++ b/app/src/main/java/com/objectivetruth/uoitlibrarybooking/userinterface/BookingInteraction/Book.java @@ -0,0 +1,91 @@ +package com.objectivetruth.uoitlibrarybooking.userinterface.BookingInteraction; + +import android.os.Bundle; +import android.support.annotation.Nullable; +import android.support.v4.app.Fragment; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.widget.*; +import com.objectivetruth.uoitlibrarybooking.R; +import com.objectivetruth.uoitlibrarybooking.data.models.calendarmodel.TimeCell; + +public class Book extends Fragment{ + private TimeCell timeCell; + private static final String TIME_CELL_BUNDLE_KEY = "TIME_CELL_BUNDLE_KEY"; + + @Nullable + @Override + public View onCreateView(LayoutInflater inflater, + @Nullable ViewGroup container, + @Nullable Bundle savedInstanceState) { + View view = inflater.inflate(R.layout.bookinginteraction_book, container, false); + + TextView roomNumberTextView = (TextView) view.findViewById(R.id.interaction_book_room_number); + if(roomNumberTextView != null) {roomNumberTextView.setText(timeCell.param_room.toUpperCase());} + + TextView dateField = (TextView) view.findViewById(R.id.book_date_actual); + if(dateField != null) {dateField.setText(timeCell.param_starttime);} + + TextView errorTextView = (TextView) view.findViewById(R.id.book_error_message_actual); + + EditText groupNameEditText = (EditText) view.findViewById(R.id.book_group_name_actual); + + ImageButton commentImageButton = (ImageButton) view.findViewById(R.id.comment_button); + + EditText groupCodeEditText = (EditText) view.findViewById(R.id.book_group_code_actual); + + Button titleButton = (Button) view.findViewById(R.id.book_room_number_actual); + + ImageButton groupCodeInfoImageButton = (ImageButton) view.findViewById(R.id.info_group_code); + + Spinner durationSpinner = (Spinner) view.findViewById(R.id.book_spinner_duration); + _setupDurationSpinner(durationSpinner); + return view; + } + + static public Book newInstance(TimeCell timeCell) { + Book fragment = new Book(); + fragment.timeCell = timeCell; + return fragment; + } + + @Override + public void onCreate(@Nullable Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setHasOptionsMenu(true); + if(savedInstanceState != null) { + _loadPreviousStateIfAvailable(savedInstanceState); + } + } + + private void _loadPreviousStateIfAvailable(Bundle inState) { + timeCell = inState.getParcelable(TIME_CELL_BUNDLE_KEY); + } + + private void _setupDurationSpinner(Spinner durationSpinner) { + ArrayAdapter durationAdapter = ArrayAdapter.createFromResource(getActivity(), + R.array.duration, android.R.layout.simple_spinner_item); + durationAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); + durationSpinner.setAdapter(durationAdapter); + durationSpinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener(){ + + @Override + public void onItemSelected(AdapterView adapter, View view, + int position, long id) { + String[] timeToDecimal = new String[]{"0.5", "1.0", "1.5", "2"}; + String durationSpinnerValue = timeToDecimal[position]; + } + + @Override + public void onNothingSelected(AdapterView adapter) { } + }); + durationSpinner.setSelection(1); + } + + @Override + public void onSaveInstanceState(Bundle outState) { + super.onSaveInstanceState(outState); + outState.putParcelable(TIME_CELL_BUNDLE_KEY, timeCell); + } +} diff --git a/app/src/main/java/com/objectivetruth/uoitlibrarybooking/userinterface/BookingInteraction/BookingInteraction.java b/app/src/main/java/com/objectivetruth/uoitlibrarybooking/userinterface/BookingInteraction/BookingInteraction.java index f1d19c2..88f76f9 100644 --- a/app/src/main/java/com/objectivetruth/uoitlibrarybooking/userinterface/BookingInteraction/BookingInteraction.java +++ b/app/src/main/java/com/objectivetruth/uoitlibrarybooking/userinterface/BookingInteraction/BookingInteraction.java @@ -8,7 +8,6 @@ import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; -import android.widget.*; import com.objectivetruth.uoitlibrarybooking.MainActivity; import com.objectivetruth.uoitlibrarybooking.R; import com.objectivetruth.uoitlibrarybooking.data.models.calendarmodel.TimeCell; @@ -24,59 +23,16 @@ public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { - View view = inflater.inflate(R.layout.bookinginteraction_book, container, false); + View view = inflater.inflate(R.layout.bookinginteraction_root, container, false); _setTitle(BOOKING_INTERACTION_TITLE); - - TextView roomNumberTextView = (TextView) view.findViewById(R.id.interaction_book_room_number); - if(roomNumberTextView != null) {roomNumberTextView.setText(timeCell.param_room.toUpperCase());} - - TextView dateField = (TextView) view.findViewById(R.id.book_date_actual); - if(dateField != null) {dateField.setText(timeCell.param_starttime);} - - TextView errorTextView = (TextView) view.findViewById(R.id.book_error_message_actual); - - - EditText groupNameEditText = (EditText) view.findViewById(R.id.book_group_name_actual); - - ImageButton commentImageButton = (ImageButton) view.findViewById(R.id.comment_button); - - EditText groupCodeEditText = (EditText) view.findViewById(R.id.book_group_code_actual); - - Button titleButton = (Button) view.findViewById(R.id.book_room_number_actual); - - ImageButton groupCodeInfoImageButton = (ImageButton) view.findViewById(R.id.info_group_code); - - - Spinner durationSpinner = (Spinner) view.findViewById(R.id.book_spinner_duration); - _setupDurationSpinner(durationSpinner); - return view; } - private void _setupDurationSpinner(Spinner durationSpinner) { - ArrayAdapter durationAdapter = ArrayAdapter.createFromResource(getActivity(), - R.array.duration, android.R.layout.simple_spinner_item); - durationAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); - durationSpinner.setAdapter(durationAdapter); - durationSpinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener(){ - - @Override - public void onItemSelected(AdapterView adapter, View view, - int position, long id) { - String[] timeToDecimal = new String[]{"0.5", "1.0", "1.5", "2"}; - String durationSpinnerValue = timeToDecimal[position]; - } - - @Override - public void onNothingSelected(AdapterView adapter) { } - }); - durationSpinner.setSelection(1); - } - @Override public void onStart() { super.onStart(); ((MainActivity) getActivity()).setDrawerState(false); + _setupViewBindings(timeCell); } @Override @@ -85,6 +41,13 @@ public void onStop() { super.onStop(); } + private void _setupViewBindings(TimeCell timeCell) { + getChildFragmentManager() + .beginTransaction() + .add(R.id.bookinginteraction_content_frame, Book.newInstance(timeCell)) + .commit(); + } + @Override public void onAttach(Context context) { super.onAttach(context); diff --git a/app/src/main/res/layout/bookinginteraction_root.xml b/app/src/main/res/layout/bookinginteraction_root.xml new file mode 100644 index 0000000..18fadc5 --- /dev/null +++ b/app/src/main/res/layout/bookinginteraction_root.xml @@ -0,0 +1,7 @@ + + + + \ No newline at end of file From a03aa1c4692cf1015adf753f659613e27fc08ff7 Mon Sep 17 00:00:00 2001 From: ObjectiveTruth Date: Tue, 16 Aug 2016 00:13:41 -0400 Subject: [PATCH 12/53] MVVM pattern applied to loading/showing BookingInteraction --- .../uoitlibrarybooking/MainActivity.java | 46 +++++----- .../uoitlibrarybooking/app/AppComponent.java | 4 + .../data/models/BookingInteractionModel.java | 87 ++++++++++++++++++- .../BookingInteractionEvent.java | 13 +++ .../BookingInteractionEventType.java | 16 ++++ .../BookingInteractionScreenLoadEvent.java | 13 +++ .../BookingInteraction.java | 57 ++++++------ .../calendar/grid/common/GridAdapter.java | 32 ++++--- 8 files changed, 208 insertions(+), 60 deletions(-) create mode 100644 app/src/main/java/com/objectivetruth/uoitlibrarybooking/data/models/bookinginteractionmodel/BookingInteractionEvent.java create mode 100644 app/src/main/java/com/objectivetruth/uoitlibrarybooking/data/models/bookinginteractionmodel/BookingInteractionEventType.java create mode 100644 app/src/main/java/com/objectivetruth/uoitlibrarybooking/data/models/bookinginteractionmodel/BookingInteractionScreenLoadEvent.java diff --git a/app/src/main/java/com/objectivetruth/uoitlibrarybooking/MainActivity.java b/app/src/main/java/com/objectivetruth/uoitlibrarybooking/MainActivity.java index c276ff8..1342292 100644 --- a/app/src/main/java/com/objectivetruth/uoitlibrarybooking/MainActivity.java +++ b/app/src/main/java/com/objectivetruth/uoitlibrarybooking/MainActivity.java @@ -13,12 +13,14 @@ import android.support.v7.app.AppCompatActivity; import android.view.MenuItem; import com.objectivetruth.uoitlibrarybooking.app.UOITLibraryBookingApp; -import com.objectivetruth.uoitlibrarybooking.data.models.calendarmodel.TimeCell; +import com.objectivetruth.uoitlibrarybooking.data.models.BookingInteractionModel; +import com.objectivetruth.uoitlibrarybooking.data.models.bookinginteractionmodel.BookingInteractionScreenLoadEvent; import com.objectivetruth.uoitlibrarybooking.userinterface.BookingInteraction.BookingInteraction; import com.objectivetruth.uoitlibrarybooking.userinterface.calendar.whatsnew.WhatsNewDialog; import com.objectivetruth.uoitlibrarybooking.userinterface.common.ActivityBase; +import rx.Observable; +import rx.Subscription; import rx.functions.Action1; -import rx.subjects.PublishSubject; import timber.log.Timber; import javax.inject.Inject; @@ -32,9 +34,10 @@ public class MainActivity extends ActivityBase { AppCompatActivity mActivity = this; public static CookieManager cookieManager; private boolean isFirstLoadThisSession = false; - private PublishSubject bookingInteractionRequestPublishSubject; + private Subscription bookingInteractionScreenLoadEventSubscription; @Inject SharedPreferences mDefaultSharedPreferences; @Inject SharedPreferences.Editor mDefaultSharedPreferencesEditor; + @Inject BookingInteractionModel bookingInteractionModel; @Override protected void onCreate(Bundle savedInstanceState) { @@ -55,7 +58,7 @@ protected void onPostCreate(Bundle savedInstanceState) { if(isFirstLoadThisSession) { _goToScreenByMenuID(R.id.drawer_menu_item_calendar); - }else if(areOnlyDrawerRelatedScreensShowing()){ + }else if(areOnlyDrawerRelatedScreensShowing()){ // A hack for the time being, use git blame to find out more _goToScreenByMenuID(getLastMenuItemIDRequested()); } @@ -212,26 +215,29 @@ public boolean isNetworkAvailable(Context ctx){ } } - /** - * Can be used to request a Screen change from the MainActivity - * @return - */ - public PublishSubject getMainActivityRouterPublishSubject() { - if(bookingInteractionRequestPublishSubject == null || bookingInteractionRequestPublishSubject.hasCompleted()) { - bookingInteractionRequestPublishSubject = PublishSubject.create(); - _bindScreenRequestPublishSubjectToRouter(bookingInteractionRequestPublishSubject); - return bookingInteractionRequestPublishSubject; - }else { - return bookingInteractionRequestPublishSubject; + @Override + protected void onStart() { + super.onStart(); + _bindBookingInteractionEventToLoadingBookingInteractionScreen( + bookingInteractionModel.getBookingInteractionScreenLoadEventObservable()); + } + + @Override + protected void onStop() { + if(bookingInteractionScreenLoadEventSubscription != null) { + bookingInteractionScreenLoadEventSubscription.unsubscribe(); } - } + super.onStop(); + } - private void _bindScreenRequestPublishSubjectToRouter(PublishSubject screenRequestPublishSubject) { - screenRequestPublishSubject.subscribe(new Action1() { + private void _bindBookingInteractionEventToLoadingBookingInteractionScreen( + Observable bookingInteractionEventObservable) { + bookingInteractionScreenLoadEventSubscription = bookingInteractionEventObservable + .subscribe(new Action1() { @Override - public void call(TimeCell timeCell) { + public void call(BookingInteractionScreenLoadEvent bookingInteractionScreenLoadEvent) { addHidingOfAllCurrentFragmentsToTransaction(getSupportFragmentManager().beginTransaction()) - .add(R.id.mainactivity_content_frame, BookingInteraction.newInstance(timeCell)) + .add(R.id.mainactivity_content_frame, BookingInteraction.newInstance()) .setTransition(FragmentTransaction.TRANSIT_FRAGMENT_FADE) .addToBackStack(null) .commit(); diff --git a/app/src/main/java/com/objectivetruth/uoitlibrarybooking/app/AppComponent.java b/app/src/main/java/com/objectivetruth/uoitlibrarybooking/app/AppComponent.java index 543b847..c07e9bd 100644 --- a/app/src/main/java/com/objectivetruth/uoitlibrarybooking/app/AppComponent.java +++ b/app/src/main/java/com/objectivetruth/uoitlibrarybooking/app/AppComponent.java @@ -6,8 +6,10 @@ import com.objectivetruth.uoitlibrarybooking.data.models.bookinginteractionmodel.BookingInteractionWebService; import com.objectivetruth.uoitlibrarybooking.data.models.calendarmodel.CalendarWebService; import com.objectivetruth.uoitlibrarybooking.data.models.usermodel.UserWebService; +import com.objectivetruth.uoitlibrarybooking.userinterface.BookingInteraction.BookingInteraction; import com.objectivetruth.uoitlibrarybooking.userinterface.calendar.Calendar; import com.objectivetruth.uoitlibrarybooking.userinterface.calendar.grid.Grid; +import com.objectivetruth.uoitlibrarybooking.userinterface.calendar.grid.common.GridAdapter; import com.objectivetruth.uoitlibrarybooking.userinterface.myaccount.MyAccount; import com.objectivetruth.uoitlibrarybooking.userinterface.myaccount.login.LoginFragment; import com.objectivetruth.uoitlibrarybooking.userinterface.myaccount.myaccountloaded.MyAccountLoaded; @@ -26,7 +28,9 @@ public interface AppComponent { void inject(LoginFragment loginFragment); void inject(UserWebService userWebService); void inject(BookingInteractionWebService bookingInteractionWebService); + void inject(BookingInteraction bookingInteraction); void inject(CalendarWebService calendarWebService); void inject(MyAccountLoaded myAccountLoaded); + void inject(GridAdapter gridAdapter); void inject(Grid grid); } diff --git a/app/src/main/java/com/objectivetruth/uoitlibrarybooking/data/models/BookingInteractionModel.java b/app/src/main/java/com/objectivetruth/uoitlibrarybooking/data/models/BookingInteractionModel.java index f55eea6..8de2a37 100644 --- a/app/src/main/java/com/objectivetruth/uoitlibrarybooking/data/models/BookingInteractionModel.java +++ b/app/src/main/java/com/objectivetruth/uoitlibrarybooking/data/models/BookingInteractionModel.java @@ -1,13 +1,98 @@ package com.objectivetruth.uoitlibrarybooking.data.models; import com.objectivetruth.uoitlibrarybooking.app.UOITLibraryBookingApp; +import com.objectivetruth.uoitlibrarybooking.data.models.bookinginteractionmodel.BookingInteractionEvent; +import com.objectivetruth.uoitlibrarybooking.data.models.bookinginteractionmodel.BookingInteractionScreenLoadEvent; import com.objectivetruth.uoitlibrarybooking.data.models.bookinginteractionmodel.BookingInteractionWebService; +import rx.Observable; +import rx.functions.Action1; +import rx.subjects.PublishSubject; +import rx.subjects.ReplaySubject; + +import javax.inject.Inject; public class BookingInteractionModel { - private BookingInteractionWebService bookingInteractionWebService; + @Inject BookingInteractionWebService bookingInteractionWebService; + + private ReplaySubject bookingInteractionEventReplaySubject; + private Observable bookingInteractionEventObservable; + + private PublishSubject bookingInteractionScreenLoadEventPublishSubject; + private Observable bookingInteractionScreenLoadEventObservable; public BookingInteractionModel(UOITLibraryBookingApp mApplication, BookingInteractionWebService bookingInteractionWebService) { this.bookingInteractionWebService = bookingInteractionWebService; } + + /** + * Can be used to request a Screen change by sending an event with your request + * @see BookingInteractionEvent + * @return + */ + public ReplaySubject getBookingInteractionEventReplaySubject() { + if(bookingInteractionEventReplaySubject == null || bookingInteractionEventReplaySubject.hasCompleted()) { + bookingInteractionEventReplaySubject = ReplaySubject.createWithSize(1); + bookingInteractionEventObservable = bookingInteractionEventReplaySubject.asObservable(); + return bookingInteractionEventReplaySubject; + }else { + return bookingInteractionEventReplaySubject; + } + } + + /** + * Can be used to request a Screen change to the Booking Interaction Screen, will also fire an event on the paired + * Replay Subject. This subject is intended to be used by MainActivity whereas + * getBookingInteractionEventReplaySubject is to be used why the BookingInteraction Fragment itself to + * monitor its own states + * @see BookingInteractionScreenLoadEvent + * @return + */ + public PublishSubject getBookingInteractionScreenLoadEventPublishSubject() { + if(bookingInteractionScreenLoadEventPublishSubject == null || + bookingInteractionScreenLoadEventPublishSubject.hasCompleted()) { + + bookingInteractionScreenLoadEventPublishSubject = PublishSubject.create(); + bookingInteractionScreenLoadEventObservable = bookingInteractionScreenLoadEventPublishSubject.asObservable(); + _bindScreenLoadEventToBookingEvent(bookingInteractionScreenLoadEventObservable); + + return bookingInteractionScreenLoadEventPublishSubject; + }else { + return bookingInteractionScreenLoadEventPublishSubject; + } + } + + /** + * Bind the screen load event to fire the same event to the replay subject so when the + * Booking Interaction screen is loaded, it shows something right away + * @param s + */ + private void _bindScreenLoadEventToBookingEvent(Observable s) { + s.subscribe(new Action1() { + @Override + public void call(BookingInteractionScreenLoadEvent b) { + getBookingInteractionEventReplaySubject() + .onNext(new BookingInteractionEvent(b.timeCellInQuestion, b.type)); + } + }); + } + + /** + * Can be used to monitor any requests to show the Booking Interaction Fragment + * @return + */ + public Observable getBookingInteractionScreenLoadEventObservable() { + getBookingInteractionScreenLoadEventPublishSubject(); + return bookingInteractionScreenLoadEventObservable; + } + + /** + * Like the get version of Booking Interaction Event but returns an observable instead of a subject + * @see BookingInteractionEvent + * @return + */ + public Observable getBookingInteractionEventObservable() { + getBookingInteractionEventReplaySubject(); //Sets up all the references before we return to ensure its created + return bookingInteractionEventObservable; + } } diff --git a/app/src/main/java/com/objectivetruth/uoitlibrarybooking/data/models/bookinginteractionmodel/BookingInteractionEvent.java b/app/src/main/java/com/objectivetruth/uoitlibrarybooking/data/models/bookinginteractionmodel/BookingInteractionEvent.java new file mode 100644 index 0000000..33e4a2a --- /dev/null +++ b/app/src/main/java/com/objectivetruth/uoitlibrarybooking/data/models/bookinginteractionmodel/BookingInteractionEvent.java @@ -0,0 +1,13 @@ +package com.objectivetruth.uoitlibrarybooking.data.models.bookinginteractionmodel; + +import com.objectivetruth.uoitlibrarybooking.data.models.calendarmodel.TimeCell; + +public class BookingInteractionEvent { + public TimeCell timeCell; + public BookingInteractionEventType type; + + public BookingInteractionEvent(TimeCell timeCell, BookingInteractionEventType type) { + this.timeCell = timeCell; + this.type = type; + } +} diff --git a/app/src/main/java/com/objectivetruth/uoitlibrarybooking/data/models/bookinginteractionmodel/BookingInteractionEventType.java b/app/src/main/java/com/objectivetruth/uoitlibrarybooking/data/models/bookinginteractionmodel/BookingInteractionEventType.java new file mode 100644 index 0000000..36cb19a --- /dev/null +++ b/app/src/main/java/com/objectivetruth/uoitlibrarybooking/data/models/bookinginteractionmodel/BookingInteractionEventType.java @@ -0,0 +1,16 @@ +package com.objectivetruth.uoitlibrarybooking.data.models.bookinginteractionmodel; + +/** + * Types of events that can fire from the booking interaction section of the app + */ +public enum BookingInteractionEventType { + /** + * When a booking interaction flow is in progress (they're choosing their room name/code, etc) + */ + IN_PROGRESS, + + /** + * When an interaction flow succeeds + */ + SUCCESS +} diff --git a/app/src/main/java/com/objectivetruth/uoitlibrarybooking/data/models/bookinginteractionmodel/BookingInteractionScreenLoadEvent.java b/app/src/main/java/com/objectivetruth/uoitlibrarybooking/data/models/bookinginteractionmodel/BookingInteractionScreenLoadEvent.java new file mode 100644 index 0000000..4056a1c --- /dev/null +++ b/app/src/main/java/com/objectivetruth/uoitlibrarybooking/data/models/bookinginteractionmodel/BookingInteractionScreenLoadEvent.java @@ -0,0 +1,13 @@ +package com.objectivetruth.uoitlibrarybooking.data.models.bookinginteractionmodel; + +import com.objectivetruth.uoitlibrarybooking.data.models.calendarmodel.TimeCell; + +public class BookingInteractionScreenLoadEvent { + public TimeCell timeCellInQuestion; + public BookingInteractionEventType type; + + public BookingInteractionScreenLoadEvent(TimeCell timeCellInQuestion, BookingInteractionEventType type) { + this.timeCellInQuestion = timeCellInQuestion; + this.type = type; + } +} diff --git a/app/src/main/java/com/objectivetruth/uoitlibrarybooking/userinterface/BookingInteraction/BookingInteraction.java b/app/src/main/java/com/objectivetruth/uoitlibrarybooking/userinterface/BookingInteraction/BookingInteraction.java index 88f76f9..210b373 100644 --- a/app/src/main/java/com/objectivetruth/uoitlibrarybooking/userinterface/BookingInteraction/BookingInteraction.java +++ b/app/src/main/java/com/objectivetruth/uoitlibrarybooking/userinterface/BookingInteraction/BookingInteraction.java @@ -10,12 +10,19 @@ import android.view.ViewGroup; import com.objectivetruth.uoitlibrarybooking.MainActivity; import com.objectivetruth.uoitlibrarybooking.R; -import com.objectivetruth.uoitlibrarybooking.data.models.calendarmodel.TimeCell; +import com.objectivetruth.uoitlibrarybooking.app.UOITLibraryBookingApp; +import com.objectivetruth.uoitlibrarybooking.data.models.BookingInteractionModel; +import com.objectivetruth.uoitlibrarybooking.data.models.bookinginteractionmodel.BookingInteractionEvent; +import rx.Observable; +import rx.Subscription; +import rx.functions.Action1; + +import javax.inject.Inject; public class BookingInteraction extends Fragment { private static final String BOOKING_INTERACTION_TITLE = "Booking"; - private static final String TIME_CELL_BUNDLE_KEY = "TIME_CELL_BUNDLE_KEY"; - private TimeCell timeCell; + private Subscription bookingInteractionEventSubscription; + @Inject BookingInteractionModel bookingInteractionModel; @Nullable @Override @@ -32,20 +39,32 @@ public View onCreateView(LayoutInflater inflater, public void onStart() { super.onStart(); ((MainActivity) getActivity()).setDrawerState(false); - _setupViewBindings(timeCell); + _setupViewBindings(bookingInteractionModel.getBookingInteractionEventObservable()); } @Override public void onStop() { ((MainActivity) getActivity()).setDrawerState(true); + _tearDownViewBindings(bookingInteractionEventSubscription); super.onStop(); } - private void _setupViewBindings(TimeCell timeCell) { - getChildFragmentManager() - .beginTransaction() - .add(R.id.bookinginteraction_content_frame, Book.newInstance(timeCell)) - .commit(); + private void _setupViewBindings(Observable bookingInteractionEventObservable) { + bookingInteractionEventSubscription = bookingInteractionEventObservable + .subscribe(new Action1() { + @Override + public void call(BookingInteractionEvent bookingInteractionEvent) { + getChildFragmentManager() + .beginTransaction() + .replace(R.id.bookinginteraction_content_frame, + Book.newInstance(bookingInteractionEvent.timeCell)) + .commit(); + } + }); + } + + private void _tearDownViewBindings(Subscription subscription) { + if(subscription != null) {subscription.unsubscribe();} } @Override @@ -60,29 +79,15 @@ public void onDetach() { ((MainActivity) getActivity()).setIsNonDrawerScreenShowing(false); } - public static BookingInteraction newInstance(TimeCell timeCell) { - BookingInteraction fragment = new BookingInteraction(); - fragment.timeCell = timeCell; - return fragment; + public static BookingInteraction newInstance() { + return new BookingInteraction(); } @Override public void onCreate(@Nullable Bundle savedInstanceState) { super.onCreate(savedInstanceState); + ((UOITLibraryBookingApp) getActivity().getApplication()).getComponent().inject(this); setHasOptionsMenu(true); - if(savedInstanceState != null) { - _loadPreviousStateIfAvailable(savedInstanceState); - } - } - - @Override - public void onSaveInstanceState(Bundle outState) { - super.onSaveInstanceState(outState); - outState.putParcelable(TIME_CELL_BUNDLE_KEY, timeCell); - } - - private void _loadPreviousStateIfAvailable(Bundle inState) { - timeCell = inState.getParcelable(TIME_CELL_BUNDLE_KEY); } private void _setTitle(String title) { diff --git a/app/src/main/java/com/objectivetruth/uoitlibrarybooking/userinterface/calendar/grid/common/GridAdapter.java b/app/src/main/java/com/objectivetruth/uoitlibrarybooking/userinterface/calendar/grid/common/GridAdapter.java index 4328300..20fb1b2 100644 --- a/app/src/main/java/com/objectivetruth/uoitlibrarybooking/userinterface/calendar/grid/common/GridAdapter.java +++ b/app/src/main/java/com/objectivetruth/uoitlibrarybooking/userinterface/calendar/grid/common/GridAdapter.java @@ -1,16 +1,21 @@ package com.objectivetruth.uoitlibrarybooking.userinterface.calendar.grid.common; +import android.content.Context; import android.support.annotation.Nullable; import android.view.View; import android.view.ViewGroup; import android.widget.TextView; -import com.objectivetruth.uoitlibrarybooking.MainActivity; import com.objectivetruth.uoitlibrarybooking.R; +import com.objectivetruth.uoitlibrarybooking.app.UOITLibraryBookingApp; +import com.objectivetruth.uoitlibrarybooking.data.models.BookingInteractionModel; +import com.objectivetruth.uoitlibrarybooking.data.models.bookinginteractionmodel.BookingInteractionEventType; +import com.objectivetruth.uoitlibrarybooking.data.models.bookinginteractionmodel.BookingInteractionScreenLoadEvent; import com.objectivetruth.uoitlibrarybooking.data.models.calendarmodel.CalendarDay; import com.objectivetruth.uoitlibrarybooking.data.models.calendarmodel.TimeCell; import com.objectivetruth.uoitlibrarybooking.userinterface.calendar.grid.tablefixheaders.FixedTableAdapter; import timber.log.Timber; +import javax.inject.Inject; import java.util.Random; import static com.objectivetruth.uoitlibrarybooking.data.models.calendarmodel.TimeCellType.BOOKING_CONFIRMED; @@ -19,13 +24,13 @@ public class GridAdapter extends FixedTableAdapter { private int _width_of_cell_in_pixels; private int _height_of_cell_in_pixels; private CalendarDay calendarDay; - private MainActivity mainActivity; + @Inject BookingInteractionModel bookingInteractionModel; - public GridAdapter(MainActivity mainActivity, CalendarDay calendarDay) { - super(mainActivity); - this.mainActivity = mainActivity; - _width_of_cell_in_pixels = mainActivity.getResources().getDimensionPixelSize(R.dimen.table_width); - _height_of_cell_in_pixels = mainActivity.getResources().getDimensionPixelSize(R.dimen.table_height); + public GridAdapter(Context context, CalendarDay calendarDay) { + super(context); + ((UOITLibraryBookingApp) context.getApplicationContext()).getComponent().inject(this); + _width_of_cell_in_pixels = context.getResources().getDimensionPixelSize(R.dimen.table_width); + _height_of_cell_in_pixels = context.getResources().getDimensionPixelSize(R.dimen.table_height); this.calendarDay = calendarDay; } @@ -101,7 +106,7 @@ public View getView(int row, int column, View recycleView, ViewGroup parent) { calendarDay.timeCells.get(_convertRowAndColumnToTimeCellIndex(row, column)); holder.textViewOnly.setOnClickListener(new TimeCellOnClickListener(currentTimeCellForThisViewCall, - mainActivity)); + bookingInteractionModel)); switch(currentTimeCellForThisViewCall.timeCellType) { case TABLE_COLUMN_HEADER: @@ -191,17 +196,18 @@ private boolean _isTopLeftCell(int row, int column) { private static class TimeCellOnClickListener implements View.OnClickListener { private TimeCell timeCell; - MainActivity mainActivity; + BookingInteractionModel bookingInteractionModel; - TimeCellOnClickListener(TimeCell timeCell, MainActivity mainActivity) { + TimeCellOnClickListener(TimeCell timeCell, BookingInteractionModel bookingInteractionModel) { this.timeCell = timeCell; - this.mainActivity = mainActivity; + this.bookingInteractionModel = bookingInteractionModel; } @Override public void onClick(View view) { - Timber.i("Clicked: " + timeCell.param_get_link); - mainActivity.getMainActivityRouterPublishSubject().onNext(timeCell); + Timber.i("Clicked: " + timeCell.toString()); + bookingInteractionModel.getBookingInteractionScreenLoadEventPublishSubject().onNext( + new BookingInteractionScreenLoadEvent(timeCell, BookingInteractionEventType.IN_PROGRESS)); } } } From a4e798a2e55b7b7d6afd7025621c39776380d2c2 Mon Sep 17 00:00:00 2001 From: ObjectiveTruth Date: Fri, 19 Aug 2016 22:47:03 -0400 Subject: [PATCH 13/53] Proper handling of various bookign events Also added more information to display on the interaction event screen --- app/build.gradle | 4 +- .../data/models/BookingInteractionModel.java | 14 +++-- .../BookingInteractionScreenLoadEvent.java | 9 ++-- .../BookinginteractionEventWithDateInfo.java | 15 ++++++ .../BookingInteraction/Book.java | 21 ++++++-- .../BookingInteraction.java | 54 +++++++++++++++---- .../calendar/grid/common/GridAdapter.java | 10 ++-- 7 files changed, 99 insertions(+), 28 deletions(-) create mode 100644 app/src/main/java/com/objectivetruth/uoitlibrarybooking/data/models/bookinginteractionmodel/BookinginteractionEventWithDateInfo.java diff --git a/app/build.gradle b/app/build.gradle index 322f05d..67905f5 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -14,11 +14,11 @@ buildscript { } dependencies { // Main Android gradle plugin allows building of the entire play toolchain - classpath 'com.android.tools.build:gradle:2.2.0-beta1' + classpath 'com.android.tools.build:gradle:2.2.0-beta2' // Fabric repository for Crashlytics. classpath 'io.fabric.tools:gradle:1.+' // Adds tasks to auto publish apks to Google App Store. https://github.com/Triple-T/gradle-play-publisher - classpath 'com.github.triplet.gradle:play-publisher:1.1.4' + classpath 'com.github.triplet.gradle:play-publisher:1.1.5' // Spoon is a fantastic testing hardness for logging tests easily classpath 'com.stanfy.spoon:spoon-gradle-plugin:1.2.0' // Prints the dexcount when making new apks, useful for keeping under the 65k limit diff --git a/app/src/main/java/com/objectivetruth/uoitlibrarybooking/data/models/BookingInteractionModel.java b/app/src/main/java/com/objectivetruth/uoitlibrarybooking/data/models/BookingInteractionModel.java index 8de2a37..c263864 100644 --- a/app/src/main/java/com/objectivetruth/uoitlibrarybooking/data/models/BookingInteractionModel.java +++ b/app/src/main/java/com/objectivetruth/uoitlibrarybooking/data/models/BookingInteractionModel.java @@ -4,6 +4,7 @@ import com.objectivetruth.uoitlibrarybooking.data.models.bookinginteractionmodel.BookingInteractionEvent; import com.objectivetruth.uoitlibrarybooking.data.models.bookinginteractionmodel.BookingInteractionScreenLoadEvent; import com.objectivetruth.uoitlibrarybooking.data.models.bookinginteractionmodel.BookingInteractionWebService; +import com.objectivetruth.uoitlibrarybooking.data.models.bookinginteractionmodel.BookinginteractionEventWithDateInfo; import rx.Observable; import rx.functions.Action1; import rx.subjects.PublishSubject; @@ -14,8 +15,8 @@ public class BookingInteractionModel { @Inject BookingInteractionWebService bookingInteractionWebService; - private ReplaySubject bookingInteractionEventReplaySubject; - private Observable bookingInteractionEventObservable; + private ReplaySubject bookingInteractionEventReplaySubject; + private Observable bookingInteractionEventObservable; private PublishSubject bookingInteractionScreenLoadEventPublishSubject; private Observable bookingInteractionScreenLoadEventObservable; @@ -30,7 +31,7 @@ public BookingInteractionModel(UOITLibraryBookingApp mApplication, * @see BookingInteractionEvent * @return */ - public ReplaySubject getBookingInteractionEventReplaySubject() { + public ReplaySubject getBookingInteractionEventReplaySubject() { if(bookingInteractionEventReplaySubject == null || bookingInteractionEventReplaySubject.hasCompleted()) { bookingInteractionEventReplaySubject = ReplaySubject.createWithSize(1); bookingInteractionEventObservable = bookingInteractionEventReplaySubject.asObservable(); @@ -72,7 +73,10 @@ private void _bindScreenLoadEventToBookingEvent(Observable getBookingInteractionScreen * @see BookingInteractionEvent * @return */ - public Observable getBookingInteractionEventObservable() { + public Observable getBookingInteractionEventObservable() { getBookingInteractionEventReplaySubject(); //Sets up all the references before we return to ensure its created return bookingInteractionEventObservable; } diff --git a/app/src/main/java/com/objectivetruth/uoitlibrarybooking/data/models/bookinginteractionmodel/BookingInteractionScreenLoadEvent.java b/app/src/main/java/com/objectivetruth/uoitlibrarybooking/data/models/bookinginteractionmodel/BookingInteractionScreenLoadEvent.java index 4056a1c..d4a6a91 100644 --- a/app/src/main/java/com/objectivetruth/uoitlibrarybooking/data/models/bookinginteractionmodel/BookingInteractionScreenLoadEvent.java +++ b/app/src/main/java/com/objectivetruth/uoitlibrarybooking/data/models/bookinginteractionmodel/BookingInteractionScreenLoadEvent.java @@ -2,12 +2,9 @@ import com.objectivetruth.uoitlibrarybooking.data.models.calendarmodel.TimeCell; -public class BookingInteractionScreenLoadEvent { - public TimeCell timeCellInQuestion; - public BookingInteractionEventType type; +public class BookingInteractionScreenLoadEvent extends BookinginteractionEventWithDateInfo{ - public BookingInteractionScreenLoadEvent(TimeCell timeCellInQuestion, BookingInteractionEventType type) { - this.timeCellInQuestion = timeCellInQuestion; - this.type = type; + public BookingInteractionScreenLoadEvent(TimeCell timeCell, BookingInteractionEventType type, String dayOfMonthNumber, String monthWord) { + super(timeCell, type, dayOfMonthNumber, monthWord); } } diff --git a/app/src/main/java/com/objectivetruth/uoitlibrarybooking/data/models/bookinginteractionmodel/BookinginteractionEventWithDateInfo.java b/app/src/main/java/com/objectivetruth/uoitlibrarybooking/data/models/bookinginteractionmodel/BookinginteractionEventWithDateInfo.java new file mode 100644 index 0000000..2e804e8 --- /dev/null +++ b/app/src/main/java/com/objectivetruth/uoitlibrarybooking/data/models/bookinginteractionmodel/BookinginteractionEventWithDateInfo.java @@ -0,0 +1,15 @@ +package com.objectivetruth.uoitlibrarybooking.data.models.bookinginteractionmodel; + +import com.objectivetruth.uoitlibrarybooking.data.models.calendarmodel.TimeCell; + +public class BookinginteractionEventWithDateInfo extends BookingInteractionEvent{ + public String dayOfMonthNumber; + public String monthWord; + + public BookinginteractionEventWithDateInfo(TimeCell timeCell, BookingInteractionEventType type, + String dayOfMonthNumber, String monthWord) { + super(timeCell, type); + this.dayOfMonthNumber = dayOfMonthNumber; + this.monthWord = monthWord; + } +} diff --git a/app/src/main/java/com/objectivetruth/uoitlibrarybooking/userinterface/BookingInteraction/Book.java b/app/src/main/java/com/objectivetruth/uoitlibrarybooking/userinterface/BookingInteraction/Book.java index ba6dc1b..6a45f3d 100644 --- a/app/src/main/java/com/objectivetruth/uoitlibrarybooking/userinterface/BookingInteraction/Book.java +++ b/app/src/main/java/com/objectivetruth/uoitlibrarybooking/userinterface/BookingInteraction/Book.java @@ -8,11 +8,16 @@ import android.view.ViewGroup; import android.widget.*; import com.objectivetruth.uoitlibrarybooking.R; +import com.objectivetruth.uoitlibrarybooking.data.models.bookinginteractionmodel.BookinginteractionEventWithDateInfo; import com.objectivetruth.uoitlibrarybooking.data.models.calendarmodel.TimeCell; public class Book extends Fragment{ private TimeCell timeCell; + private String monthWord = ""; + private String dayOfMonthNumber = ""; private static final String TIME_CELL_BUNDLE_KEY = "TIME_CELL_BUNDLE_KEY"; + private static final String MONTH_WORD_BUNDLE_KEY = "MONTH_WORD_BUNDLE_KEY"; + private static final String DAY_OF_MONTH_NUMBER_BUNDLE_KEY = "DAY_OF_MONTH_NUMBER_BUNDLE_KEY"; @Nullable @Override @@ -25,7 +30,7 @@ public View onCreateView(LayoutInflater inflater, if(roomNumberTextView != null) {roomNumberTextView.setText(timeCell.param_room.toUpperCase());} TextView dateField = (TextView) view.findViewById(R.id.book_date_actual); - if(dateField != null) {dateField.setText(timeCell.param_starttime);} + if(dateField != null) {dateField.setText(_getFormattedDateString());} TextView errorTextView = (TextView) view.findViewById(R.id.book_error_message_actual); @@ -44,9 +49,11 @@ public View onCreateView(LayoutInflater inflater, return view; } - static public Book newInstance(TimeCell timeCell) { + static public Book newInstance(BookinginteractionEventWithDateInfo bookinginteractionEventWithDateInfo) { Book fragment = new Book(); - fragment.timeCell = timeCell; + fragment.timeCell = bookinginteractionEventWithDateInfo.timeCell; + fragment.monthWord = bookinginteractionEventWithDateInfo.monthWord; + fragment.dayOfMonthNumber = bookinginteractionEventWithDateInfo.dayOfMonthNumber; return fragment; } @@ -59,8 +66,14 @@ public void onCreate(@Nullable Bundle savedInstanceState) { } } + private String _getFormattedDateString() { + return dayOfMonthNumber + ", " + monthWord + " @ " + timeCell.param_starttime; + } + private void _loadPreviousStateIfAvailable(Bundle inState) { timeCell = inState.getParcelable(TIME_CELL_BUNDLE_KEY); + monthWord = inState.getString(MONTH_WORD_BUNDLE_KEY); + dayOfMonthNumber = inState.getString(DAY_OF_MONTH_NUMBER_BUNDLE_KEY); } private void _setupDurationSpinner(Spinner durationSpinner) { @@ -87,5 +100,7 @@ public void onNothingSelected(AdapterView adapter) { } public void onSaveInstanceState(Bundle outState) { super.onSaveInstanceState(outState); outState.putParcelable(TIME_CELL_BUNDLE_KEY, timeCell); + outState.putString(DAY_OF_MONTH_NUMBER_BUNDLE_KEY, dayOfMonthNumber); + outState.putString(MONTH_WORD_BUNDLE_KEY, monthWord); } } diff --git a/app/src/main/java/com/objectivetruth/uoitlibrarybooking/userinterface/BookingInteraction/BookingInteraction.java b/app/src/main/java/com/objectivetruth/uoitlibrarybooking/userinterface/BookingInteraction/BookingInteraction.java index 210b373..e0ce64b 100644 --- a/app/src/main/java/com/objectivetruth/uoitlibrarybooking/userinterface/BookingInteraction/BookingInteraction.java +++ b/app/src/main/java/com/objectivetruth/uoitlibrarybooking/userinterface/BookingInteraction/BookingInteraction.java @@ -8,14 +8,16 @@ import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; +import android.widget.Toast; import com.objectivetruth.uoitlibrarybooking.MainActivity; import com.objectivetruth.uoitlibrarybooking.R; import com.objectivetruth.uoitlibrarybooking.app.UOITLibraryBookingApp; import com.objectivetruth.uoitlibrarybooking.data.models.BookingInteractionModel; -import com.objectivetruth.uoitlibrarybooking.data.models.bookinginteractionmodel.BookingInteractionEvent; +import com.objectivetruth.uoitlibrarybooking.data.models.bookinginteractionmodel.BookinginteractionEventWithDateInfo; import rx.Observable; import rx.Subscription; import rx.functions.Action1; +import timber.log.Timber; import javax.inject.Inject; @@ -49,20 +51,54 @@ public void onStop() { super.onStop(); } - private void _setupViewBindings(Observable bookingInteractionEventObservable) { + private void _setupViewBindings(Observable bookingInteractionEventObservable) { bookingInteractionEventSubscription = bookingInteractionEventObservable - .subscribe(new Action1() { + .subscribe(new Action1() { @Override - public void call(BookingInteractionEvent bookingInteractionEvent) { - getChildFragmentManager() - .beginTransaction() - .replace(R.id.bookinginteraction_content_frame, - Book.newInstance(bookingInteractionEvent.timeCell)) - .commit(); + public void call(BookinginteractionEventWithDateInfo bookingInteractionEvent) { + _replaceContentFrameWithFragmentBasedOnEvent(bookingInteractionEvent); } }); } + private void _replaceContentFrameWithFragmentBasedOnEvent( + BookinginteractionEventWithDateInfo bookingInteractionEvent) { + Fragment currentFragmentInContentFrame = getChildFragmentManager() + .findFragmentById(R.id.bookinginteraction_content_frame); + + if(_doesCurrentContentFrameNeedToBeChanged(bookingInteractionEvent, currentFragmentInContentFrame)) { + getChildFragmentManager() + .beginTransaction() + .replace(R.id.bookinginteraction_content_frame, + Book.newInstance(bookingInteractionEvent)) + .commit(); + } + } + + /** + * Checks whether the content frame shoudld be updated. For example, if its empty, or doesn't contain the correct + * fragment for the currently requested BookingEvent + * @param bookingInteractionEvent + * @param currentFragmentInContentFrame + * @return + */ + private boolean _doesCurrentContentFrameNeedToBeChanged(BookinginteractionEventWithDateInfo bookingInteractionEvent, + Fragment currentFragmentInContentFrame) { + if(currentFragmentInContentFrame == null) {return true;} + + switch(bookingInteractionEvent.timeCell.param_next) { + case "book.aspx": + return !(currentFragmentInContentFrame instanceof Book); + default: + Toast.makeText(getActivity(), R.string.ERROR_GENERAL, Toast.LENGTH_LONG).show(); + Timber.w("Tried to load a bookinginteractionevent, but it didn't contain any expected " + + "values in the param_next field: " + bookingInteractionEvent.timeCell.toString()); + // Remove the BookingInteraction Fragment. Undoes the booking interaction fragment loading + getActivity().getSupportFragmentManager().popBackStack(); + return false; + } + } + private void _tearDownViewBindings(Subscription subscription) { if(subscription != null) {subscription.unsubscribe();} } diff --git a/app/src/main/java/com/objectivetruth/uoitlibrarybooking/userinterface/calendar/grid/common/GridAdapter.java b/app/src/main/java/com/objectivetruth/uoitlibrarybooking/userinterface/calendar/grid/common/GridAdapter.java index 20fb1b2..b4f7a19 100644 --- a/app/src/main/java/com/objectivetruth/uoitlibrarybooking/userinterface/calendar/grid/common/GridAdapter.java +++ b/app/src/main/java/com/objectivetruth/uoitlibrarybooking/userinterface/calendar/grid/common/GridAdapter.java @@ -106,7 +106,7 @@ public View getView(int row, int column, View recycleView, ViewGroup parent) { calendarDay.timeCells.get(_convertRowAndColumnToTimeCellIndex(row, column)); holder.textViewOnly.setOnClickListener(new TimeCellOnClickListener(currentTimeCellForThisViewCall, - bookingInteractionModel)); + bookingInteractionModel, calendarDay)); switch(currentTimeCellForThisViewCall.timeCellType) { case TABLE_COLUMN_HEADER: @@ -196,18 +196,22 @@ private boolean _isTopLeftCell(int row, int column) { private static class TimeCellOnClickListener implements View.OnClickListener { private TimeCell timeCell; + private CalendarDay calendarDay; BookingInteractionModel bookingInteractionModel; - TimeCellOnClickListener(TimeCell timeCell, BookingInteractionModel bookingInteractionModel) { + TimeCellOnClickListener(TimeCell timeCell, BookingInteractionModel bookingInteractionModel, + CalendarDay calendarDay) { this.timeCell = timeCell; this.bookingInteractionModel = bookingInteractionModel; + this.calendarDay = calendarDay; } @Override public void onClick(View view) { Timber.i("Clicked: " + timeCell.toString()); bookingInteractionModel.getBookingInteractionScreenLoadEventPublishSubject().onNext( - new BookingInteractionScreenLoadEvent(timeCell, BookingInteractionEventType.IN_PROGRESS)); + new BookingInteractionScreenLoadEvent(timeCell, BookingInteractionEventType.IN_PROGRESS, + calendarDay.extDayOfMonthNumber, calendarDay.extMonthWord)); } } } From a29cb07a7cc17099a876bb19266dba9773703428 Mon Sep 17 00:00:00 2001 From: ObjectiveTruth Date: Fri, 19 Aug 2016 23:16:45 -0400 Subject: [PATCH 14/53] Added success screen to booking Interaction --- .../ActivityRoomInteraction.java | 4 +- .../uoitlibrarybooking/app/AppComponent.java | 2 + .../BookingInteractionEventType.java | 16 +++- .../BookingInteraction/Book.java | 26 ++++- .../BookingInteraction.java | 6 +- .../BookingInteraction/Success.java | 21 ++++ .../calendar/grid/common/GridAdapter.java | 12 ++- .../res/layout/bookinginteraction_book.xml | 6 +- .../res/layout/bookinginteraction_success.xml | 84 ++++++++++++++++ .../res/layout/interaction_book_success.xml | 95 ------------------- 10 files changed, 164 insertions(+), 108 deletions(-) create mode 100644 app/src/main/java/com/objectivetruth/uoitlibrarybooking/userinterface/BookingInteraction/Success.java create mode 100644 app/src/main/res/layout/bookinginteraction_success.xml delete mode 100644 app/src/main/res/layout/interaction_book_success.xml diff --git a/app/src/main/java/com/objectivetruth/uoitlibrarybooking/ActivityRoomInteraction.java b/app/src/main/java/com/objectivetruth/uoitlibrarybooking/ActivityRoomInteraction.java index bbd8c3b..bfc9372 100644 --- a/app/src/main/java/com/objectivetruth/uoitlibrarybooking/ActivityRoomInteraction.java +++ b/app/src/main/java/com/objectivetruth/uoitlibrarybooking/ActivityRoomInteraction.java @@ -145,7 +145,7 @@ else if(bundleExtras.getString("type").equalsIgnoreCase("createbooking")){ groupNameEditText = (EditText) findViewById(R.id.book_group_name_actual); ImageButton commentImageButton = (ImageButton) findViewById(R.id.comment_button); groupCodeEditText = (EditText) findViewById(R.id.book_group_code_actual); - titleButton = (Button) findViewById(R.id.book_room_number_actual); + titleButton = (Button) findViewById(R.id.bookingInteraction_book_create_button); ImageButton groupCodeInfoImageButton = (ImageButton) findViewById(R.id.info_group_code); //titleButton.setTextColor(getResources().getColor(R.color.disabled_button_text)); ImageView roomPicture = (ImageView) findViewById(R.id.room_landing_room_picture); @@ -687,7 +687,7 @@ public void InteractionSuccess(final String returnMessage, final boolean isCalen Button addToCalendarButton; Button okButton; firstHiddenFunny = false; - setContentView(R.layout.interaction_book_success); + setContentView(R.layout.bookinginteraction_success); final ImageView qrCodeActual = (ImageView) findViewById(R.id.qractual); final TextView successMessage = (TextView) findViewById(R.id.book_success_actual); diff --git a/app/src/main/java/com/objectivetruth/uoitlibrarybooking/app/AppComponent.java b/app/src/main/java/com/objectivetruth/uoitlibrarybooking/app/AppComponent.java index c07e9bd..d0a060b 100644 --- a/app/src/main/java/com/objectivetruth/uoitlibrarybooking/app/AppComponent.java +++ b/app/src/main/java/com/objectivetruth/uoitlibrarybooking/app/AppComponent.java @@ -6,6 +6,7 @@ import com.objectivetruth.uoitlibrarybooking.data.models.bookinginteractionmodel.BookingInteractionWebService; import com.objectivetruth.uoitlibrarybooking.data.models.calendarmodel.CalendarWebService; import com.objectivetruth.uoitlibrarybooking.data.models.usermodel.UserWebService; +import com.objectivetruth.uoitlibrarybooking.userinterface.BookingInteraction.Book; import com.objectivetruth.uoitlibrarybooking.userinterface.BookingInteraction.BookingInteraction; import com.objectivetruth.uoitlibrarybooking.userinterface.calendar.Calendar; import com.objectivetruth.uoitlibrarybooking.userinterface.calendar.grid.Grid; @@ -32,5 +33,6 @@ public interface AppComponent { void inject(CalendarWebService calendarWebService); void inject(MyAccountLoaded myAccountLoaded); void inject(GridAdapter gridAdapter); + void inject(Book book); void inject(Grid grid); } diff --git a/app/src/main/java/com/objectivetruth/uoitlibrarybooking/data/models/bookinginteractionmodel/BookingInteractionEventType.java b/app/src/main/java/com/objectivetruth/uoitlibrarybooking/data/models/bookinginteractionmodel/BookingInteractionEventType.java index 36cb19a..e012adc 100644 --- a/app/src/main/java/com/objectivetruth/uoitlibrarybooking/data/models/bookinginteractionmodel/BookingInteractionEventType.java +++ b/app/src/main/java/com/objectivetruth/uoitlibrarybooking/data/models/bookinginteractionmodel/BookingInteractionEventType.java @@ -5,12 +5,22 @@ */ public enum BookingInteractionEventType { /** - * When a booking interaction flow is in progress (they're choosing their room name/code, etc) + * When Booking is requested */ - IN_PROGRESS, + BOOK, + + /** + * When the user clicks on a booking that is being competed for + */ + JOIN_OR_LEAVE, /** * When an interaction flow succeeds */ - SUCCESS + SUCCESS, + + /** + * Incase a cell contains unknown information, should error gracefully if this happens + */ + UNKNOWN } diff --git a/app/src/main/java/com/objectivetruth/uoitlibrarybooking/userinterface/BookingInteraction/Book.java b/app/src/main/java/com/objectivetruth/uoitlibrarybooking/userinterface/BookingInteraction/Book.java index 6a45f3d..de9df49 100644 --- a/app/src/main/java/com/objectivetruth/uoitlibrarybooking/userinterface/BookingInteraction/Book.java +++ b/app/src/main/java/com/objectivetruth/uoitlibrarybooking/userinterface/BookingInteraction/Book.java @@ -8,9 +8,14 @@ import android.view.ViewGroup; import android.widget.*; import com.objectivetruth.uoitlibrarybooking.R; +import com.objectivetruth.uoitlibrarybooking.app.UOITLibraryBookingApp; +import com.objectivetruth.uoitlibrarybooking.data.models.BookingInteractionModel; +import com.objectivetruth.uoitlibrarybooking.data.models.bookinginteractionmodel.BookingInteractionEventType; import com.objectivetruth.uoitlibrarybooking.data.models.bookinginteractionmodel.BookinginteractionEventWithDateInfo; import com.objectivetruth.uoitlibrarybooking.data.models.calendarmodel.TimeCell; +import javax.inject.Inject; + public class Book extends Fragment{ private TimeCell timeCell; private String monthWord = ""; @@ -18,6 +23,7 @@ public class Book extends Fragment{ private static final String TIME_CELL_BUNDLE_KEY = "TIME_CELL_BUNDLE_KEY"; private static final String MONTH_WORD_BUNDLE_KEY = "MONTH_WORD_BUNDLE_KEY"; private static final String DAY_OF_MONTH_NUMBER_BUNDLE_KEY = "DAY_OF_MONTH_NUMBER_BUNDLE_KEY"; + @Inject BookingInteractionModel bookingInteractionModel; @Nullable @Override @@ -40,7 +46,8 @@ public View onCreateView(LayoutInflater inflater, EditText groupCodeEditText = (EditText) view.findViewById(R.id.book_group_code_actual); - Button titleButton = (Button) view.findViewById(R.id.book_room_number_actual); + Button createButton = (Button) view.findViewById(R.id.bookingInteraction_book_create_button); + _setupCreateButton(createButton); ImageButton groupCodeInfoImageButton = (ImageButton) view.findViewById(R.id.info_group_code); @@ -60,12 +67,27 @@ static public Book newInstance(BookinginteractionEventWithDateInfo bookingintera @Override public void onCreate(@Nullable Bundle savedInstanceState) { super.onCreate(savedInstanceState); - setHasOptionsMenu(true); + ((UOITLibraryBookingApp) getActivity().getApplication()).getComponent().inject(this); if(savedInstanceState != null) { _loadPreviousStateIfAvailable(savedInstanceState); } } + private void _setupCreateButton(Button createButton) { + if(createButton != null) { + createButton.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View view) { + bookingInteractionModel.getBookingInteractionEventReplaySubject() + .onNext(new BookinginteractionEventWithDateInfo( + timeCell, BookingInteractionEventType.SUCCESS, + dayOfMonthNumber, monthWord + )); + } + }); + } + } + private String _getFormattedDateString() { return dayOfMonthNumber + ", " + monthWord + " @ " + timeCell.param_starttime; } diff --git a/app/src/main/java/com/objectivetruth/uoitlibrarybooking/userinterface/BookingInteraction/BookingInteraction.java b/app/src/main/java/com/objectivetruth/uoitlibrarybooking/userinterface/BookingInteraction/BookingInteraction.java index e0ce64b..87ff3a8 100644 --- a/app/src/main/java/com/objectivetruth/uoitlibrarybooking/userinterface/BookingInteraction/BookingInteraction.java +++ b/app/src/main/java/com/objectivetruth/uoitlibrarybooking/userinterface/BookingInteraction/BookingInteraction.java @@ -86,9 +86,11 @@ private boolean _doesCurrentContentFrameNeedToBeChanged(BookinginteractionEventW Fragment currentFragmentInContentFrame) { if(currentFragmentInContentFrame == null) {return true;} - switch(bookingInteractionEvent.timeCell.param_next) { - case "book.aspx": + switch(bookingInteractionEvent.type) { + case BOOK: return !(currentFragmentInContentFrame instanceof Book); + case SUCCESS: + return !(currentFragmentInContentFrame instanceof Success); default: Toast.makeText(getActivity(), R.string.ERROR_GENERAL, Toast.LENGTH_LONG).show(); Timber.w("Tried to load a bookinginteractionevent, but it didn't contain any expected " + diff --git a/app/src/main/java/com/objectivetruth/uoitlibrarybooking/userinterface/BookingInteraction/Success.java b/app/src/main/java/com/objectivetruth/uoitlibrarybooking/userinterface/BookingInteraction/Success.java new file mode 100644 index 0000000..0280381 --- /dev/null +++ b/app/src/main/java/com/objectivetruth/uoitlibrarybooking/userinterface/BookingInteraction/Success.java @@ -0,0 +1,21 @@ +package com.objectivetruth.uoitlibrarybooking.userinterface.BookingInteraction; + +import android.os.Bundle; +import android.support.annotation.Nullable; +import android.support.v4.app.Fragment; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import com.objectivetruth.uoitlibrarybooking.R; + +public class Success extends Fragment{ + + @Nullable + @Override + public View onCreateView(LayoutInflater inflater, + @Nullable ViewGroup container, + @Nullable Bundle savedInstanceState) { + View view = inflater.inflate(R.layout.bookinginteraction_success, container, false); + return view; + } +} diff --git a/app/src/main/java/com/objectivetruth/uoitlibrarybooking/userinterface/calendar/grid/common/GridAdapter.java b/app/src/main/java/com/objectivetruth/uoitlibrarybooking/userinterface/calendar/grid/common/GridAdapter.java index b4f7a19..f6738d1 100644 --- a/app/src/main/java/com/objectivetruth/uoitlibrarybooking/userinterface/calendar/grid/common/GridAdapter.java +++ b/app/src/main/java/com/objectivetruth/uoitlibrarybooking/userinterface/calendar/grid/common/GridAdapter.java @@ -210,8 +210,18 @@ private static class TimeCellOnClickListener implements View.OnClickListener { public void onClick(View view) { Timber.i("Clicked: " + timeCell.toString()); bookingInteractionModel.getBookingInteractionScreenLoadEventPublishSubject().onNext( - new BookingInteractionScreenLoadEvent(timeCell, BookingInteractionEventType.IN_PROGRESS, + new BookingInteractionScreenLoadEvent(timeCell, + _getBookingInteractionEventTypeBasedOnTimeCell(timeCell), calendarDay.extDayOfMonthNumber, calendarDay.extMonthWord)); } } + + private static BookingInteractionEventType _getBookingInteractionEventTypeBasedOnTimeCell(TimeCell timeCell) { + switch(timeCell.param_next) { + case "book.aspx": + return BookingInteractionEventType.BOOK; + default: + return BookingInteractionEventType.UNKNOWN; + } + } } diff --git a/app/src/main/res/layout/bookinginteraction_book.xml b/app/src/main/res/layout/bookinginteraction_book.xml index 1d3b103..7b0012e 100644 --- a/app/src/main/res/layout/bookinginteraction_book.xml +++ b/app/src/main/res/layout/bookinginteraction_book.xml @@ -132,7 +132,7 @@ style="@style/flat_ui_button" android:layout_width="150dp" android:layout_height="wrap_content" - android:id="@+id/book_room_number_actual" + android:id="@+id/bookingInteraction_book_create_button" android:layout_below="@+id/book_spinner_duration" android:layout_alignLeft="@+id/room_landing_room_picture" android:layout_marginLeft="50dp" @@ -144,8 +144,8 @@ android:layout_width="wrap_content" android:layout_height="wrap_content" android:background="@drawable/comment_button_selector" - android:layout_alignTop="@+id/book_room_number_actual" - android:layout_toRightOf="@+id/book_room_number_actual" + android:layout_alignTop="@+id/bookingInteraction_book_create_button" + android:layout_toRightOf="@+id/bookingInteraction_book_create_button" android:layout_marginLeft="50dp" /> diff --git a/app/src/main/res/layout/bookinginteraction_success.xml b/app/src/main/res/layout/bookinginteraction_success.xml new file mode 100644 index 0000000..ca63c62 --- /dev/null +++ b/app/src/main/res/layout/bookinginteraction_success.xml @@ -0,0 +1,84 @@ + + + + + + + + + + + + + + + + + + + + + + + diff --git a/app/src/main/res/layout/interaction_book_success.xml b/app/src/main/res/layout/interaction_book_success.xml deleted file mode 100644 index 4552a48..0000000 --- a/app/src/main/res/layout/interaction_book_success.xml +++ /dev/null @@ -1,95 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file From e29445e90ef9c095d338bebc27958ea3c3e2ef38 Mon Sep 17 00:00:00 2001 From: ObjectiveTruth Date: Fri, 19 Aug 2016 23:42:51 -0400 Subject: [PATCH 15/53] Refactored old Success code Better readability and usability --- .../ActivityRoomInteraction.java | 6 ++-- .../BookingInteraction.java | 23 +++++++++++-- .../BookingInteraction/Success.java | 34 +++++++++++++++++++ .../res/layout/bookinginteraction_success.xml | 8 ++--- 4 files changed, 61 insertions(+), 10 deletions(-) diff --git a/app/src/main/java/com/objectivetruth/uoitlibrarybooking/ActivityRoomInteraction.java b/app/src/main/java/com/objectivetruth/uoitlibrarybooking/ActivityRoomInteraction.java index bfc9372..f71b7a4 100644 --- a/app/src/main/java/com/objectivetruth/uoitlibrarybooking/ActivityRoomInteraction.java +++ b/app/src/main/java/com/objectivetruth/uoitlibrarybooking/ActivityRoomInteraction.java @@ -689,11 +689,11 @@ public void InteractionSuccess(final String returnMessage, final boolean isCalen firstHiddenFunny = false; setContentView(R.layout.bookinginteraction_success); final ImageView qrCodeActual = (ImageView) findViewById(R.id.qractual); - final TextView successMessage = (TextView) findViewById(R.id.book_success_actual); + final TextView successMessage = (TextView) findViewById(R.id.bookingInteraction_success_body); - addToCalendarButton = (Button) findViewById(R.id.addtocalendarbutton); + addToCalendarButton = (Button) findViewById(R.id.bookingInteraction_success_add_to_calendar_button); //A Cancel success Event if(!isCalendarable){ addToCalendarButton.setVisibility(View.GONE); @@ -833,7 +833,7 @@ public void onClick(View v) { } }); } - okButton = (Button) findViewById(R.id.okbutton); + okButton = (Button) findViewById(R.id.bookingInteraction_success_ok_button); okButton.setOnClickListener(new OnClickListener(){ diff --git a/app/src/main/java/com/objectivetruth/uoitlibrarybooking/userinterface/BookingInteraction/BookingInteraction.java b/app/src/main/java/com/objectivetruth/uoitlibrarybooking/userinterface/BookingInteraction/BookingInteraction.java index 87ff3a8..d0d1f01 100644 --- a/app/src/main/java/com/objectivetruth/uoitlibrarybooking/userinterface/BookingInteraction/BookingInteraction.java +++ b/app/src/main/java/com/objectivetruth/uoitlibrarybooking/userinterface/BookingInteraction/BookingInteraction.java @@ -70,11 +70,22 @@ private void _replaceContentFrameWithFragmentBasedOnEvent( getChildFragmentManager() .beginTransaction() .replace(R.id.bookinginteraction_content_frame, - Book.newInstance(bookingInteractionEvent)) + _getFragmentForEvent(bookingInteractionEvent)) .commit(); } } + private Fragment _getFragmentForEvent(BookinginteractionEventWithDateInfo bookinginteractionEventWithDateInfo) { + switch(bookinginteractionEventWithDateInfo.type) { + case BOOK: + return Book.newInstance(bookinginteractionEventWithDateInfo); + case SUCCESS: + return Success.newInstance(); + default: + return Success.newInstance(); + } + } + /** * Checks whether the content frame shoudld be updated. For example, if its empty, or doesn't contain the correct * fragment for the currently requested BookingEvent @@ -95,12 +106,18 @@ private boolean _doesCurrentContentFrameNeedToBeChanged(BookinginteractionEventW Toast.makeText(getActivity(), R.string.ERROR_GENERAL, Toast.LENGTH_LONG).show(); Timber.w("Tried to load a bookinginteractionevent, but it didn't contain any expected " + "values in the param_next field: " + bookingInteractionEvent.timeCell.toString()); - // Remove the BookingInteraction Fragment. Undoes the booking interaction fragment loading - getActivity().getSupportFragmentManager().popBackStack(); + _popFragmentBackstack(); return false; } } + /** + * Remove this Fragment. Effectively undoes the booking interaction fragment loading event + */ + private void _popFragmentBackstack() { + getActivity().getSupportFragmentManager().popBackStack(); + } + private void _tearDownViewBindings(Subscription subscription) { if(subscription != null) {subscription.unsubscribe();} } diff --git a/app/src/main/java/com/objectivetruth/uoitlibrarybooking/userinterface/BookingInteraction/Success.java b/app/src/main/java/com/objectivetruth/uoitlibrarybooking/userinterface/BookingInteraction/Success.java index 0280381..3c183bb 100644 --- a/app/src/main/java/com/objectivetruth/uoitlibrarybooking/userinterface/BookingInteraction/Success.java +++ b/app/src/main/java/com/objectivetruth/uoitlibrarybooking/userinterface/BookingInteraction/Success.java @@ -6,6 +6,8 @@ import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; +import android.widget.Button; +import android.widget.TextView; import com.objectivetruth.uoitlibrarybooking.R; public class Success extends Fragment{ @@ -16,6 +18,38 @@ public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { View view = inflater.inflate(R.layout.bookinginteraction_success, container, false); + TextView body = (TextView) view.findViewById(R.id.bookingInteraction_success_body); + + TextView title = (TextView) view.findViewById(R.id.bookingInteraction_success_title); + + Button addToCalendarButton = (Button) view.findViewById(R.id.bookingInteraction_success_add_to_calendar_button); + + Button okButton = (Button) view.findViewById(R.id.bookingInteraction_success_ok_button); + _setupOkButton(okButton); + + return view; } + + public static Success newInstance() { + return new Success(); + } + + private void _setupOkButton(Button button) { + button.setOnClickListener(new View.OnClickListener(){ + + @Override + public void onClick(View arg0) { + _popFragmentBackstack(); + } + + }); + } + + /** + * Remove this Fragment. Effectively undoes the booking interaction fragment loading event + */ + private void _popFragmentBackstack() { + getActivity().getSupportFragmentManager().popBackStack(); + } } diff --git a/app/src/main/res/layout/bookinginteraction_success.xml b/app/src/main/res/layout/bookinginteraction_success.xml index ca63c62..61edcac 100644 --- a/app/src/main/res/layout/bookinginteraction_success.xml +++ b/app/src/main/res/layout/bookinginteraction_success.xml @@ -15,7 +15,7 @@ android:orientation="vertical" > Date: Sat, 20 Aug 2016 00:47:48 -0400 Subject: [PATCH 16/53] Added joinorleave case --- .../ActivityRoomInteraction.java | 2 +- .../BookingInteractionEventType.java | 2 +- .../BookingInteraction.java | 9 ++++ .../BookingInteraction/JoinOrLeave.java | 43 +++++++++++++++++++ .../BookingInteraction/Success.java | 2 + .../calendar/grid/common/GridAdapter.java | 2 + ...xml => bookinginteraction_joinorleave.xml} | 26 ----------- 7 files changed, 58 insertions(+), 28 deletions(-) create mode 100644 app/src/main/java/com/objectivetruth/uoitlibrarybooking/userinterface/BookingInteraction/JoinOrLeave.java rename app/src/main/res/layout/{interaction_joinorleave.xml => bookinginteraction_joinorleave.xml} (86%) diff --git a/app/src/main/java/com/objectivetruth/uoitlibrarybooking/ActivityRoomInteraction.java b/app/src/main/java/com/objectivetruth/uoitlibrarybooking/ActivityRoomInteraction.java index f71b7a4..78ac6c9 100644 --- a/app/src/main/java/com/objectivetruth/uoitlibrarybooking/ActivityRoomInteraction.java +++ b/app/src/main/java/com/objectivetruth/uoitlibrarybooking/ActivityRoomInteraction.java @@ -282,7 +282,7 @@ public void onNothingSelected(AdapterView adapter) { } else if(bundleExtras.getString("type").equalsIgnoreCase("joinorleave")){ Timber.i("JoinOrLeave SubRoutine Executing..."); - setContentView(R.layout.interaction_joinorleave); + setContentView(R.layout.bookinginteraction_joinorleave); TextView roomNumberTextView = (TextView) findViewById(R.id.joinorleave_room_number); TextView dateTextView = (TextView) findViewById(R.id.joinorleave_date); diff --git a/app/src/main/java/com/objectivetruth/uoitlibrarybooking/data/models/bookinginteractionmodel/BookingInteractionEventType.java b/app/src/main/java/com/objectivetruth/uoitlibrarybooking/data/models/bookinginteractionmodel/BookingInteractionEventType.java index e012adc..9e50ded 100644 --- a/app/src/main/java/com/objectivetruth/uoitlibrarybooking/data/models/bookinginteractionmodel/BookingInteractionEventType.java +++ b/app/src/main/java/com/objectivetruth/uoitlibrarybooking/data/models/bookinginteractionmodel/BookingInteractionEventType.java @@ -10,7 +10,7 @@ public enum BookingInteractionEventType { BOOK, /** - * When the user clicks on a booking that is being competed for + * When the user clicks on a booking that is being competed for, they can join it or leave */ JOIN_OR_LEAVE, diff --git a/app/src/main/java/com/objectivetruth/uoitlibrarybooking/userinterface/BookingInteraction/BookingInteraction.java b/app/src/main/java/com/objectivetruth/uoitlibrarybooking/userinterface/BookingInteraction/BookingInteraction.java index d0d1f01..802b36e 100644 --- a/app/src/main/java/com/objectivetruth/uoitlibrarybooking/userinterface/BookingInteraction/BookingInteraction.java +++ b/app/src/main/java/com/objectivetruth/uoitlibrarybooking/userinterface/BookingInteraction/BookingInteraction.java @@ -67,11 +67,15 @@ private void _replaceContentFrameWithFragmentBasedOnEvent( .findFragmentById(R.id.bookinginteraction_content_frame); if(_doesCurrentContentFrameNeedToBeChanged(bookingInteractionEvent, currentFragmentInContentFrame)) { + Timber.i("Received event request to change fragment, changing: " + bookingInteractionEvent.type); getChildFragmentManager() .beginTransaction() .replace(R.id.bookinginteraction_content_frame, _getFragmentForEvent(bookingInteractionEvent)) .commit(); + }else{ + Timber.i("Received event request to change fragment, but fragment is already in the correct state: " + + bookingInteractionEvent.type); } } @@ -81,6 +85,8 @@ private Fragment _getFragmentForEvent(BookinginteractionEventWithDateInfo bookin return Book.newInstance(bookinginteractionEventWithDateInfo); case SUCCESS: return Success.newInstance(); + case JOIN_OR_LEAVE: + return JoinOrLeave.newInstance(bookinginteractionEventWithDateInfo); default: return Success.newInstance(); } @@ -102,6 +108,8 @@ private boolean _doesCurrentContentFrameNeedToBeChanged(BookinginteractionEventW return !(currentFragmentInContentFrame instanceof Book); case SUCCESS: return !(currentFragmentInContentFrame instanceof Success); + case JOIN_OR_LEAVE: + return !(currentFragmentInContentFrame instanceof JoinOrLeave); default: Toast.makeText(getActivity(), R.string.ERROR_GENERAL, Toast.LENGTH_LONG).show(); Timber.w("Tried to load a bookinginteractionevent, but it didn't contain any expected " + @@ -115,6 +123,7 @@ private boolean _doesCurrentContentFrameNeedToBeChanged(BookinginteractionEventW * Remove this Fragment. Effectively undoes the booking interaction fragment loading event */ private void _popFragmentBackstack() { + Timber.d("Popping backstack"); getActivity().getSupportFragmentManager().popBackStack(); } diff --git a/app/src/main/java/com/objectivetruth/uoitlibrarybooking/userinterface/BookingInteraction/JoinOrLeave.java b/app/src/main/java/com/objectivetruth/uoitlibrarybooking/userinterface/BookingInteraction/JoinOrLeave.java new file mode 100644 index 0000000..3359188 --- /dev/null +++ b/app/src/main/java/com/objectivetruth/uoitlibrarybooking/userinterface/BookingInteraction/JoinOrLeave.java @@ -0,0 +1,43 @@ +package com.objectivetruth.uoitlibrarybooking.userinterface.BookingInteraction; + +import android.os.Bundle; +import android.support.annotation.Nullable; +import android.support.v4.app.Fragment; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import com.objectivetruth.uoitlibrarybooking.R; +import com.objectivetruth.uoitlibrarybooking.data.models.bookinginteractionmodel.BookinginteractionEventWithDateInfo; +import com.objectivetruth.uoitlibrarybooking.data.models.calendarmodel.TimeCell; +import timber.log.Timber; + +public class JoinOrLeave extends Fragment{ + private TimeCell timeCell; + private String monthWord = ""; + private String dayOfMonthNumber = ""; + + @Nullable + @Override + public View onCreateView(LayoutInflater inflater, + @Nullable ViewGroup container, + @Nullable Bundle savedInstanceState) { + View view = inflater.inflate(R.layout.bookinginteraction_joinorleave, container, false); + return view; + } + + public static JoinOrLeave newInstance(BookinginteractionEventWithDateInfo bookingInteractionEvent) { + JoinOrLeave fragment = new JoinOrLeave(); + fragment.timeCell = bookingInteractionEvent.timeCell; + fragment.monthWord = bookingInteractionEvent.monthWord; + fragment.dayOfMonthNumber = bookingInteractionEvent.dayOfMonthNumber; + return fragment; + } + + /** + * Remove this Fragment. Effectively undoes the booking interaction fragment loading event + */ + private void _popFragmentBackstack() { + Timber.d("Popping backstack"); + getActivity().getSupportFragmentManager().popBackStack(); + } +} diff --git a/app/src/main/java/com/objectivetruth/uoitlibrarybooking/userinterface/BookingInteraction/Success.java b/app/src/main/java/com/objectivetruth/uoitlibrarybooking/userinterface/BookingInteraction/Success.java index 3c183bb..a2c3dd3 100644 --- a/app/src/main/java/com/objectivetruth/uoitlibrarybooking/userinterface/BookingInteraction/Success.java +++ b/app/src/main/java/com/objectivetruth/uoitlibrarybooking/userinterface/BookingInteraction/Success.java @@ -9,6 +9,7 @@ import android.widget.Button; import android.widget.TextView; import com.objectivetruth.uoitlibrarybooking.R; +import timber.log.Timber; public class Success extends Fragment{ @@ -50,6 +51,7 @@ public void onClick(View arg0) { * Remove this Fragment. Effectively undoes the booking interaction fragment loading event */ private void _popFragmentBackstack() { + Timber.d("Popping backstack"); getActivity().getSupportFragmentManager().popBackStack(); } } diff --git a/app/src/main/java/com/objectivetruth/uoitlibrarybooking/userinterface/calendar/grid/common/GridAdapter.java b/app/src/main/java/com/objectivetruth/uoitlibrarybooking/userinterface/calendar/grid/common/GridAdapter.java index f6738d1..93738de 100644 --- a/app/src/main/java/com/objectivetruth/uoitlibrarybooking/userinterface/calendar/grid/common/GridAdapter.java +++ b/app/src/main/java/com/objectivetruth/uoitlibrarybooking/userinterface/calendar/grid/common/GridAdapter.java @@ -220,6 +220,8 @@ private static BookingInteractionEventType _getBookingInteractionEventTypeBasedO switch(timeCell.param_next) { case "book.aspx": return BookingInteractionEventType.BOOK; + case "joinorleave.aspx": + return BookingInteractionEventType.JOIN_OR_LEAVE; default: return BookingInteractionEventType.UNKNOWN; } diff --git a/app/src/main/res/layout/interaction_joinorleave.xml b/app/src/main/res/layout/bookinginteraction_joinorleave.xml similarity index 86% rename from app/src/main/res/layout/interaction_joinorleave.xml rename to app/src/main/res/layout/bookinginteraction_joinorleave.xml index a2dc7e6..757edb9 100644 --- a/app/src/main/res/layout/interaction_joinorleave.xml +++ b/app/src/main/res/layout/bookinginteraction_joinorleave.xml @@ -1,30 +1,4 @@ - - Date: Sat, 20 Aug 2016 01:53:14 -0400 Subject: [PATCH 17/53] Added comment edit box in book flow --- .../BookingInteraction/Book.java | 40 ++++++++++++++++++- 1 file changed, 39 insertions(+), 1 deletion(-) diff --git a/app/src/main/java/com/objectivetruth/uoitlibrarybooking/userinterface/BookingInteraction/Book.java b/app/src/main/java/com/objectivetruth/uoitlibrarybooking/userinterface/BookingInteraction/Book.java index de9df49..3744431 100644 --- a/app/src/main/java/com/objectivetruth/uoitlibrarybooking/userinterface/BookingInteraction/Book.java +++ b/app/src/main/java/com/objectivetruth/uoitlibrarybooking/userinterface/BookingInteraction/Book.java @@ -1,8 +1,10 @@ package com.objectivetruth.uoitlibrarybooking.userinterface.BookingInteraction; +import android.content.DialogInterface; import android.os.Bundle; import android.support.annotation.Nullable; import android.support.v4.app.Fragment; +import android.support.v7.app.AlertDialog; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; @@ -13,6 +15,7 @@ import com.objectivetruth.uoitlibrarybooking.data.models.bookinginteractionmodel.BookingInteractionEventType; import com.objectivetruth.uoitlibrarybooking.data.models.bookinginteractionmodel.BookinginteractionEventWithDateInfo; import com.objectivetruth.uoitlibrarybooking.data.models.calendarmodel.TimeCell; +import timber.log.Timber; import javax.inject.Inject; @@ -20,6 +23,7 @@ public class Book extends Fragment{ private TimeCell timeCell; private String monthWord = ""; private String dayOfMonthNumber = ""; + private String comment = ""; private static final String TIME_CELL_BUNDLE_KEY = "TIME_CELL_BUNDLE_KEY"; private static final String MONTH_WORD_BUNDLE_KEY = "MONTH_WORD_BUNDLE_KEY"; private static final String DAY_OF_MONTH_NUMBER_BUNDLE_KEY = "DAY_OF_MONTH_NUMBER_BUNDLE_KEY"; @@ -42,7 +46,8 @@ public View onCreateView(LayoutInflater inflater, EditText groupNameEditText = (EditText) view.findViewById(R.id.book_group_name_actual); - ImageButton commentImageButton = (ImageButton) view.findViewById(R.id.comment_button); + ImageButton commentButton = (ImageButton) view.findViewById(R.id.comment_button); + _setupCommentButton(commentButton); EditText groupCodeEditText = (EditText) view.findViewById(R.id.book_group_code_actual); @@ -73,6 +78,39 @@ public void onCreate(@Nullable Bundle savedInstanceState) { } } + private void _setupCommentButton(ImageButton button) { + button.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View view) { + _showCommentDialog(); + } + }); + } + + private void _showCommentDialog() { + AlertDialog.Builder alert = new AlertDialog.Builder(getActivity()); + final EditText edittext = new EditText(getActivity()); + alert.setMessage("Visible in the library system to all users"); + alert.setTitle("Comments"); + + alert.setView(edittext); + + alert.setPositiveButton("Set Comment", new DialogInterface.OnClickListener() { + public void onClick(DialogInterface dialog, int whichButton) { + comment = edittext.getText().toString(); + Timber.i("Comment changed by user to: " + comment); + } + }); + + alert.setNegativeButton("Cancel", new DialogInterface.OnClickListener() { + public void onClick(DialogInterface dialog, int whichButton) { + Timber.i("Comment edit canceled by user. Comment will be " + comment); + } + }); + alert.setCancelable(false); + alert.create().show(); + } + private void _setupCreateButton(Button createButton) { if(createButton != null) { createButton.setOnClickListener(new View.OnClickListener() { From 6fac74ddbd53b46108268870d01330f5beb9ac19 Mon Sep 17 00:00:00 2001 From: ObjectiveTruth Date: Sat, 20 Aug 2016 12:47:57 -0400 Subject: [PATCH 18/53] Added ability to cancel the comment dialog --- .../BookingInteraction/Book.java | 60 ++++++++++++++++--- .../BookingInteraction.java | 8 ++- 2 files changed, 57 insertions(+), 11 deletions(-) diff --git a/app/src/main/java/com/objectivetruth/uoitlibrarybooking/userinterface/BookingInteraction/Book.java b/app/src/main/java/com/objectivetruth/uoitlibrarybooking/userinterface/BookingInteraction/Book.java index 3744431..0e54933 100644 --- a/app/src/main/java/com/objectivetruth/uoitlibrarybooking/userinterface/BookingInteraction/Book.java +++ b/app/src/main/java/com/objectivetruth/uoitlibrarybooking/userinterface/BookingInteraction/Book.java @@ -9,6 +9,8 @@ import android.view.View; import android.view.ViewGroup; import android.widget.*; +import com.daimajia.androidanimations.library.Techniques; +import com.daimajia.androidanimations.library.YoYo; import com.objectivetruth.uoitlibrarybooking.R; import com.objectivetruth.uoitlibrarybooking.app.UOITLibraryBookingApp; import com.objectivetruth.uoitlibrarybooking.data.models.BookingInteractionModel; @@ -27,6 +29,10 @@ public class Book extends Fragment{ private static final String TIME_CELL_BUNDLE_KEY = "TIME_CELL_BUNDLE_KEY"; private static final String MONTH_WORD_BUNDLE_KEY = "MONTH_WORD_BUNDLE_KEY"; private static final String DAY_OF_MONTH_NUMBER_BUNDLE_KEY = "DAY_OF_MONTH_NUMBER_BUNDLE_KEY"; + + private EditText groupNameET; + private EditText groupCodeET; + private String durationSpinnerValue = "1.0"; // a default value to avoid NPE. Stands for 1 hour @Inject BookingInteractionModel bookingInteractionModel; @Nullable @@ -44,12 +50,12 @@ public View onCreateView(LayoutInflater inflater, TextView errorTextView = (TextView) view.findViewById(R.id.book_error_message_actual); - EditText groupNameEditText = (EditText) view.findViewById(R.id.book_group_name_actual); + groupNameET = (EditText) view.findViewById(R.id.book_group_name_actual); ImageButton commentButton = (ImageButton) view.findViewById(R.id.comment_button); _setupCommentButton(commentButton); - EditText groupCodeEditText = (EditText) view.findViewById(R.id.book_group_code_actual); + groupCodeET = (EditText) view.findViewById(R.id.book_group_code_actual); Button createButton = (Button) view.findViewById(R.id.bookingInteraction_book_create_button); _setupCreateButton(createButton); @@ -107,7 +113,13 @@ public void onClick(DialogInterface dialog, int whichButton) { Timber.i("Comment edit canceled by user. Comment will be " + comment); } }); - alert.setCancelable(false); + + alert.setOnCancelListener(new DialogInterface.OnCancelListener() { + @Override + public void onCancel(DialogInterface dialogInterface) { + Timber.i("Comment edit canceled by user. Comment will be " + comment); + } + }); alert.create().show(); } @@ -116,11 +128,15 @@ private void _setupCreateButton(Button createButton) { createButton.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { - bookingInteractionModel.getBookingInteractionEventReplaySubject() - .onNext(new BookinginteractionEventWithDateInfo( - timeCell, BookingInteractionEventType.SUCCESS, - dayOfMonthNumber, monthWord - )); + if(_isFormFilledCorrectly()) { + bookingInteractionModel.getBookingInteractionEventReplaySubject() + .onNext(new BookinginteractionEventWithDateInfo( + timeCell, BookingInteractionEventType.SUCCESS, + dayOfMonthNumber, monthWord + )); + }else { + _showValidationErrorsAndAnimations(); + } } }); } @@ -147,13 +163,14 @@ private void _setupDurationSpinner(Spinner durationSpinner) { public void onItemSelected(AdapterView adapter, View view, int position, long id) { String[] timeToDecimal = new String[]{"0.5", "1.0", "1.5", "2"}; - String durationSpinnerValue = timeToDecimal[position]; + durationSpinnerValue = timeToDecimal[position]; } @Override public void onNothingSelected(AdapterView adapter) { } }); durationSpinner.setSelection(1); + durationSpinnerValue = "1.0"; } @Override @@ -163,4 +180,29 @@ public void onSaveInstanceState(Bundle outState) { outState.putString(DAY_OF_MONTH_NUMBER_BUNDLE_KEY, dayOfMonthNumber); outState.putString(MONTH_WORD_BUNDLE_KEY, monthWord); } + + private boolean _isFormFilledCorrectly() { + Timber.i("Some fields were not filled in correctly"); + return _isGroupCodeFilledCorrectly() && _isGroupNameFilledCorrectly(); + } + + private boolean _isGroupCodeFilledCorrectly() { + return !groupCodeET.getText().toString().trim().isEmpty(); + } + + private boolean _isGroupNameFilledCorrectly() { + return !groupNameET.getText().toString().trim().isEmpty(); + } + + private void _showValidationErrorsAndAnimations() { + if(!_isGroupNameFilledCorrectly()) { + Timber.d("GroupName not filled correctly, playing animation"); + YoYo.with(Techniques.Shake).duration(1000).playOn(groupNameET); + } + + if(!_isGroupCodeFilledCorrectly()) { + Timber.d("GroupCode not filled correctly, playing animation"); + YoYo.with(Techniques.Shake).delay(100).duration(900).playOn(groupCodeET); + } + } } diff --git a/app/src/main/java/com/objectivetruth/uoitlibrarybooking/userinterface/BookingInteraction/BookingInteraction.java b/app/src/main/java/com/objectivetruth/uoitlibrarybooking/userinterface/BookingInteraction/BookingInteraction.java index 802b36e..3dd8335 100644 --- a/app/src/main/java/com/objectivetruth/uoitlibrarybooking/userinterface/BookingInteraction/BookingInteraction.java +++ b/app/src/main/java/com/objectivetruth/uoitlibrarybooking/userinterface/BookingInteraction/BookingInteraction.java @@ -67,14 +67,14 @@ private void _replaceContentFrameWithFragmentBasedOnEvent( .findFragmentById(R.id.bookinginteraction_content_frame); if(_doesCurrentContentFrameNeedToBeChanged(bookingInteractionEvent, currentFragmentInContentFrame)) { - Timber.i("Received event request to change fragment, changing: " + bookingInteractionEvent.type); + Timber.d("Received event request to change fragment, changing: " + bookingInteractionEvent.type); getChildFragmentManager() .beginTransaction() .replace(R.id.bookinginteraction_content_frame, _getFragmentForEvent(bookingInteractionEvent)) .commit(); }else{ - Timber.i("Received event request to change fragment, but fragment is already in the correct state: " + + Timber.d("Received event request to change fragment, but fragment is already in the correct state: " + bookingInteractionEvent.type); } } @@ -82,12 +82,16 @@ private void _replaceContentFrameWithFragmentBasedOnEvent( private Fragment _getFragmentForEvent(BookinginteractionEventWithDateInfo bookinginteractionEventWithDateInfo) { switch(bookinginteractionEventWithDateInfo.type) { case BOOK: + Timber.i("Showing: Book"); return Book.newInstance(bookinginteractionEventWithDateInfo); case SUCCESS: + Timber.i("Showing: Success"); return Success.newInstance(); case JOIN_OR_LEAVE: + Timber.i("Showing: JoinOrLeave"); return JoinOrLeave.newInstance(bookinginteractionEventWithDateInfo); default: + Timber.w("No valid Fragment requested, showing Success"); return Success.newInstance(); } } From 0318c057915cccce1bb95639907c6d346c417daa Mon Sep 17 00:00:00 2001 From: ObjectiveTruth Date: Sat, 20 Aug 2016 13:08:13 -0400 Subject: [PATCH 19/53] Title on booking interaction shows time information --- .../BookingInteraction/BookingInteraction.java | 9 +++++++++ .../BookingInteraction/common/Utils.java | 14 ++++++++++++++ 2 files changed, 23 insertions(+) create mode 100644 app/src/main/java/com/objectivetruth/uoitlibrarybooking/userinterface/BookingInteraction/common/Utils.java diff --git a/app/src/main/java/com/objectivetruth/uoitlibrarybooking/userinterface/BookingInteraction/BookingInteraction.java b/app/src/main/java/com/objectivetruth/uoitlibrarybooking/userinterface/BookingInteraction/BookingInteraction.java index 3dd8335..d603c15 100644 --- a/app/src/main/java/com/objectivetruth/uoitlibrarybooking/userinterface/BookingInteraction/BookingInteraction.java +++ b/app/src/main/java/com/objectivetruth/uoitlibrarybooking/userinterface/BookingInteraction/BookingInteraction.java @@ -14,6 +14,7 @@ import com.objectivetruth.uoitlibrarybooking.app.UOITLibraryBookingApp; import com.objectivetruth.uoitlibrarybooking.data.models.BookingInteractionModel; import com.objectivetruth.uoitlibrarybooking.data.models.bookinginteractionmodel.BookinginteractionEventWithDateInfo; +import com.objectivetruth.uoitlibrarybooking.userinterface.BookingInteraction.common.Utils; import rx.Observable; import rx.Subscription; import rx.functions.Action1; @@ -68,6 +69,7 @@ private void _replaceContentFrameWithFragmentBasedOnEvent( if(_doesCurrentContentFrameNeedToBeChanged(bookingInteractionEvent, currentFragmentInContentFrame)) { Timber.d("Received event request to change fragment, changing: " + bookingInteractionEvent.type); + _setTitle(_getFormattedTitle(bookingInteractionEvent)); getChildFragmentManager() .beginTransaction() .replace(R.id.bookinginteraction_content_frame, @@ -79,6 +81,13 @@ private void _replaceContentFrameWithFragmentBasedOnEvent( } } + private String _getFormattedTitle(BookinginteractionEventWithDateInfo bookingInteractionEvent) { + String dayOfWeekWord = Utils.getDayOfWeekBasedOnDayNumberMonthNumber( bookingInteractionEvent.monthWord, + bookingInteractionEvent.dayOfMonthNumber); + return BOOKING_INTERACTION_TITLE + " - " + dayOfWeekWord + ": " + + bookingInteractionEvent.timeCell.param_starttime; + } + private Fragment _getFragmentForEvent(BookinginteractionEventWithDateInfo bookinginteractionEventWithDateInfo) { switch(bookinginteractionEventWithDateInfo.type) { case BOOK: diff --git a/app/src/main/java/com/objectivetruth/uoitlibrarybooking/userinterface/BookingInteraction/common/Utils.java b/app/src/main/java/com/objectivetruth/uoitlibrarybooking/userinterface/BookingInteraction/common/Utils.java new file mode 100644 index 0000000..4852763 --- /dev/null +++ b/app/src/main/java/com/objectivetruth/uoitlibrarybooking/userinterface/BookingInteraction/common/Utils.java @@ -0,0 +1,14 @@ +package com.objectivetruth.uoitlibrarybooking.userinterface.BookingInteraction.common; + +public class Utils { + + /** + * Returns the day of the week based on the 2 inputs. Assumes the year is "THIS" year + * @param dayOfMonth + * @param monthName + * @return + */ + public static String getDayOfWeekBasedOnDayNumberMonthNumber(String dayOfMonth, String monthName) { + return "Monday"; + } +} From 88bc674f65d46fbd582ad07ffd12a05681be9e04 Mon Sep 17 00:00:00 2001 From: ObjectiveTruth Date: Sun, 21 Aug 2016 01:35:24 -0400 Subject: [PATCH 20/53] DayOfWeek added to title of BookingInteraction --- .../BookingInteraction/Book.java | 7 ---- .../BookingInteraction.java | 26 ++++++++++---- .../BookingInteraction/common/Utils.java | 32 ++++++++++++++++- .../calendar/grid/common/GridAdapter.java | 36 +++++++++++-------- .../res/layout/bookinginteraction_book.xml | 24 ++----------- 5 files changed, 76 insertions(+), 49 deletions(-) diff --git a/app/src/main/java/com/objectivetruth/uoitlibrarybooking/userinterface/BookingInteraction/Book.java b/app/src/main/java/com/objectivetruth/uoitlibrarybooking/userinterface/BookingInteraction/Book.java index 0e54933..6298b9d 100644 --- a/app/src/main/java/com/objectivetruth/uoitlibrarybooking/userinterface/BookingInteraction/Book.java +++ b/app/src/main/java/com/objectivetruth/uoitlibrarybooking/userinterface/BookingInteraction/Book.java @@ -45,9 +45,6 @@ public View onCreateView(LayoutInflater inflater, TextView roomNumberTextView = (TextView) view.findViewById(R.id.interaction_book_room_number); if(roomNumberTextView != null) {roomNumberTextView.setText(timeCell.param_room.toUpperCase());} - TextView dateField = (TextView) view.findViewById(R.id.book_date_actual); - if(dateField != null) {dateField.setText(_getFormattedDateString());} - TextView errorTextView = (TextView) view.findViewById(R.id.book_error_message_actual); groupNameET = (EditText) view.findViewById(R.id.book_group_name_actual); @@ -142,10 +139,6 @@ public void onClick(View view) { } } - private String _getFormattedDateString() { - return dayOfMonthNumber + ", " + monthWord + " @ " + timeCell.param_starttime; - } - private void _loadPreviousStateIfAvailable(Bundle inState) { timeCell = inState.getParcelable(TIME_CELL_BUNDLE_KEY); monthWord = inState.getString(MONTH_WORD_BUNDLE_KEY); diff --git a/app/src/main/java/com/objectivetruth/uoitlibrarybooking/userinterface/BookingInteraction/BookingInteraction.java b/app/src/main/java/com/objectivetruth/uoitlibrarybooking/userinterface/BookingInteraction/BookingInteraction.java index d603c15..24a86ca 100644 --- a/app/src/main/java/com/objectivetruth/uoitlibrarybooking/userinterface/BookingInteraction/BookingInteraction.java +++ b/app/src/main/java/com/objectivetruth/uoitlibrarybooking/userinterface/BookingInteraction/BookingInteraction.java @@ -6,6 +6,7 @@ import android.support.v4.app.Fragment; import android.support.v7.app.ActionBar; import android.view.LayoutInflater; +import android.view.MenuItem; import android.view.View; import android.view.ViewGroup; import android.widget.Toast; @@ -34,7 +35,7 @@ public View onCreateView(LayoutInflater inflater, @Nullable Bundle savedInstanceState) { View view = inflater.inflate(R.layout.bookinginteraction_root, container, false); - _setTitle(BOOKING_INTERACTION_TITLE); + _setTitleAndBackButton(BOOKING_INTERACTION_TITLE, true); return view; } @@ -52,6 +53,17 @@ public void onStop() { super.onStop(); } + @Override + public boolean onOptionsItemSelected(MenuItem item) { + switch (item.getItemId()) { + case android.R.id.home: + _popFragmentBackstack(); + return true; + default: + return super.onOptionsItemSelected(item); + } + } + private void _setupViewBindings(Observable bookingInteractionEventObservable) { bookingInteractionEventSubscription = bookingInteractionEventObservable .subscribe(new Action1() { @@ -69,7 +81,7 @@ private void _replaceContentFrameWithFragmentBasedOnEvent( if(_doesCurrentContentFrameNeedToBeChanged(bookingInteractionEvent, currentFragmentInContentFrame)) { Timber.d("Received event request to change fragment, changing: " + bookingInteractionEvent.type); - _setTitle(_getFormattedTitle(bookingInteractionEvent)); + _setTitleAndBackButton(_getFormattedTitle(bookingInteractionEvent), true); getChildFragmentManager() .beginTransaction() .replace(R.id.bookinginteraction_content_frame, @@ -82,9 +94,9 @@ private void _replaceContentFrameWithFragmentBasedOnEvent( } private String _getFormattedTitle(BookinginteractionEventWithDateInfo bookingInteractionEvent) { - String dayOfWeekWord = Utils.getDayOfWeekBasedOnDayNumberMonthNumber( bookingInteractionEvent.monthWord, - bookingInteractionEvent.dayOfMonthNumber); - return BOOKING_INTERACTION_TITLE + " - " + dayOfWeekWord + ": " + + String dayOfWeekWord = Utils.getDayOfWeekBasedOnDayNumberMonthNumber(bookingInteractionEvent.dayOfMonthNumber, + bookingInteractionEvent.monthWord); + return dayOfWeekWord + ", " + bookingInteractionEvent.dayOfMonthNumber + " @ " + bookingInteractionEvent.timeCell.param_starttime; } @@ -167,10 +179,12 @@ public void onCreate(@Nullable Bundle savedInstanceState) { setHasOptionsMenu(true); } - private void _setTitle(String title) { + private void _setTitleAndBackButton(String title, boolean shouldSetBackbutton) { ActionBar actionBar = ((MainActivity) getActivity()).getSupportActionBar(); if(actionBar != null) { + actionBar.setDisplayHomeAsUpEnabled(shouldSetBackbutton); actionBar.setTitle(title); } } + } diff --git a/app/src/main/java/com/objectivetruth/uoitlibrarybooking/userinterface/BookingInteraction/common/Utils.java b/app/src/main/java/com/objectivetruth/uoitlibrarybooking/userinterface/BookingInteraction/common/Utils.java index 4852763..ea24770 100644 --- a/app/src/main/java/com/objectivetruth/uoitlibrarybooking/userinterface/BookingInteraction/common/Utils.java +++ b/app/src/main/java/com/objectivetruth/uoitlibrarybooking/userinterface/BookingInteraction/common/Utils.java @@ -1,5 +1,12 @@ package com.objectivetruth.uoitlibrarybooking.userinterface.BookingInteraction.common; +import timber.log.Timber; + +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.util.Calendar; +import java.util.Locale; + public class Utils { /** @@ -9,6 +16,29 @@ public class Utils { * @return */ public static String getDayOfWeekBasedOnDayNumberMonthNumber(String dayOfMonth, String monthName) { - return "Monday"; + try{ + Calendar calendar = Calendar.getInstance(); + SimpleDateFormat dayFormat = new SimpleDateFormat("EEEE", Locale.CANADA); + + int currentYear = calendar.get(Calendar.YEAR); + int monthInt = _getMonthIntFromMonthString(monthName); + int dayInt = Integer.parseInt(dayOfMonth); + + calendar.set(currentYear, monthInt, dayInt); + return dayFormat.format(calendar.getTime()); + }catch(ParseException e) { + Timber.e(e, "Could not parse date information when trying to find day of week. dayOfMonth: " + dayOfMonth + + ", monthName: " + monthName); + }catch(Exception e) { + Timber.e(e, "Unexpected Error when parsing date information when trying to find day of week. dayOfMonth: " + + dayOfMonth + ", monthName: " + monthName); + } + return "Booking"; + } + + private static int _getMonthIntFromMonthString(String monthName) throws ParseException { + Calendar calendar = Calendar.getInstance(); + calendar.setTime(new SimpleDateFormat("MMMM", Locale.CANADA).parse(monthName)); + return calendar.get(Calendar.MONTH); } } diff --git a/app/src/main/java/com/objectivetruth/uoitlibrarybooking/userinterface/calendar/grid/common/GridAdapter.java b/app/src/main/java/com/objectivetruth/uoitlibrarybooking/userinterface/calendar/grid/common/GridAdapter.java index 93738de..badeee9 100644 --- a/app/src/main/java/com/objectivetruth/uoitlibrarybooking/userinterface/calendar/grid/common/GridAdapter.java +++ b/app/src/main/java/com/objectivetruth/uoitlibrarybooking/userinterface/calendar/grid/common/GridAdapter.java @@ -105,40 +105,48 @@ public View getView(int row, int column, View recycleView, ViewGroup parent) { TimeCell currentTimeCellForThisViewCall = calendarDay.timeCells.get(_convertRowAndColumnToTimeCellIndex(row, column)); - holder.textViewOnly.setOnClickListener(new TimeCellOnClickListener(currentTimeCellForThisViewCall, - bookingInteractionModel, calendarDay)); - switch(currentTimeCellForThisViewCall.timeCellType) { case TABLE_COLUMN_HEADER: - holder.textViewOnly.setText(currentTimeCellForThisViewCall.timeStringOrRoomName); break; + holder.textViewOnly.setText(currentTimeCellForThisViewCall.timeStringOrRoomName); + holder.textViewOnly.setOnClickListener(null); break; case TABLE_ROW_HEADER: - holder.textViewOnly.setText(currentTimeCellForThisViewCall.timeStringOrRoomName); break; + holder.textViewOnly.setText(currentTimeCellForThisViewCall.timeStringOrRoomName); + holder.textViewOnly.setOnClickListener(null); break; case TABLE_TOP_LEFT_CELL: - holder.textViewOnly.setText(""); break; - - case BOOKING_OPEN: - holder.textViewOnly.setText("Open"); break; + holder.textViewOnly.setText(""); + holder.textViewOnly.setOnClickListener(null); break; case BOOKING_LIBRARY_CLOSED: - holder.textViewOnly.setText("Closed"); break; + holder.textViewOnly.setText("Closed"); + holder.textViewOnly.setOnClickListener(null); break; + + case BOOKING_OPEN: + holder.textViewOnly.setText("Open"); + holder.textViewOnly.setOnClickListener(new TimeCellOnClickListener(currentTimeCellForThisViewCall, + bookingInteractionModel, calendarDay)); break; case BOOKING_COMPETING: - holder.textViewOnly.setText("Open"); break; + holder.textViewOnly.setText("Open"); + holder.textViewOnly.setOnClickListener(new TimeCellOnClickListener(currentTimeCellForThisViewCall, + bookingInteractionModel, calendarDay)); break; case BOOKING_CONFIRMED: - holder.textViewOnly.setText(currentTimeCellForThisViewCall.groupNameForWhenFullyBookedRoom); break; + holder.textViewOnly.setText(currentTimeCellForThisViewCall.groupNameForWhenFullyBookedRoom); + holder.textViewOnly.setOnClickListener(new TimeCellOnClickListener(currentTimeCellForThisViewCall, + bookingInteractionModel, calendarDay)); break; case BOOKING_LOCKED: TimeCell parentTimeCell = _getTimeCellWithGroupNameAboutThisOne(row, column); if(parentTimeCell == null) { parentTimeCell = new TimeCell(); parentTimeCell.groupNameForWhenFullyBookedRoom = "";} - holder.textViewOnly.setText(parentTimeCell.groupNameForWhenFullyBookedRoom); break; + holder.textViewOnly.setText(parentTimeCell.groupNameForWhenFullyBookedRoom); + holder.textViewOnly.setOnClickListener(null); break; default: holder.textViewOnly.setText(currentTimeCellForThisViewCall.timeCellType.name()); - + holder.textViewOnly.setOnClickListener(null); } return convertView; diff --git a/app/src/main/res/layout/bookinginteraction_book.xml b/app/src/main/res/layout/bookinginteraction_book.xml index 7b0012e..b0ccab0 100644 --- a/app/src/main/res/layout/bookinginteraction_book.xml +++ b/app/src/main/res/layout/bookinginteraction_book.xml @@ -1,35 +1,17 @@ + xmlns:android="http://schemas.android.com/apk/res/android" > - - + android:layout_height="match_parent" > Date: Sun, 21 Aug 2016 09:56:28 -0400 Subject: [PATCH 21/53] Removed DiafragGeneric added buttons * Info button * Comment button * Refactored to string resource --- .../ActivityRoomInteraction.java | 19 ++----- .../uoitlibrarybooking/DiaFragGeneric.java | 53 ------------------- .../BookingInteraction/Book.java | 38 ++++++++++--- .../res/layout/bookinginteraction_book.xml | 38 +++++-------- ...{error_messages.xml => messages_error.xml} | 0 app/src/main/res/values/messages_info.xml | 13 +++++ ...cess_messages.xml => messages_success.xml} | 0 7 files changed, 60 insertions(+), 101 deletions(-) delete mode 100644 app/src/main/java/com/objectivetruth/uoitlibrarybooking/DiaFragGeneric.java rename app/src/main/res/values/{error_messages.xml => messages_error.xml} (100%) create mode 100644 app/src/main/res/values/messages_info.xml rename app/src/main/res/values/{success_messages.xml => messages_success.xml} (100%) diff --git a/app/src/main/java/com/objectivetruth/uoitlibrarybooking/ActivityRoomInteraction.java b/app/src/main/java/com/objectivetruth/uoitlibrarybooking/ActivityRoomInteraction.java index 78ac6c9..d19279c 100644 --- a/app/src/main/java/com/objectivetruth/uoitlibrarybooking/ActivityRoomInteraction.java +++ b/app/src/main/java/com/objectivetruth/uoitlibrarybooking/ActivityRoomInteraction.java @@ -138,32 +138,21 @@ else if(bundleExtras.getString("type").equalsIgnoreCase("createbooking")){ setContentView(R.layout.bookinginteraction_book); - TextView roomNumberTextView = (TextView) findViewById(R.id.interaction_book_room_number); + TextView roomNumberTextView = (TextView) findViewById(R.id.bookingInteraction_book_roomnumber); errorTextView = (TextView) findViewById(R.id.book_error_message_actual); TextView dateField = (TextView) findViewById(R.id.book_date_actual); durationSpinner = (Spinner) findViewById(R.id.book_spinner_duration); - groupNameEditText = (EditText) findViewById(R.id.book_group_name_actual); - ImageButton commentImageButton = (ImageButton) findViewById(R.id.comment_button); + groupNameEditText = (EditText) findViewById(R.id.bookingInteraction_book_groupname); + ImageButton commentImageButton = (ImageButton) findViewById(R.id.bookingInteraction_book_comment_button); groupCodeEditText = (EditText) findViewById(R.id.book_group_code_actual); titleButton = (Button) findViewById(R.id.bookingInteraction_book_create_button); - ImageButton groupCodeInfoImageButton = (ImageButton) findViewById(R.id.info_group_code); + ImageButton groupCodeInfoImageButton = (ImageButton) findViewById(R.id.bookingInteraction_book_group_code_info); //titleButton.setTextColor(getResources().getColor(R.color.disabled_button_text)); ImageView roomPicture = (ImageView) findViewById(R.id.room_landing_room_picture); roomPicture.setImageResource(getResources().getIdentifier(roomNumber.toLowerCase(), "drawable", getPackageName())); durationSpinnerValue = null; roomNumberTextView.setText(roomNumber); - groupCodeInfoImageButton.setOnClickListener(new OnClickListener() { - @Override - public void onClick(View view) { - FragmentManager fragMan = getSupportFragmentManager(); - DiaFragGeneric frag = new DiaFragGeneric(); - frag.setArguments("Group Code Information", getString(R.string.tooltip_groupcode)); - frag.show(fragMan, MainActivity.GROUP_CODE_DIALOGFRAGMENT_TAG); - } - }); - - commentImageButton.setOnClickListener(new OnClickListener() { @Override public void onClick(View view) { diff --git a/app/src/main/java/com/objectivetruth/uoitlibrarybooking/DiaFragGeneric.java b/app/src/main/java/com/objectivetruth/uoitlibrarybooking/DiaFragGeneric.java deleted file mode 100644 index c3e4e79..0000000 --- a/app/src/main/java/com/objectivetruth/uoitlibrarybooking/DiaFragGeneric.java +++ /dev/null @@ -1,53 +0,0 @@ -package com.objectivetruth.uoitlibrarybooking; - -import android.graphics.drawable.ColorDrawable; -import android.os.Bundle; -import android.support.v4.app.DialogFragment; -import android.view.LayoutInflater; -import android.view.View; -import android.view.ViewGroup; -import android.view.Window; -import android.widget.Button; -import android.widget.TextView; - -/** - * Created by ObjectiveTruth on 8/22/2014. - */ -public class DiaFragGeneric extends DialogFragment{ - String titleText; - String descriptionText; - - /** - * Creates a generic Dialog Fragment in the flavour of this app - * @param titleText large blue text at the top of the dialog - * @param descriptionText string to write in the body of the dialog - */ - public void setArguments(String titleText, String descriptionText){ - this.titleText = titleText; - this.descriptionText = descriptionText; - } - @Override - public View onCreateView(LayoutInflater inflater, ViewGroup container, - Bundle savedInstanceState) { - View rootView = inflater.inflate(R.layout.diafrag_generic, container, false); - Button okButton = (Button) rootView.findViewById(R.id.ok_button_generic_diafrag); - TextView descriptionTV = (TextView) rootView.findViewById(R.id.description_generic_diafrag); - TextView titleTV = (TextView) rootView.findViewById(R.id.title_generic_diafrag); - descriptionTV.setText(descriptionText); - titleTV.setText(titleText); - - okButton.setOnClickListener(new View.OnClickListener() { - @Override - public void onClick(View view) { - getDialog().dismiss(); - - } - }); - getDialog().getWindow().setBackgroundDrawable(new ColorDrawable(0)); - getDialog().requestWindowFeature(Window.FEATURE_NO_TITLE); - getDialog().setTitle(titleText); - getDialog().getWindow() - .getAttributes().windowAnimations = R.style.DiafragGenericAnimation; - return rootView; - } -} diff --git a/app/src/main/java/com/objectivetruth/uoitlibrarybooking/userinterface/BookingInteraction/Book.java b/app/src/main/java/com/objectivetruth/uoitlibrarybooking/userinterface/BookingInteraction/Book.java index 6298b9d..fd660b7 100644 --- a/app/src/main/java/com/objectivetruth/uoitlibrarybooking/userinterface/BookingInteraction/Book.java +++ b/app/src/main/java/com/objectivetruth/uoitlibrarybooking/userinterface/BookingInteraction/Book.java @@ -42,14 +42,14 @@ public View onCreateView(LayoutInflater inflater, @Nullable Bundle savedInstanceState) { View view = inflater.inflate(R.layout.bookinginteraction_book, container, false); - TextView roomNumberTextView = (TextView) view.findViewById(R.id.interaction_book_room_number); + TextView roomNumberTextView = (TextView) view.findViewById(R.id.bookingInteraction_book_roomnumber); if(roomNumberTextView != null) {roomNumberTextView.setText(timeCell.param_room.toUpperCase());} TextView errorTextView = (TextView) view.findViewById(R.id.book_error_message_actual); - groupNameET = (EditText) view.findViewById(R.id.book_group_name_actual); + groupNameET = (EditText) view.findViewById(R.id.bookingInteraction_book_groupname); - ImageButton commentButton = (ImageButton) view.findViewById(R.id.comment_button); + ImageButton commentButton = (ImageButton) view.findViewById(R.id.bookingInteraction_book_comment_button); _setupCommentButton(commentButton); groupCodeET = (EditText) view.findViewById(R.id.book_group_code_actual); @@ -57,7 +57,9 @@ public View onCreateView(LayoutInflater inflater, Button createButton = (Button) view.findViewById(R.id.bookingInteraction_book_create_button); _setupCreateButton(createButton); - ImageButton groupCodeInfoImageButton = (ImageButton) view.findViewById(R.id.info_group_code); + ImageButton groupCodeInfoImageButton = (ImageButton) view + .findViewById(R.id.bookingInteraction_book_group_code_info); + _setupGroupCodeInfoButton(groupCodeInfoImageButton); Spinner durationSpinner = (Spinner) view.findViewById(R.id.book_spinner_duration); _setupDurationSpinner(durationSpinner); @@ -90,15 +92,37 @@ public void onClick(View view) { }); } + private void _setupGroupCodeInfoButton(ImageButton groupCodeInfoButton) { + groupCodeInfoButton.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View view) { + _showGroupCodeInfoDialog(); + } + }); + } + + private void _showGroupCodeInfoDialog() { + AlertDialog.Builder alert = new AlertDialog.Builder(getActivity()); + alert.setMessage(R.string.INFO_BOOKING_INTERACTION_BOOK_GROUPCODE_INFO_PARAGRAPH); + alert.setTitle(R.string.INFO_BOOKING_INTERACTION_BOOK_GROUPCODE_INFO_TITLE); + + alert.setPositiveButton("Comment", new DialogInterface.OnClickListener() { + public void onClick(DialogInterface dialog, int whichButton) { + dialog.dismiss(); + } + }); + alert.create().show(); + } + private void _showCommentDialog() { AlertDialog.Builder alert = new AlertDialog.Builder(getActivity()); final EditText edittext = new EditText(getActivity()); - alert.setMessage("Visible in the library system to all users"); - alert.setTitle("Comments"); + alert.setMessage(R.string.INFO_BOOKING_INTERACTION_BOOK_COMMENT_INFO_PARAGRAPH); + alert.setTitle(R.string.INFO_BOOKING_INTERACTION_BOOK_COMMENT_INFO_TITLE); alert.setView(edittext); - alert.setPositiveButton("Set Comment", new DialogInterface.OnClickListener() { + alert.setPositiveButton("Comment", new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int whichButton) { comment = edittext.getText().toString(); Timber.i("Comment changed by user to: " + comment); diff --git a/app/src/main/res/layout/bookinginteraction_book.xml b/app/src/main/res/layout/bookinginteraction_book.xml index b0ccab0..3ae56f2 100644 --- a/app/src/main/res/layout/bookinginteraction_book.xml +++ b/app/src/main/res/layout/bookinginteraction_book.xml @@ -30,7 +30,7 @@ android:textAppearance="?android:attr/textAppearanceMedium" /> + android:text="@string/error_room_no_exist_comment" /> - + android:hint="Group Name" /> + android:hint="Code" /> + android:layout_toRightOf="@+id/book_group_code_actual" /> + + android:layout_centerHorizontal="true"/> + + + + + + +
+ +
+
+
+ +
+
+ + + +
+ + + + +
+ + + +
+ + + + + +
+ +
August 2016
SunMonTueWedThuFriSat
123456
78910111213
14151617181920
21222324252627
28293031
+ + + +
+ +
September 2016
SunMonTueWedThuFriSat
123
45678910
11121314151617
18192021222324
252627282930
+ + + + + +
+ +

Important information about booking a Group Study Room:

  • All group study rooms are located in the North Oshawa Library
  • Bookings can be made one day in advance.
  • Bookings for tomorrow will open at 10:00 A.M. today.
  • Two or three members of your group must book the room to secure the booking. To view minimum requirements for each room, click on the Rooms link on the left.

The rooms are very popular on weekdays. To secure a room, be prepared to book as soon as the booking opens for that day.

To view complete booking instructions and room use guidelines, click the link 'Instruction' on the left.

+ +
+ + +
+
+
+ +
+
+
+ + + + +
+
+
+ + diff --git a/app/src/testResources/server_responses/clickabledate/fully_open_8am-330pm.aspx b/app/src/testResources/server_responses/clickabledate/fully_open_8am-330pm.aspx index ea03165..5e7de03 100644 --- a/app/src/testResources/server_responses/clickabledate/fully_open_8am-330pm.aspx +++ b/app/src/testResources/server_responses/clickabledate/fully_open_8am-330pm.aspx @@ -1,4 +1,4 @@ - + @@ -122,7 +122,7 @@
- +
+ + + +Skip to main content + +
+
+ + +
+
UOIT Home + + +
+ +
+ + +
+ +
+
+
+ +
+
+ +
+ +
+ + + +
+ + (optional) + + Room No + + + + + + Date + + + + Duration + + Group name + + + + + + Notes + + Institution + + + + Network password + + + + Student ID + + + + Group code + + + + + + + +
+ + + + + +
+ + +
+ + +
+
+
+ +
+
+
+ + + + +
+
+
+ + diff --git a/app/src/testResources/server_responses/book/book_fail_message.aspx b/app/src/testResources/server_responses/book/book_fail_message.aspx new file mode 100644 index 0000000..1f529ac --- /dev/null +++ b/app/src/testResources/server_responses/book/book_fail_message.aspx @@ -0,0 +1,272 @@ + + + + + + + +Campus Libraries | Library - Home + + + + + + + + + + + + + +Skip to main content + +
+
+ + +
+
UOIT Home + + +
+ +
+ + +
+ +
+
+
+ +
+
+ +
+ +
+ + + +
+ + (optional) + + Room No + + Duration was not selected. Length of group name must be between 2 and 8 characters. The length of group code must be 4 characters. Institution was not selected. Student ID length is invalid. Password length is invalid. + + + + Date + + + + Duration + + Group name + + + + + + Notes + + Institution + + + + Network password + + + + Student ID + + + + Group code + + + + + + + +
+ + + + + +
+ + +
+ + +
+
+
+ +
+
+
+ + + + +
+
+
+ + diff --git a/app/src/testResources/server_responses/book/book_success_message.aspx b/app/src/testResources/server_responses/book/book_success_message.aspx new file mode 100644 index 0000000..6132494 --- /dev/null +++ b/app/src/testResources/server_responses/book/book_success_message.aspx @@ -0,0 +1,228 @@ + + + + + + + +Campus Libraries | Library - Home + + + + + + + + + + + + + +Skip to main content + +
+
+ + +
+
UOIT Home + + +
+ +
+ + +
+ +
+
+
+ +
+
+ +
+ +
+ + + +
+ + + + + +

A partial booking was done.
Room no.:LIB202A.
Requested date: Wednesday, August 31, 2016
You need additional people for this room to be completely allocated to you.

+ + +
+ + +
+
+
+ +
+
+
+ + + + +
+
+
+ + diff --git a/app/src/testResources/server_responses/joinorleave/join_fail_message.aspx b/app/src/testResources/server_responses/joinorleave/join_fail_message.aspx new file mode 100644 index 0000000..b455a95 --- /dev/null +++ b/app/src/testResources/server_responses/joinorleave/join_fail_message.aspx @@ -0,0 +1,250 @@ + + + + + + + +Campus Libraries | Library - Home + + + + + + + + + + + + + +Skip to main content + +
+
+ + +
+
UOIT Home + + +
+ +
+ + +
+ +
+
+
+ +
+
+ +
+ +
+ + + +
+ + + Seats booked + + + Org. + + Notes + + Please enter a valid Student ID and network password + Group name + Group code + Date + from + to + Room no. + If you wish to join the above group, enter your network ID, password and click on join button.
The room will be allocated only if the required conditions are met and on a first come first basis.
+ + + + + + +
+ + + + Student ID + Network password +
+ + +
+
+
+ +
+
+
+ + + + +
+
+
+ + diff --git a/app/src/testResources/server_responses/joinorleave/joingroup.aspx b/app/src/testResources/server_responses/joinorleave/joingroup.aspx new file mode 100644 index 0000000..c53d5ba --- /dev/null +++ b/app/src/testResources/server_responses/joinorleave/joingroup.aspx @@ -0,0 +1,250 @@ + + + + + + + +Campus Libraries | Library - Home + + + + + + + + + + + + + +Skip to main content + +
+
+ + +
+
UOIT Home + + +
+ +
+ + +
+ +
+
+
+ +
+
+ +
+ +
+ + + +
+ + + Seats booked + + + Org. + + Notes + + + Group name + Group code + Date + from + to + Room no. + If you wish to join the above group, enter your network ID, password and click on join button.
The room will be allocated only if the required conditions are met and on a first come first basis.
+ + + + + + +
+ + + + Student ID + Network password +
+ + +
+
+
+ +
+
+
+ + + + +
+
+
+ + diff --git a/app/src/testResources/server_responses/joinorleave/joinorleave.aspx b/app/src/testResources/server_responses/joinorleave/joinorleave.aspx new file mode 100644 index 0000000..db2a5c4 --- /dev/null +++ b/app/src/testResources/server_responses/joinorleave/joinorleave.aspx @@ -0,0 +1,251 @@ + + + + + + + +Campus Libraries | Library - Home + + + + + + + + + + + + + +Skip to main content + +
+
+ + +
+
UOIT Home + + +
+ +
+ + +
+ +
+
+
+ +
+
+ +
+ +
+ + + +
+ + + + + + + + + + +
Create or join a group
+ + + + + +
+ + + + + + + + +
Leave the group
+ + + +
+ +
+ + +
+
+
+ +
+
+
+ + + + +
+
+
+ + diff --git a/app/src/testResources/server_responses/joinorleave/leave_fail_message.aspx b/app/src/testResources/server_responses/joinorleave/leave_fail_message.aspx new file mode 100644 index 0000000..9c3f7fa --- /dev/null +++ b/app/src/testResources/server_responses/joinorleave/leave_fail_message.aspx @@ -0,0 +1,247 @@ + + + + + + + +Campus Libraries | Library - Home + + + + + + + + + + + + + +Skip to main content + +
+
+ + +
+
UOIT Home + + +
+ +
+ + +
+ +
+
+
+ +
+
+ +
+ +
+ + + +
+ Seats booked + + Org. + + + Notes + Please enter a valid Student ID and network password + Group name + Group code + Date + from + to + Room no. + If you wish to leave this group, enter your network ID, password and click on leave button. + + + + + + +
+ + + + Student ID + Network password +
+ + +
+
+
+ +
+
+
+ + + + +
+
+
+ + diff --git a/app/src/testResources/server_responses/joinorleave/leave_success_message.aspx b/app/src/testResources/server_responses/joinorleave/leave_success_message.aspx new file mode 100644 index 0000000..99070e8 --- /dev/null +++ b/app/src/testResources/server_responses/joinorleave/leave_success_message.aspx @@ -0,0 +1,229 @@ + + + + + + + +Campus Libraries | Library - Home + + + + + + + + + + + + + +Skip to main content + +
+
+ + +
+
UOIT Home + + +
+ +
+ + +
+ +
+
+
+ +
+
+ +
+ +
+ + + +
+ + + + + +

Your ID was removed from the group.
The group was removed (group code: 3421) as you were the last person to leave the group.

+ + +
+ + +
+
+
+ +
+
+
+ + + + +
+
+
+ + + diff --git a/app/src/testResources/server_responses/joinorleave/leavegroup.aspx b/app/src/testResources/server_responses/joinorleave/leavegroup.aspx new file mode 100644 index 0000000..2ad0902 --- /dev/null +++ b/app/src/testResources/server_responses/joinorleave/leavegroup.aspx @@ -0,0 +1,248 @@ + + + + + + + +Campus Libraries | Library - Home + + + + + + + + + + + + + +Skip to main content + +
+
+ + +
+
UOIT Home + + +
+ +
+ + +
+ +
+
+
+ +
+
+ +
+ +
+ + + +
+ Seats booked + + Org. + + + Notes + + Group name + Group code + Date + from + to + Room no. + If you wish to leave this group, enter your network ID, password and click on leave button. + + + + + + +
+ + + + Student ID + Network password +
+ + +
+
+
+ +
+
+
+ + + + +
+
+
+ + + From 8487ec460ae1146071c21948887ec2400a87f0ff Mon Sep 17 00:00:00 2001 From: ObjectiveTruth Date: Wed, 31 Aug 2016 16:19:58 -0600 Subject: [PATCH 50/53] Created skeleton for Login error situation When user tries to do a privelaged request, the login screen will be presented similar to the MyAccountFragment. The only difference is that it will not show the current reservations it will just go back to the original user request --- .../uoitlibrarybooking/app/AppComponent.java | 4 ++ .../data/models/BookingInteractionModel.java | 72 ++++++++++++++----- .../BookingInteractionEventType.java | 13 ++-- .../usermodel/MyAccountDataLoginState.java | 9 +++ .../BookingInteraction.java | 29 +++++--- .../BookingInteraction/{ => flows}/Book.java | 2 +- .../flows/CredentialsLogin.java | 37 ++++++++++ .../{ => flows}/JoinOrLeave.java | 2 +- .../{ => flows}/Success.java | 2 +- .../{ => flows}/ViewLeaveOrJoin.java | 11 +-- .../calendar/grid/common/GridAdapter.java | 2 + 11 files changed, 141 insertions(+), 42 deletions(-) rename app/src/main/java/com/objectivetruth/uoitlibrarybooking/userinterface/BookingInteraction/{ => flows}/Book.java (99%) create mode 100644 app/src/main/java/com/objectivetruth/uoitlibrarybooking/userinterface/BookingInteraction/flows/CredentialsLogin.java rename app/src/main/java/com/objectivetruth/uoitlibrarybooking/userinterface/BookingInteraction/{ => flows}/JoinOrLeave.java (99%) rename app/src/main/java/com/objectivetruth/uoitlibrarybooking/userinterface/BookingInteraction/{ => flows}/Success.java (99%) rename app/src/main/java/com/objectivetruth/uoitlibrarybooking/userinterface/BookingInteraction/{ => flows}/ViewLeaveOrJoin.java (94%) diff --git a/app/src/main/java/com/objectivetruth/uoitlibrarybooking/app/AppComponent.java b/app/src/main/java/com/objectivetruth/uoitlibrarybooking/app/AppComponent.java index 141b453..fecb200 100644 --- a/app/src/main/java/com/objectivetruth/uoitlibrarybooking/app/AppComponent.java +++ b/app/src/main/java/com/objectivetruth/uoitlibrarybooking/app/AppComponent.java @@ -7,6 +7,10 @@ import com.objectivetruth.uoitlibrarybooking.data.models.calendarmodel.CalendarWebService; import com.objectivetruth.uoitlibrarybooking.data.models.usermodel.UserWebService; import com.objectivetruth.uoitlibrarybooking.userinterface.BookingInteraction.*; +import com.objectivetruth.uoitlibrarybooking.userinterface.BookingInteraction.flows.Book; +import com.objectivetruth.uoitlibrarybooking.userinterface.BookingInteraction.flows.JoinOrLeave; +import com.objectivetruth.uoitlibrarybooking.userinterface.BookingInteraction.flows.Success; +import com.objectivetruth.uoitlibrarybooking.userinterface.BookingInteraction.flows.ViewLeaveOrJoin; import com.objectivetruth.uoitlibrarybooking.userinterface.calendar.Calendar; import com.objectivetruth.uoitlibrarybooking.userinterface.calendar.grid.Grid; import com.objectivetruth.uoitlibrarybooking.userinterface.calendar.grid.common.GridAdapter; diff --git a/app/src/main/java/com/objectivetruth/uoitlibrarybooking/data/models/BookingInteractionModel.java b/app/src/main/java/com/objectivetruth/uoitlibrarybooking/data/models/BookingInteractionModel.java index 300b866..97ddcef 100644 --- a/app/src/main/java/com/objectivetruth/uoitlibrarybooking/data/models/BookingInteractionModel.java +++ b/app/src/main/java/com/objectivetruth/uoitlibrarybooking/data/models/BookingInteractionModel.java @@ -6,6 +6,8 @@ import com.objectivetruth.uoitlibrarybooking.data.models.calendarmodel.CalendarDay; import com.objectivetruth.uoitlibrarybooking.data.models.calendarmodel.CalendarParser; import com.objectivetruth.uoitlibrarybooking.data.models.calendarmodel.CalendarWebService; +import com.objectivetruth.uoitlibrarybooking.data.models.usermodel.MyAccountDataLoginState; +import com.objectivetruth.uoitlibrarybooking.data.models.usermodel.MyAccountDataLoginStateType; import com.objectivetruth.uoitlibrarybooking.data.models.usermodel.UserCredentials; import com.objectivetruth.uoitlibrarybooking.statelessutilities.LeftOrRight; import com.objectivetruth.uoitlibrarybooking.statelessutilities.Triple; @@ -14,6 +16,7 @@ import rx.android.schedulers.AndroidSchedulers; import rx.functions.Action1; import rx.functions.Func1; +import rx.functions.Func2; import rx.schedulers.Schedulers; import rx.subjects.PublishSubject; import rx.subjects.ReplaySubject; @@ -82,33 +85,62 @@ public PublishSubject getBookingInteractionE private void _bindUserRequestEventToWebCalls( PublishSubject bookingInteractionEventUserRequestPublishSubject) { bookingInteractionEventUserRequestPublishSubject + .withLatestFrom(userModel.getLoginStateObservable(), + new Func2>() { + @Override + public Pair call( + BookingInteractionEventUserRequest userRequest, + MyAccountDataLoginState myAccountDataLoginState) { + return new Pair<>(userRequest, myAccountDataLoginState); + } + }) .subscribeOn(Schedulers.computation()) .observeOn(Schedulers.computation()) - .subscribe(new Action1() { + .subscribe(new Action1>() { @Override - public void call(BookingInteractionEventUserRequest s) { - _executeBasedOnUserRequestType(s); + public void call(Pair p) { + _executeBasedOnUserRequestType(p); } }); } - private void _executeBasedOnUserRequestType(BookingInteractionEventUserRequest userRequest) { - switch(userRequest.type) { - case BOOK_REQUEST: - _doBookRequest(userRequest); - break; - case JOINORLEAVE_GETTING_SPINNER_VALUES_REQUEST: - _doJoinOrLeaveGettingSpinnerValuesRequest(userRequest); - break; - case JOINORLEAVE_LEAVE_REQUEST: - _doJoinOrLeaveLeaveRequest(userRequest); - break; - case JOINORLEAVE_JOIN_REQUEST: - _doJoinOrLeaveJoinRequest(userRequest); - break; + private void _executeBasedOnUserRequestType(Pair pair) { + BookingInteractionEventUserRequest userRequest = pair.first; + MyAccountDataLoginState loginState = pair.second; + if(loginState.type == MyAccountDataLoginStateType.SIGNED_IN) { + switch(userRequest.type) { + case BOOK_REQUEST: + _doBookRequest(userRequest); + break; + case JOINORLEAVE_GETTING_SPINNER_VALUES_REQUEST: + _doJoinOrLeaveGettingSpinnerValuesRequest(userRequest); + break; + case JOINORLEAVE_LEAVE_REQUEST: + _doJoinOrLeaveLeaveRequest(userRequest); + break; + case JOINORLEAVE_JOIN_REQUEST: + _doJoinOrLeaveJoinRequest(userRequest); + break; + default: + Timber.e(new Throwable(new IllegalStateException("Unknown Request Type")), + "A request was submitted but that request type was unknown: " + userRequest.type); + } + }else { + Timber.w("Aborting a users request because they are not logged in, sending login event to front end"); + _sendEventToShowLoginScreen(userRequest); } } + private void _sendEventToShowLoginScreen(BookingInteractionEventUserRequest userRequest) { + BookingInteractionEvent eventToFire = new BookingInteractionEvent( + userRequest.timeCell, + BookingInteractionEventType.CREDENTIALS_LOGIN, + userRequest.dayOfMonthNumber, + userRequest.monthWord); + getBookingInteractionEventReplaySubject().onNext(eventToFire); + } + private void _doJoinOrLeaveJoinRequest(final BookingInteractionEventUserRequest userRequest) { final String LOG_PREFIX = "JoinOrLeave-Join Flow: "; @@ -542,7 +574,7 @@ public void onNext(LeftOrRight result) { BookingInteractionEvent eventToFire = new BookingInteractionEvent( userRequest.timeCell, - BookingInteractionEventType.SUCCESS, + BookingInteractionEventType.BOOK_SUCCESS, userRequest.dayOfMonthNumber, userRequest.monthWord); eventToFire.message = result.getRight(); @@ -601,7 +633,9 @@ public void call(BookingInteractionScreenLoadEvent b) { public ReplaySubject getBookingInteractionEventReplaySubject() { if(bookingInteractionEventReplaySubject == null || bookingInteractionEventReplaySubject.hasCompleted()) { bookingInteractionEventReplaySubject = ReplaySubject.createWithSize(1); - bookingInteractionEventObservable = bookingInteractionEventReplaySubject.asObservable(); + bookingInteractionEventObservable = bookingInteractionEventReplaySubject + .asObservable() + .subscribeOn(Schedulers.computation()); return bookingInteractionEventReplaySubject; }else { return bookingInteractionEventReplaySubject; diff --git a/app/src/main/java/com/objectivetruth/uoitlibrarybooking/data/models/bookinginteractionmodel/BookingInteractionEventType.java b/app/src/main/java/com/objectivetruth/uoitlibrarybooking/data/models/bookinginteractionmodel/BookingInteractionEventType.java index af2b96a..9307caf 100644 --- a/app/src/main/java/com/objectivetruth/uoitlibrarybooking/data/models/bookinginteractionmodel/BookingInteractionEventType.java +++ b/app/src/main/java/com/objectivetruth/uoitlibrarybooking/data/models/bookinginteractionmodel/BookingInteractionEventType.java @@ -10,6 +10,7 @@ public enum BookingInteractionEventType { BOOK, BOOK_ERROR, BOOK_RUNNING, + BOOK_SUCCESS, /** * When the user clicks on a booking that is being competed for, this loads the initial form that must be filled @@ -43,15 +44,15 @@ public enum BookingInteractionEventType { /** * The case where the booking is confirmed and user clicks to open, they can either join or leave */ - VIEWJOINORLEAVE, - VIEWJOINORLEAVE_RUNNING, - VIEWJOINORLEAVE_ERROR, - VIEWJOINORLEAVE_SUCCESS, + VIEWLEAVEORJOIN, + VIEWLEAVEORJOIN_RUNNING, + VIEWLEAVEORJOIN_ERROR, + VIEWLEAVEORJOIN_SUCCESS, /** - * When an interaction flow succeeds + * When the user isn't logged in, will throw this to tell frontend to show login screens */ - SUCCESS, + CREDENTIALS_LOGIN, /** * Incase a cell contains unknown information, should error gracefully if this happens diff --git a/app/src/main/java/com/objectivetruth/uoitlibrarybooking/data/models/usermodel/MyAccountDataLoginState.java b/app/src/main/java/com/objectivetruth/uoitlibrarybooking/data/models/usermodel/MyAccountDataLoginState.java index fb7b360..da80e7b 100644 --- a/app/src/main/java/com/objectivetruth/uoitlibrarybooking/data/models/usermodel/MyAccountDataLoginState.java +++ b/app/src/main/java/com/objectivetruth/uoitlibrarybooking/data/models/usermodel/MyAccountDataLoginState.java @@ -10,4 +10,13 @@ public MyAccountDataLoginState(MyAccountDataLoginStateType type, UserData userDa this.userData = userData; this.exception = exception; } + + @Override + public String toString() { + return "MyAccountDataLoginState{" + + "type=" + type + + ", exception=" + exception + + ", userData=" + userData + + '}'; + } } diff --git a/app/src/main/java/com/objectivetruth/uoitlibrarybooking/userinterface/BookingInteraction/BookingInteraction.java b/app/src/main/java/com/objectivetruth/uoitlibrarybooking/userinterface/BookingInteraction/BookingInteraction.java index 02697a0..fc4eb40 100644 --- a/app/src/main/java/com/objectivetruth/uoitlibrarybooking/userinterface/BookingInteraction/BookingInteraction.java +++ b/app/src/main/java/com/objectivetruth/uoitlibrarybooking/userinterface/BookingInteraction/BookingInteraction.java @@ -16,8 +16,10 @@ import com.objectivetruth.uoitlibrarybooking.data.models.BookingInteractionModel; import com.objectivetruth.uoitlibrarybooking.data.models.bookinginteractionmodel.BookingInteractionEvent; import com.objectivetruth.uoitlibrarybooking.userinterface.BookingInteraction.common.Utils; +import com.objectivetruth.uoitlibrarybooking.userinterface.BookingInteraction.flows.*; import rx.Observable; import rx.Subscription; +import rx.android.schedulers.AndroidSchedulers; import rx.functions.Action1; import timber.log.Timber; @@ -66,6 +68,7 @@ public boolean onOptionsItemSelected(MenuItem item) { private void _setupViewBindings(Observable bookingInteractionEventObservable) { bookingInteractionEventSubscription = bookingInteractionEventObservable + .observeOn(AndroidSchedulers.mainThread()) .subscribe(new Action1() { @Override public void call(BookingInteractionEvent bookingInteractionEvent) { @@ -107,7 +110,10 @@ private Fragment _getFragmentForEvent(BookingInteractionEvent bookingInteraction case BOOK_ERROR: Timber.i("Showing: Book"); return Book.newInstance(bookingInteractionEvent); - case SUCCESS: + case BOOK_SUCCESS: + case JOIN_OR_LEAVE_JOIN_SUCCESS: + case JOIN_OR_LEAVE_LEAVE_SUCCESS: + case VIEWLEAVEORJOIN_SUCCESS: Timber.i("Showing: Success"); return Success.newInstance(bookingInteractionEvent); case JOIN_OR_LEAVE: @@ -118,11 +124,14 @@ private Fragment _getFragmentForEvent(BookingInteractionEvent bookingInteraction case JOIN_OR_LEAVE_LEAVE_RUNNING: Timber.i("Showing: JoinOrLeave"); return JoinOrLeave.newInstance(bookingInteractionEvent); - case VIEWJOINORLEAVE: - case VIEWJOINORLEAVE_ERROR: - case VIEWJOINORLEAVE_RUNNING: + case VIEWLEAVEORJOIN: + case VIEWLEAVEORJOIN_ERROR: + case VIEWLEAVEORJOIN_RUNNING: Timber.i("Showing: ViewLeaveOrJoin"); return ViewLeaveOrJoin.newInstance(bookingInteractionEvent); + case CREDENTIALS_LOGIN: + Timber.i("Showing: CredentialsLogin"); + return CredentialsLogin.newInstance(bookingInteractionEvent); default: Timber.w("No valid Fragment requested, showing Success"); return Success.newInstance(bookingInteractionEvent); @@ -145,10 +154,10 @@ private boolean _doesCurrentContentFrameNeedToBeChanged(BookingInteractionEvent case BOOK_RUNNING: case BOOK_ERROR: return !(currentFragmentInContentFrame instanceof Book); - case SUCCESS: + case BOOK_SUCCESS: case JOIN_OR_LEAVE_LEAVE_SUCCESS: case JOIN_OR_LEAVE_JOIN_SUCCESS: - case VIEWJOINORLEAVE_SUCCESS: + case VIEWLEAVEORJOIN_SUCCESS: return !(currentFragmentInContentFrame instanceof Success); case JOIN_OR_LEAVE: case JOIN_OR_LEAVE_GETTING_SPINNER_VALUES_ERROR: @@ -160,10 +169,12 @@ private boolean _doesCurrentContentFrameNeedToBeChanged(BookingInteractionEvent case JOIN_OR_LEAVE_JOIN_RUNNING: case JOIN_OR_LEAVE_GETTING_SPINNER_VALUES_ERROR_NO_VALUES: return !(currentFragmentInContentFrame instanceof JoinOrLeave); - case VIEWJOINORLEAVE: - case VIEWJOINORLEAVE_ERROR: - case VIEWJOINORLEAVE_RUNNING: + case VIEWLEAVEORJOIN: + case VIEWLEAVEORJOIN_ERROR: + case VIEWLEAVEORJOIN_RUNNING: return !(currentFragmentInContentFrame instanceof ViewLeaveOrJoin); + case CREDENTIALS_LOGIN: + return !(currentFragmentInContentFrame instanceof CredentialsLogin); default: Toast.makeText(getActivity(), R.string.ERROR_GENERAL, Toast.LENGTH_LONG).show(); Timber.w(new Throwable(new IllegalStateException("No expected values match type: " diff --git a/app/src/main/java/com/objectivetruth/uoitlibrarybooking/userinterface/BookingInteraction/Book.java b/app/src/main/java/com/objectivetruth/uoitlibrarybooking/userinterface/BookingInteraction/flows/Book.java similarity index 99% rename from app/src/main/java/com/objectivetruth/uoitlibrarybooking/userinterface/BookingInteraction/Book.java rename to app/src/main/java/com/objectivetruth/uoitlibrarybooking/userinterface/BookingInteraction/flows/Book.java index 0e20999..867338d 100644 --- a/app/src/main/java/com/objectivetruth/uoitlibrarybooking/userinterface/BookingInteraction/Book.java +++ b/app/src/main/java/com/objectivetruth/uoitlibrarybooking/userinterface/BookingInteraction/flows/Book.java @@ -1,4 +1,4 @@ -package com.objectivetruth.uoitlibrarybooking.userinterface.BookingInteraction; +package com.objectivetruth.uoitlibrarybooking.userinterface.BookingInteraction.flows; import android.content.DialogInterface; import android.os.Bundle; diff --git a/app/src/main/java/com/objectivetruth/uoitlibrarybooking/userinterface/BookingInteraction/flows/CredentialsLogin.java b/app/src/main/java/com/objectivetruth/uoitlibrarybooking/userinterface/BookingInteraction/flows/CredentialsLogin.java new file mode 100644 index 0000000..7203874 --- /dev/null +++ b/app/src/main/java/com/objectivetruth/uoitlibrarybooking/userinterface/BookingInteraction/flows/CredentialsLogin.java @@ -0,0 +1,37 @@ +package com.objectivetruth.uoitlibrarybooking.userinterface.BookingInteraction.flows; + +import android.os.Bundle; +import android.support.annotation.Nullable; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import com.objectivetruth.uoitlibrarybooking.R; +import com.objectivetruth.uoitlibrarybooking.data.models.bookinginteractionmodel.BookingInteractionEvent; +import com.objectivetruth.uoitlibrarybooking.userinterface.BookingInteraction.common.InteractionFragment; + +public class CredentialsLogin extends InteractionFragment{ + private BookingInteractionEvent bookingInteractionEvent; + + @Nullable + @Override + public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { + View view = inflater.inflate(R.layout.my_account_login, container, false); + return view; + } + + @Override + protected void setupViewBindings() { + + } + + @Override + protected void teardownViewBindings() { + + } + + public static CredentialsLogin newInstance(BookingInteractionEvent bookingInteractionEvent) { + CredentialsLogin fragment = new CredentialsLogin(); + fragment.bookingInteractionEvent = bookingInteractionEvent; + return fragment; + } +} diff --git a/app/src/main/java/com/objectivetruth/uoitlibrarybooking/userinterface/BookingInteraction/JoinOrLeave.java b/app/src/main/java/com/objectivetruth/uoitlibrarybooking/userinterface/BookingInteraction/flows/JoinOrLeave.java similarity index 99% rename from app/src/main/java/com/objectivetruth/uoitlibrarybooking/userinterface/BookingInteraction/JoinOrLeave.java rename to app/src/main/java/com/objectivetruth/uoitlibrarybooking/userinterface/BookingInteraction/flows/JoinOrLeave.java index 3eb37c6..248f8ff 100644 --- a/app/src/main/java/com/objectivetruth/uoitlibrarybooking/userinterface/BookingInteraction/JoinOrLeave.java +++ b/app/src/main/java/com/objectivetruth/uoitlibrarybooking/userinterface/BookingInteraction/flows/JoinOrLeave.java @@ -1,4 +1,4 @@ -package com.objectivetruth.uoitlibrarybooking.userinterface.BookingInteraction; +package com.objectivetruth.uoitlibrarybooking.userinterface.BookingInteraction.flows; import android.os.Bundle; import android.support.annotation.Nullable; diff --git a/app/src/main/java/com/objectivetruth/uoitlibrarybooking/userinterface/BookingInteraction/Success.java b/app/src/main/java/com/objectivetruth/uoitlibrarybooking/userinterface/BookingInteraction/flows/Success.java similarity index 99% rename from app/src/main/java/com/objectivetruth/uoitlibrarybooking/userinterface/BookingInteraction/Success.java rename to app/src/main/java/com/objectivetruth/uoitlibrarybooking/userinterface/BookingInteraction/flows/Success.java index 82a8908..844f0ea 100644 --- a/app/src/main/java/com/objectivetruth/uoitlibrarybooking/userinterface/BookingInteraction/Success.java +++ b/app/src/main/java/com/objectivetruth/uoitlibrarybooking/userinterface/BookingInteraction/flows/Success.java @@ -1,4 +1,4 @@ -package com.objectivetruth.uoitlibrarybooking.userinterface.BookingInteraction; +package com.objectivetruth.uoitlibrarybooking.userinterface.BookingInteraction.flows; import android.os.Bundle; import android.support.annotation.Nullable; diff --git a/app/src/main/java/com/objectivetruth/uoitlibrarybooking/userinterface/BookingInteraction/ViewLeaveOrJoin.java b/app/src/main/java/com/objectivetruth/uoitlibrarybooking/userinterface/BookingInteraction/flows/ViewLeaveOrJoin.java similarity index 94% rename from app/src/main/java/com/objectivetruth/uoitlibrarybooking/userinterface/BookingInteraction/ViewLeaveOrJoin.java rename to app/src/main/java/com/objectivetruth/uoitlibrarybooking/userinterface/BookingInteraction/flows/ViewLeaveOrJoin.java index b77b68c..8d33cd6 100644 --- a/app/src/main/java/com/objectivetruth/uoitlibrarybooking/userinterface/BookingInteraction/ViewLeaveOrJoin.java +++ b/app/src/main/java/com/objectivetruth/uoitlibrarybooking/userinterface/BookingInteraction/flows/ViewLeaveOrJoin.java @@ -1,4 +1,4 @@ -package com.objectivetruth.uoitlibrarybooking.userinterface.BookingInteraction; +package com.objectivetruth.uoitlibrarybooking.userinterface.BookingInteraction.flows; import android.os.Bundle; import android.support.annotation.Nullable; @@ -8,6 +8,7 @@ import android.widget.Button; import android.widget.ImageView; import android.widget.TextView; +import android.widget.Toast; import com.objectivetruth.uoitlibrarybooking.R; import com.objectivetruth.uoitlibrarybooking.app.UOITLibraryBookingApp; import com.objectivetruth.uoitlibrarybooking.data.models.BookingInteractionModel; @@ -15,8 +16,6 @@ import com.objectivetruth.uoitlibrarybooking.data.models.calendarmodel.CalendarDay; import com.objectivetruth.uoitlibrarybooking.data.models.calendarmodel.TimeCell; import com.objectivetruth.uoitlibrarybooking.userinterface.BookingInteraction.common.InteractionFragment; -import rx.android.schedulers.AndroidSchedulers; -import rx.functions.Action1; import rx.subscriptions.CompositeSubscription; import timber.log.Timber; @@ -54,6 +53,7 @@ public View onCreateView(LayoutInflater inflater, public void onClick(View view) { Timber.i("Clicked VIEWLEAVEORJOIN-JOIN button"); _hideErrorMessage(); + Toast.makeText(getActivity(), "Not implemented", Toast.LENGTH_LONG).show(); /* BookingInteractionEventUserRequest request = new BookingInteractionEventUserRequest( timeCell, BookingInteractionEventUserRequestType.VIEWLEAVEORJOIN_JOIN, @@ -71,6 +71,7 @@ public void onClick(View view) { public void onClick(View view) { Timber.i("Clicked VIEWLEAVEORJOIN-LEAVE button"); _hideErrorMessage(); + Toast.makeText(getActivity(), "Not implemented", Toast.LENGTH_LONG).show(); /* BookingInteractionEventUserRequest request = new BookingInteractionEventUserRequest( timeCell, BookingInteractionEventUserRequestType.VIEWLEAVEORJOIN_LEAVE, @@ -102,7 +103,7 @@ public void onCreate(@Nullable Bundle savedInstanceState) { @Override protected void setupViewBindings() { - subscriptions.add(bookingInteractionModel.getBookingInteractionEventObservable() +/* subscriptions.add(bookingInteractionModel.getBookingInteractionEventObservable() .observeOn(AndroidSchedulers.mainThread()) .subscribe(new Action1() { @@ -117,7 +118,7 @@ public void call(BookingInteractionEvent bookingInteractionEvent) { // No default, should fall through } } - })); + }));*/ } @Override diff --git a/app/src/main/java/com/objectivetruth/uoitlibrarybooking/userinterface/calendar/grid/common/GridAdapter.java b/app/src/main/java/com/objectivetruth/uoitlibrarybooking/userinterface/calendar/grid/common/GridAdapter.java index 6fafd97..9458818 100644 --- a/app/src/main/java/com/objectivetruth/uoitlibrarybooking/userinterface/calendar/grid/common/GridAdapter.java +++ b/app/src/main/java/com/objectivetruth/uoitlibrarybooking/userinterface/calendar/grid/common/GridAdapter.java @@ -230,6 +230,8 @@ private static BookingInteractionEventType _getBookingInteractionEventTypeBasedO return BookingInteractionEventType.BOOK; case "joinorleave.aspx": return BookingInteractionEventType.JOIN_OR_LEAVE; + case "viewleaveorjoin.aspx": + return BookingInteractionEventType.VIEWLEAVEORJOIN; default: return BookingInteractionEventType.UNKNOWN; } From 6365f91de0657df2e3bfe9617a43be9e61930579 Mon Sep 17 00:00:00 2001 From: ObjectiveTruth Date: Thu, 1 Sep 2016 08:01:22 -0600 Subject: [PATCH 51/53] Credentials login will be shown when doing a privelaged action --- app/build.gradle | 6 +- .../uoitlibrarybooking/app/AppComponent.java | 6 +- .../BookingInteractionEvent.java | 12 +++ .../bookinginteractionmodel/common/Utils.java | 25 ++++++ .../flows/CredentialsLogin.java | 83 ++++++++++++++++++- .../calendar/grid/common/GridAdapter.java | 16 +--- .../userinterface/myaccount/MyAccount.java | 3 +- ...okinginteraction_credentialslogin_root.xml | 7 ++ app/src/main/res/values/messages_success.xml | 1 + 9 files changed, 134 insertions(+), 25 deletions(-) create mode 100644 app/src/main/java/com/objectivetruth/uoitlibrarybooking/data/models/bookinginteractionmodel/common/Utils.java create mode 100644 app/src/main/res/layout/bookinginteraction_credentialslogin_root.xml diff --git a/app/build.gradle b/app/build.gradle index 3440310..5cb5b18 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -14,13 +14,13 @@ buildscript { } dependencies { // Main Android gradle plugin allows building of the entire play toolchain - classpath 'com.android.tools.build:gradle:2.2.0-beta2' + classpath 'com.android.tools.build:gradle:2.2.0-beta3' // Fabric repository for Crashlytics. classpath 'io.fabric.tools:gradle:1.+' // Adds tasks to auto publish apks to Google App Store. https://github.com/Triple-T/gradle-play-publisher classpath 'com.github.triplet.gradle:play-publisher:1.1.5' // Spoon is a fantastic testing hardness for logging tests easily - classpath 'com.stanfy.spoon:spoon-gradle-plugin:1.2.0' + classpath 'com.stanfy.spoon:spoon-gradle-plugin:1.2.2' // Prints the dexcount when making new apks, useful for keeping under the 65k limit // See more info here http://developer.android.com/tools/building/multidex.html classpath 'com.getkeepsafe.dexcount:dexcount-gradle-plugin:0.4.4' @@ -183,7 +183,7 @@ dependencies { androidTestCompile 'com.android.support.test.espresso:espresso-core:2.2.1' androidTestCompile 'com.android.support.test.espresso:espresso-intents:2.1' androidTestCompile 'org.hamcrest:hamcrest-library:1.3' - androidTestCompile 'com.squareup.spoon:spoon-client:1.6.1' + androidTestCompile 'com.squareup.spoon:spoon-client:1.6.4' // Excluding these modules fixed Inflation error. Reference http://stackoverflow.com/a/30715011/1293521 androidTestCompile ('com.android.support.test.espresso:espresso-contrib:2.2.1') { exclude group: 'com.android.support', module: 'appcompat' diff --git a/app/src/main/java/com/objectivetruth/uoitlibrarybooking/app/AppComponent.java b/app/src/main/java/com/objectivetruth/uoitlibrarybooking/app/AppComponent.java index fecb200..ecbef24 100644 --- a/app/src/main/java/com/objectivetruth/uoitlibrarybooking/app/AppComponent.java +++ b/app/src/main/java/com/objectivetruth/uoitlibrarybooking/app/AppComponent.java @@ -7,10 +7,7 @@ import com.objectivetruth.uoitlibrarybooking.data.models.calendarmodel.CalendarWebService; import com.objectivetruth.uoitlibrarybooking.data.models.usermodel.UserWebService; import com.objectivetruth.uoitlibrarybooking.userinterface.BookingInteraction.*; -import com.objectivetruth.uoitlibrarybooking.userinterface.BookingInteraction.flows.Book; -import com.objectivetruth.uoitlibrarybooking.userinterface.BookingInteraction.flows.JoinOrLeave; -import com.objectivetruth.uoitlibrarybooking.userinterface.BookingInteraction.flows.Success; -import com.objectivetruth.uoitlibrarybooking.userinterface.BookingInteraction.flows.ViewLeaveOrJoin; +import com.objectivetruth.uoitlibrarybooking.userinterface.BookingInteraction.flows.*; import com.objectivetruth.uoitlibrarybooking.userinterface.calendar.Calendar; import com.objectivetruth.uoitlibrarybooking.userinterface.calendar.grid.Grid; import com.objectivetruth.uoitlibrarybooking.userinterface.calendar.grid.common.GridAdapter; @@ -37,6 +34,7 @@ public interface AppComponent { void inject(MyAccountLoaded myAccountLoaded); void inject(JoinOrLeave joinOrLeave); void inject(ViewLeaveOrJoin viewLeaveOrJoin); + void inject(CredentialsLogin credentialsLogin); void inject(Success success); void inject(GridAdapter gridAdapter); void inject(Book book); diff --git a/app/src/main/java/com/objectivetruth/uoitlibrarybooking/data/models/bookinginteractionmodel/BookingInteractionEvent.java b/app/src/main/java/com/objectivetruth/uoitlibrarybooking/data/models/bookinginteractionmodel/BookingInteractionEvent.java index 01443cd..2e6b84a 100644 --- a/app/src/main/java/com/objectivetruth/uoitlibrarybooking/data/models/bookinginteractionmodel/BookingInteractionEvent.java +++ b/app/src/main/java/com/objectivetruth/uoitlibrarybooking/data/models/bookinginteractionmodel/BookingInteractionEvent.java @@ -21,4 +21,16 @@ public BookingInteractionEvent(TimeCell timeCell, BookingInteractionEventType ty this.dayOfMonthNumber = dayOfMonthNumber; this.monthWord = monthWord; } + + @Override + public String toString() { + return "BookingInteractionEvent{" + + "timeCell=" + timeCell + + ", type=" + type + + ", dayOfMonthNumber='" + dayOfMonthNumber + '\'' + + ", monthWord='" + monthWord + '\'' + + ", message='" + message + '\'' + + ", joinOrLeaveGetSpinnerResult=" + joinOrLeaveGetSpinnerResult + + '}'; + } } diff --git a/app/src/main/java/com/objectivetruth/uoitlibrarybooking/data/models/bookinginteractionmodel/common/Utils.java b/app/src/main/java/com/objectivetruth/uoitlibrarybooking/data/models/bookinginteractionmodel/common/Utils.java new file mode 100644 index 0000000..513ed8e --- /dev/null +++ b/app/src/main/java/com/objectivetruth/uoitlibrarybooking/data/models/bookinginteractionmodel/common/Utils.java @@ -0,0 +1,25 @@ +package com.objectivetruth.uoitlibrarybooking.data.models.bookinginteractionmodel.common; + +import com.objectivetruth.uoitlibrarybooking.data.models.bookinginteractionmodel.BookingInteractionEventType; +import com.objectivetruth.uoitlibrarybooking.data.models.calendarmodel.TimeCell; + +public class Utils { + /** + * Returns the event type based on the timecell provided. This is useful for designating what event corresponds + * to what timecell type + * @param timeCell + * @return + */ + public static BookingInteractionEventType getBookingInteractionEventTypeBasedOnTimeCell(TimeCell timeCell) { + switch(timeCell.param_next) { + case "book.aspx": + return BookingInteractionEventType.BOOK; + case "joinorleave.aspx": + return BookingInteractionEventType.JOIN_OR_LEAVE; + case "viewleaveorjoin.aspx": + return BookingInteractionEventType.VIEWLEAVEORJOIN; + default: + return BookingInteractionEventType.UNKNOWN; + } + } +} diff --git a/app/src/main/java/com/objectivetruth/uoitlibrarybooking/userinterface/BookingInteraction/flows/CredentialsLogin.java b/app/src/main/java/com/objectivetruth/uoitlibrarybooking/userinterface/BookingInteraction/flows/CredentialsLogin.java index 7203874..902dbc9 100644 --- a/app/src/main/java/com/objectivetruth/uoitlibrarybooking/userinterface/BookingInteraction/flows/CredentialsLogin.java +++ b/app/src/main/java/com/objectivetruth/uoitlibrarybooking/userinterface/BookingInteraction/flows/CredentialsLogin.java @@ -5,33 +5,110 @@ import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; +import android.widget.Toast; import com.objectivetruth.uoitlibrarybooking.R; +import com.objectivetruth.uoitlibrarybooking.app.UOITLibraryBookingApp; +import com.objectivetruth.uoitlibrarybooking.data.models.BookingInteractionModel; +import com.objectivetruth.uoitlibrarybooking.data.models.UserModel; import com.objectivetruth.uoitlibrarybooking.data.models.bookinginteractionmodel.BookingInteractionEvent; +import com.objectivetruth.uoitlibrarybooking.data.models.usermodel.MyAccountDataLoginState; import com.objectivetruth.uoitlibrarybooking.userinterface.BookingInteraction.common.InteractionFragment; +import com.objectivetruth.uoitlibrarybooking.userinterface.loading.Loading; +import com.objectivetruth.uoitlibrarybooking.userinterface.myaccount.login.LoginFragment; +import rx.Observer; +import rx.android.schedulers.AndroidSchedulers; +import rx.subscriptions.CompositeSubscription; +import timber.log.Timber; + +import javax.inject.Inject; + +import static com.objectivetruth.uoitlibrarybooking.data.models.bookinginteractionmodel.common.Utils.getBookingInteractionEventTypeBasedOnTimeCell; public class CredentialsLogin extends InteractionFragment{ - private BookingInteractionEvent bookingInteractionEvent; + // The event that the user originally requested before they were sent to the credentials login + private BookingInteractionEvent originatingBookingInteractionEvent; + private CompositeSubscription subscriptions = new CompositeSubscription(); + @Inject UserModel userModel; + @Inject BookingInteractionModel bookingInteractionModel; @Nullable @Override public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { - View view = inflater.inflate(R.layout.my_account_login, container, false); + View view = inflater.inflate(R.layout.bookinginteraction_credentialslogin_root, container, false); return view; } @Override protected void setupViewBindings() { + subscriptions.add(userModel.getLoginStateObservable() + .observeOn(AndroidSchedulers.mainThread()) + .subscribe(new Observer() { + @Override + public void onCompleted() { + // Do nothing + } + + @Override + public void onError(Throwable e) { + // Do nothing + } + @Override + public void onNext(MyAccountDataLoginState myAccountDataLoginState) { + Timber.i("On next called: " + myAccountDataLoginState.type); + Timber.v(myAccountDataLoginState.toString()); + switch(myAccountDataLoginState.type) { + case SIGNED_IN: + Toast.makeText(getActivity(), R.string.SUCCESS_SIGNED_IN, Toast.LENGTH_LONG).show(); + BookingInteractionEvent eventToFire = new BookingInteractionEvent( + originatingBookingInteractionEvent.timeCell, + getBookingInteractionEventTypeBasedOnTimeCell( + originatingBookingInteractionEvent.timeCell), + originatingBookingInteractionEvent.dayOfMonthNumber, + originatingBookingInteractionEvent.monthWord); + bookingInteractionModel + .getBookingInteractionEventReplaySubject() + .onNext(eventToFire); + break; + case RUNNING: + _showFullscreenLoading(); + break; + case SIGNED_OUT: + case ERROR: + default: + _showLoginFragment(myAccountDataLoginState); + } + } + })); } @Override protected void teardownViewBindings() { + subscriptions.unsubscribe(); + } + private void _showLoginFragment(MyAccountDataLoginState myAccountDataLoginState) { + getChildFragmentManager().beginTransaction() + .replace(R.id.bookinginteraction_credentialslogin_content_frame, + LoginFragment.newInstance(myAccountDataLoginState)) + .commit(); } public static CredentialsLogin newInstance(BookingInteractionEvent bookingInteractionEvent) { CredentialsLogin fragment = new CredentialsLogin(); - fragment.bookingInteractionEvent = bookingInteractionEvent; + fragment.originatingBookingInteractionEvent = bookingInteractionEvent; return fragment; } + + @Override + public void onCreate(@Nullable Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + ((UOITLibraryBookingApp) getActivity().getApplication()).getComponent().inject(this); + } + + private void _showFullscreenLoading() { + getChildFragmentManager().beginTransaction() + .replace(R.id.bookinginteraction_credentialslogin_content_frame, Loading.newInstance()) + .commit(); + } } diff --git a/app/src/main/java/com/objectivetruth/uoitlibrarybooking/userinterface/calendar/grid/common/GridAdapter.java b/app/src/main/java/com/objectivetruth/uoitlibrarybooking/userinterface/calendar/grid/common/GridAdapter.java index 9458818..3524233 100644 --- a/app/src/main/java/com/objectivetruth/uoitlibrarybooking/userinterface/calendar/grid/common/GridAdapter.java +++ b/app/src/main/java/com/objectivetruth/uoitlibrarybooking/userinterface/calendar/grid/common/GridAdapter.java @@ -8,7 +8,6 @@ import com.objectivetruth.uoitlibrarybooking.R; import com.objectivetruth.uoitlibrarybooking.app.UOITLibraryBookingApp; import com.objectivetruth.uoitlibrarybooking.data.models.BookingInteractionModel; -import com.objectivetruth.uoitlibrarybooking.data.models.bookinginteractionmodel.BookingInteractionEventType; import com.objectivetruth.uoitlibrarybooking.data.models.bookinginteractionmodel.BookingInteractionScreenLoadEvent; import com.objectivetruth.uoitlibrarybooking.data.models.calendarmodel.CalendarDay; import com.objectivetruth.uoitlibrarybooking.data.models.calendarmodel.TimeCell; @@ -18,6 +17,7 @@ import javax.inject.Inject; import java.util.Random; +import static com.objectivetruth.uoitlibrarybooking.data.models.bookinginteractionmodel.common.Utils.getBookingInteractionEventTypeBasedOnTimeCell; import static com.objectivetruth.uoitlibrarybooking.data.models.calendarmodel.TimeCellType.BOOKING_CONFIRMED; public class GridAdapter extends FixedTableAdapter { @@ -219,21 +219,9 @@ public void onClick(View view) { Timber.i("Clicked: " + timeCell.toString()); bookingInteractionModel.getBookingInteractionScreenLoadEventPublishSubject().onNext( new BookingInteractionScreenLoadEvent(timeCell, - _getBookingInteractionEventTypeBasedOnTimeCell(timeCell), + getBookingInteractionEventTypeBasedOnTimeCell(timeCell), calendarDay.extDayOfMonthNumber, calendarDay.extMonthWord)); } } - private static BookingInteractionEventType _getBookingInteractionEventTypeBasedOnTimeCell(TimeCell timeCell) { - switch(timeCell.param_next) { - case "book.aspx": - return BookingInteractionEventType.BOOK; - case "joinorleave.aspx": - return BookingInteractionEventType.JOIN_OR_LEAVE; - case "viewleaveorjoin.aspx": - return BookingInteractionEventType.VIEWLEAVEORJOIN; - default: - return BookingInteractionEventType.UNKNOWN; - } - } } diff --git a/app/src/main/java/com/objectivetruth/uoitlibrarybooking/userinterface/myaccount/MyAccount.java b/app/src/main/java/com/objectivetruth/uoitlibrarybooking/userinterface/myaccount/MyAccount.java index 7e02114..730ede7 100644 --- a/app/src/main/java/com/objectivetruth/uoitlibrarybooking/userinterface/myaccount/MyAccount.java +++ b/app/src/main/java/com/objectivetruth/uoitlibrarybooking/userinterface/myaccount/MyAccount.java @@ -97,7 +97,8 @@ public void onError(Throwable e) { @Override public void onNext(MyAccountDataLoginState myAccountDataLoginState) { - Timber.i("On next called: " + myAccountDataLoginState.type.name()); + Timber.i("On next called: " + myAccountDataLoginState.type); + Timber.v(myAccountDataLoginState.toString()); // We check if the AccountLoaded is showing because if it is, we do nothing since it takes // care of handling the events switch(myAccountDataLoginState.type) { diff --git a/app/src/main/res/layout/bookinginteraction_credentialslogin_root.xml b/app/src/main/res/layout/bookinginteraction_credentialslogin_root.xml new file mode 100644 index 0000000..e2881b7 --- /dev/null +++ b/app/src/main/res/layout/bookinginteraction_credentialslogin_root.xml @@ -0,0 +1,7 @@ + + + + diff --git a/app/src/main/res/values/messages_success.xml b/app/src/main/res/values/messages_success.xml index 597530f..ca906f2 100644 --- a/app/src/main/res/values/messages_success.xml +++ b/app/src/main/res/values/messages_success.xml @@ -1,4 +1,5 @@ Calendar refreshed + Successfully Signed in From f01e1c23c12ae61d01ebfc5c60f850b4a8a8d26c Mon Sep 17 00:00:00 2001 From: ObjectiveTruth Date: Thu, 1 Sep 2016 09:45:14 -0600 Subject: [PATCH 52/53] Added loading spinners to JoinorLeave and Create --- .../BookingInteraction/flows/Book.java | 40 +++++++++---- .../BookingInteraction/flows/JoinOrLeave.java | 58 +++++++++++++++++-- .../res/layout/bookinginteraction_book.xml | 10 ++++ .../layout/bookinginteraction_joinorleave.xml | 28 +++++++++ 4 files changed, 121 insertions(+), 15 deletions(-) diff --git a/app/src/main/java/com/objectivetruth/uoitlibrarybooking/userinterface/BookingInteraction/flows/Book.java b/app/src/main/java/com/objectivetruth/uoitlibrarybooking/userinterface/BookingInteraction/flows/Book.java index 867338d..0d0e894 100644 --- a/app/src/main/java/com/objectivetruth/uoitlibrarybooking/userinterface/BookingInteraction/flows/Book.java +++ b/app/src/main/java/com/objectivetruth/uoitlibrarybooking/userinterface/BookingInteraction/flows/Book.java @@ -14,14 +14,13 @@ import com.objectivetruth.uoitlibrarybooking.app.UOITLibraryBookingApp; import com.objectivetruth.uoitlibrarybooking.data.models.BookingInteractionModel; import com.objectivetruth.uoitlibrarybooking.data.models.bookinginteractionmodel.BookingInteractionEvent; -import com.objectivetruth.uoitlibrarybooking.data.models.bookinginteractionmodel.BookingInteractionEventType; import com.objectivetruth.uoitlibrarybooking.data.models.bookinginteractionmodel.BookingInteractionEventUserRequest; import com.objectivetruth.uoitlibrarybooking.data.models.bookinginteractionmodel.BookingInteractionEventUserRequestType; import com.objectivetruth.uoitlibrarybooking.data.models.bookinginteractionmodel.requestoptions.BookRequestOptions; import com.objectivetruth.uoitlibrarybooking.data.models.calendarmodel.TimeCell; import com.objectivetruth.uoitlibrarybooking.userinterface.BookingInteraction.common.InteractionFragment; +import rx.android.schedulers.AndroidSchedulers; import rx.functions.Action1; -import rx.functions.Func1; import rx.subscriptions.CompositeSubscription; import timber.log.Timber; @@ -38,6 +37,8 @@ public class Book extends InteractionFragment{ private EditText groupNameET; private EditText groupCodeET; + private ProgressBar createProgressBar; + private Button createButton; private ImageButton groupCodeInfoImageButton; private TextView errorTextView; private ImageView pictureOfRoom; @@ -56,6 +57,7 @@ public View onCreateView(LayoutInflater inflater, pictureOfRoom = (ImageView) view.findViewById(R.id.bookingInteraction_book_room_picture); groupCodeET = (EditText) view.findViewById(R.id.book_group_code_actual); groupNameET = (EditText) view.findViewById(R.id.bookingInteraction_book_groupname); + createProgressBar = (ProgressBar) view.findViewById(R.id.bookingInteraction_book_create_loadingbar); TextView roomNumberTextView = (TextView) view.findViewById(R.id.bookingInteraction_book_roomnumber); if(roomNumberTextView != null) {roomNumberTextView.setText(timeCell.param_room.toUpperCase());} @@ -63,7 +65,7 @@ public View onCreateView(LayoutInflater inflater, ImageButton commentButton = (ImageButton) view.findViewById(R.id.bookingInteraction_book_comment_button); _setupCommentButton(commentButton); - Button createButton = (Button) view.findViewById(R.id.bookingInteraction_book_create_button); + createButton = (Button) view.findViewById(R.id.bookingInteraction_book_create_button); _setupCreateButton(createButton); groupCodeInfoImageButton = (ImageButton) view.findViewById(R.id.bookingInteraction_book_group_code_info); @@ -84,16 +86,24 @@ static public Book newInstance(BookingInteractionEvent bookinginteractionEventWi protected void setupViewBindings() { subscriptions.add(bookingInteractionModel.getBookingInteractionEventObservable() - .filter(new Func1() { - @Override - public Boolean call(BookingInteractionEvent bookingInteractionEvent) { - return bookingInteractionEvent.type == BookingInteractionEventType.BOOK_ERROR; - } - }) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe(new Action1() { @Override public void call(BookingInteractionEvent bookingInteractionEvent) { - _showErrorMessage(bookingInteractionEvent.message); + switch(bookingInteractionEvent.type) { + case BOOK_ERROR: + _showErrorMessage(bookingInteractionEvent.message); + _showCreateButtonHideLoading(); + break; + case BOOK_RUNNING: + _hideCreateButtonShowLoading(); + break; + case BOOK: + _showCreateButtonHideLoading(); + break; + + } } })); } @@ -277,4 +287,14 @@ private void _showValidationErrorsAndAnimations() { YoYo.with(Techniques.Shake).delay(100).duration(900).playOn(groupCodeInfoImageButton); } } + + private void _hideCreateButtonShowLoading() { + createButton.setVisibility(View.INVISIBLE); + createProgressBar.setVisibility(View.VISIBLE); + } + + private void _showCreateButtonHideLoading() { + createButton.setVisibility(View.VISIBLE); + createProgressBar.setVisibility(View.INVISIBLE); + } } diff --git a/app/src/main/java/com/objectivetruth/uoitlibrarybooking/userinterface/BookingInteraction/flows/JoinOrLeave.java b/app/src/main/java/com/objectivetruth/uoitlibrarybooking/userinterface/BookingInteraction/flows/JoinOrLeave.java index 248f8ff..51ded01 100644 --- a/app/src/main/java/com/objectivetruth/uoitlibrarybooking/userinterface/BookingInteraction/flows/JoinOrLeave.java +++ b/app/src/main/java/com/objectivetruth/uoitlibrarybooking/userinterface/BookingInteraction/flows/JoinOrLeave.java @@ -36,6 +36,12 @@ public class JoinOrLeave extends InteractionFragment{ private TextView errorTextView; private Spinner joinSpinner; private Spinner leaveSpinner; + private ProgressBar joinProgressBar; + private ProgressBar leaveProgressBar; + private ProgressBar createProgressBar; + private Button joinButton; + private Button leaveButton; + private Button createButton; private ImageView pictureOfRoom; private String currentJoinSpinnerValue; private String currentLeaveSpinnerValue; @@ -51,11 +57,14 @@ public View onCreateView(LayoutInflater inflater, View view = inflater.inflate(R.layout.bookinginteraction_joinorleave, container, false); TextView roomNumberTextView = (TextView) view.findViewById(R.id.joinorleave_room_number); - Button createButton = (Button) view.findViewById(R.id.joinorleave_create_group_button); + createButton = (Button) view.findViewById(R.id.joinorleave_create_group_button); joinSpinner = (Spinner) view.findViewById(R.id.joinorleave_join_spinner); leaveSpinner = (Spinner) view.findViewById(R.id.joinorleave_leave_spinner); - Button leaveButton = (Button) view.findViewById(R.id.joinorleave_leave_grou_button); - Button joinButton = (Button) view.findViewById(R.id.joinorleave_join_button); + leaveButton = (Button) view.findViewById(R.id.joinorleave_leave_grou_button); + joinButton = (Button) view.findViewById(R.id.joinorleave_join_button); + joinProgressBar = (ProgressBar) view.findViewById(R.id.joinorleave_join_loadingbar); + leaveProgressBar = (ProgressBar) view.findViewById(R.id.joinorleave_leave_loadingbar); + createProgressBar = (ProgressBar) view.findViewById(R.id.joinorleave_create_loadingbar); errorTextView = (TextView) view.findViewById(R.id.joinorleave_error_text); pictureOfRoom = (ImageView) view.findViewById(R.id.room_landing_room_picture); @@ -152,32 +161,47 @@ protected void setupViewBindings() { @Override public void call(BookingInteractionEvent bookingInteractionEvent) { switch(bookingInteractionEvent.type) { + case JOIN_OR_LEAVE_JOIN_RUNNING: + case JOIN_OR_LEAVE_LEAVE_RUNNING: + _hideJoinAndLeaveButtonsAndShowLoadingBars(); + _hideCreateButtonAndShowCreateLoadingBar(); + break; case JOIN_OR_LEAVE_GETTING_SPINNER_VALUES_RUNNING: HashMap loadingSpinnerValues = new HashMap<>(); loadingSpinnerValues.put("Loading...", "loading"); _setupSpinnerWithValues(loadingSpinnerValues, loadingSpinnerValues); + _hideJoinAndLeaveButtonsAndShowLoadingBars(); + _showCreateButtonAndHideCreateLoadingBar(); break; + case JOIN_OR_LEAVE_GETTING_SPINNER_VALUES_ERROR_NO_VALUES: Toast.makeText(getActivity(), R.string.ERROR_INVALID_EVENT, Toast.LENGTH_LONG).show(); popFragmentBackstack(); break; + case JOIN_OR_LEAVE_GETTING_SPINNER_VALUES_ERROR: HashMap errorSpinnerValues = new HashMap<>(); errorSpinnerValues.put("ERROR", "error"); _setupSpinnerWithValues(errorSpinnerValues, errorSpinnerValues); _showErrorMessage(bookingInteractionEvent.message); + _showJoinAndLeaveButtonsAndHideLoadingBars(); + _showCreateButtonAndHideCreateLoadingBar(); break; + case JOIN_OR_LEAVE_GETTING_SPINNER_VALUES_SUCCESS: _setupSpinnerWithValues( bookingInteractionEvent.joinOrLeaveGetSpinnerResult.getLeft(), bookingInteractionEvent.joinOrLeaveGetSpinnerResult.getMiddle()); calendarDay = bookingInteractionEvent.joinOrLeaveGetSpinnerResult.getRight(); + _showJoinAndLeaveButtonsAndHideLoadingBars(); + _showCreateButtonAndHideCreateLoadingBar(); break; + case JOIN_OR_LEAVE_JOIN_ERROR: - _showErrorMessage(bookingInteractionEvent.message); - break; case JOIN_OR_LEAVE_LEAVE_ERROR: _showErrorMessage(bookingInteractionEvent.message); + _showJoinAndLeaveButtonsAndHideLoadingBars(); + _showCreateButtonAndHideCreateLoadingBar(); break; // No default, should fall through @@ -266,4 +290,28 @@ private void _hideErrorMessage() { errorTextView.setText(""); pictureOfRoom.setAlpha(FULLY_VISIBLE); } + + private void _hideJoinAndLeaveButtonsAndShowLoadingBars() { + joinButton.setVisibility(View.INVISIBLE); + leaveButton.setVisibility(View.INVISIBLE); + joinProgressBar.setVisibility(View.VISIBLE); + leaveProgressBar.setVisibility(View.VISIBLE); + } + + private void _showJoinAndLeaveButtonsAndHideLoadingBars() { + joinButton.setVisibility(View.VISIBLE); + leaveButton.setVisibility(View.VISIBLE); + joinProgressBar.setVisibility(View.INVISIBLE); + leaveProgressBar.setVisibility(View.INVISIBLE); + } + + private void _showCreateButtonAndHideCreateLoadingBar() { + createButton.setVisibility(View.VISIBLE); + createProgressBar.setVisibility(View.INVISIBLE); + } + + private void _hideCreateButtonAndShowCreateLoadingBar() { + createButton.setVisibility(View.INVISIBLE); + createProgressBar.setVisibility(View.VISIBLE); + } } diff --git a/app/src/main/res/layout/bookinginteraction_book.xml b/app/src/main/res/layout/bookinginteraction_book.xml index 9f7c077..af60be2 100644 --- a/app/src/main/res/layout/bookinginteraction_book.xml +++ b/app/src/main/res/layout/bookinginteraction_book.xml @@ -118,5 +118,15 @@ android:layout_alignTop="@+id/bookingInteraction_book_create_button" android:layout_toRightOf="@+id/bookingInteraction_book_create_button" android:layout_marginLeft="50dp" /> +
\ No newline at end of file diff --git a/app/src/main/res/layout/bookinginteraction_joinorleave.xml b/app/src/main/res/layout/bookinginteraction_joinorleave.xml index 2e2b4fd..28b63eb 100644 --- a/app/src/main/res/layout/bookinginteraction_joinorleave.xml +++ b/app/src/main/res/layout/bookinginteraction_joinorleave.xml @@ -107,6 +107,34 @@ android:layout_alignRight="@id/room_landing_room_picture" android:layout_height="wrap_content" android:text="Leave" /> + + + From 787343dc9851d9042ed51d1efefa250a1ed39b64 Mon Sep 17 00:00:00 2001 From: ObjectiveTruth Date: Thu, 1 Sep 2016 16:50:44 -0600 Subject: [PATCH 53/53] Fixed an issue with joinorleave asking for login --- .../uoitlibrarybooking/MainActivity.java | 48 ------------------- .../data/models/BookingInteractionModel.java | 9 ++-- 2 files changed, 4 insertions(+), 53 deletions(-) diff --git a/app/src/main/java/com/objectivetruth/uoitlibrarybooking/MainActivity.java b/app/src/main/java/com/objectivetruth/uoitlibrarybooking/MainActivity.java index 7fdccfb..bea2701 100644 --- a/app/src/main/java/com/objectivetruth/uoitlibrarybooking/MainActivity.java +++ b/app/src/main/java/com/objectivetruth/uoitlibrarybooking/MainActivity.java @@ -80,54 +80,6 @@ public boolean onOptionsItemSelected(MenuItem item) { return getActionBarDrawerToggle().onOptionsItemSelected(item); } -/* @Override - public void LaunchRoomInteraction(CookieManager cookieManager, String roomNumber, String date, String viewState, String eventValidation, - int shareRow, int shareColumn, int pageNumberInt, String viewStateGenerator){ - - Intent intent = new Intent(this, ActivityRoomInteraction.class); - intent.putExtra("type", "createbooking"); - intent.putExtra("date", date); - intent.putExtra("room", roomNumber); - intent.putExtra("shareRow", shareRow); - intent.putExtra("shareColumn", shareColumn); - intent.putExtra("pageNumberInt", pageNumberInt); - intent.putExtra("viewState", viewState); - intent.putExtra("eventValidation", eventValidation); - intent.putExtra("viewStateGenerator", viewStateGenerator); - MainActivity.cookieManager = cookieManager; - - startActivity(intent); - } - @Override - public void LaunchViewLeaveOrJoin(CookieManager cookieManager, - String roomNumber, String date, String groupName, String groupCode, String timeRange, - String institution, String notes, String currentViewState, - String currentEventValidation, - int shareRow, int shareColumn, int pageNumberInt, - String viewStateGenerator){ - Intent intent = new Intent(this, ActivityRoomInteraction.class); - intent.putExtra("type", "viewleaveorjoin"); - intent.putExtra("groupName", groupName); - intent.putExtra("date", date); - intent.putExtra("room", roomNumber); - intent.putExtra("shareRow", shareRow); - intent.putExtra("shareColumn", shareColumn); - intent.putExtra("pageNumberInt", pageNumberInt); - intent.putExtra("groupCode", groupCode); - intent.putExtra("viewState", currentViewState); - intent.putExtra("eventValidation", currentEventValidation); - intent.putExtra("timeRange", timeRange); - intent.putExtra("institution", institution); - intent.putExtra("notes", notes); - intent.putExtra("viewStateGenerator", viewStateGenerator); - MainActivity.cookieManager = cookieManager; - - - - startActivity(intent); - - }*/ - private void _goToScreenByMenuID(int menuItemResourceID) { MenuItem initialMenuItem = getDrawerView().getMenu().findItem(menuItemResourceID); selectDrawerItem(initialMenuItem); diff --git a/app/src/main/java/com/objectivetruth/uoitlibrarybooking/data/models/BookingInteractionModel.java b/app/src/main/java/com/objectivetruth/uoitlibrarybooking/data/models/BookingInteractionModel.java index 97ddcef..45b15e5 100644 --- a/app/src/main/java/com/objectivetruth/uoitlibrarybooking/data/models/BookingInteractionModel.java +++ b/app/src/main/java/com/objectivetruth/uoitlibrarybooking/data/models/BookingInteractionModel.java @@ -108,14 +108,13 @@ public void call(Pair pair) { BookingInteractionEventUserRequest userRequest = pair.first; MyAccountDataLoginState loginState = pair.second; - if(loginState.type == MyAccountDataLoginStateType.SIGNED_IN) { - switch(userRequest.type) { + if(userRequest.type == BookingInteractionEventUserRequestType.JOINORLEAVE_GETTING_SPINNER_VALUES_REQUEST) { + _doJoinOrLeaveGettingSpinnerValuesRequest(userRequest); + }else if(loginState.type == MyAccountDataLoginStateType.SIGNED_IN) { + switch (userRequest.type) { case BOOK_REQUEST: _doBookRequest(userRequest); break; - case JOINORLEAVE_GETTING_SPINNER_VALUES_REQUEST: - _doJoinOrLeaveGettingSpinnerValuesRequest(userRequest); - break; case JOINORLEAVE_LEAVE_REQUEST: _doJoinOrLeaveLeaveRequest(userRequest); break;