diff --git a/app/src/main/java/com/example/sprout/refactor/activity/RoomListActivity.java b/app/src/main/java/com/example/sprout/refactor/activity/RoomListActivity.java index 8871446..2284c06 100644 --- a/app/src/main/java/com/example/sprout/refactor/activity/RoomListActivity.java +++ b/app/src/main/java/com/example/sprout/refactor/activity/RoomListActivity.java @@ -3,11 +3,14 @@ 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.RfActivityRoomListBinding; import com.example.sprout.refactor.adapter.RoomListAdapter; +import com.example.sprout.refactor.common.ActivityEvent; +import com.example.sprout.refactor.contract.ViewContract; import com.example.sprout.refactor.viewmodel.RoomListViewModel; /** @@ -15,14 +18,34 @@ * * @author matsumoto_k */ -public class RoomListActivity extends AppCompatActivity { +public class RoomListActivity extends AppCompatActivity implements ViewContract { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); RfActivityRoomListBinding binding = DataBindingUtil.setContentView(this, R.layout.rf_activity_room_list); - RoomListViewModel roomMainViewModel = new RoomListViewModel(Sprout.get().getRoomRepository(), new RoomListAdapter(this)); + RoomListViewModel roomMainViewModel = new RoomListViewModel(Sprout.get().getRoomRepository(), new RoomListAdapter(this), (ViewContract) this); binding.setViewModel(roomMainViewModel); getLifecycle().addObserver(roomMainViewModel); } + + @Override + public void startActivity(ActivityEvent event) { + + } + + @Override + public void finishActivity() { + + } + + @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/RoomListAdapter.java b/app/src/main/java/com/example/sprout/refactor/adapter/RoomListAdapter.java index f6877bd..569bd73 100644 --- a/app/src/main/java/com/example/sprout/refactor/adapter/RoomListAdapter.java +++ b/app/src/main/java/com/example/sprout/refactor/adapter/RoomListAdapter.java @@ -8,7 +8,7 @@ import com.example.sprout.R; import com.example.sprout.databinding.RfItemRoomListBinding; -import com.example.sprout.refactor.viewmodel.RoomListItemViewModel; +import com.example.sprout.refactor.vo.Room; import java.util.ArrayList; @@ -20,10 +20,12 @@ public class RoomListAdapter extends RecyclerView.Adapter { private Context context = null; - private ArrayList items = new ArrayList<>(); + private OnItemClickedListener listener = null; + private ArrayList items = new ArrayList<>(); public RoomListAdapter(Context context) { this.context = context; + setHasStableIds(true); } @Override @@ -34,7 +36,10 @@ @Override public void onBindViewHolder(ViewHolder holder, int position) { - holder.binding.setViewModel(items.get(position)); + holder.binding.setRoom(items.get(position)); + holder.binding.getRoot().setOnClickListener(view -> { + listener.onItemClicked(items.get(position)); + }); } @Override @@ -42,12 +47,28 @@ return items.size(); } - public void setDataAndRefresh(ArrayList items) { + public void setDataAndRefresh(ArrayList items) { this.items.clear(); this.items.addAll(items); + for (Room room : items) { + System.out.println(room.getRoomId()); + } notifyDataSetChanged(); } + @Override + public long getItemId(int position) { + return items.get(position).getRoomId(); + } + + public void setListener(OnItemClickedListener listener) { + this.listener = listener; + } + + public interface OnItemClickedListener { + public void onItemClicked(Room room); + } + public class ViewHolder extends RecyclerView.ViewHolder { RfItemRoomListBinding binding = null; 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 28c1088..d71ea03 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.RoomResponse; import com.example.sprout.refactor.vo.Rooms; import retrofit2.Call; @@ -8,6 +9,8 @@ import retrofit2.http.FormUrlEncoded; import retrofit2.http.GET; import retrofit2.http.POST; +import retrofit2.http.PUT; +import retrofit2.http.Path; /** * Sproutのapi一覧 @@ -22,4 +25,8 @@ @GET("rooms") Call getRooms(); + + @FormUrlEncoded + @PUT("rooms/{roomId}") + Call enterRoom(@Path("roomId") int roomId, @Field("userId") int userId); } diff --git a/app/src/main/java/com/example/sprout/refactor/repository/RegistrationRepository.java b/app/src/main/java/com/example/sprout/refactor/repository/RegistrationRepository.java index 658cdc9..7a3768b 100644 --- a/app/src/main/java/com/example/sprout/refactor/repository/RegistrationRepository.java +++ b/app/src/main/java/com/example/sprout/refactor/repository/RegistrationRepository.java @@ -27,7 +27,11 @@ task.enqueue(new Callback() { @Override public void onResponse(Call call, Response response) { - accountObservable.notifyObservers(response.body()); + if (response.isSuccessful()) { + accountObservable.notifyObservers(response.body()); + } else { + accountObservable.notifyError(new Throwable("error")); + } } @Override 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 c468051..51ad4f5 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.RoomResponse; import com.example.sprout.refactor.vo.Rooms; import retrofit2.Call; @@ -17,6 +18,7 @@ private SproutService sproutService = null; private Observable roomListObservable = new Observable<>(); + private Observable enterRoomObservable = new Observable<>(); public RoomRepository(SproutService sproutService) { this.sproutService = sproutService; @@ -27,7 +29,11 @@ task.enqueue(new Callback() { @Override public void onResponse(Call call, Response response) { - roomListObservable.notifyObservers(response.body()); + if (response.isSuccessful()) { + roomListObservable.notifyObservers(response.body()); + } else { + roomListObservable.notifyError(new Throwable("error")); + } } @Override @@ -37,7 +43,30 @@ }); } + public void enterRoom(int roomId, int userId) { + Call task = sproutService.enterRoom(roomId, userId); + task.enqueue(new Callback() { + @Override + public void onResponse(Call call, Response response) { + if (response.isSuccessful()) { + enterRoomObservable.notifyObservers(response.body()); + } else { + enterRoomObservable.notifyError(new Throwable("error")); + } + } + + @Override + public void onFailure(Call call, Throwable t) { + enterRoomObservable.notifyError(t); + } + }); + } + public Observable getRoomListObservable() { return roomListObservable; } + + public Observable getEnterRoomObservable() { + return enterRoomObservable; + } } diff --git a/app/src/main/java/com/example/sprout/refactor/viewmodel/RoomListItemViewModel.java b/app/src/main/java/com/example/sprout/refactor/viewmodel/RoomListItemViewModel.java deleted file mode 100644 index 9676cf6..0000000 --- a/app/src/main/java/com/example/sprout/refactor/viewmodel/RoomListItemViewModel.java +++ /dev/null @@ -1,40 +0,0 @@ -package com.example.sprout.refactor.viewmodel; - -import android.databinding.ObservableBoolean; -import android.databinding.ObservableField; - -/** - * ルーム一覧のアイテムのViewModel - * - * @author matsumoto_k - */ -public class RoomListItemViewModel { - - private ObservableField userName = new ObservableField<>(""); - private ObservableField roomName = new ObservableField<>(""); - private ObservableField roomMemberNum = new ObservableField<>(""); - private ObservableBoolean hasKey = new ObservableBoolean(false); - - public RoomListItemViewModel(String userName, String roomName, int roomMemberNum, boolean hasKey) { - this.userName.set(userName); - this.roomName.set(roomName); - this.roomMemberNum.set(String.valueOf(roomMemberNum)); - this.hasKey.set(hasKey); - } - - public ObservableField getUserName() { - return userName; - } - - public ObservableField getRoomName() { - return roomName; - } - - public ObservableField getRoomMemberNum() { - return roomMemberNum; - } - - public ObservableBoolean getHasKey() { - return hasKey; - } -} diff --git a/app/src/main/java/com/example/sprout/refactor/viewmodel/RoomListViewModel.java b/app/src/main/java/com/example/sprout/refactor/viewmodel/RoomListViewModel.java index 07db160..91366ac 100644 --- a/app/src/main/java/com/example/sprout/refactor/viewmodel/RoomListViewModel.java +++ b/app/src/main/java/com/example/sprout/refactor/viewmodel/RoomListViewModel.java @@ -7,13 +7,16 @@ import android.widget.LinearLayout; import com.example.sprout.refactor.adapter.RoomListAdapter; +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.Room; +import com.example.sprout.refactor.vo.RoomResponse; import com.example.sprout.refactor.vo.Rooms; import java.util.ArrayList; -import java.util.Map; +import java.util.Collections; /** * ルーム一覧のViewModel @@ -22,26 +25,32 @@ */ public class RoomListViewModel extends BaseViewModel { - private RoomListAdapter adapter = null; - private Observer observer = null; private RoomRepository roomRepository = null; + private RoomListAdapter adapter = null; + private ViewContract viewContract = null; + private RoomListAdapter.OnItemClickedListener listener = null; + private Observer roomListObserver = null; + private Observer enterRoomObserver = null; - public RoomListViewModel(RoomRepository roomRepository, RoomListAdapter adapter) { + public RoomListViewModel(RoomRepository roomRepository, RoomListAdapter adapter, ViewContract viewContract) { this.roomRepository = roomRepository; + this.viewContract = viewContract; + + this.listener = room -> { + if (room.hasKey()) { + // TODO input key + } else { + roomRepository.enterRoom(room.getRoomId(), PreferenceUtil.getInstance().getInt(PreferenceUtil.Key.USER_ID)); + } + }; + adapter.setListener(listener); this.adapter = adapter; - observer = new Observer() { + roomListObserver = new Observer() { @Override public void notify(Rooms rooms) { - ArrayList items = new ArrayList<>(); - for (Map.Entry entry : rooms.getRoomList().entrySet()) { - items.add(new RoomListItemViewModel( - entry.getValue().getHostName(), - entry.getValue().getRoomName(), - entry.getValue().getMemberList().size(), - entry.getValue().isKeyCheck() - )); - } + ArrayList items = new ArrayList<>(rooms.getRoomList().values()); + Collections.reverse(items); RoomListViewModel.this.adapter.setDataAndRefresh(items); } @@ -50,7 +59,25 @@ throwable.printStackTrace(); } }; - this.roomRepository.getRoomListObservable().addObserver(observer); + + enterRoomObserver = new Observer() { + @Override + public void notify(RoomResponse roomResponse) { + if (roomResponse.canEnter()) { + // TODO createRoomMainActivity + } else { + viewContract.showShortToast("入室に失敗しました"); + } + } + + @Override + public void error(Throwable throwable) { + viewContract.showShortToast("入室に失敗しました"); + } + }; + + this.roomRepository.getRoomListObservable().addObserver(roomListObserver); + this.roomRepository.getEnterRoomObservable().addObserver(enterRoomObserver); this.roomRepository.getRooms(); } @@ -61,12 +88,12 @@ @Override public void onDestroy() { super.onDestroy(); - roomRepository.getRoomListObservable().removeObserver(observer); + roomRepository.getRoomListObservable().removeObserver(roomListObserver); } @BindingAdapter("setRoomListAdapter") public static void setRoomListAdapter(RecyclerView recyclerView, RoomListAdapter adapter) { - recyclerView.setLayoutManager(new LinearLayoutManager(recyclerView.getContext())); + recyclerView.setLayoutManager(new LinearLayoutManager(recyclerView.getContext(), LinearLayoutManager.VERTICAL, false)); DividerItemDecoration dividerItemDecoration = new DividerItemDecoration(recyclerView.getContext(), LinearLayout.VERTICAL); recyclerView.addItemDecoration(dividerItemDecoration); diff --git a/app/src/main/java/com/example/sprout/refactor/vo/Account.java b/app/src/main/java/com/example/sprout/refactor/vo/Account.java index 0d73f3d..4335698 100644 --- a/app/src/main/java/com/example/sprout/refactor/vo/Account.java +++ b/app/src/main/java/com/example/sprout/refactor/vo/Account.java @@ -1,7 +1,7 @@ package com.example.sprout.refactor.vo; /** - * Rアカウント登録のEntity + * アカウント登録のEntity * * @author matsumoto_k */ 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 44cbd2c..68217c4 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 @@ -5,9 +5,10 @@ import java.util.HashMap; /** - * Created by matsumoto_k on 2017/11/29. + * ルームのEntity + * + * @author matsumoto_k */ - public class Room { private int roomId = -1; @@ -54,4 +55,13 @@ public int getBattleId() { return battleId; } + + /** + * この部屋にkeyが設定されているかどうか + * + * @return keyが設定されていればtrue + */ + public boolean hasKey() { + return keyCheck; + } } diff --git a/app/src/main/java/com/example/sprout/refactor/vo/RoomResponse.java b/app/src/main/java/com/example/sprout/refactor/vo/RoomResponse.java new file mode 100644 index 0000000..20c8464 --- /dev/null +++ b/app/src/main/java/com/example/sprout/refactor/vo/RoomResponse.java @@ -0,0 +1,39 @@ +package com.example.sprout.refactor.vo; + +/** + * 入室時のEntity + * + * @author matsumoto_k + */ +public class RoomResponse { + + private Room room = null; + private int memberId = -1; + private int BattleId = -1; + private boolean check = false; + + public Room getRoom() { + return room; + } + + public int getMemberId() { + return memberId; + } + + public int getBattleId() { + return BattleId; + } + + public boolean isCheck() { + return check; + } + + /** + * 入室可能かどうか + * + * @return 入室可能ならtrue + */ + public boolean canEnter() { + return check; + } +} diff --git a/app/src/main/java/com/example/sprout/refactor/vo/Rooms.java b/app/src/main/java/com/example/sprout/refactor/vo/Rooms.java index 2a8860f..9cf7f9e 100644 --- a/app/src/main/java/com/example/sprout/refactor/vo/Rooms.java +++ b/app/src/main/java/com/example/sprout/refactor/vo/Rooms.java @@ -1,16 +1,18 @@ package com.example.sprout.refactor.vo; -import java.util.HashMap; +import java.util.TreeMap; /** - * Created by matsumoto_k on 2017/11/29. + * ルームのEntity + * + * @author matsumoto_k */ public class Rooms { private int roomId = -1; - private HashMap roomList = null; + private TreeMap roomList = null; public Rooms() { @@ -20,7 +22,7 @@ return roomId; } - public HashMap getRoomList() { + public TreeMap getRoomList() { return roomList; } } diff --git a/app/src/main/res/layout/rf_item_room_list.xml b/app/src/main/res/layout/rf_item_room_list.xml index e6740f7..cea67d4 100644 --- a/app/src/main/res/layout/rf_item_room_list.xml +++ b/app/src/main/res/layout/rf_item_room_list.xml @@ -5,13 +5,14 @@ + name="room" + type="com.example.sprout.refactor.vo.Room" /> + android:layout_height="wrap_content" + android:background="?android:attr/selectableItemBackground"> @@ -31,7 +32,7 @@ android:layout_marginBottom="@dimen/margin_tiny" android:layout_marginStart="@dimen/margin_tiny" android:layout_marginTop="@dimen/margin_tiny" - android:text="@{viewModel.userName}" + android:text="@{room.hostName}" android:textSize="@dimen/text_medium" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintStart_toStartOf="parent" @@ -42,7 +43,7 @@ android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginEnd="@dimen/margin_tiny" - android:text="@{viewModel.roomMemberNum}" + android:text="@{String.valueOf(room.memberList.size())}" android:textSize="@dimen/text_large" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintEnd_toStartOf="@id/room_list_item_member_limit" @@ -53,7 +54,7 @@ android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginEnd="@dimen/margin_large" - android:text="/4" + android:text="/2" android:textSize="@dimen/text_large" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintEnd_toStartOf="@id/room_list_item_key" @@ -66,7 +67,7 @@ android:layout_marginBottom="@dimen/margin_tiny" android:layout_marginEnd="@dimen/margin_tiny" android:layout_marginTop="@dimen/margin_tiny" - android:src="@{viewModel.hasKey.get() ? @drawable/key_close:@drawable/key_open}" + android:src="@{room.keyCheck ? @drawable/key_close:@drawable/key_open}" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintTop_toTopOf="parent" />