39. class GoogleApiClientListener(private val builder: GoogleApiClient.Builder,
private val api: Api<out Api.ApiOptions.NotRequiredOptions>,
private val callback: Callback? = null) : LifecycleObserver {
private lateinit var googleApiClient: GoogleApiClient
init {
googleApiClient = builder.apply {
addOnConnectionFailedListener { result: ConnectionResult ->
callback?.onFailure(result)
}
addConnectionCallbacks(object : GoogleApiClient.ConnectionCallbacks {
override fun onConnected(connectionHint: Bundle?) {
callback?.onConnected(googleApiClient)
}
override fun onConnectionSuspended(cause: Int) {
callback?.onSuspended(cause)
}
})
addApi(api)
}.build()
}
GoogleApiClientListener.kt
40. ...
@OnLifecycleEvent(Lifecycle.Event.ON_START)
fun onStart() {
if (!googleApiClient.isConnected || !googleApiClient.isConnecting) {
googleApiClient.connect()
}
}
@OnLifecycleEvent(Lifecycle.Event.ON_STOP)
fun onStop() {
if (googleApiClient.isConnected) {
googleApiClient.disconnect()
}
}
fun getGoogleApiClient(): GoogleApiClient = googleApiClient
interface Callback {
fun onConnected(client: GoogleApiClient)
fun onFailure(result: ConnectionResult)
fun onSuspended(cause: Int)
}
GoogleApiClientListener.kt
41. class GoogleApiClientLiveData(private val builder: GoogleApiClient.Builder,
private val api: Api<out Api.ApiOptions.NotRequiredOptions>)
: LiveData<GoogleApiResult>() {
private lateinit var lifecycle: Lifecycle
private lateinit var listener: GoogleApiClientListener
override fun observe(owner: LifecycleOwner, observer: Observer<in GoogleApiResult>) {
super.observe(owner, observer)
lifecycle = owner.lifecycle
listener = GoogleApiClientListener(builder, api, callback)
}
override fun onActive() {
lifecycle.addObserver(listener)
}
override fun onInactive() {
lifecycle.removeObserver(listener)
}
...
GoogleApiClientLiveData.kt
42. private val callback = object : GoogleApiClientListener.Callback {
override fun onConnected(client: GoogleApiClient) {
value = GoogleApiResult(
status = GoogleApiResult.STATUS_SUCCESS,
errorCode = 0,
errorMessage = null,
client = listener.getGoogleApiClient())
}
override fun onFailure(result: ConnectionResult) {
value = GoogleApiResult(
status = GoogleApiResult.STATUS_FAILURE,
errorCode = result.errorCode,
errorMessage = result.errorMessage,
client = null)
}
override fun onSuspended(cause: Int) {
value = GoogleApiResult(
status = GoogleApiResult.STATUS_SUCCESS,
errorCode = cause,
errorMessage = null,
client = null)
}
}
GoogleApiClientLiveData.kt
43. data class GoogleApiResult(var status: String,
var errorCode: Int,
var errorMessage: String?,
var client: GoogleApiClient?) {
companion object {
const val STATUS_SUCCESS = "success"
const val STATUS_FAILURE = "failure"
const val STATUS_SUSPENDED = "suspended"
}
fun isSuccess(): Boolean = status == STATUS_SUCCESS
fun isFailure(): Boolean = status == STATUS_FAILURE
fun isSuspended(): Boolean = status == STATUS_SUSPENDED
}
GoogleApiResult.kt
44. class GoogleApiViewModel @Inject constructor(private var builder: GoogleApiClient.Builder)
: ViewModel() {
val googleApiClientLiveData = GoogleApiClientLiveData(builder, LocationServices.API)
}
GoogleApiViewModel.kt
45. class GoogleApiActivity : AppCompatActivity() {
private lateinit var viewModel: GoogleApiViewModel
override fun onCreate(savedInstanceState: Bundle?) {
...
viewModel = ViewModelProviders.of(this).get(GoogleApiViewModel::class.java)
viewModel.googleApiClientLiveData.observe(this, googleApiClientObserver)
}
private val googleApiClientObserver = Observer<GoogleApiResult> { result ->
when (result.status) {
GoogleApiResult.STATUS_SUCCESS -> onGoogleApiClientConnected(result.client)
GoogleApiResult.STATUS_FAILURE -> onGoogleApiClientFailure(result.errorMessage)
GoogleApiResult.STATUS_SUSPENDED -> onGoogleApiClientSuspend(result.errorCode)
}
}
...
GoogleApiActivity.kt
72. Log In Homeapi/v1/login api/v1/:userId/conDgs
api/v1/:userId/info
api/v1/:userId/banners
What log in flow actually be in real life
api/v1/:userId/caGs
87. class SessionDetailViewModel @Inject constructor(
private val signInViewModelDelegate: SignInViewModelDelegate,
private val loadUserSessionUseCase: LoadUserSessionUseCase,
private val loadRelatedSessionUseCase: LoadUserSessionsUseCase,
private val starEventUseCase: StarEventUseCase,
private val reservationActionUseCase: ReservationActionUseCase,
private val getTimeZoneUseCase: GetTimeZoneUseCase,
private val snackbarMessageManager: SnackbarMessageManager,
timeProvider: TimeProvider,
private val networkUtils: NetworkUtils,
private val analyticsHelper: AnalyticsHelper
) : ViewModel(), SessionDetailEventListener, EventActions,
SignInViewModelDelegate by signInViewModelDelegate {
private val loadUserSessionResult:
MediatorLiveData<Result<LoadUserSessionUseCaseResult>>
private val loadRelatedUserSessions: LiveData<Result<LoadUserSessionsUseCaseResult
private val sessionTimeRelativeState: LiveData<TimeUtils.SessionRelativeTimeState>
88. class SessionDetailFragment : DaggerFragment() {
...
override fun onActivityCreated(savedInstanceState: Bundle?) {
...
val starMenu = menu.findItem(R.id.menu_item_star)
sessionDetailViewModel.shouldShowStarInBottomNav.observe(this, Observer {
it?.let {
if (it) {
starMenu.setVisible(true)
} else {
starMenu.setVisible(false)
}
}
})
sessionDetailViewModel.userEvent.observe(this, Observer {
it?.let {
if (it.isStarred) {
starMenu.setIcon(R.drawable.ic_star)
} else {
starMenu.setIcon(R.drawable.ic_star_border)
}