diff --git a/.cargo/config.toml b/.cargo/config.toml
index ac2b23f..115192e 100644
--- a/.cargo/config.toml
+++ b/.cargo/config.toml
@@ -1,2 +1,6 @@
[target.x86_64-pc-windows-msvc]
rustflags = ["-C", "target-feature=+crt-static"]
+
+[target.x86_64-unknown-linux-gnu]
+linker = "clang"
+rustflags = ["-C", "link-arg=-fuse-ld=mold"]
diff --git a/.deepsource.toml b/.deepsource.toml
new file mode 100644
index 0000000..21d4940
--- /dev/null
+++ b/.deepsource.toml
@@ -0,0 +1,13 @@
+version = 1
+
+[[analyzers]]
+name = "rust"
+
+ [analyzers.meta]
+ msrv = "stable"
+
+[[analyzers]]
+name = "test-coverage"
+
+[[transformers]]
+name = "rustfmt"
\ No newline at end of file
diff --git a/.github/ISSUE_TEMPLATE/1-bug-report.yml b/.github/ISSUE_TEMPLATE/1-bug-report.yml
index d00294e..8246a4d 100644
--- a/.github/ISSUE_TEMPLATE/1-bug-report.yml
+++ b/.github/ISSUE_TEMPLATE/1-bug-report.yml
@@ -62,24 +62,15 @@ body:
label: Desktop Environment
description: If relevant, please fill it
placeholder: GNOME 46, KDE Plasma 4, etc...
-- type: input
- id: adb-v
- attributes:
- label: ADB version
- description: If relevant, please fill it
- placeholder: 1.0.41
- type: textarea
id: logfiles
attributes:
label: Provide logs
description: "Paste the relevant (notice the line timestamps) slice (contiguous range) of [the logfile generated by UAD-ng](https://github.com/Universal-Debloater-Alliance/universal-android-debloater-next-generation/wiki/FAQ#where-are-the-logfiles)"
- value: |
- Log
+ render: "" # this should disable soft-wrap
+ validations:
+ required: true
- ```
- Please replace this line by the log-file contents
- ```
-
- type: checkboxes
id: acknowledgements
attributes:
diff --git a/.github/ISSUE_TEMPLATE/3-add-new-packages.yml b/.github/ISSUE_TEMPLATE/3-add-new-packages.yml
index b44df06..c9dc35f 100644
--- a/.github/ISSUE_TEMPLATE/3-add-new-packages.yml
+++ b/.github/ISSUE_TEMPLATE/3-add-new-packages.yml
@@ -6,17 +6,16 @@ body:
- type: markdown
attributes:
value: |
- ## Consider submitting a Pull Request
-
- We receive many package-related issues and it's hard to keep up. **Consider submitting a Pull Request yourself**—it helps us process changes much faster! See our [guide on how to contribute](https://github.com/Universal-Debloater-Alliance/universal-android-debloater-next-generation/wiki/How-to-contribute) for instructions.
-
- ---
-
## Document each package the best you can
**List**: `Google`|`Misc`|`OEM` (manufacturer) |`AOSP`|`Pending`|`Carrier` (ISP).
- **Removal**: `Recommended`|`Advanced`|`Expert`|`Unsafe`. See the [Removal Definitions](https://github.com/Universal-Debloater-Alliance/universal-android-debloater-next-generation/wiki/Debloat-Lists#removal-definitions) on the wiki for details. **Please ensure you follow these definitions when proposing changes.**
+ **Removal**:
+
+ - Recommended: Pointless or outright negative packages, and/or apps available through Google Play.
+ - Advanced: Breaks obscure or minor parts of functionality, or apps that aren't easily enabled/installed through Settings/Google Play. This category is also used for apps that are useful (default keyboard/gallery/launcher/music app.) but that can easily be replaced by a better alternative.
+ - Expert: Breaks widespread and/or important functionality, but nothing important to the basic operation of the operating system. Removing an Expert package should not bootloop the device (unless mentioned in the description) but we can't guarantee it 100%.
+ - Unsafe: Can break vital parts of the operating system. Removing an Unsafe package have an extremely high risk of bootlooping your device.
- type: textarea
id: package-listing
@@ -31,15 +30,6 @@ body:
validations:
required: true
-- type: checkboxes
- id: removal-definitions
- attributes:
- label: Removal Definitions
- description: Please ensure you follow the removal definitions when proposing changes.
- options:
- - label: I've read the [Removal Definitions](https://github.com/Universal-Debloater-Alliance/universal-android-debloater-next-generation/wiki/Debloat-Lists#removal-definitions)
- required: true
-
- type: checkboxes
id: acknowledgements
attributes:
@@ -47,7 +37,6 @@ body:
description: Your bug report will be closed if you don't follow the checklist below.
options:
- label: I removed all those packages on my phone. If not, why? Explain in the issue.
- - label: I'm willing to submit a Pull Request for this change.
- label: This issue is not a duplicate of an existing one.
required: true
- label: I have chosen an appropriate title.
diff --git a/.github/ISSUE_TEMPLATE/4-debloat-issue-report.yml b/.github/ISSUE_TEMPLATE/4-debloat-issue-report.yml
index 8cba412..4900d9e 100644
--- a/.github/ISSUE_TEMPLATE/4-debloat-issue-report.yml
+++ b/.github/ISSUE_TEMPLATE/4-debloat-issue-report.yml
@@ -3,13 +3,6 @@ description: Your phone has unexpected issues after debloating
title: "pkg(scope): "
labels: ["package::breakage"]
body:
-- type: markdown
- attributes:
- value: |
- ## Consider submitting a Pull Request
-
- If you know which package caused the issue and how the documentation should be updated, **consider submitting a Pull Request yourself**—it helps us process changes much faster! See our [guide on how to contribute](https://github.com/Universal-Debloater-Alliance/universal-android-debloater-next-generation/wiki/How-to-contribute) for instructions.
-
- type: textarea
id: what-happened
attributes:
@@ -38,7 +31,6 @@ body:
label: Acknowledgements
description: Your bug report will be closed if you don't follow the checklist below.
options:
- - label: I'm willing to submit a Pull Request to fix the package documentation.
- label: This issue is not a duplicate of an existing one.
required: true
- label: I have chosen an appropriate title.
diff --git a/.github/ISSUE_TEMPLATE/5-update-apps-description-or-recommendation.yml b/.github/ISSUE_TEMPLATE/5-update-apps-description-or-recommendation.yml
index 945e302..6027118 100644
--- a/.github/ISSUE_TEMPLATE/5-update-apps-description-or-recommendation.yml
+++ b/.github/ISSUE_TEMPLATE/5-update-apps-description-or-recommendation.yml
@@ -6,17 +6,16 @@ body:
- type: markdown
attributes:
value: |
- ## Consider submitting a Pull Request
-
- We receive many package documentation updates and it's hard to keep up. **Consider submitting a Pull Request yourself**—it helps us process changes much faster! See our [guide on how to contribute](https://github.com/Universal-Debloater-Alliance/universal-android-debloater-next-generation/wiki/How-to-contribute) for instructions.
-
- ---
-
## Document each package the best you can
**List**: `Google`|`Misc`|`OEM` (manufacturer) |`AOSP`|`Pending`|`Carrier` (ISP).
- **Removal**: `Recommended`|`Advanced`|`Expert`|`Unsafe`. See the [Removal Definitions](https://github.com/Universal-Debloater-Alliance/universal-android-debloater-next-generation/wiki/Debloat-Lists#removal-definitions) on the wiki for details. **Please ensure you follow these definitions when proposing changes.**
+ **Removal**:
+
+ - Recommended: Pointless or outright negative packages, and/or apps available through Google Play.
+ - Advanced: Breaks obscure or minor parts of functionality, or apps that aren't easily enabled/installed through Settings/Google Play. This category is also used for apps that are useful (default keyboard/gallery/launcher/music app.) but that can easily be replaced by a better alternative.
+ - Expert: Breaks widespread and/or important functionality, but nothing important to the basic operation of the operating system. Removing an Expert package should not bootloop the device (unless mentioned in the description) but we can't guarantee it 100%.
+ - Unsafe: Can break vital parts of the operating system. Removing an Unsafe package have an extremely high risk of bootlooping your device.
- type: textarea
id: package-listing
@@ -34,22 +33,12 @@ body:
validations:
required: true
-- type: checkboxes
- id: removal-definitions
- attributes:
- label: Removal Definitions
- description: Please ensure you follow the removal definitions when proposing changes.
- options:
- - label: I've read the [Removal Definitions](https://github.com/Universal-Debloater-Alliance/universal-android-debloater-next-generation/wiki/Debloat-Lists#removal-definitions)
- required: true
-
- type: checkboxes
id: acknowledgements
attributes:
label: Acknowledgements
description: Your bug report will be closed if you don't follow the checklist below.
options:
- - label: I'm willing to submit a Pull Request for this change.
- label: This issue is not a duplicate of an existing one.
required: true
- label: I have chosen an appropriate title.
diff --git a/.github/ISSUE_TEMPLATE/7-ci.yml b/.github/ISSUE_TEMPLATE/7-ci.yml
deleted file mode 100644
index 38f4244..0000000
--- a/.github/ISSUE_TEMPLATE/7-ci.yml
+++ /dev/null
@@ -1,38 +0,0 @@
-name: CI/CD
-description: File an issue for CI/CD
-title: "ci(scope): "
-labels: ["ci"]
-body:
-- type: textarea
- attributes:
- label: Expected behavior
- description: A clear and concise description of what the problem is and how it could be approached.
- validations:
- required: true
-- type: textarea
- attributes:
- label: Alternate solutions
- description: A clear and concise description of any alternative solutions or features you've considered.
- validations:
- required: false
-- type: textarea
- attributes:
- label: Anything else?
- description: |
- Links? References? Anything that will give us more context about the issue you are encountering!
-
- Tip: You can attach images or log files by clicking this area to highlight it and then dragging files in.
- validations:
- required: false
-- type: checkboxes
- id: acknowledgements
- attributes:
- label: Acknowledgements
- description: Your issue will be closed if you don't follow the checklist below.
- options:
- - label: This issue is not a duplicate of an existing issue.
- required: true
- - label: I have chosen an appropriate title.
- required: true
- - label: All requested information has been provided properly.
- required: true
diff --git a/.github/PULL_REQUEST_TEMPLATE/app.md b/.github/PULL_REQUEST_TEMPLATE/app.md
deleted file mode 100644
index 41e92ae..0000000
--- a/.github/PULL_REQUEST_TEMPLATE/app.md
+++ /dev/null
@@ -1,31 +0,0 @@
-## Description
-
-
-
-### Related issues
-
-
-
-
-## How has this been tested?
-
-
-
-- [ ] Unit tests added/updated
-- [ ] Manual testing performed
-- [ ] Tested on the following environment(s):
- - OS:
- - Desktop Environment:
- - Window System/Manager:
- - ADB version:
- - Rust version:
-
-## Checklist
-
-- [ ] I have read the [CONTRIBUTING guidelines](https://github.com/Universal-Debloater-Alliance/universal-android-debloater-next-generation/blob/main/CONTRIBUTING.md)
-- [ ] My code follows the project's code style
-- [ ] I have performed a self-review of my own code
-- [ ] I have commented my code, particularly in hard-to-understand areas
-- [ ] My changes generate no new warnings
-- [ ] I have tested the application with these changes
-- [ ] The CI/CD pipeline passes
diff --git a/.github/PULL_REQUEST_TEMPLATE/documentation.md b/.github/PULL_REQUEST_TEMPLATE/documentation.md
deleted file mode 100644
index 530277e..0000000
--- a/.github/PULL_REQUEST_TEMPLATE/documentation.md
+++ /dev/null
@@ -1,18 +0,0 @@
-## Description
-
-
-
-
-
-## Documentation Changes
-
-
-
-## Checklist
-
-- [ ] I have read the [CONTRIBUTING guidelines](https://github.com/Universal-Debloater-Alliance/universal-android-debloater-next-generation/blob/main/CONTRIBUTING.md)
-- [ ] My changes are clear and easy to understand
-- [ ] I have checked for grammar and spelling errors
-- [ ] I have verified all links are correct
-- [ ] I have tested any code examples provided
-- [ ] The documentation is properly formatted with markdown
diff --git a/.github/PULL_REQUEST_TEMPLATE/packages.md b/.github/PULL_REQUEST_TEMPLATE/packages.md
deleted file mode 100644
index 38cc9b2..0000000
--- a/.github/PULL_REQUEST_TEMPLATE/packages.md
+++ /dev/null
@@ -1,21 +0,0 @@
-## Description
-
-
-
-
-
-## Testing
-
-- [ ] I have tested these packages on a real device or emulator
-- [ ] Package names follow correct naming conventions (e.g., `com.example.app`)
-- [ ] Package names have been verified against device/ADB output
-- [ ] Descriptions are accurate and helpful
-- [ ] No duplicate packages added
-
-## Acknowledgements
-
-- [ ] I have read the [CONTRIBUTING guidelines](https://github.com/Universal-Debloater-Alliance/universal-android-debloater-next-generation/blob/main/CONTRIBUTING.md)
-- [ ] I have followed the package addition guidelines
-- [ ] I have reviewed the [Removal Definitions](https://github.com/Universal-Debloater-Alliance/universal-android-debloater-next-generation/wiki/Debloat-Lists#removal-definitions) in the wiki
-- [ ] All package information is accurate and tested
-- [ ] I understand my PR may be modified before merging
diff --git a/.github/pull_request_template.md b/.github/pull_request_template.md
deleted file mode 100644
index 523bbb6..0000000
--- a/.github/pull_request_template.md
+++ /dev/null
@@ -1,21 +0,0 @@
-## Description
-
-
-
-## Related issues
-
-
-
-
-## Checklist
-
-- [ ] I have read the [CONTRIBUTING guidelines](https://github.com/Universal-Debloater-Alliance/universal-android-debloater-next-generation/blob/main/CONTRIBUTING.md)
-- [ ] I have performed a self-review of my changes
-- [ ] My changes generate no new warnings
-- [ ] The CI/CD pipeline passes (or is expected to pass)
-
-
diff --git a/.github/release.yml b/.github/release.yml
index b34ac36..7e4865a 100644
--- a/.github/release.yml
+++ b/.github/release.yml
@@ -6,18 +6,14 @@ changelog:
- title: Fixed
labels:
- bug
- - title: Refactors
+ - title: Miscellaneous
labels:
- refactor
- - title: Development
- labels:
- - ci
- dependencies
- - title: Documentation
- labels:
- documentation
+ - testing
- title: Packages/apps
labels:
- - package::documentation
- - package::addition
- - package::breakage
+ - package::documentation
+ - package::addition
+ - package::breakage
diff --git a/.github/workflows/build_artifacts.yml b/.github/workflows/build_artifacts.yml
index 63e6542..c0d0891 100644
--- a/.github/workflows/build_artifacts.yml
+++ b/.github/workflows/build_artifacts.yml
@@ -9,20 +9,18 @@ jobs:
runs-on: ${{ matrix.os }}
strategy:
matrix:
- build_target: [linux, macos, macos-intel, windows]
+ build_target: [linux, macos, windows]
update_feature: [self-update, no-self-update]
exclude:
- build_target: windows
update_feature: no-self-update
include:
- build_target: linux
- os: ubuntu-22.04
+ os: ubuntu-latest
- build_target: macos
- os: macos-15
- - build_target: macos-intel
- os: macos-15-intel
+ os: macos-latest
- build_target: windows
- os: windows-2022
+ os: windows-latest
- update_feature: self-update
update_name: "" # we don't want this in the binary filename
- update_feature: no-self-update
@@ -30,6 +28,7 @@ jobs:
steps:
- uses: actions/checkout@v4
- uses: dtolnay/rust-toolchain@stable
+ - uses: rui314/setup-mold@v1 # faster linker
- uses: actions/cache@v4
with:
path: |
@@ -40,26 +39,26 @@ jobs:
target
key: ${{ runner.os }}-release-${{ hashFiles('**/Cargo.lock') }}
restore-keys: ${{ runner.OS }}-release-
- if: matrix.os == 'ubuntu-22.04'
+ if: matrix.os == 'ubuntu-latest'
- name: Building
- run: cargo build --release -p uad-gui --no-default-features --features wgpu,${{ matrix.update_feature }},img
+ run: cargo build --release --no-default-features --features wgpu,${{ matrix.update_feature }}
- name: Renaming binaries [Windows]
- if: matrix.os == 'windows-2022'
+ if: matrix.os == 'windows-latest'
run: mv target/release/uad-ng.exe uad-ng-${{ matrix.build_target }}.exe
- name: Renaming binaries [Others]
- if: matrix.os != 'windows-2022'
+ if: matrix.os != 'windows-latest'
run: mv target/release/uad-ng uad-ng${{ matrix.update_name }}-${{ matrix.build_target }}
- name: Tarball Linux/MacOS binary
- if: matrix.os != 'windows-2022'
+ if: matrix.os != 'windows-latest'
run: tar -czf uad-ng${{ matrix.update_name }}-${{ matrix.build_target }}{.tar.gz,}
- name: Install coreutils for macOS
- if: startsWith(matrix.os, 'macos')
+ if: matrix.os == 'macos-latest'
run: brew install coreutils
- name: Create checksums for binaries and archives [Windows]
- if: matrix.os == 'windows-2022'
+ if: matrix.os == 'windows-latest'
run: sha256sum uad-ng-${{ matrix.build_target }}.exe | tee uad-ng-${{ matrix.build_target }}.exe-checksum.txt
- name: Create checksums for binaries and archives [Others]
- if: matrix.os != 'windows-2022'
+ if: matrix.os != 'windows-latest'
run: |
sha256sum uad-ng${{ matrix.update_name }}-${{ matrix.build_target }} | tee uad-ng${{ matrix.update_name }}-${{ matrix.build_target }}-checksum
sha256sum uad-ng${{ matrix.update_name }}-${{ matrix.build_target }}.tar.gz | tee uad-ng${{ matrix.update_name }}-${{ matrix.build_target }}.tar.gz-checksum
@@ -68,59 +67,3 @@ jobs:
with:
name: uad-ng${{ matrix.update_name }}-${{ matrix.build_target }}
path: uad-ng-*
-
- build-cli:
- name: Building CLI ${{ matrix.build_target }}
- runs-on: ${{ matrix.os }}
- strategy:
- matrix:
- include:
- - build_target: linux
- os: ubuntu-22.04
- - build_target: macos
- os: macos-15
- - build_target: macos-intel
- os: macos-15-intel
- - build_target: windows
- os: windows-2022
- steps:
- - uses: actions/checkout@v4
- - uses: dtolnay/rust-toolchain@stable
- - uses: actions/cache@v4
- with:
- path: |
- ~/.cargo/bin/
- ~/.cargo/registry/index/
- ~/.cargo/registry/cache/
- ~/.cargo/git/db/
- target
- key: ${{ runner.os }}-release-cli-${{ hashFiles('**/Cargo.lock') }}
- restore-keys: ${{ runner.OS }}-release-cli-
- if: matrix.os == 'ubuntu-22.04'
- - name: Building
- run: cargo build --release -p uad-cli
- - name: Renaming binaries [Windows]
- if: matrix.os == 'windows-2022'
- run: mv target/release/uad.exe uad-cli-${{ matrix.build_target }}.exe
- - name: Renaming binaries [Others]
- if: matrix.os != 'windows-2022'
- run: mv target/release/uad uad-cli-${{ matrix.build_target }}
- - name: Tarball Linux/MacOS binary
- if: matrix.os != 'windows-2022'
- run: tar -czf uad-cli-${{ matrix.build_target }}{.tar.gz,}
- - name: Install coreutils for macOS
- if: startsWith(matrix.os, 'macos')
- run: brew install coreutils
- - name: Create checksums for binaries and archives [Windows]
- if: matrix.os == 'windows-2022'
- run: sha256sum uad-cli-${{ matrix.build_target }}.exe | tee uad-cli-${{ matrix.build_target }}.exe-checksum.txt
- - name: Create checksums for binaries and archives [Others]
- if: matrix.os != 'windows-2022'
- run: |
- sha256sum uad-cli-${{ matrix.build_target }} | tee uad-cli-${{ matrix.build_target }}-checksum
- sha256sum uad-cli-${{ matrix.build_target }}.tar.gz | tee uad-cli-${{ matrix.build_target }}.tar.gz-checksum
- - name: Upload artifacts
- uses: actions/upload-artifact@v4
- with:
- name: uad-cli-${{ matrix.build_target }}
- path: uad-cli-*
diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml
index da742c2..7505d20 100644
--- a/.github/workflows/ci.yml
+++ b/.github/workflows/ci.yml
@@ -21,29 +21,29 @@ jobs:
runs-on: ${{ matrix.os }}
strategy:
matrix:
- os: [ubuntu-22.04, windows-2022, macos-15]
+ os: [ubuntu-latest, windows-latest, macOS-latest]
lint: [check, test, clippy, fmt]
exclude: # https://github.com/community/community/discussions/7835
- - os: windows-2022
+ - os: windows-latest
lint: clippy
- - os: windows-2022
+ - os: windows-latest
lint: fmt
- - os: macos-15
+ - os: macOS-latest
lint: clippy
- - os: macos-15
+ - os: macOS-latest
lint: fmt
include:
- lint: check
args: " --all-features"
- env-flag: "-D warnings"
- lint: test
args: ""
- lint: clippy
- args: " --all-features -- -D clippy::all -W clippy::style"
+ args: " --all --all-features"
- lint: fmt
- args: " -- --check"
+ args: " --all -- --check"
steps:
- uses: actions/checkout@v4
+ - uses: rui314/setup-mold@v1 # faster linker
- uses: actions/cache@v4
with:
path: |
@@ -57,12 +57,11 @@ jobs:
- uses: dtolnay/rust-toolchain@stable
with:
components: clippy,rustfmt
- - shell: bash
- run: RUSTFLAGS='${{ matrix.env-flag }}' cargo ${{ matrix.lint }}${{ matrix.args }}
+ - run: cargo ${{ matrix.lint }}${{ matrix.args }}
coverage:
name: coverage
- runs-on: ubuntu-22.04
+ runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: dtolnay/rust-toolchain@stable
@@ -71,6 +70,8 @@ jobs:
mkdir -p "${HOME}/.local/bin"
curl -sL https://github.com/mozilla/grcov/releases/download/v0.8.19/grcov-x86_64-unknown-linux-gnu.tar.bz2 | tar jxf - -C "${HOME}/.local/bin"
echo "$HOME/.local/bin" >> $GITHUB_PATH
+ - name: Set up DeepSource CLI
+ run: curl https://deepsource.io/cli | sh
- name: Install LLVM-profdata
run: rustup component add llvm-tools-preview
- name: Run tests
@@ -79,3 +80,7 @@ jobs:
run: mkdir ./target/coverage
- name: Run GRCOV
run: grcov . --binary-path ./target/debug/ -s . -t lcov --branch --ignore-not-existing --ignore '../*' --ignore "/*" -o ./target/coverage/tests.lcov
+ - name: Upload to DeepSource
+ env:
+ DEEPSOURCE_DSN: ${{ secrets.DEEPSOURCE_DSN }}
+ run: ./bin/deepsource report --analyzer test-coverage --key rust --value-file ./target/coverage/tests.lcov
diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml
index 66ef045..731a72b 100644
--- a/.github/workflows/release.yml
+++ b/.github/workflows/release.yml
@@ -14,7 +14,7 @@ jobs:
uses: ./.github/workflows/build_artifacts.yml
release:
if: github.event_name == 'push' && startsWith(github.ref, 'refs/tags/')
- runs-on: ubuntu-22.04
+ runs-on: ubuntu-latest
needs: build
permissions:
contents: write
@@ -23,12 +23,7 @@ jobs:
- name: Downloads artifacts
uses: actions/download-artifact@v4
- name: Create release
- uses: softprops/action-gh-release@v2
+ uses: softprops/action-gh-release@v1
with:
- files: |
- uad-ng-*/*
- uad-cli-*/*
+ files: uad-ng-*/*
generate_release_notes: true
- body: |
- > [!NOTE]
- > 📦 **Package list updates don't require a new app version**—UAD-ng automatically fetches the latest package definitions on launch (requires internet connection).
diff --git a/.mailmap b/.mailmap
deleted file mode 100644
index 39a8e77..0000000
--- a/.mailmap
+++ /dev/null
@@ -1,11 +0,0 @@
-Rudxain
-Rudxain <76864299+Rudxain@users.noreply.github.com> Ricardo Fernández Serrata <76864299+Rudxain@users.noreply.github.com>
-Anonymoussaurus <50231698+AnonymousWP@users.noreply.github.com> AnonymousWP <50231698+AnonymousWP@users.noreply.github.com>
-Anonymoussaurus
-# w1nst0n
-# 0x192
-# “Frigyes06”
-# Frigyes
-# Frigyes06
-# Frigyes Erdosi-Szucs
-# Frigyes Erdosi Szucs
diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md
index 1df3b89..ea30c85 100644
--- a/CONTRIBUTING.md
+++ b/CONTRIBUTING.md
@@ -2,42 +2,12 @@
## For who is this guide?
-This guide is meant for users who want to contribute to the codebase of Universal Android Debloater Next Generation, whether that is the application code or [the "database"-file for adding packages](https://github.com/Universal-Debloater-Alliance/universal-android-debloater-next-generation/wiki/How-to-contribute). To keep all processes streamlined and consistent, we're asking you to stick to this guide whenever contributing.
+This guide is meant for users who want to contribute to the codebase of Universal Android Debloater Next Generation, whether that is the application code or the JSON-file for adding packages. To keep all processes streamlined and consistent, we're asking you to stick to this guide whenever contributing.
Even though the guide is made for contributors, it's also strongly recommended that the UAD-ng team sticks to these guidelines. After all, we're a prime example.
## What are the guidelines?
-### Mass edits
-
-If you've performed massive edits via automation, you must specify what automation you used. For example, if you ran the command:
-
-```sh
-sed -i 's/a/b/' resources/assets/uad_lists.json
-```
-
-You should copy-paste that cmd to the pull-request description. This rule applies even if you use "proper" cmds such as `jq`, which safely edit structured data. And it also applies to AI, *especially* LLMs.
-
-This is required so that we can review your big patch without reading it. This improves [transparency](https://en.wikipedia.org/wiki/Transparency_(behavior)), which makes you more trust-worthy! Bonus points if you can provide a sequence of cmds that proves your patch contains exactly what you said it does. For the simple `sed` case, something like:
-
-```sh
-# alt: `gh pr checkout 0000 && git checkout main`
-git remote add fork https://github.com/user/uadng
-git fetch fork
-# example commit hash from upstream (not fork);
-# more reproducible than branch-name
-git checkout beefcafe
-sed -i 's/a/b/' resources/assets/uad_lists.json
-# compare unstaged change with commit from fork
-git diff cafebeef
-```
-
-Should be enough.
-
-You should be careful with mass-editing anyways. Even if the verification is successful, the effects [might not be what you expect](https://en.wikipedia.org/wiki/Scunthorpe_problem).
-
-Since AI is non-deterministic, the version number is optional, but it's helpful to know how "intelligent" it is. AI edits are non-reproducible, so "verification scripts" are useless.
-
### Branching strategy
As for our branching strategy, we're using [Trunk-Based Development](https://trunkbaseddevelopment.com/#one-line-summary).
@@ -54,39 +24,46 @@ Do mind that these branch names do only not apply to the addition of packages; f
This is how it looks like and works:

-### Syncing branches
+### Syncing branches
If you want to [back-port](https://en.wikipedia.org/wiki/Backporting) (GitHub's "Update" and "Sync" buttons) from upstream `main` to any other branch (for testing purposes, or any other reasonable case), it's recommended that you `rebase` rather than `merge` the changes.
**Don't apply changes to/from arbitrary branches**, that's a recipe for chaos! If you encounter a situation where it's absolutely necessary to sync non-`main` branches, whether to `merge` or `rebase` should be decided by the UAD-ng team (with some contributor feedback) on a case-by-case basis.
+
### Commit messages
As for commits, we prefer using [Conventional Commit Messages](https://gist.github.com/qoomon/5dfcdf8eec66a051ecd85625518cfd13). When working in any of the branches listed above (if there's an existing issue for it), close it using a [closing keyword](https://docs.github.com/en/issues/tracking-your-work-with-issues/linking-a-pull-request-to-an-issue#linking-a-pull-request-to-an-issue-using-a-keyword). For more information regarding Conventional Commit Messages, see as well.
-### Issue labels
+### Release management
-When creating issues, they are automatically labeled based on the [issue template](.github/ISSUE_TEMPLATE/) you choose. These labels help categorize work and generate release notes.
+#### Semantic versioning
-| Label | Purpose | Issue template |
-| ----- | ------- | -------------- |
-| `bug` | Software bugs in UAD-ng | Bug Report |
-| `enhancement` | New feature requests | Feature Request |
-| `package::addition` | Adding new packages to the debloat list | Add new package(s) |
-| `package::breakage` | Issues caused by debloating | Debloat issue report |
-| `package::documentation` | Updating package descriptions or recommendations | Update apps description or recommendation |
-| `documentation` | Improvements to docs/wiki | UAD-ng documentation |
-| `ci` | CI/CD related issues | CI/CD |
-| `refactor` | Code refactoring | — (maintainer-assigned) |
-| `dependencies` | Dependency updates | — (maintainer-assigned) |
+We're making use of [semantic versioning](https://semver.org/). We use semantic versioning for two things:
-Labels are also used to automatically generate categorized [release notes](.github/release.yml). Each label maps to a changelog section:
+1. GitHub Milestones
+1. UAD-ng releases
-| Label(s) | Changelog category |
-| -------- | ------------------ |
-| `enhancement` | Features |
-| `bug` | Fixed |
-| `refactor` | Refactors |
-| `package::addition`, `package::breakage`, `package::documentation` | Packages/apps |
-| `ci`, `dependencies` | Development |
-| `documentation` | Documentation |
+Speaking of milestones: it could be that we have a bug-fix release (e.g. 1.0.3), but a contributor submits a PR that adds a new feature. What do we do? Merge after we released 1.0.3? Change the name of the milestone to for example 1.1.0? Or another approach?
+
+In that case, we should closely review the PR and 'compare' it with what semantic versioning has to say about the submitted feature. If the changes are significant enough, we're renaming the milestone to (for example) 1.1.0.
+
+#### Checklist before releasing a new version
+
+- [ ] Make sure the Milestone is completed and if not, check what needs to be done to complete it.
+- [ ] Make sure all merged PRs regarding the application follow the Conventional Commit Messages style. This makes sure that when generating a changelog, the changes look consistent, which in turn improves readability.
+- [ ] Make sure all merged PRs have the correct labels assigned, as the changelog is generated based on labels.
+- [ ] Create a release preparation PR that bumps the Rust package version in `Cargo.toml` and `Cargo.lock`
+
+When all the above has been checked, you can push a tag to `main` to trigger the GitHub Action that creates a release:
+
+- Create the tag: `git tag -s v1.2.3 -am '1.2.3'`
+- Push the tag: `git push origin v1.2.3`
+
+Change the version number to whatever version we're releasing.
+
+#### Faulty releases
+
+If we publish a faulty release, for example containing a critical bug, this is how we should deal with it:
+
+We issue a hotfix and keep the faulty release but we'll add warnings to the faulty release in the changelog.
diff --git a/Cargo.lock b/Cargo.lock
index e40c813..cd0835a 100644
--- a/Cargo.lock
+++ b/Cargo.lock
@@ -1,12 +1,12 @@
# This file is automatically @generated by Cargo.
# It is not intended for manual editing.
-version = 4
+version = 3
[[package]]
name = "ab_glyph"
-version = "0.2.32"
+version = "0.2.28"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "01c0457472c38ea5bd1c3b5ada5e368271cb550be7a4ca4a0b4634e9913f6cc2"
+checksum = "79faae4620f45232f599d9bc7b290f88247a0834162c4495ab2f02d60004adfb"
dependencies = [
"ab_glyph_rasterizer",
"owned_ttf_parser",
@@ -14,55 +14,63 @@ dependencies = [
[[package]]
name = "ab_glyph_rasterizer"
-version = "0.1.10"
+version = "0.1.8"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "366ffbaa4442f4684d91e2cd7c5ea7c4ed8add41959a31447066e279e432b618"
+checksum = "c71b1793ee61086797f5c80b6efa2b8ffa6d5dd703f118545808a7f2e27f7046"
[[package]]
-name = "adler2"
-version = "2.0.1"
+name = "adler"
+version = "1.0.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "320119579fcad9c21884f5c4861d16174d0e06250625266f50fe6898340abefa"
+checksum = "f26201604c87b1e01bd3d98f8d5d9a8fcbb815e8cedb41ffccbeb4bf593a35fe"
[[package]]
name = "ahash"
-version = "0.8.12"
+version = "0.7.8"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "5a15f179cd60c4584b8a8c596927aadc462e27f2ca70c04e0071964a73ba7a75"
+checksum = "891477e0c6a8957309ee5c45a6368af3ae14bb510732d2684ffa19af310920f9"
+dependencies = [
+ "getrandom",
+ "once_cell",
+ "version_check",
+]
+
+[[package]]
+name = "ahash"
+version = "0.8.11"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "e89da841a80418a9b391ebaea17f5c112ffaaa96f621d2c285b5174da76b9011"
dependencies = [
"cfg-if",
- "getrandom 0.3.4",
+ "getrandom",
"once_cell",
"version_check",
"zerocopy",
]
[[package]]
-name = "aligned"
-version = "0.4.3"
+name = "aho-corasick"
+version = "1.1.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "ee4508988c62edf04abd8d92897fca0c2995d907ce1dfeaf369dac3716a40685"
+checksum = "8e60d3430d3a69478ad0993f19238d2df97c507009a52b3c10addcd7f6bcb916"
dependencies = [
- "as-slice",
+ "memchr",
]
[[package]]
-name = "aligned-vec"
-version = "0.6.4"
+name = "allocator-api2"
+version = "0.2.18"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "dc890384c8602f339876ded803c97ad529f3842aba97f6392b3dba0dd171769b"
-dependencies = [
- "equator",
-]
+checksum = "5c6cb57a04249c6480766f7f7cef5467412af1490f8d1e243141daddada3264f"
[[package]]
name = "android-activity"
-version = "0.6.0"
+version = "0.5.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "ef6978589202a00cd7e118380c448a08b6ed394c3a8df3a430d0898e3a42d046"
+checksum = "ee91c0c2905bae44f84bfa4e044536541df26b7703fd0888deeb9060fcc44289"
dependencies = [
"android-properties",
- "bitflags 2.10.0",
+ "bitflags 2.6.0",
"cc",
"cesu8",
"jni",
@@ -73,16 +81,7 @@ dependencies = [
"ndk-context",
"ndk-sys",
"num_enum",
- "thiserror 1.0.69",
-]
-
-[[package]]
-name = "android-build"
-version = "0.1.3"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "8cac4c64175d504608cf239756339c07f6384a476f97f20a7043f92920b0b8fd"
-dependencies = [
- "windows-sys 0.52.0",
+ "thiserror",
]
[[package]]
@@ -91,6 +90,12 @@ version = "0.2.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "fc7eb209b1518d6bb87b283c20095f5228ecda460da70b44f0802523dea6da04"
+[[package]]
+name = "android-tzdata"
+version = "0.1.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "e999941b234f3131b00bc13c22d06e8c5ff726d1b6318ac7eb276997bbb4fef0"
+
[[package]]
name = "android_system_properties"
version = "0.1.5"
@@ -101,89 +106,25 @@ dependencies = [
]
[[package]]
-name = "anstream"
-version = "1.0.0"
+name = "approx"
+version = "0.5.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "824a212faf96e9acacdbd09febd34438f8f711fb84e09a8916013cd7815ca28d"
+checksum = "cab112f0a86d568ea0e627cc1d6be74a1e9cd55214684db5561995f6dad897c6"
dependencies = [
- "anstyle",
- "anstyle-parse",
- "anstyle-query",
- "anstyle-wincon",
- "colorchoice",
- "is_terminal_polyfill",
- "utf8parse",
-]
-
-[[package]]
-name = "anstyle"
-version = "1.0.13"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "5192cca8006f1fd4f7237516f40fa183bb07f8fbdfedaa0036de5ea9b0b45e78"
-
-[[package]]
-name = "anstyle-parse"
-version = "1.0.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "52ce7f38b242319f7cabaa6813055467063ecdc9d355bbb4ce0c68908cd8130e"
-dependencies = [
- "utf8parse",
-]
-
-[[package]]
-name = "anstyle-query"
-version = "1.1.5"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "40c48f72fd53cd289104fc64099abca73db4166ad86ea0b4341abe65af83dadc"
-dependencies = [
- "windows-sys 0.61.2",
-]
-
-[[package]]
-name = "anstyle-wincon"
-version = "3.0.11"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "291e6a250ff86cd4a820112fb8898808a366d8f9f58ce16d1f538353ad55747d"
-dependencies = [
- "anstyle",
- "once_cell_polyfill",
- "windows-sys 0.61.2",
-]
-
-[[package]]
-name = "anyhow"
-version = "1.0.101"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "5f0e0fee31ef5ed1ba1316088939cea399010ed7731dba877ed44aeb407a75ea"
-
-[[package]]
-name = "arbitrary"
-version = "1.4.2"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "c3d036a3c4ab069c7b410a2ce876bd74808d2d0888a82667669f8e783a898bf1"
-
-[[package]]
-name = "arg_enum_proc_macro"
-version = "0.3.4"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "0ae92a5119aa49cdbcf6b9f893fe4e1d98b04ccbf82ee0584ad948a44a734dea"
-dependencies = [
- "proc-macro2",
- "quote",
- "syn",
+ "num-traits",
]
[[package]]
name = "arrayref"
-version = "0.3.9"
+version = "0.3.7"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "76a2e8124351fda1ef8aaaa3bbd7ebbcb486bbcd4225aca0aa0d84bb2db8fecb"
+checksum = "6b4930d2cb77ce62f89ee5d5289b4ac049559b1c45539271f5ed4fdc7db34545"
[[package]]
name = "arrayvec"
-version = "0.7.6"
+version = "0.7.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "7c02d123df017efcdfbd739ef81735b36c5ba83ec3c59c80a9d7ecc718f92e50"
+checksum = "96d30a06541fbafbc7f82ed10c06164cfbd2c401138f6addd8404629c4b16711"
[[package]]
name = "as-raw-xcb-connection"
@@ -191,36 +132,27 @@ version = "1.0.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "175571dd1d178ced59193a6fc02dde1b972eb0bc56c892cde9beeceac5bf0f6b"
-[[package]]
-name = "as-slice"
-version = "0.2.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "516b6b4f0e40d50dcda9365d53964ec74560ad4284da2e7fc97122cd83174516"
-dependencies = [
- "stable_deref_trait",
-]
-
[[package]]
name = "ash"
-version = "0.38.0+1.3.281"
+version = "0.37.3+1.3.251"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "0bb44936d800fea8f016d7f2311c6a4f97aebd5dc86f09906139ec848cf3a46f"
+checksum = "39e9c3835d686b0a6084ab4234fcd1b07dbf6e4767dce60874b12356a25ecd4a"
dependencies = [
- "libloading",
+ "libloading 0.7.4",
]
[[package]]
name = "ashpd"
-version = "0.10.3"
+version = "0.8.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "de3d60bee1a1d38c2077030f4788e1b4e31058d2e79a8cfc8f2b440bd44db290"
+checksum = "dd884d7c72877a94102c3715f3b1cd09ff4fac28221add3e57cfbe25c236d093"
dependencies = [
"async-fs",
"async-net",
"enumflags2",
"futures-channel",
"futures-util",
- "rand 0.8.6",
+ "rand",
"serde",
"serde_repr",
"url",
@@ -229,11 +161,11 @@ dependencies = [
[[package]]
name = "async-broadcast"
-version = "0.7.2"
+version = "0.7.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "435a87a52755b8f27fcf321ac4f04b2802e337c8c4872923137471ec39c37532"
+checksum = "20cd0e2e25ea8e5f7e9df04578dc6cf5c83577fd09b1a46aaf5c85e1c33f2a7e"
dependencies = [
- "event-listener 5.4.1",
+ "event-listener",
"event-listener-strategy",
"futures-core",
"pin-project-lite",
@@ -241,20 +173,9 @@ dependencies = [
[[package]]
name = "async-channel"
-version = "1.9.0"
+version = "2.3.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "81953c529336010edd6d8e358f886d9581267795c61b19475b71314bffa46d35"
-dependencies = [
- "concurrent-queue",
- "event-listener 2.5.3",
- "futures-core",
-]
-
-[[package]]
-name = "async-channel"
-version = "2.5.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "924ed96dd52d1b75e9c1a3e6275715fd320f5f9439fb5a4a11fa51f4221158d2"
+checksum = "89b47800b0be77592da0afd425cc03468052844aff33b84e33cc696f64e77b6a"
dependencies = [
"concurrent-queue",
"event-listener-strategy",
@@ -264,69 +185,54 @@ dependencies = [
[[package]]
name = "async-executor"
-version = "1.13.3"
+version = "1.12.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "497c00e0fd83a72a79a39fcbd8e3e2f055d6f6c7e025f3b3d91f4f8e76527fb8"
+checksum = "c8828ec6e544c02b0d6691d21ed9f9218d0384a82542855073c2a3f58304aaf0"
dependencies = [
"async-task",
"concurrent-queue",
"fastrand",
"futures-lite",
- "pin-project-lite",
"slab",
]
[[package]]
name = "async-fs"
-version = "2.2.0"
+version = "2.1.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "8034a681df4aed8b8edbd7fbe472401ecf009251c8b40556b304567052e294c5"
+checksum = "ebcd09b382f40fcd159c2d695175b2ae620ffa5f3bd6f664131efff4e8b9e04a"
dependencies = [
"async-lock",
"blocking",
"futures-lite",
]
-[[package]]
-name = "async-global-executor"
-version = "2.4.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "05b1b633a2115cd122d73b955eadd9916c18c8f510ec9cd1686404c60ad1c29c"
-dependencies = [
- "async-channel 2.5.0",
- "async-executor",
- "async-io",
- "async-lock",
- "blocking",
- "futures-lite",
- "once_cell",
-]
-
[[package]]
name = "async-io"
-version = "2.6.0"
+version = "2.3.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "456b8a8feb6f42d237746d4b3e9a178494627745c3c56c6ea55d92ba50d026fc"
+checksum = "0d6baa8f0178795da0e71bc42c9e5d13261aac7ee549853162e66a241ba17964"
dependencies = [
- "autocfg",
+ "async-lock",
"cfg-if",
"concurrent-queue",
"futures-io",
"futures-lite",
"parking",
"polling",
- "rustix 1.1.3",
+ "rustix",
"slab",
- "windows-sys 0.61.2",
+ "tracing",
+ "windows-sys 0.52.0",
]
[[package]]
name = "async-lock"
-version = "3.4.2"
+version = "3.4.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "290f7f2596bd5b78a9fec8088ccd89180d7f9f55b94b0576823bbbdc72ee8311"
+checksum = "ff6e472cdea888a4bd64f342f09b3f50e1886d32afe8df3d663c01140b811b18"
dependencies = [
- "event-listener 5.4.1",
+ "event-listener",
"event-listener-strategy",
"pin-project-lite",
]
@@ -344,20 +250,22 @@ dependencies = [
[[package]]
name = "async-process"
-version = "2.5.0"
+version = "2.2.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "fc50921ec0055cdd8a16de48773bfeec5c972598674347252c0399676be7da75"
+checksum = "f7eda79bbd84e29c2b308d1dc099d7de8dcc7035e48f4bf5dc4a531a44ff5e2a"
dependencies = [
- "async-channel 2.5.0",
+ "async-channel",
"async-io",
"async-lock",
"async-signal",
"async-task",
"blocking",
"cfg-if",
- "event-listener 5.4.1",
+ "event-listener",
"futures-lite",
- "rustix 1.1.3",
+ "rustix",
+ "tracing",
+ "windows-sys 0.52.0",
]
[[package]]
@@ -368,14 +276,14 @@ checksum = "3b43422f69d8ff38f95f1b2bb76517c91589a924d1559a0e935d7c8ce0274c11"
dependencies = [
"proc-macro2",
"quote",
- "syn",
+ "syn 2.0.70",
]
[[package]]
name = "async-signal"
-version = "0.2.13"
+version = "0.2.8"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "43c070bbf59cd3570b6b2dd54cd772527c7c3620fce8be898406dd3ed6adc64c"
+checksum = "794f185324c2f00e771cd9f1ae8b5ac68be2ca7abb129a87afd6e86d228bc54d"
dependencies = [
"async-io",
"async-lock",
@@ -383,36 +291,10 @@ dependencies = [
"cfg-if",
"futures-core",
"futures-io",
- "rustix 1.1.3",
+ "rustix",
"signal-hook-registry",
"slab",
- "windows-sys 0.61.2",
-]
-
-[[package]]
-name = "async-std"
-version = "1.13.2"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "2c8e079a4ab67ae52b7403632e4618815d6db36d2a010cfe41b02c1b1578f93b"
-dependencies = [
- "async-channel 1.9.0",
- "async-global-executor",
- "async-io",
- "async-lock",
- "crossbeam-utils",
- "futures-channel",
- "futures-core",
- "futures-io",
- "futures-lite",
- "gloo-timers",
- "kv-log-macro",
- "log",
- "memchr",
- "once_cell",
- "pin-project-lite",
- "pin-utils",
- "slab",
- "wasm-bindgen-futures",
+ "windows-sys 0.52.0",
]
[[package]]
@@ -423,13 +305,13 @@ checksum = "8b75356056920673b02621b35afd0f7dda9306d03c79a30f5c56c44cf256e3de"
[[package]]
name = "async-trait"
-version = "0.1.89"
+version = "0.1.81"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "9035ad2d096bed7955a320ee7e2230574d28fd3c3a0f186cbea1ff3c7eed5dbb"
+checksum = "6e0c28dcc82d7c8ead5cb13beb15405b57b8546e93215673ff8ca0349a028107"
dependencies = [
"proc-macro2",
"quote",
- "syn",
+ "syn 2.0.70",
]
[[package]]
@@ -440,52 +322,9 @@ checksum = "1505bd5d3d116872e7271a6d4e16d81d0c8570876c8de68093a09ac269d8aac0"
[[package]]
name = "autocfg"
-version = "1.5.0"
+version = "1.3.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "c08606f8c3cbf4ce6ec8e28fb0014a2c086708fe954eaa885384a6165172e7e8"
-
-[[package]]
-name = "av-scenechange"
-version = "0.14.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "0f321d77c20e19b92c39e7471cf986812cbb46659d2af674adc4331ef3f18394"
-dependencies = [
- "aligned",
- "anyhow",
- "arg_enum_proc_macro",
- "arrayvec",
- "log",
- "num-rational",
- "num-traits",
- "pastey",
- "rayon",
- "thiserror 2.0.18",
- "v_frame",
- "y4m",
-]
-
-[[package]]
-name = "av1-grain"
-version = "0.2.5"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "8cfddb07216410377231960af4fcab838eaa12e013417781b78bd95ee22077f8"
-dependencies = [
- "anyhow",
- "arrayvec",
- "log",
- "nom",
- "num-rational",
- "v_frame",
-]
-
-[[package]]
-name = "avif-serialize"
-version = "0.8.8"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "375082f007bd67184fb9c0374614b29f9aaa604ec301635f72338bb65386a53d"
-dependencies = [
- "arrayvec",
-]
+checksum = "0c4b4d0bd25bd0b74681c0ad21497610ce1b7c91b1022cd21c80c6fbdd9476b0"
[[package]]
name = "base64"
@@ -495,24 +334,24 @@ checksum = "72b3254f16251a8381aa12e40e3c4d2f0199f8c6508fbecb9d91f575e0fbb8c6"
[[package]]
name = "bit-set"
-version = "0.8.0"
+version = "0.5.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "08807e080ed7f9d5433fa9b275196cfc35414f66a0c79d864dc51a0d825231a3"
+checksum = "0700ddab506f33b20a03b13996eccd309a48e5ff77d0d95926aa0210fb4e95f1"
dependencies = [
"bit-vec",
]
[[package]]
name = "bit-vec"
-version = "0.8.0"
+version = "0.6.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "5e764a1d40d510daf35e07be9eb06e75770908c27d411ee6c92109c9840eaaf7"
+checksum = "349f9b6a179ed607305526ca489b34ad0a41aed5f7980fa90eb03160b69598fb"
[[package]]
name = "bit_field"
-version = "0.10.3"
+version = "0.10.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "1e4b40c7323adcfc0a41c4b88143ed58346ff65a288fc144329c5c45e05d70c6"
+checksum = "dc827186963e592360843fb5ba4b973e145841266c1357f7180c43526f2e5b61"
[[package]]
name = "bitflags"
@@ -522,18 +361,9 @@ checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a"
[[package]]
name = "bitflags"
-version = "2.10.0"
+version = "2.6.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "812e12b5285cc515a9c72a5c1d3b6d46a19dac5acfef5265968c166106e31dd3"
-
-[[package]]
-name = "bitstream-io"
-version = "4.9.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "60d4bd9d1db2c6bdf285e223a7fa369d5ce98ec767dec949c6ca62863ce61757"
-dependencies = [
- "core2",
-]
+checksum = "b048fb63fd8b5923fc5aa7b340d8e156aec7ec02f0c78fa8a6ddc2613f6f71de"
[[package]]
name = "block"
@@ -541,6 +371,34 @@ version = "0.1.6"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "0d8c1fef690941d3e7788d328517591fecc684c084084702d6ff1641e993699a"
+[[package]]
+name = "block-buffer"
+version = "0.10.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "3078c7629b62d3f0439517fa394996acacc5cbc91c5a20d8c658e77abd503a71"
+dependencies = [
+ "generic-array",
+]
+
+[[package]]
+name = "block-sys"
+version = "0.2.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "ae85a0696e7ea3b835a453750bf002770776609115e6d25c6d2ff28a8200f7e7"
+dependencies = [
+ "objc-sys",
+]
+
+[[package]]
+name = "block2"
+version = "0.3.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "15b55663a85f33501257357e6421bb33e769d5c9ffb5ba0921c975a123e35e68"
+dependencies = [
+ "block-sys",
+ "objc2 0.4.1",
+]
+
[[package]]
name = "block2"
version = "0.5.1"
@@ -550,22 +408,13 @@ dependencies = [
"objc2 0.5.2",
]
-[[package]]
-name = "block2"
-version = "0.6.2"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "cdeb9d870516001442e364c5220d3574d2da8dc765554b4a617230d33fa58ef5"
-dependencies = [
- "objc2 0.6.3",
-]
-
[[package]]
name = "blocking"
-version = "1.6.2"
+version = "1.6.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "e83f8d02be6967315521be875afa792a316e28d57b5a2d401897e2a7921b7f21"
+checksum = "703f41c54fc768e63e091340b424302bb1c29ef4aa0c7f10fe849dfb114d29ea"
dependencies = [
- "async-channel 2.5.0",
+ "async-channel",
"async-task",
"futures-io",
"futures-lite",
@@ -573,110 +422,84 @@ dependencies = [
]
[[package]]
-name = "built"
-version = "0.8.0"
+name = "bumpalo"
+version = "3.16.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "f4ad8f11f288f48ca24471bbd51ac257aaeaaa07adae295591266b792902ae64"
+checksum = "79296716171880943b8470b5f8d03aa55eb2e645a4874bdbb28adb49162e012c"
[[package]]
-name = "bumpalo"
-version = "3.19.1"
+name = "by_address"
+version = "1.2.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "5dd9dc738b7a8311c7ade152424974d8115f2cdad61e8dab8dac9f2362298510"
+checksum = "64fa3c856b712db6612c019f14756e64e4bcea13337a6b33b696333a9eaa2d06"
[[package]]
name = "bytemuck"
-version = "1.25.0"
+version = "1.16.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "c8efb64bd706a16a1bdde310ae86b351e4d21550d98d056f22f8a7f7a2183fec"
+checksum = "b236fc92302c97ed75b38da1f4917b5cdda4984745740f153a5d3059e48d725e"
dependencies = [
"bytemuck_derive",
]
[[package]]
name = "bytemuck_derive"
-version = "1.10.2"
+version = "1.7.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "f9abbd1bc6865053c427f7198e6af43bfdedc55ab791faed4fbd361d789575ff"
+checksum = "1ee891b04274a59bd38b412188e24b849617b2e45a0fd8d057deb63e7403761b"
dependencies = [
"proc-macro2",
"quote",
- "syn",
+ "syn 2.0.70",
]
[[package]]
-name = "byteorder-lite"
-version = "0.1.0"
+name = "byteorder"
+version = "1.5.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "8f1fe948ff07f4bd06c30984e69f5b4899c516a3ef74f34df92a2df2ab535495"
+checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b"
[[package]]
name = "bytes"
-version = "1.11.1"
+version = "1.6.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "1e748733b7cbc798e1434b6ac524f0c1ff2ab456fe201501e6497c8417a4fc33"
+checksum = "514de17de45fdb8dc022b1a7975556c53c86f9f0aa5f534b98977b171857c2c9"
[[package]]
name = "calloop"
-version = "0.13.0"
+version = "0.12.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "b99da2f8558ca23c71f4fd15dc57c906239752dd27ff3c00a1d56b685b7cbfec"
+checksum = "fba7adb4dd5aa98e5553510223000e7148f621165ec5f9acd7113f6ca4995298"
dependencies = [
- "bitflags 2.10.0",
+ "bitflags 2.6.0",
"log",
"polling",
- "rustix 0.38.44",
+ "rustix",
"slab",
- "thiserror 1.0.69",
-]
-
-[[package]]
-name = "calloop"
-version = "0.14.3"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "cb9f6e1368bd4621d2c86baa7e37de77a938adf5221e5dd3d6133340101b309e"
-dependencies = [
- "bitflags 2.10.0",
- "polling",
- "rustix 1.1.3",
- "slab",
- "tracing",
+ "thiserror",
]
[[package]]
name = "calloop-wayland-source"
-version = "0.3.0"
+version = "0.2.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "95a66a987056935f7efce4ab5668920b5d0dac4a7c99991a67395f13702ddd20"
+checksum = "0f0ea9b9476c7fad82841a8dbb380e2eae480c21910feba80725b46931ed8f02"
dependencies = [
- "calloop 0.13.0",
- "rustix 0.38.44",
- "wayland-backend",
- "wayland-client",
-]
-
-[[package]]
-name = "calloop-wayland-source"
-version = "0.4.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "138efcf0940a02ebf0cc8d1eff41a1682a46b431630f4c52450d6265876021fa"
-dependencies = [
- "calloop 0.14.3",
- "rustix 1.1.3",
+ "calloop",
+ "rustix",
"wayland-backend",
"wayland-client",
]
[[package]]
name = "cc"
-version = "1.2.55"
+version = "1.1.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "47b26a0954ae34af09b50f0de26458fa95369a0d478d8236d3f93082b219bd29"
+checksum = "eaff6f8ce506b9773fa786672d63fc7a191ffea1be33f72bbd4aeacefca9ffc8"
dependencies = [
- "find-msvc-tools",
"jobserver",
"libc",
- "shlex",
+ "once_cell",
]
[[package]]
@@ -687,9 +510,9 @@ checksum = "6d43a04d8753f35258c91f8ec639f792891f748a1edbd759cf1dcea3382ad83c"
[[package]]
name = "cfg-if"
-version = "1.0.4"
+version = "1.0.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "9330f8b2ff13f34540b44e946ef35111825727b38d33286ef986142615121801"
+checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd"
[[package]]
name = "cfg_aliases"
@@ -705,82 +528,34 @@ checksum = "613afe47fcd5fac7ccf1db93babcb082c5994d996f20b8b159f2ad1658eb5724"
[[package]]
name = "chrono"
-version = "0.4.43"
+version = "0.4.38"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "fac4744fb15ae8337dc853fee7fb3f4e48c0fbaa23d0afe49c447b4fab126118"
+checksum = "a21f936df1771bf62b77f047b726c4625ff2e8aa607c01ec06e5a05bd8463401"
dependencies = [
+ "android-tzdata",
"iana-time-zone",
"num-traits",
- "windows-link",
+ "windows-targets 0.52.6",
]
-[[package]]
-name = "clap"
-version = "4.6.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "1ddb117e43bbf7dacf0a4190fef4d345b9bad68dfc649cb349e7d17d28428e51"
-dependencies = [
- "clap_builder",
- "clap_derive",
-]
-
-[[package]]
-name = "clap_builder"
-version = "4.6.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "714a53001bf66416adb0e2ef5ac857140e7dc3a0c48fb28b2f10762fc4b5069f"
-dependencies = [
- "anstream",
- "anstyle",
- "clap_lex",
- "strsim",
-]
-
-[[package]]
-name = "clap_complete"
-version = "4.5.66"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "c757a3b7e39161a4e56f9365141ada2a6c915a8622c408ab6bb4b5d047371031"
-dependencies = [
- "clap",
-]
-
-[[package]]
-name = "clap_derive"
-version = "4.6.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "f2ce8604710f6733aa641a2b3731eaa1e8b3d9973d5e3565da11800813f997a9"
-dependencies = [
- "heck",
- "proc-macro2",
- "quote",
- "syn",
-]
-
-[[package]]
-name = "clap_lex"
-version = "1.0.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "3a822ea5bc7590f9d40f1ba12c0dc3c2760f3482c6984db1573ad11031420831"
-
[[package]]
name = "clipboard-win"
-version = "5.4.1"
+version = "5.4.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "bde03770d3df201d4fb868f2c9c59e66a3e4e2bd06692a0fe701e7103c7e84d4"
+checksum = "15efe7a882b08f34e38556b14f2fb3daa98769d06c7f0c1b076dfd0d983bc892"
dependencies = [
"error-code",
]
[[package]]
name = "clipboard_macos"
-version = "0.1.1"
+version = "0.1.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "9b7f4aaa047ba3c3630b080bb9860894732ff23e2aee290a418909aa6d5df38f"
+checksum = "145a7f9e9b89453bc0a5e32d166456405d389cea5b578f57f1274b1397588a95"
dependencies = [
- "objc2 0.5.2",
- "objc2-app-kit 0.2.2",
- "objc2-foundation 0.2.2",
+ "objc",
+ "objc-foundation",
+ "objc_id",
]
[[package]]
@@ -794,23 +569,22 @@ dependencies = [
[[package]]
name = "clipboard_x11"
-version = "0.4.3"
+version = "0.4.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "bd63e33452ffdafd39924c4f05a5dd1e94db646c779c6bd59148a3d95fff5ad4"
+checksum = "4274ea815e013e0f9f04a2633423e14194e408a0576c943ce3d14ca56c50031c"
dependencies = [
- "thiserror 2.0.18",
+ "thiserror",
"x11rb",
]
[[package]]
name = "codespan-reporting"
-version = "0.12.0"
+version = "0.11.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "fe6d2e5af09e8c8ad56c969f2157a3d4238cebc7c55f0a517728c38f7b200f81"
+checksum = "3538270d33cc669650c4b093848450d380def10c331d38c768e34cac80576e6e"
dependencies = [
- "serde",
"termcolor",
- "unicode-width 0.2.2",
+ "unicode-width",
]
[[package]]
@@ -820,19 +594,45 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "3d7b894f5411737b7867f4827955924d7c254fc9f4d91a6aad6b097804b1018b"
[[package]]
-name = "colorchoice"
-version = "1.0.4"
+name = "colored"
+version = "1.9.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "b05b61dc5112cbb17e4b6cd61790d9845d13888356391624cbe7e41efeac1e75"
+checksum = "5a5f741c91823341bebf717d4c71bda820630ce065443b58bd1b7451af008355"
+dependencies = [
+ "is-terminal",
+ "lazy_static",
+ "winapi",
+]
[[package]]
-name = "colored"
-version = "2.2.0"
+name = "com"
+version = "0.6.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "117725a109d387c937a1533ce01b450cbde6b88abceea8473c4d7a85853cda3c"
+checksum = "7e17887fd17353b65b1b2ef1c526c83e26cd72e74f598a8dc1bee13a48f3d9f6"
dependencies = [
- "lazy_static",
- "windows-sys 0.59.0",
+ "com_macros",
+]
+
+[[package]]
+name = "com_macros"
+version = "0.6.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "d375883580a668c7481ea6631fc1a8863e33cc335bf56bfad8d7e6d4b04b13a5"
+dependencies = [
+ "com_macros_support",
+ "proc-macro2",
+ "syn 1.0.109",
+]
+
+[[package]]
+name = "com_macros_support"
+version = "0.6.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "ad899a1087a9296d5644792d7cb72b8e34c1bec8e7d4fbc002230169a6e8710c"
+dependencies = [
+ "proc-macro2",
+ "quote",
+ "syn 1.0.109",
]
[[package]]
@@ -854,35 +654,6 @@ dependencies = [
"crossbeam-utils",
]
-[[package]]
-name = "cookie"
-version = "0.18.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "4ddef33a339a91ea89fb53151bd0a4689cfce27055c291dfa69945475d22c747"
-dependencies = [
- "percent-encoding",
- "time",
- "version_check",
-]
-
-[[package]]
-name = "cookie_store"
-version = "0.22.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "3fc4bff745c9b4c7fb1e97b25d13153da2bc7796260141df62378998d070207f"
-dependencies = [
- "cookie",
- "document-features",
- "idna",
- "indexmap",
- "log",
- "serde",
- "serde_derive",
- "serde_json",
- "time",
- "url",
-]
-
[[package]]
name = "core-foundation"
version = "0.9.4"
@@ -893,21 +664,11 @@ dependencies = [
"libc",
]
-[[package]]
-name = "core-foundation"
-version = "0.10.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "b2a6cd9ae233e7f62ba4e9353e81a88df7fc8a5987b8d445b4d90c879bd156f6"
-dependencies = [
- "core-foundation-sys",
- "libc",
-]
-
[[package]]
name = "core-foundation-sys"
-version = "0.8.7"
+version = "0.8.6"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "773648b94d0e5d620f64f280777445740e61fe701025087ec8b57f45c791888b"
+checksum = "06ea2b9bc92be3c2baa9334a323ebca2d6f074ff852cd1d7b11064035cd3868f"
[[package]]
name = "core-graphics"
@@ -916,8 +677,8 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "c07782be35f9e1140080c6b96f0d44b739e2278479f64e02fdab4e32dfd8b081"
dependencies = [
"bitflags 1.3.2",
- "core-foundation 0.9.4",
- "core-graphics-types 0.1.3",
+ "core-foundation",
+ "core-graphics-types",
"foreign-types",
"libc",
]
@@ -929,55 +690,23 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "45390e6114f68f718cc7a830514a96f903cccd70d02a8f6d9f643ac4ba45afaf"
dependencies = [
"bitflags 1.3.2",
- "core-foundation 0.9.4",
+ "core-foundation",
"libc",
]
-[[package]]
-name = "core-graphics-types"
-version = "0.2.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "3d44a101f213f6c4cdc1853d4b78aef6db6bdfa3468798cc1d9912f4735013eb"
-dependencies = [
- "bitflags 2.10.0",
- "core-foundation 0.10.1",
- "libc",
-]
-
-[[package]]
-name = "core2"
-version = "0.4.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "b49ba7ef1ad6107f8824dbe97de947cbaac53c44e7f9756a1fba0d37c1eec505"
-dependencies = [
- "memchr",
-]
-
-[[package]]
-name = "core_maths"
-version = "0.1.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "77745e017f5edba1a9c1d854f6f3a52dac8a12dd5af5d2f54aecf61e43d80d30"
-dependencies = [
- "libm",
-]
-
[[package]]
name = "cosmic-text"
-version = "0.15.0"
+version = "0.10.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "173852283a9a57a3cbe365d86e74dc428a09c50421477d5ad6fe9d9509e37737"
+checksum = "75acbfb314aeb4f5210d379af45ed1ec2c98c7f1790bf57b8a4c562ac0c51b71"
dependencies = [
- "bitflags 2.10.0",
"fontdb",
- "harfrust",
- "linebender_resource_handle",
+ "libm",
"log",
"rangemap",
- "rustc-hash 1.1.0",
+ "rustc-hash",
+ "rustybuzz",
"self_cell",
- "skrifa",
- "smol_str",
"swash",
"sys-locale",
"unicode-bidi",
@@ -987,19 +716,28 @@ dependencies = [
]
[[package]]
-name = "crc32fast"
-version = "1.5.0"
+name = "cpufeatures"
+version = "0.2.12"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "9481c1c90cbf2ac953f07c8d4a58aa3945c425b7185c9154d67a65e4230da511"
+checksum = "53fe5e26ff1b7aef8bca9c6080520cfb8d9333c7568e1829cef191a9723e5504"
+dependencies = [
+ "libc",
+]
+
+[[package]]
+name = "crc32fast"
+version = "1.4.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "a97769d94ddab943e4510d138150169a2758b5ef3eb191a9ee688de3e23ef7b3"
dependencies = [
"cfg-if",
]
[[package]]
name = "crossbeam-deque"
-version = "0.8.6"
+version = "0.8.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "9dd111b7b7f7d55b72c0a6ae361660ee5853c9af73f70c3c2ef6858b950e2e51"
+checksum = "613f8cc01fe9cf1a3eb3d7f488fd2fa8388403e97039e2f73692932e291a770d"
dependencies = [
"crossbeam-epoch",
"crossbeam-utils",
@@ -1016,104 +754,147 @@ dependencies = [
[[package]]
name = "crossbeam-utils"
-version = "0.8.21"
+version = "0.8.20"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "d0a5c400df2834b80a4c3327b3aad3a4c4cd4de0629063962b03235697506a28"
+checksum = "22ec99545bb0ed0ea7bb9b8e1e9122ea386ff8a48c0922e43f36d45ab09e0e80"
[[package]]
name = "crunchy"
-version = "0.2.4"
+version = "0.2.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "460fbee9c2c2f33933d720630a6a0bac33ba7053db5344fac858d4b8952d77d5"
+checksum = "7a81dae078cea95a014a339291cec439d2f232ebe854a9d672b796c6afafa9b7"
[[package]]
-name = "cryoglyph"
-version = "0.1.0"
+name = "crypto-common"
+version = "0.1.6"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "08bc795bdbccdbd461736fb163930a009da6597b226d6f6fce33e7a8eb6ec519"
+checksum = "1bfb12502f3fc46cca1bb51ac28df9d618d813cdc3d2f25b9fe775a34af26bb3"
dependencies = [
- "cosmic-text",
- "etagere",
- "lru",
- "rustc-hash 2.1.1",
- "wgpu",
+ "generic-array",
+ "typenum",
]
[[package]]
name = "csv"
-version = "1.4.0"
+version = "1.3.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "52cd9d68cf7efc6ddfaaee42e7288d3a99d613d4b50f76ce9827ae0c6e14f938"
+checksum = "ac574ff4d437a7b5ad237ef331c17ccca63c46479e5b5453eb8e10bb99a759fe"
dependencies = [
"csv-core",
"itoa",
"ryu",
- "serde_core",
+ "serde",
]
[[package]]
name = "csv-core"
-version = "0.1.13"
+version = "0.1.11"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "704a3c26996a80471189265814dbc2c257598b96b8a7feae2d31ace646bb9782"
+checksum = "5efa2b3d7902f4b634a20cae3c9c4e6209dc4779feb6863329607560143efa70"
dependencies = [
"memchr",
]
[[package]]
name = "ctor-lite"
-version = "0.1.1"
+version = "0.1.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "b29fccfdaeb0f9bd90da5759b1d0eaa2f6cfcfe90960124cfc83141ed4e111fd"
+checksum = "1f791803201ab277ace03903de1594460708d2d54df6053f2d9e82f592b19e3b"
[[package]]
name = "cursor-icon"
-version = "1.2.0"
+version = "1.1.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "f27ae1dd37df86211c42e150270f82743308803d90a6f6e6651cd730d5e1732f"
+checksum = "96a6ac251f4a2aca6b3f91340350eab87ae57c3f127ffeb585e92bd336717991"
[[package]]
-name = "dark-light"
-version = "2.0.0"
+name = "d3d12"
+version = "0.19.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "18e1a09f280e29a8b00bc7e81eca5ac87dca0575639c9422a5fa25a07bb884b8"
+checksum = "3e3d747f100290a1ca24b752186f61f6637e1deffe3bf6320de6fcb29510a307"
dependencies = [
- "ashpd",
- "async-std",
- "objc2 0.5.2",
- "objc2-foundation 0.2.2",
- "web-sys",
- "winreg 0.52.0",
+ "bitflags 2.6.0",
+ "libloading 0.8.4",
+ "winapi",
]
[[package]]
-name = "deranged"
-version = "0.5.6"
+name = "dark-light"
+version = "1.1.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "cc3dc5ad92c2e2d1c193bbbbdf2ea477cb81331de4f3103f267ca18368b988c4"
+checksum = "2a76fa97167fa740dcdbfe18e8895601e1bc36525f09b044e00916e717c03a3c"
dependencies = [
- "powerfmt",
+ "dconf_rs",
+ "detect-desktop-environment",
+ "dirs 4.0.0",
+ "objc",
+ "rust-ini",
+ "web-sys",
+ "winreg 0.10.1",
+ "zbus",
+]
+
+[[package]]
+name = "dconf_rs"
+version = "0.3.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "7046468a81e6a002061c01e6a7c83139daf91b11c30e66795b13217c2d885c8b"
+
+[[package]]
+name = "detect-desktop-environment"
+version = "0.2.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "21d8ad60dd5b13a4ee6bd8fa2d5d88965c597c67bce32b5fc49c94f55cb50810"
+
+[[package]]
+name = "digest"
+version = "0.10.7"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "9ed9a281f7bc9b7576e61468ba615a66a5c8cfdff42420a70aa82701a3b1e292"
+dependencies = [
+ "block-buffer",
+ "crypto-common",
]
[[package]]
name = "dirs"
-version = "6.0.0"
+version = "4.0.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "c3e8aa94d75141228480295a7d0e7feb620b1a5ad9f12bc40be62411e38cce4e"
+checksum = "ca3aa72a6f96ea37bbc5aa912f6788242832f75369bdfdadcb0e38423f100059"
dependencies = [
- "dirs-sys",
+ "dirs-sys 0.3.7",
+]
+
+[[package]]
+name = "dirs"
+version = "5.0.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "44c45a9d03d6676652bcb5e724c7e988de1acad23a711b5217ab9cbecbec2225"
+dependencies = [
+ "dirs-sys 0.4.1",
]
[[package]]
name = "dirs-sys"
-version = "0.5.0"
+version = "0.3.7"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "e01a3366d27ee9890022452ee61b2b63a67e6f13f58900b651ff5665f0bb1fab"
+checksum = "1b1d1d91c932ef41c0f2663aa8b0ca0342d444d842c06914aa0a7e352d0bada6"
+dependencies = [
+ "libc",
+ "redox_users",
+ "winapi",
+]
+
+[[package]]
+name = "dirs-sys"
+version = "0.4.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "520f05a5cbd335fae5a99ff7a6ab8627577660ee5cfd6a94a6a929b52ff0321c"
dependencies = [
"libc",
"option-ext",
"redox_users",
- "windows-sys 0.61.2",
+ "windows-sys 0.48.0",
]
[[package]]
@@ -1122,46 +903,20 @@ version = "0.2.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "bd0c93bb4b0c6d9b77f4435b0ae98c24d17f1c45b2ff844c6151a07256ca923b"
-[[package]]
-name = "dispatch2"
-version = "0.3.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "89a09f22a6c6069a18470eb92d2298acf25463f14256d24778e1230d789a2aec"
-dependencies = [
- "bitflags 2.10.0",
- "block2 0.6.2",
- "libc",
- "objc2 0.6.3",
-]
-
-[[package]]
-name = "displaydoc"
-version = "0.2.5"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "97369cbbc041bc366949bc74d34658d6cda5621039731c6310521892a3a20ae0"
-dependencies = [
- "proc-macro2",
- "quote",
- "syn",
-]
-
[[package]]
name = "dlib"
version = "0.5.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "330c60081dcc4c72131f8eb70510f1ac07223e5d4163db481a04a0befcffa412"
dependencies = [
- "libloading",
+ "libloading 0.8.4",
]
[[package]]
-name = "document-features"
-version = "0.2.12"
+name = "dlv-list"
+version = "0.3.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "d4b8a88685455ed29a21542a33abd9cb6510b6b129abadabdcef0f4c55bc8f61"
-dependencies = [
- "litrs",
-]
+checksum = "0688c2a7f92e427f44895cd63841bff7b29f8d7a1648b9e7e07a4a365b2e1257"
[[package]]
name = "downcast-rs"
@@ -1170,48 +925,75 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "75b325c5dbd37f80359721ad39aca5a29fb04c89279657cffdda8736d0c0b9d2"
[[package]]
-name = "dpi"
-version = "0.1.2"
+name = "drm"
+version = "0.12.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "d8b14ccef22fc6f5a8f4d7d768562a182c04ce9a3b3157b91390b52ddfdf1a76"
+checksum = "98888c4bbd601524c11a7ed63f814b8825f420514f78e96f752c437ae9cbb5d1"
+dependencies = [
+ "bitflags 2.6.0",
+ "bytemuck",
+ "drm-ffi",
+ "drm-fourcc",
+ "rustix",
+]
+
+[[package]]
+name = "drm-ffi"
+version = "0.8.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "97c98727e48b7ccb4f4aea8cfe881e5b07f702d17b7875991881b41af7278d53"
+dependencies = [
+ "drm-sys",
+ "rustix",
+]
+
+[[package]]
+name = "drm-fourcc"
+version = "2.2.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "0aafbcdb8afc29c1a7ee5fbe53b5d62f4565b35a042a662ca9fecd0b54dae6f4"
+
+[[package]]
+name = "drm-sys"
+version = "0.7.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "fd39dde40b6e196c2e8763f23d119ddb1a8714534bf7d77fa97a65b0feda3986"
+dependencies = [
+ "libc",
+ "linux-raw-sys 0.6.4",
+]
[[package]]
name = "either"
-version = "1.15.0"
+version = "1.13.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "48c757948c5ede0e46177b7add2e67155f70e33c07fea8284df6576da70b3719"
+checksum = "60b1af1c220855b6ceac025d3f6ecdd2b7c4894bfe9cd9bda4fbb4bc7c0d4cf0"
[[package]]
name = "embed-resource"
-version = "3.0.6"
+version = "2.4.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "55a075fc573c64510038d7ee9abc7990635863992f83ebc52c8b433b8411a02e"
+checksum = "c6985554d0688b687c5cb73898a34fbe3ad6c24c58c238a4d91d5e840670ee9d"
dependencies = [
"cc",
"memchr",
"rustc_version",
"toml",
"vswhom",
- "winreg 0.55.0",
+ "winreg 0.52.0",
]
[[package]]
name = "endi"
-version = "1.1.1"
+version = "1.1.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "66b7e2430c6dff6a955451e2cfc438f09cea1965a9d6f87f7e3b90decc014099"
-
-[[package]]
-name = "endian-type"
-version = "0.1.2"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "c34f04666d835ff5d62e058c3995147c06f42fe86ff053337632bca83e42702d"
+checksum = "a3d8a32ae18130a3c84dd492d4215c3d913c3b07c6b63c2eb3eb7ff1101ab7bf"
[[package]]
name = "enumflags2"
-version = "0.7.12"
+version = "0.7.10"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "1027f7680c853e056ebcec683615fb6fbbc07dbaa13b4d5d9442b146ded4ecef"
+checksum = "d232db7f5956f3f14313dc2f87985c58bd2c695ce124c8cdd984e08e15ac133d"
dependencies = [
"enumflags2_derive",
"serde",
@@ -1219,62 +1001,42 @@ dependencies = [
[[package]]
name = "enumflags2_derive"
-version = "0.7.12"
+version = "0.7.10"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "67c78a4d8fdf9953a5c9d458f9efe940fd97a0cab0941c075a813ac594733827"
+checksum = "de0d48a183585823424a4ce1aa132d174a6a81bd540895822eb4c8373a8e49e8"
dependencies = [
"proc-macro2",
"quote",
- "syn",
-]
-
-[[package]]
-name = "equator"
-version = "0.4.2"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "4711b213838dfee0117e3be6ac926007d7f433d7bbe33595975d4190cb07e6fc"
-dependencies = [
- "equator-macro",
-]
-
-[[package]]
-name = "equator-macro"
-version = "0.4.2"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "44f23cf4b44bfce11a86ace86f8a73ffdec849c9fd00a386a53d278bd9e81fb3"
-dependencies = [
- "proc-macro2",
- "quote",
- "syn",
+ "syn 2.0.70",
]
[[package]]
name = "equivalent"
-version = "1.0.2"
+version = "1.0.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "877a4ace8713b0bcf2a4e7eec82529c029f1d0619886d18145fea96c3ffe5c0f"
+checksum = "5443807d6dff69373d433ab9ef5378ad8df50ca6298caf15de6e52e24aaf54d5"
[[package]]
name = "errno"
-version = "0.3.14"
+version = "0.3.9"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "39cab71617ae0d63f51a36d69f866391735b51691dbda63cf6f96d042b63efeb"
+checksum = "534c5cf6194dfab3db3242765c03bbe257cf92f22b38f6bc0c58d59108a820ba"
dependencies = [
"libc",
- "windows-sys 0.61.2",
+ "windows-sys 0.52.0",
]
[[package]]
name = "error-code"
-version = "3.3.2"
+version = "3.2.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "dea2df4cf52843e0452895c455a1a2cfbb842a1e7329671acf418fdc53ed4c59"
+checksum = "a0474425d51df81997e2f90a21591180b38eccf27292d755f3e30750225c175b"
[[package]]
name = "etagere"
-version = "0.2.15"
+version = "0.2.13"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "fc89bf99e5dc15954a60f707c1e09d7540e5cd9af85fa75caa0b510bc08c5342"
+checksum = "0e2f1e3be19fb10f549be8c1bf013e8675b4066c445e36eb76d2ebb2f54ee495"
dependencies = [
"euclid",
"svg_fmt",
@@ -1282,24 +1044,18 @@ dependencies = [
[[package]]
name = "euclid"
-version = "0.22.13"
+version = "0.22.10"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "df61bf483e837f88d5c2291dcf55c67be7e676b3a51acc48db3a7b163b91ed63"
+checksum = "e0f0eb73b934648cd7a4a61f1b15391cd95dab0b4da6e2e66c2a072c144b4a20"
dependencies = [
"num-traits",
]
[[package]]
name = "event-listener"
-version = "2.5.3"
+version = "5.3.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "0206175f82b8d6bf6652ff7d71a1e27fd2e4efde587fd368662814d6ec1d9ce0"
-
-[[package]]
-name = "event-listener"
-version = "5.4.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "e13b66accf52311f30a0db42147dadea9850cb48cd070028831ae5f5d4b856ab"
+checksum = "6032be9bd27023a771701cc49f9f053c751055f71efb2e0ae5c15809093675ba"
dependencies = [
"concurrent-queue",
"parking",
@@ -1308,21 +1064,22 @@ dependencies = [
[[package]]
name = "event-listener-strategy"
-version = "0.5.4"
+version = "0.5.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "8be9f3dfaaffdae2972880079a491a1a8bb7cbed0b8dd7a347f668b4150a3b93"
+checksum = "0f214dc438f977e6d4e3500aaa277f5ad94ca83fbbd9b1a15713ce2344ccc5a1"
dependencies = [
- "event-listener 5.4.1",
+ "event-listener",
"pin-project-lite",
]
[[package]]
name = "exr"
-version = "1.74.0"
+version = "1.72.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "4300e043a56aa2cb633c01af81ca8f699a321879a7854d3896a0ba89056363be"
+checksum = "887d93f60543e9a9362ef8a21beedd0a833c5d9610e18c67abe15a5963dcb1a4"
dependencies = [
"bit_field",
+ "flume",
"half",
"lebe",
"miniz_oxide",
@@ -1331,57 +1088,32 @@ dependencies = [
"zune-inflate",
]
+[[package]]
+name = "fast-srgb8"
+version = "1.0.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "dd2e7510819d6fbf51a5545c8f922716ecfb14df168a3242f7d33e0239efe6a1"
+
[[package]]
name = "fastrand"
-version = "2.3.0"
+version = "2.1.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "37909eebbb50d72f9059c3b6d82c0463f2ff062c9e95845c43a6c9c0355411be"
-
-[[package]]
-name = "fax"
-version = "0.2.6"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "f05de7d48f37cd6730705cbca900770cab77a89f413d23e100ad7fad7795a0ab"
-dependencies = [
- "fax_derive",
-]
-
-[[package]]
-name = "fax_derive"
-version = "0.2.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "a0aca10fb742cb43f9e7bb8467c91aa9bcb8e3ffbc6a6f7389bb93ffc920577d"
-dependencies = [
- "proc-macro2",
- "quote",
- "syn",
-]
-
-[[package]]
-name = "fd-lock"
-version = "4.0.4"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "0ce92ff622d6dadf7349484f42c93271a0d49b7cc4d466a936405bacbe10aa78"
-dependencies = [
- "cfg-if",
- "rustix 1.1.3",
- "windows-sys 0.59.0",
-]
+checksum = "9fc0510504f03c51ada170672ac806f1f105a88aa97a5281117e1ddc3368e51a"
[[package]]
name = "fdeflate"
-version = "0.3.7"
+version = "0.3.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "1e6853b52649d4ac5c0bd02320cddc5ba956bdb407c4b75a2c6b75bf51500f8c"
+checksum = "4f9bfee30e4dedf0ab8b422f03af778d9612b63f502710fc500a334ebe2de645"
dependencies = [
"simd-adler32",
]
[[package]]
name = "fern"
-version = "0.7.1"
+version = "0.6.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "4316185f709b23713e41e3195f90edef7fb00c3ed4adc79769cf09cc762a3b29"
+checksum = "d9f0c14694cbd524c8720dd69b0e3179344f04ebb5f90f2e4a440c6ea3b2f1ee"
dependencies = [
"colored",
"log",
@@ -1389,73 +1121,65 @@ dependencies = [
[[package]]
name = "filetime"
-version = "0.2.27"
+version = "0.2.23"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "f98844151eee8917efc50bd9e8318cb963ae8b297431495d3f758616ea5c57db"
+checksum = "1ee447700ac8aa0b2f2bd7bc4462ad686ba06baa6727ac149a2d6277f0d240fd"
dependencies = [
"cfg-if",
"libc",
- "libredox",
+ "redox_syscall 0.4.1",
+ "windows-sys 0.52.0",
]
-[[package]]
-name = "find-msvc-tools"
-version = "0.1.9"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "5baebc0774151f905a1a2cc41989300b1e6fbb29aff0ceffa1064fdd3088d582"
-
[[package]]
name = "flate2"
-version = "1.1.9"
+version = "1.0.30"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "843fba2746e448b37e26a819579957415c8cef339bf08564fe8b7ddbd959573c"
+checksum = "5f54427cfd1c7829e2a139fcefea601bf088ebca651d2bf53ebc600eac295dae"
dependencies = [
"crc32fast",
"miniz_oxide",
]
[[package]]
-name = "foldhash"
-version = "0.1.5"
+name = "flume"
+version = "0.11.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "d9c4f5dac5e15c24eb999c26181a6ca40b39fe946cbe4c263c7209467bc83af2"
-
-[[package]]
-name = "foldhash"
-version = "0.2.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "77ce24cb58228fbb8aa041425bb1050850ac19177686ea6e0f41a70416f56fdb"
+checksum = "55ac459de2512911e4b674ce33cf20befaba382d05b62b008afc1c8b57cbf181"
+dependencies = [
+ "spin",
+]
[[package]]
name = "font-types"
-version = "0.10.1"
+version = "0.5.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "39a654f404bbcbd48ea58c617c2993ee91d1cb63727a37bf2323a4edeed1b8c5"
+checksum = "34fd7136aca682873d859ef34494ab1a7d3f57ecd485ed40eb6437ee8c85aa29"
dependencies = [
"bytemuck",
]
[[package]]
name = "fontconfig-parser"
-version = "0.5.8"
+version = "0.5.6"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "bbc773e24e02d4ddd8395fd30dc147524273a83e54e0f312d986ea30de5f5646"
+checksum = "6a595cb550439a117696039dfc69830492058211b771a2a165379f2a1a53d84d"
dependencies = [
"roxmltree",
]
[[package]]
name = "fontdb"
-version = "0.23.0"
+version = "0.15.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "457e789b3d1202543297a350643cf459f836cade38934e7a4cf6a39e7cde2905"
+checksum = "020e203f177c0fb250fb19455a252e838d2bbbce1f80f25ecc42402aafa8cd38"
dependencies = [
"fontconfig-parser",
"log",
- "memmap2",
+ "memmap2 0.8.0",
"slotmap",
"tinyvec",
- "ttf-parser",
+ "ttf-parser 0.19.2",
]
[[package]]
@@ -1476,7 +1200,7 @@ checksum = "1a5c6c585bc94aaf2c7b51dd4c2ba22680844aba4c687be581871a6f518c5742"
dependencies = [
"proc-macro2",
"quote",
- "syn",
+ "syn 2.0.70",
]
[[package]]
@@ -1487,18 +1211,18 @@ checksum = "aa9a19cbb55df58761df49b23516a86d432839add4af60fc256da840f66ed35b"
[[package]]
name = "form_urlencoded"
-version = "1.2.2"
+version = "1.2.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "cb4cb245038516f5f85277875cdaa4f7d2c9a0fa0468de06ed190163b1581fcf"
+checksum = "e13624c2627564efccf4934284bdd98cbaa14e79b0b5a141218e507b3a823456"
dependencies = [
"percent-encoding",
]
[[package]]
name = "futures"
-version = "0.3.31"
+version = "0.3.30"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "65bc07b1a8bc7c85c5f2e110c476c7389b4554ba72af57d8445ea63a576b0876"
+checksum = "645c6916888f6cb6350d2550b80fb63e734897a8498abe35cfb732b6487804b0"
dependencies = [
"futures-channel",
"futures-core",
@@ -1511,9 +1235,9 @@ dependencies = [
[[package]]
name = "futures-channel"
-version = "0.3.31"
+version = "0.3.30"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "2dff15bf788c671c1934e366d07e30c1814a8ef514e1af724a602e8a2fbe1b10"
+checksum = "eac8f7d7865dcb88bd4373ab671c8cf4508703796caa2b1985a9ca867b3fcb78"
dependencies = [
"futures-core",
"futures-sink",
@@ -1521,15 +1245,15 @@ dependencies = [
[[package]]
name = "futures-core"
-version = "0.3.31"
+version = "0.3.30"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "05f29059c0c2090612e8d742178b0580d2dc940c837851ad723096f87af6663e"
+checksum = "dfc6580bb841c5a68e9ef15c77ccc837b40a7504914d52e47b8b0e9bbda25a1d"
[[package]]
name = "futures-executor"
-version = "0.3.31"
+version = "0.3.30"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "1e28d1d997f585e54aebc3f97d39e72338912123a67330d723fdbb564d646c9f"
+checksum = "a576fc72ae164fca6b9db127eaa9a9dda0d61316034f33a0a0d4eda41f02b01d"
dependencies = [
"futures-core",
"futures-task",
@@ -1539,15 +1263,15 @@ dependencies = [
[[package]]
name = "futures-io"
-version = "0.3.31"
+version = "0.3.30"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "9e5c1b78ca4aae1ac06c48a526a655760685149f0d465d21f37abfe57ce075c6"
+checksum = "a44623e20b9681a318efdd71c299b6b222ed6f231972bfe2f224ebad6311f0c1"
[[package]]
name = "futures-lite"
-version = "2.6.1"
+version = "2.3.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "f78e10609fe0e0b3f4157ffab1876319b5b0db102a2c60dc4626306dc46b44ad"
+checksum = "52527eb5074e35e9339c6b4e8d12600c7128b68fb25dcb9fa9dec18f7c25f3a5"
dependencies = [
"fastrand",
"futures-core",
@@ -1558,32 +1282,32 @@ dependencies = [
[[package]]
name = "futures-macro"
-version = "0.3.31"
+version = "0.3.30"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "162ee34ebcb7c64a8abebc059ce0fee27c2262618d7b60ed8faf72fef13c3650"
+checksum = "87750cf4b7a4c0625b1529e4c543c2182106e4dedc60a2a6455e00d212c489ac"
dependencies = [
"proc-macro2",
"quote",
- "syn",
+ "syn 2.0.70",
]
[[package]]
name = "futures-sink"
-version = "0.3.31"
+version = "0.3.30"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "e575fab7d1e0dcb8d0c7bcf9a63ee213816ab51902e6d244a95819acacf1d4f7"
+checksum = "9fb8e00e87438d937621c1c6269e53f536c14d3fbd6a042bb24879e57d474fb5"
[[package]]
name = "futures-task"
-version = "0.3.31"
+version = "0.3.30"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "f90f7dce0722e95104fcb095585910c0977252f286e354b5e3bd38902cd99988"
+checksum = "38d84fa142264698cdce1a9f9172cf383a0c82de1bddcf3092901442c4097004"
[[package]]
name = "futures-util"
-version = "0.3.31"
+version = "0.3.30"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "9fa08315bb612088cc391249efdc3bc77536f16c91f6cf495e6fbe85b20a4a81"
+checksum = "3d6401deb83407ab3da39eba7e33987a73c3df0c82b4bb5813ee871c19c41d48"
dependencies = [
"futures-channel",
"futures-core",
@@ -1598,56 +1322,41 @@ dependencies = [
]
[[package]]
-name = "gethostname"
-version = "1.1.0"
+name = "generic-array"
+version = "0.14.7"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "1bd49230192a3797a9a4d6abe9b3eed6f7fa4c8a8a4947977c6f80025f92cbd8"
+checksum = "85649ca51fd72272d7821adaf274ad91c288277713d9c18820d8499a7ff69e9a"
dependencies = [
- "rustix 1.1.3",
- "windows-link",
+ "typenum",
+ "version_check",
+]
+
+[[package]]
+name = "gethostname"
+version = "0.4.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "0176e0459c2e4a1fe232f984bca6890e681076abb9934f6cea7c326f3fc47818"
+dependencies = [
+ "libc",
+ "windows-targets 0.48.5",
]
[[package]]
name = "getrandom"
-version = "0.2.17"
+version = "0.2.15"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "ff2abc00be7fca6ebc474524697ae276ad847ad0a6b3faa4bcb027e9a4614ad0"
+checksum = "c4567c8db10ae91089c99af84c68c38da3ec2f087c3f82960bcdbf3656b6f4d7"
dependencies = [
"cfg-if",
"libc",
"wasi",
]
-[[package]]
-name = "getrandom"
-version = "0.3.4"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "899def5c37c4fd7b2664648c28120ecec138e4d395b459e5ca34f9cce2dd77fd"
-dependencies = [
- "cfg-if",
- "libc",
- "r-efi",
- "wasip2",
-]
-
-[[package]]
-name = "getrandom"
-version = "0.4.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "139ef39800118c7683f2fd3c98c1b23c09ae076556b435f8e9064ae108aaeeec"
-dependencies = [
- "cfg-if",
- "libc",
- "r-efi",
- "wasip2",
- "wasip3",
-]
-
[[package]]
name = "gif"
-version = "0.14.1"
+version = "0.13.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "f5df2ba84018d80c213569363bdcd0c64e6933c67fe4c1d60ecf822971a3c35e"
+checksum = "3fb2d69b19215e18bb912fa30f7ce15846e301408695e44e0ef719f1da9e19f2"
dependencies = [
"color_quant",
"weezl",
@@ -1670,23 +1379,11 @@ version = "0.25.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "151665d9be52f9bb40fc7966565d39666f2d1e69233571b71b87791c7e0528b3"
-[[package]]
-name = "gloo-timers"
-version = "0.3.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "bbb143cf96099802033e0d4f4963b19fd2e0b728bcf076cd9cf7f6634f092994"
-dependencies = [
- "futures-channel",
- "futures-core",
- "js-sys",
- "wasm-bindgen",
-]
-
[[package]]
name = "glow"
-version = "0.16.0"
+version = "0.13.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "c5e5ea60d70410161c8bf5da3fdfeaa1c72ed2c15f8bbb9d19fe3a4fad085f08"
+checksum = "bd348e04c43b32574f2de31c8bb397d96c9fcfa1371bd4ca6d8bdc464ab121b1"
dependencies = [
"js-sys",
"slotmap",
@@ -1696,20 +1393,32 @@ dependencies = [
[[package]]
name = "glutin_wgl_sys"
-version = "0.6.1"
+version = "0.5.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "2c4ee00b289aba7a9e5306d57c2d05499b2e5dc427f84ac708bd2c090212cf3e"
+checksum = "6c8098adac955faa2d31079b65dc48841251f69efd3ac25477903fc424362ead"
dependencies = [
"gl_generator",
]
+[[package]]
+name = "glyphon"
+version = "0.5.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "6a62d0338e4056db6a73221c2fb2e30619452f6ea9651bac4110f51b0f7a7581"
+dependencies = [
+ "cosmic-text",
+ "etagere",
+ "lru",
+ "wgpu",
+]
+
[[package]]
name = "gpu-alloc"
version = "0.6.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "fbcd2dba93594b227a1f57ee09b8b9da8892c34d55aa332e034a228d0fe6a171"
dependencies = [
- "bitflags 2.10.0",
+ "bitflags 2.6.0",
"gpu-alloc-types",
]
@@ -1719,39 +1428,40 @@ version = "0.3.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "98ff03b468aa837d70984d55f5d3f846f6ec31fe34bbb97c4f85219caeee1ca4"
dependencies = [
- "bitflags 2.10.0",
+ "bitflags 2.6.0",
]
[[package]]
name = "gpu-allocator"
-version = "0.27.0"
+version = "0.25.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "c151a2a5ef800297b4e79efa4f4bec035c5f51d5ae587287c9b952bdf734cacd"
+checksum = "6f56f6318968d03c18e1bcf4857ff88c61157e9da8e47c5f29055d60e1228884"
dependencies = [
"log",
"presser",
- "thiserror 1.0.69",
- "windows 0.58.0",
+ "thiserror",
+ "winapi",
+ "windows",
]
[[package]]
name = "gpu-descriptor"
-version = "0.3.2"
+version = "0.2.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "b89c83349105e3732062a895becfc71a8f921bb71ecbbdd8ff99263e3b53a0ca"
+checksum = "cc11df1ace8e7e564511f53af41f3e42ddc95b56fd07b3f4445d2a6048bc682c"
dependencies = [
- "bitflags 2.10.0",
+ "bitflags 2.6.0",
"gpu-descriptor-types",
- "hashbrown 0.15.5",
+ "hashbrown 0.14.5",
]
[[package]]
name = "gpu-descriptor-types"
-version = "0.2.0"
+version = "0.1.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "fdf242682df893b86f33a73828fb09ca4b2d3bb6cc95249707fc684d27484b91"
+checksum = "6bf0b36e6f090b7e1d8a4b49c0cb81c1f8376f72198c65dd3ad9ff3556b8b78c"
dependencies = [
- "bitflags 2.10.0",
+ "bitflags 2.6.0",
]
[[package]]
@@ -1766,58 +1476,59 @@ dependencies = [
[[package]]
name = "half"
-version = "2.7.1"
+version = "2.4.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "6ea2d84b969582b4b1864a92dc5d27cd2b77b622a8d79306834f1be5ba20d84b"
+checksum = "6dd08c532ae367adf81c312a4580bc67f1d0fe8bc9c460520283f4c0ff277888"
dependencies = [
"cfg-if",
"crunchy",
- "num-traits",
- "zerocopy",
-]
-
-[[package]]
-name = "harfrust"
-version = "0.3.2"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "92c020db12c71d8a12a3fe7607873cade3a01a6287e29d540c8723276221b9d8"
-dependencies = [
- "bitflags 2.10.0",
- "bytemuck",
- "core_maths",
- "read-fonts",
- "smallvec",
]
[[package]]
name = "hashbrown"
-version = "0.15.5"
+version = "0.12.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "9229cfe53dfd69f0609a49f65461bd93001ea1ef889cd5529dd176593f5338a1"
+checksum = "8a9ee70c43aaf417c914396645a0fa852624801b24ebb7ae78fe8272889ac888"
dependencies = [
- "foldhash 0.1.5",
+ "ahash 0.7.8",
]
[[package]]
name = "hashbrown"
-version = "0.16.1"
+version = "0.14.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "841d1cc9bed7f9236f321df977030373f4a4163ae1a7dbfe1a51a2c1a51d9100"
+checksum = "e5274423e17b7c9fc20b6e7e208532f9b19825d82dfd615708b70edd83df41f1"
dependencies = [
- "foldhash 0.2.0",
+ "ahash 0.8.11",
+ "allocator-api2",
]
[[package]]
-name = "heck"
-version = "0.5.0"
+name = "hassle-rs"
+version = "0.11.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea"
+checksum = "af2a7e73e1f34c48da31fb668a907f250794837e08faa144fd24f0b8b741e890"
+dependencies = [
+ "bitflags 2.6.0",
+ "com",
+ "libc",
+ "libloading 0.8.4",
+ "thiserror",
+ "widestring",
+ "winapi",
+]
[[package]]
name = "hermit-abi"
-version = "0.5.2"
+version = "0.3.9"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "fc0fef456e4baa96da950455cd02c081ca953b141298e41db3fc7e36b1da849c"
+checksum = "d231dfb89cfffdbc30e7fc41579ed6066ad03abda9e567ccafae602b97ec5024"
+
+[[package]]
+name = "hermit-abi"
+version = "0.4.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "fbf6a919d6cf397374f7dfeeea91d974c7c0a7221d0d0f4f20d859d329e53fcc"
[[package]]
name = "hex"
@@ -1831,44 +1542,18 @@ version = "0.2.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "dfa686283ad6dd069f105e5ab091b04c62850d3e4cf5d67debad1933f55023df"
-[[package]]
-name = "home"
-version = "0.5.12"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "cc627f471c528ff0c4a49e1d5e60450c8f6461dd6d10ba9dcd3a61d3dff7728d"
-dependencies = [
- "windows-sys 0.61.2",
-]
-
-[[package]]
-name = "http"
-version = "1.4.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "e3ba2a386d7f85a81f119ad7498ebe444d2e22c2af0b86b069416ace48b3311a"
-dependencies = [
- "bytes",
- "itoa",
-]
-
-[[package]]
-name = "httparse"
-version = "1.10.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "6dbf3de79e51f3d586ab4cb9d5c3e2c14aa28ed23d180cf89b4df0454a69cc87"
-
[[package]]
name = "iana-time-zone"
-version = "0.1.65"
+version = "0.1.60"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "e31bc9ad994ba00e440a8aa5c9ef0ec67d5cb5e5cb0cc7f8b744a35b389cc470"
+checksum = "e7ffbb5a1b541ea2561f8c41c087286cc091e21e556a4f09a8f6cbf17b69b141"
dependencies = [
"android_system_properties",
"core-foundation-sys",
"iana-time-zone-haiku",
"js-sys",
- "log",
"wasm-bindgen",
- "windows-core 0.62.2",
+ "windows-core",
]
[[package]]
@@ -1882,71 +1567,57 @@ dependencies = [
[[package]]
name = "iced"
-version = "0.14.0"
+version = "0.12.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "000e01026c93ba643f8357a3db3ada0e6555265a377f6f9291c472f6dd701fb3"
+checksum = "7d4eb0fbbefb8c428b70680e77ed9013887b17c1d6be366b40f264f956d1a096"
dependencies = [
"iced_core",
- "iced_debug",
"iced_futures",
"iced_renderer",
- "iced_runtime",
"iced_widget",
"iced_winit",
"image",
- "thiserror 2.0.18",
+ "thiserror",
]
[[package]]
name = "iced_core"
-version = "0.14.0"
+version = "0.12.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "91ab1937d699403e7e69252ae743a902bcee9f4ab2052cc4c9a46fcf34729d85"
+checksum = "7d7e6bbd197f311ed3d8b71651876b0ce01318fde52cda862a9a7a4373c9b930"
dependencies = [
- "bitflags 2.10.0",
- "bytes",
+ "bitflags 2.6.0",
"glam",
- "lilt",
"log",
"num-traits",
- "rustc-hash 2.1.1",
+ "palette",
+ "raw-window-handle",
"smol_str",
- "thiserror 2.0.18",
+ "thiserror",
"web-time",
-]
-
-[[package]]
-name = "iced_debug"
-version = "0.14.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "25035ab0215a620e53f4103e36fc4e59a1fb2817e4bfc38a30ad27b4202ea0be"
-dependencies = [
- "iced_core",
- "iced_futures",
- "log",
+ "xxhash-rust",
]
[[package]]
name = "iced_futures"
-version = "0.14.0"
+version = "0.12.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "8c0c85ccad42dfbec7293c36c018af0ea0dbcc52d137a4a9a0b0f6822a3fdf0a"
+checksum = "370bad88fb3832cbeeb3fa6c486b4701fb7e8da32a753b3101d4ce81fc1d9497"
dependencies = [
"futures",
"iced_core",
"log",
- "rustc-hash 2.1.1",
"wasm-bindgen-futures",
- "wasmtimer",
+ "wasm-timer",
]
[[package]]
name = "iced_graphics"
-version = "0.14.0"
+version = "0.12.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "234ca1c2cec4155055f68fa5fad1b5242c496ac8238d80a259bca382fb44a102"
+checksum = "6a044c193ef0840eacabfa05424717331d1fc5b3ecb9a89316200c75da2ba9a4"
dependencies = [
- "bitflags 2.10.0",
+ "bitflags 2.6.0",
"bytemuck",
"cosmic-text",
"half",
@@ -1955,309 +1626,191 @@ dependencies = [
"image",
"kamadak-exif",
"log",
+ "once_cell",
"raw-window-handle",
- "rustc-hash 2.1.1",
- "thiserror 2.0.18",
+ "rustc-hash",
+ "thiserror",
"unicode-segmentation",
-]
-
-[[package]]
-name = "iced_program"
-version = "0.14.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "6dfafec2947cda688d8eb00dac337ba11aa60f9ef6335aed343e189d26e4a673"
-dependencies = [
- "iced_graphics",
- "iced_runtime",
+ "xxhash-rust",
]
[[package]]
name = "iced_renderer"
-version = "0.14.0"
+version = "0.12.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "250cc0802408e8c077986ec56c7d07c65f423ee658a4b9fd795a1f2aae5dac05"
+checksum = "5c281e03001d566058f53dec9325bbe61c62da715341206d2627f57a3ecc7f69"
dependencies = [
"iced_graphics",
"iced_tiny_skia",
"iced_wgpu",
"log",
- "thiserror 2.0.18",
+ "thiserror",
]
[[package]]
name = "iced_runtime"
-version = "0.14.0"
+version = "0.12.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "d1889b819ce4c06674183242e336c8d49465665441396914dc07cc86f44fa8d4"
+checksum = "a79f852c01cc6d61663c94379cb3974ac3ad315a28c504e847d573e094f46822"
dependencies = [
- "bytes",
"iced_core",
"iced_futures",
"raw-window-handle",
- "thiserror 2.0.18",
+ "thiserror",
+]
+
+[[package]]
+name = "iced_style"
+version = "0.12.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "2ea42a740915d2a5a9ff9c3aa0bca28b16e9fb660bc8f675eed71d186cadb579"
+dependencies = [
+ "iced_core",
+ "once_cell",
+ "palette",
]
[[package]]
name = "iced_tiny_skia"
-version = "0.14.0"
+version = "0.12.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "fe0acf8b75a3bc914aff5f2329fdffc1b36eeaea29dda0e4bd232f1c62e9cc3d"
+checksum = "8c2228781f4d381a1cbbd7905a9f077351aa8d37269094021d5d9e779f130aff"
dependencies = [
"bytemuck",
"cosmic-text",
- "iced_debug",
"iced_graphics",
"kurbo",
"log",
- "rustc-hash 2.1.1",
+ "rustc-hash",
"softbuffer",
"tiny-skia",
+ "xxhash-rust",
]
[[package]]
name = "iced_wgpu"
-version = "0.14.0"
+version = "0.12.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "ff144a999b0ca0f8a10257934500060240825c42e950ec0ebee9c8ae30561c13"
+checksum = "e3c243b6700452886aac1ee1987e84d9fb43b56b53fea9a1eb67713fd0fde244"
dependencies = [
- "bitflags 2.10.0",
+ "bitflags 2.6.0",
"bytemuck",
- "cryoglyph",
"futures",
"glam",
+ "glyphon",
"guillotiere",
- "iced_debug",
"iced_graphics",
"log",
- "rustc-hash 2.1.1",
- "thiserror 2.0.18",
+ "once_cell",
"wgpu",
]
[[package]]
name = "iced_widget"
-version = "0.14.2"
+version = "0.12.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "b1596afa0d3109c2618e8bc12bae6c11d3064df8f95c42dfce570397dbe957ab"
+checksum = "7e01b2212adecf1cb80e2267f302c0e0c263e55f97812056949199ccf9f0b908"
dependencies = [
"iced_renderer",
- "log",
+ "iced_runtime",
+ "iced_style",
"num-traits",
- "rustc-hash 2.1.1",
- "thiserror 2.0.18",
+ "thiserror",
"unicode-segmentation",
]
[[package]]
name = "iced_winit"
-version = "0.14.0"
+version = "0.12.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "8b7dbedc47562d1de3b9707d939f678b88c382004b7ab5a18f7a7dd723162d75"
+checksum = "63f66831d0e399b93f631739121a6171780d344b275d56808b9504d8ca75c7d2"
dependencies = [
- "iced_debug",
- "iced_program",
+ "iced_graphics",
+ "iced_runtime",
+ "iced_style",
"log",
- "mundy",
- "rustc-hash 2.1.1",
- "thiserror 2.0.18",
+ "thiserror",
"tracing",
- "wasm-bindgen-futures",
"web-sys",
+ "winapi",
"window_clipboard",
"winit",
]
[[package]]
-name = "icu_collections"
-version = "2.1.1"
+name = "icrate"
+version = "0.0.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "4c6b649701667bbe825c3b7e6388cb521c23d88644678e83c0c4d0a621a34b43"
+checksum = "99d3aaff8a54577104bafdf686ff18565c3b6903ca5782a2026ef06e2c7aa319"
dependencies = [
- "displaydoc",
- "potential_utf",
- "yoke",
- "zerofrom",
- "zerovec",
+ "block2 0.3.0",
+ "dispatch",
+ "objc2 0.4.1",
]
-[[package]]
-name = "icu_locale_core"
-version = "2.1.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "edba7861004dd3714265b4db54a3c390e880ab658fec5f7db895fae2046b5bb6"
-dependencies = [
- "displaydoc",
- "litemap",
- "tinystr",
- "writeable",
- "zerovec",
-]
-
-[[package]]
-name = "icu_normalizer"
-version = "2.1.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "5f6c8828b67bf8908d82127b2054ea1b4427ff0230ee9141c54251934ab1b599"
-dependencies = [
- "icu_collections",
- "icu_normalizer_data",
- "icu_properties",
- "icu_provider",
- "smallvec",
- "zerovec",
-]
-
-[[package]]
-name = "icu_normalizer_data"
-version = "2.1.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "7aedcccd01fc5fe81e6b489c15b247b8b0690feb23304303a9e560f37efc560a"
-
-[[package]]
-name = "icu_properties"
-version = "2.1.2"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "020bfc02fe870ec3a66d93e677ccca0562506e5872c650f893269e08615d74ec"
-dependencies = [
- "icu_collections",
- "icu_locale_core",
- "icu_properties_data",
- "icu_provider",
- "zerotrie",
- "zerovec",
-]
-
-[[package]]
-name = "icu_properties_data"
-version = "2.1.2"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "616c294cf8d725c6afcd8f55abc17c56464ef6211f9ed59cccffe534129c77af"
-
-[[package]]
-name = "icu_provider"
-version = "2.1.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "85962cf0ce02e1e0a629cc34e7ca3e373ce20dda4c4d7294bbd0bf1fdb59e614"
-dependencies = [
- "displaydoc",
- "icu_locale_core",
- "writeable",
- "yoke",
- "zerofrom",
- "zerotrie",
- "zerovec",
-]
-
-[[package]]
-name = "id-arena"
-version = "2.3.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "3d3067d79b975e8844ca9eb072e16b31c3c1c36928edf9c6789548c524d0d954"
-
[[package]]
name = "idna"
-version = "1.1.0"
+version = "0.5.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "3b0875f23caa03898994f6ddc501886a45c7d3d62d04d2d90788d47be1b1e4de"
+checksum = "634d9b1461af396cad843f47fdba5597a4f9e6ddd4bfb6ff5d85028c25cb12f6"
dependencies = [
- "idna_adapter",
- "smallvec",
- "utf8_iter",
-]
-
-[[package]]
-name = "idna_adapter"
-version = "1.2.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "3acae9609540aa318d1bc588455225fb2085b9ed0c4f6bd0d9d5bcd86f1a0344"
-dependencies = [
- "icu_normalizer",
- "icu_properties",
+ "unicode-bidi",
+ "unicode-normalization",
]
[[package]]
name = "image"
-version = "0.25.9"
+version = "0.24.9"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "e6506c6c10786659413faa717ceebcb8f70731c0a60cbae39795fdf114519c1a"
+checksum = "5690139d2f55868e080017335e4b94cb7414274c74f1669c84fb5feba2c9f69d"
dependencies = [
"bytemuck",
- "byteorder-lite",
+ "byteorder",
"color_quant",
"exr",
"gif",
- "image-webp",
- "moxcms",
+ "jpeg-decoder",
"num-traits",
"png",
"qoi",
- "ravif",
- "rayon",
- "rgb",
"tiff",
- "zune-core 0.5.1",
- "zune-jpeg 0.5.12",
]
-[[package]]
-name = "image-webp"
-version = "0.2.4"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "525e9ff3e1a4be2fbea1fdf0e98686a6d98b4d8f937e1bf7402245af1909e8c3"
-dependencies = [
- "byteorder-lite",
- "quick-error",
-]
-
-[[package]]
-name = "imgref"
-version = "1.12.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "e7c5cedc30da3a610cac6b4ba17597bdf7152cf974e8aab3afb3d54455e371c8"
-
[[package]]
name = "indexmap"
-version = "2.13.0"
+version = "2.2.6"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "7714e70437a7dc3ac8eb7e6f8df75fd8eb422675fc7678aff7364301092b1017"
+checksum = "168fb715dda47215e360912c096649d23d58bf392ac62f73919e831745e40f26"
dependencies = [
"equivalent",
- "hashbrown 0.16.1",
- "serde",
- "serde_core",
+ "hashbrown 0.14.5",
]
[[package]]
-name = "interpolate_name"
-version = "0.2.4"
+name = "instant"
+version = "0.1.13"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "c34819042dc3d3971c46c2190835914dfbe0c3c13f61449b2997f4e9722dfa60"
+checksum = "e0242819d153cba4b4b05a5a8f2a7e9bbf97b6055b2a002b395c96b5ff3c0222"
dependencies = [
- "proc-macro2",
- "quote",
- "syn",
+ "cfg-if",
]
[[package]]
-name = "is_terminal_polyfill"
-version = "1.70.2"
+name = "is-terminal"
+version = "0.4.12"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "a6cb138bb79a146c1bd460005623e142ef0181e3d0219cb493e02f7d08a35695"
-
-[[package]]
-name = "itertools"
-version = "0.14.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "2b192c782037fadd9cfa75548310488aabdbf3d2da73885b31bd0abd03351285"
+checksum = "f23ff5ef2b80d608d61efee834934d862cd92461afc0560dedf493e4c033738b"
dependencies = [
- "either",
+ "hermit-abi 0.3.9",
+ "libc",
+ "windows-sys 0.52.0",
]
[[package]]
name = "itoa"
-version = "1.0.17"
+version = "1.0.11"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "92ecc6618181def0457392ccd0ee51198e065e016d1d527a7ac1b6dc7c1f09d2"
+checksum = "49f1f14873335454500d59611f1cf4a4b0f786f9ac11f4312a78e4cf2566695b"
[[package]]
name = "jni"
@@ -2270,7 +1823,7 @@ dependencies = [
"combine",
"jni-sys",
"log",
- "thiserror 1.0.69",
+ "thiserror",
"walkdir",
"windows-sys 0.45.0",
]
@@ -2283,29 +1836,36 @@ checksum = "8eaf4bc02d17cbdd7ff4c7438cafcdf7fb9a4613313ad11b4f8fefe7d3fa0130"
[[package]]
name = "jobserver"
-version = "0.1.34"
+version = "0.1.31"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "9afb3de4395d6b3e67a780b6de64b51c978ecf11cb9a462c66be7d4ca9039d33"
+checksum = "d2b099aaa34a9751c5bf0878add70444e1ed2dd73f347be99003d4577277de6e"
dependencies = [
- "getrandom 0.3.4",
"libc",
]
[[package]]
-name = "js-sys"
-version = "0.3.85"
+name = "jpeg-decoder"
+version = "0.3.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "8c942ebf8e95485ca0d52d97da7c5a2c387d0e7f0ba4c35e93bfcaee045955b3"
+checksum = "f5d4a7da358eff58addd2877a45865158f0d78c911d43a5784ceb7bbf52833b0"
+dependencies = [
+ "rayon",
+]
+
+[[package]]
+name = "js-sys"
+version = "0.3.69"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "29c15563dc2726973df627357ce0c9ddddbea194836909d655df6a75d2cf296d"
dependencies = [
- "once_cell",
"wasm-bindgen",
]
[[package]]
name = "kamadak-exif"
-version = "0.6.1"
+version = "0.5.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "1130d80c7374efad55a117d715a3af9368f0fa7a2c54573afc15a188cd984837"
+checksum = "ef4fc70d0ab7e5b6bafa30216a6b48705ea964cdfc29c050f2412295eba58077"
dependencies = [
"mutate_once",
]
@@ -2317,7 +1877,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "6aae1df220ece3c0ada96b8153459b67eebe9ae9212258bb0134ae60416fdf76"
dependencies = [
"libc",
- "libloading",
+ "libloading 0.8.4",
"pkg-config",
]
@@ -2337,147 +1897,107 @@ dependencies = [
"smallvec",
]
-[[package]]
-name = "kv-log-macro"
-version = "1.0.7"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "0de8b303297635ad57c9f5059fd9cee7a47f8e8daa09df0fcd07dd39fb22977f"
-dependencies = [
- "log",
-]
-
[[package]]
name = "lazy_static"
version = "1.5.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "bbd2bcb4c963f2ddae06a2efc7e9f3591312473c50c6685e1f298068316e66fe"
-[[package]]
-name = "leb128fmt"
-version = "0.1.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "09edd9e8b54e49e587e4f6295a7d29c3ea94d469cb40ab8ca70b288248a81db2"
-
[[package]]
name = "lebe"
-version = "0.5.3"
+version = "0.5.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "7a79a3332a6609480d7d0c9eab957bca6b455b91bb84e66d19f5ff66294b85b8"
+checksum = "03087c2bad5e1034e8cace5926dec053fb3790248370865f5117a7d0213354c8"
[[package]]
name = "libc"
-version = "0.2.186"
+version = "0.2.155"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "68ab91017fe16c622486840e4c83c9a37afeff978bd239b5293d61ece587de66"
+checksum = "97b3888a4aecf77e811145cadf6eef5901f4782c53886191b2f693f24761847c"
[[package]]
-name = "libfuzzer-sys"
-version = "0.4.12"
+name = "libloading"
+version = "0.7.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "f12a681b7dd8ce12bff52488013ba614b869148d54dd79836ab85aafdd53f08d"
+checksum = "b67380fd3b2fbe7527a606e18729d21c6f3951633d0500574c4dc22d2d638b9f"
dependencies = [
- "arbitrary",
- "cc",
+ "cfg-if",
+ "winapi",
]
[[package]]
name = "libloading"
-version = "0.8.9"
+version = "0.8.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "d7c4b02199fee7c5d21a5ae7d8cfa79a6ef5bb2fc834d6e9058e89c825efdc55"
+checksum = "e310b3a6b5907f99202fcdb4960ff45b93735d7c7d96b760fcff8db2dc0e103d"
dependencies = [
"cfg-if",
- "windows-link",
+ "windows-targets 0.52.6",
]
[[package]]
name = "libm"
-version = "0.2.16"
+version = "0.2.8"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "b6d2cec3eae94f9f509c767b45932f1ada8350c4bdb85af2fcab4a3c14807981"
+checksum = "4ec2a862134d2a7d32d7983ddcdd1c4923530833c9f2ea1a44fc5fa473989058"
[[package]]
name = "libredox"
-version = "0.1.12"
+version = "0.0.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "3d0b95e02c851351f877147b7deea7b1afb1df71b63aa5f8270716e0c5720616"
+checksum = "3af92c55d7d839293953fcd0fda5ecfe93297cfde6ffbdec13b41d99c0ba6607"
dependencies = [
- "bitflags 2.10.0",
+ "bitflags 2.6.0",
"libc",
- "redox_syscall 0.7.1",
+ "redox_syscall 0.4.1",
]
[[package]]
-name = "lilt"
-version = "0.8.1"
+name = "libredox"
+version = "0.1.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "f67562e5eff6b20553fa9be1c503356768420994e28f67e3eafe6f41910e57ad"
+checksum = "c0ff37bd590ca25063e35af745c343cb7a0271906fb7b37e4813e8f79f00268d"
dependencies = [
- "web-time",
+ "bitflags 2.6.0",
+ "libc",
]
[[package]]
-name = "linebender_resource_handle"
-version = "0.1.1"
+name = "linux-raw-sys"
+version = "0.4.14"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "d4a5ff6bcca6c4867b1c4fd4ef63e4db7436ef363e0ad7531d1558856bae64f4"
+checksum = "78b3ae25bc7c8c38cec158d1f2757ee79e9b3740fbc7ccf0e59e4b08d793fa89"
[[package]]
name = "linux-raw-sys"
-version = "0.4.15"
+version = "0.6.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "d26c52dbd32dccf2d10cac7725f8eae5296885fb5703b261f7d0a0739ec807ab"
-
-[[package]]
-name = "linux-raw-sys"
-version = "0.11.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "df1d3c3b53da64cf5760482273a98e575c651a67eec7f77df96b5b642de8f039"
-
-[[package]]
-name = "litemap"
-version = "0.8.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "6373607a59f0be73a39b6fe456b8192fcc3585f602af20751600e974dd455e77"
-
-[[package]]
-name = "litrs"
-version = "1.0.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "11d3d7f243d5c5a8b9bb5d6dd2b1602c0cb0b9db1621bafc7ed66e35ff9fe092"
+checksum = "f0b5399f6804fbab912acbd8878ed3532d506b7c951b8f9f164ef90fef39e3f4"
[[package]]
name = "lock_api"
-version = "0.4.14"
+version = "0.4.12"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "224399e74b87b5f3557511d98dff8b14089b3dadafcab6bb93eab67d3aace965"
+checksum = "07af8b9cdd281b7915f413fa73f29ebd5d55d0d3f0155584dade1ff18cea1b17"
dependencies = [
+ "autocfg",
"scopeguard",
]
[[package]]
name = "log"
-version = "0.4.29"
+version = "0.4.22"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "5e5032e24019045c762d3c0f28f5b6b8bbf38563a65908389bf7978758920897"
-dependencies = [
- "value-bag",
-]
-
-[[package]]
-name = "loop9"
-version = "0.1.5"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "0fae87c125b03c1d2c0150c90365d7d6bcc53fb73a9acaef207d2d065860f062"
-dependencies = [
- "imgref",
-]
+checksum = "a7a70ba024b9dc04c27ea2f0c0548feb474ec5c54bba33a7f72f873a39d07b24"
[[package]]
name = "lru"
-version = "0.16.3"
+version = "0.12.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "a1dc47f592c06f33f8e3aea9591776ec7c9f9e4124778ff8a3c3b87159f7e593"
+checksum = "d3262e75e648fce39813cb56ac41f3c3e3f65217ebf3844d818d1f9398cfb0dc"
+dependencies = [
+ "hashbrown 0.14.5",
+]
[[package]]
name = "malloc_buf"
@@ -2488,27 +2008,26 @@ dependencies = [
"libc",
]
-[[package]]
-name = "maybe-rayon"
-version = "0.1.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "8ea1f30cedd69f0a2954655f7188c6a834246d2bcf1e315e2ac40c4b24dc9519"
-dependencies = [
- "cfg-if",
- "rayon",
-]
-
[[package]]
name = "memchr"
-version = "2.8.0"
+version = "2.7.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "f8ca58f447f06ed17d5fc4043ce1b10dd205e060fb3ce5b979b8ed8e59ff3f79"
+checksum = "78ca9ab1a0babb1e7d5695e3530886289c18cf2f87ec19a575a0abdce112e3a3"
[[package]]
name = "memmap2"
-version = "0.9.9"
+version = "0.8.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "744133e4a0e0a658e1374cf3bf8e415c4052a15a111acd372764c55b4177d490"
+checksum = "43a5a03cefb0d953ec0be133036f14e109412fa594edc2f77227249db66cc3ed"
+dependencies = [
+ "libc",
+]
+
+[[package]]
+name = "memmap2"
+version = "0.9.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "fe751422e4a8caa417e13c3ea66452215d7d63e19e604f4980461212f3ae1322"
dependencies = [
"libc",
]
@@ -2524,13 +2043,13 @@ dependencies = [
[[package]]
name = "metal"
-version = "0.32.0"
+version = "0.27.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "00c15a6f673ff72ddcc22394663290f870fb224c1bfce55734a75c414150e605"
+checksum = "c43f73953f8cbe511f021b58f18c3ce1c3d1ae13fe953293e13345bf83217f25"
dependencies = [
- "bitflags 2.10.0",
+ "bitflags 2.6.0",
"block",
- "core-graphics-types 0.2.0",
+ "core-graphics-types",
"foreign-types",
"log",
"objc",
@@ -2539,105 +2058,53 @@ dependencies = [
[[package]]
name = "miniz_oxide"
-version = "0.8.9"
+version = "0.7.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "1fa76a2c86f704bdb222d66965fb3d63269ce38518b83cb0575fca855ebb6316"
+checksum = "b8a240ddb74feaf34a79a7add65a741f3167852fba007066dcac1ca548d89c08"
dependencies = [
- "adler2",
+ "adler",
"simd-adler32",
]
-[[package]]
-name = "mio"
-version = "1.2.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "02bd0af71c67b473010cbbc60715ee815645a4dc942899111f494b4b737d6fda"
-dependencies = [
- "libc",
- "wasi",
- "windows-sys 0.61.2",
-]
-
-[[package]]
-name = "moxcms"
-version = "0.7.11"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "ac9557c559cd6fc9867e122e20d2cbefc9ca29d80d027a8e39310920ed2f0a97"
-dependencies = [
- "num-traits",
- "pxfm",
-]
-
-[[package]]
-name = "mundy"
-version = "0.2.2"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "523813c9e194ec43693805214eb112551f99382115b67f38600d724a692e7e8b"
-dependencies = [
- "android-build",
- "async-io",
- "cfg-if",
- "dispatch",
- "futures-channel",
- "futures-lite",
- "jni",
- "ndk-context",
- "objc2 0.6.3",
- "objc2-app-kit 0.3.2",
- "objc2-foundation 0.3.2",
- "pin-project-lite",
- "wasm-bindgen",
- "wasm-bindgen-futures",
- "web-sys",
- "windows 0.62.2",
- "zbus",
-]
-
[[package]]
name = "mutate_once"
-version = "0.1.2"
+version = "0.1.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "13d2233c9842d08cfe13f9eac96e207ca6a2ea10b80259ebe8ad0268be27d2af"
+checksum = "16cf681a23b4d0a43fc35024c176437f9dcd818db34e0f42ab456a0ee5ad497b"
[[package]]
name = "naga"
-version = "27.0.3"
+version = "0.19.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "066cf25f0e8b11ee0df221219010f213ad429855f57c494f995590c861a9a7d8"
+checksum = "50e3524642f53d9af419ab5e8dd29d3ba155708267667c2f3f06c88c9e130843"
dependencies = [
- "arrayvec",
"bit-set",
- "bitflags 2.10.0",
- "cfg-if",
- "cfg_aliases 0.2.1",
+ "bitflags 2.6.0",
"codespan-reporting",
- "half",
- "hashbrown 0.16.1",
"hexf-parse",
"indexmap",
- "libm",
"log",
"num-traits",
- "once_cell",
- "rustc-hash 1.1.0",
+ "rustc-hash",
"spirv",
- "thiserror 2.0.18",
- "unicode-ident",
+ "termcolor",
+ "thiserror",
+ "unicode-xid",
]
[[package]]
name = "ndk"
-version = "0.9.0"
+version = "0.8.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "c3f42e7bbe13d351b6bead8286a43aac9534b82bd3cc43e47037f012ebfd62d4"
+checksum = "2076a31b7010b17a38c01907c45b945e8f11495ee4dd588309718901b1f7a5b7"
dependencies = [
- "bitflags 2.10.0",
+ "bitflags 2.6.0",
"jni-sys",
"log",
"ndk-sys",
"num_enum",
"raw-window-handle",
- "thiserror 1.0.69",
+ "thiserror",
]
[[package]]
@@ -2648,100 +2115,24 @@ checksum = "27b02d87554356db9e9a873add8782d4ea6e3e58ea071a9adb9a2e8ddb884a8b"
[[package]]
name = "ndk-sys"
-version = "0.6.0+11769913"
+version = "0.5.0+25.2.9519653"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "ee6cda3051665f1fb8d9e08fc35c96d5a244fb1be711a03b71118828afc9a873"
+checksum = "8c196769dd60fd4f363e11d948139556a344e79d451aeb2fa2fd040738ef7691"
dependencies = [
"jni-sys",
]
-[[package]]
-name = "new_debug_unreachable"
-version = "1.0.6"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "650eef8c711430f1a879fdd01d4745a7deea475becfb90269c06775983bbf086"
-
-[[package]]
-name = "nibble_vec"
-version = "0.1.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "77a5d83df9f36fe23f0c3648c6bbb8b0298bb5f1939c8f2704431371f4b84d43"
-dependencies = [
- "smallvec",
-]
-
[[package]]
name = "nix"
-version = "0.28.0"
+version = "0.29.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "ab2156c4fce2f8df6c499cc1c763e4394b7482525bf2a9701c9d79d215f519e4"
+checksum = "71e2746dc3a24dd78b3cfcb7be93368c6de9963d30f43a6a73998a9cf4b17b46"
dependencies = [
- "bitflags 2.10.0",
+ "bitflags 2.6.0",
"cfg-if",
- "cfg_aliases 0.1.1",
+ "cfg_aliases 0.2.1",
"libc",
-]
-
-[[package]]
-name = "nom"
-version = "8.0.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "df9761775871bdef83bee530e60050f7e54b1105350d6884eb0fb4f46c2f9405"
-dependencies = [
- "memchr",
-]
-
-[[package]]
-name = "noop_proc_macro"
-version = "0.3.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "0676bb32a98c1a483ce53e500a81ad9c3d5b3f7c920c28c24e9cb0980d0b5bc8"
-
-[[package]]
-name = "num-bigint"
-version = "0.4.6"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "a5e44f723f1133c9deac646763579fdb3ac745e418f2a7af9cd0c431da1f20b9"
-dependencies = [
- "num-integer",
- "num-traits",
-]
-
-[[package]]
-name = "num-conv"
-version = "0.2.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "cf97ec579c3c42f953ef76dbf8d55ac91fb219dde70e49aa4a6b7d74e9919050"
-
-[[package]]
-name = "num-derive"
-version = "0.4.2"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "ed3955f1a9c7c0c15e092f9c887db08b1fc683305fdf6eb6684f22555355e202"
-dependencies = [
- "proc-macro2",
- "quote",
- "syn",
-]
-
-[[package]]
-name = "num-integer"
-version = "0.1.46"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "7969661fd2958a5cb096e56c8e1ad0444ac2bbcd0061bd28660485a44879858f"
-dependencies = [
- "num-traits",
-]
-
-[[package]]
-name = "num-rational"
-version = "0.4.2"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "f83d14da390562dca69fc84082e73e548e1ad308d24accdedd2720017cb37824"
-dependencies = [
- "num-bigint",
- "num-integer",
- "num-traits",
+ "memoffset",
]
[[package]]
@@ -2751,39 +2142,37 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "071dfc062690e90b734c0b2273ce72ad0ffa95f0c74596bc250dcfd960262841"
dependencies = [
"autocfg",
- "libm",
]
[[package]]
name = "num_cpus"
-version = "1.17.0"
+version = "1.16.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "91df4bbde75afed763b708b7eee1e8e7651e02d97f6d5dd763e89367e957b23b"
+checksum = "4161fcb6d602d4d2081af7c3a45852d875a03dd337a6bfdd6e06407b61342a43"
dependencies = [
- "hermit-abi",
+ "hermit-abi 0.3.9",
"libc",
]
[[package]]
name = "num_enum"
-version = "0.7.5"
+version = "0.7.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "b1207a7e20ad57b847bbddc6776b968420d38292bbfe2089accff5e19e82454c"
+checksum = "02339744ee7253741199f897151b38e72257d13802d4ee837285cc2990a90845"
dependencies = [
"num_enum_derive",
- "rustversion",
]
[[package]]
name = "num_enum_derive"
-version = "0.7.5"
+version = "0.7.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "ff32365de1b6743cb203b710788263c44a03de03802daf96092f2da4fe6ba4d7"
+checksum = "681030a937600a36906c185595136d26abfebb4aa9c65701cefcaf8578bb982b"
dependencies = [
"proc-macro-crate",
"proc-macro2",
"quote",
- "syn",
+ "syn 2.0.70",
]
[[package]]
@@ -2793,6 +2182,18 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "915b1b472bc21c53464d6c8461c9d3af805ba1ef837e1cac254428f4a77177b1"
dependencies = [
"malloc_buf",
+ "objc_exception",
+]
+
+[[package]]
+name = "objc-foundation"
+version = "0.1.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "1add1b659e36c9607c7aab864a76c7a4c2760cd0cd2e120f3fb8b952c7e22bf9"
+dependencies = [
+ "block",
+ "objc",
+ "objc_id",
]
[[package]]
@@ -2801,6 +2202,16 @@ version = "0.3.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "cdb91bdd390c7ce1a8607f35f3ca7151b65afc0ff5ff3b34fa350f7d7c7e4310"
+[[package]]
+name = "objc2"
+version = "0.4.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "559c5a40fdd30eb5e344fbceacf7595a81e242529fb4e21cf5f43fb4f11ff98d"
+dependencies = [
+ "objc-sys",
+ "objc2-encode 3.0.0",
+]
+
[[package]]
name = "objc2"
version = "0.5.2"
@@ -2808,16 +2219,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "46a785d4eeff09c14c487497c162e92766fbb3e4059a71840cecc03d9a50b804"
dependencies = [
"objc-sys",
- "objc2-encode",
-]
-
-[[package]]
-name = "objc2"
-version = "0.6.3"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "b7c2599ce0ec54857b29ce62166b0ed9b4f6f1a70ccc9a71165b6154caca8c05"
-dependencies = [
- "objc2-encode",
+ "objc2-encode 4.0.3",
]
[[package]]
@@ -2826,70 +2228,14 @@ version = "0.2.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "e4e89ad9e3d7d297152b17d39ed92cd50ca8063a89a9fa569046d41568891eff"
dependencies = [
- "bitflags 2.10.0",
+ "bitflags 2.6.0",
"block2 0.5.1",
"libc",
"objc2 0.5.2",
- "objc2-core-data 0.2.2",
- "objc2-core-image 0.2.2",
- "objc2-foundation 0.2.2",
- "objc2-quartz-core 0.2.2",
-]
-
-[[package]]
-name = "objc2-app-kit"
-version = "0.3.2"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "d49e936b501e5c5bf01fda3a9452ff86dc3ea98ad5f283e1455153142d97518c"
-dependencies = [
- "bitflags 2.10.0",
- "block2 0.6.2",
- "libc",
- "objc2 0.6.3",
- "objc2-cloud-kit 0.3.2",
- "objc2-core-data 0.3.2",
- "objc2-core-foundation",
- "objc2-core-graphics",
- "objc2-core-image 0.3.2",
- "objc2-core-text",
- "objc2-core-video",
- "objc2-foundation 0.3.2",
- "objc2-quartz-core 0.3.2",
-]
-
-[[package]]
-name = "objc2-cloud-kit"
-version = "0.2.2"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "74dd3b56391c7a0596a295029734d3c1c5e7e510a4cb30245f8221ccea96b009"
-dependencies = [
- "bitflags 2.10.0",
- "block2 0.5.1",
- "objc2 0.5.2",
- "objc2-core-location",
- "objc2-foundation 0.2.2",
-]
-
-[[package]]
-name = "objc2-cloud-kit"
-version = "0.3.2"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "73ad74d880bb43877038da939b7427bba67e9dd42004a18b809ba7d87cee241c"
-dependencies = [
- "bitflags 2.10.0",
- "objc2 0.6.3",
- "objc2-foundation 0.3.2",
-]
-
-[[package]]
-name = "objc2-contacts"
-version = "0.2.2"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "a5ff520e9c33812fd374d8deecef01d4a840e7b41862d849513de77e44aa4889"
-dependencies = [
- "block2 0.5.1",
- "objc2 0.5.2",
- "objc2-foundation 0.2.2",
+ "objc2-core-data",
+ "objc2-core-image",
+ "objc2-foundation",
+ "objc2-quartz-core",
]
[[package]]
@@ -2898,45 +2244,10 @@ version = "0.2.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "617fbf49e071c178c0b24c080767db52958f716d9eabdf0890523aeae54773ef"
dependencies = [
- "bitflags 2.10.0",
+ "bitflags 2.6.0",
"block2 0.5.1",
"objc2 0.5.2",
- "objc2-foundation 0.2.2",
-]
-
-[[package]]
-name = "objc2-core-data"
-version = "0.3.2"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "0b402a653efbb5e82ce4df10683b6b28027616a2715e90009947d50b8dd298fa"
-dependencies = [
- "bitflags 2.10.0",
- "objc2 0.6.3",
- "objc2-foundation 0.3.2",
-]
-
-[[package]]
-name = "objc2-core-foundation"
-version = "0.3.2"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "2a180dd8642fa45cdb7dd721cd4c11b1cadd4929ce112ebd8b9f5803cc79d536"
-dependencies = [
- "bitflags 2.10.0",
- "dispatch2",
- "objc2 0.6.3",
-]
-
-[[package]]
-name = "objc2-core-graphics"
-version = "0.3.2"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "e022c9d066895efa1345f8e33e584b9f958da2fd4cd116792e15e07e4720a807"
-dependencies = [
- "bitflags 2.10.0",
- "dispatch2",
- "objc2 0.6.3",
- "objc2-core-foundation",
- "objc2-io-surface",
+ "objc2-foundation",
]
[[package]]
@@ -2947,62 +2258,21 @@ checksum = "55260963a527c99f1819c4f8e3b47fe04f9650694ef348ffd2227e8196d34c80"
dependencies = [
"block2 0.5.1",
"objc2 0.5.2",
- "objc2-foundation 0.2.2",
+ "objc2-foundation",
"objc2-metal",
]
[[package]]
-name = "objc2-core-image"
-version = "0.3.2"
+name = "objc2-encode"
+version = "3.0.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "e5d563b38d2b97209f8e861173de434bd0214cf020e3423a52624cd1d989f006"
-dependencies = [
- "objc2 0.6.3",
- "objc2-foundation 0.3.2",
-]
-
-[[package]]
-name = "objc2-core-location"
-version = "0.2.2"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "000cfee34e683244f284252ee206a27953279d370e309649dc3ee317b37e5781"
-dependencies = [
- "block2 0.5.1",
- "objc2 0.5.2",
- "objc2-contacts",
- "objc2-foundation 0.2.2",
-]
-
-[[package]]
-name = "objc2-core-text"
-version = "0.3.2"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "0cde0dfb48d25d2b4862161a4d5fcc0e3c24367869ad306b0c9ec0073bfed92d"
-dependencies = [
- "bitflags 2.10.0",
- "objc2 0.6.3",
- "objc2-core-foundation",
- "objc2-core-graphics",
-]
-
-[[package]]
-name = "objc2-core-video"
-version = "0.3.2"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "d425caf1df73233f29fd8a5c3e5edbc30d2d4307870f802d18f00d83dc5141a6"
-dependencies = [
- "bitflags 2.10.0",
- "objc2 0.6.3",
- "objc2-core-foundation",
- "objc2-core-graphics",
- "objc2-io-surface",
-]
+checksum = "d079845b37af429bfe5dfa76e6d087d788031045b25cfc6fd898486fd9847666"
[[package]]
name = "objc2-encode"
-version = "4.1.0"
+version = "4.0.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "ef25abbcd74fb2609453eb695bd2f860d389e457f67dc17cafc8b8cbc89d0c33"
+checksum = "7891e71393cd1f227313c9379a26a584ff3d7e6e7159e988851f0934c993f0f8"
[[package]]
name = "objc2-foundation"
@@ -3010,59 +2280,23 @@ version = "0.2.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "0ee638a5da3799329310ad4cfa62fbf045d5f56e3ef5ba4149e7452dcf89d5a8"
dependencies = [
- "bitflags 2.10.0",
+ "bitflags 2.6.0",
"block2 0.5.1",
"dispatch",
"libc",
"objc2 0.5.2",
]
-[[package]]
-name = "objc2-foundation"
-version = "0.3.2"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "e3e0adef53c21f888deb4fa59fc59f7eb17404926ee8a6f59f5df0fd7f9f3272"
-dependencies = [
- "bitflags 2.10.0",
- "block2 0.6.2",
- "libc",
- "objc2 0.6.3",
- "objc2-core-foundation",
-]
-
-[[package]]
-name = "objc2-io-surface"
-version = "0.3.2"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "180788110936d59bab6bd83b6060ffdfffb3b922ba1396b312ae795e1de9d81d"
-dependencies = [
- "bitflags 2.10.0",
- "objc2 0.6.3",
- "objc2-core-foundation",
-]
-
-[[package]]
-name = "objc2-link-presentation"
-version = "0.2.2"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "a1a1ae721c5e35be65f01a03b6d2ac13a54cb4fa70d8a5da293d7b0020261398"
-dependencies = [
- "block2 0.5.1",
- "objc2 0.5.2",
- "objc2-app-kit 0.2.2",
- "objc2-foundation 0.2.2",
-]
-
[[package]]
name = "objc2-metal"
version = "0.2.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "dd0cba1276f6023976a406a14ffa85e1fdd19df6b0f737b063b95f6c8c7aadd6"
dependencies = [
- "bitflags 2.10.0",
+ "bitflags 2.6.0",
"block2 0.5.1",
"objc2 0.5.2",
- "objc2-foundation 0.2.2",
+ "objc2-foundation",
]
[[package]]
@@ -3071,91 +2305,36 @@ version = "0.2.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "e42bee7bff906b14b167da2bac5efe6b6a07e6f7c0a21a7308d40c960242dc7a"
dependencies = [
- "bitflags 2.10.0",
+ "bitflags 2.6.0",
"block2 0.5.1",
"objc2 0.5.2",
- "objc2-foundation 0.2.2",
+ "objc2-foundation",
"objc2-metal",
]
[[package]]
-name = "objc2-quartz-core"
-version = "0.3.2"
+name = "objc_exception"
+version = "0.1.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "96c1358452b371bf9f104e21ec536d37a650eb10f7ee379fff67d2e08d537f1f"
+checksum = "ad970fb455818ad6cba4c122ad012fae53ae8b4795f86378bce65e4f6bab2ca4"
dependencies = [
- "bitflags 2.10.0",
- "objc2 0.6.3",
- "objc2-core-foundation",
- "objc2-foundation 0.3.2",
+ "cc",
]
[[package]]
-name = "objc2-symbols"
-version = "0.2.2"
+name = "objc_id"
+version = "0.1.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "0a684efe3dec1b305badae1a28f6555f6ddd3bb2c2267896782858d5a78404dc"
+checksum = "c92d4ddb4bd7b50d730c215ff871754d0da6b2178849f8a2a2ab69712d0c073b"
dependencies = [
- "objc2 0.5.2",
- "objc2-foundation 0.2.2",
-]
-
-[[package]]
-name = "objc2-ui-kit"
-version = "0.2.2"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "b8bb46798b20cd6b91cbd113524c490f1686f4c4e8f49502431415f3512e2b6f"
-dependencies = [
- "bitflags 2.10.0",
- "block2 0.5.1",
- "objc2 0.5.2",
- "objc2-cloud-kit 0.2.2",
- "objc2-core-data 0.2.2",
- "objc2-core-image 0.2.2",
- "objc2-core-location",
- "objc2-foundation 0.2.2",
- "objc2-link-presentation",
- "objc2-quartz-core 0.2.2",
- "objc2-symbols",
- "objc2-uniform-type-identifiers",
- "objc2-user-notifications",
-]
-
-[[package]]
-name = "objc2-uniform-type-identifiers"
-version = "0.2.2"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "44fa5f9748dbfe1ca6c0b79ad20725a11eca7c2218bceb4b005cb1be26273bfe"
-dependencies = [
- "block2 0.5.1",
- "objc2 0.5.2",
- "objc2-foundation 0.2.2",
-]
-
-[[package]]
-name = "objc2-user-notifications"
-version = "0.2.2"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "76cfcbf642358e8689af64cee815d139339f3ed8ad05103ed5eaf73db8d84cb3"
-dependencies = [
- "bitflags 2.10.0",
- "block2 0.5.1",
- "objc2 0.5.2",
- "objc2-core-location",
- "objc2-foundation 0.2.2",
+ "objc",
]
[[package]]
name = "once_cell"
-version = "1.21.3"
+version = "1.19.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "42f5e15c9953c5e4ccceeb2e7382a716482c34515315f7b03532b8b4e8393d2d"
-
-[[package]]
-name = "once_cell_polyfill"
-version = "1.70.2"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "384b8ab6d37215f3c5301a95a4accb5d64aa607f1fcb26a11b5303878451b4fe"
+checksum = "3fdb12b2476b595f9358c5161aa467c2438859caa136dec86c26fdd2efe17b92"
[[package]]
name = "option-ext"
@@ -3165,21 +2344,21 @@ checksum = "04744f49eae99ab78e0d5c0b603ab218f515ea8cfe5a456d7629ad883a3b6e7d"
[[package]]
name = "orbclient"
-version = "0.3.50"
+version = "0.3.47"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "52ad2c6bae700b7aa5d1cc30c59bdd3a1c180b09dbaea51e2ae2b8e1cf211fdd"
+checksum = "52f0d54bde9774d3a51dcf281a5def240c71996bc6ca05d2c847ec8b2b216166"
dependencies = [
- "libc",
- "libredox",
+ "libredox 0.0.2",
]
[[package]]
-name = "ordered-float"
-version = "5.1.0"
+name = "ordered-multimap"
+version = "0.4.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "7f4779c6901a562440c3786d08192c6fbda7c1c2060edd10006b05ee35d10f2d"
+checksum = "ccd746e37177e1711c20dd619a1620f34f5c8b569c53590a72dedd5344d8924a"
dependencies = [
- "num-traits",
+ "dlv-list",
+ "hashbrown 0.12.3",
]
[[package]]
@@ -3194,40 +2373,89 @@ dependencies = [
[[package]]
name = "owned_ttf_parser"
-version = "0.25.1"
+version = "0.24.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "36820e9051aca1014ddc75770aab4d68bc1e9e632f0f5627c4086bc216fb583b"
+checksum = "490d3a563d3122bf7c911a59b0add9389e5ec0f5f0c3ac6b91ff235a0e6a7f90"
dependencies = [
- "ttf-parser",
+ "ttf-parser 0.24.0",
+]
+
+[[package]]
+name = "palette"
+version = "0.7.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "4cbf71184cc5ecc2e4e1baccdb21026c20e5fc3dcf63028a086131b3ab00b6e6"
+dependencies = [
+ "approx",
+ "fast-srgb8",
+ "palette_derive",
+ "phf",
+]
+
+[[package]]
+name = "palette_derive"
+version = "0.7.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "f5030daf005bface118c096f510ffb781fc28f9ab6a32ab224d8631be6851d30"
+dependencies = [
+ "by_address",
+ "proc-macro2",
+ "quote",
+ "syn 2.0.70",
]
[[package]]
name = "parking"
-version = "2.2.1"
+version = "2.2.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "f38d5652c16fde515bb1ecef450ab0f6a219d619a7274976324d5e377f7dceba"
+checksum = "bb813b8af86854136c6922af0598d719255ecb2179515e6e7730d468f05c9cae"
[[package]]
name = "parking_lot"
-version = "0.12.5"
+version = "0.11.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "93857453250e3077bd71ff98b6a65ea6621a19bb0f559a85248955ac12c45a1a"
+checksum = "7d17b78036a60663b797adeaee46f5c9dfebb86948d1255007a1d6be0271ff99"
+dependencies = [
+ "instant",
+ "lock_api",
+ "parking_lot_core 0.8.6",
+]
+
+[[package]]
+name = "parking_lot"
+version = "0.12.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "f1bf18183cf54e8d6059647fc3063646a1801cf30896933ec2311622cc4b9a27"
dependencies = [
"lock_api",
- "parking_lot_core",
+ "parking_lot_core 0.9.10",
]
[[package]]
name = "parking_lot_core"
-version = "0.9.12"
+version = "0.8.6"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "2621685985a2ebf1c516881c026032ac7deafcda1a2c9b7850dc81e3dfcb64c1"
+checksum = "60a2cfe6f0ad2bfc16aefa463b497d5c7a5ecd44a23efa72aa342d90177356dc"
+dependencies = [
+ "cfg-if",
+ "instant",
+ "libc",
+ "redox_syscall 0.2.16",
+ "smallvec",
+ "winapi",
+]
+
+[[package]]
+name = "parking_lot_core"
+version = "0.9.10"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "1e401f977ab385c9e4e3ab30627d6f26d00e2c73eef317493c4ec6d468726cf8"
dependencies = [
"cfg-if",
"libc",
- "redox_syscall 0.5.18",
+ "redox_syscall 0.5.2",
"smallvec",
- "windows-link",
+ "windows-targets 0.52.6",
]
[[package]]
@@ -3236,43 +2464,59 @@ version = "1.0.15"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "57c0d7b74b563b49d38dae00a0c37d4d6de9b432382b2892f0574ddcae73fd0a"
-[[package]]
-name = "pastey"
-version = "0.1.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "35fb2e5f958ec131621fdd531e9fc186ed768cbe395337403ae56c17a74c68ec"
-
[[package]]
name = "percent-encoding"
-version = "2.3.2"
+version = "2.3.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "9b4f627cb1b25917193a259e49bdad08f671f8d9708acfd5fe0a8c1455d87220"
+checksum = "e3148f5046208a5d56bcfc03053e3ca6334e51da8dfb19b6cdc8b306fae3283e"
[[package]]
-name = "pin-project"
-version = "1.1.10"
+name = "phf"
+version = "0.11.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "677f1add503faace112b9f1373e43e9e054bfdd22ff1a63c1bc485eaec6a6a8a"
+checksum = "ade2d8b8f33c7333b51bcf0428d37e217e9f32192ae4772156f65063b8ce03dc"
dependencies = [
- "pin-project-internal",
+ "phf_macros",
+ "phf_shared",
]
[[package]]
-name = "pin-project-internal"
-version = "1.1.10"
+name = "phf_generator"
+version = "0.11.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "6e918e4ff8c4549eb882f14b3a4bc8c8bc93de829416eacf579f1207a8fbf861"
+checksum = "48e4cc64c2ad9ebe670cb8fd69dd50ae301650392e81c05f9bfcb2d5bdbc24b0"
dependencies = [
+ "phf_shared",
+ "rand",
+]
+
+[[package]]
+name = "phf_macros"
+version = "0.11.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "3444646e286606587e49f3bcf1679b8cef1dc2c5ecc29ddacaffc305180d464b"
+dependencies = [
+ "phf_generator",
+ "phf_shared",
"proc-macro2",
"quote",
- "syn",
+ "syn 2.0.70",
+]
+
+[[package]]
+name = "phf_shared"
+version = "0.11.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "90fcb95eef784c2ac79119d1dd819e162b5da872ce6f3c3abe1e8ca1c082f72b"
+dependencies = [
+ "siphasher",
]
[[package]]
name = "pin-project-lite"
-version = "0.2.16"
+version = "0.2.14"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "3b3cff922bd51709b605d9ead9aa71031d81447142d828eb4a6eba76fe619f9b"
+checksum = "bda66fc9667c18cb2758a2ac84d1167245054bcf85d5d1aaa6923f45801bdd02"
[[package]]
name = "pin-utils"
@@ -3282,9 +2526,9 @@ checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184"
[[package]]
name = "piper"
-version = "0.2.4"
+version = "0.2.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "96c8c490f422ef9a4efd2cb5b42b76c8613d7e7dfc1caf667b8a3350a5acc066"
+checksum = "ae1d5c74c9876f070d3e8fd503d748c7d974c3e48da8f41350fa5222ef9b4391"
dependencies = [
"atomic-waker",
"fastrand",
@@ -3293,17 +2537,17 @@ dependencies = [
[[package]]
name = "pkg-config"
-version = "0.3.32"
+version = "0.3.30"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "7edddbd0b52d732b21ad9a5fab5c704c14cd949e5e9a1ec5929a24fded1b904c"
+checksum = "d231b230927b5e4ad203db57bbcbee2802f6bce620b1e4a9024a07d94e2907ec"
[[package]]
name = "png"
-version = "0.18.0"
+version = "0.17.13"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "97baced388464909d42d89643fe4361939af9b7ce7a31ee32a168f832a70f2a0"
+checksum = "06e4b0d3d1312775e782c86c91a111aa1f910cbb65e1337f9975b5f9a554b5e1"
dependencies = [
- "bitflags 2.10.0",
+ "bitflags 1.3.2",
"crc32fast",
"fdeflate",
"flate2",
@@ -3312,62 +2556,30 @@ dependencies = [
[[package]]
name = "polling"
-version = "3.11.0"
+version = "3.7.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "5d0e4f59085d47d8241c88ead0f274e8a0cb551f3625263c05eb8dd897c34218"
+checksum = "a3ed00ed3fbf728b5816498ecd316d1716eecaced9c0c8d2c5a6740ca214985b"
dependencies = [
"cfg-if",
"concurrent-queue",
- "hermit-abi",
+ "hermit-abi 0.4.0",
"pin-project-lite",
- "rustix 1.1.3",
- "windows-sys 0.61.2",
+ "rustix",
+ "tracing",
+ "windows-sys 0.52.0",
]
[[package]]
name = "pollster"
-version = "0.4.0"
+version = "0.3.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "2f3a9f18d041e6d0e102a0a46750538147e5e8992d3b4873aaafee2520b00ce3"
-
-[[package]]
-name = "portable-atomic"
-version = "1.13.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "c33a9471896f1c69cecef8d20cbe2f7accd12527ce60845ff44c153bb2a21b49"
-
-[[package]]
-name = "portable-atomic-util"
-version = "0.2.5"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "7a9db96d7fa8782dd8c15ce32ffe8680bbd1e978a43bf51a34d39483540495f5"
-dependencies = [
- "portable-atomic",
-]
-
-[[package]]
-name = "potential_utf"
-version = "0.1.4"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "b73949432f5e2a09657003c25bca5e19a0e9c84f8058ca374f49e0ebe605af77"
-dependencies = [
- "zerovec",
-]
-
-[[package]]
-name = "powerfmt"
-version = "0.2.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "439ee305def115ba05938db6eb1644ff94165c5ab5e9420d1c1bcedbba909391"
+checksum = "22686f4785f02a4fcc856d3b3bb19bf6c8160d103f7a99cc258bddd0251dc7f2"
[[package]]
name = "ppv-lite86"
-version = "0.2.21"
+version = "0.2.17"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "85eae3c4ed2f50dcfe72643da4befc30deadb458a9b590d720cde2f2b1e97da9"
-dependencies = [
- "zerocopy",
-]
+checksum = "5b40af805b3121feab8a3c29f04d8ad262fa8e0561883e7653e024ae4479e6de"
[[package]]
name = "presser"
@@ -3375,61 +2587,29 @@ version = "0.3.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "e8cf8e6a8aa66ce33f63993ffc4ea4271eb5b0530a9002db8455ea6050c77bfa"
-[[package]]
-name = "prettyplease"
-version = "0.2.37"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "479ca8adacdd7ce8f1fb39ce9ecccbfe93a3f1344b3d0d97f20bc0196208f62b"
-dependencies = [
- "proc-macro2",
- "syn",
-]
-
[[package]]
name = "proc-macro-crate"
-version = "3.4.0"
+version = "3.1.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "219cb19e96be00ab2e37d6e299658a0cfa83e52429179969b0f0121b4ac46983"
+checksum = "6d37c51ca738a55da99dc0c4a34860fd675453b8b36209178c2249bb13651284"
dependencies = [
- "toml_edit",
+ "toml_edit 0.21.1",
]
[[package]]
name = "proc-macro2"
-version = "1.0.106"
+version = "1.0.86"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "8fd00f0bb2e90d81d1044c2b32617f68fcb9fa3bb7640c23e9c748e53fb30934"
+checksum = "5e719e8df665df0d1c8fbfd238015744736151d4445ec0836b8e628aae103b77"
dependencies = [
"unicode-ident",
]
[[package]]
name = "profiling"
-version = "1.0.17"
+version = "1.0.15"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "3eb8486b569e12e2c32ad3e204dbaba5e4b5b216e9367044f25f1dba42341773"
-dependencies = [
- "profiling-procmacros",
-]
-
-[[package]]
-name = "profiling-procmacros"
-version = "1.0.17"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "52717f9a02b6965224f95ca2a81e2e0c5c43baacd28ca057577988930b6c3d5b"
-dependencies = [
- "quote",
- "syn",
-]
-
-[[package]]
-name = "pxfm"
-version = "0.1.27"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "7186d3822593aa4393561d186d1393b3923e9d6163d3fbfd6e825e3e6cf3e6a8"
-dependencies = [
- "num-traits",
-]
+checksum = "43d84d1d7a6ac92673717f9f6d1518374ef257669c24ebc5ac25d5033828be58"
[[package]]
name = "qoi"
@@ -3440,65 +2620,33 @@ dependencies = [
"bytemuck",
]
-[[package]]
-name = "quick-error"
-version = "2.0.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "a993555f31e5a609f617c12db6250dedcac1b0a85076912c436e6fc9b2c8e6a3"
-
[[package]]
name = "quick-xml"
-version = "0.38.4"
+version = "0.34.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "b66c2058c55a409d601666cffe35f04333cf1013010882cec174a7467cd4e21c"
+checksum = "6f24d770aeca0eacb81ac29dfbc55ebcc09312fdd1f8bbecdc7e4a84e000e3b4"
dependencies = [
"memchr",
]
[[package]]
name = "quote"
-version = "1.0.45"
+version = "1.0.36"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "41f2619966050689382d2b44f664f4bc593e129785a36d6ee376ddf37259b924"
+checksum = "0fa76aaf39101c457836aec0ce2316dbdc3ab723cdda1c6bd4e6ad4208acaca7"
dependencies = [
"proc-macro2",
]
-[[package]]
-name = "r-efi"
-version = "5.3.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "69cdb34c158ceb288df11e18b4bd39de994f6657d83847bdffdbd7f346754b0f"
-
-[[package]]
-name = "radix_trie"
-version = "0.2.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "c069c179fcdc6a2fe24d8d18305cf085fdbd4f922c041943e203685d6a1c58fd"
-dependencies = [
- "endian-type",
- "nibble_vec",
-]
-
[[package]]
name = "rand"
-version = "0.8.6"
+version = "0.8.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "5ca0ecfa931c29007047d1bc58e623ab12e5590e8c7cc53200d5202b69266d8a"
+checksum = "34af8d1a0e25924bc5b7c43c079c942339d8f0a8b57c39049bef581b46327404"
dependencies = [
"libc",
- "rand_chacha 0.3.1",
- "rand_core 0.6.4",
-]
-
-[[package]]
-name = "rand"
-version = "0.9.2"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "6db2770f06117d490610c7488547d543617b21bfa07796d7a12f6f1bd53850d1"
-dependencies = [
- "rand_chacha 0.9.0",
- "rand_core 0.9.5",
+ "rand_chacha",
+ "rand_core",
]
[[package]]
@@ -3508,17 +2656,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "e6c10a63a0fa32252be49d21e7709d4d4baf8d231c2dbce1eaa8141b9b127d88"
dependencies = [
"ppv-lite86",
- "rand_core 0.6.4",
-]
-
-[[package]]
-name = "rand_chacha"
-version = "0.9.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "d3022b5f1df60f26e1ffddd6c66e8aa15de382ae63b3a0c1bfc0e4d3e3f325cb"
-dependencies = [
- "ppv-lite86",
- "rand_core 0.9.5",
+ "rand_core",
]
[[package]]
@@ -3527,79 +2665,20 @@ version = "0.6.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c"
dependencies = [
- "getrandom 0.2.17",
-]
-
-[[package]]
-name = "rand_core"
-version = "0.9.5"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "76afc826de14238e6e8c374ddcc1fa19e374fd8dd986b0d2af0d02377261d83c"
-dependencies = [
- "getrandom 0.3.4",
+ "getrandom",
]
[[package]]
name = "range-alloc"
-version = "0.1.4"
+version = "0.1.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "c3d6831663a5098ea164f89cff59c6284e95f4e3c76ce9848d4529f5ccca9bde"
+checksum = "9c8a99fddc9f0ba0a85884b8d14e3592853e787d581ca1816c91349b10e4eeab"
[[package]]
name = "rangemap"
-version = "1.7.1"
+version = "1.5.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "973443cf09a9c8656b574a866ab68dfa19f0867d0340648c7d2f6a71b8a8ea68"
-
-[[package]]
-name = "rav1e"
-version = "0.8.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "43b6dd56e85d9483277cde964fd1bdb0428de4fec5ebba7540995639a21cb32b"
-dependencies = [
- "aligned-vec",
- "arbitrary",
- "arg_enum_proc_macro",
- "arrayvec",
- "av-scenechange",
- "av1-grain",
- "bitstream-io",
- "built",
- "cfg-if",
- "interpolate_name",
- "itertools",
- "libc",
- "libfuzzer-sys",
- "log",
- "maybe-rayon",
- "new_debug_unreachable",
- "noop_proc_macro",
- "num-derive",
- "num-traits",
- "paste",
- "profiling",
- "rand 0.9.2",
- "rand_chacha 0.9.0",
- "simd_helpers",
- "thiserror 2.0.18",
- "v_frame",
- "wasm-bindgen",
-]
-
-[[package]]
-name = "ravif"
-version = "0.12.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "ef69c1990ceef18a116855938e74793a5f7496ee907562bd0857b6ac734ab285"
-dependencies = [
- "avif-serialize",
- "imgref",
- "loop9",
- "quick-error",
- "rav1e",
- "rayon",
- "rgb",
-]
+checksum = "f60fcc7d6849342eff22c4350c8b9a989ee8ceabc4b481253e8946b9fe83d684"
[[package]]
name = "raw-window-handle"
@@ -3609,9 +2688,9 @@ checksum = "20675572f6f24e9e76ef639bc5552774ed45f1c30e2951e1e99c59888861c539"
[[package]]
name = "rayon"
-version = "1.11.0"
+version = "1.10.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "368f01d005bf8fd9b1206fb6fa653e6c4a81ceb1466406b81792d87c5677a58f"
+checksum = "b418a60154510ca1a002a752ca9714984e21e4241e804d32555251faf8b78ffa"
dependencies = [
"either",
"rayon-core",
@@ -3619,9 +2698,9 @@ dependencies = [
[[package]]
name = "rayon-core"
-version = "1.13.0"
+version = "1.12.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "22e18b0f0062d30d4230b2e85ff77fdfe4326feb054b9783a3460d8435c8ab91"
+checksum = "1465873a3dfdaa8ae7cb14b4383657caab0b3e8a0aa9ae8e04b044854c8dfce2"
dependencies = [
"crossbeam-deque",
"crossbeam-utils",
@@ -3629,15 +2708,32 @@ dependencies = [
[[package]]
name = "read-fonts"
-version = "0.35.0"
+version = "0.19.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "6717cf23b488adf64b9d711329542ba34de147df262370221940dfabc2c91358"
+checksum = "e8b8af39d1f23869711ad4cea5e7835a20daa987f80232f7f2a2374d648ca64d"
dependencies = [
"bytemuck",
- "core_maths",
"font-types",
]
+[[package]]
+name = "redox_syscall"
+version = "0.2.16"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "fb5a58c1855b4b6819d59012155603f0b22ad30cad752600aadfcb695265519a"
+dependencies = [
+ "bitflags 1.3.2",
+]
+
+[[package]]
+name = "redox_syscall"
+version = "0.3.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "567664f262709473930a4bf9e51bf2ebf3348f2e748ccc50dea20646858f8f29"
+dependencies = [
+ "bitflags 1.3.2",
+]
+
[[package]]
name = "redox_syscall"
version = "0.4.1"
@@ -3649,33 +2745,53 @@ dependencies = [
[[package]]
name = "redox_syscall"
-version = "0.5.18"
+version = "0.5.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "ed2bf2547551a7053d6fdfafda3f938979645c44812fbfcda098faae3f1a362d"
+checksum = "c82cf8cff14456045f55ec4241383baeff27af886adb72ffb2162f99911de0fd"
dependencies = [
- "bitflags 2.10.0",
-]
-
-[[package]]
-name = "redox_syscall"
-version = "0.7.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "35985aa610addc02e24fc232012c86fd11f14111180f902b67e2d5331f8ebf2b"
-dependencies = [
- "bitflags 2.10.0",
+ "bitflags 2.6.0",
]
[[package]]
name = "redox_users"
-version = "0.5.2"
+version = "0.4.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "a4e608c6638b9c18977b00b475ac1f28d14e84b27d8d42f70e0bf1e3dec127ac"
+checksum = "bd283d9651eeda4b2a83a43c1c91b266c40fd76ecd39a50a8c630ae69dc72891"
dependencies = [
- "getrandom 0.2.17",
- "libredox",
- "thiserror 2.0.18",
+ "getrandom",
+ "libredox 0.1.3",
+ "thiserror",
]
+[[package]]
+name = "regex"
+version = "1.10.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "b91213439dad192326a0d7c6ee3955910425f441d7038e0d6933b0aec5c4517f"
+dependencies = [
+ "aho-corasick",
+ "memchr",
+ "regex-automata",
+ "regex-syntax",
+]
+
+[[package]]
+name = "regex-automata"
+version = "0.4.7"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "38caf58cc5ef2fed281f89292ef23f6365465ed9a41b7a7754eb4e26496c92df"
+dependencies = [
+ "aho-corasick",
+ "memchr",
+ "regex-syntax",
+]
+
+[[package]]
+name = "regex-syntax"
+version = "0.8.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "7a66a03ae7c801facd77a29370b4faec201768915ac14a721ba36f20bc9c209b"
+
[[package]]
name = "renderdoc-sys"
version = "1.1.0"
@@ -3684,65 +2800,66 @@ checksum = "19b30a45b0cd0bcca8037f3d0dc3421eaf95327a17cad11964fb8179b4fc4832"
[[package]]
name = "retry"
-version = "2.2.0"
+version = "2.0.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "1cab9bd343c737660e523ee69f788018f3db686d537d2fd0f99c9f747c1bda4f"
+checksum = "9166d72162de3575f950507683fac47e30f6f2c3836b71b7fbc61aa517c9c5f4"
dependencies = [
- "rand 0.9.2",
+ "rand",
]
[[package]]
name = "rfd"
-version = "0.17.2"
+version = "0.14.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "20dafead71c16a34e1ff357ddefc8afc11e7d51d6d2b9fbd07eaa48e3e540220"
+checksum = "25a73a7337fc24366edfca76ec521f51877b114e42dab584008209cca6719251"
dependencies = [
- "block2 0.6.2",
- "dispatch2",
+ "ashpd",
+ "block",
+ "dispatch",
"js-sys",
- "libc",
"log",
- "objc2 0.6.3",
- "objc2-app-kit 0.3.2",
- "objc2-core-foundation",
- "objc2-foundation 0.3.2",
- "percent-encoding",
+ "objc",
+ "objc-foundation",
+ "objc_id",
"pollster",
"raw-window-handle",
+ "urlencoding",
"wasm-bindgen",
"wasm-bindgen-futures",
- "wayland-backend",
- "wayland-client",
- "wayland-protocols",
"web-sys",
- "windows-sys 0.61.2",
+ "windows-sys 0.48.0",
]
-[[package]]
-name = "rgb"
-version = "0.8.52"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "0c6a884d2998352bb4daf0183589aec883f16a6da1f4dde84d8e2e9a5409a1ce"
-
[[package]]
name = "ring"
-version = "0.17.14"
+version = "0.17.8"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "a4689e6c2294d81e88dc6261c768b63bc4fcdb852be6d1352498b114f61383b7"
+checksum = "c17fa4cb658e3583423e915b9f3acc01cceaee1860e33d59ebae66adc3a2dc0d"
dependencies = [
"cc",
"cfg-if",
- "getrandom 0.2.17",
+ "getrandom",
"libc",
+ "spin",
"untrusted",
"windows-sys 0.52.0",
]
[[package]]
name = "roxmltree"
-version = "0.20.0"
+version = "0.19.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "6c20b6793b5c2fa6553b250154b78d6d0db37e72700ae35fad9387a46f487c97"
+checksum = "3cd14fd5e3b777a7422cca79358c57a8f6e3a703d9ac187448d0daf220c2407f"
+
+[[package]]
+name = "rust-ini"
+version = "0.18.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "f6d5f2436026b4f6e79dc829837d467cc7e9a55ee40e750d716713540715a2df"
+dependencies = [
+ "cfg-if",
+ "ordered-multimap",
+]
[[package]]
name = "rustc-hash"
@@ -3750,52 +2867,33 @@ version = "1.1.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "08d43f7aa6b08d49f382cde6a7982047c3426db949b1424bc4b7ec9ae12c6ce2"
-[[package]]
-name = "rustc-hash"
-version = "2.1.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "357703d41365b4b27c590e3ed91eabb1b663f07c4c084095e60cbed4362dff0d"
-
[[package]]
name = "rustc_version"
-version = "0.4.1"
+version = "0.4.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "cfcb3a22ef46e85b45de6ee7e79d063319ebb6594faafcf1c225ea92ab6e9b92"
+checksum = "bfa0f585226d2e68097d4f95d113b15b83a82e819ab25717ec0590d9584ef366"
dependencies = [
"semver",
]
[[package]]
name = "rustix"
-version = "0.38.44"
+version = "0.38.34"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "fdb5bc1ae2baa591800df16c9ca78619bf65c0488b41b96ccec5d11220d8c154"
+checksum = "70dc5ec042f7a43c4a73241207cecc9873a06d45debb38b329f8541d85c2730f"
dependencies = [
- "bitflags 2.10.0",
+ "bitflags 2.6.0",
"errno",
"libc",
- "linux-raw-sys 0.4.15",
- "windows-sys 0.59.0",
-]
-
-[[package]]
-name = "rustix"
-version = "1.1.3"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "146c9e247ccc180c1f61615433868c99f3de3ae256a30a43b49f67c2d9171f34"
-dependencies = [
- "bitflags 2.10.0",
- "errno",
- "libc",
- "linux-raw-sys 0.11.0",
- "windows-sys 0.61.2",
+ "linux-raw-sys 0.4.14",
+ "windows-sys 0.52.0",
]
[[package]]
name = "rustls"
-version = "0.23.36"
+version = "0.23.11"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "c665f33d38cea657d9614f766881e4d510e0eda4239891eea56b4cadcf01801b"
+checksum = "4828ea528154ae444e5a642dbb7d5623354030dc9822b83fd9bb79683c7399d0"
dependencies = [
"log",
"once_cell",
@@ -3808,18 +2906,15 @@ dependencies = [
[[package]]
name = "rustls-pki-types"
-version = "1.14.0"
+version = "1.7.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "be040f8b0a225e40375822a563fa9524378b9d63112f53e19ffff34df5d33fdd"
-dependencies = [
- "zeroize",
-]
+checksum = "976295e77ce332211c0d24d92c0e83e50f5c5f046d11082cea19f3df13a3562d"
[[package]]
name = "rustls-webpki"
-version = "0.103.13"
+version = "0.102.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "61c429a8649f110dddef65e2a5ad240f747e85f7758a6bccc7e5777bd33f756e"
+checksum = "f9a6fccd794a42c2c105b513a2f62bc3fd8f3ba57a4593677ceb0bd035164d78"
dependencies = [
"ring",
"rustls-pki-types",
@@ -3827,38 +2922,27 @@ dependencies = [
]
[[package]]
-name = "rustversion"
-version = "1.0.22"
+name = "rustybuzz"
+version = "0.11.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "b39cdef0fa800fc44525c84ccb54a029961a8215f9619753635a9c0d2538d46d"
-
-[[package]]
-name = "rustyline"
-version = "14.0.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "7803e8936da37efd9b6d4478277f4b2b9bb5cdb37a113e8d63222e58da647e63"
+checksum = "2ee8fe2a8461a0854a37101fe7a1b13998d0cfa987e43248e81d2a5f4570f6fa"
dependencies = [
- "bitflags 2.10.0",
- "cfg-if",
- "clipboard-win",
- "fd-lock",
- "home",
- "libc",
- "log",
- "memchr",
- "nix",
- "radix_trie",
- "unicode-segmentation",
- "unicode-width 0.1.14",
- "utf8parse",
- "windows-sys 0.52.0",
+ "bitflags 1.3.2",
+ "bytemuck",
+ "libm",
+ "smallvec",
+ "ttf-parser 0.20.0",
+ "unicode-bidi-mirroring",
+ "unicode-ccc",
+ "unicode-properties",
+ "unicode-script",
]
[[package]]
name = "ryu"
-version = "1.0.23"
+version = "1.0.18"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "9774ba4a74de5f7b1c1451ed6cd5285a32eddb5cccb8cc655a4e50009e06477f"
+checksum = "f3cb5ba0dc43242ce17de99c180e96db90b235b8a9fdc9543c96d2209116bd9f"
[[package]]
name = "same-file"
@@ -3883,128 +2967,117 @@ checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49"
[[package]]
name = "sctk-adwaita"
-version = "0.10.1"
+version = "0.8.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "b6277f0217056f77f1d8f49f2950ac6c278c0d607c45f5ee99328d792ede24ec"
+checksum = "70b31447ca297092c5a9916fc3b955203157b37c19ca8edde4f52e9843e602c7"
dependencies = [
"ab_glyph",
"log",
- "memmap2",
- "smithay-client-toolkit 0.19.2",
+ "memmap2 0.9.4",
+ "smithay-client-toolkit",
"tiny-skia",
]
[[package]]
name = "self_cell"
-version = "1.2.2"
+version = "1.0.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "b12e76d157a900eb52e81bc6e9f3069344290341720e9178cde2407113ac8d89"
+checksum = "d369a96f978623eb3dc28807c4852d6cc617fed53da5d3c400feff1ef34a714a"
[[package]]
name = "semver"
-version = "1.0.27"
+version = "1.0.23"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "d767eb0aabc880b29956c35734170f26ed551a859dbd361d140cdbeca61ab1e2"
+checksum = "61697e0a1c7e512e84a621326239844a24d8207b4669b41bc18b32ea5cbf988b"
[[package]]
name = "serde"
-version = "1.0.228"
+version = "1.0.204"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "9a8e94ea7f378bd32cbbd37198a4a91436180c5bb472411e48b5ec2e2124ae9e"
-dependencies = [
- "serde_core",
- "serde_derive",
-]
-
-[[package]]
-name = "serde_core"
-version = "1.0.228"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "41d385c7d4ca58e59fc732af25c3983b67ac852c1a25000afe1175de458b67ad"
+checksum = "bc76f558e0cbb2a839d37354c575f1dc3fdc6546b5be373ba43d95f231bf7c12"
dependencies = [
"serde_derive",
]
[[package]]
name = "serde_derive"
-version = "1.0.228"
+version = "1.0.204"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "d540f220d3187173da220f885ab66608367b6574e925011a9353e4badda91d79"
+checksum = "e0cd7e117be63d3c3678776753929474f3b04a43a080c744d6b0ae2a8c28e222"
dependencies = [
"proc-macro2",
"quote",
- "syn",
+ "syn 2.0.70",
]
[[package]]
name = "serde_json"
-version = "1.0.149"
+version = "1.0.120"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "83fc039473c5595ace860d8c4fafa220ff474b3fc6bfdb4293327f1a37e94d86"
+checksum = "4e0d21c9a8cae1235ad58a00c11cb40d4b1e5c784f1ef2c537876ed6ffd8b7c5"
dependencies = [
"itoa",
- "memchr",
+ "ryu",
"serde",
- "serde_core",
- "zmij",
]
[[package]]
name = "serde_repr"
-version = "0.1.20"
+version = "0.1.19"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "175ee3e80ae9982737ca543e96133087cbd9a485eecc3bc4de9c1a37b47ea59c"
+checksum = "6c64451ba24fc7a6a2d60fc75dd9c83c90903b19028d4eff35e88fc1e86564e9"
dependencies = [
"proc-macro2",
"quote",
- "syn",
+ "syn 2.0.70",
]
[[package]]
name = "serde_spanned"
-version = "1.0.4"
+version = "0.6.6"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "f8bbf91e5a4d6315eee45e704372590b30e260ee83af6639d64557f51b067776"
+checksum = "79e674e01f999af37c49f70a6ede167a8a60b2503e56c5599532a65baa5969a0"
dependencies = [
- "serde_core",
+ "serde",
]
[[package]]
-name = "shlex"
-version = "1.3.0"
+name = "sha1"
+version = "0.10.6"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "0fda2ff0d084019ba4d7c6f371c95d8fd75ce3524c3cb8fb653a3023f6323e64"
+checksum = "e3bf829a2d51ab4a5ddf1352d8470c140cadc8301b2ae1789db023f01cedd6ba"
+dependencies = [
+ "cfg-if",
+ "cpufeatures",
+ "digest",
+]
[[package]]
name = "signal-hook-registry"
-version = "1.4.8"
+version = "1.4.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "c4db69cba1110affc0e9f7bcd48bbf87b3f4fc7c61fc9155afd4c469eb3d6c1b"
+checksum = "a9e9e0b4211b72e7b8b6e85c807d36c212bdb33ea8587f7569562a84df5465b1"
dependencies = [
- "errno",
"libc",
]
[[package]]
name = "simd-adler32"
-version = "0.3.8"
+version = "0.3.7"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "e320a6c5ad31d271ad523dcf3ad13e2767ad8b1cb8f047f75a8aeaf8da139da2"
+checksum = "d66dc143e6b11c1eddc06d5c423cfc97062865baf299914ab64caa38182078fe"
[[package]]
-name = "simd_helpers"
-version = "0.1.0"
+name = "siphasher"
+version = "0.3.11"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "95890f873bec569a0362c235787f3aca6e1e887302ba4840839bcc6459c42da6"
-dependencies = [
- "quote",
-]
+checksum = "38b58827f4464d87d377d175e90bf58eb00fd8716ff0a62f80356b5e61555d0d"
[[package]]
name = "skrifa"
-version = "0.37.0"
+version = "0.19.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "8c31071dedf532758ecf3fed987cdb4bd9509f900e026ab684b4ecb81ea49841"
+checksum = "0ab45fb68b53576a43d4fc0e9ec8ea64e29a4d2cc7f44506964cb75f288222e9"
dependencies = [
"bytemuck",
"read-fonts",
@@ -4012,40 +3085,43 @@ dependencies = [
[[package]]
name = "slab"
-version = "0.4.12"
+version = "0.4.9"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "0c790de23124f9ab44544d7ac05d60440adc586479ce501c1d6d7da3cd8c9cf5"
+checksum = "8f92a496fb766b417c996b9c5e57daf2f7ad3b0bebe1ccfca4856390e3d3bb67"
+dependencies = [
+ "autocfg",
+]
[[package]]
name = "slotmap"
-version = "1.1.1"
+version = "1.0.7"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "bdd58c3c93c3d278ca835519292445cb4b0d4dc59ccfdf7ceadaab3f8aeb4038"
+checksum = "dbff4acf519f630b3a3ddcfaea6c06b42174d9a44bc70c620e9ed1649d58b82a"
dependencies = [
"version_check",
]
[[package]]
name = "smallvec"
-version = "1.15.1"
+version = "1.13.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "67b1b7a3b5fe4f1376887184045fcf45c69e92af734b7aaddc05fb777b6fbd03"
+checksum = "3c5e1a9a646d36c3599cd173a41282daf47c44583ad367b8e6837255952e5c67"
[[package]]
name = "smithay-client-toolkit"
-version = "0.19.2"
+version = "0.18.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "3457dea1f0eb631b4034d61d4d8c32074caa6cd1ab2d59f2327bd8461e2c0016"
+checksum = "922fd3eeab3bd820d76537ce8f582b1cf951eceb5475c28500c7457d9d17f53a"
dependencies = [
- "bitflags 2.10.0",
- "calloop 0.13.0",
- "calloop-wayland-source 0.3.0",
+ "bitflags 2.6.0",
+ "calloop",
+ "calloop-wayland-source",
"cursor-icon",
"libc",
"log",
- "memmap2",
- "rustix 0.38.44",
- "thiserror 1.0.69",
+ "memmap2 0.9.4",
+ "rustix",
+ "thiserror",
"wayland-backend",
"wayland-client",
"wayland-csd-frame",
@@ -4056,41 +3132,14 @@ dependencies = [
"xkeysym",
]
-[[package]]
-name = "smithay-client-toolkit"
-version = "0.20.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "0512da38f5e2b31201a93524adb8d3136276fa4fe4aafab4e1f727a82b534cc0"
-dependencies = [
- "bitflags 2.10.0",
- "calloop 0.14.3",
- "calloop-wayland-source 0.4.1",
- "cursor-icon",
- "libc",
- "log",
- "memmap2",
- "rustix 1.1.3",
- "thiserror 2.0.18",
- "wayland-backend",
- "wayland-client",
- "wayland-csd-frame",
- "wayland-cursor",
- "wayland-protocols",
- "wayland-protocols-experimental",
- "wayland-protocols-misc",
- "wayland-protocols-wlr",
- "wayland-scanner",
- "xkeysym",
-]
-
[[package]]
name = "smithay-clipboard"
-version = "0.7.3"
+version = "0.7.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "71704c03f739f7745053bde45fa203a46c58d25bc5c4efba1d9a60e9dba81226"
+checksum = "c091e7354ea8059d6ad99eace06dd13ddeedbb0ac72d40a9a6e7ff790525882d"
dependencies = [
"libc",
- "smithay-client-toolkit 0.20.0",
+ "smithay-client-toolkit",
"wayland-backend",
]
@@ -4103,80 +3152,97 @@ dependencies = [
"serde",
]
-[[package]]
-name = "socket2"
-version = "0.6.4"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "52d1cfed4120b4d927bf7c0f86d2087a4a7d6027c906d9f9d525a80573b9be51"
-dependencies = [
- "libc",
- "windows-sys 0.61.2",
-]
-
[[package]]
name = "softbuffer"
-version = "0.4.8"
+version = "0.4.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "aac18da81ebbf05109ab275b157c22a653bb3c12cf884450179942f81bcbf6c3"
+checksum = "d623bff5d06f60d738990980d782c8c866997d9194cfe79ecad00aa2f76826dd"
dependencies = [
"as-raw-xcb-connection",
"bytemuck",
+ "cfg_aliases 0.2.1",
+ "core-graphics",
+ "drm",
"fastrand",
+ "foreign-types",
"js-sys",
- "memmap2",
- "ndk",
- "objc2 0.6.3",
- "objc2-core-foundation",
- "objc2-core-graphics",
- "objc2-foundation 0.3.2",
- "objc2-quartz-core 0.3.2",
+ "log",
+ "memmap2 0.9.4",
+ "objc2 0.5.2",
+ "objc2-app-kit",
+ "objc2-foundation",
+ "objc2-quartz-core",
"raw-window-handle",
- "redox_syscall 0.5.18",
- "rustix 1.1.3",
+ "redox_syscall 0.5.2",
+ "rustix",
"tiny-xlib",
- "tracing",
"wasm-bindgen",
"wayland-backend",
"wayland-client",
"wayland-sys",
"web-sys",
- "windows-sys 0.61.2",
+ "windows-sys 0.52.0",
"x11rb",
]
+[[package]]
+name = "spin"
+version = "0.9.8"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "6980e8d7511241f8acf4aebddbb1ff938df5eebe98691418c4468d0b72a96a67"
+dependencies = [
+ "lock_api",
+]
+
[[package]]
name = "spirv"
version = "0.3.0+sdk-1.3.268.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "eda41003dc44290527a59b13432d4a0379379fa074b70174882adfbdfd917844"
dependencies = [
- "bitflags 2.10.0",
+ "bitflags 2.6.0",
]
-[[package]]
-name = "stable_deref_trait"
-version = "1.2.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "6ce2be8dc25455e1f91df71bfa12ad37d7af1092ae736f3a6cd0e37bc7810596"
-
[[package]]
name = "static_assertions"
version = "1.1.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "a2eb9349b6444b326872e140eb1cf5e7c522154d69e7a0ffb0fb81c06b37543f"
+[[package]]
+name = "static_init"
+version = "1.0.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "8a2a1c578e98c1c16fc3b8ec1328f7659a500737d7a0c6d625e73e830ff9c1f6"
+dependencies = [
+ "bitflags 1.3.2",
+ "cfg_aliases 0.1.1",
+ "libc",
+ "parking_lot 0.11.2",
+ "parking_lot_core 0.8.6",
+ "static_init_macro",
+ "winapi",
+]
+
+[[package]]
+name = "static_init_macro"
+version = "1.0.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "70a2595fc3aa78f2d0e45dd425b22282dd863273761cc77780914b2cf3003acf"
+dependencies = [
+ "cfg_aliases 0.1.1",
+ "memchr",
+ "proc-macro2",
+ "quote",
+ "syn 1.0.109",
+]
+
[[package]]
name = "strict-num"
version = "0.1.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "6637bab7722d379c8b41ba849228d680cc12d0a45ba1fa2b48f2a30577a06731"
-[[package]]
-name = "strsim"
-version = "0.11.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "7da8b5736845d9f2fcb837ea5d9e2628564b3b043a70948a3f0b778838c5fb4f"
-
[[package]]
name = "subtle"
version = "2.6.1"
@@ -4185,15 +3251,15 @@ checksum = "13c2bddecc57b384dee18652358fb23172facb8a2c51ccc10d74c157bdea3292"
[[package]]
name = "svg_fmt"
-version = "0.4.5"
+version = "0.4.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "0193cc4331cfd2f3d2011ef287590868599a2f33c3e69bc22c1a3d3acf9e02fb"
+checksum = "20e16a0f46cf5fd675563ef54f26e83e20f2366bcf027bcb3cc3ed2b98aaf2ca"
[[package]]
name = "swash"
-version = "0.2.6"
+version = "0.1.17"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "47846491253e976bdd07d0f9cc24b7daf24720d11309302ccbbc6e6b6e53550a"
+checksum = "4d7773d67fe3373048cf840bfcc54ec3207cfc1e95c526b287ef2eb5eff9faf6"
dependencies = [
"skrifa",
"yazi",
@@ -4202,9 +3268,9 @@ dependencies = [
[[package]]
name = "syn"
-version = "2.0.118"
+version = "1.0.109"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "1b9ae57f904213ebb649ce6895b8a66c66f0203b9319718f69a5612a065b1422"
+checksum = "72b64191b275b66ffe2469e8af2c1cfe3bafa67b529ead792a6d0160888b4237"
dependencies = [
"proc-macro2",
"quote",
@@ -4212,30 +3278,30 @@ dependencies = [
]
[[package]]
-name = "synstructure"
-version = "0.13.2"
+name = "syn"
+version = "2.0.70"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "728a70f3dbaf5bab7f0c4b1ac8d7ae5ea60a4b5549c8a5914361c99147a709d2"
+checksum = "2f0209b68b3613b093e0ec905354eccaedcfe83b8cb37cbdeae64026c3064c16"
dependencies = [
"proc-macro2",
"quote",
- "syn",
+ "unicode-ident",
]
[[package]]
name = "sys-locale"
-version = "0.3.2"
+version = "0.3.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "8eab9a99a024a169fe8a903cf9d4a3b3601109bcc13bd9e3c6fff259138626c4"
+checksum = "e801cf239ecd6ccd71f03d270d67dd53d13e90aab208bf4b8fe4ad957ea949b0"
dependencies = [
"libc",
]
[[package]]
name = "tar"
-version = "0.4.46"
+version = "0.4.41"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "3f6221d9a6003c78398e3b239969f352578258df48c8eb051caadae0015bc840"
+checksum = "cb797dad5fb5b76fcf519e702f4a589483b5ef06567f160c392832c1f5e44909"
dependencies = [
"filetime",
"libc",
@@ -4244,15 +3310,14 @@ dependencies = [
[[package]]
name = "tempfile"
-version = "3.25.0"
+version = "3.10.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "0136791f7c95b1f6dd99f9cc786b91bb81c3800b639b3478e561ddb7be95e5f1"
+checksum = "85b77fafb263dd9d05cbeac119526425676db3784113aa9295c88498cbf8bff1"
dependencies = [
+ "cfg-if",
"fastrand",
- "getrandom 0.4.1",
- "once_cell",
- "rustix 1.1.3",
- "windows-sys 0.61.2",
+ "rustix",
+ "windows-sys 0.52.0",
]
[[package]]
@@ -4266,87 +3331,33 @@ dependencies = [
[[package]]
name = "thiserror"
-version = "1.0.69"
+version = "1.0.61"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "b6aaf5339b578ea85b50e080feb250a3e8ae8cfcdff9a461c9ec2904bc923f52"
+checksum = "c546c80d6be4bc6a00c0f01730c08df82eaa7a7a61f11d656526506112cc1709"
dependencies = [
- "thiserror-impl 1.0.69",
-]
-
-[[package]]
-name = "thiserror"
-version = "2.0.18"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "4288b5bcbc7920c07a1149a35cf9590a2aa808e0bc1eafaade0b80947865fbc4"
-dependencies = [
- "thiserror-impl 2.0.18",
+ "thiserror-impl",
]
[[package]]
name = "thiserror-impl"
-version = "1.0.69"
+version = "1.0.61"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "4fee6c4efc90059e10f81e6d42c60a18f76588c3d74cb83a0b242a2b6c7504c1"
+checksum = "46c3384250002a6d5af4d114f2845d37b57521033f30d5c3f46c4d70e1197533"
dependencies = [
"proc-macro2",
"quote",
- "syn",
-]
-
-[[package]]
-name = "thiserror-impl"
-version = "2.0.18"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "ebc4ee7f67670e9b64d05fa4253e753e016c6c95ff35b89b7941d6b856dec1d5"
-dependencies = [
- "proc-macro2",
- "quote",
- "syn",
+ "syn 2.0.70",
]
[[package]]
name = "tiff"
-version = "0.10.3"
+version = "0.9.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "af9605de7fee8d9551863fd692cce7637f548dbd9db9180fcc07ccc6d26c336f"
+checksum = "ba1310fcea54c6a9a4fd1aad794ecc02c31682f6bfbecdf460bf19533eed1e3e"
dependencies = [
- "fax",
"flate2",
- "half",
- "quick-error",
+ "jpeg-decoder",
"weezl",
- "zune-jpeg 0.4.21",
-]
-
-[[package]]
-name = "time"
-version = "0.3.47"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "743bd48c283afc0388f9b8827b976905fb217ad9e647fae3a379a9283c4def2c"
-dependencies = [
- "deranged",
- "itoa",
- "num-conv",
- "powerfmt",
- "serde_core",
- "time-core",
- "time-macros",
-]
-
-[[package]]
-name = "time-core"
-version = "0.1.8"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "7694e1cfe791f8d31026952abf09c69ca6f6fa4e1a1229e18988f06a04a12dca"
-
-[[package]]
-name = "time-macros"
-version = "0.2.27"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "2e70e4c5a0e0a8a4823ad65dfe1a6930e4f4d756dcd9dd7939022b5e8c501215"
-dependencies = [
- "num-conv",
- "time-core",
]
[[package]]
@@ -4360,6 +3371,7 @@ dependencies = [
"bytemuck",
"cfg-if",
"log",
+ "png",
"tiny-skia-path",
]
@@ -4376,32 +3388,22 @@ dependencies = [
[[package]]
name = "tiny-xlib"
-version = "0.2.4"
+version = "0.2.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "0324504befd01cab6e0c994f34b2ffa257849ee019d3fb3b64fb2c858887d89e"
+checksum = "1d52f22673960ad13af14ff4025997312def1223bfa7c8e4949d099e6b3d5d1c"
dependencies = [
"as-raw-xcb-connection",
"ctor-lite",
- "libloading",
+ "libloading 0.8.4",
"pkg-config",
"tracing",
]
-[[package]]
-name = "tinystr"
-version = "0.8.2"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "42d3e9c45c09de15d06dd8acf5f4e0e399e85927b7f00711024eb7ae10fa4869"
-dependencies = [
- "displaydoc",
- "zerovec",
-]
-
[[package]]
name = "tinyvec"
-version = "1.10.0"
+version = "1.8.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "bfa5fdc3bce6191a1dbc8c02d5c8bffcf557bafa17c124c5264a458f1b0613fa"
+checksum = "445e881f4f6d382d5f27c034e25eb92edd7c784ceab92a0937db7f2e9471b938"
dependencies = [
"tinyvec_macros",
]
@@ -4412,92 +3414,57 @@ version = "0.1.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20"
-[[package]]
-name = "tokio"
-version = "1.52.3"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "8fc7f01b389ac15039e4dc9531aa973a135d7a4135281b12d7c1bc79fd57fffe"
-dependencies = [
- "bytes",
- "libc",
- "mio",
- "parking_lot",
- "pin-project-lite",
- "signal-hook-registry",
- "socket2",
- "tokio-macros",
- "windows-sys 0.61.2",
-]
-
-[[package]]
-name = "tokio-macros"
-version = "2.7.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "385a6cb71ab9ab790c5fe8d67f1645e6c450a7ce006a33de03daa956cf70a496"
-dependencies = [
- "proc-macro2",
- "quote",
- "syn",
-]
-
[[package]]
name = "toml"
-version = "0.9.12+spec-1.1.0"
+version = "0.8.14"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "cf92845e79fc2e2def6a5d828f0801e29a2f8acc037becc5ab08595c7d5e9863"
+checksum = "6f49eb2ab21d2f26bd6db7bf383edc527a7ebaee412d17af4d40fdccd442f335"
dependencies = [
- "indexmap",
- "serde_core",
+ "serde",
"serde_spanned",
"toml_datetime",
- "toml_parser",
- "toml_writer",
- "winnow",
+ "toml_edit 0.22.15",
]
[[package]]
name = "toml_datetime"
-version = "0.7.5+spec-1.1.0"
+version = "0.6.6"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "92e1cfed4a3038bc5a127e35a2d360f145e1f4b971b551a2ba5fd7aedf7e1347"
+checksum = "4badfd56924ae69bcc9039335b2e017639ce3f9b001c393c1b2d1ef846ce2cbf"
dependencies = [
- "serde_core",
+ "serde",
]
[[package]]
name = "toml_edit"
-version = "0.23.10+spec-1.0.0"
+version = "0.21.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "84c8b9f757e028cee9fa244aea147aab2a9ec09d5325a9b01e0a49730c2b5269"
+checksum = "6a8534fd7f78b5405e860340ad6575217ce99f38d4d5c8f2442cb5ecb50090e1"
dependencies = [
"indexmap",
"toml_datetime",
- "toml_parser",
- "winnow",
+ "winnow 0.5.40",
]
[[package]]
-name = "toml_parser"
-version = "1.0.7+spec-1.1.0"
+name = "toml_edit"
+version = "0.22.15"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "247eaa3197818b831697600aadf81514e577e0cba5eab10f7e064e78ae154df1"
+checksum = "d59a3a72298453f564e2b111fa896f8d07fabb36f51f06d7e875fc5e0b5a3ef1"
dependencies = [
- "winnow",
+ "indexmap",
+ "serde",
+ "serde_spanned",
+ "toml_datetime",
+ "winnow 0.6.13",
]
-[[package]]
-name = "toml_writer"
-version = "1.0.6+spec-1.1.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "ab16f14aed21ee8bfd8ec22513f7287cd4a91aa92e44edfe2c17ddd004e92607"
-
[[package]]
name = "tracing"
-version = "0.1.44"
+version = "0.1.40"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "63e71662fa4b2a2c3a26f570f037eb95bb1f85397f3cd8076caed2f026a6d100"
+checksum = "c3523ab5a71916ccf420eebdf5521fcef02141234bbc0b8a49f2fdc4544364ef"
dependencies = [
- "log",
"pin-project-lite",
"tracing-attributes",
"tracing-core",
@@ -4505,87 +3472,70 @@ dependencies = [
[[package]]
name = "tracing-attributes"
-version = "0.1.31"
+version = "0.1.27"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "7490cfa5ec963746568740651ac6781f701c9c5ea257c58e057f3ba8cf69e8da"
+checksum = "34704c8d6ebcbc939824180af020566b01a7c01f80641264eba0999f6c2b6be7"
dependencies = [
"proc-macro2",
"quote",
- "syn",
+ "syn 2.0.70",
]
[[package]]
name = "tracing-core"
-version = "0.1.36"
+version = "0.1.32"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "db97caf9d906fbde555dd62fa95ddba9eecfd14cb388e4f491a66d74cd5fb79a"
+checksum = "c06d3da6113f116aaee68e4d601191614c9053067f9ab7f6edbcb161237daa54"
dependencies = [
"once_cell",
]
[[package]]
name = "ttf-parser"
-version = "0.25.1"
+version = "0.19.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "d2df906b07856748fa3f6e0ad0cbaa047052d4a7dd609e231c4f72cee8c36f31"
-dependencies = [
- "core_maths",
-]
+checksum = "49d64318d8311fc2668e48b63969f4343e0a85c4a109aa8460d6672e364b8bd1"
[[package]]
-name = "uad-cli"
-version = "1.2.0"
-dependencies = [
- "chrono",
- "clap",
- "clap_complete",
- "csv",
- "dirs",
- "log",
- "retry",
- "rustyline",
- "serde",
- "serde_json",
- "tokio",
- "toml",
- "uad-core",
- "ureq",
-]
+name = "ttf-parser"
+version = "0.20.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "17f77d76d837a7830fe1d4f12b7b4ba4192c1888001c7164257e4bc6d21d96b4"
[[package]]
-name = "uad-core"
-version = "1.2.0"
+name = "ttf-parser"
+version = "0.24.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "8686b91785aff82828ed725225925b33b4fde44c4bb15876e5f7c832724c420a"
+
+[[package]]
+name = "typenum"
+version = "1.17.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "42ff0bf0c66b8238c6f3b578df37d0b7848e55df8577b3f74f92a69acceeb825"
+
+[[package]]
+name = "uad-ng"
+version = "1.1.0"
dependencies = [
"chrono",
"csv",
- "dirs",
- "flate2",
- "log",
- "retry",
- "serde",
- "serde_json",
- "tar",
- "toml",
- "ureq",
- "win32console",
-]
-
-[[package]]
-name = "uad-gui"
-version = "1.2.0"
-dependencies = [
- "chrono",
"dark-light",
- "dirs",
+ "dirs 5.0.1",
"embed-resource",
"fern",
"flate2",
"iced",
- "image",
"log",
+ "regex",
+ "retry",
"rfd",
+ "serde",
+ "serde_json",
+ "static_init",
"tar",
- "uad-core",
+ "toml",
+ "ureq",
"win32console",
]
@@ -4602,15 +3552,27 @@ dependencies = [
[[package]]
name = "unicode-bidi"
-version = "0.3.18"
+version = "0.3.15"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "5c1cb5db39152898a79168971543b1cb5020dff7fe43c8dc468b0885f5e29df5"
+checksum = "08f95100a766bf4f8f28f90d77e0a5461bbdb219042e7679bebe79004fed8d75"
+
+[[package]]
+name = "unicode-bidi-mirroring"
+version = "0.1.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "56d12260fb92d52f9008be7e4bca09f584780eb2266dc8fecc6a192bec561694"
+
+[[package]]
+name = "unicode-ccc"
+version = "0.1.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "cc2520efa644f8268dce4dcd3050eaa7fc044fca03961e9998ac7e2e92b77cf1"
[[package]]
name = "unicode-ident"
-version = "1.0.23"
+version = "1.0.12"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "537dd038a89878be9b64dd4bd1b260315c1bb94f4d784956b81e27a088d9a09e"
+checksum = "3354b9ac3fae1ff6755cb6db53683adb661634f67557942dea4facebec0fee4b"
[[package]]
name = "unicode-linebreak"
@@ -4619,34 +3581,43 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "3b09c83c3c29d37506a3e260c08c03743a6bb66a9cd432c6934ab501a190571f"
[[package]]
-name = "unicode-script"
-version = "0.5.8"
+name = "unicode-normalization"
+version = "0.1.23"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "383ad40bb927465ec0ce7720e033cb4ca06912855fc35db31b5755d0de75b1ee"
+checksum = "a56d1686db2308d901306f92a263857ef59ea39678a5458e7cb17f01415101f5"
+dependencies = [
+ "tinyvec",
+]
+
+[[package]]
+name = "unicode-properties"
+version = "0.1.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "e4259d9d4425d9f0661581b804cb85fe66a4c631cadd8f490d1c13a35d5d9291"
+
+[[package]]
+name = "unicode-script"
+version = "0.5.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "ad8d71f5726e5f285a935e9fe8edfd53f0491eb6e9a5774097fdabee7cd8c9cd"
[[package]]
name = "unicode-segmentation"
-version = "1.12.0"
+version = "1.11.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "f6ccf251212114b54433ec949fd6a7841275f9ada20dddd2f29e9ceea4501493"
+checksum = "d4c87d22b6e3f4a18d4d40ef354e97c90fcb14dd91d7dc0aa9d8a1172ebf7202"
[[package]]
name = "unicode-width"
-version = "0.1.14"
+version = "0.1.13"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "7dd6e30e90baa6f72411720665d41d89b9a3d039dc45b8faea1ddd07f617f6af"
-
-[[package]]
-name = "unicode-width"
-version = "0.2.2"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "b4ac048d71ede7ee76d585517add45da530660ef4390e49b098733c6e897f254"
+checksum = "0336d538f7abc86d282a4189614dfaa90810dfc2c6f6427eaf88e16311dd225d"
[[package]]
name = "unicode-xid"
-version = "0.2.6"
+version = "0.2.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "ebc1c04c71510c7f702b52b7c350734c9ff1295c464a03335b00bb84fc54f853"
+checksum = "f962df74c8c05a667b5ee8bcf162993134c104e96440b663c8daa176dc772d8c"
[[package]]
name = "untrusted"
@@ -4656,100 +3627,45 @@ checksum = "8ecb6da28b8a351d773b68d5825ac39017e680750f980f3a1a85cd8dd28a47c1"
[[package]]
name = "ureq"
-version = "3.2.0"
+version = "2.10.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "fdc97a28575b85cfedf2a7e7d3cc64b3e11bd8ac766666318003abbacc7a21fc"
+checksum = "72139d247e5f97a3eff96229a7ae85ead5328a39efe76f8bf5a06313d505b6ea"
dependencies = [
"base64",
- "cookie_store",
"flate2",
"log",
- "percent-encoding",
+ "once_cell",
"rustls",
"rustls-pki-types",
"serde",
"serde_json",
- "ureq-proto",
- "utf-8",
+ "url",
"webpki-roots",
]
-[[package]]
-name = "ureq-proto"
-version = "0.5.3"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "d81f9efa9df032be5934a46a068815a10a042b494b6a58cb0a1a97bb5467ed6f"
-dependencies = [
- "base64",
- "http",
- "httparse",
- "log",
-]
-
[[package]]
name = "url"
-version = "2.5.8"
+version = "2.5.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "ff67a8a4397373c3ef660812acab3268222035010ab8680ec4215f38ba3d0eed"
+checksum = "22784dbdf76fdde8af1aeda5622b546b422b6fc585325248a2bf9f5e41e94d6c"
dependencies = [
"form_urlencoded",
"idna",
"percent-encoding",
"serde",
- "serde_derive",
]
[[package]]
-name = "utf-8"
-version = "0.7.6"
+name = "urlencoding"
+version = "2.1.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "09cc8ee72d2a9becf2f2febe0205bbed8fc6615b7cb429ad062dc7b7ddd036a9"
-
-[[package]]
-name = "utf8_iter"
-version = "1.0.4"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "b6c140620e7ffbb22c2dee59cafe6084a59b5ffc27a8859a5f0d494b5d52b6be"
-
-[[package]]
-name = "utf8parse"
-version = "0.2.2"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "06abde3611657adf66d383f00b093d7faecc7fa57071cce2578660c9f1010821"
-
-[[package]]
-name = "uuid"
-version = "1.20.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "ee48d38b119b0cd71fe4141b30f5ba9c7c5d9f4e7a3a8b4a674e4b6ef789976f"
-dependencies = [
- "js-sys",
- "serde_core",
- "wasm-bindgen",
-]
-
-[[package]]
-name = "v_frame"
-version = "0.3.9"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "666b7727c8875d6ab5db9533418d7c764233ac9c0cff1d469aec8fa127597be2"
-dependencies = [
- "aligned-vec",
- "num-traits",
- "wasm-bindgen",
-]
-
-[[package]]
-name = "value-bag"
-version = "1.12.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "7ba6f5989077681266825251a52748b8c1d8a4ad098cc37e440103d0ea717fc0"
+checksum = "daf8dba3b7eb870caf1ddeed7bc9d2a049f3cfdfae7cb521b087cc33ae4c49da"
[[package]]
name = "version_check"
-version = "0.9.5"
+version = "0.9.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "0b928f33d975fc6ad9f86c8f283853ad26bdd5b10b7f1542aa2fa15e2289105a"
+checksum = "49874b5167b65d7193b8aba1567f5c7d93d001cafc34600cee003eda787e483f"
[[package]]
name = "vswhom"
@@ -4763,9 +3679,9 @@ dependencies = [
[[package]]
name = "vswhom-sys"
-version = "0.1.3"
+version = "0.1.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "fb067e4cbd1ff067d1df46c9194b5de0e98efd2810bbc95c5d5e5f25a3231150"
+checksum = "d3b17ae1f6c8a2b28506cd96d412eebf83b4a0ff2cbefeeb952f2f9dfa44ba18"
dependencies = [
"cc",
"libc",
@@ -4783,60 +3699,52 @@ dependencies = [
[[package]]
name = "wasi"
-version = "0.11.1+wasi-snapshot-preview1"
+version = "0.11.0+wasi-snapshot-preview1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "ccf3ec651a847eb01de73ccad15eb7d99f80485de043efb2f370cd654f4ea44b"
-
-[[package]]
-name = "wasip2"
-version = "1.0.2+wasi-0.2.9"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "9517f9239f02c069db75e65f174b3da828fe5f5b945c4dd26bd25d89c03ebcf5"
-dependencies = [
- "wit-bindgen",
-]
-
-[[package]]
-name = "wasip3"
-version = "0.4.0+wasi-0.3.0-rc-2026-01-06"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "5428f8bf88ea5ddc08faddef2ac4a67e390b88186c703ce6dbd955e1c145aca5"
-dependencies = [
- "wit-bindgen",
-]
+checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423"
[[package]]
name = "wasm-bindgen"
-version = "0.2.108"
+version = "0.2.92"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "64024a30ec1e37399cf85a7ffefebdb72205ca1c972291c51512360d90bd8566"
+checksum = "4be2531df63900aeb2bca0daaaddec08491ee64ceecbee5076636a3b026795a8"
dependencies = [
"cfg-if",
- "once_cell",
- "rustversion",
"wasm-bindgen-macro",
+]
+
+[[package]]
+name = "wasm-bindgen-backend"
+version = "0.2.92"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "614d787b966d3989fa7bb98a654e369c762374fd3213d212cfc0251257e747da"
+dependencies = [
+ "bumpalo",
+ "log",
+ "once_cell",
+ "proc-macro2",
+ "quote",
+ "syn 2.0.70",
"wasm-bindgen-shared",
]
[[package]]
name = "wasm-bindgen-futures"
-version = "0.4.58"
+version = "0.4.42"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "70a6e77fd0ae8029c9ea0063f87c46fde723e7d887703d74ad2616d792e51e6f"
+checksum = "76bc14366121efc8dbb487ab05bcc9d346b3b5ec0eaa76e46594cabbe51762c0"
dependencies = [
"cfg-if",
- "futures-util",
"js-sys",
- "once_cell",
"wasm-bindgen",
"web-sys",
]
[[package]]
name = "wasm-bindgen-macro"
-version = "0.2.108"
+version = "0.2.92"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "008b239d9c740232e71bd39e8ef6429d27097518b6b30bdf9086833bd5b6d608"
+checksum = "a1f8823de937b71b9460c0c34e25f3da88250760bec0ebac694b49997550d726"
dependencies = [
"quote",
"wasm-bindgen-macro-support",
@@ -4844,83 +3752,47 @@ dependencies = [
[[package]]
name = "wasm-bindgen-macro-support"
-version = "0.2.108"
+version = "0.2.92"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "5256bae2d58f54820e6490f9839c49780dff84c65aeab9e772f15d5f0e913a55"
+checksum = "e94f17b526d0a461a191c78ea52bbce64071ed5c04c9ffe424dcb38f74171bb7"
dependencies = [
- "bumpalo",
"proc-macro2",
"quote",
- "syn",
+ "syn 2.0.70",
+ "wasm-bindgen-backend",
"wasm-bindgen-shared",
]
[[package]]
name = "wasm-bindgen-shared"
-version = "0.2.108"
+version = "0.2.92"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "1f01b580c9ac74c8d8f0c0e4afb04eeef2acf145458e52c03845ee9cd23e3d12"
-dependencies = [
- "unicode-ident",
-]
+checksum = "af190c94f2773fdb3729c55b007a722abb5384da03bc0986df4c289bf5567e96"
[[package]]
-name = "wasm-encoder"
-version = "0.244.0"
+name = "wasm-timer"
+version = "0.2.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "990065f2fe63003fe337b932cfb5e3b80e0b4d0f5ff650e6985b1048f62c8319"
-dependencies = [
- "leb128fmt",
- "wasmparser",
-]
-
-[[package]]
-name = "wasm-metadata"
-version = "0.244.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "bb0e353e6a2fbdc176932bbaab493762eb1255a7900fe0fea1a2f96c296cc909"
-dependencies = [
- "anyhow",
- "indexmap",
- "wasm-encoder",
- "wasmparser",
-]
-
-[[package]]
-name = "wasmparser"
-version = "0.244.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "47b807c72e1bac69382b3a6fb3dbe8ea4c0ed87ff5629b8685ae6b9a611028fe"
-dependencies = [
- "bitflags 2.10.0",
- "hashbrown 0.15.5",
- "indexmap",
- "semver",
-]
-
-[[package]]
-name = "wasmtimer"
-version = "0.4.3"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "1c598d6b99ea013e35844697fc4670d08339d5cda15588f193c6beedd12f644b"
+checksum = "be0ecb0db480561e9a7642b5d3e4187c128914e58aa84330b9493e3eb68c5e7f"
dependencies = [
"futures",
"js-sys",
- "parking_lot",
+ "parking_lot 0.11.2",
"pin-utils",
- "slab",
"wasm-bindgen",
+ "wasm-bindgen-futures",
+ "web-sys",
]
[[package]]
name = "wayland-backend"
-version = "0.3.12"
+version = "0.3.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "fee64194ccd96bf648f42a65a7e589547096dfa702f7cadef84347b66ad164f9"
+checksum = "269c04f203640d0da2092d1b8d89a2d081714ae3ac2f1b53e99f205740517198"
dependencies = [
"cc",
"downcast-rs",
- "rustix 1.1.3",
+ "rustix",
"scoped-tls",
"smallvec",
"wayland-sys",
@@ -4928,12 +3800,12 @@ dependencies = [
[[package]]
name = "wayland-client"
-version = "0.31.12"
+version = "0.31.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "b8e6faa537fbb6c186cb9f1d41f2f811a4120d1b57ec61f50da451a0c5122bec"
+checksum = "08bd0f46c069d3382a36c8666c1b9ccef32b8b04f41667ca1fef06a1adcc2982"
dependencies = [
- "bitflags 2.10.0",
- "rustix 1.1.3",
+ "bitflags 2.6.0",
+ "rustix",
"wayland-backend",
"wayland-scanner",
]
@@ -4944,67 +3816,41 @@ version = "0.3.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "625c5029dbd43d25e6aa9615e88b829a5cad13b2819c4ae129fdbb7c31ab4c7e"
dependencies = [
- "bitflags 2.10.0",
+ "bitflags 2.6.0",
"cursor-icon",
"wayland-backend",
]
[[package]]
name = "wayland-cursor"
-version = "0.31.12"
+version = "0.31.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "5864c4b5b6064b06b1e8b74ead4a98a6c45a285fe7a0e784d24735f011fdb078"
+checksum = "09414bcf0fd8d9577d73e9ac4659ebc45bcc9cff1980a350543ad8e50ee263b2"
dependencies = [
- "rustix 1.1.3",
+ "rustix",
"wayland-client",
"xcursor",
]
[[package]]
name = "wayland-protocols"
-version = "0.32.10"
+version = "0.31.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "baeda9ffbcfc8cd6ddaade385eaf2393bd2115a69523c735f12242353c3df4f3"
+checksum = "8f81f365b8b4a97f422ac0e8737c438024b5951734506b0e1d775c73030561f4"
dependencies = [
- "bitflags 2.10.0",
+ "bitflags 2.6.0",
"wayland-backend",
"wayland-client",
"wayland-scanner",
]
-[[package]]
-name = "wayland-protocols-experimental"
-version = "20250721.0.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "40a1f863128dcaaec790d7b4b396cc9b9a7a079e878e18c47e6c2d2c5a8dcbb1"
-dependencies = [
- "bitflags 2.10.0",
- "wayland-backend",
- "wayland-client",
- "wayland-protocols",
- "wayland-scanner",
-]
-
-[[package]]
-name = "wayland-protocols-misc"
-version = "0.3.10"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "791c58fdeec5406aa37169dd815327d1e47f334219b523444bc26d70ceb4c34e"
-dependencies = [
- "bitflags 2.10.0",
- "wayland-backend",
- "wayland-client",
- "wayland-protocols",
- "wayland-scanner",
-]
-
[[package]]
name = "wayland-protocols-plasma"
-version = "0.3.10"
+version = "0.2.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "aa98634619300a535a9a97f338aed9a5ff1e01a461943e8346ff4ae26007306b"
+checksum = "23803551115ff9ea9bce586860c5c5a971e360825a0309264102a9495a5ff479"
dependencies = [
- "bitflags 2.10.0",
+ "bitflags 2.6.0",
"wayland-backend",
"wayland-client",
"wayland-protocols",
@@ -5013,11 +3859,11 @@ dependencies = [
[[package]]
name = "wayland-protocols-wlr"
-version = "0.3.10"
+version = "0.2.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "e9597cdf02cf0c34cd5823786dce6b5ae8598f05c2daf5621b6e178d4f7345f3"
+checksum = "ad1f61b76b6c2d8742e10f9ba5c3737f6530b4c243132c2a2ccc8aa96fe25cd6"
dependencies = [
- "bitflags 2.10.0",
+ "bitflags 2.6.0",
"wayland-backend",
"wayland-client",
"wayland-protocols",
@@ -5026,9 +3872,9 @@ dependencies = [
[[package]]
name = "wayland-scanner"
-version = "0.31.8"
+version = "0.31.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "5423e94b6a63e68e439803a3e153a9252d5ead12fd853334e2ad33997e3889e3"
+checksum = "edf466fc49a4feb65a511ca403fec3601494d0dee85dbf37fff6fa0dd4eec3b6"
dependencies = [
"proc-macro2",
"quick-xml",
@@ -5037,9 +3883,9 @@ dependencies = [
[[package]]
name = "wayland-sys"
-version = "0.31.8"
+version = "0.31.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "1e6dbfc3ac5ef974c92a2235805cc0114033018ae1290a72e474aa8b28cbbdfd"
+checksum = "4a6754825230fa5b27bafaa28c30b3c9e72c55530581220cef401fa422c0fae7"
dependencies = [
"dlib",
"log",
@@ -5049,9 +3895,9 @@ dependencies = [
[[package]]
name = "web-sys"
-version = "0.3.85"
+version = "0.3.67"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "312e32e551d92129218ea9a2452120f4aabc03529ef03e4d0d82fb2780608598"
+checksum = "58cd2333b6e0be7a39605f0e255892fd7418a682d8da8fe042fe25128794d2ed"
dependencies = [
"js-sys",
"wasm-bindgen",
@@ -5059,9 +3905,9 @@ dependencies = [
[[package]]
name = "web-time"
-version = "1.1.0"
+version = "0.2.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "5a6580f308b1fad9207618087a65c04e7a10bc77e02c8e84e9b00dd4b12fa0bb"
+checksum = "aa30049b1c872b72c89866d458eae9f20380ab280ffd1b1e18df2d3e2d98cfe0"
dependencies = [
"js-sys",
"wasm-bindgen",
@@ -5069,36 +3915,32 @@ dependencies = [
[[package]]
name = "webpki-roots"
-version = "1.0.6"
+version = "0.26.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "22cfaf3c063993ff62e73cb4311efde4db1efb31ab78a3e5c457939ad5cc0bed"
+checksum = "bd7c23921eeb1713a4e851530e9b9756e4fb0e89978582942612524cf09f01cd"
dependencies = [
"rustls-pki-types",
]
[[package]]
name = "weezl"
-version = "0.1.12"
+version = "0.1.8"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "a28ac98ddc8b9274cb41bb4d9d4d5c425b6020c50c46f25559911905610b4a88"
+checksum = "53a85b86a771b1c87058196170769dd264f66c0782acf1ae6cc51bfd64b39082"
[[package]]
name = "wgpu"
-version = "27.0.1"
+version = "0.19.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "bfe68bac7cde125de7a731c3400723cadaaf1703795ad3f4805f187459cd7a77"
+checksum = "cbd7311dbd2abcfebaabf1841a2824ed7c8be443a0f29166e5d3c6a53a762c01"
dependencies = [
"arrayvec",
- "bitflags 2.10.0",
"cfg-if",
- "cfg_aliases 0.2.1",
- "document-features",
- "hashbrown 0.16.1",
+ "cfg_aliases 0.1.1",
"js-sys",
"log",
"naga",
- "parking_lot",
- "portable-atomic",
+ "parking_lot 0.12.3",
"profiling",
"raw-window-handle",
"smallvec",
@@ -5113,126 +3955,92 @@ dependencies = [
[[package]]
name = "wgpu-core"
-version = "27.0.3"
+version = "0.19.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "27a75de515543b1897b26119f93731b385a19aea165a1ec5f0e3acecc229cae7"
+checksum = "28b94525fc99ba9e5c9a9e24764f2bc29bad0911a7446c12f446a8277369bf3a"
dependencies = [
"arrayvec",
- "bit-set",
"bit-vec",
- "bitflags 2.10.0",
- "bytemuck",
- "cfg_aliases 0.2.1",
- "document-features",
- "hashbrown 0.16.1",
+ "bitflags 2.6.0",
+ "cfg_aliases 0.1.1",
+ "codespan-reporting",
"indexmap",
"log",
"naga",
"once_cell",
- "parking_lot",
- "portable-atomic",
+ "parking_lot 0.12.3",
"profiling",
"raw-window-handle",
- "rustc-hash 1.1.0",
+ "rustc-hash",
"smallvec",
- "thiserror 2.0.18",
- "wgpu-core-deps-apple",
- "wgpu-core-deps-emscripten",
- "wgpu-core-deps-windows-linux-android",
+ "thiserror",
+ "web-sys",
"wgpu-hal",
"wgpu-types",
]
-[[package]]
-name = "wgpu-core-deps-apple"
-version = "27.0.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "0772ae958e9be0c729561d5e3fd9a19679bcdfb945b8b1a1969d9bfe8056d233"
-dependencies = [
- "wgpu-hal",
-]
-
-[[package]]
-name = "wgpu-core-deps-emscripten"
-version = "27.0.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "b06ac3444a95b0813ecfd81ddb2774b66220b264b3e2031152a4a29fda4da6b5"
-dependencies = [
- "wgpu-hal",
-]
-
-[[package]]
-name = "wgpu-core-deps-windows-linux-android"
-version = "27.0.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "71197027d61a71748e4120f05a9242b2ad142e3c01f8c1b47707945a879a03c3"
-dependencies = [
- "wgpu-hal",
-]
-
[[package]]
name = "wgpu-hal"
-version = "27.0.4"
+version = "0.19.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "5b21cb61c57ee198bc4aff71aeadff4cbb80b927beb912506af9c780d64313ce"
+checksum = "fc1a4924366df7ab41a5d8546d6534f1f33231aa5b3f72b9930e300f254e39c3"
dependencies = [
"android_system_properties",
"arrayvec",
"ash",
"bit-set",
- "bitflags 2.10.0",
+ "bitflags 2.6.0",
"block",
- "bytemuck",
- "cfg-if",
- "cfg_aliases 0.2.1",
- "core-graphics-types 0.2.0",
+ "cfg_aliases 0.1.1",
+ "core-graphics-types",
+ "d3d12",
"glow",
"glutin_wgl_sys",
"gpu-alloc",
"gpu-allocator",
"gpu-descriptor",
- "hashbrown 0.16.1",
+ "hassle-rs",
"js-sys",
"khronos-egl",
"libc",
- "libloading",
+ "libloading 0.8.4",
"log",
"metal",
"naga",
"ndk-sys",
"objc",
"once_cell",
- "ordered-float",
- "parking_lot",
- "portable-atomic",
- "portable-atomic-util",
+ "parking_lot 0.12.3",
"profiling",
"range-alloc",
"raw-window-handle",
"renderdoc-sys",
+ "rustc-hash",
"smallvec",
- "thiserror 2.0.18",
+ "thiserror",
"wasm-bindgen",
"web-sys",
"wgpu-types",
- "windows 0.58.0",
- "windows-core 0.58.0",
+ "winapi",
]
[[package]]
name = "wgpu-types"
-version = "27.0.1"
+version = "0.19.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "afdcf84c395990db737f2dd91628706cb31e86d72e53482320d368e52b5da5eb"
+checksum = "b671ff9fb03f78b46ff176494ee1ebe7d603393f42664be55b64dc8d53969805"
dependencies = [
- "bitflags 2.10.0",
- "bytemuck",
+ "bitflags 2.6.0",
"js-sys",
- "log",
- "thiserror 2.0.18",
"web-sys",
]
+[[package]]
+name = "widestring"
+version = "1.1.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "7219d36b6eac893fa81e84ebe06485e7dcbb616177469b142df14f1f4deb1311"
+
[[package]]
name = "win32console"
version = "0.1.5"
@@ -5260,11 +4068,11 @@ checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6"
[[package]]
name = "winapi-util"
-version = "0.1.11"
+version = "0.1.8"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "c2a7b1c03c876122aa43f3020e6c3c3ee5c05081c9a00739faf7503aeba10d22"
+checksum = "4d4cc384e1e73b93bafa6fb4f1df8c41695c8a91cf9c4c64358067d15a7b6c6b"
dependencies = [
- "windows-sys 0.61.2",
+ "windows-sys 0.52.0",
]
[[package]]
@@ -5275,183 +4083,37 @@ checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f"
[[package]]
name = "window_clipboard"
-version = "0.5.1"
+version = "0.4.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "d5654226305eaf2dde8853fb482861d28e5dcecbbd40cb88e8393d94bb80d733"
+checksum = "f6d692d46038c433f9daee7ad8757e002a4248c20b0a3fbc991d99521d3bcb6d"
dependencies = [
"clipboard-win",
"clipboard_macos",
"clipboard_wayland",
"clipboard_x11",
"raw-window-handle",
- "thiserror 2.0.18",
+ "thiserror",
]
[[package]]
name = "windows"
-version = "0.58.0"
+version = "0.52.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "dd04d41d93c4992d421894c18c8b43496aa748dd4c081bac0dc93eb0489272b6"
+checksum = "e48a53791691ab099e5e2ad123536d0fff50652600abaf43bbf952894110d0be"
dependencies = [
- "windows-core 0.58.0",
- "windows-targets 0.52.6",
-]
-
-[[package]]
-name = "windows"
-version = "0.62.2"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "527fadee13e0c05939a6a05d5bd6eec6cd2e3dbd648b9f8e447c6518133d8580"
-dependencies = [
- "windows-collections",
- "windows-core 0.62.2",
- "windows-future",
- "windows-numerics",
-]
-
-[[package]]
-name = "windows-collections"
-version = "0.3.2"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "23b2d95af1a8a14a3c7367e1ed4fc9c20e0a26e79551b1454d72583c97cc6610"
-dependencies = [
- "windows-core 0.62.2",
-]
-
-[[package]]
-name = "windows-core"
-version = "0.58.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "6ba6d44ec8c2591c134257ce647b7ea6b20335bf6379a27dac5f1641fcf59f99"
-dependencies = [
- "windows-implement 0.58.0",
- "windows-interface 0.58.0",
- "windows-result 0.2.0",
- "windows-strings 0.1.0",
+ "windows-core",
"windows-targets 0.52.6",
]
[[package]]
name = "windows-core"
-version = "0.62.2"
+version = "0.52.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "b8e83a14d34d0623b51dce9581199302a221863196a1dde71a7663a4c2be9deb"
-dependencies = [
- "windows-implement 0.60.2",
- "windows-interface 0.59.3",
- "windows-link",
- "windows-result 0.4.1",
- "windows-strings 0.5.1",
-]
-
-[[package]]
-name = "windows-future"
-version = "0.3.2"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "e1d6f90251fe18a279739e78025bd6ddc52a7e22f921070ccdc67dde84c605cb"
-dependencies = [
- "windows-core 0.62.2",
- "windows-link",
- "windows-threading",
-]
-
-[[package]]
-name = "windows-implement"
-version = "0.58.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "2bbd5b46c938e506ecbce286b6628a02171d56153ba733b6c741fc627ec9579b"
-dependencies = [
- "proc-macro2",
- "quote",
- "syn",
-]
-
-[[package]]
-name = "windows-implement"
-version = "0.60.2"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "053e2e040ab57b9dc951b72c264860db7eb3b0200ba345b4e4c3b14f67855ddf"
-dependencies = [
- "proc-macro2",
- "quote",
- "syn",
-]
-
-[[package]]
-name = "windows-interface"
-version = "0.58.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "053c4c462dc91d3b1504c6fe5a726dd15e216ba718e84a0e46a88fbe5ded3515"
-dependencies = [
- "proc-macro2",
- "quote",
- "syn",
-]
-
-[[package]]
-name = "windows-interface"
-version = "0.59.3"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "3f316c4a2570ba26bbec722032c4099d8c8bc095efccdc15688708623367e358"
-dependencies = [
- "proc-macro2",
- "quote",
- "syn",
-]
-
-[[package]]
-name = "windows-link"
-version = "0.2.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "f0805222e57f7521d6a62e36fa9163bc891acd422f971defe97d64e70d0a4fe5"
-
-[[package]]
-name = "windows-numerics"
-version = "0.3.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "6e2e40844ac143cdb44aead537bbf727de9b044e107a0f1220392177d15b0f26"
-dependencies = [
- "windows-core 0.62.2",
- "windows-link",
-]
-
-[[package]]
-name = "windows-result"
-version = "0.2.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "1d1043d8214f791817bab27572aaa8af63732e11bf84aa21a45a78d6c317ae0e"
+checksum = "33ab640c8d7e35bf8ba19b884ba838ceb4fba93a4e8c65a9059d08afcfc683d9"
dependencies = [
"windows-targets 0.52.6",
]
-[[package]]
-name = "windows-result"
-version = "0.4.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "7781fa89eaf60850ac3d2da7af8e5242a5ea78d1a11c49bf2910bb5a73853eb5"
-dependencies = [
- "windows-link",
-]
-
-[[package]]
-name = "windows-strings"
-version = "0.1.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "4cd9b125c486025df0eabcb585e62173c6c9eddcec5d117d3b6e8c30e2ee4d10"
-dependencies = [
- "windows-result 0.2.0",
- "windows-targets 0.52.6",
-]
-
-[[package]]
-name = "windows-strings"
-version = "0.5.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "7837d08f69c77cf6b07689544538e017c1bfcf57e34b4c0ff58e6c2cd3b37091"
-dependencies = [
- "windows-link",
-]
-
[[package]]
name = "windows-sys"
version = "0.45.0"
@@ -5479,24 +4141,6 @@ dependencies = [
"windows-targets 0.52.6",
]
-[[package]]
-name = "windows-sys"
-version = "0.59.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "1e38bc4d79ed67fd075bcc251a1c39b32a1776bbe92e5bef1f0bf1f8c531853b"
-dependencies = [
- "windows-targets 0.52.6",
-]
-
-[[package]]
-name = "windows-sys"
-version = "0.61.2"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "ae137229bcbd6cdf0f7b80a31df61766145077ddf49416a728b02cb3921ff3fc"
-dependencies = [
- "windows-link",
-]
-
[[package]]
name = "windows-targets"
version = "0.42.2"
@@ -5543,15 +4187,6 @@ dependencies = [
"windows_x86_64_msvc 0.52.6",
]
-[[package]]
-name = "windows-threading"
-version = "0.2.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "3949bd5b99cafdf1c7ca86b43ca564028dfe27d66958f2470940f73d86d75b37"
-dependencies = [
- "windows-link",
-]
-
[[package]]
name = "windows_aarch64_gnullvm"
version = "0.42.2"
@@ -5686,41 +4321,37 @@ checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec"
[[package]]
name = "winit"
-version = "0.30.12"
+version = "0.29.15"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "c66d4b9ed69c4009f6321f762d6e61ad8a2389cd431b97cb1e146812e9e6c732"
+checksum = "0d59ad965a635657faf09c8f062badd885748428933dad8e8bdd64064d92e5ca"
dependencies = [
- "ahash",
+ "ahash 0.8.11",
"android-activity",
"atomic-waker",
- "bitflags 2.10.0",
- "block2 0.5.1",
+ "bitflags 2.6.0",
"bytemuck",
- "calloop 0.13.0",
- "cfg_aliases 0.2.1",
- "concurrent-queue",
- "core-foundation 0.9.4",
+ "calloop",
+ "cfg_aliases 0.1.1",
+ "core-foundation",
"core-graphics",
"cursor-icon",
- "dpi",
+ "icrate",
"js-sys",
"libc",
- "memmap2",
+ "log",
+ "memmap2 0.9.4",
"ndk",
- "objc2 0.5.2",
- "objc2-app-kit 0.2.2",
- "objc2-foundation 0.2.2",
- "objc2-ui-kit",
+ "ndk-sys",
+ "objc2 0.4.1",
+ "once_cell",
"orbclient",
"percent-encoding",
- "pin-project",
"raw-window-handle",
- "redox_syscall 0.4.1",
- "rustix 0.38.44",
+ "redox_syscall 0.3.5",
+ "rustix",
"sctk-adwaita",
- "smithay-client-toolkit 0.19.2",
+ "smithay-client-toolkit",
"smol_str",
- "tracing",
"unicode-segmentation",
"wasm-bindgen",
"wasm-bindgen-futures",
@@ -5730,7 +4361,7 @@ dependencies = [
"wayland-protocols-plasma",
"web-sys",
"web-time",
- "windows-sys 0.52.0",
+ "windows-sys 0.48.0",
"x11-dl",
"x11rb",
"xkbcommon-dl",
@@ -5738,13 +4369,31 @@ dependencies = [
[[package]]
name = "winnow"
-version = "0.7.14"
+version = "0.5.40"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "5a5364e9d77fcdeeaa6062ced926ee3381faa2ee02d3eb83a5c27a8825540829"
+checksum = "f593a95398737aeed53e489c785df13f3618e41dbcd6718c6addbf1395aa6876"
dependencies = [
"memchr",
]
+[[package]]
+name = "winnow"
+version = "0.6.13"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "59b5e5f6c299a3c7890b876a2a587f3115162487e704907d9b6cd29473052ba1"
+dependencies = [
+ "memchr",
+]
+
+[[package]]
+name = "winreg"
+version = "0.10.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "80d0f4e272c85def139476380b12f9ac60926689dd2e01d4923222f40580869d"
+dependencies = [
+ "winapi",
+]
+
[[package]]
name = "winreg"
version = "0.52.0"
@@ -5755,110 +4404,6 @@ dependencies = [
"windows-sys 0.48.0",
]
-[[package]]
-name = "winreg"
-version = "0.55.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "cb5a765337c50e9ec252c2069be9bf91c7df47afb103b642ba3a53bf8101be97"
-dependencies = [
- "cfg-if",
- "windows-sys 0.59.0",
-]
-
-[[package]]
-name = "wit-bindgen"
-version = "0.51.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "d7249219f66ced02969388cf2bb044a09756a083d0fab1e566056b04d9fbcaa5"
-dependencies = [
- "wit-bindgen-rust-macro",
-]
-
-[[package]]
-name = "wit-bindgen-core"
-version = "0.51.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "ea61de684c3ea68cb082b7a88508a8b27fcc8b797d738bfc99a82facf1d752dc"
-dependencies = [
- "anyhow",
- "heck",
- "wit-parser",
-]
-
-[[package]]
-name = "wit-bindgen-rust"
-version = "0.51.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "b7c566e0f4b284dd6561c786d9cb0142da491f46a9fbed79ea69cdad5db17f21"
-dependencies = [
- "anyhow",
- "heck",
- "indexmap",
- "prettyplease",
- "syn",
- "wasm-metadata",
- "wit-bindgen-core",
- "wit-component",
-]
-
-[[package]]
-name = "wit-bindgen-rust-macro"
-version = "0.51.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "0c0f9bfd77e6a48eccf51359e3ae77140a7f50b1e2ebfe62422d8afdaffab17a"
-dependencies = [
- "anyhow",
- "prettyplease",
- "proc-macro2",
- "quote",
- "syn",
- "wit-bindgen-core",
- "wit-bindgen-rust",
-]
-
-[[package]]
-name = "wit-component"
-version = "0.244.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "9d66ea20e9553b30172b5e831994e35fbde2d165325bec84fc43dbf6f4eb9cb2"
-dependencies = [
- "anyhow",
- "bitflags 2.10.0",
- "indexmap",
- "log",
- "serde",
- "serde_derive",
- "serde_json",
- "wasm-encoder",
- "wasm-metadata",
- "wasmparser",
- "wit-parser",
-]
-
-[[package]]
-name = "wit-parser"
-version = "0.244.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "ecc8ac4bc1dc3381b7f59c34f00b67e18f910c2c0f50015669dde7def656a736"
-dependencies = [
- "anyhow",
- "id-arena",
- "indexmap",
- "log",
- "semver",
- "serde",
- "serde_derive",
- "serde_json",
- "unicode-xid",
- "wasmparser",
-]
-
-[[package]]
-name = "writeable"
-version = "0.6.2"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "9edde0db4769d2dc68579893f2306b26c6ecfbe0ef499b013d731b7b9247e0b9"
-
[[package]]
name = "x11-dl"
version = "2.21.0"
@@ -5872,40 +4417,51 @@ dependencies = [
[[package]]
name = "x11rb"
-version = "0.13.2"
+version = "0.13.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "9993aa5be5a26815fe2c3eacfc1fde061fc1a1f094bf1ad2a18bf9c495dd7414"
+checksum = "5d91ffca73ee7f68ce055750bf9f6eca0780b8c85eff9bc046a3b0da41755e12"
dependencies = [
"as-raw-xcb-connection",
"gethostname",
"libc",
- "libloading",
+ "libloading 0.8.4",
"once_cell",
- "rustix 1.1.3",
+ "rustix",
"x11rb-protocol",
]
[[package]]
name = "x11rb-protocol"
-version = "0.13.2"
+version = "0.13.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "ea6fc2961e4ef194dcbfe56bb845534d0dc8098940c7e5c012a258bfec6701bd"
+checksum = "ec107c4503ea0b4a98ef47356329af139c0a4f7750e621cf2973cd3385ebcb3d"
[[package]]
name = "xattr"
-version = "1.6.1"
+version = "1.3.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "32e45ad4206f6d2479085147f02bc2ef834ac85886624a23575ae137c8aa8156"
+checksum = "8da84f1a25939b27f6820d92aed108f83ff920fdf11a7b19366c27c4cda81d4f"
dependencies = [
"libc",
- "rustix 1.1.3",
+ "linux-raw-sys 0.4.14",
+ "rustix",
]
[[package]]
name = "xcursor"
-version = "0.3.10"
+version = "0.3.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "bec9e4a500ca8864c5b47b8b482a73d62e4237670e5b5f1d6b9e3cae50f28f2b"
+checksum = "6a0ccd7b4a5345edfcd0c3535718a4e9ff7798ffc536bb5b5a0e26ff84732911"
+
+[[package]]
+name = "xdg-home"
+version = "1.2.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "ca91dcf8f93db085f3a0a29358cd0b9d670915468f4290e8b85d118a34211ab8"
+dependencies = [
+ "libc",
+ "windows-sys 0.52.0",
+]
[[package]]
name = "xkbcommon-dl"
@@ -5913,7 +4469,7 @@ version = "0.4.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "d039de8032a9a8856a6be89cea3e5d12fdd82306ab7c94d74e6deab2460651c5"
dependencies = [
- "bitflags 2.10.0",
+ "bitflags 2.6.0",
"dlib",
"log",
"once_cell",
@@ -5928,53 +4484,31 @@ checksum = "b9cc00251562a284751c9973bace760d86c0276c471b4be569fe6b068ee97a56"
[[package]]
name = "xml-rs"
-version = "0.8.28"
+version = "0.8.20"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "3ae8337f8a065cfc972643663ea4279e04e7256de865aa66fe25cec5fb912d3f"
+checksum = "791978798f0597cfc70478424c2b4fdc2b7a8024aaff78497ef00f24ef674193"
[[package]]
-name = "y4m"
-version = "0.8.0"
+name = "xxhash-rust"
+version = "0.8.11"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "7a5a4b21e1a62b67a2970e6831bc091d7b87e119e7f9791aef9702e3bef04448"
+checksum = "63658493314859b4dfdf3fb8c1defd61587839def09582db50b8a4e93afca6bb"
[[package]]
name = "yazi"
-version = "0.2.1"
+version = "0.1.6"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "e01738255b5a16e78bbb83e7fbba0a1e7dd506905cfc53f4622d89015a03fbb5"
-
-[[package]]
-name = "yoke"
-version = "0.8.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "72d6e5c6afb84d73944e5cedb052c4680d5657337201555f9f2a16b7406d4954"
-dependencies = [
- "stable_deref_trait",
- "yoke-derive",
- "zerofrom",
-]
-
-[[package]]
-name = "yoke-derive"
-version = "0.8.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "b659052874eb698efe5b9e8cf382204678a0086ebf46982b79d6ca3182927e5d"
-dependencies = [
- "proc-macro2",
- "quote",
- "syn",
- "synstructure",
-]
+checksum = "c94451ac9513335b5e23d7a8a2b61a7102398b8cca5160829d313e84c9d98be1"
[[package]]
name = "zbus"
-version = "5.13.2"
+version = "4.3.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "1bfeff997a0aaa3eb20c4652baf788d2dfa6d2839a0ead0b3ff69ce2f9c4bdd1"
+checksum = "851238c133804e0aa888edf4a0229481c753544ca12a60fd1c3230c8a500fe40"
dependencies = [
"async-broadcast",
"async-executor",
+ "async-fs",
"async-io",
"async-lock",
"async-process",
@@ -5983,20 +4517,22 @@ dependencies = [
"async-trait",
"blocking",
"enumflags2",
- "event-listener 5.4.1",
+ "event-listener",
"futures-core",
- "futures-lite",
+ "futures-sink",
+ "futures-util",
"hex",
- "libc",
+ "nix",
"ordered-stream",
- "rustix 1.1.3",
+ "rand",
"serde",
"serde_repr",
+ "sha1",
+ "static_assertions",
"tracing",
"uds_windows",
- "uuid",
- "windows-sys 0.61.2",
- "winnow",
+ "windows-sys 0.52.0",
+ "xdg-home",
"zbus_macros",
"zbus_names",
"zvariant",
@@ -6004,133 +4540,59 @@ dependencies = [
[[package]]
name = "zbus_macros"
-version = "5.13.2"
+version = "4.3.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "0bbd5a90dbe8feee5b13def448427ae314ccd26a49cac47905cafefb9ff846f1"
+checksum = "8d5a3f12c20bd473be3194af6b49d50d7bb804ef3192dc70eddedb26b85d9da7"
dependencies = [
"proc-macro-crate",
"proc-macro2",
"quote",
- "syn",
- "zbus_names",
- "zvariant",
+ "syn 2.0.70",
"zvariant_utils",
]
[[package]]
name = "zbus_names"
-version = "4.3.1"
+version = "3.0.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "ffd8af6d5b78619bab301ff3c560a5bd22426150253db278f164d6cf3b72c50f"
+checksum = "4b9b1fef7d021261cc16cba64c351d291b715febe0fa10dc3a443ac5a5022e6c"
dependencies = [
"serde",
- "winnow",
+ "static_assertions",
"zvariant",
]
[[package]]
name = "zeno"
-version = "0.3.3"
+version = "0.2.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "6df3dc4292935e51816d896edcd52aa30bc297907c26167fec31e2b0c6a32524"
+checksum = "dd15f8e0dbb966fd9245e7498c7e9e5055d9e5c8b676b95bd67091cd11a1e697"
[[package]]
name = "zerocopy"
-version = "0.8.39"
+version = "0.7.35"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "db6d35d663eadb6c932438e763b262fe1a70987f9ae936e60158176d710cae4a"
+checksum = "1b9b4fd18abc82b8136838da5d50bae7bdea537c574d8dc1a34ed098d6c166f0"
dependencies = [
"zerocopy-derive",
]
[[package]]
name = "zerocopy-derive"
-version = "0.8.39"
+version = "0.7.35"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "4122cd3169e94605190e77839c9a40d40ed048d305bfdc146e7df40ab0f3e517"
+checksum = "fa4f8080344d4671fb4e831a13ad1e68092748387dfc4f55e356242fae12ce3e"
dependencies = [
"proc-macro2",
"quote",
- "syn",
-]
-
-[[package]]
-name = "zerofrom"
-version = "0.1.6"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "50cc42e0333e05660c3587f3bf9d0478688e15d870fab3346451ce7f8c9fbea5"
-dependencies = [
- "zerofrom-derive",
-]
-
-[[package]]
-name = "zerofrom-derive"
-version = "0.1.6"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "d71e5d6e06ab090c67b5e44993ec16b72dcbaabc526db883a360057678b48502"
-dependencies = [
- "proc-macro2",
- "quote",
- "syn",
- "synstructure",
+ "syn 2.0.70",
]
[[package]]
name = "zeroize"
-version = "1.8.2"
+version = "1.8.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "b97154e67e32c85465826e8bcc1c59429aaaf107c1e4a9e53c8d8ccd5eff88d0"
-
-[[package]]
-name = "zerotrie"
-version = "0.2.3"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "2a59c17a5562d507e4b54960e8569ebee33bee890c70aa3fe7b97e85a9fd7851"
-dependencies = [
- "displaydoc",
- "yoke",
- "zerofrom",
-]
-
-[[package]]
-name = "zerovec"
-version = "0.11.5"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "6c28719294829477f525be0186d13efa9a3c602f7ec202ca9e353d310fb9a002"
-dependencies = [
- "yoke",
- "zerofrom",
- "zerovec-derive",
-]
-
-[[package]]
-name = "zerovec-derive"
-version = "0.11.2"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "eadce39539ca5cb3985590102671f2567e659fca9666581ad3411d59207951f3"
-dependencies = [
- "proc-macro2",
- "quote",
- "syn",
-]
-
-[[package]]
-name = "zmij"
-version = "1.0.21"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "b8848ee67ecc8aedbaf3e4122217aff892639231befc6a1b58d29fff4c2cabaa"
-
-[[package]]
-name = "zune-core"
-version = "0.4.12"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "3f423a2c17029964870cfaabb1f13dfab7d092a62a29a89264f4d36990ca414a"
-
-[[package]]
-name = "zune-core"
-version = "0.5.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "cb8a0807f7c01457d0379ba880ba6322660448ddebc890ce29bb64da71fb40f9"
+checksum = "ced3678a2879b30306d323f4542626697a464a97c0a07c9aebf7ebca65cd4dde"
[[package]]
name = "zune-inflate"
@@ -6141,61 +4603,40 @@ dependencies = [
"simd-adler32",
]
-[[package]]
-name = "zune-jpeg"
-version = "0.4.21"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "29ce2c8a9384ad323cf564b67da86e21d3cfdff87908bc1223ed5c99bc792713"
-dependencies = [
- "zune-core 0.4.12",
-]
-
-[[package]]
-name = "zune-jpeg"
-version = "0.5.12"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "410e9ecef634c709e3831c2cfdb8d9c32164fae1c67496d5b68fff728eec37fe"
-dependencies = [
- "zune-core 0.5.1",
-]
-
[[package]]
name = "zvariant"
-version = "5.9.2"
+version = "4.1.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "68b64ef4f40c7951337ddc7023dd03528a57a3ce3408ee9da5e948bd29b232c4"
+checksum = "1724a2b330760dc7d2a8402d841119dc869ef120b139d29862d6980e9c75bfc9"
dependencies = [
"endi",
"enumflags2",
"serde",
+ "static_assertions",
"url",
- "winnow",
"zvariant_derive",
- "zvariant_utils",
]
[[package]]
name = "zvariant_derive"
-version = "5.9.2"
+version = "4.1.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "484d5d975eb7afb52cc6b929c13d3719a20ad650fea4120e6310de3fc55e415c"
+checksum = "55025a7a518ad14518fb243559c058a2e5b848b015e31f1d90414f36e3317859"
dependencies = [
"proc-macro-crate",
"proc-macro2",
"quote",
- "syn",
+ "syn 2.0.70",
"zvariant_utils",
]
[[package]]
name = "zvariant_utils"
-version = "3.3.0"
+version = "2.0.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "f75c23a64ef8f40f13a6989991e643554d9bef1d682a281160cf0c1bc389c5e9"
+checksum = "fc242db087efc22bd9ade7aa7809e4ba828132edc312871584a6b4391bdf8786"
dependencies = [
"proc-macro2",
"quote",
- "serde",
- "syn",
- "winnow",
+ "syn 2.0.70",
]
diff --git a/Cargo.toml b/Cargo.toml
index 0464938..a92dd06 100644
--- a/Cargo.toml
+++ b/Cargo.toml
@@ -1,13 +1,7 @@
-[workspace]
-members = [
- "crates/uad-core",
- "crates/uad-gui",
- "crates/uad-cli"
-]
-resolver = "2"
-
-[workspace.package]
-version = "1.2.0"
+[package]
+name = "uad-ng"
+description = "A cross-platform GUI debloater for android devices"
+version = "1.1.0"
authors = ["Universal-Debloater-Alliance"]
license = "GPL-3.0"
homepage = "https://github.com/Universal-Debloater-Alliance/universal-android-debloater-next-generation"
@@ -15,49 +9,65 @@ repository = "https://github.com/Universal-Debloater-Alliance/universal-android-
readme = "README.md"
keywords = ["debloater", "android", "adb", "privacy", "bloatware"]
categories = ["gui"]
-edition = "2024"
+edition = "2021"
-[workspace.dependencies]
-# Core dependencies
+[features]
+default = ["wgpu", "self-update"]
+wgpu = [] # Iced/wgpu is default
+self-update = ["flate2", "tar"]
+no-self-update = []
+
+[dependencies]
+dark-light = { version = "^1.0.0" }
serde = { version = "^1.0", features = ["derive"] }
serde_json = "^1.0"
+static_init = "^1.0"
+fern = { version = "^0", features = ["colored"] }
+chrono = { version = "^0.4", default-features = false, features = [
+ "std",
+ "clock",
+] }
log = "^0.4"
-chrono = { version = "^0.4", default-features = false, features = ["std", "clock"] }
+regex = "^1.10.2"
toml = "^0"
-dirs = "^6"
-ureq = { version = "3", features = ["json"] }
+dirs = "^5.0.0"
+ureq = { version = "*", features = ["json"] }
retry = "^2.0.0"
+iced = { version = "^0.12.0", features = ["advanced", "image"] }
+rfd = "^0.14"
csv = "^1.3"
-# GUI dependencies
-iced = { version = "=0.14.0", features = ["advanced"] }
-image = "0.25"
-rfd = "^0.17.1"
-dark-light = "2"
-fern = { version = "^0", features = ["colored"] }
+[target.'cfg(not(target_os = "windows"))'.dependencies]
+flate2 = { version = "^1", optional = true }
+tar = { version = "^0.4", optional = true }
-# CLI dependencies
-clap = { version = "4.6.1", features = ["derive"] }
-tokio = { version = "1.52.3", features = ["full"] }
-
-# Platform-specific dependencies
-flate2 = "^1"
-tar = "^0.4"
+[target.'cfg(target_os = "windows")'.dependencies]
win32console = "^0.1.5"
-[workspace.lints.rust]
-deprecated_safe = "warn"
+[profile.release]
+opt-level = "s"
+lto = true
+strip = "symbols"
-[workspace.lints.clippy]
+[build-dependencies]
+embed-resource = "2.4.2"
+
+[lints.rust]
+# "forbid" may cause conflicts with libs (static and dynamic)
+unsafe_code = "deny"
+
+[lints.clippy]
undocumented_unsafe_blocks = "forbid"
+exit = "deny"
panic_in_result_fn = "warn"
+unwrap_used = "warn"
infinite_loop = "warn"
+mem_forget = "warn"
+string_to_string = "deny"
format_push_string = "warn"
large_include_file = "warn"
shadow_unrelated = "warn"
struct_field_names = "allow" # annoying
+module_name_repetitions = "allow" # annoying
-disallowed_types = "deny"
-disallowed_methods = "deny"
-
-pedantic = { level = "warn", priority = -1 }
\ No newline at end of file
+pedantic = { level = "warn", priority = -1 }
diff --git a/README.md b/README.md
index 6e0f111..bc723dc 100644
--- a/README.md
+++ b/README.md
@@ -1,53 +1,37 @@
# Universal Android Debloater Next Generation
-> [!warning]
-> **DISCLAIMER**: Use at your own risk. We're not responsible for anything that could happen to your devices.
+[](https://app.deepsource.com/gh/Universal-Debloater-Alliance/universal-android-debloater-next-generation/)
+[](https://app.deepsource.com/gh/Universal-Debloater-Alliance/universal-android-debloater-next-generation/)
+[](https://app.deepsource.com/gh/Universal-Debloater-Alliance/universal-android-debloater-next-generation/)
-
-

-
-This is a detached fork of the [UAD project](https://github.com/0x192/universal-android-debloater). This aims to improve privacy and efficiency (energy, speed, memory) by removing unnecessary and obscure system apps.
-This can also improve security by reducing the [attack surface](https://en.wikipedia.org/wiki/Attack_surface). Read [the wiki](https://github.com/Universal-Debloater-Alliance/universal-android-debloater-next-generation/wiki) for more details.
+**DISCLAIMER**: Use at your own risk. We're not responsible for anything that
+could happen to your phone.
+
+
+
+**Check out the issues, and [feel free to contribute!](https://github.com/Universal-Debloater-Alliance/universal-android-debloater-next-generation/wiki/How-to-contribute)**
+
+**For real-time communication, consider joining our Discord server:**
+
+[](https://discord.gg/YHujHzA57a)
+
+**In case you prefer using Matrix (using a Matrix bridge to Discord):**
+
+[
](https://matrix.to/#/#uad-ng:matrix.org)
+
+
+## Summary
+
+This is a detached fork of the [UAD project](https://github.com/0x192/universal-android-debloater), which aims to improve privacy and battery performance by removing unnecessary and obscure system apps.
+This can also contribute to improving security by reducing (but not eliminating) [the attack surface](https://en.wikipedia.org/wiki/Attack_surface). Read the [wiki](https://github.com/Universal-Debloater-Alliance/universal-android-debloater-next-generation/wiki) for more details on getting started. Whilst UAD-ng can remove system apps, it cannot detect or remove potentially malicious system services or drivers baked into the firmware of your device by various vendors; some vendor-specific apps are only UI front-ends to vendor-provided system services, and as such disabling/uninstalling those apps will not stop a service from running. Additional information can be found in package descriptions inside the Universal Android Debloater Next Generation application.
## Documentation
-Everything about UAD-ng (and related stuff) can be found on the Wiki, such as:
-
-- [Getting started](https://github.com/Universal-Debloater-Alliance/universal-android-debloater-next-generation/wiki/Getting-started)
-- Features of this app
-- [Usage guide](https://github.com/Universal-Debloater-Alliance/universal-android-debloater-next-generation/wiki/Usage)
-- Suggested Android app replacements
-- How to get the cutting-edge version by [building the source-code](https://github.com/Universal-Debloater-Alliance/universal-android-debloater-next-generation/wiki/Building-from-source)
-- Weird things OEMs do
-- [Suggested apps for analyzing APKs](https://github.com/Universal-Debloater-Alliance/universal-android-debloater-next-generation/wiki/How-to-contribute#useful-apps)
-
-## Privacy
-
-UAD-ng does not collect or transmit any user data. The only external connections are `GET` requests to GitHub for fetching the [package list](https://github.com/Universal-Debloater-Alliance/universal-android-debloater-next-generation/blob/main/resources/assets/uad_lists.json) ([src/core/uad_lists.rs](src/core/uad_lists.rs)) and checking for updates ([src/core/update.rs](src/core/update.rs)).
-
-## Contact
-
-**For real-time communication and support, consider joining our Discord guild:**
-
-[
](https://discord.gg/CzwbMCPEZa)
-
-**If you prefer using Matrix, we have a bridge to Discord:**
-
-[
](https://matrix.to/#/#uad-ng:matrix.org)
-
-## Friends
-
-Several projects integrate with or depend on UAD-ng's data and tools:
-
-- **[Canta](https://github.com/samolego/Canta)** — A mobile Android debloater that uses Shizuku for rootless privilege escalation. It integrates with UAD-ng's Universal Debloat List to provide safe package recommendations without requiring a PC.
-
-- **Projects by [Muntashir Akon](https://github.com/MuntashirAkon):**
- - **[AppManager](https://github.com/MuntashirAkon/AppManager)** — An advanced Android app manager with powerful debloating features.
- - **[android-debloat-list](https://github.com/MuntashirAkon/android-debloat-list)** — A comprehensive, community-driven list of Android packages to debloat, based on UAD-ng's list.
+For documentation regarding how to use UAD-ng, the FAQ, building from source and how to decompile/extract APKs, see [our Wiki](https://github.com/Universal-Debloater-Alliance/universal-android-debloater-next-generation/wiki).
## Special thanks
- [@0x192](https://github.com/0x192) who created the original UAD project.
-- [@mawilms](https://github.com/mawilms) for his LotRO plugin manager ([Lembas](https://github.com/mawilms/lembas)) which helped a lot to understand how to use the [Iced](https://github.com/iced-rs/iced) GUI library.
+- [@mawilms](https://github.com/mawilms) for his LotRO plugin manager ([Lembas](https://github.com/mawilms/lembas)) which helped a lot to understand how to use the [Iced](https://github.com/hecrj/iced) GUI library.
- [@casperstorm](https://github.com/casperstorm) for the UI/UX inspiration.
diff --git a/RELEASE.md b/RELEASE.md
deleted file mode 100644
index c029638..0000000
--- a/RELEASE.md
+++ /dev/null
@@ -1,38 +0,0 @@
-# Release management
-
-## Semantic versioning
-
-We're making use of [semantic versioning](https://semver.org/). We use semantic versioning for two things:
-
-1. GitHub Milestones
-1. UAD-ng releases
-
-Speaking of milestones: it could be that we have a bug-fix release (e.g. 1.0.3), but a contributor submits a PR that adds a new feature. What do we do? Merge after we released 1.0.3? Change the name of the milestone to for example 1.1.0? Or another approach?
-
-In that case, we should closely review the PR and 'compare' it with what semantic versioning has to say about the submitted feature. If the changes are significant enough, we're renaming the milestone to (for example) 1.1.0.
-
-## Checklist before releasing a new version
-
-- [ ] Make sure the Milestone is completed and if not, check what needs to be done to complete it.
-- [ ] Make sure all merged PRs regarding the application follow the Conventional Commit Messages style. This makes sure that when generating a changelog, the changes look consistent, which in turn improves readability.
-- [ ] Make sure all merged PRs have the correct labels assigned, as the changelog is generated based on labels.
-- [ ] Create a release preparation PR that bumps the UAD-ng version in `Cargo.toml` and `Cargo.lock`.
-
-When all the above has been checked, you can push a tag to `main` to trigger the GitHub Action that creates a release:
-
-- Create the tag: `git tag -s v1.2.3 -am '1.2.3'`
-- Push the tag: `git push origin v1.2.3`
-
-Change the version number to whatever version we're releasing.
-
-## Development process
-
-1. Update dependencies right after a new release, so that we start a new milestone with updated dependencies
-1. On-going development of bug-fixes and new features etc, along with fixing potential bugs, potentially due to the updated dependencies
-1. Release
-
-## Faulty releases
-
-If we publish a faulty release, for example containing a critical bug, this is how we should deal with it:
-
-We issue a hotfix and keep the faulty release but we'll add warnings to the faulty release in the changelog.
diff --git a/build.rs b/build.rs
index e2bbb62..cc564fe 100644
--- a/build.rs
+++ b/build.rs
@@ -1,11 +1,9 @@
-const META: &str = "resources/assets/manifest.rc";
+use std::{env, error::Error};
-fn main() -> Result<(), Box> {
- println!("cargo::rerun-if-changed={META}");
- if std::env::var("CARGO_CFG_TARGET_FAMILY")? == "windows" {
- embed_resource::compile(META, embed_resource::NONE)
- .manifest_optional()
- .unwrap();
+fn main() -> Result<(), Box> {
+ if env::var("CARGO_CFG_TARGET_FAMILY")? == "windows" {
+ embed_resource::compile("resources/assets/manifest.rc", embed_resource::NONE);
}
+
Ok(())
}
diff --git a/clippy.toml b/clippy.toml
deleted file mode 100644
index ea830ad..0000000
--- a/clippy.toml
+++ /dev/null
@@ -1,7 +0,0 @@
-disallowed-types = [
- { path = "iced::widget::Text", reason = "Use [`crate::gui::widgets::text`] instead. For further details, see #523 and #858" },
-]
-
-disallowed-methods= [
- { path = "iced::widget::text", reason = "Use [`crate::gui::widgets::text`] instead. For further details, see #523 and #858" },
-]
diff --git a/crates/uad-cli/Cargo.toml b/crates/uad-cli/Cargo.toml
deleted file mode 100644
index 6045f95..0000000
--- a/crates/uad-cli/Cargo.toml
+++ /dev/null
@@ -1,52 +0,0 @@
-[package]
-name = "uad-cli"
-version.workspace = true
-authors.workspace = true
-license.workspace = true
-homepage.workspace = true
-repository.workspace = true
-readme.workspace = true
-keywords.workspace = true
-categories = ["command-line-utilities"]
-edition.workspace = true
-
-[[bin]]
-name = "uad"
-path = "src/main.rs"
-
-[dependencies]
-uad-core = { path = "../uad-core" }
-clap.workspace = true
-clap_complete = "4.4"
-tokio.workspace = true
-serde.workspace = true
-serde_json.workspace = true
-log.workspace = true
-chrono.workspace = true
-toml.workspace = true
-dirs.workspace = true
-ureq.workspace = true
-retry.workspace = true
-csv.workspace = true
-rustyline = "14.0"
-
-[lints.rust]
-deprecated_safe = "warn"
-
-[lints.clippy]
-undocumented_unsafe_blocks = "deny"
-exit = "deny"
-panic_in_result_fn = "warn"
-infinite_loop = "warn"
-mem_forget = "warn"
-implicit_clone = "warn"
-format_push_string = "warn"
-large_include_file = "warn"
-shadow_unrelated = "warn"
-struct_field_names = "allow" # annoying
-
-disallowed_types = "deny"
-disallowed_methods = "deny"
-
-allow_attributes_without_reason = "warn"
-pedantic = { level = "warn", priority = -1 }
diff --git a/crates/uad-cli/examples/usage.sh b/crates/uad-cli/examples/usage.sh
deleted file mode 100755
index ab3192e..0000000
--- a/crates/uad-cli/examples/usage.sh
+++ /dev/null
@@ -1,44 +0,0 @@
-#!/usr/bin/env bash
-
-# Example usage script for UAD CLI
-
-# Check if uad-cli is available
-if ! command -v uad &> /dev/null; then
- echo "uad command not found. Please build and install uad-cli first."
- exit 1
-fi
-
-echo "=== UAD CLI Usage Examples ==="
-echo
-
-echo "1. List connected devices:"
-uad devices
-echo
-
-echo "2. List all enabled packages:"
-uad list --state enabled | head -20
-echo "... (showing first 20)"
-echo
-
-echo "3. Search for Google packages:"
-uad list --search google | head -10
-echo "... (showing first 10)"
-echo
-
-echo "4. Show info about a package (example):"
-echo "uad info com.google.android.gms"
-echo
-
-echo "5. Dry-run uninstall (safe to test):"
-echo "uad uninstall com.example.package --dry-run"
-echo
-
-echo "6. Start interactive mode:"
-echo "uad repl"
-echo
-
-echo "=== Generate shell completions ==="
-echo "For bash: uad completions bash > ~/.local/share/bash-completion/completions/uad"
-echo "For zsh: uad completions zsh > ~/.local/share/zsh/site-functions/_uad"
-echo "For fish: uad completions fish > ~/.config/fish/completions/uad.fish"
-
diff --git a/crates/uad-cli/src/commands.rs b/crates/uad-cli/src/commands.rs
deleted file mode 100644
index 62286bd..0000000
--- a/crates/uad-cli/src/commands.rs
+++ /dev/null
@@ -1,470 +0,0 @@
-use clap::CommandFactory;
-use clap_complete::{Shell, generate};
-use std::collections::{HashMap, HashSet};
-use std::io::Write;
-use uad_core::adb::{ACommand, PmListPacksFlag};
-use uad_core::sync::{
- CorePackage, Phone, User, apply_pkg_state_commands, get_devices_list, get_package_state,
- run_adb_shell_action,
-};
-use uad_core::uad_lists::{Package, PackageState, Removal, UadList, load_debloat_lists};
-use uad_core::utils::{matches_search, truncate_description};
-
-use crate::device::{NO_DEVICES_FOUND, get_target_device, get_user};
-use crate::filters::{ListFilter, RemovalFilter, StateFilter};
-use crate::{Cli, print_or_exit, println_or_exit};
-
-/// List all connected Android devices
-pub fn list_devices() -> Result<(), Box> {
- println_or_exit!("Scanning for connected devices...");
- let devices = get_devices_list();
-
- if devices.is_empty() {
- return Err(NO_DEVICES_FOUND.into());
- }
-
- println_or_exit!("\nFound {} device(s):\n", devices.len());
- for device in &devices {
- println_or_exit!(" Model: {}", device.model);
- println_or_exit!(" Serial: {}", device.adb_id);
- println_or_exit!(" Android SDK: {}", device.android_sdk);
-
- if !device.user_list.is_empty() {
- println_or_exit!(" Users: {} user(s)", device.user_list.len());
- for user in &device.user_list {
- let protected = if user.protected { " (protected)" } else { "" };
- println_or_exit!(" - User ID: {}{}", user.id, protected);
- }
- }
- println_or_exit!();
- }
-
- Ok(())
-}
-
-/// Context for package filtering and display
-pub struct PackageListContext {
- pub state_filter: Option,
- pub removal_filter: Option,
- pub list_filter: Option,
- pub search: Option,
-}
-
-impl PackageListContext {
- /// Check if package passes all filters
- pub fn filter_package(
- &self,
- pkg_name: &str,
- pkg_info: Option<&Package>,
- pkg_state: PackageState,
- ) -> bool {
- // Removal filter
- if let Some(removal) = self.removal_filter {
- if !removal.matches(pkg_info) {
- return false;
- }
- }
-
- // State filter
- if let Some(state) = self.state_filter {
- if !state.matches(pkg_state) {
- return false;
- }
- }
-
- // List filter
- if let Some(list) = self.list_filter {
- if !list.matches(pkg_info) {
- return false;
- }
- }
-
- // Search filter
- if let Some(ref search_term) = self.search {
- let description = pkg_info.map(|p| p.description.as_str());
- if !matches_search(pkg_name, search_term, description) {
- return false;
- }
- }
-
- true
- }
-
- /// Determine what information to show based on active filters
- pub fn display_config(&self) -> DisplayConfig {
- DisplayConfig {
- show_state: self.state_filter.is_none_or(|f| !f.is_specific()),
- show_removal: self.removal_filter.is_none_or(|f| !f.is_specific()),
- }
- }
-}
-
-pub struct DisplayConfig {
- pub show_state: bool,
- pub show_removal: bool,
-}
-
-/// List packages on a device with filtering
-pub fn list_packages(
- device: Option,
- state_filter: Option,
- removal_filter: Option,
- list_filter: Option,
- search: Option,
- user_id: Option,
-) -> Result<(), Box> {
- let target_device = get_target_device(device)?;
- let uad_lists = load_debloat_lists(false).unwrap_or_else(|lists| lists);
-
- println_or_exit!(
- "Listing packages on: {} ({})\n",
- target_device.model,
- target_device.adb_id
- );
-
- let context = PackageListContext {
- state_filter,
- removal_filter,
- list_filter,
- search,
- };
-
- let pm_flag = state_filter.and_then(StateFilter::to_pm_flag);
- let system_packages = ACommand::new()
- .shell(&target_device.adb_id)
- .pm()
- .list_packages_sys(pm_flag, user_id)?;
-
- let displayed_count = display_package_list(
- &system_packages,
- &uad_lists,
- &target_device.adb_id,
- user_id,
- &context,
- )?;
-
- if displayed_count == 0 {
- println_or_exit!(" No packages found matching the specified filters.");
- } else {
- println_or_exit!("\nTotal: {} package(s)", displayed_count);
- }
-
- Ok(())
-}
-
-/// Display a list of packages with their info
-pub fn display_package_list(
- packages: &[String],
- uad_lists: &HashMap,
- device_serial: &str,
- user_id: Option,
- context: &PackageListContext,
-) -> Result> {
- let config = context.display_config();
- let mut displayed_count = 0;
-
- let enabled_packages: HashSet = ACommand::new()
- .shell(device_serial)
- .pm()
- .list_packages_sys(Some(PmListPacksFlag::OnlyEnabled), user_id)
- .unwrap_or_default()
- .into_iter()
- .collect();
- let disabled_packages: HashSet = ACommand::new()
- .shell(device_serial)
- .pm()
- .list_packages_sys(Some(PmListPacksFlag::OnlyDisabled), user_id)
- .unwrap_or_default()
- .into_iter()
- .collect();
-
- for pkg_name in packages {
- let pkg_info = uad_lists.get(pkg_name);
-
- let pkg_state = if enabled_packages.contains(pkg_name) {
- PackageState::Enabled
- } else if disabled_packages.contains(pkg_name) {
- PackageState::Disabled
- } else {
- PackageState::Uninstalled
- };
-
- if !context.filter_package(pkg_name, pkg_info, pkg_state) {
- continue;
- }
-
- display_package_entry(pkg_name, pkg_info, pkg_state, &config);
- displayed_count += 1;
- }
-
- Ok(displayed_count)
-}
-
-/// Display a single package entry
-pub fn display_package_entry(
- pkg_name: &str,
- pkg_info: Option<&Package>,
- pkg_state: PackageState,
- config: &DisplayConfig,
-) {
- print_or_exit!("[");
-
- if let Some(info) = pkg_info {
- if config.show_removal {
- print_or_exit!("{}", info.removal);
- if config.show_state {
- print_or_exit!(" - ");
- }
- }
- if config.show_state {
- print_or_exit!("{}", pkg_state);
- }
- print_or_exit!("] {}", pkg_name);
- if !info.description.is_empty() {
- print_or_exit!(" - {}", truncate_description(&info.description, 80));
- }
- } else {
- if config.show_removal {
- print_or_exit!("Unlisted");
- if config.show_state {
- print_or_exit!(" - ");
- }
- }
- if config.show_state {
- print_or_exit!("{}", pkg_state);
- }
- print_or_exit!("] {}", pkg_name);
- }
-
- println_or_exit!();
-}
-
-/// Change the state of one or more packages
-pub fn change_package_state(
- packages: &[String],
- device: Option,
- user_id: Option,
- dry_run: bool,
- target_state: PackageState,
- action_name: &str,
-) -> Result<(), Box> {
- if packages.is_empty() {
- return Err("No packages specified".into());
- }
-
- let target_device = get_target_device(device)?;
- let user = get_user(&target_device, user_id)?;
- let uad_lists = load_debloat_lists(false).unwrap_or_else(|lists| lists);
-
- println!(
- "{} {} package(s) on: {} ({})\n",
- action_name,
- packages.len(),
- target_device.model,
- target_device.adb_id
- );
-
- if dry_run {
- println!("DRY RUN - No changes will be made\n");
- }
-
- for pkg_name in packages {
- process_package_state_change(
- pkg_name,
- &target_device,
- user,
- target_state,
- dry_run,
- &uad_lists,
- )?;
- println!();
- }
-
- if dry_run {
- println!("Dry run completed. No changes were made.");
- } else {
- println!("Operation completed successfully.");
- }
-
- Ok(())
-}
-
-/// Process state change for a single package
-fn process_package_state_change(
- pkg_name: &str,
- device: &Phone,
- user: User,
- target_state: PackageState,
- dry_run: bool,
- uad_lists: &HashMap,
-) -> Result<(), Box> {
- let current_state = get_package_state(&device.adb_id, pkg_name, Some(user.id))
- .ok_or("Package not found on device")?;
-
- println!(" {} ({})", pkg_name, current_state);
-
- if current_state == target_state {
- println!(" → Already in target state, skipping");
- return Ok(());
- }
-
- let pkg_info = uad_lists.get(pkg_name);
- if let Some(info) = pkg_info {
- if info.removal == Removal::Unsafe {
- println!(" ⚠ WARNING: This package is marked as UNSAFE to remove!");
- }
- }
-
- let core_pkg = CorePackage {
- name: pkg_name.to_string(),
- description: pkg_info.map(|p| p.description.clone()).unwrap_or_default(),
- removal: pkg_info.map(|p| p.removal).unwrap_or(Removal::Unlisted),
- state: current_state,
- list: pkg_info.map(|p| p.list).unwrap_or(UadList::Unlisted),
- };
-
- let commands = apply_pkg_state_commands(&core_pkg, target_state, user, device);
-
- if dry_run {
- for cmd in &commands {
- println!(" Would run: {}", cmd);
- }
- } else {
- execute_with_fallback(
- pkg_name,
- target_state,
- &core_pkg,
- user,
- device,
- &commands,
- " ",
- )?;
- }
-
- Ok(())
-}
-
-/// Execute commands and verify package state with fallback
-pub fn execute_with_fallback(
- package: &str,
- target_state: PackageState,
- core_pkg: &CorePackage,
- user: User,
- device: &Phone,
- commands: &[String],
- indent: &str,
-) -> Result<(), Box> {
- // Capture the before-state of packages on other users for cross-user detection
- let before_cross_user_states =
- uad_core::sync::capture_cross_user_states(package, &device.adb_id, user.id, device);
-
- // Execute commands
- for cmd in commands {
- match run_adb_shell_action(&device.adb_id, cmd.as_str()) {
- Ok(_) => println!("{}✓ {}", indent, cmd),
- Err(e) => {
- return Err(format!("{indent}✗ Failed to execute `{cmd}`: {e:?}").into());
- }
- }
- }
-
- // Verify package state and attempt fallback if needed
- let actual_state = match get_package_state(&device.adb_id, package, Some(user.id)) {
- Some(state) => state,
- None if target_state == PackageState::Uninstalled => PackageState::Uninstalled,
- None => {
- return Err(format!(
- "Package '{package}' was not found on device for user {}",
- user.id
- )
- .into());
- }
- };
-
- if actual_state != target_state {
- println!(
- "{}⚠ Package state verification failed: expected {:?}, got {:?}",
- indent, target_state, actual_state
- );
-
- // Attempt fallback
- if let Ok(fallback_action) =
- uad_core::sync::attempt_fallback(core_pkg, target_state, actual_state, user, device)
- {
- println!("{}↻ Fallback: {}", indent, fallback_action);
- } else {
- println!("{}✗ No fallback available", indent);
- }
- }
-
- // Check for cross-user behavior if operation succeeded
- if actual_state == target_state {
- if let Some(notification) = uad_core::sync::detect_cross_user_behavior(
- package,
- device.adb_id.as_str(),
- user.id,
- target_state,
- actual_state,
- device,
- &before_cross_user_states,
- ) {
- println!("{}ℹ {}", indent, notification);
- }
- }
-
- Ok(())
-}
-
-/// Show detailed information about a package
-pub fn show_package_info(
- package: &str,
- device: Option,
- user_id: Option,
-) -> Result<(), Box> {
- println!("Package: {}\n", package);
-
- let uad_lists = load_debloat_lists(false).unwrap_or_else(|lists| lists);
-
- if let Some(pkg_info) = uad_lists.get(package) {
- println!("UAD Information:");
- println!(" List: {}", pkg_info.list);
- println!(" Removal: {}", pkg_info.removal);
- println!(" Description: {}", pkg_info.description);
- println!();
- } else {
- println!(" Not found in UAD lists (unlisted package)\n");
- }
-
- if let Some(device_id) = device {
- let target_device = get_target_device(Some(device_id))?;
- let user = get_user(&target_device, user_id)?;
- println!("Device: {} ({})", target_device.model, target_device.adb_id);
- println!("User: {}", user.id);
-
- let state = get_package_state(&target_device.adb_id, package, Some(user.id))
- .ok_or("Package not found on device")?;
- println!(" State: {}", state);
- }
-
- Ok(())
-}
-
-/// Update UAD package lists from remote repository
-pub fn update_lists() -> Result<(), Box> {
- println!("Updating UAD package lists from remote repository...");
-
- match load_debloat_lists(true) {
- Ok(_lists) => {
- println!("✓ Successfully updated package lists");
- Ok(())
- }
- Err(_lists) => Err("Failed to update lists from remote, using cached version".into()),
- }
-}
-
-/// Generate shell completion script
-pub fn generate_completions(shell: Shell) {
- let mut cmd = Cli::command();
- let name = cmd.get_name().to_string();
- generate(shell, &mut cmd, name, &mut std::io::stdout());
-}
diff --git a/crates/uad-cli/src/device.rs b/crates/uad-cli/src/device.rs
deleted file mode 100644
index 54fee8c..0000000
--- a/crates/uad-cli/src/device.rs
+++ /dev/null
@@ -1,47 +0,0 @@
-use uad_core::sync::{Phone, User, get_devices_list};
-
-pub const NO_DEVICES_FOUND: &str =
- "No devices found. Make sure ADB is installed and devices are connected.";
-
-/// Get target device, either by serial or first available
-pub fn get_target_device(device: Option) -> Result> {
- let devices = get_devices_list();
-
- if devices.is_empty() {
- return Err(NO_DEVICES_FOUND.into());
- }
-
- let target_device = if let Some(device_id) = device {
- devices
- .iter()
- .find(|d| d.adb_id == device_id)
- .ok_or("Device not found")?
- .clone()
- } else {
- if devices.len() > 1 {
- eprintln!(
- "Warning: Multiple devices found, using first one: {}",
- devices[0].adb_id
- );
- }
- devices[0].clone()
- };
-
- Ok(target_device)
-}
-
-/// Get user from device, creating a basic one if not found
-pub fn get_user(device: &Phone, user_id: Option) -> Result> {
- let uid = user_id.unwrap_or(0);
-
- if let Some(user) = device.user_list.iter().find(|u| u.id == uid) {
- Ok(*user)
- } else {
- // Create a basic user if not found in list
- Ok(User {
- id: uid,
- index: 0,
- protected: false,
- })
- }
-}
diff --git a/crates/uad-cli/src/filters.rs b/crates/uad-cli/src/filters.rs
deleted file mode 100644
index 5ae156f..0000000
--- a/crates/uad-cli/src/filters.rs
+++ /dev/null
@@ -1,98 +0,0 @@
-use clap::ValueEnum;
-use uad_core::adb::PmListPacksFlag;
-use uad_core::uad_lists::{Package, PackageState, Removal, UadList};
-
-#[derive(Debug, Clone, Copy, ValueEnum)]
-pub enum StateFilter {
- /// Show all packages regardless of state
- All,
- /// Show only enabled packages
- Enabled,
- /// Show only disabled packages
- Disabled,
- /// Show only uninstalled packages
- Uninstalled,
-}
-
-#[derive(Debug, Clone, Copy, ValueEnum)]
-pub enum RemovalFilter {
- All,
- Recommended,
- Advanced,
- Expert,
- Unsafe,
- Unlisted,
-}
-
-#[derive(Debug, Clone, Copy, ValueEnum)]
-pub enum ListFilter {
- All,
- Aosp,
- Carrier,
- Google,
- Misc,
- Oem,
- Pending,
- Unlisted,
-}
-
-impl StateFilter {
- pub fn to_pm_flag(self) -> Option {
- match self {
- Self::Enabled => Some(PmListPacksFlag::OnlyEnabled),
- Self::Disabled => Some(PmListPacksFlag::OnlyDisabled),
- Self::Uninstalled | Self::All => Some(PmListPacksFlag::IncludeUninstalled),
- }
- }
-
- pub fn matches(self, pkg_state: PackageState) -> bool {
- match self {
- Self::All => true,
- Self::Enabled => pkg_state == PackageState::Enabled,
- Self::Disabled => pkg_state == PackageState::Disabled,
- Self::Uninstalled => pkg_state == PackageState::Uninstalled,
- }
- }
-
- pub fn is_specific(self) -> bool {
- matches!(self, Self::Enabled | Self::Disabled | Self::Uninstalled)
- }
-}
-
-impl RemovalFilter {
- pub fn matches(self, pkg_info: Option<&Package>) -> bool {
- match pkg_info {
- Some(info) => match self {
- Self::All => true,
- Self::Recommended => info.removal == Removal::Recommended,
- Self::Advanced => info.removal == Removal::Advanced,
- Self::Expert => info.removal == Removal::Expert,
- Self::Unsafe => info.removal == Removal::Unsafe,
- Self::Unlisted => info.removal == Removal::Unlisted,
- },
- None => matches!(self, Self::All | Self::Unlisted),
- }
- }
-
- pub fn is_specific(self) -> bool {
- !matches!(self, Self::All)
- }
-}
-
-impl ListFilter {
- pub fn matches(self, pkg_info: Option<&Package>) -> bool {
- match pkg_info {
- Some(info) => match self {
- Self::All => true,
- Self::Aosp => info.list == UadList::Aosp,
- Self::Carrier => info.list == UadList::Carrier,
- Self::Google => info.list == UadList::Google,
- Self::Misc => info.list == UadList::Misc,
- Self::Oem => info.list == UadList::Oem,
- Self::Pending => info.list == UadList::Pending,
- Self::Unlisted => info.list == UadList::Unlisted,
- },
- None => matches!(self, Self::All | Self::Unlisted),
- }
- }
-}
diff --git a/crates/uad-cli/src/main.rs b/crates/uad-cli/src/main.rs
deleted file mode 100644
index f473e28..0000000
--- a/crates/uad-cli/src/main.rs
+++ /dev/null
@@ -1,251 +0,0 @@
-#![allow(
- clippy::needless_continue,
- clippy::collapsible_if,
- clippy::uninlined_format_args,
- clippy::map_unwrap_or,
- clippy::unnecessary_wraps,
- reason = "Suppress non-critical pedantic/style lints to keep build green"
-)]
-
-use clap::{Parser, Subcommand};
-use clap_complete::Shell;
-use std::process::ExitCode;
-use uad_core::uad_lists::PackageState;
-
-mod commands;
-mod device;
-mod filters;
-mod output;
-mod repl;
-
-use filters::{ListFilter, RemovalFilter, StateFilter};
-
-#[derive(Parser)]
-#[command(name = "uad")]
-#[command(about = "Universal Android Debloater - Command Line Interface", long_about = None)]
-#[command(version)]
-#[command(propagate_version = true)]
-pub struct Cli {
- #[command(subcommand)]
- command: Commands,
-}
-
-#[derive(Subcommand)]
-enum Commands {
- /// List connected Android devices
- Devices,
-
- /// List packages on a device
- #[command(name = "list", visible_alias = "ls")]
- List {
- /// Device serial number (optional, uses first device if not specified)
- #[arg(short, long)]
- device: Option,
-
- /// Filter by package state
- #[arg(short, long, value_enum)]
- state: Option,
-
- /// Filter by removal category
- #[arg(short, long, value_enum)]
- removal: Option,
-
- /// Filter by UAD list
- #[arg(short, long, value_enum)]
- list: Option,
-
- /// Search pattern (matches package name or description)
- #[arg(short = 'q', long)]
- search: Option,
-
- /// User ID (defaults to 0)
- #[arg(short, long)]
- user: Option,
- },
-
- /// Uninstall packages (default removal action)
- #[command(visible_alias = "rm")]
- Uninstall {
- /// Package names to uninstall
- packages: Vec,
-
- /// Device serial number (optional, uses first device if not specified)
- #[arg(short, long)]
- device: Option,
-
- /// User ID (defaults to 0)
- #[arg(short, long)]
- user: Option,
-
- /// Dry run - show what would be done without actually doing it
- #[arg(long)]
- dry_run: bool,
- },
-
- /// Restore (reinstall) packages
- #[command(visible_alias = "restore")]
- Enable {
- /// Package names to restore/enable
- packages: Vec,
-
- /// Device serial number (optional, uses first device if not specified)
- #[arg(short, long)]
- device: Option,
-
- /// User ID (defaults to 0)
- #[arg(short, long)]
- user: Option,
-
- /// Dry run - show what would be done without actually doing it
- #[arg(long)]
- dry_run: bool,
- },
-
- /// Disable packages (keeps data but prevents execution)
- Disable {
- /// Package names to disable
- packages: Vec,
-
- /// Device serial number (optional, uses first device if not specified)
- #[arg(short, long)]
- device: Option,
-
- /// User ID (defaults to 0)
- #[arg(short, long)]
- user: Option,
-
- /// Dry run - show what would be done without actually doing it
- #[arg(long)]
- dry_run: bool,
- },
-
- /// Show detailed information about a package
- Info {
- /// Package name
- package: String,
-
- /// Device serial number (optional, uses first device if not specified)
- #[arg(short, long)]
- device: Option,
-
- /// User ID (defaults to 0)
- #[arg(short, long)]
- user: Option,
- },
-
- /// Update UAD package lists from remote repository
- Update,
-
- /// Generate shell completion script
- Completions {
- /// Shell to generate completions for
- #[arg(value_enum)]
- shell: Shell,
- },
-
- /// Start interactive REPL mode
- #[command(visible_alias = "shell")]
- Repl {
- /// Device serial number (optional, uses first device if not specified)
- #[arg(short, long)]
- device: Option,
-
- /// User ID (defaults to 0)
- #[arg(short, long)]
- user: Option,
- },
-}
-
-#[tokio::main]
-async fn main() -> ExitCode {
- match run() {
- Ok(()) => ExitCode::SUCCESS,
- Err(err) => {
- eprintln!("Error: {err}");
- ExitCode::FAILURE
- }
- }
-}
-
-fn run() -> Result<(), Box> {
- let cli = Cli::parse();
-
- match cli.command {
- Commands::Devices => {
- commands::list_devices()?;
- }
- Commands::List {
- device,
- state,
- removal,
- list,
- search,
- user,
- } => {
- commands::list_packages(device, state, removal, list, search, user)?;
- }
- Commands::Uninstall {
- packages,
- device,
- user,
- dry_run,
- } => {
- commands::change_package_state(
- &packages,
- device,
- user,
- dry_run,
- PackageState::Uninstalled,
- "Uninstalling",
- )?;
- }
- Commands::Enable {
- packages,
- device,
- user,
- dry_run,
- } => {
- commands::change_package_state(
- &packages,
- device,
- user,
- dry_run,
- PackageState::Enabled,
- "Enabling",
- )?;
- }
- Commands::Disable {
- packages,
- device,
- user,
- dry_run,
- } => {
- commands::change_package_state(
- &packages,
- device,
- user,
- dry_run,
- PackageState::Disabled,
- "Disabling",
- )?;
- }
- Commands::Info {
- package,
- device,
- user,
- } => {
- commands::show_package_info(&package, device, user)?;
- }
- Commands::Update => {
- commands::update_lists()?;
- }
- Commands::Completions { shell } => {
- commands::generate_completions(shell);
- }
- Commands::Repl { device, user } => {
- repl::repl_mode(device, user)?;
- }
- }
-
- Ok(())
-}
diff --git a/crates/uad-cli/src/output.rs b/crates/uad-cli/src/output.rs
deleted file mode 100644
index cff4724..0000000
--- a/crates/uad-cli/src/output.rs
+++ /dev/null
@@ -1,18 +0,0 @@
-/// Helper macro to handle broken pipe errors gracefully
-/// When piping to commands like `head`, we want to exit cleanly when the pipe closes
-#[macro_export]
-macro_rules! println_or_exit {
- () => {
- let _ = writeln!(std::io::stdout());
- };
- ($($arg:tt)*) => {
- let _ = writeln!(std::io::stdout(), $($arg)*);
- };
-}
-
-#[macro_export]
-macro_rules! print_or_exit {
- ($($arg:tt)*) => {
- let _ = write!(std::io::stdout(), $($arg)*);
- };
-}
diff --git a/crates/uad-cli/src/repl.rs b/crates/uad-cli/src/repl.rs
deleted file mode 100644
index eeee0c6..0000000
--- a/crates/uad-cli/src/repl.rs
+++ /dev/null
@@ -1,374 +0,0 @@
-use rustyline::DefaultEditor;
-use rustyline::error::ReadlineError;
-use std::collections::HashMap;
-use std::io::Write;
-use uad_core::adb::ACommand;
-use uad_core::sync::{CorePackage, Phone, User, apply_pkg_state_commands, get_package_state};
-use uad_core::uad_lists::{Package, PackageState, Removal, UadList, load_debloat_lists};
-
-use crate::commands::{PackageListContext, display_package_list, execute_with_fallback};
-use crate::device::{get_target_device, get_user};
-use crate::filters::StateFilter;
-use crate::println_or_exit;
-
-enum ReplAction {
- Continue,
- Exit,
-}
-
-/// Start interactive REPL mode
-pub fn repl_mode(
- device: Option,
- user_id: Option,
-) -> Result<(), Box> {
- println!("Universal Android Debloater - Interactive Mode");
- println!("Type 'help' for available commands, 'exit' or 'quit' to leave\n");
-
- let target_device = get_target_device(device)?;
- let user = get_user(&target_device, user_id)?;
-
- println!(
- "Connected to: {} ({})",
- target_device.model, target_device.adb_id
- );
- println!("User: {}\n", user.id);
-
- let uad_lists = load_debloat_lists(false).unwrap_or_else(|lists| lists);
- let mut rl = DefaultEditor::new()?;
-
- // Try to load history
- let history_file = dirs::cache_dir().map(|d| d.join("uad").join("cli_history.txt"));
- if let Some(ref path) = history_file {
- let _ = rl.load_history(path);
- }
-
- loop {
- let readline = rl.readline("uad> ");
- match readline {
- Ok(line) => {
- match handle_repl_line(&line, &mut rl, &target_device, user, user_id, &uad_lists) {
- Ok(ReplAction::Continue) => {}
- Ok(ReplAction::Exit) => break,
- Err(e) => {
- eprintln!("Error: {}", e);
- }
- }
- }
- Err(ReadlineError::Interrupted) => {
- println!("Interrupted (Ctrl-C). Type 'exit' to quit.");
- continue;
- }
- Err(ReadlineError::Eof) => {
- println!("Goodbye!");
- break;
- }
- Err(err) => {
- eprintln!("Error: {:?}", err);
- break;
- }
- }
- }
-
- // Save history
- if let Some(ref path) = history_file {
- if let Some(parent) = path.parent() {
- let _ = std::fs::create_dir_all(parent);
- }
- let _ = rl.save_history(path);
- }
-
- Ok(())
-}
-
-/// Handle a single line of REPL input
-fn handle_repl_line(
- line: &str,
- rl: &mut DefaultEditor,
- device: &Phone,
- user: User,
- user_id: Option,
- uad_lists: &HashMap,
-) -> Result> {
- let line = line.trim();
- if line.is_empty() {
- return Ok(ReplAction::Continue);
- }
-
- let _ = rl.add_history_entry(line);
-
- let parts: Vec<&str> = line.split_whitespace().collect();
- if parts.is_empty() {
- return Ok(ReplAction::Continue);
- }
-
- match parts[0] {
- "help" => print_repl_help(),
- "exit" | "quit" => {
- println!("Goodbye!");
- return Ok(ReplAction::Exit);
- }
- "list" | "ls" => {
- handle_list_command(&parts[1..], device, user_id, uad_lists)?;
- }
- "info" => {
- handle_info_command(&parts[1..], device, user.id, uad_lists)?;
- }
- "uninstall" | "rm" => {
- handle_state_change_command(
- &parts[1..],
- device,
- user,
- PackageState::Uninstalled,
- "Uninstalling",
- uad_lists,
- )?;
- }
- "enable" | "restore" => {
- handle_state_change_command(
- &parts[1..],
- device,
- user,
- PackageState::Enabled,
- "Enabling",
- uad_lists,
- )?;
- }
- "disable" => {
- handle_state_change_command(
- &parts[1..],
- device,
- user,
- PackageState::Disabled,
- "Disabling",
- uad_lists,
- )?;
- }
- "device" => {
- println!(
- "Device: {} ({}), Android SDK: {}, User: {}",
- device.model, device.adb_id, device.android_sdk, user.id
- );
- }
- "clear" => {
- print!("\x1B[2J\x1B[1;1H");
- }
- _ => {
- eprintln!(
- "Unknown command: '{}'. Type 'help' for available commands.",
- parts[0]
- );
- }
- }
-
- Ok(ReplAction::Continue)
-}
-
-/// Parse REPL arguments into filters
-struct ReplListArgs {
- state_filter: Option,
- search_term: Option,
-}
-
-impl ReplListArgs {
- fn parse(args: &[&str]) -> Result {
- let mut state_filter = None;
- let mut search_term = None;
- let mut i = 0;
-
- while i < args.len() {
- match args[i] {
- "--state" | "-s" => {
- if i + 1 >= args.len() {
- return Err("--state requires a value".to_string());
- }
- state_filter = match args[i + 1].to_lowercase().as_str() {
- "enabled" => Some(StateFilter::Enabled),
- "disabled" => Some(StateFilter::Disabled),
- "uninstalled" => Some(StateFilter::Uninstalled),
- "all" => Some(StateFilter::All),
- _ => return Err(format!("Invalid state: {}", args[i + 1])),
- };
- i += 2;
- }
- "--search" | "-q" => {
- if i + 1 >= args.len() {
- return Err("--search requires a value".to_string());
- }
- search_term = Some(args[i + 1].to_string());
- i += 2;
- }
- _ => {
- return Err(format!("Unknown option: {}", args[i]));
- }
- }
- }
-
- Ok(Self {
- state_filter,
- search_term,
- })
- }
-}
-
-/// Handle list command in REPL
-fn handle_list_command(
- args: &[&str],
- device: &Phone,
- user_id: Option,
- uad_lists: &HashMap,
-) -> Result<(), Box> {
- let parsed = ReplListArgs::parse(args)?;
-
- let pm_flag = parsed.state_filter.and_then(StateFilter::to_pm_flag);
- let system_packages = ACommand::new()
- .shell(&device.adb_id)
- .pm()
- .list_packages_sys(pm_flag, user_id)?;
-
- let context = PackageListContext {
- state_filter: parsed.state_filter,
- removal_filter: None,
- list_filter: None,
- search: parsed.search_term,
- };
-
- let displayed_count = display_package_list(
- &system_packages,
- uad_lists,
- &device.adb_id,
- user_id,
- &context,
- )?;
-
- if displayed_count == 0 {
- println_or_exit!(" No packages found.");
- } else {
- println_or_exit!("\nTotal: {} package(s)", displayed_count);
- }
-
- Ok(())
-}
-
-/// Handle info command in REPL
-fn handle_info_command(
- args: &[&str],
- device: &Phone,
- user_id: u16,
- uad_lists: &HashMap,
-) -> Result<(), Box> {
- if args.is_empty() {
- eprintln!("Usage: info ");
- return Ok(());
- }
-
- let package = args[0];
- println!("Package: {}", package);
-
- if let Some(pkg_info) = uad_lists.get(package) {
- println!(" List: {}", pkg_info.list);
- println!(" Removal: {}", pkg_info.removal);
- println!(" Description: {}", pkg_info.description);
- } else {
- println!(" Not found in UAD lists (unlisted package)");
- }
-
- let state = get_package_state(&device.adb_id, package, Some(user_id))
- .ok_or("Package not found on device")?;
- println!(" State: {}", state);
-
- Ok(())
-}
-
-/// Handle state change command in REPL
-fn handle_state_change_command(
- args: &[&str],
- device: &Phone,
- user: User,
- target_state: PackageState,
- action_name: &str,
- uad_lists: &HashMap,
-) -> Result<(), Box> {
- if args.is_empty() {
- eprintln!(
- "Usage: {} [package_name...]",
- action_name.to_lowercase()
- );
- return Ok(());
- }
-
- for pkg_name in args {
- process_package_change(pkg_name, device, user, target_state, action_name, uad_lists)?;
- }
-
- Ok(())
-}
-
-/// Process state change for a single package in REPL
-fn process_package_change(
- pkg_name: &str,
- device: &Phone,
- user: User,
- target_state: PackageState,
- action_name: &str,
- uad_lists: &HashMap,
-) -> Result<(), Box> {
- let current_state = get_package_state(&device.adb_id, pkg_name, Some(user.id))
- .ok_or("Package not found on device")?;
-
- println!("{} {} (current: {})", action_name, pkg_name, current_state);
-
- if current_state == target_state {
- println!(" → Already in target state, skipping");
- return Ok(());
- }
-
- let pkg_info = uad_lists.get(pkg_name);
- if let Some(info) = pkg_info {
- if info.removal == Removal::Unsafe {
- println!(" ⚠ WARNING: This package is marked as UNSAFE to remove!");
- }
- }
-
- let core_pkg = CorePackage {
- name: pkg_name.to_string(),
- description: pkg_info.map(|p| p.description.clone()).unwrap_or_default(),
- removal: pkg_info.map(|p| p.removal).unwrap_or(Removal::Unlisted),
- state: current_state,
- list: pkg_info.map(|p| p.list).unwrap_or(UadList::Unlisted),
- };
-
- let commands = apply_pkg_state_commands(&core_pkg, target_state, user, device);
-
- execute_with_fallback(
- pkg_name,
- target_state,
- &core_pkg,
- user,
- device,
- &commands,
- " ",
- )
-}
-
-/// Print REPL help message
-fn print_repl_help() {
- println!("Available commands:");
- println!(" list [--state ] [--search ]");
- println!(" List packages with optional filters");
- println!(" info ");
- println!(" Show information about a package");
- println!(" uninstall [package_name...]");
- println!(" Uninstall one or more packages");
- println!(" enable [package_name...]");
- println!(" Enable/restore one or more packages");
- println!(" disable [package_name...]");
- println!(" Disable one or more packages");
- println!(" device");
- println!(" Show current device information");
- println!(" clear");
- println!(" Clear the screen");
- println!(" help");
- println!(" Show this help message");
- println!(" exit, quit");
- println!(" Exit the interactive mode");
-}
diff --git a/crates/uad-core/Cargo.toml b/crates/uad-core/Cargo.toml
deleted file mode 100644
index f7d3a43..0000000
--- a/crates/uad-core/Cargo.toml
+++ /dev/null
@@ -1,52 +0,0 @@
-[package]
-name = "uad-core"
-version.workspace = true
-authors.workspace = true
-license.workspace = true
-homepage.workspace = true
-repository.workspace = true
-readme.workspace = true
-keywords.workspace = true
-categories = ["command-line-utilities"]
-edition.workspace = true
-
-[features]
-default = []
-self-update = ["dep:flate2", "dep:tar"]
-
-[dependencies]
-serde.workspace = true
-serde_json.workspace = true
-log.workspace = true
-chrono.workspace = true
-toml.workspace = true
-dirs.workspace = true
-ureq.workspace = true
-retry.workspace = true
-csv.workspace = true
-flate2 = { workspace = true, optional = true }
-tar = { workspace = true, optional = true }
-
-[target.'cfg(target_os = "windows")'.dependencies]
-win32console.workspace = true
-
-[lints.rust]
-deprecated_safe = "warn"
-
-[lints.clippy]
-undocumented_unsafe_blocks = "forbid"
-exit = "deny"
-panic_in_result_fn = "warn"
-infinite_loop = "warn"
-mem_forget = "warn"
-implicit_clone = "warn"
-format_push_string = "warn"
-large_include_file = "warn"
-shadow_unrelated = "warn"
-struct_field_names = "allow" # annoying
-
-disallowed_types = "deny"
-disallowed_methods = "deny"
-
-allow_attributes_without_reason = "warn"
-pedantic = { level = "warn", priority = -1 }
diff --git a/crates/uad-core/src/adb.rs b/crates/uad-core/src/adb.rs
deleted file mode 100644
index f2335e0..0000000
--- a/crates/uad-core/src/adb.rs
+++ /dev/null
@@ -1,503 +0,0 @@
-#![deny(clippy::unwrap_used)]
-
-//! This module is intended to group everything that's "intrinsic" of ADB.
-//!
-//! Following the design philosophy of most of Rust `std`,
-//! `*Command` are intended to be "thin wrappers" (low-overhead abstractions)
-//! around the ADB CLI or `adb_client`
-//! ([in the future](https://github.com/Universal-Debloater-Alliance/universal-android-debloater-next-generation/issues/700) ),
-//! which implies:
-//! - no "magic"
-//! - no custom commands
-//! - no chaining ("piping") of existing commands
-//!
-//! This guarantees a 1-to-1 mapping between methods and cmds,
-//! thereby reducing surprises such as:
-//! - Non-atomic operations: consider what happens if a pack changes state
-//! in the middle of listing enabled and disabled packs!
-//! - Non-standard semantics: what would happen if a new ADB version
-//! supports a feature we already defined,
-//! but has _slightly_ different behavior?
-//!
-//! Despite being "low-level", we can still "have cake and eat it too";
-//! After all, what's the point of an abstraction if it doesn't come with goodies?:
-//! We can reserve some artistic license, such as:
-//! - pre-parsing or validanting output, to provide types with invariants
-//! - strongly-typed rather than "stringly-typed" APIs
-//! - nicer IDE support
-//! - compile-time prevention of malformed cmds
-//! - implicit enforcement of a narrow set of operations
-//!
-//! About that last point, if there's ever a need for an ADB feature
-//! which these APIs don't expose,
-//! please, **PLEASE** refrain from falling-back to any `Command`-like API.
-//! Rather, please extend these APIs in a consistent way.
-//!
-//! Thank you! ❤️
-//!
-//! For comprehensive info about ADB,
-//! [see this](https://android.googlesource.com/platform/packages/modules/adb/+/refs/heads/master/docs/)
-
-use std::rc::Rc;
-
-#[cfg(target_os = "windows")]
-use std::os::windows::process::CommandExt;
-
-use crate::utils::is_all_w_c;
-use log::{error, info, warn};
-
-/// Convert ADB output bytes to a trimmed UTF-8 string.
-/// Uses lossy conversion to prevent panics on non-UTF8 output from certain OEMs.
-#[must_use]
-pub fn to_trimmed_utf8(v: &[u8]) -> String {
- String::from_utf8_lossy(v).trim_end().to_string()
-}
-
-#[cfg(debug_assertions)]
-#[must_use]
-fn is_version_triple(s: &str) -> bool {
- let mut components = s.split('.');
- for _ in 0..3 {
- if !components
- .next()
- .is_some_and(|comp| comp.as_bytes().iter().all(u8::is_ascii_digit))
- {
- return false;
- }
- }
- if components.next().is_some() {
- return false;
- }
- true
-}
-
-/// Builder object for an Android Debug Bridge CLI command,
-/// using the type-state and new-type patterns.
-///
-/// This is not intended to model the entire ADB API.
-/// It only models the subset that concerns UADNG.
-///
-/// [More info here](https://developer.android.com/tools/adb)
-#[derive(Debug)]
-pub struct ACommand(std::process::Command);
-impl ACommand {
- /// `adb` command builder
- #[must_use]
- pub fn new() -> Self {
- Self(std::process::Command::new("adb"))
- }
-
- /// `shell` sub-command builder.
- ///
- /// If `device_serial` is empty, it lets ADB choose the default device.
- #[must_use]
- pub fn shell>(mut self, device_serial: S) -> ShellCommand {
- let serial = device_serial.as_ref();
- if !serial.is_empty() {
- self.0.args(["-s", serial]);
- }
- self.0.arg("shell");
- ShellCommand(self)
- }
-
- /// Header-less list of attached devices (as serials) and their statuses:
- /// - USB
- /// - TCP/IP: WIFI, Ethernet, etc...
- /// - Local emulators
- ///
- /// Status can be (but not limited to):
- /// - "unauthorized"
- /// - "device"
- pub fn devices(mut self) -> Result, String> {
- self.0.arg("devices");
- Ok(self
- .run()?
- .lines()
- .skip(1) // header
- .map(|dev_stat| {
- let tab_idx = dev_stat
- // OS-specific?
- .find('\t')
- // True on Linux,
- // no matter if ADB is piped or connected to terminal
- .expect("There must be 1 tab after serial");
- (
- // serial
- dev_stat[..tab_idx].to_string(),
- // status
- dev_stat[(tab_idx + 1)..].to_string(),
- )
- })
- .collect())
- }
-
- /// `version` sub-command
- ///
- /// ## Format
- /// This is just a sample,
- /// we don't know which guarantees are stable (yet):
- /// ```txt
- /// Android Debug Bridge version 1.0.41
- /// Version 34.0.5-debian
- /// Installed as /usr/lib/android-sdk/platform-tools/adb
- /// Running on Linux 6.12.12-amd64 (x86_64)
- /// ```
- ///
- /// The expected format should be like:
- /// ```txt
- /// Android Debug Bridge version ..
- /// Version ..-
- /// Installed as /platform-tools/adb[.exe]
- /// Running on ()
- /// ```
- #[expect(clippy::panic_in_result_fn, reason = "Assertions are fine")]
- pub fn version(mut self) -> Result {
- self.0.arg("version");
- let out = self.run()?;
-
- #[cfg(debug_assertions)]
- {
- const ADBV: &str = "Android Debug Bridge version ";
- const V: &str = "Version ";
-
- let mut lns = out.lines();
-
- assert!(
- lns.next()
- .is_some_and(|ln| ln.starts_with(ADBV) && is_version_triple(&ln[ADBV.len()..]))
- );
- assert!(lns.next().is_some_and(|ln| ln.starts_with(V)
- && is_version_triple(&ln[V.len()..ln.find('-').unwrap_or(ln.len())])));
- // missing test for valid path
- assert!(lns.next().is_some_and(|ln| ln.starts_with("Installed as ")
- && (ln.ends_with("adb") || ln.ends_with("adb.exe"))));
- // missing test for x86/ARM (both 64b)
- assert!(lns.next().is_some_and(|ln| ln.starts_with("Running on ")));
- if lns.next().is_some() {
- unreachable!("Expected < 5 lines")
- }
- }
-
- Ok(out)
- }
-
- /// General executor
- fn run(self) -> Result {
- let mut cmd = self.0;
- #[cfg(target_os = "windows")]
- let cmd = cmd.creation_flags(0x0800_0000); // do not open a cmd window
-
- info!(
- "Ran command: adb {}",
- cmd.get_args()
- .map(|s| s.to_str().unwrap_or_else(|| unreachable!()))
- .collect::>()
- .join(" ")
- );
- match cmd.output() {
- Err(e) => {
- error!("ADB: {e}");
- Err("Cannot run ADB, likely not found".to_string())
- }
- Ok(o) => {
- let stdout = to_trimmed_utf8(&o.stdout);
- if o.status.success() {
- Ok(stdout)
- } else {
- let stderr = to_trimmed_utf8(&o.stderr);
- // ADB does really weird things:
- // Some errors are not redirected to `stderr`
- let err = if stdout.is_empty() { stderr } else { stdout };
- Err(err)
- }
- }
- }
- }
-}
-
-impl Default for ACommand {
- fn default() -> Self {
- Self::new()
- }
-}
-
-/// Builder object for a command that runs on the device's default `sh` implementation.
-/// Typically MKSH, but could be Ash.
-///
-/// [More info](https://chromium.googlesource.com/aosp/platform/system/core/+/refs/heads/upstream/shell_and_utilities).
-#[derive(Debug)]
-pub struct ShellCommand(ACommand);
-impl ShellCommand {
- /// `pm` command builder
- pub fn pm(mut self) -> PmCommand {
- self.0.0.arg("pm");
- PmCommand(self)
- }
- /// Query a device property value, by its key.
- /// These can be of any type:
- /// - `boolean`
- /// - `int`
- /// - chars
- /// - etc...
- ///
- /// So to avoid lossy conversions, we return strs
- pub fn getprop(mut self, key: &str) -> Result {
- self.0.0.args(["getprop", key]);
- self.0.run()
- }
- /// Reboots device
- pub fn reboot(mut self) -> Result {
- self.0.0.arg("reboot");
- self.0.run()
- }
-
- /// Execute an arbitrary shell action string on the device's default shell.
- /// The action string is passed as a single argument to `adb shell` and
- /// interpreted by the remote shell (which splits on spaces).
- pub fn raw(mut self, action: &str) -> Result {
- self.0.0.arg(action);
- self.0.run()
- }
-}
-
-#[must_use]
-pub const fn is_pkg_component(s: &[u8]) -> bool {
- if s.is_empty() {
- return false;
- }
- s[0].is_ascii_alphabetic()
- && if s.len() > 1 {
- is_all_w_c(s.split_at(1).1)
- } else {
- true
- }
-}
-
-/// String with the invariant of being a valid package-name.
-/// See [`PackageId::new`] for validation details.
-#[derive(Debug, Clone, PartialEq, Eq, Hash)]
-pub struct PackageId(Rc);
-impl PackageId {
- /// Creates a package-ID if it's `"android"` or valid according to:
- /// -
- /// -
- #[must_use]
- pub fn new(p_id: &str) -> Option {
- if p_id == "android" {
- return Some(Self(p_id.into()));
- }
- let mut components = p_id.split('.');
- for _ in 0..2 {
- if !components
- .next()
- .is_some_and(|comp| is_pkg_component(comp.as_bytes()))
- {
- return None;
- }
- }
- if components.all(|comp| is_pkg_component(comp.as_bytes())) {
- Some(Self(p_id.into()))
- } else {
- None
- }
- }
-}
-
-/// `pm list packages` flag/state/type
-#[derive(Debug, Clone, Copy, PartialEq, Eq)]
-pub enum PmListPacksFlag {
- /// `-u`, not to be confused with `-a`
- IncludeUninstalled,
- /// `-e`
- OnlyEnabled,
- /// `-d`
- OnlyDisabled,
-}
-impl PmListPacksFlag {
- // is there a trait for this?
- fn to_str(self) -> &'static str {
- match self {
- Self::IncludeUninstalled => "-u",
- Self::OnlyEnabled => "-e",
- Self::OnlyDisabled => "-d",
- }
- }
-}
-#[expect(clippy::to_string_trait_impl, reason = "This is not user-facing")]
-impl ToString for PmListPacksFlag {
- fn to_string(&self) -> String {
- self.to_str().to_string()
- }
-}
-
-const PACK_PREFIX: &str = "package:";
-
-pub const PM_CLEAR_PACK: &str = "pm clear";
-
-/// Builder object for an Android Package Manager command.
-///
-#[derive(Debug)]
-#[must_use]
-pub struct PmCommand(ShellCommand);
-impl PmCommand {
- /// `list packages -s` sub-command, [`PACK_PREFIX`] stripped from each element.
- ///
- /// `Ok` variant:
- /// - isn't 100% guaranteed to contain valid pack-IDs
- /// but you can assume it does (except in `unsafe {}` blocks)
- /// - isn't sorted
- /// - duplicates never _seem_ to happen, but don't assume uniqueness
- pub fn list_packages_sys(
- mut self,
- f: Option,
- user_id: Option,
- ) -> Result, String> {
- let cmd = &mut self.0.0.0;
-
- cmd.args(["list", "packages", "-s"]);
- if let Some(s) = f {
- cmd.arg(s.to_str());
- }
- if let Some(u) = user_id {
- cmd.arg("--user");
- cmd.arg(u.to_string());
- }
-
- self.0.0.run().map(|pack_ls| {
- pack_ls
- .lines()
- .filter_map(|p_ln| {
- debug_assert!(p_ln.starts_with(PACK_PREFIX));
- let p = &p_ln[PACK_PREFIX.len()..];
- if PackageId::new(p).is_some() {
- Some(String::from(p))
- } else {
- warn!("skipping nonstandard package name: {p:?}");
- None
- }
- })
- .collect()
- })
- }
-
- /// `list users` sub-command, deserialized/parsed.
- ///
- /// -
- /// -
- pub fn list_users(mut self) -> Result, String> {
- self.0.0.0.args(["list", "users"]);
- Ok(self
- .0
- .0
- .run()?
- .lines()
- .skip(1) // omit header
- .map(|ln| {
- // this could be optimized by making more API-stability assumptions
- let ln = ln.trim_ascii_start();
- let ln = ln.strip_prefix("UserInfo").unwrap_or(ln).trim_ascii_start();
- let ln = ln.strip_prefix('{').unwrap_or(ln).trim_ascii();
- //let run;
- let ln = if let Some(l) = ln.strip_suffix("running") {
- //run = true;
- l.trim_ascii_end()
- } else {
- //run = false;
- ln
- };
- let ln = ln.strip_suffix('}').unwrap_or(ln).trim_ascii_end();
- // https://android.googlesource.com/platform/frameworks/base/+/refs/heads/main/core/java/android/content/pm/UserInfo.java
- // The format looks stable today, but google may change it in future Android versions
- // (and very old Androids might differ). Keep parsing defensive.
- // Expected shape: "UserInfo{::}[ running]"
-
- let mut comps = ln.split(':');
-
- let id = comps
- .next()
- .expect("There must be at least 1 ':'-separated component")
- .parse()
- .expect("string assumed to be UID numeral");
- //let name = comps
- // .next()
- // .expect("There must be at least 2 ':'-separated components. 2nd is user-name");
- //let flags = u32::from_str_radix(
- // comps.next().expect(
- // "There must be at least 3 ':'-separated components. 3rd is user bit-flags",
- // ),
- // 16,
- //)
- //.expect("string assumed to be hexadecimal bit-flags");
- UserInfo {
- id,
- //name: name.into(),
- //flags,
- //running: run,
- }
- })
- .collect())
- }
-}
-
-/// Mirror of AOSP `UserInfo` Java Class, with an extra field
-#[derive(Debug, Clone)]
-pub struct UserInfo {
- id: u16,
- //name: Box,
- //flags: u32,
- //running: bool,
-}
-impl UserInfo {
- #[must_use]
- pub const fn get_id(&self) -> u16 {
- self.id
- }
- /*
- /// Check if the user was logged-in at the time `pm list users` was invoked
- #[must_use]
- #[allow(dead_code, reason = "Currently unused by UI; kept for future features")]
- pub const fn was_running(&self) -> bool {
- self.running
- }
- */
-}
-
-#[cfg(test)]
-mod tests {
- use super::*;
-
- #[test]
- fn invalid_pack_ids() {
- for p_id in [
- "",
- " ",
- ".",
- "nodots",
- "com..example",
- "net.hello.",
- "org.0example",
- "org._foobar",
- "the.🎂.is.a.lie",
- "EXCLAMATION!!!!",
- ] {
- assert_eq!(PackageId::new(p_id), None);
- }
- }
-
- #[test]
- fn valid_pack_ids() {
- for p_id in [
- "A.a",
- "x.X",
- "org.example",
- "net.hello",
- "uwu.owo",
- "Am0Gu5.Zuz",
- "net.net.net.net.net.net.net.net.net.net.net",
- "com.github.w1nst0n",
- "this_.String_.is_.not_.real_",
- ] {
- assert_ne!(PackageId::new(p_id), None);
- }
- }
-}
diff --git a/crates/uad-core/src/config.rs b/crates/uad-core/src/config.rs
deleted file mode 100644
index 5c41d78..0000000
--- a/crates/uad-core/src/config.rs
+++ /dev/null
@@ -1,150 +0,0 @@
-use crate::CACHE_DIR;
-use crate::CONFIG_DIR;
-use crate::sync::User;
-use crate::utils::DisplayablePath;
-use log::error;
-use serde::{Deserialize, Serialize};
-use std::fs;
-use std::path::PathBuf;
-use std::sync::LazyLock;
-
-const DEFAULT_THEME: &str = "Auto (follow system theme)";
-
-#[derive(Default, Debug, Serialize, Deserialize, Clone)]
-pub struct Config {
- pub general: GeneralSettings,
- #[serde(skip_serializing_if = "Vec::is_empty", default = "Vec::new")]
- pub devices: Vec,
-}
-
-#[derive(Debug, Serialize, Deserialize, Clone)]
-pub struct GeneralSettings {
- pub theme: String,
- pub expert_mode: bool,
- pub backup_folder: PathBuf,
-}
-
-#[derive(Default, Debug, Clone)]
-pub struct BackupSettings {
- pub backups: Vec,
- pub selected: Option,
- pub users: Vec,
- pub selected_user: Option,
- pub backup_state: String,
-}
-
-#[derive(Debug, Serialize, Deserialize, Clone, Default)]
-pub struct DeviceSettings {
- /// Unique serial identifier
- pub device_id: String,
- pub disable_mode: bool, // should be `enum RemovalMode`
- pub multi_user_mode: bool,
- #[serde(skip)]
- pub backup: BackupSettings,
-}
-
-impl Default for GeneralSettings {
- fn default() -> Self {
- Self {
- theme: DEFAULT_THEME.to_string(),
- expert_mode: false,
- backup_folder: CACHE_DIR.join("backups"),
- }
- }
-}
-
-static CONFIG_FILE: LazyLock = LazyLock::new(|| CONFIG_DIR.join("config.toml"));
-
-impl Config {
- pub fn save_device_settings(
- &mut self,
- device_settings: DeviceSettings,
- general: GeneralSettings,
- ) {
- if let Some(device) = self
- .devices
- .iter_mut()
- .find(|x| x.device_id == device_settings.device_id)
- {
- *device = device_settings;
- } else {
- self.devices.push(device_settings);
- }
- self.general = general;
- let toml = toml::to_string(&self).unwrap();
- fs::write(&*CONFIG_FILE, toml).expect("Could not write config file to disk!");
- }
-
- #[must_use]
- pub fn load_configuration_file() -> Self {
- match fs::read_to_string(&*CONFIG_FILE) {
- Ok(s) => match toml::from_str(&s) {
- Ok(config) => return config,
- Err(e) => error!("Invalid config file: `{e}`"),
- },
- Err(e) => error!("Failed to read config file: `{e}`"),
- }
- error!("Restoring default config file");
- let toml = toml::to_string(&Self::default()).unwrap();
- fs::write(&*CONFIG_FILE, toml).expect("Could not write config file to disk!");
- Self::default()
- }
-}
-
-#[cfg(test)]
-mod tests {
- //! Unit tests
-
- use super::*;
- use std::path::Path;
-
- // create a clean default config file for testing
- fn create_default_config_file() {
- let toml = toml::to_string(&Config::default()).unwrap();
- fs::write(&*CONFIG_FILE, toml).expect("Could not write config file to disk!");
- }
-
- #[test]
- fn test_create_default_config_file() {
- create_default_config_file();
- assert!(CONFIG_FILE.exists());
- }
-
- #[test]
- fn test_load_configuration_file() {
- create_default_config_file();
- let config = Config::load_configuration_file();
- // non-deterministic
- //assert_eq!(config.devices.len(), 0);
- assert_eq!(config.general.theme, DEFAULT_THEME);
- assert!(!config.general.expert_mode);
- assert_eq!(config.general.backup_folder, CACHE_DIR.join("backups"));
- }
-
- // non-deterministic
- /*
- #[test]
- fn test_save_changes() {
- let mut settings = Settings::default();
- let device_id = "test_device".to_string();
- settings.device.device_id = device_id.clone();
- Config::save_changes(&settings, &device_id);
- let config = Config::load_configuration_file();
- assert_eq!(config.devices[0].device_id, device_id);
- }
- */
-
- #[test]
- fn test_default_config() {
- let config = Config::default();
- assert_eq!(config.devices.len(), 0);
- assert_eq!(config.general.theme, DEFAULT_THEME);
- assert!(!config.general.expert_mode);
- assert_eq!(config.general.backup_folder, CACHE_DIR.join("backups"));
- }
-
- #[test]
- fn test_config_file_path() {
- assert_eq!(&*CONFIG_FILE, Path::new(&*CONFIG_DIR.join("config.toml")));
- }
-}
diff --git a/crates/uad-core/src/lib.rs b/crates/uad-core/src/lib.rs
deleted file mode 100644
index be3e5b4..0000000
--- a/crates/uad-core/src/lib.rs
+++ /dev/null
@@ -1,23 +0,0 @@
-#![allow(
- clippy::missing_panics_doc,
- clippy::missing_errors_doc,
- clippy::collapsible_if,
- clippy::uninlined_format_args,
- clippy::result_unit_err,
- reason = "Doc+style pedantic lints are out-of-scope for this pass"
-)]
-
-pub mod adb;
-pub mod config;
-pub mod save;
-pub mod sync;
-pub mod uad_lists;
-pub mod update;
-pub mod utils;
-
-use std::path::PathBuf;
-use std::sync::LazyLock;
-pub static CONFIG_DIR: LazyLock =
- LazyLock::new(|| utils::setup_uad_dir(&dirs::config_dir().expect("Can't detect config dir")));
-pub static CACHE_DIR: LazyLock =
- LazyLock::new(|| utils::setup_uad_dir(&dirs::cache_dir().expect("Can't detect cache dir")));
diff --git a/crates/uad-core/src/sync.rs b/crates/uad-core/src/sync.rs
deleted file mode 100644
index f90b6ee..0000000
--- a/crates/uad-core/src/sync.rs
+++ /dev/null
@@ -1,663 +0,0 @@
-use crate::{
- adb::{ACommand as AdbCommand, PM_CLEAR_PACK, PackageId},
- uad_lists::PackageState,
-};
-use log::{error, info};
-use retry::{OperationResult, delay::Fixed, retry};
-use serde::{Deserialize, Serialize};
-
-/// An Android device, typically a phone
-#[derive(Debug, Clone, PartialEq, Eq)]
-pub struct Phone {
- /// Non-market name
- pub model: String, // could be `Copy`
- /// Android API level version
- pub android_sdk: u8,
- /// In theory, `len < u16::MAX` _should_ always be `true`.
- /// In practice, `len <= u8::MAX`.
- pub user_list: Vec,
- /// Unique serial identifier
- pub adb_id: String, // could be `Copy`
-}
-
-impl Default for Phone {
- fn default() -> Self {
- Self {
- model: "fetching devices...".to_string(),
- android_sdk: 0,
- user_list: vec![],
- adb_id: String::default(),
- }
- }
-}
-
-impl std::fmt::Display for Phone {
- fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
- write!(f, "{}", self.model)
- }
-}
-
-/// `UserInfo` but relevant to UAD
-#[derive(Default, Debug, Clone, Copy, PartialEq, Eq)]
-pub struct User {
- pub id: u16,
- pub index: usize,
- pub protected: bool,
-}
-
-impl std::fmt::Display for User {
- fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
- write!(f, "user {}", self.id)
- }
-}
-
-/// An enum to contain different variants for errors yielded by ADB.
-#[derive(Debug, Clone)]
-pub enum AdbError {
- Generic(String),
-}
-
-/// Run an arbitrary shell action via the typed ADB wrapper.
-/// This replaces the deprecated `adb_shell_command`.
-///
-/// If `serial` is empty, it lets ADB choose the default device.
-pub fn run_adb_shell_action>(
- device_serial: S,
- action: &str,
-) -> Result {
- let serial = device_serial.as_ref();
-
- match AdbCommand::new().shell(serial).raw(action) {
- Ok(o) => {
- if ["Error", "Failure"].iter().any(|&e| o.contains(e)) {
- let friendly_msg = make_friendly_error_message(&o, action);
- return Err(AdbError::Generic(friendly_msg));
- }
- info!("{action} -> {o}");
- Ok(o)
- }
- Err(err) => {
- if !err.contains("[not installed for") {
- let friendly_msg = make_friendly_error_message(&err, action);
- return Err(AdbError::Generic(friendly_msg));
- }
- Err(AdbError::Generic(err))
- }
- }
-}
-
-/// Convert common OEM-specific ADB error messages into user-friendly explanations.
-fn make_friendly_error_message(error_output: &str, action: &str) -> String {
- // Common Samsung errors
- if error_output.contains("DELETE_FAILED_USER_RESTRICTED") {
- return format!(
- "Cannot uninstall: This package is restricted by the device manufacturer (Samsung Knox or similar).\n\
- Error: {error_output}\n\
- Tip: Try disabling the package instead, or check device settings for Knox/security restrictions."
- );
- }
-
- if error_output.contains("NOT_INSTALLED_FOR_USER") {
- return format!(
- "Package is not installed for the current user.\n\
- Error: {error_output}\n\
- Tip: The package may be installed for a different user profile or work profile."
- );
- }
-
- // Empty package name error
- if error_output.contains("Shell cannot change component state for null") {
- return format!(
- "Invalid package: Empty package name detected.\n\
- Error: {error_output}\n\
- Tip: Please refresh the package list and try again."
- );
- }
-
- // Generic permission errors
- if error_output.contains("Permission denied")
- || error_output.contains("INSTALL_FAILED_PERMISSION_MODEL_DOWNGRADE")
- {
- return format!(
- "Permission denied: Insufficient privileges to perform this action.\n\
- Error: {error_output}\n\
- Tip: This may require root access or the package is protected by the system."
- );
- }
-
- // Work profile / managed device errors
- if error_output.contains("DELETE_FAILED_DEVICE_POLICY_MANAGER") {
- return format!(
- "Cannot modify: Package is managed by device policy (MDM/EMM).\n\
- Error: {error_output}\n\
- Tip: Contact your IT administrator if this is a work device."
- );
- }
-
- // Generic failure with context
- format!("{action} -> {error_output}")
-}
-
-/// If `None`, returns an empty String, not " --user 0"
-#[must_use]
-pub fn user_flag(user_id: Option) -> String {
- user_id
- .map(|user| format!(" --user {}", user.id))
- .unwrap_or_default()
-}
-
-// Minimum information for processing adb commands
-#[derive(Debug, Deserialize, Serialize, Clone, PartialEq, Eq)]
-pub struct CorePackage {
- pub name: String,
- pub description: String,
- #[serde(default)]
- pub removal: crate::uad_lists::Removal,
- #[serde(default)]
- pub state: PackageState,
- #[serde(default)]
- pub list: crate::uad_lists::UadList,
-}
-
-#[must_use]
-pub fn apply_pkg_state_commands(
- package: &CorePackage,
- wanted_state: PackageState,
- selected_user: User,
- phone: &Phone,
-) -> Vec {
- // https://github.com/Universal-Debloater-Alliance/universal-android-debloater/wiki/ADB-reference
- // ALWAYS PUT THE COMMAND THAT CHANGES THE PACKAGE STATE FIRST!
- let commands = match wanted_state {
- PackageState::Enabled => match package.state {
- PackageState::Disabled => vec!["pm enable"],
- PackageState::Uninstalled => match phone.android_sdk {
- i if i >= 23 => vec!["cmd package install-existing"],
- 21 | 22 => vec!["pm unhide"],
- 19 | 20 => vec!["pm unblock", PM_CLEAR_PACK],
- _ => unreachable!("already prevented by the GUI"),
- },
- _ => vec![],
- },
- PackageState::Disabled => match package.state {
- PackageState::Uninstalled | PackageState::Enabled => {
- if supports_disabling(phone) {
- vec!["pm disable-user", "am force-stop", PM_CLEAR_PACK]
- } else {
- vec![]
- }
- }
- _ => vec![],
- },
- PackageState::Uninstalled => match package.state {
- PackageState::Enabled | PackageState::Disabled => match phone.android_sdk {
- sdk if sdk >= 23 => vec!["pm uninstall"], // > Marshmallow (6.0)
- 21 | 22 => vec!["pm hide", PM_CLEAR_PACK], // Lollipop (5.x)
- _ => vec!["pm block", PM_CLEAR_PACK], // Disable mode is unavailable on older devices because the specific ADB commands need root
- },
- _ => vec![],
- },
- PackageState::All => vec![],
- }; // this should be a `tinyvec`, as `len <= 4`
-
- let user = supports_multi_user(phone).then_some(selected_user);
- request_builder(&commands, &package.name, user)
-}
-
-/// Build a command request to be sent via ADB to a device.
-/// `commands` accepts one or more ADB shell commands
-/// which act on a common `package` and `user`.
-#[must_use]
-pub fn request_builder(commands: &[&str], package: &str, user: Option) -> Vec {
- // Defense-in-depth: `package` is interpolated verbatim into a device-shell
- // action, so refuse any invalid name/ID. Every current caller already
- // reconciles the name against the live device package list before reaching
- // here, so this rejects nothing legitimate — it just keeps the no-injection
- // guarantee local to the sink instead of relying on each caller to sanitise.
- // Fail closed: emit no command for a malformed name rather than an injectable
- // device-shell string.
- if PackageId::new(package).is_none() {
- error!("request_builder: refusing invalid package name: {package:?}");
- return Vec::new();
- }
- let maybe_user_flag = user_flag(user);
- commands
- .iter()
- .map(|c| format!("{c}{maybe_user_flag} {package}"))
- .collect()
-}
-
-/// Get the model by querying the `ro.product.model` property.
-///
-/// If `serial` is empty, it lets ADB choose the default device.
-#[must_use]
-pub fn get_device_model(serial: &str) -> String {
- AdbCommand::new()
- .shell(serial)
- .getprop("ro.product.model")
- .unwrap_or_else(|err| {
- eprintln!("ERROR: {err}");
- error!("{err}");
- if err.contains("adb: no devices/emulators found") {
- "no devices/emulators found".to_string()
- } else {
- err
- }
- })
-}
-
-/// Get the brand by querying the `ro.product.brand` property.
-///
-/// If `serial` is empty, it lets ADB choose the default device.
-#[must_use]
-pub fn get_device_brand(serial: &str) -> String {
- AdbCommand::new()
- .shell(serial)
- .getprop("ro.product.brand")
- // `trim` is just-in-case
- .map(|s| s.trim().to_string())
- .unwrap_or_default()
-}
-
-/// Get Android SDK version by querying the
-// `ro.build.version.sdk` property or defaulting to 0.
-///
-/// If `device_serial` is empty, it lets ADB choose the default device.
-#[must_use]
-pub fn get_android_sdk(device_serial: &str) -> u8 {
- AdbCommand::new()
- .shell(device_serial)
- .getprop("ro.build.version.sdk")
- .map_or(0, |sdk| {
- sdk.parse().expect("SDK version numeral must be valid")
- })
-}
-
-/// Capture the current state of a package across all non-protected users.
-/// This is used to detect cross-user behavior by comparing before and after states.
-///
-/// Only includes users where the package exists (Some state). Users where the package
-/// doesn't exist (None) are not tracked.
-#[must_use]
-pub fn capture_cross_user_states(
- package_name: &str,
- device_serial: &str,
- target_user_id: u16,
- phone: &Phone,
-) -> Vec<(u16, PackageState)> {
- phone
- .user_list
- .iter()
- .filter(|u| !u.protected && u.id != target_user_id)
- .filter_map(|u| {
- verify_package_state(package_name, device_serial, Some(u.id)).map(|state| (u.id, state))
- })
- .collect()
-}
-
-/// Detect cross-user behavior and return appropriate notification message.
-/// This handles unexpected cross-user behavior:
-/// - Case A: Uninstall → Restore (package appears on other users)
-/// - Case B: Uninstall → Uninstall (package disappears from other users that previously had it)
-/// - Case C: Restore → Restore (package appears on other users)
-#[must_use]
-pub fn detect_cross_user_behavior(
- package_name: &str,
- device_serial: &str,
- target_user_id: u16,
- wanted_state: PackageState,
- actual_state: PackageState,
- phone: &Phone,
- before_states: &[(u16, PackageState)],
-) -> Option {
- // Only check if operation was successful on target user
- if actual_state != wanted_state {
- return None;
- }
-
- // Only check if we have multiple users
- if phone.user_list.len() < 2 {
- return None;
- }
-
- let after_states =
- check_cross_user_package_existence(package_name, device_serial, target_user_id, phone);
-
- match wanted_state {
- PackageState::Uninstalled => {
- if after_states.is_empty() {
- // Case B: Uninstall → Uninstall (check if all users lost package)
- let affected_users: Vec<_> = before_states
- .iter()
- .filter(|(uid, before_state)| {
- // Only flag if the package was installed/enabled/disabled before
- *before_state != PackageState::Uninstalled
- // And is NOT in after_states (doesn't exist in usable state anymore)
- && !after_states.iter().any(|(after_uid, _)| after_uid == uid)
- })
- .map(|(uid, _)| uid)
- .collect();
-
- if affected_users.is_empty() {
- None
- } else {
- let user_list = affected_users
- .iter()
- .map(|uid| format!("user {uid}"))
- .collect::>()
- .join(", ");
-
- Some(format!(
- "Detected cross-user uninstall: package was also uninstalled from {user_list} after uninstalling from user {target_user_id}"
- ))
- }
- } else {
- // Case A: Uninstall → Restore (package appears on other users)
- let user_list = after_states
- .iter()
- .map(|(uid, state)| format!("user {uid} ({state:?})"))
- .collect::>()
- .join(", ");
-
- Some(format!(
- "Detected cross-user restoration: package exists on {user_list} after uninstalling from user {target_user_id}"
- ))
- }
- }
- PackageState::Enabled | PackageState::Disabled => {
- // Case C: Restore → Restore (package appears on other users)
-
- // Check if a user didn't have the package before (not tracked or package didn't exist).
- // Detects packages that appear on users where they didn't exist previously (OEM cross-user restoration).
- let was_package_absent_before = |uid: &u16| {
- before_states
- .iter()
- .find(|(before_uid, _)| before_uid == uid)
- .is_none_or(|(_, before_state)| *before_state == PackageState::Uninstalled)
- };
-
- let newly_appeared: Vec<_> = after_states
- .iter()
- .filter(|(uid, _after_state)| was_package_absent_before(uid))
- .collect();
-
- if newly_appeared.is_empty() {
- None
- } else {
- let user_list = newly_appeared
- .iter()
- .map(|(uid, state)| format!("user {uid} ({state:?})"))
- .collect::>()
- .join(", ");
-
- Some(format!(
- "Detected cross-user restoration: package exists on {user_list} after {} from user {target_user_id}",
- if wanted_state == PackageState::Enabled {
- "enabling"
- } else {
- "disabling"
- }
- ))
- }
- }
- PackageState::All => None,
- }
-}
-
-#[must_use]
-pub const fn supports_disabling(dev: &Phone) -> bool {
- // >= Marshmallow (6.0)
- dev.android_sdk >= 23
-}
-
-/// Check if it might support multi-user mode,
-/// by simply comparing SDK version.
-/// `true` isn't reliable, you can only trust `false`.
-///
-/// See:
-/// -
-/// -
-#[must_use]
-pub const fn supports_multi_user(dev: &Phone) -> bool {
- // >= Lollipop (5.0)
- dev.android_sdk >= 21
-}
-
-/// Check if a `user_id` is protected on a device by trying
-/// to list associated packages.
-///
-/// If `device_serial` is empty, it lets ADB choose the default device.
-pub fn is_protected_user>(user_id: u16, device_serial: S) -> bool {
- AdbCommand::new()
- .shell(device_serial)
- .pm()
- .list_packages_sys(None, Some(user_id))
- .is_err()
-}
-
-#[must_use]
-pub fn list_users_idx_prot(device_serial: &str) -> Vec {
- AdbCommand::new()
- .shell(device_serial)
- .pm()
- .list_users()
- .map(|out| {
- out.into_iter()
- .enumerate()
- .map(|(i, user)| {
- let id = user.get_id();
- User {
- id,
- index: i,
- protected: is_protected_user(id, device_serial),
- }
- })
- .collect()
- })
- .unwrap_or_default()
-}
-
-/// This matches serials (`getprop ro.serialno`)
-/// that are authorized by the user.
-#[must_use]
-pub fn get_devices_list() -> Vec {
- retry(
- Fixed::from_millis(500).take(if cfg!(debug_assertions) { 3 } else { 10 }),
- || match AdbCommand::new().devices() {
- Ok(devices) => {
- let mut device_list: Vec = vec![];
- if devices.iter().all(|(_, stat)| stat != "device") {
- return OperationResult::Retry(vec![]);
- }
- for device in devices {
- let serial = &device.0;
- device_list.push(Phone {
- model: format!("{} {}", get_device_brand(serial), get_device_model(serial)),
- android_sdk: get_android_sdk(serial),
- user_list: list_users_idx_prot(serial),
- adb_id: serial.clone(),
- });
- }
- OperationResult::Ok(device_list)
- }
- Err(err) => {
- error!("get_devices_list() -> {err}");
- let test: Vec = vec![];
- OperationResult::Retry(test)
- }
- },
- )
- .unwrap_or_default()
-}
-
-#[must_use]
-pub fn initial_load() -> bool {
- match AdbCommand::new().devices() {
- Ok(_devices) => true,
- Err(_err) => false,
- }
-}
-
-/// Get the current state of a package on a device
-#[must_use]
-pub fn get_package_state(
- device_serial: &str,
- package_name: &str,
- user_id: Option,
-) -> Option {
- use crate::adb::{ACommand as AdbCommand, PmListPacksFlag};
-
- // Check if package is enabled
- if let Ok(enabled_packages) = AdbCommand::new()
- .shell(device_serial)
- .pm()
- .list_packages_sys(Some(PmListPacksFlag::OnlyEnabled), user_id)
- && enabled_packages.contains(&package_name.to_string())
- {
- return Some(PackageState::Enabled);
- }
-
- // Check if package is disabled
- if let Ok(disabled_packages) = AdbCommand::new()
- .shell(device_serial)
- .pm()
- .list_packages_sys(Some(PmListPacksFlag::OnlyDisabled), user_id)
- && disabled_packages.contains(&package_name.to_string())
- {
- return Some(PackageState::Disabled);
- }
-
- // Check if package exists at all (including uninstalled)
- if let Ok(all_packages) = AdbCommand::new()
- .shell(device_serial)
- .pm()
- .list_packages_sys(Some(PmListPacksFlag::IncludeUninstalled), user_id)
- && all_packages.contains(&package_name.to_string())
- {
- return Some(PackageState::Uninstalled);
- }
-
- // Package not found at all - it doesn't exist on this device/user
- None
-}
-
-/// Verify the current state of a package on a device.
-/// Returns the package state, or `None` if the package doesn't exist.
-#[must_use]
-pub fn verify_package_state(
- package_name: &str,
- device_serial: &str,
- user_id: Option,
-) -> Option {
- get_package_state(device_serial, package_name, user_id)
-}
-
-/// Check if a package exists on any other users besides the target user.
-/// This helps detect OEM-specific cross-user restoration behavior.
-///
-/// Only includes users where the package exists in a non-uninstalled state
-/// (i.e., Enabled or Disabled).
-#[must_use]
-pub fn check_cross_user_package_existence(
- package_name: &str,
- device_serial: &str,
- target_user_id: u16,
- phone: &Phone,
-) -> Vec<(u16, PackageState)> {
- let mut other_user_states = Vec::new();
-
- for user in &phone.user_list {
- if user.id != target_user_id
- && !user.protected
- && let Some(state) = verify_package_state(package_name, device_serial, Some(user.id))
- && state != PackageState::Uninstalled
- {
- other_user_states.push((user.id, state));
- }
- }
-
- other_user_states
-}
-
-/// Creates a `CorePackage` with the specified state, preserving other fields from the original.
-fn package_with_state(package: &CorePackage, state: PackageState) -> CorePackage {
- CorePackage {
- state,
- ..package.clone()
- }
-}
-
-/// Executes the first available command and returns the result.
-fn execute_first_command(commands: &[String], phone: &Phone) -> Result<(), String> {
- if commands.is_empty() {
- return Err("No command available".to_string());
- }
- AdbCommand::new()
- .shell(&phone.adb_id)
- .raw(&commands[0])
- .map(|_| ())
- .map_err(|err| err.clone())
-}
-
-/// Attempt fallback action when package state verification fails
-pub fn attempt_fallback(
- package: &CorePackage,
- wanted_state: PackageState,
- actual_state: PackageState,
- user: User,
- phone: &Phone,
-) -> Result {
- match (wanted_state, actual_state) {
- // Case 1: Tried to uninstall but package was reinstalled -> disable it
- (PackageState::Uninstalled, PackageState::Enabled) => {
- let pkg = package_with_state(package, PackageState::Enabled);
- let commands = apply_pkg_state_commands(&pkg, PackageState::Disabled, user, phone);
- execute_first_command(&commands, phone)
- .map(|()| "disabled package instead of uninstalling".to_string())
- .map_err(|e| format!("Failed to disable package: {e}"))
- }
-
- // Case 2: Tried to disable but package re-enabled itself -> try uninstall
- (PackageState::Disabled, PackageState::Enabled) => {
- let pkg = package_with_state(package, PackageState::Enabled);
- let commands = apply_pkg_state_commands(&pkg, PackageState::Uninstalled, user, phone);
- execute_first_command(&commands, phone)
- .map_err(|e| format!("Failed to uninstall: {e}"))?;
-
- // Verify the package was actually uninstalled
- match verify_package_state(&package.name, &phone.adb_id, Some(user.id)) {
- Some(PackageState::Uninstalled) | None => {
- Ok("uninstalled package instead of disabling".to_string())
- }
- _ => Err("Package still exists after uninstall attempt".to_string()),
- }
- }
-
- // Case 3: Tried to enable but package was disabled -> try uninstall then reinstall
- (PackageState::Enabled, PackageState::Disabled) => {
- let pkg = package_with_state(package, PackageState::Disabled);
- let uninstall_cmds =
- apply_pkg_state_commands(&pkg, PackageState::Uninstalled, user, phone);
- execute_first_command(&uninstall_cmds, phone)
- .map_err(|e| format!("Failed to uninstall for reinstall: {e}"))?;
-
- // Now try to reinstall/enable
- let pkg_uninstalled = package_with_state(package, PackageState::Uninstalled);
- let enable_cmds =
- apply_pkg_state_commands(&pkg_uninstalled, PackageState::Enabled, user, phone);
-
- if enable_cmds.is_empty() {
- return Ok("uninstalled package but couldn't reinstall".to_string());
- }
-
- execute_first_command(&enable_cmds, phone)
- .map(|()| "uninstalled and reinstalled package to enable it".to_string())
- .map_err(|e| format!("Failed to reinstall package: {e}"))
- }
-
- // Other cases - no fallback available
- _ => Err(format!(
- "No fallback available for wanted state {wanted_state:?} and actual state {actual_state:?}"
- )),
- }
-}
diff --git a/crates/uad-core/src/utils.rs b/crates/uad-core/src/utils.rs
deleted file mode 100644
index 3569162..0000000
--- a/crates/uad-core/src/utils.rs
+++ /dev/null
@@ -1,299 +0,0 @@
-#![warn(clippy::unwrap_used)]
-
-use crate::{
- adb::{ACommand as AdbCommand, PmListPacksFlag},
- sync::{CorePackage, User},
- uad_lists::{PackageHashMap, PackageState, Removal, UadList},
-};
-use chrono::{DateTime, offset::Utc};
-use csv::Writer;
-use log::error;
-use std::{
- collections::HashSet,
- fmt, fs,
- path::{Path, PathBuf},
-};
-
-/// Canonical shortened name of the application
-pub const NAME: &str = "UAD-ng";
-/// Full name of the application
-pub const FULL_NAME: &str = "Universal Android Debloater Next Generation";
-pub const EXPORT_FILE_NAME: &str = "selection_export.txt";
-
-/// Returns `true` if `c` matches the regex `\w`
-#[inline]
-#[must_use]
-pub const fn is_w(c: u8) -> bool {
- // https://github.com/rust-lang/rust/issues/93279
- // https://github.com/rust-lang/rust/issues/83623
- (c == b'_') | c.is_ascii_alphanumeric()
-}
-
-/// Returns `true` if `s` matches the regex `^\w+$`
-#[must_use]
-pub const fn is_all_w_c(s: &[u8]) -> bool {
- let mut i = 0;
- while i < s.len() {
- if !is_w(s[i]) {
- return false;
- }
- i += 1;
- }
- true
-}
-
-// Takes a time-stamp parameter,
-// for purity and testability.
-//
-// The TZ is generic, because testing requires UTC,
-// while users get the local-aware version.
-#[expect(
- clippy::needless_pass_by_value,
- reason = "Timestamps should be fresh, no need to borrow"
-)]
-#[must_use]
-pub fn generate_backup_name(t: DateTime) -> String
-where
- T: chrono::TimeZone,
- T::Offset: std::fmt::Display,
-{
- t.format("uninstalled_packages_%Y%m%d.csv").to_string()
-}
-
-#[derive(Debug, Clone, Copy)]
-pub enum Error {
- DialogClosed,
-}
-
-#[must_use]
-pub fn fetch_packages(
- uad_lists: &PackageHashMap,
- device_serial: &str,
- user_id: Option,
-) -> Vec {
- let all_sys_packs = AdbCommand::new()
- .shell(device_serial)
- .pm()
- .list_packages_sys(Some(PmListPacksFlag::IncludeUninstalled), user_id)
- .unwrap_or_default();
- let enabled_sys_packs: HashSet = AdbCommand::new()
- .shell(device_serial)
- .pm()
- .list_packages_sys(Some(PmListPacksFlag::OnlyEnabled), user_id)
- .unwrap_or_default()
- .into_iter()
- .collect();
- let disabled_sys_packs: HashSet = AdbCommand::new()
- .shell(device_serial)
- .pm()
- .list_packages_sys(Some(PmListPacksFlag::OnlyDisabled), user_id)
- .unwrap_or_default()
- .into_iter()
- .collect();
-
- let mut description;
- let mut removal;
- let mut state;
- let mut list;
- let mut user_package: Vec = Vec::new();
-
- for pack_name in all_sys_packs {
- let p_name = &pack_name;
- description = String::from("[No description]: CONTRIBUTION WELCOMED");
- removal = Removal::Unlisted;
- state = PackageState::Uninstalled;
- list = UadList::Unlisted;
-
- if let Some(package) = uad_lists.get(p_name) {
- if !package.description.is_empty() {
- description = package.description.clone();
- }
- removal = package.removal;
- list = package.list;
- }
-
- if enabled_sys_packs.contains(p_name) {
- state = PackageState::Enabled;
- } else if disabled_sys_packs.contains(p_name) {
- state = PackageState::Disabled;
- }
-
- let package = CorePackage {
- name: p_name.clone(),
- description,
- removal,
- state,
- list,
- };
- user_package.push(package);
- }
- user_package.sort_by_key(|package| package.name.to_lowercase());
- user_package
-}
-
-#[must_use]
-pub fn setup_uad_dir(dir: &Path) -> PathBuf {
- let dir = dir.join("uad");
- if let Err(e) = fs::create_dir_all(&dir) {
- error!("Can't create directory: {}", dir.display());
- panic!("{e}");
- }
- dir
-}
-
-/// Open a directory or file with the system's default file manager.
-pub fn open_url(dir: PathBuf) {
- const OPENER: &str = match std::env::consts::OS.as_bytes() {
- b"windows" => "explorer",
- b"macos" => "open",
- // "linux"
- _ => "xdg-open",
- };
- match std::process::Command::new(OPENER).arg(dir).output() {
- Ok(o) => {
- if !o.status.success() {
- // Use lossy conversion for stderr - some systems (like Windows)
- // may output non-UTF8 characters in error messages
- let stderr = String::from_utf8_lossy(&o.stderr);
- let stderr_trimmed = stderr.trim_end();
- if stderr_trimmed.is_empty() {
- error!("Can't open URL: command failed with no error message");
- } else {
- error!("Can't open the following URL: {stderr_trimmed}");
- }
- }
- }
- Err(e) => error!("Failed to run command to open the file explorer: {e}"),
- }
-}
-
-#[rustfmt::skip]
-#[must_use]
-pub fn last_modified_date(file: PathBuf) -> DateTime {
- fs::metadata(file).map_or_else(|_| Utc::now(), |metadata| match metadata.modified() {
- Ok(time) => time.into(),
- Err(_) => Utc::now(),
- })
-}
-
-#[must_use]
-pub fn format_diff_time_from_now(date: DateTime) -> String {
- let now: DateTime = Utc::now();
- let last_update = now - date;
- if last_update.num_days() == 0 {
- if last_update.num_hours() == 0 {
- last_update.num_minutes().to_string() + " min(s) ago"
- } else {
- last_update.num_hours().to_string() + " hour(s) ago"
- }
- } else {
- last_update.num_days().to_string() + " day(s) ago"
- }
-}
-
-/// Export selected package names.
-/// File will be saved in same directory where UAD-ng is located.
-pub fn export_selection(package_names: &[String]) -> Result {
- let selected = package_names.join("\n");
-
- match fs::write(EXPORT_FILE_NAME, selected) {
- Ok(()) => Ok(true),
- Err(err) => Err(err.to_string()),
- }
-}
-
-#[derive(Debug, Clone, PartialEq, Eq)]
-pub struct DisplayablePath {
- pub path: PathBuf,
-}
-
-impl fmt::Display for DisplayablePath {
- fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
- let stem = self.path.file_stem().map_or_else(
- || {
- error!("[PATH STEM]: No file stem found");
- "[File steam not found]".to_string()
- },
- |p| {
- if let Ok(stem) = p.to_os_string().into_string() {
- stem
- } else {
- error!("[PATH ENCODING]: {}", self.path.display());
- "[PATH ENCODING ERROR]".to_string()
- }
- },
- );
-
- write!(f, "{stem}")
- }
-}
-
-/// Export uninstalled packages in a csv file.
-/// Exported information will contain package name and description.
-pub fn export_packages(user: User, phone_packages: &[Vec]) -> Result {
- let backup_file = generate_backup_name(chrono::Local::now());
-
- let file = fs::File::create(backup_file).map_err(|err| err.to_string())?;
- let mut wtr = Writer::from_writer(file);
-
- wtr.write_record(["Package Name", "Description"])
- .map_err(|err| err.to_string())?;
-
- let uninstalled_packages: Vec<&CorePackage> = phone_packages[user.index]
- .iter()
- .filter(|p| p.state == PackageState::Uninstalled)
- .collect();
-
- for package in uninstalled_packages {
- wtr.write_record([&package.name, &package.description.replace('\n', " ")])
- .map_err(|err| err.to_string())?;
- }
-
- wtr.flush().map_err(|err| err.to_string())?;
-
- Ok(true)
-}
-
-/// Truncate description to fit within max length, taking only the first line
-#[must_use]
-pub fn truncate_description(desc: &str, max_len: usize) -> String {
- let first_line = desc.split('\n').next().unwrap_or("").trim_end();
-
- if first_line.len() <= max_len {
- first_line.to_string()
- } else {
- format!("{}...", &first_line[..max_len.saturating_sub(3)])
- }
-}
-
-/// Check if package matches search term (checks name and description)
-#[must_use]
-pub fn matches_search(pkg_name: &str, search_term: &str, pkg_description: Option<&str>) -> bool {
- let search_lower = search_term.to_lowercase();
-
- if pkg_name.to_lowercase().contains(&search_lower) {
- return true;
- }
-
- if let Some(description) = pkg_description {
- if description.to_lowercase().contains(&search_lower) {
- return true;
- }
- }
-
- false
-}
-
-#[cfg(test)]
-mod tests {
- use super::*;
- use chrono::TimeZone;
-
- #[test]
- fn backup_name() {
- assert_eq!(
- generate_backup_name(chrono::Utc.timestamp_millis_opt(0).unwrap()),
- "uninstalled_packages_19700101.csv".to_string()
- );
- }
-}
diff --git a/crates/uad-gui/Cargo.toml b/crates/uad-gui/Cargo.toml
deleted file mode 100644
index 4a50636..0000000
--- a/crates/uad-gui/Cargo.toml
+++ /dev/null
@@ -1,62 +0,0 @@
-[package]
-name = "uad-gui"
-version.workspace = true
-authors.workspace = true
-license.workspace = true
-homepage.workspace = true
-repository.workspace = true
-readme.workspace = true
-keywords.workspace = true
-categories = ["gui"]
-edition.workspace = true
-
-[[bin]]
-name = "uad-ng"
-path = "src/main.rs"
-
-[features]
-default = ["wgpu", "self-update", "img"]
-wgpu = [] # Iced/wgpu is default
-self-update = ["flate2", "tar"]
-no-self-update = []
-img = ["image", "iced/image"]
-
-[dependencies]
-uad-core = { path = "../uad-core", features = ["self-update"] }
-iced.workspace = true
-image = { workspace = true, optional = true }
-rfd.workspace = true
-dark-light.workspace = true
-fern.workspace = true
-chrono.workspace = true
-dirs.workspace = true
-log.workspace = true
-flate2 = { workspace = true, optional = true }
-tar = { workspace = true, optional = true }
-
-[target.'cfg(target_os = "windows")'.dependencies]
-win32console.workspace = true
-
-[build-dependencies]
-embed-resource = "3"
-
-[lints.rust]
-deprecated_safe = "warn"
-
-[lints.clippy]
-undocumented_unsafe_blocks = "forbid"
-exit = "deny"
-panic_in_result_fn = "warn"
-infinite_loop = "warn"
-mem_forget = "warn"
-implicit_clone = "warn"
-format_push_string = "warn"
-large_include_file = "warn"
-shadow_unrelated = "warn"
-struct_field_names = "allow" # annoying
-
-disallowed_types = "deny"
-disallowed_methods = "deny"
-
-allow_attributes_without_reason = "warn"
-pedantic = { level = "warn", priority = -1 }
diff --git a/crates/uad-gui/src/helpers.rs b/crates/uad-gui/src/helpers.rs
deleted file mode 100644
index 25c06f1..0000000
--- a/crates/uad-gui/src/helpers.rs
+++ /dev/null
@@ -1,23 +0,0 @@
-use crate::style;
-use crate::theme::Theme;
-use iced::Element;
-use iced::widget::button::Button;
-
-/// Wrapper function for `iced::widget::button` with padding and style applied
-pub fn button_primary<'a, Message>(
- content: impl Into>,
-) -> Button<'a, Message, Theme> {
- iced::widget::button(content)
- .padding([5, 10])
- .style(style::Button::Primary)
-}
-
-/// Opens a file picker dialog to select a folder
-pub async fn open_folder() -> Result {
- rfd::AsyncFileDialog::new()
- .set_title("Choose a backup location")
- .pick_folder()
- .await
- .ok_or(uad_core::utils::Error::DialogClosed)
- .map(|f| f.path().to_path_buf())
-}
diff --git a/crates/uad-gui/src/lib.rs b/crates/uad-gui/src/lib.rs
deleted file mode 100644
index ede5da8..0000000
--- a/crates/uad-gui/src/lib.rs
+++ /dev/null
@@ -1,11 +0,0 @@
-#![allow(
- clippy::missing_errors_doc,
- reason = "Short-circuit doc lint to keep CI green"
-)]
-
-pub mod gui;
-pub mod helpers;
-pub mod style;
-pub mod theme;
-pub mod views;
-pub mod widgets;
diff --git a/crates/uad-gui/src/style.rs b/crates/uad-gui/src/style.rs
deleted file mode 100644
index 9eeba68..0000000
--- a/crates/uad-gui/src/style.rs
+++ /dev/null
@@ -1,776 +0,0 @@
-#![allow(
- non_snake_case,
- clippy::trivially_copy_pass_by_ref,
- clippy::wildcard_imports,
- reason = "Iced style modules use PascalCase and &Theme; wildcard for local convenience"
-)]
-use crate::theme::{ColorPalette, Theme};
-use iced::widget::{
- button, checkbox, container, overlay, pick_list, radio, scrollable, text, text_editor,
- text_input,
-};
-use iced::{Background, Border, Color, Shadow};
-
-// Implement theming catalogs for our custom `Theme` so generic widgets
-// like `Button<'_, Message, Theme, Renderer>` compile under iced 0.13.
-
-impl button::Catalog for Theme {
- type Class<'a> = button::StyleFn<'a, Theme>;
-
- fn default<'a>() -> ::Class<'a> {
- Box::new(|t: &Theme, s: button::Status| Button::Primary(t, s))
- }
-
- fn style(
- &self,
- class: &::Class<'_>,
- status: button::Status,
- ) -> button::Style {
- (class)(self, status)
- }
-}
-
-impl checkbox::Catalog for Theme {
- type Class<'a> = checkbox::StyleFn<'a, Theme>;
-
- fn default<'a>() -> ::Class<'a> {
- Box::new(|t: &Theme, s: checkbox::Status| CheckBox::SettingsEnabled(t, s))
- }
-
- fn style(
- &self,
- class: &::Class<'_>,
- status: checkbox::Status,
- ) -> checkbox::Style {
- (class)(self, status)
- }
-}
-
-impl container::Catalog for Theme {
- type Class<'a> = container::StyleFn<'a, Theme>;
-
- fn default<'a>() -> ::Class<'a> {
- Box::new(|t: &Theme| Container::Background(t))
- }
-
- fn style(&self, class: &::Class<'_>) -> container::Style {
- (class)(self)
- }
-}
-
-impl scrollable::Catalog for Theme {
- type Class<'a> = scrollable::StyleFn<'a, Theme>;
-
- fn default<'a>() -> ::Class<'a> {
- Box::new(|t: &Theme, s: scrollable::Status| Scrollable::Description(t, s))
- }
-
- fn style(
- &self,
- class: &::Class<'_>,
- status: scrollable::Status,
- ) -> scrollable::Style {
- (class)(self, status)
- }
-}
-
-impl text::Catalog for Theme {
- type Class<'a> = text::StyleFn<'a, Theme>;
-
- fn default<'a>() -> ::Class<'a> {
- Box::new(|t: &Theme| Text::Default(t))
- }
-
- fn style(&self, class: &::Class<'_>) -> text::Style {
- (class)(self)
- }
-}
-
-// Additional catalogs required by Iced 0.13 generic theming
-
-impl text_input::Catalog for Theme {
- type Class<'a> = text_input::StyleFn<'a, Theme>;
-
- fn default<'a>() -> ::Class<'a> {
- Box::new(|t: &Theme, s: text_input::Status| {
- let p = t.palette();
-
- let active = text_input::Style {
- background: Background::Color(p.base.foreground),
- border: Border {
- color: p.base.foreground,
- width: 0.0,
- radius: 5.0.into(),
- },
- icon: Color {
- a: 0.5,
- ..p.normal.primary
- },
- placeholder: p.normal.surface,
- value: p.bright.primary,
- selection: p.normal.primary,
- };
-
- let focused = text_input::Style {
- background: Background::Color(p.base.foreground),
- border: Border {
- color: Color {
- a: 0.5,
- ..p.normal.primary
- },
- width: 1.0,
- radius: 2.0.into(),
- },
- icon: Color {
- a: 0.5,
- ..p.normal.primary
- },
- placeholder: p.normal.surface,
- value: p.bright.primary,
- selection: p.normal.primary,
- };
-
- let disabled = text_input::Style {
- background: Background::Color(p.base.background),
- border: Border {
- color: Color {
- a: 0.5,
- ..p.base.foreground
- },
- width: 1.0,
- radius: 2.0.into(),
- },
- icon: Color {
- a: 0.5,
- ..p.base.foreground
- },
- placeholder: p.normal.surface,
- value: p.bright.primary,
- selection: p.normal.primary,
- };
-
- match s {
- text_input::Status::Active => active,
- text_input::Status::Focused { .. } | text_input::Status::Hovered => focused,
- text_input::Status::Disabled => disabled,
- }
- })
- }
-
- fn style(
- &self,
- class: &::Class<'_>,
- status: text_input::Status,
- ) -> text_input::Style {
- (class)(self, status)
- }
-}
-
-impl pick_list::Catalog for Theme {
- type Class<'a> = pick_list::StyleFn<'a, Theme>;
-
- fn default<'a>() -> ::Class<'a> {
- Box::new(|t: &Theme, s: pick_list::Status| {
- let p = t.palette();
- let border_color = match s {
- pick_list::Status::Hovered => p.normal.primary,
- _ => Color {
- a: 0.5,
- ..p.normal.primary
- },
- };
- pick_list::Style {
- text_color: p.bright.surface,
- placeholder_color: p.bright.surface,
- handle_color: p.bright.surface,
- background: Background::Color(p.base.background),
- border: Border {
- color: border_color,
- width: 1.0,
- radius: 2.0.into(),
- },
- }
- })
- }
-
- fn style(
- &self,
- class: &::Class<'_>,
- status: pick_list::Status,
- ) -> pick_list::Style {
- (class)(self, status)
- }
-}
-
-impl overlay::menu::Catalog for Theme {
- type Class<'a> = overlay::menu::StyleFn<'a, Theme>;
-
- fn default<'a>() -> ::Class<'a> {
- Box::new(|t: &Theme| {
- let p = t.palette();
- overlay::menu::Style {
- text_color: p.bright.surface,
- background: p.base.background.into(),
- border: Border {
- color: p.base.background,
- width: 1.0,
- radius: 2.0.into(),
- },
- selected_text_color: p.bright.surface,
- selected_background: p.normal.primary.into(),
- shadow: Shadow::default(),
- }
- })
- }
-
- fn style(&self, class: &::Class<'_>) -> overlay::menu::Style {
- (class)(self)
- }
-}
-
-impl radio::Catalog for Theme {
- type Class<'a> = radio::StyleFn<'a, Theme>;
-
- fn default<'a>() -> ::Class<'a> {
- Box::new(|t: &Theme, s: radio::Status| {
- let p = t.palette();
- let active = radio::Style {
- background: Color::TRANSPARENT.into(),
- dot_color: p.bright.primary,
- border_width: 1.0,
- border_color: p.bright.primary,
- text_color: None,
- };
-
- match s {
- radio::Status::Active { .. } => active,
- radio::Status::Hovered { .. } => radio::Style {
- border_width: 2.0,
- ..active
- },
- }
- })
- }
-
- fn style(
- &self,
- class: &::Class<'_>,
- status: radio::Status,
- ) -> radio::Style {
- (class)(self, status)
- }
-}
-
-impl text_editor::Catalog for Theme {
- type Class<'a> = text_editor::StyleFn<'a, Theme>;
-
- fn default<'a>() -> ::Class<'a> {
- Box::new(|t: &Theme, _s: text_editor::Status| {
- let p = t.palette();
- text_editor::Style {
- background: Background::Color(p.base.foreground),
- border: Border {
- color: Color::TRANSPARENT,
- width: 0.0,
- radius: 0.0.into(),
- },
- placeholder: p.normal.surface,
- value: p.bright.surface,
- selection: Color {
- a: 0.3,
- ..p.normal.primary
- },
- }
- })
- }
-
- fn style(
- &self,
- class: &::Class<'_>,
- status: text_editor::Status,
- ) -> text_editor::Style {
- (class)(self, status)
- }
-}
-
-// Rule styling for custom Theme (needed by vertical_rule)
-impl iced::widget::rule::Catalog for Theme {
- type Class<'a> = iced::widget::rule::StyleFn<'a, Theme>;
-
- fn default<'a>() -> ::Class<'a> {
- Box::new(|t: &Theme| {
- let p = t.palette();
- iced::widget::rule::Style {
- color: p.bright.surface,
- radius: 2.0.into(),
- fill_mode: iced::widget::rule::FillMode::Full,
- snap: true,
- }
- })
- }
-
- fn style(
- &self,
- class: &::Class<'_>,
- ) -> iced::widget::rule::Style {
- (class)(self)
- }
-}
-
-pub mod Container {
- use super::*;
-
- #[allow(dead_code, reason = "Used by other themes or future styles")]
- #[must_use]
- pub fn Invisible(_: &Theme) -> container::Style {
- container::Style::default()
- }
-
- #[must_use]
- pub fn Frame(theme: &Theme) -> container::Style {
- let p = theme.palette();
- container::Style {
- background: Some(Background::Color(p.base.foreground)),
- text_color: Some(p.bright.surface),
- border: Border {
- color: Color::TRANSPARENT,
- width: 0.0,
- radius: 5.0.into(),
- },
- shadow: Shadow::default(),
- snap: true,
- }
- }
-
- #[must_use]
- pub fn BorderedFrame(theme: &Theme) -> container::Style {
- let p = theme.palette();
- container::Style {
- background: Some(Background::Color(p.base.foreground)),
- text_color: Some(p.bright.surface),
- border: Border {
- color: p.normal.error,
- width: 1.0,
- radius: 5.0.into(),
- },
- shadow: Shadow::default(),
- snap: true,
- }
- }
-
- #[allow(dead_code, reason = "Currently unused in some views")]
- #[must_use]
- pub fn Tooltip(theme: &Theme) -> container::Style {
- let p = theme.palette();
- container::Style {
- background: Some(Background::Color(p.base.foreground)),
- text_color: Some(p.bright.surface),
- border: Border {
- color: p.normal.primary,
- width: 1.0,
- radius: 8.0.into(),
- },
- shadow: Shadow::default(),
- snap: true,
- }
- }
-
- #[must_use]
- pub fn Background(theme: &Theme) -> container::Style {
- let p = theme.palette();
- container::Style {
- background: Some(Background::Color(p.base.background)),
- text_color: Some(p.bright.surface),
- border: Border {
- color: Color::TRANSPARENT,
- width: 0.0,
- radius: 5.0.into(),
- },
- shadow: Shadow::default(),
- snap: true,
- }
- }
-}
-
-pub mod Button {
- use super::*;
-
- #[allow(
- dead_code,
- reason = "Helper used by multiple styles; may be inlined by compiler"
- )]
- fn base(border_color: Color) -> button::Style {
- button::Style {
- background: None,
- text_color: Color::WHITE,
- border: Border {
- color: border_color,
- width: 1.0,
- radius: 2.0.into(),
- },
- shadow: Shadow::default(),
- snap: true,
- }
- }
-
- #[must_use]
- pub fn Primary(theme: &Theme, status: button::Status) -> button::Style {
- let p = theme.palette();
- let mut style = style_active_hover_disabled(p.bright.primary, p.bright.primary, status);
- if matches!(status, button::Status::Active | button::Status::Pressed) {
- style.background = Some(Background::Color(p.base.foreground));
- }
- style
- }
-
- #[allow(
- dead_code,
- reason = "Alias kept for semantic clarity in some call-sites"
- )]
- #[must_use]
- pub fn SelfUpdate(theme: &Theme, status: button::Status) -> button::Style {
- Primary(theme, status)
- }
-
- #[must_use]
- pub fn RestorePackage(theme: &Theme, status: button::Status) -> button::Style {
- let p = theme.palette();
- let mut style = style_active_hover_disabled(p.bright.secondary, p.bright.secondary, status);
- if matches!(status, button::Status::Active | button::Status::Pressed) {
- style.background = Some(Background::Color(p.base.foreground));
- }
- if matches!(status, button::Status::Disabled) {
- style.background = Some(Background::Color(Color {
- a: 0.05,
- ..p.normal.primary
- }));
- style.text_color = p.bright.primary;
- }
- style
- }
-
- #[must_use]
- pub fn UninstallPackage(theme: &Theme, status: button::Status) -> button::Style {
- let p = theme.palette();
- let mut style = style_active_hover_disabled(p.bright.error, p.bright.error, status);
- if matches!(status, button::Status::Active | button::Status::Pressed) {
- style.background = Some(Background::Color(p.base.foreground));
- }
- style
- }
-
- #[allow(
- dead_code,
- reason = "Style exposed for disabled state buttons in some contexts"
- )]
- #[must_use]
- pub fn Unavailable(theme: &Theme, status: button::Status) -> button::Style {
- UninstallPackage(theme, status)
- }
-
- #[must_use]
- pub fn NormalPackage(theme: &Theme, status: button::Status) -> button::Style {
- let p = theme.palette();
- match status {
- button::Status::Hovered => button::Style {
- background: Some(Background::Color(Color {
- a: 0.25,
- ..p.normal.primary
- })),
- text_color: p.bright.surface,
- border: Border {
- color: p.base.background,
- width: 0.0,
- radius: 5.0.into(),
- },
- shadow: Shadow::default(),
- snap: true,
- },
- _ => button::Style {
- background: Some(Background::Color(p.base.foreground)),
- text_color: p.bright.surface,
- border: Border {
- color: p.base.background,
- width: 0.0,
- radius: 5.0.into(),
- },
- shadow: Shadow::default(),
- snap: true,
- },
- }
- }
-
- #[must_use]
- pub fn SelectedPackage(theme: &Theme, _status: button::Status) -> button::Style {
- let p = theme.palette();
- button::Style {
- background: Some(Background::Color(Color {
- a: 0.25,
- ..p.normal.primary
- })),
- text_color: p.bright.primary,
- border: Border {
- color: p.normal.primary,
- width: 0.0,
- radius: 5.0.into(),
- },
- shadow: Shadow::default(),
- snap: true,
- }
- }
-
- #[allow(dead_code, reason = "Used in views where buttons must be invisible")]
- #[must_use]
- pub fn Hidden(_: &Theme, _: button::Status) -> button::Style {
- button::Style {
- background: Some(Background::Color(Color::TRANSPARENT)),
- text_color: Color::TRANSPARENT,
- border: Border {
- color: Color::TRANSPARENT,
- width: 0.0,
- radius: 5.0.into(),
- },
- shadow: Shadow::default(),
- snap: true,
- }
- }
-
- fn style_active_hover_disabled(
- main: Color,
- text: Color,
- status: button::Status,
- ) -> button::Style {
- match status {
- button::Status::Active | button::Status::Pressed => button::Style {
- background: Some(Background::Color(main)),
- text_color: text,
- border: Border {
- color: Color { a: 0.5, ..main },
- width: 1.0,
- radius: 2.0.into(),
- },
- shadow: Shadow::default(),
- snap: true,
- },
- button::Status::Hovered => button::Style {
- background: Some(Background::Color(Color { a: 0.25, ..main })),
- text_color: text,
- border: Border {
- color: Color { a: 0.5, ..main },
- width: 1.0,
- radius: 2.0.into(),
- },
- shadow: Shadow::default(),
- snap: true,
- },
- button::Status::Disabled => button::Style {
- background: Some(Background::Color(Color { a: 0.05, ..main })),
- text_color: Color { a: 0.5, ..text },
- border: Border {
- color: Color { a: 0.5, ..main },
- width: 1.0,
- radius: 2.0.into(),
- },
- shadow: Shadow::default(),
- snap: true,
- },
- }
- }
-}
-
-pub mod Scrollable {
- use super::*;
-
- #[allow(dead_code, reason = "Kept for future custom rails variations")]
- fn rails(scroller_color: Color) -> (scrollable::Rail, scrollable::Rail) {
- let rail = scrollable::Rail {
- background: Some(Background::Color(Color::TRANSPARENT)),
- border: Border {
- color: Color::TRANSPARENT,
- width: 0.0,
- radius: 5.0.into(),
- },
- scroller: scrollable::Scroller {
- background: Background::Color(scroller_color),
- border: Border {
- color: Color::TRANSPARENT,
- width: 1.0,
- radius: 5.0.into(),
- },
- },
- };
- (rail, rail)
- }
-
- fn autoscroll(p: ColorPalette) -> scrollable::AutoScroll {
- scrollable::AutoScroll {
- background: Background::Color(Color {
- a: 0.05,
- ..p.base.background
- }),
- border: Border {
- color: Color::TRANSPARENT,
- width: 0.0,
- radius: 5.0.into(),
- },
- shadow: Shadow::default(),
- icon: p.bright.surface,
- }
- }
-
- #[must_use]
- pub fn Description(theme: &Theme, _status: scrollable::Status) -> scrollable::Style {
- let p = theme.palette();
- let (v, h) = rails(p.normal.surface);
- scrollable::Style {
- container: container::Style::default(),
- vertical_rail: v,
- horizontal_rail: h,
- gap: Some(Background::Color(Color::TRANSPARENT)),
- auto_scroll: autoscroll(p),
- }
- }
-
- #[must_use]
- pub fn Packages(theme: &Theme, _status: scrollable::Status) -> scrollable::Style {
- let p = theme.palette();
- let (v, h) = rails(p.base.foreground);
- scrollable::Style {
- container: container::Style::default(),
- vertical_rail: v,
- horizontal_rail: h,
- gap: Some(Background::Color(Color::TRANSPARENT)),
- auto_scroll: autoscroll(p),
- }
- }
-}
-
-pub mod CheckBox {
- use super::*;
-
- #[must_use]
- pub fn PackageEnabled(theme: &Theme, _status: checkbox::Status) -> checkbox::Style {
- let p = theme.palette();
- checkbox::Style {
- background: Background::Color(p.base.background),
- icon_color: p.bright.primary,
- border: Border {
- color: p.base.background,
- width: 1.0,
- radius: 5.0.into(),
- },
- text_color: Some(p.bright.surface),
- }
- }
-
- #[must_use]
- pub fn PackageDisabled(theme: &Theme, _status: checkbox::Status) -> checkbox::Style {
- let p = theme.palette();
- checkbox::Style {
- background: Background::Color(Color {
- a: 0.55,
- ..p.base.background
- }),
- icon_color: p.bright.primary,
- border: Border {
- color: p.normal.primary,
- width: 1.0,
- radius: 5.0.into(),
- },
- text_color: Some(p.normal.primary),
- }
- }
-
- #[must_use]
- pub fn SettingsEnabled(theme: &Theme, _status: checkbox::Status) -> checkbox::Style {
- let p = theme.palette();
- checkbox::Style {
- background: Background::Color(p.base.background),
- icon_color: p.bright.primary,
- border: Border {
- color: p.bright.primary,
- width: 1.0,
- radius: 5.0.into(),
- },
- text_color: Some(p.bright.surface),
- }
- }
-
- #[must_use]
- pub fn SettingsDisabled(theme: &Theme, _status: checkbox::Status) -> checkbox::Style {
- let p = theme.palette();
- checkbox::Style {
- background: Background::Color(p.base.foreground),
- icon_color: p.bright.primary,
- border: Border {
- color: p.normal.primary,
- width: 1.0,
- radius: 5.0.into(),
- },
- text_color: Some(p.bright.surface),
- }
- }
-}
-
-pub mod Text {
- use super::*;
-
- #[must_use]
- pub fn Default(theme: &Theme) -> text::Style {
- let _ = theme;
- text::Style::default()
- }
-
- #[must_use]
- pub fn Ok(theme: &Theme) -> text::Style {
- let p = theme.palette();
- text::Style {
- color: Some(p.bright.secondary),
- }
- }
-
- #[must_use]
- pub fn Danger(theme: &Theme) -> text::Style {
- let p = theme.palette();
- text::Style {
- color: Some(p.bright.error),
- }
- }
-
- #[must_use]
- pub fn Commentary(theme: &Theme) -> text::Style {
- let p = theme.palette();
- text::Style {
- color: Some(p.normal.surface),
- }
- }
-
- #[allow(
- dead_code,
- reason = "Convenience factory used by dynamic text coloring"
- )]
- pub fn Color(c: Color) -> impl Fn(&Theme) -> text::Style {
- move |_t: &Theme| text::Style { color: Some(c) }
- }
-}
-
-// Unit tests
-#[cfg(test)]
-mod tests {
- use super::*;
-
- #[test]
- fn test_palette() {
- let palette = Theme::Dark.palette();
-
- assert_ne!(palette.base.background, palette.base.foreground);
- assert_ne!(palette.normal.primary, Color::BLACK);
- assert_ne!(palette.normal.surface, Color::BLACK);
- assert_ne!(palette.bright.primary, Color::BLACK);
- // if `LIGHT` then this can be `BLACK`
- // https://github.com/Universal-Debloater-Alliance/universal-android-debloater-next-generation/pull/730#issuecomment-2525405134
- //assert_ne!(palette.bright.surface, Color::BLACK);
- assert_ne!(palette.normal.error, Color::BLACK);
- assert_ne!(palette.bright.error, Color::BLACK);
- }
-}
diff --git a/crates/uad-gui/src/views/about.rs b/crates/uad-gui/src/views/about.rs
deleted file mode 100644
index 42cb723..0000000
--- a/crates/uad-gui/src/views/about.rs
+++ /dev/null
@@ -1,174 +0,0 @@
-use crate::helpers::button_primary;
-use crate::theme::Theme;
-use crate::{gui::UpdateState, style, widgets::text};
-use iced::widget::{Space, column, container, row};
-use iced::{Alignment, Element, Length, Renderer};
-use log::error;
-use std::path::PathBuf;
-use uad_core::CACHE_DIR;
-use uad_core::adb;
-use uad_core::uad_lists::LIST_FNAME;
-use uad_core::utils::{FULL_NAME, NAME, last_modified_date, open_url};
-
-#[cfg(feature = "self-update")]
-use uad_core::update::SelfUpdateStatus;
-
-#[derive(Default, Debug, Clone)]
-pub struct About {}
-
-#[derive(Debug, Clone)]
-pub enum Message {
- UrlPressed(PathBuf),
- UpdateUadLists,
- DoSelfUpdate,
-}
-
-impl About {
- #[allow(
- clippy::unused_self,
- reason = "Trait-like shape required by GUI architecture"
- )]
- pub fn update(&mut self, msg: Message) {
- if let Message::UrlPressed(url) = msg {
- open_url(url);
- }
- // other events are handled by UadGui update()
- }
- #[allow(
- clippy::unused_self,
- reason = "Trait-like shape required by GUI architecture"
- )]
- pub fn view(&self, update_state: &UpdateState) -> Element<'_, Message, Theme, Renderer> {
- let about_text = text(format!(
- "{FULL_NAME} ({NAME}) is a free and open-source community project \naiming at simplifying the removal of pre-installed apps on any Android device."
- ));
-
- let descr_container = container(about_text)
- .width(Length::Fill)
- .padding(25)
- .style(style::Container::Frame);
-
- let date = last_modified_date(CACHE_DIR.join(LIST_FNAME));
- let uad_list_text =
- text(format!("{NAME} package list: v{}", date.format("%Y%m%d"))).width(250);
- let last_update_text = text(update_state.uad_list.to_string());
- let uad_lists_btn = button_primary("Update").on_press(Message::UpdateUadLists);
-
- #[cfg(feature = "self-update")]
- let self_update_row = {
- let self_update_btn = button_primary("Update").on_press(Message::DoSelfUpdate);
-
- let uad_version_text =
- text(format!("{NAME} version: v{}", env!("CARGO_PKG_VERSION"))).width(250);
-
- let self_update_text = update_state
- .self_update
- .latest_release
- .as_ref()
- .map_or_else(
- || {
- if update_state.self_update.status == SelfUpdateStatus::Done {
- "(No update available)".to_string()
- } else {
- update_state.self_update.status.to_string()
- }
- },
- |r| {
- if update_state.self_update.status == SelfUpdateStatus::Updating {
- update_state.self_update.status.to_string()
- } else {
- format!("({} available)", r.tag_name)
- }
- },
- );
-
- let last_self_update_text = text(self_update_text).style(style::Text::Default);
-
- row![uad_version_text, self_update_btn, last_self_update_text,]
- .align_y(Alignment::Center)
- .spacing(10)
- .width(550)
- };
-
- let uad_list_row = row![uad_list_text, uad_lists_btn, last_update_text,]
- .align_y(Alignment::Center)
- .spacing(10)
- .width(550);
-
- /*
- There's no need to fetch this info every time the view is updated,
- we could cache it in a `static` `LazyLock`.
-
- But what if the system updates ADB while the app is running?
- the numbers will be out of sync!
-
- However, the server will still be the "old" version
- until it's killed
- */
- let adb_version_text = text(match adb::ACommand::new().version() {
- Ok(s) => s
- .lines()
- .nth(0)
- .unwrap_or_else(|| unreachable!())
- // This allocation is good.
- // If it was a ref, the app would hold the entire string
- // instead of the relevant slice.
- .to_string(),
- Err(e) => {
- error!("{e}");
- "Couldn't fetch ADB version. Is it installed?".into()
- // satisfy `match` by inferring the type of the `Ok` arm
- }
- })
- .width(250);
- let adb_version_row = row![adb_version_text].align_y(Alignment::Center).width(550);
-
- #[cfg(feature = "self-update")]
- let update_column = column![uad_list_row, self_update_row, adb_version_row];
- #[cfg(not(feature = "self-update"))]
- let update_column = column![uad_list_row, adb_version_row];
-
- let update_column = update_column.align_x(Alignment::Center).spacing(10);
-
- let update_container = container(update_column)
- .width(Length::Fill)
- .center_x(Length::Fill)
- .padding(10)
- .style(style::Container::Frame);
-
- let website_btn =
- button_primary("GitHub page").on_press(Message::UrlPressed(PathBuf::from(
- "https://github.com/Universal-Debloater-Alliance/universal-android-debloater",
- )));
-
- let issue_btn = button_primary("Have an issue?")
- .on_press(Message::UrlPressed(PathBuf::from(
- "https://github.com/Universal-Debloater-Alliance/universal-android-debloater/issues",
- )));
-
- let log_btn = button_primary("Locate the logfiles")
- .on_press(Message::UrlPressed(CACHE_DIR.to_path_buf()));
-
- let wiki_btn = button_primary("Wiki").on_press(Message::UrlPressed(PathBuf::from(
- "https://github.com/Universal-Debloater-Alliance/universal-android-debloater/wiki",
- )));
-
- let row = row![website_btn, wiki_btn, issue_btn, log_btn,].spacing(20);
-
- let content = column![
- Space::new().width(Length::Fill).height(Length::Shrink),
- descr_container,
- update_container,
- row,
- ]
- .width(Length::Fill)
- .spacing(20)
- .align_x(Alignment::Center);
-
- container(content)
- .width(Length::Fill)
- .height(Length::Fill)
- .padding(10)
- .into()
- }
-}
diff --git a/crates/uad-gui/src/views/list.rs b/crates/uad-gui/src/views/list.rs
deleted file mode 100644
index a9792dd..0000000
--- a/crates/uad-gui/src/views/list.rs
+++ /dev/null
@@ -1,1597 +0,0 @@
-use crate::helpers::button_primary;
-use crate::style;
-use crate::theme::Theme;
-use crate::widgets::navigation_menu::ICONS;
-use log::{error, info, warn};
-use std::path::PathBuf;
-use uad_core::config::DeviceSettings;
-use uad_core::sync::{AdbError, Phone, User, apply_pkg_state_commands};
-use uad_core::uad_lists::{
- Opposite, PackageHashMap, PackageState, Removal, UadList, UadListState, load_debloat_lists,
-};
-use uad_core::utils::{
- EXPORT_FILE_NAME, NAME, export_selection, fetch_packages, matches_search, open_url,
-};
-
-use crate::views::settings::Settings;
-use crate::widgets::modal::Modal;
-use crate::widgets::package_row::{Message as RowMessage, PackageRow};
-use crate::widgets::text;
-use iced::widget::scrollable::{Direction, Scrollbar};
-use iced::widget::{
- Column, Space, button, checkbox, column, container, pick_list, radio, row, rule, scrollable,
- text_editor, text_input, tooltip,
-};
-use iced::{Alignment, Element, Length, Renderer, Task, alignment};
-
-#[derive(Debug, Default, Clone)]
-pub struct PackageInfo {
- pub i_user: usize,
- pub index: usize,
- pub removal: String,
- pub before_cross_user_states: Vec<(u16, PackageState)>,
-}
-
-#[derive(Default, Debug, Clone)]
-pub enum LoadingState {
- DownloadingList,
- #[default]
- FindingPhones,
- LoadingPackages,
- _UpdatingUad,
- Ready,
- RestoringDevice(String),
- FailedToUpdate,
-}
-
-#[derive(Default, Debug)]
-#[allow(clippy::struct_excessive_bools, reason = "Not a state-machine")]
-pub struct List {
- pub loading_state: LoadingState,
- pub uad_lists: PackageHashMap,
- /// packages of all users of the phone
- pub phone_packages: Vec>,
- /// `phone_packages` indexes of the selected user (= what you see on screen)
- filtered_packages: Vec,
- /// Vec of `(user_index, pkg_index)`
- selected_packages: Vec<(usize, usize)>,
- selected_removal: Option,
- selected_package_state: Option,
- selected_list: Option,
- pub selected_user: Option,
- all_selected: bool,
- pub input_value: String,
- description: String,
- description_content: text_editor::Content,
- selection_modal: bool,
- error_modal: Option,
- export_modal: bool,
- current_package_index: usize,
- is_adb_satisfied: bool,
- copy_confirmation: bool,
- fallback_notifications: Vec,
-}
-
-#[derive(Debug, Clone)]
-pub enum Message {
- LoadUadList(bool),
- LoadPhonePackages((PackageHashMap, UadListState)),
- RestoringDevice(Result),
- ApplyFilters(Vec>),
- DismissFallbackNotifications,
- VerifyAndFallbackFinished(VerifyAndFallbackResult),
- SearchInputChanged(String),
- ToggleAllSelected(bool),
- ListSelected(UadList),
- UserSelected(User),
- RemovalSelected(Removal),
- PackageStateSelected(PackageState),
- ApplyActionOnSelection,
- List(usize, RowMessage),
- VerifyAndFallback(Result),
- Nothing,
- ModalHide,
- ModalUserSelected(User),
- ModalValidate,
- ClearSelectedPackages,
- ADBSatisfied(bool),
- UpdateFailed,
- GoToUrl(PathBuf),
- ExportSelection,
- SelectionExported(Result),
- DescriptionEdit(text_editor::Action),
- CopyError(String),
- HideCopyConfirmation,
-}
-
-pub struct SummaryEntry {
- category: Removal,
- discard: u8,
- restore: u8,
-}
-
-#[derive(Debug, Clone)]
-pub struct VerifyAndFallbackResult {
- pub i_user: usize,
- pub index: usize,
- pub new_state: PackageState,
- pub notification: Option,
- pub error_modal: Option,
-}
-
-impl From for SummaryEntry {
- fn from(category: Removal) -> Self {
- Self {
- category,
- discard: 0,
- restore: 0,
- }
- }
-}
-
-impl List {
- pub fn update(
- &mut self,
- settings: &mut Settings,
- selected_device: &mut Phone,
- list_update_state: &mut UadListState,
- message: Message,
- ) -> Task {
- match message {
- Message::ModalHide => self.on_modal_hide(),
- Message::ModalValidate => self.on_modal_validate(settings, selected_device),
- Message::RestoringDevice(output) => self.on_restoring_device(output),
- Message::LoadUadList(remote) => self.on_load_uad_list(remote, selected_device),
- Message::LoadPhonePackages(payload) => {
- self.on_load_phone_packages(payload, selected_device, list_update_state)
- }
- Message::ApplyFilters(packages) => self.on_apply_filters(packages),
- Message::DismissFallbackNotifications => self.on_dismiss_fallback_notifications(),
- Message::ToggleAllSelected(selected) => {
- self.on_toggle_all_selected(selected, settings, selected_device, list_update_state)
- }
- Message::SearchInputChanged(letter) => self.on_search_input_changed(letter),
- Message::ListSelected(list) => self.on_list_selected(list),
- Message::RemovalSelected(removal) => self.on_removal_selected(removal),
- Message::PackageStateSelected(state) => self.on_package_state_selected(state),
- Message::List(i, row_msg) => self.on_list_row(i, &row_msg, settings, selected_device),
- Message::ApplyActionOnSelection => self.on_apply_action_on_selection(),
- Message::UserSelected(user) => self.on_user_selected(user),
- Message::VerifyAndFallback(res) => {
- self.on_verify_and_fallback(res, settings, selected_device)
- }
- Message::VerifyAndFallbackFinished(result) => {
- self.on_verify_and_fallback_finished(result)
- }
- Message::ModalUserSelected(user) => {
- self.on_modal_user_selected(user, settings, selected_device, list_update_state)
- }
- Message::ClearSelectedPackages => self.on_clear_selected_packages(),
- Message::ADBSatisfied(result) => self.on_adb_satisfied(result),
- Message::UpdateFailed => self.on_update_failed(),
- Message::GoToUrl(url) => Self::on_go_to_url(url),
- Message::ExportSelection => self.on_export_selection(),
- Message::SelectionExported(res) => self.on_selection_exported(res),
- Message::Nothing => Task::none(),
- Message::DescriptionEdit(action) => self.on_description_edit(action),
- Message::CopyError(err) => self.on_copy_error(err),
- Message::HideCopyConfirmation => self.on_hide_copy_confirmation(),
- }
- }
-
- // Handle verification completion on the UI thread after async work
- fn on_verify_and_fallback_finished(
- &mut self,
- result: VerifyAndFallbackResult,
- ) -> Task {
- let package = &mut self.phone_packages[result.i_user][result.index];
- if let Some(notification) = result.notification {
- self.fallback_notifications.push(notification);
- }
- if let Some(err) = result.error_modal {
- self.error_modal = Some(err);
- }
- package.state = result.new_state;
- package.selected = false;
- self.selected_packages
- .retain(|&x| x.1 != result.index && x.0 != result.i_user);
- Self::filter_package_lists(self);
- Task::none()
- }
-
- /// Builds the main view for the app list interface
- pub fn view(
- &self,
- settings: &Settings,
- selected_device: &Phone,
- ) -> Element<'_, Message, Theme, Renderer> {
- match &self.loading_state {
- LoadingState::DownloadingList => waiting_view(
- &format!("Downloading latest {NAME} lists from GitHub. Please wait..."),
- Some(button("No internet?").on_press(Message::LoadUadList(false))),
- style::Text::Default,
- ),
- LoadingState::FindingPhones => {
- if self.is_adb_satisfied {
- waiting_view("Finding connected devices...", None, style::Text::Default)
- } else {
- waiting_view(
- "ADB is not installed on your system, install ADB and relaunch application.",
- Some(button("Read on how to get started.")
- .on_press(Message::GoToUrl(PathBuf::from(
- "https://github.com/Universal-Debloater-Alliance/universal-android-debloater-next-generation/wiki/Getting-started",
- )))),
- style::Text::Danger,
- )
- }
- }
- LoadingState::LoadingPackages => waiting_view(
- "Pulling packages from the device. Please wait...",
- None,
- style::Text::Default,
- ),
- LoadingState::_UpdatingUad => waiting_view(
- &format!("Updating {NAME}. Please wait..."),
- None,
- style::Text::Default,
- ),
- LoadingState::RestoringDevice(device) => waiting_view(
- &format!("Restoring device: {device}"),
- None,
- style::Text::Default,
- ),
- LoadingState::Ready => self.ready_view(settings, selected_device),
- LoadingState::FailedToUpdate => waiting_view(
- "Failed to download update",
- Some(button("Go back").on_press(Message::LoadUadList(false))),
- style::Text::Danger,
- ),
- }
- }
-
- fn control_panel(&self, selected_device: &Phone) -> Element<'_, Message, Theme, Renderer> {
- let search_packages = text_input("Search packages...", &self.input_value)
- .width(Length::Fill)
- .on_input(Message::SearchInputChanged)
- .padding([5, 10]);
-
- let select_all_checkbox = checkbox(self.all_selected)
- .on_toggle(Message::ToggleAllSelected)
- .size(20)
- .style(style::CheckBox::SettingsEnabled)
- .spacing(0); // no label, so remove space entirely
-
- let col_sel_all = row![
- tooltip(
- select_all_checkbox,
- if self.all_selected {
- "Deselect all"
- } else {
- "Select all"
- },
- tooltip::Position::Top,
- )
- .style(style::Container::Tooltip)
- .gap(4)
- ]
- .padding(8);
-
- let user_picklist = pick_list(
- selected_device.user_list.clone(),
- self.selected_user,
- Message::UserSelected,
- )
- .width(85);
-
- let list_picklist =
- pick_list(UadList::ALL, self.selected_list, Message::ListSelected).width(96);
-
- let package_state_picklist = pick_list(
- PackageState::ALL,
- self.selected_package_state,
- Message::PackageStateSelected,
- )
- .width(120);
-
- let removal_picklist = pick_list(
- Removal::ALL,
- self.selected_removal,
- Message::RemovalSelected,
- )
- .width(150);
-
- row![
- col_sel_all,
- search_packages,
- user_picklist,
- removal_picklist,
- package_state_picklist,
- list_picklist,
- ]
- .width(Length::Fill)
- .align_y(Alignment::Center)
- .spacing(6)
- .padding(iced::Padding {
- top: 0.0,
- right: 16.0,
- bottom: 0.0,
- left: 0.0,
- })
- .into()
- }
-
- #[allow(
- clippy::too_many_lines,
- reason = "Complex layout; further refactor later"
- )]
- fn ready_view(
- &self,
- settings: &Settings,
- selected_device: &Phone,
- ) -> Element<'_, Message, Theme, Renderer> {
- let packages = self
- .filtered_packages
- .iter()
- .fold(column![].spacing(6), |col, &i| {
- col.push(
- self.phone_packages[self.selected_user.unwrap_or_default().index][i]
- .view(settings, selected_device)
- .map(move |msg| Message::List(i, msg)),
- )
- });
-
- let packages_scrollable = scrollable(packages)
- .height(Length::FillPortion(6))
- .style(style::Scrollable::Packages);
-
- let description_scroll =
- scrollable(text_editor(&self.description_content).on_action(Message::DescriptionEdit))
- .style(style::Scrollable::Description);
-
- let description_panel = container(description_scroll)
- .padding(6)
- .height(Length::FillPortion(2))
- .width(Length::Fill)
- .style(style::Container::Frame);
-
- let review_selection = {
- let tmp_widget = text(format!(
- "Review selection ({})",
- self.selected_packages.len()
- ));
- if self.selected_packages.is_empty() {
- button(tmp_widget).padding([5, 10])
- } else {
- button_primary(tmp_widget).on_press(Message::ApplyActionOnSelection)
- }
- };
-
- let mut export_selection = button(text(format!(
- "Export current selection ({})",
- self.selected_packages.len()
- )))
- .padding([5, 10]);
- if !self.selected_packages.is_empty() {
- export_selection = export_selection
- .on_press(Message::ExportSelection)
- .style(style::Button::Primary);
- }
- // lock
- let export_selection = export_selection;
-
- let action_row = row![
- export_selection,
- Space::new().width(Length::Fill).height(Length::Shrink),
- review_selection
- ]
- .width(Length::Fill)
- .spacing(10)
- .align_y(Alignment::Center);
-
- let unavailable = container(
- column![
- text("ADB is not authorized to access this user!").size(20)
- .style(style::Text::Danger),
- text("The most likely reason is that it is the user of your work profile (also called Secure Folder on Samsung devices). There's really no solution, other than completely disabling your work profile in your device settings.")
- .style(style::Text::Commentary)
- .align_x(alignment::Horizontal::Center),
- ]
- .spacing(6)
- .align_x(Alignment::Center)
- )
- .padding(10)
- .center_x(Length::Shrink)
- .style(style::Container::BorderedFrame);
-
- let control_panel = self.control_panel(selected_device);
-
- // Fallback notifications area
- let notifications_area: Element<'_, Message, Theme, Renderer> =
- if self.fallback_notifications.is_empty() {
- Space::new().into()
- } else {
- let notification_texts: Vec<_> = self
- .fallback_notifications
- .iter()
- .map(|msg| text(msg).style(style::Text::Commentary).into())
- .collect();
-
- container(
- column![
- text("Fallback Actions Performed:").style(style::Text::Default),
- column(notification_texts).spacing(4),
- row![
- Space::new().width(Length::Fill).height(Length::Shrink),
- button(text("Dismiss"))
- .on_press(Message::DismissFallbackNotifications)
- .style(style::Button::Primary)
- .padding([4, 10]),
- ]
- ]
- .spacing(6),
- )
- .padding(8)
- .style(style::Container::BorderedFrame)
- .into()
- };
-
- let content = if selected_device.user_list.is_empty()
- || match self.selected_user {
- Some(u) => !self.phone_packages[u.index].is_empty(),
- // If no user has been selected,
- // then it could be considered as "equivalent"
- // to the case where the `user_list` is empty?
- // However, this is inconsistent,
- // because other parts of the code simply use a `default` `User`.
- None => true,
- } {
- column![
- control_panel,
- notifications_area,
- packages_scrollable,
- description_panel,
- action_row,
- ]
- } else {
- column![
- control_panel,
- notifications_area,
- container(unavailable)
- .height(Length::Fill)
- .center_y(Length::Fill),
- ]
- }
- .width(Length::Fill)
- .spacing(10)
- .align_x(Alignment::Center);
-
- if self.selection_modal {
- return Modal::new(
- content.padding(10),
- self.apply_selection_modal(
- selected_device,
- settings,
- &self.phone_packages[self.selected_user.unwrap_or_default().index],
- ),
- )
- .on_blur(Message::ModalHide)
- .into();
- }
-
- if self.export_modal {
- let title = container(row![text("Success").size(24)].align_y(Alignment::Center))
- .width(Length::Fill)
- .style(style::Container::Frame)
- .padding([10, 0])
- .center_y(Length::Shrink)
- .center_x(Length::Shrink);
-
- let text_box = row![
- text(format!("Exported current selection into file.\nFile is exported in same directory where {NAME} is located.")).width(Length::Fill),
- ].padding(20);
-
- let file_row = row![text(EXPORT_FILE_NAME).style(style::Text::Commentary)].padding(20);
-
- let modal_btn_row = row![
- Space::new().width(Length::Fill).height(Length::Shrink),
- button(text("Close").width(Length::Shrink))
- .width(Length::Shrink)
- .on_press(Message::ModalHide),
- Space::new().width(Length::Fill).height(Length::Shrink),
- ];
-
- let ctn = container(column![title, text_box, file_row, modal_btn_row])
- .height(Length::Shrink)
- .width(500)
- .padding(10)
- .style(style::Container::Frame);
-
- return Modal::new(content.padding(10), ctn)
- .on_blur(Message::ModalHide)
- .into();
- }
-
- if let Some(err) = &self.error_modal {
- error_view(err, content, self.copy_confirmation).into()
- } else {
- container(content).height(Length::Fill).padding(10).into()
- }
- }
-
- #[allow(
- clippy::too_many_lines,
- reason = "Modal construction is verbose by nature"
- )]
- fn apply_selection_modal(
- &self,
- device: &Phone,
- settings: &Settings,
- packages: &[PackageRow],
- ) -> Element<'_, Message, Theme, Renderer> {
- const PACK_NO_USER_MSG: &str = "`selected_packages` implies a user must be selected";
-
- // 5 element slice is cheap
- let mut summaries = Removal::CATEGORIES.map(SummaryEntry::from);
- for p in packages.iter().filter(|p| p.selected) {
- let summary = &mut summaries[p.removal as usize];
- match p.state {
- PackageState::Uninstalled | PackageState::Disabled => summary.restore += 1,
- _ => summary.discard += 1,
- }
- }
-
- let radio_btn_users = device.user_list.iter().filter(|&u| !u.protected).fold(
- row![].spacing(10),
- |row, &user| {
- row.push(
- radio(
- format!("{}", user.clone()),
- user,
- self.selected_user,
- Message::ModalUserSelected,
- )
- .size(24),
- )
- },
- );
-
- let title_ctn =
- container(row![text("Review your selection").size(24)].align_y(Alignment::Center))
- .width(Length::Fill)
- .style(style::Container::Frame)
- .padding([10, 0])
- .center_y(Length::Shrink)
- .center_x(Length::Fill);
-
- let users_ctn = container(radio_btn_users)
- .padding(10)
- .center_x(Length::Shrink)
- .style(style::Container::Frame);
-
- let explaination_ctn = container(
- row![
- text("The action for the selected user will be applied to all other users")
- .style(style::Text::Danger),
- tooltip(
- text("\u{EA0C}")
- .font(ICONS)
- .width(22)
- .align_x(alignment::Horizontal::Center)
- .style(style::Text::Commentary),
- "Let's say you choose user 0. If a selected package on user 0\n\
- is set to be uninstalled and if this same package is disabled on user 10,\n\
- then the package on both users will be uninstalled.",
- tooltip::Position::Top,
- )
- .gap(20)
- .padding(10)
- .style(style::Container::Tooltip)
- ]
- .spacing(10),
- )
- .center_x(Length::Shrink)
- .padding(10)
- .style(style::Container::BorderedFrame);
-
- let modal_btn_row = row![
- button(text("Cancel")).on_press(Message::ModalHide),
- Space::new().width(Length::Fill),
- button(text("Apply")).on_press(Message::ModalValidate),
- ]
- .padding(iced::Padding {
- top: 0.0,
- right: 15.0,
- bottom: 10.0,
- left: 10.0,
- });
-
- let recap_view = summaries
- .iter()
- .fold(column![].spacing(6).width(Length::Fill), |col, r| {
- col.push(recap(settings, r))
- });
-
- let selected_pkgs_ctn = container(
- container(
- scrollable(
- container(
- if self
- .selected_packages
- .iter()
- .any(|s| s.0 == self.selected_user.expect(PACK_NO_USER_MSG).index)
- {
- self.selected_packages
- .iter()
- .filter(|s| {
- s.0 == self.selected_user.expect(PACK_NO_USER_MSG).index
- })
- .fold(
- column![].spacing(6).width(Length::Shrink),
- |col, selection| {
- col.push(
- row![
- row![text(
- self.phone_packages[selection.0][selection.1]
- .removal
- .to_string()
- )]
- .width(120),
- row![text(
- self.phone_packages[selection.0][selection.1]
- .list
- .to_string()
- )]
- .width(55),
- row![text(
- self.phone_packages[selection.0][selection.1]
- .name
- .clone()
- ),]
- .width(540),
- row![match self.phone_packages[selection.0]
- [selection.1]
- .state
- {
- PackageState::Enabled =>
- if settings.device.disable_mode {
- text("Disable")
- .style(style::Text::Danger)
- } else {
- text("Uninstall")
- .style(style::Text::Danger)
- },
- PackageState::Disabled =>
- text("Enable").style(style::Text::Ok),
- PackageState::Uninstalled =>
- text("Restore").style(style::Text::Ok),
- PackageState::All => text("Impossible")
- .style(style::Text::Danger),
- },]
- .width(70),
- ]
- .width(Length::Shrink)
- .spacing(20),
- )
- },
- )
- } else {
- column![text("No packages selected for this user")]
- .align_x(Alignment::Center)
- .width(Length::Fill)
- },
- )
- .padding(10)
- .width(Length::Shrink)
- .style(style::Container::Invisible),
- )
- .direction(Direction::Both {
- vertical: Scrollbar::default(),
- horizontal: Scrollbar::default(),
- })
- .style(style::Scrollable::Description),
- )
- .width(Length::Fill)
- .style(style::Container::Frame),
- )
- .width(Length::Fill)
- .max_height(150)
- .padding([0, 10]);
-
- container(
- if device.user_list.iter().filter(|&u| !u.protected).count() > 1
- && settings.device.multi_user_mode
- {
- column![
- title_ctn,
- users_ctn,
- row![explaination_ctn].padding([0, 10]),
- container(recap_view).padding(10),
- selected_pkgs_ctn,
- modal_btn_row,
- ]
- .spacing(10)
- .align_x(Alignment::Center)
- } else if !settings.device.multi_user_mode {
- column![
- title_ctn,
- users_ctn,
- container(recap_view).padding(10),
- selected_pkgs_ctn,
- modal_btn_row,
- ]
- .spacing(10)
- .align_x(Alignment::Center)
- } else {
- column![
- title_ctn,
- container(recap_view).padding(10),
- selected_pkgs_ctn,
- modal_btn_row,
- ]
- .spacing(10)
- .align_x(Alignment::Center)
- },
- )
- .width(900)
- .height(Length::Shrink)
- .max_height(700)
- .style(style::Container::Background)
- .into()
- }
-
- fn filter_package_lists(&mut self) {
- let list_filter: UadList = self.selected_list.expect("UAD-list type must be selected");
- let package_filter: PackageState = self
- .selected_package_state
- .expect("pack-state must be selected");
- let removal_filter: Removal = self
- .selected_removal
- .expect("removal recommendation must be selected");
-
- self.filtered_packages = self.phone_packages
- [self.selected_user.expect("User must be selected").index]
- .iter()
- // we must filter the indices associated with pack-rows,
- // that's why `enumerate` is before `filter`.
- .enumerate()
- .filter(|(_, p)| {
- (list_filter == UadList::All || p.list == list_filter)
- && (package_filter == PackageState::All || p.state == package_filter)
- && (removal_filter == Removal::All || p.removal == removal_filter)
- && (self.input_value.is_empty()
- || matches_search(&p.name, &self.input_value, Some(&p.description)))
- })
- .map(|(i, _)| i)
- .collect();
- }
-
- #[expect(clippy::unused_async, reason = "1 call-site")]
- async fn load_packages>(
- uad_list: PackageHashMap,
- device_serial: S,
- user_list: Vec,
- ) -> Vec> {
- let serial = device_serial.as_ref();
- if user_list.len() <= 1 {
- vec![
- fetch_packages(&uad_list, serial, None)
- .into_iter()
- .map(PackageRow::from)
- .collect(),
- ]
- } else {
- user_list
- .iter()
- .map(|user| {
- fetch_packages(&uad_list, serial, Some(user.id))
- .into_iter()
- .map(PackageRow::from)
- .collect()
- })
- .collect()
- }
- }
-
- #[expect(clippy::unused_async, reason = "1 call-site")]
- async fn init_apps_view(remote: bool, phone: Phone) -> (PackageHashMap, UadListState) {
- let uad_lists = load_debloat_lists(remote);
- match uad_lists {
- Ok(list) => {
- if phone.adb_id.is_empty() {
- warn!("AppsView ready but no phone found");
- }
- (list, UadListState::Done)
- }
- Err(local_list) => {
- error!(
- "Error loading remote debloat list for the phone. Fallback to embedded (and outdated) list"
- );
- (local_list, UadListState::Failed)
- }
- }
- }
-
- // === Split handlers to keep update short ===
- fn on_modal_hide(&mut self) -> Task {
- self.selection_modal = false;
- self.error_modal = None;
- self.export_modal = false;
- Task::none()
- }
-
- fn on_modal_validate(
- &mut self,
- settings: &Settings,
- selected_device: &mut Phone,
- ) -> Task {
- self.fallback_notifications.clear();
- let mut commands = vec![];
- self.selected_packages.sort_unstable();
- self.selected_packages.dedup();
- for selection in &self.selected_packages {
- commands.append(&mut build_action_pkg_commands(
- &self.phone_packages,
- selected_device,
- &settings.device,
- *selection,
- ));
- }
- self.selection_modal = false;
- Task::batch(commands)
- }
-
- fn on_restoring_device(&mut self, output: Result) -> Task {
- let i_user = self.selected_user.unwrap_or_default().index;
- if let Ok(p) = output {
- self.loading_state =
- LoadingState::RestoringDevice(self.phone_packages[i_user][p.index].name.clone());
- } else {
- self.loading_state = LoadingState::RestoringDevice("Error [TODO]".to_string());
- }
- Task::none()
- }
-
- fn on_load_uad_list(&mut self, remote: bool, selected_device: &Phone) -> Task {
- info!("{:-^65}", "-");
- info!(
- "ANDROID_SDK: {} | DEVICE: {}",
- selected_device.android_sdk, selected_device.model
- );
- info!("{:-^65}", "-");
- self.loading_state = LoadingState::DownloadingList;
- Task::perform(
- Self::init_apps_view(remote, selected_device.clone()),
- Message::LoadPhonePackages,
- )
- }
-
- fn on_load_phone_packages(
- &mut self,
- payload: (PackageHashMap, UadListState),
- selected_device: &Phone,
- list_update_state: &mut UadListState,
- ) -> Task {
- let (uad_list, list_state) = payload;
- self.loading_state = LoadingState::LoadingPackages;
- self.uad_lists.clone_from(&uad_list);
- *list_update_state = list_state;
- Task::perform(
- Self::load_packages(
- uad_list,
- selected_device.adb_id.clone(),
- selected_device.user_list.clone(),
- ),
- Message::ApplyFilters,
- )
- }
-
- fn on_apply_filters(&mut self, packages: Vec>) -> Task {
- let i_user = self.selected_user.unwrap_or_default().index;
- self.phone_packages = packages;
- self.filtered_packages = (0..self.phone_packages[i_user].len()).collect();
- self.selected_removal = Some(Removal::Recommended);
- self.selected_package_state = Some(PackageState::Enabled);
- self.selected_list = Some(UadList::All);
- self.selected_user = Some(User::default());
- self.fallback_notifications.clear();
- Self::filter_package_lists(self);
- self.loading_state = LoadingState::Ready;
- Task::none()
- }
-
- fn on_toggle_all_selected(
- &mut self,
- selected: bool,
- settings: &mut Settings,
- selected_device: &mut Phone,
- list_update_state: &mut UadListState,
- ) -> Task {
- let i_user = self.selected_user.unwrap_or_default().index;
- for i in self.filtered_packages.clone() {
- if self.phone_packages[i_user][i].selected != selected {
- #[expect(unused_must_use, reason = "side-effect")]
- self.update(
- settings,
- selected_device,
- list_update_state,
- Message::List(i, RowMessage::ToggleSelection(selected)),
- );
- }
- }
- self.all_selected = selected;
- Task::none()
- }
-
- fn on_search_input_changed(&mut self, letter: String) -> Task {
- self.input_value = letter;
- Self::filter_package_lists(self);
- Task::none()
- }
-
- fn on_list_selected(&mut self, list: UadList) -> Task {
- self.selected_list = Some(list);
- Self::filter_package_lists(self);
- Task::none()
- }
-
- fn on_package_state_selected(&mut self, package_state: PackageState) -> Task {
- self.selected_package_state = Some(package_state);
- Self::filter_package_lists(self);
- Task::none()
- }
-
- fn on_removal_selected(&mut self, removal: Removal) -> Task {
- self.selected_removal = Some(removal);
- Self::filter_package_lists(self);
- Task::none()
- }
-
- fn on_list_row(
- &mut self,
- i_package: usize,
- row_message: &RowMessage,
- settings: &Settings,
- selected_device: &mut Phone,
- ) -> Task {
- let i_user = self.selected_user.unwrap_or_default().index;
- #[expect(unused_must_use, reason = "side-effect")]
- {
- self.phone_packages[i_user][i_package]
- .update(row_message)
- .map(move |row_message| Message::List(i_package, row_message));
- }
-
- let package = &mut self.phone_packages[i_user][i_package];
-
- match *row_message {
- RowMessage::ToggleSelection(toggle) => {
- if package.removal == Removal::Unsafe && !settings.general.expert_mode {
- package.selected = false;
- return Task::none();
- }
-
- if settings.device.multi_user_mode {
- for u in selected_device.user_list.iter().filter(|&u| !u.protected) {
- if let Some(pkg) = self
- .phone_packages
- .get_mut(u.index)
- .and_then(|pkgs| pkgs.get_mut(i_package))
- {
- pkg.selected = toggle;
- if toggle && !self.selected_packages.contains(&(u.index, i_package)) {
- self.selected_packages.push((u.index, i_package));
- }
- }
- }
- if !toggle {
- self.selected_packages.retain(|&x| x.1 != i_package);
- }
- } else {
- package.selected = toggle;
- if toggle {
- if !self.selected_packages.contains(&(i_user, i_package)) {
- self.selected_packages.push((i_user, i_package));
- }
- } else {
- self.selected_packages
- .retain(|&x| x.1 != i_package || x.0 != i_user);
- }
- }
- Task::none()
- }
- RowMessage::ActionPressed => {
- self.fallback_notifications.clear();
- self.phone_packages[i_user][i_package].selected = true;
- Task::batch(build_action_pkg_commands(
- &self.phone_packages,
- selected_device,
- &settings.device,
- (i_user, i_package),
- ))
- }
- RowMessage::PackagePressed => {
- self.description = package.clone().description;
- self.description_content = text_editor::Content::with_text(&package.description);
- package.current = true;
- if self.current_package_index != i_package {
- self.phone_packages[i_user][self.current_package_index].current = false;
- }
- self.current_package_index = i_package;
- Task::none()
- }
- }
- }
-
- fn on_apply_action_on_selection(&mut self) -> Task {
- self.selection_modal = true;
- Task::none()
- }
-
- fn on_user_selected(&mut self, user: User) -> Task {
- self.selected_user = Some(user);
- self.fallback_notifications.clear();
- self.filtered_packages = (0..self.phone_packages[user.index].len()).collect();
- Self::filter_package_lists(self);
- Task::none()
- }
-
- #[allow(
- clippy::too_many_lines,
- reason = "Complex verification and fallback logic"
- )]
- //this functions matches the adb command to two types, when it is a soft issue and when it is a hard issue
- // soft issue: utilizes core::sync::attempt_fallback in the case the state that wanted to be changed wasn't in fact changed
- // hard issue: does basically nothing in most cases FIXME, besides handling enabling packages.
- // also this really should be refactored, these are gigantic code blocks
- fn on_verify_and_fallback(
- &mut self,
- res: Result,
- settings: &Settings,
- selected_device: &Phone,
- ) -> Task {
- match res {
- Ok(p) => {
- // Snapshot minimal info to move into background task
- let i_user = p.i_user;
- let index = p.index;
- let pkg_name = self.phone_packages[i_user][index].name.clone();
- let current_state = self.phone_packages[i_user][index].state;
- let wanted_state = current_state.opposite(settings.device.disable_mode);
- let before_cross_user_states = p.before_cross_user_states.clone();
- let device = selected_device.clone();
- let user_id = device.user_list[i_user].id;
-
- // Offload verification + potential fallback to background
- Task::perform(
- async move {
- // Blocking ADB calls happen here (off UI thread)
- let actual_state_opt = uad_core::sync::verify_package_state(
- &pkg_name,
- device.adb_id.as_str(),
- Some(user_id),
- );
-
- match actual_state_opt {
- Some(actual_state) if actual_state == wanted_state => {
- // Check cross-user behavior
- let error_modal = uad_core::sync::detect_cross_user_behavior(
- &pkg_name,
- device.adb_id.as_str(),
- user_id,
- wanted_state,
- actual_state,
- &device,
- &before_cross_user_states,
- )
- .map(|notification| {
- format!(
- "Cross-User Behavior Detected:\n\n{notification}\n\n\
- This is unusual behavior that may be specific to your device manufacturer (OEM). \
- The package state has been successfully changed on the target user."
- )
- });
-
- VerifyAndFallbackResult {
- i_user,
- index,
- new_state: wanted_state,
- notification: None,
- error_modal,
- }
- }
- actual_state_opt => {
- // Package doesn't exist (None) or has wrong state - try fallback
- let actual_state =
- actual_state_opt.unwrap_or(PackageState::Uninstalled);
- // Create CorePackage for fallback
- let core_package = uad_core::sync::CorePackage {
- name: pkg_name.clone(),
- description: String::new(),
- removal: Removal::All,
- state: current_state,
- list: UadList::Unlisted,
- };
- let fallback_result = uad_core::sync::attempt_fallback(
- &core_package,
- wanted_state,
- actual_state,
- device.user_list[i_user],
- &device,
- );
-
- let state_description = match actual_state_opt {
- Some(PackageState::Uninstalled) => "remains uninstalled",
- Some(PackageState::Disabled) => "was disabled",
- Some(PackageState::Enabled) => "was enabled",
- Some(PackageState::All) => {
- "unexpected state (error determining state)"
- }
- None => "does not exist on device",
- };
-
- let (notification, new_state) = match fallback_result {
- Ok(fallback_action) => (
- Some(format!(
- "Package '{pkg_name}' was {} but {} instead. Fallback: {fallback_action}",
- match wanted_state {
- PackageState::Uninstalled => "uninstalled",
- PackageState::Disabled => "disabled",
- PackageState::Enabled => "enabled",
- PackageState::All => "modified",
- },
- state_description
- )),
- actual_state,
- ),
- Err(err) => (
- Some(format!(
- "Package '{pkg_name}' verification failed: {err}"
- )),
- current_state, // no change if fallback failed
- ),
- };
-
- VerifyAndFallbackResult {
- i_user,
- index,
- new_state,
- notification,
- error_modal: None,
- }
- }
- }
- },
- Message::VerifyAndFallbackFinished,
- )
- }
-
- //this is an example of how errors should be done, this is hard to implement however.
- // Err(AdbError::SecurityException(err)) => {
-
- // }
- //FIXME: this has to be changed as soon as possible, generic errors are bad practice
- // keep in mind most solutions to hard errors like this are going to be hacky
- // and weird.
- Err(AdbError::Generic(err)) => {
- // this is such a hacky solution
- if err.contains("Shell cannot change component state") {
- // look for the "pm enable --user " to get the command
- if let Some(start_index) = err.find("pm enable --user ") {
- // slice the string starting from the end of the prefix
- let remainder = &err[start_index + "pm enable --user ".len()..];
- // split by whitespace to get the arguments: [ID, PACKAGE, ...]
- let parts: Vec<&str> = remainder.split_whitespace().collect();
-
- if parts.len() >= 2 {
- let user_id_str = parts[0];
- let pkg_name_str = parts[1];
-
- let found_user = selected_device
- .user_list
- .iter()
- .enumerate()
- .find(|(_, u)| u.id.to_string() == user_id_str);
-
- if let Some((i_user, user_ref)) = found_user {
- // find the package index
- let found_pkg = self.phone_packages[i_user]
- .iter()
- .enumerate()
- .find(|(_, p)| p.name == pkg_name_str);
-
- if let Some((index, _)) = found_pkg {
- let user = *user_ref;
- let device = selected_device.clone();
- let pkg_name = pkg_name_str.to_string();
-
- // fallback task
- return Task::perform(
- async move {
- let temp_pkg = uad_core::sync::CorePackage {
- name: pkg_name.clone(),
- description: String::new(),
- removal: Removal::All,
- state: PackageState::Disabled,
- list: UadList::Unlisted,
- };
-
- // get uninstall command
- let uninstall_cmds =
- uad_core::sync::apply_pkg_state_commands(
- &temp_pkg,
- PackageState::Uninstalled,
- user,
- &device,
- );
-
- if let Some(cmd) = uninstall_cmds.first() {
- let _ = uad_core::sync::run_adb_shell_action(
- &device.adb_id,
- cmd,
- );
- }
-
- // reinstall/enable
- let temp_pkg_uninstalled =
- uad_core::sync::CorePackage {
- name: pkg_name.clone(),
- description: String::new(),
- removal: Removal::All,
- state: PackageState::Uninstalled,
- list: UadList::Unlisted,
- };
-
- let enable_cmds =
- uad_core::sync::apply_pkg_state_commands(
- &temp_pkg_uninstalled,
- PackageState::Enabled,
- user,
- &device,
- );
-
- // lets enable the new package
- if let Some(cmd) = enable_cmds.first() {
- let _ = uad_core::sync::run_adb_shell_action(
- &device.adb_id,
- cmd,
- );
- }
-
- //verifies the final state for thread confirmation
- let actual_state =
- uad_core::sync::verify_package_state(
- &pkg_name,
- &device.adb_id,
- Some(user.id),
- )
- .unwrap_or(PackageState::Uninstalled);
- VerifyAndFallbackResult {
- i_user,
- index,
- new_state: actual_state,
- notification: Some(format!(
- "Attempted recovery for {pkg_name}"
- )),
- error_modal: None,
- }
- },
- Message::VerifyAndFallbackFinished,
- );
- }
- }
- }
- }
- }
-
- // Fallthrough: default error handling if parsing failed or unrelated error
- self.error_modal = Some(err);
- Task::none()
- }
- }
- }
-
- fn on_modal_user_selected(
- &mut self,
- user: User,
- settings: &mut Settings,
- selected_device: &mut Phone,
- list_update_state: &mut UadListState,
- ) -> Task {
- self.selected_user = Some(user);
- self.update(
- settings,
- selected_device,
- list_update_state,
- Message::UserSelected(user),
- )
- }
-
- fn on_clear_selected_packages(&mut self) -> Task {
- self.selected_packages = Vec::new();
- Task::none()
- }
-
- fn on_adb_satisfied(&mut self, result: bool) -> Task {
- self.is_adb_satisfied = result;
- Task::none()
- }
-
- fn on_update_failed(&mut self) -> Task {
- self.loading_state = LoadingState::FailedToUpdate;
- Task::none()
- }
-
- fn on_go_to_url(url: PathBuf) -> Task {
- open_url(url);
- Task::none()
- }
-
- fn on_export_selection(&mut self) -> Task {
- let i_user = self.selected_user.unwrap_or_default().index;
- let package_names: Vec = self.phone_packages[i_user]
- .iter()
- .filter(|p| p.selected)
- .map(|p| p.name.clone())
- .collect();
- Task::perform(
- async move { export_selection(&package_names) },
- Message::SelectionExported,
- )
- }
-
- fn on_selection_exported(&mut self, export: Result) -> Task {
- match export {
- Ok(_) => self.export_modal = true,
- Err(err) => error!("Failed to export current selection: {err:?}"),
- }
- Task::none()
- }
-
- fn on_description_edit(&mut self, action: text_editor::Action) -> Task {
- match action {
- text_editor::Action::Scroll { lines: _ } | text_editor::Action::Edit(_) => {}
- _ => {
- self.description_content.perform(action);
- }
- }
- Task::none()
- }
-
- fn on_copy_error(&mut self, err: String) -> Task {
- self.copy_confirmation = true;
- Task::batch(vec![
- iced::clipboard::write::(err),
- Task::perform(
- // intentional delay
- async { std::thread::sleep(std::time::Duration::from_secs(1)) },
- |()| Message::HideCopyConfirmation,
- ),
- ])
- }
-
- fn on_hide_copy_confirmation(&mut self) -> Task {
- self.copy_confirmation = false;
- Task::none()
- }
-}
-
-impl List {
- fn on_dismiss_fallback_notifications(&mut self) -> Task {
- self.fallback_notifications.clear();
- Task::none()
- }
-}
-fn error_view<'a>(
- error: &'a str,
- content: Column<'a, Message, Theme, Renderer>,
- copy_confirmation: bool,
-) -> Modal<'a, Message, Theme, Renderer> {
- let title_ctn = container(
- row![text("Failed to perform ADB operation").size(24)].align_y(Alignment::Center),
- )
- .width(Length::Fill)
- .style(style::Container::Frame)
- .padding([10, 0])
- .center_y(Length::Shrink)
- .center_x(Length::Shrink);
-
- let modal_btn_row = row![
- button(
- text(if copy_confirmation {
- "Copied!"
- } else {
- "Copy error"
- })
- .width(Length::Fill)
- .align_x(alignment::Horizontal::Center),
- )
- .width(Length::Fill)
- .on_press_maybe(if copy_confirmation {
- None
- } else {
- Some(Message::CopyError(error.to_string()))
- })
- .style(style::Button::Primary),
- button(
- text("Close")
- .width(Length::Fill)
- .align_x(alignment::Horizontal::Center),
- )
- .width(Length::Fill)
- .on_press(Message::ModalHide)
- ]
- .padding(iced::Padding {
- top: 10.0,
- right: 0.0,
- bottom: 0.0,
- left: 0.0,
- });
-
- let text_box = scrollable(text(error).width(Length::Fill)).height(400);
-
- let ctn = container(column![title_ctn, text_box, modal_btn_row])
- .height(Length::Shrink)
- .max_height(700)
- .padding(10)
- .style(style::Container::Frame);
-
- Modal::new(content, ctn).on_blur(Message::ModalHide)
-}
-
-fn waiting_view<'a>(
- displayed_text: &(impl ToString + ?Sized),
- btn: Option>,
- text_style: impl Fn(&Theme) -> iced::widget::text::Style + 'a,
-) -> Element<'a, Message, Theme, Renderer> {
- let col = column![]
- .spacing(10)
- .align_x(Alignment::Center)
- .push(text(displayed_text.to_string()).style(text_style).size(20));
-
- let col = match btn {
- Some(btn) => col.push(btn.style(style::Button::Primary).padding([5, 10])),
- None => col,
- };
-
- container(col)
- .width(Length::Fill)
- .height(Length::Fill)
- .center_y(Length::Fill)
- .center_x(Length::Fill)
- .style(style::Container::Frame)
- .into()
-}
-
-fn build_action_pkg_commands(
- packages: &[Vec],
- device: &Phone,
- settings: &DeviceSettings,
- selection: (usize, usize),
-) -> Vec> {
- let pkg = &packages[selection.0][selection.1];
- let wanted_state = pkg.state.opposite(settings.disable_mode);
-
- let mut commands = vec![];
- for u in device.user_list.iter().filter(|&&u| {
- !u.protected
- && packages
- .get(u.index)
- .and_then(|user_pkgs| user_pkgs.get(selection.1))
- .is_some_and(|row_pkg| {
- // Only apply to users where package is explicitly selected
- // OR if multi_user_mode is enabled AND this is the initiating user
- row_pkg.selected || (settings.multi_user_mode && u.index == selection.0)
- })
- }) {
- let u_pkg = &packages[u.index][selection.1];
- let wanted_state = if settings.multi_user_mode {
- wanted_state
- } else {
- u_pkg.state.opposite(settings.disable_mode)
- };
-
- let actions = apply_pkg_state_commands(&u_pkg.into(), wanted_state, *u, device);
-
- for (j, action) in actions.into_iter().enumerate() {
- let p_info = PackageInfo {
- i_user: u.index,
- index: selection.1,
- removal: pkg.removal.to_string(),
- // Will be filled asynchronously before running the adb action
- before_cross_user_states: vec![],
- };
- // Clone data before async block to avoid borrowing issues
- let device_serial = device.adb_id.clone();
- let package_name = u_pkg.name.clone();
- let user_id = u.id;
- let phone = device.clone();
- // In the end there is only one package state change
- // even if we run multiple adb commands
- commands.push(Task::perform(
- async move {
- run_adb_action_with_before_states(
- &device_serial,
- &action,
- p_info,
- &package_name,
- user_id,
- &phone,
- )
- },
- if j == 0 {
- Message::VerifyAndFallback
- } else {
- |_| Message::Nothing
- },
- ));
- }
- }
- commands
-}
-
-fn run_adb_action_with_before_states(
- device_serial: &str,
- action: &str,
- mut p_info: PackageInfo,
- package_name: &str,
- target_user_id: u16,
- phone: &Phone,
-) -> Result {
- // Capture before-state in background to avoid blocking UI thread
- let before_states = uad_core::sync::capture_cross_user_states(
- package_name,
- device_serial,
- target_user_id,
- phone,
- );
- p_info.before_cross_user_states = before_states;
- // Run the ADB action
- uad_core::sync::run_adb_shell_action(device_serial, action)?;
- Ok(p_info)
-}
-
-fn recap<'a>(settings: &Settings, recap: &SummaryEntry) -> Element<'a, Message, Theme, Renderer> {
- container(
- row![
- text(recap.category.to_string())
- .size(19)
- .width(Length::FillPortion(1)),
- rule::vertical(5),
- row![
- if settings.device.disable_mode {
- text("Disable").style(style::Text::Danger)
- } else {
- text("Uninstall").style(style::Text::Danger)
- },
- Space::new().width(Length::Fill),
- text(recap.discard.to_string()).style(style::Text::Danger)
- ]
- .width(Length::FillPortion(1)),
- rule::vertical(5),
- row![
- if settings.device.disable_mode {
- text("Enable").style(style::Text::Ok)
- } else {
- text("Restore").style(style::Text::Ok)
- },
- Space::new().width(Length::Fill),
- text(recap.restore.to_string()).style(style::Text::Ok)
- ]
- .width(Length::FillPortion(1))
- ]
- .spacing(20)
- .padding(iced::Padding {
- top: 0.0,
- right: 10.0,
- bottom: 0.0,
- left: 0.0,
- })
- .width(Length::Fill)
- .align_y(Alignment::Center),
- )
- .padding(10)
- .width(Length::Fill)
- .height(45)
- .style(style::Container::Frame)
- .into()
-}
diff --git a/crates/uad-gui/src/views/settings.rs b/crates/uad-gui/src/views/settings.rs
deleted file mode 100644
index 3a09b80..0000000
--- a/crates/uad-gui/src/views/settings.rs
+++ /dev/null
@@ -1,694 +0,0 @@
-use crate::helpers::{button_primary, open_folder};
-use crate::theme::Theme;
-use crate::theme::string_to_theme;
-use crate::{
- style,
- views::list::{List as AppsView, PackageInfo},
- widgets::modal::Modal,
- widgets::navigation_menu::ICONS,
- widgets::package_row::PackageRow,
- widgets::text,
-};
-use chrono;
-use iced::widget::{Space, button, checkbox, column, container, pick_list, radio, row, scrollable};
-use iced::{Alignment, Element, Length, Renderer, Task, alignment};
-use log::{debug, error, info};
-use std::path::PathBuf;
-use uad_core::{
- config::{BackupSettings, Config, DeviceSettings, GeneralSettings},
- save::{backup_phone, list_available_backup_user, list_available_backups, restore_backup},
- sync::{
- AdbError, CorePackage, Phone, User, get_android_sdk, run_adb_shell_action,
- supports_disabling, supports_multi_user,
- },
- utils::{DisplayablePath, Error, NAME, export_packages, generate_backup_name, open_url},
-};
-
-#[derive(Debug, Clone)]
-pub enum PopUpModal {
- ExportUninstalled,
-}
-
-#[derive(Debug, Clone)]
-pub struct Settings {
- pub general: GeneralSettings,
- pub device: DeviceSettings,
- is_loading: bool,
- modal: Option,
-}
-
-impl Default for Settings {
- fn default() -> Self {
- Self {
- general: Config::load_configuration_file().general,
- device: DeviceSettings::default(),
- is_loading: false,
- modal: None,
- }
- }
-}
-
-#[derive(Debug, Clone)]
-pub enum Message {
- LoadDeviceSettings,
- ExpertMode(bool),
- DisableMode(bool),
- MultiUserMode(bool),
- ApplyTheme(Theme),
- UrlPressed(PathBuf),
- BackupSelected(DisplayablePath),
- BackupDevice,
- RestoreDevice,
- RestoringDevice(Result),
- DeviceBackedUp(Result),
- ChooseBackUpFolder,
- FolderChosen(Result),
- ExportPackages,
- PackagesExported(Result),
- ModalHide,
-}
-
-impl Settings {
- pub fn update(
- &mut self,
- phone: &Phone,
- packages: &[Vec],
- nb_running_async_adb_commands: &mut u32,
- msg: Message,
- selected_user: Option,
- ) -> Task {
- match msg {
- Message::ModalHide => self.handle_modal_hide(),
- Message::ExpertMode(toggled) => self.handle_expert_mode(phone, toggled),
- Message::DisableMode(toggled) => self.handle_disable_mode(phone, toggled),
- Message::MultiUserMode(toggled) => self.handle_multi_user_mode(phone, toggled),
- Message::ApplyTheme(theme) => self.handle_apply_theme(phone, theme),
- Message::UrlPressed(url) => Self::handle_url_pressed(url),
- Message::LoadDeviceSettings => self.handle_load_device_settings(phone),
- Message::BackupSelected(d_path) => self.handle_backup_selected(d_path),
- Message::BackupDevice => self.handle_backup_device(phone, packages),
- Message::DeviceBackedUp(result) => self.handle_device_backed_up(phone, result),
- Message::RestoreDevice => {
- self.handle_restore_device(phone, packages, nb_running_async_adb_commands)
- }
- Message::RestoringDevice(_) => Task::none(),
- Message::FolderChosen(result) => self.handle_folder_chosen(phone, result),
- Message::ChooseBackUpFolder => self.handle_choose_backup_folder(),
- Message::ExportPackages => Self::handle_export_packages(selected_user, packages),
- Message::PackagesExported(result) => self.handle_packages_exported(result),
- }
- }
-
- fn handle_modal_hide(&mut self) -> Task {
- self.modal = None;
- Task::none()
- }
-
- fn handle_expert_mode(&mut self, _phone: &Phone, toggled: bool) -> Task {
- self.general.expert_mode = toggled;
- debug!("Config change: {self:?}");
- let mut config = Config::load_configuration_file();
- config.save_device_settings(self.device.clone(), self.general.clone());
- Task::none()
- }
-
- fn handle_disable_mode(&mut self, phone: &Phone, toggled: bool) -> Task {
- if supports_disabling(phone) {
- self.device.disable_mode = toggled;
- debug!("Config change: {self:?}");
- let mut config = Config::load_configuration_file();
- config.save_device_settings(self.device.clone(), self.general.clone());
- }
- Task::none()
- }
-
- fn handle_multi_user_mode(&mut self, _phone: &Phone, toggled: bool) -> Task {
- self.device.multi_user_mode = toggled;
- debug!("Config change: {self:?}");
- let mut config = Config::load_configuration_file();
- config.save_device_settings(self.device.clone(), self.general.clone());
- Task::none()
- }
-
- fn handle_apply_theme(&mut self, _phone: &Phone, theme: Theme) -> Task {
- self.general.theme = theme.to_string();
- debug!("Config change: {self:?}");
- let mut config = Config::load_configuration_file();
- config.save_device_settings(self.device.clone(), self.general.clone());
- Task::none()
- }
-
- fn handle_url_pressed(url: PathBuf) -> Task {
- open_url(url);
- Task::none()
- }
-
- fn handle_load_device_settings(&mut self, phone: &Phone) -> Task {
- self.load_device_settings(phone);
- Task::none()
- }
-
- fn load_device_settings(&mut self, phone: &Phone) {
- let backups = list_available_backups(&self.general.backup_folder.join(&phone.adb_id));
- let backup = BackupSettings {
- backups: backups.clone(),
- selected: backups.first().cloned(),
- users: phone.user_list.clone(),
- selected_user: phone.user_list.first().copied(),
- backup_state: String::default(),
- };
-
- match Config::load_configuration_file()
- .devices
- .iter()
- .find(|d| d.device_id == phone.adb_id)
- {
- Some(device) => {
- self.device.clone_from(device);
- self.device.backup = backup;
- }
- None => {
- self.device = DeviceSettings {
- device_id: phone.adb_id.clone(),
- // see FAQ, and GH-issue #1426
- disable_mode: supports_disabling(phone),
- multi_user_mode: supports_multi_user(phone),
- backup,
- };
- }
- }
- }
-
- fn handle_backup_selected(&mut self, d_path: DisplayablePath) -> Task