Skip to content

Commit

Permalink
Merge pull request #93 from infinum/develop
Browse files Browse the repository at this point in the history
Develop
  • Loading branch information
bojankoma authored Jul 22, 2021
2 parents b6e350e + 6208d00 commit bd65666
Show file tree
Hide file tree
Showing 56 changed files with 664 additions and 389 deletions.
8 changes: 8 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,6 +1,14 @@
Changelog
=========

## Version 5.3.7

_2021-07-22_

* Update Kotlin to 1.5.21.
* Remove lambdas as method parameters.
* Fix memory leaks.

## Version 5.3.6

_2021-07-09_
Expand Down
8 changes: 4 additions & 4 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -44,13 +44,13 @@ Then add the following dependencies in your app `build.gradle` or `build.gradle.

**Groovy**
```groovy
debugImplementation "com.infinum.dbinspector:dbinspector:5.3.6"
releaseImplementation "com.infinum.dbinspector:dbinspector-no-op:5.3.6"
debugImplementation "com.infinum.dbinspector:dbinspector:5.3.7"
releaseImplementation "com.infinum.dbinspector:dbinspector-no-op:5.3.7"
```
**KotlinDSL**
```kotlin
debugImplementation("com.infinum.dbinspector:dbinspector:5.3.6")
releaseImplementation("com.infinum.dbinspector:dbinspector-no-op:5.3.6")
debugImplementation("com.infinum.dbinspector:dbinspector:5.3.7")
releaseImplementation("com.infinum.dbinspector:dbinspector-no-op:5.3.7")
```

### Usage
Expand Down
4 changes: 2 additions & 2 deletions config.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@ ext {
]
releaseConfig = [
"group" : "com.infinum.dbinspector",
"version" : "5.3.6",
"versionCode": 5 * 100 * 100 + 3 * 100 + 6
"version" : "5.3.7",
"versionCode": 5 * 100 * 100 + 3 * 100 + 7
]
}
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@ import android.os.Bundle
import androidx.activity.result.ActivityResultLauncher
import androidx.annotation.MenuRes
import androidx.annotation.StringRes
import androidx.lifecycle.lifecycleScope
import androidx.paging.LoadState
import androidx.recyclerview.widget.ConcatAdapter
import androidx.recyclerview.widget.GridLayoutManager
Expand All @@ -28,8 +29,10 @@ import com.infinum.dbinspector.ui.shared.delegates.lifecycleConnection
import com.infinum.dbinspector.ui.shared.delegates.viewBinding
import com.infinum.dbinspector.ui.shared.edgefactories.bounce.BounceEdgeEffectFactory
import com.infinum.dbinspector.ui.shared.headers.HeaderAdapter
import kotlinx.coroutines.launch

internal abstract class ContentActivity : BaseActivity() {
@Suppress("TooManyFunctions")
internal abstract class ContentActivity : BaseActivity<ContentState, ContentEvent>() {

override val binding by viewBinding(DbinspectorActivityContentBinding::inflate)

Expand All @@ -48,9 +51,9 @@ internal abstract class ContentActivity : BaseActivity() {

private lateinit var contentPreviewFactory: ContentPreviewFactory

private lateinit var headerAdapter: HeaderAdapter
private val headerAdapter: HeaderAdapter = HeaderAdapter()

private lateinit var contentAdapter: ContentAdapter
private val contentAdapter: ContentAdapter = ContentAdapter()

private lateinit var contract: ActivityResultLauncher<EditContract.Input>

Expand All @@ -61,6 +64,14 @@ internal abstract class ContentActivity : BaseActivity() {

contentPreviewFactory = ContentPreviewFactory(this)

headerAdapter.isClickable = true
headerAdapter.onClick = { header ->
query(connection.schemaName!!, header.name, header.sort)
headerAdapter.updateHeader(header)
}

contentAdapter.onCellClicked = { cell -> contentPreviewFactory.showCell(cell) }

contract = registerForActivityResult(EditContract()) { shouldRefresh ->
if (shouldRefresh) {
contentAdapter.refresh()
Expand All @@ -76,16 +87,23 @@ internal abstract class ContentActivity : BaseActivity() {
connection.schemaName!!
)

viewModel.header(connection.schemaName!!) { tableHeaders ->
headerAdapter = HeaderAdapter(tableHeaders, true) { header ->
query(connection.schemaName!!, header.name, header.sort)
headerAdapter.updateHeader(header)
}
viewModel.header(connection.schemaName!!)
} else {
showDatabaseParametersError()
}
}

override fun onDestroy() {
contract.unregister()
super.onDestroy()
}

override fun onState(state: ContentState) {
when (state) {
is ContentState.Headers -> {
headerAdapter.setItems(state.headers)

contentAdapter = ContentAdapter(
headersCount = tableHeaders.size,
onCellClicked = { cell -> contentPreviewFactory.showCell(cell) }
)
contentAdapter.headersCount = state.headers.size

with(binding) {
contentAdapter.addLoadStateListener { loadState ->
Expand All @@ -100,7 +118,7 @@ internal abstract class ContentActivity : BaseActivity() {

recyclerView.layoutManager = GridLayoutManager(
this@ContentActivity,
tableHeaders.size,
state.headers.size,
RecyclerView.VERTICAL,
false
)
Expand All @@ -110,14 +128,28 @@ internal abstract class ContentActivity : BaseActivity() {

query(connection.schemaName!!)
}
} else {
showDatabaseParametersError()
is ContentState.Content -> {
// if (this::contentAdapter.isInitialized.not()) {
// viewModel.header(connection.schemaName!!)
// } else {
lifecycleScope.launch {
contentAdapter.submitData(state.content)
}
// }
}
}
}

override fun onDestroy() {
contract.unregister()
super.onDestroy()
override fun onEvent(event: ContentEvent) {
when (event) {
is ContentEvent.Dropped -> {
when (viewModel) {
is TableViewModel -> clearTable()
is TriggerViewModel -> dropTrigger()
is ViewViewModel -> dropView()
}
}
}
}

private fun setupUi(databasePath: String, databaseName: String, schemaName: String) {
Expand Down Expand Up @@ -167,13 +199,7 @@ internal abstract class ContentActivity : BaseActivity() {
.setTitle(R.string.dbinspector_title_info)
.setMessage(String.format(getString(drop), name))
.setPositiveButton(android.R.string.ok) { dialog: DialogInterface, _: Int ->
viewModel.drop(name) {
when (viewModel) {
is TableViewModel -> clearTable()
is TriggerViewModel -> dropTrigger()
is ViewViewModel -> dropView()
}
}
viewModel.drop(name)
dialog.dismiss()
}
.setNegativeButton(android.R.string.cancel) { dialog: DialogInterface, _: Int ->
Expand All @@ -187,9 +213,7 @@ internal abstract class ContentActivity : BaseActivity() {
orderBy: String? = null,
sort: Sort = Sort.ASCENDING
) =
viewModel.query(name, orderBy, sort) {
contentAdapter.submitData(it)
}
viewModel.query(name, orderBy, sort)

private fun clearTable() =
contentAdapter.refresh()
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,10 +7,10 @@ import com.infinum.dbinspector.databinding.DbinspectorItemCellBinding
import com.infinum.dbinspector.domain.shared.models.Cell
import com.infinum.dbinspector.ui.shared.diffutils.CellDiffUtil

internal class ContentAdapter(
private val headersCount: Int,
private val onCellClicked: (Cell) -> Unit
) : PagingDataAdapter<Cell, ContentViewHolder>(CellDiffUtil()) {
internal class ContentAdapter : PagingDataAdapter<Cell, ContentViewHolder>(CellDiffUtil()) {

var headersCount: Int = 0
var onCellClicked: ((Cell) -> Unit)? = null

init {
stateRestorationPolicy = StateRestorationPolicy.PREVENT_WHEN_EMPTY
Expand All @@ -26,8 +26,10 @@ internal class ContentAdapter(
)

override fun onBindViewHolder(holder: ContentViewHolder, position: Int) {
val item = getItem(position)
holder.bind(item, position / headersCount, onCellClicked)
if (headersCount > 0) {
val item = getItem(position)
holder.bind(item, position / headersCount, onCellClicked)
}
}

override fun onViewRecycled(holder: ContentViewHolder) =
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
package com.infinum.dbinspector.ui.content.shared

internal sealed class ContentEvent {

class Dropped : ContentEvent()
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
package com.infinum.dbinspector.ui.content.shared

import androidx.paging.PagingData
import com.infinum.dbinspector.domain.shared.models.Cell
import com.infinum.dbinspector.ui.shared.headers.Header

internal sealed class ContentState {

data class Headers(
val headers: List<Header>
) : ContentState()

data class Content(
val content: PagingData<Cell>
) : ContentState()
}
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@ internal class ContentViewHolder(
fun bind(
item: Cell?,
row: Int,
onCellClicked: (Cell) -> Unit
onCellClicked: ((Cell) -> Unit)?
) {
item?.let { cell ->
bindValue(cell)
Expand All @@ -37,7 +37,7 @@ internal class ContentViewHolder(
private fun bindRoot(
row: Int,
cell: Cell,
onCellClicked: (Cell) -> Unit
onCellClicked: ((Cell) -> Unit)?
) =
with(viewBinding) {
this.root.setBackgroundColor(
Expand All @@ -51,7 +51,7 @@ internal class ContentViewHolder(
)
)
this.root.setOnClickListener {
onCellClicked(cell)
onCellClicked?.invoke(cell)
}
}

Expand Down
Original file line number Diff line number Diff line change
@@ -1,25 +1,25 @@
package com.infinum.dbinspector.ui.content.shared

import androidx.paging.PagingData
import com.infinum.dbinspector.domain.UseCases
import com.infinum.dbinspector.domain.schema.shared.models.exceptions.DropException
import com.infinum.dbinspector.domain.shared.base.BaseUseCase
import com.infinum.dbinspector.domain.shared.models.Cell
import com.infinum.dbinspector.domain.shared.models.Page
import com.infinum.dbinspector.domain.shared.models.Sort
import com.infinum.dbinspector.domain.shared.models.parameters.ContentParameters
import com.infinum.dbinspector.domain.shared.models.parameters.PragmaParameters
import com.infinum.dbinspector.ui.shared.datasources.ContentDataSource
import com.infinum.dbinspector.ui.shared.headers.Header
import com.infinum.dbinspector.ui.shared.paging.PagingViewModel
import kotlinx.coroutines.flow.collectLatest
import kotlinx.coroutines.flow.flowOn

internal abstract class ContentViewModel(
openConnection: UseCases.OpenConnection,
closeConnection: UseCases.CloseConnection,
private val schemaInfo: BaseUseCase<PragmaParameters.Pragma, Page>,
private val getSchema: BaseUseCase<ContentParameters, Page>,
private val dropSchema: BaseUseCase<ContentParameters, Page>
) : PagingViewModel(openConnection, closeConnection) {
) : PagingViewModel<ContentState, ContentEvent>(openConnection, closeConnection) {

abstract fun headerStatement(name: String): String

Expand All @@ -30,10 +30,7 @@ internal abstract class ContentViewModel(
override fun dataSource(databasePath: String, statement: String) =
ContentDataSource(databasePath, statement, getSchema)

fun header(
schemaName: String,
onData: suspend (value: List<Header>) -> Unit
) =
fun header(schemaName: String) =
launch {
val result = io {
schemaInfo(
Expand All @@ -49,26 +46,24 @@ internal abstract class ContentViewModel(
)
}
}
onData(result)
setState(ContentState.Headers(headers = result))
}

fun query(
schemaName: String,
orderBy: String?,
sort: Sort,
onData: suspend (value: PagingData<Cell>) -> Unit
sort: Sort
) {
launch {
pageFlow(databasePath, schemaStatement(schemaName, orderBy, sort)) {
onData(it)
}
pageFlow(databasePath, schemaStatement(schemaName, orderBy, sort))
.flowOn(runningDispatchers)
.collectLatest {
setState(ContentState.Content(content = it))
}
}
}

fun drop(
schemaName: String,
onDone: suspend () -> Unit
) {
fun drop(schemaName: String) {
launch {
val result = io {
dropSchema(
Expand All @@ -79,7 +74,7 @@ internal abstract class ContentViewModel(
).cells
}
if (result.isEmpty()) {
onDone()
emitEvent(ContentEvent.Dropped())
} else {
throw DropException()
}
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
package com.infinum.dbinspector.ui.databases

import com.infinum.dbinspector.domain.database.models.DatabaseDescriptor

internal sealed class DatabaseState {

data class Databases(
val databases: List<DatabaseDescriptor>
) : DatabaseState()
}
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,6 @@ package com.infinum.dbinspector.ui.databases

import android.content.Context
import android.net.Uri
import androidx.lifecycle.MutableLiveData
import com.infinum.dbinspector.domain.UseCases
import com.infinum.dbinspector.domain.database.models.DatabaseDescriptor
import com.infinum.dbinspector.domain.shared.models.parameters.DatabaseParameters
Expand All @@ -13,20 +12,19 @@ internal class DatabaseViewModel(
private val importDatabases: UseCases.ImportDatabases,
private val removeDatabase: UseCases.RemoveDatabase,
private val copyDatabase: UseCases.CopyDatabase
) : BaseViewModel() {

val databases: MutableLiveData<List<DatabaseDescriptor>> = MutableLiveData()
) : BaseViewModel<DatabaseState, Any>() {

fun browse(context: Context, query: String? = null) {
launch {
databases.value = io {
val result = io {
getDatabases(
DatabaseParameters.Get(
context = context,
argument = query
)
)
}
setState(DatabaseState.Databases(databases = result))
}
}

Expand Down
Loading

0 comments on commit bd65666

Please sign in to comment.