Skip to content

Commit bd65666

Browse files
authored
Merge pull request #93 from infinum/develop
Develop
2 parents b6e350e + 6208d00 commit bd65666

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

56 files changed

+664
-389
lines changed

CHANGELOG.md

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,14 @@
11
Changelog
22
=========
33

4+
## Version 5.3.7
5+
6+
_2021-07-22_
7+
8+
* Update Kotlin to 1.5.21.
9+
* Remove lambdas as method parameters.
10+
* Fix memory leaks.
11+
412
## Version 5.3.6
513

614
_2021-07-09_

README.md

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -44,13 +44,13 @@ Then add the following dependencies in your app `build.gradle` or `build.gradle.
4444

4545
**Groovy**
4646
```groovy
47-
debugImplementation "com.infinum.dbinspector:dbinspector:5.3.6"
48-
releaseImplementation "com.infinum.dbinspector:dbinspector-no-op:5.3.6"
47+
debugImplementation "com.infinum.dbinspector:dbinspector:5.3.7"
48+
releaseImplementation "com.infinum.dbinspector:dbinspector-no-op:5.3.7"
4949
```
5050
**KotlinDSL**
5151
```kotlin
52-
debugImplementation("com.infinum.dbinspector:dbinspector:5.3.6")
53-
releaseImplementation("com.infinum.dbinspector:dbinspector-no-op:5.3.6")
52+
debugImplementation("com.infinum.dbinspector:dbinspector:5.3.7")
53+
releaseImplementation("com.infinum.dbinspector:dbinspector-no-op:5.3.7")
5454
```
5555

5656
### Usage

config.gradle

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ ext {
77
]
88
releaseConfig = [
99
"group" : "com.infinum.dbinspector",
10-
"version" : "5.3.6",
11-
"versionCode": 5 * 100 * 100 + 3 * 100 + 6
10+
"version" : "5.3.7",
11+
"versionCode": 5 * 100 * 100 + 3 * 100 + 7
1212
]
1313
}

dbinspector/src/main/kotlin/com/infinum/dbinspector/ui/content/shared/ContentActivity.kt

Lines changed: 52 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ import android.os.Bundle
77
import androidx.activity.result.ActivityResultLauncher
88
import androidx.annotation.MenuRes
99
import androidx.annotation.StringRes
10+
import androidx.lifecycle.lifecycleScope
1011
import androidx.paging.LoadState
1112
import androidx.recyclerview.widget.ConcatAdapter
1213
import androidx.recyclerview.widget.GridLayoutManager
@@ -28,8 +29,10 @@ import com.infinum.dbinspector.ui.shared.delegates.lifecycleConnection
2829
import com.infinum.dbinspector.ui.shared.delegates.viewBinding
2930
import com.infinum.dbinspector.ui.shared.edgefactories.bounce.BounceEdgeEffectFactory
3031
import com.infinum.dbinspector.ui.shared.headers.HeaderAdapter
32+
import kotlinx.coroutines.launch
3133

32-
internal abstract class ContentActivity : BaseActivity() {
34+
@Suppress("TooManyFunctions")
35+
internal abstract class ContentActivity : BaseActivity<ContentState, ContentEvent>() {
3336

3437
override val binding by viewBinding(DbinspectorActivityContentBinding::inflate)
3538

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

4952
private lateinit var contentPreviewFactory: ContentPreviewFactory
5053

51-
private lateinit var headerAdapter: HeaderAdapter
54+
private val headerAdapter: HeaderAdapter = HeaderAdapter()
5255

53-
private lateinit var contentAdapter: ContentAdapter
56+
private val contentAdapter: ContentAdapter = ContentAdapter()
5457

5558
private lateinit var contract: ActivityResultLauncher<EditContract.Input>
5659

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

6265
contentPreviewFactory = ContentPreviewFactory(this)
6366

67+
headerAdapter.isClickable = true
68+
headerAdapter.onClick = { header ->
69+
query(connection.schemaName!!, header.name, header.sort)
70+
headerAdapter.updateHeader(header)
71+
}
72+
73+
contentAdapter.onCellClicked = { cell -> contentPreviewFactory.showCell(cell) }
74+
6475
contract = registerForActivityResult(EditContract()) { shouldRefresh ->
6576
if (shouldRefresh) {
6677
contentAdapter.refresh()
@@ -76,16 +87,23 @@ internal abstract class ContentActivity : BaseActivity() {
7687
connection.schemaName!!
7788
)
7889

79-
viewModel.header(connection.schemaName!!) { tableHeaders ->
80-
headerAdapter = HeaderAdapter(tableHeaders, true) { header ->
81-
query(connection.schemaName!!, header.name, header.sort)
82-
headerAdapter.updateHeader(header)
83-
}
90+
viewModel.header(connection.schemaName!!)
91+
} else {
92+
showDatabaseParametersError()
93+
}
94+
}
95+
96+
override fun onDestroy() {
97+
contract.unregister()
98+
super.onDestroy()
99+
}
100+
101+
override fun onState(state: ContentState) {
102+
when (state) {
103+
is ContentState.Headers -> {
104+
headerAdapter.setItems(state.headers)
84105

85-
contentAdapter = ContentAdapter(
86-
headersCount = tableHeaders.size,
87-
onCellClicked = { cell -> contentPreviewFactory.showCell(cell) }
88-
)
106+
contentAdapter.headersCount = state.headers.size
89107

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

101119
recyclerView.layoutManager = GridLayoutManager(
102120
this@ContentActivity,
103-
tableHeaders.size,
121+
state.headers.size,
104122
RecyclerView.VERTICAL,
105123
false
106124
)
@@ -110,14 +128,28 @@ internal abstract class ContentActivity : BaseActivity() {
110128

111129
query(connection.schemaName!!)
112130
}
113-
} else {
114-
showDatabaseParametersError()
131+
is ContentState.Content -> {
132+
// if (this::contentAdapter.isInitialized.not()) {
133+
// viewModel.header(connection.schemaName!!)
134+
// } else {
135+
lifecycleScope.launch {
136+
contentAdapter.submitData(state.content)
137+
}
138+
// }
139+
}
115140
}
116141
}
117142

118-
override fun onDestroy() {
119-
contract.unregister()
120-
super.onDestroy()
143+
override fun onEvent(event: ContentEvent) {
144+
when (event) {
145+
is ContentEvent.Dropped -> {
146+
when (viewModel) {
147+
is TableViewModel -> clearTable()
148+
is TriggerViewModel -> dropTrigger()
149+
is ViewViewModel -> dropView()
150+
}
151+
}
152+
}
121153
}
122154

123155
private fun setupUi(databasePath: String, databaseName: String, schemaName: String) {
@@ -167,13 +199,7 @@ internal abstract class ContentActivity : BaseActivity() {
167199
.setTitle(R.string.dbinspector_title_info)
168200
.setMessage(String.format(getString(drop), name))
169201
.setPositiveButton(android.R.string.ok) { dialog: DialogInterface, _: Int ->
170-
viewModel.drop(name) {
171-
when (viewModel) {
172-
is TableViewModel -> clearTable()
173-
is TriggerViewModel -> dropTrigger()
174-
is ViewViewModel -> dropView()
175-
}
176-
}
202+
viewModel.drop(name)
177203
dialog.dismiss()
178204
}
179205
.setNegativeButton(android.R.string.cancel) { dialog: DialogInterface, _: Int ->
@@ -187,9 +213,7 @@ internal abstract class ContentActivity : BaseActivity() {
187213
orderBy: String? = null,
188214
sort: Sort = Sort.ASCENDING
189215
) =
190-
viewModel.query(name, orderBy, sort) {
191-
contentAdapter.submitData(it)
192-
}
216+
viewModel.query(name, orderBy, sort)
193217

194218
private fun clearTable() =
195219
contentAdapter.refresh()

dbinspector/src/main/kotlin/com/infinum/dbinspector/ui/content/shared/ContentAdapter.kt

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -7,10 +7,10 @@ import com.infinum.dbinspector.databinding.DbinspectorItemCellBinding
77
import com.infinum.dbinspector.domain.shared.models.Cell
88
import com.infinum.dbinspector.ui.shared.diffutils.CellDiffUtil
99

10-
internal class ContentAdapter(
11-
private val headersCount: Int,
12-
private val onCellClicked: (Cell) -> Unit
13-
) : PagingDataAdapter<Cell, ContentViewHolder>(CellDiffUtil()) {
10+
internal class ContentAdapter : PagingDataAdapter<Cell, ContentViewHolder>(CellDiffUtil()) {
11+
12+
var headersCount: Int = 0
13+
var onCellClicked: ((Cell) -> Unit)? = null
1414

1515
init {
1616
stateRestorationPolicy = StateRestorationPolicy.PREVENT_WHEN_EMPTY
@@ -26,8 +26,10 @@ internal class ContentAdapter(
2626
)
2727

2828
override fun onBindViewHolder(holder: ContentViewHolder, position: Int) {
29-
val item = getItem(position)
30-
holder.bind(item, position / headersCount, onCellClicked)
29+
if (headersCount > 0) {
30+
val item = getItem(position)
31+
holder.bind(item, position / headersCount, onCellClicked)
32+
}
3133
}
3234

3335
override fun onViewRecycled(holder: ContentViewHolder) =
Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
package com.infinum.dbinspector.ui.content.shared
2+
3+
internal sealed class ContentEvent {
4+
5+
class Dropped : ContentEvent()
6+
}
Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
package com.infinum.dbinspector.ui.content.shared
2+
3+
import androidx.paging.PagingData
4+
import com.infinum.dbinspector.domain.shared.models.Cell
5+
import com.infinum.dbinspector.ui.shared.headers.Header
6+
7+
internal sealed class ContentState {
8+
9+
data class Headers(
10+
val headers: List<Header>
11+
) : ContentState()
12+
13+
data class Content(
14+
val content: PagingData<Cell>
15+
) : ContentState()
16+
}

dbinspector/src/main/kotlin/com/infinum/dbinspector/ui/content/shared/ContentViewHolder.kt

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ internal class ContentViewHolder(
1616
fun bind(
1717
item: Cell?,
1818
row: Int,
19-
onCellClicked: (Cell) -> Unit
19+
onCellClicked: ((Cell) -> Unit)?
2020
) {
2121
item?.let { cell ->
2222
bindValue(cell)
@@ -37,7 +37,7 @@ internal class ContentViewHolder(
3737
private fun bindRoot(
3838
row: Int,
3939
cell: Cell,
40-
onCellClicked: (Cell) -> Unit
40+
onCellClicked: ((Cell) -> Unit)?
4141
) =
4242
with(viewBinding) {
4343
this.root.setBackgroundColor(
@@ -51,7 +51,7 @@ internal class ContentViewHolder(
5151
)
5252
)
5353
this.root.setOnClickListener {
54-
onCellClicked(cell)
54+
onCellClicked?.invoke(cell)
5555
}
5656
}
5757

dbinspector/src/main/kotlin/com/infinum/dbinspector/ui/content/shared/ContentViewModel.kt

Lines changed: 13 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -1,25 +1,25 @@
11
package com.infinum.dbinspector.ui.content.shared
22

3-
import androidx.paging.PagingData
43
import com.infinum.dbinspector.domain.UseCases
54
import com.infinum.dbinspector.domain.schema.shared.models.exceptions.DropException
65
import com.infinum.dbinspector.domain.shared.base.BaseUseCase
7-
import com.infinum.dbinspector.domain.shared.models.Cell
86
import com.infinum.dbinspector.domain.shared.models.Page
97
import com.infinum.dbinspector.domain.shared.models.Sort
108
import com.infinum.dbinspector.domain.shared.models.parameters.ContentParameters
119
import com.infinum.dbinspector.domain.shared.models.parameters.PragmaParameters
1210
import com.infinum.dbinspector.ui.shared.datasources.ContentDataSource
1311
import com.infinum.dbinspector.ui.shared.headers.Header
1412
import com.infinum.dbinspector.ui.shared.paging.PagingViewModel
13+
import kotlinx.coroutines.flow.collectLatest
14+
import kotlinx.coroutines.flow.flowOn
1515

1616
internal abstract class ContentViewModel(
1717
openConnection: UseCases.OpenConnection,
1818
closeConnection: UseCases.CloseConnection,
1919
private val schemaInfo: BaseUseCase<PragmaParameters.Pragma, Page>,
2020
private val getSchema: BaseUseCase<ContentParameters, Page>,
2121
private val dropSchema: BaseUseCase<ContentParameters, Page>
22-
) : PagingViewModel(openConnection, closeConnection) {
22+
) : PagingViewModel<ContentState, ContentEvent>(openConnection, closeConnection) {
2323

2424
abstract fun headerStatement(name: String): String
2525

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

33-
fun header(
34-
schemaName: String,
35-
onData: suspend (value: List<Header>) -> Unit
36-
) =
33+
fun header(schemaName: String) =
3734
launch {
3835
val result = io {
3936
schemaInfo(
@@ -49,26 +46,24 @@ internal abstract class ContentViewModel(
4946
)
5047
}
5148
}
52-
onData(result)
49+
setState(ContentState.Headers(headers = result))
5350
}
5451

5552
fun query(
5653
schemaName: String,
5754
orderBy: String?,
58-
sort: Sort,
59-
onData: suspend (value: PagingData<Cell>) -> Unit
55+
sort: Sort
6056
) {
6157
launch {
62-
pageFlow(databasePath, schemaStatement(schemaName, orderBy, sort)) {
63-
onData(it)
64-
}
58+
pageFlow(databasePath, schemaStatement(schemaName, orderBy, sort))
59+
.flowOn(runningDispatchers)
60+
.collectLatest {
61+
setState(ContentState.Content(content = it))
62+
}
6563
}
6664
}
6765

68-
fun drop(
69-
schemaName: String,
70-
onDone: suspend () -> Unit
71-
) {
66+
fun drop(schemaName: String) {
7267
launch {
7368
val result = io {
7469
dropSchema(
@@ -79,7 +74,7 @@ internal abstract class ContentViewModel(
7974
).cells
8075
}
8176
if (result.isEmpty()) {
82-
onDone()
77+
emitEvent(ContentEvent.Dropped())
8378
} else {
8479
throw DropException()
8580
}
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
package com.infinum.dbinspector.ui.databases
2+
3+
import com.infinum.dbinspector.domain.database.models.DatabaseDescriptor
4+
5+
internal sealed class DatabaseState {
6+
7+
data class Databases(
8+
val databases: List<DatabaseDescriptor>
9+
) : DatabaseState()
10+
}

0 commit comments

Comments
 (0)