diff --git a/app/src/main/java/com/example/sprout/refactor/activity/RoomMainActivity.java b/app/src/main/java/com/example/sprout/refactor/activity/RoomMainActivity.java index 2eecb99..0817bda 100644 --- a/app/src/main/java/com/example/sprout/refactor/activity/RoomMainActivity.java +++ b/app/src/main/java/com/example/sprout/refactor/activity/RoomMainActivity.java @@ -2,19 +2,16 @@ import android.databinding.DataBindingUtil; import android.os.Bundle; -import android.widget.Toast; import com.example.sprout.R; import com.example.sprout.databinding.RfActivityRoomMainBinding; import com.example.sprout.refactor.Constant; import com.example.sprout.refactor.adapter.RoomMainAdapter; -import com.example.sprout.refactor.common.ActivityEvent; -import com.example.sprout.refactor.contract.ViewContract; import com.example.sprout.refactor.viewmodel.RoomMainViewModel; import framework.gameMain.RealTimeActivity; -public class RoomMainActivity extends RealTimeActivity implements ViewContract { +public class RoomMainActivity extends RealTimeActivity { private RoomMainViewModel roomMainViewModel = null; @@ -22,7 +19,7 @@ protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); RfActivityRoomMainBinding binding = DataBindingUtil.setContentView(this, R.layout.rf_activity_room_main); - roomMainViewModel = new RoomMainViewModel(new RoomMainAdapter(this), (ViewContract) this); + roomMainViewModel = new RoomMainViewModel(new RoomMainAdapter(this)); binding.setViewModel(roomMainViewModel); getLifecycle().addObserver(roomMainViewModel); } @@ -31,6 +28,7 @@ protected void onResume() { super.onResume(); this.start(Constant.ROOM_UPDATE_DELAY, Constant.ROOM_UPDATE_INTERVAL); + addUiObserver(roomMainViewModel); } @Override @@ -43,24 +41,4 @@ protected void update(long interval) { roomMainViewModel.update(); } - - @Override - public void startActivity(ActivityEvent event) { - - } - - @Override - public void finishActivity() { - finish(); - } - - @Override - public void showShortToast(String message) { - Toast.makeText(this, message, Toast.LENGTH_SHORT).show(); - } - - @Override - public void showLongToast(String message) { - Toast.makeText(this, message, Toast.LENGTH_LONG).show(); - } } diff --git a/app/src/main/java/com/example/sprout/refactor/adapter/RoomMainAdapter.java b/app/src/main/java/com/example/sprout/refactor/adapter/RoomMainAdapter.java index 837a948..4a5e401 100644 --- a/app/src/main/java/com/example/sprout/refactor/adapter/RoomMainAdapter.java +++ b/app/src/main/java/com/example/sprout/refactor/adapter/RoomMainAdapter.java @@ -2,7 +2,6 @@ import android.content.Context; import android.databinding.DataBindingUtil; -import android.support.v7.util.DiffUtil; import android.support.v7.widget.RecyclerView; import android.view.LayoutInflater; import android.view.ViewGroup; @@ -12,7 +11,6 @@ import com.example.sprout.refactor.model.entity.Member; import java.util.ArrayList; -import java.util.List; /** * ルームのアダプター @@ -46,10 +44,9 @@ } public void setDataAndRefresh(ArrayList items) { - List oldItems = this.items; - DiffUtil.DiffResult diffResult = DiffUtil.calculateDiff(new MemberDiffCallBack(oldItems, items)); + this.items.clear(); this.items = items; - diffResult.dispatchUpdatesTo(this); + notifyDataSetChanged(); } @Override diff --git a/app/src/main/java/com/example/sprout/refactor/model/ModelLocator.java b/app/src/main/java/com/example/sprout/refactor/model/ModelLocator.java index 1ce7a9a..8c1349e 100644 --- a/app/src/main/java/com/example/sprout/refactor/model/ModelLocator.java +++ b/app/src/main/java/com/example/sprout/refactor/model/ModelLocator.java @@ -26,6 +26,7 @@ private Account account = new Account(); private RegistrationModel registrationModel = new RegistrationModel(this.registrationRepository); private RoomsModel roomsModel = new RoomsModel(this.roomRepository); + private RoomModel roomModel = new RoomModel(this.roomRepository); private RoomResponseModel roomResponseModel = new RoomResponseModel(this.roomRepository); private ModelLocator() { @@ -74,6 +75,10 @@ return roomsModel; } + public RoomModel getRoomModel() { + return roomModel; + } + public RoomResponseModel getRoomResponseModel() { return roomResponseModel; } diff --git a/app/src/main/java/com/example/sprout/refactor/model/RoomModel.java b/app/src/main/java/com/example/sprout/refactor/model/RoomModel.java new file mode 100644 index 0000000..468313a --- /dev/null +++ b/app/src/main/java/com/example/sprout/refactor/model/RoomModel.java @@ -0,0 +1,48 @@ +package com.example.sprout.refactor.model; + +import com.example.sprout.refactor.model.entity.Error; +import com.example.sprout.refactor.model.entity.Room; +import com.example.sprout.refactor.repository.RoomRepository; + +import io.reactivex.Observable; +import io.reactivex.schedulers.Schedulers; +import io.reactivex.subjects.BehaviorSubject; +import io.reactivex.subjects.PublishSubject; + +/** + * Created by matsumoto_k on 2017/12/22. + */ + +public class RoomModel { + private BehaviorSubject roomSubject = BehaviorSubject.create(); + private PublishSubject errorSubject = PublishSubject.create(); + private RoomRepository roomRepository = null; + + public RoomModel(RoomRepository roomRepository) { + this.roomRepository = roomRepository; + } + + public void get(int roomId) { + roomRepository.getRoom(roomId) + .subscribeOn(Schedulers.computation()) + .subscribe( + room -> { + roomSubject.onNext(room); + }, + error -> { + errorSubject.onNext(new Error(error)); + }); + } + + public void clearStream() { + roomSubject = BehaviorSubject.create(); + } + + public Observable getRoomObservable() { + return roomSubject.hide(); + } + + public Observable getErrorObservable() { + return errorSubject.hide(); + } +} diff --git a/app/src/main/java/com/example/sprout/refactor/model/RoomResponseModel.java b/app/src/main/java/com/example/sprout/refactor/model/RoomResponseModel.java index 8b416b4..c2573a0 100644 --- a/app/src/main/java/com/example/sprout/refactor/model/RoomResponseModel.java +++ b/app/src/main/java/com/example/sprout/refactor/model/RoomResponseModel.java @@ -66,10 +66,27 @@ ); } + public void updateRoomState(int roomId, int memberId, int role) { + System.out.println("role is " + role); + roomRepository.updateRoomState(roomId, memberId, role) + .subscribeOn(Schedulers.computation()) + .subscribe( + roomResponse -> { + this.roomResponseSubject.onNext(roomResponse); + }, + error -> { + errorSubject.onNext(new Error(error)); + } + ); + } + public Observable getRoomResopnseObservable() { return roomResponseSubject .hide() .doOnNext(roomResponse -> { + System.out.println("doOnNext"); + System.out.println("roomId is " + roomResponse.getRoom().getRoomId()); + System.out.println("userId is " + roomResponse.getMemberId()); preferenceUtil.saveInt(PreferenceUtil.Key.ROOM_ID, roomResponse.getRoom().getRoomId()); preferenceUtil.saveInt(PreferenceUtil.Key.MEMBER_ID, roomResponse.getMemberId()); } diff --git a/app/src/main/java/com/example/sprout/refactor/viewmodel/RoomMainViewModel.java b/app/src/main/java/com/example/sprout/refactor/viewmodel/RoomMainViewModel.java index 5c87215..c668ad5 100644 --- a/app/src/main/java/com/example/sprout/refactor/viewmodel/RoomMainViewModel.java +++ b/app/src/main/java/com/example/sprout/refactor/viewmodel/RoomMainViewModel.java @@ -9,17 +9,18 @@ import com.example.sprout.refactor.adapter.RoomMainAdapter; import com.example.sprout.refactor.common.MemberState; -import com.example.sprout.refactor.contract.ViewContract; +import com.example.sprout.refactor.messengers.NavigationMessage; import com.example.sprout.refactor.model.ModelLocator; -import com.example.sprout.refactor.model.entity.Member; -import com.example.sprout.refactor.model.entity.Room; -import com.example.sprout.refactor.model.entity.RoomResponse; -import com.example.sprout.refactor.notification.Observer; +import com.example.sprout.refactor.model.RoomModel; +import com.example.sprout.refactor.model.RoomResponseModel; import com.example.sprout.refactor.repository.RoomRepository; import com.example.sprout.refactor.util.PreferenceUtil; import java.util.ArrayList; +import io.reactivex.android.schedulers.AndroidSchedulers; +import io.reactivex.schedulers.Schedulers; + /** * Created by matsumoto_k on 2017/11/29. */ @@ -27,104 +28,84 @@ public class RoomMainViewModel extends BaseViewModel { private RoomRepository roomRepository = null; + private RoomModel roomModel = ModelLocator.get().getRoomModel(); + private RoomResponseModel roomResponseModel = ModelLocator.get().getRoomResponseModel(); private RoomMainAdapter adapter = null; - private ViewContract viewContract = null; private ObservableBoolean ready = new ObservableBoolean(false); - private Observer roomObserver = null; - private Observer updateRoomStateObserver = null; - private Observer exitRoomObserver = null; + private PreferenceUtil preferenceUtil = PreferenceUtil.getInstance(); - public RoomMainViewModel(RoomMainAdapter adapter, ViewContract viewContract) { + public RoomMainViewModel(RoomMainAdapter adapter) { this.roomRepository = ModelLocator.getModel(ModelLocator.Tag.ROOM_REPOSITORY, RoomRepository.class); - this.viewContract = viewContract; this.adapter = adapter; - - roomObserver = new Observer() { - @Override - public void notify(Room room) { - ModelLocator.setModel(ModelLocator.Tag.Room, room); - ArrayList items = new ArrayList<>(room.getMemberList().values()); - RoomMainViewModel.this.adapter.setDataAndRefresh(items); - } - - @Override - public void error(Throwable throwable) { - throwable.printStackTrace(); - } - }; - - updateRoomStateObserver = new Observer() { - @Override - public void notify(RoomResponse roomResponse) { - ModelLocator.setModel(ModelLocator.Tag.RoomResponse, roomResponse); - } - - @Override - public void error(Throwable throwable) { - - } - }; - - exitRoomObserver = new Observer() { - @Override - public void notify(Void aVoid) { - viewContract.finishActivity(); - } - - @Override - public void error(Throwable throwable) { - throwable.printStackTrace(); - } - }; } @Override public void onResume() { super.onResume(); - roomRepository.getRoomObservable().addObserver(roomObserver); - roomRepository.getRoomResponseObservable().addObserver(updateRoomStateObserver); - roomRepository.getVoidObservable().addObserver(exitRoomObserver); + subscriptions.add( + roomModel.getRoomObservable() + .subscribeOn(Schedulers.computation()) + .map(room -> new ArrayList<>(room.getMemberList().values())) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe(items -> { + adapter.setDataAndRefresh(items); + }) + ); + roomResponseModel.getErrorObservable() + .subscribe( + error -> { + switch (error.type()) { + case NetworkError: + + break; + } + } + ); } @Override - public void onPause() { - super.onPause(); - roomRepository.getRoomObservable().removeObserver(roomObserver); - roomRepository.getRoomResponseObservable().removeObserver(updateRoomStateObserver); - roomRepository.getVoidObservable().removeObserver(exitRoomObserver); + public void onDestroy() { + super.onDestroy(); + roomModel.clearStream(); } public void update() { - roomRepository.getRoom(PreferenceUtil.getInstance().getInt(PreferenceUtil.Key.ROOM_ID)); + roomModel.get(preferenceUtil.getInt(PreferenceUtil.Key.ROOM_ID)); } public void onClickGunman() { - roomRepository.updateRoomState( - PreferenceUtil.getInstance().getInt(PreferenceUtil.Key.ROOM_ID), - PreferenceUtil.getInstance().getInt(PreferenceUtil.Key.MEMBER_ID), + roomResponseModel.updateRoomState( + preferenceUtil.getInt(PreferenceUtil.Key.ROOM_ID), + preferenceUtil.getInt(PreferenceUtil.Key.MEMBER_ID), MemberState.GUNMAN.getValue()); } public void onClickWitch() { - roomRepository.updateRoomState( - PreferenceUtil.getInstance().getInt(PreferenceUtil.Key.ROOM_ID), - PreferenceUtil.getInstance().getInt(PreferenceUtil.Key.MEMBER_ID), + roomResponseModel.updateRoomState( + preferenceUtil.getInt(PreferenceUtil.Key.ROOM_ID), + preferenceUtil.getInt(PreferenceUtil.Key.MEMBER_ID), MemberState.WITCH.getValue()); } public void onClickReady() { ready.set(!ready.get()); - roomRepository.updateRoomState( - PreferenceUtil.getInstance().getInt(PreferenceUtil.Key.ROOM_ID), - PreferenceUtil.getInstance().getInt(PreferenceUtil.Key.MEMBER_ID), + roomResponseModel.updateRoomState( + preferenceUtil.getInt(PreferenceUtil.Key.ROOM_ID), + preferenceUtil.getInt(PreferenceUtil.Key.MEMBER_ID), MemberState.READY.getValue()); } public void onClickExit() { roomRepository.exitRoom( - PreferenceUtil.getInstance().getInt(PreferenceUtil.Key.ROOM_ID), - PreferenceUtil.getInstance().getInt(PreferenceUtil.Key.MEMBER_ID), - PreferenceUtil.getInstance().getInt(PreferenceUtil.Key.USER_ID)); + preferenceUtil.getInt(PreferenceUtil.Key.ROOM_ID), + preferenceUtil.getInt(PreferenceUtil.Key.MEMBER_ID), + preferenceUtil.getInt(PreferenceUtil.Key.USER_ID)) + .subscribeOn(Schedulers.computation()) + .subscribe( + __ -> { + navigationMessenger.navigateTo(new NavigationMessage(NavigationMessage.Type.Finish)); + } + ); } @BindingAdapter("setRoomMainAdapter") diff --git a/app/src/main/java/framework/gameMain/RealTimeActivity.java b/app/src/main/java/framework/gameMain/RealTimeActivity.java index 837ef73..f60de72 100644 --- a/app/src/main/java/framework/gameMain/RealTimeActivity.java +++ b/app/src/main/java/framework/gameMain/RealTimeActivity.java @@ -3,11 +3,13 @@ import android.os.Bundle; import android.support.v7.app.AppCompatActivity; +import com.example.sprout.refactor.activity.BaseActivity; + import java.util.concurrent.ScheduledFuture; import java.util.concurrent.ScheduledThreadPoolExecutor; import java.util.concurrent.TimeUnit; -public abstract class RealTimeActivity extends AppCompatActivity implements Runnable { +public abstract class RealTimeActivity extends BaseActivity implements Runnable { //インターバル確認用変数 private long interval = 15L; private long prevTime = 0L;