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 16 commits into
base: main
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
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
18 changes: 18 additions & 0 deletions PennMobile/src/main/AndroidManifest.xml
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,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 @@ -39,6 +40,19 @@
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" />
</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 @@ -55,6 +69,10 @@
</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" />
<service android:name=".gsr.widget.GsrReservationWidgetJobService"
android:permission="android.permission.BIND_JOB_SERVICE" />

<meta-data
android:name="com.google.android.gms.version"
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -130,6 +130,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
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,5 +1,8 @@
package com.pennapps.labs.pennmobile.gsr.adapters

import android.app.job.JobInfo
import android.app.job.JobScheduler
import android.content.ComponentName
import android.content.Context
import android.content.Intent
import android.util.Log
Expand All @@ -8,13 +11,15 @@ import android.view.ViewGroup
import android.widget.Toast
import android.widget.Toast.LENGTH_SHORT
import androidx.appcompat.app.AlertDialog
import androidx.core.content.ContextCompat.getSystemService
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.GsrReservationWidgetJobService
import com.squareup.picasso.Picasso
import org.joda.time.format.DateTimeFormat
import org.joda.time.format.DateTimeFormatter
Expand Down Expand Up @@ -77,7 +82,7 @@ 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 {
Expand All @@ -86,7 +91,7 @@ class GsrReservationsAdapter(

val labs = MainActivity.studentLifeInstance
val bearerToken =
"Bearer " + sp.getString(mContext.getString(R.string.access_token), " ")
"Bearer " + sp.getString(mContext.getString(com.pennapps.labs.pennmobile.R.string.access_token), " ")
try {
labs.cancelReservation(
bearerToken,
Expand All @@ -99,6 +104,22 @@ class GsrReservationsAdapter(
reservations.removeAt(position)
}
run {
val jobScheduler = getSystemService(mContext, JobScheduler::class.java)
val jobService = ComponentName(mContext, GsrReservationWidgetJobService::class.java)
val jobInfo =
JobInfo
.Builder(1, jobService)
.setRequiresCharging(false)
.setMinimumLatency(5_000)
.build()

val result = jobScheduler?.schedule(jobInfo)
if (result == JobScheduler.RESULT_SUCCESS) {
Log.d("CancelGsr", "Job scheduled successfully!")
} else {
Log.d("CancelGsr", "Job scheduling failed!")
}

if (reservations.size == 0) {
var intent = Intent("refresh")
LocalBroadcastManager
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,8 @@
package com.pennapps.labs.pennmobile.gsr.fragments

import android.app.job.JobInfo
import android.app.job.JobScheduler
import android.content.ComponentName
import android.graphics.Color
import android.graphics.PorterDuff
import android.os.Bundle
Expand All @@ -10,13 +13,15 @@ import android.view.ViewGroup
import android.widget.Button
import android.widget.EditText
import android.widget.Toast
import androidx.core.content.ContextCompat.getSystemService
import androidx.fragment.app.Fragment
import androidx.preference.PreferenceManager
import com.pennapps.labs.pennmobile.MainActivity
import com.pennapps.labs.pennmobile.R
import com.pennapps.labs.pennmobile.api.StudentLife
import com.pennapps.labs.pennmobile.databinding.GsrDetailsBookBinding
import com.pennapps.labs.pennmobile.gsr.classes.GSRBookingResult
import com.pennapps.labs.pennmobile.gsr.widget.GsrReservationWidgetJobService
import retrofit.Callback
import retrofit.RetrofitError
import retrofit.client.Response
Expand Down Expand Up @@ -165,6 +170,22 @@ class BookGsrFragment : Fragment() {
if (result.getDetail().equals("success")) {
Toast.makeText(activity, "GSR successfully booked", Toast.LENGTH_LONG).show()

val jobScheduler = getSystemService(context!!, JobScheduler::class.java)
val jobService = ComponentName(context!!, GsrReservationWidgetJobService::class.java)
val jobInfo =
JobInfo
.Builder(1, jobService)
.setRequiresCharging(false)
.setMinimumLatency(5_000)
.build()

val result = jobScheduler?.schedule(jobInfo)
if (result == JobScheduler.RESULT_SUCCESS) {
Log.d("BookGsr", "Job scheduled successfully!")
} else {
Log.d("BookGsr", "Job scheduling failed!")
}

// Save user info in shared preferences
val sp = PreferenceManager.getDefaultSharedPreferences(activity)
val editor = sp.edit()
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,119 @@
package com.pennapps.labs.pennmobile.gsr.widget

import android.app.PendingIntent
import android.appwidget.AppWidgetManager
import android.appwidget.AppWidgetProvider
import android.content.Context
import android.content.Intent
import android.net.Uri
import android.widget.RemoteViews
import com.google.gson.GsonBuilder
import com.google.gson.reflect.TypeToken
import com.pennapps.labs.pennmobile.MainActivity
import com.pennapps.labs.pennmobile.R
import com.pennapps.labs.pennmobile.api.GsrReservationsRequest
import com.pennapps.labs.pennmobile.api.Serializer
import com.pennapps.labs.pennmobile.gsr.classes.GSRReservation
import com.squareup.okhttp.OkHttpClient
import retrofit.RestAdapter
import retrofit.client.OkClient
import retrofit.converter.GsonConverter
import java.util.concurrent.TimeUnit

class GsrReservationWidget : AppWidgetProvider() {
override fun onUpdate(
context: Context,
appWidgetManager: AppWidgetManager,
appWidgetIds: IntArray,
) {
for (appWidgetId in appWidgetIds) {
val mainActivityIntent = Intent(context, MainActivity::class.java)
mainActivityIntent.apply {
flags += Intent.FLAG_ACTIVITY_NEW_TASK
flags += Intent.FLAG_ACTIVITY_CLEAR_TOP
}

mainActivityIntent.putExtra("Gsr_Tab_Switch", 1)

val serviceIntent = Intent(context, GsrReservationWidgetAdapter::class.java)
val pendingIntent: PendingIntent =
PendingIntent.getActivity(
context,
appWidgetId,
mainActivityIntent,
PendingIntent.FLAG_IMMUTABLE,
)
serviceIntent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, appWidgetId)

// setData allows the system to distinguish between different service intents. Without
// setData, onGetViewFactory is called only once for multiple widgets and send
// the same intent to all of them.
serviceIntent.setData(Uri.parse(serviceIntent.toUri(Intent.URI_INTENT_SCHEME)))

// Setting up the widget remoteViews; change cardview to something else
val views = RemoteViews(context.packageName, R.layout.gsr_reservation_widget)
views.setRemoteAdapter(R.id.gsr_reservation_widget_stack_view, serviceIntent)
views.setEmptyView(
R.id.gsr_reservation_widget_stack_view,
R.id.gsr_reservation_widget_empty_view,
)

// Setting up the intents for the remoteview for both when it is empty and
// when it loads the collection view (in this case we use setPendingIntentTemplate to
// the entire stackView that contains all the items).
views.setPendingIntentTemplate(R.id.gsr_reservation_widget_stack_view, pendingIntent)
views.setOnClickPendingIntent(R.id.gsr_reservation_widget_empty_view, pendingIntent)

// Notify appwidgetviewdata has changed to call getViewAt to set up the widget UI
// and handle update for every appwidget item in the Collection widget.
appWidgetManager.notifyAppWidgetViewDataChanged(
appWidgetId,
R.id.gsr_reservation_widget_stack_view,
)
appWidgetManager.updateAppWidget(appWidgetId, views)
}
}

// onEnabled and onDisabled are typically used for alarmManager testing and logs to check whether
// appwidget is properly enabled/disabled.
override fun onEnabled(context: Context) {
}

override fun onDisabled(context: Context) {
}

companion object {
private var mGSRReservationsRequest: GsrReservationsRequest? = null

@JvmStatic
val gsrReservationsRequestInstance: GsrReservationsRequest
get() {
if (mGSRReservationsRequest == null) {
val gsonBuilder = GsonBuilder()

// RegisterTypeAdapter with GsrReservationSerializer
// since we are only accessing gsr reservations
gsonBuilder.registerTypeAdapter(
object : TypeToken<MutableList<GSRReservation?>?>() {}.type,
Serializer.GsrReservationSerializer(),
)

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("https://pennmobile.org/api")
.build()
mGSRReservationsRequest = restAdapter.create(GsrReservationsRequest::class.java)
}
return mGSRReservationsRequest!!
}
}
}
Loading
Loading