Skip to content

Commit

Permalink
chore: Migrate Attendee checkin to ViewModel (#1318)
Browse files Browse the repository at this point in the history
  • Loading branch information
sridharjajoo authored and iamareebjamal committed Aug 10, 2018
1 parent 89606ff commit d57efc1
Show file tree
Hide file tree
Showing 6 changed files with 143 additions and 127 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@
import android.arch.lifecycle.ViewModelProvider;

import com.eventyay.organizer.common.di.OrgaViewModelFactory;
import com.eventyay.organizer.core.attendee.checkin.AttendeeCheckInViewModel;
import com.eventyay.organizer.core.attendee.history.CheckInHistoryViewModel;
import com.eventyay.organizer.core.auth.login.LoginViewModel;
import com.eventyay.organizer.core.auth.reset.ResetPasswordViewModel;
Expand Down Expand Up @@ -138,6 +139,11 @@ public abstract class ViewModelModule {
@ViewModelKey(TicketDetailViewModel.class)
public abstract ViewModel bindTicketDetailViewModel(TicketDetailViewModel ticketDetailViewModel);

@Binds
@IntoMap
@ViewModelKey(AttendeeCheckInViewModel.class)
public abstract ViewModel bindAttendeeCheckinViewModel(AttendeeCheckInViewModel attendeeCheckInViewModel);

@Binds
public abstract ViewModelProvider.Factory bindViewModelFactory(OrgaViewModelFactory factory);

Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,7 @@
package com.eventyay.organizer.core.attendee.checkin;

import android.arch.lifecycle.ViewModelProvider;
import android.arch.lifecycle.ViewModelProviders;
import android.content.DialogInterface;
import android.databinding.DataBindingUtil;
import android.os.Bundle;
Expand All @@ -17,23 +19,22 @@

import javax.inject.Inject;

import dagger.Lazy;

public class AttendeeCheckInFragment extends BaseBottomSheetFragment<AttendeeCheckInPresenter> implements AttendeeCheckInView {
public class AttendeeCheckInFragment extends BaseBottomSheetFragment implements AttendeeCheckInView {

@Inject
ViewModelProvider.Factory viewModelFactory;

private static final String ATTENDEE_ID = "attendee_id";

private BottomsheetAttendeeCheckInBinding binding;
private Runnable onCancelAction;
private long attendeeId;

@Inject
Lazy<AttendeeCheckInPresenter> presenterProvider;
private AttendeeCheckInViewModel attendeeCheckInViewModel;

public static AttendeeCheckInFragment newInstance(long attendeeId) {
Bundle args = new Bundle();
args.putLong(ATTENDEE_ID, attendeeId);

AttendeeCheckInFragment fragment = new AttendeeCheckInFragment();
fragment.setArguments(args);
return fragment;
Expand All @@ -53,18 +54,18 @@ public void onCreate(@Nullable Bundle savedInstanceState) {
@Override
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
binding = DataBindingUtil.inflate(inflater, R.layout.bottomsheet_attendee_check_in, container, false);
attendeeCheckInViewModel = ViewModelProviders.of(this, viewModelFactory).get(AttendeeCheckInViewModel.class);
return binding.getRoot();
}

@Override
public void onStart() {
super.onStart();
getPresenter().attach(attendeeId, this);
binding.setPresenter(getPresenter());
binding.setViewModel(attendeeCheckInViewModel);
binding.switchAttendeeDetailsState.setChecked(false);
getPresenter().start();

attendeeCheckInViewModel.start(attendeeId);
binding.activityLog.setOnClickListener(view -> openCheckInHistoryFragment());
attendeeCheckInViewModel.getAttendee().observe(this, this::showResult);
}

private void openCheckInHistoryFragment() {
Expand All @@ -84,11 +85,6 @@ public void onCancel(DialogInterface dialog) {
onCancelAction.run();
}

@Override
public Lazy<AttendeeCheckInPresenter> getPresenterProvider() {
return presenterProvider;
}

public void setOnCancelListener(Runnable onCancel) {
this.onCancelAction = onCancel;
}
Expand Down

This file was deleted.

Original file line number Diff line number Diff line change
@@ -0,0 +1,85 @@
package com.eventyay.organizer.core.attendee.checkin;

import android.annotation.SuppressLint;
import android.arch.lifecycle.LiveData;
import android.arch.lifecycle.ViewModel;
import android.support.annotation.VisibleForTesting;

import com.eventyay.organizer.common.livedata.SingleEventLiveData;
import com.eventyay.organizer.data.db.DatabaseChangeListener;
import com.eventyay.organizer.data.db.DbFlowDatabaseChangeListener;
import com.eventyay.organizer.data.attendee.Attendee;
import com.eventyay.organizer.data.attendee.AttendeeRepository;
import com.eventyay.organizer.utils.ErrorUtils;

import javax.inject.Inject;

import io.reactivex.disposables.CompositeDisposable;

import static com.eventyay.organizer.common.rx.ViewTransformers.dispose;

public class AttendeeCheckInViewModel extends ViewModel {

private final AttendeeRepository attendeeRepository;
private final DatabaseChangeListener<Attendee> databaseChangeListener;
private final CompositeDisposable compositeDisposable = new CompositeDisposable();
private final SingleEventLiveData<Attendee> attendeeliveData = new SingleEventLiveData<>();
private final SingleEventLiveData<String> error = new SingleEventLiveData<>();

@Inject
public AttendeeCheckInViewModel(AttendeeRepository attendeeRepository, DatabaseChangeListener<Attendee> databaseChangeListener) {
this.attendeeRepository = attendeeRepository;
this.databaseChangeListener = databaseChangeListener;
}

@SuppressLint("CheckResult")
public void start(long attendeeId) {
databaseChangeListener.startListening();

compositeDisposable.add(
databaseChangeListener.getNotifier()
.compose(dispose(compositeDisposable))
.map(DbFlowDatabaseChangeListener.ModelChange::getModel)
.filter(filterAttendee -> filterAttendee.getId() == attendeeliveData.getValue().getId())
.flatMap(filterAttendee -> attendeeRepository.getAttendee(attendeeliveData.getValue().getId(), false))
.subscribe(this.attendeeliveData::setValue,
throwable -> error.setValue(ErrorUtils.getMessage(throwable).toString())));

compositeDisposable.add(
attendeeRepository.getAttendee(attendeeId, false)
.compose(dispose(compositeDisposable))
.subscribe(this.attendeeliveData::setValue,
throwable -> error.setValue(ErrorUtils.getMessage(throwable).toString())));
}

public LiveData<Attendee> getAttendee() {
return attendeeliveData;
}

public LiveData<String> getError() {
return error;
}

@Override
protected void onCleared() {
super.onCleared();
databaseChangeListener.stopListening();
}

public void toggleCheckIn() {
attendeeliveData.getValue().setChecking(true);
attendeeliveData.getValue().isCheckedIn = !attendeeliveData.getValue().isCheckedIn;

compositeDisposable.add(
attendeeRepository.scheduleToggle(attendeeliveData.getValue())
.subscribe(() -> {
// Nothing to do
}, throwable -> error.setValue(ErrorUtils.getMessage(throwable).toString())));
}

@VisibleForTesting
public void setAttendee(Attendee attendee) {
this.attendeeliveData.setValue(attendee);
}

}
6 changes: 3 additions & 3 deletions app/src/main/res/layout/bottomsheet_attendee_check_in.xml
Original file line number Diff line number Diff line change
Expand Up @@ -10,8 +10,8 @@
<import type="android.view.View" />

<variable
name="presenter"
type="com.eventyay.organizer.core.attendee.checkin.AttendeeCheckInPresenter" />
name="viewModel"
type="com.eventyay.organizer.core.attendee.checkin.AttendeeCheckInViewModel" />

<variable
name="checkinAttendee"
Expand Down Expand Up @@ -344,7 +344,7 @@
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_margin="@dimen/spacing_small"
android:onClick="@{() -> presenter.toggleCheckIn() }"
android:onClick="@{() -> viewModel.toggleCheckIn() }"
app:backgroundTint="@{ checkinAttendee.isCheckedIn ? @color/red_500 : @color/light_green_500 }"
app:fabSize="mini"
app:srcCompat="@{ checkinAttendee.isCheckedIn ? @drawable/ic_checkout : @drawable/ic_checkin }"
Expand Down
Loading

0 comments on commit d57efc1

Please sign in to comment.