diff --git a/app/build.gradle b/app/build.gradle index 9832026..3e6082a 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -53,5 +53,8 @@ compile "android.arch.lifecycle:extensions:1.0.0" annotationProcessor "android.arch.lifecycle:compiler:1.0.0" + // RecyclerView + implementation 'com.android.support:recyclerview-v7:26+' + compile 'net.arnx:jsonic:1.3.9' } diff --git a/app/src/main/java/com/example/sprout/Sprout.java b/app/src/main/java/com/example/sprout/Sprout.java index ac51f95..c0d059d 100644 --- a/app/src/main/java/com/example/sprout/Sprout.java +++ b/app/src/main/java/com/example/sprout/Sprout.java @@ -14,6 +14,7 @@ import com.example.sprout.battles.UpdateActor; import com.example.sprout.refactor.api.SproutService; import com.example.sprout.refactor.repository.RegistrationRepository; +import com.example.sprout.refactor.repository.RoomRepository; import com.example.sprout.rooms.RoomsConnection; import java.util.HashMap; @@ -41,6 +42,7 @@ private OkHttpClient okHttpClient = null; private SproutService sproutService = null; private RegistrationRepository registrationRepository = null; + private RoomRepository roomRepository = null; @Override public void onCreate() { @@ -79,6 +81,13 @@ return registrationRepository; } + public RoomRepository getRoomRepository() { + if (roomRepository == null) { + roomRepository = new RoomRepository(getSproutService()); + } + return roomRepository; + } + private RoomsConnection roomsConnection = null; private BattlesConnection battlesConnection = null; private AccountsConnection accountsConnection = null; 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 7819156..8871446 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 @@ -5,11 +5,15 @@ import android.support.v7.app.AppCompatActivity; 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.viewmodel.RoomListViewModel; /** + * ルーム一覧のActivity * + * @author matsumoto_k */ public class RoomListActivity extends AppCompatActivity { @@ -17,7 +21,7 @@ protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); RfActivityRoomListBinding binding = DataBindingUtil.setContentView(this, R.layout.rf_activity_room_list); - RoomListViewModel roomMainViewModel = new RoomListViewModel(); + RoomListViewModel roomMainViewModel = new RoomListViewModel(Sprout.get().getRoomRepository(), new RoomListAdapter(this)); binding.setViewModel(roomMainViewModel); getLifecycle().addObserver(roomMainViewModel); } 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 new file mode 100644 index 0000000..f6877bd --- /dev/null +++ b/app/src/main/java/com/example/sprout/refactor/adapter/RoomListAdapter.java @@ -0,0 +1,59 @@ +package com.example.sprout.refactor.adapter; + +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.RfItemRoomListBinding; +import com.example.sprout.refactor.viewmodel.RoomListItemViewModel; + +import java.util.ArrayList; + +/** + * ルーム一覧のアダプター + * + * @author matsumoto_k + */ +public class RoomListAdapter extends RecyclerView.Adapter { + + private Context context = null; + private ArrayList items = new ArrayList<>(); + + public RoomListAdapter(Context context) { + this.context = context; + } + + @Override + public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { + RfItemRoomListBinding binding = DataBindingUtil.inflate(LayoutInflater.from(context), R.layout.rf_item_room_list, parent, false); + return new ViewHolder(binding); + } + + @Override + public void onBindViewHolder(ViewHolder holder, int position) { + holder.binding.setViewModel(items.get(position)); + } + + @Override + public int getItemCount() { + return items.size(); + } + + public void setDataAndRefresh(ArrayList items) { + this.items.clear(); + this.items.addAll(items); + notifyDataSetChanged(); + } + + public class ViewHolder extends RecyclerView.ViewHolder { + RfItemRoomListBinding binding = null; + + public ViewHolder(RfItemRoomListBinding 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 ccf1386..28c1088 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,10 +1,12 @@ package com.example.sprout.refactor.api; import com.example.sprout.refactor.vo.Account; +import com.example.sprout.refactor.vo.Rooms; import retrofit2.Call; import retrofit2.http.Field; import retrofit2.http.FormUrlEncoded; +import retrofit2.http.GET; import retrofit2.http.POST; /** @@ -17,4 +19,7 @@ @FormUrlEncoded @POST("accounts") Call registration(@Field("userName") String userName); + + @GET("rooms") + Call getRooms(); } 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 new file mode 100644 index 0000000..c468051 --- /dev/null +++ b/app/src/main/java/com/example/sprout/refactor/repository/RoomRepository.java @@ -0,0 +1,43 @@ +package com.example.sprout.refactor.repository; + +import com.example.sprout.refactor.api.SproutService; +import com.example.sprout.refactor.notification.Observable; +import com.example.sprout.refactor.vo.Rooms; + +import retrofit2.Call; +import retrofit2.Callback; +import retrofit2.Response; + +/** + * ルームのリポジトリ + * + * @author matsumoto_k + */ +public class RoomRepository extends Repository { + + private SproutService sproutService = null; + private Observable roomListObservable = new Observable<>(); + + public RoomRepository(SproutService sproutService) { + this.sproutService = sproutService; + } + + public void getRooms() { + Call task = sproutService.getRooms(); + task.enqueue(new Callback() { + @Override + public void onResponse(Call call, Response response) { + roomListObservable.notifyObservers(response.body()); + } + + @Override + public void onFailure(Call call, Throwable t) { + roomListObservable.notifyError(t); + } + }); + } + + public Observable getRoomListObservable() { + return roomListObservable; + } +} 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 new file mode 100644 index 0000000..9676cf6 --- /dev/null +++ b/app/src/main/java/com/example/sprout/refactor/viewmodel/RoomListItemViewModel.java @@ -0,0 +1,40 @@ +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 dae806d..407f27e 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 @@ -1,8 +1,80 @@ package com.example.sprout.refactor.viewmodel; -/** - * Created by matsumoto_k on 2017/11/29. - */ +import android.databinding.BindingAdapter; +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.RoomListAdapter; +import com.example.sprout.refactor.notification.Observer; +import com.example.sprout.refactor.repository.RoomRepository; +import com.example.sprout.refactor.vo.Room; +import com.example.sprout.refactor.vo.Rooms; + +import java.util.ArrayList; +import java.util.Map; + +/** + * ルーム一覧のViewModel + * + * @author matsumoto_k + */ public class RoomListViewModel extends BaseViewModel { + + private RoomListAdapter adapter = null; + private Observer observer = null; + private RoomRepository roomRepository = null; + + public RoomListViewModel(RoomRepository roomRepository, RoomListAdapter adapter) { + this.roomRepository = roomRepository; + this.adapter = adapter; + + observer = new Observer() { + @Override + public void notify(Rooms rooms) { + System.out.println(rooms.getRoomList().size()); + 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() + )); + } + RoomListViewModel.this.adapter.setDataAndRefresh(items); + } + + @Override + public void error(Throwable throwable) { + throwable.printStackTrace(); + } + }; + this.roomRepository.getRoomListObservable().addObserver(observer); + this.roomRepository.getRooms(); + } + + public void onClickRefresh() { + roomRepository.getRooms(); + } + + @Override + public void onDestroy() { + super.onDestroy(); + roomRepository.getRoomListObservable().removeObserver(observer); + } + + @BindingAdapter("setRoomListAdapter") + public static void setRoomListAdapter(RecyclerView recyclerView, RoomListAdapter adapter) { + recyclerView.setLayoutManager(new LinearLayoutManager(recyclerView.getContext())); + DividerItemDecoration dividerItemDecoration = new DividerItemDecoration(recyclerView.getContext(), + LinearLayout.VERTICAL); + recyclerView.addItemDecoration(dividerItemDecoration); + recyclerView.setAdapter(adapter); + } + + public RoomListAdapter getAdapter() { + return adapter; + } } 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 new file mode 100644 index 0000000..44cbd2c --- /dev/null +++ b/app/src/main/java/com/example/sprout/refactor/vo/Room.java @@ -0,0 +1,57 @@ +package com.example.sprout.refactor.vo; + +import com.example.sprout.rooms.Member; + +import java.util.HashMap; + +/** + * Created by matsumoto_k on 2017/11/29. + */ + +public class Room { + + private int roomId = -1; + private String hostName = ""; + private String roomName = ""; + private HashMap memberList = null; + private boolean readyToFight = false; + private boolean keyCheck = false; + private boolean startFrag = false; + private int battleId = -1; + + public Room() { + + } + + public int getRoomId() { + return roomId; + } + + public String getHostName() { + return hostName; + } + + public String getRoomName() { + return roomName; + } + + public HashMap getMemberList() { + return memberList; + } + + public boolean isReadyToFight() { + return readyToFight; + } + + public boolean isKeyCheck() { + return keyCheck; + } + + public boolean isStartFrag() { + return startFrag; + } + + public int getBattleId() { + return battleId; + } +} 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 new file mode 100644 index 0000000..2a8860f --- /dev/null +++ b/app/src/main/java/com/example/sprout/refactor/vo/Rooms.java @@ -0,0 +1,26 @@ +package com.example.sprout.refactor.vo; + + +import java.util.HashMap; + +/** + * Created by matsumoto_k on 2017/11/29. + */ + +public class Rooms { + + private int roomId = -1; + private HashMap roomList = null; + + public Rooms() { + + } + + public int getRoomId() { + return roomId; + } + + public HashMap getRoomList() { + return roomList; + } +} diff --git a/app/src/main/res/drawable/divider.xml b/app/src/main/res/drawable/divider.xml new file mode 100644 index 0000000..1b97142 --- /dev/null +++ b/app/src/main/res/drawable/divider.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/key_close.png b/app/src/main/res/drawable/key_close.png new file mode 100644 index 0000000..c72e636 --- /dev/null +++ b/app/src/main/res/drawable/key_close.png Binary files differ diff --git a/app/src/main/res/drawable/key_open.png b/app/src/main/res/drawable/key_open.png new file mode 100644 index 0000000..f309cc0 --- /dev/null +++ b/app/src/main/res/drawable/key_open.png Binary files differ diff --git a/app/src/main/res/layout/rf_activity_room_list.xml b/app/src/main/res/layout/rf_activity_room_list.xml index 5a2204c..ce959fc 100644 --- a/app/src/main/res/layout/rf_activity_room_list.xml +++ b/app/src/main/res/layout/rf_activity_room_list.xml @@ -1,5 +1,6 @@ - + @@ -10,7 +11,46 @@ + android:layout_height="match_parent" + android:layout_margin="@dimen/margin_small"> + + + + +