Skip to content

Commit d74aed6

Browse files
committed
Move platform and campusexpress to retrofit2
1 parent cb233ac commit d74aed6

File tree

7 files changed

+122
-81
lines changed

7 files changed

+122
-81
lines changed

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

Lines changed: 25 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,7 @@ import com.google.gson.reflect.TypeToken
3737
import com.pennapps.labs.pennmobile.api.CampusExpress
3838
import com.pennapps.labs.pennmobile.api.OAuth2NetworkManager
3939
import com.pennapps.labs.pennmobile.api.Platform
40+
import com.pennapps.labs.pennmobile.api.Platform2
4041
import com.pennapps.labs.pennmobile.api.Serializer
4142
import com.pennapps.labs.pennmobile.api.classes.Account
4243
import com.pennapps.labs.pennmobile.api.fragments.LoginFragment
@@ -315,27 +316,39 @@ class MainActivity : AppCompatActivity() {
315316

316317
private var mStudentLife: StudentLife? = null
317318
private var mPlatform: Platform? = null
319+
private var mPlatform2: Platform2? = null
318320
private var mCampusExpress: CampusExpress? = null
319321

320322
@JvmStatic
321323
val campusExpressInstance: CampusExpress
322324
get() {
323325
if (mCampusExpress == null) {
324-
val gsonBuilder = GsonBuilder()
325-
val gson = gsonBuilder.create()
326-
val restAdapter =
327-
RestAdapter
328-
.Builder()
329-
.setConverter(GsonConverter(gson))
330-
.setLogLevel(RestAdapter.LogLevel.FULL)
331-
.setLog(AndroidLog("Campus Express"))
332-
.setEndpoint(Platform.campusExpressBaseUrl)
333-
.build()
334-
mCampusExpress = restAdapter.create(CampusExpress::class.java)
335-
}
326+
val retrofit = Retrofit.Builder()
327+
.baseUrl(Platform2.campusExpressBaseUrl)
328+
.client(OkHttpClient.Builder().build())
329+
.addConverterFactory(GsonConverterFactory.create())
330+
.addCallAdapterFactory(RxJavaCallAdapterFactory.create())
331+
.build()
332+
333+
mCampusExpress = retrofit.create(CampusExpress::class.java) }
336334
return mCampusExpress!!
337335
}
338336

337+
val platformInstance2: Platform2
338+
get() {
339+
if (mPlatform2 == null) {
340+
val retrofit = Retrofit.Builder()
341+
.baseUrl(Platform2.platformBaseUrl)
342+
.client(OkHttpClient.Builder().build())
343+
.addConverterFactory(GsonConverterFactory.create())
344+
.addCallAdapterFactory(RxJavaCallAdapterFactory.create())
345+
.build()
346+
347+
mPlatform2 = retrofit.create(Platform2::class.java)
348+
}
349+
return mPlatform2!!
350+
}
351+
339352
@JvmStatic
340353
val platformInstance: Platform
341354
get() {

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

Lines changed: 9 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -3,33 +3,32 @@ package com.pennapps.labs.pennmobile.api
33
import com.pennapps.labs.pennmobile.api.classes.CampusExpressAccessTokenResponse
44
import com.pennapps.labs.pennmobile.dining.classes.DiningBalances
55
import com.pennapps.labs.pennmobile.dining.classes.DiningBalancesList
6-
import retrofit.Callback
7-
import retrofit.http.GET
8-
import retrofit.http.Header
9-
import retrofit.http.Query
6+
import retrofit2.Response
7+
import retrofit2.http.GET
8+
import retrofit2.http.Header
9+
import retrofit2.http.Query
1010
import rx.Observable
1111

1212
/**
1313
* Created by Julius Snipes on 09/23/2022.
1414
* Retrofit interface to the Campus Express API
1515
*/
1616
interface CampusExpress {
17-
@GET("/oauth/token")
18-
fun getAccessToken(
17+
@GET("oauth/token")
18+
suspend fun getAccessToken(
1919
@Query("code") authCode: String?,
2020
@Query("grant_type") grantType: String?,
2121
@Query("client_id") clientID: String?,
2222
@Query("redirect_uri") redirectURI: String?,
2323
@Query("code_verifier") codeVerifier: String?,
24-
callback: Callback<CampusExpressAccessTokenResponse>,
25-
)
24+
): Response<CampusExpressAccessTokenResponse>
2625

27-
@GET("/dining/currentBalance")
26+
@GET("dining/currentBalance")
2827
fun getCurrentDiningBalances(
2928
@Header("x-authorization") bearerToken: String?,
3029
): Observable<DiningBalances>
3130

32-
@GET("/dining/pastBalances")
31+
@GET("dining/pastBalances")
3332
fun getPastDiningBalances(
3433
@Header("x-authorization") bearerToken: String?,
3534
@Query("start_date") startDate: String?,

PennMobile/src/main/java/com/pennapps/labs/pennmobile/api/Platform.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@
1111
public interface Platform {
1212

1313
String platformBaseUrl = "https://platform.pennlabs.org";
14-
String campusExpressBaseUrl = "https://prod.campusexpress.upenn.edu/api/v1";
14+
String campusExpressBaseUrl = "https://prod.campusexpress.upenn.edu/api/v1/";
1515

1616
@FormUrlEncoded
1717
@POST("/accounts/introspect/")
Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
package com.pennapps.labs.pennmobile.api
2+
3+
import com.pennapps.labs.pennmobile.api.classes.GetUserResponse
4+
import retrofit2.Response
5+
import retrofit2.http.Field
6+
import retrofit2.http.FormUrlEncoded
7+
import retrofit2.http.Header
8+
import retrofit2.http.POST
9+
10+
interface Platform2 {
11+
companion object {
12+
13+
val platformBaseUrl: String = "https://platform.pennlabs.org/"
14+
val campusExpressBaseUrl: String = "https://prod.campusexpress.upenn.edu/api/v1/"
15+
}
16+
17+
@FormUrlEncoded
18+
@POST("accounts/introspect/")
19+
suspend fun getUser(
20+
@Header("Authorization") authorizationHeader: String?,
21+
@Field("token") token: String?,
22+
): Response<GetUserResponse>
23+
}

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

Lines changed: 29 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -16,13 +16,15 @@ import android.widget.LinearLayout
1616
import android.widget.Toast
1717
import androidx.fragment.app.Fragment
1818
import androidx.fragment.app.FragmentTransaction
19+
import androidx.lifecycle.lifecycleScope
1920
import androidx.preference.PreferenceManager
2021
import com.pennapps.labs.pennmobile.MainActivity
2122
import com.pennapps.labs.pennmobile.R
2223
import com.pennapps.labs.pennmobile.api.CampusExpress
2324
import com.pennapps.labs.pennmobile.api.classes.Account
2425
import com.pennapps.labs.pennmobile.api.classes.CampusExpressAccessTokenResponse
2526
import com.pennapps.labs.pennmobile.dining.fragments.DiningInsightsFragment
27+
import kotlinx.coroutines.launch
2628
import org.apache.commons.lang3.RandomStringUtils
2729
import retrofit.Callback
2830
import retrofit.RetrofitError
@@ -144,18 +146,19 @@ class CampusExpressLoginFragment : Fragment() {
144146
}
145147

146148
private fun initiateAuthentication(authCode: String) {
147-
mCampusExpress?.getAccessToken(
148-
authCode,
149-
"authorization_code",
150-
clientID,
151-
redirectUri,
152-
codeVerifier,
153-
object : Callback<CampusExpressAccessTokenResponse> {
154-
override fun success(
155-
t: CampusExpressAccessTokenResponse?,
156-
response: Response?,
157-
) {
158-
if (response?.status == 200) {
149+
viewLifecycleOwner.lifecycleScope.launch {
150+
mCampusExpress?.let {
151+
try {
152+
val response = it.getAccessToken(
153+
authCode,
154+
"authorization_code",
155+
clientID,
156+
redirectUri,
157+
codeVerifier,
158+
)
159+
160+
if (response.isSuccessful) {
161+
val t = response.body()
159162
val accessToken = t?.accessToken
160163
val expiresIn = t?.expiresIn
161164
val editor = sp.edit()
@@ -170,21 +173,22 @@ class CampusExpressLoginFragment : Fragment() {
170173
}
171174
editor.apply()
172175
goToDiningInsights(true)
176+
} else {
177+
val error = Exception(response.errorBody()?.string() ?: "Unknown Error")
178+
Log.e("Campus Webview", "Error fetching access token $error")
179+
Toast
180+
.makeText(
181+
context,
182+
"Error getting campus express authorization",
183+
Toast.LENGTH_SHORT,
184+
).show()
185+
goToDiningInsights(false)
173186
}
187+
} catch (e: Exception) {
188+
e.printStackTrace()
174189
}
175-
176-
override fun failure(error: RetrofitError) {
177-
Log.e("Campus Webview", "Error fetching access token $error")
178-
Toast
179-
.makeText(
180-
context,
181-
"Error getting campus express authorization",
182-
Toast.LENGTH_SHORT,
183-
).show()
184-
goToDiningInsights(false)
185-
}
186-
},
187-
)
190+
}
191+
}
188192
}
189193

190194
private fun getCodeChallenge(codeVerifier: String): String {

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

Lines changed: 19 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@ import com.pennapps.labs.pennmobile.MainActivity
2727
import com.pennapps.labs.pennmobile.R
2828
import com.pennapps.labs.pennmobile.api.Platform
2929
import com.pennapps.labs.pennmobile.api.Platform.platformBaseUrl
30+
import com.pennapps.labs.pennmobile.api.Platform2
3031
import com.pennapps.labs.pennmobile.api.classes.AccessTokenResponse
3132
import com.pennapps.labs.pennmobile.api.classes.Account
3233
import com.pennapps.labs.pennmobile.api.classes.GetUserResponse
@@ -49,7 +50,7 @@ class LoginWebviewFragment : Fragment() {
4950
lateinit var cancelButton: Button
5051
lateinit var user: Account
5152
private lateinit var mStudentLife: StudentLife
52-
private var mPlatform: Platform? = null
53+
private var mPlatform: Platform2? = null
5354
private lateinit var mActivity: MainActivity
5455
lateinit var sp: SharedPreferences
5556
lateinit var codeChallenge: String
@@ -67,7 +68,7 @@ class LoginWebviewFragment : Fragment() {
6768
override fun onCreate(savedInstanceState: Bundle?) {
6869
super.onCreate(savedInstanceState)
6970
mStudentLife = MainActivity.studentLifeInstance
70-
mPlatform = MainActivity.platformInstance
71+
mPlatform = MainActivity.platformInstance2
7172
arguments?.let {
7273
user = arguments?.getSerializable("user") as Account
7374
}
@@ -229,15 +230,16 @@ class LoginWebviewFragment : Fragment() {
229230
}
230231

231232
private fun getUser(accessToken: String?) {
232-
try {
233-
mPlatform?.getUser(
234-
"Bearer $accessToken",
235-
accessToken,
236-
object : Callback<GetUserResponse> {
237-
override fun success(
238-
t: GetUserResponse?,
239-
response: Response?,
240-
) {
233+
viewLifecycleOwner.lifecycleScope.launch {
234+
try {
235+
mPlatform?.let {
236+
val response = it.getUser(
237+
"Bearer $accessToken",
238+
accessToken,
239+
)
240+
241+
if (response.isSuccessful) {
242+
val t = response.body()
241243
val user = t?.user
242244
val editor = sp.edit()
243245
editor.putString(getString(R.string.first_name), user?.firstName)
@@ -253,19 +255,16 @@ class LoginWebviewFragment : Fragment() {
253255
editor.putString(getString(R.string.pennkey), user?.username)
254256
editor.apply()
255257
mActivity.startHomeFragment()
256-
// saveAccount(Account(user?.firstName, user?.lastName,
257-
// user?.username, user?.pennid, user?.email, user?.affiliation), user?.username.toString(), accessToken)
258-
}
259-
260-
override fun failure(error: RetrofitError) {
258+
} else {
259+
val error = Exception(response.errorBody()?.string() ?: "Unknown Error")
261260
Log.e("Accounts", "Error getting user $error")
262261
Toast.makeText(mActivity, "Error logging in", Toast.LENGTH_SHORT).show()
263262
mActivity.startLoginFragment()
264263
}
265-
},
266-
)
267-
} catch (e: Exception) {
268-
e.printStackTrace()
264+
}
265+
} catch (e: Exception) {
266+
e.printStackTrace()
267+
}
269268
}
270269
}
271270

PennMobile/src/main/java/com/pennapps/labs/pennmobile/dining/fragments/DiningInsightsFragment.kt

Lines changed: 16 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,8 @@ import com.pennapps.labs.pennmobile.dining.classes.DiningBalancesList
2121
import com.pennapps.labs.pennmobile.dining.classes.DiningInsightCell
2222
import com.pennapps.labs.pennmobile.dining.classes.DollarsSpentCell
2323
import com.pennapps.labs.pennmobile.isOnline
24+
import rx.android.schedulers.AndroidSchedulers
25+
import rx.schedulers.Schedulers
2426
import java.time.LocalDateTime
2527
import java.time.format.DateTimeFormatter
2628
import kotlin.collections.ArrayList
@@ -143,7 +145,9 @@ class DiningInsightsFragment : Fragment() {
143145
binding.internetConnectionDiningInsights.visibility = View.GONE
144146
}
145147
val bearerToken = "Bearer $accessToken"
146-
mCampusExpress.getCurrentDiningBalances(bearerToken).subscribe(
148+
mCampusExpress.getCurrentDiningBalances(bearerToken)
149+
.subscribeOn(Schedulers.io())
150+
.subscribe(
147151
{ t: DiningBalances? ->
148152
activity?.runOnUiThread {
149153
val diningBalanceCell = cells[0]
@@ -162,21 +166,20 @@ class DiningInsightsFragment : Fragment() {
162166
val current = LocalDateTime.now()
163167
val formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd")
164168
val formattedCurrentDate = current.format(formatter)
165-
mCampusExpress.getPastDiningBalances(bearerToken, DiningInsightsCardAdapter.START_DAY_OF_SEMESTER, formattedCurrentDate).subscribe(
169+
mCampusExpress.getPastDiningBalances(bearerToken, DiningInsightsCardAdapter.START_DAY_OF_SEMESTER, formattedCurrentDate)
170+
.subscribeOn(Schedulers.io())
171+
.observeOn(AndroidSchedulers.mainThread())
172+
.subscribe(
166173
{ t: DiningBalancesList? ->
167-
activity?.runOnUiThread {
168-
cells[1].diningBalancesList = t
169-
cells[2].diningBalancesList = t
170-
(insightsrv.adapter as DiningInsightsCardAdapter).notifyItemChanged(1)
171-
(insightsrv.adapter as DiningInsightsCardAdapter).notifyItemChanged(2)
172-
binding.diningInsightsRefresh.isRefreshing = false
173-
}
174+
cells[1].diningBalancesList = t
175+
cells[2].diningBalancesList = t
176+
(insightsrv.adapter as DiningInsightsCardAdapter).notifyItemChanged(1)
177+
(insightsrv.adapter as DiningInsightsCardAdapter).notifyItemChanged(2)
178+
binding.diningInsightsRefresh.isRefreshing = false
174179
},
175180
{ throwable ->
176-
activity?.runOnUiThread {
177-
Log.e("DiningInsightsFragment", "Error getting balances", throwable)
178-
binding.diningInsightsRefresh.isRefreshing = false
179-
}
181+
Log.e("DiningInsightsFragment", "Error getting balances", throwable)
182+
binding.diningInsightsRefresh.isRefreshing = false
180183
},
181184
)
182185
}

0 commit comments

Comments
 (0)