diff --git a/PennMobile/src/main/java/com/pennapps/labs/pennmobile/NewListingsFragment.kt b/PennMobile/src/main/java/com/pennapps/labs/pennmobile/Subletting/NewListingsFragment.kt similarity index 95% rename from PennMobile/src/main/java/com/pennapps/labs/pennmobile/NewListingsFragment.kt rename to PennMobile/src/main/java/com/pennapps/labs/pennmobile/Subletting/NewListingsFragment.kt index e781df4db..776429e04 100644 --- a/PennMobile/src/main/java/com/pennapps/labs/pennmobile/NewListingsFragment.kt +++ b/PennMobile/src/main/java/com/pennapps/labs/pennmobile/Subletting/NewListingsFragment.kt @@ -1,4 +1,4 @@ -package com.pennapps.labs.pennmobile +package com.pennapps.labs.pennmobile.Subletting import android.graphics.BitmapFactory import android.os.Bundle @@ -15,20 +15,19 @@ import android.widget.Toast import androidx.activity.result.PickVisualMediaRequest import androidx.activity.result.contract.ActivityResultContracts import androidx.fragment.app.Fragment +import com.pennapps.labs.pennmobile.MainActivity import com.pennapps.labs.pennmobile.api.StudentLife import com.pennapps.labs.pennmobile.classes.AmenitiesItem import com.pennapps.labs.pennmobile.classes.MultipartUtil import com.pennapps.labs.pennmobile.classes.Sublet import com.pennapps.labs.pennmobile.classes.SublettingViewModel -import com.pennapps.labs.pennmobile.databinding.FragmentNewListingsBinding -import okhttp3.MediaType.Companion.toMediaType +import com.pennapps.labs.pennmobile.databinding.FragmentSubletterNewListingBinding import okhttp3.MultipartBody -import okhttp3.RequestBody.Companion.toRequestBody import java.io.IOException class NewListingsFragment(private val dataModel: SublettingViewModel) : Fragment() { - private var _binding: FragmentNewListingsBinding? = null + private var _binding: FragmentSubletterNewListingBinding? = null private val binding get() = _binding!! private lateinit var mStudentLife: StudentLife @@ -100,7 +99,7 @@ class NewListingsFragment(private val dataModel: SublettingViewModel) : Fragment override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? { - _binding = FragmentNewListingsBinding.inflate(inflater, container, false) + _binding = FragmentSubletterNewListingBinding.inflate(inflater, container, false) val view = binding.root super.onViewCreated(view, savedInstanceState) @@ -253,8 +252,10 @@ class NewListingsFragment(private val dataModel: SublettingViewModel) : Fragment } } - val subletPart = MultipartUtil.createSubletPart(subletId) - + if (multipartImage != null) { + val subletPart = MultipartUtil.createSubletPart(subletId) + dataModel.postImage(mActivity, subletId, subletPart, multipartImage!!) + } diff --git a/PennMobile/src/main/java/com/pennapps/labs/pennmobile/Subletting/SubletDetailsFragment.kt b/PennMobile/src/main/java/com/pennapps/labs/pennmobile/Subletting/SubletDetailsFragment.kt index 3a8f5976e..6c8656571 100644 --- a/PennMobile/src/main/java/com/pennapps/labs/pennmobile/Subletting/SubletDetailsFragment.kt +++ b/PennMobile/src/main/java/com/pennapps/labs/pennmobile/Subletting/SubletDetailsFragment.kt @@ -5,10 +5,12 @@ import android.view.LayoutInflater import android.view.View import android.view.ViewGroup import androidx.fragment.app.Fragment +import androidx.fragment.app.FragmentTransaction import androidx.viewpager2.widget.ViewPager2 import com.bumptech.glide.Glide import com.bumptech.glide.load.resource.drawable.DrawableTransitionOptions import com.pennapps.labs.pennmobile.MainActivity +import com.pennapps.labs.pennmobile.R import com.pennapps.labs.pennmobile.api.StudentLife import com.pennapps.labs.pennmobile.classes.Sublet import com.pennapps.labs.pennmobile.classes.SublettingViewModel @@ -34,7 +36,7 @@ class SubletDetailsFragment(private val dataModel: SublettingViewModel, private val sublet : Sublet = dataModel.getSublet(subletNumber) binding.titleText.text = sublet.title - binding.priceText.text = sublet.price.toString() + binding.priceText.text = "$" + sublet.price.toString() binding.addressText.text = sublet.address binding.datesText.text = sublet.startDate + " to " + sublet.endDate binding.descriptionText.text = sublet.description ?: "None" @@ -51,9 +53,26 @@ class SubletDetailsFragment(private val dataModel: SublettingViewModel, private dataModel.deleteSublet(mActivity, subletNumber) } + binding.editText.setOnClickListener(){ + navigateEditListing() + } + return binding.root } + + private fun navigateEditListing() { + val mainActivity = context as MainActivity + + val fragment = SubletEditFragment(dataModel, subletNumber) + + val fragmentManager = mainActivity.supportFragmentManager + fragmentManager.beginTransaction() + .replace(R.id.content_frame, fragment, "NEW_LISTING_FRAGMENT") + .setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN) + .addToBackStack(null) + .commitAllowingStateLoss() + } } \ No newline at end of file diff --git a/PennMobile/src/main/java/com/pennapps/labs/pennmobile/Subletting/SubletDetailsHolderFragment.kt b/PennMobile/src/main/java/com/pennapps/labs/pennmobile/Subletting/SubletDetailsHolderFragment.kt index c09ff7ff9..1b7f9cb3a 100644 --- a/PennMobile/src/main/java/com/pennapps/labs/pennmobile/Subletting/SubletDetailsHolderFragment.kt +++ b/PennMobile/src/main/java/com/pennapps/labs/pennmobile/Subletting/SubletDetailsHolderFragment.kt @@ -7,6 +7,8 @@ import android.view.ViewGroup import androidx.coordinatorlayout.widget.CoordinatorLayout import androidx.fragment.app.Fragment import androidx.viewpager2.widget.ViewPager2 +import com.google.android.material.tabs.TabLayout +import com.google.android.material.tabs.TabLayoutMediator import com.pennapps.labs.pennmobile.MainActivity import com.pennapps.labs.pennmobile.R import com.pennapps.labs.pennmobile.adapters.SubletDetailsPagerAdapter @@ -41,6 +43,16 @@ class SubletDetailsHolderFragment(private val dataModel: SublettingViewModel, pr subletDetailsPagerAdapter = SubletDetailsPagerAdapter(this, dataModel, subletNumber) viewPager = view.findViewById(R.id.listing_view_pager) viewPager.adapter = subletDetailsPagerAdapter + val tabLayout : TabLayout = view.findViewById(R.id.listing_tab_layout) + TabLayoutMediator(tabLayout, viewPager) { tab, position -> + if(position == 0) { + tab.text = "Details" + } else { + tab.text = "Candidates" + } + }.attach() + + } diff --git a/PennMobile/src/main/java/com/pennapps/labs/pennmobile/Subletting/SubletEditFragment.kt b/PennMobile/src/main/java/com/pennapps/labs/pennmobile/Subletting/SubletEditFragment.kt new file mode 100644 index 000000000..56e6c8af3 --- /dev/null +++ b/PennMobile/src/main/java/com/pennapps/labs/pennmobile/Subletting/SubletEditFragment.kt @@ -0,0 +1,316 @@ +package com.pennapps.labs.pennmobile.Subletting + +import android.graphics.BitmapFactory +import android.os.Bundle +import android.util.Log +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import android.widget.CheckBox +import android.widget.EditText +import android.widget.ImageView +import android.widget.Spinner +import android.widget.TextView +import android.widget.Toast +import androidx.activity.result.PickVisualMediaRequest +import androidx.activity.result.contract.ActivityResultContracts +import androidx.fragment.app.Fragment +import com.bumptech.glide.Glide +import com.bumptech.glide.load.resource.drawable.DrawableTransitionOptions +import com.pennapps.labs.pennmobile.MainActivity +import com.pennapps.labs.pennmobile.api.StudentLife +import com.pennapps.labs.pennmobile.classes.AmenitiesItem +import com.pennapps.labs.pennmobile.classes.MultipartUtil +import com.pennapps.labs.pennmobile.classes.Sublet +import com.pennapps.labs.pennmobile.classes.SublettingViewModel +import com.pennapps.labs.pennmobile.databinding.FragmentSubletterEditListingBinding +import com.pennapps.labs.pennmobile.databinding.FragmentSubletterNewListingBinding +import okhttp3.MultipartBody +import java.io.IOException + +class SubletEditFragment (private val dataModel: SublettingViewModel, private val subletNumber: Int) : Fragment() { + private var _binding: FragmentSubletterEditListingBinding? = null + private val binding get() = _binding!! + + private lateinit var mStudentLife: StudentLife + + internal lateinit var titleEt : EditText + internal lateinit var priceEt : EditText + internal lateinit var streetAddressEt : EditText + internal lateinit var apartmentEt : EditText + internal lateinit var zipCodeEt : EditText + internal lateinit var startEt : EditText + internal lateinit var endEt : EditText + internal lateinit var bedsSpinner : Spinner + internal lateinit var bathsSpinner : Spinner + internal lateinit var descriptionEt : EditText + internal lateinit var bathroomCheck : CheckBox + internal lateinit var laundryCheck : CheckBox + internal lateinit var gymCheck : CheckBox + internal lateinit var wifiCheck : CheckBox + internal lateinit var furnishedCheck : CheckBox + internal lateinit var closetCheck : CheckBox + internal lateinit var utilitiesCheck : CheckBox + internal lateinit var poolCheck : CheckBox + internal lateinit var loungeCheck : CheckBox + internal lateinit var parkingCheck : CheckBox + internal lateinit var patioCheck : CheckBox + internal lateinit var kitchenCheck : CheckBox + internal lateinit var dogCheck : CheckBox + internal lateinit var catCheck : CheckBox + internal lateinit var imageView: ImageView + internal lateinit var imageIcon: ImageView + internal lateinit var imageText: TextView + + //Sublet variables + private lateinit var title : String + private lateinit var price : String + private var streetAddress : String? = null + private var apartment : String? = null + private var zipCode : String? = null + private lateinit var startDate : String + private lateinit var endDate : String + private var beds : Int? = null + private var baths : Int? = null + private var description: String? = null + private lateinit var amenities: List + + private var image: String? = null + var multipartImage: MultipartBody.Part? = null + + private lateinit var mActivity: MainActivity + + + + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + mStudentLife = MainActivity.studentLifeInstance + mActivity = activity as MainActivity + mActivity.hideBottomBar() + } + + override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, + savedInstanceState: Bundle?): View? { + _binding = FragmentSubletterEditListingBinding.inflate(inflater, container, false) + val view = binding.root + super.onViewCreated(view, savedInstanceState) + + titleEt = binding.listingNameInput + priceEt = binding.priceInput + streetAddressEt = binding.streetAddressInput + apartmentEt = binding.apartmentInput + zipCodeEt = binding.postalCodeInput + startEt = binding.startDateInput + endEt = binding.endDateInput + bedsSpinner = binding.bedInput + bathsSpinner = binding.bathInput + descriptionEt = binding.descriptionInput + bathroomCheck = binding.bathroomCheck + laundryCheck = binding.laundryCheck + gymCheck = binding.gymCheck + wifiCheck = binding.wifiCheck + furnishedCheck = binding.furnishedCheck + closetCheck = binding.closetCheck + utilitiesCheck = binding.utilitiesCheck + poolCheck = binding.poolCheck + loungeCheck = binding.loungeCheck + parkingCheck = binding.parkingCheck + patioCheck = binding.patioCheck + kitchenCheck = binding.kitchenCheck + dogCheck = binding.dogCheck + catCheck = binding.catCheck + imageView = binding.mainImage + imageIcon = binding.mainImageIcon + imageText = binding.addPhotosText + + val sublet : Sublet = dataModel.getSublet(subletNumber) + titleEt.setText(sublet.title) + priceEt.setText(sublet.price.toString()) + + if (sublet.address != null) { + val addressComponents = sublet.address.split(", ") + streetAddressEt.setText(addressComponents.getOrElse(0) { "" }) + apartmentEt.setText(addressComponents.getOrElse(1) { "" }) + zipCodeEt.setText(addressComponents.getOrElse(2) { "" }) + } + + startEt.setText(sublet.startDate) + endEt.setText(sublet.endDate) + descriptionEt.setText(sublet.description) + + + context?.let { + Glide.with(it) + .load(sublet.images?.get(0)?.imageUrl) + .centerCrop() // optional - adjust as needed + .transition(DrawableTransitionOptions.withCrossFade()) + .into(binding.mainImage) + } + + val amenitiesList = sublet.amenities ?: emptyList() + + for (amenity in amenitiesList) { + when (amenity) { + "Private Bathroom" -> bathroomCheck.isChecked = true + "In-unit Laundry" -> laundryCheck.isChecked = true + "In-Unit Laundry" -> laundryCheck.isChecked = true + "Gym" -> gymCheck.isChecked = true + "Wifi" -> wifiCheck.isChecked = true + "Furnished" -> furnishedCheck.isChecked = true + "Walk-in Closet" -> closetCheck.isChecked = true + "Utilities Included" -> utilitiesCheck.isChecked = true + "Swimming Pool" -> poolCheck.isChecked = true + "Resident Lounge" -> loungeCheck.isChecked = true + "Parking" -> parkingCheck.isChecked = true + "Patio" -> patioCheck.isChecked = true + "Kitchen" -> kitchenCheck.isChecked = true + "Dog-Friendly" -> dogCheck.isChecked = true + "Cat-Friendly" -> catCheck.isChecked = true + } + } + + + val pickMedia = registerForActivityResult(ActivityResultContracts.PickVisualMedia()) { uri -> + // Callback is invoked after the user selects a media item or closes the + // photo picker. + if (uri != null) { + Log.d("PhotoPicker", "Selected URI: $uri") + try { + // Load the selected image into the ImageView + val inputStream = context?.contentResolver?.openInputStream(uri) + val bitmap = BitmapFactory.decodeStream(inputStream) + image = bitmap.toString() + imageView.setImageBitmap(bitmap) + imageIcon.visibility = View.GONE + imageText.visibility = View.GONE + multipartImage = MultipartUtil.createPartFromBitmap(bitmap) + + + + inputStream?.close() + } catch (e: IOException) { + e.printStackTrace() + Toast.makeText(context, "Failed to load image", Toast.LENGTH_SHORT).show() + } + } else { + Log.d("PhotoPicker", "No media selected") + } + } + + imageView.setOnClickListener{ + pickMedia.launch(PickVisualMediaRequest(ActivityResultContracts.PickVisualMedia.ImageOnly)) + } + + + val dateRegex = Regex("""^(0[1-9]|1[0-2])/(0[1-9]|[1-2][0-9]|3[0-1])/\d{2}$""") + + binding.postButton.setOnClickListener{ + if (titleEt.text.toString().matches("".toRegex()) + || priceEt.text.toString().matches("".toRegex()) + || startEt.text.toString().matches("".toRegex()) + || endEt.text.toString().matches("".toRegex())) { + Toast.makeText(activity, "Please fill in all required fields", + Toast.LENGTH_LONG).show() + } else if (!startEt.text.toString().matches(dateRegex) || !endEt.text.toString().matches(dateRegex)) { + Toast.makeText(activity, "Please follow formatting instructions for date", + Toast.LENGTH_LONG).show() + } else { + title = titleEt.text.toString() + price = priceEt.text.toString() + streetAddress = streetAddressEt.text.toString() + ", " + apartmentEt.text.toString() + + ", " + zipCodeEt.text.toString() + if (streetAddress.equals(", , ")) { + streetAddress = null + } + startDate = startEt.text.toString() + endDate = endEt.text.toString() + + beds = bedsSpinner.selectedItemPosition + 1 + baths = bathsSpinner.selectedItemPosition + 1 + + val amenitiesList = mutableListOf() + if(bathroomCheck.isChecked) { amenitiesList.add("Private Bathroom") } + if(laundryCheck.isChecked) { amenitiesList.add("In-Unit Laundry") } + if(gymCheck.isChecked) { amenitiesList.add("Gym") } + if(wifiCheck.isChecked) { amenitiesList.add("Wifi") } + if(furnishedCheck.isChecked) { amenitiesList.add("Furnished") } + if(closetCheck.isChecked) { amenitiesList.add("Walk-in Closet") } + if(utilitiesCheck.isChecked) { amenitiesList.add("Utilities Included") } + if(poolCheck.isChecked) { amenitiesList.add("Swimming Pool") } + if(loungeCheck.isChecked) { amenitiesList.add("Resident Lounge") } + if(parkingCheck.isChecked) { amenitiesList.add("Parking") } + if(patioCheck.isChecked) { amenitiesList.add("Patio") } + if(kitchenCheck.isChecked) { amenitiesList.add("Kitchen") } + if(dogCheck.isChecked) { amenitiesList.add("Dog-Friendly") } + if(catCheck.isChecked) { amenitiesList.add("Cat-Friendly") } + + description = descriptionEt.text.toString() + if (description.equals("")) { + description = null; + } + + editSublet(title, Integer.parseInt(price), streetAddress, startDate, endDate, beds, + baths, amenitiesList, description) + + } + + } + return view + } + + private fun editSublet(title : String, price : Int, address : String?, startDate: String, + endDate : String, beds: Int?, baths: Int?, amenities: List?, + description: String?) { + val convertedEnd = convertToYYYYMMDD(endDate) + val convertedStart = convertToYYYYMMDD(startDate) + var subletId = -1 + + + val newSublet = Sublet( + endDate = convertedEnd, + baths = baths, + address = address, + price = price,//fix + expiresAt = "3000-02-01T10:48:02-05:00", //? + description = description, + title = title, + beds = beds, + amenities = amenities, + externalLink = "https://pennlabs.org/", // fix + startDate = convertedStart + ) + + dataModel.editSublet(mActivity, newSublet, subletNumber) { postedSublet -> + if (postedSublet != null) { + Log.i("MainActivity", "Posted sublet ID: ${postedSublet.id}") + subletId = postedSublet.id!! + } else { + // Handle failure to post sublet + Log.e("MainActivity", "Failed to post sublet") + } + } + + if (multipartImage != null) { + val subletPart = MultipartUtil.createSubletPart(subletId) + dataModel.postImage(mActivity, subletId, subletPart, multipartImage!!) + } + + + + + + } + + private fun convertToYYYYMMDD(mmddyy: String): String { + val components = mmddyy.split("/") + val month = components[0].toInt() + val day = components[1].toInt() + val year = components[2].toInt() + 2000 + + return String.format("%04d-%02d-%02d", year, month, day) + } + + + + +} \ No newline at end of file diff --git a/PennMobile/src/main/java/com/pennapps/labs/pennmobile/Subletting/SubletterDraftListingsFragment.kt b/PennMobile/src/main/java/com/pennapps/labs/pennmobile/Subletting/SubletterDraftListingsFragment.kt index abd9a7c13..713f823a6 100644 --- a/PennMobile/src/main/java/com/pennapps/labs/pennmobile/Subletting/SubletterDraftListingsFragment.kt +++ b/PennMobile/src/main/java/com/pennapps/labs/pennmobile/Subletting/SubletterDraftListingsFragment.kt @@ -6,7 +6,6 @@ import android.view.View import android.view.ViewGroup import androidx.fragment.app.Fragment import com.pennapps.labs.pennmobile.MainActivity -import com.pennapps.labs.pennmobile.NewListingsFragment import com.pennapps.labs.pennmobile.R import com.pennapps.labs.pennmobile.classes.SublettingViewModel import com.pennapps.labs.pennmobile.databinding.FragmentSubletterDraftListingsBinding diff --git a/PennMobile/src/main/java/com/pennapps/labs/pennmobile/Subletting/SubletterPostedListingsFragment.kt b/PennMobile/src/main/java/com/pennapps/labs/pennmobile/Subletting/SubletterPostedListingsFragment.kt index c34f974be..f1cd43069 100644 --- a/PennMobile/src/main/java/com/pennapps/labs/pennmobile/Subletting/SubletterPostedListingsFragment.kt +++ b/PennMobile/src/main/java/com/pennapps/labs/pennmobile/Subletting/SubletterPostedListingsFragment.kt @@ -10,7 +10,6 @@ import androidx.recyclerview.widget.GridLayoutManager import androidx.recyclerview.widget.LinearLayoutManager import androidx.recyclerview.widget.RecyclerView import com.pennapps.labs.pennmobile.MainActivity -import com.pennapps.labs.pennmobile.NewListingsFragment import com.pennapps.labs.pennmobile.R import com.pennapps.labs.pennmobile.adapters.PostedSubletsListAdapter import com.pennapps.labs.pennmobile.api.StudentLife @@ -31,7 +30,6 @@ class SubletterPostedListingsFragment() : Fragment() { //api manager private lateinit var mStudentLife: StudentLife - private lateinit var mActivity: MainActivity override fun onCreate(savedInstanceState: Bundle?) { @@ -40,17 +38,12 @@ class SubletterPostedListingsFragment() : Fragment() { mActivity = activity as MainActivity mActivity.closeKeyboard() dataModel = SublettingViewModel(mActivity, mStudentLife) - - val bundle = Bundle() } override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? { // Inflate the layout for this fragment _binding = FragmentSubletterPostedListingsBinding.inflate(inflater, container, false) - binding.postedAddListingButton.setOnClickListener{ - navigateCreateNewListing() - } return binding.root } @@ -60,17 +53,33 @@ class SubletterPostedListingsFragment() : Fragment() { newLayoutManager = GridLayoutManager(context, 2, LinearLayoutManager.VERTICAL, false) sublettingRecyclerView.layoutManager = newLayoutManager - dataModel.getPostedSublets(mActivity) myAdapter = PostedSubletsListAdapter(dataModel) - dataModel.postedSubletsList.observe(viewLifecycleOwner, { sublets -> + dataModel.postedSubletsList.observe(viewLifecycleOwner) { sublets -> + binding.listingsRefreshLayout.isRefreshing = false + sublettingList = sublets myAdapter.notifyDataSetChanged() - }) + + if (sublets.size > 0) { + binding.postedHouseImage.visibility = View.GONE + binding.postedNoListingsText.visibility = View.GONE + } else { + binding.postedHouseImage.visibility = View.VISIBLE + binding.postedNoListingsText.visibility = View.VISIBLE + } + } + sublettingRecyclerView.adapter = myAdapter - } + binding.listingsRefreshLayout.setOnRefreshListener { + dataModel.getPostedSublets(mActivity) + } + binding.postedAddListingButton.setOnClickListener{ + navigateCreateNewListing() + } + } private fun navigateCreateNewListing() { val mainActivity = context as MainActivity @@ -85,4 +94,8 @@ class SubletterPostedListingsFragment() : Fragment() { .commitAllowingStateLoss() } + override fun onDestroy() { + super.onDestroy() + _binding = null + } } \ No newline at end of file diff --git a/PennMobile/src/main/java/com/pennapps/labs/pennmobile/SublettingHolderFragment.kt b/PennMobile/src/main/java/com/pennapps/labs/pennmobile/SublettingHolderFragment.kt index 8a55bb243..5df6ab725 100644 --- a/PennMobile/src/main/java/com/pennapps/labs/pennmobile/SublettingHolderFragment.kt +++ b/PennMobile/src/main/java/com/pennapps/labs/pennmobile/SublettingHolderFragment.kt @@ -51,17 +51,5 @@ class SublettingFragment : Fragment() { tab.text = "Sublessee" } }.attach() - - - } - - - private fun initAppBar(view: View) { - (view.appbar_home_holder.layoutParams as CoordinatorLayout.LayoutParams).behavior = ToolbarBehavior() } - - - - - } \ No newline at end of file diff --git a/PennMobile/src/main/java/com/pennapps/labs/pennmobile/adapters/PostedSubletsListAdapter.kt b/PennMobile/src/main/java/com/pennapps/labs/pennmobile/adapters/PostedSubletsListAdapter.kt index 233192612..cab0c3e26 100644 --- a/PennMobile/src/main/java/com/pennapps/labs/pennmobile/adapters/PostedSubletsListAdapter.kt +++ b/PennMobile/src/main/java/com/pennapps/labs/pennmobile/adapters/PostedSubletsListAdapter.kt @@ -29,14 +29,11 @@ class PostedSubletsListAdapter(private val dataModel: SublettingViewModel): private lateinit var mActivity: MainActivity class SublettingCardViewHolder(itemView: View): RecyclerView.ViewHolder(itemView) { - - var listingImage = itemView.findViewById(R.id.subletting_cardview_image) - var listingTitle = itemView.findViewById(R.id.subletting_cardview_title) - var listingPrice = itemView.findViewById(R.id.subletting_cardview_price) - var listingRooms = itemView.findViewById(R.id.subletting_cardview_rooms) - var listingDates = itemView.findViewById(R.id.subletting_cardview_dates) - - + var listingImage: ImageView = itemView.findViewById(R.id.subletting_cardview_image) + var listingTitle: TextView = itemView.findViewById(R.id.subletting_cardview_title) + var listingPrice: TextView = itemView.findViewById(R.id.subletting_cardview_price) + var listingRooms: TextView = itemView.findViewById(R.id.subletting_cardview_rooms) + var listingDates: TextView = itemView.findViewById(R.id.subletting_cardview_dates) } override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): SublettingCardViewHolder { @@ -47,20 +44,17 @@ class PostedSubletsListAdapter(private val dataModel: SublettingViewModel): } override fun onBindViewHolder(holder: SublettingCardViewHolder, position: Int) { + val mSublettingCard: Sublet = dataModel.getSublet(position) // dataModel.getSublet(position) - var mSublettingCard: Sublet = dataModel.getSublet(position) // dataModel.getSblet(position) - //holder.listingImage.setImageResource(mSublettingCard.listingImage!!) - - /* Glide.with(mContext) // Use mContext here instead of context + Glide.with(mContext) // Use mContext here instead of context .load(mSublettingCard.images?.get(0)?.imageUrl) // Access the first image URL from the list .centerCrop() // optional - adjust as needed .transition(DrawableTransitionOptions.withCrossFade()) - .into(holder.listingImage) */ + .into(holder.listingImage) holder.listingTitle.text = mSublettingCard.title - var price = "$" + mSublettingCard.price.toString() - + val price = "$" + mSublettingCard.price.toString() holder.listingPrice.text = price val rooms = mSublettingCard.beds.toString() + " bd | " + @@ -74,8 +68,10 @@ class PostedSubletsListAdapter(private val dataModel: SublettingViewModel): .addToBackStack(null) .commit() } - } + holder.listingDates.isSingleLine = false; + holder.listingDates.text = mSublettingCard.startDate + " to \n" + mSublettingCard.endDate + } override fun getItemCount(): Int { return dataModel.postedSubletsList.value?.size ?: 0 diff --git a/PennMobile/src/main/java/com/pennapps/labs/pennmobile/api/StudentLife.java b/PennMobile/src/main/java/com/pennapps/labs/pennmobile/api/StudentLife.java index 370e380a0..d04578750 100644 --- a/PennMobile/src/main/java/com/pennapps/labs/pennmobile/api/StudentLife.java +++ b/PennMobile/src/main/java/com/pennapps/labs/pennmobile/api/StudentLife.java @@ -42,6 +42,7 @@ import retrofit.http.Header; import retrofit.http.Headers; import retrofit.http.POST; +import retrofit.http.PUT; import retrofit.http.Part; import retrofit.http.Path; import retrofit.http.Query; @@ -254,6 +255,15 @@ void deleteSublet( @Path("sublet_id") int id, Callback callback); + @Headers({"Content-Type: application/json"}) + @PUT("/sublet/properties/{sublet_id}") + void editSublet( + @Header("Authorization") String bearerToken, + @Path("sublet_id") int id, + @Body Sublet sublet, + Callback callback + ); + @Headers({"Content-Type: application/json"}) @GET("/sublet/properties/") Observable> getSublets( diff --git a/PennMobile/src/main/java/com/pennapps/labs/pennmobile/classes/SublettingViewModel.kt b/PennMobile/src/main/java/com/pennapps/labs/pennmobile/classes/SublettingViewModel.kt index c0e584cc0..be4f0fe3b 100644 --- a/PennMobile/src/main/java/com/pennapps/labs/pennmobile/classes/SublettingViewModel.kt +++ b/PennMobile/src/main/java/com/pennapps/labs/pennmobile/classes/SublettingViewModel.kt @@ -99,7 +99,7 @@ class SublettingViewModel (private val activity: Activity, private val studentLi "Bearer " + sp.getString(context.getString(R.string.access_token), "").toString() - studentLife.getPostedSublets(bearerToken, true).subscribe({ sublets -> + studentLife.getPostedSublets(bearerToken, false).subscribe({ sublets -> mActivity.runOnUiThread { postedSubletsList.value = sublets as ArrayList } @@ -140,6 +140,40 @@ class SublettingViewModel (private val activity: Activity, private val studentLi } } + fun editSublet(mActivity : MainActivity, sublet : Sublet, id: Int, callback: (Sublet?) -> Unit) { + + val context = activity.applicationContext + val sp = PreferenceManager.getDefaultSharedPreferences(activity) + + + OAuth2NetworkManager(mActivity).getAccessToken { + + val bearerToken = + "Bearer " + sp.getString(context.getString(R.string.access_token), "").toString() + + + studentLife.editSublet(bearerToken, id, sublet, + object : Callback { + override fun success(t: Sublet?, response: Response?) { + Log.i("Subletting View Model", "sublet edited") + callback(sublet) + } + + override fun failure(error: RetrofitError?) { + Log.e("Subletting View Model", "Error editing sublet " + + "$error", error + ) + Toast.makeText(activity, "An error has occurred. Please try again.", Toast.LENGTH_LONG).show() + + + } + + }) + } + + + } + diff --git a/PennMobile/src/main/res/layout/fragment_sublet_details.xml b/PennMobile/src/main/res/layout/fragment_sublet_details.xml index 0c8f2c2a7..951e31036 100644 --- a/PennMobile/src/main/res/layout/fragment_sublet_details.xml +++ b/PennMobile/src/main/res/layout/fragment_sublet_details.xml @@ -1,181 +1,208 @@ + - - - - - - - - - - - - - - - - - -