Skip to content

Commit c27324c

Browse files
committed
added studentlife getters; link is cross-platform compatible (hypothetically); GSR view draft complete (minus gcal, map features)
1 parent 035857c commit c27324c

7 files changed

Lines changed: 251 additions & 72 deletions

File tree

PennMobile/src/main/AndroidManifest.xml

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -67,14 +67,13 @@
6767
<action android:name="android.intent.action.VIEW" />
6868
</intent-filter>
6969

70-
<intent-filter>
70+
<intent-filter android:autoVerify="true">
7171
<action android:name="android.intent.action.VIEW" />
7272
<category android:name="android.intent.category.DEFAULT" />
7373
<category android:name="android.intent.category.BROWSABLE" />
74-
<data
75-
android:scheme="pennmobile"
76-
android:host="gsr"
77-
android:pathPrefix="/reservation" />
74+
<data android:scheme="https"
75+
android:host="pennmobile.org"
76+
android:pathPrefix="/gsr/share" />
7877
</intent-filter>
7978
</activity>
8079

PennMobile/src/main/java/com/pennapps/labs/pennmobile/MainActivity.kt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -166,10 +166,10 @@ class MainActivity : AppCompatActivity() {
166166

167167
private fun handleIntent(intent: Intent) {
168168
if (intent.action == Intent.ACTION_VIEW) {
169-
val bookingId = intent.data?.lastPathSegment ?: return
169+
val shareCode = intent.data?.getQueryParameter("data") ?: return
170170
binding.include.mainViewPager.visibility = View.GONE
171171
hideBottomBar()
172-
fragmentTransact(GsrReservationDetailFragment.newInstance(bookingId), false)
172+
fragmentTransact(GsrReservationDetailFragment.newInstance(shareCode), false)
173173
}
174174
}
175175

PennMobile/src/main/java/com/pennapps/labs/pennmobile/api/StudentLife.kt

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,9 @@ import com.pennapps.labs.pennmobile.gsr.classes.GSR
1414
import com.pennapps.labs.pennmobile.gsr.classes.GSRBookingResult
1515
import com.pennapps.labs.pennmobile.gsr.classes.GSRLocation
1616
import com.pennapps.labs.pennmobile.gsr.classes.GSRReservation
17+
import com.pennapps.labs.pennmobile.gsr.classes.GSRShareResponse
18+
import com.pennapps.labs.pennmobile.gsr.classes.ShareCodeRequest
19+
import com.pennapps.labs.pennmobile.gsr.classes.ShareCodeResponse
1720
import com.pennapps.labs.pennmobile.gsr.classes.WhartonStatus
1821
import com.pennapps.labs.pennmobile.home.classes.Article
1922
import com.pennapps.labs.pennmobile.home.classes.CalendarEvent
@@ -202,6 +205,18 @@ interface StudentLife {
202205
@Header("Authorization") bearerToken: String?,
203206
): Observable<List<GSRReservation?>?>
204207

208+
@POST("gsr/share/")
209+
fun getGsrShareCode(
210+
@Header("Authorization") bearerToken: String,
211+
@Body body: ShareCodeRequest
212+
): Observable<ShareCodeResponse>
213+
214+
@GET("gsr/share/{code}/")
215+
fun getReservationFromShareCode(
216+
@Header("Authorization") bearerToken: String,
217+
@Path("code") shareCode: String
218+
): Observable<GSRShareResponse>
219+
205220
@GET("laundry/preferences")
206221
fun getLaundryPrefObservable(
207222
@Header("Authorization") bearerToken: String,

PennMobile/src/main/java/com/pennapps/labs/pennmobile/gsr/adapters/GsrReservationsAdapter.kt

Lines changed: 25 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ import com.pennapps.labs.pennmobile.MainActivity
1616
import com.pennapps.labs.pennmobile.R
1717
import com.pennapps.labs.pennmobile.databinding.GsrReservationBinding
1818
import com.pennapps.labs.pennmobile.gsr.classes.GSRReservation
19+
import com.pennapps.labs.pennmobile.gsr.classes.ShareCodeRequest
1920
import com.pennapps.labs.pennmobile.gsr.widget.GsrReservationWidget
2021
import com.squareup.picasso.Picasso
2122
import kotlinx.coroutines.launch
@@ -146,21 +147,30 @@ class GsrReservationsAdapter(
146147
}
147148

148149
holder.gsrReservationShareButton.setOnClickListener {
149-
val bookingId = reservation.bookingId
150-
151-
// Create Deep Link
152-
val deepLink = "pennmobile://gsr/reservation/${reservation.bookingId}"
153-
154-
val shareIntent = Intent(Intent.ACTION_SEND).apply {
155-
type = "text/plain"
156-
putExtra(Intent.EXTRA_SUBJECT, "GSR Booking: $roomName")
157-
putExtra(
158-
Intent.EXTRA_TEXT,
159-
"Join my GSR booking!\n$roomName\n$day, $fromHour - $toHour\n\n$deepLink"
160-
)
161-
}
162-
163-
mContext.startActivity(Intent.createChooser(shareIntent, "Share Reservation"))
150+
val bearerToken = "Bearer " + PreferenceManager
151+
.getDefaultSharedPreferences(mContext)
152+
.getString(mContext.getString(R.string.access_token), "")
153+
154+
MainActivity.studentLifeInstance
155+
.getGsrShareCode(bearerToken, ShareCodeRequest(reservation.bookingId ?: return@setOnClickListener))
156+
.subscribeOn(rx.schedulers.Schedulers.io())
157+
.observeOn(rx.android.schedulers.AndroidSchedulers.mainThread())
158+
.subscribe({ response ->
159+
val deepLink = "https://pennmobile.org/gsr/share?data=${response.code}"
160+
161+
val shareIntent = Intent(Intent.ACTION_SEND).apply {
162+
type = "text/plain"
163+
putExtra(Intent.EXTRA_SUBJECT, "GSR Booking: $roomName")
164+
putExtra(
165+
Intent.EXTRA_TEXT,
166+
"Join my GSR booking!\n$roomName\n$day, $fromHour - $toHour\n\n$deepLink"
167+
)
168+
}
169+
mContext.startActivity(Intent.createChooser(shareIntent, "Share Reservation"))
170+
}, { error ->
171+
error.printStackTrace()
172+
Toast.makeText(mContext, "Failed to generate share link.", Toast.LENGTH_SHORT).show()
173+
})
164174
}
165175
}
166176

PennMobile/src/main/java/com/pennapps/labs/pennmobile/gsr/classes/GSRReservation.kt

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,25 @@ package com.pennapps.labs.pennmobile.gsr.classes
33
import com.google.gson.annotations.Expose
44
import com.google.gson.annotations.SerializedName
55

6+
// for GSR sharing
7+
data class ShareCodeRequest(@SerializedName("booking_id") val bookingId: String)
8+
data class ShareCodeResponse(val code: String)
9+
10+
data class GSRShareResponse(
11+
@SerializedName("booking_id") val bookingId: String,
12+
@SerializedName("room_name") val roomName: String,
13+
@SerializedName("start") val start: String,
14+
@SerializedName("end") val end: String,
15+
@SerializedName("is_valid") val isValid: Boolean,
16+
@SerializedName("owner_name") val ownerName: String,
17+
@SerializedName("gsr") val gsr: GSRInfo
18+
)
19+
20+
data class GSRInfo(
21+
@SerializedName("name") val name: String,
22+
@SerializedName("image_url") val imageUrl: String
23+
)
24+
625
class GSRReservation {
726
@SerializedName("booking_id")
827
@Expose

PennMobile/src/main/java/com/pennapps/labs/pennmobile/gsr/fragments/GsrReservationDetailFragment.kt

Lines changed: 42 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -5,18 +5,23 @@ import android.view.LayoutInflater
55
import android.view.View
66
import android.view.ViewGroup
77
import androidx.fragment.app.Fragment
8+
import androidx.preference.PreferenceManager
9+
import com.pennapps.labs.pennmobile.MainActivity
10+
import com.pennapps.labs.pennmobile.R
811
import com.pennapps.labs.pennmobile.databinding.FragmentGsrReservationDetailBinding
12+
import com.squareup.picasso.Picasso
13+
import org.joda.time.format.DateTimeFormat
914

1015

1116
class GsrReservationDetailFragment : Fragment() {
1217

1318
companion object {
14-
private const val ARG_BOOKING_ID = "booking_id"
19+
private const val ARG_SHARE_CODE = "share_code"
1520

16-
fun newInstance(bookingId: String): GsrReservationDetailFragment {
21+
fun newInstance(shareCode: String): GsrReservationDetailFragment {
1722
return GsrReservationDetailFragment().apply {
1823
arguments = Bundle().apply {
19-
putString(ARG_BOOKING_ID, bookingId)
24+
putString(ARG_SHARE_CODE, shareCode)
2025
}
2126
}
2227
}
@@ -27,11 +32,41 @@ class GsrReservationDetailFragment : Fragment() {
2732
savedInstanceState: Bundle?
2833
): View {
2934
val binding = FragmentGsrReservationDetailBinding.inflate(inflater, container, false)
30-
val bookingId = arguments?.getString(ARG_BOOKING_ID)
3135

32-
// need to fetch full reservation details from API using bookingId
33-
// right now, just show booking id
34-
binding.gsrDetailBookingIdTv.text = "Booking ID: $bookingId"
36+
val shareCode = arguments?.getString(ARG_SHARE_CODE)
37+
?: activity?.intent?.data?.getQueryParameter("data")
38+
39+
if (shareCode == null) {
40+
binding.gsrDetailBookingIdTv.text = "Invalid reservation link."
41+
return binding.root
42+
}
43+
44+
val sp = PreferenceManager.getDefaultSharedPreferences(requireContext())
45+
val bearerToken = "Bearer " + sp.getString(getString(R.string.access_token), "")
46+
47+
MainActivity.studentLifeInstance
48+
.getReservationFromShareCode(bearerToken, shareCode)
49+
.subscribeOn(rx.schedulers.Schedulers.io())
50+
.observeOn(rx.android.schedulers.AndroidSchedulers.mainThread())
51+
.subscribe({ reservation ->
52+
val formatter = DateTimeFormat.forPattern("yyyy-MM-dd'T'HH:mm:ssZZ")
53+
val from = formatter.parseDateTime(reservation.start)
54+
val to = formatter.parseDateTime(reservation.end)
55+
56+
binding.gsrDetailLocationTv.text = "${reservation.gsr.name} - ${reservation.roomName}"
57+
binding.gsrDetailDateTv.text =
58+
from.toString("EEEE, MMMM d") + "\n" +
59+
from.toString("h:mm a") + " - " +
60+
to.toString("h:mm a")
61+
binding.gsrDetailBookingIdTv.text = reservation.ownerName
62+
63+
Picasso.get().load(reservation.gsr.imageUrl).fit().centerCrop().into(binding.gsrDetailIv)
64+
65+
}, { error ->
66+
error.printStackTrace()
67+
android.util.Log.e("GSRDetail", "Error loading reservation: ${error.message}")
68+
binding.gsrDetailBookingIdTv.text = "Failed to load reservation."
69+
})
3570

3671
return binding.root
3772
}

0 commit comments

Comments
 (0)