| <project version="4"> | |
| <component name="AndroidLayouts"> | |
| <shared> | |
| <config /> | |
| </shared> | |
| <layouts> | |
| <layout url="file://$PROJECT_DIR$/app/src/main/res/drawable/avd_phone_flat_to_vertical.xml"> | |
| <config> | |
| <theme>@style/Theme.AirMouse</theme> | |
| </config> | |
| </layout> | |
| <layout url="file://$PROJECT_DIR$/app/src/main/res/drawable/badge_new.xml"> | |
| <config> | |
| <theme>@style/Theme.AirMouse</theme> | |
| </config> | |
| </layout> | |
| <layout url="file://$PROJECT_DIR$/app/src/main/res/drawable/bg_bottom_nav.xml"> | |
| <config> | |
| <theme>@style/Theme.AirMouse</theme> | |
| </config> | |
| </layout> | |
| <layout url="file://$PROJECT_DIR$/app/src/main/res/drawable/bg_card_gradient.xml"> | |
| <config> | |
| <theme>@style/Theme.AirMouse</theme> | |
| </config> | |
| </layout> | |
| <layout url="file://$PROJECT_DIR$/app/src/main/res/drawable/bg_card_outline.xml"> | |
| <config> | |
| <theme>@style/Theme.AirMouse</theme> | |
| </config> | |
| </layout> | |
| <layout url="file://$PROJECT_DIR$/app/src/main/res/drawable/bg_coach.xml"> | |
| <config> | |
| <theme>@style/Theme.AirMouse</theme> | |
| </config> | |
| </layout> | |
| <layout url="file://$PROJECT_DIR$/app/src/main/res/drawable/bg_header.xml"> | |
| <config> | |
| <theme>@style/Theme.AirMouse</theme> | |
| </config> | |
| </layout> | |
| <layout url="file://$PROJECT_DIR$/app/src/main/res/drawable/bg_input.xml"> | |
| <config> | |
| <theme>@style/Theme.AirMouse</theme> | |
| </config> | |
| </layout> | |
| <layout url="file://$PROJECT_DIR$/app/src/main/res/drawable/bg_instruction.xml"> | |
| <config> | |
| <theme>@style/Theme.AirMouse</theme> | |
| </config> | |
| </layout> | |
| <layout url="file://$PROJECT_DIR$/app/src/main/res/drawable/bg_mini_indicator.xml"> | |
| <config> | |
| <theme>@style/Theme.AirMouse</theme> | |
| </config> | |
| </layout> | |
| <layout url="file://$PROJECT_DIR$/app/src/main/res/drawable/bg_touchpad_gradient.xml"> | |
| <config> | |
| <theme>@style/Theme.AirMouse</theme> | |
| </config> | |
| </layout> | |
| <layout url="file://$PROJECT_DIR$/app/src/main/res/drawable/bottom_bar_gradient.xml"> | |
| <config> | |
| <theme>@style/Theme.AirMouse</theme> | |
| </config> | |
| </layout> | |
| <layout url="file://$PROJECT_DIR$/app/src/main/res/drawable/btn_rounded_danger.xml"> | |
| <config> | |
| <theme>@style/Theme.AirMouse</theme> | |
| </config> | |
| </layout> | |
| <layout url="file://$PROJECT_DIR$/app/src/main/res/drawable/btn_small_dark.xml"> | |
| <config> | |
| <theme>@style/Theme.AirMouse</theme> | |
| </config> | |
| </layout> | |
| <layout url="file://$PROJECT_DIR$/app/src/main/res/drawable/circle_bg.xml"> | |
| <config> | |
| <theme>@style/Theme.AirMouse</theme> | |
| </config> | |
| </layout> | |
| <layout url="file://$PROJECT_DIR$/app/src/main/res/drawable/circle_green.xml"> | |
| <config> | |
| <theme>@style/Theme.AirMouse</theme> | |
| </config> | |
| </layout> | |
| <layout url="file://$PROJECT_DIR$/app/src/main/res/drawable/green_square.xml"> | |
| <config> | |
| <theme>@style/Theme.AirMouse</theme> | |
| </config> | |
| </layout> | |
| <layout url="file://$PROJECT_DIR$/app/src/main/res/drawable/ic_accessibility.xml"> | |
| <config> | |
| <theme>@style/Theme.AirMouse</theme> | |
| </config> | |
| </layout> | |
| <layout url="file://$PROJECT_DIR$/app/src/main/res/drawable/ic_air_mouse.xml"> | |
| <config> | |
| <theme>@style/Theme.AirMouse</theme> | |
| </config> | |
| </layout> | |
| <layout url="file://$PROJECT_DIR$/app/src/main/res/drawable/ic_air_mouse_background.xml"> | |
| <config> | |
| <theme>@style/Theme.AirMouse</theme> | |
| </config> | |
| </layout> | |
| <layout url="file://$PROJECT_DIR$/app/src/main/res/drawable/ic_air_mouse_pro_ultra.xml"> | |
| <config> | |
| <theme>@style/Theme.AirMouse</theme> | |
| </config> | |
| </layout> | |
| <layout url="file://$PROJECT_DIR$/app/src/main/res/drawable/ic_battery.xml"> | |
| <config> | |
| <theme>@style/Theme.AirMouse</theme> | |
| </config> | |
| </layout> | |
| <layout url="file://$PROJECT_DIR$/app/src/main/res/drawable/ic_click.xml"> | |
| <config> | |
| <theme>@style/Theme.AirMouse</theme> | |
| </config> | |
| </layout> | |
| <layout url="file://$PROJECT_DIR$/app/src/main/res/drawable/ic_close.xml"> | |
| <config> | |
| <theme>@style/Theme.AirMouse</theme> | |
| </config> | |
| </layout> | |
| <layout url="file://$PROJECT_DIR$/app/src/main/res/drawable/ic_connect.xml"> | |
| <config> | |
| <theme>@style/Theme.AirMouse</theme> | |
| </config> | |
| </layout> | |
| <layout url="file://$PROJECT_DIR$/app/src/main/res/drawable/ic_disconnected.xml"> | |
| <config> | |
| <theme>@style/Theme.AirMouse</theme> | |
| </config> | |
| </layout> | |
| <layout url="file://$PROJECT_DIR$/app/src/main/res/drawable/ic_edge_gestures.xml"> | |
| <config> | |
| <theme>@style/Theme.AirMouse</theme> | |
| </config> | |
| </layout> | |
| <layout url="file://$PROJECT_DIR$/app/src/main/res/drawable/ic_green_dot.xml"> | |
| <config> | |
| <theme>@style/Theme.AirMouse</theme> | |
| </config> | |
| </layout> | |
| <layout url="file://$PROJECT_DIR$/app/src/main/res/drawable/ic_help_gesture.xml"> | |
| <config> | |
| <theme>@style/Theme.AirMouse</theme> | |
| </config> | |
| </layout> | |
| <layout url="file://$PROJECT_DIR$/app/src/main/res/drawable/ic_help_network.xml"> | |
| <config> | |
| <theme>@style/Theme.AirMouse</theme> | |
| </config> | |
| </layout> | |
| <layout url="file://$PROJECT_DIR$/app/src/main/res/drawable/ic_home.xml"> | |
| <config> | |
| <theme>@style/Theme.AirMouse</theme> | |
| </config> | |
| </layout> | |
| <layout url="file://$PROJECT_DIR$/app/src/main/res/drawable/ic_log.xml"> | |
| <config> | |
| <theme>@style/Theme.AirMouse</theme> | |
| </config> | |
| </layout> | |
| <layout url="file://$PROJECT_DIR$/app/src/main/res/drawable/ic_notifications.xml"> | |
| <config> | |
| <theme>@style/Theme.AirMouse</theme> | |
| </config> | |
| </layout> | |
| <layout url="file://$PROJECT_DIR$/app/src/main/res/drawable/ic_phone.xml"> | |
| <config> | |
| <theme>@style/Theme.AirMouse</theme> | |
| </config> | |
| </layout> | |
| <layout url="file://$PROJECT_DIR$/app/src/main/res/drawable/ic_play.xml"> | |
| <config> | |
| <theme>@style/Theme.AirMouse</theme> | |
| </config> | |
| </layout> | |
| <layout url="file://$PROJECT_DIR$/app/src/main/res/drawable/ic_profile.xml"> | |
| <config> | |
| <theme>@style/Theme.AirMouse</theme> | |
| </config> | |
| </layout> | |
| <layout url="file://$PROJECT_DIR$/app/src/main/res/drawable/ic_proximity.xml"> | |
| <config> | |
| <theme>@style/Theme.AirMouse</theme> | |
| </config> | |
| </layout> | |
| <layout url="file://$PROJECT_DIR$/app/src/main/res/drawable/ic_qr_scanner.xml"> | |
| <config> | |
| <theme>@style/Theme.AirMouse</theme> | |
| </config> | |
| </layout> | |
| <layout url="file://$PROJECT_DIR$/app/src/main/res/drawable/ic_refresh.xml"> | |
| <config> | |
| <theme>@style/Theme.AirMouse</theme> | |
| </config> | |
| </layout> | |
| <layout url="file://$PROJECT_DIR$/app/src/main/res/drawable/ic_right_click.xml"> | |
| <config> | |
| <theme>@style/Theme.AirMouse</theme> | |
| </config> | |
| </layout> | |
| <layout url="file://$PROJECT_DIR$/app/src/main/res/drawable/ic_sensor.xml"> | |
| <config> | |
| <theme>@style/Theme.AirMouse</theme> | |
| </config> | |
| </layout> | |
| <layout url="file://$PROJECT_DIR$/app/src/main/res/drawable/ic_timer.xml"> | |
| <config> | |
| <theme>@style/Theme.AirMouse</theme> | |
| </config> | |
| </layout> | |
| <layout url="file://$PROJECT_DIR$/app/src/main/res/drawable/ic_voice.xml"> | |
| <config> | |
| <theme>@style/Theme.AirMouse</theme> | |
| </config> | |
| </layout> | |
| <layout url="file://$PROJECT_DIR$/app/src/main/res/drawable/ic_wifi.xml"> | |
| <config> | |
| <theme>@style/Theme.AirMouse</theme> | |
| </config> | |
| </layout> | |
| <layout url="file://$PROJECT_DIR$/app/src/main/res/drawable/status_badge.xml"> | |
| <config> | |
| <theme>@style/Theme.AirMouse</theme> | |
| </config> | |
| </layout> | |
| <layout url="file://$PROJECT_DIR$/app/src/main/res/drawable/thumb_accent.xml"> | |
| <config> | |
| <theme>@style/Theme.AirMouse</theme> | |
| </config> | |
| </layout> | |
| <layout url="file://$PROJECT_DIR$/app/src/main/res/layout/activity_calibration.xml"> | |
| <config> | |
| <theme>@style/Theme.AirMouse</theme> | |
| </config> | |
| </layout> | |
| <layout url="file://$PROJECT_DIR$/app/src/main/res/layout/activity_calibration_compose.xml"> | |
| <config> | |
| <theme>@style/Theme.AirMouse</theme> | |
| </config> | |
| </layout> | |
| <layout url="file://$PROJECT_DIR$/app/src/main/res/layout/activity_gesture_studio.xml"> | |
| <config> | |
| <theme>@style/Theme.AirMouse</theme> | |
| </config> | |
| </layout> | |
| <layout url="file://$PROJECT_DIR$/app/src/main/res/layout/activity_main.xml"> | |
| <config> | |
| <theme>@style/Theme.AirMouse</theme> | |
| </config> | |
| </layout> | |
| <layout url="file://$PROJECT_DIR$/app/src/main/res/layout/activity_onboarding.xml"> | |
| <config> | |
| <theme>@style/Theme.AirMouse</theme> | |
| </config> | |
| </layout> | |
| <layout url="file://$PROJECT_DIR$/app/src/main/res/layout/activity_webview.xml"> | |
| <config> | |
| <theme>@style/Theme.AirMouse</theme> | |
| </config> | |
| </layout> | |
| <layout url="file://$PROJECT_DIR$/app/src/main/res/layout/debug_overlay.xml"> | |
| <config> | |
| <theme>@style/Theme.AirMouse</theme> | |
| </config> | |
| </layout> | |
| <layout url="file://$PROJECT_DIR$/app/src/main/res/layout/dialog_settings.xml"> | |
| <config> | |
| <theme>@style/Theme.AppCompat.Light.DarkActionBar</theme> | |
| </config> | |
| </layout> | |
| <layout url="file://$PROJECT_DIR$/app/src/main/res/layout/fragment_about.xml"> | |
| <config> | |
| <theme>@style/Theme.AppCompat.Light.DarkActionBar</theme> | |
| </config> | |
| </layout> | |
| <layout url="file://$PROJECT_DIR$/app/src/main/res/layout/fragment_accel_step.xml"> | |
| <config> | |
| <theme>@style/Theme.AirMouse</theme> | |
| </config> | |
| </layout> | |
| <layout url="file://$PROJECT_DIR$/app/src/main/res/layout/fragment_accessibility.xml"> | |
| <config> | |
| <theme>@style/Theme.AirMouse</theme> | |
| </config> | |
| </layout> | |
| <layout url="file://$PROJECT_DIR$/app/src/main/res/layout/fragment_battery.xml"> | |
| <config> | |
| <theme>@style/Theme.AirMouse</theme> | |
| </config> | |
| </layout> | |
| <layout url="file://$PROJECT_DIR$/app/src/main/res/layout/fragment_calibration.xml"> | |
| <config> | |
| <theme>@style/Theme.AppCompat.Light.DarkActionBar</theme> | |
| </config> | |
| </layout> | |
| <layout url="file://$PROJECT_DIR$/app/src/main/res/layout/fragment_custom_gesture.xml"> | |
| <config> | |
| <theme>@style/Theme.AirMouse</theme> | |
| </config> | |
| </layout> | |
| <layout url="file://$PROJECT_DIR$/app/src/main/res/layout/fragment_edge_gestures.xml"> | |
| <config> | |
| <theme>@style/Theme.AirMouse</theme> | |
| </config> | |
| </layout> | |
| <layout url="file://$PROJECT_DIR$/app/src/main/res/layout/fragment_gesture_studio.xml"> | |
| <config> | |
| <theme>@style/Theme.AirMouse</theme> | |
| </config> | |
| </layout> | |
| <layout url="file://$PROJECT_DIR$/app/src/main/res/layout/fragment_gyro_step.xml"> | |
| <config> | |
| <theme>@style/Theme.AirMouse</theme> | |
| </config> | |
| </layout> | |
| <layout url="file://$PROJECT_DIR$/app/src/main/res/layout/fragment_help.xml"> | |
| <config> | |
| <theme>@style/Theme.AirMouse</theme> | |
| </config> | |
| </layout> | |
| <layout url="file://$PROJECT_DIR$/app/src/main/res/layout/fragment_home.xml"> | |
| <config> | |
| <theme>@style/Theme.AirMouse</theme> | |
| </config> | |
| </layout> | |
| <layout url="file://$PROJECT_DIR$/app/src/main/res/layout/fragment_mag_step.xml"> | |
| <config> | |
| <theme>@style/Theme.AirMouse</theme> | |
| </config> | |
| </layout> | |
| <layout url="file://$PROJECT_DIR$/app/src/main/res/layout/fragment_network_discovery.xml"> | |
| <config> | |
| <theme>@style/Theme.AirMouse</theme> | |
| </config> | |
| </layout> | |
| <layout url="file://$PROJECT_DIR$/app/src/main/res/layout/fragment_profiles.xml"> | |
| <config> | |
| <theme>@style/Theme.AirMouse</theme> | |
| </config> | |
| </layout> | |
| <layout url="file://$PROJECT_DIR$/app/src/main/res/layout/fragment_proximity.xml"> | |
| <config> | |
| <theme>@style/Theme.AirMouse</theme> | |
| </config> | |
| </layout> | |
| <layout url="file://$PROJECT_DIR$/app/src/main/res/layout/fragment_proximity_settings.xml"> | |
| <config> | |
| <theme>@style/Theme.AirMouse</theme> | |
| </config> | |
| </layout> | |
| <layout url="file://$PROJECT_DIR$/app/src/main/res/layout/fragment_sensor_visualizer.xml"> | |
| <config> | |
| <theme>@style/Theme.AirMouse</theme> | |
| </config> | |
| </layout> | |
| <layout url="file://$PROJECT_DIR$/app/src/main/res/layout/fragment_server_log.xml"> | |
| <config> | |
| <theme>@style/Theme.AirMouse</theme> | |
| </config> | |
| </layout> | |
| <layout url="file://$PROJECT_DIR$/app/src/main/res/layout/fragment_settings.xml"> | |
| <config> | |
| <theme>@style/Theme.AppCompat.Light.DarkActionBar</theme> | |
| </config> | |
| </layout> | |
| <layout url="file://$PROJECT_DIR$/app/src/main/res/layout/fragment_statistics.xml"> | |
| <config> | |
| <theme>@style/Theme.AirMouse</theme> | |
| </config> | |
| </layout> | |
| <layout url="file://$PROJECT_DIR$/app/src/main/res/layout/fragment_themes.xml"> | |
| <config> | |
| <theme>@style/Theme.AirMouse</theme> | |
| </config> | |
| </layout> | |
| <layout url="file://$PROJECT_DIR$/app/src/main/res/layout/fragment_touchpad.xml"> | |
| <config> | |
| <theme>@style/Theme.AirMouse</theme> | |
| </config> | |
| </layout> | |
| <layout url="file://$PROJECT_DIR$/app/src/main/res/layout/fragment_voice_commands.xml"> | |
| <config> | |
| <theme>@style/Theme.AirMouse</theme> | |
| </config> | |
| </layout> | |
| <layout url="file://$PROJECT_DIR$/app/src/main/res/layout/item_onboarding.xml"> | |
| <config> | |
| <theme>@style/Theme.AirMouse</theme> | |
| </config> | |
| </layout> | |
| <layout url="file://$PROJECT_DIR$/app/src/main/res/layout/nav_header.xml"> | |
| <config> | |
| <theme>@style/Theme.AirMouse</theme> | |
| </config> | |
| </layout> | |
| <layout url="file://$PROJECT_DIR$/app/src/main/res/layout/progress_dialog.xml"> | |
| <config> | |
| <theme>@style/Theme.AirMouse</theme> | |
| </config> | |
| </layout> | |
| <layout url="file://$PROJECT_DIR$/app/src/main/res/layout/view_edge_gesture.xml"> | |
| <config> | |
| <theme>@style/Theme.AirMouse</theme> | |
| </config> | |
| </layout> | |
| <layout url="file://$PROJECT_DIR$/app/src/main/res/menu/bottom_nav_menu.xml"> | |
| <config> | |
| <theme>@style/Theme.AirMouse</theme> | |
| </config> | |
| </layout> | |
| <layout url="file://$PROJECT_DIR$/app/src/main/res/menu/calibration_menu.xml"> | |
| <config> | |
| <theme>@style/Theme.AirMouse</theme> | |
| </config> | |
| </layout> | |
| <layout url="file://$PROJECT_DIR$/app/src/main/res/menu/drawer_menu.xml"> | |
| <config> | |
| <theme>@style/Theme.AirMouse</theme> | |
| </config> | |
| </layout> | |
| <layout url="file://$PROJECT_DIR$/app/src/main/res/menu/main_menu.xml"> | |
| <config> | |
| <theme>@style/Theme.AirMouse</theme> | |
| </config> | |
| </layout> | |
| <layout url="file://$PROJECT_DIR$/app/src/main/res/menu/nav_menu.xml"> | |
| <config> | |
| <theme>@style/Theme.AirMouse</theme> | |
| </config> | |
| </layout> | |
| <layout url="file://$PROJECT_DIR$/app/src/main/res/menu/options_menu.xml"> | |
| <config> | |
| <theme>@style/Theme.AirMouse</theme> | |
| </config> | |
| </layout> | |
| <layout url="file://$PROJECT_DIR$/app/src/main/res/navigation/bottom_nav_menu.xml"> | |
| <config> | |
| <theme>@style/Theme.AirMouse</theme> | |
| </config> | |
| </layout> | |
| <layout url="file://$PROJECT_DIR$/app/src/main/res/navigation/nav_graph.xml"> | |
| <config> | |
| <theme>@style/Theme.AirMouse</theme> | |
| </config> | |
| </layout> | |
| <layout url="file://$PROJECT_DIR$/app/src/main/res/navigation/nav_menu.xml"> | |
| <config> | |
| <theme>@style/Theme.AirMouse</theme> | |
| </config> | |
| </layout> | |
| <layout url="file://$PROJECT_DIR$/app/src/main/res/xml/preferences.xml"> | |
| <config> | |
| <theme>@style/Theme.AirMouse</theme> | |
| </config> | |
| </layout> | |
| </layouts> | |
| </component> | |
| <component name="AutoImportSettings"> | |
| <option name="autoReloadType" value="NONE" /> | |
| </component> | |
| <component name="ChangeListManager"> | |
| <list default="true" id="dbb45723-6c2e-4617-97a9-1ccefe06dab5" name="Changes" comment="feat: implement gaming profiles and enhance server status visibility - **Backend (Go)**: - Add API endpoints `/api/gaming/profiles` and `/api/gaming/activate` to manage gameplay configurations. - Expand WebSocket command handler to support `game_action` and `game_button` types. - Implement comprehensive input mapping for gaming actions, translating mobile triggers into system mouse clicks and key taps (e.g., WASD for movement, Shift for sprint, Space for jump/handbrake). - Define default profiles for FPS, Racing, and RPG genres with specific control schemes. - **Android**: - **Home Screen**: Add a server architecture information card displaying active ports (TCP 9090, WS 9091, UDP 9092/9093, REST 8081) and engine version. - **Help Screen**: Enhance walkthrough navigation with directional slide-and-fade transitions between tabs."> | |
| <change beforePath="$PROJECT_DIR$/app/src/main/java/com/airmouse/presentation/ui/calibration/CalibrationScreen.kt" beforeDir="false" afterPath="$PROJECT_DIR$/app/src/main/java/com/airmouse/presentation/ui/calibration/CalibrationScreen.kt" afterDir="false" /> | |
| <change beforePath="$PROJECT_DIR$/app/src/main/java/com/airmouse/presentation/ui/home/HomeScreen.kt" beforeDir="false" afterPath="$PROJECT_DIR$/app/src/main/java/com/airmouse/presentation/ui/home/HomeScreen.kt" afterDir="false" /> | |
| <change beforePath="$PROJECT_DIR$/app/src/main/java/com/airmouse/presentation/ui/onboarding/OnboardingItem.kt" beforeDir="false" afterPath="$PROJECT_DIR$/app/src/main/java/com/airmouse/presentation/ui/onboarding/OnboardingItem.kt" afterDir="false" /> | |
| <change beforePath="$PROJECT_DIR$/app/src/main/java/com/airmouse/sensors/SensorService.kt" beforeDir="false" afterPath="$PROJECT_DIR$/app/src/main/java/com/airmouse/sensors/SensorService.kt" afterDir="false" /> | |
| </list> | |
| <option name="SHOW_DIALOG" value="false" /> | |
| <option name="HIGHLIGHT_CONFLICTS" value="true" /> | |
| <option name="HIGHLIGHT_NON_ACTIVE_CHANGELIST" value="false" /> | |
| <option name="LAST_RESOLUTION" value="IGNORE" /> | |
| </component> | |
| <component name="ClangdSettings"> | |
| <option name="formatViaClangd" value="false" /> | |
| </component> | |
| <component name="ExecutionTargetManager" SELECTED_TARGET="device_and_snapshot_combo_box_target[]" /> | |
| <component name="ExternalProjectsData"> | |
| <projectState path="$PROJECT_DIR$"> | |
| <ProjectState /> | |
| </projectState> | |
| </component> | |
| <component name="ExternalProjectsManager"> | |
| <system id="GRADLE"> | |
| <state> | |
| <projects_view> | |
| <tree_state> | |
| <expand> | |
| <path> | |
| <item name="" type="6a2764b6:ExternalProjectsStructure$RootNode" /> | |
| <item name="AirMouse" type="f1a62948:ProjectNode" /> | |
| </path> | |
| </expand> | |
| <select /> | |
| </tree_state> | |
| </projects_view> | |
| </state> | |
| </system> | |
| </component> | |
| <component name="FileTemplateManagerImpl"> | |
| <option name="RECENT_TEMPLATES"> | |
| <list> | |
| <option value="layoutResourceFile" /> | |
| <option value="Kotlin File" /> | |
| <option value="Class" /> | |
| <option value="layoutResourceFile_vertical" /> | |
| <option value="resourceFile" /> | |
| <option value="Kotlin Class" /> | |
| </list> | |
| </option> | |
| </component> | |
| <component name="Git.Settings"> | |
| <option name="RECENT_GIT_ROOT_PATH" value="$PROJECT_DIR$" /> | |
| </component> | |
| <component name="HighlightingSettingsPerFile"> | |
| <setting file="file://$PROJECT_DIR$/app/src/main/res/layout/activity_main.xml" root0="FORCE_HIGHLIGHTING" /> | |
| </component> | |
| <component name="ProblemsViewState"> | |
| <option name="proportion" value="0.6656" /> | |
| <option name="selectedTabId" value="CurrentFile" /> | |
| <option name="showPreview" value="true" /> | |
| </component> | |
| <component name="ProjectColorInfo">{ | |
| "associatedIndex": 7 | |
| }</component> | |
| <component name="ProjectId" id="3EEu6P9AnxaHlad7AzYGbKSPBf8" /> | |
| <component name="ProjectLevelVcsManager"> | |
| <ConfirmationsSetting value="2" id="Add" /> | |
| </component> | |
| <component name="ProjectViewState"> | |
| <option name="hideEmptyMiddlePackages" value="true" /> | |
| <option name="showLibraryContents" value="true" /> | |
| </component> | |
| <component name="PropertiesComponent">{ | |
| "keyToString": { | |
| "ASKED_SHARE_PROJECT_CONFIGURATION_FILES": "true", | |
| "Android App.app.executor": "Run", | |
| "Gradle.Configure Daemon JVM Criteria.executor": "Run", | |
| "Gradle.Download Sources.executor": "Run", | |
| "Gradle.Upgrade Gradle wrapper.executor": "Run", | |
| "GradleDaemonJvmCriteriaMigrationNotification.isNotificationDisabled": "true", | |
| "ModuleVcsDetector.initialDetectionPerformed": "true", | |
| "RunOnceActivity.ShowReadmeOnStart": "true", | |
| "RunOnceActivity.TerminalTabsStorage.copyFrom.TerminalArrangementManager.252": "true", | |
| "RunOnceActivity.cidr.known.project.marker": "true", | |
| "RunOnceActivity.git.unshallow": "true", | |
| "RunOnceActivity.readMode.enableVisualFormatting": "true", | |
| "SHARE_PROJECT_CONFIGURATION_FILES": "true", | |
| "SHELLCHECK.PATH": "/Users/tahamajs/Library/Application Support/Google/AndroidStudio2025.3.1/plugins/Shell Script/shellcheck", | |
| "cf.first.check.clang-format": "false", | |
| "cidr.known.project.marker": "true", | |
| "com.google.services.firebase.aqiPopupShown": "true", | |
| "git-widget-placeholder": "main", | |
| "kotlin-language-version-configured": "true", | |
| "last_opened_file_path": "/Users/tahamajs/Documents/uni/CPS/Files/ComputerAssignments/CA2/code/android", | |
| "memory.settings.postsync.last.time.stamp": "1779857548592", | |
| "project.structure.last.edited": "Modules", | |
| "project.structure.proportion": "0.17", | |
| "project.structure.side.proportion": "0.2", | |
| "settings.editor.selected.configurable": "preferences.pluginManager", | |
| "show.do.not.copy.http.proxy.settings.to.gradle": "true" | |
| } | |
| }</component> | |
| <component name="RecentsManager"> | |
| <key name="MoveFile.RECENT_KEYS"> | |
| <recent name="$PROJECT_DIR$/app/src/main/java/com/airmouse/presentation/ui/gesture" /> | |
| <recent name="$PROJECT_DIR$/docs" /> | |
| <recent name="$PROJECT_DIR$" /> | |
| <recent name="$PROJECT_DIR$/app/src/main/res/navigation" /> | |
| </key> | |
| <key name="K2MoveDeclarationsDialog.RECENT_PACKAGE_KEY"> | |
| <recent name="com.airmouse.data.datasource.local.entity" /> | |
| <recent name="com.airmouse.data.datasource.local.interfaces" /> | |
| <recent name="com.airmouse.data.datasource.local.implementations" /> | |
| <recent name="com.airmouse.di" /> | |
| <recent name="com.airmouse.domain.model" /> | |
| </key> | |
| <key name="android.template.869602143"> | |
| <recent name="com.airmouse" /> | |
| </key> | |
| </component> | |
| <component name="RunManager"> | |
| <configuration name="app" type="AndroidRunConfigurationType" factoryName="Android App" activateToolWindowBeforeRun="false"> | |
| <module name="AirMouse.app" /> | |
| <option name="ANDROID_RUN_CONFIGURATION_SCHEMA_VERSION" value="1" /> | |
| <option name="DEPLOY" value="true" /> | |
| <option name="DEPLOY_APK_FROM_BUNDLE" value="false" /> | |
| <option name="DEPLOY_AS_INSTANT" value="false" /> | |
| <option name="ARTIFACT_NAME" value="" /> | |
| <option name="PM_INSTALL_OPTIONS" value="" /> | |
| <option name="ALL_USERS" value="false" /> | |
| <option name="ALWAYS_INSTALL_WITH_PM" value="false" /> | |
| <option name="ALLOW_ASSUME_VERIFIED" value="false" /> | |
| <option name="CLEAR_APP_STORAGE" value="false" /> | |
| <option name="DYNAMIC_FEATURES_DISABLED_LIST" value="" /> | |
| <option name="ACTIVITY_EXTRA_FLAGS" value="" /> | |
| <option name="MODE" value="default_activity" /> | |
| <option name="RESTORE_ENABLED" value="false" /> | |
| <option name="RESTORE_FILE" value="" /> | |
| <option name="RESTORE_FRESH_INSTALL_ONLY" value="false" /> | |
| <option name="CLEAR_LOGCAT" value="false" /> | |
| <option name="SHOW_LOGCAT_AUTOMATICALLY" value="false" /> | |
| <option name="TARGET_SELECTION_MODE" value="DEVICE_AND_SNAPSHOT_COMBO_BOX" /> | |
| <option name="SELECTED_CLOUD_MATRIX_CONFIGURATION_ID" value="-1" /> | |
| <option name="SELECTED_CLOUD_MATRIX_PROJECT_ID" value="" /> | |
| <option name="DEBUGGER_TYPE" value="Auto" /> | |
| <Auto> | |
| <option name="USE_JAVA_AWARE_DEBUGGER" value="false" /> | |
| <option name="SHOW_STATIC_VARS" value="true" /> | |
| <option name="WORKING_DIR" value="" /> | |
| <option name="TARGET_LOGGING_CHANNELS" value="lldb process:gdb-remote packets" /> | |
| <option name="SHOW_OPTIMIZED_WARNING" value="true" /> | |
| <option name="ATTACH_ON_WAIT_FOR_DEBUGGER" value="false" /> | |
| <option name="DEBUG_SANDBOX_SDK" value="false" /> | |
| </Auto> | |
| <Hybrid> | |
| <option name="USE_JAVA_AWARE_DEBUGGER" value="false" /> | |
| <option name="SHOW_STATIC_VARS" value="true" /> | |
| <option name="WORKING_DIR" value="" /> | |
| <option name="TARGET_LOGGING_CHANNELS" value="lldb process:gdb-remote packets" /> | |
| <option name="SHOW_OPTIMIZED_WARNING" value="true" /> | |
| <option name="ATTACH_ON_WAIT_FOR_DEBUGGER" value="false" /> | |
| <option name="DEBUG_SANDBOX_SDK" value="false" /> | |
| </Hybrid> | |
| <Java> | |
| <option name="ATTACH_ON_WAIT_FOR_DEBUGGER" value="false" /> | |
| <option name="DEBUG_SANDBOX_SDK" value="false" /> | |
| </Java> | |
| <Native> | |
| <option name="USE_JAVA_AWARE_DEBUGGER" value="false" /> | |
| <option name="SHOW_STATIC_VARS" value="true" /> | |
| <option name="WORKING_DIR" value="" /> | |
| <option name="TARGET_LOGGING_CHANNELS" value="lldb process:gdb-remote packets" /> | |
| <option name="SHOW_OPTIMIZED_WARNING" value="true" /> | |
| <option name="ATTACH_ON_WAIT_FOR_DEBUGGER" value="false" /> | |
| <option name="DEBUG_SANDBOX_SDK" value="false" /> | |
| </Native> | |
| <Profilers> | |
| <option name="ADVANCED_PROFILING_ENABLED" value="false" /> | |
| <option name="STARTUP_PROFILING_ENABLED" value="false" /> | |
| <option name="STARTUP_CPU_PROFILING_ENABLED" value="false" /> | |
| <option name="STARTUP_CPU_PROFILING_CONFIGURATION_NAME" value="Java/Kotlin Method Sample (legacy)" /> | |
| <option name="STARTUP_NATIVE_MEMORY_PROFILING_ENABLED" value="false" /> | |
| <option name="NATIVE_MEMORY_SAMPLE_RATE_BYTES" value="2048" /> | |
| </Profilers> | |
| <option name="DEEP_LINK" value="" /> | |
| <option name="ACTIVITY" value="" /> | |
| <option name="ACTIVITY_CLASS" value="" /> | |
| <option name="SEARCH_ACTIVITY_IN_GLOBAL_SCOPE" value="false" /> | |
| <option name="SKIP_ACTIVITY_VALIDATION" value="false" /> | |
| <method v="2"> | |
| <option name="Android.Gradle.BeforeRunTask" enabled="true" /> | |
| </method> | |
| </configuration> | |
| </component> | |
| <component name="SvnConfiguration"> | |
| <configuration>$USER_HOME$/.subversion</configuration> | |
| </component> | |
| <component name="TaskManager"> | |
| <task active="true" id="Default" summary="Default task"> | |
| <changelist id="dbb45723-6c2e-4617-97a9-1ccefe06dab5" name="Changes" comment="" /> | |
| <created>1779755874586</created> | |
| <option name="number" value="Default" /> | |
| <option name="presentableId" value="Default" /> | |
| <updated>1779755874586</updated> | |
| </task> | |
| <task id="LOCAL-00884" summary="fix: resolve syntax error in SensorVisualizerScreen.kt - Add missing closing brace to fix a nesting issue in the `SensorVisualizerScreen` composable."> | |
| <option name="closed" value="true" /> | |
| <created>1782955622878</created> | |
| <option name="number" value="00884" /> | |
| <option name="presentableId" value="LOCAL-00884" /> | |
| <option name="project" value="LOCAL" /> | |
| <updated>1782955622879</updated> | |
| </task> | |
| <task id="LOCAL-00885" summary="fix: resolve syntax error in SensorVisualizerScreen.kt - Add missing closing brace to fix a nesting issue in the `SensorVisualizerScreen` composable."> | |
| <option name="closed" value="true" /> | |
| <created>1782955640264</created> | |
| <option name="number" value="00885" /> | |
| <option name="presentableId" value="LOCAL-00885" /> | |
| <option name="project" value="LOCAL" /> | |
| <updated>1782955640264</updated> | |
| </task> | |
| <task id="LOCAL-00886" summary="style(ui): update AnimatedContent transition syntax in StatisticsScreen - Add parentheses to slide and fade animation combinations to clarify operator precedence for the `togetherWith` operator. - Apply these changes to the duration, total actions, and metric value counters."> | |
| <option name="closed" value="true" /> | |
| <created>1782955737286</created> | |
| <option name="number" value="00886" /> | |
| <option name="presentableId" value="LOCAL-00886" /> | |
| <option name="project" value="LOCAL" /> | |
| <updated>1782955737288</updated> | |
| </task> | |
| <task id="LOCAL-00887" summary="style: remove trailing slash in SensorVisualizerScreen.kt"> | |
| <option name="closed" value="true" /> | |
| <created>1782955758482</created> | |
| <option name="number" value="00887" /> | |
| <option name="presentableId" value="LOCAL-00887" /> | |
| <option name="project" value="LOCAL" /> | |
| <updated>1782955758482</updated> | |
| </task> | |
| <task id="LOCAL-00888" summary="fix(ui): remove trailing closing brace in `SensorVisualizerScreen.kt` - Remove an extraneous closing brace at the end of the file."> | |
| <option name="closed" value="true" /> | |
| <created>1782955808099</created> | |
| <option name="number" value="00888" /> | |
| <option name="presentableId" value="LOCAL-00888" /> | |
| <option name="project" value="LOCAL" /> | |
| <updated>1782955808103</updated> | |
| </task> | |
| <task id="LOCAL-00889" summary="feat(web): add gaming mode with steering and shooter controls - Add a new "Gaming Mode" page to the web interface featuring a steering wheel simulator and FPS controls. - Implement visual feedback for steering animations and button presses in `app.js`. - Add keyboard shortcuts ('A', 'D', 'Space', 'R') to trigger gaming commands when the gaming page is active. - Update `syscmd_darwin.go` to map gaming commands (`steer_left`, `steer_right`, `shoot`, `reload`) to native macOS keystrokes."> | |
| <option name="closed" value="true" /> | |
| <created>1782955911125</created> | |
| <option name="number" value="00889" /> | |
| <option name="presentableId" value="LOCAL-00889" /> | |
| <option name="project" value="LOCAL" /> | |
| <updated>1782955911130</updated> | |
| </task> | |
| <task id="LOCAL-00890" summary="refactor(ui): simplify sensor selection click handling in `SensorVisualizerScreen` - Clean up the `Modifier` chain by replacing the manual `Modifier.run` block with a standard `.clickable` call. - Remove redundant intermediate variables for the click modifier. - Update imports to include `Stroke` and `clickable`."> | |
| <option name="closed" value="true" /> | |
| <created>1782956341775</created> | |
| <option name="number" value="00890" /> | |
| <option name="presentableId" value="LOCAL-00890" /> | |
| <option name="project" value="LOCAL" /> | |
| <updated>1782956341775</updated> | |
| </task> | |
| <task id="LOCAL-00891" summary="feat(control/internal/web): enhance screen mirroring with multi-display support and implement live performance monitoring - **Core/CLI**: Implement new system commands for Linux and Windows, including volume control, media playback, fullscreen toggling, and gaming inputs (steer, shoot, reload). - **Backend**: - Add native display management and high-performance screen capture using `kbinani/screenshot`. - Enhance the WebSocket mirror server to support dynamic parameters for FPS, scaling, quality presets, and display selection. - Implement an API endpoint (`/api/displays`) to list active monitors and their properties. - Expand server statistics to include total packet and byte counts. - **Frontend**: - Replace the static activity monitor with a dynamic `Chart.js` performance chart tracking latency, packet frequency, and interaction rates. - Redesign the Screen Mirroring interface with a side panel for real-time stream settings (display, quality presets, FPS, and scale). - Enhance the Gaming Simulation UI with a responsive steering wheel animation and additional command bindings. - Add presentation page keyboard shortcuts for media and navigation."> | |
| <option name="closed" value="true" /> | |
| <created>1782956384599</created> | |
| <option name="number" value="00891" /> | |
| <option name="presentableId" value="LOCAL-00891" /> | |
| <option name="project" value="LOCAL" /> | |
| <updated>1782956384603</updated> | |
| </task> | |
| <task id="LOCAL-00892" summary="refactor(presentation): refine mouse control activation and orientation logic - Update `onOrientationChanged` to verify both connection status and mouse control enablement before processing sensor data. - Refactor volume key handling to toggle `connectionManager.isMouseControlEnabled` based on the active movement source (touchpad vs. gyro). - Simplify orientation channel communication by moving the connection check to the initial sensor event filter."> | |
| <option name="closed" value="true" /> | |
| <created>1782956778211</created> | |
| <option name="number" value="00892" /> | |
| <option name="presentableId" value="LOCAL-00892" /> | |
| <option name="project" value="LOCAL" /> | |
| <updated>1782956778237</updated> | |
| </task> | |
| <task id="LOCAL-00893" summary="ui(presentation): enhance UI with custom components and improve touchpad state handling - Replace standard `CircularProgressIndicator` with `SweepGradientGlowRing` in `BluetoothMouseScreen`. - Replace standard `LinearProgressIndicator` with `GlassmorphicNeonProgressBar` in `BatteryScreen`, updating color logic and formatting. - Update `TouchpadScreen` to display a "Transmission Paused" state with a `SensorsOff` icon when mouse control is disabled. - Refine `TouchpadViewModel` logic to prevent processing touch events, taps, and long presses when mouse control is disabled."> | |
| <option name="closed" value="true" /> | |
| <created>1782962877658</created> | |
| <option name="number" value="00893" /> | |
| <option name="presentableId" value="LOCAL-00893" /> | |
| <option name="project" value="LOCAL" /> | |
| <updated>1782962877661</updated> | |
| </task> | |
| <task id="LOCAL-00894" summary="fix(sensors): improve orientation smoothing by handling angle wrap-around - Update `SensorService` to calculate the shortest angular delta for pitch and yaw filtering, preventing artifacts at the 0/360-degree boundary. - Normalize both the deltas and the final filtered values to the [-180, 180] degree range. - Apply consistent wrap-around logic to both the Madgwick filter and direct orientation update paths."> | |
| <option name="closed" value="true" /> | |
| <created>1782963620922</created> | |
| <option name="number" value="00894" /> | |
| <option name="presentableId" value="LOCAL-00894" /> | |
| <option name="project" value="LOCAL" /> | |
| <updated>1782963620924</updated> | |
| </task> | |
| <task id="LOCAL-00895" summary="fix(presentation): refine orientation delta calculations and increase jump threshold - Implement modular arithmetic and wrapping for yaw and pitch deltas to correctly handle 0/360-degree boundary crossings. - Increase the jump suppression threshold from 50 to 90 degrees to allow for more rapid legitimate movement while still filtering extreme noise."> | |
| <option name="closed" value="true" /> | |
| <created>1782963793898</created> | |
| <option name="number" value="00895" /> | |
| <option name="presentableId" value="LOCAL-00895" /> | |
| <option name="project" value="LOCAL" /> | |
| <updated>1782963793901</updated> | |
| </task> | |
| <task id="LOCAL-00896" summary="test(app): implement phase-wrapping logic for orientation tracking and add unit tests - Update `MainActivity` to correctly handle angle wrap-around (e.g., transitioning from 179° to -179°) when calculating yaw and pitch deltas. - Adjust the anomaly filter threshold from 50° to 90° to allow for faster legitimate movements while still filtering extreme noise. - Add `AngleMathTest` to validate the shortest delta calculation logic, covering normal rotation, phase wraps, and full rotations."> | |
| <option name="closed" value="true" /> | |
| <created>1782963814080</created> | |
| <option name="number" value="00896" /> | |
| <option name="presentableId" value="LOCAL-00896" /> | |
| <option name="project" value="LOCAL" /> | |
| <updated>1782963814084</updated> | |
| </task> | |
| <task id="LOCAL-00897" summary="build: remove manual JUnitPlatform configuration from app module - Remove explicit `useJUnitPlatform()` configuration in `build.gradle`. - Revert to using the default Android test runner."> | |
| <option name="closed" value="true" /> | |
| <created>1782963828146</created> | |
| <option name="number" value="00897" /> | |
| <option name="presentableId" value="LOCAL-00897" /> | |
| <option name="project" value="LOCAL" /> | |
| <updated>1782963828146</updated> | |
| </task> | |
| <task id="LOCAL-00898" summary="test: add unit tests for ConnectionManager and SensorService - Implement `ConnectionManagerTest` to verify protocol switching, mouse control toggling, and Bluetooth HID report generation. - Implement `SensorServiceTest` to validate sensor lifecycle management, sampling rate configuration, and device stability detection logic. - Utilize MockK and Robolectric to mock Android hardware services, including `SensorManager`, `BluetoothAdapter`, and `PreferencesManager`. - Add test coverage for simulated mouse movement and click events across different connection protocols."> | |
| <option name="closed" value="true" /> | |
| <created>1782964236438</created> | |
| <option name="number" value="00898" /> | |
| <option name="presentableId" value="LOCAL-00898" /> | |
| <option name="project" value="LOCAL" /> | |
| <updated>1782964236450</updated> | |
| </task> | |
| <task id="LOCAL-00899" summary="test: implement unit and instrumented tests for Home and Touchpad modules - Add `NavigationFlowTest` to verify navigation transitions from the Home screen to the Touchpad module. - Add `TouchpadScreenTest` to validate UI state rendering based on connection and mouse control status. - Implement `TouchpadViewModelTest` to cover connection state observation, event handling for presets, and sensitivity updates. - Implement `HomeViewModelTest` to test air mouse toggling, network configuration updates, and preference management logic."> | |
| <option name="closed" value="true" /> | |
| <created>1782964428313</created> | |
| <option name="number" value="00899" /> | |
| <option name="presentableId" value="LOCAL-00899" /> | |
| <option name="project" value="LOCAL" /> | |
| <updated>1782964428320</updated> | |
| </task> | |
| <task id="LOCAL-00900" summary="feat(web): implement touchpad simulator, gesture studio, and calibration modules - **Backend**: Fix a routing loop in the WebSocket server by manually serving `index.html` from the embedded filesystem instead of using `http.FileServer`. - **Touchpad Simulator**: Add a virtual touchpad interface that translates mouse interactions into movement, click, and scroll commands sent via WebSocket. - **Gesture Studio**: - Implement a gesture recording interface with real-time waveform visualization. - Add a simulated training workflow to optimize gesture recognition confidence. - Implement a gesture mapping system to bind specific patterns (e.g., swipes, circles, hand signs) to system actions like media control and window management. - **Voice & Calibration**: - Add a voice command manager to send text-based triggers to the host. - Implement a calibration center to calculate and display sensor bias offsets for gyroscopes and accelerometers."> | |
| <option name="closed" value="true" /> | |
| <created>1782965518429</created> | |
| <option name="number" value="00900" /> | |
| <option name="presentableId" value="LOCAL-00900" /> | |
| <option name="project" value="LOCAL" /> | |
| <updated>1782965518430</updated> | |
| </task> | |
| <task id="LOCAL-00901" summary="test: refactor unit tests for improved type matching and state initialization - **SensorServiceTest**: Enhance Mockk verifications by specifying explicit class types for `SensorEventListener`, `Int`, and `Handler` parameters in `registerListener` and `unregisterListener` calls. - **HomeViewModelTest**: - Update the `ConnectionQuality` mock flow to use the refactored type from the `network` package. - Refactor `PresentationState` and `TransferState` mock flows to use default constructors instead of static idle state references."> | |
| <option name="closed" value="true" /> | |
| <created>1782965565171</created> | |
| <option name="number" value="00901" /> | |
| <option name="presentableId" value="LOCAL-00901" /> | |
| <option name="project" value="LOCAL" /> | |
| <updated>1782965565171</updated> | |
| </task> | |
| <task id="LOCAL-00902" summary="fix(web): remove redundant closing brace in `app.js` - Remove a stray closing brace in `app.js` to fix a syntax error in the device management section."> | |
| <option name="closed" value="true" /> | |
| <created>1782965863677</created> | |
| <option name="number" value="00902" /> | |
| <option name="presentableId" value="LOCAL-00902" /> | |
| <option name="project" value="LOCAL" /> | |
| <updated>1782965863677</updated> | |
| </task> | |
| <task id="LOCAL-00903" summary="docs(web): update connection guide with new default port numbers - Update the setup instructions in `index.html` to reflect the new default ports: `9091` for WebSockets, `9090` for TCP, and `9092` for UDP. - Update the troubleshooting section to recommend checking firewalls for the new port range (9090-9092)."> | |
| <option name="closed" value="true" /> | |
| <created>1782966506778</created> | |
| <option name="number" value="00903" /> | |
| <option name="presentableId" value="LOCAL-00903" /> | |
| <option name="project" value="LOCAL" /> | |
| <updated>1782966506779</updated> | |
| </task> | |
| <task id="LOCAL-00904" summary="feat: refine sensor calibration, gesture detection, and network reliability - **Sensors & Gestures**: - Update `GestureDetector` to use a higher click speed threshold (30 deg/s) and implement yaw-based click detection with rad/s to deg/s conversion. - Reduce required samples for calibration: Gyro (1000 to 100) and Magnetometer (500 to 200) in `CalibrationHelper`. - Adjust `MadgwickAHRS` beta value from `0.1f` to `0.041f` for smoother filtering. - Improve `SensorFusion` gyroscope input handling to conditionally convert degrees to radians. - Add `android.os.Trace` sections to `SensorService` for performance profiling of sensor reads, filtering, and communication. - **Networking**: - Update default ports: TCP to `9090` and WebSockets to `9091`. - Tighten retransmission and timeout parameters: `RETRANSMIT_INTERVAL_MS` to 500ms, `MAX_RETRANSMIT_ATTEMPTS` to 3, and `ACK_TIMEOUT_MS` to 500ms. - **Testing & Tooling**: - Migrate unit tests to `RobolectricTestRunner` for better Android environment simulation. - Refactor `HomeViewModelTest` to fix mocking of context and preferences. - Clean up redundant assertions and mocks in `BatterySaverTest` and `HomeViewModelTest`. - Update `gradle.properties` with a specific `org.gradle.java.home` path."> | |
| <option name="closed" value="true" /> | |
| <created>1785028731849</created> | |
| <option name="number" value="00904" /> | |
| <option name="presentableId" value="LOCAL-00904" /> | |
| <option name="project" value="LOCAL" /> | |
| <updated>1785028731849</updated> | |
| </task> | |
| <task id="LOCAL-00905" summary="feat(pc): update default ports, implement movement filtering, and improve server stability - **Network**: Standardize default communication ports across Go and Python implementations to `9090` (TCP), `9091` (WebSocket), and `9092` (UDP/Discovery). - **Mouse Control**: - Implement a 1D Kalman Filter and a moving average Tremor Filter to reduce jitter and micro-shakes in cursor movement. - Update `MouseController` to apply these filters to movement deltas. - **Server Core**: - **Go**: Add mutex locking when accessing client properties in the TCP server to prevent race conditions during device lookups. - **Python**: Increase the connection watchdog timeout from 10 seconds to 60 seconds for improved connection stability. - **Tooling**: Update the `compute_delta` tracepoint in the Perfetto analyzer to target gesture detection events."> | |
| <option name="closed" value="true" /> | |
| <created>1785028747520</created> | |
| <option name="number" value="00905" /> | |
| <option name="presentableId" value="LOCAL-00905" /> | |
| <option name="project" value="LOCAL" /> | |
| <updated>1785028747520</updated> | |
| </task> | |
| <task id="LOCAL-00906" summary="feat(android): implement calibration wizard, onboarding flow, and core UI fragments - **Calibration**: - Add `CalibrationActivity` and `CalibrationPagerAdapter` to manage the calibration process. - Implement specialized fragments for sensor calibration: `AccelCalibrationFragment`, `GyroCalibrationFragment`, and `MagCalibrationFragment`. - **UI & Navigation**: - Add `OnboardingActivity` to handle first-time user setup and persistent completion state. - Implement `HomeFragment` with `ConnectionManager` and `SensorService` integration. - Add fragments for `Profiles`, `VoiceCommands`, and `ServerLog` to expand application functionality. - **Testing**: Add a Python-based integration simulator (`test_android_integration_sim.py`) to verify the network protocol, including handshakes, sensor data streaming, and ACK-based retransmission. - **Infrastructure**: Integrate Dagger Hilt for dependency injection across all new activities and fragments."> | |
| <option name="closed" value="true" /> | |
| <created>1785028765977</created> | |
| <option name="number" value="00906" /> | |
| <option name="presentableId" value="LOCAL-00906" /> | |
| <option name="project" value="LOCAL" /> | |
| <updated>1785028765977</updated> | |
| </task> | |
| <task id="LOCAL-00907" summary="feat(pc): implement Go-based MCP server and comprehensive test suite for AirMouse - **MCP Server (Go)**: - Implement a new Model Context Protocol (MCP) server in Go to bridge LLM tools with the AirMouse system. - Add tools for mouse movement, clicking (left, right, double), scrolling, and system control commands. - Integrate with the existing PC server via TCP (port 9090) and Admin HTTP API (port 8081). - Support real-time configuration updates and server statistics retrieval via MCP tools. - **Testing & Quality Assurance**: - Add `test_all_protocols_live.py` and `test_full_system.py` to verify UDP discovery and TCP protocol handshakes. - Implement `test_e2e.py` for end-to-end simulation of Android sensor data to PC cursor movement. - Add `test_mcp_server.py` to validate hook normalization, response formatting, and configuration defaults. - Add Go unit tests for mouse movement smoothing in `internal/mouse/smoothing_test.go`. - Include `coverage.out` and binary build artifacts for the Go implementation. - **Performance & Diagnostics**: - Add `perfetto_queries.sql` containing SQL queries for analyzing sensor latency, CPU time in filter functions, and thread contention using Perfetto traces. - Add `airmouse.log` for initial service activity tracking."> | |
| <option name="closed" value="true" /> | |
| <created>1785028793431</created> | |
| <option name="number" value="00907" /> | |
| <option name="presentableId" value="LOCAL-00907" /> | |
| <option name="project" value="LOCAL" /> | |
| <updated>1785028793431</updated> | |
| </task> | |
| <task id="LOCAL-00908" summary="build: upgrade Java toolchain to version 17 and adjust SDK versions - **Project-wide**: Upgrade Java `sourceCompatibility`, `targetCompatibility`, and `jvmTarget` from 11 to 17 across modules. - **Network Module**: Downgrade `compileSdk` from 36 to 34. - **App Module**: - Explicitly configure `jvmToolchain(17)`. - Clean up `build.gradle` by removing redundant comments and whitespace. - Remove a commented-out local module dependency. - **Gradle**: Comment out the hardcoded `org.gradle.java.home` in `gradle.properties` to improve compatibility with local environments and IDEs."> | |
| <option name="closed" value="true" /> | |
| <created>1785030186516</created> | |
| <option name="number" value="00908" /> | |
| <option name="presentableId" value="LOCAL-00908" /> | |
| <option name="project" value="LOCAL" /> | |
| <updated>1785030186518</updated> | |
| </task> | |
| <task id="LOCAL-00909" summary="refactor(tcp): enhance client auto-approval logic and simplify message acknowledgments - **Client Approval**: - Update `autoApproveTCPClient` to permit connections automatically if `AuthEnabled` is disabled in the configuration. - Implement a fallback to use `client.ID` if the device fingerprint is missing. - Make device manager registration optional during approval to handle cases where the manager is not initialized. - Add a secondary auto-approval check within the message handler to validate clients based on authentication settings or IP trust. - **Protocol & Messaging**: - Simplify acknowledgment logic to send an ACK for any incoming message containing an ID, removing the specific command type whitelist. - Update logging to reflect general auto-approval status rather than strictly "trusted" status."> | |
| <option name="closed" value="true" /> | |
| <created>1785030284215</created> | |
| <option name="number" value="00909" /> | |
| <option name="presentableId" value="LOCAL-00909" /> | |
| <option name="project" value="LOCAL" /> | |
| <updated>1785030284226</updated> | |
| </task> | |
| <task id="LOCAL-00910" summary="fix(android): replace non-breaking hyphen with standard hyphen in settings dialog - Update the "Right-Click Tilt Angle" text in `dialog_settings.xml` to use a standard hyphen instead of a non-breaking hyphen. - Update `airmouse-server` binary."> | |
| <option name="closed" value="true" /> | |
| <created>1785030841719</created> | |
| <option name="number" value="00910" /> | |
| <option name="presentableId" value="LOCAL-00910" /> | |
| <option name="project" value="LOCAL" /> | |
| <updated>1785030841730</updated> | |
| </task> | |
| <task id="LOCAL-00911" summary="feat: add monitoring API endpoints and update Android build configuration - **Backend**: - Implement new API handlers for `/api/status`, `/api/qrcode`, `/api/gestures`, and `/api/logs`. - Provide server metadata, uptime, and client connection counts via the status endpoint. - Expose connection strings and authentication tokens for QR code generation. - Add endpoints to retrieve configured gesture mappings and server logs. - **Android**: Configure the network module to use JVM toolchain 17 in `build.gradle`."> | |
| <option name="closed" value="true" /> | |
| <created>1785031166994</created> | |
| <option name="number" value="00911" /> | |
| <option name="presentableId" value="LOCAL-00911" /> | |
| <option name="project" value="LOCAL" /> | |
| <updated>1785031167105</updated> | |
| </task> | |
| <task id="LOCAL-00912" summary="feat: implement core UI components, onboarding flow, and sensor calibration wizard - **UI/Fragments**: - Implement `HomeFragment` with server connection controls (IP/Port), sensitivity adjustment, and real-time usage statistics. - Implement `ProfilesFragment` to allow saving, loading, and deleting custom sensitivity and threshold profiles. - Implement `VoiceCommandFragment` using Android's speech recognition to trigger mouse actions (click, scroll, media controls). - Implement `ServerLogFragment` with a RecyclerView to monitor system status, connection protocols, and filter activity. - Implement `OnboardingActivity` with a ViewPager2-based carousel to introduce app features to new users. - Update `nav_graph.xml` with comprehensive routing for all feature fragments and activities. - **Calibration**: - Implement `CalibrationActivity` using a tabbed ViewPager2 interface to guide users through sensor setup. - Add `GyroCalibrationFragment` with a stationary sample collection routine and variance monitoring. - Add `AccelCalibrationFragment` featuring a guided 6-position (least-squares) calibration process. - Add `MagCalibrationFragment` with a figure-8 movement requirement and sphere-fitting visualization. - **Visualizations & Resources**: - Enhance `GraphCanvas` to support real-time 3-axis (X, Y, Z) waveform rendering for sensor data. - Refactor `strings.xml` and `colors.xml` to simplify brand resources and improve theme consistency. - Update `themes.xml` with Material3 support and a dedicated splash screen theme. - Register new activities in `AndroidManifest.xml`."> | |
| <option name="closed" value="true" /> | |
| <created>1785033311857</created> | |
| <option name="number" value="00912" /> | |
| <option name="presentableId" value="LOCAL-00912" /> | |
| <option name="project" value="LOCAL" /> | |
| <updated>1785033311881</updated> | |
| </task> | |
| <task id="LOCAL-00913" summary="refactor: update default server and discovery port numbers Update default ports across the application to avoid potential conflicts with common services. The new defaults are `9090` for TCP, `9091` for WebSockets, `9092` for discovery, and `9093` for UDP. - **Constants**: Update `AppConstants`, `Constants`, and `MessageTypes` with the new port range (9090-9093). - **Network & Discovery**: - Update `UdpDiscovery` and `NetworkDiscoveryViewModel` to use `9092` for discovery and `9093` for UDP scanning. - Adjust fallback and protocol detection logic in `WebSocketManager` and `WebSocketDataSourceImpl` to reflect the new defaults. - **Preferences & Models**: Update default port values in `UserPreferencesSystem`, `PreferencesDataSourceImpl`, `AppPreferences`, and `ConnectionModels`. - **UI & Help**: - Update help documentation, troubleshooting guides, and walkthroughs in `SearchViewModel`, `AirMouseHelpScreen.md`, and `HelpViewModel`. - Refresh UI placeholders and sample logs in `HomeScreen`, `AirMouseNetworkDiscoveryScreen.md`, and `ServerLogsViewModel`. - **Utilities**: Update QR code parsing logic and validation defaults in `QRScanner` and `ValidationUtils`."> | |
| <option name="closed" value="true" /> | |
| <created>1785033377659</created> | |
| <option name="number" value="00913" /> | |
| <option name="presentableId" value="LOCAL-00913" /> | |
| <option name="project" value="LOCAL" /> | |
| <updated>1785033377663</updated> | |
| </task> | |
| <task id="LOCAL-00914" summary="feat: update default communication ports and implement dedicated UDP discovery - **Core**: Update default port numbers across the project: - TCP: `8080` -> `9090` - WebSockets: `8081` -> `9091` - UDP Streaming: `8082` -> `9093` - UDP Discovery: `8083` -> `9092` - **Backend (Go)**: - Implement a dedicated `discoveryLoop` in the UDP server to handle discovery requests on a separate port. - Add a REST Admin API listener on port `8081`. - Fix a test case in TCP integration tests to support environments with auto-approval enabled. - Clean up unused event listeners in jitter buffer tests. - **Android**: - Synchronize all default port constants and validation logic with the new port range. - Update UI components (Home, Search, Network Discovery, Help) and documentation (Markdown files) to reflect the new port defaults. - Enhance network discovery logic to scan the expanded port range (`9090-9093`). - Update QR code parsing and URI generation to support the new UDP and WebSocket port defaults. - **Docs**: Update connection guides and troubleshooting instructions regarding firewall rules for the new `9090-9093` port range."> | |
| <option name="closed" value="true" /> | |
| <created>1785033461044</created> | |
| <option name="number" value="00914" /> | |
| <option name="presentableId" value="LOCAL-00914" /> | |
| <option name="project" value="LOCAL" /> | |
| <updated>1785033461046</updated> | |
| </task> | |
| <task id="LOCAL-00915" summary="feat(android): implement UI fragments for control, settings, and network discovery - **Navigation & Controls**: - Add `TouchpadFragment` with a virtual surface supporting single tap (click), double tap, long press (right click), and two-finger scroll. - Implement `GestureStudioFragment` for recording and exporting gesture datasets to CSV. - **Settings & Configuration**: - Add `SettingsFragment` with comprehensive controls for sensitivity, thresholds (click, scroll, tilt), smoothing, and AI-based prediction. - Implement `ThemesFragment` and theme selection in settings with support for multiple presets (Dark, Light, High Contrast, etc.). - Implement `ProximityFragment` to manage distance-based service activation and calibration. - **Network & System**: - Add `NetworkDiscoveryFragment` to scan the local network for servers via UDP. - Implement `BatteryFragment` for real-time monitoring of battery level and temperature. - Add `StatisticsFragment` to track gesture counts and session activity. - Add `HelpFragment` with an accordion-style guide and `AboutFragment` for version information. - **Resources**: - Add a suite of vector drawables for phone orientation states, status indicators, and UI feedback. - Provide a utility script (`replace_ports.py`) to automate port range migration (8080-8082 to 9090-9093)."> | |
| <option name="closed" value="true" /> | |
| <created>1785033655137</created> | |
| <option name="number" value="00915" /> | |
| <option name="presentableId" value="LOCAL-00915" /> | |
| <option name="project" value="LOCAL" /> | |
| <updated>1785033655140</updated> | |
| </task> | |
| <task id="LOCAL-00916" summary="refactor(android): implement view binding in `SettingsFragment` and expand resource definitions - **SettingsFragment**: - Migrated from manual view lookups to `FragmentSettingsBinding`. - Refactored `setupViews` into modular `setupSliders` and `setupToggles` placeholders. - Added `syncConfigToServer` using `lifecycleScope` for future settings synchronization. - Simplified fragment lifecycle by cleaning up binding in `onDestroyView`. - **Resources**: - **Strings**: Added a comprehensive set of string resources for calibration, onboarding, help center, about screen, and various settings categories. - **Colors**: Defined a broad palette of functional colors (primary, error, success, surface variants) and onboarding background colors. - **Styles**: Added `ShapeAppearanceOverlay.App.CornerSize50Percent` and updated status bar color mapping in the base theme. - **Build**: Disabled KSP incremental builds in `gradle.properties` to address potential build issues."> | |
| <option name="closed" value="true" /> | |
| <created>1785034494986</created> | |
| <option name="number" value="00916" /> | |
| <option name="presentableId" value="LOCAL-00916" /> | |
| <option name="project" value="LOCAL" /> | |
| <updated>1785034494991</updated> | |
| </task> | |
| <task id="LOCAL-00917" summary="refactor(android): implement view binding in `SettingsFragment` and expand resource definitions - **SettingsFragment**: - Migrated from manual view lookups to `FragmentSettingsBinding`. - Refactored `setupViews` into modular `setupSliders` and `setupToggles` placeholders. - Added `syncConfigToServer` using `lifecycleScope` for future settings synchronization. - Simplified fragment lifecycle by cleaning up binding in `onDestroyView`. - **Resources**: - **Strings**: Added a comprehensive set of string resources for calibration, onboarding, help center, about screen, and various settings categories. - **Colors**: Defined a broad palette of functional colors (primary, error, success, surface variants) and onboarding background colors. - **Styles**: Added `ShapeAppearanceOverlay.App.CornerSize50Percent` and updated status bar color mapping in the base theme. - **Build**: Disabled KSP incremental builds in `gradle.properties` to address potential build issues."> | |
| <option name="closed" value="true" /> | |
| <created>1785070940004</created> | |
| <option name="number" value="00917" /> | |
| <option name="presentableId" value="LOCAL-00917" /> | |
| <option name="project" value="LOCAL" /> | |
| <updated>1785070940006</updated> | |
| </task> | |
| <task id="LOCAL-00918" summary="refactor(android): implement view binding in `SettingsFragment` and expand resource definitions - **SettingsFragment**: - Migrated from manual view lookups to `FragmentSettingsBinding`. - Refactored `setupViews` into modular `setupSliders` and `setupToggles` placeholders. - Added `syncConfigToServer` using `lifecycleScope` for future settings synchronization. - Simplified fragment lifecycle by cleaning up binding in `onDestroyView`. - **Resources**: - **Strings**: Added a comprehensive set of string resources for calibration, onboarding, help center, about screen, and various settings categories. - **Colors**: Defined a broad palette of functional colors (primary, error, success, surface variants) and onboarding background colors. - **Styles**: Added `ShapeAppearanceOverlay.App.CornerSize50Percent` and updated status bar color mapping in the base theme. - **Build**: Disabled KSP incremental builds in `gradle.properties` to address potential build issues."> | |
| <option name="closed" value="true" /> | |
| <created>1785070977739</created> | |
| <option name="number" value="00918" /> | |
| <option name="presentableId" value="LOCAL-00918" /> | |
| <option name="project" value="LOCAL" /> | |
| <updated>1785070977743</updated> | |
| </task> | |
| <task id="LOCAL-00919" summary="refactor(android): implement view binding in `SettingsFragment` and expand resource definitions - **SettingsFragment**: - Migrated from manual view lookups to `FragmentSettingsBinding`. - Refactored `setupViews` into modular `setupSliders` and `setupToggles` placeholders. - Added `syncConfigToServer` using `lifecycleScope` for future settings synchronization. - Simplified fragment lifecycle by cleaning up binding in `onDestroyView`. - **Resources**: - **Strings**: Added a comprehensive set of string resources for calibration, onboarding, help center, about screen, and various settings categories. - **Colors**: Defined a broad palette of functional colors (primary, error, success, surface variants) and onboarding background colors. - **Styles**: Added `ShapeAppearanceOverlay.App.CornerSize50Percent` and updated status bar color mapping in the base theme. - **Build**: Disabled KSP incremental builds in `gradle.properties` to address potential build issues."> | |
| <option name="closed" value="true" /> | |
| <created>1785077147381</created> | |
| <option name="number" value="00919" /> | |
| <option name="presentableId" value="LOCAL-00919" /> | |
| <option name="project" value="LOCAL" /> | |
| <updated>1785077147414</updated> | |
| </task> | |
| <task id="LOCAL-00920" summary="perf(android): enable hardware acceleration and reorder manifest attributes - Enable `android:hardwareAccelerated` in `AndroidManifest.xml` to improve UI rendering performance. - Reorder the `android:largeHeap` attribute within the `<application>` tag."> | |
| <option name="closed" value="true" /> | |
| <created>1785077732318</created> | |
| <option name="number" value="00920" /> | |
| <option name="presentableId" value="LOCAL-00920" /> | |
| <option name="project" value="LOCAL" /> | |
| <updated>1785077732320</updated> | |
| </task> | |
| <task id="LOCAL-00921" summary="feat: implement server approval flow, mouse control synchronization, and enhanced connection UI - **Network/Connection**: - Add support for a `pending_approval` status during the server handshake, introducing a new `PENDING_APPROVAL` connection state. - Synchronize mouse control state with the server by sending control packets whenever `isMouseControlEnabled` is toggled. - Expand `TYPE_CONTROL` message handling to support additional action strings: `pause_movement`, `resume_movement`, `enable`, and `disable`. - Update welcome message handling to support both `TYPE_WELCOME` and `approved` event types. - **UI/UX**: - Add dynamic status banners to the `HomeScreen` to indicate "CONNECTED" (green) and "CONNECTING" (orange) states with protocol details. - Update the connection protocol selection UI to label UDP as "UDP (⚡ Auto-Best)". - Improve logging for mouse control state transitions and server communication."> | |
| <option name="closed" value="true" /> | |
| <created>1785077855552</created> | |
| <option name="number" value="00921" /> | |
| <option name="presentableId" value="LOCAL-00921" /> | |
| <option name="project" value="LOCAL" /> | |
| <updated>1785077855552</updated> | |
| </task> | |
| <task id="LOCAL-00922" summary="feat(android): refine sensor calibration parameters and quality thresholds - Increase sample requirements for gyroscope, magnetometer, and accelerometer to improve data accuracy. - Extend magnetometer calibration duration and increase accelerometer tolerance levels. - Relax variance thresholds for calibration quality levels (`EXCELLENT`, `GOOD`, `FAIR`) to better reflect real-world sensor stability."> | |
| <option name="closed" value="true" /> | |
| <created>1785078659939</created> | |
| <option name="number" value="00922" /> | |
| <option name="presentableId" value="LOCAL-00922" /> | |
| <option name="project" value="LOCAL" /> | |
| <updated>1785078659939</updated> | |
| </task> | |
| <task id="LOCAL-00923" summary="chore: update server binary and remove obsolete static assets - Update the `airmouse-server` binary executable. - Delete legacy minified JavaScript (`index-cSV8B-Pl.js`) and CSS (`index-DGH602ge.css`) files from the `web/static` directory."> | |
| <option name="closed" value="true" /> | |
| <created>1785078925852</created> | |
| <option name="number" value="00923" /> | |
| <option name="presentableId" value="LOCAL-00923" /> | |
| <option name="project" value="LOCAL" /> | |
| <updated>1785078925852</updated> | |
| </task> | |
| <task id="LOCAL-00924" summary="feat: implement web dashboard v2.0 and cross-platform desktop notifications - **Web UI**: Deploy a completely redesigned React-based dashboard with a modern dark theme and modular architecture. - **Dashboard**: Add live telemetry and frequency curves using `recharts` to track latency and interaction rates. - **Device Management**: Implement a full device lifecycle workflow including discovery, authorization requests (approve/reject), and detailed hardware/traffic statistics. - **Gesture Studio**: Add a custom gesture recording interface with waveform visualization and a simulated LSTM neural network training workflow. - **Modules**: Implement new pages for Voice Command simulation, Screen Mirroring (multi-display support), Presentation/Media controls, and Gaming presets. - **File Transfer**: Add a chunked HTTP upload manager and directory browser. - **Infrastructure**: Integrate global state management with `react-query` and a custom toast notification system. - **Backend**: Implement a new Go package `internal/notification` to dispatch native desktop alerts on macOS (osascript), Linux (notify-send), and Windows (PowerShell). - **Build**: Add `airmouse-mcp-go` executable entry points."> | |
| <option name="closed" value="true" /> | |
| <created>1785079213551</created> | |
| <option name="number" value="00924" /> | |
| <option name="presentableId" value="LOCAL-00924" /> | |
| <option name="project" value="LOCAL" /> | |
| <updated>1785079213552</updated> | |
| </task> | |
| <task id="LOCAL-00925" summary="feat(android): implement real-time preference updates for sensor and gesture settings - **SensorService**: - Add a `SharedPreferences.OnSharedPreferenceChangeListener` to reactively update gesture thresholds and gyroscope offsets when settings are modified. - Register the listener during initialization and implement a `destroy()` method to unregister it. - **PreferencesManager**: Add utility methods to register and unregister preference change listeners."> | |
| <option name="closed" value="true" /> | |
| <created>1785079358605</created> | |
| <option name="number" value="00925" /> | |
| <option name="presentableId" value="LOCAL-00925" /> | |
| <option name="project" value="LOCAL" /> | |
| <updated>1785079358607</updated> | |
| </task> | |
| <task id="LOCAL-00926" summary="fix(app): add missing `GestureType` import in `GestureDataSourceImpl.kt`"> | |
| <option name="closed" value="true" /> | |
| <created>1785079449503</created> | |
| <option name="number" value="00926" /> | |
| <option name="presentableId" value="LOCAL-00926" /> | |
| <option name="project" value="LOCAL" /> | |
| <updated>1785079449507</updated> | |
| </task> | |
| <task id="LOCAL-00927" summary="refactor: simplify connection status notifications by canceling all instead of showing error/disconnected states - **NotificationManager**: Update `showDisconnectedNotification` to cancel all active notifications instead of posting a "Disconnected" message. - **HomeViewModel**: - Update the `DISCONNECTED` state handler to cancel all notifications via the manager. - Update the `ERROR` state handler to cancel all notifications instead of showing a specific connection error notification."> | |
| <option name="closed" value="true" /> | |
| <created>1785079635765</created> | |
| <option name="number" value="00927" /> | |
| <option name="presentableId" value="LOCAL-00927" /> | |
| <option name="project" value="LOCAL" /> | |
| <updated>1785079635765</updated> | |
| </task> | |
| <task id="LOCAL-00928" summary="feat(ui): add new navigation links to HomeScreen dropdown menu - Add dropdown menu items for Settings, Touchpad, Profiles, Gaming Mode, Voice Commands, Edge Gestures, Proximity Control, File Transfer, Server Logs, and Themes. - Map each new menu item to its corresponding route in `Destinations`."> | |
| <option name="closed" value="true" /> | |
| <created>1785079726350</created> | |
| <option name="number" value="00928" /> | |
| <option name="presentableId" value="LOCAL-00928" /> | |
| <option name="project" value="LOCAL" /> | |
| <updated>1785079726350</updated> | |
| </task> | |
| <task id="LOCAL-00929" summary="feat(android): add scroll gesture support and refine calibration and home UI - **Gesture System**: Add `SCROLL` to `GestureType` enum and suppress lint warnings for unused parameters in detector classes. - **UI - Calibration**: - Implement a scrollable layout for the calibration steps. - Add a fixed bottom action bar with a semi-transparent background. - Update button styling and labels (e.g., "Record Position" instead of "Capture Pos"). - **UI - Home**: Enhance `QuickActionButton` with a circular icon container, updated heights, and refined typography. - **Sensor Service**: Consolidate cleanup logic into the `destroy()` method, ensuring preferences are unregistered and threads are stopped correctly. - **Code Cleanup**: Remove unused delta time calculations and motion threshold variables in `HomeViewModel`."> | |
| <option name="closed" value="true" /> | |
| <created>1785082063221</created> | |
| <option name="number" value="00929" /> | |
| <option name="presentableId" value="LOCAL-00929" /> | |
| <option name="project" value="LOCAL" /> | |
| <updated>1785082063222</updated> | |
| </task> | |
| <task id="LOCAL-00930" summary="docs: add comprehensive architecture and module documentation - **Android**: Add READMEs for sensor fusion (Madgwick AHRS), network protocols (TCP/UDP/WS), gesture detection, and specialized UI modules including Calibration, Gaming, and Touchpad. - **PC Server**: Document Go-based backend internals, including motion control algorithms (Kalman prediction, adaptive smoothing), device management, and native OS input simulation. - **Web UI**: Add documentation for the React dashboard, detailing the glassmorphism design system and real-time telemetry components."> | |
| <option name="closed" value="true" /> | |
| <created>1785082084241</created> | |
| <option name="number" value="00930" /> | |
| <option name="presentableId" value="LOCAL-00930" /> | |
| <option name="project" value="LOCAL" /> | |
| <updated>1785082084245</updated> | |
| </task> | |
| <task id="LOCAL-00931" summary="feat: implement interactive dashboard tour and revamp Android onboarding - **Web UI**: - Add `InteractiveTourModal` component to provide a multi-step guided walkthrough of dashboard features. - Integrate the tour into the main layout with auto-launch logic for first-time visitors using `localStorage`. - Add a "Tour" action button to the header with updated styling. - Update production build assets in `index.html`. - **Android**: - Overhaul onboarding screen content in `OnboardingItem.kt` to provide detailed technical descriptions of 3D Air Mouse mode, Touchpad mode, and Gaming profiles. - Add specific feature highlights to onboarding items, including Madgwick AHRS details, gesture lists, and proximity security specs. - Update accent colors and icons across the onboarding flow."> | |
| <option name="closed" value="true" /> | |
| <created>1785082654703</created> | |
| <option name="number" value="00931" /> | |
| <option name="presentableId" value="LOCAL-00931" /> | |
| <option name="project" value="LOCAL" /> | |
| <updated>1785082654707</updated> | |
| </task> | |
| <task id="LOCAL-00932" summary="feat: implement gaming profiles and enhance server status visibility - **Backend (Go)**: - Add API endpoints `/api/gaming/profiles` and `/api/gaming/activate` to manage gameplay configurations. - Expand WebSocket command handler to support `game_action` and `game_button` types. - Implement comprehensive input mapping for gaming actions, translating mobile triggers into system mouse clicks and key taps (e.g., WASD for movement, Shift for sprint, Space for jump/handbrake). - Define default profiles for FPS, Racing, and RPG genres with specific control schemes. - **Android**: - **Home Screen**: Add a server architecture information card displaying active ports (TCP 9090, WS 9091, UDP 9092/9093, REST 8081) and engine version. - **Help Screen**: Enhance walkthrough navigation with directional slide-and-fade transitions between tabs."> | |
| <option name="closed" value="true" /> | |
| <created>1785083145872</created> | |
| <option name="number" value="00932" /> | |
| <option name="presentableId" value="LOCAL-00932" /> | |
| <option name="project" value="LOCAL" /> | |
| <updated>1785083145872</updated> | |
| </task> | |
| <option name="localTasksCounter" value="933" /> | |
| <servers /> | |
| </component> | |
| <component name="Vcs.Log.Tabs.Properties"> | |
| <option name="TAB_STATES"> | |
| <map> | |
| <entry key="MAIN"> | |
| <value> | |
| <State> | |
| <option name="FILTERS"> | |
| <map> | |
| <entry key="branch"> | |
| <value> | |
| <list> | |
| <option value="main" /> | |
| </list> | |
| </value> | |
| </entry> | |
| </map> | |
| </option> | |
| </State> | |
| </value> | |
| </entry> | |
| </map> | |
| </option> | |
| </component> | |
| <component name="VcsManagerConfiguration"> | |
| <MESSAGE value="feat(pc): update default ports, implement movement filtering, and improve server stability - **Network**: Standardize default communication ports across Go and Python implementations to `9090` (TCP), `9091` (WebSocket), and `9092` (UDP/Discovery). - **Mouse Control**: - Implement a 1D Kalman Filter and a moving average Tremor Filter to reduce jitter and micro-shakes in cursor movement. - Update `MouseController` to apply these filters to movement deltas. - **Server Core**: - **Go**: Add mutex locking when accessing client properties in the TCP server to prevent race conditions during device lookups. - **Python**: Increase the connection watchdog timeout from 10 seconds to 60 seconds for improved connection stability. - **Tooling**: Update the `compute_delta` tracepoint in the Perfetto analyzer to target gesture detection events." /> | |
| <MESSAGE value="feat(android): implement calibration wizard, onboarding flow, and core UI fragments - **Calibration**: - Add `CalibrationActivity` and `CalibrationPagerAdapter` to manage the calibration process. - Implement specialized fragments for sensor calibration: `AccelCalibrationFragment`, `GyroCalibrationFragment`, and `MagCalibrationFragment`. - **UI & Navigation**: - Add `OnboardingActivity` to handle first-time user setup and persistent completion state. - Implement `HomeFragment` with `ConnectionManager` and `SensorService` integration. - Add fragments for `Profiles`, `VoiceCommands`, and `ServerLog` to expand application functionality. - **Testing**: Add a Python-based integration simulator (`test_android_integration_sim.py`) to verify the network protocol, including handshakes, sensor data streaming, and ACK-based retransmission. - **Infrastructure**: Integrate Dagger Hilt for dependency injection across all new activities and fragments." /> | |
| <MESSAGE value="feat(pc): implement Go-based MCP server and comprehensive test suite for AirMouse - **MCP Server (Go)**: - Implement a new Model Context Protocol (MCP) server in Go to bridge LLM tools with the AirMouse system. - Add tools for mouse movement, clicking (left, right, double), scrolling, and system control commands. - Integrate with the existing PC server via TCP (port 9090) and Admin HTTP API (port 8081). - Support real-time configuration updates and server statistics retrieval via MCP tools. - **Testing & Quality Assurance**: - Add `test_all_protocols_live.py` and `test_full_system.py` to verify UDP discovery and TCP protocol handshakes. - Implement `test_e2e.py` for end-to-end simulation of Android sensor data to PC cursor movement. - Add `test_mcp_server.py` to validate hook normalization, response formatting, and configuration defaults. - Add Go unit tests for mouse movement smoothing in `internal/mouse/smoothing_test.go`. - Include `coverage.out` and binary build artifacts for the Go implementation. - **Performance & Diagnostics**: - Add `perfetto_queries.sql` containing SQL queries for analyzing sensor latency, CPU time in filter functions, and thread contention using Perfetto traces. - Add `airmouse.log` for initial service activity tracking." /> | |
| <MESSAGE value="build: upgrade Java toolchain to version 17 and adjust SDK versions - **Project-wide**: Upgrade Java `sourceCompatibility`, `targetCompatibility`, and `jvmTarget` from 11 to 17 across modules. - **Network Module**: Downgrade `compileSdk` from 36 to 34. - **App Module**: - Explicitly configure `jvmToolchain(17)`. - Clean up `build.gradle` by removing redundant comments and whitespace. - Remove a commented-out local module dependency. - **Gradle**: Comment out the hardcoded `org.gradle.java.home` in `gradle.properties` to improve compatibility with local environments and IDEs." /> | |
| <MESSAGE value="refactor(tcp): enhance client auto-approval logic and simplify message acknowledgments - **Client Approval**: - Update `autoApproveTCPClient` to permit connections automatically if `AuthEnabled` is disabled in the configuration. - Implement a fallback to use `client.ID` if the device fingerprint is missing. - Make device manager registration optional during approval to handle cases where the manager is not initialized. - Add a secondary auto-approval check within the message handler to validate clients based on authentication settings or IP trust. - **Protocol & Messaging**: - Simplify acknowledgment logic to send an ACK for any incoming message containing an ID, removing the specific command type whitelist. - Update logging to reflect general auto-approval status rather than strictly "trusted" status." /> | |
| <MESSAGE value="fix(android): replace non-breaking hyphen with standard hyphen in settings dialog - Update the "Right-Click Tilt Angle" text in `dialog_settings.xml` to use a standard hyphen instead of a non-breaking hyphen. - Update `airmouse-server` binary." /> | |
| <MESSAGE value="feat: add monitoring API endpoints and update Android build configuration - **Backend**: - Implement new API handlers for `/api/status`, `/api/qrcode`, `/api/gestures`, and `/api/logs`. - Provide server metadata, uptime, and client connection counts via the status endpoint. - Expose connection strings and authentication tokens for QR code generation. - Add endpoints to retrieve configured gesture mappings and server logs. - **Android**: Configure the network module to use JVM toolchain 17 in `build.gradle`." /> | |
| <MESSAGE value="feat: implement core UI components, onboarding flow, and sensor calibration wizard - **UI/Fragments**: - Implement `HomeFragment` with server connection controls (IP/Port), sensitivity adjustment, and real-time usage statistics. - Implement `ProfilesFragment` to allow saving, loading, and deleting custom sensitivity and threshold profiles. - Implement `VoiceCommandFragment` using Android's speech recognition to trigger mouse actions (click, scroll, media controls). - Implement `ServerLogFragment` with a RecyclerView to monitor system status, connection protocols, and filter activity. - Implement `OnboardingActivity` with a ViewPager2-based carousel to introduce app features to new users. - Update `nav_graph.xml` with comprehensive routing for all feature fragments and activities. - **Calibration**: - Implement `CalibrationActivity` using a tabbed ViewPager2 interface to guide users through sensor setup. - Add `GyroCalibrationFragment` with a stationary sample collection routine and variance monitoring. - Add `AccelCalibrationFragment` featuring a guided 6-position (least-squares) calibration process. - Add `MagCalibrationFragment` with a figure-8 movement requirement and sphere-fitting visualization. - **Visualizations & Resources**: - Enhance `GraphCanvas` to support real-time 3-axis (X, Y, Z) waveform rendering for sensor data. - Refactor `strings.xml` and `colors.xml` to simplify brand resources and improve theme consistency. - Update `themes.xml` with Material3 support and a dedicated splash screen theme. - Register new activities in `AndroidManifest.xml`." /> | |
| <MESSAGE value="refactor: update default server and discovery port numbers Update default ports across the application to avoid potential conflicts with common services. The new defaults are `9090` for TCP, `9091` for WebSockets, `9092` for discovery, and `9093` for UDP. - **Constants**: Update `AppConstants`, `Constants`, and `MessageTypes` with the new port range (9090-9093). - **Network & Discovery**: - Update `UdpDiscovery` and `NetworkDiscoveryViewModel` to use `9092` for discovery and `9093` for UDP scanning. - Adjust fallback and protocol detection logic in `WebSocketManager` and `WebSocketDataSourceImpl` to reflect the new defaults. - **Preferences & Models**: Update default port values in `UserPreferencesSystem`, `PreferencesDataSourceImpl`, `AppPreferences`, and `ConnectionModels`. - **UI & Help**: - Update help documentation, troubleshooting guides, and walkthroughs in `SearchViewModel`, `AirMouseHelpScreen.md`, and `HelpViewModel`. - Refresh UI placeholders and sample logs in `HomeScreen`, `AirMouseNetworkDiscoveryScreen.md`, and `ServerLogsViewModel`. - **Utilities**: Update QR code parsing logic and validation defaults in `QRScanner` and `ValidationUtils`." /> | |
| <MESSAGE value="feat: update default communication ports and implement dedicated UDP discovery - **Core**: Update default port numbers across the project: - TCP: `8080` -> `9090` - WebSockets: `8081` -> `9091` - UDP Streaming: `8082` -> `9093` - UDP Discovery: `8083` -> `9092` - **Backend (Go)**: - Implement a dedicated `discoveryLoop` in the UDP server to handle discovery requests on a separate port. - Add a REST Admin API listener on port `8081`. - Fix a test case in TCP integration tests to support environments with auto-approval enabled. - Clean up unused event listeners in jitter buffer tests. - **Android**: - Synchronize all default port constants and validation logic with the new port range. - Update UI components (Home, Search, Network Discovery, Help) and documentation (Markdown files) to reflect the new port defaults. - Enhance network discovery logic to scan the expanded port range (`9090-9093`). - Update QR code parsing and URI generation to support the new UDP and WebSocket port defaults. - **Docs**: Update connection guides and troubleshooting instructions regarding firewall rules for the new `9090-9093` port range." /> | |
| <MESSAGE value="feat(android): implement UI fragments for control, settings, and network discovery - **Navigation & Controls**: - Add `TouchpadFragment` with a virtual surface supporting single tap (click), double tap, long press (right click), and two-finger scroll. - Implement `GestureStudioFragment` for recording and exporting gesture datasets to CSV. - **Settings & Configuration**: - Add `SettingsFragment` with comprehensive controls for sensitivity, thresholds (click, scroll, tilt), smoothing, and AI-based prediction. - Implement `ThemesFragment` and theme selection in settings with support for multiple presets (Dark, Light, High Contrast, etc.). - Implement `ProximityFragment` to manage distance-based service activation and calibration. - **Network & System**: - Add `NetworkDiscoveryFragment` to scan the local network for servers via UDP. - Implement `BatteryFragment` for real-time monitoring of battery level and temperature. - Add `StatisticsFragment` to track gesture counts and session activity. - Add `HelpFragment` with an accordion-style guide and `AboutFragment` for version information. - **Resources**: - Add a suite of vector drawables for phone orientation states, status indicators, and UI feedback. - Provide a utility script (`replace_ports.py`) to automate port range migration (8080-8082 to 9090-9093)." /> | |
| <MESSAGE value="refactor(android): implement view binding in `SettingsFragment` and expand resource definitions - **SettingsFragment**: - Migrated from manual view lookups to `FragmentSettingsBinding`. - Refactored `setupViews` into modular `setupSliders` and `setupToggles` placeholders. - Added `syncConfigToServer` using `lifecycleScope` for future settings synchronization. - Simplified fragment lifecycle by cleaning up binding in `onDestroyView`. - **Resources**: - **Strings**: Added a comprehensive set of string resources for calibration, onboarding, help center, about screen, and various settings categories. - **Colors**: Defined a broad palette of functional colors (primary, error, success, surface variants) and onboarding background colors. - **Styles**: Added `ShapeAppearanceOverlay.App.CornerSize50Percent` and updated status bar color mapping in the base theme. - **Build**: Disabled KSP incremental builds in `gradle.properties` to address potential build issues." /> | |
| <MESSAGE value="perf(android): enable hardware acceleration and reorder manifest attributes - Enable `android:hardwareAccelerated` in `AndroidManifest.xml` to improve UI rendering performance. - Reorder the `android:largeHeap` attribute within the `<application>` tag." /> | |
| <MESSAGE value="feat: implement server approval flow, mouse control synchronization, and enhanced connection UI - **Network/Connection**: - Add support for a `pending_approval` status during the server handshake, introducing a new `PENDING_APPROVAL` connection state. - Synchronize mouse control state with the server by sending control packets whenever `isMouseControlEnabled` is toggled. - Expand `TYPE_CONTROL` message handling to support additional action strings: `pause_movement`, `resume_movement`, `enable`, and `disable`. - Update welcome message handling to support both `TYPE_WELCOME` and `approved` event types. - **UI/UX**: - Add dynamic status banners to the `HomeScreen` to indicate "CONNECTED" (green) and "CONNECTING" (orange) states with protocol details. - Update the connection protocol selection UI to label UDP as "UDP (⚡ Auto-Best)". - Improve logging for mouse control state transitions and server communication." /> | |
| <MESSAGE value="feat(android): refine sensor calibration parameters and quality thresholds - Increase sample requirements for gyroscope, magnetometer, and accelerometer to improve data accuracy. - Extend magnetometer calibration duration and increase accelerometer tolerance levels. - Relax variance thresholds for calibration quality levels (`EXCELLENT`, `GOOD`, `FAIR`) to better reflect real-world sensor stability." /> | |
| <MESSAGE value="chore: update server binary and remove obsolete static assets - Update the `airmouse-server` binary executable. - Delete legacy minified JavaScript (`index-cSV8B-Pl.js`) and CSS (`index-DGH602ge.css`) files from the `web/static` directory." /> | |
| <MESSAGE value="feat: implement web dashboard v2.0 and cross-platform desktop notifications - **Web UI**: Deploy a completely redesigned React-based dashboard with a modern dark theme and modular architecture. - **Dashboard**: Add live telemetry and frequency curves using `recharts` to track latency and interaction rates. - **Device Management**: Implement a full device lifecycle workflow including discovery, authorization requests (approve/reject), and detailed hardware/traffic statistics. - **Gesture Studio**: Add a custom gesture recording interface with waveform visualization and a simulated LSTM neural network training workflow. - **Modules**: Implement new pages for Voice Command simulation, Screen Mirroring (multi-display support), Presentation/Media controls, and Gaming presets. - **File Transfer**: Add a chunked HTTP upload manager and directory browser. - **Infrastructure**: Integrate global state management with `react-query` and a custom toast notification system. - **Backend**: Implement a new Go package `internal/notification` to dispatch native desktop alerts on macOS (osascript), Linux (notify-send), and Windows (PowerShell). - **Build**: Add `airmouse-mcp-go` executable entry points." /> | |
| <MESSAGE value="feat(android): implement real-time preference updates for sensor and gesture settings - **SensorService**: - Add a `SharedPreferences.OnSharedPreferenceChangeListener` to reactively update gesture thresholds and gyroscope offsets when settings are modified. - Register the listener during initialization and implement a `destroy()` method to unregister it. - **PreferencesManager**: Add utility methods to register and unregister preference change listeners." /> | |
| <MESSAGE value="fix(app): add missing `GestureType` import in `GestureDataSourceImpl.kt`" /> | |
| <MESSAGE value="refactor: simplify connection status notifications by canceling all instead of showing error/disconnected states - **NotificationManager**: Update `showDisconnectedNotification` to cancel all active notifications instead of posting a "Disconnected" message. - **HomeViewModel**: - Update the `DISCONNECTED` state handler to cancel all notifications via the manager. - Update the `ERROR` state handler to cancel all notifications instead of showing a specific connection error notification." /> | |
| <MESSAGE value="feat(ui): add new navigation links to HomeScreen dropdown menu - Add dropdown menu items for Settings, Touchpad, Profiles, Gaming Mode, Voice Commands, Edge Gestures, Proximity Control, File Transfer, Server Logs, and Themes. - Map each new menu item to its corresponding route in `Destinations`." /> | |
| <MESSAGE value="feat(android): add scroll gesture support and refine calibration and home UI - **Gesture System**: Add `SCROLL` to `GestureType` enum and suppress lint warnings for unused parameters in detector classes. - **UI - Calibration**: - Implement a scrollable layout for the calibration steps. - Add a fixed bottom action bar with a semi-transparent background. - Update button styling and labels (e.g., "Record Position" instead of "Capture Pos"). - **UI - Home**: Enhance `QuickActionButton` with a circular icon container, updated heights, and refined typography. - **Sensor Service**: Consolidate cleanup logic into the `destroy()` method, ensuring preferences are unregistered and threads are stopped correctly. - **Code Cleanup**: Remove unused delta time calculations and motion threshold variables in `HomeViewModel`." /> | |
| <MESSAGE value="docs: add comprehensive architecture and module documentation - **Android**: Add READMEs for sensor fusion (Madgwick AHRS), network protocols (TCP/UDP/WS), gesture detection, and specialized UI modules including Calibration, Gaming, and Touchpad. - **PC Server**: Document Go-based backend internals, including motion control algorithms (Kalman prediction, adaptive smoothing), device management, and native OS input simulation. - **Web UI**: Add documentation for the React dashboard, detailing the glassmorphism design system and real-time telemetry components." /> | |
| <MESSAGE value="feat: implement interactive dashboard tour and revamp Android onboarding - **Web UI**: - Add `InteractiveTourModal` component to provide a multi-step guided walkthrough of dashboard features. - Integrate the tour into the main layout with auto-launch logic for first-time visitors using `localStorage`. - Add a "Tour" action button to the header with updated styling. - Update production build assets in `index.html`. - **Android**: - Overhaul onboarding screen content in `OnboardingItem.kt` to provide detailed technical descriptions of 3D Air Mouse mode, Touchpad mode, and Gaming profiles. - Add specific feature highlights to onboarding items, including Madgwick AHRS details, gesture lists, and proximity security specs. - Update accent colors and icons across the onboarding flow." /> | |
| <MESSAGE value="feat: implement gaming profiles and enhance server status visibility - **Backend (Go)**: - Add API endpoints `/api/gaming/profiles` and `/api/gaming/activate` to manage gameplay configurations. - Expand WebSocket command handler to support `game_action` and `game_button` types. - Implement comprehensive input mapping for gaming actions, translating mobile triggers into system mouse clicks and key taps (e.g., WASD for movement, Shift for sprint, Space for jump/handbrake). - Define default profiles for FPS, Racing, and RPG genres with specific control schemes. - **Android**: - **Home Screen**: Add a server architecture information card displaying active ports (TCP 9090, WS 9091, UDP 9092/9093, REST 8081) and engine version. - **Help Screen**: Enhance walkthrough navigation with directional slide-and-fade transitions between tabs." /> | |
| <option name="LAST_COMMIT_MESSAGE" value="feat: implement gaming profiles and enhance server status visibility - **Backend (Go)**: - Add API endpoints `/api/gaming/profiles` and `/api/gaming/activate` to manage gameplay configurations. - Expand WebSocket command handler to support `game_action` and `game_button` types. - Implement comprehensive input mapping for gaming actions, translating mobile triggers into system mouse clicks and key taps (e.g., WASD for movement, Shift for sprint, Space for jump/handbrake). - Define default profiles for FPS, Racing, and RPG genres with specific control schemes. - **Android**: - **Home Screen**: Add a server architecture information card displaying active ports (TCP 9090, WS 9091, UDP 9092/9093, REST 8081) and engine version. - **Help Screen**: Enhance walkthrough navigation with directional slide-and-fade transitions between tabs." /> | |
| </component> | |
| <component name="XDebuggerManager"> | |
| <breakpoint-manager> | |
| <breakpoints> | |
| <line-breakpoint enabled="true" type="kotlin-function"> | |
| <url>file://$PROJECT_DIR$/app/src/main/java/com/airmouse/domain/repository/IProfileRepository.kt</url> | |
| <line>17</line> | |
| <properties class="com.airmouse.domain.repository.IProfileRepository"> | |
| <option name="WATCH_EXIT" value="false" /> | |
| </properties> | |
| <option name="timeStamp" value="4" /> | |
| </line-breakpoint> | |
| <line-breakpoint enabled="true" type="kotlin-line"> | |
| <url>file://$PROJECT_DIR$/app/src/main/java/com/airmouse/presentation/calibration/CalibrationScreen.kt</url> | |
| <line>1803</line> | |
| <option name="timeStamp" value="6" /> | |
| </line-breakpoint> | |
| <line-breakpoint enabled="true" type="kotlin-line"> | |
| <url>file://$PROJECT_DIR$/app/src/main/java/com/airmouse/data/repository/ProximityRepositoryImpl.kt</url> | |
| <line>267</line> | |
| <option name="timeStamp" value="8" /> | |
| </line-breakpoint> | |
| <line-breakpoint enabled="true" type="kotlin-line"> | |
| <url>file://$PROJECT_DIR$/app/src/main/java/com/airmouse/presentation/ui/home/HomeViewModel.kt</url> | |
| <line>860</line> | |
| <option name="timeStamp" value="9" /> | |
| </line-breakpoint> | |
| </breakpoints> | |
| </breakpoint-manager> | |
| </component> | |
| <component name="play_dynamic_filters_status"> | |
| <option name="appIdToCheckInfo"> | |
| <map> | |
| <entry key="com.airmouse"> | |
| <value> | |
| <CheckInfo lastCheckTimestamp="1785031155926" /> | |
| </value> | |
| </entry> | |
| <entry key="com.airmouse.test"> | |
| <value> | |
| <CheckInfo lastCheckTimestamp="1785031156784" /> | |
| </value> | |
| </entry> | |
| </map> | |
| </option> | |
| </component> | |
| </project> |
Xet Storage Details
- Size:
- 103 kB
- Xet hash:
- ba30b4e95e910f7ee4399ef6f6bc1f534d5cdad37a24f33c8e4365cefb6cc38d
·
Xet efficiently stores files, intelligently splitting them into unique chunks and accelerating uploads and downloads. More info.