No clever tagline needed.
This report summarizes scanner evidence for LawnchairLauncher/lawnchair, a Java project with 13,832 GitHub stars. SynthScan examined 1,050,282 lines of code across 6811 source files, recording 130 pattern matches distributed across 12 syntactic categories. The legacy adjusted pattern signal is 0.7 (Low pattern signal); it is not an authorship estimate.
Use the findings to ask whether maintainers can explain intent, verify dependencies, simplify unnecessary scaffolding, and focus review effort. Risk Payload v1 adds ownership, supply-chain, over-engineering, and review-effort vectors when available. These are prompts for human verification, not probabilities, security findings, or measured maintenance costs.
Use each vector to guide manual verification of the underlying findings.
Payload schema: 1.0.0 · Engine: 2.0.0 · Scoring: heuristic-density-v1 · Scan date: 2026-10-31.
Can maintainers explain intent, assumptions, and trade-offs? 65 finding(s).
Are imports declared and package/API names verified? 57 finding(s).
Are wrappers, guards, and repeated structures necessary? 12 finding(s).
Which changes need focused human review? 130 finding(s).
This chart tracks the legacy adjusted pattern score across scan runs. Changes can reflect source changes, scan coverage, or detector/scoring versions; they do not measure AI adoption or prove that a team refactored code. Compare runs only when their scoring versions are compatible. The dashed line tracks the raw pattern-hit count.
Groups findings by configured severity weight. Severity is not a confidence estimate, security rating, or proof that a package is missing. Verify imports against the project's manifests and inspect each finding in its local design context.
This horizontal bar chart shows where configured pattern scores accumulate across directories. Treat the bars as locations to inspect, not as evidence of authorship or code quality. Use the file-level findings to decide whether a directory needs a focused ownership, dependency, complexity, or review check.
The scanner identified 130 distinct pattern matches across 12 syntactic categories. Each entry below represents a discrete location in the source code where the engine recorded a detector match to inspect in context. Expand any category row to inspect the individual file paths, line numbers, code snippets, and the lexical context (CODE, COMMENT, or STRING) in which each match was detected.
Reading the findings table: The Severity column indicates the configured finding weight (CRITICAL / HIGH / MEDIUM / LOW). The Context column identifies whether the match occurred inside executable code, an inline comment, or a string literal — legacy comment-context matches receive a ×1.5 score weight. The ⚡ bolt icon marks clustered matches: three or more patterns within a 10-line window, each receiving an additional ×1.5 density multiplier under the legacy scoring model.
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| CRITICAL | lawnchair/src/app/lawnchair/theme/ComposeColorScheme.kt | 81 | fun dev.kdrag0n.monet.theme.ColorScheme.toComposeColorScheme(isDark: Boolean): ColorScheme = remember(this, isDark) { | CODE |
| CRITICAL⚡ | lawnchair/src/app/lawnchair/font/FontCache.kt | 419 | androidx.compose.ui.text.font.Font( | CODE |
| CRITICAL⚡ | lawnchair/src/app/lawnchair/font/FontCache.kt | 421 | variationSettings = androidx.compose.ui.text.font.FontVariation.Settings( | CODE |
| CRITICAL⚡ | lawnchair/src/app/lawnchair/font/FontCache.kt | 423 | androidx.compose.ui.text.font.FontVariation.Setting(it.key, it.value) | CODE |
| CRITICAL | lawnchair/src/app/lawnchair/font/FontCache.kt | 505 | androidx.compose.ui.text.googlefonts.Font( | CODE |
| CRITICAL | …c/com/android/launcher3/taskbar/TaskbarOverflowTest.kt | 613 | context.baseContext.appComponent.launcherAppState.model.addCallbacks(modelCallback) | CODE |
| CRITICAL | …c/com/android/quickstep/util/AppPairsControllerTest.kt | 355 | if (com.android.wm.shell.Flags.enableShellTopTaskTracking()) { | CODE |
| CRITICAL | …c/com/android/quickstep/util/AppPairsControllerTest.kt | 383 | if (com.android.wm.shell.Flags.enableShellTopTaskTracking()) { | CODE |
| CRITICAL | …c/com/android/quickstep/util/AppPairsControllerTest.kt | 414 | if (com.android.wm.shell.Flags.enableShellTopTaskTracking()) { | CODE |
| CRITICAL | …c/com/android/quickstep/util/AppPairsControllerTest.kt | 445 | if (com.android.wm.shell.Flags.enableShellTopTaskTracking()) { | CODE |
| CRITICAL | …c/com/android/quickstep/util/AppPairsControllerTest.kt | 473 | if (com.android.wm.shell.Flags.enableShellTopTaskTracking()) { | CODE |
| CRITICAL | …/launcher3/taskbar/TaskbarLauncherStateController.java | 432 | com.android.launcher3.taskbar.Utilities.setOverviewDragState( | CODE |
| CRITICAL | …com/android/quickstep/RecentsAnimationDeviceState.java | 362 | if (com.android.wm.shell.Flags.enableShellTopTaskTracking()) { | CODE |
| CRITICAL | quickstep/src/com/android/quickstep/GestureState.java | 346 | if (com.android.wm.shell.Flags.enableShellTopTaskTracking()) { | CODE |
| CRITICAL | …src/com/android/quickstep/util/AppPairsController.java | 462 | if (com.android.wm.shell.Flags.enableShellTopTaskTracking()) { | CODE |
| CRITICAL | …ndroid/quickstep/recents/ui/viewmodel/TaskViewModel.kt | 113 | com.android.launcher3.util.coroutines.combine( | CODE |
| CRITICAL | …om/android/wm/shell/common/DisplayControllerTests.java | 100 | androidx.test.platform.app.InstrumentationRegistry.getInstrumentation() | CODE |
| CRITICAL | …ndroid/wm/shell/windowdecor/WindowDecorationTests.java | 1259 | if (com.android.window.flags.Flags.relativeInsets()) { | CODE |
| CRITICAL | …ndroid/wm/shell/windowdecor/WindowDecorationTests.java | 1270 | if (com.android.window.flags.Flags.relativeInsets()) { | CODE |
| CRITICAL | …ndroid/wm/shell/windowdecor/WindowDecorationTests.java | 1281 | if (com.android.window.flags.Flags.relativeInsets()) { | CODE |
| CRITICAL | …ll/windowdecor/DesktopModeWindowDecorViewModelTests.kt | 534 | decor.mTaskInfo.configuration.windowConfiguration.bounds.set(movedMaximizedBounds) | CODE |
| CRITICAL | …ll/windowdecor/DesktopModeWindowDecorViewModelTests.kt | 558 | decor.mTaskInfo.configuration.windowConfiguration.bounds.set(STABLE_BOUNDS) | CODE |
| CRITICAL | …android/wm/shell/scenarios/MinimizeAutoPipAppWindow.kt | 62 | Assume.assumeTrue(com.android.wm.shell.Flags.enablePip2()) | CODE |
| CRITICAL | …/wm/shell/shared/bubbles/BubbleAnythingFlagHelper.java | 37 | && com.android.window.flags2.Flags.excludeTaskFromRecents(); | CODE |
| CRITICAL⚡ | …/wm/shell/shared/bubbles/BubbleAnythingFlagHelper.java | 63 | if (!com.android.window.flags2.Flags.enableSeeThroughTaskFragments()) { | CODE |
| CRITICAL⚡ | …/wm/shell/shared/bubbles/BubbleAnythingFlagHelper.java | 68 | if (!com.android.window.flags2.Flags.respectLeafTaskBounds()) { | CODE |
| CRITICAL⚡ | …/wm/shell/shared/bubbles/BubbleAnythingFlagHelper.java | 72 | return com.android.window.flags2.Flags.rootTaskForBubble(); | CODE |
| CRITICAL | …roid/wm/shell/transition/DefaultTransitionHandler.java | 365 | final boolean isTaskTransition = com.android.window.flags2.Flags.transitionHandlerCujTags() | CODE |
| CRITICAL | …m/shell/transition/tracing/LegacyTransitionTracer.java | 115 | com.android.wm.shell.nano.Transition proto = new com.android.wm.shell.nano.Transition(); | CODE |
| CRITICAL | …m/shell/transition/tracing/LegacyTransitionTracer.java | 138 | com.android.wm.shell.nano.Transition proto = new com.android.wm.shell.nano.Transition(); | CODE |
| CRITICAL | …m/shell/transition/tracing/LegacyTransitionTracer.java | 154 | com.android.wm.shell.nano.Transition proto = new com.android.wm.shell.nano.Transition(); | CODE |
| CRITICAL | …m/shell/transition/tracing/LegacyTransitionTracer.java | 169 | com.android.wm.shell.nano.Transition proto = new com.android.wm.shell.nano.Transition(); | CODE |
| CRITICAL | …m/shell/transition/tracing/LegacyTransitionTracer.java | 246 | new com.android.wm.shell.nano.WmShellTransitionTraceProto(); | CODE |
| CRITICAL | …m/shell/transition/tracing/LegacyTransitionTracer.java | 270 | new com.android.wm.shell.nano.HandlerMapping(); | CODE |
| CRITICAL | …ll/src/com/android/wm/shell/draganddrop/DragUtils.java | 60 | if (com.android.window.flags2.Flags.delegateUnhandledDrags() | CODE |
| CRITICAL | …com/android/wm/shell/splitscreen/StageCoordinator.java | 1066 | if (com.android.window.flags.Flags.fixLayoutRestoredTask() | CODE |
| CRITICAL | …com/android/wm/shell/splitscreen/StageCoordinator.java | 1078 | } else if (com.android.window.flags.Flags.fixLayoutRestoredTask()) { | CODE |
| CRITICAL | …/android/wm/shell/taskview/TaskViewTaskController.java | 416 | if (com.android.window.flags2.Flags.relativeInsets()) { | CODE |
| CRITICAL | …src/com/android/wm/shell/bubbles/BubbleController.java | 565 | if (com.android.window.flags2.Flags.enableExperimentalBubblesController()) { | CODE |
| CRITICAL | …src/com/android/wm/shell/bubbles/BubbleController.java | 1428 | if (com.android.window.flags2.Flags.rootTaskForBubble()) { | CODE |
| CRITICAL | …rc/com/android/wm/shell/bubbles/BubbleTransitions.java | 216 | if (com.android.wm.shell.Flags.enableBubbleBar() | CODE |
| CRITICAL | …rc/com/android/wm/shell/bubbles/BubbleTransitions.java | 226 | if (com.android.wm.shell.Flags.enableBubbleBar()) { | CODE |
| CRITICAL | …android/wm/shell/windowdecor/WindowDecorationInsets.kt | 42 | if (com.android.window.flags.Flags.relativeInsets()) { | CODE |
| CRITICAL | …Lib/src/main/java/android/window/RemoteTransition.java | 79 | com.android.internal.util.AnnotationValidations.validate( | CODE |
| CRITICAL | …Lib/src/main/java/android/window/RemoteTransition.java | 116 | com.android.internal.util.AnnotationValidations.validate( | CODE |
| CRITICAL | …Lib/src/main/java/android/window/RemoteTransition.java | 179 | com.android.internal.util.AnnotationValidations.validate( | CODE |
| CRITICAL | …systemui/shared/rotation/RotationButtonController.java | 727 | if (android.hardware.devicestate.feature.flags.Flags.deviceStatePropertyMigration()) { | CODE |
| CRITICAL | src/com/android/launcher3/Workspace.java | 678 | com.patrykmichalik.opto.core.PreferenceExtensionsKt.setBlocking(mPreferenceManager2.getSmartspaceMode(), | CODE |
| CRITICAL | src/com/android/launcher3/Workspace.java | 3933 | com.patrykmichalik.opto.core.PreferenceExtensionsKt.setBlocking(mPreferenceManager2.getDefaultHomePage(), pageIn | CODE |
| CRITICAL | src/com/android/launcher3/Hotseat.java | 148 | com.patrykmichalik.opto.core.PreferenceExtensionsKt.setBlocking(preferenceManager2.getHotseatMode(), hotseat | CODE |
| CRITICAL | src/com/android/launcher3/views/OptionsPopupView.java | 281 | com.patrykmichalik.opto.core.PreferenceExtensionsKt.setBlocking(preferenceManager2.getLockHomeScreen(), !oldValu | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM | …earch/algorithms/engine/provider/FileSearchProvider.kt | 277 | // However, it's more robust to check the file system attributes if possible, | COMMENT |
| MEDIUM | …/launcher3/taskbar/TaskbarLauncherStateController.java | 549 | // We're about to be paused, set immediately to ensure seamless handoff. | COMMENT |
| MEDIUM | …/launcher3/taskbar/TaskbarLauncherStateController.java | 1144 | // Update the visible state immediately to ensure a seamless handoff | COMMENT |
| MEDIUM | …/android/wm/shell/transition/ShellTransitionTests.java | 978 | // Seamless if all tasks are seamless | COMMENT |
| MEDIUM | …/android/wm/shell/transition/ShellTransitionTests.java | 987 | // Not seamless if there is PiP (or any other non-seamless task) | COMMENT |
| MEDIUM | …/android/wm/shell/transition/ShellTransitionTests.java | 998 | // Not seamless if there is no changed task. | COMMENT |
| MEDIUM | …/android/wm/shell/transition/ShellTransitionTests.java | 1005 | // Not seamless if the nav bar cares rotation and one of rotations is upside-down. | COMMENT |
| MEDIUM | …/android/wm/shell/transition/ShellTransitionTests.java | 1017 | // Not seamless if system alert windows | COMMENT |
| MEDIUM | …/android/wm/shell/transition/ShellTransitionTests.java | 1028 | // Seamless if display is explicitly seamless. | COMMENT |
| MEDIUM | …/android/wm/shell/transition/ShellTransitionTests.java | 1910 | // By default we ignore nav bar in deciding if a seamless rotation is allowed. | COMMENT |
| MEDIUM | …/com/android/wm/shell/ConnectedDisplayCujSmokeTests.kt | 73 | // TODO(b/416608975) - Move the utility methods to shared library or/and utilize existing library ( | COMMENT |
| MEDIUM | …roid/wm/shell/transition/DefaultTransitionHandler.java | 258 | // We only enable seamless rotation if all the visible task windows requested it. | COMMENT |
| MEDIUM | …roid/wm/shell/transition/DefaultTransitionHandler.java | 296 | // so do not use seamless rotation. | COMMENT |
| MEDIUM | …/src/com/android/wm/shell/pip2/phone/PipScheduler.java | 368 | // Take a screenshot of PiP and fade it out after resize is finished if seamless resize | COMMENT |
| MEDIUM | …com/android/wm/shell/back/BackAnimationController.java | 1370 | // merged transition must be applied with the first transition to ensure a seamless | COMMENT |
| MEDIUM | wmshell/src/com/android/wm/shell/pip/PipTransition.java | 538 | // done at the start. But if it is running fixed rotation, there will be a seamless | COMMENT |
| MEDIUM | wmshell/src/com/android/wm/shell/pip/PipTransition.java | 675 | // Fade out the existing PiP to avoid jump cut during seamless rotation. | COMMENT |
| MEDIUM | wmshell/src/com/android/wm/shell/pip/PipTransition.java | 803 | // utilize fixed rotation transitions for exiting pip) is enabled (See b/288910069). | COMMENT |
| MEDIUM | …ell/src/com/android/wm/shell/pip/PipTaskOrganizer.java | 1530 | // Animate with a cross-fade if enabled and seamless resize is disables by the app. | COMMENT |
| MEDIUM | src/com/android/launcher3/CellLayout.java | 1122 | // We leverage the actual layout logic in the layout params and hence need to modify | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | flowerpot/merge.py | 1 | # This file is part of Lawnchair Launcher. | COMMENT |
| LOW | flowerpot/playstore.py | 1 | # This file is part of Lawnchair Launcher. | COMMENT |
| LOW | …ava/app/lawnchair/baseline/BaselineProfileGenerator.kt | 41 | @Test | COMMENT |
| LOW | …/main/java/app/lawnchair/baseline/StartupBenchmarks.kt | 61 | // TODO Add interactions to wait for when your app is fully drawn. | COMMENT |
| LOW | …c/com/android/launcher3/model/GridSizeMigrationTest.kt | 581 | addItem(ITEM_TYPE_DEEP_SHORTCUT, 1, CONTAINER_HOTSEAT, 0, 0, testPackage7) | COMMENT |
| LOW | …nchair/src/com/androidinternal/graphics/cam/Frame.java | 41 | // sRGB ambient illuminance = 64 lux (per sRGB spec). However, the spec notes this is | COMMENT |
| LOW | …nchair/src/com/androidinternal/graphics/cam/Frame.java | 141 | float c = (f >= 0.9) ? MathUtils.lerp(0.59f, 0.69f, ((f - 0.9f) * 10.0f)) : MathUtils.lerp( | COMMENT |
| LOW | lawnchair/src/com/androidinternal/graphics/cam/Cam.java | 341 | * in | COMMENT |
| LOW | lawnchair/src/com/androidinternal/graphics/cam/Cam.java | 361 | // outside 0-255 | COMMENT |
| LOW | …m/android/launcher3/taskbar/TaskbarViewController.java | 1201 | // Note that there is no All Apps button in the hotseat, | COMMENT |
| LOW | …id/launcher3/taskbar/bubbles/BubbleDragController.java | 401 | private enum State { | COMMENT |
| LOW | …/launcher3/taskbar/bubbles/animation/BubbleAnimator.kt | 261 | // the arrow stays at the same distance from the left edge of the bar | COMMENT |
| LOW | quickstep/src/com/android/quickstep/TaskViewUtils.java | 361 | // at t = 0, we know that the simulator matches the thumbnailView. So if we apply K(0)` | COMMENT |
| LOW | …/quickstep/util/LauncherUnfoldAnimationController.java | 161 | mUnfoldMoveFromCenterWorkspaceAnimator.updateRegisteredViewsIfNeeded(); | COMMENT |
| LOW | quickstep/src/com/android/quickstep/views/TaskView.kt | 1521 | val failureListener = TaskRemovedDuringLaunchListener(context.applicationContext) | COMMENT |
| LOW | …t/src/com/android/wm/shell/bubbles/BubbleDataTest.java | 1021 | sendUpdatedEntryAtTime(mEntryB1, 6000); // [B2=4000, A2=3000, B1=6000, A1=1000] | COMMENT |
| LOW | …roid/wm/shell/flicker/pip/ClosePipBySwipingDownTest.kt | 101 | override fun visibleLayersShownMoreThanOneConsecutiveEntry() { | COMMENT |
| LOW | …hell/desktopmode/multidesks/DesksTransitionObserver.kt | 481 | val taskInfo = checkNotNull(change.taskInfo) { "Expected non-null task info" } | COMMENT |
| LOW | …rc/com/android/wm/shell/pip/phone/PipTouchHandler.java | 661 | if (resize) { | COMMENT |
| LOW | …m/shell/startingsurface/SplashscreenWindowCreator.java | 141 | suggestType == STARTING_WINDOW_TYPE_LEGACY_SPLASH_SCREEN | COMMENT |
| LOW | …oid/wm/shell/bubbles/bar/BubbleBarAnimationHelper.java | 521 | if (bbev == null) { | COMMENT |
| LOW | …/wm/shell/windowdecor/DesktopModeWindowDecoration.java | 401 | // The visibility, crop and position of the task should only be set when a task is | COMMENT |
| LOW | …ctivityembedding/ActivityEmbeddingAnimationRunner.java | 361 | // For the first iteration, we prepare the animation for the change type windows. This is | COMMENT |
| LOW | compatLib/src/main/java/android/view/InsetsSource.java | 521 | // |boundingRect| was provided relative to |frame|. Make it absolute to be in the same | COMMENT |
| LOW | …emUI/animation/src/com/android/systemui/util/Dialog.kt | 81 | return null | COMMENT |
| LOW | …c/com/android/systemui/animation/TransitionAnimator.kt | 1021 | // the dialog overlay back to its original position, and this change must be reflected | COMMENT |
| LOW | …ystemui/surfaceeffects/shaderutil/ShaderUtilLibrary.kt | 101 | // Return range roughly [-1,1]. | COMMENT |
| LOW | …ystemui/surfaceeffects/shaderutil/ShaderUtilLibrary.kt | 121 | // For example in 2D, we can find the triangle (simplex shape in 2D) that we are in | COMMENT |
| LOW | …/android/systemui/shared/system/QuickStepContract.java | 81 | // The search feature is disabled (either by SUW/SysUI/device policy) | COMMENT |
| LOW | …/android/systemui/shared/system/QuickStepContract.java | 121 | // Note that the device is awake on while waking up on, but not while going to sleep. | COMMENT |
| LOW | …ndroid/launcher3/util/WallpaperOffsetInterpolator.java | 81 | return; | COMMENT |
| LOW | src/com/android/launcher3/views/BaseDragLayer.java | 81 | public void set(LayoutParams lp, Integer y) { | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM⚡ | ci.py | 46 | print(f"Error: Beta artifact not found at {beta_path}") | CODE |
| LOW⚡ | ci.py | 67 | except Exception as e: | CODE |
| MEDIUM⚡ | ci.py | 68 | print(f"Error processing directory {full_path}: {e}") | CODE |
| MEDIUM⚡ | ci.py | 76 | print(f"Error fetching commits: {error}") | CODE |
| LOW | flowerpot/playstore.py | 222 | except Exception as e: | CODE |
| MEDIUM | flowerpot/playstore.py | 271 | print(f'Error at app: {id}') | CODE |
| MEDIUM | flowerpot/playstore.py | 315 | print(f'Error at app: {id}') | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| HIGH | …ui/shared/recents/utilities/PreviewPositionHelper.java | 125 | // > the final clipped position has same aspect ratio as requested by canvas | COMMENT |
| HIGH | …c/com/android/launcher3/statemanager/StateManager.java | 273 | // We are running the same animation as requested, and/or target state should not be | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM | flowerpot/merge.py | 1 | # This file is part of Lawnchair Launcher. | COMMENT |
| MEDIUM | flowerpot/playstore.py | 1 | # This file is part of Lawnchair Launcher. | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | ci.py | 19 | def send_message_to_telegram_chat(chat_id, message, silent): | CODE |
| LOW⚡ | ci.py | 31 | def send_document_to_telegram_chat(chat_id, document): | CODE |
| LOW⚡ | ci.py | 38 | def send_artifact_to_telegram_chat(chat_id): | CODE |
| LOW⚡ | ci.py | 70 | def send_internal_notifications(): | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | ci.py | 5 | CODE | |
| LOW | flowerpot/playstore.py | 16 | CODE | |
| LOW | flowerpot/playstore.py | 19 | CODE | |
| LOW | flowerpot/playstore.py | 21 | CODE | |
| LOW | tools/translations_importer/apkutils.py | 1 | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| HIGH | flowerpot/playstore.py | 222 | except Exception as e: | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | …oid/launcher3/taskbar/NavbarButtonsViewController.java | 807 | * Does not call {@link #applyState()}. Don't forget to! | COMMENT |
| LOW | …/com/android/launcher3/taskbar/TaskbarControllers.java | 89 | * Want to add a new controller? Don't forget to: | COMMENT |
| LOW | …droid/launcher3/taskbar/bubbles/BubbleControllers.java | 54 | * Want to add a new controller? Don't forget to: | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | ci.py | 38 | CODE | |
| LOW | tools/translations_importer/apkutils.py | 24 | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | …nchair/src/app/lawnchair/ui/placeholder/Placeholder.kt | 117 | name = "placeholder" | CODE |