Skip to content

feat: add app linking, export/import, and pre-release support#331

Merged
rainxchzed merged 1 commit intomainfrom
feat-manual-install
Mar 15, 2026
Merged

feat: add app linking, export/import, and pre-release support#331
rainxchzed merged 1 commit intomainfrom
feat-manual-install

Conversation

@rainxchzed
Copy link
Member

@rainxchzed rainxchzed commented Mar 15, 2026

  • Implement "Link app to repo" feature to manually associate installed apps with GitHub repositories
  • Add export and import functionality for tracked apps via JSON files
  • Add a setting to include or exclude pre-releases when checking for updates
  • Improve version comparison logic to support semantic versioning and prevent false downgrade notifications
  • Add uninstall confirmation dialogs to prevent accidental app removals
  • Update PackageMonitor and AppsRepository to support fetching all installed device apps
  • Enhance ShareManager with file picking and sharing capabilities across Android and Desktop platforms
  • Update UI with new action buttons, bottom sheets, and toggle cards for the new features

Summary by CodeRabbit

Release Notes

  • New Features

    • Link apps to GitHub repositories by entering repository URLs with validation
    • Export and import app tracking lists as JSON files
    • Search and select installed device apps when linking to repositories
    • Toggle pre-release version inclusion in settings
    • Uninstall confirmation dialogs for app safety
  • Improvements

    • Enhanced update detection with improved version comparison
    • Pre-release filtering now respects user preference setting
    • Android data synchronization optimization

- Implement "Link app to repo" feature to manually associate installed apps with GitHub repositories
- Add export and import functionality for tracked apps via JSON files
- Add a setting to include or exclude pre-releases when checking for updates
- Improve version comparison logic to support semantic versioning and prevent false downgrade notifications
- Add uninstall confirmation dialogs to prevent accidental app removals
- Update `PackageMonitor` and `AppsRepository` to support fetching all installed device apps
- Enhance `ShareManager` with file picking and sharing capabilities across Android and Desktop platforms
- Update UI with new action buttons, bottom sheets, and toggle cards for the new features
@rainxchzed rainxchzed merged commit 3d8f6a8 into main Mar 15, 2026
@rainxchzed rainxchzed deleted the feat-manual-install branch March 15, 2026 07:52
@coderabbitai
Copy link
Contributor

coderabbitai bot commented Mar 15, 2026

Caution

Review failed

The pull request is closed.

ℹ️ Recent review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Pro

Run ID: a467c22e-41e5-40c9-8fec-acf88c43d9ea

📥 Commits

Reviewing files that changed from the base of the PR and between 6f92c12 and 456056a.

📒 Files selected for processing (37)
  • composeApp/src/androidMain/AndroidManifest.xml
  • composeApp/src/androidMain/kotlin/zed/rainxch/githubstore/MainActivity.kt
  • composeApp/src/androidMain/res/xml/filepaths.xml
  • core/data/src/androidMain/kotlin/zed/rainxch/core/data/services/AndroidPackageMonitor.kt
  • core/data/src/androidMain/kotlin/zed/rainxch/core/data/utils/AndroidShareManager.kt
  • core/data/src/commonMain/kotlin/zed/rainxch/core/data/di/SharedModule.kt
  • core/data/src/commonMain/kotlin/zed/rainxch/core/data/repository/InstalledAppsRepositoryImpl.kt
  • core/data/src/commonMain/kotlin/zed/rainxch/core/data/repository/ThemesRepositoryImpl.kt
  • core/data/src/jvmMain/kotlin/zed/rainxch/core/data/services/DesktopPackageMonitor.kt
  • core/data/src/jvmMain/kotlin/zed/rainxch/core/data/utils/DesktopShareManager.kt
  • core/domain/src/commonMain/kotlin/zed/rainxch/core/domain/model/DeviceApp.kt
  • core/domain/src/commonMain/kotlin/zed/rainxch/core/domain/model/ExportedApp.kt
  • core/domain/src/commonMain/kotlin/zed/rainxch/core/domain/repository/ThemesRepository.kt
  • core/domain/src/commonMain/kotlin/zed/rainxch/core/domain/system/PackageMonitor.kt
  • core/domain/src/commonMain/kotlin/zed/rainxch/core/domain/utils/ShareManager.kt
  • core/presentation/src/commonMain/composeResources/values/strings.xml
  • feature/apps/data/build.gradle.kts
  • feature/apps/data/src/commonMain/kotlin/zed/rainxch/apps/data/di/SharedModule.kt
  • feature/apps/data/src/commonMain/kotlin/zed/rainxch/apps/data/repository/AppsRepositoryImpl.kt
  • feature/apps/domain/src/commonMain/kotlin/zed/rainxch/apps/domain/model/GithubRepoInfo.kt
  • feature/apps/domain/src/commonMain/kotlin/zed/rainxch/apps/domain/model/ImportResult.kt
  • feature/apps/domain/src/commonMain/kotlin/zed/rainxch/apps/domain/repository/AppsRepository.kt
  • feature/apps/presentation/src/commonMain/kotlin/zed/rainxch/apps/presentation/AppsAction.kt
  • feature/apps/presentation/src/commonMain/kotlin/zed/rainxch/apps/presentation/AppsEvent.kt
  • feature/apps/presentation/src/commonMain/kotlin/zed/rainxch/apps/presentation/AppsRoot.kt
  • feature/apps/presentation/src/commonMain/kotlin/zed/rainxch/apps/presentation/AppsState.kt
  • feature/apps/presentation/src/commonMain/kotlin/zed/rainxch/apps/presentation/AppsViewModel.kt
  • feature/apps/presentation/src/commonMain/kotlin/zed/rainxch/apps/presentation/components/LinkAppBottomSheet.kt
  • feature/details/presentation/src/commonMain/kotlin/zed/rainxch/details/presentation/DetailsAction.kt
  • feature/details/presentation/src/commonMain/kotlin/zed/rainxch/details/presentation/DetailsRoot.kt
  • feature/details/presentation/src/commonMain/kotlin/zed/rainxch/details/presentation/DetailsState.kt
  • feature/details/presentation/src/commonMain/kotlin/zed/rainxch/details/presentation/DetailsViewModel.kt
  • feature/details/presentation/src/commonMain/kotlin/zed/rainxch/details/presentation/components/SmartInstallButton.kt
  • feature/profile/presentation/src/commonMain/kotlin/zed/rainxch/profile/presentation/ProfileAction.kt
  • feature/profile/presentation/src/commonMain/kotlin/zed/rainxch/profile/presentation/ProfileState.kt
  • feature/profile/presentation/src/commonMain/kotlin/zed/rainxch/profile/presentation/ProfileViewModel.kt
  • feature/profile/presentation/src/commonMain/kotlin/zed/rainxch/profile/presentation/components/sections/Installation.kt

Walkthrough

This pull request introduces support for linking device apps to GitHub repositories, exporting and importing tracked apps as JSON, filtering pre-releases based on user preference, and uninstall confirmation dialogs. It adds new domain models, extends repository APIs, implements file-sharing utilities on Android and desktop, introduces a bottom-sheet UI for app linking with device app discovery, and integrates pre-release filtering throughout the apps and profile features.

Changes

Cohort / File(s) Summary
Android Platform Configuration
composeApp/src/androidMain/AndroidManifest.xml, composeApp/src/androidMain/kotlin/.../MainActivity.kt, composeApp/src/androidMain/res/xml/filepaths.xml
Added foreground service declaration for data sync; registered ShareManager activity result launcher early in onCreate; added cache-path entry for file exports.
Core Domain Models
core/domain/src/commonMain/kotlin/zed/rainxch/core/domain/model/DeviceApp.kt, core/domain/src/commonMain/kotlin/zed/rainxch/core/domain/model/ExportedApp.kt
Introduced DeviceApp data class with packageName, appName, versionName, versionCode; introduced ExportedApp and ExportedAppList serializable data classes for app export/import.
Core Domain Repository & System APIs
core/domain/src/commonMain/kotlin/zed/rainxch/core/domain/repository/ThemesRepository.kt, core/domain/src/commonMain/kotlin/zed/rainxch/core/domain/system/PackageMonitor.kt, core/domain/src/commonMain/kotlin/zed/rainxch/core/domain/utils/ShareManager.kt
Extended ThemesRepository with pre-release preference accessors; extended PackageMonitor with getAllInstalledApps(); extended ShareManager with file sharing and picking methods.
Core Data Repositories
core/data/src/commonMain/kotlin/zed/rainxch/core/data/repository/ThemesRepositoryImpl.kt, core/data/src/commonMain/kotlin/zed/rainxch/core/data/repository/InstalledAppsRepositoryImpl.kt
Added pre-release preference storage in ThemesRepositoryImpl; added semantic version comparison logic and pre-release filtering in InstalledAppsRepositoryImpl via new dependency on ThemesRepository.
Core Data Services
core/data/src/androidMain/kotlin/.../AndroidPackageMonitor.kt, core/data/src/jvmMain/kotlin/.../DesktopPackageMonitor.kt, core/data/src/androidMain/kotlin/.../AndroidShareManager.kt, core/data/src/jvmMain/kotlin/.../DesktopShareManager.kt
Implemented getAllInstalledApps() on Android and Desktop platform monitors; implemented file share/pick methods with native dialogs on Android (via activity result launcher) and Desktop (via Swing file choosers).
Core Data Dependency Injection
core/data/src/commonMain/kotlin/zed/rainxch/core/data/di/SharedModule.kt
Wired ThemesRepository into InstalledAppsRepositoryImpl constructor.
Apps Feature Domain
feature/apps/domain/src/commonMain/kotlin/zed/rainxch/apps/domain/repository/AppsRepository.kt, feature/apps/domain/src/commonMain/kotlin/zed/rainxch/apps/domain/model/GithubRepoInfo.kt, feature/apps/domain/src/commonMain/kotlin/zed/rainxch/apps/domain/model/ImportResult.kt
Extended AppsRepository interface with getDeviceApps(), fetchRepoInfo(), linkAppToRepo(), exportApps(), importApps(), and getTrackedPackageNames(); introduced GithubRepoInfo and ImportResult domain models.
Apps Feature Data
feature/apps/data/build.gradle.kts, feature/apps/data/src/commonMain/kotlin/zed/rainxch/apps/data/di/SharedModule.kt, feature/apps/data/src/commonMain/kotlin/zed/rainxch/apps/data/repository/AppsRepositoryImpl.kt
Added kotlinx.datetime dependency; wired PackageMonitor and ThemesRepository into AppsRepositoryImpl; implemented device app retrieval, GitHub repo fetching with pre-release filtering, app linking, and JSON export/import with error handling and logging.
Apps Feature Presentation - State & Actions
feature/apps/presentation/src/commonMain/kotlin/zed/rainxch/apps/presentation/AppsAction.kt, feature/apps/presentation/src/commonMain/kotlin/zed/rainxch/apps/presentation/AppsEvent.kt, feature/apps/presentation/src/commonMain/kotlin/zed/rainxch/apps/presentation/AppsState.kt
Added uninstall confirmation, link-by-repo (device app picker, URL entry, validation), and export/import actions; added AppLinkedSuccessfully, ExportReady, ImportComplete events; extended AppsState with link sheet, device apps, repo validation, export/import flags, and uninstall pending state.
Apps Feature Presentation - ViewModel & UI
feature/apps/presentation/src/commonMain/kotlin/zed/rainxch/apps/presentation/AppsViewModel.kt, feature/apps/presentation/src/commonMain/kotlin/zed/rainxch/apps/presentation/AppsRoot.kt, feature/apps/presentation/src/commonMain/kotlin/zed/rainxch/apps/presentation/components/LinkAppBottomSheet.kt
Integrated ShareManager; implemented linking (URL parsing, repo info fetch, validation error handling), export (file sharing), and import (file picking, JSON parsing); added overflow menu and FAB to AppsRoot; introduced LinkAppBottomSheet with two-step UI (app picker, URL entry) with search, validation, and animated transitions.
Details Feature Presentation - Uninstall
feature/details/presentation/src/commonMain/kotlin/zed/rainxch/details/presentation/DetailsAction.kt, feature/details/presentation/src/commonMain/kotlin/zed/rainxch/details/presentation/DetailsState.kt, feature/details/presentation/src/commonMain/kotlin/zed/rainxch/details/presentation/DetailsRoot.kt, feature/details/presentation/src/commonMain/kotlin/zed/rainxch/details/presentation/DetailsViewModel.kt, feature/details/presentation/src/commonMain/kotlin/zed/rainxch/details/presentation/components/SmartInstallButton.kt
Added uninstall confirmation flow with OnRequestUninstall, OnDismissUninstallConfirmation, OnConfirmUninstall actions; added showUninstallConfirmation state; rendered confirmation dialog; updated uninstall button to request confirmation before uninstalling.
Profile Feature Presentation - Pre-release Toggle
feature/profile/presentation/src/commonMain/kotlin/zed/rainxch/profile/presentation/ProfileAction.kt, feature/profile/presentation/src/commonMain/kotlin/zed/rainxch/profile/presentation/ProfileState.kt, feature/profile/presentation/src/commonMain/kotlin/zed/rainxch/profile/presentation/ProfileViewModel.kt, feature/profile/presentation/src/commonMain/kotlin/zed/rainxch/profile/presentation/components/sections/Installation.kt
Added OnIncludePreReleasesToggled action; extended ProfileState with includePreReleases property; wired repository interaction to persist preference; added PreReleaseToggleCard component in Updates section.
Strings & Resources
core/presentation/src/commonMain/composeResources/values/strings.xml
Added 16 new string resources for app linking UI (pick app, search, repo URL, validation), export/import UI, pre-release toggle, and uninstall confirmation.

Sequence Diagrams

sequenceDiagram
    actor User
    participant UI as Apps UI
    participant ViewModel as AppsViewModel
    participant Repo as AppsRepository
    participant Monitor as PackageMonitor
    participant Device as Device<br/>(OS)

    User->>UI: Click "Add by Link"
    UI->>ViewModel: OnAddByLinkClick
    ViewModel->>Monitor: getAllInstalledApps()
    Monitor->>Device: Query installed packages
    Device-->>Monitor: Package list
    Monitor-->>ViewModel: List<DeviceApp>
    ViewModel-->>UI: Update deviceApps state
    UI->>User: Show device app picker
    
    User->>UI: Select device app & enter repo URL
    UI->>ViewModel: OnValidateAndLinkRepo
    ViewModel->>Repo: fetchRepoInfo(owner, repo)
    Repo->>Device: HTTP request to GitHub API
    Device-->>Repo: Repo data + latest release
    Repo-->>ViewModel: GithubRepoInfo
    ViewModel->>ViewModel: Validate repo success
    ViewModel->>Repo: linkAppToRepo(deviceApp, repoInfo)
    Repo->>Repo: Persist InstalledApp entry
    ViewModel-->>UI: AppLinkedSuccessfully event
    UI->>User: Show success snackbar
Loading
sequenceDiagram
    actor User
    participant UI as Apps UI
    participant ViewModel as AppsViewModel
    participant Repo as AppsRepository
    participant Share as ShareManager
    participant Device as Device<br/>(Storage)

    User->>UI: Click "Export Apps"
    UI->>ViewModel: OnExportApps
    ViewModel->>Repo: exportApps()
    Repo->>Repo: Serialize tracked apps to JSON
    Repo-->>ViewModel: JSON string
    ViewModel->>Share: shareFile(filename, json, "application/json")
    Share->>Device: Write to cache + create FileProvider URI
    Device-->>Share: File ready
    Share->>Device: Launch share chooser
    Device->>User: Share intent dialog
    User->>Device: Select destination
    Device-->>Share: File shared
Loading
sequenceDiagram
    actor User
    participant UI as Apps UI
    participant ViewModel as AppsViewModel
    participant Share as ShareManager
    participant Repo as AppsRepository
    participant Device as Device<br/>(Storage)

    User->>UI: Click "Import Apps"
    UI->>ViewModel: OnImportApps
    ViewModel->>Share: pickFile("application/json", callback)
    Share->>Device: Open file picker
    Device->>User: File browser
    User->>Device: Select JSON file
    Device-->>Share: File URI + content
    Share-->>ViewModel: JSON string via callback
    ViewModel->>Repo: importApps(jsonString)
    Repo->>Repo: Parse JSON, filter tracked, fetch repo info
    Repo-->>ViewModel: ImportResult (imported, skipped, failed)
    ViewModel-->>UI: ImportComplete event
    UI->>User: Show import summary
Loading

Estimated code review effort

🎯 4 (Complex) | ⏱️ ~75 minutes

Possibly related PRs

Poem

🐰 Files hop and dance in Kotlin's embrace,
Apps link to repos at a quickened pace,
Export, import, with JSON's might,
Pre-releases filtered just right,
Confirm before you uninstall—
This feature bounces through it all! 🌟

✨ Finishing Touches
  • 📝 Generate docstrings (stacked PR)
  • 📝 Generate docstrings (commit on current branch)
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Post copyable unit tests in a comment
  • Commit unit tests in branch feat-manual-install
📝 Coding Plan
  • Generate coding plan for human review comments

Comment @coderabbitai help to get the list of available commands and usage tips.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant