diff --git a/app/build.gradle b/app/build.gradle index c83a042..0bd8e5a 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -46,7 +46,7 @@ // Retrofit implementation 'com.squareup.retrofit2:retrofit:2.3.0' implementation 'com.squareup.retrofit2:converter-gson:2.3.0' - compile 'com.squareup.retrofit2:converter-gson:2.3.0' + compile 'com.jakewharton.retrofit:retrofit2-rxjava2-adapter:1.0.0' // OKHttp implementation 'com.squareup.okhttp3:okhttp:3.8.0' diff --git a/app/src/main/java/com/example/sprout/refactor/activity/RegistrationActivity.java b/app/src/main/java/com/example/sprout/refactor/activity/RegistrationActivity.java index 5a3fbc4..2b82507 100644 --- a/app/src/main/java/com/example/sprout/refactor/activity/RegistrationActivity.java +++ b/app/src/main/java/com/example/sprout/refactor/activity/RegistrationActivity.java @@ -8,50 +8,77 @@ import com.example.sprout.R; import com.example.sprout.databinding.RfActivityRegistrationBinding; -import com.example.sprout.refactor.common.ActivityEvent; -import com.example.sprout.refactor.contract.ViewContract; import com.example.sprout.refactor.viewmodel.RegistrationViewModel; +import io.reactivex.android.schedulers.AndroidSchedulers; +import io.reactivex.disposables.CompositeDisposable; +import io.reactivex.schedulers.Schedulers; + /** * アカウント登録のActivity * * @author matsumoto_k */ -public class RegistrationActivity extends AppCompatActivity implements ViewContract { +public class RegistrationActivity extends AppCompatActivity { private RfActivityRegistrationBinding binding = null; private RegistrationViewModel registrationViewModel = null; + private final CompositeDisposable subscriptions = new CompositeDisposable(); @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); binding = DataBindingUtil.setContentView(this, R.layout.rf_activity_registration); - registrationViewModel = new RegistrationViewModel((ViewContract) this); + registrationViewModel = new RegistrationViewModel(); binding.setViewModel(registrationViewModel); getLifecycle().addObserver(registrationViewModel); } @Override - public void showShortToast(String message) { - Toast.makeText(this, message, Toast.LENGTH_SHORT).show(); + protected void onResume() { + super.onResume(); + subscribe(); } @Override - public void showLongToast(String message) { - Toast.makeText(this, message, Toast.LENGTH_LONG).show(); + protected void onPause() { + super.onPause(); + dispose(); } - @Override - public void startActivity(ActivityEvent event) { - switch (event) { - case ROOM_LIST: - startActivity(new Intent(RegistrationActivity.this, RoomListActivity.class)); - break; - } + private void subscribe() { + // トーストの購読 + subscriptions.add( + registrationViewModel.getToastMessanger() + .observeOn(AndroidSchedulers.mainThread()) + .subscribe(toastMessage -> { + switch (toastMessage.getLength()) { + case SHORT: + Toast.makeText(this, toastMessage.getMessage(), Toast.LENGTH_SHORT).show(); + break; + case LONG: + Toast.makeText(this, toastMessage.getMessage(), Toast.LENGTH_LONG).show(); + break; + } + }) + ); + // 画面遷移の購読 + subscriptions.add( + registrationViewModel.getNavigationMessenger() + .observeOn(Schedulers.computation()) + .subscribe(navigationMessage -> { + switch (navigationMessage.getType()) { + case Start: + startActivity(new Intent(RegistrationActivity.this, navigationMessage.getClazz())); + break; + case Finsih: + finish(); + } + }) + ); } - @Override - public void finishActivity() { - finish(); + private void dispose() { + subscriptions.dispose(); } } diff --git a/app/src/main/java/com/example/sprout/refactor/api/RegistrationService.java b/app/src/main/java/com/example/sprout/refactor/api/RegistrationService.java index 2a164d5..a23ddd0 100644 --- a/app/src/main/java/com/example/sprout/refactor/api/RegistrationService.java +++ b/app/src/main/java/com/example/sprout/refactor/api/RegistrationService.java @@ -2,7 +2,7 @@ import com.example.sprout.refactor.model.entity.Account; -import retrofit2.Call; +import io.reactivex.Observable; import retrofit2.http.Field; import retrofit2.http.FormUrlEncoded; import retrofit2.http.POST; @@ -14,7 +14,13 @@ */ public interface RegistrationService { + /** + * アカウント登録 + * + * @param userName + * @return + */ @FormUrlEncoded @POST("accounts") - Call registration(@Field("userName") String userName); + Observable registration(@Field("userName") String userName); } diff --git a/app/src/main/java/com/example/sprout/refactor/messengers/Messenger.java b/app/src/main/java/com/example/sprout/refactor/messengers/Messenger.java new file mode 100644 index 0000000..88486de --- /dev/null +++ b/app/src/main/java/com/example/sprout/refactor/messengers/Messenger.java @@ -0,0 +1,24 @@ +package com.example.sprout.refactor.messengers; + +import io.reactivex.Observable; +import io.reactivex.subjects.PublishSubject; +import io.reactivex.subjects.Subject; + +/** + * オブジェクトを送信するための基底クラス + * + * @param オブジェクト + * @author matsumoto_k + */ +public abstract class Messenger { + + private final Subject _bus = PublishSubject.create().toSerialized(); + + protected void send(T message) { + _bus.onNext(message); + } + + public Observable getObservable() { + return _bus; + } +} diff --git a/app/src/main/java/com/example/sprout/refactor/messengers/NavigationMessage.java b/app/src/main/java/com/example/sprout/refactor/messengers/NavigationMessage.java new file mode 100644 index 0000000..90231a2 --- /dev/null +++ b/app/src/main/java/com/example/sprout/refactor/messengers/NavigationMessage.java @@ -0,0 +1,33 @@ +package com.example.sprout.refactor.messengers; + +/** + * 画面遷移をするために送信するObject + * + * @author matsumoto_k + */ +public class NavigationMessage { + private final Type type; + private Class clazz = null; + + public NavigationMessage(Type type, Class clazz) { + this.type = type; + this.clazz = clazz; + } + + public NavigationMessage(Type type) { + this.type = type; + } + + public enum Type { + Start, // 指定のアクティビティを開始する + Finsih // アクティビティを終了する + } + + public Type getType() { + return type; + } + + public Class getClazz() { + return clazz; + } +} diff --git a/app/src/main/java/com/example/sprout/refactor/messengers/NavigationMessenger.java b/app/src/main/java/com/example/sprout/refactor/messengers/NavigationMessenger.java new file mode 100644 index 0000000..44cae50 --- /dev/null +++ b/app/src/main/java/com/example/sprout/refactor/messengers/NavigationMessenger.java @@ -0,0 +1,13 @@ +package com.example.sprout.refactor.messengers; + +/** + * 画面遷移をする + * + * @author matsumoto_k + */ +public class NavigationMessenger extends Messenger { + + public void navigateTo(NavigationMessage message) { + send(message); + } +} diff --git a/app/src/main/java/com/example/sprout/refactor/messengers/ToastMessage.java b/app/src/main/java/com/example/sprout/refactor/messengers/ToastMessage.java new file mode 100644 index 0000000..2b573d6 --- /dev/null +++ b/app/src/main/java/com/example/sprout/refactor/messengers/ToastMessage.java @@ -0,0 +1,32 @@ +package com.example.sprout.refactor.messengers; + +/** + * トーストを表示するために送信するObject + * + * @author matsumoto_k + */ +public class ToastMessage { + private final String message; + private final Length length; + + public ToastMessage(String message, Length length) { + this.message = message; + this.length = length; + } + + /** + * トーストを表示させた時の表示時間の長さ + */ + public enum Length { + SHORT, + LONG + } + + public String getMessage() { + return message; + } + + public Length getLength() { + return length; + } +} diff --git a/app/src/main/java/com/example/sprout/refactor/messengers/ToastMessenger.java b/app/src/main/java/com/example/sprout/refactor/messengers/ToastMessenger.java new file mode 100644 index 0000000..6c9304e --- /dev/null +++ b/app/src/main/java/com/example/sprout/refactor/messengers/ToastMessenger.java @@ -0,0 +1,19 @@ +package com.example.sprout.refactor.messengers; + +/** + * トーストの通知を送る + * + * @author matsumoto_k + */ +public class ToastMessenger extends Messenger { + + /** + * トーストを表示するためのメッセージを送信する + * + * @param message + */ + public void showToast(ToastMessage message) { + send(message); + } + +} diff --git a/app/src/main/java/com/example/sprout/refactor/model/entity/Account.java b/app/src/main/java/com/example/sprout/refactor/model/entity/Account.java index 257bd56..73ca46e 100644 --- a/app/src/main/java/com/example/sprout/refactor/model/entity/Account.java +++ b/app/src/main/java/com/example/sprout/refactor/model/entity/Account.java @@ -11,6 +11,15 @@ private String mode = ""; private int userID = 0; // TODO:Server側のレスポンスをIDからIdに修正する + public Account() { + } + + public void setAccount(Account account) { + this.userName = account.userName; + this.mode = account.getMode(); + this.userID = account.getUserID(); + } + public String getUserName() { return userName; } 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 872f738..0f41a14 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 @@ -2,11 +2,12 @@ import com.example.sprout.refactor.api.RegistrationService; import com.example.sprout.refactor.model.entity.Account; -import com.example.sprout.refactor.notification.Observable; +import com.jakewharton.retrofit2.adapter.rxjava2.RxJava2CallAdapterFactory; -import retrofit2.Call; -import retrofit2.Callback; -import retrofit2.Response; +import io.reactivex.Observable; +import io.reactivex.schedulers.Schedulers; +import io.reactivex.subjects.PublishSubject; +import io.reactivex.subjects.Subject; import retrofit2.Retrofit; import retrofit2.converter.gson.GsonConverterFactory; @@ -18,7 +19,7 @@ public class RegistrationRepository extends Repository { private RegistrationService registrationService = null; - private Observable accountObservable = new Observable<>(); + private Subject registrationSubject = PublishSubject.create().toSerialized(); public RegistrationRepository() { this.registrationService = new Retrofit @@ -26,30 +27,31 @@ .baseUrl("http://nitta-lab-www2.is.konan-u.ac.jp:8080/SproutServer/") .client(okHttpClient) .addConverterFactory(GsonConverterFactory.create()) + .addCallAdapterFactory(RxJava2CallAdapterFactory.create()) .build() .create(RegistrationService.class); } + /** + * アカウントの登録 + * + * @param userName + * @return + */ public void registration(String userName) { - Call task = registrationService.registration(userName); - task.enqueue(new Callback() { - @Override - public void onResponse(Call call, Response response) { - if (response.isSuccessful()) { - accountObservable.notifyObservers(response.body()); - } else { - accountObservable.notifyError(new Throwable("error")); - } - } - - @Override - public void onFailure(Call call, Throwable t) { - accountObservable.notifyError(t); - } - }); + registrationService.registration(userName) + .subscribeOn(Schedulers.computation()) + .subscribe(account -> { + //通信成功時 + registrationSubject.onNext(account); + }, + error -> { + System.out.println("error"); + // TODO:error handling + }); } - public Observable getAccountObservable() { - return accountObservable; + public Observable getRegistrationObservable() { + return registrationSubject.hide(); } } \ No newline at end of file diff --git a/app/src/main/java/com/example/sprout/refactor/viewmodel/RegistrationViewModel.java b/app/src/main/java/com/example/sprout/refactor/viewmodel/RegistrationViewModel.java index 612cd6e..c4ddc8d 100644 --- a/app/src/main/java/com/example/sprout/refactor/viewmodel/RegistrationViewModel.java +++ b/app/src/main/java/com/example/sprout/refactor/viewmodel/RegistrationViewModel.java @@ -2,14 +2,22 @@ import android.databinding.ObservableField; -import com.example.sprout.refactor.common.ActivityEvent; -import com.example.sprout.refactor.contract.ViewContract; +import com.example.sprout.R; +import com.example.sprout.Sprout; +import com.example.sprout.refactor.activity.RoomListActivity; +import com.example.sprout.refactor.messengers.NavigationMessage; +import com.example.sprout.refactor.messengers.NavigationMessenger; +import com.example.sprout.refactor.messengers.ToastMessage; +import com.example.sprout.refactor.messengers.ToastMessenger; import com.example.sprout.refactor.model.ModelLocator; import com.example.sprout.refactor.model.entity.Account; -import com.example.sprout.refactor.notification.Observer; import com.example.sprout.refactor.repository.RegistrationRepository; import com.example.sprout.refactor.util.PreferenceUtil; +import io.reactivex.Observable; +import io.reactivex.android.schedulers.AndroidSchedulers; +import io.reactivex.disposables.CompositeDisposable; + /** * アカウント登録のViewModel * @@ -18,62 +26,75 @@ public class RegistrationViewModel extends BaseViewModel { private ObservableField editUserName = new ObservableField<>(""); - private ViewContract viewContract = null; - private RegistrationRepository registrationRepository = null; - private Observer observer = null; + private RegistrationRepository registrationRepository = ModelLocator.getModel(ModelLocator.Tag.REGISTRATION_REPOSITORY, RegistrationRepository.class); + private ToastMessenger toastMessanger = new ToastMessenger(); + private NavigationMessenger navigationMessenger = new NavigationMessenger(); + private PreferenceUtil preferenceUtil = PreferenceUtil.getInstance(); + private CompositeDisposable subscriptions = new CompositeDisposable(); - public RegistrationViewModel(ViewContract toastContract) { + public RegistrationViewModel() { this.registrationRepository = ModelLocator.getModel(ModelLocator.Tag.REGISTRATION_REPOSITORY, RegistrationRepository.class); - this.viewContract = toastContract; - observer = new Observer() { - @Override - public void notify(Account account) { - ModelLocator.setModel(ModelLocator.Tag.ACCOUNT, account); - PreferenceUtil.getInstance().saveInt(PreferenceUtil.Key.USER_ID, account.getUserID()); - PreferenceUtil.getInstance().saveBoolean(PreferenceUtil.Key.REGISTERED, true); - viewContract.showShortToast("アカウントを作成しました"); - viewContract.startActivity(ActivityEvent.ROOM_LIST); - viewContract.finishActivity(); - } - - @Override - public void error(Throwable throwable) { - viewContract.showShortToast("アカウント作成に失敗しました"); - - } - }; - } - - @Override - public void onCreate() { - super.onCreate(); - if (PreferenceUtil.getInstance().getBoolean(PreferenceUtil.Key.REGISTERED)) { - viewContract.startActivity(ActivityEvent.ROOM_LIST); - viewContract.finishActivity(); + // 既にアカウント登録されていたらされていたらルーム一覧に画面遷移する + if (preferenceUtil.getBoolean(PreferenceUtil.Key.REGISTERED, false)) { + navigationMessenger.navigateTo(new NavigationMessage(NavigationMessage.Type.Start, RoomListActivity.class)); + navigationMessenger.navigateTo(new NavigationMessage(NavigationMessage.Type.Finsih)); } } @Override public void onResume() { super.onResume(); - registrationRepository.getAccountObservable().addObserver(observer); + subscriptions.add( + registrationRepository.getRegistrationObservable() + .observeOn(AndroidSchedulers.mainThread()) + .subscribe(account -> { + }) + ); + subscriptions.add( + registrationRepository.getRegistrationObservable() + .observeOn(AndroidSchedulers.mainThread()) + .subscribe(account -> { + ModelLocator.getModel(ModelLocator.Tag.ACCOUNT, Account.class).setAccount(account); + preferenceUtil.saveInt(PreferenceUtil.Key.USER_ID, account.getUserID()); + preferenceUtil.saveBoolean(PreferenceUtil.Key.REGISTERED, true); + toastMessanger.showToast(new ToastMessage(Sprout.get().getResources().getString(R.string.success_registration), ToastMessage.Length.LONG)); + navigationMessenger.navigateTo(new NavigationMessage(NavigationMessage.Type.Start, RoomListActivity.class)); + navigationMessenger.navigateTo(new NavigationMessage(NavigationMessage.Type.Finsih)); + }, error -> { + toastMessanger.showToast(new ToastMessage(Sprout.get().getResources().getString(R.string.fail_registration), ToastMessage.Length.SHORT)); + }) + ); } @Override public void onPause() { super.onPause(); - registrationRepository.getAccountObservable().removeObserver(observer); + subscriptions.dispose(); } + /** + * 登録ボタンクリック + * + * @param userName + */ public void onClickRegistration(String userName) { if (userName.isEmpty()) { - viewContract.showShortToast("名前を入力して下さい"); + toastMessanger.showToast(new ToastMessage(Sprout.get().getResources().getString(R.string.empty_name), ToastMessage.Length.SHORT)); return; } registrationRepository.registration(userName); + } public ObservableField getEditUserName() { return editUserName; } + + public Observable getToastMessanger() { + return toastMessanger.getObservable(); + } + + public Observable getNavigationMessenger() { + return navigationMessenger.getObservable(); + } } diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index af42757..7e239f9 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -24,4 +24,8 @@ ルーム名 入室 + 名前を入力して下さい + アカウントを作成しました + アカウント作成に失敗しました +