Skip to content

Commit 1510112

Browse files
committed
Update screenshots and fix bugs
1 parent 77c5da4 commit 1510112

33 files changed

+116
-100
lines changed

README.md

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -60,13 +60,13 @@ Your donation is highly appreciated. Thank you!
6060

6161
## Screenshots
6262

63-
| ![files](screenshots/2.jpeg) | ![web](screenshots/3.jpeg) | ![notes](screenshots/4.jpeg) | |
64-
|--------------------------------------------|--------------------------------------------------|-----------------------------------------------|--------------------------------------------------|
65-
| ![audio](screenshots/5.jpeg) | ![images](screenshots/6.jpeg) | ![videos](screenshots/7.jpeg) | ![rss](screenshots/8.jpeg) |
66-
| ![home](screenshots/web-home.png) | ![images](screenshots/web-images.png) | ![videos](screenshots/web-videos.png) | ![notes](screenshots/web-notes.png) |
67-
| ![files](screenshots/web-files.png) | ![encryption](screenshots/web-calls.png) | ![messages](screenshots/web-messages.png) | ![contacts](screenshots/web-contacts.png) |
68-
| ![audio](screenshots/web-audios.png) | ![rss](screenshots/web-rss.png) | ![encryption](screenshots/web-encryption.png) | ![encryption](screenshots/web-screen-mirror.png) |
69-
| ![audio](screenshots/web-image.png) | ![rss](screenshots/web-video.png) | | |
63+
| ![files](screenshots/app-files.jpg) | ![home](screenshots/app-home.jpg) | ![music player](screenshots/app-music-player.jpg) | |
64+
|--------------------------------------|------------------------------------------|---------------------------------------------------|--------------------------------------------------|
65+
| ![audio](screenshots/app-audio.jpg) | ![images](screenshots/app-images.jpg) | ![videos](screenshots/app-videos.jpg) | ![rss](screenshots/app-rss.jpg) |
66+
| ![home](screenshots/web-home.png) | ![images](screenshots/web-images.png) | ![videos](screenshots/web-videos.png) | ![notes](screenshots/web-notes.png) |
67+
| ![files](screenshots/web-files.png) | ![encryption](screenshots/web-calls.png) | ![messages](screenshots/web-messages.png) | ![contacts](screenshots/web-contacts.png) |
68+
| ![audio](screenshots/web-audios.png) | ![rss](screenshots/web-rss.png) | ![encryption](screenshots/web-encryption.png) | ![encryption](screenshots/web-screen-mirror.png) |
69+
| ![audio](screenshots/web-image.png) | ![rss](screenshots/web-video.png) | | |
7070

7171
## Compatibility
7272

app/src/main/java/com/ismartcoding/plain/features/file/FileSystemHelper.kt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -77,8 +77,8 @@ object FileSystemHelper {
7777
) ?: Environment.getExternalStorageDirectory()?.absolutePath?.trimEnd('/') ?: ""
7878
}
7979

80-
fun getInternalStorageName(context: Context): String {
81-
return storageManager.primaryStorageVolume.getDescription(context) ?: getString(R.string.internal_storage)
80+
fun getInternalStorageName(): String {
81+
return getString(R.string.internal_storage)
8282
}
8383

8484
fun getExternalFilesDirPath(context: Context): String {

app/src/main/java/com/ismartcoding/plain/ui/components/FileRenameDialog.kt

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -11,11 +11,10 @@ import com.ismartcoding.plain.MainApp
1111
import com.ismartcoding.plain.R
1212
import com.ismartcoding.plain.helpers.FileHelper
1313
import com.ismartcoding.plain.ui.base.TextFieldDialog
14-
import com.ismartcoding.plain.ui.models.TagsViewModel
1514
import kotlinx.coroutines.launch
1615

1716
@Composable
18-
fun FileRenameDialog(path: String, onDismiss: () -> Unit, onDone: (String) -> Unit) {
17+
fun FileRenameDialog(path: String, onDismiss: () -> Unit, onDoneAsync: suspend (String) -> Unit) {
1918
val scope = rememberCoroutineScope()
2019
val oldName = remember {
2120
mutableStateOf(path.substringAfterLast("/"))
@@ -41,7 +40,7 @@ fun FileRenameDialog(path: String, onDismiss: () -> Unit, onDone: (String) -> Un
4140
MainApp.instance.scanFileByConnection(path)
4241
if (newFile != null) {
4342
MainApp.instance.scanFileByConnection(newFile.absolutePath)
44-
onDone(newFile.absolutePath)
43+
onDoneAsync(newFile.absolutePath)
4544
}
4645
}
4746
onDismiss()

app/src/main/java/com/ismartcoding/plain/ui/components/FolderKanbanDialog.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,7 @@ fun FolderKanbanDialog(filesVM: FilesViewModel, onDismiss: () -> Unit = {}) {
4444
menuItems.add(
4545
MenuItemModel(FileSystemHelper.getInternalStoragePath()).apply {
4646
isChecked = filesVM.type == FilesType.INTERNAL_STORAGE
47-
title = FileSystemHelper.getInternalStorageName(context)
47+
title = FileSystemHelper.getInternalStorageName()
4848
iconId = R.drawable.hard_drive
4949
}
5050
)

app/src/main/java/com/ismartcoding/plain/ui/components/TagNameDialog.kt

Lines changed: 13 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,18 @@
11
package com.ismartcoding.plain.ui.components
22

33
import androidx.compose.runtime.Composable
4+
import androidx.compose.runtime.rememberCoroutineScope
45
import androidx.compose.ui.res.stringResource
56
import com.ismartcoding.plain.R
67
import com.ismartcoding.plain.ui.base.TextFieldDialog
78
import com.ismartcoding.plain.ui.models.TagsViewModel
9+
import kotlinx.coroutines.Dispatchers
10+
import kotlinx.coroutines.launch
811

912
@Composable
10-
fun TagNameDialog(tagsVM: TagsViewModel, onChanged: () -> Unit = {}) {
13+
fun TagNameDialog(tagsVM: TagsViewModel, onChangedAsync: suspend () -> Unit = {}) {
1114
val tag = tagsVM.editItem.value
15+
val scope = rememberCoroutineScope()
1216
if (tagsVM.tagNameDialogVisible.value) {
1317
TextFieldDialog(
1418
title = stringResource(id = if (tag != null) R.string.edit_tag else R.string.add_tag),
@@ -22,12 +26,15 @@ fun TagNameDialog(tagsVM: TagsViewModel, onChanged: () -> Unit = {}) {
2226
},
2327
confirmText = stringResource(id = R.string.save),
2428
onConfirm = {
25-
if (tag != null) {
26-
tagsVM.editTag(tagsVM.editTagName.value)
27-
} else {
28-
tagsVM.addTag(tagsVM.editTagName.value)
29+
scope.launch(Dispatchers.IO) {
30+
if (tag != null) {
31+
tagsVM.editTagAsync(tagsVM.editTagName.value)
32+
} else {
33+
tagsVM.addTagAsync(tagsVM.editTagName.value)
34+
}
35+
onChangedAsync()
2936
}
30-
onChanged()
37+
3138
},
3239
)
3340
}

app/src/main/java/com/ismartcoding/plain/ui/components/TagSelector.kt

Lines changed: 17 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ import androidx.compose.runtime.Composable
99
import androidx.compose.runtime.LaunchedEffect
1010
import androidx.compose.runtime.mutableStateListOf
1111
import androidx.compose.runtime.remember
12+
import androidx.compose.runtime.rememberCoroutineScope
1213
import androidx.compose.ui.Alignment
1314
import androidx.compose.ui.Modifier
1415
import androidx.compose.ui.unit.dp
@@ -17,6 +18,8 @@ import com.ismartcoding.plain.db.DTag
1718
import com.ismartcoding.plain.db.DTagRelation
1819
import com.ismartcoding.plain.ui.base.PSelectionChip
1920
import com.ismartcoding.plain.ui.models.TagsViewModel
21+
import kotlinx.coroutines.Dispatchers
22+
import kotlinx.coroutines.launch
2023

2124
@OptIn(ExperimentalLayoutApi::class)
2225
@Composable
@@ -25,34 +28,37 @@ fun TagSelector(
2528
tagsVM: TagsViewModel,
2629
tagsMap: Map<String, List<DTagRelation>>,
2730
tagsState: List<DTag>,
28-
onChanged: () -> Unit
31+
onChangedAsync: suspend () -> Unit
2932
) {
3033
val tagIds = remember {
3134
mutableStateListOf<String>()
3235
}
36+
val scope = rememberCoroutineScope()
3337
LaunchedEffect(Unit) {
3438
tagIds.addAll(tagsMap[data.id]?.map { it.tagId } ?: emptyList())
3539
}
36-
TagNameDialog(tagsVM, onChanged)
40+
TagNameDialog(tagsVM, onChangedAsync)
3741
FlowRow(
3842
modifier =
39-
Modifier
40-
.fillMaxWidth()
41-
.padding(horizontal = 16.dp),
43+
Modifier
44+
.fillMaxWidth()
45+
.padding(horizontal = 16.dp),
4246
horizontalArrangement = Arrangement.spacedBy(16.dp, Alignment.Start),
4347
verticalArrangement = Arrangement.SpaceBetween,
4448
) {
4549
tagsState.forEach { tag ->
4650
PSelectionChip(
4751
selected = tagIds.contains(tag.id),
4852
onClick = {
49-
tagsVM.toggleTag(data, tag.id)
50-
if (tagIds.contains(tag.id)) {
51-
tagIds.remove(tag.id)
52-
} else {
53-
tagIds.add(tag.id)
53+
scope.launch(Dispatchers.IO) {
54+
tagsVM.toggleTagAsync(data, tag.id)
55+
if (tagIds.contains(tag.id)) {
56+
tagIds.remove(tag.id)
57+
} else {
58+
tagIds.add(tag.id)
59+
}
60+
onChangedAsync()
5461
}
55-
onChanged()
5662
},
5763
text = tag.name
5864
)

app/src/main/java/com/ismartcoding/plain/ui/components/mediaviewer/ViewMediaBottomSheet.kt

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -47,9 +47,9 @@ fun ViewMediaBottomSheet(
4747
tagsMap: Map<String, List<DTagRelation>>? = null,
4848
tagsState: List<DTag> = emptyList(),
4949
onDismiss: () -> Unit = {},
50-
onRenamed: () -> Unit = {},
50+
onRenamedAsync: suspend () -> Unit = {},
5151
deleteAction: () -> Unit = {},
52-
onTagsChanged: () -> Unit = {},
52+
onTagsChangedAsync: suspend () -> Unit = {},
5353
) {
5454
var showRenameDialog by remember {
5555
mutableStateOf(false)
@@ -58,9 +58,9 @@ fun ViewMediaBottomSheet(
5858
if (showRenameDialog) {
5959
FileRenameDialog(path = m.path, onDismiss = {
6060
showRenameDialog = false
61-
}, onDone = {
61+
}, onDoneAsync = {
6262
m.path = m.path.substring(0, m.path.lastIndexOf("/") + 1) + it
63-
onRenamed()
63+
onRenamedAsync()
6464
onDismiss()
6565
})
6666
}
@@ -96,8 +96,8 @@ fun ViewMediaBottomSheet(
9696
tagsVM = tagsVM!!,
9797
tagsMap = tagsMap!!,
9898
tagsState = tagsState,
99-
onChanged = {
100-
onTagsChanged()
99+
onChangedAsync = {
100+
onTagsChangedAsync()
101101
}
102102
)
103103
VerticalSpace(dp = 16.dp)

app/src/main/java/com/ismartcoding/plain/ui/components/mediaviewer/previewer/MediaPreviewer.kt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -199,11 +199,11 @@ fun MediaPreviewer(
199199
onDismiss = {
200200
state.showMediaInfo = false
201201
},
202-
onRenamed = onRenamed,
202+
onRenamedAsync = onRenamed,
203203
deleteAction = {
204204
deleteAction(m)
205205
},
206-
onTagsChanged = onTagsChanged
206+
onTagsChangedAsync = onTagsChanged
207207
)
208208
}
209209

app/src/main/java/com/ismartcoding/plain/ui/models/FilesViewModel.kt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -60,7 +60,7 @@ class FilesViewModel : ISearchableViewModel<DFile>, ISelectableViewModel<DFile>,
6060
}
6161
}
6262

63-
val breadcrumbs = mutableStateListOf(BreadcrumbItem(FileSystemHelper.getInternalStorageName(MainApp.instance), root))
63+
val breadcrumbs = mutableStateListOf(BreadcrumbItem(FileSystemHelper.getInternalStorageName(), root))
6464
val selectedBreadcrumbIndex = mutableIntStateOf(0)
6565
var cutFiles = mutableListOf<DFile>()
6666
var copyFiles = mutableListOf<DFile>()
@@ -139,7 +139,7 @@ class FilesViewModel : ISearchableViewModel<DFile>, ISelectableViewModel<DFile>,
139139

140140
private fun rebuildBreadcrumbs(targetPath: String) {
141141
breadcrumbs.clear()
142-
breadcrumbs.add(BreadcrumbItem(FileSystemHelper.getInternalStorageName(MainApp.instance), root))
142+
breadcrumbs.add(BreadcrumbItem(FileSystemHelper.getInternalStorageName(), root))
143143

144144
if (targetPath != root) {
145145
val relativePath = targetPath.removePrefix(root).trim('/')

app/src/main/java/com/ismartcoding/plain/ui/models/TagsViewModel.kt

Lines changed: 33 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -54,33 +54,29 @@ class TagsViewModel : ViewModel() {
5454
}
5555
}
5656

57-
fun addTag(name: String) {
58-
viewModelScope.launch(Dispatchers.IO) {
59-
val id = TagHelper.addOrUpdate("") {
57+
suspend fun addTagAsync(name: String) {
58+
val id = TagHelper.addOrUpdate("") {
59+
this.name = name
60+
type = dataType.value.value
61+
}
62+
_itemsFlow.update {
63+
val mutableList = it.toMutableStateList()
64+
mutableList.add(DTag(id).apply {
6065
this.name = name
6166
type = dataType.value.value
62-
}
63-
_itemsFlow.update {
64-
val mutableList = it.toMutableStateList()
65-
mutableList.add(DTag(id).apply {
66-
this.name = name
67-
type = dataType.value.value
68-
})
69-
mutableList
70-
}
67+
})
68+
mutableList
7169
}
7270
tagNameDialogVisible.value = false
7371
}
7472

75-
fun editTag(name: String) {
76-
viewModelScope.launch(Dispatchers.IO) {
77-
val id = TagHelper.addOrUpdate(editItem.value!!.id) {
78-
this.name = name
79-
}
80-
_itemsFlow.update {
81-
it.toMutableStateList().apply {
82-
find { i -> i.id == id }?.name = name
83-
}
73+
suspend fun editTagAsync(name: String) {
74+
val id = TagHelper.addOrUpdate(editItem.value!!.id) {
75+
this.name = name
76+
}
77+
_itemsFlow.update {
78+
it.toMutableStateList().apply {
79+
find { i -> i.id == id }?.name = name
8480
}
8581
}
8682
tagNameDialogVisible.value = false
@@ -135,28 +131,26 @@ class TagsViewModel : ViewModel() {
135131
}
136132
}
137133

138-
fun toggleTag(
134+
suspend fun toggleTagAsync(
139135
data: IData, tagId: String
140136
) {
141137
val tagIds = _tagsMapFlow.value[data.id]?.map { it.tagId } ?: emptyList()
142-
viewModelScope.launch(Dispatchers.IO) {
143-
try {
144-
if (tagIds.contains(tagId)) {
145-
TagHelper.deleteTagRelationByKeysTagId(setOf(data.id), tagId)
146-
_tagsMapFlow.value[data.id] = _tagsMapFlow.value[data.id]?.filter { it.tagId != tagId } ?: emptyList()
147-
} else {
148-
val relation = TagRelationStub.create(data).toTagRelation(tagId, dataType.value)
149-
TagHelper.addTagRelations(
150-
listOf(relation)
151-
)
152-
_tagsMapFlow.value[data.id] = _tagsMapFlow.value[data.id]?.toMutableList()?.apply {
153-
add(relation)
154-
} ?: listOf(relation)
155-
}
156-
loadAsync()
157-
} catch (ex: Exception) {
158-
LogCat.e(ex.toString())
138+
try {
139+
if (tagIds.contains(tagId)) {
140+
TagHelper.deleteTagRelationByKeysTagId(setOf(data.id), tagId)
141+
_tagsMapFlow.value[data.id] = _tagsMapFlow.value[data.id]?.filter { it.tagId != tagId } ?: emptyList()
142+
} else {
143+
val relation = TagRelationStub.create(data).toTagRelation(tagId, dataType.value)
144+
TagHelper.addTagRelations(
145+
listOf(relation)
146+
)
147+
_tagsMapFlow.value[data.id] = _tagsMapFlow.value[data.id]?.toMutableList()?.apply {
148+
add(relation)
149+
} ?: listOf(relation)
159150
}
151+
loadAsync()
152+
} catch (ex: Exception) {
153+
LogCat.e(ex.toString())
160154
}
161155
}
162156

0 commit comments

Comments
 (0)