diff --git a/app/src/main/java/com/example/sprout/Sprout.java b/app/src/main/java/com/example/sprout/Sprout.java index c0d059d..d3f028c 100644 --- a/app/src/main/java/com/example/sprout/Sprout.java +++ b/app/src/main/java/com/example/sprout/Sprout.java @@ -12,6 +12,7 @@ import com.example.sprout.battles.BattlesConnection; import com.example.sprout.battles.Team; import com.example.sprout.battles.UpdateActor; +import com.example.sprout.refactor.Constant; import com.example.sprout.refactor.api.SproutService; import com.example.sprout.refactor.repository.RegistrationRepository; import com.example.sprout.refactor.repository.RoomRepository; @@ -28,6 +29,7 @@ import framework.model3D.Universe; import java3d.Vector3d; import okhttp3.OkHttpClient; +import okhttp3.logging.HttpLoggingInterceptor; import retrofit2.Retrofit; import retrofit2.converter.gson.GsonConverterFactory; @@ -56,7 +58,13 @@ public OkHttpClient getOkHttpClient() { if (okHttpClient == null) { - okHttpClient = new OkHttpClient.Builder().build(); + if (Constant.DEVELOP) { + HttpLoggingInterceptor interceptor = new HttpLoggingInterceptor(); + interceptor.setLevel(HttpLoggingInterceptor.Level.BODY); + okHttpClient = new OkHttpClient.Builder().addInterceptor(interceptor).build(); + } else { + okHttpClient = new OkHttpClient.Builder().build(); + } } return okHttpClient; } diff --git a/app/src/main/java/com/example/sprout/refactor/Constant.java b/app/src/main/java/com/example/sprout/refactor/Constant.java new file mode 100644 index 0000000..52ab38f --- /dev/null +++ b/app/src/main/java/com/example/sprout/refactor/Constant.java @@ -0,0 +1,9 @@ +package com.example.sprout.refactor; + +/** + * Created by matsumoto_k on 2017/11/29. + */ + +public class Constant { + public static final boolean DEVELOP = true; +} 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 fd38abe..fbeb42d 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,35 +2,56 @@ import android.databinding.DataBindingUtil; import android.os.Bundle; -import android.support.v7.app.AppCompatActivity; import android.widget.Toast; import com.example.sprout.R; import com.example.sprout.Sprout; import com.example.sprout.databinding.RfActivityRoomMainBinding; +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; -public class RoomMainActivity extends AppCompatActivity implements ViewContract { +import framework.gameMain.RealTimeActivity; + +public class RoomMainActivity extends RealTimeActivity implements ViewContract { + + private RoomMainViewModel roomMainViewModel = null; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); RfActivityRoomMainBinding binding = DataBindingUtil.setContentView(this, R.layout.rf_activity_room_main); - RoomMainViewModel roomMainViewModel = new RoomMainViewModel(Sprout.get().getRoomRepository(), (ViewContract) this); + roomMainViewModel = new RoomMainViewModel(Sprout.get().getRoomRepository(), new RoomMainAdapter(this), (ViewContract) this); binding.setViewModel(roomMainViewModel); getLifecycle().addObserver(roomMainViewModel); } @Override + protected void onResume() { + super.onResume(); + this.start(15, 500); + } + + @Override + protected void onPause() { + super.onPause(); + this.stop(); + } + + @Override + protected void update(long interval) { + roomMainViewModel.update(); + } + + @Override public void startActivity(ActivityEvent event) { } @Override public void finishActivity() { - + finish(); } @Override 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 new file mode 100644 index 0000000..b20b5a7 --- /dev/null +++ b/app/src/main/java/com/example/sprout/refactor/adapter/RoomMainAdapter.java @@ -0,0 +1,69 @@ +package com.example.sprout.refactor.adapter; + +/** + * Created by matsumoto_k on 2017/11/29. + */ + +import android.content.Context; +import android.databinding.DataBindingUtil; +import android.support.v7.widget.RecyclerView; +import android.view.LayoutInflater; +import android.view.ViewGroup; + +import com.example.sprout.R; +import com.example.sprout.databinding.RfItemRoomMainBinding; +import com.example.sprout.refactor.vo.Member; + +import java.util.ArrayList; + +/** + * ルームのアダプター + * + * @author matsumoto_k + */ +public class RoomMainAdapter extends RecyclerView.Adapter { + + private Context context = null; + private ArrayList items = new ArrayList<>(); + + public RoomMainAdapter(Context context) { + this.context = context; + setHasStableIds(true); + } + + @Override + public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { + RfItemRoomMainBinding binding = DataBindingUtil.inflate(LayoutInflater.from(context), R.layout.rf_item_room_main, parent, false); + return new ViewHolder(binding); + } + + @Override + public void onBindViewHolder(ViewHolder holder, int position) { + holder.binding.setMember(items.get(position)); + } + + @Override + public int getItemCount() { + return items.size(); + } + + public void setDataAndRefresh(ArrayList items) { + this.items.clear(); + this.items.addAll(items); + notifyDataSetChanged(); + } + + @Override + public long getItemId(int position) { + return items.get(position).getUserId(); + } + + public class ViewHolder extends RecyclerView.ViewHolder { + RfItemRoomMainBinding binding = null; + + public ViewHolder(RfItemRoomMainBinding binding) { + super(binding.getRoot()); + this.binding = binding; + } + } +} diff --git a/app/src/main/java/com/example/sprout/refactor/api/SproutService.java b/app/src/main/java/com/example/sprout/refactor/api/SproutService.java index 11ba466..5a01115 100644 --- a/app/src/main/java/com/example/sprout/refactor/api/SproutService.java +++ b/app/src/main/java/com/example/sprout/refactor/api/SproutService.java @@ -1,6 +1,7 @@ package com.example.sprout.refactor.api; import com.example.sprout.refactor.vo.Account; +import com.example.sprout.refactor.vo.Room; import com.example.sprout.refactor.vo.RoomResponse; import com.example.sprout.refactor.vo.Rooms; @@ -8,6 +9,7 @@ import retrofit2.http.Field; import retrofit2.http.FormUrlEncoded; import retrofit2.http.GET; +import retrofit2.http.HTTP; import retrofit2.http.POST; import retrofit2.http.PUT; import retrofit2.http.Path; @@ -33,4 +35,15 @@ @FormUrlEncoded @POST("rooms") Call createRoom(@Field("userId") int userId, @Field("roomName") String roomName, @Field("key") String key); + + @GET("rooms/{roomId}") + Call getRoom(@Path("roomId") int roomId); + + @FormUrlEncoded + @PUT("rooms/{roomId}/{memberId}") + Call updateRoomState(@Path("roomId") int roomId, @Path("memberId") int memberId, @Field("role") int role); + + @FormUrlEncoded + @HTTP(method = "DELETE", path = "rooms/{roomId}/{memberId}", hasBody = true) + Call exitRoom(@Path("roomId") int roomId, @Path("memberId") int memberId, @Field("userId") int userId); } diff --git a/app/src/main/java/com/example/sprout/refactor/common/MemberState.java b/app/src/main/java/com/example/sprout/refactor/common/MemberState.java new file mode 100644 index 0000000..3f0724a --- /dev/null +++ b/app/src/main/java/com/example/sprout/refactor/common/MemberState.java @@ -0,0 +1,20 @@ +package com.example.sprout.refactor.common; + +/** + * Created by matsumoto_k on 2017/11/29. + */ + +public enum MemberState { + GUNMAN(0), + WITCH(1), + READY(2); + private final int value; + + private MemberState(int value) { + this.value = value; + } + + public int getValue() { + return value; + } +} diff --git a/app/src/main/java/com/example/sprout/refactor/repository/RoomRepository.java b/app/src/main/java/com/example/sprout/refactor/repository/RoomRepository.java index 3a862e6..cfd6d01 100644 --- a/app/src/main/java/com/example/sprout/refactor/repository/RoomRepository.java +++ b/app/src/main/java/com/example/sprout/refactor/repository/RoomRepository.java @@ -2,6 +2,7 @@ import com.example.sprout.refactor.api.SproutService; import com.example.sprout.refactor.notification.Observable; +import com.example.sprout.refactor.vo.Room; import com.example.sprout.refactor.vo.RoomResponse; import com.example.sprout.refactor.vo.Rooms; @@ -20,6 +21,9 @@ private Observable roomListObservable = new Observable<>(); private Observable enterRoomObservable = new Observable<>(); private Observable createRoomObservable = new Observable<>(); + private Observable roomObservable = new Observable<>(); + private Observable roomUpdateStateObservable = new Observable<>(); + private Observable exitRoomObservable = new Observable<>(); public RoomRepository(SproutService sproutService) { this.sproutService = sproutService; @@ -82,6 +86,63 @@ }); } + public void getRoom(int roomId) { + Call task = sproutService.getRoom(roomId); + task.enqueue(new Callback() { + @Override + public void onResponse(Call call, Response response) { + if (response.isSuccessful()) { + roomObservable.notifyObservers(response.body()); + } else { + roomObservable.notifyError(new Throwable("error")); + } + } + + @Override + public void onFailure(Call call, Throwable t) { + roomObservable.notifyError(t); + } + }); + } + + public void updateRoomState(int roomId, int memberId, int role) { + Call task = sproutService.updateRoomState(roomId, memberId, role); + task.enqueue(new Callback() { + @Override + public void onResponse(Call call, Response response) { + if (response.isSuccessful()) { + roomUpdateStateObservable.notifyObservers(response.body()); + } else { + roomUpdateStateObservable.notifyError(new Throwable("error")); + } + } + + @Override + public void onFailure(Call call, Throwable t) { + roomUpdateStateObservable.notifyError(t); + } + }); + } + + public void exitRoom(int roomId, int memberId, int userId) { + Call task = sproutService.exitRoom(roomId, memberId, userId); + task.enqueue(new Callback() { + @Override + public void onResponse(Call call, Response response) { + if (response.isSuccessful()) { + exitRoomObservable.notifyObservers(response.body()); + } else { + exitRoomObservable.notifyError(new Throwable("error")); + } + } + + @Override + public void onFailure(Call call, Throwable t) { + exitRoomObservable.notifyError(t); + } + }); + } + public Observable getRoomListObservable() { return roomListObservable; } @@ -93,4 +154,16 @@ public Observable getCreateRoomObservable() { return createRoomObservable; } + + public Observable getRoomObservable() { + return roomObservable; + } + + public Observable getRoomUpdateStateObservable() { + return roomUpdateStateObservable; + } + + public Observable getExitRoomObservable() { + return exitRoomObservable; + } } 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 abbfc1f..bcf5163 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 @@ -1,7 +1,23 @@ package com.example.sprout.refactor.viewmodel; +import android.databinding.BindingAdapter; +import android.databinding.ObservableBoolean; +import android.support.v7.widget.DividerItemDecoration; +import android.support.v7.widget.LinearLayoutManager; +import android.support.v7.widget.RecyclerView; +import android.widget.LinearLayout; + +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.notification.Observer; import com.example.sprout.refactor.repository.RoomRepository; +import com.example.sprout.refactor.util.PreferenceUtil; +import com.example.sprout.refactor.vo.Member; +import com.example.sprout.refactor.vo.Room; +import com.example.sprout.refactor.vo.RoomResponse; + +import java.util.ArrayList; /** * Created by matsumoto_k on 2017/11/29. @@ -10,10 +26,115 @@ public class RoomMainViewModel extends BaseViewModel { private RoomRepository roomRepository = null; + 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; - public RoomMainViewModel(RoomRepository roomRepository, ViewContract viewContract) { + public RoomMainViewModel(RoomRepository roomRepository, RoomMainAdapter adapter, ViewContract viewContract) { this.roomRepository = roomRepository; this.viewContract = viewContract; + + roomObserver = new Observer() { + @Override + public void notify(Room room) { + ArrayList items = new ArrayList<>(room.getMemberList().values()); + adapter.setDataAndRefresh(items); + } + + @Override + public void error(Throwable throwable) { + throwable.printStackTrace(); + } + }; + + updateRoomStateObserver = new Observer() { + @Override + public void notify(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(); + } + }; + + this.adapter = adapter; + this.roomRepository.getRoomObservable().addObserver(roomObserver); + this.roomRepository.getRoomUpdateStateObservable().addObserver(updateRoomStateObserver); + this.roomRepository.getExitRoomObservable().addObserver(exitRoomObserver); + } + + @Override + public void onDestroy() { + super.onDestroy(); + roomRepository.getRoomObservable().removeObserver(roomObserver); + roomRepository.getRoomUpdateStateObservable().removeObserver(updateRoomStateObserver); + roomRepository.getExitRoomObservable().removeObserver(exitRoomObserver); + } + + public void update() { + roomRepository.getRoom(PreferenceUtil.getInstance().getInt(PreferenceUtil.Key.ROOM_ID)); + } + + public void onClickGunman() { + roomRepository.updateRoomState( + PreferenceUtil.getInstance().getInt(PreferenceUtil.Key.ROOM_ID), + PreferenceUtil.getInstance().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), + 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), + 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)); + } + + @BindingAdapter("setRoomMainAdapter") + public static void setRoomMainAdapter(RecyclerView recyclerView, RoomMainAdapter adapter) { + recyclerView.setLayoutManager(new LinearLayoutManager(recyclerView.getContext(), LinearLayoutManager.HORIZONTAL, false)); + DividerItemDecoration dividerItemDecoration = new DividerItemDecoration(recyclerView.getContext(), + LinearLayout.HORIZONTAL); + recyclerView.addItemDecoration(dividerItemDecoration); + recyclerView.setAdapter(adapter); + } + + public RoomMainAdapter getAdapter() { + return adapter; + } + + public ObservableBoolean getReady() { + return ready; } } diff --git a/app/src/main/java/com/example/sprout/refactor/vo/Room.java b/app/src/main/java/com/example/sprout/refactor/vo/Room.java index 54974cb..3445a99 100644 --- a/app/src/main/java/com/example/sprout/refactor/vo/Room.java +++ b/app/src/main/java/com/example/sprout/refactor/vo/Room.java @@ -1,6 +1,6 @@ package com.example.sprout.refactor.vo; -import java.util.HashMap; +import java.util.TreeMap; /** * ルームのEntity @@ -12,7 +12,7 @@ private int roomId = -1; private String hostName = ""; private String roomName = ""; - private HashMap memberList = null; + private TreeMap memberList = null; private boolean readyToFight = false; private boolean keyCheck = false; private boolean startFrag = false; @@ -34,7 +34,7 @@ return roomName; } - public HashMap getMemberList() { + public TreeMap getMemberList() { return memberList; } diff --git a/app/src/main/res/drawable/gunman.png b/app/src/main/res/drawable/gunman.png new file mode 100644 index 0000000..9948e80 --- /dev/null +++ b/app/src/main/res/drawable/gunman.png Binary files differ diff --git a/app/src/main/res/drawable/witch.png b/app/src/main/res/drawable/witch.png new file mode 100644 index 0000000..e836045 --- /dev/null +++ b/app/src/main/res/drawable/witch.png Binary files differ diff --git a/app/src/main/res/layout/rf_activity_room_main.xml b/app/src/main/res/layout/rf_activity_room_main.xml index e30ab27..7091e9e 100644 --- a/app/src/main/res/layout/rf_activity_room_main.xml +++ b/app/src/main/res/layout/rf_activity_room_main.xml @@ -1,5 +1,6 @@ - + @@ -10,5 +11,56 @@ + android:layout_height="match_parent" + android:layout_margin="@dimen/margin_small"> + + + +