mirror of https://github.com/nextcloud/android
Use chunks for bigger task output
Signed-off-by: alperozturk <alper_ozturk@proton.me>
This commit is contained in:
parent
ac1f066e24
commit
8e82b5e16c
|
@ -28,6 +28,7 @@ import androidx.compose.material3.MaterialTheme
|
|||
import androidx.compose.material3.Text
|
||||
import androidx.compose.runtime.Composable
|
||||
import androidx.compose.runtime.getValue
|
||||
import androidx.compose.runtime.mutableIntStateOf
|
||||
import androidx.compose.runtime.mutableStateOf
|
||||
import androidx.compose.runtime.remember
|
||||
import androidx.compose.runtime.setValue
|
||||
|
@ -43,6 +44,8 @@ import androidx.compose.ui.unit.dp
|
|||
import androidx.compose.ui.unit.sp
|
||||
import com.nextcloud.client.assistant.extensions.statusData
|
||||
import com.nextcloud.ui.composeComponents.bottomSheet.MoreActionsBottomSheet
|
||||
import com.nextcloud.utils.extensions.getRandomString
|
||||
import com.nextcloud.utils.extensions.splitIntoChunks
|
||||
import com.owncloud.android.R
|
||||
import com.owncloud.android.lib.resources.assistant.model.Task
|
||||
|
||||
|
@ -53,7 +56,8 @@ fun TaskView(
|
|||
task: Task,
|
||||
showDeleteTaskAlertDialog: (Long) -> Unit
|
||||
) {
|
||||
var expanded by remember { mutableStateOf(false) }
|
||||
var loadedChunkSize by remember { mutableIntStateOf(1) }
|
||||
val taskOutputChunks = task.output?.splitIntoChunks(100)
|
||||
var showMoreActionsBottomSheet by remember { mutableStateOf(false) }
|
||||
|
||||
Column(
|
||||
|
@ -62,7 +66,11 @@ fun TaskView(
|
|||
.clip(RoundedCornerShape(16.dp))
|
||||
.background(MaterialTheme.colorScheme.primary)
|
||||
.combinedClickable(onClick = {
|
||||
expanded = !expanded
|
||||
if (taskOutputChunks?.size != loadedChunkSize) {
|
||||
loadedChunkSize += 1
|
||||
} else {
|
||||
loadedChunkSize = 1
|
||||
}
|
||||
}, onLongClick = {
|
||||
showMoreActionsBottomSheet = true
|
||||
})
|
||||
|
@ -80,21 +88,23 @@ fun TaskView(
|
|||
|
||||
Spacer(modifier = Modifier.height(16.dp))
|
||||
|
||||
task.output?.let {
|
||||
HorizontalDivider(modifier = Modifier.padding(horizontal = 4.dp, vertical = 8.dp))
|
||||
taskOutputChunks?.take(loadedChunkSize).let {
|
||||
it?.joinToString("")?.let { output ->
|
||||
HorizontalDivider(modifier = Modifier.padding(horizontal = 4.dp, vertical = 8.dp))
|
||||
|
||||
Text(
|
||||
text = if (expanded) it else it.take(100) + "...",
|
||||
fontSize = 12.sp,
|
||||
color = Color.White,
|
||||
modifier = Modifier
|
||||
.animateContentSize(
|
||||
animationSpec = spring(
|
||||
dampingRatio = Spring.DampingRatioLowBouncy,
|
||||
stiffness = Spring.StiffnessLow
|
||||
Text(
|
||||
text = output,
|
||||
fontSize = 12.sp,
|
||||
color = Color.White,
|
||||
modifier = Modifier
|
||||
.animateContentSize(
|
||||
animationSpec = spring(
|
||||
dampingRatio = Spring.DampingRatioLowBouncy,
|
||||
stiffness = Spring.StiffnessLow
|
||||
)
|
||||
)
|
||||
)
|
||||
)
|
||||
)
|
||||
}
|
||||
}
|
||||
|
||||
Row(
|
||||
|
@ -121,7 +131,7 @@ fun TaskView(
|
|||
if ((task.output?.length ?: 0) >= 100) {
|
||||
Image(
|
||||
painter = painterResource(
|
||||
id = if (!expanded) R.drawable.ic_expand_more else R.drawable.ic_expand_less
|
||||
id = if (loadedChunkSize != taskOutputChunks?.size) R.drawable.ic_expand_more else R.drawable.ic_expand_less
|
||||
),
|
||||
contentDescription = "expand content icon",
|
||||
colorFilter = ColorFilter.tint(Color.White)
|
||||
|
@ -153,21 +163,7 @@ fun TaskView(
|
|||
@Preview
|
||||
@Composable
|
||||
private fun TaskViewPreview() {
|
||||
val output =
|
||||
"Lorem Ipsum is simply dummy text of the printing and " +
|
||||
"typesetting industry. Lorem Ipsum has been the " +
|
||||
"industry's standard dummy text ever since the 1500s, " +
|
||||
"when an unknown printer took a galley of type and " +
|
||||
"scrambled it to make a type specimen book. " +
|
||||
"It has survived not only five centuries, but also " +
|
||||
"the leap into electronic typesetting, remaining" +
|
||||
" essentially unchanged. It wLorem Ipsum is simply dummy" +
|
||||
" text of the printing and typesetting industry. " +
|
||||
"Lorem Ipsum has been the industry's standard dummy " +
|
||||
"text ever since the 1500s, when an unknown printer took a" +
|
||||
" galley of type and scrambled it to make a type specimen book. " +
|
||||
"It has survived not only five centuries, but also the leap " +
|
||||
"into electronic typesetting, remaining essentially unchanged."
|
||||
val output = "Lorem".getRandomString(100)
|
||||
|
||||
TaskView(
|
||||
task = Task(
|
||||
|
|
|
@ -7,6 +7,7 @@
|
|||
*/
|
||||
package com.nextcloud.client.assistant.repository
|
||||
|
||||
import com.nextcloud.utils.extensions.getRandomString
|
||||
import com.owncloud.android.lib.common.operations.RemoteOperationResult
|
||||
import com.owncloud.android.lib.resources.assistant.model.Task
|
||||
import com.owncloud.android.lib.resources.assistant.model.TaskList
|
||||
|
@ -41,15 +42,18 @@ class AssistantMockRepository(private val giveEmptyTasks: Boolean = false) : Ass
|
|||
null,
|
||||
"12",
|
||||
"",
|
||||
"Give me some text",
|
||||
"Lorem Ipsum is simply dummy text of the printing and typesetting industry. " +
|
||||
"Lorem Ipsum has been the industry's standard dummy text ever since the 1500s," +
|
||||
" when an unknown printer took a galley of type and scrambled it to make a type" +
|
||||
" specimen book. It has survived not only five centuries, " +
|
||||
"but also the leap into electronic typesetting, remaining essentially unchanged." +
|
||||
" It was popularised in the 1960s with the release of Letraset sheets containing " +
|
||||
"Lorem Ipsum passages, and more recently with desktop publishing software like Aldus" +
|
||||
" PageMaker including versions of Lorem Ipsum",
|
||||
"Give me some long text",
|
||||
"Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nunc consectetur condimentum augue, sit amet maximus nibh pharetra sodales. Donec blandit nulla vitae diam aliquam, vel viverra sem faucibus. Duis vitae pretium sapien. Curabitur nec libero erat. Nunc pretium eleifend mi non congue. Sed efficitur ullamcorper mi, ac faucibus mi mollis sed. Donec vestibulum enim vel massa sodales facilisis. Integer in consequat nibh. Sed id nisi erat. Donec sollicitudin pharetra massa, id sodales arcu mollis luctus. Donec sed ullamcorper nisl, non euismod metus. Proin eget sollicitudin purus.\n" +
|
||||
"\n" +
|
||||
"Etiam sit amet nisl pretium, facilisis ligula vel, luctus arcu. Nunc bibendum hendrerit ultricies. Integer scelerisque sem arcu, eget fermentum neque pretium in. Curabitur facilisis neque vel leo blandit tincidunt. Nullam at sodales nisl, eu porta leo. Nulla facilisi. Fusce cursus, turpis eget auctor iaculis, eros lectus posuere magna, a tristique purus nunc id quam.\n" +
|
||||
"\n" +
|
||||
"Nullam faucibus mauris eget magna vehicula auctor. Aliquam molestie purus quis magna mattis, sed commodo dolor condimentum. Mauris hendrerit libero ut tellus rutrum, et sagittis diam luctus. Nunc non semper neque, eget scelerisque tortor. Donec hendrerit faucibus dolor, at congue orci dignissim nec. Duis vel interdum elit, maximus elementum orci. Phasellus ut ligula id sapien dictum euismod. Vestibulum tincidunt vitae orci a congue. Nunc nec commodo urna, quis vulputate orci. Suspendisse euismod urna orci. Phasellus in metus lobortis, auctor mauris vel, venenatis nulla.\n" +
|
||||
"\n" +
|
||||
"Quisque lectus felis, placerat eget consequat quis, mattis et nisi. In bibendum in orci fermentum rhoncus. Nam eu nibh ex. Cras vel ligula eu quam pharetra ullamcorper. Integer a ultricies eros, at rutrum ligula. Nam laoreet convallis velit sit amet vulputate. In eleifend interdum risus, pulvinar dictum tellus. Fusce in posuere mauris, sed commodo urna. Etiam a ante id felis viverra commodo vel sed elit. Maecenas in libero turpis. Donec non elit feugiat, ullamcorper massa sit amet, lobortis turpis. Fusce mollis felis eu elementum ornare. Nulla facilisi.\n" +
|
||||
"\n" +
|
||||
"Curabitur sed erat vel urna luctus consequat sit amet et lacus. Donec eu tempus sapien. Morbi commodo finibus sapien, in consequat dui. Etiam ac odio magna. Cras ut nisl scelerisque, consectetur ante et, laoreet diam. Morbi efficitur, nibh ac volutpat rhoncus, urna eros cursus ipsum, non vulputate magna ipsum sit amet risus. Donec at arcu ullamcorper, pretium augue porttitor, dapibus arcu. Ut mollis velit sed tristique maximus. Duis iaculis porta ligula iaculis congue. Quisque laoreet ligula euismod faucibus consectetur. Nunc sit amet quam venenatis, dignissim nisl id, commodo augue. Nulla faucibus dui nec tortor viverra, at posuere orci sollicitudin. Sed fringilla porta lectus, id pretium tortor mattis eget. Cras suscipit mi pharetra, eleifend nisl quis, ultrices eros. Maecenas a nulla in dui blandit pellentesque non et mi.\n" +
|
||||
"\n" +
|
||||
"Curabitur purus mauris, scelerisque vitae metus vitae, pellentesque suscipit eros. Morbi tincidunt consequat felis at sagittis. Aenean purus elit, porta eu fringilla vitae, tincidunt ac leo. Quisque non neque et eros pretium sagittis vel sit amet sem. Fusce nec finibus elit. Proin scelerisque libero a mi blandit, quis accumsan dolor interdum. Praesent aliquet nisi in vehicula viverra. Nunc vitae accumsan neque. Donec.",
|
||||
"",
|
||||
""
|
||||
),
|
||||
|
@ -60,10 +64,21 @@ class AssistantMockRepository(private val giveEmptyTasks: Boolean = false) : Ass
|
|||
"12",
|
||||
"",
|
||||
"Give me some text 2",
|
||||
"Lorem Ipsum is simply dummy text of the printing and typesetting industry.",
|
||||
"Lorem".getRandomString(100),
|
||||
"",
|
||||
""
|
||||
)
|
||||
),
|
||||
Task(
|
||||
3,
|
||||
"FreePrompt",
|
||||
null,
|
||||
"12",
|
||||
"",
|
||||
"Give me some text",
|
||||
"Lorem".getRandomString(300),
|
||||
"",
|
||||
""
|
||||
),
|
||||
)
|
||||
)
|
||||
}
|
||||
|
|
|
@ -0,0 +1,28 @@
|
|||
/*
|
||||
* Nextcloud - Android Client
|
||||
*
|
||||
* SPDX-FileCopyrightText: 2024 Your Name <your@email.com>
|
||||
* SPDX-License-Identifier: AGPL-3.0-or-later
|
||||
*/
|
||||
|
||||
package com.nextcloud.utils.extensions
|
||||
|
||||
fun String.getRandomString(length: Int) : String {
|
||||
val allowedChars = ('A'..'Z') + ('a'..'z') + ('0'..'9')
|
||||
val result = (1..length)
|
||||
.map { allowedChars.random() }
|
||||
.joinToString("")
|
||||
|
||||
return this + result
|
||||
}
|
||||
|
||||
fun String.splitIntoChunks(chunkSize: Int): List<String> {
|
||||
val chunks = mutableListOf<String>()
|
||||
var startIndex = 0
|
||||
while (startIndex < length) {
|
||||
val endIndex = kotlin.math.min(startIndex + chunkSize, length)
|
||||
chunks.add(substring(startIndex, endIndex))
|
||||
startIndex = endIndex
|
||||
}
|
||||
return chunks
|
||||
}
|
|
@ -32,7 +32,6 @@ import android.os.Handler;
|
|||
import android.os.Looper;
|
||||
import android.os.SystemClock;
|
||||
import android.text.TextUtils;
|
||||
import android.view.Gravity;
|
||||
import android.view.Menu;
|
||||
import android.view.MenuItem;
|
||||
import android.view.View;
|
||||
|
|
Loading…
Reference in New Issue