Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Gsr reservation widget with linting pls work #634

Open
wants to merge 26 commits into
base: main
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
26 commits
Select commit Hold shift + click to select a range
0509b59
GSR widgets changes
Divak2004 Oct 13, 2024
4f79102
Tried to access user token
Divak2004 Oct 13, 2024
ae35f75
GSR Reservation widget mostly done
Divak2004 Oct 20, 2024
f889a1d
Gsr widget now clickable
Divak2004 Oct 20, 2024
75c3c51
Gsr widget now clickable
Divak2004 Oct 20, 2024
6b1fe8e
Gsr widget now clickable
Divak2004 Oct 20, 2024
967a53d
Ktlint files
Divak2004 Oct 20, 2024
76ea6fd
Changed widget dimensions
Divak2004 Oct 27, 2024
817925e
Merge branch 'main' of https://github.com/pennlabs/penn-mobile-androi…
Divak2004 Dec 8, 2024
712abbd
Update GsrReservationsRequest.java
Divak2004 Dec 8, 2024
ab1d9cf
Refactored files locations
Divak2004 Dec 8, 2024
62c65c8
Reservation changes load, text does not bleed
Divak2004 Jan 25, 2025
dc80d83
Ktlint files
Divak2004 Jan 25, 2025
61a2544
Changed empty view and other dimensions
Divak2004 Jan 25, 2025
faab0a4
Added JobService to avoid crashes
Divak2004 Jan 26, 2025
afc4af6
Color is updated
Divak2004 Jan 26, 2025
32e5e57
updated reservation
Divak2004 Feb 9, 2025
3dc5245
Widget updates when reservations change
Divak2004 Feb 11, 2025
0b057e6
widget refreshes on log in and log out
Divak2004 Feb 16, 2025
19c2570
widget should update every 30 mins
Divak2004 Feb 23, 2025
53df16d
Widget should be done
Divak2004 Feb 23, 2025
52fae9d
Cleaned files
Divak2004 Mar 2, 2025
bcb1211
Cleaned files
Divak2004 Mar 2, 2025
ce2e662
Cleaned files
Divak2004 Mar 2, 2025
ce84e0b
Cleaned other files
Divak2004 Mar 2, 2025
bea5518
Merge branch 'main' into gsr-reservation-widget
Divak2004 Mar 2, 2025
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
12 changes: 12 additions & 0 deletions PennMobile/build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -48,6 +48,18 @@ android {
}

dependencies {
// // Kotlin
// implementation(libs.androidx.core.ktx)
//
// // To use RoleManagerCompat
// implementation(libs.androidx.core.role)
//
// // To use the Animator APIs
// implementation(libs.androidx.core.animation)
//
// // To test the Animator APIs
// androidTestImplementation(libs.androidx.core.animation.testing)

implementation fileTree(include: ['*.jar'], dir: 'libs')

androidTestImplementation libs.androidx.espresso.core
Expand Down
17 changes: 17 additions & 0 deletions PennMobile/src/main/AndroidManifest.xml
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,7 @@
android:theme="@style/AppTheme.Launcher"
android:usesCleartextTraffic="true"
tools:targetApi="m">

<receiver
android:name="com.pennapps.labs.pennmobile.dining.widget.DiningHallWidget"
android:exported="false">
Expand All @@ -40,6 +41,20 @@
android:resource="@xml/dining_hall_widget_info" />
</receiver>

<receiver
android:name="com.pennapps.labs.pennmobile.gsr.widget.GsrReservationWidget"
android:exported="false">
<intent-filter>
<action android:name="android.appwidget.action.APPWIDGET_UPDATE" />
<action android:name="android.appwidget.action.ACTION_CLICK" />
<action android:name="AUTO_UPDATE" />
</intent-filter>

<meta-data
android:name="android.appwidget.provider"
android:resource="@xml/gsr_reservation_widget_info" />
</receiver>

<activity
android:name=".MainActivity"
android:exported="true"
Expand All @@ -56,6 +71,8 @@
</activity>
<service android:name=".dining.widget.DiningHallWidgetAdapter"
android:permission="android.permission.BIND_REMOTEVIEWS" />
<service android:name=".gsr.widget.GsrReservationWidgetAdapter"
android:permission="android.permission.BIND_REMOTEVIEWS" />

<meta-data
android:name="com.google.android.gms.version"
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@ package com.pennapps.labs.pennmobile

import StudentLife
import android.content.Context
import android.content.Intent
import android.content.SharedPreferences
import android.content.pm.PackageManager
import android.content.res.Configuration
Expand Down Expand Up @@ -47,6 +48,7 @@ import com.pennapps.labs.pennmobile.dining.classes.Venue
import com.pennapps.labs.pennmobile.fling.classes.FlingEvent
import com.pennapps.labs.pennmobile.gsr.classes.GSRLocation
import com.pennapps.labs.pennmobile.gsr.classes.GSRReservation
import com.pennapps.labs.pennmobile.gsr.widget.GsrReservationWidget
import com.pennapps.labs.pennmobile.home.classes.Post
import com.pennapps.labs.pennmobile.laundry.classes.LaundryRoom
import com.pennapps.labs.pennmobile.more.classes.Contact
Expand Down Expand Up @@ -125,6 +127,15 @@ class MainActivity : AppCompatActivity() {
if (diningWidgetBroadCast != -1) {
setTab(DINING_ID)
}

var gsrReservationWidgetBroadCast = 0
if (intent != null) {
gsrReservationWidgetBroadCast =
intent.getIntExtra("Gsr_Tab_Switch", -1)
}
if (gsrReservationWidgetBroadCast != -1) {
setTab(GSR_ID)
}
}

private fun onExpandableBottomNavigationItemSelected() {
Expand Down Expand Up @@ -189,6 +200,7 @@ class MainActivity : AppCompatActivity() {
editor.apply()
val currentFragment = fragmentManager.findFragmentById(R.id.content_frame)
val fragment: Fragment = LoginFragment()
sendBroadcast(Intent(GsrReservationWidget.UPDATE_GSR_WIDGET))

// change the fragment only if we're not already on the login fragment
if (currentFragment == null || currentFragment::class != fragment::class) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -11,4 +11,4 @@
public interface DiningRequest {
@GET("dining/venues")
Observable<List<Venue>> venues();
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
package com.pennapps.labs.pennmobile.api;

import com.pennapps.labs.pennmobile.gsr.classes.GSRReservation;

import java.util.List;

import retrofit.http.GET;
import retrofit.http.Header;
import rx.Observable;

public interface GsrReservationsRequest {
@GET("/gsr/reservations")
Observable<List<GSRReservation>> getGsrReservations(
@Header("Authorization") String bearerToken
);
}
Original file line number Diff line number Diff line change
@@ -1,6 +1,10 @@
package com.pennapps.labs.pennmobile.api.fragments


import android.content.Intent

import StudentLife

import android.content.SharedPreferences
import android.os.Bundle
import android.security.keystore.KeyGenParameterSpec
Expand Down Expand Up @@ -28,7 +32,12 @@ import com.pennapps.labs.pennmobile.R
import com.pennapps.labs.pennmobile.api.Platform
import com.pennapps.labs.pennmobile.api.classes.AccessTokenResponse
import com.pennapps.labs.pennmobile.api.classes.Account

import com.pennapps.labs.pennmobile.api.classes.GetUserResponse
import com.pennapps.labs.pennmobile.gsr.widget.GsrReservationWidget

import kotlinx.coroutines.launch

import org.apache.commons.lang3.RandomStringUtils
import java.nio.charset.Charset
import java.security.MessageDigest
Expand Down Expand Up @@ -250,6 +259,7 @@ class LoginWebviewFragment : Fragment() {
editor.putString(getString(R.string.email_address), user?.email)
editor.putString(getString(R.string.pennkey), user?.username)
editor.apply()
context?.sendBroadcast(Intent(GsrReservationWidget.UPDATE_GSR_WIDGET))
mActivity.startHomeFragment()
} else {
val error = Exception(response.errorBody()?.string() ?: "Unknown Error")
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -13,9 +13,9 @@ import androidx.localbroadcastmanager.content.LocalBroadcastManager
import androidx.preference.PreferenceManager
import androidx.recyclerview.widget.RecyclerView
import com.pennapps.labs.pennmobile.MainActivity
import com.pennapps.labs.pennmobile.R
import com.pennapps.labs.pennmobile.databinding.GsrReservationBinding
import com.pennapps.labs.pennmobile.gsr.classes.GSRReservation
import com.pennapps.labs.pennmobile.gsr.widget.GsrReservationWidget
import com.squareup.picasso.Picasso
import kotlinx.coroutines.launch
import org.joda.time.format.DateTimeFormat
Expand Down Expand Up @@ -76,13 +76,39 @@ class GsrReservationsAdapter(
val sessionID =
if (reservation.info == null) {
sp.getString(
mContext.getString(R.string.huntsmanGSR_SessionID),
mContext.getString(com.pennapps.labs.pennmobile.R.string.huntsmanGSR_SessionID),
"",
)
} else {
null
}


val labs = MainActivity.studentLifeInstance
val bearerToken =
"Bearer " + sp.getString(mContext.getString(com.pennapps.labs.pennmobile.R.string.access_token), " ")
try {
labs.cancelReservation(
bearerToken,
null,
bookingID,
sessionID,
object : ResponseCallback() {
override fun success(response: Response) {
if (reservations.size > position) {
reservations.removeAt(position)
}
run {
mContext.sendBroadcast(Intent(GsrReservationWidget.UPDATE_GSR_WIDGET))

if (reservations.size == 0) {
var intent = Intent("refresh")
LocalBroadcastManager
.getInstance(mContext)
.sendBroadcast(intent)
} else {
notifyItemRemoved(position)
}
(mContext as MainActivity).lifecycleScope.launch {
val labs = MainActivity.studentLifeInstance
val bearerToken =
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
package com.pennapps.labs.pennmobile.gsr.fragments

import android.content.Intent
import StudentLife
import android.graphics.Color
import android.graphics.PorterDuff
Expand All @@ -17,6 +18,11 @@ import androidx.preference.PreferenceManager
import com.pennapps.labs.pennmobile.MainActivity
import com.pennapps.labs.pennmobile.R
import com.pennapps.labs.pennmobile.databinding.GsrDetailsBookBinding
import com.pennapps.labs.pennmobile.gsr.classes.GSRBookingResult
import com.pennapps.labs.pennmobile.gsr.widget.GsrReservationWidget
import retrofit.Callback
import retrofit.RetrofitError
import retrofit.client.Response
import kotlinx.coroutines.launch

class BookGsrFragment : Fragment() {
Expand Down Expand Up @@ -145,6 +151,49 @@ class BookGsrFragment : Fragment() {
Log.i("BookGSRFragment", "ID $roomId")
Log.i("BookGSRFragment", "Room Name $roomName")

try {
mStudentLife.bookGSR(
// Passing the values
bearerToken,
startTime,
endTime,
gid,
roomId,
roomName,
// Creating an anonymous callback
object : Callback<GSRBookingResult> {
override fun success(
result: GSRBookingResult,
response: Response,
) {
// Displaying the output as a toast and go back to GSR fragment
if (result.getDetail().equals("success")) {
Toast.makeText(activity, "GSR successfully booked", Toast.LENGTH_LONG).show()

context?.sendBroadcast(Intent(GsrReservationWidget.UPDATE_GSR_WIDGET))

// Save user info in shared preferences
val sp = PreferenceManager.getDefaultSharedPreferences(activity)
val editor = sp.edit()
editor.putString(getString(R.string.first_name), firstNameEt.text.toString())
editor.putString(getString(R.string.last_name), lastNameEt.text.toString())
editor.putString(getString(R.string.email_address), emailEt.text.toString())
editor.apply()
} else {
Toast.makeText(activity, "GSR booking failed", Toast.LENGTH_LONG).show()
Log.e("BookGsrFragment", "GSR booking failed with " + result.getError())
}
// go back to GSR fragment
binding.loading.loadingPanel.visibility = View.GONE
activity?.onBackPressed()
}

override fun failure(error: RetrofitError) {
// If any error occurred displaying the error as toast
Log.e("BookGSRFragment", "Error booking gsr", error)
Toast.makeText(activity, "An error has occurred. Please try again.", Toast.LENGTH_LONG).show()
binding.loading.loadingPanel.visibility = View.GONE
activity?.onBackPressed()
viewLifecycleOwner.lifecycleScope.launch {
try {
val response =
Expand Down
Original file line number Diff line number Diff line change
@@ -1,23 +1,24 @@
package com.pennapps.labs.pennmobile.dining.widget
package com.pennapps.labs.pennmobile.gsr.widget

import android.app.AlarmManager
import android.app.PendingIntent
import android.content.Context
import android.content.Intent
import android.util.Log
import java.util.Calendar

// An AlarmManager for app widget testing (Shortens the update time)
class AppWidgetAlarm(
private val mContext: Context,
) {
val alarmId: Int = 0
val internalMillis: Int = 100000
private val alarmId: Int = 0
private val internalMillis: Int = 60000

fun startAlarm() {
val calendar: Calendar = Calendar.getInstance()
calendar.add(Calendar.MILLISECOND, internalMillis)
val alarmIntent = Intent(mContext, DiningHallWidget::class.java)
alarmIntent.setAction(DiningHallWidget.ACTION_AUTO_UPDATE)
val alarmIntent = Intent(mContext, GsrReservationWidget::class.java)
alarmIntent.setAction(GsrReservationWidget.ACTION_AUTO_UPDATE)
val pendingIntent = PendingIntent.getBroadcast(mContext, alarmId, alarmIntent, PendingIntent.FLAG_IMMUTABLE)
val alarmManager: AlarmManager = mContext.getSystemService(Context.ALARM_SERVICE) as AlarmManager
alarmManager.setInexactRepeating(
Expand All @@ -26,21 +27,19 @@ class AppWidgetAlarm(
internalMillis.toLong(),
pendingIntent,
)
Log.d("Alarm Class", "Alarm started")
}

fun stopAlarm() {
val alarmIntent = Intent(DiningHallWidget.ACTION_AUTO_UPDATE)
val alarmIntent = Intent(GsrReservationWidget.ACTION_AUTO_UPDATE)
val pendingIntent = PendingIntent.getBroadcast(mContext, alarmId, alarmIntent, PendingIntent.FLAG_IMMUTABLE)
val alarmManager: AlarmManager = mContext.getSystemService(Context.ALARM_SERVICE) as AlarmManager
alarmManager.cancel(pendingIntent)
}

fun alarmUp(): Boolean {
val alarmIntent = Intent(DiningHallWidget.ACTION_AUTO_UPDATE)
val alarmIntent = Intent(GsrReservationWidget.ACTION_AUTO_UPDATE)
val pendingIntent = PendingIntent.getBroadcast(mContext, alarmId, alarmIntent, PendingIntent.FLAG_IMMUTABLE)
if (pendingIntent != null) {
return true
}
return false
return pendingIntent != null
}
}
Loading
Loading