mirror of
https://github.com/anyproto/anytype-kotlin.git
synced 2025-06-08 13:57:10 +09:00
Merge branch 'feature_package_change' into 'feature/Convert_Block_contentType'
New packaging. See merge request ra3orbladez/anytype.io.mobile!11
This commit is contained in:
commit
99c928cc8b
9 changed files with 66 additions and 17 deletions
|
@ -7,9 +7,9 @@ import com.agileburo.anytype.feature_editor.data.datasource.BlockDataSource
|
|||
import com.agileburo.anytype.feature_editor.data.datasource.IPFSDataSourceImpl
|
||||
import com.agileburo.anytype.feature_editor.domain.EditorInteractor
|
||||
import com.agileburo.anytype.feature_editor.domain.EditorInteractorImpl
|
||||
import com.agileburo.anytype.feature_editor.presentation.BlockContentTypeConverter
|
||||
import com.agileburo.anytype.feature_editor.presentation.BlockContentTypeConverterImpl
|
||||
import com.agileburo.anytype.feature_editor.presentation.EditorViewModelFactory
|
||||
import com.agileburo.anytype.feature_editor.presentation.converter.BlockContentTypeConverter
|
||||
import com.agileburo.anytype.feature_editor.presentation.converter.BlockContentTypeConverterImpl
|
||||
import com.agileburo.anytype.feature_editor.presentation.mvvm.EditorViewModelFactory
|
||||
import com.agileburo.anytype.feature_editor.ui.EditorFragment
|
||||
import com.google.gson.Gson
|
||||
import com.google.gson.GsonBuilder
|
||||
|
@ -54,13 +54,14 @@ class EditorModule {
|
|||
@Provides
|
||||
@PerFeature
|
||||
fun provideFactory(interactor: EditorInteractor,
|
||||
contentTypeConverter: BlockContentTypeConverter): EditorViewModelFactory =
|
||||
contentTypeConverter: BlockContentTypeConverter
|
||||
): EditorViewModelFactory =
|
||||
EditorViewModelFactory(interactor, contentTypeConverter)
|
||||
|
||||
@Provides
|
||||
@PerFeature
|
||||
fun provideContentTypeConverter(): BlockContentTypeConverter =
|
||||
BlockContentTypeConverterImpl()
|
||||
BlockContentTypeConverterImpl()
|
||||
|
||||
@Provides
|
||||
@PerFeature
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
package com.agileburo.anytype.feature_editor.presentation
|
||||
package com.agileburo.anytype.feature_editor.presentation.converter
|
||||
|
||||
import com.agileburo.anytype.feature_editor.domain.Block
|
||||
import com.agileburo.anytype.feature_editor.domain.ContentParam
|
||||
|
@ -12,12 +12,12 @@ interface BlockContentTypeConverter {
|
|||
*/
|
||||
fun convert(block : Block, type : ContentType) : Block
|
||||
|
||||
|
||||
fun getPermittedTypes(typeInitial: ContentType): Set<ContentType>
|
||||
fun getForbiddenTypes(typeInitial: ContentType): Set<ContentType>
|
||||
}
|
||||
|
||||
class BlockContentTypeConverterImpl : BlockContentTypeConverter {
|
||||
class BlockContentTypeConverterImpl :
|
||||
BlockContentTypeConverter {
|
||||
|
||||
override
|
||||
fun getPermittedTypes(typeInitial: ContentType): Set<ContentType> =
|
|
@ -1,10 +1,11 @@
|
|||
package com.agileburo.anytype.feature_editor.presentation
|
||||
package com.agileburo.anytype.feature_editor.presentation.mvvm
|
||||
|
||||
import androidx.lifecycle.ViewModel
|
||||
import com.agileburo.anytype.feature_editor.disposedBy
|
||||
import com.agileburo.anytype.feature_editor.domain.Block
|
||||
import com.agileburo.anytype.feature_editor.domain.ContentType
|
||||
import com.agileburo.anytype.feature_editor.domain.EditorInteractor
|
||||
import com.agileburo.anytype.feature_editor.presentation.converter.BlockContentTypeConverter
|
||||
import com.agileburo.anytype.feature_editor.ui.EditBlockAction
|
||||
import com.agileburo.anytype.feature_editor.ui.EditorState
|
||||
import com.jakewharton.rxrelay2.BehaviorRelay
|
|
@ -1,8 +1,9 @@
|
|||
package com.agileburo.anytype.feature_editor.presentation
|
||||
package com.agileburo.anytype.feature_editor.presentation.mvvm
|
||||
|
||||
import androidx.lifecycle.ViewModel
|
||||
import androidx.lifecycle.ViewModelProvider
|
||||
import com.agileburo.anytype.feature_editor.domain.EditorInteractor
|
||||
import com.agileburo.anytype.feature_editor.presentation.converter.BlockContentTypeConverter
|
||||
|
||||
class EditorViewModelFactory(
|
||||
private val editorInteractor: EditorInteractor,
|
||||
|
@ -12,5 +13,8 @@ class EditorViewModelFactory(
|
|||
|
||||
@Suppress("UNCHECKED_CAST")
|
||||
override fun <T : ViewModel?> create(modelClass: Class<T>): T =
|
||||
EditorViewModel(interactor = editorInteractor, contentTypeConverter = contentTypeConverter) as T
|
||||
EditorViewModel(
|
||||
interactor = editorInteractor,
|
||||
contentTypeConverter = contentTypeConverter
|
||||
) as T
|
||||
}
|
|
@ -0,0 +1,21 @@
|
|||
package com.agileburo.anytype.feature_editor.presentation.util
|
||||
|
||||
import androidx.recyclerview.widget.DiffUtil
|
||||
import com.agileburo.anytype.feature_editor.presentation.model.BlockView
|
||||
|
||||
class BlockViewDiffUtil(
|
||||
private val old : List<BlockView>,
|
||||
private val new : List<BlockView>
|
||||
) : DiffUtil.Callback() {
|
||||
|
||||
override fun areItemsTheSame(oldItemPosition: Int, newItemPosition: Int): Boolean {
|
||||
return old[oldItemPosition].id == new[newItemPosition].id
|
||||
}
|
||||
|
||||
override fun getOldListSize(): Int = old.size
|
||||
override fun getNewListSize(): Int = new.size
|
||||
|
||||
override fun areContentsTheSame(oldItemPosition: Int, newItemPosition: Int): Boolean {
|
||||
return new[newItemPosition] == old[oldItemPosition]
|
||||
}
|
||||
}
|
|
@ -6,12 +6,14 @@ import android.text.style.BulletSpan
|
|||
import android.view.LayoutInflater
|
||||
import android.view.View
|
||||
import android.view.ViewGroup
|
||||
import androidx.recyclerview.widget.DiffUtil
|
||||
import androidx.recyclerview.widget.RecyclerView
|
||||
import com.agileburo.anytype.core_utils.swap
|
||||
import com.agileburo.anytype.feature_editor.R
|
||||
import com.agileburo.anytype.feature_editor.domain.Block
|
||||
import com.agileburo.anytype.feature_editor.domain.ContentType
|
||||
import com.agileburo.anytype.feature_editor.presentation.model.BlockView
|
||||
import com.agileburo.anytype.feature_editor.presentation.util.BlockViewDiffUtil
|
||||
import kotlinx.android.synthetic.main.item_block_checkbox.view.*
|
||||
import kotlinx.android.synthetic.main.item_block_code_snippet.view.*
|
||||
import kotlinx.android.synthetic.main.item_block_editable.view.*
|
||||
|
@ -44,6 +46,14 @@ class EditorAdapter(
|
|||
}
|
||||
}
|
||||
|
||||
fun update(items : List<BlockView>) {
|
||||
val callback = BlockViewDiffUtil(old = blocks, new = items)
|
||||
val result = DiffUtil.calculateDiff(callback)
|
||||
blocks.clear()
|
||||
blocks.addAll(items)
|
||||
result.dispatchUpdatesTo(this)
|
||||
}
|
||||
|
||||
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): RecyclerView.ViewHolder {
|
||||
|
||||
val inflater = LayoutInflater.from(parent.context)
|
||||
|
|
|
@ -30,6 +30,7 @@ sealed class EditorState {
|
|||
data class ShowToolbar(val block: Block, val typesToHide: Set<ContentType>) : EditorState()
|
||||
object HideToolbar : EditorState()
|
||||
data class Result(val blocks: List<Block>) : EditorState()
|
||||
data class Updates(val blocks : List<Block>) : EditorState()
|
||||
data class Update(val block: Block) : EditorState()
|
||||
object Loading : EditorState()
|
||||
}
|
|
@ -13,12 +13,11 @@ import com.agileburo.anytype.feature_editor.R
|
|||
import com.agileburo.anytype.feature_editor.disposedBy
|
||||
import com.agileburo.anytype.feature_editor.domain.Block
|
||||
import com.agileburo.anytype.feature_editor.domain.ContentType
|
||||
import com.agileburo.anytype.feature_editor.presentation.EditorViewModel
|
||||
import com.agileburo.anytype.feature_editor.presentation.EditorViewModelFactory
|
||||
import com.agileburo.anytype.feature_editor.presentation.mvvm.EditorViewModel
|
||||
import com.agileburo.anytype.feature_editor.presentation.mvvm.EditorViewModelFactory
|
||||
import com.agileburo.anytype.feature_editor.presentation.mapper.BlockViewMapper
|
||||
import io.reactivex.disposables.CompositeDisposable
|
||||
import kotlinx.android.synthetic.main.fragment_editor.*
|
||||
import timber.log.Timber
|
||||
import javax.inject.Inject
|
||||
|
||||
abstract class EditorFragment : Fragment() {
|
||||
|
@ -32,7 +31,12 @@ abstract class EditorFragment : Fragment() {
|
|||
private val viewModel by lazy {
|
||||
ViewModelProviders.of(this, factory).get(EditorViewModel::class.java)
|
||||
}
|
||||
private var disposable = CompositeDisposable()
|
||||
|
||||
private val disposable = CompositeDisposable()
|
||||
|
||||
private val blockAdapter by lazy {
|
||||
EditorAdapter(mutableListOf()) { block -> viewModel.onBlockClicked(block.id) }
|
||||
}
|
||||
|
||||
abstract fun inject()
|
||||
|
||||
|
@ -40,7 +44,7 @@ abstract class EditorFragment : Fragment() {
|
|||
inject()
|
||||
super.onAttach(context)
|
||||
viewModel.observeState()
|
||||
.subscribe { handleState(it) }
|
||||
.subscribe(this::handleState)
|
||||
.disposedBy(disposable)
|
||||
}
|
||||
|
||||
|
@ -61,7 +65,7 @@ abstract class EditorFragment : Fragment() {
|
|||
|
||||
layoutManager = LinearLayoutManager(requireContext())
|
||||
|
||||
adapter = EditorAdapter(mutableListOf()) { block -> viewModel.onBlockClicked(block.id) }
|
||||
adapter = blockAdapter
|
||||
|
||||
editBlockToolbar.setMainActions(
|
||||
textClick = { viewModel.onContentTypeClicked(EditBlockAction.TextClick(it)) },
|
||||
|
@ -90,6 +94,7 @@ abstract class EditorFragment : Fragment() {
|
|||
is EditorState.Loading -> {}
|
||||
is EditorState.Result -> setBlocks(state.blocks)
|
||||
is EditorState.Update -> updateBlock(state.block)
|
||||
is EditorState.Updates -> render(state.blocks)
|
||||
is EditorState.ShowToolbar -> showToolbar(block = state.block, typesToHide = state.typesToHide)
|
||||
is EditorState.HideToolbar -> hideToolbar()
|
||||
}
|
||||
|
@ -101,6 +106,10 @@ abstract class EditorFragment : Fragment() {
|
|||
(blockList.adapter as? EditorAdapter)?.updateBlock(mapper.mapToView(block))
|
||||
}
|
||||
|
||||
private fun render(blocks : List<Block>) {
|
||||
blockAdapter.update(blocks.map(mapper::mapToView))
|
||||
}
|
||||
|
||||
private fun showToolbar(block: Block, typesToHide: Set<ContentType>) = with(editBlockToolbar) {
|
||||
show(initialBlock = block, typesToHide = typesToHide)
|
||||
visibility = View.VISIBLE
|
||||
|
|
|
@ -1,6 +1,8 @@
|
|||
package com.agileburo.anytype.feature_editor.presentation
|
||||
|
||||
import com.agileburo.anytype.feature_editor.domain.ContentType
|
||||
import com.agileburo.anytype.feature_editor.presentation.converter.BlockContentTypeConverter
|
||||
import com.agileburo.anytype.feature_editor.presentation.converter.BlockContentTypeConverterImpl
|
||||
import org.junit.Assert
|
||||
import org.junit.Before
|
||||
import org.junit.Test
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue