Compare commits
4
Commits
1.1.1
..
e5b14a3d2f
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
e5b14a3d2f | ||
|
|
5eb6e52b8d | ||
|
|
c978a4414d | ||
|
|
70e04ac1e9 |
@@ -92,8 +92,8 @@ android {
|
|||||||
applicationId = "com.example.research"
|
applicationId = "com.example.research"
|
||||||
minSdk = project.property("minSdk").toString().toInt()
|
minSdk = project.property("minSdk").toString().toInt()
|
||||||
targetSdk = project.property("targetSdk").toString().toInt()
|
targetSdk = project.property("targetSdk").toString().toInt()
|
||||||
versionCode = 3
|
versionCode = 2
|
||||||
versionName = "1.1.1"
|
versionName = "1.1.0"
|
||||||
|
|
||||||
val isFdroid = project.hasProperty("fdroid")
|
val isFdroid = project.hasProperty("fdroid")
|
||||||
if (isFdroid) {
|
if (isFdroid) {
|
||||||
|
|||||||
@@ -1,45 +0,0 @@
|
|||||||
package com.example.research.core.performance
|
|
||||||
|
|
||||||
import android.os.Trace
|
|
||||||
import java.util.concurrent.atomic.AtomicInteger
|
|
||||||
|
|
||||||
object ReSearchTrace {
|
|
||||||
const val SEARCH_PAGING = "ReSearch/Search/Paging"
|
|
||||||
const val SEARCH_DIRECT = "ReSearch/Search/Direct"
|
|
||||||
const val ARTICLE_PARSE = "ReSearch/Article/Parse"
|
|
||||||
const val ARTICLE_READ = "ReSearch/Article/Read"
|
|
||||||
const val ARTICLE_PRE_MEASURE = "ReSearch/Article/PreMeasure"
|
|
||||||
const val DICTIONARY_DOWNLOAD = "ReSearch/Dictionary/Download"
|
|
||||||
const val DICTIONARY_EXTRACT = "ReSearch/Dictionary/Extract"
|
|
||||||
const val DICTIONARY_INDEX = "ReSearch/Dictionary/Index"
|
|
||||||
const val DICTIONARY_IMPORT = "ReSearch/Dictionary/Import"
|
|
||||||
const val FLOW_UPDATE_CARD_APPEAR = "ReSearch/Flow/UpdateCardAppear"
|
|
||||||
const val FLOW_UPDATING = "ReSearch/Flow/Updating"
|
|
||||||
const val FLOW_PROGRESS_DISAPPEAR = "ReSearch/Flow/ProgressDisappear"
|
|
||||||
|
|
||||||
private val nextCookie = AtomicInteger()
|
|
||||||
|
|
||||||
@PublishedApi
|
|
||||||
internal val isAndroidRuntime = System.getProperty("java.vm.name") == "Dalvik"
|
|
||||||
|
|
||||||
inline fun <T> section(name: String, block: () -> T): T {
|
|
||||||
if (!isAndroidRuntime) return block()
|
|
||||||
Trace.beginSection(name)
|
|
||||||
return try {
|
|
||||||
block()
|
|
||||||
} finally {
|
|
||||||
Trace.endSection()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
suspend fun <T> asyncSection(name: String, block: suspend () -> T): T {
|
|
||||||
if (!isAndroidRuntime) return block()
|
|
||||||
val cookie = nextCookie.incrementAndGet()
|
|
||||||
Trace.beginAsyncSection(name, cookie)
|
|
||||||
return try {
|
|
||||||
block()
|
|
||||||
} finally {
|
|
||||||
Trace.endAsyncSection(name, cookie)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,7 +1,6 @@
|
|||||||
package com.example.research.common.ui.theme
|
package com.example.research.common.ui.theme
|
||||||
|
|
||||||
import androidx.compose.material3.Typography
|
import androidx.compose.material3.Typography
|
||||||
import androidx.compose.ui.text.PlatformTextStyle
|
|
||||||
import androidx.compose.ui.text.TextStyle
|
import androidx.compose.ui.text.TextStyle
|
||||||
import androidx.compose.ui.text.font.FontFamily
|
import androidx.compose.ui.text.font.FontFamily
|
||||||
import androidx.compose.ui.text.font.FontWeight
|
import androidx.compose.ui.text.font.FontWeight
|
||||||
@@ -86,8 +85,3 @@ val Typography = Typography(
|
|||||||
letterSpacing = 0.5.sp
|
letterSpacing = 0.5.sp
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
|
|
||||||
val Typography.dictionaryTitleLarge: TextStyle
|
|
||||||
get() = titleLarge.copy(
|
|
||||||
platformStyle = PlatformTextStyle(includeFontPadding = true)
|
|
||||||
)
|
|
||||||
|
|||||||
@@ -27,7 +27,7 @@ class DownloadManager(
|
|||||||
|
|
||||||
companion object {
|
companion object {
|
||||||
private const val TAG = "DownloadManager"
|
private const val TAG = "DownloadManager"
|
||||||
private const val DOWNLOAD_PROGRESS_STEP_PERCENT = 1
|
private const val DOWNLOAD_PROGRESS_STEP_PERCENT = 3
|
||||||
private const val EXTRACT_PROGRESS_STEP_PERCENT = 5
|
private const val EXTRACT_PROGRESS_STEP_PERCENT = 5
|
||||||
private val TERMINAL_STATE_DURATION = 2.seconds
|
private val TERMINAL_STATE_DURATION = 2.seconds
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -22,7 +22,6 @@ import androidx.compose.ui.text.style.TextOverflow
|
|||||||
import androidx.compose.ui.unit.IntSize
|
import androidx.compose.ui.unit.IntSize
|
||||||
import androidx.lifecycle.compose.collectAsStateWithLifecycle
|
import androidx.lifecycle.compose.collectAsStateWithLifecycle
|
||||||
import com.example.research.R
|
import com.example.research.R
|
||||||
import com.example.research.common.ui.theme.dictionaryTitleLarge
|
|
||||||
import com.example.research.feature.search.SearchAction
|
import com.example.research.feature.search.SearchAction
|
||||||
import com.example.research.ui.theme.Spacing
|
import com.example.research.ui.theme.Spacing
|
||||||
import com.example.research.ui.theme.AppWindowInsets
|
import com.example.research.ui.theme.AppWindowInsets
|
||||||
@@ -259,7 +258,7 @@ fun ArticleTitleBar(
|
|||||||
|
|
||||||
Text(
|
Text(
|
||||||
text = title,
|
text = title,
|
||||||
style = MaterialTheme.typography.dictionaryTitleLarge,
|
style = MaterialTheme.typography.titleLarge,
|
||||||
color = MaterialTheme.colorScheme.onSurface,
|
color = MaterialTheme.colorScheme.onSurface,
|
||||||
maxLines = 1,
|
maxLines = 1,
|
||||||
overflow = TextOverflow.Ellipsis,
|
overflow = TextOverflow.Ellipsis,
|
||||||
|
|||||||
@@ -1,6 +1,7 @@
|
|||||||
package com.example.research.ui.main.components
|
package com.example.research.ui.main.components
|
||||||
|
|
||||||
import androidx.compose.foundation.layout.Arrangement
|
import androidx.compose.foundation.layout.Arrangement
|
||||||
|
import androidx.compose.foundation.layout.Box
|
||||||
import androidx.compose.foundation.layout.Row
|
import androidx.compose.foundation.layout.Row
|
||||||
import androidx.compose.foundation.layout.fillMaxWidth
|
import androidx.compose.foundation.layout.fillMaxWidth
|
||||||
import androidx.compose.foundation.layout.height
|
import androidx.compose.foundation.layout.height
|
||||||
@@ -8,18 +9,16 @@ import androidx.compose.foundation.layout.padding
|
|||||||
import androidx.compose.foundation.layout.size
|
import androidx.compose.foundation.layout.size
|
||||||
import androidx.compose.foundation.layout.windowInsetsPadding
|
import androidx.compose.foundation.layout.windowInsetsPadding
|
||||||
import androidx.compose.foundation.shape.RoundedCornerShape
|
import androidx.compose.foundation.shape.RoundedCornerShape
|
||||||
|
import androidx.compose.foundation.text.BasicTextField
|
||||||
import androidx.compose.foundation.text.KeyboardOptions
|
import androidx.compose.foundation.text.KeyboardOptions
|
||||||
import androidx.compose.foundation.text.input.TextFieldLineLimits
|
import androidx.compose.foundation.text.input.TextFieldLineLimits
|
||||||
import androidx.compose.foundation.text.input.TextFieldState
|
import androidx.compose.foundation.text.input.TextFieldState
|
||||||
import androidx.compose.material3.ExperimentalMaterial3Api
|
|
||||||
import androidx.compose.material3.FilledIconButton
|
import androidx.compose.material3.FilledIconButton
|
||||||
import androidx.compose.material3.Icon
|
import androidx.compose.material3.Icon
|
||||||
import androidx.compose.material3.IconButton
|
import androidx.compose.material3.IconButton
|
||||||
import androidx.compose.material3.IconButtonDefaults
|
import androidx.compose.material3.IconButtonDefaults
|
||||||
import androidx.compose.material3.MaterialTheme
|
import androidx.compose.material3.MaterialTheme
|
||||||
import androidx.compose.material3.Surface
|
import androidx.compose.material3.Surface
|
||||||
import androidx.compose.material3.TextField
|
|
||||||
import androidx.compose.material3.TextFieldDefaults
|
|
||||||
import androidx.compose.runtime.Composable
|
import androidx.compose.runtime.Composable
|
||||||
import androidx.compose.runtime.LaunchedEffect
|
import androidx.compose.runtime.LaunchedEffect
|
||||||
import androidx.compose.runtime.getValue
|
import androidx.compose.runtime.getValue
|
||||||
@@ -28,7 +27,7 @@ import androidx.compose.runtime.snapshotFlow
|
|||||||
import com.example.research.ui.theme.AppWindowInsets
|
import com.example.research.ui.theme.AppWindowInsets
|
||||||
import androidx.compose.ui.Alignment
|
import androidx.compose.ui.Alignment
|
||||||
import androidx.compose.ui.Modifier
|
import androidx.compose.ui.Modifier
|
||||||
import androidx.compose.ui.graphics.Color
|
import androidx.compose.ui.graphics.SolidColor
|
||||||
import androidx.compose.ui.platform.testTag
|
import androidx.compose.ui.platform.testTag
|
||||||
import androidx.compose.ui.res.painterResource
|
import androidx.compose.ui.res.painterResource
|
||||||
import androidx.compose.ui.res.stringResource
|
import androidx.compose.ui.res.stringResource
|
||||||
@@ -37,11 +36,9 @@ import androidx.compose.ui.semantics.testTagsAsResourceId
|
|||||||
import androidx.compose.ui.text.input.ImeAction
|
import androidx.compose.ui.text.input.ImeAction
|
||||||
import androidx.compose.ui.unit.dp
|
import androidx.compose.ui.unit.dp
|
||||||
import com.example.research.R
|
import com.example.research.R
|
||||||
import com.example.research.common.ui.theme.dictionaryTitleLarge
|
|
||||||
import kotlinx.coroutines.flow.distinctUntilChanged
|
import kotlinx.coroutines.flow.distinctUntilChanged
|
||||||
import com.example.research.ui.theme.Spacing
|
|
||||||
|
|
||||||
private val TopBarHeight = Spacing.topBarHeight
|
private val TopBarHeight = 56.dp
|
||||||
private val TopBarShape = RoundedCornerShape(28.dp)
|
private val TopBarShape = RoundedCornerShape(28.dp)
|
||||||
|
|
||||||
@Composable
|
@Composable
|
||||||
@@ -102,7 +99,6 @@ fun MainTopBar(
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Composable
|
@Composable
|
||||||
@OptIn(ExperimentalMaterial3Api::class)
|
|
||||||
private fun SearchField(
|
private fun SearchField(
|
||||||
searchState: TextFieldState,
|
searchState: TextFieldState,
|
||||||
enabled: Boolean,
|
enabled: Boolean,
|
||||||
@@ -114,6 +110,8 @@ private fun SearchField(
|
|||||||
modifier: Modifier = Modifier
|
modifier: Modifier = Modifier
|
||||||
) {
|
) {
|
||||||
val containerColor = MaterialTheme.colorScheme.surfaceContainerHighest
|
val containerColor = MaterialTheme.colorScheme.surfaceContainerHighest
|
||||||
|
val contentColor = MaterialTheme.colorScheme.onSurface
|
||||||
|
val placeholderColor = MaterialTheme.colorScheme.onSurfaceVariant
|
||||||
|
|
||||||
val currentOnQueryChange by rememberUpdatedState(onQueryChange)
|
val currentOnQueryChange by rememberUpdatedState(onQueryChange)
|
||||||
|
|
||||||
@@ -125,57 +123,57 @@ private fun SearchField(
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
TextField(
|
Surface(
|
||||||
state = searchState,
|
modifier = modifier.height(TopBarHeight),
|
||||||
enabled = enabled,
|
color = containerColor,
|
||||||
textStyle = MaterialTheme.typography.dictionaryTitleLarge,
|
shape = TopBarShape
|
||||||
keyboardOptions = KeyboardOptions(imeAction = ImeAction.Search),
|
) {
|
||||||
lineLimits = TextFieldLineLimits.SingleLine,
|
Row(
|
||||||
leadingIcon = {
|
modifier = Modifier.padding(horizontal = 16.dp),
|
||||||
|
verticalAlignment = Alignment.CenterVertically
|
||||||
|
) {
|
||||||
Icon(
|
Icon(
|
||||||
painter = searchIcon,
|
painter = searchIcon,
|
||||||
contentDescription = null,
|
contentDescription = null,
|
||||||
|
tint = placeholderColor,
|
||||||
modifier = Modifier.size(24.dp)
|
modifier = Modifier.size(24.dp)
|
||||||
)
|
)
|
||||||
},
|
|
||||||
trailingIcon = if (searchState.text.isNotEmpty()) {
|
BasicTextField(
|
||||||
{
|
state = searchState,
|
||||||
|
enabled = enabled,
|
||||||
|
textStyle = MaterialTheme.typography.titleLarge.copy(color = contentColor),
|
||||||
|
cursorBrush = SolidColor(MaterialTheme.colorScheme.primary),
|
||||||
|
keyboardOptions = KeyboardOptions(imeAction = ImeAction.Search),
|
||||||
|
lineLimits = TextFieldLineLimits.SingleLine,
|
||||||
|
modifier = Modifier
|
||||||
|
.weight(1f)
|
||||||
|
.padding(horizontal = 12.dp)
|
||||||
|
.testTag("search_field")
|
||||||
|
.semantics { testTagsAsResourceId = true }
|
||||||
|
)
|
||||||
|
|
||||||
|
if (searchState.text.isNotEmpty()) {
|
||||||
IconButton(
|
IconButton(
|
||||||
onClick = {
|
onClick = {
|
||||||
searchState.edit { replace(0, length, "") }
|
searchState.edit { replace(0, length, "") }
|
||||||
onClearQuery()
|
onClearQuery()
|
||||||
},
|
},
|
||||||
modifier = Modifier
|
modifier = Modifier
|
||||||
|
.size(40.dp)
|
||||||
.testTag("clear_search")
|
.testTag("clear_search")
|
||||||
.semantics { testTagsAsResourceId = true }
|
.semantics { testTagsAsResourceId = true }
|
||||||
) {
|
) {
|
||||||
Icon(
|
Icon(
|
||||||
painter = closeIcon,
|
painter = closeIcon,
|
||||||
contentDescription = clearLabel,
|
contentDescription = clearLabel,
|
||||||
|
tint = placeholderColor,
|
||||||
modifier = Modifier.size(24.dp)
|
modifier = Modifier.size(24.dp)
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
}
|
|
||||||
} else {
|
} else {
|
||||||
null
|
Box(modifier = Modifier.size(40.dp))
|
||||||
},
|
}
|
||||||
shape = TopBarShape,
|
}
|
||||||
contentPadding = TextFieldDefaults.contentPaddingWithoutLabel(
|
}
|
||||||
top = 8.dp,
|
|
||||||
bottom = 8.dp
|
|
||||||
),
|
|
||||||
colors = TextFieldDefaults.colors(
|
|
||||||
focusedContainerColor = containerColor,
|
|
||||||
unfocusedContainerColor = containerColor,
|
|
||||||
disabledContainerColor = containerColor,
|
|
||||||
cursorColor = MaterialTheme.colorScheme.primary,
|
|
||||||
focusedIndicatorColor = Color.Transparent,
|
|
||||||
unfocusedIndicatorColor = Color.Transparent,
|
|
||||||
disabledIndicatorColor = Color.Transparent
|
|
||||||
),
|
|
||||||
modifier = modifier
|
|
||||||
.height(TopBarHeight)
|
|
||||||
.testTag("search_field")
|
|
||||||
.semantics { testTagsAsResourceId = true }
|
|
||||||
)
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -17,7 +17,6 @@ import androidx.compose.ui.unit.dp
|
|||||||
import androidx.paging.LoadState
|
import androidx.paging.LoadState
|
||||||
import androidx.paging.compose.*
|
import androidx.paging.compose.*
|
||||||
import com.example.research.R
|
import com.example.research.R
|
||||||
import com.example.research.common.ui.theme.dictionaryTitleLarge
|
|
||||||
import com.example.research.core.domain.model.IndexEntry
|
import com.example.research.core.domain.model.IndexEntry
|
||||||
import com.example.research.core.util.removeDictionarySuffixes
|
import com.example.research.core.util.removeDictionarySuffixes
|
||||||
import com.example.research.ui.theme.Spacing
|
import com.example.research.ui.theme.Spacing
|
||||||
@@ -84,7 +83,7 @@ private fun SearchResultItem(
|
|||||||
showDictionaryName: Boolean = true
|
showDictionaryName: Boolean = true
|
||||||
) {
|
) {
|
||||||
// Cache text styles to avoid recreation on every composition
|
// Cache text styles to avoid recreation on every composition
|
||||||
val titleStyle = MaterialTheme.typography.dictionaryTitleLarge
|
val titleStyle = MaterialTheme.typography.titleLarge
|
||||||
val subtitleStyle = MaterialTheme.typography.bodySmall
|
val subtitleStyle = MaterialTheme.typography.bodySmall
|
||||||
val subtitleColor = MaterialTheme.colorScheme.onSurfaceVariant
|
val subtitleColor = MaterialTheme.colorScheme.onSurfaceVariant
|
||||||
|
|
||||||
|
|||||||
@@ -82,8 +82,6 @@ class SettingsViewModel(
|
|||||||
private val pendingSourceUrls = mutableSetOf<String>()
|
private val pendingSourceUrls = mutableSetOf<String>()
|
||||||
private var isDownloadInProgress = false
|
private var isDownloadInProgress = false
|
||||||
|
|
||||||
private var cancelRefreshPending = false
|
|
||||||
|
|
||||||
init {
|
init {
|
||||||
setupStateObservation()
|
setupStateObservation()
|
||||||
initialize()
|
initialize()
|
||||||
@@ -145,7 +143,6 @@ class SettingsViewModel(
|
|||||||
when (operationState.downloadState) {
|
when (operationState.downloadState) {
|
||||||
is DownloadState.Loading, is DownloadState.Extracting -> {
|
is DownloadState.Loading, is DownloadState.Extracting -> {
|
||||||
isDownloadInProgress = true
|
isDownloadInProgress = true
|
||||||
cancelRefreshPending = false
|
|
||||||
}
|
}
|
||||||
is DownloadState.Success -> {
|
is DownloadState.Success -> {
|
||||||
pendingSourceUrls.clear()
|
pendingSourceUrls.clear()
|
||||||
@@ -181,7 +178,11 @@ class SettingsViewModel(
|
|||||||
}
|
}
|
||||||
is DownloadState.Cancelled -> {
|
is DownloadState.Cancelled -> {
|
||||||
isDownloadInProgress = false
|
isDownloadInProgress = false
|
||||||
cancelRefreshPending = true
|
dictionaryStatus.value = if (dictionaryState.dictionaries.isEmpty()) {
|
||||||
|
DictionaryStatus.Empty
|
||||||
|
} else {
|
||||||
|
DictionaryStatus.UpToDate
|
||||||
|
}
|
||||||
if (pendingSourceUrls.isNotEmpty()) {
|
if (pendingSourceUrls.isNotEmpty()) {
|
||||||
pendingSourceUrls.forEach { urlTemplate ->
|
pendingSourceUrls.forEach { urlTemplate ->
|
||||||
val source = dictionaryState.dictionarySources.find {
|
val source = dictionaryState.dictionarySources.find {
|
||||||
@@ -192,12 +193,6 @@ class SettingsViewModel(
|
|||||||
pendingSourceUrls.clear()
|
pendingSourceUrls.clear()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
is DownloadState.Idle -> {
|
|
||||||
if (cancelRefreshPending) {
|
|
||||||
cancelRefreshPending = false
|
|
||||||
refreshDictionaryStatus()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else -> {}
|
else -> {}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -412,6 +407,10 @@ class SettingsViewModel(
|
|||||||
}
|
}
|
||||||
|
|
||||||
dictionaryStatus.value = DictionaryStatus.Checking
|
dictionaryStatus.value = DictionaryStatus.Checking
|
||||||
|
val status = withContext(Dispatchers.IO) { evaluateDictionaryStatus() }
|
||||||
|
dictionaryStatus.value = status
|
||||||
|
|
||||||
|
if (status !is DictionaryStatus.NeedsUpdate) return@launch
|
||||||
|
|
||||||
val installedSources = installedEnabledSources(
|
val installedSources = installedEnabledSources(
|
||||||
preferencesManager.dictionarySources.first(),
|
preferencesManager.dictionarySources.first(),
|
||||||
@@ -482,12 +481,13 @@ class SettingsViewModel(
|
|||||||
getApplication<Application>().stopService(stopIntent)
|
getApplication<Application>().stopService(stopIntent)
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
private fun refreshDictionaryStatus() {
|
|
||||||
viewModelScope.launch {
|
viewModelScope.launch {
|
||||||
dictionaryStatus.value = DictionaryStatus.Checking
|
val dictionaries = localDictionaryRepository.dictionaries.first()
|
||||||
dictionaryStatus.value = withContext(Dispatchers.IO) { evaluateDictionaryStatus() }
|
dictionaryStatus.value = if (dictionaries.isNotEmpty()) {
|
||||||
|
DictionaryStatus.UpToDate
|
||||||
|
} else {
|
||||||
|
DictionaryStatus.Empty
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -1,3 +0,0 @@
|
|||||||
- Fixed the dictionary update card after starting or cancelling a download
|
|
||||||
- Fixed download progress staying at 0% for too long
|
|
||||||
- Rebuilt the search field on Material 3 and aligned dictionary title typography
|
|
||||||
@@ -1,3 +0,0 @@
|
|||||||
- Исправлена карточка обновления словаря после запуска и отмены загрузки
|
|
||||||
- Исправлено зависание индикатора прогресса загрузки на 0%
|
|
||||||
- Строка поиска переведена на Material 3; выровнена типографика заголовков словаря
|
|
||||||
@@ -8,6 +8,7 @@
|
|||||||
# Specifies the JVM arguments used for the daemon process.
|
# Specifies the JVM arguments used for the daemon process.
|
||||||
org.gradle.jvmargs=-Xmx4g -Dfile.encoding=UTF-8 -XX:+UseParallelGC -XX:+HeapDumpOnOutOfMemoryError
|
org.gradle.jvmargs=-Xmx4g -Dfile.encoding=UTF-8 -XX:+UseParallelGC -XX:+HeapDumpOnOutOfMemoryError
|
||||||
# org.gradle.java.home - commented out to use system JAVA_HOME or auto-provisioning
|
# org.gradle.java.home - commented out to use system JAVA_HOME or auto-provisioning
|
||||||
|
# org.gradle.java.home=/Users/evgenii/.gradle/jdks/eclipse_adoptium-17-aarch64-os_x.2/jdk-17.0.15+6/Contents/Home
|
||||||
|
|
||||||
# When configured, Gradle will run in incubating parallel mode.
|
# When configured, Gradle will run in incubating parallel mode.
|
||||||
# This option should only be used with decoupled projects. More details, visit
|
# This option should only be used with decoupled projects. More details, visit
|
||||||
|
|||||||
Reference in New Issue
Block a user