diff --git a/app/src/main/kotlin/com/ayatk/biblio/view/fragment/NovelInfoFragment.kt b/app/src/main/kotlin/com/ayatk/biblio/view/fragment/NovelInfoFragment.kt index 5b6aeee9..1822be34 100644 --- a/app/src/main/kotlin/com/ayatk/biblio/view/fragment/NovelInfoFragment.kt +++ b/app/src/main/kotlin/com/ayatk/biblio/view/fragment/NovelInfoFragment.kt @@ -9,8 +9,6 @@ import android.os.Bundle import android.view.LayoutInflater import android.view.View import android.view.ViewGroup -import android.widget.TextView -import com.ayatk.biblio.R import com.ayatk.biblio.databinding.FragmentNovelInfoBinding import com.ayatk.biblio.model.Novel import com.ayatk.biblio.repository.library.LibraryRepository @@ -33,35 +31,22 @@ class NovelInfoFragment : BaseFragment() { Parcels.unwrap(arguments.getParcelable(BUNDLE_ARGS_NOVEL)) } + private lateinit var viewModel: NovelInfoViewModel + override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? { binding = FragmentNovelInfoBinding.inflate(inflater, container, false) - binding.viewModel = NovelInfoViewModel(context, navigator, libraryRepository, novel) - - novel.novelTags.map { - val tagItem = this.onGetLayoutInflater(savedInstanceState).inflate(R.layout.view_tag, null) - val textView = tagItem.findViewById(R.id.tag) - textView.text = it - binding.tagContainer.addView(textView) - } - - libraryRepository.find(novel) - .subscribe( - { - it.tag.map { - val tagItem = this.onGetLayoutInflater(savedInstanceState).inflate( - R.layout.view_tag, - null) - val textView = tagItem.findViewById(R.id.tag) - textView.text = it - binding.userTagContainer.addView(textView) - } - } - ) + viewModel = NovelInfoViewModel(navigator, libraryRepository, novel) + binding.viewModel = viewModel return binding.root } + override fun onResume() { + super.onResume() + viewModel.start() + } + override fun onAttach(context: Context?) { super.onAttach(context) component().inject(this) diff --git a/app/src/main/kotlin/com/ayatk/biblio/view/helper/DataBindingHelper.kt b/app/src/main/kotlin/com/ayatk/biblio/view/helper/DataBindingHelper.kt index 8fd93e18..358e194a 100644 --- a/app/src/main/kotlin/com/ayatk/biblio/view/helper/DataBindingHelper.kt +++ b/app/src/main/kotlin/com/ayatk/biblio/view/helper/DataBindingHelper.kt @@ -4,12 +4,31 @@ package com.ayatk.biblio.view.helper +import android.content.Context +import android.databinding.BindingAdapter import android.databinding.BindingConversion import android.graphics.drawable.ColorDrawable +import android.view.LayoutInflater +import android.widget.TextView +import com.ayatk.biblio.R +import com.google.android.flexbox.FlexboxLayout object DataBindingHelper { @JvmStatic @BindingConversion fun convertColorToDrawable(color: Int): ColorDrawable = ColorDrawable(color) + + @JvmStatic + @BindingAdapter("tags") + fun FlexboxLayout.setTags(tags: List) { + this.removeAllViews() + val inflater = this.context.getSystemService(Context.LAYOUT_INFLATER_SERVICE) as LayoutInflater + tags.map { + val tagItem = inflater.inflate(R.layout.view_tag, null) + val textView = tagItem.findViewById(R.id.tag) + textView.text = it + this.addView(textView) + } + } } diff --git a/app/src/main/kotlin/com/ayatk/biblio/viewmodel/NovelInfoViewModel.kt b/app/src/main/kotlin/com/ayatk/biblio/viewmodel/NovelInfoViewModel.kt index 4662fc0d..9e0e734d 100644 --- a/app/src/main/kotlin/com/ayatk/biblio/viewmodel/NovelInfoViewModel.kt +++ b/app/src/main/kotlin/com/ayatk/biblio/viewmodel/NovelInfoViewModel.kt @@ -7,8 +7,10 @@ package com.ayatk.biblio.viewmodel import android.app.AlertDialog import android.content.Context import android.databinding.BaseObservable +import android.databinding.Bindable import android.view.View import android.view.inputmethod.InputMethodManager +import com.ayatk.biblio.BR import com.ayatk.biblio.model.Library import com.ayatk.biblio.model.Novel import com.ayatk.biblio.repository.library.LibraryRepository @@ -17,8 +19,7 @@ import com.ayatk.biblio.view.helper.Navigator import mabbas007.tagsedittext.TagsEditText class NovelInfoViewModel -constructor(private val context: Context, - private val navigator: Navigator, +constructor(private val navigator: Navigator, private val libraryRepository: LibraryRepository, val novel: Novel) : BaseObservable(), ViewModel { @@ -48,10 +49,21 @@ constructor(private val context: Context, // } // } + @Bindable + var tags = listOf() + fun lastUpdate(): String = FORMAT_yyyyMMdd_kkmm_JP.format(novel.lastUpdateDate) fun url(): String = novel.publisher.url + novel.code.toLowerCase() + fun start() { + libraryRepository.find(novel) + .subscribe({ library -> + tags = library.tag + notifyPropertyChanged(BR.tags) + }) + } + fun onClickWriter(@Suppress("UNUSED_PARAMETER") view: View) { navigator.navigateToWebPage("http://mypage.syosetu.com/" + novel.writerId) } @@ -60,7 +72,7 @@ constructor(private val context: Context, navigator.navigateToWebPage("http://ncode.syosetu.com/" + novel.code.toLowerCase()) } - fun onClickUserTag(@Suppress("UNUSED_PARAMETER") view: View) { + fun onClickUserTag(context: Context) { val imm = context.getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager val editView = TagsEditText(context) @@ -71,8 +83,9 @@ constructor(private val context: Context, .setTitle("タグの追加") .setView(editView) .setPositiveButton("OK") { _, _ -> - libraryRepository.save(Library(novel = novel, tag = editView.tags)) - .subscribe() + libraryRepository.save(Library(novel = novel, tag = editView.tags)).subscribe() + tags = editView.tags + notifyPropertyChanged(BR.tags) imm.hideSoftInputFromWindow(editView.windowToken, 0) } .setNegativeButton("キャンセル") { _, _ -> @@ -82,11 +95,7 @@ constructor(private val context: Context, libraryRepository.find(novel) - .subscribe( - { library -> - editView.setTags(*library.tag.toTypedArray()) - } - ) + .subscribe({ library -> editView.setTags(*library.tag.toTypedArray()) }) dialog.show() editView.requestFocus() diff --git a/app/src/main/res/layout/fragment_novel_info.xml b/app/src/main/res/layout/fragment_novel_info.xml index 9707824f..38b506f4 100644 --- a/app/src/main/res/layout/fragment_novel_info.xml +++ b/app/src/main/res/layout/fragment_novel_info.xml @@ -148,7 +148,8 @@ app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintLeft_toRightOf="@+id/img_tag" app:layout_constraintRight_toRightOf="parent" - app:layout_constraintTop_toTopOf="parent"/> + app:layout_constraintTop_toTopOf="parent" + app:tags="@{viewModel.novel.novelTags}"/> @@ -156,7 +157,7 @@ android:layout_width="match_parent" android:layout_height="wrap_content" android:background="?attr/selectableItemBackground" - android:onClick="@{viewModel::onClickUserTag}" + android:onClick="@{() -> viewModel.onClickUserTag(context)}" android:padding="@dimen/space_16dp"> + app:layout_constraintTop_toTopOf="parent" + app:tags="@{viewModel.tags}"/> diff --git a/app/src/main/res/layout/view_library_item.xml b/app/src/main/res/layout/view_library_item.xml index e8e8635b..0d372a79 100644 --- a/app/src/main/res/layout/view_library_item.xml +++ b/app/src/main/res/layout/view_library_item.xml @@ -105,9 +105,12 @@ android:layout_height="wrap_content" android:layout_marginTop="8dp" android:visibility="@{viewModel.showTag ? android.view.View.VISIBLE : android.view.View.GONE}" + app:flexDirection="row" + app:flexWrap="wrap" app:layout_constraintLeft_toLeftOf="parent" app:layout_constraintRight_toRightOf="parent" - app:layout_constraintTop_toBottomOf="@+id/publisher"> + app:layout_constraintTop_toBottomOf="@+id/publisher" + app:tags="@{viewModel.library.tag}">