Этап 1: detekt (статанализ + ktlint-форматирование) с baseline
CI / verify (push) Has been cancelled
CI / release (push) Has been cancelled

- detekt 1.23.8 применён ко всем НАШИМ модулям (vendor-форк исключён),
  +formatting-ruleset (обёртка ktlint). Совместим с Kotlin 2.3 (проверено).
- config/detekt/detekt.yml — настройки под наш код (LongMethod 120, MaxLine 140,
  MagicNumber off — dp/цвета отдельно, FunctionNaming off — @Composable Заглавные).
- detekt-baseline.xml по модулям: ~403 текущих замечаний зафиксированы →
  detekt зелёный, дальше ловит только НОВЫЕ. detekt в CI (ci.yml verify).

Проверено: detektBaseline + detekt BUILD SUCCESSFUL.
This commit is contained in:
b-dev-mobile
2026-07-07 23:36:40 +00:00
parent ab8fa70e51
commit ac438269c5
17 changed files with 549 additions and 0 deletions
+195
View File
@@ -0,0 +1,195 @@
<?xml version="1.0" ?>
<SmellBaseline>
<ManuallySuppressedIssues/>
<CurrentIssues>
<ID>ArgumentListWrapping:CalendarApiClient.kt$CalendarApiClient$('/')</ID>
<ID>ArgumentListWrapping:CalendarApiClient.kt$CalendarApiClient$(query.trim(), Charsets.UTF_8.name())</ID>
<ID>ArgumentListWrapping:CalendarComponents.kt$("$base/themes/forbion/images/calendar/blank-box-gray.svg", "Незапланированные задачи")</ID>
<ID>ArgumentListWrapping:CalendarComponents.kt$("$base/themes/forbion/images/calendar/calendar-edit-export-white.svg", "Синхронизация с телефоном")</ID>
<ID>ArgumentListWrapping:CalendarComponents.kt$("+${dayEvents.size - 4}", style = MaterialTheme.typography.labelSmall, color = F7Colors.TextMuted)</ID>
<ID>ArgumentListWrapping:CalendarComponents.kt$("\n")</ID>
<ID>ArgumentListWrapping:CalendarComponents.kt$(1.dp, if (day == selectedDay) F7Colors.Primary else F7Colors.Border, RoundedCornerShape(12.dp))</ID>
<ID>ArgumentListWrapping:CalendarComponents.kt$(12.dp)</ID>
<ID>ArgumentListWrapping:CalendarComponents.kt$(cal.accountName, style = MaterialTheme.typography.labelSmall, color = F7Colors.TextMuted)</ID>
<ID>ArgumentListWrapping:CalendarComponents.kt$(event.location, style = MaterialTheme.typography.labelSmall, color = F7Colors.TextMuted, maxLines = 1)</ID>
<ID>ArgumentListWrapping:CalendarExtendedUi.kt$("$count событ.", style = MaterialTheme.typography.labelSmall, color = F7Colors.TextSecondary)</ID>
<ID>ArgumentListWrapping:CalendarExtendedUi.kt$("${s.name} · ${s.email}", modifier = Modifier.clickable { onAddAttendee(s) }.padding(start = 8.dp), color = F7Colors.Primary)</ID>
<ID>ArgumentListWrapping:CalendarExtendedUi.kt$("ru")</ID>
<ID>ArgumentListWrapping:CalendarExtendedUi.kt$("Весь день")</ID>
<ID>ArgumentListWrapping:CalendarExtendedUi.kt$("Комната Talk")</ID>
<ID>ArgumentListWrapping:CalendarExtendedUi.kt$("Корзина пуста", color = F7Colors.TextSecondary, modifier = Modifier.padding(top = 12.dp))</ID>
<ID>ArgumentListWrapping:CalendarExtendedUi.kt$("Нет задач без срока", color = F7Colors.TextSecondary, modifier = Modifier.padding(top = 12.dp))</ID>
<ID>ArgumentListWrapping:CalendarExtendedUi.kt$(10.dp)</ID>
<ID>ArgumentListWrapping:CalendarExtendedUi.kt$(16.dp)</ID>
<ID>ArgumentListWrapping:CalendarExtendedUi.kt$(8.dp)</ID>
<ID>ArgumentListWrapping:CalendarExtendedUi.kt$(Modifier.clickable { onDraftChange(draft.copy(calendarHref = cal.href)) }, verticalAlignment = Alignment.CenterVertically)</ID>
<ID>ArgumentListWrapping:CalendarExtendedUi.kt$(Modifier.clickable { onDraftChange(draft.copy(classification = cl)) }, verticalAlignment = Alignment.CenterVertically)</ID>
<ID>ArgumentListWrapping:CalendarExtendedUi.kt$(Modifier.clickable { onDraftChange(draft.copy(recurrence = preset, customRrule = "")) }, verticalAlignment = Alignment.CenterVertically)</ID>
<ID>ArgumentListWrapping:CalendarExtendedUi.kt$(Modifier.clickable { onDraftChange(draft.copy(status = st)) }, verticalAlignment = Alignment.CenterVertically)</ID>
<ID>ArgumentListWrapping:CalendarExtendedUi.kt$(Modifier.fillMaxWidth(), horizontalArrangement = Arrangement.SpaceBetween, verticalAlignment = Alignment.CenterVertically)</ID>
<ID>ArgumentListWrapping:CalendarExtendedUi.kt$(Modifier.fillMaxWidth().clickable { onDraftChange(draft.copy(mode = mode)) }, verticalAlignment = Alignment.CenterVertically)</ID>
<ID>ArgumentListWrapping:CalendarExtendedUi.kt$(Modifier.fillMaxWidth().heightIn(max = 520.dp).verticalScroll(rememberScrollState()), verticalArrangement = Arrangement.spacedBy(8.dp))</ID>
<ID>ArgumentListWrapping:CalendarExtendedUi.kt$(Modifier.padding(16.dp).verticalScroll(rememberScrollState()), verticalArrangement = Arrangement.spacedBy(10.dp))</ID>
<ID>ArgumentListWrapping:CalendarExtendedUi.kt$(addTalkRoom = it)</ID>
<ID>ArgumentListWrapping:CalendarExtendedUi.kt$(allDay = it)</ID>
<ID>ArgumentListWrapping:CalendarExtendedUi.kt$(calendarHref = cal.href)</ID>
<ID>ArgumentListWrapping:CalendarExtendedUi.kt$(categories = it)</ID>
<ID>ArgumentListWrapping:CalendarExtendedUi.kt$(checked = draft.addTalkRoom, onCheckedChange = { onDraftChange(draft.copy(addTalkRoom = it)) })</ID>
<ID>ArgumentListWrapping:CalendarExtendedUi.kt$(checked = draft.allDay, onCheckedChange = { onDraftChange(draft.copy(allDay = it)) })</ID>
<ID>ArgumentListWrapping:CalendarExtendedUi.kt$(classification = cl)</ID>
<ID>ArgumentListWrapping:CalendarExtendedUi.kt$(description = it)</ID>
<ID>ArgumentListWrapping:CalendarExtendedUi.kt$(draft.copy(addTalkRoom = it))</ID>
<ID>ArgumentListWrapping:CalendarExtendedUi.kt$(draft.copy(allDay = it))</ID>
<ID>ArgumentListWrapping:CalendarExtendedUi.kt$(draft.copy(calendarHref = cal.href))</ID>
<ID>ArgumentListWrapping:CalendarExtendedUi.kt$(draft.copy(categories = it))</ID>
<ID>ArgumentListWrapping:CalendarExtendedUi.kt$(draft.copy(classification = cl))</ID>
<ID>ArgumentListWrapping:CalendarExtendedUi.kt$(draft.copy(description = it))</ID>
<ID>ArgumentListWrapping:CalendarExtendedUi.kt$(draft.copy(endTime = it))</ID>
<ID>ArgumentListWrapping:CalendarExtendedUi.kt$(draft.copy(mode = mode))</ID>
<ID>ArgumentListWrapping:CalendarExtendedUi.kt$(draft.copy(name = it))</ID>
<ID>ArgumentListWrapping:CalendarExtendedUi.kt$(draft.copy(recurrence = preset))</ID>
<ID>ArgumentListWrapping:CalendarExtendedUi.kt$(draft.copy(recurrence = preset, customRrule = ""))</ID>
<ID>ArgumentListWrapping:CalendarExtendedUi.kt$(draft.copy(reminderMinutes = it))</ID>
<ID>ArgumentListWrapping:CalendarExtendedUi.kt$(draft.copy(startTime = it))</ID>
<ID>ArgumentListWrapping:CalendarExtendedUi.kt$(draft.copy(status = st))</ID>
<ID>ArgumentListWrapping:CalendarExtendedUi.kt$(draft.copy(subscriptionUrl = it))</ID>
<ID>ArgumentListWrapping:CalendarExtendedUi.kt$(draft.copy(title = it))</ID>
<ID>ArgumentListWrapping:CalendarExtendedUi.kt$(endTime = it)</ID>
<ID>ArgumentListWrapping:CalendarExtendedUi.kt$(if (month == YearMonth.from(selectedDay)) F7Colors.PrimaryLight else F7Colors.Surface)</ID>
<ID>ArgumentListWrapping:CalendarExtendedUi.kt$(if (state.deleting) "Удаление…" else "Удалить", color = F7Colors.Error)</ID>
<ID>ArgumentListWrapping:CalendarExtendedUi.kt$(java.time.format.TextStyle.FULL_STANDALONE, java.util.Locale.forLanguageTag("ru"))</ID>
<ID>ArgumentListWrapping:CalendarExtendedUi.kt$(max = 520.dp)</ID>
<ID>ArgumentListWrapping:CalendarExtendedUi.kt$(mode = mode)</ID>
<ID>ArgumentListWrapping:CalendarExtendedUi.kt$(month.month.getDisplayName(java.time.format.TextStyle.FULL_STANDALONE, java.util.Locale.forLanguageTag("ru")), style = MaterialTheme.typography.labelLarge, fontWeight = FontWeight.SemiBold)</ID>
<ID>ArgumentListWrapping:CalendarExtendedUi.kt$(name = it)</ID>
<ID>ArgumentListWrapping:CalendarExtendedUi.kt$(onClick = onDelete, enabled = !state.deleting)</ID>
<ID>ArgumentListWrapping:CalendarExtendedUi.kt$(recurrence = preset)</ID>
<ID>ArgumentListWrapping:CalendarExtendedUi.kt$(recurrence = preset, customRrule = "")</ID>
<ID>ArgumentListWrapping:CalendarExtendedUi.kt$(rememberScrollState())</ID>
<ID>ArgumentListWrapping:CalendarExtendedUi.kt$(reminderMinutes = it)</ID>
<ID>ArgumentListWrapping:CalendarExtendedUi.kt$(s)</ID>
<ID>ArgumentListWrapping:CalendarExtendedUi.kt$(s.address.ifBlank { s.name }, modifier = Modifier.clickable { onApplyLocation(s) }.padding(start = 8.dp), color = F7Colors.Primary)</ID>
<ID>ArgumentListWrapping:CalendarExtendedUi.kt$(selected = draft.calendarHref == cal.href, onClick = { onDraftChange(draft.copy(calendarHref = cal.href)) })</ID>
<ID>ArgumentListWrapping:CalendarExtendedUi.kt$(selected = draft.classification == cl, onClick = { onDraftChange(draft.copy(classification = cl)) })</ID>
<ID>ArgumentListWrapping:CalendarExtendedUi.kt$(selected = draft.recurrence == preset, onClick = { onDraftChange(draft.copy(recurrence = preset)) })</ID>
<ID>ArgumentListWrapping:CalendarExtendedUi.kt$(start = 8.dp)</ID>
<ID>ArgumentListWrapping:CalendarExtendedUi.kt$(startTime = it)</ID>
<ID>ArgumentListWrapping:CalendarExtendedUi.kt$(status = st)</ID>
<ID>ArgumentListWrapping:CalendarExtendedUi.kt$(subscriptionUrl = it)</ID>
<ID>ArgumentListWrapping:CalendarExtendedUi.kt$(text = if (saving) "Сохранение…" else "Создать", onClick = onSave, enabled = !saving)</ID>
<ID>ArgumentListWrapping:CalendarExtendedUi.kt$(text = if (state.saving) "Сохранение…" else "Сохранить", onClick = onSave, enabled = !state.saving)</ID>
<ID>ArgumentListWrapping:CalendarExtendedUi.kt$(title = it)</ID>
<ID>ArgumentListWrapping:CalendarExtendedUi.kt$(top = 12.dp)</ID>
<ID>ArgumentListWrapping:CalendarExtendedUi.kt$(value = draft.attendeeQuery, onValueChange = onSearchAttendees, label = "Поиск участника")</ID>
<ID>ArgumentListWrapping:CalendarExtendedUi.kt$(value = draft.categories, onValueChange = { onDraftChange(draft.copy(categories = it)) }, label = "Категории")</ID>
<ID>ArgumentListWrapping:CalendarExtendedUi.kt$(value = draft.description, onValueChange = { onDraftChange(draft.copy(description = it)) }, label = "Описание")</ID>
<ID>ArgumentListWrapping:CalendarExtendedUi.kt$(value = draft.endTime, onValueChange = { onDraftChange(draft.copy(endTime = it)) }, label = "Окончание")</ID>
<ID>ArgumentListWrapping:CalendarExtendedUi.kt$(value = draft.name, onValueChange = { onDraftChange(draft.copy(name = it)) }, label = "Название")</ID>
<ID>ArgumentListWrapping:CalendarExtendedUi.kt$(value = draft.reminderMinutes.toString(), onValueChange = { v -&gt; v.toIntOrNull()?.let { onDraftChange(draft.copy(reminderMinutes = it)) } }, label = "Напоминание (мин)")</ID>
<ID>ArgumentListWrapping:CalendarExtendedUi.kt$(value = draft.startTime, onValueChange = { onDraftChange(draft.copy(startTime = it)) }, label = "Начало")</ID>
<ID>ArgumentListWrapping:CalendarExtendedUi.kt$(value = draft.subscriptionUrl, onValueChange = { onDraftChange(draft.copy(subscriptionUrl = it)) }, label = "URL подписки (WebCal)")</ID>
<ID>ArgumentListWrapping:CalendarExtendedUi.kt$(value = draft.title, onValueChange = { onDraftChange(draft.copy(title = it)) }, label = "Название")</ID>
<ID>ArgumentListWrapping:CalendarViewModel.kt$CalendarViewModel$("MMM d", Locale.ENGLISH)</ID>
<ID>ArgumentListWrapping:CalendarViewModel.kt$CalendarViewModel$("MMM d, yyyy", Locale.ENGLISH)</ID>
<ID>ArgumentListWrapping:CalendarViewModel.kt$CalendarViewModel$("dd.MM.yyyy HH:mm")</ID>
<ID>ArgumentListWrapping:CalendarViewModel.kt$CalendarViewModel$(DateTimeFormatter.ofPattern("MMM d", Locale.ENGLISH))</ID>
<ID>ArgumentListWrapping:CalendarViewModel.kt$CalendarViewModel$(DateTimeFormatter.ofPattern("MMM d, yyyy", Locale.ENGLISH))</ID>
<ID>ArgumentListWrapping:CalendarViewModel.kt$CalendarViewModel$(DateTimeFormatter.ofPattern("dd.MM.yyyy HH:mm"))</ID>
<ID>ArgumentListWrapping:CalendarViewModel.kt$CalendarViewModel$(ZoneId.systemDefault())</ID>
<ID>ArgumentListWrapping:CalendarViewModel.kt$CalendarViewModel$(epoch)</ID>
<ID>ArgumentListWrapping:CalendarViewModel.kt$CalendarViewModel$(session, LocalDate.of(st.visibleYear, 1, 1), LocalDate.of(st.visibleYear, 12, 31), visibleCalendarHrefs)</ID>
<ID>ArgumentListWrapping:CalendarViewModel.kt$CalendarViewModel$(session, st.selectedDay, st.selectedDay, visibleCalendarHrefs)</ID>
<ID>ArgumentListWrapping:CalendarViewModel.kt$CalendarViewModel$(st.visibleYear, 1, 1)</ID>
<ID>ArgumentListWrapping:CalendarViewModel.kt$CalendarViewModel$(st.visibleYear, 12, 31)</ID>
<ID>ArgumentListWrapping:CalendarViewModel.kt$CalendarViewModel$(start)</ID>
<ID>CyclomaticComplexMethod:CalendarScreen.kt$@OptIn(ExperimentalMaterial3Api::class) @Composable fun CalendarScreen( session: AuthSession, modifier: Modifier = Modifier, focusEventUid: String? = null, settingsRequest: Int = 0, sidebarOpen: Boolean = false, onSidebarOpenChange: (Boolean) -&gt; Unit = {}, onFocusEventConsumed: () -&gt; Unit = {}, onUnauthorized: () -&gt; Unit = {}, )</ID>
<ID>CyclomaticComplexMethod:CalendarSyncEngine.kt$CalendarSyncEngine$fun run( session: AuthSession, deviceCalendarId: Long, ): CalendarSyncResult</ID>
<ID>ForEachOnRange:CalendarComponents.kt$0..23</ID>
<ID>ForEachOnRange:CalendarComponents.kt$0..24</ID>
<ID>ImportOrdering:CalendarComponents.kt$import androidx.compose.foundation.background import androidx.compose.foundation.border import androidx.compose.foundation.clickable import androidx.compose.foundation.horizontalScroll import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.Box import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.Row import androidx.compose.foundation.layout.Spacer import androidx.compose.foundation.layout.aspectRatio import androidx.compose.foundation.layout.fillMaxSize import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.height import androidx.compose.foundation.layout.heightIn import androidx.compose.foundation.layout.padding import androidx.compose.foundation.layout.size import androidx.compose.foundation.layout.width import androidx.compose.foundation.lazy.LazyColumn import androidx.compose.foundation.lazy.items import androidx.compose.foundation.rememberScrollState import androidx.compose.foundation.shape.CircleShape import androidx.compose.foundation.shape.RoundedCornerShape import androidx.compose.foundation.verticalScroll import androidx.compose.material3.AlertDialog import androidx.compose.material3.DatePicker import androidx.compose.material3.DatePickerDialog import androidx.compose.material3.ExperimentalMaterial3Api import androidx.compose.material3.HorizontalDivider import androidx.compose.material3.MaterialTheme import androidx.compose.material3.ModalBottomSheet import androidx.compose.material3.RadioButton import androidx.compose.material3.Switch import androidx.compose.material3.Text import androidx.compose.material3.TextButton import androidx.compose.material3.rememberDatePickerState import androidx.compose.material3.rememberModalBottomSheetState import androidx.compose.foundation.layout.fillMaxHeight import androidx.compose.foundation.layout.offset import androidx.compose.material3.DropdownMenu import androidx.compose.material3.DropdownMenuItem import androidx.compose.runtime.Composable import androidx.compose.runtime.getValue import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.remember import androidx.compose.runtime.setValue import androidx.compose.ui.graphics.Brush import androidx.compose.ui.graphics.Color import androidx.compose.ui.unit.sp import java.time.LocalTime import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.draw.clip import androidx.compose.ui.draw.shadow import androidx.compose.ui.layout.ContentScale import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.text.font.FontWeight import androidx.compose.ui.text.style.TextAlign import androidx.compose.ui.text.style.TextOverflow import androidx.compose.ui.unit.dp import coil.compose.AsyncImage import coil.request.ImageRequest import ru.forbion.f7cloud.core.auth.AuthSession import ru.forbion.f7cloud.core.designsystem.F7Colors import ru.forbion.f7cloud.core.designsystem.F7ListCard import ru.forbion.f7cloud.core.designsystem.F7OutlinedField import ru.forbion.f7cloud.core.designsystem.F7PrimaryButton import ru.forbion.f7cloud.core.designsystem.F7SecondaryButton import ru.forbion.f7cloud.core.designsystem.F7TextButton import java.time.Instant import java.time.LocalDate import java.time.YearMonth import java.time.ZoneId import java.time.format.DateTimeFormatter import java.util.Locale</ID>
<ID>ImportOrdering:CalendarRepository.kt$import okhttp3.OkHttpClient import ru.forbion.f7cloud.core.auth.AuthSession import ru.forbion.f7cloud.core.auth.OcsUserResolver import ru.forbion.f7cloud.core.network.CalendarAlarmData import ru.forbion.f7cloud.core.network.CalendarAttendeeData import ru.forbion.f7cloud.core.network.CalendarEventData import ru.forbion.f7cloud.core.network.CalendarIcs import ru.forbion.f7cloud.core.network.CalDavClient import ru.forbion.f7cloud.core.network.DavCalendar import ru.forbion.f7cloud.core.network.DavEvent import ru.forbion.f7cloud.core.network.DavTask import ru.forbion.f7cloud.core.network.DavTrashEvent import ru.forbion.f7cloud.core.network.NetworkFactory import java.time.Instant import java.time.LocalDate import java.time.LocalDateTime import java.time.YearMonth import java.time.ZoneId import java.time.ZoneOffset</ID>
<ID>ImportOrdering:CalendarScreen.kt$import android.Manifest import android.content.pm.PackageManager import android.net.Uri import androidx.activity.compose.rememberLauncherForActivityResult import androidx.activity.result.contract.ActivityResultContracts import androidx.compose.foundation.layout.Arrangement import androidx.compose.material3.DrawerValue import androidx.compose.material3.ExperimentalMaterial3Api import androidx.compose.material3.ModalDrawerSheet import androidx.compose.material3.ModalNavigationDrawer import androidx.compose.material3.rememberDrawerState import androidx.compose.runtime.rememberCoroutineScope import androidx.compose.runtime.snapshotFlow import kotlinx.coroutines.flow.distinctUntilChanged import kotlinx.coroutines.launch import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.Row import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.padding import androidx.compose.foundation.lazy.LazyColumn import androidx.compose.foundation.lazy.items import androidx.compose.foundation.shape.RoundedCornerShape import androidx.compose.material3.MaterialTheme import androidx.compose.material3.Text import androidx.compose.runtime.Composable import androidx.compose.runtime.LaunchedEffect import androidx.compose.runtime.collectAsState import androidx.compose.runtime.getValue import androidx.compose.ui.Modifier import androidx.compose.ui.draw.clip import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.unit.dp import androidx.core.content.ContextCompat import androidx.lifecycle.viewmodel.compose.viewModel import kotlinx.coroutines.delay import ru.forbion.f7cloud.core.auth.AuthSession import ru.forbion.f7cloud.core.designsystem.F7Colors import ru.forbion.f7cloud.core.designsystem.F7ModuleScreen import ru.forbion.f7cloud.core.designsystem.F7OverlayDismissHandler import java.time.format.DateTimeFormatter import java.util.Locale</ID>
<ID>Indentation:CalendarScreen.kt$ </ID>
<ID>LongMethod:CalendarComponents.kt$@Composable fun CalendarDayTimeline( session: AuthSession, day: LocalDate, events: List&lt;CalendarEventItem&gt;, viewMode: CalendarViewMode, onViewMode: (CalendarViewMode) -&gt; Unit, onEventClick: (CalendarEventItem) -&gt; Unit, modifier: Modifier = Modifier, )</ID>
<ID>LongMethod:CalendarScreen.kt$@OptIn(ExperimentalMaterial3Api::class) @Composable fun CalendarScreen( session: AuthSession, modifier: Modifier = Modifier, focusEventUid: String? = null, settingsRequest: Int = 0, sidebarOpen: Boolean = false, onSidebarOpenChange: (Boolean) -&gt; Unit = {}, onFocusEventConsumed: () -&gt; Unit = {}, onUnauthorized: () -&gt; Unit = {}, )</ID>
<ID>LongMethod:CalendarSyncEngine.kt$CalendarSyncEngine$fun run( session: AuthSession, deviceCalendarId: Long, ): CalendarSyncResult</ID>
<ID>LoopWithTooManyJumpStatements:CalendarApiClient.kt$CalendarApiClient$for</ID>
<ID>LoopWithTooManyJumpStatements:CalendarSyncEngine.kt$CalendarSyncEngine$for</ID>
<ID>MaxLineLength:CalendarApiClient.kt$CalendarApiClient$val url = "${session.serverUrl.trimEnd('/')}/index.php/apps/calendar/v1/autocompletion/location?search=${java.net.URLEncoder.encode(query.trim(), Charsets.UTF_8.name())}"</ID>
<ID>MaxLineLength:CalendarExtendedUi.kt$Column</ID>
<ID>MaxLineLength:CalendarExtendedUi.kt$F7OutlinedField(value = draft.categories, onValueChange = { onDraftChange(draft.copy(categories = it)) }, label = "Категории")</ID>
<ID>MaxLineLength:CalendarExtendedUi.kt$F7OutlinedField(value = draft.description, onValueChange = { onDraftChange(draft.copy(description = it)) }, label = "Описание")</ID>
<ID>MaxLineLength:CalendarExtendedUi.kt$F7OutlinedField(value = draft.reminderMinutes.toString(), onValueChange = { v -&gt; v.toIntOrNull()?.let { onDraftChange(draft.copy(reminderMinutes = it)) } }, label = "Напоминание (мин)")</ID>
<ID>MaxLineLength:CalendarExtendedUi.kt$F7OutlinedField(value = draft.startTime, onValueChange = { onDraftChange(draft.copy(startTime = it)) }, label = "Начало")</ID>
<ID>MaxLineLength:CalendarExtendedUi.kt$F7OutlinedField(value = draft.subscriptionUrl, onValueChange = { onDraftChange(draft.copy(subscriptionUrl = it)) }, label = "URL подписки (WebCal)")</ID>
<ID>MaxLineLength:CalendarExtendedUi.kt$RadioButton(selected = draft.calendarHref == cal.href, onClick = { onDraftChange(draft.copy(calendarHref = cal.href)) })</ID>
<ID>MaxLineLength:CalendarExtendedUi.kt$Row</ID>
<ID>MaxLineLength:CalendarExtendedUi.kt$Text("${s.name} · ${s.email}", modifier = Modifier.clickable { onAddAttendee(s) }.padding(start = 8.dp), color = F7Colors.Primary)</ID>
<ID>MaxLineLength:CalendarExtendedUi.kt$Text("Комната Talk"); Switch(checked = draft.addTalkRoom, onCheckedChange = { onDraftChange(draft.copy(addTalkRoom = it)) })</ID>
<ID>MaxLineLength:CalendarExtendedUi.kt$Text(month.month.getDisplayName(java.time.format.TextStyle.FULL_STANDALONE, java.util.Locale.forLanguageTag("ru")), style = MaterialTheme.typography.labelLarge, fontWeight = FontWeight.SemiBold)</ID>
<ID>MaxLineLength:CalendarExtendedUi.kt$Text(s.address.ifBlank { s.name }, modifier = Modifier.clickable { onApplyLocation(s) }.padding(start = 8.dp), color = F7Colors.Primary)</ID>
<ID>MaxLineLength:CalendarExtendedUi.kt$confirmButton = { F7PrimaryButton(text = if (state.saving) "Сохранение…" else "Сохранить", onClick = onSave, enabled = !state.saving) }</ID>
<ID>MaxLineLength:CalendarExtendedUi.kt$if (isEdit) TextButton(onClick = onDelete, enabled = !state.deleting) { Text(if (state.deleting) "Удаление…" else "Удалить", color = F7Colors.Error) }</ID>
<ID>MaxLineLength:CalendarViewModel.kt$CalendarViewModel$"${start.format(DateTimeFormatter.ofPattern("MMM d", Locale.ENGLISH))} ${end.format(DateTimeFormatter.ofPattern("MMM d, yyyy", Locale.ENGLISH))}"</ID>
<ID>MaxLineLength:CalendarViewModel.kt$CalendarViewModel$.</ID>
<ID>MaxLineLength:CalendarViewModel.kt$CalendarViewModel$CalendarViewMode.DAY -&gt; st.copy(selectedDay = st.selectedDay.minusDays(1), visibleMonth = YearMonth.from(st.selectedDay.minusDays(1)))</ID>
<ID>MaxLineLength:CalendarViewModel.kt$CalendarViewModel$CalendarViewMode.DAY -&gt; st.copy(selectedDay = st.selectedDay.plusDays(1), visibleMonth = YearMonth.from(st.selectedDay.plusDays(1)))</ID>
<ID>MaxLineLength:CalendarViewModel.kt$CalendarViewModel$CalendarViewMode.LIST -&gt; st.copy(selectedDay = st.selectedDay.minusDays(14), visibleMonth = YearMonth.from(st.selectedDay.minusDays(14)))</ID>
<ID>MaxLineLength:CalendarViewModel.kt$CalendarViewModel$CalendarViewMode.LIST -&gt; st.copy(selectedDay = st.selectedDay.plusDays(14), visibleMonth = YearMonth.from(st.selectedDay.plusDays(14)))</ID>
<ID>MaxLineLength:CalendarViewModel.kt$CalendarViewModel$CalendarViewMode.MONTH -&gt; st.copy(visibleMonth = st.visibleMonth.minusMonths(1), selectedDay = st.visibleMonth.minusMonths(1).atDay(1))</ID>
<ID>MaxLineLength:CalendarViewModel.kt$CalendarViewModel$CalendarViewMode.MONTH -&gt; st.copy(visibleMonth = st.visibleMonth.plusMonths(1), selectedDay = st.visibleMonth.plusMonths(1).atDay(1))</ID>
<ID>MaxLineLength:CalendarViewModel.kt$CalendarViewModel$CalendarViewMode.WEEK -&gt; st.copy(selectedDay = st.selectedDay.minusWeeks(1), visibleMonth = YearMonth.from(st.selectedDay.minusWeeks(1)))</ID>
<ID>MaxLineLength:CalendarViewModel.kt$CalendarViewModel$CalendarViewMode.WEEK -&gt; st.copy(selectedDay = st.selectedDay.plusWeeks(1), visibleMonth = YearMonth.from(st.selectedDay.plusWeeks(1)))</ID>
<ID>MaxLineLength:CalendarViewModel.kt$CalendarViewModel$CalendarViewMode.YEAR -&gt; repository.loadRange(session, LocalDate.of(st.visibleYear, 1, 1), LocalDate.of(st.visibleYear, 12, 31), visibleCalendarHrefs)</ID>
<ID>MaxLineLength:CalendarViewModel.kt$CalendarViewModel$_state.value = _state.value.copy(deleting = false, createDialogOpen = false, eventDetail = null, focusedEventUid = null, snackMessage = "Удалено")</ID>
<ID>MaxLineLength:CalendarViewModel.kt$CalendarViewModel$_state.value = _state.value.copy(selectedDay = day, visibleMonth = YearMonth.from(day), eventDetail = event, focusedEventUid = event.uid)</ID>
<ID>MaxLineLength:CalendarViewModel.kt$CalendarViewModel$_state.value = _state.value.copy(selectedDay = day, visibleMonth = YearMonth.from(day), visibleYear = day.year, datePickerOpen = false)</ID>
<ID>MaxLineLength:CalendarViewModel.kt$CalendarViewModel$classification = EventClassification.entries.firstOrNull { it.icsValue == event.classification } ?: EventClassification.PUBLIC</ID>
<ID>MaxLineLength:CalendarViewModel.kt$CalendarViewModel$private fun formatLastSync(epoch: Long)</ID>
<ID>MaxLineLength:CalendarViewModel.kt$CalendarViewModel$return if (visible.isEmpty()) _state.value.events else _state.value.events.filter { it.calendarHref in visible || it.calendarHref.isBlank() }</ID>
<ID>MaxLineLength:CalendarViewModel.kt$CalendarViewModel$snackMessage = if (showSnack) "Синхронизация завершена (${result.pushedToDevice + result.pushedToServer + result.updated + result.linked})" else _state.value.snackMessage</ID>
<ID>MaximumLineLength:CalendarApiClient.kt$CalendarApiClient$ </ID>
<ID>MaximumLineLength:CalendarComponents.kt$ </ID>
<ID>MaximumLineLength:CalendarExtendedUi.kt$ </ID>
<ID>MaximumLineLength:CalendarRepository.kt$CalendarRepository$ </ID>
<ID>MaximumLineLength:CalendarViewModel.kt$CalendarViewModel$ </ID>
<ID>NoMultipleSpaces:CalendarSyncEngine.kt$CalendarSyncEngine.Companion$ </ID>
<ID>NoUnusedImports:CalendarApiClient.kt$ru.forbion.f7cloud.feature.calendar.CalendarApiClient.kt</ID>
<ID>NoUnusedImports:CalendarComponents.kt$ru.forbion.f7cloud.feature.calendar.CalendarComponents.kt</ID>
<ID>NoUnusedImports:CalendarExtendedUi.kt$ru.forbion.f7cloud.feature.calendar.CalendarExtendedUi.kt</ID>
<ID>NoUnusedImports:CalendarModels.kt$ru.forbion.f7cloud.feature.calendar.CalendarModels.kt</ID>
<ID>NoUnusedImports:CalendarScreen.kt$ru.forbion.f7cloud.feature.calendar.CalendarScreen.kt</ID>
<ID>NoUnusedImports:CalendarSyncEngine.kt$ru.forbion.f7cloud.feature.calendar.CalendarSyncEngine.kt</ID>
<ID>NoUnusedImports:DeviceCalendarClient.kt$ru.forbion.f7cloud.feature.calendar.DeviceCalendarClient.kt</ID>
<ID>ParameterListWrapping:CalendarViewModel.kt$CalendarViewModel$(draft: CalendarCreateBookDraft)</ID>
<ID>UnusedPrivateMember:CalendarComponents.kt$@Composable private fun CalendarIconButton( iconUrl: String, contentDescription: String?, onClick: () -&gt; Unit, )</ID>
<ID>UnusedPrivateMember:CalendarComponents.kt$@Composable private fun CalendarNavButton(text: String, onClick: () -&gt; Unit)</ID>
<ID>UnusedPrivateProperty:CalendarComponents.kt$private val toolbarDateFormatter = DateTimeFormatter.ofPattern("MMM d, yyyy", Locale.ENGLISH)</ID>
<ID>UnusedPrivateProperty:CalendarSyncEngine.kt$CalendarSyncEngine$val mappedDevIds2 = mappings.map { it.deviceEventId }.toSet()</ID>
<ID>UseCheckOrError:CalendarRepository.kt$CalendarRepository$throw IllegalStateException("Календари не найдены")</ID>
<ID>UseCheckOrError:CalendarRepository.kt$CalendarRepository$throw IllegalStateException("Не удалось загрузить события календаря: $lastError")</ID>
<ID>Wrapping:CalendarExtendedUi.kt$;</ID>
<ID>Wrapping:CalendarExtendedUi.kt$F7PrimaryButton(text = if (saving) "Сохранение…" else "Создать", onClick = onSave, enabled = !saving)</ID>
<ID>Wrapping:CalendarExtendedUi.kt$F7PrimaryButton(text = if (state.saving) "Сохранение…" else "Сохранить", onClick = onSave, enabled = !state.saving)</ID>
<ID>Wrapping:CalendarExtendedUi.kt$Text(if (state.deleting) "Удаление…" else "Удалить", color = F7Colors.Error)</ID>
<ID>Wrapping:CalendarExtendedUi.kt$onAddAttendee(s)</ID>
<ID>Wrapping:CalendarExtendedUi.kt$onApplyLocation(s)</ID>
<ID>Wrapping:CalendarExtendedUi.kt$onDraftChange(draft.copy(addTalkRoom = it))</ID>
<ID>Wrapping:CalendarExtendedUi.kt$onDraftChange(draft.copy(calendarHref = cal.href))</ID>
<ID>Wrapping:CalendarExtendedUi.kt$onDraftChange(draft.copy(categories = it))</ID>
<ID>Wrapping:CalendarExtendedUi.kt$onDraftChange(draft.copy(classification = cl))</ID>
<ID>Wrapping:CalendarExtendedUi.kt$onDraftChange(draft.copy(description = it))</ID>
<ID>Wrapping:CalendarExtendedUi.kt$onDraftChange(draft.copy(mode = mode))</ID>
<ID>Wrapping:CalendarExtendedUi.kt$onDraftChange(draft.copy(recurrence = preset, customRrule = ""))</ID>
<ID>Wrapping:CalendarExtendedUi.kt$onDraftChange(draft.copy(reminderMinutes = it))</ID>
<ID>Wrapping:CalendarExtendedUi.kt$onDraftChange(draft.copy(startTime = it))</ID>
<ID>Wrapping:CalendarExtendedUi.kt$onDraftChange(draft.copy(subscriptionUrl = it))</ID>
<ID>Wrapping:CalendarExtendedUi.kt$s.name</ID>
<ID>Wrapping:CalendarRepository.kt$CalendarRepository$;</ID>
<ID>Wrapping:CalendarViewModel.kt$CalendarViewModel$;</ID>
<ID>Wrapping:CalendarViewModel.kt$CalendarViewModel$_state.value = _state.value.copy(loading = false, error = it.message, unauthorized = it is UnauthorizedException)</ID>
<ID>Wrapping:CalendarViewModel.kt$CalendarViewModel$it.calendarHref in visible || it.calendarHref.isBlank()</ID>
<ID>Wrapping:CalendarViewModel.kt$CalendarViewModel$it.icsValue == event.classification</ID>
<ID>Wrapping:CalendarViewModel.kt$CalendarViewModel${ _state.value = _state.value.copy(createBookOpen = false, createBookDraft = CalendarCreateBookDraft()) }</ID>
</CurrentIssues>
</SmellBaseline>
+10
View File
@@ -0,0 +1,10 @@
<?xml version="1.0" ?>
<SmellBaseline>
<ManuallySuppressedIssues/>
<CurrentIssues>
<ID>ComplexCondition:ContactsRepository.kt$ContactsRepository$!force &amp;&amp; !needsPhotoBackfill &amp;&amp; !needsDetailsBackfill &amp;&amp; System.currentTimeMillis() - lastSync &lt; SYNC_INTERVAL_MS</ID>
<ID>LongMethod:ContactDetailSheet.kt$@Composable private fun ContactDetailContent( contact: ContactItem, onDismiss: () -&gt; Unit, )</ID>
<ID>MultiLineIfElse:ContactDetailSheet.kt$"https://$it"</ID>
<ID>MultiLineIfElse:ContactDetailSheet.kt$it</ID>
</CurrentIssues>
</SmellBaseline>
+7
View File
@@ -0,0 +1,7 @@
<?xml version="1.0" ?>
<SmellBaseline>
<ManuallySuppressedIssues/>
<CurrentIssues>
<ID>NoUnusedImports:DeckRepository.kt$ru.forbion.f7cloud.feature.deck.DeckRepository.kt</ID>
</CurrentIssues>
</SmellBaseline>
+16
View File
@@ -0,0 +1,16 @@
<?xml version="1.0" ?>
<SmellBaseline>
<ManuallySuppressedIssues/>
<CurrentIssues>
<ID>ComplexCondition:SupportRepository.kt$SupportRepository$config.isSupportAdmin &amp;&amp; r == "support" &amp;&amp; u.isNotEmpty() &amp;&amp; a == u</ID>
<ID>ComplexCondition:SupportScreen.kt$state.loading &amp;&amp; state.tickets.isNotEmpty() &amp;&amp; state.selectedTicket == null &amp;&amp; !state.showCreate</ID>
<ID>ImportOrdering:SupportComponents.kt$import androidx.compose.foundation.background import androidx.compose.foundation.border import androidx.compose.foundation.clickable import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.Box import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.Row import androidx.compose.foundation.layout.Spacer import androidx.compose.foundation.layout.fillMaxSize import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.height import androidx.compose.foundation.layout.padding import androidx.compose.foundation.layout.size import androidx.compose.foundation.layout.width import androidx.compose.foundation.layout.widthIn import androidx.compose.foundation.lazy.LazyColumn import androidx.compose.foundation.lazy.LazyRow import androidx.compose.foundation.lazy.items import androidx.compose.foundation.lazy.rememberLazyListState import androidx.compose.foundation.rememberScrollState import androidx.compose.foundation.shape.CircleShape import androidx.compose.foundation.shape.RoundedCornerShape import androidx.compose.foundation.verticalScroll import androidx.compose.material3.CircularProgressIndicator import androidx.compose.material3.HorizontalDivider import androidx.compose.material3.MaterialTheme import androidx.compose.material3.OutlinedTextField import androidx.compose.material3.OutlinedTextFieldDefaults import androidx.compose.material3.Text import androidx.compose.material3.TextButton import androidx.compose.runtime.Composable import androidx.compose.runtime.LaunchedEffect import androidx.compose.runtime.getValue import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.remember import androidx.compose.runtime.setValue import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.draw.clip import androidx.compose.ui.draw.shadow import androidx.compose.ui.graphics.Color import androidx.compose.ui.layout.ContentScale import androidx.compose.ui.text.font.FontWeight import androidx.compose.ui.text.style.TextAlign import androidx.compose.ui.text.style.TextOverflow import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.sp import androidx.compose.ui.window.Dialog import androidx.compose.ui.window.DialogProperties import coil.compose.AsyncImage import androidx.compose.foundation.layout.heightIn import androidx.compose.material3.Surface import androidx.compose.ui.graphics.Brush import ru.forbion.f7cloud.core.auth.AuthSession import ru.forbion.f7cloud.core.designsystem.F7Colors import ru.forbion.f7cloud.core.designsystem.F7PrimaryButton import java.time.Instant import java.time.ZoneId import java.time.format.DateTimeFormatter import java.util.Locale</ID>
<ID>LongMethod:SupportScreen.kt$@Composable fun SupportScreen( session: AuthSession, modifier: Modifier = Modifier, createRequest: Int = 0, openTicketNumber: String? = null, onOpenTicketConsumed: () -&gt; Unit = {}, onUnauthorized: () -&gt; Unit = {}, )</ID>
<ID>LoopWithTooManyJumpStatements:SupportRepository.kt$SupportRepository$for</ID>
<ID>LoopWithTooManyJumpStatements:SupportViewModel.kt$SupportViewModel$while</ID>
<ID>MaximumLineLength:SupportComponents.kt$ </ID>
<ID>NoUnusedImports:SupportRepository.kt$ru.forbion.f7cloud.feature.f7support.SupportRepository.kt</ID>
<ID>UnusedParameter:SupportRepository.kt$SupportRepository$config: SupportConfig</ID>
<ID>UnusedParameter:SupportViewModel.kt$SupportViewModel$session: AuthSession</ID>
</CurrentIssues>
</SmellBaseline>
+34
View File
@@ -0,0 +1,34 @@
<?xml version="1.0" ?>
<SmellBaseline>
<ManuallySuppressedIssues/>
<CurrentIssues>
<ID>ArgumentListWrapping:FilesScreen.kt$("/", " ")</ID>
<ID>ArgumentListWrapping:FilesViewModel.kt$FilesViewModel$(session, "Новая диаграмма", ".odg", openAfterCreate = true)</ID>
<ID>ArgumentListWrapping:FilesViewModel.kt$FilesViewModel$(session, "Новая доска", ".whiteboard", openAfterCreate = false)</ID>
<ID>ArgumentListWrapping:FilesViewModel.kt$FilesViewModel$(session, "Новая презентация", ".pptx", openAfterCreate = true)</ID>
<ID>ArgumentListWrapping:FilesViewModel.kt$FilesViewModel$(session, "Новая таблица", ".xlsx", openAfterCreate = true)</ID>
<ID>ArgumentListWrapping:FilesViewModel.kt$FilesViewModel$(session, "Новый документ", ".docx", openAfterCreate = true)</ID>
<ID>ArgumentListWrapping:FilesViewModel.kt$FilesViewModel$(session, "Новый текстовый файл", ".txt", openAfterCreate = false)</ID>
<ID>CyclomaticComplexMethod:FilesScreen.kt$@OptIn(ExperimentalMaterial3Api::class) @Composable fun FilesScreen( session: AuthSession, modifier: Modifier = Modifier, uploadRequest: Int = 0, pushRefreshRequest: Int = 0, openFileId: Long? = null, sidebarOpen: Boolean = false, onSidebarOpenChange: (Boolean) -&gt; Unit = {}, settingsOpen: Boolean = false, onSettingsOpenChange: (Boolean) -&gt; Unit = {}, onOpenFileConsumed: () -&gt; Unit = {}, onUnauthorized: () -&gt; Unit = {}, onOpenOfficeEditor: (OfficeEditorLaunch) -&gt; Unit = {}, )</ID>
<ID>ImportOrdering:FilesComponents.kt$import androidx.compose.animation.AnimatedVisibility import androidx.compose.animation.slideInHorizontally import androidx.compose.animation.slideOutHorizontally import androidx.compose.foundation.background import androidx.compose.foundation.border import androidx.compose.foundation.clickable import androidx.compose.foundation.interaction.MutableInteractionSource import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.Box import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.Row import androidx.compose.foundation.layout.Spacer import androidx.compose.foundation.layout.fillMaxHeight import androidx.compose.foundation.layout.fillMaxSize import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.height import androidx.compose.foundation.layout.padding import androidx.compose.foundation.layout.size import androidx.compose.foundation.layout.width import androidx.compose.foundation.layout.widthIn import androidx.compose.foundation.rememberScrollState import androidx.compose.foundation.shape.RoundedCornerShape import androidx.compose.foundation.verticalScroll import androidx.compose.material3.Checkbox import androidx.compose.material3.CheckboxDefaults import androidx.compose.material3.CircularProgressIndicator import androidx.compose.material3.HorizontalDivider import androidx.compose.material3.MaterialTheme import androidx.compose.material3.RadioButton import androidx.compose.material3.RadioButtonDefaults import androidx.compose.material3.Surface import androidx.compose.material3.Switch import androidx.compose.material3.SwitchDefaults import androidx.compose.material3.Text import androidx.compose.material3.TextButton import androidx.compose.runtime.Composable import androidx.compose.runtime.getValue import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.remember import androidx.compose.runtime.setValue import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.foundation.text.BasicTextField import androidx.compose.ui.draw.clip import androidx.compose.ui.draw.shadow import androidx.compose.ui.graphics.SolidColor import androidx.compose.ui.text.PlatformTextStyle import androidx.compose.ui.text.TextStyle import androidx.compose.ui.geometry.Rect import androidx.compose.ui.graphics.Color import androidx.compose.ui.layout.ContentScale import androidx.compose.ui.layout.boundsInWindow import androidx.compose.ui.layout.onGloballyPositioned import androidx.compose.ui.platform.LocalConfiguration import androidx.compose.ui.platform.LocalDensity import androidx.compose.ui.text.font.FontWeight import androidx.compose.ui.text.style.TextOverflow import androidx.compose.ui.unit.IntOffset import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.sp import androidx.compose.ui.window.Popup import androidx.compose.ui.window.PopupProperties import androidx.compose.ui.window.DialogProperties import coil.compose.AsyncImage import ru.forbion.f7cloud.core.designsystem.F7AlertDialog import ru.forbion.f7cloud.core.designsystem.F7Colors import ru.forbion.f7cloud.core.designsystem.F7OutlinedField import ru.forbion.f7cloud.core.designsystem.F7PrimaryButton import ru.forbion.f7cloud.core.designsystem.F7SecondaryButton import java.text.SimpleDateFormat import java.util.Date import java.util.Locale</ID>
<ID>ImportOrdering:FilesRepository.kt$import android.content.Context import ru.forbion.f7cloud.core.auth.AuthSession import ru.forbion.f7cloud.core.database.F7Database import ru.forbion.f7cloud.core.database.FileEntity import ru.forbion.f7cloud.core.network.DavClient import ru.forbion.f7cloud.core.network.NetworkFactory import ru.forbion.f7cloud.core.auth.OcsUserResolver import ru.forbion.f7cloud.core.network.UnauthorizedException import ru.forbion.f7cloud.core.network.davFileUrl import ru.forbion.f7cloud.core.network.davFolderUrl import okhttp3.MediaType.Companion.toMediaType import okhttp3.RequestBody.Companion.toRequestBody</ID>
<ID>ImportOrdering:FilesScreen.kt$import androidx.activity.compose.rememberLauncherForActivityResult import androidx.activity.result.contract.ActivityResultContracts import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.Box import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.fillMaxSize import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.padding import androidx.compose.foundation.lazy.LazyColumn import androidx.compose.foundation.lazy.itemsIndexed import androidx.compose.foundation.lazy.rememberLazyListState import androidx.compose.material3.ExperimentalMaterial3Api import androidx.compose.material3.pulltorefresh.PullToRefreshBox import androidx.compose.material3.CircularProgressIndicator import androidx.compose.material3.HorizontalDivider import androidx.compose.material3.MaterialTheme import androidx.compose.material3.SnackbarHost import androidx.compose.material3.SnackbarHostState import androidx.compose.material3.Text import androidx.compose.runtime.Composable import androidx.compose.runtime.LaunchedEffect import androidx.compose.runtime.collectAsState import androidx.compose.runtime.getValue import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.remember import androidx.compose.runtime.setValue import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.geometry.Rect import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.unit.dp import androidx.lifecycle.viewmodel.compose.viewModel import ru.forbion.f7cloud.core.auth.AuthSession import ru.forbion.f7cloud.core.designsystem.F7AlertDialog import ru.forbion.f7cloud.core.designsystem.F7Colors import ru.forbion.f7cloud.core.designsystem.F7ModuleScreen import ru.forbion.f7cloud.core.designsystem.F7OverlayDismissHandler import ru.forbion.f7cloud.core.designsystem.F7OutlinedField import ru.forbion.f7cloud.core.designsystem.F7SecondaryButton import java.io.File</ID>
<ID>ImportOrdering:ImageViewerActivity.kt$import android.content.Context import android.content.Intent import android.os.Bundle import androidx.activity.ComponentActivity import androidx.activity.compose.setContent import androidx.compose.foundation.background import androidx.compose.foundation.layout.Box import androidx.compose.foundation.layout.fillMaxSize import androidx.compose.foundation.layout.padding import androidx.compose.material3.IconButton import androidx.compose.material3.MaterialTheme import androidx.compose.material3.Text import androidx.compose.material3.TopAppBar import androidx.compose.material3.ExperimentalMaterial3Api import androidx.compose.runtime.Composable import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.graphics.Color import androidx.compose.ui.layout.ContentScale import androidx.compose.ui.text.style.TextOverflow import androidx.compose.ui.unit.dp import coil.compose.AsyncImage import ru.forbion.f7cloud.core.designsystem.F7Theme import java.io.File</ID>
<ID>LargeClass:FilesViewModel.kt$FilesViewModel : ViewModel</ID>
<ID>LongMethod:FilesComponents.kt$@Composable fun FilesNavigationSidebar( serverUrl: String, visible: Boolean, browseMode: FilesBrowseMode, storageStats: FilesStorageStats, folderTree: List&lt;FilesFolderTreeNode&gt;, expandedTreePaths: Set&lt;String&gt;, expandedSections: Set&lt;String&gt;, onDismiss: () -&gt; Unit, onBrowseModeClick: (FilesBrowseMode) -&gt; Unit, onFolderPathClick: (String) -&gt; Unit, onToggleTreePath: (String) -&gt; Unit, onToggleSection: (String) -&gt; Unit, onWebOnlyClick: (String) -&gt; Unit, )</ID>
<ID>LongMethod:FilesScreen.kt$@OptIn(ExperimentalMaterial3Api::class) @Composable fun FilesScreen( session: AuthSession, modifier: Modifier = Modifier, uploadRequest: Int = 0, pushRefreshRequest: Int = 0, openFileId: Long? = null, sidebarOpen: Boolean = false, onSidebarOpenChange: (Boolean) -&gt; Unit = {}, settingsOpen: Boolean = false, onSettingsOpenChange: (Boolean) -&gt; Unit = {}, onOpenFileConsumed: () -&gt; Unit = {}, onUnauthorized: () -&gt; Unit = {}, onOpenOfficeEditor: (OfficeEditorLaunch) -&gt; Unit = {}, )</ID>
<ID>MatchingDeclarationName:FilesCreateMenu.kt$FilesCreateAction</ID>
<ID>MaximumLineLength:FilesScreen.kt$ </ID>
<ID>MaximumLineLength:FilesViewModel.kt$FilesViewModel$ </ID>
<ID>NoUnusedImports:FileDownloadRepository.kt$ru.forbion.f7cloud.feature.files.FileDownloadRepository.kt</ID>
<ID>NoUnusedImports:FilesApiRepository.kt$ru.forbion.f7cloud.feature.files.FilesApiRepository.kt</ID>
<ID>NoUnusedImports:FilesComponents.kt$ru.forbion.f7cloud.feature.files.FilesComponents.kt</ID>
<ID>NoUnusedImports:FilesRepository.kt$ru.forbion.f7cloud.feature.files.FilesRepository.kt</ID>
<ID>NoUnusedImports:FilesScreen.kt$ru.forbion.f7cloud.feature.files.FilesScreen.kt</ID>
<ID>NoUnusedImports:FilesTemplatesRepository.kt$ru.forbion.f7cloud.feature.files.FilesTemplatesRepository.kt</ID>
<ID>NoUnusedImports:RichdocumentsRepository.kt$ru.forbion.f7cloud.feature.files.RichdocumentsRepository.kt</ID>
<ID>UnusedParameter:FilesComponents.kt$selectionMode: Boolean</ID>
<ID>UnusedParameter:FilesViewModel.kt$FilesViewModel$context: Context</ID>
<ID>Wrapping:FilesCreateMenu.kt$;</ID>
</CurrentIssues>
</SmellBaseline>
+46
View File
@@ -0,0 +1,46 @@
<?xml version="1.0" ?>
<SmellBaseline>
<ManuallySuppressedIssues/>
<CurrentIssues>
<ID>ArgumentListWrapping:MailComposeScreen.kt$(hour, minute)</ID>
<ID>ArgumentListWrapping:MailComposeScreen.kt$(updatedDate, java.time.LocalTime.of(hour, minute))</ID>
<ID>ArgumentListWrapping:MailModels.kt$("""^\s*&lt;(?:!DOCTYPE|html|head|body|table|div|p|span|br|meta)\b""", RegexOption.IGNORE_CASE)</ID>
<ID>ArgumentListWrapping:MailScreen.kt$(context, it.message ?: "Ошибка загрузки", Toast.LENGTH_SHORT)</ID>
<ID>ComplexCondition:MailComposeActivity.kt$MailComposeActivity$username.isBlank() || serverUrl.isBlank() || accountId &lt;= 0 || accountEmail.isBlank()</ID>
<ID>ComplexCondition:MailRepository.kt$MailRepository$configured != null &amp;&amp; (role != "sent" || configured.specialRole != "inbox" &amp;&amp; !configured.isInbox)</ID>
<ID>CyclomaticComplexMethod:MailScreen.kt$@Composable fun MailScreen( session: AuthSession, modifier: Modifier = Modifier, openMessageId: Int? = null, openMailboxId: Int? = null, pushRefreshRequest: Int = 0, sidebarOpen: Boolean = false, onSidebarOpenChange: (Boolean) -&gt; Unit = {}, settingsOpen: Boolean = false, onSettingsOpenChange: (Boolean) -&gt; Unit = {}, onOpenMessageConsumed: () -&gt; Unit = {}, onMessageOpenStateChange: (Boolean) -&gt; Unit = {}, onUnauthorized: () -&gt; Unit = {}, )</ID>
<ID>ImportOrdering:MailComponents.kt$import androidx.compose.animation.AnimatedVisibility import androidx.compose.animation.slideInHorizontally import androidx.compose.animation.slideOutHorizontally import androidx.compose.foundation.background import androidx.compose.foundation.border import androidx.compose.foundation.clickable import androidx.compose.foundation.interaction.MutableInteractionSource import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.FlowRow import androidx.compose.foundation.layout.ExperimentalLayoutApi import androidx.compose.foundation.layout.Box import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.Row import androidx.compose.foundation.layout.Spacer import androidx.compose.foundation.layout.fillMaxHeight import androidx.compose.foundation.layout.fillMaxSize import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.height import androidx.compose.foundation.layout.padding import androidx.compose.foundation.layout.size import androidx.compose.foundation.layout.width import androidx.compose.foundation.layout.widthIn import androidx.compose.foundation.lazy.LazyRow import androidx.compose.foundation.lazy.items import androidx.compose.foundation.rememberScrollState import androidx.compose.foundation.shape.CircleShape import androidx.compose.foundation.shape.RoundedCornerShape import androidx.compose.foundation.text.BasicTextField import androidx.compose.foundation.verticalScroll import androidx.compose.material3.Checkbox import androidx.compose.material3.CheckboxDefaults import androidx.compose.material3.DropdownMenu import androidx.compose.material3.DropdownMenuItem import androidx.compose.material3.IconButton import androidx.compose.material3.MenuDefaults import androidx.compose.material3.MaterialTheme import androidx.compose.material3.Surface import androidx.compose.material3.Text import androidx.compose.runtime.Composable import androidx.compose.runtime.getValue import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.remember import androidx.compose.runtime.setValue import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.draw.clip import androidx.compose.ui.draw.shadow import androidx.compose.ui.graphics.Brush import androidx.compose.ui.graphics.Color import androidx.compose.ui.graphics.SolidColor import androidx.compose.ui.graphics.graphicsLayer import androidx.compose.ui.layout.ContentScale import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.text.PlatformTextStyle import androidx.compose.ui.text.TextStyle import androidx.compose.ui.text.font.FontWeight import androidx.compose.ui.text.style.TextOverflow import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.sp import androidx.compose.ui.window.DialogProperties import coil.compose.AsyncImage import kotlin.OptIn import ru.forbion.f7cloud.core.designsystem.F7Colors import ru.forbion.f7cloud.core.designsystem.F7ListCard import ru.forbion.f7cloud.core.designsystem.F7OutlinedField import ru.forbion.f7cloud.core.designsystem.F7PrimaryButton import ru.forbion.f7cloud.core.designsystem.F7SecondaryButton import ru.forbion.f7cloud.core.designsystem.f7SwipeFromRightToDismiss import java.text.DateFormat import java.text.SimpleDateFormat import java.util.Calendar import java.util.Date import java.util.Locale import kotlin.math.abs import android.app.DatePickerDialog</ID>
<ID>ImportOrdering:MailScreen.kt$import android.widget.Toast import androidx.compose.foundation.background import androidx.compose.foundation.clickable import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.Box import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.Row import androidx.compose.foundation.layout.Spacer import androidx.compose.foundation.layout.fillMaxSize import androidx.compose.foundation.layout.fillMaxHeight import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.height import androidx.compose.foundation.layout.padding import androidx.compose.foundation.layout.size import androidx.compose.foundation.layout.width import androidx.compose.foundation.lazy.LazyColumn import androidx.compose.foundation.lazy.items import androidx.compose.foundation.lazy.rememberLazyListState import androidx.compose.foundation.rememberScrollState import androidx.compose.foundation.shape.RoundedCornerShape import androidx.compose.foundation.verticalScroll import androidx.compose.material3.CircularProgressIndicator import androidx.compose.material3.MaterialTheme import androidx.compose.material3.Text import androidx.compose.runtime.Composable import androidx.compose.runtime.LaunchedEffect import androidx.compose.runtime.collectAsState import androidx.compose.runtime.getValue import androidx.compose.runtime.key import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.remember import androidx.compose.runtime.setValue import androidx.compose.runtime.snapshotFlow import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.draw.clip import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.text.font.FontWeight import androidx.compose.ui.text.style.TextOverflow import androidx.compose.ui.unit.dp import androidx.lifecycle.ViewModel import androidx.lifecycle.ViewModelProvider import androidx.lifecycle.viewmodel.compose.viewModel import ru.forbion.f7cloud.core.auth.AuthSession import androidx.activity.compose.BackHandler import ru.forbion.f7cloud.core.designsystem.F7Colors import ru.forbion.f7cloud.core.designsystem.F7OverlayDismissHandler import ru.forbion.f7cloud.core.designsystem.f7SwipeFromRightToDismiss import androidx.activity.compose.rememberLauncherForActivityResult import androidx.activity.result.contract.ActivityResultContracts import ru.forbion.f7cloud.core.network.NetworkFactory import ru.forbion.f7cloud.feature.files.LocalFileOpener import kotlinx.coroutines.flow.distinctUntilChanged import java.io.File</ID>
<ID>Indentation:MailScreen.kt$ </ID>
<ID>LargeClass:MailRepository.kt$MailRepository</ID>
<ID>LargeClass:MailViewModel.kt$MailViewModel : ViewModel</ID>
<ID>LongMethod:MailComponents.kt$@Composable fun MailMessageSenderCard( fromName: String, fromEmail: String, subject: String, to: String, cc: String, dateInt: Long, flagged: Boolean, seen: Boolean, important: Boolean, serverUrl: String, onReply: () -&gt; Unit, onToggleStar: () -&gt; Unit, onMarkUnread: () -&gt; Unit, onDelete: () -&gt; Unit, onToggleImportant: () -&gt; Unit, onForward: () -&gt; Unit, onMarkSpam: () -&gt; Unit, onEditTags: () -&gt; Unit, onMove: () -&gt; Unit, onSnooze: () -&gt; Unit, modifier: Modifier = Modifier, )</ID>
<ID>LongMethod:MailComponents.kt$@Composable fun MailNavigationSidebar( serverUrl: String, visible: Boolean, accounts: List&lt;MailAccount&gt;, folders: List&lt;MailFolderEntry&gt;, selected: MailFolderEntry?, collapsedAccountIds: Set&lt;Int&gt;, onDismiss: () -&gt; Unit, onComposeClick: () -&gt; Unit, onRefreshClick: () -&gt; Unit, onFolderClick: (MailFolderEntry) -&gt; Unit, onToggleAccountCollapsed: (Int) -&gt; Unit, onPriorityInboxClick: () -&gt; Unit, onOutboxClick: () -&gt; Unit, )</ID>
<ID>LongMethod:MailComponents.kt$@Composable fun MailSearchParamsSheet( visible: Boolean, params: MailSearchParams, onDismiss: () -&gt; Unit, onSearch: (MailSearchParams) -&gt; Unit, onClear: () -&gt; Unit, )</ID>
<ID>LongMethod:MailComposeScreen.kt$@Composable fun MailComposeScreen( session: AuthSession, launch: MailComposeLaunch, vm: MailComposeViewModel, onClose: () -&gt; Unit, onUnauthorized: () -&gt; Unit, modifier: Modifier = Modifier, )</ID>
<ID>LongMethod:MailFilesPickerActivity.kt$@Composable private fun MailFilesPickerScreen( session: AuthSession, title: String, onCancel: () -&gt; Unit, onUnauthorized: () -&gt; Unit, onFileSelected: (FileItem) -&gt; Unit, )</ID>
<ID>LongMethod:MailScreen.kt$@Composable fun MailScreen( session: AuthSession, modifier: Modifier = Modifier, openMessageId: Int? = null, openMailboxId: Int? = null, pushRefreshRequest: Int = 0, sidebarOpen: Boolean = false, onSidebarOpenChange: (Boolean) -&gt; Unit = {}, settingsOpen: Boolean = false, onSettingsOpenChange: (Boolean) -&gt; Unit = {}, onOpenMessageConsumed: () -&gt; Unit = {}, onMessageOpenStateChange: (Boolean) -&gt; Unit = {}, onUnauthorized: () -&gt; Unit = {}, )</ID>
<ID>LongMethod:MailScreen.kt$@Composable private fun MailInboxScreen( session: AuthSession, modifier: Modifier = Modifier, selectedFolder: MailFolderEntry?, loading: Boolean, loadingMore: Boolean, error: String?, searchQuery: String, searchParams: MailSearchParams, isOutbox: Boolean, messages: List&lt;MailMessage&gt;, outboxMessages: List&lt;MailOutboxMessage&gt;, nextCursor: Long?, onSearchChange: (String) -&gt; Unit, onQuickFilterToggle: (MailQuickFilter) -&gt; Unit, onComposeClick: () -&gt; Unit, onFilterClick: () -&gt; Unit, onMessageClick: (Int) -&gt; Unit, onOutboxRetry: (Int) -&gt; Unit, onOutboxDelete: (Int) -&gt; Unit, onLoadMore: () -&gt; Unit, )</ID>
<ID>LongMethod:MailScreen.kt$@Composable private fun MailMessageDetailView( session: AuthSession, detail: MailMessageDetail?, loading: Boolean, httpClient: okhttp3.OkHttpClient, modifier: Modifier = Modifier, showHeader: Boolean = true, htmlBodyExternal: Boolean = false, onAttachmentClick: (MailAttachment) -&gt; Unit, )</ID>
<ID>LongMethod:MailSettingsScreens.kt$@Composable private fun MailAccountSettingsScreen( settings: MailAccountSettings?, loading: Boolean, saving: Boolean, mailboxes: List&lt;MailMailbox&gt;, onBack: () -&gt; Unit, onSave: (MailAccountSettings) -&gt; Unit, )</ID>
<ID>LongMethod:MailSettingsScreens.kt$@Composable private fun MailAppSettingsScreen( serverUrl: String, accounts: List&lt;MailAccount&gt;, appSettings: MailAppSettings?, loading: Boolean, saving: Boolean, onAccountClick: (Int) -&gt; Unit, onShowThreadedChange: (Boolean) -&gt; Unit, onHighlightExternalChange: (Boolean) -&gt; Unit, onRemoveTrustedSender: (MailTrustedSender) -&gt; Unit, onCreateTextBlock: (String, String) -&gt; Unit, onDeleteTextBlock: (Int) -&gt; Unit, onDismiss: () -&gt; Unit, )</ID>
<ID>LoopWithTooManyJumpStatements:MailCacheRepository.kt$MailCacheRepository$for</ID>
<ID>LoopWithTooManyJumpStatements:MailRepository.kt$MailRepository$for</ID>
<ID>LoopWithTooManyJumpStatements:MailRepository.kt$MailRepository$while</ID>
<ID>MatchingDeclarationName:MailRichTextEditor.kt$MailRichTextEditorController</ID>
<ID>MaximumLineLength:MailComposeActivity.kt$MailComposeActivity.Companion$ </ID>
<ID>MaximumLineLength:MailComposeScreen.kt$ </ID>
<ID>MaximumLineLength:MailComposeViewModel.kt$MailComposeViewModel$ </ID>
<ID>MaximumLineLength:MailModels.kt$private</ID>
<ID>MaximumLineLength:MailScreen.kt$ </ID>
<ID>MaximumLineLength:MailViewModel.kt$MailViewModel$ </ID>
<ID>NestedBlockDepth:MailRepository.kt$MailRepository$private fun parseMailboxes(data: Any): List&lt;MailMailbox&gt;</ID>
<ID>NoUnusedImports:MailComponents.kt$ru.forbion.f7cloud.feature.mail.MailComponents.kt</ID>
<ID>NoUnusedImports:MailComposeScreen.kt$ru.forbion.f7cloud.feature.mail.MailComposeScreen.kt</ID>
<ID>NoUnusedImports:MailRepository.kt$ru.forbion.f7cloud.feature.mail.MailRepository.kt</ID>
<ID>PropertyWrapping:MailModels.kt$private val HTML_BODY_HINT = Regex("""^\s*&lt;(?:!DOCTYPE|html|head|body|table|div|p|span|br|meta)\b""", RegexOption.IGNORE_CASE)</ID>
<ID>UnusedParameter:MailRepository.kt$MailRepository$serverUrl: String</ID>
<ID>UnusedPrivateMember:MailComponents.kt$@Composable private fun MailTagChip(tag: MailTag)</ID>
<ID>UnusedPrivateProperty:MailComponents.kt$private val StarColor = Color(0xFFF9CF3D)</ID>
</CurrentIssues>
</SmellBaseline>
+10
View File
@@ -0,0 +1,10 @@
<?xml version="1.0" ?>
<SmellBaseline>
<ManuallySuppressedIssues/>
<CurrentIssues>
<ID>FunctionOnlyReturningConstant:TalkNativeFacade.kt$TalkNativeFacade$fun nativeShellReady(): Boolean</ID>
<ID>ImportOrdering:TalkNativeCallLauncher.kt$import android.app.Activity import android.content.Context import android.content.Intent import android.util.Log import android.widget.Toast import ru.f7cloud.talk.activities.CallActivity import ru.f7cloud.talk.services.CallForegroundService import ru.f7cloud.talk.utils.bundle.BundleKeys import ru.f7cloud.talk.utils.singletons.ApplicationWideCurrentRoomHolder import ru.f7cloud.talk.utils.bundle.BundleKeys.KEY_CONVERSATION_DISPLAY_NAME import ru.f7cloud.talk.utils.bundle.BundleKeys.KEY_CONVERSATION_NAME import ru.f7cloud.talk.utils.bundle.BundleKeys.KEY_IS_MODERATOR import ru.f7cloud.talk.utils.bundle.BundleKeys.KEY_RECORDING_STATE import ru.forbion.f7cloud.core.auth.AuthSession</ID>
<ID>ImportOrdering:TalkVendorUserSync.kt$import android.content.Context import android.util.Log import ru.f7cloud.talk.application.F7cloudTalkApplication import ru.f7cloud.talk.f7cloud.F7TalkUserSync import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.runBlocking import ru.forbion.f7cloud.core.auth.AuthSession</ID>
<ID>NoUnusedImports:TalkPushBridge.kt$ru.forbion.f7cloud.feature.talknative.TalkPushBridge.kt</ID>
</CurrentIssues>
</SmellBaseline>
+35
View File
@@ -0,0 +1,35 @@
<?xml version="1.0" ?>
<SmellBaseline>
<ManuallySuppressedIssues/>
<CurrentIssues>
<ID>CyclomaticComplexMethod:TalkFormatting.kt$fun buildChatItems( messages: List&lt;TalkMessage&gt;, lastReadMessageId: Long, selfActorId: String, collapseSystemMessages: Boolean, ): List&lt;TalkChatItem&gt;</ID>
<ID>CyclomaticComplexMethod:TalkScreen.kt$@Composable fun TalkScreen( session: AuthSession, modifier: Modifier = Modifier, openRoomToken: String? = null, scrollToMessageId: Long? = null, chatsListRequest: Int = 0, pushSyncRequest: Int = 0, pushRoomToken: String? = null, onOpenRoomConsumed: () -&gt; Unit = {}, onRoomOpenStateChange: (Boolean) -&gt; Unit = {}, onOpenCalendar: () -&gt; Unit = {}, onUnauthorized: () -&gt; Unit = {}, )</ID>
<ID>CyclomaticComplexMethod:TalkScreen.kt$@Composable private fun ChatContent( session: AuthSession, state: TalkUiState, draft: String, onDraftChange: (String) -&gt; Unit, onSend: () -&gt; Unit, onAttach: () -&gt; Unit, onVoiceToggle: () -&gt; Unit, voiceRecording: Boolean, onRetry: () -&gt; Unit, onStartCall: () -&gt; Unit, onBackClick: () -&gt; Unit, onOpenRoomInfo: () -&gt; Unit, onScheduleMeeting: () -&gt; Unit, onToggleSystemMessages: () -&gt; Unit, onReply: (TalkMessage) -&gt; Unit, onReaction: (TalkMessage, String) -&gt; Unit, onDeleteMessage: (TalkMessage) -&gt; Unit, onEditMessage: (TalkMessage, String) -&gt; Unit, onMentionQuery: (String?) -&gt; Unit, onMentionSelected: (TalkMention) -&gt; Unit, onClearReply: () -&gt; Unit, onClearHighlight: () -&gt; Unit, )</ID>
<ID>ImportOrdering:TalkComponents.kt$import androidx.compose.foundation.ExperimentalFoundationApi import androidx.compose.foundation.background import androidx.compose.foundation.clickable import androidx.compose.foundation.combinedClickable import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.Box import androidx.compose.foundation.layout.BoxScope import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.ExperimentalLayoutApi import androidx.compose.foundation.layout.FlowRow import androidx.compose.foundation.layout.Row import androidx.compose.foundation.layout.Spacer import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.height import androidx.compose.foundation.layout.heightIn import androidx.compose.foundation.layout.padding import androidx.compose.foundation.layout.size import androidx.compose.foundation.layout.width import androidx.compose.foundation.lazy.LazyColumn import androidx.compose.foundation.lazy.items import androidx.compose.foundation.shape.CircleShape import androidx.compose.foundation.shape.RoundedCornerShape import androidx.compose.material3.CircularProgressIndicator import androidx.compose.material3.ExperimentalMaterial3Api import androidx.compose.material3.MaterialTheme import androidx.compose.material3.ModalBottomSheet import androidx.compose.material3.OutlinedTextField import androidx.compose.material3.OutlinedTextFieldDefaults import androidx.compose.material3.Text import androidx.compose.material3.rememberModalBottomSheetState import androidx.compose.foundation.border import androidx.compose.foundation.layout.fillMaxSize import androidx.compose.foundation.layout.offset import androidx.compose.foundation.lazy.LazyRow import androidx.compose.material3.DropdownMenu import androidx.compose.material3.DropdownMenuItem import androidx.compose.material3.IconButton import androidx.compose.material3.Surface import androidx.compose.runtime.Composable import androidx.compose.runtime.LaunchedEffect import androidx.compose.runtime.getValue import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.remember import androidx.compose.runtime.setValue import androidx.compose.ui.Alignment import androidx.compose.ui.layout.ContentScale import androidx.compose.ui.platform.LocalContext import coil.compose.SubcomposeAsyncImage import coil.request.ImageRequest import okhttp3.Credentials import ru.forbion.f7cloud.core.auth.AuthSession import androidx.compose.ui.Modifier import androidx.compose.ui.draw.clip import androidx.compose.ui.draw.shadow import androidx.compose.ui.graphics.Color import androidx.compose.ui.graphics.graphicsLayer import coil.compose.AsyncImage import androidx.compose.ui.text.font.FontWeight import androidx.compose.ui.text.style.TextOverflow import androidx.compose.foundation.layout.widthIn import androidx.compose.ui.platform.LocalDensity import androidx.compose.ui.unit.IntOffset import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.sp import androidx.compose.ui.window.Popup import androidx.compose.ui.window.PopupProperties import ru.forbion.f7cloud.core.designsystem.F7Colors import ru.forbion.f7cloud.core.designsystem.F7PrimaryButton import ru.forbion.f7cloud.core.designsystem.F7TextButton import java.text.DateFormat import java.util.Calendar import java.util.Date import kotlin.math.abs</ID>
<ID>ImportOrdering:TalkScreen.kt$import android.Manifest import android.content.Context import android.content.pm.PackageManager import androidx.activity.compose.rememberLauncherForActivityResult import androidx.activity.result.contract.ActivityResultContracts import androidx.compose.foundation.clickable import androidx.compose.foundation.gestures.awaitEachGesture import androidx.compose.foundation.gestures.awaitFirstDown import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.Box import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.fillMaxSize import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.navigationBarsPadding import androidx.compose.foundation.layout.padding import androidx.compose.foundation.layout.size import androidx.compose.foundation.lazy.LazyColumn import androidx.compose.foundation.lazy.items import androidx.compose.foundation.lazy.rememberLazyListState import androidx.compose.foundation.shape.RoundedCornerShape import androidx.compose.ui.draw.clip import androidx.compose.ui.input.pointer.PointerEventPass import androidx.compose.ui.input.pointer.pointerInput import androidx.compose.material3.AlertDialog import androidx.compose.material3.CircularProgressIndicator import androidx.compose.material3.MaterialTheme import androidx.compose.material3.OutlinedTextField import androidx.compose.material3.Text import androidx.compose.material3.TextButton import androidx.compose.runtime.Composable import androidx.compose.runtime.LaunchedEffect import androidx.compose.runtime.collectAsState import androidx.compose.runtime.derivedStateOf import androidx.compose.runtime.getValue import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.remember import androidx.compose.runtime.rememberCoroutineScope import kotlinx.coroutines.launch import androidx.compose.runtime.saveable.rememberSaveable import androidx.compose.runtime.setValue import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.layout.ContentScale import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.unit.dp import androidx.core.content.ContextCompat import androidx.lifecycle.ViewModel import androidx.lifecycle.ViewModelProvider import androidx.lifecycle.viewmodel.compose.viewModel import coil.compose.AsyncImage import ru.forbion.f7cloud.core.auth.AuthSession import ru.forbion.f7cloud.core.designsystem.F7Colors import ru.forbion.f7cloud.core.designsystem.F7ModuleScreen import ru.forbion.f7cloud.core.designsystem.F7OverlayDismissHandler import ru.forbion.f7cloud.core.designsystem.F7TextButton import ru.forbion.f7cloud.feature.talknative.TalkNativeCallContext import ru.forbion.f7cloud.feature.talknative.TalkNativeCallLauncher</ID>
<ID>ImportOrdering:TalkViewModel.kt$import androidx.lifecycle.ViewModel import androidx.lifecycle.viewModelScope import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.Job import kotlinx.coroutines.delay import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.flow.StateFlow import kotlinx.coroutines.flow.asStateFlow import kotlinx.coroutines.launch import kotlinx.coroutines.isActive import ru.forbion.f7cloud.core.auth.AuthSession import ru.forbion.f7cloud.core.designsystem.AppForegroundTracker import ru.forbion.f7cloud.core.network.UnauthorizedException</ID>
<ID>InstanceOfCheckForException:TalkViewModel.kt$TalkViewModel$t is UnauthorizedException</ID>
<ID>LargeClass:TalkViewModel.kt$TalkViewModel : ViewModel</ID>
<ID>LongMethod:TalkComponents.kt$@Composable fun TalkComposer( session: AuthSession, value: String, onValueChange: (String) -&gt; Unit, onSend: () -&gt; Unit, onAttach: (() -&gt; Unit)? = null, onVoiceToggle: (() -&gt; Unit)? = null, voiceRecording: Boolean = false, mentionCandidates: List&lt;TalkMention&gt; = emptyList(), onMentionQuery: ((String?) -&gt; Unit)? = null, onMentionSelected: ((TalkMention) -&gt; Unit)? = null, sending: Boolean, uploading: Boolean = false, modifier: Modifier = Modifier, )</ID>
<ID>LongMethod:TalkComponents.kt$@Composable fun TalkRoomRow( room: TalkRoom, session: AuthSession, modifier: Modifier = Modifier, onClick: () -&gt; Unit, onToggleFavorite: () -&gt; Unit = {}, onMarkUnread: () -&gt; Unit = {}, )</ID>
<ID>LongMethod:TalkComponents.kt$@OptIn(ExperimentalMaterial3Api::class, ExperimentalLayoutApi::class) @Composable fun TalkCreateRoomSheet( visible: Boolean, session: AuthSession, mode: CreateRoomMode, roomName: String, userSearchQuery: String, userSearchResults: List&lt;TalkUserCandidate&gt;, selectedUsers: List&lt;TalkUserCandidate&gt;, userSearchLoading: Boolean, creating: Boolean, onDismiss: () -&gt; Unit, onModeChange: (CreateRoomMode) -&gt; Unit, onRoomNameChange: (String) -&gt; Unit, onUserSearchChange: (String) -&gt; Unit, onUserToggle: (TalkUserCandidate) -&gt; Unit, onCreate: () -&gt; Unit, )</ID>
<ID>LongMethod:TalkScreen.kt$@Composable fun TalkScreen( session: AuthSession, modifier: Modifier = Modifier, openRoomToken: String? = null, scrollToMessageId: Long? = null, chatsListRequest: Int = 0, pushSyncRequest: Int = 0, pushRoomToken: String? = null, onOpenRoomConsumed: () -&gt; Unit = {}, onRoomOpenStateChange: (Boolean) -&gt; Unit = {}, onOpenCalendar: () -&gt; Unit = {}, onUnauthorized: () -&gt; Unit = {}, )</ID>
<ID>LongMethod:TalkScreen.kt$@Composable private fun ChatContent( session: AuthSession, state: TalkUiState, draft: String, onDraftChange: (String) -&gt; Unit, onSend: () -&gt; Unit, onAttach: () -&gt; Unit, onVoiceToggle: () -&gt; Unit, voiceRecording: Boolean, onRetry: () -&gt; Unit, onStartCall: () -&gt; Unit, onBackClick: () -&gt; Unit, onOpenRoomInfo: () -&gt; Unit, onScheduleMeeting: () -&gt; Unit, onToggleSystemMessages: () -&gt; Unit, onReply: (TalkMessage) -&gt; Unit, onReaction: (TalkMessage, String) -&gt; Unit, onDeleteMessage: (TalkMessage) -&gt; Unit, onEditMessage: (TalkMessage, String) -&gt; Unit, onMentionQuery: (String?) -&gt; Unit, onMentionSelected: (TalkMention) -&gt; Unit, onClearReply: () -&gt; Unit, onClearHighlight: () -&gt; Unit, )</ID>
<ID>LoopWithTooManyJumpStatements:TalkRepository.kt$TalkRepository$for</ID>
<ID>LoopWithTooManyJumpStatements:TalkViewModel.kt$TalkViewModel$while</ID>
<ID>MatchingDeclarationName:TalkFilters.kt$TalkRoomFilter</ID>
<ID>MatchingDeclarationName:TalkFormatting.kt$TalkChatItem</ID>
<ID>MaximumLineLength:TalkCallActivity.kt$TalkCallActivity$ </ID>
<ID>MultiLineIfElse:TalkComponents.kt$Modifier</ID>
<ID>MultiLineIfElse:TalkComponents.kt$Modifier.graphicsLayer { rotationZ = 180f }</ID>
<ID>NestedBlockDepth:TalkViewModel.kt$TalkViewModel$private fun resolveDisplayName(context: android.content.Context, uri: android.net.Uri, mimeType: String): String</ID>
<ID>NoUnusedImports:TalkAttachmentUploader.kt$ru.forbion.f7cloud.feature.talk.TalkAttachmentUploader.kt</ID>
<ID>NoUnusedImports:TalkOfflineRepository.kt$ru.forbion.f7cloud.feature.talk.TalkOfflineRepository.kt</ID>
<ID>NoUnusedImports:TalkRepository.kt$ru.forbion.f7cloud.feature.talk.TalkRepository.kt</ID>
<ID>NoUnusedImports:TalkScreen.kt$ru.forbion.f7cloud.feature.talk.TalkScreen.kt</ID>
<ID>NoUnusedImports:TalkShareActivity.kt$ru.forbion.f7cloud.feature.talk.TalkShareActivity.kt</ID>
<ID>UnusedParameter:TalkRoomInfoSheet.kt$session: AuthSession</ID>
<ID>Wrapping:TalkComponents.kt$;</ID>
<ID>Wrapping:TalkViewModel.kt$TalkUiState$(</ID>
</CurrentIssues>
</SmellBaseline>
+21
View File
@@ -0,0 +1,21 @@
<?xml version="1.0" ?>
<SmellBaseline>
<ManuallySuppressedIssues/>
<CurrentIssues>
<ID>ArgumentListWrapping:TasksComponents.kt$(16.dp)</ID>
<ID>ArgumentListWrapping:TasksComponents.kt$(18.dp)</ID>
<ID>ArgumentListWrapping:TasksComponents.kt$(model = tasksAsset(serverUrl, iconPath), contentDescription = null, modifier = Modifier.size(16.dp))</ID>
<ID>ArgumentListWrapping:TasksComponents.kt$(model = tasksAsset(serverUrl, iconPath), contentDescription = null, modifier = Modifier.size(18.dp))</ID>
<ID>ArgumentListWrapping:TasksComponents.kt$(serverUrl, iconPath)</ID>
<ID>ArgumentListWrapping:TasksGrouping.kt$TasksGrouping$(compareByDescending&lt;TaskItem&gt; { it.dueLocalDate() ?: LocalDate.MIN } .thenBy { it.summary.lowercase() })</ID>
<ID>Indentation:TasksComponents.kt$ </ID>
<ID>LongMethod:TasksComponents.kt$@Composable fun TaskDetailSheet( visible: Boolean, serverUrl: String, task: TaskItem?, saving: Boolean, onDismiss: () -&gt; Unit, onSwipeBack: () -&gt; Unit = onDismiss, onToggleComplete: () -&gt; Unit, onSave: (summary: String, due: String, priority: Int, description: String) -&gt; Unit, onDelete: () -&gt; Unit, )</ID>
<ID>MaximumLineLength:TasksComponents.kt$ </ID>
<ID>NoUnusedImports:TasksComponents.kt$ru.forbion.f7cloud.feature.tasks.TasksComponents.kt</ID>
<ID>UnusedParameter:TasksComponents.kt$onCreateCollapse: () -&gt; Unit</ID>
<ID>UnusedPrivateProperty:TasksComponents.kt$private val TasksTagBg = Color(0xFFDAEDD6)</ID>
<ID>UnusedPrivateProperty:TasksComponents.kt$private val TasksTagText = Color(0xFF28A413)</ID>
<ID>Wrapping:TasksGrouping.kt$TasksGrouping$(</ID>
<ID>Wrapping:TasksViewModel.kt$TasksViewModel$(</ID>
</CurrentIssues>
</SmellBaseline>