diff --git a/app/src/main/java/org/hackillinois/android/API.kt b/app/src/main/java/org/hackillinois/android/API.kt index ca9f449bf..530cd7dce 100644 --- a/app/src/main/java/org/hackillinois/android/API.kt +++ b/app/src/main/java/org/hackillinois/android/API.kt @@ -14,7 +14,6 @@ import org.hackillinois.android.model.profile.ProfileList import org.hackillinois.android.model.projects.ProjectsList import org.hackillinois.android.notifications.DeviceToken import retrofit2.Call -import retrofit2.Response import retrofit2.http.* interface API { @@ -51,8 +50,10 @@ interface API { @POST("event/staff/checkin/") suspend fun checkInUserAsStaff(@Body userTokenEventIdPair: UserTokenEventIdPair): EventCheckInAsStaffResponse - @POST("event/staff/attendance/") - suspend fun staffMeetingCheckIn(@Body eventId: MeetingEventId): Response + // STAFF + + @POST("staff/attendance/") + suspend fun staffMeetingCheckIn(@Body eventId: MeetingEventId): MeetingCheckInResponse // NOTIFICATIONS diff --git a/app/src/main/java/org/hackillinois/android/database/entity/Event.kt b/app/src/main/java/org/hackillinois/android/database/entity/Event.kt index d68b7c039..ffd979c9e 100644 --- a/app/src/main/java/org/hackillinois/android/database/entity/Event.kt +++ b/app/src/main/java/org/hackillinois/android/database/entity/Event.kt @@ -93,6 +93,7 @@ data class EventCode(val code: String) data class MeetingEventId(val eventId: String) data class MeetingCheckInResponse(var status: String) + data class EventCheckInResponse( val newPoints: Int, val totalPoints: Int, diff --git a/app/src/main/java/org/hackillinois/android/repository/EventRepository.kt b/app/src/main/java/org/hackillinois/android/repository/EventRepository.kt index 4ff88c33f..3dd94101c 100644 --- a/app/src/main/java/org/hackillinois/android/repository/EventRepository.kt +++ b/app/src/main/java/org/hackillinois/android/repository/EventRepository.kt @@ -79,9 +79,9 @@ class EventRepository { withContext(Dispatchers.IO) { try { val body = MeetingEventId(eventId) - App.getAPI().staffMeetingCheckIn(body) - apiResponse.status = "Success" // no response is sent from API, so just manually done + apiResponse = App.getAPI().staffMeetingCheckIn(body) // 200: status = "Success" } catch (e: Exception) { + apiResponse.status = e.message.toString() Log.d("STAFF MEETING API ERROR", "${e.message}") } } diff --git a/app/src/main/java/org/hackillinois/android/view/MainActivity.kt b/app/src/main/java/org/hackillinois/android/view/MainActivity.kt index 19369b91b..3b607b679 100644 --- a/app/src/main/java/org/hackillinois/android/view/MainActivity.kt +++ b/app/src/main/java/org/hackillinois/android/view/MainActivity.kt @@ -5,6 +5,7 @@ import android.content.Intent import android.os.Bundle import android.util.Log import android.view.View +import android.view.WindowManager import android.widget.ImageButton import android.widget.Toast import androidx.appcompat.app.AppCompatActivity @@ -80,6 +81,12 @@ class MainActivity : AppCompatActivity() { if (newSelection != currentSelection) { currentSelection = newSelection + val nightBlue = ContextCompat.getColor(this, R.color.nightBlue) + val window = window + window.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS) + window.statusBarColor = nightBlue + bottomAppBar.setBackgroundColor(nightBlue) + bottomBarButtons.forEach { (it as ImageButton).setBackgroundColor(nightBlue) } bottomBarButtons.forEach { (it as ImageButton).setColorFilter(unselectedIconColor) } (view as ImageButton).setColorFilter(selectedIconColor) @@ -122,6 +129,13 @@ class MainActivity : AppCompatActivity() { if (isStaff()) { // check if already on scanner attendance page for staff if (!onScanner) { + val darkForest = ContextCompat.getColor(this, R.color.darkForest) + bottomAppBar.setBackgroundColor(darkForest) + bottomBarButtons.forEach { (it as ImageButton).setBackgroundColor(darkForest) } + val window = window + window.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS) + window.statusBarColor = darkForest + switchFragment(staffScannerFragment, false) } } else { diff --git a/app/src/main/java/org/hackillinois/android/view/scanner/ScannerFragment.kt b/app/src/main/java/org/hackillinois/android/view/scanner/ScannerFragment.kt index 45f002c5f..faed6d5d8 100644 --- a/app/src/main/java/org/hackillinois/android/view/scanner/ScannerFragment.kt +++ b/app/src/main/java/org/hackillinois/android/view/scanner/ScannerFragment.kt @@ -8,7 +8,6 @@ import android.os.Bundle import android.os.Handler import android.os.Looper import android.transition.TransitionInflater -import android.util.Log import android.view.LayoutInflater import android.view.View import android.view.ViewGroup @@ -42,6 +41,7 @@ class ScannerFragment : Fragment() { private var isMeetingAttendance: Boolean = false private lateinit var codeScanner: CodeScanner + private var alertDialog: AlertDialog? = null private lateinit var staffChipGroup: ChipGroup @@ -70,6 +70,7 @@ class ScannerFragment : Fragment() { } else { displayScanResult(it) } + codeScanner.startPreview() }, ) roles.observe( @@ -96,16 +97,17 @@ class ScannerFragment : Fragment() { // Move the check-in to the first index val index = listOfEvents!!.indexOfFirst { event -> event.name == "Check-in" } - val event = listOfEvents!![index] - listOfEvents!!.removeAt(index) - listOfEvents!!.add(0, event) + if (index >= 0) { + val event = listOfEvents!![index] + listOfEvents!!.removeAt(index) + listOfEvents!!.add(0, event) + } var firstChipId = 0 // Go through all the events and add a chip for it if (isStaff()) { for ((index, event) in listOfEvents!!.withIndex()) { - Log.i("Events", "${event.name}: ${event.eventType}") val chip = inflater.inflate(R.layout.staff_scanner_chip, staffChipGroup, false) as Chip chip.text = event.name @@ -117,8 +119,6 @@ class ScannerFragment : Fragment() { } } - Log.i("Events", "Number of events: ${listOfEvents!!.size}") - // Select the first chipId staffChipGroup.check(firstChipId) } @@ -144,9 +144,7 @@ class ScannerFragment : Fragment() { if (userRoles != null && userRoles!!.isStaff()) { // check if QR is for meeting attendance or staff attendee check-in if (isMeetingAttendance) { - // do stuff val eventId: String = getEventCodeFromQrString(it.text) - Log.d("QRCODE", "$eventId") viewModel.scanQrToCheckInMeeting(eventId) } else { val userString = getUserIdFromQrString(it.text) @@ -232,11 +230,15 @@ class ScannerFragment : Fragment() { } // make dialog from response if (activity != null) { - AlertDialog.Builder(requireActivity()) - .setMessage(responseString) - .setNegativeButton("OK") { dialog, id -> dialog.dismiss() } - .create() - .show() + if (alertDialog == null) { + val builder = AlertDialog.Builder(requireActivity()) + .setMessage(responseString) + .setNegativeButton("OK") { dialog, id -> + dialog.dismiss() + } + alertDialog = builder.create() + } + alertDialog!!.show() } else { val toast = Toast.makeText(context, responseString, Toast.LENGTH_LONG) toast.show() @@ -252,7 +254,6 @@ class ScannerFragment : Fragment() { else -> "Something isn't quite right." } // make toast from response - Log.d("SCAN STATUS RESULT", responseString) val toast = Toast.makeText(context, responseString, Toast.LENGTH_LONG) toast.show() } diff --git a/app/src/main/java/org/hackillinois/android/view/schedule/ScheduleFragment.kt b/app/src/main/java/org/hackillinois/android/view/schedule/ScheduleFragment.kt index 89ff64827..26cffd23f 100644 --- a/app/src/main/java/org/hackillinois/android/view/schedule/ScheduleFragment.kt +++ b/app/src/main/java/org/hackillinois/android/view/schedule/ScheduleFragment.kt @@ -29,7 +29,7 @@ class ScheduleFragment : Fragment() { this, Observer { favoriteButton.isSelected = it ?: false - } + }, ) } @@ -76,7 +76,7 @@ class ScheduleFragment : Fragment() { when (isSelected) { true -> R.drawable.ic_star_filled else -> R.drawable.ic_star_selectable - } + }, ) } scheduleViewModel.showFavorites.postValue(favoriteButton.isSelected) diff --git a/app/src/main/java/org/hackillinois/android/viewmodel/ScannerViewModel.kt b/app/src/main/java/org/hackillinois/android/viewmodel/ScannerViewModel.kt index 0639bb13e..a3d1f6c31 100644 --- a/app/src/main/java/org/hackillinois/android/viewmodel/ScannerViewModel.kt +++ b/app/src/main/java/org/hackillinois/android/viewmodel/ScannerViewModel.kt @@ -96,8 +96,6 @@ class ScannerViewModel : ViewModel() { viewModelScope.launch { try { response = EventRepository.checkInEventAsStaff(userId, eventId) - Log.i("Check In", "Status: ${response.status}") - Log.i("Check In", "Response: $response") lastScanStatus.postValue( ScanStatus( response.rsvpData != null, @@ -121,65 +119,4 @@ class ScannerViewModel : ViewModel() { } return response } - -// fun checkInUser(checkIn: CheckIn) { -// viewModelScope.launch { -// try { -// val ci: CheckIn = App.getAPI().checkInUser(checkIn) -// // Check-in was a success -// val userId = ci.id -// // val scanStatus = ScanStatus(true, userId, "") -// // lastScanStatus.postValue(scanStatus) -// } catch (e: Exception) { -// when (e) { -// is HttpException -> { -// @Suppress("BlockingMethodInNonBlockingContext") -// val error = JSONObject(e.response()?.errorBody()?.string()) -// val errorType = error.getString("type") -// val errorMessage = if (errorType == "ATTRIBUTE_MISMATCH_ERROR") { -// error.getString("message") -// } else { -// "Internal API error" -// } -// val scanStatus = ScanStatus(false, "", errorMessage) -// lastScanStatus.postValue(scanStatus) -// } -// else -> { -// val scanStatus = ScanStatus(false, "", "Request could not be made. Please try again.") -// lastScanStatus.postValue(scanStatus) -// } -// } -// } -// } -// } - -// fun markUserAsAttendingEvent(userEventPair: UserEventPair) { -// viewModelScope.launch { -// try { -// val trackerContainer = App.getAPI().markUserAsAttendingEvent(userEventPair) -// val userId = trackerContainer.userTracker.userId -// val scanStatus = ScanStatus(true, userId, "") -// lastScanStatus.postValue(scanStatus) -// } catch (e: Exception) { -// when (e) { -// is HttpException -> { -// val error = JSONObject(e.response()?.errorBody()?.string()) -// val errorType = error.getString("type") -// val errorMessage = if (errorType == "ATTRIBUTE_MISMATCH_ERROR") { -// error.getString("message") -// } else { -// "Internal API error" -// } -// val scanStatus = ScanStatus(false, "", errorMessage) -// lastScanStatus.postValue(scanStatus) -// } -// else -> { -// val scanStatus = ScanStatus(false, "", -// "Request could not be made. Please try again.") -// lastScanStatus.postValue(scanStatus) -// } -// } -// } -// } -// } } diff --git a/app/src/main/res/color/chip_text_selector.xml b/app/src/main/res/color/chip_text_selector.xml index ef8e0c8a3..d0bbcc833 100644 --- a/app/src/main/res/color/chip_text_selector.xml +++ b/app/src/main/res/color/chip_text_selector.xml @@ -1,7 +1,7 @@ + android:color="@color/colorChecked" /> \ No newline at end of file diff --git a/app/src/main/res/drawable/staff_attendance_bg.png b/app/src/main/res/drawable/staff_attendance_bg.png new file mode 100644 index 000000000..8235fc1ff Binary files /dev/null and b/app/src/main/res/drawable/staff_attendance_bg.png differ diff --git a/app/src/main/res/layout/fragment_scanner.xml b/app/src/main/res/layout/fragment_scanner.xml index ebf2c4313..2d214faf6 100644 --- a/app/src/main/res/layout/fragment_scanner.xml +++ b/app/src/main/res/layout/fragment_scanner.xml @@ -20,7 +20,7 @@ app:frameAspectRatioHeight="1" app:frameAspectRatioWidth="1" app:frameColor="@color/scannerBorderColor" - app:frameCornersRadius="20dp" + app:frameCornersRadius="16dp" app:frameCornersSize="50dp" app:frameSize="0.75" app:frameThickness="2dp" @@ -59,7 +59,7 @@ app:checkedChip="@id/chip1" android:layout_marginTop="10dp" android:layout_marginHorizontal="50dp" - android:visibility="visible"> + android:visibility="invisible"> diff --git a/app/src/main/res/layout/fragment_staff_scanner.xml b/app/src/main/res/layout/fragment_staff_scanner.xml index b1734330e..d6867d11b 100644 --- a/app/src/main/res/layout/fragment_staff_scanner.xml +++ b/app/src/main/res/layout/fragment_staff_scanner.xml @@ -13,13 +13,11 @@ android:layout_height="wrap_content" android:adjustViewBounds="true" android:scaleType="fitXY" - android:src="@drawable/welcome_bg" + android:src="@drawable/staff_attendance_bg" app:layout_constraintBottom_toBottomOf="parent" - app:layout_constraintHorizontal_bias="1.0" app:layout_constraintLeft_toLeftOf="parent" app:layout_constraintRight_toRightOf="parent" - app:layout_constraintTop_toTopOf="parent" - app:layout_constraintVertical_bias="1.0" /> + app:layout_constraintTop_toTopOf="parent" /> + app:layout_constraintWidth_percent=".8" + app:strokeColor="@color/mediumBlue" + app:strokeWidth="3dp" /> + app:layout_constraintWidth_percent=".8" /> \ No newline at end of file diff --git a/app/src/main/res/values/colors.xml b/app/src/main/res/values/colors.xml index bae590e94..2b0fd5ada 100644 --- a/app/src/main/res/values/colors.xml +++ b/app/src/main/res/values/colors.xml @@ -28,6 +28,13 @@ #F11F20 #F99557 #FCDC8F - #294C6C + #294C6C + + + #0D3F41 + #F3FFFF + #D2F7FF + #FFFACC + #FFF48D