Upgrade to Pro — share decks privately, control downloads, hide ads and more …

지금까지 이런 간단한 Logic 처리는 없었다 이것은 Rx 인가, UI 이벤트인가? 네, RxBinding입니다.

지금까지 이런 간단한 Logic 처리는 없었다 이것은 Rx 인가, UI 이벤트인가? 네, RxBinding입니다.

발표 개요
최근 앱 화면을 보면 한 화면에 다양한 UI 가 존재하며 각 UI에 대하여 복잡한 Logic 이 있습니다. Logic 은 요구 사항에 따라 쉽게 변하거나 복잡해질 수 있으며 복잡한 Logic 을 처리하다 보면 Logic 이 엉키게 되어 유지 보수하기 어렵게 됩니다. 
그러나 RxBinding 라이브러리를 이용할 경우 중복 코드 처리 및 UI 이벤트 조합 등 다양한 방법으로 보다 손쉽게 해당 문제점을 해결할 수 있습니다. 
이 세션에서는 RxBinding 라이브러리의 기본적인 사용 방법뿐만 아니라 실제 프로덕션에 적용해봤던 경험을 바탕으로 다양한 예시를 들어 설명할 예정입니다.

David Ha

April 05, 2019
Tweet

More Decks by David Ha

Other Decks in Programming

Transcript

  1. ࢎਊೞח੉ਬ 3Y+BWBܳࢎਊೞח੉ਬ৬زੌ  *OUVJUJWJUZ ૒ҙࢿ   %FDMBSBUJWJUZ ࢶ঱ࢿ 

     &YQBOEBCJMJUZ ഛ੢ࢿ   $PNQPTBCJMJUZ ࠂ೤ࢿ   $POWFSUJCJMJUZ ߸ചࢿ
  2. ࢎਊೞח੉ਬ ੉ݫੌੑ۱ ࠺޻ߣഐੑ۱WBMJEBUJPO୓௼ loginBtn.setOnClickListener { if (isValidEmail(emailInput.text.toString()) { toastMsg("੿ഛೠ ੉ݫੌਸ

    ੑ۱೧઱ࣁਃ") } else if (isValidPassword(passwordInput.text.toString()) { toastMsg("࠺޻ߣഐח ୭ࣗ 8੗ܻ ੉࢚ 12੗ܻ ޷݅ ੑפ׮.") } else { requestLoginApi() } }
  3. ࢎਊೞח੉ਬ private var callLoginApi: Boolean = false loginBtn.setOnClickListener { if

    (isValidEmail(emailInput.text.toString()) { toastMsg("੿ഛೠ ੉ݫੌਸ ੑ۱೧઱ࣁਃ") } else if (isValidPassword(passwordInput.text.toString()) { toastMsg("࠺޻ߣഐח ୭ࣗ 8੗ܻ ੉࢚ 12੗ܻ ޷݅ ੑפ׮.") } else { callLoginApi = true if (!callLoginApi) requestLoginApi() } } ੉ݫੌੑ۱ ࠺޻ߣഐੑ۱WBMJEBUJPO୓௼
  4. ࢎਊೞח੉ਬ emailInput.addTextChangedListener(object : TextWatcher { override fun afterTextChanged(s: Editable?) {}

    override fun onTextChanged(…) { val isValidEmail = isValidEmail(emailInputStr) val isValidPassword = isValidPassword(passwordInputStr) setLoginBtnState(isValidEmail && isValidPassword) } override fun beforeTextChanged(…) {} }) passwordInput.addTextChangedListener(…) loginBtn.setOnClickListener { … } ੉ݫੌੑ۱ ࠺޻ߣഐੑ۱WBMJEBUJPO୓௼
  5. ࢎਊೞח੉ਬ public interface TextWatcher extends NoCopySpan { public void beforeTextChanged(CharSequence

    s, int start, …, …); public void onTextChanged(CharSequence s, int start, …, …); public void afterTextChanged(Editable s); } 5FYU8BUDIFSJOUFSGBDF о૑ݫࢲ٘ܳҳഅ೧ঠ݅ࢎਊоמ
  6. ࢎਊೞח੉ਬ public interface TextWatcher extends NoCopySpan { public void beforeTextChanged(CharSequence

    s, int start, …, …); public void onTextChanged(CharSequence s, int start, …, …); public void afterTextChanged(Editable s); } 5FYU8BUDIFSJOUFSGBDF о૑ݫࢲ٘ܳҳഅ೧ঠ݅ࢎਊоמ
  7. ࢎਊೞח੉ਬ public interface TextWatcher extends NoCopySpan { public void beforeTextChanged(CharSequence

    s, int start, …, …); public void onTextChanged(CharSequence s, int start, …, …); public void afterTextChanged(Editable s); } 5FYU8BUDIFSJOUFSGBDF о૑ݫࢲ٘ܳҳഅ೧ঠ݅ࢎਊоמ
  8. ࢎਊೞח੉ਬ public class SimpleTextWatcher implements TextWatcher { @Override public void

    beforeTextChanged(CharSequence s, int start, …, …) {} @Override public void onTextChanged(CharSequence s, int start, …, …) {} @Override public void afterTextChanged(Editable s) {} } 4JNQMF5FYU8BUDIFS ࢎਊೞҊर਷ݫࢲ٘݅PWFSSJEFೞৈ೧Ѿ
  9. ࢎਊೞח੉ਬ emailInput.addTextChangedListener(object : SimpleTextWatcher { override fun onTextChanged(…) { val

    isValidEmail = isValidEmail(emailInputStr) val isValidPassword = isValidPassword(passwordInputStr) setLoginBtnState(isValidEmail && isValidPassword) } }) loginBtn.setOnClickListener { … } ੉ݫੌੑ۱ ࠺޻ߣഐੑ۱WBMJEBUJPO୓௼
  10. ࢎਊೞח੉ਬ Observable.merge(emailInput.textChanges(), passwordInput.textChanges(), loginBtn.clicks()) .debounce(300, TimeUnit.MILLISECONDS) .observeOn(AndroidSchedulers.mainThread()) .subscribe { val

    isValidEmail = isValidEmail(emailInput.text.toString()) val isValidPassword = isValidPassword(passwordInput.text.toString()) when (it) { is CharSequence -> setLoginBtnState(isValidEmail && isValidPassword) is Unit -> if (isValidEmail && isValidPassword) requestLoginApi() else toastMsg() } } 3Y#JOEJOHਸ੉ਊೠ੉ݫੌੑ۱ ࠺޻ߣഐੑ۱WBMJEBUJPO୓௼
  11. ࢎਊೞח੉ਬ Observable.merge(emailInput.textChanges(), passwordInput.textChanges(), loginBtn.clicks()) .debounce(300, TimeUnit.MILLISECONDS) .observeOn(AndroidSchedulers.mainThread()) .subscribe { val

    isValidEmail = isValidEmail(emailInput.text.toString()) val isValidPassword = isValidPassword(passwordInput.text.toString()) when (it) { is CharSequence -> setLoginBtnState(isValidEmail && isValidPassword) is Unit -> if (isValidEmail && isValidPassword) requestLoginApi() else toastMsg() } } 3Y#JOEJOHਸ੉ਊೠ੉ݫੌੑ۱ ࠺޻ߣഐੑ۱WBMJEBUJPO୓௼
  12. ࢎਊೞח੉ਬ Observable.merge(emailInput.textChanges(), passwordInput.textChanges(), loginBtn.clicks()) .debounce(300, TimeUnit.MILLISECONDS) .observeOn(AndroidSchedulers.mainThread()) .subscribe { val

    isValidEmail = isValidEmail(emailInput.text.toString()) val isValidPassword = isValidPassword(passwordInput.text.toString()) when (it) { is CharSequence -> setLoginBtnState(isValidEmail && isValidPassword) is Unit -> if (isValidEmail && isValidPassword) requestLoginApi() else toastMsg() } } 3Y#JOEJOHਸ੉ਊೠ੉ݫੌੑ۱ ࠺޻ߣഐੑ۱WBMJEBUJPO୓௼
  13. ࢎਊೞח੉ਬ Observable.merge(emailInput.textChanges(), passwordInput.textChanges(), loginBtn.clicks()) .debounce(300, TimeUnit.MILLISECONDS) .observeOn(AndroidSchedulers.mainThread()) .subscribe { val

    isValidEmail = isValidEmail(emailInput.text.toString()) val isValidPassword = isValidPassword(passwordInput.text.toString()) when (it) { is CharSequence -> setLoginBtnState(isValidEmail && isValidPassword) is Unit -> if (isValidEmail && isValidPassword) requestLoginApi() else toastMsg() } } 3Y#JOEJOHਸ੉ਊೠ੉ݫੌੑ۱ ࠺޻ߣഐੑ۱WBMJEBUJPO୓௼
  14. ࢎਊೞח੉ਬ Observable.merge(emailInput.textChanges(), passwordInput.textChanges(), loginBtn.clicks()) .debounce(300, TimeUnit.MILLISECONDS) .observeOn(AndroidSchedulers.mainThread()) .subscribe { val

    isValidEmail = isValidEmail(emailInput.text.toString()) val isValidPassword = isValidPassword(passwordInput.text.toString()) when (it) { is CharSequence -> setLoginBtnState(isValidEmail && isValidPassword) is Unit -> if (isValidEmail && isValidPassword) requestLoginApi() else toastMsg() } } 3Y#JOEJOHਸ੉ਊೠ੉ݫੌੑ۱ ࠺޻ߣഐੑ۱WBMJEBUJPO୓௼
  15. ࢎਊೞח੉ਬ Observable.merge(emailInput.textChanges(), passwordInput.textChanges(), loginBtn.clicks()) .debounce(300, TimeUnit.MILLISECONDS) .observeOn(AndroidSchedulers.mainThread()) .subscribe { val

    isValidEmail = isValidEmail(emailInput.text.toString()) val isValidPassword = isValidPassword(passwordInput.text.toString()) when (it) { is CharSequence -> setLoginBtnState(isValidEmail && isValidPassword) is Unit -> if (isValidEmail && isValidPassword) requestLoginApi() else toastMsg() } } 3Y#JOEJOHਸ੉ਊೠ੉ݫੌੑ۱ ࠺޻ߣഐੑ۱WBMJEBUJPO୓௼
  16. ࢎਊೞח੉ਬ Observable.merge(emailInput.textChanges(), passwordInput.textChanges(), loginBtn.clicks()) .debounce(300, TimeUnit.MILLISECONDS) .observeOn(AndroidSchedulers.mainThread()) .subscribe { val

    isValidEmail = isValidEmail(emailInput.text.toString()) val isValidPassword = isValidPassword(passwordInput.text.toString()) when (it) { is CharSequence -> setLoginBtnState(isValidEmail && isValidPassword) is Unit -> if (isValidEmail && isValidPassword) requestLoginApi() else toastMsg() } } 3Y#JOEJOHਸ੉ਊೠ੉ݫੌੑ۱ ࠺޻ߣഐੑ۱WBMJEBUJPO୓௼
  17. ࢎਊೞח੉ਬ Observable.merge(emailInput.textChanges(), passwordInput.textChanges(), loginBtn.clicks()) .debounce(300, TimeUnit.MILLISECONDS) .observeOn(AndroidSchedulers.mainThread()) .subscribe { val

    isValidEmail = isValidEmail(emailInput.text.toString()) val isValidPassword = isValidPassword(passwordInput.text.toString()) when (it) { is CharSequence -> setLoginBtnState(isValidEmail && isValidPassword) is Unit -> if (isValidEmail && isValidPassword) requestLoginApi() else toastMsg() } } 3Y#JOEJOHਸ੉ਊೠ੉ݫੌੑ۱ ࠺޻ߣഐੑ۱WBMJEBUJPO୓௼
  18. ࢎਊೞח੉ਬ Observable.merge(emailInput.textChanges(), passwordInput.textChanges(), loginBtn.clicks()) .debounce(300, TimeUnit.MILLISECONDS) .observeOn(AndroidSchedulers.mainThread()) .subscribe { val

    isValidEmail = isValidEmail(emailInput.text.toString()) val isValidPassword = isValidPassword(passwordInput.text.toString()) when (it) { is CharSequence -> setLoginBtnState(isValidEmail && isValidPassword) is Unit -> if (isValidEmail && isValidPassword) requestLoginApi() else toastMsg() } } 3Y#JOEJOHਸ੉ਊೠ੉ݫੌੑ۱ ࠺޻ߣഐੑ۱WBMJEBUJPO୓௼
  19. ࢎਊೞח੉ਬ Observable.merge(emailInput.textChanges(), passwordInput.textChanges(), loginBtn.clicks()) .debounce(300, TimeUnit.MILLISECONDS) .observeOn(AndroidSchedulers.mainThread()) .subscribe { val

    isValidEmail = isValidEmail(emailInput.text.toString()) val isValidPassword = isValidPassword(passwordInput.text.toString()) when (it) { is CharSequence -> setLoginBtnState(isValidEmail && isValidPassword) is Unit -> if (isValidEmail && isValidPassword) requestLoginApi() else toastMsg() } } 3Y#JOEJOHਸ੉ਊೠ੉ݫੌੑ۱ ࠺޻ߣഐੑ۱WBMJEBUJPO୓௼
  20. ࢎਊೞח੉ਬ Observable.merge(emailInput.textChanges(), passwordInput.textChanges(), loginBtn.clicks()) .debounce(300, TimeUnit.MILLISECONDS) .observeOn(AndroidSchedulers.mainThread()) .subscribe { val

    isValidEmail = isValidEmail(emailInput.text.toString()) val isValidPassword = isValidPassword(passwordInput.text.toString()) when (it) { is CharSequence -> setLoginBtnState(isValidEmail && isValidPassword) is Unit -> if (isValidEmail && isValidPassword) requestLoginApi() else toastMsg() } } 3Y#JOEJOHਸ੉ਊೠ੉ݫੌੑ۱ ࠺޻ߣഐੑ۱WBMJEBUJPO୓௼
  21. ੘زਗܻ @CheckResult @NonNull public static Observable<Object> clicks(@NonNull View view) {

    checkNotNull(view, "view == null"); return new ViewClickObservable(view); } 3Y#JOEJOHDMJDLTNFUIPE 0CTFSWBCMFܳ૒੽࢚ࣘೠ7JFX$MJDL0CTFSWBCMF
  22. ੘زਗܻ @Override protected void subscribeActual(Observer<? super Object> observer) { if

    (!checkMainThread(observer)) { return; } Listener listener = new Listener(view, observer); observer.onSubscribe(listener); view.setOnClickListener(listener); } 3Y#JOEJOH7JFX$MJDL0CTFSWBCMFDMBTT
  23. ੘زਗܻ @Override protected void subscribeActual(Observer<? super Object> observer) { if

    (!checkMainThread(observer)) { return; } Listener listener = new Listener(view, observer); observer.onSubscribe(listener); view.setOnClickListener(listener); } 3Y#JOEJOH7JFX$MJDL0CTFSWBCMFDMBTT
  24. ੘زਗܻ @Override protected void subscribeActual(Observer<? super Object> observer) { if

    (!checkMainThread(observer)) { return; } Listener listener = new Listener(view, observer); observer.onSubscribe(listener); view.setOnClickListener(listener); } 3Y#JOEJOH7JFX$MJDL0CTFSWBCMFDMBTT
  25. ੘زਗܻ @Override protected void subscribeActual(Observer<? super Object> observer) { if

    (!checkMainThread(observer)) { return; } Listener listener = new Listener(view, observer); observer.onSubscribe(listener); view.setOnClickListener(listener); } 3Y#JOEJOH7JFX$MJDL0CTFSWBCMFDMBTT
  26. ੘زਗܻ @Override protected void subscribeActual(Observer<? super Object> observer) { if

    (!checkMainThread(observer)) { return; } Listener listener = new Listener(view, observer); observer.onSubscribe(listener); view.setOnClickListener(listener); } 3Y#JOEJOH7JFX$MJDL0CTFSWBCMFDMBTT
  27. ੘زਗܻ @Override protected void subscribeActual(Observer<? super Object> observer) { if

    (!checkMainThread(observer)) { return; } Listener listener = new Listener(view, observer); observer.onSubscribe(listener); view.setOnClickListener(listener); } 3Y#JOEJOH7JFX$MJDL0CTFSWBCMFDMBTT
  28. ੘زਗܻ @Override protected void subscribeActual(Observer<? super Object> observer) { if

    (!checkMainThread(observer)) { return; } Listener listener = new Listener(view, observer); observer.onSubscribe(listener); view.setOnClickListener(listener); } 3Y#JOEJOH7JFX$MJDL0CTFSWBCMFDMBTT
  29. ੘زਗܻ static final class Listener extends MainThreadDisposable implements OnClickListener {

    private final View view; private final Observer<? super Object> observer; Listener(View view, Observer<? super Object> observer) { this.view = view; this.observer = observer; } @Override public void onClick(View v) { if (!isDisposed()) { observer.onNext(Notification.INSTANCE); } } @Override protected void onDispose() { view.setOnClickListener(null); } } 3Y#JOEJOH7JFX$MJDL0CTFSWBCMFDMBTT
  30. ੘زਗܻ static final class Listener extends MainThreadDisposable implements OnClickListener {

    private final View view; private final Observer<? super Object> observer; Listener(View view, Observer<? super Object> observer) { this.view = view; this.observer = observer; } @Override public void onClick(View v) { if (!isDisposed()) { observer.onNext(Notification.INSTANCE); } } @Override protected void onDispose() { view.setOnClickListener(null); } } 3Y#JOEJOH7JFX$MJDL0CTFSWBCMFDMBTT
  31. ੘زਗܻ static final class Listener extends MainThreadDisposable implements OnClickListener {

    private final View view; private final Observer<? super Object> observer; Listener(View view, Observer<? super Object> observer) { this.view = view; this.observer = observer; } @Override public void onClick(View v) { if (!isDisposed()) { observer.onNext(Notification.INSTANCE); } } @Override protected void onDispose() { view.setOnClickListener(null); } } 3Y#JOEJOH7JFX$MJDL0CTFSWBCMFDMBTT
  32. ੘زਗܻ static final class Listener extends MainThreadDisposable implements OnClickListener {

    private final View view; private final Observer<? super Object> observer; Listener(View view, Observer<? super Object> observer) { this.view = view; this.observer = observer; } @Override public void onClick(View v) { if (!isDisposed()) { observer.onNext(Notification.INSTANCE); } } @Override protected void onDispose() { view.setOnClickListener(null); } } 3Y#JOEJOH7JFX$MJDL0CTFSWBCMFDMBTT
  33. ੘زਗܻ static final class Listener extends MainThreadDisposable implements OnClickListener {

    private final View view; private final Observer<? super Object> observer; Listener(View view, Observer<? super Object> observer) { this.view = view; this.observer = observer; } @Override public void onClick(View v) { if (!isDisposed()) { observer.onNext(Notification.INSTANCE); } } @Override protected void onDispose() { view.setOnClickListener(null); } } 3Y#JOEJOH7JFX$MJDL0CTFSWBCMFDMBTT
  34. ੘زਗܻ static final class Listener extends MainThreadDisposable implements OnClickListener {

    private final View view; private final Observer<? super Object> observer; Listener(View view, Observer<? super Object> observer) { this.view = view; this.observer = observer; } @Override public void onClick(View v) { if (!isDisposed()) { observer.onNext(Notification.INSTANCE); } } @Override protected void onDispose() { view.setOnClickListener(null); } } 3Y#JOEJOH7JFX$MJDL0CTFSWBCMFDMBTT
  35. ੘زਗܻ static final class Listener extends MainThreadDisposable implements OnClickListener {

    private final View view; private final Observer<? super Object> observer; Listener(View view, Observer<? super Object> observer) { this.view = view; this.observer = observer; } @Override public void onClick(View v) { if (!isDisposed()) { observer.onNext(Notification.INSTANCE); } } @Override protected void onDispose() { view.setOnClickListener(null); } } 3Y#JOEJOH7JFX$MJDL0CTFSWBCMFDMBTT
  36. ੘زਗܻ static final class Listener extends MainThreadDisposable implements OnClickListener {

    private final View view; private final Observer<? super Object> observer; Listener(View view, Observer<? super Object> observer) { this.view = view; this.observer = observer; } @Override public void onClick(View v) { if (!isDisposed()) { observer.onNext(Notification.INSTANCE); } } @Override protected void onDispose() { view.setOnClickListener(null); } } 3Y#JOEJOH7JFX$MJDL0CTFSWBCMFDMBTT
  37. ੘زਗܻ static final class Listener extends MainThreadDisposable implements OnClickListener {

    private final View view; private final Observer<? super Object> observer; Listener(View view, Observer<? super Object> observer) { this.view = view; this.observer = observer; } @Override public void onClick(View v) { if (!isDisposed()) { observer.onNext(Notification.INSTANCE); } } @Override protected void onDispose() { view.setOnClickListener(null); } } 3Y#JOEJOH7JFX$MJDL0CTFSWBCMFDMBTT
  38. प੸ਊࢎ۹ public static InitialValueObservable<CharSequence> textChanges(@NonNull TextView view) { checkNotNull(view, "view

    == null"); return new TextViewTextObservable(view); } 3Y5FYU7JFXUFYU$IBOHFT ೧׼ݫࢲ٘ܳҳةೞݶUFYUо߸ೡٸ݃׮0CTFSWFSীѱ੉߮౟ܳֈѹષ
  39. प੸ਊࢎ۹ // ോ؀ಪ Ҵо௏٘ override fun getPhoneCountryCodeChanges(): Observable<CharSequence> { return

    phoneCountryCodeInput.textChanges() } // ോ؀ಪ ߣഐ override fun getPhoneNumChanges(): Observable<CharSequence> { return phoneNumInput.textChanges() } 7JFX "DUJWJUZ 1SFTFOUFSীࢲҳةೞӝਤೞৈ7JFX "DUJWJUZ ীࢲࢶ঱
  40. प੸ਊࢎ۹ // п View ࢚కٜਸ ҳة protected open fun subscribeViewState()

    { // Ҵо௏٘ val phoneCountryCodeChanges = view.getPhoneCountryCodeChanges().share() subscribePhoneCountryCodeChanges(phoneCountryCodeChanges) val phoneNumChanges = view.getPhoneNumChanges() // Ҵо௏٘ ߂ ߣഐ val phoneDataChanges = Observable.merge(phoneCountryCodeChanges, phoneNumChanges) subscribePhoneDataChanges(phoneDataChanges) } 1SFTFOUFS
  41. प੸ਊࢎ۹ // п View ࢚కٜਸ ҳة protected open fun subscribeViewState()

    { // Ҵо௏٘ val phoneCountryCodeChanges = view.getPhoneCountryCodeChanges().share() subscribePhoneCountryCodeChanges(phoneCountryCodeChanges) val phoneNumChanges = view.getPhoneNumChanges() // Ҵо௏٘ ߂ ߣഐ val phoneDataChanges = Observable.merge(phoneCountryCodeChanges, phoneNumChanges) subscribePhoneDataChanges(phoneDataChanges) } 1SFTFOUFS
  42. प੸ਊࢎ۹ // п View ࢚కٜਸ ҳة protected open fun subscribeViewState()

    { // Ҵо௏٘ val phoneCountryCodeChanges = view.getPhoneCountryCodeChanges().share() subscribePhoneCountryCodeChanges(phoneCountryCodeChanges) val phoneNumChanges = view.getPhoneNumChanges() // Ҵо௏٘ ߂ ߣഐ val phoneDataChanges = Observable.merge(phoneCountryCodeChanges, phoneNumChanges) subscribePhoneDataChanges(phoneDataChanges) } 1SFTFOUFS
  43. प੸ਊࢎ۹ // п View ࢚కٜਸ ҳة protected open fun subscribeViewState()

    { // Ҵо௏٘ val phoneCountryCodeChanges = view.getPhoneCountryCodeChanges().share() subscribePhoneCountryCodeChanges(phoneCountryCodeChanges) val phoneNumChanges = view.getPhoneNumChanges() // Ҵо௏٘ ߂ ߣഐ val phoneDataChanges = Observable.merge(phoneCountryCodeChanges, phoneNumChanges) subscribePhoneDataChanges(phoneDataChanges) } 1SFTFOUFS
  44. प੸ਊࢎ۹ // п View ࢚కٜਸ ҳة protected open fun subscribeViewState()

    { // Ҵо௏٘ val phoneCountryCodeChanges = view.getPhoneCountryCodeChanges().share() subscribePhoneCountryCodeChanges(phoneCountryCodeChanges) val phoneNumChanges = view.getPhoneNumChanges() // Ҵо௏٘ ߂ ߣഐ val phoneDataChanges = Observable.merge(phoneCountryCodeChanges, phoneNumChanges) subscribePhoneDataChanges(phoneDataChanges) } 1SFTFOUFS
  45. प੸ਊࢎ۹ // п View ࢚కٜਸ ҳة protected open fun subscribeViewState()

    { // Ҵо௏٘ val phoneCountryCodeChanges = view.getPhoneCountryCodeChanges().share() subscribePhoneCountryCodeChanges(phoneCountryCodeChanges) val phoneNumChanges = view.getPhoneNumChanges() // Ҵо௏٘ ߂ ߣഐ val phoneDataChanges = Observable.merge(phoneCountryCodeChanges, phoneNumChanges) subscribePhoneDataChanges(phoneDataChanges) } 1SFTFOUFS
  46. प੸ਊࢎ۹ // п View ࢚కٜਸ ҳة protected open fun subscribeViewState()

    { // Ҵо௏٘ val phoneCountryCodeChanges = view.getPhoneCountryCodeChanges().share() subscribePhoneCountryCodeChanges(phoneCountryCodeChanges) val phoneNumChanges = view.getPhoneNumChanges() // Ҵо௏٘ ߂ ߣഐ val phoneDataChanges = Observable.merge(phoneCountryCodeChanges, phoneNumChanges) subscribePhoneDataChanges(phoneDataChanges) } 1SFTFOUFS
  47. प੸ਊࢎ۹ // ോ؀ಪ Ҵо௏٘ ؘ੉ఠ ߸ೣਸ ҳة protected open fun

    subscribePhoneCountryCodeChanges(phoneCountryCodeChanges: Observable<CharSequence>) { compositeDisposable.add(phoneCountryCodeChanges .subscribe { view.clearPhoneNumInput() }) } // ോ؀ಪ ੑ۱ହ ߂ Ҵо௏٘ ؘ੉ఠ ߸ೣਸ ҳة protected open fun subscribePhoneDataChanges(phoneDataChanges: Observable<CharSequence>) { compositeDisposable.add(phoneDataChanges.subscribe { view.clearPassCodeInput() view.setPassCodeLayoutVisibility(View.GONE) }) } 1SFTFOUFS
  48. प੸ਊࢎ۹ // ോ؀ಪ Ҵо௏٘ ؘ੉ఠ ߸ೣਸ ҳة protected open fun

    subscribePhoneCountryCodeChanges(phoneCountryCodeChanges: Observable<CharSequence>) { compositeDisposable.add(phoneCountryCodeChanges .subscribe { view.clearPhoneNumInput() }) } // ോ؀ಪ ੑ۱ହ ߂ Ҵо௏٘ ؘ੉ఠ ߸ೣਸ ҳة protected open fun subscribePhoneDataChanges(phoneDataChanges: Observable<CharSequence>) { compositeDisposable.add(phoneDataChanges.subscribe { view.clearPassCodeInput() view.setPassCodeLayoutVisibility(View.GONE) }) } 1SFTFOUFS
  49. प੸ਊࢎ۹ // ോ؀ಪ Ҵо௏٘ ؘ੉ఠ ߸ೣਸ ҳة protected open fun

    subscribePhoneCountryCodeChanges(phoneCountryCodeChanges: Observable<CharSequence>) { compositeDisposable.add(phoneCountryCodeChanges .subscribe { view.clearPhoneNumInput() }) } // ോ؀ಪ ੑ۱ହ ߂ Ҵо௏٘ ؘ੉ఠ ߸ೣਸ ҳة protected open fun subscribePhoneDataChanges(phoneDataChanges: Observable<CharSequence>) { compositeDisposable.add(phoneDataChanges.subscribe { view.clearPassCodeInput() view.setPassCodeLayoutVisibility(View.GONE) }) } 1SFTFOUFS
  50. प੸ਊࢎ۹ // ോ؀ಪ Ҵо௏٘ ؘ੉ఠ ߸ೣਸ ҳة protected open fun

    subscribePhoneCountryCodeChanges(phoneCountryCodeChanges: Observable<CharSequence>) { compositeDisposable.add(phoneCountryCodeChanges .subscribe { view.clearPhoneNumInput() }) } // ോ؀ಪ ੑ۱ହ ߂ Ҵо௏٘ ؘ੉ఠ ߸ೣਸ ҳة protected open fun subscribePhoneDataChanges(phoneDataChanges: Observable<CharSequence>) { compositeDisposable.add(phoneDataChanges.subscribe { view.clearPassCodeInput() view.setPassCodeLayoutVisibility(View.GONE) }) } 1SFTFOUFS
  51. प੸ਊࢎ۹ // ോ؀ಪ Ҵо௏٘ ؘ੉ఠ ߸ೣਸ ҳة protected open fun

    subscribePhoneCountryCodeChanges(phoneCountryCodeChanges: Observable<CharSequence>) { compositeDisposable.add(phoneCountryCodeChanges .subscribe { view.clearPhoneNumInput() }) } // ോ؀ಪ ੑ۱ହ ߂ Ҵо௏٘ ؘ੉ఠ ߸ೣਸ ҳة protected open fun subscribePhoneDataChanges(phoneDataChanges: Observable<CharSequence>) { compositeDisposable.add(phoneDataChanges.subscribe { view.clearPassCodeInput() view.setPassCodeLayoutVisibility(View.GONE) }) } 1SFTFOUFS
  52. प੸ਊࢎ۹ // ࠄੋ ੋૐ੉ ⪟ਸ ҃਋ true (੉ܴ, ോ؀ಪ Ҵо௏٘,

    ോ؀ಪ ߣഐ) private val certifiedChanges = PublishSubject.create<Boolean>() // ࢎਊ੗ ੹ചߣഐ ࣻ੿ API private fun putMemberPhoneInfoApi(...) { Api.subscribe { setCertifiedMemberLayout(true)} } // ࠄੋ ੋૐ ৈࠗী ٮܲ ۨ੉ইਓ private fun setCertifiedMemberLayout(isCertified: Boolean) { if (isCertified) stopCertificationTimer() certifiedChanges.onNext(isCertified) view.setNameEnabled(!isCertified) ... } 1SFTFOUFS
  53. प੸ਊࢎ۹ // ࠄੋ ੋૐ੉ ⪟ਸ ҃਋ true (੉ܴ, ോ؀ಪ Ҵо௏٘,

    ോ؀ಪ ߣഐ) private val certifiedChanges = PublishSubject.create<Boolean>() // ࢎਊ੗ ੹ചߣഐ ࣻ੿ API private fun putMemberPhoneInfoApi(...) { Api.subscribe { setCertifiedMemberLayout(true)} } // ࠄੋ ੋૐ ৈࠗী ٮܲ ۨ੉ইਓ private fun setCertifiedMemberLayout(isCertified: Boolean) { if (isCertified) stopCertificationTimer() certifiedChanges.onNext(isCertified) view.setNameEnabled(!isCertified) ... } 1SFTFOUFS
  54. प੸ਊࢎ۹ // ࠄੋ ੋૐ੉ ⪟ਸ ҃਋ true (੉ܴ, ോ؀ಪ Ҵо௏٘,

    ോ؀ಪ ߣഐ) private val certifiedChanges = PublishSubject.create<Boolean>() // ࢎਊ੗ ੹ചߣഐ ࣻ੿ API private fun putMemberPhoneInfoApi(...) { Api.subscribe { setCertifiedMemberLayout(true)} } // ࠄੋ ੋૐ ৈࠗী ٮܲ ۨ੉ইਓ private fun setCertifiedMemberLayout(isCertified: Boolean) { if (isCertified) stopCertificationTimer() certifiedChanges.onNext(isCertified) view.setNameEnabled(!isCertified) ... } 1SFTFOUFS
  55. प੸ਊࢎ۹ // ࠄੋ ੋૐ੉ ⪟ਸ ҃਋ true (੉ܴ, ോ؀ಪ Ҵо௏٘,

    ോ؀ಪ ߣഐ) private val certifiedChanges = PublishSubject.create<Boolean>() // ࢎਊ੗ ੹ചߣഐ ࣻ੿ API private fun putMemberPhoneInfoApi(...) { Api.subscribe { setCertifiedMemberLayout(true)} } // ࠄੋ ੋૐ ৈࠗী ٮܲ ۨ੉ইਓ private fun setCertifiedMemberLayout(isCertified: Boolean) { if (isCertified) stopCertificationTimer() certifiedChanges.onNext(isCertified) view.setNameEnabled(!isCertified) ... } 1SFTFOUFS
  56. प੸ਊࢎ۹ override fun subscribeViewState() { // sns ੋૐ val snsDataChanges

    = Observable.merge(kakaoIdBtnClicks, lineIdBtnClicks, snsIdChanges) // োۅ߉ਸ दр؀ val anyTimeBtnClicks = view.getAnyTimeBtnClicks() val tenToTwelveBtnClicks = view.getTenToTwelveBtnClicks() val twelveToFifteenBtnClicks = view.getTwelveToFifteenBtnClicks() val fifteenToNineteenBtnClicks = view.getFifteenToNineteenBtnClicks() val callTimeBtnStateChanges = Observable.merge(anyTimeBtnClicks, tenToTwelveBtnClicks, twelveToFifteenBtnClicks, fifteenToNineteenBtnClicks) subscribeDataChanges(certifiedChanges, snsDataChanges, callTimeBtnStateChanges) } 1SFTFOUFS
  57. प੸ਊࢎ۹ override fun subscribeViewState() { // sns ੋૐ val snsDataChanges

    = Observable.merge(kakaoIdBtnClicks, lineIdBtnClicks, snsIdChanges) // োۅ߉ਸ दр؀ val anyTimeBtnClicks = view.getAnyTimeBtnClicks() val tenToTwelveBtnClicks = view.getTenToTwelveBtnClicks() val twelveToFifteenBtnClicks = view.getTwelveToFifteenBtnClicks() val fifteenToNineteenBtnClicks = view.getFifteenToNineteenBtnClicks() val callTimeBtnStateChanges = Observable.merge(anyTimeBtnClicks, tenToTwelveBtnClicks, twelveToFifteenBtnClicks, fifteenToNineteenBtnClicks) subscribeDataChanges(certifiedChanges, snsDataChanges, callTimeBtnStateChanges) } 1SFTFOUFS
  58. प੸ਊࢎ۹ override fun subscribeViewState() { // sns ੋૐ val snsDataChanges

    = Observable.merge(kakaoIdBtnClicks, lineIdBtnClicks, snsIdChanges) // োۅ߉ਸ दр؀ val anyTimeBtnClicks = view.getAnyTimeBtnClicks() val tenToTwelveBtnClicks = view.getTenToTwelveBtnClicks() val twelveToFifteenBtnClicks = view.getTwelveToFifteenBtnClicks() val fifteenToNineteenBtnClicks = view.getFifteenToNineteenBtnClicks() val callTimeBtnStateChanges = Observable.merge(anyTimeBtnClicks, tenToTwelveBtnClicks, twelveToFifteenBtnClicks, fifteenToNineteenBtnClicks) subscribeDataChanges(certifiedChanges, snsDataChanges, callTimeBtnStateChanges) } 1SFTFOUFS
  59. प੸ਊࢎ۹ override fun subscribeViewState() { // sns ੋૐ val snsDataChanges

    = Observable.merge(kakaoIdBtnClicks, lineIdBtnClicks, snsIdChanges) // োۅ߉ਸ दр؀ val anyTimeBtnClicks = view.getAnyTimeBtnClicks() val tenToTwelveBtnClicks = view.getTenToTwelveBtnClicks() val twelveToFifteenBtnClicks = view.getTwelveToFifteenBtnClicks() val fifteenToNineteenBtnClicks = view.getFifteenToNineteenBtnClicks() val callTimeBtnStateChanges = Observable.merge(anyTimeBtnClicks, tenToTwelveBtnClicks, twelveToFifteenBtnClicks, fifteenToNineteenBtnClicks) subscribeDataChanges(certifiedChanges, snsDataChanges, callTimeBtnStateChanges) } 1SFTFOUFS
  60. प੸ਊࢎ۹ override fun subscribeViewState() { // sns ੋૐ val snsDataChanges

    = Observable.merge(kakaoIdBtnClicks, lineIdBtnClicks, snsIdChanges) // োۅ߉ਸ दр؀ val anyTimeBtnClicks = view.getAnyTimeBtnClicks() val tenToTwelveBtnClicks = view.getTenToTwelveBtnClicks() val twelveToFifteenBtnClicks = view.getTwelveToFifteenBtnClicks() val fifteenToNineteenBtnClicks = view.getFifteenToNineteenBtnClicks() val callTimeBtnStateChanges = Observable.merge(anyTimeBtnClicks, tenToTwelveBtnClicks, twelveToFifteenBtnClicks, fifteenToNineteenBtnClicks) subscribeDataChanges(certifiedChanges, snsDataChanges, callTimeBtnStateChanges) } 1SFTFOUFS
  61. प੸ਊࢎ۹ override fun subscribeViewState() { // sns ੋૐ val snsDataChanges

    = Observable.merge(kakaoIdBtnClicks, lineIdBtnClicks, snsIdChanges) // োۅ߉ਸ दр؀ val anyTimeBtnClicks = view.getAnyTimeBtnClicks() val tenToTwelveBtnClicks = view.getTenToTwelveBtnClicks() val twelveToFifteenBtnClicks = view.getTwelveToFifteenBtnClicks() val fifteenToNineteenBtnClicks = view.getFifteenToNineteenBtnClicks() val callTimeBtnStateChanges = Observable.merge(anyTimeBtnClicks, tenToTwelveBtnClicks, twelveToFifteenBtnClicks, fifteenToNineteenBtnClicks) subscribeDataChanges(certifiedChanges, snsDataChanges, callTimeBtnStateChanges) } 1SFTFOUFS
  62. प੸ਊࢎ۹ override fun subscribeViewState() { // sns ੋૐ val snsDataChanges

    = Observable.merge(kakaoIdBtnClicks, lineIdBtnClicks, snsIdChanges) // োۅ߉ਸ दр؀ val anyTimeBtnClicks = view.getAnyTimeBtnClicks() val tenToTwelveBtnClicks = view.getTenToTwelveBtnClicks() val twelveToFifteenBtnClicks = view.getTwelveToFifteenBtnClicks() val fifteenToNineteenBtnClicks = view.getFifteenToNineteenBtnClicks() val callTimeBtnStateChanges = Observable.merge(anyTimeBtnClicks, tenToTwelveBtnClicks, twelveToFifteenBtnClicks, fifteenToNineteenBtnClicks) subscribeDataChanges(certifiedChanges, snsDataChanges, callTimeBtnStateChanges) } 1SFTFOUFS
  63. प੸ਊࢎ۹ override fun subscribeViewState() { // sns ੋૐ val snsDataChanges

    = Observable.merge(kakaoIdBtnClicks, lineIdBtnClicks, snsIdChanges) // োۅ߉ਸ दр؀ val anyTimeBtnClicks = view.getAnyTimeBtnClicks() val tenToTwelveBtnClicks = view.getTenToTwelveBtnClicks() val twelveToFifteenBtnClicks = view.getTwelveToFifteenBtnClicks() val fifteenToNineteenBtnClicks = view.getFifteenToNineteenBtnClicks() val callTimeBtnStateChanges = Observable.merge(anyTimeBtnClicks, tenToTwelveBtnClicks, twelveToFifteenBtnClicks, fifteenToNineteenBtnClicks) subscribeDataChanges(certifiedChanges, snsDataChanges, callTimeBtnStateChanges) } 1SFTFOUFS
  64. प੸ਊࢎ۹ override fun subscribeViewState() { // sns ੋૐ val snsDataChanges

    = Observable.merge(kakaoIdBtnClicks, lineIdBtnClicks, snsIdChanges) // োۅ߉ਸ दр؀ val anyTimeBtnClicks = view.getAnyTimeBtnClicks() val tenToTwelveBtnClicks = view.getTenToTwelveBtnClicks() val twelveToFifteenBtnClicks = view.getTwelveToFifteenBtnClicks() val fifteenToNineteenBtnClicks = view.getFifteenToNineteenBtnClicks() val callTimeBtnStateChanges = Observable.merge(anyTimeBtnClicks, tenToTwelveBtnClicks, twelveToFifteenBtnClicks, fifteenToNineteenBtnClicks) subscribeDataChanges(certifiedChanges, snsDataChanges, callTimeBtnStateChanges) } 1SFTFOUFS
  65. प੸ਊࢎ۹ // ࠄੋੋૐ ࢚క, sns ই੉٣, োۅ߉ਸ दр؀ ؘ੉ఠо ߸ೣਸ

    ҳة private fun subscribeDataChanges(certifiedChanges: Observable<Boolean>, snsDataChanges: Observable<CharSequence>, callTimeBtnStateChanges: Observable<String>) { Observable.merge(certifiedChanges, snsDataChanges, callTimeBtnStateChanges) .subscribe { view.setConsultBtnState(isConsultBtnEnable()) }) } 1SFTFOUFS ࠄੋੋૐ࢚క߸ೣDFSUJGJFE$IBOHFT 4/4ؘ੉ఠ߸ೣTOT%BUB$IBOHFT োۅ߉ਸदр؀ؘ੉ఠ߸ೣDBMM5JNF#UO4UBUF$IBOHFT
  66. प੸ਊࢎ۹ // ࠄੋੋૐ ࢚క, sns ই੉٣, োۅ߉ਸ दр؀ ؘ੉ఠо ߸ೣਸ

    ҳة private fun subscribeDataChanges(certifiedChanges: Observable<Boolean>, snsDataChanges: Observable<CharSequence>, callTimeBtnStateChanges: Observable<String>) { Observable.merge(certifiedChanges, snsDataChanges, callTimeBtnStateChanges) .subscribe { view.setConsultBtnState(isConsultBtnEnable()) }) } 1SFTFOUFS ࠄੋੋૐ࢚క߸ೣDFSUJGJFE$IBOHFT 4/4ؘ੉ఠ߸ೣTOT%BUB$IBOHFT োۅ߉ਸदр؀ؘ੉ఠ߸ೣDBMM5JNF#UO4UBUF$IBOHFT
  67. ઱੄೧ঠೡ੼ /** * Create an observable which emits on {@code

    view} click events. The emitted value is * unspecified and should only be used as notification. * Warning: The created observable keeps a strong reference to {@code view}. Unsubscribe * to free this reference. * Warning: The created observable uses {@link View#setOnClickListener} to observe * clicks. Only one observable can be used for a view at a time. */ @CheckResult @NonNull public static Observable<Object> clicks(@NonNull View view) { checkNotNull(view, "view == null"); return new ViewClickObservable(view); } 3Y7JFXKBWB  ࢤࢿػ0CTFSWBCMF਷WJFXী؀೧ъ۱ೠଵઑܳೞҊ੓਺  ೠߣীೞա੄0CTFSWBCMF݅WJFXীࢎਊೡࣻ੓਺
  68. ઱੄೧ঠೡ੼ /** * Create an observable which emits on {@code

    view} click events. The emitted value is * unspecified and should only be used as notification. * Warning: The created observable keeps a strong reference to {@code view}. Unsubscribe * to free this reference. * Warning: The created observable uses {@link View#setOnClickListener} to observe * clicks. Only one observable can be used for a view at a time. */ @CheckResult @NonNull public static Observable<Object> clicks(@NonNull View view) { checkNotNull(view, "view == null"); return new ViewClickObservable(view); } 3Y7JFXKBWB  ࢤࢿػ0CTFSWBCMF਷WJFXী؀೧ъ۱ೠଵઑܳೞҊ੓਺  ೠߣীೞա੄0CTFSWBCMF݅WJFXীࢎਊೡࣻ੓਺
  69. ઱੄೧ঠೡ੼ /** * Create an observable which emits on {@code

    view} click events. The emitted value is * unspecified and should only be used as notification. * Warning: The created observable keeps a strong reference to {@code view}. Unsubscribe * to free this reference. * Warning: The created observable uses {@link View#setOnClickListener} to observe * clicks. Only one observable can be used for a view at a time. */ @CheckResult @NonNull public static Observable<Object> clicks(@NonNull View view) { checkNotNull(view, "view == null"); return new ViewClickObservable(view); } 3Y7JFXKBWB  ࢤࢿػ0CTFSWBCMF਷WJFXী؀೧ъ۱ೠଵઑܳೞҊ੓਺  ೠߣীೞա੄0CTFSWBCMF݅WJFXীࢎਊೡࣻ੓਺
  70. ઱੄೧ঠೡ੼ /** * Create an observable which emits on {@code

    view} click events. The emitted value is * unspecified and should only be used as notification. * Warning: The created observable keeps a strong reference to {@code view}. Unsubscribe * to free this reference. * Warning: The created observable uses {@link View#setOnClickListener} to observe * clicks. Only one observable can be used for a view at a time. */ @CheckResult @NonNull public static Observable<Object> clicks(@NonNull View view) { checkNotNull(view, "view == null"); return new ViewClickObservable(view); } 3Y7JFXKBWB  ࢤࢿػ0CTFSWBCMF਷WJFXী؀೧ъ۱ೠଵઑܳೞҊ੓਺  ೠߣীೞա੄0CTFSWBCMF݅WJFXীࢎਊೡࣻ੓਺
  71. ઱੄೧ঠೡ੼ /** * Create an observable which emits on {@code

    view} click events. The emitted value is * unspecified and should only be used as notification. * Warning: The created observable keeps a strong reference to {@code view}. Unsubscribe * to free this reference. * Warning: The created observable uses {@link View#setOnClickListener} to observe * clicks. Only one observable can be used for a view at a time. */ @CheckResult @NonNull public static Observable<Object> clicks(@NonNull View view) { checkNotNull(view, "view == null"); return new ViewClickObservable(view); } 3Y7JFXKBWB  ࢤࢿػ0CTFSWBCMF਷WJFXী؀೧ъ۱ೠଵઑܳೞҊ੓਺  ೠߣীೞա੄0CTFSWBCMF݅WJFXীࢎਊೡࣻ੓਺
  72. ઱੄೧ঠೡ੼ // п View ࢚కٜਸ ҳة protected open fun subscribeViewState()

    { // Ҵо௏٘ val phoneCountryCodeChanges = view.getPhoneCountryCodeChanges().share() subscribePhoneCountryCodeChanges(phoneCountryCodeChanges) val phoneNumChanges = view.getPhoneNumChanges() // Ҵо௏٘ ߂ ߣഐ val phoneDataChanges = Observable.merge(phoneCountryCodeChanges, phoneNumChanges) subscribePhoneDataChanges(phoneDataChanges) } 1SFTFOUFS ೠߣীೞա੄0CTFSWBCMF݅WJFXীࢎਊೡࣻ੓ਵ޲۽
 ҕਬܳೞҊरਸ҃਋TIBSFPQFSBUPSܳഝਊೞݶؽ
  73. ઱੄೧ঠೡ੼ // п View ࢚కٜਸ ҳة protected open fun subscribeViewState()

    { // Ҵо௏٘ val phoneCountryCodeChanges = view.getPhoneCountryCodeChanges().share() subscribePhoneCountryCodeChanges(phoneCountryCodeChanges) val phoneNumChanges = view.getPhoneNumChanges() // Ҵо௏٘ ߂ ߣഐ val phoneDataChanges = Observable.merge(phoneCountryCodeChanges, phoneNumChanges) subscribePhoneDataChanges(phoneDataChanges) } 1SFTFOUFS ೠߣীೞա੄0CTFSWBCMF݅WJFXীࢎਊೡࣻ੓ਵ޲۽
 ҕਬܳೞҊरਸ҃਋TIBSFPQFSBUPSܳഝਊೞݶؽ
  74. ઱੄೧ঠೡ੼ // п View ࢚కٜਸ ҳة protected open fun subscribeViewState()

    { // Ҵо௏٘ val phoneCountryCodeChanges = view.getPhoneCountryCodeChanges().share() subscribePhoneCountryCodeChanges(phoneCountryCodeChanges) val phoneNumChanges = view.getPhoneNumChanges() // Ҵо௏٘ ߂ ߣഐ val phoneDataChanges = Observable.merge(phoneCountryCodeChanges, phoneNumChanges) subscribePhoneDataChanges(phoneDataChanges) } 1SFTFOUFS ೠߣীೞա੄0CTFSWBCMF݅WJFXীࢎਊೡࣻ੓ਵ޲۽
 ҕਬܳೞҊरਸ҃਋TIBSFPQFSBUPSܳഝਊೞݶؽ
  75. ઱੄೧ঠೡ੼ // п View ࢚కٜਸ ҳة protected open fun subscribeViewState()

    { // Ҵо௏٘ val phoneCountryCodeChanges = view.getPhoneCountryCodeChanges().share() subscribePhoneCountryCodeChanges(phoneCountryCodeChanges) val phoneNumChanges = view.getPhoneNumChanges() // Ҵо௏٘ ߂ ߣഐ val phoneDataChanges = Observable.merge(phoneCountryCodeChanges, phoneNumChanges) subscribePhoneDataChanges(phoneDataChanges) } 1SFTFOUFS ೠߣীೞա੄0CTFSWBCMF݅WJFXীࢎਊೡࣻ੓ਵ޲۽
 ҕਬܳೞҊरਸ҃਋TIBSFPQFSBUPSܳഝਊೞݶؽ
  76. ઱੄೧ঠೡ੼ // п View ࢚కٜਸ ҳة protected open fun subscribeViewState()

    { // Ҵо௏٘ val phoneCountryCodeChanges = view.getPhoneCountryCodeChanges().share() subscribePhoneCountryCodeChanges(phoneCountryCodeChanges) val phoneNumChanges = view.getPhoneNumChanges() // Ҵо௏٘ ߂ ߣഐ val phoneDataChanges = Observable.merge(phoneCountryCodeChanges, phoneNumChanges) subscribePhoneDataChanges(phoneDataChanges) } 1SFTFOUFS ೠߣীೞա੄0CTFSWBCMF݅WJFXীࢎਊೡࣻ੓ਵ޲۽
 ҕਬܳೞҊरਸ҃਋TIBSFPQFSBUPSܳഝਊೞݶؽ
  77. ઱੄೧ঠೡ੼ // п View ࢚కٜਸ ҳة protected open fun subscribeViewState()

    { // Ҵо௏٘ val phoneCountryCodeChanges = view.getPhoneCountryCodeChanges().share() subscribePhoneCountryCodeChanges(phoneCountryCodeChanges) val phoneNumChanges = view.getPhoneNumChanges() // Ҵо௏٘ ߂ ߣഐ val phoneDataChanges = Observable.merge(phoneCountryCodeChanges, phoneNumChanges) subscribePhoneDataChanges(phoneDataChanges) } 1SFTFOUFS ೠߣীೞա੄0CTFSWBCMF݅WJFXীࢎਊೡࣻ੓ਵ޲۽
 ҕਬܳೞҊरਸ҃਋TIBSFPQFSBUPSܳഝਊೞݶؽ
  78. 3FDZDMFS"EBQUFS%BUB$IBOHF0CTFSWBCMF @Override protected void subscribeListener(Observer<? super T> observer) { if

    (!checkMainThread(observer)) { return; } Listener listener = new Listener(adapter, observer); observer.onSubscribe(listener); adapter.registerAdapterDataObserver(listener.dataObserver); } 3FDZDMFS"EBQUFS%BUB$IBOHF0CTFSWBCMF
  79. 3FDZDMFS"EBQUFS%BUB$IBOHF0CTFSWBCMF @Override protected void subscribeListener(Observer<? super T> observer) { if

    (!checkMainThread(observer)) { return; } Listener listener = new Listener(adapter, observer); observer.onSubscribe(listener); adapter.registerAdapterDataObserver(listener.dataObserver); } 3FDZDMFS"EBQUFS%BUB$IBOHF0CTFSWBCMF
  80. 3FDZDMFS"EBQUFS%BUB$IBOHF0CTFSWBCMF @Override protected void subscribeListener(Observer<? super T> observer) { if

    (!checkMainThread(observer)) { return; } Listener listener = new Listener(adapter, observer); observer.onSubscribe(listener); adapter.registerAdapterDataObserver(listener.dataObserver); } 3FDZDMFS"EBQUFS%BUB$IBOHF0CTFSWBCMF
  81. 3FDZDMFS"EBQUFS%BUB$IBOHF0CTFSWBCMF @Override protected void subscribeListener(Observer<? super T> observer) { if

    (!checkMainThread(observer)) { return; } Listener listener = new Listener(adapter, observer); observer.onSubscribe(listener); adapter.registerAdapterDataObserver(listener.dataObserver); } 3FDZDMFS"EBQUFS%BUB$IBOHF0CTFSWBCMF
  82. 3FDZDMFS"EBQUFS%BUB$IBOHF0CTFSWBCMF @Override protected void subscribeListener(Observer<? super T> observer) { if

    (!checkMainThread(observer)) { return; } Listener listener = new Listener(adapter, observer); observer.onSubscribe(listener); adapter.registerAdapterDataObserver(listener.dataObserver); } 3FDZDMFS"EBQUFS%BUB$IBOHF0CTFSWBCMF
  83. 3FDZDMFS"EBQUFS%BUB$IBOHF0CTFSWBCMF @Override protected void subscribeListener(Observer<? super T> observer) { if

    (!checkMainThread(observer)) { return; } Listener listener = new Listener(adapter, observer); observer.onSubscribe(listener); adapter.registerAdapterDataObserver(listener.dataObserver); } 3FDZDMFS"EBQUFS%BUB$IBOHF0CTFSWBCMF
  84. 3FDZDMFS"EBQUFS%BUB$IBOHF0CTFSWBCMF @Override protected void subscribeListener(Observer<? super T> observer) { if

    (!checkMainThread(observer)) { return; } Listener listener = new Listener(adapter, observer); observer.onSubscribe(listener); adapter.registerAdapterDataObserver(listener.dataObserver); } 3FDZDMFS"EBQUFS%BUB$IBOHF0CTFSWBCMF
  85. 3FDZDMFS"EBQUFS%BUB$IBOHF0CTFSWBCMF final class Listener extends MainThreadDisposable { private final T

    recyclerAdapter; final AdapterDataObserver dataObserver; Listener(final T recyclerAdapter, final Observer<? super T> observer) { this.recyclerAdapter = recyclerAdapter; this.dataObserver = new AdapterDataObserver() { @Override public void onChanged() { if (!isDisposed()) { observer.onNext(recyclerAdapter); } } }; } @Override protected void onDispose() { recyclerAdapter.unregisterAdapterDataObserver(dataObserver); } } 3FDZDMFS"EBQUFS%BUB$IBOHF0CTFSWBCMF
  86. 3FDZDMFS"EBQUFS%BUB$IBOHF0CTFSWBCMF final class Listener extends MainThreadDisposable { private final T

    recyclerAdapter; final AdapterDataObserver dataObserver; Listener(final T recyclerAdapter, final Observer<? super T> observer) { this.recyclerAdapter = recyclerAdapter; this.dataObserver = new AdapterDataObserver() { @Override public void onChanged() { if (!isDisposed()) { observer.onNext(recyclerAdapter); } } }; } @Override protected void onDispose() { recyclerAdapter.unregisterAdapterDataObserver(dataObserver); } } 3FDZDMFS"EBQUFS%BUB$IBOHF0CTFSWBCMF
  87. 3FDZDMFS"EBQUFS%BUB$IBOHF0CTFSWBCMF final class Listener extends MainThreadDisposable { private final T

    recyclerAdapter; final AdapterDataObserver dataObserver; Listener(final T recyclerAdapter, final Observer<? super T> observer) { this.recyclerAdapter = recyclerAdapter; this.dataObserver = new AdapterDataObserver() { @Override public void onChanged() { if (!isDisposed()) { observer.onNext(recyclerAdapter); } } }; } @Override protected void onDispose() { recyclerAdapter.unregisterAdapterDataObserver(dataObserver); } } 3FDZDMFS"EBQUFS%BUB$IBOHF0CTFSWBCMF
  88. 3FDZDMFS"EBQUFS%BUB$IBOHF0CTFSWBCMF final class Listener extends MainThreadDisposable { private final T

    recyclerAdapter; final AdapterDataObserver dataObserver; Listener(final T recyclerAdapter, final Observer<? super T> observer) { this.recyclerAdapter = recyclerAdapter; this.dataObserver = new AdapterDataObserver() { @Override public void onChanged() { if (!isDisposed()) { observer.onNext(recyclerAdapter); } } }; } @Override protected void onDispose() { recyclerAdapter.unregisterAdapterDataObserver(dataObserver); } } 3FDZDMFS"EBQUFS%BUB$IBOHF0CTFSWBCMF
  89. 3FDZDMFS"EBQUFS%BUB$IBOHF0CTFSWBCMF final class Listener extends MainThreadDisposable { private final T

    recyclerAdapter; final AdapterDataObserver dataObserver; Listener(final T recyclerAdapter, final Observer<? super T> observer) { this.recyclerAdapter = recyclerAdapter; this.dataObserver = new AdapterDataObserver() { @Override public void onChanged() { if (!isDisposed()) { observer.onNext(recyclerAdapter); } } }; } @Override protected void onDispose() { recyclerAdapter.unregisterAdapterDataObserver(dataObserver); } } 3FDZDMFS"EBQUFS%BUB$IBOHF0CTFSWBCMF
  90. प੸ਊࢎ۹ override fun getAdapterDataChanges(): Observable<EvaluateConsultationAdapter> { return adapter.dataChanges() } 7JFX

    "DUJWJUZ 3FDZDMFS"EBQUFS%BUB$IBOHF0CTFSWBCMFਸDVTUPNೞৈ
 OPUJGZ*UFN$IBOHFEܳഐ୹೮ਸٸীب0CTFSWFSীѱঌܿ੉х this.dataObserver = object : AdapterDataObserver() { override fun onChanged() { if (!isDisposed) { observer.onNext(recyclerAdapter) } } override fun onItemRangeChanged(positionStart: Int, itemCount: Int) { if (!isDisposed) { observer.onNext(recyclerAdapter) } } } 3FDZDMFS"EBQUFS%BUB$IBOHF0CTFSWBCMF
  91. प੸ਊࢎ۹ override fun getAdapterDataChanges(): Observable<EvaluateConsultationAdapter> { return adapter.dataChanges() } 7JFX

    "DUJWJUZ 3FDZDMFS"EBQUFS%BUB$IBOHF0CTFSWBCMFਸDVTUPNೞৈ
 OPUJGZ*UFN$IBOHFEܳഐ୹೮ਸٸীب0CTFSWFSীѱঌܿ੉х this.dataObserver = object : AdapterDataObserver() { override fun onChanged() { if (!isDisposed) { observer.onNext(recyclerAdapter) } } override fun onItemRangeChanged(positionStart: Int, itemCount: Int) { if (!isDisposed) { observer.onNext(recyclerAdapter) } } } 3FDZDMFS"EBQUFS%BUB$IBOHF0CTFSWBCMF
  92. प੸ਊࢎ۹ // ಣо ஠పҊܻ private class CategoryViewHolder(itemView: View, callback: (categoryId:

    Long, rating: Float) -> Unit, disposable: CompositeDisposable) : ViewHolder(itemView) val v = itemView as EvaluateConsultationCategoryReviewView init { disposable.add(v.ratingBar.ratingChanges() .subscribe({ callback.invoke(v.categoryId, it) }, { Logger.e(it) })) } } $BUFHPSZ7JFX)PMEFS
  93. प੸ਊࢎ۹ // ಣо ஠పҊܻ private class CategoryViewHolder(itemView: View, callback: (categoryId:

    Long, rating: Float) -> Unit, disposable: CompositeDisposable) : ViewHolder(itemView) val v = itemView as EvaluateConsultationCategoryReviewView init { disposable.add(v.ratingBar.ratingChanges() .subscribe({ callback.invoke(v.categoryId, it) }, { Logger.e(it) })) } } $BUFHPSZ7JFX)PMEFS
  94. प੸ਊࢎ۹ // ಣо ஠పҊܻ private class CategoryViewHolder(itemView: View, callback: (categoryId:

    Long, rating: Float) -> Unit, disposable: CompositeDisposable) : ViewHolder(itemView) val v = itemView as EvaluateConsultationCategoryReviewView init { disposable.add(v.ratingBar.ratingChanges() .subscribe({ callback.invoke(v.categoryId, it) }, { Logger.e(it) })) } } $BUFHPSZ7JFX)PMEFS
  95. प੸ਊࢎ۹ // ಣо ஠పҊܻ private class CategoryViewHolder(itemView: View, callback: (categoryId:

    Long, rating: Float) -> Unit, disposable: CompositeDisposable) : ViewHolder(itemView) val v = itemView as EvaluateConsultationCategoryReviewView init { disposable.add(v.ratingBar.ratingChanges() .subscribe({ callback.invoke(v.categoryId, it) }, { Logger.e(it) })) } } $BUFHPSZ7JFX)PMEFS
  96. प੸ਊࢎ۹ // ಣо ஠పҊܻ private class CategoryViewHolder(itemView: View, callback: (categoryId:

    Long, rating: Float) -> Unit, disposable: CompositeDisposable) : ViewHolder(itemView) val v = itemView as EvaluateConsultationCategoryReviewView init { disposable.add(v.ratingBar.ratingChanges() .subscribe({ callback.invoke(v.categoryId, it) }, { Logger.e(it) })) } } $BUFHPSZ7JFX)PMEFS
  97. प੸ਊࢎ۹ final class RatingBarRatingChangeObservable extends InitialValueObservable<Float> { private final Rating

    view; @Override protected void subscribeListener(Observer<? super Float> observer) { if (!checkMainThread(observer)) { return; } Listener listener = new Listener(view, observer); view.setOnRatingBarChangeListener(listener); observer.onSubscribe(listener); } static final class Listener extends MainThreadDisposable implements OnRatingBarChangeListener { private final RatingBar view; private final Observer<? super Float> observer; @Override public void onRatingChanged(RatingBar ratingBar, float rating, boolean fromUser) { if (!isDisposed()) { observer.onNext(rating); } } } } 3BUJOH#BS3BUJOH$IBOHF0CTFSWBCMF
  98. प੸ਊࢎ۹ final class RatingBarRatingChangeObservable extends InitialValueObservable<Float> { private final Rating

    view; @Override protected void subscribeListener(Observer<? super Float> observer) { if (!checkMainThread(observer)) { return; } Listener listener = new Listener(view, observer); view.setOnRatingBarChangeListener(listener); observer.onSubscribe(listener); } static final class Listener extends MainThreadDisposable implements OnRatingBarChangeListener { private final RatingBar view; private final Observer<? super Float> observer; @Override public void onRatingChanged(RatingBar ratingBar, float rating, boolean fromUser) { if (!isDisposed()) { observer.onNext(rating); } } } } 3BUJOH#BS3BUJOH$IBOHF0CTFSWBCMF
  99. प੸ਊࢎ۹ final class RatingBarRatingChangeObservable extends InitialValueObservable<Float> { private final Rating

    view; @Override protected void subscribeListener(Observer<? super Float> observer) { if (!checkMainThread(observer)) { return; } Listener listener = new Listener(view, observer); view.setOnRatingBarChangeListener(listener); observer.onSubscribe(listener); } static final class Listener extends MainThreadDisposable implements OnRatingBarChangeListener { private final RatingBar view; private final Observer<? super Float> observer; @Override public void onRatingChanged(RatingBar ratingBar, float rating, boolean fromUser) { if (!isDisposed()) { observer.onNext(rating); } } } } 3BUJOH#BS3BUJOH$IBOHF0CTFSWBCMF
  100. प੸ਊࢎ۹ final class RatingBarRatingChangeObservable extends InitialValueObservable<Float> { private final Rating

    view; @Override protected void subscribeListener(Observer<? super Float> observer) { if (!checkMainThread(observer)) { return; } Listener listener = new Listener(view, observer); view.setOnRatingBarChangeListener(listener); observer.onSubscribe(listener); } static final class Listener extends MainThreadDisposable implements OnRatingBarChangeListener { private final RatingBar view; private final Observer<? super Float> observer; @Override public void onRatingChanged(RatingBar ratingBar, float rating, boolean fromUser) { if (!isDisposed()) { observer.onNext(rating); } } } } 3BUJOH#BS3BUJOH$IBOHF0CTFSWBCMF
  101. प੸ਊࢎ۹ final class RatingBarRatingChangeObservable extends InitialValueObservable<Float> { private final Rating

    view; @Override protected void subscribeListener(Observer<? super Float> observer) { if (!checkMainThread(observer)) { return; } Listener listener = new Listener(view, observer); view.setOnRatingBarChangeListener(listener); observer.onSubscribe(listener); } static final class Listener extends MainThreadDisposable implements OnRatingBarChangeListener { private final RatingBar view; private final Observer<? super Float> observer; @Override public void onRatingChanged(RatingBar ratingBar, float rating, boolean fromUser) { if (!isDisposed()) { observer.onNext(rating); } } } } 3BUJOH#BS3BUJOH$IBOHF0CTFSWBCMF
  102. प੸ਊࢎ۹ final class RatingBarRatingChangeObservable extends InitialValueObservable<Float> { private final Rating

    view; @Override protected void subscribeListener(Observer<? super Float> observer) { if (!checkMainThread(observer)) { return; } Listener listener = new Listener(view, observer); view.setOnRatingBarChangeListener(listener); observer.onSubscribe(listener); } static final class Listener extends MainThreadDisposable implements OnRatingBarChangeListener { private final RatingBar view; private final Observer<? super Float> observer; @Override public void onRatingChanged(RatingBar ratingBar, float rating, boolean fromUser) { if (!isDisposed()) { observer.onNext(rating); } } } } 3BUJOH#BS3BUJOH$IBOHF0CTFSWBCMF
  103. प੸ਊࢎ۹ final class RatingBarRatingChangeObservable extends InitialValueObservable<Float> { private final Rating

    view; @Override protected void subscribeListener(Observer<? super Float> observer) { if (!checkMainThread(observer)) { return; } Listener listener = new Listener(view, observer); view.setOnRatingBarChangeListener(listener); observer.onSubscribe(listener); } static final class Listener extends MainThreadDisposable implements OnRatingBarChangeListener { private final RatingBar view; private final Observer<? super Float> observer; @Override public void onRatingChanged(RatingBar ratingBar, float rating, boolean fromUser) { if (!isDisposed()) { observer.onNext(rating); } } } } 3BUJOH#BS3BUJOH$IBOHF0CTFSWBCMF
  104. प੸ਊࢎ۹ final class RatingBarRatingChangeObservable extends InitialValueObservable<Float> { private final Rating

    view; @Override protected void subscribeListener(Observer<? super Float> observer) { if (!checkMainThread(observer)) { return; } Listener listener = new Listener(view, observer); view.setOnRatingBarChangeListener(listener); observer.onSubscribe(listener); } static final class Listener extends MainThreadDisposable implements OnRatingBarChangeListener { private final RatingBar view; private final Observer<? super Float> observer; @Override public void onRatingChanged(RatingBar ratingBar, float rating, boolean fromUser) { if (!isDisposed()) { observer.onNext(rating); } } } } 3BUJOH#BS3BUJOH$IBOHF0CTFSWBCMF
  105. प੸ਊࢎ۹ final class RatingBarRatingChangeObservable extends InitialValueObservable<Float> { private final Rating

    view; @Override protected void subscribeListener(Observer<? super Float> observer) { if (!checkMainThread(observer)) { return; } Listener listener = new Listener(view, observer); view.setOnRatingBarChangeListener(listener); observer.onSubscribe(listener); } static final class Listener extends MainThreadDisposable implements OnRatingBarChangeListener { private final RatingBar view; private final Observer<? super Float> observer; @Override public void onRatingChanged(RatingBar ratingBar, float rating, boolean fromUser) { if (!isDisposed()) { observer.onNext(rating); } } } } 3BUJOH#BS3BUJOH$IBOHF0CTFSWBCMF
  106. प੸ਊࢎ۹ final class RatingBarRatingChangeObservable extends InitialValueObservable<Float> { private final Rating

    view; @Override protected void subscribeListener(Observer<? super Float> observer) { if (!checkMainThread(observer)) { return; } Listener listener = new Listener(view, observer); view.setOnRatingBarChangeListener(listener); observer.onSubscribe(listener); } static final class Listener extends MainThreadDisposable implements OnRatingBarChangeListener { private final RatingBar view; private final Observer<? super Float> observer; @Override public void onRatingChanged(RatingBar ratingBar, float rating, boolean fromUser) { if (!isDisposed()) { observer.onNext(rating); } } } } 3BUJOH#BS3BUJOH$IBOHF0CTFSWBCMF
  107. प੸ਊࢎ۹ final class RatingBarRatingChangeObservable extends InitialValueObservable<Float> { private final Rating

    view; @Override protected void subscribeListener(Observer<? super Float> observer) { if (!checkMainThread(observer)) { return; } Listener listener = new Listener(view, observer); view.setOnRatingBarChangeListener(listener); observer.onSubscribe(listener); } static final class Listener extends MainThreadDisposable implements OnRatingBarChangeListener { private final RatingBar view; private final Observer<? super Float> observer; @Override public void onRatingChanged(RatingBar ratingBar, float rating, boolean fromUser) { if (!isDisposed()) { observer.onNext(rating); } } } } 3BUJOH#BS3BUJOH$IBOHF0CTFSWBCMF
  108. प੸ਊࢎ۹ final class RatingBarRatingChangeObservable extends InitialValueObservable<Float> { private final Rating

    view; @Override protected void subscribeListener(Observer<? super Float> observer) { if (!checkMainThread(observer)) { return; } Listener listener = new Listener(view, observer); view.setOnRatingBarChangeListener(listener); observer.onSubscribe(listener); } static final class Listener extends MainThreadDisposable implements OnRatingBarChangeListener { private final RatingBar view; private final Observer<? super Float> observer; @Override public void onRatingChanged(RatingBar ratingBar, float rating, boolean fromUser) { if (!isDisposed()) { observer.onNext(rating); } } } } 3BUJOH#BS3BUJOH$IBOHF0CTFSWBCMF
  109. प੸ਊࢎ۹ final class RatingBarRatingChangeObservable extends InitialValueObservable<Float> { private final Rating

    view; @Override protected void subscribeListener(Observer<? super Float> observer) { if (!checkMainThread(observer)) { return; } Listener listener = new Listener(view, observer); view.setOnRatingBarChangeListener(listener); observer.onSubscribe(listener); } static final class Listener extends MainThreadDisposable implements OnRatingBarChangeListener { private final RatingBar view; private final Observer<? super Float> observer; @Override public void onRatingChanged(RatingBar ratingBar, float rating, boolean fromUser) { if (!isDisposed()) { observer.onNext(rating); } } } } 3BUJOH#BS3BUJOH$IBOHF0CTFSWBCMF
  110. प੸ਊࢎ۹ /** * ߹੼ ಣо ௒ߔ * ߹੼ਸ ಣоೡ ٸ

    ೧׼ ݫࢲ٘ܳ ഐ୹ */ private val ratingBarChangesCallback = { categoryId: Long, rating: Float -> Observable.fromIterable(itemList.withIndex()) .filter { it.value is EvalCategoryReview } .filter { (it.value as EvalCategoryReview).evalCategory.id == categoryId } .map { IndexedValue(it.index, EvalCategoryReview(it.value.evalCategory, rating * 2)) } .doAfterTerminate { notifyItemChanged(itemCount - 1) } .subscribe { itemList[it.index] = it.value } } "EBQUFS ࢎਊ੗о߹੼ಣоܳೠٍؘ੉ఠ߸ജറসؘ੉౟
  111. प੸ਊࢎ۹ /** * ߹੼ ಣо ௒ߔ * ߹੼ਸ ಣоೡ ٸ

    ೧׼ ݫࢲ٘ܳ ഐ୹ */ private val ratingBarChangesCallback = { categoryId: Long, rating: Float -> Observable.fromIterable(itemList.withIndex()) .filter { it.value is EvalCategoryReview } .filter { (it.value as EvalCategoryReview).evalCategory.id == categoryId } .map { IndexedValue(it.index, EvalCategoryReview(it.value.evalCategory, rating * 2)) } .doAfterTerminate { notifyItemChanged(itemCount - 1) } .subscribe { itemList[it.index] = it.value } } "EBQUFS ࢎਊ੗о߹੼ಣоܳೠٍؘ੉ఠ߸ജറসؘ੉౟
  112. प੸ਊࢎ۹ /** * ߹੼ ಣо ௒ߔ * ߹੼ਸ ಣоೡ ٸ

    ೧׼ ݫࢲ٘ܳ ഐ୹ */ private val ratingBarChangesCallback = { categoryId: Long, rating: Float -> Observable.fromIterable(itemList.withIndex()) .filter { it.value is EvalCategoryReview } .filter { (it.value as EvalCategoryReview).evalCategory.id == categoryId } .map { IndexedValue(it.index, EvalCategoryReview(it.value.evalCategory, rating * 2)) } .doAfterTerminate { notifyItemChanged(itemCount - 1) } .subscribe { itemList[it.index] = it.value } } "EBQUFS ࢎਊ੗о߹੼ಣоܳೠٍؘ੉ఠ߸ജറসؘ੉౟
  113. प੸ਊࢎ۹ /** * ߹੼ ಣо ௒ߔ * ߹੼ਸ ಣоೡ ٸ

    ೧׼ ݫࢲ٘ܳ ഐ୹ */ private val ratingBarChangesCallback = { categoryId: Long, rating: Float -> Observable.fromIterable(itemList.withIndex()) .filter { it.value is EvalCategoryReview } .filter { (it.value as EvalCategoryReview).evalCategory.id == categoryId } .map { IndexedValue(it.index, EvalCategoryReview(it.value.evalCategory, rating * 2)) } .doAfterTerminate { notifyItemChanged(itemCount - 1) } .subscribe { itemList[it.index] = it.value } } "EBQUFS ࢎਊ੗о߹੼ಣоܳೠٍؘ੉ఠ߸ജറসؘ੉౟
  114. प੸ਊࢎ۹ /** * ߹੼ ಣо ௒ߔ * ߹੼ਸ ಣоೡ ٸ

    ೧׼ ݫࢲ٘ܳ ഐ୹ */ private val ratingBarChangesCallback = { categoryId: Long, rating: Float -> Observable.fromIterable(itemList.withIndex()) .filter { it.value is EvalCategoryReview } .filter { (it.value as EvalCategoryReview).evalCategory.id == categoryId } .map { IndexedValue(it.index, EvalCategoryReview(it.value.evalCategory, rating * 2)) } .doAfterTerminate { notifyItemChanged(itemCount - 1) } .subscribe { itemList[it.index] = it.value } } "EBQUFS ࢎਊ੗о߹੼ಣоܳೠٍؘ੉ఠ߸ജറসؘ੉౟
  115. प੸ਊࢎ۹ /** * ߹੼ ಣо ௒ߔ * ߹੼ਸ ಣоೡ ٸ

    ೧׼ ݫࢲ٘ܳ ഐ୹ */ private val ratingBarChangesCallback = { categoryId: Long, rating: Float -> Observable.fromIterable(itemList.withIndex()) .filter { it.value is EvalCategoryReview } .filter { (it.value as EvalCategoryReview).evalCategory.id == categoryId } .map { IndexedValue(it.index, EvalCategoryReview(it.value.evalCategory, rating * 2)) } .doAfterTerminate { notifyItemChanged(itemCount - 1) } .subscribe { itemList[it.index] = it.value } } "EBQUFS ࢎਊ੗о߹੼ಣоܳೠٍؘ੉ఠ߸ജറসؘ੉౟
  116. प੸ਊࢎ۹ /** * ߹੼ ಣо ௒ߔ * ߹੼ਸ ಣоೡ ٸ

    ೧׼ ݫࢲ٘ܳ ഐ୹ */ private val ratingBarChangesCallback = { categoryId: Long, rating: Float -> Observable.fromIterable(itemList.withIndex()) .filter { it.value is EvalCategoryReview } .filter { (it.value as EvalCategoryReview).evalCategory.id == categoryId } .map { IndexedValue(it.index, EvalCategoryReview(it.value.evalCategory, rating * 2)) } .doAfterTerminate { notifyItemChanged(itemCount - 1) } .subscribe { itemList[it.index] = it.value } } "EBQUFS ࢎਊ੗о߹੼ಣоܳೠٍؘ੉ఠ߸ജറসؘ੉౟
  117. प੸ਊࢎ۹ /** * ߹੼ ಣо ௒ߔ * ߹੼ਸ ಣоೡ ٸ

    ೧׼ ݫࢲ٘ܳ ഐ୹ */ private val ratingBarChangesCallback = { categoryId: Long, rating: Float -> Observable.fromIterable(itemList.withIndex()) .filter { it.value is EvalCategoryReview } .filter { (it.value as EvalCategoryReview).evalCategory.id == categoryId } .map { IndexedValue(it.index, EvalCategoryReview(it.value.evalCategory, rating * 2)) } .doAfterTerminate { notifyItemChanged(itemCount - 1) } .subscribe { itemList[it.index] = it.value } } "EBQUFS ࢎਊ੗о߹੼ಣоܳೠٍؘ੉ఠ߸ജറসؘ੉౟
  118. प੸ਊࢎ۹ /** * ߹੼ ಣо ௒ߔ * ߹੼ਸ ಣоೡ ٸ

    ೧׼ ݫࢲ٘ܳ ഐ୹ */ private val ratingBarChangesCallback = { categoryId: Long, rating: Float -> Observable.fromIterable(itemList.withIndex()) .filter { it.value is EvalCategoryReview } .filter { (it.value as EvalCategoryReview).evalCategory.id == categoryId } .map { IndexedValue(it.index, EvalCategoryReview(it.value.evalCategory, rating * 2)) } .doAfterTerminate { notifyItemChanged(itemCount - 1) } .subscribe { itemList[it.index] = it.value } } "EBQUFS ࢎਊ੗о߹੼ಣоܳೠٍؘ੉ఠ߸ജറসؘ੉౟
  119. प੸ਊࢎ۹ /** * ߹੼ ಣо ௒ߔ * ߹੼ਸ ಣоೡ ٸ

    ೧׼ ݫࢲ٘ܳ ഐ୹ */ private val ratingBarChangesCallback = { categoryId: Long, rating: Float -> Observable.fromIterable(itemList.withIndex()) .filter { it.value is EvalCategoryReview } .filter { (it.value as EvalCategoryReview).evalCategory.id == categoryId } .map { IndexedValue(it.index, EvalCategoryReview(it.value.evalCategory, rating * 2)) } .doAfterTerminate { notifyItemChanged(itemCount - 1) } .subscribe { itemList[it.index] = it.value } } "EBQUFS ࢎਊ੗о߹੼ಣоܳೠٍؘ੉ఠ߸ജറসؘ੉౟
  120. प੸ਊࢎ۹ /** * ߹੼ ಣо ௒ߔ * ߹੼ਸ ಣоೡ ٸ

    ೧׼ ݫࢲ٘ܳ ഐ୹ */ private val ratingBarChangesCallback = { categoryId: Long, rating: Float -> Observable.fromIterable(itemList.withIndex()) .filter { it.value is EvalCategoryReview } .filter { (it.value as EvalCategoryReview).evalCategory.id == categoryId } .map { IndexedValue(it.index, EvalCategoryReview(it.value.evalCategory, rating * 2)) } .doAfterTerminate { notifyItemChanged(itemCount - 1) } .subscribe { itemList[it.index] = it.value } } "EBQUFS ࢎਊ੗о߹੼ಣоܳೠٍؘ੉ఠ߸ജറসؘ੉౟
  121. प੸ਊࢎ۹ // ಣо Ӗॳӝ private class WriteReviewViewHolder(itemView: View, callback: (review:

    String) -> Unit, disposable: CompositeDisposable) : RecyclerView.ViewHolder(itemView) { val v = itemView as EvaluateConsultationWriteReviewView init { disposable.add(v.reviewInput.textChanges() .debounce(300, TimeUnit.MILLISECONDS) .observeOn(AndroidSchedulers.mainThread()) .subscribe({ callback.invoke(it.toString()) }, { Logger.e(it) })) } } 8SJUF3FWJFX7JFX)PMEFS
  122. प੸ਊࢎ۹ // ಣо Ӗॳӝ private class WriteReviewViewHolder(itemView: View, callback: (review:

    String) -> Unit, disposable: CompositeDisposable) : RecyclerView.ViewHolder(itemView) { val v = itemView as EvaluateConsultationWriteReviewView init { disposable.add(v.reviewInput.textChanges() .debounce(300, TimeUnit.MILLISECONDS) .observeOn(AndroidSchedulers.mainThread()) .subscribe({ callback.invoke(it.toString()) }, { Logger.e(it) })) } } 8SJUF3FWJFX7JFX)PMEFS
  123. प੸ਊࢎ۹ // ಣо Ӗॳӝ private class WriteReviewViewHolder(itemView: View, callback: (review:

    String) -> Unit, disposable: CompositeDisposable) : RecyclerView.ViewHolder(itemView) { val v = itemView as EvaluateConsultationWriteReviewView init { disposable.add(v.reviewInput.textChanges() .debounce(300, TimeUnit.MILLISECONDS) .observeOn(AndroidSchedulers.mainThread()) .subscribe({ callback.invoke(it.toString()) }, { Logger.e(it) })) } } 8SJUF3FWJFX7JFX)PMEFS
  124. प੸ਊࢎ۹ // ಣо Ӗॳӝ private class WriteReviewViewHolder(itemView: View, callback: (review:

    String) -> Unit, disposable: CompositeDisposable) : RecyclerView.ViewHolder(itemView) { val v = itemView as EvaluateConsultationWriteReviewView init { disposable.add(v.reviewInput.textChanges() .debounce(300, TimeUnit.MILLISECONDS) .observeOn(AndroidSchedulers.mainThread()) .subscribe({ callback.invoke(it.toString()) }, { Logger.e(it) })) } } 8SJUF3FWJFX7JFX)PMEFS
  125. प੸ਊࢎ۹ // ಣо Ӗॳӝ private class WriteReviewViewHolder(itemView: View, callback: (review:

    String) -> Unit, disposable: CompositeDisposable) : RecyclerView.ViewHolder(itemView) { val v = itemView as EvaluateConsultationWriteReviewView init { disposable.add(v.reviewInput.textChanges() .debounce(300, TimeUnit.MILLISECONDS) .observeOn(AndroidSchedulers.mainThread()) .subscribe({ callback.invoke(it.toString()) }, { Logger.e(it) })) } } 8SJUF3FWJFX7JFX)PMEFS
  126. प੸ਊࢎ۹ // ಣо Ӗॳӝ private class WriteReviewViewHolder(itemView: View, callback: (review:

    String) -> Unit, disposable: CompositeDisposable) : RecyclerView.ViewHolder(itemView) { val v = itemView as EvaluateConsultationWriteReviewView init { disposable.add(v.reviewInput.textChanges() .debounce(300, TimeUnit.MILLISECONDS) .observeOn(AndroidSchedulers.mainThread()) .subscribe({ callback.invoke(it.toString()) }, { Logger.e(it) })) } } 8SJUF3FWJFX7JFX)PMEFS
  127. प੸ਊࢎ۹ // ಣо Ӗॳӝ private class WriteReviewViewHolder(itemView: View, callback: (review:

    String) -> Unit, disposable: CompositeDisposable) : RecyclerView.ViewHolder(itemView) { val v = itemView as EvaluateConsultationWriteReviewView init { disposable.add(v.reviewInput.textChanges() .debounce(300, TimeUnit.MILLISECONDS) .observeOn(AndroidSchedulers.mainThread()) .subscribe({ callback.invoke(it.toString()) }, { Logger.e(it) })) } } 8SJUF3FWJFX7JFX)PMEFS
  128. प੸ਊࢎ۹ // ಣо Ӗॳӝ private class WriteReviewViewHolder(itemView: View, callback: (review:

    String) -> Unit, disposable: CompositeDisposable) : RecyclerView.ViewHolder(itemView) { val v = itemView as EvaluateConsultationWriteReviewView init { disposable.add(v.reviewInput.textChanges() .debounce(300, TimeUnit.MILLISECONDS) .observeOn(AndroidSchedulers.mainThread()) .subscribe({ callback.invoke(it.toString()) }, { Logger.e(it) })) } } 8SJUF3FWJFX7JFX)PMEFS
  129. प੸ਊࢎ۹ // ಣо Ӗॳӝ private class WriteReviewViewHolder(itemView: View, callback: (review:

    String) -> Unit, disposable: CompositeDisposable) : RecyclerView.ViewHolder(itemView) { val v = itemView as EvaluateConsultationWriteReviewView init { disposable.add(v.reviewInput.textChanges() .debounce(300, TimeUnit.MILLISECONDS) .observeOn(AndroidSchedulers.mainThread()) .subscribe({ callback.invoke(it.toString()) }, { Logger.e(it) })) } } 8SJUF3FWJFX7JFX)PMEFS
  130. प੸ਊࢎ۹ /** * ܻ࠭ ੘ࢿ ௒ߔ * ܻ࠭ܳ ੘ࢿೡ ٸ

    ೧׼ ݫࢲ٘ܳ ഐ୹ */ private val writeReviewChangesCallback = { review: String -> Observable.fromIterable(itemList.withIndex()) .filter { it.value is EvalWriteReview } .map { IndexedValue(it.index, EvalWriteReview(review)) } .doAfterTerminate { notifyItemChanged(itemCount - 1) } .subscribe { itemList[it.index] = it.value } } "EBQUFS ࢎਊ੗оӖਸ੘ࢿೠٍؘ੉ఠ߸ജറসؘ੉౟
  131. प੸ਊࢎ۹ /** * ܻ࠭ ੘ࢿ ௒ߔ * ܻ࠭ܳ ੘ࢿೡ ٸ

    ೧׼ ݫࢲ٘ܳ ഐ୹ */ private val writeReviewChangesCallback = { review: String -> Observable.fromIterable(itemList.withIndex()) .filter { it.value is EvalWriteReview } .map { IndexedValue(it.index, EvalWriteReview(review)) } .doAfterTerminate { notifyItemChanged(itemCount - 1) } .subscribe { itemList[it.index] = it.value } } "EBQUFS ࢎਊ੗оӖਸ੘ࢿೠٍؘ੉ఠ߸ജറসؘ੉౟
  132. प੸ਊࢎ۹ /** * ܻ࠭ ੘ࢿ ௒ߔ * ܻ࠭ܳ ੘ࢿೡ ٸ

    ೧׼ ݫࢲ٘ܳ ഐ୹ */ private val writeReviewChangesCallback = { review: String -> Observable.fromIterable(itemList.withIndex()) .filter { it.value is EvalWriteReview } .map { IndexedValue(it.index, EvalWriteReview(review)) } .doAfterTerminate { notifyItemChanged(itemCount - 1) } .subscribe { itemList[it.index] = it.value } } "EBQUFS ࢎਊ੗оӖਸ੘ࢿೠٍؘ੉ఠ߸ജറসؘ੉౟
  133. प੸ਊࢎ۹ /** * ܻ࠭ ੘ࢿ ௒ߔ * ܻ࠭ܳ ੘ࢿೡ ٸ

    ೧׼ ݫࢲ٘ܳ ഐ୹ */ private val writeReviewChangesCallback = { review: String -> Observable.fromIterable(itemList.withIndex()) .filter { it.value is EvalWriteReview } .map { IndexedValue(it.index, EvalWriteReview(review)) } .doAfterTerminate { notifyItemChanged(itemCount - 1) } .subscribe { itemList[it.index] = it.value } } "EBQUFS ࢎਊ੗оӖਸ੘ࢿೠٍؘ੉ఠ߸ജറসؘ੉౟
  134. प੸ਊࢎ۹ /** * ܻ࠭ ੘ࢿ ௒ߔ * ܻ࠭ܳ ੘ࢿೡ ٸ

    ೧׼ ݫࢲ٘ܳ ഐ୹ */ private val writeReviewChangesCallback = { review: String -> Observable.fromIterable(itemList.withIndex()) .filter { it.value is EvalWriteReview } .map { IndexedValue(it.index, EvalWriteReview(review)) } .doAfterTerminate { notifyItemChanged(itemCount - 1) } .subscribe { itemList[it.index] = it.value } } "EBQUFS ࢎਊ੗оӖਸ੘ࢿೠٍؘ੉ఠ߸ജറসؘ੉౟
  135. प੸ਊࢎ۹ /** * ܻ࠭ ੘ࢿ ௒ߔ * ܻ࠭ܳ ੘ࢿೡ ٸ

    ೧׼ ݫࢲ٘ܳ ഐ୹ */ private val writeReviewChangesCallback = { review: String -> Observable.fromIterable(itemList.withIndex()) .filter { it.value is EvalWriteReview } .map { IndexedValue(it.index, EvalWriteReview(review)) } .doAfterTerminate { notifyItemChanged(itemCount - 1) } .subscribe { itemList[it.index] = it.value } } "EBQUFS ࢎਊ੗оӖਸ੘ࢿೠٍؘ੉ఠ߸ജറসؘ੉౟
  136. प੸ਊࢎ۹ /** * ܻ࠭ ੘ࢿ ௒ߔ * ܻ࠭ܳ ੘ࢿೡ ٸ

    ೧׼ ݫࢲ٘ܳ ഐ୹ */ private val writeReviewChangesCallback = { review: String -> Observable.fromIterable(itemList.withIndex()) .filter { it.value is EvalWriteReview } .map { IndexedValue(it.index, EvalWriteReview(review)) } .doAfterTerminate { notifyItemChanged(itemCount - 1) } .subscribe { itemList[it.index] = it.value } } "EBQUFS ࢎਊ੗оӖਸ੘ࢿೠٍؘ੉ఠ߸ജറসؘ੉౟
  137. प੸ਊࢎ۹ /** * ܻ࠭ ੘ࢿ ௒ߔ * ܻ࠭ܳ ੘ࢿೡ ٸ

    ೧׼ ݫࢲ٘ܳ ഐ୹ */ private val writeReviewChangesCallback = { review: String -> Observable.fromIterable(itemList.withIndex()) .filter { it.value is EvalWriteReview } .map { IndexedValue(it.index, EvalWriteReview(review)) } .doAfterTerminate { notifyItemChanged(itemCount - 1) } .subscribe { itemList[it.index] = it.value } } "EBQUFS ࢎਊ੗оӖਸ੘ࢿೠٍؘ੉ఠ߸ജറসؘ੉౟
  138. प੸ਊࢎ۹ /** * ܻ࠭ ੘ࢿ ௒ߔ * ܻ࠭ܳ ੘ࢿೡ ٸ

    ೧׼ ݫࢲ٘ܳ ഐ୹ */ private val writeReviewChangesCallback = { review: String -> Observable.fromIterable(itemList.withIndex()) .filter { it.value is EvalWriteReview } .map { IndexedValue(it.index, EvalWriteReview(review)) } .doAfterTerminate { notifyItemChanged(itemCount - 1) } .subscribe { itemList[it.index] = it.value } } "EBQUFS ࢎਊ੗оӖਸ੘ࢿೠٍؘ੉ఠ߸ജറসؘ੉౟
  139. प੸ਊࢎ۹ /** * ܻ࠭ ੘ࢿ ௒ߔ * ܻ࠭ܳ ੘ࢿೡ ٸ

    ೧׼ ݫࢲ٘ܳ ഐ୹ */ private val writeReviewChangesCallback = { review: String -> Observable.fromIterable(itemList.withIndex()) .filter { it.value is EvalWriteReview } .map { IndexedValue(it.index, EvalWriteReview(review)) } .doAfterTerminate { notifyItemChanged(itemCount - 1) } .subscribe { itemList[it.index] = it.value } } "EBQUFS ࢎਊ੗оӖਸ੘ࢿೠٍؘ੉ఠ߸ജറসؘ੉౟
  140. प੸ਊࢎ۹ /** * ܻ࠭ ੘ࢿ ௒ߔ * ܻ࠭ܳ ੘ࢿೡ ٸ

    ೧׼ ݫࢲ٘ܳ ഐ୹ */ private val writeReviewChangesCallback = { review: String -> Observable.fromIterable(itemList.withIndex()) .filter { it.value is EvalWriteReview } .map { IndexedValue(it.index, EvalWriteReview(review)) } .doAfterTerminate { notifyItemChanged(itemCount - 1) } .subscribe { itemList[it.index] = it.value } } "EBQUFS ࢎਊ੗оӖਸ੘ࢿೠٍؘ੉ఠ߸ജറসؘ੉౟
  141. प੸ਊࢎ۹ /** * Adapter ী ੓ח Data ߸ചܳ ҳة *

    ੄ࢎݺ, ஠పҊܻ ಣо, ܻ࠭ܳ ॄঠ ߡౡ੉ ഝࢿച ؽ */ private fun subscribeAdapterDataChanges(dataChanges: Observable<EvaluateConsultationAdapter>) { compositeDisposable.add(dataChanges.map { isBtnEnabled(it) } .distinctUntilChanged() .subscribe { view.setBtnEnabled(it) view.setToolbarRightMenuEnabled(it) }) } 1SFTFOUFS
  142. प੸ਊࢎ۹ /** * Adapter ী ੓ח Data ߸ചܳ ҳة *

    ੄ࢎݺ, ஠పҊܻ ಣо, ܻ࠭ܳ ॄঠ ߡౡ੉ ഝࢿച ؽ */ private fun subscribeAdapterDataChanges(dataChanges: Observable<EvaluateConsultationAdapter>) { compositeDisposable.add(dataChanges.map { isBtnEnabled(it) } .distinctUntilChanged() .subscribe { view.setBtnEnabled(it) view.setToolbarRightMenuEnabled(it) }) } 1SFTFOUFS
  143. प੸ਊࢎ۹ /** * Adapter ী ੓ח Data ߸ചܳ ҳة *

    ੄ࢎݺ, ஠పҊܻ ಣо, ܻ࠭ܳ ॄঠ ߡౡ੉ ഝࢿച ؽ */ private fun subscribeAdapterDataChanges(dataChanges: Observable<EvaluateConsultationAdapter>) { compositeDisposable.add(dataChanges.map { isBtnEnabled(it) } .distinctUntilChanged() .subscribe { view.setBtnEnabled(it) view.setToolbarRightMenuEnabled(it) }) } 1SFTFOUFS
  144. प੸ਊࢎ۹ /** * Adapter ী ੓ח Data ߸ചܳ ҳة *

    ੄ࢎݺ, ஠పҊܻ ಣо, ܻ࠭ܳ ॄঠ ߡౡ੉ ഝࢿച ؽ */ private fun subscribeAdapterDataChanges(dataChanges: Observable<EvaluateConsultationAdapter>) { compositeDisposable.add(dataChanges.map { isBtnEnabled(it) } .distinctUntilChanged() .subscribe { view.setBtnEnabled(it) view.setToolbarRightMenuEnabled(it) }) } 1SFTFOUFS
  145. प੸ਊࢎ۹ /** * Adapter ী ੓ח Data ߸ചܳ ҳة *

    ੄ࢎݺ, ஠పҊܻ ಣо, ܻ࠭ܳ ॄঠ ߡౡ੉ ഝࢿച ؽ */ private fun subscribeAdapterDataChanges(dataChanges: Observable<EvaluateConsultationAdapter>) { compositeDisposable.add(dataChanges.map { isBtnEnabled(it) } .distinctUntilChanged() .subscribe { view.setBtnEnabled(it) view.setToolbarRightMenuEnabled(it) }) } 1SFTFOUFS
  146. प੸ਊࢎ۹ /** * Adapter ী ੓ח Data ߸ചܳ ҳة *

    ੄ࢎݺ, ஠పҊܻ ಣо, ܻ࠭ܳ ॄঠ ߡౡ੉ ഝࢿച ؽ */ private fun subscribeAdapterDataChanges(dataChanges: Observable<EvaluateConsultationAdapter>) { compositeDisposable.add(dataChanges.map { isBtnEnabled(it) } .distinctUntilChanged() .subscribe { view.setBtnEnabled(it) view.setToolbarRightMenuEnabled(it) }) } 1SFTFOUFS
  147. प੸ਊࢎ۹ /** * Adapter ী ੓ח Data ߸ചܳ ҳة *

    ੄ࢎݺ, ஠పҊܻ ಣо, ܻ࠭ܳ ॄঠ ߡౡ੉ ഝࢿച ؽ */ private fun subscribeAdapterDataChanges(dataChanges: Observable<EvaluateConsultationAdapter>) { compositeDisposable.add(dataChanges.map { isBtnEnabled(it) } .distinctUntilChanged() .subscribe { view.setBtnEnabled(it) view.setToolbarRightMenuEnabled(it) }) } 1SFTFOUFS
  148. प੸ਊࢎ۹ /** * Adapter ী ੓ח Data ߸ചܳ ҳة *

    ੄ࢎݺ, ஠పҊܻ ಣо, ܻ࠭ܳ ॄঠ ߡౡ੉ ഝࢿച ؽ */ private fun subscribeAdapterDataChanges(dataChanges: Observable<EvaluateConsultationAdapter>) { compositeDisposable.add(dataChanges.map { isBtnEnabled(it) } .distinctUntilChanged() .subscribe { view.setBtnEnabled(it) view.setToolbarRightMenuEnabled(it) }) } 1SFTFOUFS
  149. प੸ਊࢎ۹ /** * Adapter ী ੓ח Data ߸ചܳ ҳة *

    ੄ࢎݺ, ஠పҊܻ ಣо, ܻ࠭ܳ ॄঠ ߡౡ੉ ഝࢿച ؽ */ private fun subscribeAdapterDataChanges(dataChanges: Observable<EvaluateConsultationAdapter>) { compositeDisposable.add(dataChanges.map { isBtnEnabled(it) } .distinctUntilChanged() .subscribe { view.setBtnEnabled(it) view.setToolbarRightMenuEnabled(it) }) } 1SFTFOUFS