Skip to content
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
11 changes: 8 additions & 3 deletions app/src/main/java/com/sun/ise/data/UserDataSource.kt
Original file line number Diff line number Diff line change
@@ -1,7 +1,8 @@
package com.sun.ise.data

import com.sun.ise.data.model.LoginResult
import com.sun.ise.data.model.User
import com.sun.ise.data.model.MajorResult
import com.sun.ise.data.model.UserWrapper
import retrofit2.Call

interface UserDataSource {
Expand All @@ -11,12 +12,16 @@ interface UserDataSource {

fun saveToken(token: String)

fun getCurrentUser(): User?
fun getCurrentUser(): UserWrapper?

fun saveCurrentUser(user: User)
fun saveCurrentUser(userWrapper: UserWrapper)

fun logout()
}

interface Remote {
fun login(email: String, password: String): Call<LoginResult>

fun getMajorById(majorId: Int) : Call<MajorResult>
}
}
12 changes: 7 additions & 5 deletions app/src/main/java/com/sun/ise/data/local/LocalDataSource.kt
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ package com.sun.ise.data.local
import android.content.Context
import com.google.gson.Gson
import com.sun.ise.data.UserDataSource
import com.sun.ise.data.model.User
import com.sun.ise.data.model.UserWrapper
import com.sun.ise.util.SharePrefs

class LocalDataSource private constructor(context: Context) : UserDataSource.Local {
Expand All @@ -16,17 +16,19 @@ class LocalDataSource private constructor(context: Context) : UserDataSource.Loc
prefs.token = token
}

override fun getCurrentUser(): User? {
override fun getCurrentUser(): UserWrapper? {
val userJson = prefs.user
return if (userJson.isNullOrEmpty()) null
else Gson().fromJson(userJson, User::class.java)
else Gson().fromJson(userJson, UserWrapper::class.java)
}

override fun saveCurrentUser(user: User) {
val json = Gson().toJson(user)
override fun saveCurrentUser(userWrapper: UserWrapper) {
val json = Gson().toJson(userWrapper)
prefs.user = json
}

override fun logout() = prefs.clear()

companion object {
private var INSTANCE: LocalDataSource? = null

Expand Down
4 changes: 3 additions & 1 deletion app/src/main/java/com/sun/ise/data/model/Event.kt
Original file line number Diff line number Diff line change
@@ -1,9 +1,11 @@
package com.sun.ise.data.model

import android.os.Parcelable
import com.arlib.floatingsearchview.suggestions.model.SearchSuggestion
import com.google.gson.annotations.SerializedName
import kotlinx.android.parcel.Parcelize

@Parcelize
data class Event(
@SerializedName("id")
val id: Int,
Expand All @@ -29,7 +31,7 @@ data class Event(
val semester: String,
@SerializedName("partner_id")
val partnerId: Int
)
) : Parcelable

data class EventResult(
@SerializedName("code")
Expand Down
7 changes: 7 additions & 0 deletions app/src/main/java/com/sun/ise/data/model/Major.kt
Original file line number Diff line number Diff line change
Expand Up @@ -10,3 +10,10 @@ data class Major(
@SerializedName("acronym")
val acronym: String
)

data class MajorResult(
@SerializedName("code")
val code: String,
@SerializedName("result")
val major: Major
)
9 changes: 5 additions & 4 deletions app/src/main/java/com/sun/ise/data/remote/IseService.kt
Original file line number Diff line number Diff line change
Expand Up @@ -2,11 +2,9 @@ package com.sun.ise.data.remote

import com.sun.ise.data.model.EventResult
import com.sun.ise.data.model.LoginResult
import com.sun.ise.data.model.MajorResult
import retrofit2.Call
import retrofit2.http.GET
import retrofit2.http.Header
import retrofit2.http.POST
import retrofit2.http.Query
import retrofit2.http.*

interface IseService {

Expand All @@ -18,4 +16,7 @@ interface IseService {

@GET("/api/events")
fun searchEvent(@Query("q") name: String): Call<EventResult>

@GET("/api/major/{majorId}")
fun getMajorById(@Path("majorId") majorId: Int): Call<MajorResult>
}
26 changes: 26 additions & 0 deletions app/src/main/java/com/sun/ise/data/remote/LoginAsync.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
package com.sun.ise.data.remote

import android.os.AsyncTask
import com.sun.ise.data.model.LoginResult
import com.sun.ise.data.model.UserWrapper
import com.sun.ise.data.repository.UserRepository
import retrofit2.Call

class LoginAsync(private val repository: UserRepository) :
AsyncTask<Call<LoginResult>, Void, LoginResult>() {

override fun doInBackground(vararg params: Call<LoginResult>?): LoginResult {
val response = params[0]!!.execute()
return response.body()!!
}

override fun onPostExecute(loginResult: LoginResult?) {
val user = loginResult!!.user
repository.saveToken(loginResult.token)
val getMajorAsync = GetMajorAsync()
getMajorAsync.execute(repository.getMajorById(user.majorId))
val majorResult = getMajorAsync.get()
val userWrapper = UserWrapper(user, majorResult!!.major)
repository.saveCurrentUser(userWrapper)
}
}
10 changes: 9 additions & 1 deletion app/src/main/java/com/sun/ise/data/remote/NetworkCallAsync.kt
Original file line number Diff line number Diff line change
Expand Up @@ -2,12 +2,20 @@ package com.sun.ise.data.remote

import android.os.AsyncTask
import com.sun.ise.data.model.EventResult
import com.sun.ise.data.model.MajorResult
import retrofit2.Call

class NetworkCallAsync : AsyncTask<Call<EventResult>, Void, EventResult>() {
class GetEventsAsync : AsyncTask<Call<EventResult>, Void, EventResult>() {

override fun doInBackground(vararg params: Call<EventResult>?): EventResult {
val response = params[0]!!.execute()
return response.body()!!
}
}

class GetMajorAsync : AsyncTask<Call<MajorResult>, Void, MajorResult>() {
override fun doInBackground(vararg params: Call<MajorResult>?): MajorResult {
val response = params[0]!!.execute()
return response.body()!!
}
}
4 changes: 4 additions & 0 deletions app/src/main/java/com/sun/ise/data/remote/RemoteDataSource.kt
Original file line number Diff line number Diff line change
Expand Up @@ -2,10 +2,14 @@ package com.sun.ise.data.remote

import com.sun.ise.data.UserDataSource
import com.sun.ise.data.model.LoginResult
import com.sun.ise.data.model.MajorResult
import retrofit2.Call

class RemoteDataSource(private val iseService: IseService) : UserDataSource.Remote {

override fun login(email: String, password: String): Call<LoginResult> =
iseService.login(email, password)

override fun getMajorById(majorId: Int): Call<MajorResult> =
iseService.getMajorById(majorId)
}
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@ package com.sun.ise.data.repository

import com.sun.ise.data.EventDataSource
import com.sun.ise.data.model.EventResult
import com.sun.ise.data.model.User
import retrofit2.Call

class EventRepository(
Expand Down
10 changes: 10 additions & 0 deletions app/src/main/java/com/sun/ise/data/repository/MajorDataSource.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
package com.sun.ise.data.repository

import com.sun.ise.data.model.MajorResult
import retrofit2.Call

interface MajorDataSource {
interface Remote {
fun getMajorById(majorId: Int): Call<MajorResult>
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
package com.sun.ise.data.repository

14 changes: 10 additions & 4 deletions app/src/main/java/com/sun/ise/data/repository/UserRepository.kt
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,8 @@ package com.sun.ise.data.repository

import com.sun.ise.data.UserDataSource
import com.sun.ise.data.model.LoginResult
import com.sun.ise.data.model.User
import com.sun.ise.data.model.MajorResult
import com.sun.ise.data.model.UserWrapper
import retrofit2.Call

class UserRepository(
Expand All @@ -16,12 +17,17 @@ class UserRepository(
localDataSource.saveToken(token)
}

override fun getCurrentUser(): User? = localDataSource.getCurrentUser()
override fun getCurrentUser(): UserWrapper? = localDataSource.getCurrentUser()

override fun saveCurrentUser(user: User) {
localDataSource.saveCurrentUser(user)
override fun saveCurrentUser(userWrapper: UserWrapper) {
localDataSource.saveCurrentUser(userWrapper)
}

override fun login(email: String, password: String): Call<LoginResult> =
remoteDataSource.login(email, password)

override fun logout() = localDataSource.logout()

override fun getMajorById(majorId: Int): Call<MajorResult> =
remoteDataSource.getMajorById(majorId)
}
17 changes: 13 additions & 4 deletions app/src/main/java/com/sun/ise/ui/common/EventAdapter.kt
Original file line number Diff line number Diff line change
@@ -1,7 +1,6 @@
package com.sun.ise.ui.common

import android.content.Context
import android.util.Log
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
Expand All @@ -11,7 +10,10 @@ import com.sun.ise.data.model.Event
import com.sun.ise.util.StringUtils
import kotlinx.android.synthetic.main.item_course.view.*

class EventAdapter constructor(context: Context) :
class EventAdapter constructor(
context: Context,
private val itemClickListener: OnItemClickListener
) :
RecyclerView.Adapter<EventAdapter.EventViewHolder>() {

private val inflater: LayoutInflater by lazy {
Expand All @@ -36,15 +38,22 @@ class EventAdapter constructor(context: Context) :
notifyDataSetChanged()
}

class EventViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) {

inner class EventViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView),
View.OnClickListener {
fun bindData(event: Event) {
itemView.textCourseTitle.text = event.name
itemView.textCourseDate.text =
StringUtils.formatTimeRange(event.startDate, event.endDate)
itemView.textCourseMajor.text = event.semester
itemView.textJoinedPeople.text =
StringUtils.formatJoinedPeople(event.joinedParticipants, event.maxParticipants)
itemView.setOnClickListener(this)
}

override fun onClick(v: View?) {
val position = layoutPosition
val event = events[position]
itemClickListener.onItemClick(event)
}
}
}
10 changes: 10 additions & 0 deletions app/src/main/java/com/sun/ise/ui/common/LoginCallback.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
package com.sun.ise.ui.common

interface LoginCallback {

fun onSuccess()

fun onInvalidEmailOrPassword()

fun onError(exception: Exception)
}
83 changes: 83 additions & 0 deletions app/src/main/java/com/sun/ise/ui/common/MaterialDialog.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,83 @@
package com.sun.ise.ui.common

import android.app.AlertDialog
import android.content.Context
import android.graphics.Color
import android.graphics.drawable.ColorDrawable
import android.os.Bundle
import android.view.View.OnClickListener
import android.view.WindowManager
import androidx.annotation.StringRes
import com.sun.ise.util.StringUtils
import kotlinx.android.synthetic.main.dialog_confirmation.*

class MaterialDialog(context: Context) : AlertDialog(context) {

private lateinit var dialogMessage: String
private lateinit var positiveText: String
private lateinit var negativeText: String
private lateinit var positiveClickListener: OnClickListener
private lateinit var negativeClickListener: OnClickListener

private var canDismiss = true

override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(com.sun.ise.R.layout.dialog_confirmation)
}

override fun onStart() {
super.onStart()
if (StringUtils.checkNotEmpty(positiveText) && positiveClickListener != null) {
buttonConfirm.text = positiveText
buttonConfirm.setOnClickListener(positiveClickListener)
}
if (StringUtils.checkNotEmpty(negativeText) && negativeClickListener != null) {
buttonCancel.text = negativeText
buttonCancel.setOnClickListener(negativeClickListener)
}
this.setCanceledOnTouchOutside(canDismiss)
window?.setBackgroundDrawable(ColorDrawable(Color.TRANSPARENT))
window?.clearFlags(
WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE or
WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM
)
}

fun setMessage(message: String): MaterialDialog {
dialogMessage = message
return this
}

fun setMessage(@StringRes messageId: Int): MaterialDialog {
setMessage(context.getString(messageId))
return this
}

fun setPositiveButton(text: String, listener: OnClickListener): MaterialDialog {
this.positiveText = text
this.positiveClickListener = listener
return this
}

fun setPositiveButton(@StringRes textId: Int, listener: OnClickListener): MaterialDialog {
this.setPositiveButton(context.getString(textId), listener)
return this
}

fun setNegativeButton(text: String, listener: OnClickListener): MaterialDialog {
this.negativeText = text
this.negativeClickListener = listener
return this
}

fun setNegativeButton(@StringRes textId: Int, listener: OnClickListener): MaterialDialog {
this.setNegativeButton(context.getString(textId), listener)
return this
}

fun dismissOnTouchOutside(dismiss: Boolean): MaterialDialog {
this.canDismiss = dismiss
return this
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
package com.sun.ise.ui.common

import com.sun.ise.data.model.Event

interface OnItemClickListener {
fun onItemClick(event: Event)
}
Loading