Skip to content

Commit

Permalink
Create network container for the studentLife instance.
Browse files Browse the repository at this point in the history
  • Loading branch information
meiron03 committed Mar 18, 2024
1 parent c3efc6b commit ca97333
Show file tree
Hide file tree
Showing 5 changed files with 108 additions and 4 deletions.
2 changes: 1 addition & 1 deletion PennMobile/src/main/AndroidManifest.xml
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@

<uses-permission android:name="android.permission.WAKE_LOCK" />
<application
android:name="androidx.multidex.MultiDexApplication"
android:name=".PennMobileApp"
android:allowBackup="true"
android:hardwareAccelerated="true"
android:icon="@mipmap/ic_launcher"
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@ import androidx.preference.PreferenceManager
import androidx.recyclerview.widget.LinearLayoutManager
import com.pennapps.labs.pennmobile.adapters.HomeAdapter
import com.pennapps.labs.pennmobile.api.OAuth2NetworkManager
import com.pennapps.labs.pennmobile.api.StudentLife
import com.pennapps.labs.pennmobile.classes.HomepageViewModel
import com.pennapps.labs.pennmobile.components.collapsingtoolbar.ToolbarBehavior
import com.pennapps.labs.pennmobile.databinding.FragmentHomeBinding
Expand All @@ -32,6 +33,7 @@ class HomeFragment : Fragment() {

private lateinit var mActivity: MainActivity
private lateinit var sharedPreferences: SharedPreferences
private lateinit var mStudentLife: StudentLife

private var _binding : FragmentHomeBinding? = null
private val binding get() = _binding!!
Expand All @@ -44,6 +46,12 @@ class HomeFragment : Fragment() {
sharedPreferences = PreferenceManager.getDefaultSharedPreferences(mActivity)
}

override fun onAttach(context: Context) {
super.onAttach(context)
val networkContainer = (context.applicationContext as PennMobileApp).networkContainer
mStudentLife = networkContainer.pennMobileAPI
}

override fun onCreateView(
inflater: LayoutInflater, container: ViewGroup?,
savedInstanceState: Bundle?
Expand Down Expand Up @@ -147,7 +155,6 @@ class HomeFragment : Fragment() {
return
}

val studentLife = MainActivity.studentLifeInstance
mActivity.mNetworkManager.getAccessToken {
val sp = sharedPreferences
val deviceID = OAuth2NetworkManager(mActivity).getDeviceId()
Expand All @@ -158,15 +165,15 @@ class HomeFragment : Fragment() {
lifecycleScope.launch(Dispatchers.Default) {
// set adapter if it is null
if (binding.homeCellsRv.adapter == null) {
homepageViewModel.populateHomePageCells(studentLife, isLoggedIn, bearerToken, deviceID)
homepageViewModel.populateHomePageCells(mStudentLife, isLoggedIn, bearerToken, deviceID)
withContext(Dispatchers.Main) {
binding.homeCellsRv.adapter = HomeAdapter(homepageViewModel)
binding.homeCellsRv.visibility = View.INVISIBLE
binding.internetConnectionHome.visibility = View.GONE
binding.homeRefreshLayout.isRefreshing = false
}
} else { // otherwise, call updateHomePageCells which only updates the cells that are changed
val updatedIndices = homepageViewModel.updateHomePageCells(studentLife, isLoggedIn,
val updatedIndices = homepageViewModel.updateHomePageCells(mStudentLife, isLoggedIn,
bearerToken, deviceID)
withContext(Dispatchers.Main) {
updatedIndices.forEach { pos ->
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
package com.pennapps.labs.pennmobile

import android.app.Application
import com.pennapps.labs.pennmobile.api.NetworkContainer

class PennMobileApp : Application() {
val networkContainer = NetworkContainer()
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,88 @@
package com.pennapps.labs.pennmobile.api

import com.google.gson.GsonBuilder
import com.google.gson.reflect.TypeToken
import com.pennapps.labs.pennmobile.classes.Contact
import com.pennapps.labs.pennmobile.classes.Venue
import com.pennapps.labs.pennmobile.api.Serializer.*
import com.pennapps.labs.pennmobile.classes.Account
import com.pennapps.labs.pennmobile.classes.DiningHall
import com.pennapps.labs.pennmobile.classes.FlingEvent
import com.pennapps.labs.pennmobile.classes.GSRLocation
import com.pennapps.labs.pennmobile.classes.GSRReservation
import com.pennapps.labs.pennmobile.classes.LaundryRoom
import com.pennapps.labs.pennmobile.classes.LaundryRoomSimple
import com.pennapps.labs.pennmobile.classes.LaundryUsage
import com.pennapps.labs.pennmobile.classes.Post
import com.squareup.okhttp.OkHttpClient
import retrofit.RestAdapter
import retrofit.client.OkClient
import retrofit.converter.GsonConverter
import java.util.concurrent.TimeUnit

class NetworkContainer {
val pennMobileAPI: StudentLife
private val endpoint : String = "https://pennmobile.org/api"
init {
val gsonBuilder = GsonBuilder()
gsonBuilder.registerTypeAdapter(
object : TypeToken<MutableList<Contact?>?>() {}.type,
DataSerializer<Any?>()
)
gsonBuilder.registerTypeAdapter(
object : TypeToken<MutableList<Venue?>?>() {}.type,
VenueSerializer()
)
gsonBuilder.registerTypeAdapter(DiningHall::class.java, MenuSerializer())
// gets room
gsonBuilder.registerTypeAdapter(
object : TypeToken<LaundryRoom?>() {}.type,
LaundryRoomSerializer()
)
// gets laundry room list
gsonBuilder.registerTypeAdapter(object :
TypeToken<MutableList<LaundryRoomSimple?>?>() {}.type, LaundryRoomListSerializer())
gsonBuilder.registerTypeAdapter(
object : TypeToken<MutableList<GSRLocation?>?>() {}.type,
GsrLocationSerializer()
)
// gets laundry usage
gsonBuilder.registerTypeAdapter(
object : TypeToken<LaundryUsage?>() {}.type,
LaundryUsageSerializer()
)
// gets laundry preferences (used only for testing)
gsonBuilder.registerTypeAdapter(
object : TypeToken<MutableList<Int?>?>() {}.type,
LaundryPrefSerializer()
)
gsonBuilder.registerTypeAdapter(
object : TypeToken<MutableList<FlingEvent?>?>() {}.type,
FlingEventSerializer()
)
// gets gsr reservations
gsonBuilder.registerTypeAdapter(
object : TypeToken<MutableList<GSRReservation?>?>() {}.type,
GsrReservationSerializer()
)
// gets user
gsonBuilder.registerTypeAdapter(Account::class.java, UserSerializer())
// gets posts
gsonBuilder.registerTypeAdapter(
object : TypeToken<MutableList<Post?>?>() {}.type,
PostsSerializer()
)
val gson = gsonBuilder.create()
val okHttpClient = OkHttpClient()
okHttpClient.setConnectTimeout(35, TimeUnit.SECONDS) // Connection timeout
okHttpClient.setReadTimeout(35, TimeUnit.SECONDS) // Read timeout
okHttpClient.setWriteTimeout(35, TimeUnit.SECONDS) // Write timeout
val restAdapter = RestAdapter.Builder()
.setConverter(GsonConverter(gson))
.setClient(OkClient(okHttpClient))
.setEndpoint(endpoint)
.build()
pennMobileAPI = restAdapter.create(StudentLife::class.java)
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@ import androidx.lifecycle.LiveData
import androidx.lifecycle.MutableLiveData
import androidx.lifecycle.ViewModel
import androidx.lifecycle.viewModelScope
import com.pennapps.labs.pennmobile.PennMobileApp
import com.pennapps.labs.pennmobile.api.StudentLife
import com.pennapps.labs.pennmobile.utils.Utils.getSha256Hash
import kotlinx.coroutines.flow.MutableStateFlow
Expand Down

0 comments on commit ca97333

Please sign in to comment.